@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,12 +1,12 @@
|
|
|
1
1
|
# 终端界面
|
|
2
2
|
|
|
3
|
-
交互模式的使用说明,以及终端组件库 `@armadra/agent/tui` 的 API。设计依据见 [design.md](design.md) §12。
|
|
3
|
+
交互模式的使用说明,以及终端组件库 `@armadra/agent/tui` 的 API。设计依据见 [design.md](../design/design.md) §12。
|
|
4
4
|
|
|
5
5
|
`ama` 在终端里直接运行(stdin / stdout 都是 TTY、`TERM` 不是 `dumb`、没有 `--no-tui`)时进入交互模式。界面只用**主屏**:对话历史滚进终端回滚,不切备用屏,所以在 tmux 里 `capture-pane` 能读到完整对话,退出后对话也留在屏幕上。
|
|
6
6
|
|
|
7
7
|
## 布局
|
|
8
8
|
|
|
9
|
-
视觉规格(配色、字形、逐屏样稿)见 [tui-design.md](tui-design.md)。层级用缩进表达:第 0 列是用户 `›`、工具 `⏺` 与提示符号,第 2 列是结果连接符 `⎿`,第 4 列是工具输出;去掉颜色(`NO_COLOR`、`capture-pane` 不带 `-e`)也读得出结构。
|
|
9
|
+
视觉规格(配色、字形、逐屏样稿)见 [tui-design.md](../design/tui-design.md)。层级用缩进表达:第 0 列是用户 `›`、工具 `⏺` 与提示符号,第 2 列是结果连接符 `⎿`,第 4 列是工具输出;去掉颜色(`NO_COLOR`、`capture-pane` 不带 `-e`)也读得出结构。
|
|
10
10
|
|
|
11
11
|
```
|
|
12
12
|
▄███▄ ██▄ ▄██ ▄███▄ ama 0.6.2 ← 启动头(normal 档)
|
|
@@ -148,11 +148,11 @@ Accept edits | shift+tab 切换 claude-opus-5-5 medium | Ctx 3.0% 8.2k/272k a
|
|
|
148
148
|
|
|
149
149
|
缺省键选 `Ctrl+X` 的原因:macOS Terminal、iTerm2、tmux、Windows Terminal 都原样送达,且没有别的绑定;`Ctrl+Enter` 不开 kitty 键盘协议时与 Enter 无法区分,`Ctrl+S` 可能被 XOFF 流控吃掉,`Alt+Enter` 已是 followUp,`Alt+字母` 在 macOS 缺省不送 Meta,`Ctrl+]` 在非美式键盘上难按。可在 `keybindings.json` 改。
|
|
150
150
|
|
|
151
|
-
line 模式(`--no-tui`)运行中输入 `/interrupt <文本>` 效果相同(空闲时就是普通提示);交互界面里也认这条命令。RPC 是 `prompt` / `steer` 的 `interrupt: true`,见 [rpc.md](rpc.md)。
|
|
151
|
+
line 模式(`--no-tui`)运行中输入 `/interrupt <文本>` 效果相同(空闲时就是普通提示);交互界面里也认这条命令。RPC 是 `prompt` / `steer` 的 `interrupt: true`,见 [rpc.md](../reference/rpc.md)。
|
|
152
152
|
|
|
153
153
|
## 回滚
|
|
154
154
|
|
|
155
|
-
设计见 [rewind-plan.md](rewind-plan.md)。每条开启新回合的用户消息都是一个回滚点;edit / write 改过的文件在消息发出前有检查点(`checkpoints.mode`,bash 改动只在下一回合重拍已跟踪文件时收进来)。
|
|
155
|
+
设计见 [rewind-plan.md](../history/rewind-plan.md)。每条开启新回合的用户消息都是一个回滚点;edit / write 改过的文件在消息发出前有检查点(`checkpoints.mode`,bash 改动只在下一回合重拍已跟踪文件时收进来)。
|
|
156
156
|
|
|
157
157
|
- **入口**:`/rewind`,或空闲且输入框为空时双击 Esc——第一次底部提示「再按 Esc 回滚」(1 秒消失),800 ms 内再按打开列表。输入框有字时双击 Esc 是清空(提示「再按 Esc 清空」),文字存进输入历史,↑ 取回。运行中 Esc 仍是中断;审批对话框、选择器打开时 Esc 归它们。
|
|
158
158
|
- **中断即撤回**:运行中按 Esc 中断,若这一回合还没有任何回复文字或工具调用、输入框为空(`ui.restoreOnCancel`,缺省 true),自动撤回这条消息并把原文放回输入框,消息区一行「已撤回被中断的消息」。
|
|
@@ -319,7 +319,7 @@ CLI 子命令(`ama providers add` / `refresh` 的写入与 `--probe` 计费确
|
|
|
319
319
|
- write:目标是否存在、现有行数与大小 → 新内容;覆盖本会话没读过的文件标黄。
|
|
320
320
|
- edit:对原文干跑一遍,列出每处 −n/+m 行与总变化;匹配不到或不唯一时提前说明。
|
|
321
321
|
|
|
322
|
-
预览按严重度着色(危险红、警告黄、其余暗色),只读、有上限:每个目录最多计 2000 项,整次预览 200 ms 预算,超出只给提示、不降低严重度;超过 2 MiB 的文件只报大小。预览失败不影响审批。line 模式在问句之前逐行打印同样的预览;RPC 客户端从 `permission_request.preview` 拿到它([rpc.md](rpc.md)「审批」)。
|
|
322
|
+
预览按严重度着色(危险红、警告黄、其余暗色),只读、有上限:每个目录最多计 2000 项,整次预览 200 ms 预算,超出只给提示、不降低严重度;超过 2 MiB 的文件只报大小。预览失败不影响审批。line 模式在问句之前逐行打印同样的预览;RPC 客户端从 `permission_request.preview` 拿到它([rpc.md](../reference/rpc.md)「审批」)。
|
|
323
323
|
|
|
324
324
|
## Plan 审批
|
|
325
325
|
|
|
@@ -389,7 +389,7 @@ Plan 模式(Shift+Tab、`/permission plan`、`/plan <目标>`、`--permission-
|
|
|
389
389
|
- 按了没进去时底部提示一行(3 秒):输入框有字——「输入框有字;清空后再按 ↓ 进 Agent 栏」(每段草稿一次,光标在末行时;`↓` 照常下移);栏关闭——「Agent 栏已关闭(ui.agentBar),用 /tasks」;没有任务——「还没有子 Agent 任务」。在用 `↑` `↓` 浏览输入历史时 `↓` 只翻历史。
|
|
390
390
|
- `Ctrl+B` 不进栏,是「前台任务转后台」(见上)。想要原来的「`Ctrl+B` 进栏」可在 `keybindings.json` 写 `"app.agents.focus": ["down", "ctrl+b"]` 并把 `app.tasks.background` 改成别的键。
|
|
391
391
|
- 栏里:`↑` `↓` 选(列出本会话全部任务,窗口跟着滚;在第一项再按 `↑` 回到输入框),Enter 打开子 Agent 视图(选中的任务有停靠的审批时随即弹出),`b` / `Ctrl+B` 把选中的前台任务转后台(不是前台运行中的给一行提示),`x` 停止选中的任务(第一次提示「再按 x 停止 t2」,1.5 秒内再按才停),Esc 回到输入框;其它字母回到输入框并把字填进去。末行是按键提示 `↑↓ 选择 · Enter 打开 · b 转后台 · x 停止 · Esc 返回`,窄屏丢掉 `b` / `x` 两项。
|
|
392
|
-
- 嵌入宿主(有 profile)不再缺省关闭栏;宿主自己展示子任务、不要栏时在 profile 里写 `ui.agentBar: "off"`(见 [host-api.md](host-api.md)「嵌入 Armadra」)。关闭后栏不显示,`↓` 在有任务时提示改用 `/tasks`。
|
|
392
|
+
- 嵌入宿主(有 profile)不再缺省关闭栏;宿主自己展示子任务、不要栏时在 profile 里写 `ui.agentBar: "off"`(见 [host-api.md](../reference/host-api.md)「嵌入 Armadra」)。关闭后栏不显示,`↓` 在有任务时提示改用 `/tasks`。
|
|
393
393
|
|
|
394
394
|
### 子 Agent 视图
|
|
395
395
|
|
|
@@ -409,7 +409,7 @@ t2 explore · 运行中 1m05s · 3 轮 · ↑12k ↓3.4k · Esc 返回 · /tasks
|
|
|
409
409
|
|
|
410
410
|
- 正文实时跟随:ama 子 Agent 显示子会话的全部消息与工具调用(与消息区同样的渲染);子会话句柄已被释放(保留上限 16 个)或会话是 resume 进来的,就只读加载子会话文件,任务再次运行时接上实时事件。外部 Agent(claude / codex / ACP)显示本进程内存里的实时输出(文本、思考、工具起止、回合、提示;最多 2000 条 / 1 MB,不落盘);ama 重启后只剩一行说明「用原 CLI resume <会话 id> 查看全文」。
|
|
411
411
|
- 输入框为空时:`↑` / PgUp 上翻(暂停跟随,底部提示「已暂停跟随 · End 继续」),`↓` / PgDn 下翻,End(暂停时也可按 `f`)回到跟随;`←` `→` 切到上一个 / 下一个任务;Esc 返回主界面。输入框有字时 Esc 先清空。
|
|
412
|
-
- Enter 把输入发给这个子 Agent(会话里记为 `origin: "direct"` 的 user 消息,见 [session-format.md](session-format.md)):ama 子 Agent 运行中 → 排到它本轮结束时送达;外部 Agent 运行中或任务还在排队 → 等本次运行结束后续聊;已结束 → 后台续聊(同 `task_ctl send`,完成后主会话照常收到 `<task-notification>`)。底部一行提示发送结果。父会话的模型不知道你直接和子 Agent 说过话,结果经结束通知自然带回。
|
|
412
|
+
- Enter 把输入发给这个子 Agent(会话里记为 `origin: "direct"` 的 user 消息,见 [session-format.md](../reference/session-format.md)):ama 子 Agent 运行中 → 排到它本轮结束时送达;外部 Agent 运行中或任务还在排队 → 等本次运行结束后续聊;已结束 → 后台续聊(同 `task_ctl send`,完成后主会话照常收到 `<task-notification>`)。底部一行提示发送结果。父会话的模型不知道你直接和子 Agent 说过话,结果经结束通知自然带回。
|
|
413
413
|
- `Ctrl+X` 打断并发送给这个子 Agent:ama 子 Agent 运行中 → 中止它当前这一轮(工具按中断收尾)并立即以这条消息开新一轮,任务照常完成、照常通知主会话;外部 Agent 的驱动能中断单个回合(ACP `session/cancel`、Claude stream-json interrupt、Codex `turn/interrupt`)→ 中断后立即以它(连同之前排着的消息)开下一回合;不能(oneshot、宿主驱动)或任务还在并发池排队 → 退回排队并提示「不支持打断,已排队」;已结束 → 同 Enter 的后台续聊。`ui.enterWhileRunning: "interrupt"` 时与 Enter 互换。主会话不受影响。
|
|
414
414
|
- 视图里 Esc 不中断任何东西:Esc 只是返回。停止子任务用 `/tasks stop <id>`,转后台用 `Ctrl+B` 或 `/tasks bg [id]`——在视图输入框里也能用(视图里只认这两条命令)。
|
|
415
415
|
- 正在看的任务等审批时标题显示「等待审批」,审批框照常弹在视图上面(带 `[task:<类型>]` 来源);它的审批停靠在栏里时,打开视图即弹出。
|
|
@@ -467,7 +467,7 @@ t2 explore · 运行中 1m05s · 3 轮 · ↑12k ↓3.4k · Esc 返回 · /tasks
|
|
|
467
467
|
- 保温与权限分类等辅助请求收在末尾「辅助请求 N 次」一组,缺省折叠。
|
|
468
468
|
- line 模式(`--ui line`、管道)里 `/trace [任务 id]` 打印同一棵树的文本(全部展开、不画条形)。
|
|
469
469
|
|
|
470
|
-
计时来自会话文件里的 `custom{customType:"ama.trace"}` 条目([session-format.md](session-format.md)),只有 id、时间与计数;
|
|
470
|
+
计时来自会话文件里的 `custom{customType:"ama.trace"}` 条目([session-format.md](../reference/session-format.md)),只有 id、时间与计数;
|
|
471
471
|
提示、参数、结果的预览从会话条目按需读取,不进轨迹本身。
|
|
472
472
|
|
|
473
473
|
## Memory
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
# ACP(Agent Client Protocol)
|
|
2
2
|
|
|
3
|
-
[English](en/acp.md) · 简体中文
|
|
3
|
+
[English](../en/reference/acp.md) · 简体中文
|
|
4
4
|
|
|
5
5
|
ama 在 ACP 两侧都能用:
|
|
6
6
|
|
|
7
7
|
- **服务端**:`ama --mode acp` 把 ama 暴露为 ACP Agent,供 Zed、JetBrains、Armadra 的 ACP 节点驱动;
|
|
8
|
-
- **客户端**:ama 经 ACP 驱动外部 Agent(Gemini CLI、OpenCode、Kimi、Copilot 等原生 ACP,或装了适配器的 Claude Code / Codex),见 [agents.md](agents.md)。
|
|
8
|
+
- **客户端**:ama 经 ACP 驱动外部 Agent(Gemini CLI、OpenCode、Kimi、Copilot 等原生 ACP,或装了适配器的 Claude Code / Codex),见 [agents.md](../guides/agents.md)。
|
|
9
9
|
|
|
10
|
-
协议栈零依赖、手写,只维护一份:`@armadra/agent/acp` 导出类型、分帧、客户端与假 Agent,Armadra 直接复用。设计依据见 [wave5-plan.md](wave5-plan.md) §5(D14)。
|
|
10
|
+
协议栈零依赖、手写,只维护一份:`@armadra/agent/acp` 导出类型、分帧、客户端与假 Agent,Armadra 直接复用。设计依据见 [wave5-plan.md](../history/wave5-plan.md) §5(D14)。
|
|
11
11
|
|
|
12
12
|
## 线路
|
|
13
13
|
|
|
@@ -79,7 +79,7 @@ diff 的改前 / 改后全文只随实时事件走,不写进会话文件:任
|
|
|
79
79
|
|
|
80
80
|
### 审批
|
|
81
81
|
|
|
82
|
-
ama 需要询问的调用经 `session/request_permission` 交给客户端,三个选项:`allow_once`(允许)、`allow_always`(本会话允许)、`reject_once`(拒绝)。`toolCall.toolCallId` 关联到先前 `tool_call` 的 id——codemode 内层调用也是,指向那条内层 `tool_call`,不是外层 `codemode`。询问期间该调用的状态回到 `pending`,允许后再 `in_progress`(所以有审批的调用依次是 `pending → in_progress → pending → in_progress → completed`);拒绝时直接 `failed`。客户端回 `cancelled`、连接断开或回合被中断时,按无人作答处理(拒绝)。ama 这边不再需要答复时(回合被 `session/cancel` / `$/cancel_request` 中断、审批 10 分钟超时),以 `$/cancel_request { requestId }` 撤回挂起的 `session/request_permission`,客户端可以关掉对话框。auto 模式下 ama 自己的分类器照常工作——这只影响 ama 自己的工具;ama 驱动的外部 Agent 发来的请求只交给人(见 [agents.md](agents.md))。
|
|
82
|
+
ama 需要询问的调用经 `session/request_permission` 交给客户端,三个选项:`allow_once`(允许)、`allow_always`(本会话允许)、`reject_once`(拒绝)。`toolCall.toolCallId` 关联到先前 `tool_call` 的 id——codemode 内层调用也是,指向那条内层 `tool_call`,不是外层 `codemode`。询问期间该调用的状态回到 `pending`,允许后再 `in_progress`(所以有审批的调用依次是 `pending → in_progress → pending → in_progress → completed`);拒绝时直接 `failed`。客户端回 `cancelled`、连接断开或回合被中断时,按无人作答处理(拒绝)。ama 这边不再需要答复时(回合被 `session/cancel` / `$/cancel_request` 中断、审批 10 分钟超时),以 `$/cancel_request { requestId }` 撤回挂起的 `session/request_permission`,客户端可以关掉对话框。auto 模式下 ama 自己的分类器照常工作——这只影响 ama 自己的工具;ama 驱动的外部 Agent 发来的请求只交给人(见 [agents.md](../guides/agents.md))。
|
|
83
83
|
|
|
84
84
|
### 无模型时
|
|
85
85
|
|
|
@@ -151,7 +151,7 @@ stdin 关闭后等已开始的运行结束再退出(0);`ama` 进程的 std
|
|
|
151
151
|
|
|
152
152
|
## 作为客户端
|
|
153
153
|
|
|
154
|
-
模型经 `task(agent="acp:<程序>")` 使用 ACP Agent(ama 自己是 `task(agent="acp:ama")`,见 [agents.md](agents.md)「在 task 里使用」)。
|
|
154
|
+
模型经 `task(agent="acp:<程序>")` 使用 ACP Agent(ama 自己是 `task(agent="acp:ama")`,见 [agents.md](../guides/agents.md)「在 task 里使用」)。
|
|
155
155
|
|
|
156
156
|
`AcpClient`(`@armadra/agent/acp`):`initialize`、`newSession`、`resumeSession`(优先,不回放)、`loadSession`、`listSessions`、`closeSession`、`prompt`、`setMode`、`cancel`。
|
|
157
157
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 宿主适配器 API(@armadra/agent/host)
|
|
2
2
|
|
|
3
|
-
宿主适配器是一个本地 JS 模块,ama 启动时加载它并交给它一个 `HostApi`:它可以注册工具、追加系统提示、观察事件、回答审批、注入用户消息、在界面上显示通知与状态。Armadra 画布就是以宿主适配器的形式接入的(画布工具 `canvas_*` / `context_*` 都由适配器注册)。类型定义在 `src/host/types.ts`,从 `@armadra/agent/host` 导出,`HOST_API_VERSION = 1`。设计依据见 [design.md](design.md) §6.2、§6.3、§11.1 第 13 步。
|
|
3
|
+
宿主适配器是一个本地 JS 模块,ama 启动时加载它并交给它一个 `HostApi`:它可以注册工具、追加系统提示、观察事件、回答审批、注入用户消息、在界面上显示通知与状态。Armadra 画布就是以宿主适配器的形式接入的(画布工具 `canvas_*` / `context_*` 都由适配器注册)。类型定义在 `src/host/types.ts`,从 `@armadra/agent/host` 导出,`HOST_API_VERSION = 1`。设计依据见 [design.md](../design/design.md) §6.2、§6.3、§11.1 第 13 步。
|
|
4
4
|
|
|
5
5
|
## 模块形状
|
|
6
6
|
|
|
@@ -132,7 +132,7 @@ interface ToolResult {
|
|
|
132
132
|
- `request`:`requestId`、`toolName`、`input`、`reason: "mode" | "dangerous" | "hook"`、`hookReason?`、`preview?`(执行前预览,见 [rpc.md](rpc.md)「审批」)、`context?`(`depth > 0` 表示来自 `task` 子 Agent;codemode 内层调用带 `parentToolCallId`)。
|
|
133
133
|
- 超时(缺省 10 分钟,`AMA_APPROVAL_TIMEOUT_MS`)或运行被中断时 `signal` abort,结论为 deny。审批串行,同一时刻只有一个请求在等。
|
|
134
134
|
- 时机:broker 每次审批时现取,可以在 `create()` 里设,也可以之后任何时候设或替换;最后一次 `setBroker` 生效。
|
|
135
|
-
- 宿主 broker 只决定「谁来回答 ask」,不能放宽 deny 规则、命令式 Hook 的 deny 与危险命令识别([design.md](design.md) §6.3)。
|
|
135
|
+
- 宿主 broker 只决定「谁来回答 ask」,不能放宽 deny 规则、命令式 Hook 的 deny 与危险命令识别([design.md](../design/design.md) §6.3)。
|
|
136
136
|
|
|
137
137
|
## 缓存保温
|
|
138
138
|
|
|
@@ -150,7 +150,7 @@ interface WarmDecision {
|
|
|
150
150
|
}
|
|
151
151
|
```
|
|
152
152
|
|
|
153
|
-
返回 `"warm"` / `"stop"`(可以是 Promise)。返回 `"stop"` 即不发并停止本轮保温(内置决策本是 warm 时,停止原因记为 `declined`);返回 `"warm"` 可以覆盖内置的 stop。处理器出错回落内置决策。注册多个时最后注册且未注销的那个生效;返回值是注销函数。保温机制本身见 [providers.md](providers.md)「缓存」。
|
|
153
|
+
返回 `"warm"` / `"stop"`(可以是 Promise)。返回 `"stop"` 即不发并停止本轮保温(内置决策本是 warm 时,停止原因记为 `declined`);返回 `"warm"` 可以覆盖内置的 stop。处理器出错回落内置决策。注册多个时最后注册且未注销的那个生效;返回值是注销函数。保温机制本身见 [providers.md](../guides/providers.md)「缓存」。
|
|
154
154
|
|
|
155
155
|
## 退出
|
|
156
156
|
|
|
@@ -163,4 +163,4 @@ Armadra 用 profile 启动 ama:`ama --profile <path>`,profile 的 `host` 指
|
|
|
163
163
|
|
|
164
164
|
有 profile 时的界面缺省:`ui.quietStartup: "header"`、`ui.statusLine: "compact"`(最后一行是状态栏,宿主按 `·` 解析)。Agent 栏(`ui.agentBar`)不再缺省关闭,与独立终端一样是 `auto`;宿主自己展示子任务、不要栏时在 profile 的 `config` 指向的配置文件里写 `{ "ui": { "agentBar": "off" } }`。
|
|
165
165
|
|
|
166
|
-
契约细节见 Armadra 仓库 [docs/design/coordinator-agent.md](https://github.com/
|
|
166
|
+
契约细节见 Armadra 仓库 [docs/design/coordinator-agent.md](https://github.com/AMA-Link/Armadra/blob/main/docs/design/coordinator-agent.md)。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# RPC 协议(stdio JSONL)
|
|
2
2
|
|
|
3
|
-
`ama --mode rpc` 从 stdin 读命令、向 stdout 写响应与事件,每行一个 JSON。类型定义在 `@armadra/agent/rpc`(`src/rpc.ts`),实现在 `src/modes/rpc/`。`ama -p --output-format stream-json` 输出的事件与这里同形状。设计依据见 [design.md](design.md) §13.2。
|
|
3
|
+
`ama --mode rpc` 从 stdin 读命令、向 stdout 写响应与事件,每行一个 JSON。类型定义在 `@armadra/agent/rpc`(`src/rpc.ts`),实现在 `src/modes/rpc/`。`ama -p --output-format stream-json` 输出的事件与这里同形状。设计依据见 [design.md](../design/design.md) §13.2。
|
|
4
4
|
|
|
5
5
|
## 线路
|
|
6
6
|
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
|
|
31
31
|
- 响应带回请求的 `id`(字符串才带)。命令并发处理:`prompt` 不阻塞后续命令,所以响应顺序不一定与请求顺序相同,用 `id` 对应。
|
|
32
32
|
- 失败时 `error` 是人读文本,`code` 是 `AmaError.code`(若有)。未知命令 → `code: "invalid_arguments"`。
|
|
33
|
-
**宿主按 `code` 判断,不得解析 `error` / `message`**:人读文本随界面语言(`AMA_LANG`、`--lang`、`ui.language`)变化(第六波起中英双语,见 [i18n.md](i18n.md));`notification` 事件的 `message` 同理。
|
|
33
|
+
**宿主按 `code` 判断,不得解析 `error` / `message`**:人读文本随界面语言(`AMA_LANG`、`--lang`、`ui.language`)变化(第六波起中英双语,见 [i18n.md](../guides/i18n.md));`notification` 事件的 `message` 同理。
|
|
34
34
|
- 一行不是合法 JSON 或缺 `type` → `{ "type": "response", "command": "parse", "success": false, "error": … }`,没有 `id`。
|
|
35
35
|
- 需要会话实现扩展方法的命令(下表标 †)在非 `AgentSessionImpl` 会话上返回 `code: "not_implemented"`;CLI 与 SDK 建出的会话都是 `AgentSessionImpl`。
|
|
36
36
|
|
|
@@ -95,7 +95,7 @@
|
|
|
95
95
|
|
|
96
96
|
### 回滚
|
|
97
97
|
|
|
98
|
-
详见 [rewind-plan.md](rewind-plan.md) §3。回滚点是活动路径上开启新回合的用户消息(运行中插话、排队消息并入当前回合,不单列)。运行中调用回 `busy`。
|
|
98
|
+
详见 [rewind-plan.md](../history/rewind-plan.md) §3。回滚点是活动路径上开启新回合的用户消息(运行中插话、排队消息并入当前回合,不单列)。运行中调用回 `busy`。
|
|
99
99
|
|
|
100
100
|
| 命令 | 参数 | `data` |
|
|
101
101
|
| ------------------- | --------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
@@ -115,7 +115,7 @@
|
|
|
115
115
|
| `set_client_capabilities` | `capabilities: ("approvals" \| "images" \| "hooks" \| "plans" \| "compact_events")[]` | `{ capabilities }` |
|
|
116
116
|
| `permission_response` | `requestId: string`、`decision: "allow" \| "deny" \| "allow_session"` | `{ accepted: boolean }`(false = 当前没在等这个 id,已暂存,稍后被问到时生效) |
|
|
117
117
|
|
|
118
|
-
`compact_events`(docs/memory-plan.md D9):声明后,`turn_end.toolResults`、`message_start` 与 `entry_appended` 不再重复携带工具结果与带图用户消息的正文(以 `contentOmitted: true` 标记),正文只在 `message_end` 与 `tool_execution_end` 里发;不声明时事件形状逐字节不变。形状见「[精简事件](#精简事件compact_events)」。`stream-json` 没有这个开关,输出始终是全量形状。
|
|
118
|
+
`compact_events`(docs/history/memory-plan.md D9):声明后,`turn_end.toolResults`、`message_start` 与 `entry_appended` 不再重复携带工具结果与带图用户消息的正文(以 `contentOmitted: true` 标记),正文只在 `message_end` 与 `tool_execution_end` 里发;不声明时事件形状逐字节不变。形状见「[精简事件](#精简事件compact_events)」。`stream-json` 没有这个开关,输出始终是全量形状。
|
|
119
119
|
|
|
120
120
|
### 工具、权限、发现
|
|
121
121
|
|
|
@@ -139,7 +139,7 @@
|
|
|
139
139
|
|
|
140
140
|
### 轨迹(第六波)
|
|
141
141
|
|
|
142
|
-
`get_trace` 返回会话轨迹(与 TUI `/trace`、`ama sessions trace` 同一棵树,见 [tui.md](tui.md)「轨迹」)。不新增事件:客户端收到
|
|
142
|
+
`get_trace` 返回会话轨迹(与 TUI `/trace`、`ama sessions trace` 同一棵树,见 [tui.md](../guides/tui.md)「轨迹」)。不新增事件:客户端收到
|
|
143
143
|
`entry_appended` 后用上次的 `cursor.since` 再取一次即可增量刷新。
|
|
144
144
|
|
|
145
145
|
| 参数 | 说明 |
|
|
@@ -171,7 +171,7 @@
|
|
|
171
171
|
|
|
172
172
|
被转的前台任务不中断,其 `task` 调用立即以 `tool_execution_end` 返回(结果文本以 `[task tN] Moved to the background` 开头,
|
|
173
173
|
`details.status: "running"`),随后发 `subagent_background`;任务结束时照常 `subagent_end`,父会话空闲后收到 `origin: "task"`
|
|
174
|
-
的通知消息。语义与交互界面的 `Ctrl+B` 相同,见 [agents.md](agents.md)「前台与后台」。
|
|
174
|
+
的通知消息。语义与交互界面的 `Ctrl+B` 相同,见 [agents.md](../guides/agents.md)「前台与后台」。
|
|
175
175
|
|
|
176
176
|
合计 44 条命令,名字即 `RpcCommandMap` 的键。
|
|
177
177
|
|
|
@@ -214,7 +214,7 @@
|
|
|
214
214
|
|
|
215
215
|
`parentToolCallId` 只出现在 codemode 脚本里经 `tools.*` 发起的内层调用上,值是外层 `codemode` 调用的 id;客户端据此折叠显示。内层调用不进转录。
|
|
216
216
|
|
|
217
|
-
`message_end`、`turn_end`、`done` / `error` 与回放(`get_messages`、`get_entries`)里的助手消息可能带两个可选字段(模型调用效率批次,docs/model-efficiency-plan.md §1.10):失败消息的 `retryAfterMs`(`Retry-After`,毫秒),工具调用块的 `rawArguments`(模型输出的原始参数字符串)。`subagent_*` 事件不变;`get_tasks` 的 `TaskInfo` 可带 `context?: "fork" | "fresh"`(子会话的实际上下文模式)。都是新增的可选字段,`RPC_PROTOCOL_VERSION` 不变,客户端忽略不认识的字段即可。
|
|
217
|
+
`message_end`、`turn_end`、`done` / `error` 与回放(`get_messages`、`get_entries`)里的助手消息可能带两个可选字段(模型调用效率批次,docs/history/model-efficiency-plan.md §1.10):失败消息的 `retryAfterMs`(`Retry-After`,毫秒),工具调用块的 `rawArguments`(模型输出的原始参数字符串)。`subagent_*` 事件不变;`get_tasks` 的 `TaskInfo` 可带 `context?: "fork" | "fresh"`(子会话的实际上下文模式)。都是新增的可选字段,`RPC_PROTOCOL_VERSION` 不变,客户端忽略不认识的字段即可。
|
|
218
218
|
|
|
219
219
|
### 精简事件(`compact_events`)
|
|
220
220
|
|
|
@@ -230,7 +230,7 @@
|
|
|
230
230
|
|
|
231
231
|
### 子 Agent 事件(第五波)
|
|
232
232
|
|
|
233
|
-
`task` / `task_ctl` 起的子 Agent(ama 子会话与外部 Agent 同一组事件,见 [agents.md](agents.md)「子 Agent」):
|
|
233
|
+
`task` / `task_ctl` 起的子 Agent(ama 子会话与外部 Agent 同一组事件,见 [agents.md](../guides/agents.md)「子 Agent」):
|
|
234
234
|
|
|
235
235
|
| 事件 | 字段 |
|
|
236
236
|
| --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
@@ -356,7 +356,7 @@
|
|
|
356
356
|
{"type":"context_pressure","percent":71,"threshold":70,"remainingTokens":57990,"estimatedTurnsLeft":6}
|
|
357
357
|
```
|
|
358
358
|
|
|
359
|
-
`cache_miss` 的 `detail` 只在 `prefix_changed` 时给出(`tools`、`system`,或带变化节名的 `system:<节名,…>`,如 `system:hooks,memory`)。`cache_warm{stopped}` 的 `reason` 取值与含义见 [tui.md](tui.md)「缓存与上下文」。`ama -p --output-format json` 的结果对象另有 `cache` 字段,形状同上。
|
|
359
|
+
`cache_miss` 的 `detail` 只在 `prefix_changed` 时给出(`tools`、`system`,或带变化节名的 `system:<节名,…>`,如 `system:hooks,memory`)。`cache_warm{stopped}` 的 `reason` 取值与含义见 [tui.md](../guides/tui.md)「缓存与上下文」。`ama -p --output-format json` 的结果对象另有 `cache` 字段,形状同上。
|
|
360
360
|
|
|
361
361
|
## 审批
|
|
362
362
|
|
|
@@ -368,7 +368,7 @@
|
|
|
368
368
|
|
|
369
369
|
## 计划审批
|
|
370
370
|
|
|
371
|
-
plan 模式与计划的格式见 [plan.md](plan.md)。
|
|
371
|
+
plan 模式与计划的格式见 [plan.md](../guides/plan.md)。
|
|
372
372
|
|
|
373
373
|
1. 回合在 plan 模式下以纯文本结束、回复里有 `<proposed_plan>` 块时,服务端落盘计划并发 `plan_proposed{ planId, version, markdown, steps, filePath? }`(`steps[]`:`{ id, text, dependsOn?, agent? }`),随后照常 `agent_settled`。
|
|
374
374
|
2. 客户端声明过 `set_client_capabilities{capabilities:["plans"]}` 才由它回答;没声明时按配置 `plan.unattended`:缺省 `stop`(计划留在 proposed,不切模式、不执行,客户端之后仍可用 `plan_response` 作答),`approve` 时同一次运行里自动批准并执行。
|
|
@@ -386,7 +386,7 @@ plan 模式与计划的格式见 [plan.md](plan.md)。
|
|
|
386
386
|
|
|
387
387
|
- stdin 关闭:不再接收命令,撤下审批(之后的 ask 按无人作答 deny),等在途命令与已开始的运行结束、响应写完,退出码 0。所以 `printf '{"type":"prompt","message":"hi"}\n' | ama --mode rpc` 能拿到完整回复;要提前停止,先发 `abort`。
|
|
388
388
|
- SIGINT / SIGTERM:中断当前运行后有序退出,退出码 130 / 143。
|
|
389
|
-
- 启动阶段的失败按 CLI 退出码([design.md](design.md) §11.3):配置错误 3、无模型或 key 4、会话错误 5、宿主 / Hook 启动失败 6、宿主 API 版本不匹配 78。
|
|
389
|
+
- 启动阶段的失败按 CLI 退出码([design.md](../design/design.md) §11.3):配置错误 3、无模型或 key 4、会话错误 5、宿主 / Hook 启动失败 6、宿主 API 版本不匹配 78。
|
|
390
390
|
|
|
391
391
|
## 示例
|
|
392
392
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 会话文件格式(JSONL 条目树)
|
|
2
2
|
|
|
3
|
-
会话是一个只追加的 JSONL 文件:首行是头,其后每行一个条目(以及可选的 `leaf` 行)。条目经 `parentId` 连成树,「当前分支」是从根到叶子的一条路径;发给模型的上下文由当前分支**投影**得到。类型定义在 `src/session/types.ts`(经 `@armadra/agent` 导出),格式版本 `SESSION_FORMAT_VERSION = 1`。设计依据见 [design.md](design.md) §8、§9。
|
|
3
|
+
会话是一个只追加的 JSONL 文件:首行是头,其后每行一个条目(以及可选的 `leaf` 行)。条目经 `parentId` 连成树,「当前分支」是从根到叶子的一条路径;发给模型的上下文由当前分支**投影**得到。类型定义在 `src/session/types.ts`(经 `@armadra/agent` 导出),格式版本 `SESSION_FORMAT_VERSION = 1`。设计依据见 [design.md](../design/design.md) §8、§9。
|
|
4
4
|
|
|
5
5
|
## 位置与文件
|
|
6
6
|
|
|
@@ -47,14 +47,14 @@
|
|
|
47
47
|
|
|
48
48
|
### 消息
|
|
49
49
|
|
|
50
|
-
- `system`:`{ role: "system", sections, toolsAdded?, toolsRemoved?, timestamp }`。首条是全量:系统提示的命名节(固定顺序 `preamble → tools → rules → project_context → skills → memory → hooks → cwd → host → role`;`memory` 是第六波的记忆索引节,未开启记忆时不出现)与工具声明表;之后只落**补丁**——节名级替换、值为 `null` 表示删除该节,`toolsAdded` / `toolsRemoved` 增删工具。依次重放得到当前系统提示;请求时由协议层重装:首条非 system 消息之前的部分折进开头,之后的节补丁作为尾部上下文送达、不改写开头(移除工具的补丁除外,见 [providers.md](providers.md)「缓存」)。首条 system 消息在首次请求前落盘,也就是建文件的时刻。
|
|
50
|
+
- `system`:`{ role: "system", sections, toolsAdded?, toolsRemoved?, timestamp }`。首条是全量:系统提示的命名节(固定顺序 `preamble → tools → rules → project_context → skills → memory → hooks → cwd → host → role`;`memory` 是第六波的记忆索引节,未开启记忆时不出现)与工具声明表;之后只落**补丁**——节名级替换、值为 `null` 表示删除该节,`toolsAdded` / `toolsRemoved` 增删工具。依次重放得到当前系统提示;请求时由协议层重装:首条非 system 消息之前的部分折进开头,之后的节补丁作为尾部上下文送达、不改写开头(移除工具的补丁除外,见 [providers.md](../guides/providers.md)「缓存」)。首条 system 消息在首次请求前落盘,也就是建文件的时刻。
|
|
51
51
|
- `user`:`content`、`origin?`(缺省 = 普通用户输入;`steer` / `followUp` 是运行中插话与排队,`host` 是宿主 `sendUser` 注入,`interrupt` 是打断并立即发送开的新回合(TUI `Ctrl+X`、line 模式 `/interrupt`、RPC / SDK 的 `interrupt: true`;投影与普通 user 消息相同),`direct` 是用户在子 Agent 视图里直接发给该子 Agent 的消息(第六波 W6-A,写在子会话里;投影与普通 user 消息相同),其它字符串原样记录)。
|
|
52
52
|
- `assistant`:`content`(文本 / 思考 / 工具调用块)、`api`、`provider`、`model`、`usage`、`stopReason`,以及可选的 `responseId`、`thinkingLevel`、`providerThinkingLevel`、`rawStopReason`、`errorMessage`、`retryAfterMs`(失败响应的 `Retry-After`,毫秒;会话层退避取它与指数退避中的较大值)。工具调用块是 `{ type: "toolCall", id, name, arguments, thoughtSignature?, rawArguments? }`:`rawArguments` 是模型输出的原始参数字符串(能严格解析为 JSON 时才记),同协议回放时原样发回,没有时回落 `JSON.stringify(arguments)`。两者都是可选字段,格式版本不变,旧文件照常读取。`usage` 是 `{ input, output, cacheRead, cacheWrite, cacheWrite1h?, reasoning?, totalTokens, cost?, cacheReported? }`:`input` 不含缓存部分,`cost` 是 `{ input, output, cacheRead, cacheWrite, total }`(美元,模型无价格时缺省),`cacheReported` 表示原始响应里出现过缓存字段。
|
|
53
53
|
- `toolResult`:对应工具调用的结果(`toolCallId`、`toolName`、`content`、`isError`、`details?`)。
|
|
54
54
|
|
|
55
55
|
### `usage` 条目
|
|
56
56
|
|
|
57
|
-
不进上下文的请求用量,计入 `/session` 费用与 RPC 统计,投影时跳过。`kind` 目前有 `"cache_warm"`(缓存保温请求,见 [providers.md](providers.md)「缓存」)与 `"permission_classify"`(auto 权限模式的分类请求,见 [permissions.md](permissions.md)):
|
|
57
|
+
不进上下文的请求用量,计入 `/session` 费用与 RPC 统计,投影时跳过。`kind` 目前有 `"cache_warm"`(缓存保温请求,见 [providers.md](../guides/providers.md)「缓存」)与 `"permission_classify"`(auto 权限模式的分类请求,见 [permissions.md](../guides/permissions.md)):
|
|
58
58
|
|
|
59
59
|
```json
|
|
60
60
|
{
|
|
@@ -127,9 +127,9 @@
|
|
|
127
127
|
`data` = `TaskInfo`(`taskId, agent, runner, description, background, status, startedAt, endedAt?, turns?, usage?, costUsd?,
|
|
128
128
|
contextTokens?, contextWindow?, outputFile?, sessionRef?`;`contextTokens / contextWindow` 只有外部 Agent 报告时才有)+ `parentToolCallId`、`cwd`。同一 `taskId` 取分支上最后一条;resume 时据此重建任务注册表,
|
|
129
129
|
`status: "running"` 视为 `interrupted`(`taskId` 续聊重开 `sessionRef.sessionFile`)。没有 `status` 的是子会话自己的首条。
|
|
130
|
-
模型调用效率批次(docs/model-efficiency-plan.md)起,两处的 `data` 可带 `context?: "fork" | "fresh"`(子会话的实际上下文模式,fork 回落为 fresh 时记 `fresh`;缺省即 `fresh`),子会话首条另可带 `forkedFrom?`(fork 点的父条目 id)。都是可选字段,格式版本不变。
|
|
130
|
+
模型调用效率批次(docs/history/model-efficiency-plan.md)起,两处的 `data` 可带 `context?: "fork" | "fresh"`(子会话的实际上下文模式,fork 回落为 fresh 时记 `fresh`;缺省即 `fresh`),子会话首条另可带 `forkedFrom?`(fork 点的父条目 id)。都是可选字段,格式版本不变。
|
|
131
131
|
|
|
132
|
-
第五波登记的类型(docs/wave5-plan.md;括号里是开始写入的批次,之前的版本不会产生,读到未知 `customType` 一律忽略)。`custom_message` 类都是 `display: false`,经扩展点 `beforePrompts` 追加在末尾,不改缓存前缀:
|
|
132
|
+
第五波登记的类型(docs/history/wave5-plan.md;括号里是开始写入的批次,之前的版本不会产生,读到未知 `customType` 一律忽略)。`custom_message` 类都是 `display: false`,经扩展点 `beforePrompts` 追加在末尾,不改缓存前缀:
|
|
133
133
|
|
|
134
134
|
| `customType` | 条目类型 | 内容 | 写入时机 |
|
|
135
135
|
| -------------------- | ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
|
|
@@ -143,7 +143,7 @@ contextTokens?, contextWindow?, outputFile?, sessionRef?`;`contextTokens / con
|
|
|
143
143
|
| `ama.agent-session` | `custom` | `data: { agent, runner, sessionId, cwd?, taskId? }`:外部 Agent 自己的会话引用(不含原始事件与转录) | 外部 Agent 会话建立 / 续聊时(W5-E) |
|
|
144
144
|
| `ama.agent-usage` | `custom` | `data: { agent, sessionId, unit: usd \| tokens \| requests, amount, tokens?, contextTokens?, contextWindow? }`(上下文只记数字) | 外部 Agent 每个回合结束(W5-E);`SessionStats.external` 据此汇总 |
|
|
145
145
|
|
|
146
|
-
第六波登记的类型(docs/wave6-plan.md §2.2;之前的版本不会产生):
|
|
146
|
+
第六波登记的类型(docs/history/wave6-plan.md §2.2;之前的版本不会产生):
|
|
147
147
|
|
|
148
148
|
| `customType` | 条目类型 | 内容 | 写入时机 |
|
|
149
149
|
| ------------ | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
@@ -154,5 +154,5 @@ contextTokens?, contextWindow?, outputFile?, sessionRef?`;`contextTokens / con
|
|
|
154
154
|
## 读取方
|
|
155
155
|
|
|
156
156
|
- `ama sessions list|show`、交互模式 `/resume`、RPC `get_entries{since}`(以 entry id 为游标返回 `{ entries, leafId }`)、`get_tree`。
|
|
157
|
-
- 只读扫描(不加锁、不修复):`ama stats`、`ama sessions search|export`、`--from`,见 [sessions.md](sessions.md)。
|
|
157
|
+
- 只读扫描(不加锁、不修复):`ama stats`、`ama sessions search|export`、`--from`,见 [sessions.md](../guides/sessions.md)。
|
|
158
158
|
- 嵌入方可以直接读文件:按行解析,首行为头,跳过 `type: "leaf"` 的行后按 `parentId` 建树;遇到不认识的条目类型保留但不进上下文。
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@armadra/agent",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.1",
|
|
4
4
|
"description": "A coding and coordination agent that runs standalone or embedded in Armadra",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"keywords": [
|
|
@@ -19,15 +19,15 @@
|
|
|
19
19
|
"sdk",
|
|
20
20
|
"armadra"
|
|
21
21
|
],
|
|
22
|
-
"homepage": "https://github.com/
|
|
22
|
+
"homepage": "https://github.com/AMA-Link/armadra-agent#readme",
|
|
23
23
|
"bugs": {
|
|
24
|
-
"url": "https://github.com/
|
|
24
|
+
"url": "https://github.com/AMA-Link/armadra-agent/issues"
|
|
25
25
|
},
|
|
26
26
|
"author": "YoVinchen",
|
|
27
27
|
"license": "MIT",
|
|
28
28
|
"repository": {
|
|
29
29
|
"type": "git",
|
|
30
|
-
"url": "git+https://github.com/
|
|
30
|
+
"url": "git+https://github.com/AMA-Link/armadra-agent.git"
|
|
31
31
|
},
|
|
32
32
|
"bin": {
|
|
33
33
|
"ama": "dist/bundle/ama.cjs"
|
|
@@ -58,23 +58,11 @@
|
|
|
58
58
|
},
|
|
59
59
|
"files": [
|
|
60
60
|
"dist",
|
|
61
|
-
"docs/
|
|
62
|
-
"docs/
|
|
63
|
-
"docs/
|
|
64
|
-
"docs/
|
|
65
|
-
"docs/
|
|
66
|
-
"docs/codemode.md",
|
|
67
|
-
"docs/sandbox.md",
|
|
68
|
-
"docs/plan.md",
|
|
69
|
-
"docs/agents.md",
|
|
70
|
-
"docs/acp.md",
|
|
71
|
-
"docs/rewind-plan.md",
|
|
72
|
-
"docs/tui.md",
|
|
73
|
-
"docs/tui-design.md",
|
|
74
|
-
"docs/session-format.md",
|
|
75
|
-
"docs/sessions.md",
|
|
76
|
-
"docs/memory.md",
|
|
77
|
-
"docs/en/*.md",
|
|
61
|
+
"docs/README.md",
|
|
62
|
+
"docs/guides/*.md",
|
|
63
|
+
"docs/reference/*.md",
|
|
64
|
+
"docs/en/**/*.md",
|
|
65
|
+
"docs/assets/*.svg",
|
|
78
66
|
"README.zh-CN.md",
|
|
79
67
|
"CHANGELOG.md",
|
|
80
68
|
"CHANGELOG.zh-CN.md",
|
|
@@ -104,10 +92,11 @@
|
|
|
104
92
|
"fmt:check": "prettier --check .",
|
|
105
93
|
"check:deps": "node scripts/check-no-deps.mjs",
|
|
106
94
|
"check:i18n": "node scripts/check-i18n.mjs",
|
|
95
|
+
"check:docs": "node scripts/check-doc-links.mjs",
|
|
107
96
|
"release:check": "node scripts/release-check.mjs",
|
|
108
97
|
"bench:presets": "node scripts/bench-presets.mjs",
|
|
109
98
|
"bench:cache": "node scripts/cache-experiment.mjs",
|
|
110
|
-
"ci": "pnpm typecheck && pnpm fmt:check && pnpm check:deps && pnpm check:i18n && pnpm release:check && pnpm test && pnpm build && node dist/bundle/ama.cjs --version"
|
|
99
|
+
"ci": "pnpm typecheck && pnpm fmt:check && pnpm check:deps && pnpm check:i18n && pnpm check:docs && pnpm release:check && pnpm test && pnpm build && node dist/bundle/ama.cjs --version"
|
|
111
100
|
},
|
|
112
101
|
"dependencies": {},
|
|
113
102
|
"devDependencies": {
|
|
@@ -117,5 +106,5 @@
|
|
|
117
106
|
"typescript": "~5.9.3",
|
|
118
107
|
"vitest": "^4.1.11"
|
|
119
108
|
},
|
|
120
|
-
"packageManager": "pnpm@
|
|
109
|
+
"packageManager": "pnpm@12.8.1"
|
|
121
110
|
}
|
package/docs/rewind-plan.md
DELETED
|
@@ -1,181 +0,0 @@
|
|
|
1
|
-
# 检查点与回滚:设计与实施计划
|
|
2
|
-
|
|
3
|
-
> 状态:实施设计(2026-10-02)。基线:`main` = `95c0435`(0.4.0)。
|
|
4
|
-
> 设计依据:`docs/design.md` §8 会话树、§9 压缩、§9.1 缓存保证、§13 SDK / RPC;对照同类终端 Agent 的检查点实现(只借鉴行为与边界,不复制代码)。
|
|
5
|
-
> 路径相对仓库根;`[RW-x]` 为本计划的批次编号(§6)。
|
|
6
|
-
|
|
7
|
-
## §0 结论
|
|
8
|
-
|
|
9
|
-
| # | 决定 | 理由 |
|
|
10
|
-
| --- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------- |
|
|
11
|
-
| D1 | 回滚 = 「对话」与「代码」两件事,入口 `/rewind` 与空闲时双击 Esc;选项:对话 + 代码 / 仅对话 / 仅代码 / 从这里摘要 / 摘要到这里 / 取消 | 两者独立才能覆盖「代码写坏了但对话想留」「对话跑偏了但代码要留」 |
|
|
12
|
-
| D2 | 检查点粒度 = 开启新回合的用户消息;运行中插话(steer)与排队消息并入当前回合,不单独建 | 回合是用户能理解的最小单位 |
|
|
13
|
-
| D3 | 代码跟踪 edit / write(含 codemode 内层调用、task 子会话)改过的文件;每次发新回合按**当前磁盘状态**重拍已跟踪文件,所以 bash 或手动对已跟踪文件的改动也会被收进下一个检查点 | bash 任意改动不可完整追踪;已跟踪文件这样处理就不会漏 |
|
|
14
|
-
| D4 | 备份按内容 sha256 存全局目录,多会话、多检查点共用;会话文件只记哈希 | 同内容只存一份;fork 不用迁移备份 |
|
|
15
|
-
| D5 | 恢复前做冲突检测:磁盘内容既不等于 ama 最后写入的、也不等于最近检查点的 → 冲突,缺省跳过并列出,`onConflict: "overwrite"` 才覆盖 | 不冲掉用户在回合外的手动修改 |
|
|
16
|
-
| D6 | git 状态不动;检查点记 HEAD,回滚时 HEAD 变了只提示并给命令 | `reset` 类操作风险高,交给用户 |
|
|
17
|
-
| D7 | 对话回滚复用会话树(`navigate` 换叶子),被离开的分支留在文件里 | 现有能力,零迁移 |
|
|
18
|
-
| D8 | 回滚后上下文只发新路径,前缀逐字节不变,缓存照常命中;需要告诉模型的事(文件与对话不一致)以 `custom_message` 追加在末尾 | §9.1 前缀稳定 |
|
|
19
|
-
| D9 | `影子 git` 模式(能覆盖 bash 改动)作为可选 `checkpoints.mode: "shadow-git"`,缺省关,最后一批做 | 大仓库慢、依赖 git,不适合作缺省 |
|
|
20
|
-
|
|
21
|
-
## §1 数据模型
|
|
22
|
-
|
|
23
|
-
### §1.1 备份存储
|
|
24
|
-
|
|
25
|
-
- 目录:`<dataDir>/file-history/blobs/<sha256 前 2 位>/<sha256 全长>`,内容为文件原字节(不压缩、不改换行与 BOM);先写 `<name>.tmp-<pid>` 再 rename,已存在即跳过。
|
|
26
|
-
- 不备份:超过 `checkpoints.maxFileBytes`(缺省 5 MiB)的文件、非普通文件。记录里标 `skipped: "too_large" | "not_regular"`,回滚时报告「无法恢复」。
|
|
27
|
-
- 内存会话(无会话文件)不建检查点,`/rewind` 只提供「仅对话」。
|
|
28
|
-
|
|
29
|
-
### §1.2 会话条目(均为 `custom`,不进上下文,不影响前缀)
|
|
30
|
-
|
|
31
|
-
```ts
|
|
32
|
-
// customType "ama.checkpoint":新回合的用户消息条目追加之后立即追加
|
|
33
|
-
interface CheckpointData {
|
|
34
|
-
v: 1;
|
|
35
|
-
userEntryId: string; // 这个检查点属于哪条用户消息(「这条消息发出前」的状态)
|
|
36
|
-
files: Record<string, FileRecord>; // 全部已跟踪文件;键 = cwd 内相对路径(/ 分隔),cwd 外为绝对路径
|
|
37
|
-
git?: { head: string; branch?: string }; // 直接读 .git/HEAD(含 worktree 的 gitdir 文件),不起 git 进程
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
// customType "ama.checkpoint-track":回合中途第一次碰某文件时追加,补进本回合的检查点
|
|
41
|
-
interface CheckpointTrackData {
|
|
42
|
-
v: 1;
|
|
43
|
-
userEntryId: string;
|
|
44
|
-
path: string;
|
|
45
|
-
record: FileRecord;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
interface FileRecord {
|
|
49
|
-
blob: string | null; // sha256;null = 当时文件不存在(回滚时删除)
|
|
50
|
-
mode?: number; // 普通文件的权限位
|
|
51
|
-
size?: number;
|
|
52
|
-
realParentDir?: string; // 记录时父目录的 realpath(恢复时校验没被移动)
|
|
53
|
-
skipped?: "too_large" | "not_regular";
|
|
54
|
-
}
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
- 读取:按文件顺序重放全会话(不限活动分支)的两类条目,得到 `Map<userEntryId, CheckpointData>`;`checkpoint-track` 并入对应检查点。
|
|
58
|
-
- 每个文件的第一条记录(最早的 `blob`)永久保留,作为「找不到更近记录时」的回退。
|
|
59
|
-
|
|
60
|
-
### §1.3 运行时状态(`src/checkpoints/tracker.ts`)
|
|
61
|
-
|
|
62
|
-
- `trackedFiles: Set<string>`、最近检查点、`lastWritten: Map<路径, sha256>`(ama 最后一次写入后的内容哈希,用于冲突检测;只在内存,恢复会话后以最近检查点为准)。
|
|
63
|
-
- 检查点上限 `checkpoints.keep`(缺省 100):超出时较早检查点不再列为回滚点;备份由 GC 清理(§1.4)。
|
|
64
|
-
|
|
65
|
-
### §1.4 清理
|
|
66
|
-
|
|
67
|
-
- `ama sessions prune` 与删除会话时:标记 —— 扫描所有会话文件里的 `ama.checkpoint*` 引用;清除 —— 删除未被引用且 mtime 超过 1 天的 blob。
|
|
68
|
-
- `ama doctor` 显示 file-history 占用。
|
|
69
|
-
|
|
70
|
-
## §2 时机
|
|
71
|
-
|
|
72
|
-
| 时机 | 动作 |
|
|
73
|
-
| ----------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
74
|
-
| 新回合用户消息落盘后(`runPrompt`,steer / 排队并入的不算) | 对每个已跟踪文件:lstat → 不存在记 `null`;size / mode 与上一条记录一致且 mtime 不晚于记录时间 → 沿用;否则读内容算 sha256,等于上一条则沿用,不等则写 blob。追加 `ama.checkpoint` |
|
|
75
|
-
| edit / write 写文件**之前**(`ctx.checkpoint?.beforeWrite(abs)`) | 文件在任何检查点里都没出现过 → 备份当前内容(不存在记 `null`),追加 `ama.checkpoint-track`,加入 `trackedFiles`;出现过则什么都不做 |
|
|
76
|
-
| edit / write 写文件**之后**(`ctx.checkpoint?.afterWrite(abs, bytes)`) | 记 `lastWritten` |
|
|
77
|
-
| task 子会话 | 子会话的 `ctx.checkpoint` 指向父会话的 tracker,记到父会话当前回合 |
|
|
78
|
-
| codemode 内层调用 | 走同一工具上下文,天然覆盖 |
|
|
79
|
-
|
|
80
|
-
`beforeWrite` 失败(磁盘满、权限)只记 warn,不阻止写入(与对照实现一致:检查点是辅助,不能让编辑失败)。
|
|
81
|
-
|
|
82
|
-
## §3 回滚
|
|
83
|
-
|
|
84
|
-
### §3.1 API(`AgentSession`,SDK 同名,RPC 见 §5)
|
|
85
|
-
|
|
86
|
-
类型见 `src/checkpoints/types.ts`(`RewindPoint`、`RewindRequest`、`RewindResult`、`CodeRestoreResult`):
|
|
87
|
-
|
|
88
|
-
```ts
|
|
89
|
-
rewindPoints(): RewindPoint[]; // 活动路径上的新回合用户消息,从旧到新
|
|
90
|
-
rewind(request: RewindRequest): Promise<RewindResult>;
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
`dryRun` 的 `code` 字段给出将恢复的文件与 `insertions / deletions`,界面的每行统计与确认预览都用它(懒计算,只对选中项)。
|
|
94
|
-
|
|
95
|
-
- 运行中调用抛 `AmaError("busy")`。全部失败且无一恢复 → `AmaError("rewind_failed", "没有文件被恢复…")`。
|
|
96
|
-
|
|
97
|
-
### §3.2 恢复代码(`src/checkpoints/restore.ts`)
|
|
98
|
-
|
|
99
|
-
对每个已跟踪文件,取目标检查点里的记录,没有则取该文件最早的记录:
|
|
100
|
-
|
|
101
|
-
1. 记录 `skipped` → 报告 `too_large` / `not_regular`。
|
|
102
|
-
2. 当前内容与记录相同 → 跳过(不计入)。
|
|
103
|
-
3. 冲突检测:当前 sha256 ∉ {`lastWritten`,最近检查点的记录} → 冲突;`skip` 时列入 `conflicts` 不动。
|
|
104
|
-
4. 安全检查(不通过 → `skipped`):目标是符号链接 / 非普通文件 / `nlink > 1`;父目录 realpath ≠ `realParentDir`。
|
|
105
|
-
5. `blob: null` → 删除文件(只删普通文件)。
|
|
106
|
-
6. 否则写回:Windows 以外用 `O_NOFOLLOW` 打开目标,`fstat` 与路径 `lstat` 的 dev / ino 一致才写;清空后写入 blob 内容,恢复 `mode`;目标不存在时按需创建父目录(再次校验父目录)。
|
|
107
|
-
7. 被恢复 / 删除的文件从 `readFiles` 移除(模型再改前必须重新 read)。
|
|
108
|
-
|
|
109
|
-
`dryRun` 只做 1–4 并用行级 diff 计 `insertions / deletions`(复用 `tools/edit` 的 diff 实现)。
|
|
110
|
-
|
|
111
|
-
### §3.3 回滚对话(`src/agent/session-rewind.ts`)
|
|
112
|
-
|
|
113
|
-
1. `navigate(userEntry.parentId)`(已有:换叶子、重载消息、`cache.onContextChanged()`)。
|
|
114
|
-
2. `readFiles` 按新路径重算:路径上成功的 read 工具调用的绝对路径(不跨分支保留)。
|
|
115
|
-
3. 返回 `draft`:原消息文本与图片,交互界面回填输入框。
|
|
116
|
-
4. 模型、思考级别、权限模式保持当前(文档写明)。
|
|
117
|
-
|
|
118
|
-
### §3.4 文件与对话不一致时告诉模型
|
|
119
|
-
|
|
120
|
-
- 仅对话:若有已跟踪文件当前内容 ≠ 目标检查点 → 下一次提示前追加 `custom_message{customType:"ama.rewind-note"}`:「回滚到较早的对话,但以下文件保留了之后的修改:…(最多 20 个,其余计数)」。
|
|
121
|
-
- 仅代码:追加「以下文件已恢复到第 N 条消息之前的状态:…」。
|
|
122
|
-
- 对话 + 代码:两边一致,不追加。
|
|
123
|
-
- 该条目在回滚落点之后、下一条用户消息之前,只追加在末尾,不改前缀。
|
|
124
|
-
|
|
125
|
-
### §3.5 摘要两项
|
|
126
|
-
|
|
127
|
-
- 「从这里摘要」= `navigate(parentId, { summarize: true })`(已有 `branch_summary`,走会话前缀续写),并回填原消息。
|
|
128
|
-
- 「摘要到这里」= 以所选用户消息为切点做一次档二压缩(`compaction` 条目的 `firstKeptEntryId` = 该消息),之后的消息原样保留,停在末尾。可附说明(`instructions`)。
|
|
129
|
-
|
|
130
|
-
### §3.6 中断即撤回
|
|
131
|
-
|
|
132
|
-
运行中 Esc 中断,且本回合还没有任何 assistant 文本 / 工具调用、输入框为空 → 自动 `rewind(当前回合, "conversation")` 并回填原消息(配置 `ui.restoreOnCancel`,缺省 true)。
|
|
133
|
-
|
|
134
|
-
## §4 交互
|
|
135
|
-
|
|
136
|
-
- 空闲且输入框为空:双击 Esc(间隔 ≤ 800 ms,第一次提示「再按 Esc 回滚」)打开回滚列表;输入框有字:双击 Esc 清空输入并存进输入历史(↑ 可取回),第一次提示「再按 Esc 清空」。运行中 Esc 仍为中断。
|
|
137
|
-
- 列表:活动路径上的用户消息,最近在下、缺省选中最后一条;高亮行右侧显示 `N 文件 +x −y` / `无代码改动`(对高亮项做 dryRun,结果缓存)。
|
|
138
|
-
- 选中后:确认面板(左竖条样式,复用 `/session` 面板),显示消息原文与时间、选项(有代码改动才出现两个「恢复代码」项;两个摘要项可在行内输入说明)、预览(「将恢复 N 个文件 +x −y」/「代码不变」/ 冲突与跳过清单)、git HEAD 变化提示(附 `git log --oneline <记录>..HEAD` 与 `git reset --soft <记录>` 两条命令,不执行)。
|
|
139
|
-
- 结果通知:`已恢复 N 个文件,跳过 M 个(原因…)`。
|
|
140
|
-
- line 模式:`/rewind` 列编号;`/rewind <n> [both|conversation|code]`。
|
|
141
|
-
- 文案进 i18n 风格的现有中文常量;字形走主题 glyphs(ASCII 可用)。
|
|
142
|
-
|
|
143
|
-
## §5 RPC / SDK / Hook / 配置
|
|
144
|
-
|
|
145
|
-
- RPC:`get_rewind_points` → `{ points }`;`rewind { entryId, mode, dryRun?, onConflict? }` → `RewindResult`;事件 `session_rewound { entryId, mode, restored, deleted, conflicts, skipped }`。写进 `docs/rpc.md`。
|
|
146
|
-
- SDK:`session.rewindPoints()`、`session.rewind()`。
|
|
147
|
-
- Hook:新增命令式事件 `PostRewind`(payload `{ entryId, mode, files }`,不可阻止);`docs/hooks.md` 同步。
|
|
148
|
-
- 配置(`key-docs.ts` 每项要说明与缺省值):
|
|
149
|
-
- `checkpoints.mode`: `"tools"`(缺省)/ `"shadow-git"` / `"off"`;`AMA_CHECKPOINTS=off` 覆盖。
|
|
150
|
-
- `checkpoints.maxFileBytes`: 5 242 880。
|
|
151
|
-
- `checkpoints.keep`: 100。
|
|
152
|
-
- `ui.restoreOnCancel`: true。
|
|
153
|
-
|
|
154
|
-
## §6 影子 git(`checkpoints.mode: "shadow-git"`)[RW-D]
|
|
155
|
-
|
|
156
|
-
- 仓库:`<dataDir>/file-history/shadow/<sha256(cwd) 前 16>/`(`--git-dir`),`--work-tree=cwd`;尊重 cwd 的 `.gitignore` 与 `info/exclude`,额外排除 `.git`。
|
|
157
|
-
- 每个新回合:`git add -A` + `write-tree` + `commit-tree`,提交 id 记进 `CheckpointData.shadowCommit`(契约里预留可选字段)。
|
|
158
|
-
- 护栏:cwd 下文件数 > 20 000 或单次快照 > 3 s → 本会话降级为 `tools` 并提示;需要 `git` 在 PATH。
|
|
159
|
-
- 恢复:只处理目标提交与「当前工作区快照」之间的差异文件,逐个按 §3.2 的冲突与安全检查写回或删除;不碰 `.gitignore` 掉的文件。
|
|
160
|
-
- 与 `tools` 模式并存:edit / write 的跟踪照常(冲突检测仍以它为准)。
|
|
161
|
-
|
|
162
|
-
## §7 缓存与上下文
|
|
163
|
-
|
|
164
|
-
- 回滚后第一次请求:system + tools + 落点之前的消息与回滚前发过的请求逐字节相同 → 有效期内命中;`onContextChanged()` 使这次请求成为重置点(不做未命中归因、保温作废),与现状一致。
|
|
165
|
-
- `ama.checkpoint*` 是 `custom`,不进上下文;`ama.rewind-note` 是 `custom_message`,只出现在新落点之后。
|
|
166
|
-
- 测试:回滚前后请求体前缀逐字节比较(`src/agent/session-rewind.test.ts`)。
|
|
167
|
-
|
|
168
|
-
## §8 批次与文件所有权
|
|
169
|
-
|
|
170
|
-
契约 PR(本计划所在 PR)先合入:`src/checkpoints/types.ts`、`ToolContext.checkpoint?`。配置 `checkpoints.*` 归 RW-A,`ui.restoreOnCancel` 与 `PostRewind` 归 RW-B(各自同步 `config/{types,schema,json-schema,key-docs}.ts` 与 `hooks/types.ts`)。之后:
|
|
171
|
-
|
|
172
|
-
| 批次 | 内容 | 文件所有权 | 依赖 | 验收 |
|
|
173
|
-
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
174
|
-
| RW-A 检查点核心 | blob 存储、tracker、条目重放、恢复与安全检查、冲突检测、dry-run diff、GC、doctor 占用;edit / write 调 `ctx.checkpoint` | `src/checkpoints/**`(除 types.ts)、`src/tools/{edit,write}.ts` 的两处调用、`src/cli/subcommands/{sessions,doctor}.ts` 的 GC / 占用 | 契约 | 单测覆盖 §3.2 每条分支(符号链接、硬链接、父目录移动、删除、新建、冲突 skip / overwrite、too_large);三平台 CI 绿(Windows 无 O_NOFOLLOW 分支) |
|
|
175
|
-
| RW-B 会话与接口 | `session-rewind.ts`(编排、readFiles 重算、rewind-note、摘要两项、中断即撤回)、检查点接线(runPrompt 后建检查点、子会话指向父 tracker)、RPC / SDK / `PostRewind` / 文档 | `src/agent/session-rewind.ts`(新)、`src/agent/{session,session-run,session-tools,session-subagent}.ts` 的接线、`src/modes/rpc/**`、`src/sdk.ts`、`src/hooks/**` 的事件、`docs/{rpc,hooks,sessions}.md` | 契约;RW-A 的实现可先用内存桩,合入顺序 A → B | fake 供应商端到端:edit 两个文件 → rewind both → 文件与对话都回到之前、readFiles 不含被恢复文件、下一请求前缀逐字节不变;仅对话 / 仅代码各自的 note;子会话编辑可回滚;中断即撤回 |
|
|
176
|
-
| RW-C 交互界面 | 双击 Esc、回滚列表、确认面板、预览、git 提示、结果通知、line 模式 `/rewind` | `src/modes/interactive/**`、`src/modes/commands-core.ts`、`docs/tui.md` | RW-B | 帧黄金:列表、面板(有 / 无代码改动、冲突、git 提示)、ASCII;tmux 手测双击 Esc 两种行为 |
|
|
177
|
-
| RW-D 影子 git | §6 | `src/checkpoints/shadow-git.ts`(新)及其测试 | RW-A | 临时 git 仓库里 bash 改动可回滚;护栏降级;无 git 时提示 |
|
|
178
|
-
|
|
179
|
-
- A 与 B 并行开发(B 用桩),A 先合;C 与 D 在 B / A 合入后并行。
|
|
180
|
-
- 每个文件 ≤ 600 行(`src/agent/session.ts` 已 600 行,新逻辑放 `session-rewind.ts`)。
|
|
181
|
-
- 每批次细粒度提交、一个 PR、CI 绿后由主会话合并(merge commit);不发版。
|