Files
agent-radar 2ed3415fb7
Publish Claude Code Binaries / Stage and publish binaries (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-arm64 (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build linux-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build windows-amd64 (push) Canceled after 0s
Sync Tutti Agent Skills / sync (push) Canceled after 0s
Windows Agent Adapters / Test Windows agent adapters (push) Canceled after 0s
Windows Daemon Adapters / Test Windows daemon adapters (push) Canceled after 0s
Publish Tutti App Runtime / Publish runtime catalog (push) Canceled after 0s
源码快照 @ 2026-09-01 (source-only, 剔除非源码素材)
2026-09-01 20:17:27 +08:00

42 lines
2.0 KiB
Markdown

# App CLI Core
`packages/appcli/core` owns the reusable Go implementation of the App CLI
protocol contract used by workspace apps.
The package is intentionally limited to protocol-level behavior:
- `tutti.app.cli.v1` manifest reading and validation
- command capability construction from a manifest and host-provided app metadata
- manifest input normalization
- `tutti.app.cli.invoke.v1` HTTP invoke envelopes
- handler response decoding and output contract validation
- wait-command execution metadata and validated pending continuations
- scope conflict and reserved-scope state calculation
Host products keep their own workspace lookup, durable state, app package
metadata, runtime startup, and user-facing status DTO adapters outside this
module. Tutti daemon integration lives in `services/tuttid/service/cli/appcli`.
The protocol strings still use the frozen Tutti App CLI contract for backwards
compatibility with existing app manifests and handlers. That does not make this
module a Tutti daemon business layer; consumers such as TSH can reuse the
protocol core while supplying their own host adapters.
## Wait commands
An app command that semantically waits for a run, session, or other durable
execution declares `execution.mode` as `wait`. Its handler returns an ordinary
final output when the execution reaches a stop point. While the execution is
still active, the handler returns a validated `continuation` with state
`pending` and a bounded `retryAfterMs` delay.
The terminal CLI consumes continuations automatically. One visible command
therefore remains active across multiple handler invocations; callers do not
poll and do not pass a follow flag. The CLI-owned `--timeout-ms` option is an
optional total wait deadline. When it expires, the command returns a successful
JSON observation with `reason: "wait_timeout"`, `timedOut: true`, and
`executionContinues: true`; it never cancels the underlying execution.
Handler `timeoutMs` remains a per-invocation transport budget. It is not a
workflow or total wait timeout.