@armadra/agent 0.7.6 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +51 -31
- package/CHANGELOG.zh-CN.md +68 -48
- package/README.md +162 -204
- package/README.zh-CN.md +150 -199
- package/dist/acp.d.ts +1 -1
- package/dist/acp.js +1 -1
- package/dist/agent/limits.d.ts +1 -1
- package/dist/agent/limits.js +1 -1
- package/dist/agent/loop-guard.d.ts +1 -1
- package/dist/agent/loop-guard.js +1 -1
- package/dist/agent/prompt-rules.d.ts +1 -1
- package/dist/agent/prompt-rules.js +1 -1
- package/dist/agent/reminders.d.ts +1 -1
- package/dist/agent/reminders.js +1 -1
- package/dist/agent/session-cache-key.d.ts +1 -1
- package/dist/agent/session-cache-key.js +1 -1
- package/dist/agent/session-extensions.d.ts +1 -1
- package/dist/agent/session-extensions.js +1 -1
- package/dist/agent/session-images.d.ts +1 -1
- package/dist/agent/session-images.js +1 -1
- package/dist/agent/session-plan.d.ts +1 -1
- package/dist/agent/session-plan.js +1 -1
- package/dist/agent/session-rewind.d.ts +1 -1
- package/dist/agent/session-rewind.js +1 -1
- package/dist/agent/session-settings.d.ts +1 -1
- package/dist/agent/session-settings.js +1 -1
- package/dist/agent/session-subagent.d.ts +1 -1
- package/dist/agent/session-subagent.js +1 -1
- package/dist/agent/session-telemetry.d.ts +1 -1
- package/dist/agent/session-telemetry.js +1 -1
- package/dist/agent/session-trace-writer.d.ts +1 -1
- package/dist/agent/session-trace-writer.js +1 -1
- package/dist/agent/session.js +1 -1
- package/dist/agent/subagent-background.d.ts +1 -1
- package/dist/agent/subagent-background.js +1 -1
- package/dist/agent/subagent-direct.d.ts +1 -1
- package/dist/agent/subagent-direct.js +1 -1
- package/dist/agent/subagent-fork.d.ts +1 -1
- package/dist/agent/subagent-fork.js +1 -1
- package/dist/agent/subagent-registry.d.ts +1 -1
- package/dist/agent/subagent-registry.js +1 -1
- package/dist/agent/system-prompt.js +1 -1
- package/dist/agent/tool-availability.d.ts +1 -1
- package/dist/agent/tool-availability.js +1 -1
- package/dist/agent/types-w5.d.ts +2 -2
- package/dist/agent/types-w5.js +1 -1
- package/dist/agent/types-w6.d.ts +1 -1
- package/dist/agent/types-w6.js +1 -1
- package/dist/agent/types.d.ts +1 -1
- package/dist/agent/worktree.d.ts +1 -1
- package/dist/agent/worktree.js +1 -1
- package/dist/agents/builtin.d.ts +1 -1
- package/dist/agents/builtin.js +1 -1
- package/dist/agents/catalog.d.ts +1 -1
- package/dist/agents/catalog.js +1 -1
- package/dist/agents/discover.d.ts +1 -1
- package/dist/agents/discover.js +1 -1
- package/dist/agents/external.d.ts +1 -1
- package/dist/agents/external.js +1 -1
- package/dist/agents/parse.d.ts +1 -1
- package/dist/agents/parse.js +1 -1
- package/dist/agents/result.d.ts +1 -1
- package/dist/agents/result.js +2 -2
- package/dist/agents/task-record.d.ts +3 -3
- package/dist/agents/task-record.js +2 -2
- package/dist/agents/types.d.ts +1 -1
- package/dist/agents/types.js +1 -1
- package/dist/ai/apis/anthropic-compat.d.ts +2 -2
- package/dist/ai/apis/anthropic-compat.js +2 -2
- package/dist/ai/apis/cache-params.d.ts +1 -1
- package/dist/ai/apis/cache-params.js +1 -1
- package/dist/ai/apis/chatgpt-backend.d.ts +4 -2
- package/dist/ai/apis/chatgpt-backend.js +11 -2
- package/dist/ai/apis/chatgpt-rate-limits.d.ts +1 -1
- package/dist/ai/apis/chatgpt-rate-limits.js +1 -1
- package/dist/ai/apis/max-tokens.d.ts +1 -1
- package/dist/ai/apis/max-tokens.js +1 -1
- package/dist/ai/apis/shared.d.ts +1 -1
- package/dist/ai/apis/shared.js +1 -1
- package/dist/ai/image-intern.d.ts +2 -2
- package/dist/ai/image-intern.js +1 -1
- package/dist/ai/image-limits.d.ts +1 -1
- package/dist/ai/image-limits.js +1 -1
- package/dist/ai/json-body.d.ts +1 -1
- package/dist/ai/json-body.js +1 -1
- package/dist/ai/providers/builtin.d.ts +2 -2
- package/dist/ai/providers/builtin.js +4 -4
- package/dist/ai/providers/catalog.d.ts +2 -2
- package/dist/ai/providers/catalog.js +1 -1
- package/dist/ai/providers/channels.d.ts +1 -1
- package/dist/ai/providers/channels.js +1 -1
- package/dist/ai/providers/enrich.d.ts +1 -1
- package/dist/ai/providers/enrich.js +1 -1
- package/dist/ai/providers/models-dev-cache.d.ts +1 -1
- package/dist/ai/providers/models-dev-cache.js +1 -1
- package/dist/ai/providers/models-dev-data.d.ts +1 -1
- package/dist/ai/providers/models-dev-data.js +1 -1
- package/dist/ai/providers/models-dev-snapshot.d.ts +1 -1
- package/dist/ai/providers/models-dev-snapshot.js +1 -1
- package/dist/ai/providers/models-dev.d.ts +4 -4
- package/dist/ai/providers/models-dev.js +3 -3
- package/dist/ai/types.d.ts +2 -2
- package/dist/ai/types.js +1 -1
- package/dist/auth/chatgpt/cli.d.ts +1 -1
- package/dist/auth/chatgpt/cli.js +1 -1
- package/dist/auth/chatgpt/host-id.d.ts +1 -1
- package/dist/auth/chatgpt/host-id.js +1 -1
- package/dist/auth/chatgpt/login.d.ts +1 -1
- package/dist/auth/chatgpt/login.js +1 -1
- package/dist/auth/chatgpt/presets.d.ts +1 -1
- package/dist/auth/chatgpt/presets.js +1 -1
- package/dist/auth/oauth/callback-server.d.ts +1 -1
- package/dist/auth/oauth/callback-server.js +1 -1
- package/dist/auth/oauth/flows.d.ts +1 -1
- package/dist/auth/oauth/flows.js +1 -1
- package/dist/auth/oauth/oidc.d.ts +1 -1
- package/dist/auth/oauth/oidc.js +1 -1
- package/dist/auth/oauth/pkce.d.ts +1 -1
- package/dist/auth/oauth/pkce.js +1 -1
- package/dist/auth/oauth/refresh.d.ts +1 -1
- package/dist/auth/oauth/refresh.js +1 -1
- package/dist/auth/oauth/token-client.d.ts +1 -1
- package/dist/auth/oauth/token-client.js +1 -1
- package/dist/auth/oauth/token-store.d.ts +1 -1
- package/dist/auth/oauth/token-store.js +1 -1
- package/dist/auth/testing/fake-oauth.d.ts +1 -1
- package/dist/auth/testing/fake-oauth.js +1 -1
- package/dist/bundle/ama.cjs +1041 -359
- package/dist/checkpoints/blobs.d.ts +1 -1
- package/dist/checkpoints/blobs.js +1 -1
- package/dist/checkpoints/gc.d.ts +1 -1
- package/dist/checkpoints/gc.js +1 -1
- package/dist/checkpoints/git-head.d.ts +1 -1
- package/dist/checkpoints/git-head.js +1 -1
- package/dist/checkpoints/index.d.ts +1 -1
- package/dist/checkpoints/index.js +1 -1
- package/dist/checkpoints/replay.d.ts +1 -1
- package/dist/checkpoints/replay.js +1 -1
- package/dist/checkpoints/restore.d.ts +1 -1
- package/dist/checkpoints/restore.js +1 -1
- package/dist/checkpoints/settings.d.ts +1 -1
- package/dist/checkpoints/settings.js +1 -1
- package/dist/checkpoints/shadow-git.d.ts +1 -1
- package/dist/checkpoints/shadow-git.js +1 -1
- package/dist/checkpoints/shadow-restore.d.ts +1 -1
- package/dist/checkpoints/shadow-restore.js +1 -1
- package/dist/checkpoints/tracker.d.ts +1 -1
- package/dist/checkpoints/tracker.js +1 -1
- package/dist/checkpoints/types.d.ts +1 -1
- package/dist/checkpoints/types.js +1 -1
- package/dist/cli/args.d.ts +2 -2
- package/dist/cli/args.js +1 -1
- package/dist/cli/bootstrap.js +1 -1
- package/dist/cli/choice-prompt.d.ts +1 -1
- package/dist/cli/choice-prompt.js +1 -1
- package/dist/cli/codemode-notice.d.ts +1 -1
- package/dist/cli/codemode-notice.js +1 -1
- package/dist/cli/compose-agents.d.ts +1 -1
- package/dist/cli/compose-agents.js +1 -1
- package/dist/cli/compose-extensions.d.ts +1 -1
- package/dist/cli/compose-extensions.js +1 -1
- package/dist/cli/compose-memory.d.ts +1 -1
- package/dist/cli/compose-memory.js +1 -1
- package/dist/cli/compose-providers.d.ts +1 -1
- package/dist/cli/compose-providers.js +1 -1
- package/dist/cli/compose-request.d.ts +1 -1
- package/dist/cli/compose-request.js +1 -1
- package/dist/cli/from-prompt.d.ts +1 -1
- package/dist/cli/from-prompt.js +1 -1
- package/dist/cli/main.d.ts +1 -1
- package/dist/cli/main.js +1 -1
- package/dist/cli/subcommands/auth.d.ts +1 -1
- package/dist/cli/subcommands/auth.js +1 -1
- package/dist/cli/subcommands/config-set.d.ts +1 -1
- package/dist/cli/subcommands/config-set.js +1 -1
- package/dist/cli/subcommands/doctor.js +1 -1
- package/dist/cli/subcommands/init.d.ts +1 -1
- package/dist/cli/subcommands/init.js +1 -1
- package/dist/cli/subcommands/memory.d.ts +1 -1
- package/dist/cli/subcommands/memory.js +1 -1
- package/dist/cli/subcommands/models.js +1 -1
- package/dist/cli/subcommands/providers-list.d.ts +1 -1
- package/dist/cli/subcommands/providers-list.js +1 -1
- package/dist/cli/subcommands/providers-plan.d.ts +1 -1
- package/dist/cli/subcommands/providers-plan.js +1 -1
- package/dist/cli/subcommands/providers.d.ts +1 -1
- package/dist/cli/subcommands/providers.js +1 -1
- package/dist/cli/subcommands/sessions-export.d.ts +1 -1
- package/dist/cli/subcommands/sessions-export.js +1 -1
- package/dist/cli/subcommands/sessions-trace.d.ts +1 -1
- package/dist/cli/subcommands/sessions-trace.js +1 -1
- package/dist/cli/subcommands/sessions.d.ts +1 -1
- package/dist/cli/subcommands/sessions.js +1 -1
- package/dist/cli/subcommands/stats.d.ts +1 -1
- package/dist/cli/subcommands/stats.js +1 -1
- package/dist/codemode/capability.d.ts +1 -1
- package/dist/codemode/capability.js +1 -1
- package/dist/codemode/host-side.d.ts +2 -2
- package/dist/codemode/host-side.js +2 -2
- package/dist/compaction/image-budget.d.ts +1 -1
- package/dist/compaction/image-budget.js +1 -1
- package/dist/config/edit.d.ts +1 -1
- package/dist/config/edit.js +1 -1
- package/dist/config/init.d.ts +1 -1
- package/dist/config/init.js +1 -1
- package/dist/config/json-schema.d.ts +2 -2
- package/dist/config/json-schema.js +2 -2
- package/dist/config/schema-w5.d.ts +1 -1
- package/dist/config/schema-w5.js +1 -1
- package/dist/config/schema-w6.d.ts +1 -1
- package/dist/config/schema-w6.js +1 -1
- package/dist/config/settings-registry.d.ts +1 -1
- package/dist/config/settings-registry.js +1 -1
- package/dist/config/types-w5.d.ts +2 -2
- package/dist/config/types-w5.js +2 -2
- package/dist/config/types-w6.d.ts +5 -5
- package/dist/config/types-w6.js +1 -1
- package/dist/config/types.d.ts +6 -6
- package/dist/config/types.js +1 -1
- package/dist/drivers/acp/client.d.ts +1 -1
- package/dist/drivers/acp/client.js +1 -1
- package/dist/drivers/acp/driver.d.ts +23 -2
- package/dist/drivers/acp/driver.js +60 -6
- package/dist/drivers/acp/testing/fake-agent.d.ts +1 -1
- package/dist/drivers/acp/testing/fake-agent.js +1 -1
- package/dist/drivers/acp/types.d.ts +1 -1
- package/dist/drivers/acp/types.js +1 -1
- package/dist/drivers/agents.d.ts +1 -1
- package/dist/drivers/agents.js +4 -1
- package/dist/drivers/base.d.ts +1 -1
- package/dist/drivers/base.js +1 -1
- package/dist/drivers/catalog.d.ts +3 -1
- package/dist/drivers/catalog.js +95 -5
- package/dist/drivers/env.d.ts +1 -1
- package/dist/drivers/env.js +1 -1
- package/dist/drivers/host-runners.d.ts +1 -1
- package/dist/drivers/host-runners.js +1 -1
- package/dist/drivers/jsonrpc.d.ts +1 -1
- package/dist/drivers/jsonrpc.js +1 -1
- package/dist/drivers/native/claude-normalize.d.ts +9 -1
- package/dist/drivers/native/claude-normalize.js +28 -1
- package/dist/drivers/native/claude-stream.d.ts +1 -1
- package/dist/drivers/native/claude-stream.js +17 -2
- package/dist/drivers/native/codex-app-server.d.ts +1 -1
- package/dist/drivers/native/codex-app-server.js +5 -3
- package/dist/drivers/native/codex-normalize.d.ts +1 -1
- package/dist/drivers/native/codex-normalize.js +1 -1
- package/dist/drivers/native/oneshot.d.ts +1 -1
- package/dist/drivers/native/oneshot.js +13 -3
- package/dist/drivers/native/pi-gate.d.ts +19 -0
- package/dist/drivers/native/pi-gate.js +39 -0
- package/dist/drivers/native/pi-rpc.d.ts +29 -0
- package/dist/drivers/native/pi-rpc.js +483 -0
- package/dist/drivers/permissions.d.ts +1 -1
- package/dist/drivers/permissions.js +1 -1
- package/dist/drivers/pids.d.ts +1 -1
- package/dist/drivers/pids.js +1 -1
- package/dist/drivers/pool.d.ts +1 -1
- package/dist/drivers/pool.js +1 -1
- package/dist/drivers/probe.d.ts +1 -1
- package/dist/drivers/probe.js +1 -1
- package/dist/drivers/process.d.ts +1 -1
- package/dist/drivers/process.js +1 -1
- package/dist/drivers/runner.d.ts +1 -1
- package/dist/drivers/runner.js +2 -1
- package/dist/drivers/store.d.ts +1 -1
- package/dist/drivers/store.js +1 -1
- package/dist/drivers/types.d.ts +2 -2
- package/dist/drivers/types.js +1 -1
- package/dist/git/info.d.ts +1 -1
- package/dist/git/info.js +1 -1
- package/dist/host/api-impl.d.ts +1 -1
- package/dist/host/api-impl.js +1 -1
- package/dist/host/types.d.ts +2 -2
- package/dist/i18n/catalog.d.ts +5 -2
- package/dist/i18n/catalog.js +2 -2
- package/dist/i18n/format.d.ts +1 -1
- package/dist/i18n/format.js +1 -1
- package/dist/i18n/index.d.ts +1 -1
- package/dist/i18n/index.js +1 -1
- package/dist/i18n/messages/acp.d.ts +1 -1
- package/dist/i18n/messages/acp.js +1 -1
- package/dist/i18n/messages/agents.d.ts +1 -1
- package/dist/i18n/messages/agents.js +1 -1
- package/dist/i18n/messages/approval.d.ts +1 -1
- package/dist/i18n/messages/approval.js +1 -1
- package/dist/i18n/messages/auth.d.ts +3 -1
- package/dist/i18n/messages/auth.js +3 -1
- package/dist/i18n/messages/cli.d.ts +1 -1
- package/dist/i18n/messages/cli.js +1 -1
- package/dist/i18n/messages/config-keys.js +12 -12
- package/dist/i18n/messages/config.d.ts +1 -1
- package/dist/i18n/messages/config.js +3 -3
- package/dist/i18n/messages/drivers.d.ts +5 -1
- package/dist/i18n/messages/drivers.js +5 -1
- package/dist/i18n/messages/errors.d.ts +1 -1
- package/dist/i18n/messages/errors.js +1 -1
- package/dist/i18n/messages/interactive-line.d.ts +1 -1
- package/dist/i18n/messages/interactive-line.js +1 -1
- package/dist/i18n/messages/interactive-startup.d.ts +1 -1
- package/dist/i18n/messages/interactive-startup.js +1 -1
- package/dist/i18n/messages/interactive-view.d.ts +1 -1
- package/dist/i18n/messages/interactive-view.js +1 -1
- package/dist/i18n/messages/interactive.d.ts +1 -1
- package/dist/i18n/messages/interactive.js +1 -1
- package/dist/i18n/messages/memory.d.ts +1 -1
- package/dist/i18n/messages/memory.js +1 -1
- package/dist/i18n/messages/panels.d.ts +1 -1
- package/dist/i18n/messages/panels.js +1 -1
- package/dist/i18n/messages/permissions.d.ts +1 -1
- package/dist/i18n/messages/permissions.js +1 -1
- package/dist/i18n/messages/plan.d.ts +1 -1
- package/dist/i18n/messages/plan.js +1 -1
- package/dist/i18n/messages/print.d.ts +2 -2
- package/dist/i18n/messages/print.js +2 -2
- package/dist/i18n/messages/report-context.d.ts +1 -1
- package/dist/i18n/messages/report-context.js +1 -1
- package/dist/i18n/messages/report.d.ts +1 -1
- package/dist/i18n/messages/report.js +1 -1
- package/dist/i18n/messages/rewind.d.ts +1 -1
- package/dist/i18n/messages/rewind.js +1 -1
- package/dist/i18n/messages/session.d.ts +1 -1
- package/dist/i18n/messages/session.js +1 -1
- package/dist/i18n/messages/settings.d.ts +1 -1
- package/dist/i18n/messages/settings.js +1 -1
- package/dist/i18n/messages/subcommands.d.ts +1 -1
- package/dist/i18n/messages/subcommands.js +1 -1
- package/dist/i18n/messages/trace.d.ts +1 -1
- package/dist/i18n/messages/trace.js +1 -1
- package/dist/i18n/types.d.ts +1 -1
- package/dist/i18n/types.js +1 -1
- package/dist/memory/frontmatter.d.ts +1 -1
- package/dist/memory/frontmatter.js +1 -1
- package/dist/memory/index.d.ts +1 -1
- package/dist/memory/index.js +1 -1
- package/dist/memory/lock.d.ts +1 -1
- package/dist/memory/lock.js +1 -1
- package/dist/memory/paths.d.ts +1 -1
- package/dist/memory/paths.js +1 -1
- package/dist/memory/runtime.d.ts +1 -1
- package/dist/memory/runtime.js +1 -1
- package/dist/memory/secrets.d.ts +1 -1
- package/dist/memory/secrets.js +1 -1
- package/dist/memory/section.d.ts +1 -1
- package/dist/memory/section.js +1 -1
- package/dist/memory/store.d.ts +1 -1
- package/dist/memory/store.js +1 -1
- package/dist/memory/tool.d.ts +1 -1
- package/dist/memory/tool.js +1 -1
- package/dist/modes/acp/acp-auth-gate.d.ts +1 -1
- package/dist/modes/acp/acp-auth-gate.js +1 -1
- package/dist/modes/acp/acp-config.d.ts +1 -1
- package/dist/modes/acp/acp-config.js +1 -1
- package/dist/modes/acp/acp-connection.d.ts +1 -1
- package/dist/modes/acp/acp-connection.js +1 -1
- package/dist/modes/acp/acp-events.d.ts +1 -1
- package/dist/modes/acp/acp-events.js +1 -1
- package/dist/modes/acp/acp-mode.d.ts +1 -1
- package/dist/modes/acp/acp-mode.js +1 -1
- package/dist/modes/acp/acp-server.d.ts +2 -2
- package/dist/modes/acp/acp-server.js +2 -2
- package/dist/modes/acp/acp-sessions.d.ts +2 -2
- package/dist/modes/acp/acp-sessions.js +2 -2
- package/dist/modes/acp/acp-tool-text.d.ts +1 -1
- package/dist/modes/acp/acp-tool-text.js +1 -1
- package/dist/modes/commands-core.js +1 -1
- package/dist/modes/image-input.d.ts +1 -1
- package/dist/modes/image-input.js +1 -1
- package/dist/modes/interactive/agent-bar.d.ts +1 -1
- package/dist/modes/interactive/agent-bar.js +1 -1
- package/dist/modes/interactive/agent-transcript.d.ts +1 -1
- package/dist/modes/interactive/agent-transcript.js +1 -1
- package/dist/modes/interactive/agent-view.d.ts +1 -1
- package/dist/modes/interactive/agent-view.js +1 -1
- package/dist/modes/interactive/approval-dock.d.ts +1 -1
- package/dist/modes/interactive/approval-dock.js +1 -1
- package/dist/modes/interactive/config-panel.d.ts +1 -1
- package/dist/modes/interactive/config-panel.js +1 -1
- package/dist/modes/interactive/config-ui.d.ts +1 -1
- package/dist/modes/interactive/config-ui.js +1 -1
- package/dist/modes/interactive/memory-panel.d.ts +1 -1
- package/dist/modes/interactive/memory-panel.js +1 -1
- package/dist/modes/interactive/plan-command.d.ts +1 -1
- package/dist/modes/interactive/plan-command.js +1 -1
- package/dist/modes/interactive/plan-dialog.d.ts +1 -1
- package/dist/modes/interactive/plan-dialog.js +1 -1
- package/dist/modes/interactive/plan-flow.d.ts +1 -1
- package/dist/modes/interactive/plan-flow.js +1 -1
- package/dist/modes/interactive/subagent-view.d.ts +1 -1
- package/dist/modes/interactive/subagent-view.js +1 -1
- package/dist/modes/interactive/task-background.d.ts +1 -1
- package/dist/modes/interactive/task-background.js +1 -1
- package/dist/modes/interactive/trace-view.d.ts +1 -1
- package/dist/modes/interactive/trace-view.js +1 -1
- package/dist/modes/print/json-event.d.ts +1 -1
- package/dist/modes/print/json-event.js +2 -2
- package/dist/modes/print/print-mode.d.ts +1 -1
- package/dist/modes/print/print-mode.js +1 -1
- package/dist/modes/print/search-hint.d.ts +1 -1
- package/dist/modes/print/search-hint.js +1 -1
- package/dist/modes/rpc/commands.js +2 -2
- package/dist/permissions/auto-safe.d.ts +1 -1
- package/dist/permissions/auto-safe.js +1 -1
- package/dist/permissions/bypass.d.ts +1 -1
- package/dist/permissions/bypass.js +1 -1
- package/dist/permissions/classifier.d.ts +1 -1
- package/dist/permissions/classifier.js +1 -1
- package/dist/permissions/memory-class.d.ts +1 -1
- package/dist/permissions/memory-class.js +1 -1
- package/dist/permissions/pipeline.d.ts +2 -2
- package/dist/permissions/pipeline.js +2 -2
- package/dist/permissions/protected.d.ts +1 -1
- package/dist/permissions/protected.js +1 -1
- package/dist/permissions/readonly-bash.d.ts +1 -1
- package/dist/permissions/readonly-bash.js +1 -1
- package/dist/permissions/types.d.ts +2 -2
- package/dist/plan/done-markers.d.ts +1 -1
- package/dist/plan/done-markers.js +1 -1
- package/dist/plan/extract.d.ts +1 -1
- package/dist/plan/extract.js +1 -1
- package/dist/plan/prompts.d.ts +1 -1
- package/dist/plan/prompts.js +1 -1
- package/dist/plan/store.d.ts +1 -1
- package/dist/plan/store.js +1 -1
- package/dist/rpc.d.ts +3 -3
- package/dist/rpc.js +3 -3
- package/dist/sandbox/bash.d.ts +1 -1
- package/dist/sandbox/bash.js +1 -1
- package/dist/sandbox/detect.d.ts +1 -1
- package/dist/sandbox/detect.js +1 -1
- package/dist/sandbox/index.d.ts +1 -1
- package/dist/sandbox/index.js +1 -1
- package/dist/sandbox/profile.d.ts +1 -1
- package/dist/sandbox/profile.js +1 -1
- package/dist/sandbox/wrap.d.ts +1 -1
- package/dist/sandbox/wrap.js +1 -1
- package/dist/sdk.d.ts +3 -3
- package/dist/sdk.js +2 -2
- package/dist/session/line-reader.d.ts +1 -1
- package/dist/session/line-reader.js +1 -1
- package/dist/session/list.d.ts +1 -1
- package/dist/session/list.js +1 -1
- package/dist/session/migrate.d.ts +1 -1
- package/dist/session/migrate.js +1 -1
- package/dist/session/store.d.ts +1 -1
- package/dist/session/store.js +1 -1
- package/dist/skills/builtin.js +2 -2
- package/dist/tools/background-jobs.d.ts +1 -1
- package/dist/tools/background-jobs.js +1 -1
- package/dist/tools/clipboard-image.d.ts +1 -1
- package/dist/tools/clipboard-image.js +1 -1
- package/dist/tools/edit.d.ts +1 -1
- package/dist/tools/edit.js +1 -1
- package/dist/tools/grep.d.ts +1 -1
- package/dist/tools/grep.js +1 -1
- package/dist/tools/image-resize.d.ts +1 -1
- package/dist/tools/image-resize.js +1 -1
- package/dist/tools/read-lines.d.ts +1 -1
- package/dist/tools/read-lines.js +1 -1
- package/dist/tools/read.d.ts +1 -1
- package/dist/tools/read.js +1 -1
- package/dist/tools/task-ctl.d.ts +1 -1
- package/dist/tools/task-ctl.js +1 -1
- package/dist/tools/task.d.ts +2 -2
- package/dist/tools/task.js +2 -2
- package/dist/tools/types.d.ts +3 -3
- package/dist/tools/types.js +1 -1
- package/dist/trace/build.d.ts +1 -1
- package/dist/trace/build.js +1 -1
- package/dist/trace/detail.d.ts +1 -1
- package/dist/trace/detail.js +1 -1
- package/dist/trace/flatten.d.ts +1 -1
- package/dist/trace/flatten.js +1 -1
- package/dist/trace/format.d.ts +1 -1
- package/dist/trace/format.js +1 -1
- package/dist/trace/html-template.d.ts +1 -1
- package/dist/trace/html-template.js +1 -1
- package/dist/trace/html.d.ts +1 -1
- package/dist/trace/html.js +1 -1
- package/dist/trace/query-session.d.ts +1 -1
- package/dist/trace/query-session.js +1 -1
- package/dist/trace/query.d.ts +1 -1
- package/dist/trace/query.js +1 -1
- package/dist/trace/types.d.ts +1 -1
- package/dist/trace/types.js +1 -1
- package/dist/tui/components/settings-list.d.ts +1 -1
- package/dist/tui/components/settings-list.js +1 -1
- package/docs/README.md +85 -0
- package/docs/assets/ama-wordmark-dark.svg +37 -0
- package/docs/assets/ama-wordmark-light.svg +37 -0
- package/docs/en/README.md +39 -0
- package/docs/en/{permissions.md → guides/permissions.md} +14 -14
- package/docs/en/{providers.md → guides/providers.md} +13 -12
- package/docs/en/{sessions.md → guides/sessions.md} +6 -6
- package/docs/en/{tui.md → guides/tui.md} +15 -15
- package/docs/en/{acp.md → reference/acp.md} +6 -6
- package/docs/en/{host-api.md → reference/host-api.md} +7 -7
- package/docs/en/{rpc.md → reference/rpc.md} +13 -13
- package/docs/{agents.md → guides/agents.md} +68 -23
- package/docs/{codemode.md → guides/codemode.md} +3 -3
- package/docs/{hooks.md → guides/hooks.md} +2 -2
- package/docs/guides/i18n.md +93 -0
- package/docs/{memory.md → guides/memory.md} +1 -1
- package/docs/{permissions.md → guides/permissions.md} +2 -2
- package/docs/{plan.md → guides/plan.md} +4 -4
- package/docs/{providers.md → guides/providers.md} +11 -10
- package/docs/{sessions.md → guides/sessions.md} +5 -5
- package/docs/{tui.md → guides/tui.md} +8 -8
- package/docs/{acp.md → reference/acp.md} +5 -5
- package/docs/{host-api.md → reference/host-api.md} +4 -4
- package/docs/{rpc.md → reference/rpc.md} +11 -11
- package/docs/{session-format.md → reference/session-format.md} +7 -7
- package/package.json +12 -23
- package/docs/rewind-plan.md +0 -181
- package/docs/tui-design.md +0 -764
- /package/docs/{sandbox.md → guides/sandbox.md} +0 -0
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
# RPC protocol (stdio JSONL)
|
|
2
2
|
|
|
3
|
-
English · [简体中文](
|
|
3
|
+
English · [简体中文](../../reference/rpc.md)
|
|
4
4
|
|
|
5
|
-
> Translated from the Chinese [docs/rpc.md](
|
|
5
|
+
> Translated from the Chinese [docs/reference/rpc.md](../../reference/rpc.md) as of commit `a567833`. When the two differ, the Chinese version is
|
|
6
6
|
> authoritative.
|
|
7
7
|
|
|
8
|
-
`ama --mode rpc` reads commands from stdin and writes responses and events to stdout, one JSON value per line. The types are defined in `@armadra/agent/rpc` (`src/rpc.ts`) and implemented in `src/modes/rpc/`. The events printed by `ama -p --output-format stream-json` have the same shapes. The design rationale is in [design.md](
|
|
8
|
+
`ama --mode rpc` reads commands from stdin and writes responses and events to stdout, one JSON value per line. The types are defined in `@armadra/agent/rpc` (`src/rpc.ts`) and implemented in `src/modes/rpc/`. The events printed by `ama -p --output-format stream-json` have the same shapes. The design rationale is in [design.md](../../design/design.md) §13.2 (Chinese).
|
|
9
9
|
|
|
10
10
|
## Wire
|
|
11
11
|
|
|
@@ -35,7 +35,7 @@ A command has the shape `{ "id"?: string, "type": <command name>, ...parameters
|
|
|
35
35
|
|
|
36
36
|
- A response carries the request's `id` back (only string ids). Commands are processed concurrently: `prompt` does not block later commands, so responses may arrive in a different order than requests; match them by `id`.
|
|
37
37
|
- On failure `error` is human-readable text and `code` is the `AmaError.code` (when there is one). Unknown commands → `code: "invalid_arguments"`.
|
|
38
|
-
**Hosts must decide by `code` and never parse `error` / `message`**: human-readable text follows the interface language (`AMA_LANG`, `--lang`, `ui.language`; bilingual since wave 6, see [i18n.md](
|
|
38
|
+
**Hosts must decide by `code` and never parse `error` / `message`**: human-readable text follows the interface language (`AMA_LANG`, `--lang`, `ui.language`; bilingual since wave 6, see [i18n.md](../../guides/i18n.md), Chinese). The same holds for the `message` of `notification` events.
|
|
39
39
|
- A line that is not valid JSON or lacks `type` → `{ "type": "response", "command": "parse", "success": false, "error": … }`, without `id`.
|
|
40
40
|
- Commands that need extension methods of the session implementation (marked † below) return `code: "not_implemented"` on sessions that are not `AgentSessionImpl`; sessions created by the CLI and the SDK are all `AgentSessionImpl`.
|
|
41
41
|
|
|
@@ -100,7 +100,7 @@ Prompt commands **do not wait for the run to finish**: they are answered as soon
|
|
|
100
100
|
|
|
101
101
|
### Rewind
|
|
102
102
|
|
|
103
|
-
Details in [rewind-plan.md](
|
|
103
|
+
Details in [rewind-plan.md](../../history/rewind-plan.md) §3 (Chinese). Rewind points are the user messages on the active path that start new turns (steers and queued messages belong to the current turn and are not listed). Calling while running returns `busy`.
|
|
104
104
|
|
|
105
105
|
| Command | Parameters | `data` |
|
|
106
106
|
| ------------------- | --------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
@@ -111,7 +111,7 @@ Details in [rewind-plan.md](../rewind-plan.md) §3 (Chinese). Rewind points are
|
|
|
111
111
|
|
|
112
112
|
`CodeRestoreResult`: `restored` / `deleted` / `conflicts` (left untouched with `skip`, overwritten with `overwrite`) / `skipped: { path, reason }[]` (`symlink` / `hardlink` / `not_regular` / `parent_moved` / `too_large` / `backup_missing`) / `failed: { path, message }[]` / `insertions` / `deletions`; paths inside cwd are relative (`/`-separated). Error codes: restoring code without a checkpoint → `no_checkpoint`; everything failed and nothing was restored → `rewind_failed` (the conversation is left alone); the entry is not a rewind point on the active path → `invalid_arguments`. For conversation-only or code-only rewinds, a `custom_message{customType: "ama.rewind-note"}` is appended to the end of the context before the next prompt, telling the model which files disagree with the conversation.
|
|
113
113
|
|
|
114
|
-
After a session switch the server re-subscribes to events and sends `session_start` for the new session (`reason` `new` / `resume` / `fork`). `new_session` does not use the `parentSession` parameter yet. Entry shapes are in [session-format.md](
|
|
114
|
+
After a session switch the server re-subscribes to events and sends `session_start` for the new session (`reason` `new` / `resume` / `fork`). `new_session` does not use the `parentSession` parameter yet. Entry shapes are in [session-format.md](../../reference/session-format.md) (Chinese).
|
|
115
115
|
|
|
116
116
|
### Approvals
|
|
117
117
|
|
|
@@ -120,7 +120,7 @@ After a session switch the server re-subscribes to events and sends `session_sta
|
|
|
120
120
|
| `set_client_capabilities` | `capabilities: ("approvals" \| "images" \| "hooks" \| "plans" \| "compact_events")[]` | `{ capabilities }` |
|
|
121
121
|
| `permission_response` | `requestId: string`, `decision: "allow" \| "deny" \| "allow_session"` | `{ accepted: boolean }` (false = not currently waiting for this id; kept and applied when that request is asked) |
|
|
122
122
|
|
|
123
|
-
`compact_events` (docs/memory-plan.md D9, Chinese): once declared, `turn_end.toolResults`, `message_start` and `entry_appended` no longer repeat the body of tool results and of user messages with images (marked `contentOmitted: true`); the body is sent only in `message_end` and `tool_execution_end`. Without it the event shapes are byte-for-byte unchanged. Shapes are in [Compact events](#compact-events-compact_events). `stream-json` has no such switch and always emits the full shapes.
|
|
123
|
+
`compact_events` (docs/history/memory-plan.md D9, Chinese): once declared, `turn_end.toolResults`, `message_start` and `entry_appended` no longer repeat the body of tool results and of user messages with images (marked `contentOmitted: true`); the body is sent only in `message_end` and `tool_execution_end`. Without it the event shapes are byte-for-byte unchanged. Shapes are in [Compact events](#compact-events-compact_events). `stream-json` has no such switch and always emits the full shapes.
|
|
124
124
|
|
|
125
125
|
### Tools, permissions, discovery
|
|
126
126
|
|
|
@@ -144,7 +144,7 @@ After a session switch the server re-subscribes to events and sends `session_sta
|
|
|
144
144
|
|
|
145
145
|
### Traces (wave 6)
|
|
146
146
|
|
|
147
|
-
`get_trace` returns the session trace (the same tree as the TUI `/trace` and `ama sessions trace`, see [tui.md](tui.md)
|
|
147
|
+
`get_trace` returns the session trace (the same tree as the TUI `/trace` and `ama sessions trace`, see [tui.md](../guides/tui.md)
|
|
148
148
|
"Traces"). There is no new event: after `entry_appended`, fetch again with the previous `cursor.since` to refresh incrementally.
|
|
149
149
|
|
|
150
150
|
| Parameter | Meaning |
|
|
@@ -227,7 +227,7 @@ There is also the non-session event `{"type":"notification","level":"info"|"warn
|
|
|
227
227
|
|
|
228
228
|
`parentToolCallId` appears only on inner calls made through `tools.*` inside codemode scripts; its value is the id of the outer `codemode` call, which clients use to fold the display. Inner calls do not enter the transcript.
|
|
229
229
|
|
|
230
|
-
Assistant messages in `message_end`, `turn_end`, `done` / `error` and in replays (`get_messages`, `get_entries`) may carry two optional fields (model efficiency batch, docs/model-efficiency-plan.md §1.10, Chinese): `retryAfterMs` on failed messages (`Retry-After`, in ms) and `rawArguments` on tool-call blocks (the raw argument string the model produced). `subagent_*` events are unchanged; `TaskInfo` from `get_tasks` may carry `context?: "fork" | "fresh"` (the sub-session's actual context mode). All are new optional fields, `RPC_PROTOCOL_VERSION` is unchanged, and clients can ignore fields they do not know.
|
|
230
|
+
Assistant messages in `message_end`, `turn_end`, `done` / `error` and in replays (`get_messages`, `get_entries`) may carry two optional fields (model efficiency batch, docs/history/model-efficiency-plan.md §1.10, Chinese): `retryAfterMs` on failed messages (`Retry-After`, in ms) and `rawArguments` on tool-call blocks (the raw argument string the model produced). `subagent_*` events are unchanged; `TaskInfo` from `get_tasks` may carry `context?: "fork" | "fresh"` (the sub-session's actual context mode). All are new optional fields, `RPC_PROTOCOL_VERSION` is unchanged, and clients can ignore fields they do not know.
|
|
231
231
|
|
|
232
232
|
### Compact events (`compact_events`)
|
|
233
233
|
|
|
@@ -243,7 +243,7 @@ In the full shapes, the result of one tool call appears once each in `message_st
|
|
|
243
243
|
|
|
244
244
|
### Sub-agent events (wave 5)
|
|
245
245
|
|
|
246
|
-
Sub-agents started by `task` / `task_ctl` (ama sub-sessions and external agents share the same events, see [agents.md](
|
|
246
|
+
Sub-agents started by `task` / `task_ctl` (ama sub-sessions and external agents share the same events, see [agents.md](../../guides/agents.md), Chinese):
|
|
247
247
|
|
|
248
248
|
| Event | Fields |
|
|
249
249
|
| --------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
@@ -349,7 +349,7 @@ The `data` of `get_session_stats` is `SessionStats`:
|
|
|
349
349
|
{"type":"context_pressure","percent":71,"threshold":70,"remainingTokens":57990,"estimatedTurnsLeft":6}
|
|
350
350
|
```
|
|
351
351
|
|
|
352
|
-
`cache_miss` gives `detail` only for `prefix_changed` (`tools`, `system`, or `system:<section,…>` naming the changed sections, such as `system:hooks,memory`). The values and meanings of `reason` for `cache_warm{stopped}` are in [tui.md](tui.md) "Cache and context". The result object of `ama -p --output-format json` also has a `cache` field of the same shape.
|
|
352
|
+
`cache_miss` gives `detail` only for `prefix_changed` (`tools`, `system`, or `system:<section,…>` naming the changed sections, such as `system:hooks,memory`). The values and meanings of `reason` for `cache_warm{stopped}` are in [tui.md](../guides/tui.md) "Cache and context". The result object of `ama -p --output-format json` also has a `cache` field of the same shape.
|
|
353
353
|
|
|
354
354
|
It also carries `context: { tokens, window, percent }` (context used, window size and usage 0–100, defined like `contextTokens` / `contextWindow` / `contextPercent` in the table above); an unknown item is omitted (for a model without a window only `tokens` is present), and when all are unknown there is no `context`.
|
|
355
355
|
|
|
@@ -363,7 +363,7 @@ It also carries `context: { tokens, window, percent }` (context used, window siz
|
|
|
363
363
|
|
|
364
364
|
## Plan approval
|
|
365
365
|
|
|
366
|
-
Plan mode and the plan format are described in [plan.md](
|
|
366
|
+
Plan mode and the plan format are described in [plan.md](../../guides/plan.md) (Chinese).
|
|
367
367
|
|
|
368
368
|
1. When a turn ends in plan mode with plain text and the reply contains a `<proposed_plan>` block, the server saves the plan and sends `plan_proposed{ planId, version, markdown, steps, filePath? }` (`steps[]`: `{ id, text, dependsOn?, agent? }`), followed by `agent_settled` as usual.
|
|
369
369
|
2. The client answers only if it declared `set_client_capabilities{capabilities:["plans"]}`; otherwise the config `plan.unattended` applies: `stop` by default (the plan stays proposed, no mode switch, no execution; the client can still answer later with `plan_response`), and `approve` approves and executes within the same run.
|
|
@@ -381,7 +381,7 @@ Plan mode and the plan format are described in [plan.md](../plan.md) (Chinese).
|
|
|
381
381
|
|
|
382
382
|
- stdin closed: no more commands are accepted and approvals are withdrawn (later asks resolve as unanswered → deny); in-flight commands and started runs finish and their responses are written, then the exit code is 0. So `printf '{"type":"prompt","message":"hi"}\n' | ama --mode rpc` gets a complete reply; to stop early, send `abort` first.
|
|
383
383
|
- SIGINT / SIGTERM: the current run is interrupted and the process exits in order, with exit code 130 / 143.
|
|
384
|
-
- Startup failures use the CLI exit codes ([design.md](
|
|
384
|
+
- Startup failures use the CLI exit codes ([design.md](../../design/design.md) §11.3, Chinese): config error 3, no model or key 4, session error 5, host / hook startup failure 6, host API version mismatch 78.
|
|
385
385
|
|
|
386
386
|
## Examples
|
|
387
387
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Agent:子 Agent 与外部 Agent
|
|
2
2
|
|
|
3
3
|
模型只认识两个工具:`task`(委派)与 `task_ctl`(管理后台任务)。`task(agent=…)` 的 `agent` 既可以是 ama 自己的子 Agent
|
|
4
|
-
类型,也可以是外部 CLI Agent(外部部分见下文「外部 Agent」节)。设计依据:[wave5-plan.md](wave5-plan.md) §7、D13、D22–D24。
|
|
4
|
+
类型,也可以是外部 CLI Agent(外部部分见下文「外部 Agent」节)。设计依据:[wave5-plan.md](../history/wave5-plan.md) §7、D13、D22–D24。
|
|
5
5
|
|
|
6
6
|
## 子 Agent
|
|
7
7
|
|
|
@@ -92,7 +92,7 @@ ama 再跑一轮、在消息里要求「不要调用工具、直接给最终报
|
|
|
92
92
|
`<task-notification>`:
|
|
93
93
|
|
|
94
94
|
- 交互界面:`Ctrl+B` / `/tasks bg [id]` / Agent 栏里按 `b`(见 [tui.md](tui.md)「子 Agent」);
|
|
95
|
-
- RPC:`background_task { taskId? }`([rpc.md](rpc.md)),SDK:`session.backgroundTask(taskId?)`,返回实际转了的 `taskId`;
|
|
95
|
+
- RPC:`background_task { taskId? }`([rpc.md](../reference/rpc.md)),SDK:`session.backgroundTask(taskId?)`,返回实际转了的 `taskId`;
|
|
96
96
|
不给 `taskId` 时转全部前台运行中任务,正在 `task_ctl wait` 的等待也一并打断;
|
|
97
97
|
- 自动:`subagents.autoBackgroundAfterMs` 大于 0 时,前台任务运行超过该毫秒数自动转后台(缺省 0 关闭)。
|
|
98
98
|
|
|
@@ -133,7 +133,7 @@ ama 再跑一轮、在消息里要求「不要调用工具、直接给最终报
|
|
|
133
133
|
每个任务有会话内唯一的 `taskId`(`t1`、`t2` …)。子会话结束后不立即释放,最多保留 4 个(`subagents.retainSessions`;
|
|
134
134
|
最久未用的先释放内存,JSONL 一直在)。`task{taskId}` / `task_ctl send` 续聊时,保留中的直接追加消息,已释放的按会话文件重新打开再追加——
|
|
135
135
|
同一个任务始终写同一个 JSONL。父会话在任务开始、每次续聊与结束时写一条 `custom{ama.task}`
|
|
136
|
-
([session-format.md](session-format.md));`--resume` 时据此重建任务列表,当时还在运行的标 `interrupted`,仍可续聊。
|
|
136
|
+
([session-format.md](../reference/session-format.md));`--resume` 时据此重建任务列表,当时还在运行的标 `interrupted`,仍可续聊。
|
|
137
137
|
内存会话(`--no-session`)的任务被释放后不能续聊。子会话转录常达数十 MB,保留得越多常驻内存越大;频繁轮换续聊
|
|
138
138
|
5 个以上任务时可调大保留数,代价只是被释放的任务续聊时多一次从磁盘重开。
|
|
139
139
|
|
|
@@ -159,7 +159,7 @@ worktree 里与父 cwd 对应的目录。结束时没有改动(工作区干净
|
|
|
159
159
|
- 类型声明了 `tools` / `disallowed-tools`(或参数给了 `tools`)时,工具表不变,不可用的工具在执行层拒绝
|
|
160
160
|
(`Tool "X" is not available in this session.`),并在 `<task>` 里列出。只读类型照旧走只读管线。
|
|
161
161
|
- `<task>` 同时列出按深度拒绝的 `task` / `task_ctl` 并要求不要调用它们(执行层仍是深度拒绝的文案)。实测仍有模型把父消息里
|
|
162
|
-
「调用 task」的指令当成自己的:调一次被拒,多一轮请求,有时随后只回报失败、不做子任务(见 [benchmarks](benchmarks/efficiency-2026-10.md)「F2」)。
|
|
162
|
+
「调用 task」的指令当成自己的:调一次被拒,多一轮请求,有时随后只回报失败、不做子任务(见 [benchmarks](../benchmarks/efficiency-2026-10.md)「F2」)。
|
|
163
163
|
- `isolation: "worktree"` 时子会话的 cwd 是 worktree,`<task>` 里说明上文的相对路径指父目录;cwd 节变化以尾部补丁发送,
|
|
164
164
|
不影响已缓存的前缀。
|
|
165
165
|
|
|
@@ -171,12 +171,12 @@ worktree 里与父 cwd 对应的目录。结束时没有改动(工作区干净
|
|
|
171
171
|
何时用 fork:子任务需要你已经读过、讨论过的内容时。fork 的首个请求把父上下文整段带上,按命中价计费;fresh 只发系统提示、
|
|
172
172
|
工具表与任务说明,但你得在 `prompt` 里写清全部背景,子 Agent 往往还要重新读文件。
|
|
173
173
|
|
|
174
|
-
| 供应商(命中价 / 未命中价) | 8k 父上下文 fork 一次(实测,见 [benchmarks](benchmarks/efficiency-2026-10.md)「F」) | 适合 |
|
|
175
|
-
| ------------------------------- |
|
|
176
|
-
| DeepSeek(约 1/50) | 命中 77%,与父自己的下一回合相同;折合约 1.9k 全价 token
|
|
177
|
-
| Kimi(约 1/4–1/10) | 命中 97.5%
|
|
178
|
-
| OpenAI 系(经中转,不发路由键) | 两次分别 0% 与 85%,取决于中转把请求路由到哪个上游
|
|
179
|
-
| Anthropic(1/10,写入 1.25×) | 未实测;前缀相同,命中应与父的下一回合相同
|
|
174
|
+
| 供应商(命中价 / 未命中价) | 8k 父上下文 fork 一次(实测,见 [benchmarks](../benchmarks/efficiency-2026-10.md)「F」) | 适合 |
|
|
175
|
+
| ------------------------------- | ---------------------------------------------------------------------------------------- | ---------------------------- |
|
|
176
|
+
| DeepSeek(约 1/50) | 命中 77%,与父自己的下一回合相同;折合约 1.9k 全价 token | 需要父上下文时几乎总划算 |
|
|
177
|
+
| Kimi(约 1/4–1/10) | 命中 97.5% | 需要父上下文、且要重读较多时 |
|
|
178
|
+
| OpenAI 系(经中转,不发路由键) | 两次分别 0% 与 85%,取决于中转把请求路由到哪个上游 | 视中转而定 |
|
|
179
|
+
| Anthropic(1/10,写入 1.25×) | 未实测;前缀相同,命中应与父的下一回合相同 | 需要父上下文时 |
|
|
180
180
|
|
|
181
181
|
fork 的成本不止首请求:子会话**每一回合**都重读整段父前缀。按命中价折算,8k 父上下文 × 30 回合在 DeepSeek(1/50)上约
|
|
182
182
|
4.8k 全价 token,在 Kimi / Anthropic(1/4–1/10)上约 24k–60k,中转落空时全价。所以 DeepSeek 上子任务只要重读 ≥ 1 份
|
|
@@ -189,7 +189,7 @@ fork 的成本不止首请求:子会话**每一回合**都重读整段父前
|
|
|
189
189
|
|
|
190
190
|
### 事件与统计
|
|
191
191
|
|
|
192
|
-
RPC / SDK 事件 `subagent_start` / `subagent_update` / `subagent_background` / `subagent_end` 见 [rpc.md](rpc.md)「子 Agent 事件」。
|
|
192
|
+
RPC / SDK 事件 `subagent_start` / `subagent_update` / `subagent_background` / `subagent_end` 见 [rpc.md](../reference/rpc.md)「子 Agent 事件」。
|
|
193
193
|
`getStats().tasks` 给出任务总数、运行中数量与按状态的计数;子会话的缓存命中与重计费仍汇总在 `cache.subagents`。
|
|
194
194
|
RPC `get_tasks` / `get_agents` 返回任务快照与可用类型(来源、定义文件路径)。交互界面的 `/tasks`、`/agents` 与 task 工具行的折叠显示见 [tui.md](tui.md)「子 Agent」。
|
|
195
195
|
|
|
@@ -222,15 +222,48 @@ ama 能以各 CLI 自己的账户、模型与权限策略驱动外部编码 Agen
|
|
|
222
222
|
|
|
223
223
|
每个 Agent 有一条候选链,按优先级取第一个已安装、且支持当前模式的:原生 ACP > 已装的 ACP 适配器 > 原生结构化协议 > 一次性打印模式。
|
|
224
224
|
|
|
225
|
-
| `agent`
|
|
226
|
-
|
|
|
227
|
-
| `claude`
|
|
228
|
-
| `codex`
|
|
229
|
-
| `
|
|
230
|
-
| `
|
|
231
|
-
| `
|
|
232
|
-
| `
|
|
233
|
-
| `
|
|
225
|
+
| `agent` | 候选(优先级从高到低) | 已验证版本 |
|
|
226
|
+
| ---------------- | ------------------------------------------------------------------------------------------------------------------- | ------------------------------------ |
|
|
227
|
+
| `claude` | `claude-agent-acp`(ACP 适配器)→ `claude -p` stream-json(原生)→ `claude -p --output-format json`(一次性,只读) | 适配器 0.89.x;stream-json 2.1.x |
|
|
228
|
+
| `codex` | `codex-acp`(ACP 适配器)→ `codex app-server`(原生)→ `codex exec --json`(一次性,只读) | 适配器 2.2.x;app-server 0.160–0.162 |
|
|
229
|
+
| `copilot` | `copilot --acp --stdio` | 1.0.95 |
|
|
230
|
+
| `opencode` | `opencode acp` | 1.18.x |
|
|
231
|
+
| `pi` | `pi --mode rpc`(原生;审批经 ama 加载的审批闸扩展,见下) | 1.1.x |
|
|
232
|
+
| `cursor` | `cursor-agent acp`(按官方文档:模式 `agent` / `plan` / `ask`) | 未验证(本机未装) |
|
|
233
|
+
| `gemini` | `gemini --acp` → `gemini -p --output-format stream-json`(一次性,只读) | 未验证 |
|
|
234
|
+
| `qwen` | `qwen --acp`(0.23.x 有不发权限请求的问题,只在 plan 下用) | 未验证 |
|
|
235
|
+
| `kimi` / `goose` | 各自的 ACP 子命令 | 未验证 |
|
|
236
|
+
| `ama` | `ama --mode acp` | 随 ama |
|
|
237
|
+
| `acp:<program>` | 任意 ACP Agent:表里有同名程序就用它的参数,否则不带参数启动 | — |
|
|
238
|
+
|
|
239
|
+
pi 的社区 ACP 适配器 `pi-acp` 不收录:pi 本身没有审批通道,适配器不发 `session/request_permission`,工具会不经人直接执行。
|
|
240
|
+
ama 改为直接驱动 `pi --mode rpc`,并以 `-e` 给这一次运行加载一个最小扩展(写在每个会话自己的临时目录,关会话即删,不碰 pi 的配置):
|
|
241
|
+
只读内置工具(`read` / `grep` / `find` / `ls`)以外的调用都经 RPC 的扩展对话框交给 ama——`plan` / `allowlist` 直接拒绝(并以
|
|
242
|
+
`--tools` 只开只读工具),`auto-edit` 及更宽的模式放行 `edit` / `write`,其余交给人。用户自己的扩展弹出的对话框一律取消、不代答。
|
|
243
|
+
|
|
244
|
+
#### 实测能力矩阵(2026-10-10)
|
|
245
|
+
|
|
246
|
+
每条路径在临时目录各跑两个会话:非 git 目录里两轮「只回 OK」+ 一次触发审批的写文件(`default` 模式);git 目录里长输出时中断,再续一轮。
|
|
247
|
+
模型用各家最便宜的:Claude `haiku`、Codex `gpt-6-luna`、Copilot `gpt-5-mini`、OpenCode `opencode/mimo-v2.6-flash-free`、pi `openai-codex/gpt-6-luna`。
|
|
248
|
+
记录与原始数字见 [benchmarks/external-agents-2026-10.md](../benchmarks/external-agents-2026-10.md)。
|
|
249
|
+
|
|
250
|
+
| 路径 | 两轮续聊 | 审批写文件 | 中断后续聊 | 用量 / 上下文 | 非 git 目录 |
|
|
251
|
+
| -------------------------- | -------- | ------------------------------------------------- | ------------- | --------------------------------- | -------------- |
|
|
252
|
+
| Claude stream-json 2.1.295 | 通过 | 通过(`Write` 交人) | 通过(1.9 s) | 美元 + token;上下文(本次新增) | 通过 |
|
|
253
|
+
| claude-agent-acp 0.89.0 | 通过 | 通过 | 通过(2.3 s) | 美元 + token + 上下文 | 通过 |
|
|
254
|
+
| Codex app-server 0.162.1 | 通过 | 通过(命令提权交人) | 通过(2.5 s) | token + 上下文 | 通过 |
|
|
255
|
+
| codex-acp 2.2.2 | 通过 | 未触发:只读沙箱下模型没申请提权,直接报写入被拒 | 通过(2.6 s) | token + 上下文 | 通过 |
|
|
256
|
+
| `codex exec`(一次性) | 通过 | 不支持(只读) | 结束进程 | token | 通过(修复后) |
|
|
257
|
+
| Copilot ACP 1.0.95 | 通过 | 通过 | 通过(4.6 s) | 请求数;token + 上下文 | 通过 |
|
|
258
|
+
| OpenCode ACP 1.18.35 | 通过 | 未触发:OpenCode 自己的权限配置放行编辑,没有问人 | 通过(6.2 s) | token + 上下文(免费模型 0 美元) | 通过 |
|
|
259
|
+
| pi RPC 1.1.0 | 通过 | 通过(经审批闸交人) | 通过(2.7 s) | 美元(pi 按价目估算)+ 上下文 | 通过 |
|
|
260
|
+
| Cursor ACP | — | — | — | — | 未验证 |
|
|
261
|
+
|
|
262
|
+
模式映射按实测写进驱动表:claude-agent-acp 的 `auto-edit` → `acceptEdits`、`full-auto` → `auto`(用户把缺省设成
|
|
263
|
+
`bypassPermissions` 时也会被改回 ama 对应的模式);codex-acp 的 `plan` / `default` → `read-only`、`auto-edit` → `workspace-write`、
|
|
264
|
+
`auto` / `full-auto` → `agent`;Copilot 的模式 id 是 URL(`…/session-modes#agent|plan|autopilot`),`plan` 对 `#plan`、其余对 `#agent`。
|
|
265
|
+
从不映射到放开全部权限的模式(`bypassPermissions`、`agent-full-access`、`autopilot`)。OpenCode 的模式来自用户自己的 agent 配置,
|
|
266
|
+
没有同名模式时按它的缺省运行并提示;没有只读模式时 `plan` 拒绝启动。
|
|
234
267
|
|
|
235
268
|
版本越过已验证区间时仍会启动,但会提示协议可能有变化(Claude 的 stream-json 控制协议不是公开接口,Codex app-server 标为实验)。`/agents` 与 RPC `get_agents` 列出探测结果(只查 PATH 与 `--version`,不联网、不计费;结果缓存在 `<数据目录>/drivers.json`)。
|
|
236
269
|
|
|
@@ -249,7 +282,9 @@ ama 能以各 CLI 自己的账户、模型与权限策略驱动外部编码 Agen
|
|
|
249
282
|
- **前台 / 后台 / 续聊**:与 ama 子会话相同——结果是外部 Agent 的最终文本加工具摘要与修改的文件(≤ 50 KB);
|
|
250
283
|
`background: true` 完成后收到 `<task-notification>`;`task{taskId}` / `task_ctl send` 在同一外部会话里续聊(进程还在就直接
|
|
251
284
|
追加一轮;空闲关闭或被停止过的,以外部会话 id `resume` 重开);`task_ctl stop` 发协议级中断,挂起的审批回「已取消」。
|
|
252
|
-
- **模型**:`agents.<id>.model` 或 `task` 的 `model` 参数原样交给外部 CLI
|
|
285
|
+
- **模型**:`agents.<id>.model` 或 `task` 的 `model` 参数原样交给外部 CLI(原生驱动用各自的 `--model` / `-m`;ACP Agent
|
|
286
|
+
经 category `model` 的会话配置项设置,按值、名称或 `provider/model` 的模型部分匹配,没有匹配时提示并用它的缺省模型);
|
|
287
|
+
`subagents.defaultModel`(ama 的模型)不传。
|
|
253
288
|
- `/agents` 与 RPC `get_agents` 列出类型目录与外部 Agent(`installed` / `version`,会话建立时异步探测并缓存);`/tasks` 查看任务输出、
|
|
254
289
|
停止任务。界面见 [tui.md](tui.md)「子 Agent」。
|
|
255
290
|
- 外部 Agent 自己报告的提示(预算用尽、超时、模式降级、拒答提问等)在交互界面的消息区显示为一行 `[claude · t3] …`,
|
|
@@ -277,7 +312,8 @@ ama 能以各 CLI 自己的账户、模型与权限策略驱动外部编码 Agen
|
|
|
277
312
|
| `auto` | `auto` | `on-request` / `workspace-write` | 同上 |
|
|
278
313
|
| `full-auto` | `auto`(从不给 `bypassPermissions`) | `never` / `workspace-write`(从不给 `danger-full-access`) | 同上 |
|
|
279
314
|
|
|
280
|
-
ACP
|
|
315
|
+
上表 ACP 一列是缺省规则;模式 id 与 ama 不同名的 Agent 在驱动表里有显式映射(见上文「实测能力矩阵」后的说明)。
|
|
316
|
+
ACP Agent 不给 `modes`、改用 category `mode` 的配置项表达模式时,按上表同一映射在配置项的可选值里找,经 `session/set_config_option` 设置(见 [acp.md](../reference/acp.md)「作为客户端」)。
|
|
281
317
|
|
|
282
318
|
一次性打印模式不能审批,只在只读任务下用。
|
|
283
319
|
|
|
@@ -320,4 +356,13 @@ CI 不跑真实 CLI。本机已登录 `claude` / `codex` 时:
|
|
|
320
356
|
AMA_E2E_AGENTS=1 pnpm vitest run src/drivers/agents.e2e.test.ts src/agents/external-task.e2e.test.ts
|
|
321
357
|
```
|
|
322
358
|
|
|
323
|
-
驱动层每家两轮「只回 OK」加一次触发审批的写文件(临时目录),会使用你的订阅额度;Claude 跑前后比对 `~/.claude` 下 settings 文件的指纹。`task` 层每家一次写文件(首次确认与写文件审批由测试代替人允许)加一轮 `taskId` 续聊;父会话用 fake
|
|
359
|
+
驱动层每家两轮「只回 OK」加一次触发审批的写文件(临时目录),会使用你的订阅额度;Claude 跑前后比对 `~/.claude` 下 settings 文件的指纹。`task` 层每家一次写文件(首次确认与写文件审批由测试代替人允许)加一轮 `taskId` 续聊;父会话用 fake 供应商。
|
|
360
|
+
|
|
361
|
+
逐条驱动路径实测(上面的能力矩阵)用 `AMA_E2E_AUDIT` 指定 `<agent>/<驱动种类>[@模型]`,强制只走这一条路径:
|
|
362
|
+
|
|
363
|
+
```sh
|
|
364
|
+
AMA_E2E_AUDIT="claude/claude-stream@haiku,codex/oneshot@gpt-6-luna,pi/pi-rpc@openai-codex/gpt-6-luna" \
|
|
365
|
+
AMA_E2E_AUDIT_OUT=/tmp/audit.jsonl pnpm vitest run src/drivers/agents-audit.e2e.test.ts
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
驱动的单元测试用 `test/fixtures/drivers/` 下的录制回放(pi 的两段是 2026-10 实录,其余手写),`task` 层的零费用端到端是 ama 驱动 ama(`src/agents/external-task.test.ts`),都不发起计费请求。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# codemode
|
|
2
2
|
|
|
3
|
-
设计依据见 [design.md](design.md) §5.5、§5.6、§9.1。
|
|
3
|
+
设计依据见 [design.md](../design/design.md) §5.5、§5.6、§9.1。
|
|
4
4
|
|
|
5
5
|
`codemode` 工具让模型写一段 JavaScript,在脚本里经 `tools.*` 编排多次工具调用,只有脚本输出回到模型。长流程、工具密集的任务里,它把多次往返合成一次,减少往返次数与缓存读取;短任务里模型照常直接调用工具,codemode 只多占约 400 token 前缀,所以 `default` 预设在网络隔离的运行时上缺省开着它。
|
|
6
6
|
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
|
|
25
25
|
缺省配置里不写 `codemode.mode`(`ama init` 生成的 `config.json` 也不写),所以这张映射以后调整时老用户同样生效。`ama config show` / `ama doctor` 显示生效模式与原因(跟随哪个预设、网络由 Node 还是操作系统沙箱隔离);`ama doctor` 另列操作系统沙箱能力。
|
|
26
26
|
|
|
27
|
-
`minimal` / `coordinator` 预设缺省不带 codemode,也没有 grep / glob:模型找代码只能用 bash(`default` 权限模式下每次审批、`-p` 下被拒)。要检索就 `tools.default: ["+grep","+glob"]` 直接加上,比为了检索打开 codemode 便宜(见 [design.md](design.md) §5.6);`codemode-only` 的脚本里 `tools.grep()` / `tools.glob()` / `tools.ls()` 都可调用。
|
|
27
|
+
`minimal` / `coordinator` 预设缺省不带 codemode,也没有 grep / glob:模型找代码只能用 bash(`default` 权限模式下每次审批、`-p` 下被拒)。要检索就 `tools.default: ["+grep","+glob"]` 直接加上,比为了检索打开 codemode 便宜(见 [design.md](../design/design.md) §5.6);`codemode-only` 的脚本里 `tools.grep()` / `tools.glob()` / `tools.ls()` 都可调用。
|
|
28
28
|
|
|
29
29
|
`coordinator` 预设即使显式 `on`,脚本里能调用的工具也只限它的活动集(read 与宿主工具):`tools.bash`、`tools.write` 在脚本里同样不存在,协调者「不写文件、不跑 bash」的约定不能经 codemode 绕过。
|
|
30
30
|
|
|
@@ -87,7 +87,7 @@
|
|
|
87
87
|
|
|
88
88
|
- `codemode` 本身作为一次工具调用经过 PreToolUse、权限与 PostToolUse。
|
|
89
89
|
- 脚本里的每次 `tools.*` 再各自经过完整流程,Hook 按**真实工具名**匹配(`bash`,不是 `codemode`);Hook 输入多两个字段:`viaCodemode: true` 与 `parentToolCallId`(外层 `codemode` 调用的 id)。
|
|
90
|
-
- 事件:`tool_execution_update` 透传脚本输出(最近 4000 字符);内层调用发 `tool_execution_start / end`,带 `parentToolCallId`,不进转录、不进模型上下文。`ama --mode acp` 把每次内层调用单列为一条 `tool_call`(标题前缀 `codemode › `,`_meta.ama.parentToolCallId` 指向外层),其权限请求关联到这条内层调用(见 [acp.md](acp.md))。
|
|
90
|
+
- 事件:`tool_execution_update` 透传脚本输出(最近 4000 字符);内层调用发 `tool_execution_start / end`,带 `parentToolCallId`,不进转录、不进模型上下文。`ama --mode acp` 把每次内层调用单列为一条 `tool_call`(标题前缀 `codemode › `,`_meta.ama.parentToolCallId` 指向外层),其权限请求关联到这条内层调用(见 [acp.md](../reference/acp.md))。
|
|
91
91
|
|
|
92
92
|
## 沙箱
|
|
93
93
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 命令式 Hook(hooks.json)
|
|
2
2
|
|
|
3
|
-
命令式 Hook 是在固定时机运行的 shell 命令:ama 把事件写成 JSON 交给命令的 stdin,按退出码与 stdout JSON 决定放行、阻止或改写。它是**用户策略**层——可以改工具输入、一票否决工具调用、给提示追加上下文、让运行再跑一轮。类型定义在 `src/hooks/types.ts`(经 `@armadra/agent` 导出 `HookInput`、`HookOutput`、`HookConfig` 等)。设计依据见 [design.md](design.md) §6.1、§6.3、§7.3。
|
|
3
|
+
命令式 Hook 是在固定时机运行的 shell 命令:ama 把事件写成 JSON 交给命令的 stdin,按退出码与 stdout JSON 决定放行、阻止或改写。它是**用户策略**层——可以改工具输入、一票否决工具调用、给提示追加上下文、让运行再跑一轮。类型定义在 `src/hooks/types.ts`(经 `@armadra/agent` 导出 `HookInput`、`HookOutput`、`HookConfig` 等)。设计依据见 [design.md](../design/design.md) §6.1、§6.3、§7.3。
|
|
4
4
|
|
|
5
5
|
## 配置
|
|
6
6
|
|
|
@@ -125,7 +125,7 @@ interface HookOutput {
|
|
|
125
125
|
- `additionalContext` / `customInstructions` 按配置顺序拼接。
|
|
126
126
|
- 任一 Hook 返回 `continue: false` 即请求结束运行。
|
|
127
127
|
|
|
128
|
-
一次工具调用的完整顺序([design.md](design.md) §6.3):
|
|
128
|
+
一次工具调用的完整顺序([design.md](../design/design.md) §6.3):
|
|
129
129
|
|
|
130
130
|
```text
|
|
131
131
|
模型产出工具调用
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# 界面语言(中英双语)
|
|
2
|
+
|
|
3
|
+
> 第六波(docs/history/wave6-plan.md §5、D18–D23)。本文是开发约定:怎么选语言、文案放哪、键怎么起名、怎么测。
|
|
4
|
+
> 调研依据见 [research/wave6/R8-i18n.md](../research/wave6/R8-i18n.md)。
|
|
5
|
+
|
|
6
|
+
## 语言怎么定
|
|
7
|
+
|
|
8
|
+
优先级从高到低,**进程启动时定一次**,不做运行中切换:
|
|
9
|
+
|
|
10
|
+
1. 环境变量 `AMA_LANG`(`zh` / `en`,`zh_CN` 之类也认;写错的值忽略);
|
|
11
|
+
2. 命令行 `--lang zh|en`(也可写在子命令前:`ama --lang en doctor`);SDK `createRuntime({ language })` / `createAgentSession({ language })` 等价;
|
|
12
|
+
3. profile 的 `language`(嵌入宿主跟随画布界面语言);
|
|
13
|
+
4. 配置 `ui.language`(`auto` / `zh` / `en`,缺省 `auto`;用户级 / 项目级都可设);
|
|
14
|
+
5. `LC_ALL` → `LC_MESSAGES` → `LANG` 第一个非空值:`zh*` 为中文,其余(含 `C`、`POSIX`、`en_*`)为英文;
|
|
15
|
+
6. 都没有:英文。
|
|
16
|
+
|
|
17
|
+
`cli/main.ts` 在解析参数后、任何输出前按 1、2、用户级 `ui.language`、5 定语言;bootstrap 合并 profile 与项目级后,若它们给了 `ui.language` / `language`,再补定一次(仍以 1、2 为准)。`ama doctor` 显示「界面语言:zh(来源 LANG=zh_CN.UTF-8)」(`resolveLocaleWithSource`)。
|
|
18
|
+
|
|
19
|
+
**界面语言只影响给人看的文字。** 发给模型的一切(系统提示、工具描述、工具结果里的标记、截断 / 裁剪占位、外部 Agent 报告、Hook 阻止理由、拒绝理由)固定英文,两种语言下请求逐字节相同。想让模型用某种语言回复,用 `ui.replyLanguage`(在 `rules` 节末尾追加一句英文规则,不设时零字节变化)。
|
|
20
|
+
|
|
21
|
+
## 文案放哪
|
|
22
|
+
|
|
23
|
+
```text
|
|
24
|
+
src/i18n/
|
|
25
|
+
index.ts Locale、resolveLocale / resolveLocaleWithSource、setLocale / getLocale、msg()、messagesFor()
|
|
26
|
+
types.ts Messages<T>
|
|
27
|
+
format.ts plural()、formatDuration()
|
|
28
|
+
catalog.ts 汇总全部领域(第六波 C0 一次登记,之后无人再改)
|
|
29
|
+
messages/<领域>.ts
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
| 领域文件 | 归属批次 |
|
|
33
|
+
| --------------------------------------------------------------------------- | ------------------------------------- |
|
|
34
|
+
| `cli`、`subcommands` | W6-I1 |
|
|
35
|
+
| `interactive`、`approval`、`plan`、`rewind`、`panels`、`permissions` | W6-I2 |
|
|
36
|
+
| `report`、`print`、`drivers`、`session`、`errors` | W6-I3 |
|
|
37
|
+
| `config` | W6-I4 |
|
|
38
|
+
| `agents` / `trace` / `memory` / `auth` / `settings` | W6-A / W6-T1、T2 / W6-M / W6-O / W6-S |
|
|
39
|
+
| `acp`(子对象 `core` / `auth` / `session` / `tools` / `config` / `client`) | ACP-C0 建,各子对象归 ACP 补全的批次 |
|
|
40
|
+
|
|
41
|
+
每个领域文件同时导出 `en`(形状源)与 `zh`:
|
|
42
|
+
|
|
43
|
+
```ts
|
|
44
|
+
import { plural } from "../format.js";
|
|
45
|
+
import type { Messages } from "../types.js";
|
|
46
|
+
|
|
47
|
+
export const en = {
|
|
48
|
+
limitTurns: (limit: number) => `ama: reached the turn limit ${limit}; run ended early`,
|
|
49
|
+
dirSummary: (files: number, size: string) => `directory, ${plural(files, "file")}, ${size}`,
|
|
50
|
+
approval: { title: "Approve tool call", keys: { allow: "allow", deny: "deny" } },
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
export const zh = {
|
|
54
|
+
limitTurns: (limit) => `ama: 已达到回合上限 ${limit},运行在完成前结束`,
|
|
55
|
+
dirSummary: (files, size) => `目录,${files} 个文件,${size}`,
|
|
56
|
+
approval: { title: "Approve tool call", keys: { allow: "allow", deny: "deny" } },
|
|
57
|
+
} satisfies Messages<typeof en>;
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
`satisfies Messages<typeof en>` 让缺键、多键、参数个数 / 类型不符都在 `tsc` 期报错——两种语言必须同时给。
|
|
61
|
+
|
|
62
|
+
取用:`const m = msg().print; io.stderr(m.limitTurns(limit))`。用嵌套属性访问,不用字符串键。
|
|
63
|
+
|
|
64
|
+
## 键名规范
|
|
65
|
+
|
|
66
|
+
- 领域文件名即一级命名空间(`msg().approval…`);
|
|
67
|
+
- 叶子 camelCase,按「组件.用途」分组:`approval.title`、`approval.keys.allow`、`rewind.skip.failed`;
|
|
68
|
+
- 不以文案内容命名(`notInstalled` 可以,`weiAnZhuang` 不行);
|
|
69
|
+
- **整句一个键,禁止片段拼接**:英文语序不同,`"追加写入" + 词 + 路径` 这种要写成一个函数,条件分支写进函数体;
|
|
70
|
+
- 插值写成箭头函数,参数类型写在 en 上;复数只英文需要,用 `plural(n, "file")`(不规则词给第三参数);
|
|
71
|
+
- 紧凑时长 `formatDuration(ms)`(`45s` / `2m 10s` / `1h24m`)两种语言共用;`formatTokens` / `formatUsd` / `formatPercent`、日期(ISO)与 compact 状态行记号(`ctx`、`cache`、`$`、`↑ ↓`、`⎇`、`·`)不译;
|
|
72
|
+
- 枚举值、命令名、配置键、动作 id、错误码不译。
|
|
73
|
+
|
|
74
|
+
## 不要这样做
|
|
75
|
+
|
|
76
|
+
- **模块顶层求值**:`const HELP = msg().cli.help` 会按 import 时的语言定死(SDK / 嵌入场景显示错语言)。改成函数或 getter;`scripts/check-i18n.mjs` 会拦。
|
|
77
|
+
- **按文案判断逻辑**:`text === "未安装"`、`reason.startsWith("失败")`。界面文案会随语言变,逻辑用枚举 / 码(第六波 C0 已把三处改掉)。用户**输入**的别名(`批准`、`步骤`、粘贴标记 `[粘贴 #` / `[paste #`)两种语言同时识别,与界面语言无关。
|
|
78
|
+
- **模型侧模块 import `src/i18n`**:系统提示、工具(`src/tools/**`)、Plan 提示、内置子 Agent、Skill、压缩、codemode 声明、Memory 工具不得 import——`src/i18n/guard.test.ts` 守着。这些模块需要给人看的错误时抛 `AmaError(code, englishMessage, { detail })`,由界面层按 `detail` 渲染(例:`tools/image-file.ts` → `modes/image-input.ts` 的 `msg().errors.imageFile(detail)`)。
|
|
79
|
+
- **宿主解析 `message`**:RPC / ACP 的 `error.message`、`-p` 的 stderr 是人读文本,会随语言变;宿主按 `code` 判断。
|
|
80
|
+
|
|
81
|
+
## 测试
|
|
82
|
+
|
|
83
|
+
- 测试缺省钉 zh:`test/helpers/setup.ts` 设 `AMA_LANG=zh` 并 `setLocale("zh")`,子进程也是 zh。迁移批次的验收是现有 zh 帧黄金与断言**字节不变**。
|
|
84
|
+
- en 用例自己 `setLocale("en")`(或传 `AMA_LANG=en`),用完在 `afterEach` 里 `setLocale("zh")`;en 帧黄金放 `test/fixtures/tui/en/`。
|
|
85
|
+
- `src/cli/lang-independence.test.ts`:同一脚本在 zh / en 下各跑一遍,发给供应商的请求逐字节相同。
|
|
86
|
+
- `scripts/check-i18n.mjs`(`pnpm check:i18n`,在 `pnpm ci` 里):
|
|
87
|
+
1. 严格(W6-I5 起,基线已清零删除):`src/**` 源码里含汉字的代码行(注释不算)**出现即失败**。不扫的文件(测试、测试支撑、`src/i18n/`、models.dev 上游快照)在脚本的 `SKIPPED`,允许的行(用户输入别名、粘贴标记识别、价格覆盖数据的 `_reason`)在 `ALLOWED_LINES`,每条都写了理由;新增条目要在 PR 里说明;
|
|
88
|
+
2. `en` 目录里不得有汉字,`zh` 目录里不得留 `TODO`;
|
|
89
|
+
3. 顶层常量不得立即调用 `msg()`。
|
|
90
|
+
|
|
91
|
+
## 体积
|
|
92
|
+
|
|
93
|
+
bundle 用 `charset: "utf8"` 输出(中文按 UTF-8 原样,不转 `\uXXXX`),抵消英文目录带来的增量。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 记忆(Memory)
|
|
2
2
|
|
|
3
|
-
> 第六波 W6-M(设计见 [wave6-plan.md](wave6-plan.md) §3、D8–D12;调研 [research/wave6/R7-memory.md](research/wave6/R7-memory.md))。
|
|
3
|
+
> 第六波 W6-M(设计见 [wave6-plan.md](../history/wave6-plan.md) §3、D8–D12;调研 [research/wave6/R7-memory.md](../research/wave6/R7-memory.md))。
|
|
4
4
|
|
|
5
5
|
跨会话的个人笔记:你说「记住……」,模型把它写成一条 Markdown,下次会话开始时索引进系统提示,正文按需读取。
|
|
6
6
|
**缺省关闭**;关闭时不读盘、不注册工具、不渲染节,发给模型的请求与没有这个功能时逐字节相同。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 权限模式与 auto 判定
|
|
2
2
|
|
|
3
|
-
本文写 ama 的六种权限模式、每次工具调用的判定顺序,以及 `auto` 模式「规则层 → 静态判定 → 模型分类器」三层怎样决定放行还是询问。总体设计见 [design.md](design.md) §6.3、§7;Hook 的输入输出见 [hooks.md](hooks.md)。
|
|
3
|
+
本文写 ama 的六种权限模式、每次工具调用的判定顺序,以及 `auto` 模式「规则层 → 静态判定 → 模型分类器」三层怎样决定放行还是询问。总体设计见 [design.md](../design/design.md) §6.3、§7;Hook 的输入输出见 [hooks.md](hooks.md)。
|
|
4
4
|
|
|
5
5
|
## 模式
|
|
6
6
|
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
| 外部 Agent(claude / codex / ACP)请求权限 | `[claude · 会话 abc12345]` | 外部 Agent 给的标题、种类、涉及路径与输入摘要 | 只交给人:宿主 → 界面 → 无人值守拒绝,auto 分类器与模型不参与 |
|
|
43
43
|
| 外部 Agent 本会话首次运行 | 标题「首次运行外部 Agent」 | 说明(以你在该 CLI 的登录运行)与模式 | allow / deny 规则 `task(<id>)`、`full-auto` 放行,其余交给人(不经分类器) |
|
|
44
44
|
|
|
45
|
-
外部 Agent 的「本会话允许」由它自己记住。Manual 模式下 `task(agent=…)` 的 task 调用审批与首次运行确认合并为一次(见 [agents.md](agents.md)「在 task 里使用」)。RPC 的 `context` 是 `{ depth, taskId, origin }`([rpc.md](rpc.md)「审批」)。
|
|
45
|
+
外部 Agent 的「本会话允许」由它自己记住。Manual 模式下 `task(agent=…)` 的 task 调用审批与首次运行确认合并为一次(见 [agents.md](agents.md)「在 task 里使用」)。RPC 的 `context` 是 `{ depth, taskId, origin }`([rpc.md](../reference/rpc.md)「审批」)。
|
|
46
46
|
|
|
47
47
|
## plan 模式与只读命令
|
|
48
48
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Plan 模式
|
|
2
2
|
|
|
3
|
-
plan 模式让 ama 先只读调研、写出一份结构化的计划,经人批准后再切回执行模式按计划推进。本文写流程、计划格式、审批的几种入口、配置与持久化;权限细节见 [permissions.md](permissions.md)「plan 模式与只读命令」,设计依据见 [wave5-plan.md](wave5-plan.md) §6。
|
|
3
|
+
plan 模式让 ama 先只读调研、写出一份结构化的计划,经人批准后再切回执行模式按计划推进。本文写流程、计划格式、审批的几种入口、配置与持久化;权限细节见 [permissions.md](permissions.md)「plan 模式与只读命令」,设计依据见 [wave5-plan.md](../history/wave5-plan.md) §6。
|
|
4
4
|
|
|
5
5
|
## 流程
|
|
6
6
|
|
|
@@ -54,7 +54,7 @@ plan 模式让 ama 先只读调研、写出一份结构化的计划,经人批
|
|
|
54
54
|
| ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
55
55
|
| 交互(TUI) | 用户在底部审批框里选:批准并执行 / 批准,在新上下文执行(两者接着选执行模式:回到进入前的模式 / Accept edits / Auto)/ 继续修改(框内或外部编辑器写意见)/ 放弃并退出 Plan;`e` 在 `$VISUAL` / `$EDITOR` 里改计划,Esc 放弃但留在 Plan。见 [tui.md](tui.md)「Plan 审批」 |
|
|
56
56
|
| 交互(line,`--no-tui`) | `/plan approve [模式\|fresh]`、`/plan reject`;回复 `1` / `2` / `3` 也能批准(进入前的模式 / Accept edits / Auto),其它内容作为修改意见、留在 plan |
|
|
57
|
-
| RPC,声明了 `plans` 能力 | 客户端:`plan_proposed` → `plan_response`(见 [rpc.md](rpc.md)「计划审批」)
|
|
57
|
+
| RPC,声明了 `plans` 能力 | 客户端:`plan_proposed` → `plan_response`(见 [rpc.md](../reference/rpc.md)「计划审批」) |
|
|
58
58
|
| SDK,给了 `plan.onProposed` | 回调:运行结束后调用,返回 `{ decision, mode?, feedback?, editedMarkdown? }`;返回 undefined 留待 `session.plan.respond()` |
|
|
59
59
|
| `-p`、未声明能力的 RPC、无回调的 SDK | 配置 `plan.unattended`:`stop`(缺省)落盘计划后停下,不切模式、不执行;`approve` 在同一次运行里自动批准并执行 |
|
|
60
60
|
|
|
@@ -65,7 +65,7 @@ plan 模式让 ama 先只读调研、写出一份结构化的计划,经人批
|
|
|
65
65
|
- **revise**:留在 plan;`feedback` 作为普通用户消息开回合,模型整份重写计划,新版本号 +1,旧版标 superseded。
|
|
66
66
|
- **reject**:计划标 rejected,留在 plan。交互界面的「放弃,退出 Plan 模式」在 reject 之后切回进入前的模式;审批框里按 Esc 是 reject 但留在 plan。
|
|
67
67
|
|
|
68
|
-
**进度记法**:活动工具集里有 `todo`(`tools.default: ["+todo"]`、`--tools …,todo`)时,交接消息请模型「按 todo 推进,每完成一步 todo update」;没有时(`default` 预设缺省不含 todo,见 D20 与 [docs/benchmarks/](https://github.com/
|
|
68
|
+
**进度记法**:活动工具集里有 `todo`(`tools.default: ["+todo"]`、`--tools …,todo`)时,交接消息请模型「按 todo 推进,每完成一步 todo update」;没有时(`default` 预设缺省不含 todo,见 D20 与 [docs/benchmarks/](https://github.com/AMA-Link/armadra-agent/tree/main/docs/benchmarks))请模型每完成一步在回复里**单独一行**写 `[DONE:<步骤 id>]`(如 `[DONE:S1]`),ama 在回合结束时读这些标记:对应的计划待办标 done,没有进行中的项时下一个 pending 转 in_progress,照常落 `ama.todo`、发 `todo_updated`,界面与 RPC 的进度显示不受影响。「在新上下文执行」的首条消息用同样的规则。
|
|
69
69
|
|
|
70
70
|
客户端改过的全文(`editedMarkdown`,界面里「在外部编辑器里改」)先落一份新版本,交接消息用改后的全文。
|
|
71
71
|
|
|
@@ -100,7 +100,7 @@ plan 模式让 ama 先只读调研、写出一份结构化的计划,经人批
|
|
|
100
100
|
|
|
101
101
|
## 接口
|
|
102
102
|
|
|
103
|
-
- RPC:命令 `plan_response` / `get_plan` / `get_todos`,能力 `plans`,事件 `plan_proposed` / `plan_resolved` / `todo_updated`,见 [rpc.md](rpc.md)。
|
|
103
|
+
- RPC:命令 `plan_response` / `get_plan` / `get_todos`,能力 `plans`,事件 `plan_proposed` / `plan_resolved` / `todo_updated`,见 [rpc.md](../reference/rpc.md)。
|
|
104
104
|
- SDK:`createAgentSession({ plan: { bash?, directory?, unattended?, model?, thinkingLevel?, onProposed? } })`;返回的会话有 `session.plan.current()`、`session.plan.respond(response)`、`session.plan.todos()`。
|
|
105
105
|
- 进程内:`planController(session)`(`src/agent/session-plan.ts`)给界面用——`pending()`、`respond()`、`proposeFromLastReply()`、`adopt()`、`setAttendance()`。
|
|
106
106
|
- 交互界面:底部审批框(四个选项 + 执行模式、`e` 编辑计划、Esc 留在 Plan)、`/plan` 面板,`/plan <目标>` 进入 Plan 并发出目标,`/plan approve [模式|fresh]` / `/plan reject` 不开对话框直接作答;见 [tui.md](tui.md)「Plan 审批」。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 供应商与模型
|
|
2
2
|
|
|
3
|
-
内置供应商、模型引用、API Key、自定义供应商与中转站、各协议的 compat 开关,以及缓存。设计依据见 [design.md](design.md) §3、§9.1。
|
|
3
|
+
内置供应商、模型引用、API Key、自定义供应商与中转站、各协议的 compat 开关,以及缓存。设计依据见 [design.md](../design/design.md) §3、§9.1。
|
|
4
4
|
|
|
5
5
|
## 配置目录
|
|
6
6
|
|
|
@@ -223,12 +223,13 @@ developer 消息(前缀依然稳定)。compat `toolsInNamespace: true` 时
|
|
|
223
223
|
|
|
224
224
|
**错误码**(错误文案以码开头,宿主按码判断):
|
|
225
225
|
|
|
226
|
-
| 码
|
|
227
|
-
|
|
|
228
|
-
| `quota_exceeded`
|
|
229
|
-
| `auth_expired`
|
|
230
|
-
| `not_eligible`
|
|
231
|
-
|
|
|
226
|
+
| 码 | 来源 | 处理 |
|
|
227
|
+
| ------------------- | ------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------- |
|
|
228
|
+
| `quota_exceeded` | siwc 429 `subscription_sharing_usage_limit_exceeded`;codex 429 `usage_limit_reached` / `usage_not_included` | 不重试;附重置时间并发 `quota_update` |
|
|
229
|
+
| `auth_expired` | 401 刷新一次仍失败、刷新永久失败、条目 `needsLogin` | 不重试;重新 `ama auth login chatgpt` |
|
|
230
|
+
| `not_eligible` | siwc 403 `subscription_sharing_user_not_eligible` | 不重试、不重登;排查见下 |
|
|
231
|
+
| `model_unavailable` | codex 400「model is not supported when using Codex with a ChatGPT account」 | 不重试;后端模型表变了(发现缓存过期),运行 `ama models discover chatgpt` 刷新后换模型 |
|
|
232
|
+
| (原样) | 503 等 | 走会话层现有的退避重试 |
|
|
232
233
|
|
|
233
234
|
**`not_eligible` 排查**:账户不能把套餐额度共享给 ama。可能的原因:账户套餐(额度共享只对 Plus / Pro 开放);工作空间
|
|
234
235
|
账户(Team / Enterprise / Edu 可能未开放);地区受限或预览期尚未开放——**Pro 账户仍报此错时最可能是这一条**。可以改用
|
|
@@ -628,9 +629,9 @@ OpenRouter 的 Messages 接口只在 `message_delta` 里给缓存 usage,解析
|
|
|
628
629
|
|
|
629
630
|
长任务的主要用量是缓存读取:前缀一旦变化,此后每次请求都要按全价重读。ama 分三层处理缓存:**协议层**按各家写法打断点、发缓存键与保留层级,并标记响应里有没有缓存字段;**会话层**记录每次请求的前缀指纹,检测未命中、判定端点报不报缓存、在长工具运行期间保温;**展示层**是状态栏、`/session`、RPC 统计与 `ama models cache-probe`(界面怎么读见 [tui.md](tui.md)「缓存与上下文」)。
|
|
630
631
|
|
|
631
|
-
前缀稳定由组装保证:系统提示节顺序固定、不含时间戳,工具按名排序,会话中途的变化只以 system 补丁追加在末尾([session-format.md](session-format.md)「消息」)。
|
|
632
|
+
前缀稳定由组装保证:系统提示节顺序固定、不含时间戳,工具按名排序,会话中途的变化只以 system 补丁追加在末尾([session-format.md](../reference/session-format.md)「消息」)。
|
|
632
633
|
|
|
633
|
-
**开头的 system 与工具声明在会话内只写一次。** 对话开始之后的节补丁(resume 时 AGENTS.md、Skills 或 SessionStart Hook 输出变了,宿主 instructions 刷新,压缩后记忆节重新渲染)不改写开头:没有打开 `supportsMidConvoSystemMessages` 的协议把它渲染成 `<system-reminder>` 包裹的 user 消息,插在补丁所在的位置,之前的请求仍是逐字节前缀。实测 DeepSeek 接受对话中途的 system 消息、前缀缓存也保持,但模型仍按开头那条回答,所以 DeepSeek 不打开这个开关([cache-midconvo-2026-10-09](benchmarks/cache-midconvo-2026-10-09.md))。
|
|
634
|
+
**开头的 system 与工具声明在会话内只写一次。** 对话开始之后的节补丁(resume 时 AGENTS.md、Skills 或 SessionStart Hook 输出变了,宿主 instructions 刷新,压缩后记忆节重新渲染)不改写开头:没有打开 `supportsMidConvoSystemMessages` 的协议把它渲染成 `<system-reminder>` 包裹的 user 消息,插在补丁所在的位置,之前的请求仍是逐字节前缀。实测 DeepSeek 接受对话中途的 system 消息、前缀缓存也保持,但模型仍按开头那条回答,所以 DeepSeek 不打开这个开关([cache-midconvo-2026-10-09](../benchmarks/cache-midconvo-2026-10-09.md))。
|
|
634
635
|
|
|
635
636
|
工具表同理:对话开始后新加的工具追加在工具表末尾;**移除工具不删声明**,提醒里写一句 `Tool "X" is no longer available in this session; calls to it are rejected.`,模型仍去调用时执行层拒绝(`Tool "X" is not available in this session.`);再加回只提醒 `Tool "X" is available again.`,声明沿用第一次发送的版本。系统提示的 `tools` / `rules` 两节在对话开始后也冻结为已发送的文本。
|
|
636
637
|
|
|
@@ -747,7 +748,7 @@ xAI、Mistral、OpenRouter、Google 没有承诺的 TTL,留空:不保温、
|
|
|
747
748
|
| 取消 | 换模型、换思考级别、压缩、`/tree`、退出时取消,下一次真实请求再开始 |
|
|
748
749
|
| 记账 | 成功的保温追加 `usage{kind:"cache_warm"}` 条目(不进上下文),计入 `/session` 费用与 RPC 统计;事件 `cache_warm{scheduled|sent|stopped}` |
|
|
749
750
|
|
|
750
|
-
宿主可以经 `api.cache.onWarmingDecision` 否决或强制每一次保温([host-api.md](host-api.md)「缓存保温」)。子会话缺省不保温(`cache.warmSubagents: true` 打开)。按目录价格估算,长工具运行期间几乎总是划算;空闲保温只对贵模型、长前缀划算。
|
|
751
|
+
宿主可以经 `api.cache.onWarmingDecision` 否决或强制每一次保温([host-api.md](../reference/host-api.md)「缓存保温」)。子会话缺省不保温(`cache.warmSubagents: true` 打开)。按目录价格估算,长工具运行期间几乎总是划算;空闲保温只对贵模型、长前缀划算。
|
|
751
752
|
|
|
752
753
|
### 压缩摘要续写
|
|
753
754
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 会话统计、检索、复用、导出与检查点
|
|
2
2
|
|
|
3
|
-
这几条命令都只读会话目录(`<数据目录>/sessions`,`--session-dir` 可改;文件格式见 [session-format.md](session-format.md)):不加锁、不修复半行、不改文件,正在运行的会话也能读。会话文件按块逐行读取,不整份读进内存:`ama sessions list` 只解析每个文件的头、首条条目、改名与首条提示,其余行只看类型,几十 MB 的会话也不会让内存随文件大小上涨;`--resume` 打开会话同样逐行解析。范围缺省是**当前目录**的会话,`--all` 看全部。
|
|
3
|
+
这几条命令都只读会话目录(`<数据目录>/sessions`,`--session-dir` 可改;文件格式见 [session-format.md](../reference/session-format.md)):不加锁、不修复半行、不改文件,正在运行的会话也能读。会话文件按块逐行读取,不整份读进内存:`ama sessions list` 只解析每个文件的头、首条条目、改名与首条提示,其余行只看类型,几十 MB 的会话也不会让内存随文件大小上涨;`--resume` 打开会话同样逐行解析。范围缺省是**当前目录**的会话,`--all` 看全部。
|
|
4
4
|
|
|
5
5
|
## 统计:`ama stats`
|
|
6
6
|
|
|
@@ -154,7 +154,7 @@ ama sessions trace <id|文件> [--html [文件]] [--json] [--output <文件>] [-
|
|
|
154
154
|
- `--no-content`:只留结构、时间与数字(没有提示、参数、结果,也没有错误原文),适合只想分享性能问题时。
|
|
155
155
|
- `--children`:内嵌 ama 子 Agent 子会话里节点的预览;缺省只嵌它们的结构与数字。外部 Agent 本来就只有骨架。
|
|
156
156
|
- 预览按条截断(参数 500、其余 2000 字符),整份预览上限 4 MB 字符,超出后更早的预览置空并在详情里注明。
|
|
157
|
-
- `--json`(或 `--format json`):与 RPC `get_trace` 同形的 JSON([rpc.md](rpc.md)「轨迹」),包含全部回合、已加载的子会话轨迹与本会话节点的 `previews`
|
|
157
|
+
- `--json`(或 `--format json`):与 RPC `get_trace` 同形的 JSON([rpc.md](../reference/rpc.md)「轨迹」),包含全部回合、已加载的子会话轨迹与本会话节点的 `previews`
|
|
158
158
|
(`--no-content` 时没有)。
|
|
159
159
|
- 输出:`--html <文件>`(文件名以 `.html` / `.htm` 结尾时才当作值,否则用 `--output`)或 `--output <文件>` 写文件(0600),否则写 stdout。
|
|
160
160
|
`--open` 写好后用系统浏览器打开(没给文件时写到临时目录)。
|
|
@@ -163,7 +163,7 @@ ama sessions trace <id|文件> [--html [文件]] [--json] [--output <文件>] [-
|
|
|
163
163
|
|
|
164
164
|
## 检查点与文件备份
|
|
165
165
|
|
|
166
|
-
回滚代码(`/rewind`,设计见 [rewind-plan.md](rewind-plan.md))依赖检查点:每个新回合开始时,ama 记下 edit / write 改过的文件当时的内容。
|
|
166
|
+
回滚代码(`/rewind`,设计见 [rewind-plan.md](../history/rewind-plan.md))依赖检查点:每个新回合开始时,ama 记下 edit / write 改过的文件当时的内容。
|
|
167
167
|
|
|
168
168
|
- **存储位置**:备份按内容 sha256 存在 `<数据目录>/file-history/blobs/<前 2 位>/<sha256>`,原字节、不压缩;多个会话、多个检查点共用,同内容只存一份。会话文件里只有 `ama.checkpoint` / `ama.checkpoint-track` 两类 `custom` 条目(记哈希,不进上下文)。会话目录不在缺省位置时(`--session-dir`、宿主 profile 的 `sessionDir`),目录登记在 `file-history/roots.json`,清理时一并扫描。
|
|
169
169
|
- **跟踪范围**:edit / write(含 codemode 内层调用与 task 子会话)第一次写某文件之前备份它;之后每个新回合按当前磁盘内容重拍已跟踪的文件,所以 bash 或手动对这些文件的改动也会进下一个检查点。bash 新建或改动的其它文件不跟踪。
|
|
@@ -192,7 +192,7 @@ ama sessions trace <id|文件> [--html [文件]] [--json] [--output <文件>] [-
|
|
|
192
192
|
|
|
193
193
|
## 回滚(会话内)
|
|
194
194
|
|
|
195
|
-
`/rewind`、RPC `rewind`、SDK `session.rewind()` 回到某条用户消息之前(设计见 [rewind-plan.md](rewind-plan.md)):
|
|
195
|
+
`/rewind`、RPC `rewind`、SDK `session.rewind()` 回到某条用户消息之前(设计见 [rewind-plan.md](../history/rewind-plan.md)):
|
|
196
196
|
|
|
197
197
|
- 回滚点是活动路径上开启新回合的用户消息,从旧到新;运行中插话、排队消息与 Stop Hook 续跑的消息并入当前回合,不单列。运行中回滚报 `busy`。
|
|
198
198
|
- 对话回滚复用 `/tree` 换叶子:离开的分支留在文件里,可以再从 `/tree` 回去;模型、思考级别与权限模式保持当前,不随回滚改变。之后第一次请求的 system、工具表与落点之前的消息和回滚前逐字节相同,提示缓存照常命中。
|
|
@@ -200,7 +200,7 @@ ama sessions trace <id|文件> [--html [文件]] [--json] [--output <文件>] [-
|
|
|
200
200
|
- 仅对话或仅代码时,下一次提示前在末尾追加一条 `ama.rewind-note` 告诉模型哪些文件与对话不一致;对话 + 代码不追加。
|
|
201
201
|
- 内存会话与 `checkpoints.mode: "off"` 不建检查点,只能仅对话。
|
|
202
202
|
- 运行中 Esc 中断、本回合还没有任何回复或工具调用时,撤回该回合并回填原消息(`ui.restoreOnCancel`,缺省 true)。
|
|
203
|
-
- 回到图片被降级之前时图片从会话文件回读;文件已被外部改写、读不回时图片保留为空,并告警一次(`AMA_LOG`,TUI 显示在通知区;见 [session-format.md](session-format.md)「内存表示」)。
|
|
203
|
+
- 回到图片被降级之前时图片从会话文件回读;文件已被外部改写、读不回时图片保留为空,并告警一次(`AMA_LOG`,TUI 显示在通知区;见 [session-format.md](../reference/session-format.md)「内存表示」)。
|
|
204
204
|
|
|
205
205
|
## 请求明细(设计,未实现)
|
|
206
206
|
|