@armadra/agent 0.3.0 → 0.5.0
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 +257 -0
- package/README.md +263 -95
- package/THIRD_PARTY_NOTICES.md +34 -0
- package/dist/acp.d.ts +18 -0
- package/dist/acp.js +19 -0
- package/dist/agent/limits.d.ts +38 -0
- package/dist/agent/limits.js +127 -0
- package/dist/agent/loop-guard.d.ts +38 -0
- package/dist/agent/loop-guard.js +95 -0
- package/dist/agent/loop.d.ts +4 -0
- package/dist/agent/loop.js +7 -0
- package/dist/agent/prompt-rules.d.ts +12 -0
- package/dist/agent/prompt-rules.js +18 -0
- package/dist/agent/reminders.d.ts +59 -0
- package/dist/agent/reminders.js +327 -0
- package/dist/agent/retry.d.ts +1 -1
- package/dist/agent/retry.js +2 -1
- package/dist/agent/session-cache.d.ts +5 -0
- package/dist/agent/session-cache.js +18 -2
- package/dist/agent/session-classifier.d.ts +18 -0
- package/dist/agent/session-classifier.js +105 -0
- package/dist/agent/session-compaction.d.ts +35 -6
- package/dist/agent/session-compaction.js +157 -31
- package/dist/agent/session-core.d.ts +40 -1
- package/dist/agent/session-extensions.d.ts +61 -0
- package/dist/agent/session-extensions.js +129 -0
- package/dist/agent/session-images.d.ts +23 -0
- package/dist/agent/session-images.js +97 -0
- package/dist/agent/session-plan.d.ts +21 -0
- package/dist/agent/session-plan.js +524 -0
- package/dist/agent/session-rewind.d.ts +81 -0
- package/dist/agent/session-rewind.js +354 -0
- package/dist/agent/session-run.d.ts +28 -1
- package/dist/agent/session-run.js +157 -6
- package/dist/agent/session-settings.d.ts +49 -0
- package/dist/agent/session-settings.js +95 -0
- package/dist/agent/session-subagent.d.ts +36 -24
- package/dist/agent/session-subagent.js +259 -129
- package/dist/agent/session-sync.d.ts +10 -3
- package/dist/agent/session-sync.js +37 -8
- package/dist/agent/session-telemetry.d.ts +39 -0
- package/dist/agent/session-telemetry.js +231 -0
- package/dist/agent/session-tools.js +63 -3
- package/dist/agent/session.d.ts +33 -29
- package/dist/agent/session.js +91 -126
- package/dist/agent/subagent-registry.d.ts +91 -0
- package/dist/agent/subagent-registry.js +494 -0
- package/dist/agent/system-prompt.d.ts +6 -3
- package/dist/agent/system-prompt.js +7 -2
- package/dist/agent/tool-runner.d.ts +8 -1
- package/dist/agent/tool-runner.js +72 -6
- package/dist/agent/types-w5.d.ts +192 -0
- package/dist/agent/types-w5.js +10 -0
- package/dist/agent/types.d.ts +55 -4
- package/dist/agent/types.js +2 -0
- package/dist/agent/worktree.d.ts +36 -0
- package/dist/agent/worktree.js +86 -0
- package/dist/agents/builtin.d.ts +14 -0
- package/dist/agents/builtin.js +39 -0
- package/dist/agents/catalog.d.ts +43 -0
- package/dist/agents/catalog.js +82 -0
- package/dist/agents/discover.d.ts +35 -0
- package/dist/agents/discover.js +83 -0
- package/dist/agents/external.d.ts +82 -0
- package/dist/agents/external.js +326 -0
- package/dist/agents/parse.d.ts +18 -0
- package/dist/agents/parse.js +116 -0
- package/dist/agents/result.d.ts +32 -0
- package/dist/agents/result.js +67 -0
- package/dist/agents/task-control.d.ts +17 -0
- package/dist/agents/task-control.js +17 -0
- package/dist/agents/task-record.d.ts +78 -0
- package/dist/agents/task-record.js +141 -0
- package/dist/agents/types.d.ts +46 -0
- package/dist/agents/types.js +8 -0
- package/dist/ai/apis/anthropic-compat.d.ts +36 -0
- package/dist/ai/apis/anthropic-compat.js +92 -0
- package/dist/ai/apis/anthropic-messages.js +3 -2
- package/dist/ai/apis/anthropic-request.d.ts +7 -6
- package/dist/ai/apis/anthropic-request.js +10 -28
- package/dist/ai/apis/cache-params.d.ts +11 -2
- package/dist/ai/apis/cache-params.js +25 -6
- package/dist/ai/apis/google-generative-ai.js +3 -2
- package/dist/ai/apis/openai-compat.d.ts +4 -1
- package/dist/ai/apis/openai-compat.js +8 -1
- package/dist/ai/apis/openai-completions.js +3 -2
- package/dist/ai/apis/openai-responses.js +3 -2
- package/dist/ai/http.d.ts +28 -6
- package/dist/ai/http.js +41 -8
- package/dist/ai/image-limits.d.ts +45 -0
- package/dist/ai/image-limits.js +68 -0
- package/dist/ai/providers/builtin.d.ts +18 -6
- package/dist/ai/providers/builtin.js +135 -6
- package/dist/ai/providers/catalog-data.js +17 -13
- package/dist/ai/providers/catalog.d.ts +60 -7
- package/dist/ai/providers/catalog.js +197 -38
- package/dist/ai/providers/channels.d.ts +33 -3
- package/dist/ai/providers/channels.js +108 -7
- package/dist/ai/providers/enrich.d.ts +6 -3
- package/dist/ai/providers/enrich.js +19 -4
- package/dist/ai/providers/models-dev-cache.d.ts +28 -24
- package/dist/ai/providers/models-dev-cache.js +92 -78
- package/dist/ai/providers/models-dev-data.d.ts +7 -0
- package/dist/ai/providers/models-dev-data.js +32 -0
- package/dist/ai/providers/models-dev-snapshot.d.ts +50 -0
- package/dist/ai/providers/models-dev-snapshot.js +137 -0
- package/dist/ai/providers/models-dev.d.ts +51 -10
- package/dist/ai/providers/models-dev.js +132 -39
- package/dist/ai/providers/registry.d.ts +28 -11
- package/dist/ai/providers/registry.js +112 -65
- package/dist/ai/providers/suggest.d.ts +18 -0
- package/dist/ai/providers/suggest.js +72 -0
- package/dist/ai/sse.d.ts +6 -2
- package/dist/ai/sse.js +22 -2
- package/dist/ai/types.d.ts +37 -4
- package/dist/ai/types.js +5 -0
- package/dist/bundle/ama.cjs +41979 -21147
- package/dist/checkpoints/backend.d.ts +61 -0
- package/dist/checkpoints/backend.js +135 -0
- package/dist/checkpoints/blobs.d.ts +60 -0
- package/dist/checkpoints/blobs.js +203 -0
- package/dist/checkpoints/gc.d.ts +47 -0
- package/dist/checkpoints/gc.js +144 -0
- package/dist/checkpoints/git-head.d.ts +15 -0
- package/dist/checkpoints/git-head.js +89 -0
- package/dist/checkpoints/index.d.ts +17 -0
- package/dist/checkpoints/index.js +17 -0
- package/dist/checkpoints/replay.d.ts +48 -0
- package/dist/checkpoints/replay.js +154 -0
- package/dist/checkpoints/restore.d.ts +86 -0
- package/dist/checkpoints/restore.js +263 -0
- package/dist/checkpoints/settings.d.ts +14 -0
- package/dist/checkpoints/settings.js +23 -0
- package/dist/checkpoints/shadow-git.d.ts +108 -0
- package/dist/checkpoints/shadow-git.js +491 -0
- package/dist/checkpoints/shadow-restore.d.ts +25 -0
- package/dist/checkpoints/shadow-restore.js +128 -0
- package/dist/checkpoints/tracker.d.ts +64 -0
- package/dist/checkpoints/tracker.js +192 -0
- package/dist/checkpoints/types.d.ts +99 -0
- package/dist/checkpoints/types.js +12 -0
- package/dist/cli/args.d.ts +26 -7
- package/dist/cli/args.js +75 -82
- package/dist/cli/bootstrap.js +40 -4
- package/dist/cli/codemode-notice.d.ts +21 -0
- package/dist/cli/codemode-notice.js +56 -0
- package/dist/cli/compose-agents.d.ts +27 -0
- package/dist/cli/compose-agents.js +111 -0
- package/dist/cli/compose-extensions.d.ts +29 -0
- package/dist/cli/compose-extensions.js +44 -0
- package/dist/cli/compose-session.d.ts +8 -0
- package/dist/cli/compose-session.js +76 -2
- package/dist/cli/compose-store.d.ts +1 -1
- package/dist/cli/compose-store.js +3 -1
- package/dist/cli/compose.d.ts +17 -4
- package/dist/cli/compose.js +60 -14
- package/dist/cli/default-model.d.ts +38 -1
- package/dist/cli/default-model.js +96 -9
- package/dist/cli/deps.d.ts +42 -0
- package/dist/cli/exit-codes.d.ts +12 -0
- package/dist/cli/exit-codes.js +15 -0
- package/dist/cli/fake-visibility.d.ts +13 -0
- package/dist/cli/fake-visibility.js +26 -0
- package/dist/cli/from-prompt.d.ts +18 -0
- package/dist/cli/from-prompt.js +49 -0
- package/dist/cli/help-text.d.ts +4 -0
- package/dist/cli/help-text.js +102 -0
- package/dist/cli/main.d.ts +9 -2
- package/dist/cli/main.js +77 -3
- package/dist/cli/proxy.d.ts +51 -0
- package/dist/cli/proxy.js +135 -0
- package/dist/cli/startup-screen.d.ts +29 -0
- package/dist/cli/startup-screen.js +51 -2
- package/dist/cli/startup-steps.d.ts +1 -1
- package/dist/cli/startup-steps.js +21 -13
- package/dist/cli/subcommands/config.d.ts +22 -3
- package/dist/cli/subcommands/config.js +119 -21
- package/dist/cli/subcommands/context.js +4 -1
- package/dist/cli/subcommands/doctor.js +33 -1
- package/dist/cli/subcommands/init.js +2 -1
- package/dist/cli/subcommands/models-discover.d.ts +15 -9
- package/dist/cli/subcommands/models-discover.js +58 -52
- package/dist/cli/subcommands/models.d.ts +2 -0
- package/dist/cli/subcommands/models.js +33 -14
- package/dist/cli/subcommands/probe-runner.d.ts +96 -0
- package/dist/cli/subcommands/probe-runner.js +264 -0
- package/dist/cli/subcommands/providers-probe.d.ts +34 -0
- package/dist/cli/subcommands/providers-probe.js +87 -0
- package/dist/cli/subcommands/providers.d.ts +3 -2
- package/dist/cli/subcommands/providers.js +53 -51
- package/dist/cli/subcommands/sessions-export.d.ts +10 -0
- package/dist/cli/subcommands/sessions-export.js +59 -0
- package/dist/cli/subcommands/sessions-search.d.ts +13 -0
- package/dist/cli/subcommands/sessions-search.js +103 -0
- package/dist/cli/subcommands/sessions.d.ts +6 -3
- package/dist/cli/subcommands/sessions.js +58 -3
- package/dist/cli/subcommands/stats.d.ts +17 -0
- package/dist/cli/subcommands/stats.js +198 -0
- package/dist/cli/system-prompt-arg.d.ts +11 -0
- package/dist/cli/system-prompt-arg.js +34 -0
- package/dist/codemode/capability.d.ts +24 -7
- package/dist/codemode/capability.js +38 -10
- package/dist/codemode/host-side.d.ts +14 -0
- package/dist/codemode/host-side.js +24 -1
- package/dist/codemode/modes.d.ts +4 -11
- package/dist/codemode/modes.js +5 -27
- package/dist/codemode/tool.d.ts +18 -14
- package/dist/codemode/tool.js +76 -31
- package/dist/compaction/breaker.d.ts +25 -9
- package/dist/compaction/breaker.js +47 -17
- package/dist/compaction/estimate.d.ts +11 -3
- package/dist/compaction/estimate.js +64 -22
- package/dist/compaction/image-budget.d.ts +45 -0
- package/dist/compaction/image-budget.js +115 -0
- package/dist/compaction/post-compact.d.ts +38 -0
- package/dist/compaction/post-compact.js +152 -0
- package/dist/compaction/protect.d.ts +27 -0
- package/dist/compaction/protect.js +56 -0
- package/dist/compaction/prune-tier.d.ts +58 -12
- package/dist/compaction/prune-tier.js +120 -54
- package/dist/compaction/summarize-tier.d.ts +23 -4
- package/dist/compaction/summarize-tier.js +100 -29
- package/dist/config/checker.d.ts +28 -0
- package/dist/config/checker.js +97 -0
- package/dist/config/init.d.ts +6 -2
- package/dist/config/init.js +12 -5
- package/dist/config/json-schema.d.ts +1 -0
- package/dist/config/json-schema.js +98 -4
- package/dist/config/key-docs.d.ts +22 -0
- package/dist/config/key-docs.js +174 -0
- package/dist/config/merge.d.ts +12 -9
- package/dist/config/merge.js +102 -13
- package/dist/config/profile.d.ts +2 -0
- package/dist/config/profile.js +2 -0
- package/dist/config/schema-w5.d.ts +18 -0
- package/dist/config/schema-w5.js +109 -0
- package/dist/config/schema.d.ts +5 -9
- package/dist/config/schema.js +91 -118
- package/dist/config/types-w5.d.ts +118 -0
- package/dist/config/types-w5.js +20 -0
- package/dist/config/types.d.ts +84 -7
- package/dist/config/types.js +29 -1
- package/dist/drivers/acp/client.d.ts +57 -0
- package/dist/drivers/acp/client.js +160 -0
- package/dist/drivers/acp/driver.d.ts +31 -0
- package/dist/drivers/acp/driver.js +274 -0
- package/dist/drivers/acp/testing/fake-agent-main.d.ts +5 -0
- package/dist/drivers/acp/testing/fake-agent-main.js +7 -0
- package/dist/drivers/acp/testing/fake-agent.d.ts +27 -0
- package/dist/drivers/acp/testing/fake-agent.js +211 -0
- package/dist/drivers/acp/types.d.ts +285 -0
- package/dist/drivers/acp/types.js +36 -0
- package/dist/drivers/agents.d.ts +58 -0
- package/dist/drivers/agents.js +142 -0
- package/dist/drivers/base.d.ts +35 -0
- package/dist/drivers/base.js +59 -0
- package/dist/drivers/catalog.d.ts +46 -0
- package/dist/drivers/catalog.js +167 -0
- package/dist/drivers/env.d.ts +20 -0
- package/dist/drivers/env.js +46 -0
- package/dist/drivers/host-runners.d.ts +18 -0
- package/dist/drivers/host-runners.js +45 -0
- package/dist/drivers/jsonrpc.d.ts +58 -0
- package/dist/drivers/jsonrpc.js +180 -0
- package/dist/drivers/native/claude-normalize.d.ts +46 -0
- package/dist/drivers/native/claude-normalize.js +106 -0
- package/dist/drivers/native/claude-stream.d.ts +29 -0
- package/dist/drivers/native/claude-stream.js +456 -0
- package/dist/drivers/native/codex-app-server.d.ts +26 -0
- package/dist/drivers/native/codex-app-server.js +407 -0
- package/dist/drivers/native/codex-normalize.d.ts +38 -0
- package/dist/drivers/native/codex-normalize.js +124 -0
- package/dist/drivers/native/oneshot.d.ts +28 -0
- package/dist/drivers/native/oneshot.js +312 -0
- package/dist/drivers/permissions.d.ts +40 -0
- package/dist/drivers/permissions.js +92 -0
- package/dist/drivers/pids.d.ts +32 -0
- package/dist/drivers/pids.js +93 -0
- package/dist/drivers/pool.d.ts +28 -0
- package/dist/drivers/pool.js +96 -0
- package/dist/drivers/probe.d.ts +47 -0
- package/dist/drivers/probe.js +172 -0
- package/dist/drivers/process.d.ts +48 -0
- package/dist/drivers/process.js +100 -0
- package/dist/drivers/runner.d.ts +61 -0
- package/dist/drivers/runner.js +388 -0
- package/dist/drivers/store.d.ts +49 -0
- package/dist/drivers/store.js +91 -0
- package/dist/drivers/turn.d.ts +41 -0
- package/dist/drivers/turn.js +99 -0
- package/dist/drivers/types.d.ts +122 -0
- package/dist/drivers/types.js +11 -0
- package/dist/git/info.d.ts +75 -0
- package/dist/git/info.js +191 -0
- package/dist/hooks/protocol.js +6 -1
- package/dist/hooks/types.d.ts +10 -1
- package/dist/hooks/types.js +2 -0
- package/dist/host/api-impl.d.ts +7 -0
- package/dist/host/api-impl.js +15 -0
- package/dist/host/types.d.ts +24 -2
- package/dist/host/types.js +4 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +1 -0
- package/dist/modes/acp/acp-events.d.ts +46 -0
- package/dist/modes/acp/acp-events.js +233 -0
- package/dist/modes/acp/acp-mode.d.ts +17 -0
- package/dist/modes/acp/acp-mode.js +47 -0
- package/dist/modes/acp/acp-server.d.ts +79 -0
- package/dist/modes/acp/acp-server.js +315 -0
- package/dist/modes/commands-core.d.ts +7 -1
- package/dist/modes/commands-core.js +61 -5
- package/dist/modes/image-input.d.ts +12 -4
- package/dist/modes/image-input.js +22 -5
- package/dist/modes/interactive/agent-panels.d.ts +14 -0
- package/dist/modes/interactive/agent-panels.js +103 -0
- package/dist/modes/interactive/agent-ui.d.ts +73 -0
- package/dist/modes/interactive/agent-ui.js +234 -0
- package/dist/modes/interactive/approval-dialog.d.ts +40 -7
- package/dist/modes/interactive/approval-dialog.js +192 -35
- package/dist/modes/interactive/approval-merge.d.ts +41 -0
- package/dist/modes/interactive/approval-merge.js +89 -0
- package/dist/modes/interactive/clipboard-paste.d.ts +18 -0
- package/dist/modes/interactive/clipboard-paste.js +28 -0
- package/dist/modes/interactive/commands.d.ts +20 -3
- package/dist/modes/interactive/commands.js +75 -16
- package/dist/modes/interactive/double-esc.d.ts +20 -0
- package/dist/modes/interactive/double-esc.js +34 -0
- package/dist/modes/interactive/event-notices.d.ts +32 -0
- package/dist/modes/interactive/event-notices.js +79 -0
- package/dist/modes/interactive/external-editor.d.ts +16 -0
- package/dist/modes/interactive/external-editor.js +39 -0
- package/dist/modes/interactive/interactive-mode.d.ts +16 -2
- package/dist/modes/interactive/interactive-mode.js +184 -202
- package/dist/modes/interactive/key-dispatch.d.ts +18 -2
- package/dist/modes/interactive/key-dispatch.js +53 -6
- package/dist/modes/interactive/line/line-mode.d.ts +3 -1
- package/dist/modes/interactive/line/line-mode.js +28 -9
- package/dist/modes/interactive/line/line-render.d.ts +6 -1
- package/dist/modes/interactive/line/line-render.js +66 -8
- package/dist/modes/interactive/message-view.d.ts +49 -10
- package/dist/modes/interactive/message-view.js +262 -46
- package/dist/modes/interactive/panels.d.ts +35 -0
- package/dist/modes/interactive/panels.js +157 -0
- package/dist/modes/interactive/pickers.d.ts +23 -2
- package/dist/modes/interactive/pickers.js +48 -15
- package/dist/modes/interactive/plan-command.d.ts +40 -0
- package/dist/modes/interactive/plan-command.js +129 -0
- package/dist/modes/interactive/plan-dialog.d.ts +98 -0
- package/dist/modes/interactive/plan-dialog.js +290 -0
- package/dist/modes/interactive/plan-flow.d.ts +34 -0
- package/dist/modes/interactive/plan-flow.js +98 -0
- package/dist/modes/interactive/rewind-command.d.ts +31 -0
- package/dist/modes/interactive/rewind-command.js +106 -0
- package/dist/modes/interactive/rewind-flow.d.ts +37 -0
- package/dist/modes/interactive/rewind-flow.js +151 -0
- package/dist/modes/interactive/rewind-list.d.ts +36 -0
- package/dist/modes/interactive/rewind-list.js +123 -0
- package/dist/modes/interactive/rewind-panel.d.ts +77 -0
- package/dist/modes/interactive/rewind-panel.js +309 -0
- package/dist/modes/interactive/rewind-text.d.ts +40 -0
- package/dist/modes/interactive/rewind-text.js +139 -0
- package/dist/modes/interactive/run-indicator.d.ts +51 -0
- package/dist/modes/interactive/run-indicator.js +189 -0
- package/dist/modes/interactive/session-events.d.ts +24 -0
- package/dist/modes/interactive/session-events.js +96 -0
- package/dist/modes/interactive/startup-header.d.ts +40 -0
- package/dist/modes/interactive/startup-header.js +169 -0
- package/dist/modes/interactive/status-area.d.ts +73 -0
- package/dist/modes/interactive/status-area.js +190 -0
- package/dist/modes/interactive/status-bar.d.ts +107 -16
- package/dist/modes/interactive/status-bar.js +306 -81
- package/dist/modes/interactive/status-line.d.ts +33 -0
- package/dist/modes/interactive/status-line.js +113 -0
- package/dist/modes/interactive/subagent-view.d.ts +56 -0
- package/dist/modes/interactive/subagent-view.js +154 -0
- package/dist/modes/interactive/tasks-report.d.ts +27 -0
- package/dist/modes/interactive/tasks-report.js +114 -0
- package/dist/modes/interactive/tool-summary.d.ts +46 -0
- package/dist/modes/interactive/tool-summary.js +218 -0
- package/dist/modes/interactive/tool-view.d.ts +58 -15
- package/dist/modes/interactive/tool-view.js +233 -145
- package/dist/modes/print/print-mode.d.ts +40 -4
- package/dist/modes/print/print-mode.js +161 -8
- package/dist/modes/rpc/commands.d.ts +9 -0
- package/dist/modes/rpc/commands.js +49 -0
- package/dist/modes/rpc/rpc-mode.js +7 -1
- package/dist/modes/session-report.d.ts +11 -0
- package/dist/modes/session-report.js +48 -1
- package/dist/permissions/auto-safe.d.ts +65 -0
- package/dist/permissions/auto-safe.js +547 -0
- package/dist/permissions/classifier.d.ts +68 -0
- package/dist/permissions/classifier.js +186 -0
- package/dist/permissions/dangerous.d.ts +5 -0
- package/dist/permissions/dangerous.js +1 -1
- package/dist/permissions/modes.d.ts +30 -0
- package/dist/permissions/modes.js +78 -0
- package/dist/permissions/pipeline.d.ts +72 -6
- package/dist/permissions/pipeline.js +306 -11
- package/dist/permissions/protected.d.ts +19 -0
- package/dist/permissions/protected.js +74 -0
- package/dist/permissions/readonly-bash.d.ts +30 -0
- package/dist/permissions/readonly-bash.js +118 -0
- package/dist/permissions/rules.js +3 -0
- package/dist/permissions/types.d.ts +92 -3
- package/dist/permissions/types.js +3 -0
- package/dist/plan/compose.d.ts +9 -0
- package/dist/plan/compose.js +19 -0
- package/dist/plan/controller.d.ts +71 -0
- package/dist/plan/controller.js +27 -0
- package/dist/plan/done-markers.d.ts +17 -0
- package/dist/plan/done-markers.js +51 -0
- package/dist/plan/extract.d.ts +29 -0
- package/dist/plan/extract.js +160 -0
- package/dist/plan/prompts.d.ts +36 -0
- package/dist/plan/prompts.js +89 -0
- package/dist/plan/store.d.ts +37 -0
- package/dist/plan/store.js +90 -0
- package/dist/rpc.d.ts +58 -2
- package/dist/rpc.js +7 -0
- package/dist/sandbox/bash.d.ts +74 -0
- package/dist/sandbox/bash.js +126 -0
- package/dist/sandbox/detect.d.ts +48 -0
- package/dist/sandbox/detect.js +149 -0
- package/dist/sandbox/index.d.ts +5 -0
- package/dist/sandbox/index.js +5 -0
- package/dist/sandbox/profile.d.ts +33 -0
- package/dist/sandbox/profile.js +76 -0
- package/dist/sandbox/wrap.d.ts +29 -0
- package/dist/sandbox/wrap.js +117 -0
- package/dist/sdk.d.ts +42 -5
- package/dist/sdk.js +34 -4
- package/dist/session/export.d.ts +32 -0
- package/dist/session/export.js +187 -0
- package/dist/session/redact.d.ts +15 -0
- package/dist/session/redact.js +55 -0
- package/dist/session/reuse.d.ts +33 -0
- package/dist/session/reuse.js +86 -0
- package/dist/session/scan.d.ts +34 -0
- package/dist/session/scan.js +140 -0
- package/dist/session/search.d.ts +52 -0
- package/dist/session/search.js +211 -0
- package/dist/session/stats-aggregate.d.ts +63 -0
- package/dist/session/stats-aggregate.js +163 -0
- package/dist/session/stats-index.d.ts +26 -0
- package/dist/session/stats-index.js +91 -0
- package/dist/session/stats-scan.d.ts +54 -0
- package/dist/session/stats-scan.js +236 -0
- package/dist/session/types.d.ts +3 -1
- package/dist/session/types.js +1 -0
- package/dist/skills/builtin.d.ts +31 -0
- package/dist/skills/builtin.js +109 -0
- package/dist/skills/discover.d.ts +2 -1
- package/dist/skills/index-prompt.js +5 -8
- package/dist/tools/background-jobs.d.ts +71 -0
- package/dist/tools/background-jobs.js +198 -0
- package/dist/tools/bash.d.ts +53 -1
- package/dist/tools/bash.js +158 -7
- package/dist/tools/clipboard-image.d.ts +44 -0
- package/dist/tools/clipboard-image.js +148 -0
- package/dist/tools/edit.d.ts +2 -0
- package/dist/tools/edit.js +18 -3
- package/dist/tools/image-file.d.ts +38 -3
- package/dist/tools/image-file.js +81 -10
- package/dist/tools/image-resize.d.ts +58 -0
- package/dist/tools/image-resize.js +97 -0
- package/dist/tools/presets.d.ts +40 -8
- package/dist/tools/presets.js +65 -19
- package/dist/tools/read.d.ts +5 -2
- package/dist/tools/read.js +13 -10
- package/dist/tools/registry.d.ts +7 -1
- package/dist/tools/registry.js +27 -4
- package/dist/tools/task-ctl.d.ts +22 -0
- package/dist/tools/task-ctl.js +116 -0
- package/dist/tools/task.d.ts +22 -10
- package/dist/tools/task.js +66 -26
- package/dist/tools/todo.d.ts +22 -2
- package/dist/tools/todo.js +58 -14
- package/dist/tools/truncate.d.ts +15 -0
- package/dist/tools/truncate.js +25 -0
- package/dist/tools/types.d.ts +113 -0
- package/dist/tools/types.js +5 -0
- package/dist/tools/write.js +3 -0
- package/dist/tui/component.d.ts +8 -2
- package/dist/tui/component.js +3 -1
- package/dist/tui/components/box.d.ts +6 -1
- package/dist/tui/components/box.js +16 -6
- package/dist/tui/components/card.d.ts +23 -0
- package/dist/tui/components/card.js +37 -0
- package/dist/tui/components/editor-history.d.ts +6 -0
- package/dist/tui/components/editor-history.js +45 -0
- package/dist/tui/components/editor-paste.d.ts +1 -1
- package/dist/tui/components/editor-paste.js +4 -4
- package/dist/tui/components/editor.d.ts +11 -5
- package/dist/tui/components/editor.js +52 -58
- package/dist/tui/components/key-value.d.ts +3 -0
- package/dist/tui/components/key-value.js +16 -6
- package/dist/tui/components/loader.d.ts +37 -7
- package/dist/tui/components/loader.js +84 -21
- package/dist/tui/components/markdown.d.ts +5 -1
- package/dist/tui/components/markdown.js +45 -21
- package/dist/tui/components/meter.d.ts +3 -3
- package/dist/tui/components/meter.js +13 -11
- package/dist/tui/components/select-list.d.ts +23 -1
- package/dist/tui/components/select-list.js +76 -13
- package/dist/tui/glyphs.d.ts +72 -0
- package/dist/tui/glyphs.js +118 -0
- package/dist/tui/keybindings.d.ts +5 -0
- package/dist/tui/keybindings.js +5 -0
- package/dist/tui/theme.d.ts +30 -6
- package/dist/tui/theme.js +103 -17
- package/dist/tui.d.ts +4 -2
- package/dist/tui.js +3 -1
- package/docs/acp.md +78 -0
- package/docs/agents.md +250 -0
- package/docs/codemode.md +28 -10
- package/docs/hooks.md +36 -32
- package/docs/permissions.md +212 -0
- package/docs/plan.md +107 -0
- package/docs/providers.md +261 -62
- package/docs/rewind-plan.md +181 -0
- package/docs/rpc.md +127 -40
- package/docs/sandbox.md +215 -0
- package/docs/session-format.md +43 -22
- package/docs/sessions.md +174 -0
- package/docs/tui-design.md +751 -0
- package/docs/tui.md +260 -64
- package/package.json +15 -2
package/dist/cli/args.js
CHANGED
|
@@ -2,15 +2,18 @@
|
|
|
2
2
|
* 手写参数解析(设计 §11.1 第 2 步、§12.10、§13)。[B5]
|
|
3
3
|
*
|
|
4
4
|
* - 支持 `--opt value` 与 `--opt=value`;`--` 之后全部作为提示文本;可重复的参数累加。
|
|
5
|
+
* - 位置参数 `-`:`-p` 一直等 stdin 到 EOF(有提示参数时也不设首字节超时)。
|
|
5
6
|
* - 子命令只在第一个参数是 `auth / sessions / models / providers / doctor / config / init` 时识别,
|
|
6
7
|
* 其余参数原样交给子命令。
|
|
7
|
-
* - 互斥:`-p` 与 `--mode rpc`;`--continue` / `--resume` / `--session-id` / `--fork` 两两互斥;
|
|
8
|
+
* - 互斥:`-p` 与 `--mode rpc / acp`;`--continue` / `--resume` / `--session-id` / `--fork` 两两互斥;
|
|
8
9
|
* `--trust` 与 `--no-trust`;`--api-key` 需要 `--model`;`--output-format` 需要 `-p`。
|
|
9
10
|
* - `--resume [id]`:下一个参数形如会话 id(无空白、不以 `-` 开头)才被当作 id;
|
|
10
11
|
* 否则仍作为提示文本。显式写法 `--resume=<id>`。
|
|
11
12
|
* - `--provider` 不带 `--model` 不在这里报错,由 bootstrap 第 11 步报(退出码 2)。
|
|
12
13
|
*/
|
|
13
14
|
import { AmaError } from "../errors.js";
|
|
15
|
+
import { PERMISSION_MODES_STRICT_FIRST } from "../permissions/types.js";
|
|
16
|
+
import { canonicalPreset } from "../config/types.js";
|
|
14
17
|
import { CODEMODE_MODES } from "../config/types.js";
|
|
15
18
|
export const SUBCOMMANDS = [
|
|
16
19
|
"auth",
|
|
@@ -20,6 +23,7 @@ export const SUBCOMMANDS = [
|
|
|
20
23
|
"doctor",
|
|
21
24
|
"config",
|
|
22
25
|
"init",
|
|
26
|
+
"stats",
|
|
23
27
|
];
|
|
24
28
|
export class UsageError extends AmaError {
|
|
25
29
|
constructor(message) {
|
|
@@ -27,7 +31,7 @@ export class UsageError extends AmaError {
|
|
|
27
31
|
this.name = "UsageError";
|
|
28
32
|
}
|
|
29
33
|
}
|
|
30
|
-
const PERMISSION_MODES =
|
|
34
|
+
const PERMISSION_MODES = PERMISSION_MODES_STRICT_FIRST;
|
|
31
35
|
const THINKING_LEVELS = [
|
|
32
36
|
"off",
|
|
33
37
|
"minimal",
|
|
@@ -38,82 +42,10 @@ const THINKING_LEVELS = [
|
|
|
38
42
|
];
|
|
39
43
|
const OUTPUT_FORMATS = ["text", "json", "stream-json"];
|
|
40
44
|
const QUIET_LEVELS = ["normal", "header", "silent"];
|
|
41
|
-
/** 帮助与报错按常用顺序列出(校验集合同
|
|
42
|
-
const PRESET_CHOICES = ["default", "minimal", "codemode", "coordinator"];
|
|
45
|
+
/** 帮助与报错按常用顺序列出(校验集合同 TOOLS_PRESET_INPUTS;`codemode` 是 `codemode-only` 的别名)。 */
|
|
46
|
+
const PRESET_CHOICES = ["default", "minimal", "codemode-only", "coordinator", "codemode"];
|
|
43
47
|
const SESSION_ID_LIKE = /^[A-Za-z0-9][A-Za-z0-9._:-]*$/;
|
|
44
|
-
export
|
|
45
|
-
ama <子命令> …
|
|
46
|
-
|
|
47
|
-
模式
|
|
48
|
-
(缺省) 终端界面;stdin / stdout 非 TTY 或 TERM=dumb 时自动降级为行式
|
|
49
|
-
--no-tui 行式界面(readline + 括号粘贴)
|
|
50
|
-
-p, --print 非交互:执行提示后退出(提示可来自参数与 stdin 管道)
|
|
51
|
-
--output-format <格式> -p 的输出:text(缺省)| json | stream-json
|
|
52
|
-
--image <文件> -p 随提示发送图片(可重复;png / jpg / gif / webp,单张 ≤ 5 MB);
|
|
53
|
-
交互界面里写 @图片路径 或粘贴图片路径
|
|
54
|
-
--mode rpc stdio JSONL 协议(供嵌入)
|
|
55
|
-
--tui-mode <模式> 显示模式,第一期只有 regular(主屏)
|
|
56
|
-
--quiet-startup <档> 启动画面:normal | header | silent
|
|
57
|
-
|
|
58
|
-
模型
|
|
59
|
-
--model <provider/id> 模型(可配合 --provider 只写 id;@渠道 指定渠道,如 packy/kimi-k2.5@messages)
|
|
60
|
-
--provider <id> 供应商(必须同时给 --model)
|
|
61
|
-
--api-key <key> 只用于本次启动的 key(需要 --model;优先用 ama auth set)
|
|
62
|
-
--thinking <级别> off | minimal | low | medium | high | xhigh
|
|
63
|
-
|
|
64
|
-
会话
|
|
65
|
-
-c, --continue 继续本目录最近的会话
|
|
66
|
-
-r, --resume [id] 恢复会话(交互模式无 id 时弹选择器)
|
|
67
|
-
--session-id <id> 使用指定 id 的会话(不存在则新建)
|
|
68
|
-
--fork <id> 从指定会话分叉出新会话
|
|
69
|
-
--session-dir <目录> 会话目录(缺省 ~/.local/share/ama/sessions)
|
|
70
|
-
|
|
71
|
-
权限与信任
|
|
72
|
-
--permission-mode <模式> plan | default | auto-edit | full-auto
|
|
73
|
-
--allow <规则> 追加允许规则,可重复(如 "bash(git status*)")
|
|
74
|
-
--deny <规则> 追加拒绝规则,可重复(如 "write(**/.env*)")
|
|
75
|
-
--trust / --no-trust 信任 / 不信任当前项目(项目级 Hook、Skill、提示模板)
|
|
76
|
-
|
|
77
|
-
资源
|
|
78
|
-
--profile <文件> 宿主 profile.json(字段等价于对应参数,命令行优先)
|
|
79
|
-
--host <模块> 宿主适配器模块(CJS / ESM)
|
|
80
|
-
--instructions <文件> 追加指令文件,可重复
|
|
81
|
-
--skill-dir <目录> 追加 Skill 目录,可重复
|
|
82
|
-
--auth-file <文件> auth.json 位置(缺省 ~/.config/ama/auth.json)
|
|
83
|
-
--tools <a,b,…> 只启用这些工具
|
|
84
|
-
--exclude-tools <a,b,…> 禁用这些工具
|
|
85
|
-
--tools-preset <名> 工具预设:default(缺省)| minimal | codemode | coordinator
|
|
86
|
-
--codemode <模式> codemode 调用方式:off | on | only
|
|
87
|
-
|
|
88
|
-
子命令
|
|
89
|
-
ama auth set <provider> 从 stdin 读取 key 写入 auth.json(0600)
|
|
90
|
-
ama auth list 列出已保存 key 的供应商(不显示 key)
|
|
91
|
-
ama auth remove <provider> 删除已保存的 key
|
|
92
|
-
ama sessions list|show|prune 会话管理
|
|
93
|
-
ama models list [--provider <id>] 列出模型(含来源与 key 状态)
|
|
94
|
-
ama models check <provider/id> 发一次最小请求检查可用性
|
|
95
|
-
ama models discover <provider> [--probe] [--write] [--limit N]
|
|
96
|
-
从中转 /v1/models 列出模型,探测协议并写入配置
|
|
97
|
-
ama models refresh-catalog 强制刷新 models.dev 模型元数据缓存
|
|
98
|
-
ama providers add <id> --base-url <url> [--key-env VAR] [--probe] [--channel n=api@url] [--yes]
|
|
99
|
-
一键接入:列模型、补 models.dev 元数据、探测渠道、写入配置
|
|
100
|
-
ama providers list|channels <id>|remove <id>|refresh <id>
|
|
101
|
-
供应商 → 渠道 → 模型;删除;重拉模型列表
|
|
102
|
-
ama models cache-probe <provider/id> [--tokens N] [--gap-ms MS] [--yes] [--json]
|
|
103
|
-
判断端点是否报告缓存命中
|
|
104
|
-
ama doctor 配置层级、信任、key 来源、Hook、终端能力
|
|
105
|
-
ama config show [--json] 生效配置与每项来源、将使用的模型
|
|
106
|
-
ama config path 配置目录、数据目录与各文件路径
|
|
107
|
-
ama config edit 用 $VISUAL / $EDITOR 打开 config.json
|
|
108
|
-
ama init [--force] 建配置目录(0700)与 config.json、config.schema.json;已有的不覆盖
|
|
109
|
-
|
|
110
|
-
其它
|
|
111
|
-
-h, --help 输出本帮助
|
|
112
|
-
-v, --version 输出版本
|
|
113
|
-
|
|
114
|
-
退出码:0 正常 · 1 运行期错误 · 2 用法错误 · 3 配置错误 · 4 无可用模型或 key ·
|
|
115
|
-
5 会话错误 · 6 宿主 / Hook 启动失败 · 78 宿主 API 版本不匹配 · 130 SIGINT · 143 SIGTERM
|
|
116
|
-
`;
|
|
48
|
+
export { HELP_TEXT } from "./help-text.js";
|
|
117
49
|
const VALUE_OPTIONS = new Set([
|
|
118
50
|
"profile",
|
|
119
51
|
"host",
|
|
@@ -139,6 +71,12 @@ const VALUE_OPTIONS = new Set([
|
|
|
139
71
|
"tools-preset",
|
|
140
72
|
"codemode",
|
|
141
73
|
"image",
|
|
74
|
+
"max-turns",
|
|
75
|
+
"max-cost",
|
|
76
|
+
"agent-dir",
|
|
77
|
+
"system-prompt",
|
|
78
|
+
"system-prompt-mode",
|
|
79
|
+
"from",
|
|
142
80
|
]);
|
|
143
81
|
const FLAG_ALIASES = {
|
|
144
82
|
"-h": "help",
|
|
@@ -171,6 +109,9 @@ export function emptyArgs() {
|
|
|
171
109
|
resume: false,
|
|
172
110
|
print: false,
|
|
173
111
|
noTui: false,
|
|
112
|
+
noSession: false,
|
|
113
|
+
stdin: false,
|
|
114
|
+
noStdin: false,
|
|
174
115
|
positionals: [],
|
|
175
116
|
};
|
|
176
117
|
}
|
|
@@ -227,7 +168,7 @@ function applyValue(args, option, value) {
|
|
|
227
168
|
args.outputFormat = choice(option, value, OUTPUT_FORMATS);
|
|
228
169
|
break;
|
|
229
170
|
case "mode":
|
|
230
|
-
args.mode = choice(option, value, ["rpc"]);
|
|
171
|
+
args.mode = choice(option, value, ["rpc", "acp"]);
|
|
231
172
|
break;
|
|
232
173
|
case "tui-mode":
|
|
233
174
|
if (value === "fullscreen")
|
|
@@ -244,7 +185,7 @@ function applyValue(args, option, value) {
|
|
|
244
185
|
args.excludeTools = [...(args.excludeTools ?? []), ...list(value)];
|
|
245
186
|
break;
|
|
246
187
|
case "tools-preset":
|
|
247
|
-
args.toolsPreset = choice(option, value, PRESET_CHOICES);
|
|
188
|
+
args.toolsPreset = canonicalPreset(choice(option, value, PRESET_CHOICES));
|
|
248
189
|
break;
|
|
249
190
|
case "codemode":
|
|
250
191
|
args.codemode = choice(option, value, CODEMODE_MODES);
|
|
@@ -252,6 +193,32 @@ function applyValue(args, option, value) {
|
|
|
252
193
|
case "image":
|
|
253
194
|
args.images.push(value);
|
|
254
195
|
break;
|
|
196
|
+
case "system-prompt":
|
|
197
|
+
args.systemPrompt = value;
|
|
198
|
+
break;
|
|
199
|
+
case "system-prompt-mode":
|
|
200
|
+
args.systemPromptMode = choice(option, value, ["append", "replace"]);
|
|
201
|
+
break;
|
|
202
|
+
case "max-turns": {
|
|
203
|
+
const turns = Number(value);
|
|
204
|
+
if (!Number.isInteger(turns) || turns < 1)
|
|
205
|
+
throw new UsageError(`--max-turns 应为正整数(收到 ${value})`);
|
|
206
|
+
args.maxTurns = turns;
|
|
207
|
+
break;
|
|
208
|
+
}
|
|
209
|
+
case "max-cost": {
|
|
210
|
+
const usd = Number(value);
|
|
211
|
+
if (!Number.isFinite(usd) || usd <= 0)
|
|
212
|
+
throw new UsageError(`--max-cost 应为正数(美元,收到 ${value})`);
|
|
213
|
+
args.maxCostUsd = usd;
|
|
214
|
+
break;
|
|
215
|
+
}
|
|
216
|
+
case "agent-dir":
|
|
217
|
+
(args.agentDirs ??= []).push(value);
|
|
218
|
+
break;
|
|
219
|
+
case "from":
|
|
220
|
+
args.from = value;
|
|
221
|
+
break;
|
|
255
222
|
}
|
|
256
223
|
}
|
|
257
224
|
function applyFlag(args, name) {
|
|
@@ -271,6 +238,12 @@ function applyFlag(args, name) {
|
|
|
271
238
|
case "no-tui":
|
|
272
239
|
args.noTui = true;
|
|
273
240
|
return true;
|
|
241
|
+
case "no-session":
|
|
242
|
+
args.noSession = true;
|
|
243
|
+
return true;
|
|
244
|
+
case "no-stdin":
|
|
245
|
+
args.noStdin = true;
|
|
246
|
+
return true;
|
|
274
247
|
case "trust":
|
|
275
248
|
case "no-trust": {
|
|
276
249
|
const value = name === "trust";
|
|
@@ -285,8 +258,8 @@ function applyFlag(args, name) {
|
|
|
285
258
|
}
|
|
286
259
|
}
|
|
287
260
|
function validate(args) {
|
|
288
|
-
if (args.print && args.mode
|
|
289
|
-
throw new UsageError(
|
|
261
|
+
if (args.print && args.mode !== undefined)
|
|
262
|
+
throw new UsageError(`-p 与 --mode ${args.mode} 不能同时使用`);
|
|
290
263
|
const sessionFlags = [
|
|
291
264
|
args.continue ? "--continue" : undefined,
|
|
292
265
|
args.resume ? "--resume" : undefined,
|
|
@@ -295,12 +268,28 @@ function validate(args) {
|
|
|
295
268
|
].filter((f) => f !== undefined);
|
|
296
269
|
if (sessionFlags.length > 1)
|
|
297
270
|
throw new UsageError(`${sessionFlags.join(" 与 ")} 不能同时使用`);
|
|
271
|
+
if (args.noSession && sessionFlags.length > 0) {
|
|
272
|
+
throw new UsageError(`--no-session 与 ${sessionFlags[0]} 不能同时使用`);
|
|
273
|
+
}
|
|
298
274
|
if (args.apiKey !== undefined && args.model === undefined) {
|
|
299
275
|
throw new UsageError("--api-key 需要同时给出 --model");
|
|
300
276
|
}
|
|
301
277
|
if (args.outputFormat !== undefined && !args.print) {
|
|
302
278
|
throw new UsageError("--output-format 只用于 -p / --print");
|
|
303
279
|
}
|
|
280
|
+
if (args.systemPromptMode !== undefined && args.systemPrompt === undefined) {
|
|
281
|
+
throw new UsageError("--system-prompt-mode 需要同时给出 --system-prompt");
|
|
282
|
+
}
|
|
283
|
+
if (args.maxTurns !== undefined && !args.print) {
|
|
284
|
+
throw new UsageError("--max-turns 只用于 -p / --print");
|
|
285
|
+
}
|
|
286
|
+
if (args.noStdin && !args.print)
|
|
287
|
+
throw new UsageError("--no-stdin 只用于 -p / --print");
|
|
288
|
+
if (args.noStdin && args.stdin)
|
|
289
|
+
throw new UsageError("--no-stdin 与位置参数 - 不能同时使用");
|
|
290
|
+
if (args.stdin && !args.print) {
|
|
291
|
+
throw new UsageError("位置参数 - (从 stdin 读提示)只用于 -p / --print");
|
|
292
|
+
}
|
|
304
293
|
if (args.images.length > 0 && !args.print) {
|
|
305
294
|
throw new UsageError("--image 只用于 -p / --print(交互界面里写 @图片路径)");
|
|
306
295
|
}
|
|
@@ -318,7 +307,11 @@ export function parseArgs(argv) {
|
|
|
318
307
|
args.positionals.push(...argv.slice(i + 1));
|
|
319
308
|
break;
|
|
320
309
|
}
|
|
321
|
-
if (
|
|
310
|
+
if (token === "-") {
|
|
311
|
+
args.stdin = true;
|
|
312
|
+
continue;
|
|
313
|
+
}
|
|
314
|
+
if (!token.startsWith("-")) {
|
|
322
315
|
args.positionals.push(token);
|
|
323
316
|
continue;
|
|
324
317
|
}
|
package/dist/cli/bootstrap.js
CHANGED
|
@@ -20,8 +20,10 @@ import { HookDispatcher } from "../hooks/dispatcher.js";
|
|
|
20
20
|
import { AgentEventBus, createHostApi } from "../host/api-impl.js";
|
|
21
21
|
import { activateHost, disposeHost } from "../host/loader.js";
|
|
22
22
|
import { HELP_TEXT, parseArgs, UsageError } from "./args.js";
|
|
23
|
+
import { applyFromOption } from "./from-prompt.js";
|
|
23
24
|
import { ExitCode } from "./exit-codes.js";
|
|
24
25
|
import { applyProfile, applyToolFilters, decideMode, defaultSendUser, instructionSources, resolveModel, sessionRequestOf, sourceOf, step, thinkingOf, toStartupError, } from "./startup-steps.js";
|
|
26
|
+
import { resolveSystemPromptArg } from "./system-prompt-arg.js";
|
|
25
27
|
/** §11.1 第 3–14 步。 */
|
|
26
28
|
export async function bootstrap(argsIn, deps, io) {
|
|
27
29
|
const warnings = [];
|
|
@@ -118,6 +120,7 @@ export async function bootstrap(argsIn, deps, io) {
|
|
|
118
120
|
trusted: trust.trusted,
|
|
119
121
|
extraSkillDirs: [...args.skillDirs, ...(config.skills?.dirs ?? [])],
|
|
120
122
|
promptDirs: profile?.promptDirs ?? [],
|
|
123
|
+
dataDir: paths.dataDir,
|
|
121
124
|
}) ?? { skills: [], prompts: [], warnings: [] });
|
|
122
125
|
warnings.push(...discovered.warnings);
|
|
123
126
|
const hookConfig = await step(ExitCode.Config, "hooks.json", () => loadHookConfigs({
|
|
@@ -154,10 +157,15 @@ export async function bootstrap(argsIn, deps, io) {
|
|
|
154
157
|
}
|
|
155
158
|
: {}),
|
|
156
159
|
}));
|
|
157
|
-
const { model, provider } = await step(ExitCode.NoModel, "模型", () => resolveModel(args, providers, sessionManager, config.defaultModel, deps, interactive));
|
|
160
|
+
const { model, provider } = await step(ExitCode.NoModel, "模型", () => resolveModel(args, providers, sessionManager, config.defaultModel, deps, interactive, io.env));
|
|
158
161
|
const thinkingLevel = thinkingOf(args, sessionManager, config.thinkingLevel);
|
|
159
162
|
// 12. 工具注册表
|
|
160
|
-
const tools = await step(ExitCode.RuntimeError, "工具", () => deps.tools.create({
|
|
163
|
+
const tools = await step(ExitCode.RuntimeError, "工具", () => deps.tools.create({
|
|
164
|
+
config,
|
|
165
|
+
cwd: sessionCwd,
|
|
166
|
+
mode,
|
|
167
|
+
paths: { configDir: paths.configDir, dataDir: paths.dataDir },
|
|
168
|
+
}));
|
|
161
169
|
for (const name of config.tools?.disabled ?? []) {
|
|
162
170
|
if (tools.get(name) === undefined)
|
|
163
171
|
warn(`config tools.disabled:未知工具 ${name},已忽略`);
|
|
@@ -200,12 +208,14 @@ export async function bootstrap(argsIn, deps, io) {
|
|
|
200
208
|
// 14. 组装 AgentSession、session_start、SessionStart Hook
|
|
201
209
|
const unattended = mode === "print";
|
|
202
210
|
const builtinDeny = config.permission?.builtinDeny;
|
|
211
|
+
const autoSafeCommands = config.permission?.autoSafeCommands;
|
|
203
212
|
const permission = await step(ExitCode.Config, "权限", () => deps.permissions.create({
|
|
204
213
|
mode: config.permission?.mode ?? "default",
|
|
205
214
|
rules: merged.ruleSpecs,
|
|
206
215
|
unattended,
|
|
207
216
|
cwd: sessionCwd,
|
|
208
217
|
...(builtinDeny !== undefined ? { builtinDeny } : {}),
|
|
218
|
+
...(autoSafeCommands !== undefined ? { autoSafeCommands } : {}),
|
|
209
219
|
}));
|
|
210
220
|
const hooks = new HookDispatcher({
|
|
211
221
|
hooks: hookConfig.hooks,
|
|
@@ -260,6 +270,21 @@ export async function bootstrap(argsIn, deps, io) {
|
|
|
260
270
|
unattended,
|
|
261
271
|
warn,
|
|
262
272
|
};
|
|
273
|
+
const overrides = {};
|
|
274
|
+
if (args.maxTurns !== undefined)
|
|
275
|
+
overrides.maxTurns = args.maxTurns;
|
|
276
|
+
// [W5-H2] --max-cost 由 limits 扩展执行(agent/limits.ts)
|
|
277
|
+
if (args.maxCostUsd !== undefined)
|
|
278
|
+
overrides.maxCostUsd = args.maxCostUsd;
|
|
279
|
+
if (args.agentDirs !== undefined)
|
|
280
|
+
overrides.agentDirs = [...args.agentDirs];
|
|
281
|
+
if (args.noSession)
|
|
282
|
+
overrides.noSession = true;
|
|
283
|
+
const systemPrompt = await step(ExitCode.Config, "--system-prompt", () => resolveSystemPromptArg(args.systemPrompt, args.systemPromptMode, io.cwd));
|
|
284
|
+
if (systemPrompt !== undefined)
|
|
285
|
+
overrides.systemPrompt = systemPrompt;
|
|
286
|
+
if (Object.keys(overrides).length > 0)
|
|
287
|
+
assembly.overrides = overrides;
|
|
263
288
|
session = await step(ExitCode.RuntimeError, "会话组装", () => deps.session.create(assembly));
|
|
264
289
|
const active = session;
|
|
265
290
|
let disposed;
|
|
@@ -347,6 +372,10 @@ export async function runCli(argv, deps, io) {
|
|
|
347
372
|
io.stdout(HELP_TEXT);
|
|
348
373
|
return ExitCode.Ok;
|
|
349
374
|
}
|
|
375
|
+
// [W5-E] --mode acp:装配同 rpc(宿主看到的 mode 也是 rpc),分派到 ACP 服务端
|
|
376
|
+
const acp = args.mode === "acp";
|
|
377
|
+
if (acp)
|
|
378
|
+
args = { ...args, mode: "rpc" };
|
|
350
379
|
if (deps === undefined) {
|
|
351
380
|
io.stderr("ama: 运行时尚未装配(集成批次通过 registerRuntimeDeps 注入实现)\n");
|
|
352
381
|
return ExitCode.RuntimeError;
|
|
@@ -359,12 +388,18 @@ export async function runCli(argv, deps, io) {
|
|
|
359
388
|
return reportError(error, io);
|
|
360
389
|
}
|
|
361
390
|
const restore = runtime.mode === "print" || runtime.mode === "rpc" ? takeOverStdout() : () => undefined;
|
|
391
|
+
let cleanupFrom = () => undefined;
|
|
362
392
|
try {
|
|
363
393
|
if (runtime.mode !== "interactive")
|
|
364
394
|
for (const w of runtime.warnings)
|
|
365
395
|
io.stderr(`ama: 警告:${w}\n`);
|
|
366
|
-
|
|
367
|
-
const
|
|
396
|
+
// [W4-D] --from:旧会话的一条用户消息作提示(-p 时连图片,临时文件在 finally 删除)。
|
|
397
|
+
const from = applyFromOption(args, runtime, io);
|
|
398
|
+
cleanupFrom = from.cleanup;
|
|
399
|
+
const context = from.context;
|
|
400
|
+
const runner = acp
|
|
401
|
+
? (await import("../modes/acp/acp-mode.js")).runAcpMode
|
|
402
|
+
: deps.modes[runtime.mode];
|
|
368
403
|
if (runner === undefined)
|
|
369
404
|
throw new AmaError("not_implemented", `模式 ${runtime.mode} 尚未装配`, { exitCode: 1 });
|
|
370
405
|
try {
|
|
@@ -383,6 +418,7 @@ export async function runCli(argv, deps, io) {
|
|
|
383
418
|
}
|
|
384
419
|
finally {
|
|
385
420
|
await runtime.dispose("exit").catch(() => undefined);
|
|
421
|
+
cleanupFrom();
|
|
386
422
|
restore();
|
|
387
423
|
}
|
|
388
424
|
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* codemode 缺省关闭的一次性提示(设计 §5.5「默认开放」):`default` 预设跟随预设时只在沙箱 strict
|
|
3
|
+
* (Node ≥ 25,或有可用的操作系统沙箱,docs/sandbox.md)开 codemode;否则缺省关闭,启动时提示一次
|
|
4
|
+
* 怎么显式开启。
|
|
5
|
+
*
|
|
6
|
+
* - 只在「跟随预设」且预设是 `default`、运行时不是 strict 时提示;显式写了 `codemode.mode`(含 off)
|
|
7
|
+
* 不提示;
|
|
8
|
+
* - 每个配置目录只提示一次:已提示过的配置目录记在 `<数据目录>/notices.json`;读写失败不影响启动
|
|
9
|
+
* (至多多提示一次)。
|
|
10
|
+
*/
|
|
11
|
+
import type { SandboxCapability } from "../codemode/capability.js";
|
|
12
|
+
import type { AmaConfig } from "../config/types.js";
|
|
13
|
+
export declare const NOTICES_FILE = "notices.json";
|
|
14
|
+
export declare function codemodeNoticeText(capability: Pick<SandboxCapability, "nodeMajor">): string;
|
|
15
|
+
/** 需要提示时返回文案并记下(之后同一配置目录不再提示);不需要时 undefined。 */
|
|
16
|
+
export declare function takeCodemodeNotice(input: {
|
|
17
|
+
config: Pick<AmaConfig, "tools" | "codemode" | "sandbox">;
|
|
18
|
+
capability: Pick<SandboxCapability, "strict" | "nodeMajor">;
|
|
19
|
+
configDir: string;
|
|
20
|
+
dataDir: string;
|
|
21
|
+
}): string | undefined;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* codemode 缺省关闭的一次性提示(设计 §5.5「默认开放」):`default` 预设跟随预设时只在沙箱 strict
|
|
3
|
+
* (Node ≥ 25,或有可用的操作系统沙箱,docs/sandbox.md)开 codemode;否则缺省关闭,启动时提示一次
|
|
4
|
+
* 怎么显式开启。
|
|
5
|
+
*
|
|
6
|
+
* - 只在「跟随预设」且预设是 `default`、运行时不是 strict 时提示;显式写了 `codemode.mode`(含 off)
|
|
7
|
+
* 不提示;
|
|
8
|
+
* - 每个配置目录只提示一次:已提示过的配置目录记在 `<数据目录>/notices.json`;读写失败不影响启动
|
|
9
|
+
* (至多多提示一次)。
|
|
10
|
+
*/
|
|
11
|
+
import { mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
|
|
12
|
+
import { join } from "node:path";
|
|
13
|
+
import { resolveCodemodeMode } from "../tools/presets.js";
|
|
14
|
+
export const NOTICES_FILE = "notices.json";
|
|
15
|
+
const KEY = "codemodeNonStrictDefault";
|
|
16
|
+
function readNotices(path) {
|
|
17
|
+
try {
|
|
18
|
+
const value = JSON.parse(readFileSync(path, "utf8"));
|
|
19
|
+
if (typeof value === "object" && value !== null && !Array.isArray(value)) {
|
|
20
|
+
const shown = value[KEY];
|
|
21
|
+
return {
|
|
22
|
+
version: 1,
|
|
23
|
+
...(Array.isArray(shown) ? { [KEY]: shown.filter((s) => typeof s === "string") } : {}),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
// 不存在或损坏:按没提示过处理
|
|
29
|
+
}
|
|
30
|
+
return { version: 1 };
|
|
31
|
+
}
|
|
32
|
+
export function codemodeNoticeText(capability) {
|
|
33
|
+
return (`Node ${capability.nodeMajor} < 25 且没有可用的操作系统沙箱:codemode 沙箱的网络未隔离,codemode 缺省关闭;` +
|
|
34
|
+
"用 `--codemode on` 或 config 的 codemode.mode 开启(每个配置目录只提示一次)");
|
|
35
|
+
}
|
|
36
|
+
/** 需要提示时返回文案并记下(之后同一配置目录不再提示);不需要时 undefined。 */
|
|
37
|
+
export function takeCodemodeNotice(input) {
|
|
38
|
+
const resolved = resolveCodemodeMode(input.config, input.capability.strict);
|
|
39
|
+
if (resolved.source !== "preset" || resolved.preset !== "default" || input.capability.strict)
|
|
40
|
+
return undefined;
|
|
41
|
+
const path = join(input.dataDir, NOTICES_FILE);
|
|
42
|
+
const notices = readNotices(path);
|
|
43
|
+
const shown = notices[KEY] ?? [];
|
|
44
|
+
if (shown.includes(input.configDir))
|
|
45
|
+
return undefined;
|
|
46
|
+
try {
|
|
47
|
+
mkdirSync(input.dataDir, { recursive: true });
|
|
48
|
+
const tmp = `${path}.${process.pid}.tmp`;
|
|
49
|
+
writeFileSync(tmp, `${JSON.stringify({ ...notices, [KEY]: [...shown, input.configDir] })}\n`);
|
|
50
|
+
renameSync(tmp, path);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// 写不进去也照常提示
|
|
54
|
+
}
|
|
55
|
+
return codemodeNoticeText(input.capability);
|
|
56
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 子 Agent 的组装(docs/wave5-plan.md §7.1、§7.4,D22–D24)。[W5-G]
|
|
3
|
+
*
|
|
4
|
+
* 由 compose-extensions.ts 的一行接入:每次装配会话时发现定义文件(`--agent-dir` / profile
|
|
5
|
+
* `agentDirs` → config `agents.dirs` → 用户级 → 项目级(需信任)),建类型目录并绑到 task 工具
|
|
6
|
+
* (描述里的类型清单);工厂给每个根会话装一个扩展:建任务注册表(subagent-registry.ts,并发 /
|
|
7
|
+
* 排队上限与模型别名取自 config),`getStats().tasks` 汇总,会话 dispose 时停止后台任务。
|
|
8
|
+
* task 子会话(depth ≥ 1)与没有 task 工具的会话不装。
|
|
9
|
+
*
|
|
10
|
+
* [W5-EG] 外部 runner(claude / codex / acp:* / 宿主注入)经 agents/external.ts 接入 `runners`:每个主
|
|
11
|
+
* 会话一个 ExternalAgents(审批接 requestApproval,只交给人);PATH 上的 claude / codex 登记进类型
|
|
12
|
+
* 目录;嵌入宿主(有宿主适配器)时 ama 不自己 spawn 外部 Agent、也不登记(D17),只认
|
|
13
|
+
* `HostApi.runners.provide` 注入的。`/agents` / RPC `get_agents` 的外部探测在会话建立时异步缓存。
|
|
14
|
+
*/
|
|
15
|
+
import { type SubagentEnvironment } from "../agent/subagent-registry.js";
|
|
16
|
+
import type { SessionCore } from "../agent/session-core.js";
|
|
17
|
+
import type { SessionExtension, SessionExtensionFactory } from "../agent/session-extensions.js";
|
|
18
|
+
import { AgentCatalog } from "../agents/catalog.js";
|
|
19
|
+
import { type ExternalWiring } from "../agents/external.js";
|
|
20
|
+
import type { ComposeExtensionDeps } from "./compose-extensions.js";
|
|
21
|
+
export declare function loadAgentCatalog(deps: ComposeExtensionDeps): AgentCatalog;
|
|
22
|
+
export declare function subagentEnvironment(deps: ComposeExtensionDeps, catalog: AgentCatalog): SubagentEnvironment;
|
|
23
|
+
/** 外部 Agent 的装配材料(宿主、信任、探测开关取自装配材料与环境)。 */
|
|
24
|
+
export declare function externalWiring(deps: ComposeExtensionDeps): ExternalWiring;
|
|
25
|
+
/** 根会话的子 Agent 扩展:注册表、任务统计、dispose 时停止后台任务。 */
|
|
26
|
+
export declare function createSubagentExtension(core: SessionCore, env: SubagentEnvironment, wiring?: ExternalWiring): SessionExtension;
|
|
27
|
+
export declare function createSubagentsFactory(deps: ComposeExtensionDeps): SessionExtensionFactory;
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 子 Agent 的组装(docs/wave5-plan.md §7.1、§7.4,D22–D24)。[W5-G]
|
|
3
|
+
*
|
|
4
|
+
* 由 compose-extensions.ts 的一行接入:每次装配会话时发现定义文件(`--agent-dir` / profile
|
|
5
|
+
* `agentDirs` → config `agents.dirs` → 用户级 → 项目级(需信任)),建类型目录并绑到 task 工具
|
|
6
|
+
* (描述里的类型清单);工厂给每个根会话装一个扩展:建任务注册表(subagent-registry.ts,并发 /
|
|
7
|
+
* 排队上限与模型别名取自 config),`getStats().tasks` 汇总,会话 dispose 时停止后台任务。
|
|
8
|
+
* task 子会话(depth ≥ 1)与没有 task 工具的会话不装。
|
|
9
|
+
*
|
|
10
|
+
* [W5-EG] 外部 runner(claude / codex / acp:* / 宿主注入)经 agents/external.ts 接入 `runners`:每个主
|
|
11
|
+
* 会话一个 ExternalAgents(审批接 requestApproval,只交给人);PATH 上的 claude / codex 登记进类型
|
|
12
|
+
* 目录;嵌入宿主(有宿主适配器)时 ama 不自己 spawn 外部 Agent、也不登记(D17),只认
|
|
13
|
+
* `HostApi.runners.provide` 注入的。`/agents` / RPC `get_agents` 的外部探测在会话建立时异步缓存。
|
|
14
|
+
*/
|
|
15
|
+
import { subagentRegistryFor } from "../agent/subagent-registry.js";
|
|
16
|
+
import { AgentCatalog } from "../agents/catalog.js";
|
|
17
|
+
import { agentSources, discoverAgents } from "../agents/discover.js";
|
|
18
|
+
import { NO_AGENT_PROBE_ENV, SessionExternalAgents, registerExternalAgents, } from "../agents/external.js";
|
|
19
|
+
import { hostRunnersOf } from "../host/api-impl.js";
|
|
20
|
+
import { bindTaskAgents } from "../tools/task.js";
|
|
21
|
+
/** 同一装配材料只提示一次(`/new` 等会重新装配会话)。 */
|
|
22
|
+
const warned = new WeakSet();
|
|
23
|
+
export function loadAgentCatalog(deps) {
|
|
24
|
+
const { assembly } = deps;
|
|
25
|
+
const found = discoverAgents(agentSources({
|
|
26
|
+
cwd: assembly.paths.cwd,
|
|
27
|
+
configDir: assembly.paths.configDir,
|
|
28
|
+
cliDirs: assembly.overrides?.agentDirs ?? [],
|
|
29
|
+
configDirs: assembly.config.agents?.dirs ?? [],
|
|
30
|
+
}), { trusted: assembly.trust.trusted });
|
|
31
|
+
if (!warned.has(assembly)) {
|
|
32
|
+
warned.add(assembly);
|
|
33
|
+
for (const warning of found.warnings)
|
|
34
|
+
assembly.warn(warning);
|
|
35
|
+
for (const dir of found.skippedUntrusted)
|
|
36
|
+
assembly.warn(`项目未信任,跳过子 Agent 定义目录 ${dir}(--trust 后生效)`);
|
|
37
|
+
}
|
|
38
|
+
return new AgentCatalog(found.agents);
|
|
39
|
+
}
|
|
40
|
+
export function subagentEnvironment(deps, catalog) {
|
|
41
|
+
const config = deps.assembly.config;
|
|
42
|
+
const env = {
|
|
43
|
+
catalog,
|
|
44
|
+
modelConfig: {
|
|
45
|
+
...(config.agents === undefined ? {} : { agents: config.agents }),
|
|
46
|
+
...(config.subagents === undefined ? {} : { subagents: config.subagents }),
|
|
47
|
+
...(config.models === undefined ? {} : { models: config.models }),
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
const max = config.subagents?.maxConcurrent;
|
|
51
|
+
if (max !== undefined)
|
|
52
|
+
env.maxConcurrent = max;
|
|
53
|
+
const pending = config.subagents?.maxPending;
|
|
54
|
+
if (pending !== undefined)
|
|
55
|
+
env.maxPending = pending;
|
|
56
|
+
return env;
|
|
57
|
+
}
|
|
58
|
+
/** 外部 Agent 的装配材料(宿主、信任、探测开关取自装配材料与环境)。 */
|
|
59
|
+
export function externalWiring(deps) {
|
|
60
|
+
const { assembly } = deps;
|
|
61
|
+
const api = assembly.host.handle?.api;
|
|
62
|
+
const hostRunners = api === undefined ? undefined : hostRunnersOf(api);
|
|
63
|
+
const config = assembly.config;
|
|
64
|
+
const wiring = {
|
|
65
|
+
env: deps.env,
|
|
66
|
+
hosted: assembly.host.handle !== undefined,
|
|
67
|
+
dataDir: assembly.paths.dataDir,
|
|
68
|
+
trusted: assembly.trust.trusted,
|
|
69
|
+
probe: deps.env[NO_AGENT_PROBE_ENV] !== "1",
|
|
70
|
+
};
|
|
71
|
+
if (hostRunners !== undefined)
|
|
72
|
+
wiring.hostRunners = hostRunners;
|
|
73
|
+
if (config.agents !== undefined)
|
|
74
|
+
wiring.config = config.agents;
|
|
75
|
+
const defaultModel = config.subagents?.defaultModel;
|
|
76
|
+
if (defaultModel !== undefined)
|
|
77
|
+
wiring.defaultModel = defaultModel;
|
|
78
|
+
return wiring;
|
|
79
|
+
}
|
|
80
|
+
/** 根会话的子 Agent 扩展:注册表、任务统计、dispose 时停止后台任务。 */
|
|
81
|
+
export function createSubagentExtension(core, env, wiring) {
|
|
82
|
+
const external = wiring === undefined ? undefined : new SessionExternalAgents(core, wiring, env.catalog);
|
|
83
|
+
const registry = subagentRegistryFor(core, external === undefined ? env : { ...env, runners: (agent) => external.runner(agent) });
|
|
84
|
+
// RPC get_agents / `/agents` 的外部探测(异步,结果缓存);-p 不需要
|
|
85
|
+
if (external !== undefined && core.options.unattended !== true)
|
|
86
|
+
void external.refreshInfos();
|
|
87
|
+
return {
|
|
88
|
+
id: "ama.subagents",
|
|
89
|
+
contributeStats(stats) {
|
|
90
|
+
const tasks = registry.stats();
|
|
91
|
+
if (tasks !== undefined)
|
|
92
|
+
stats.tasks = tasks;
|
|
93
|
+
},
|
|
94
|
+
dispose() {
|
|
95
|
+
registry.dispose();
|
|
96
|
+
external?.dispose();
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
export function createSubagentsFactory(deps) {
|
|
101
|
+
// 组装表的单元测试给的是不完整的装配材料
|
|
102
|
+
const task = deps.assembly.tools?.get?.("task");
|
|
103
|
+
if (task === undefined)
|
|
104
|
+
return () => undefined;
|
|
105
|
+
const catalog = loadAgentCatalog(deps);
|
|
106
|
+
const wiring = externalWiring(deps);
|
|
107
|
+
registerExternalAgents(catalog, wiring);
|
|
108
|
+
bindTaskAgents(task, catalog);
|
|
109
|
+
const env = subagentEnvironment(deps, catalog);
|
|
110
|
+
return ({ core }) => (core.depth > 0 ? undefined : createSubagentExtension(core, env, wiring));
|
|
111
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 会话扩展的组装表(docs/wave5-plan.md §10.1,D30)。[W5-C0]
|
|
3
|
+
*
|
|
4
|
+
* 唯一允许多个批次各加一行的文件:每个批次在 `composeExtensions` 的数组里追加**一行**自己的工厂,
|
|
5
|
+
* 实现放在各自文件(`src/agent/session-<名>.ts` 等)。表顺序即调用顺序:
|
|
6
|
+
* - `beforePrompts`:靠前的先追加(plan 模式说明排在提醒之前);
|
|
7
|
+
* - `wrapStream`:靠前的离协议层近,缓存控制器始终在最外层;
|
|
8
|
+
* - 其余钩子按表顺序。
|
|
9
|
+
*
|
|
10
|
+
* 写法(工厂每个会话实例各调一次;不想装进 task 子会话就按 depth 返回 undefined):
|
|
11
|
+
*
|
|
12
|
+
* ```ts
|
|
13
|
+
* // src/agent/session-telemetry.ts [W5-A]
|
|
14
|
+
* export function createTelemetryExtension(deps: { now?(): number }): SessionExtension { … }
|
|
15
|
+
* // 本文件,数组里加一行:
|
|
16
|
+
* ({ core }) => (core.depth > 0 ? undefined : createTelemetryExtension({})),
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* 配置从 `deps.assembly.config` 读(键与校验已在 config/schema-w5.ts,C0 统一加好)。
|
|
20
|
+
*/
|
|
21
|
+
import type { SessionExtensionFactory } from "../agent/session-extensions.js";
|
|
22
|
+
import type { SessionAssembly } from "./deps.js";
|
|
23
|
+
export interface ComposeExtensionDeps {
|
|
24
|
+
/** 第 14 步的装配材料:config、paths、mode、unattended、host、overrides 等。 */
|
|
25
|
+
readonly assembly: SessionAssembly;
|
|
26
|
+
readonly env: NodeJS.ProcessEnv;
|
|
27
|
+
log(level: "debug" | "info" | "warn" | "error", message: string): void;
|
|
28
|
+
}
|
|
29
|
+
export declare function composeExtensions(deps: ComposeExtensionDeps): SessionExtensionFactory[];
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 会话扩展的组装表(docs/wave5-plan.md §10.1,D30)。[W5-C0]
|
|
3
|
+
*
|
|
4
|
+
* 唯一允许多个批次各加一行的文件:每个批次在 `composeExtensions` 的数组里追加**一行**自己的工厂,
|
|
5
|
+
* 实现放在各自文件(`src/agent/session-<名>.ts` 等)。表顺序即调用顺序:
|
|
6
|
+
* - `beforePrompts`:靠前的先追加(plan 模式说明排在提醒之前);
|
|
7
|
+
* - `wrapStream`:靠前的离协议层近,缓存控制器始终在最外层;
|
|
8
|
+
* - 其余钩子按表顺序。
|
|
9
|
+
*
|
|
10
|
+
* 写法(工厂每个会话实例各调一次;不想装进 task 子会话就按 depth 返回 undefined):
|
|
11
|
+
*
|
|
12
|
+
* ```ts
|
|
13
|
+
* // src/agent/session-telemetry.ts [W5-A]
|
|
14
|
+
* export function createTelemetryExtension(deps: { now?(): number }): SessionExtension { … }
|
|
15
|
+
* // 本文件,数组里加一行:
|
|
16
|
+
* ({ core }) => (core.depth > 0 ? undefined : createTelemetryExtension({})),
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* 配置从 `deps.assembly.config` 读(键与校验已在 config/schema-w5.ts,C0 统一加好)。
|
|
20
|
+
*/
|
|
21
|
+
import { telemetryFactory } from "../agent/session-telemetry.js";
|
|
22
|
+
import { createImageBudgetExtension } from "../agent/session-images.js";
|
|
23
|
+
import { createLimitsExtension } from "../agent/limits.js";
|
|
24
|
+
import { createRemindersExtension, remindersSettings } from "../agent/reminders.js";
|
|
25
|
+
import { planExtensionFor } from "../plan/compose.js";
|
|
26
|
+
import { createSubagentsFactory } from "./compose-agents.js";
|
|
27
|
+
import { createExternalStatsExtension } from "../drivers/store.js";
|
|
28
|
+
export function composeExtensions(deps) {
|
|
29
|
+
return [
|
|
30
|
+
// 各批次在下面约定的位置各加一行(顺序有意义,见文件头):
|
|
31
|
+
// [W5-F] createPlanExtension(...)
|
|
32
|
+
planExtensionFor(deps),
|
|
33
|
+
// [W5-H2] createRemindersExtension(...), createLimitsExtension(...)
|
|
34
|
+
({ core }) => (core.depth > 0 ? undefined : createLimitsExtension(core, core.options.limits)),
|
|
35
|
+
({ core }) => createRemindersExtension(core, remindersSettings(deps.assembly.config)),
|
|
36
|
+
// [W5-I] createImageBudgetExtension(...)
|
|
37
|
+
({ core }) => createImageBudgetExtension(core),
|
|
38
|
+
// [W5-A] createTelemetryExtension(...)
|
|
39
|
+
telemetryFactory(deps.assembly.config.ui),
|
|
40
|
+
// [W5-E] 外部 Agent 记账 → SessionStats.external(只主会话)
|
|
41
|
+
({ core }) => core.depth > 0 ? undefined : createExternalStatsExtension(() => core.manager.branch()),
|
|
42
|
+
createSubagentsFactory(deps), // [W5-G] 子 Agent 任务注册表
|
|
43
|
+
];
|
|
44
|
+
}
|