@armadra/agent 0.4.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 +174 -1
- package/README.md +201 -82
- 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/session-cache.d.ts +5 -0
- package/dist/agent/session-cache.js +17 -1
- package/dist/agent/session-classifier.d.ts +1 -1
- package/dist/agent/session-classifier.js +3 -1
- package/dist/agent/session-compaction.d.ts +35 -6
- package/dist/agent/session-compaction.js +157 -31
- package/dist/agent/session-core.d.ts +27 -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 +40 -1
- package/dist/agent/session.d.ts +30 -29
- package/dist/agent/session.js +79 -123
- 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 +57 -4
- package/dist/agent/types-w5.d.ts +192 -0
- package/dist/agent/types-w5.js +10 -0
- package/dist/agent/types.d.ts +47 -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-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/openai-compat.d.ts +4 -1
- package/dist/ai/apis/openai-compat.js +8 -1
- 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 +20 -10
- package/dist/ai/providers/registry.js +82 -43
- package/dist/ai/types.d.ts +28 -2
- package/dist/ai/types.js +5 -0
- package/dist/bundle/ama.cjs +36203 -20499
- 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 +8 -4
- package/dist/cli/args.js +17 -97
- package/dist/cli/bootstrap.js +13 -1
- package/dist/cli/codemode-notice.d.ts +3 -2
- package/dist/cli/codemode-notice.js +3 -2
- 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 +3 -0
- package/dist/cli/compose-session.js +47 -4
- package/dist/cli/compose.d.ts +3 -0
- package/dist/cli/compose.js +33 -6
- package/dist/cli/deps.d.ts +6 -0
- package/dist/cli/exit-codes.d.ts +10 -0
- package/dist/cli/exit-codes.js +12 -0
- package/dist/cli/help-text.d.ts +4 -0
- package/dist/cli/help-text.js +102 -0
- package/dist/cli/startup-screen.js +5 -3
- package/dist/cli/startup-steps.js +7 -1
- package/dist/cli/subcommands/config.d.ts +4 -1
- package/dist/cli/subcommands/config.js +17 -6
- package/dist/cli/subcommands/doctor.js +21 -0
- package/dist/cli/subcommands/models-discover.js +5 -6
- package/dist/cli/subcommands/models.d.ts +2 -0
- package/dist/cli/subcommands/models.js +33 -14
- package/dist/cli/subcommands/providers.js +5 -6
- package/dist/cli/subcommands/sessions.d.ts +3 -1
- package/dist/cli/subcommands/sessions.js +36 -2
- 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/tool.d.ts +1 -1
- package/dist/codemode/tool.js +6 -4
- 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/json-schema.js +63 -2
- package/dist/config/key-docs.js +72 -3
- package/dist/config/merge.d.ts +5 -3
- package/dist/config/merge.js +81 -7
- 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 +68 -114
- package/dist/config/types-w5.d.ts +118 -0
- package/dist/config/types-w5.js +20 -0
- package/dist/config/types.d.ts +50 -1
- package/dist/config/types.js +12 -0
- 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 +55 -0
- 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 +21 -4
- package/dist/modes/interactive/approval-dialog.js +98 -20
- 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 +9 -1
- package/dist/modes/interactive/commands.js +19 -0
- 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 +14 -1
- package/dist/modes/interactive/interactive-mode.js +134 -136
- package/dist/modes/interactive/key-dispatch.d.ts +16 -2
- package/dist/modes/interactive/key-dispatch.js +49 -1
- package/dist/modes/interactive/line/line-mode.d.ts +2 -1
- package/dist/modes/interactive/line/line-mode.js +22 -5
- package/dist/modes/interactive/line/line-render.d.ts +2 -1
- package/dist/modes/interactive/line/line-render.js +40 -4
- package/dist/modes/interactive/message-view.d.ts +1 -1
- package/dist/modes/interactive/message-view.js +24 -2
- package/dist/modes/interactive/panels.d.ts +18 -1
- package/dist/modes/interactive/panels.js +19 -5
- 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/session-events.d.ts +24 -0
- package/dist/modes/interactive/session-events.js +96 -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 +99 -11
- package/dist/modes/interactive/status-bar.js +273 -90
- 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-view.d.ts +12 -2
- package/dist/modes/interactive/tool-view.js +34 -4
- package/dist/modes/print/print-mode.d.ts +13 -4
- package/dist/modes/print/print-mode.js +56 -12
- package/dist/modes/rpc/commands.d.ts +9 -0
- package/dist/modes/rpc/commands.js +44 -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 +5 -0
- package/dist/permissions/auto-safe.js +18 -0
- package/dist/permissions/classifier.d.ts +4 -0
- package/dist/permissions/classifier.js +2 -0
- package/dist/permissions/modes.js +1 -1
- package/dist/permissions/pipeline.d.ts +43 -4
- package/dist/permissions/pipeline.js +114 -9
- package/dist/permissions/readonly-bash.d.ts +30 -0
- package/dist/permissions/readonly-bash.js +118 -0
- package/dist/permissions/types.d.ts +42 -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 +33 -2
- package/dist/sdk.js +24 -2
- 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 +7 -2
- package/dist/tools/presets.js +11 -4
- 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/glyphs.d.ts +4 -0
- package/dist/tui/glyphs.js +4 -0
- package/dist/tui/keybindings.d.ts +5 -0
- package/dist/tui/keybindings.js +5 -0
- package/docs/acp.md +78 -0
- package/docs/agents.md +250 -0
- package/docs/codemode.md +12 -8
- package/docs/hooks.md +26 -22
- package/docs/permissions.md +77 -13
- package/docs/plan.md +107 -0
- package/docs/providers.md +228 -52
- package/docs/rewind-plan.md +181 -0
- package/docs/rpc.md +92 -5
- package/docs/sandbox.md +215 -0
- package/docs/session-format.md +41 -21
- package/docs/sessions.md +41 -1
- package/docs/tui-design.md +751 -0
- package/docs/tui.md +125 -6
- package/package.json +13 -2
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 外部 Agent 驱动契约(docs/wave5-plan.md §5.1–§5.3,D14)。[W5-C0] 契约文件,实现归 W5-E。
|
|
3
|
+
*
|
|
4
|
+
* 内部词汇 = ACP v1 子集:各家原生协议(Claude stream-json、Codex app-server、一次性打印模式)
|
|
5
|
+
* 都映射成 `DriverEvent`;权限请求以 `DriverPermissionRequest` 交给 ama 的 broker 链——**只交给人,
|
|
6
|
+
* 不代答**(auto 分类器与模型都不参与)。`ProcessRunner`(drivers/runner.ts)把 `AgentDriver`
|
|
7
|
+
* 适配成 `SubagentRunner`,于是外部 Agent 与 ama 子 Agent 共用 `task(agent=…)` 入口。
|
|
8
|
+
*
|
|
9
|
+
* 本目录只依赖 agent / permissions / tools 的类型(零运行时依赖)。
|
|
10
|
+
*/
|
|
11
|
+
import type { ContentBlock } from "../ai/types.js";
|
|
12
|
+
import type { ExternalPermissionOrigin, PermissionMode } from "../permissions/types.js";
|
|
13
|
+
export interface DriverCapabilities {
|
|
14
|
+
resume: "resume" | "load" | "none";
|
|
15
|
+
list: boolean;
|
|
16
|
+
/** `unreliable`:有审批通道但不保证每次都走(只在 plan 或只读任务下用)。 */
|
|
17
|
+
permissions: "interactive" | "none" | "unreliable";
|
|
18
|
+
steer: boolean;
|
|
19
|
+
modes: readonly PermissionMode[];
|
|
20
|
+
usage: "tokens" | "usd" | "requests" | "none";
|
|
21
|
+
images: boolean;
|
|
22
|
+
}
|
|
23
|
+
export type DriverKind = "acp" | "acp-adapter" | "claude-stream" | "codex-app-server" | "oneshot" | "host";
|
|
24
|
+
export interface DriverProbe {
|
|
25
|
+
installed: boolean;
|
|
26
|
+
version?: string;
|
|
27
|
+
capabilities: DriverCapabilities;
|
|
28
|
+
}
|
|
29
|
+
export interface DriverOpenOptions {
|
|
30
|
+
cwd: string;
|
|
31
|
+
/** 不得比 ama 当前模式宽(`agents.<id>.maxMode` 显式放宽除外)。 */
|
|
32
|
+
mode: PermissionMode;
|
|
33
|
+
model?: string;
|
|
34
|
+
/** 外部 CLI 自己的会话 id。 */
|
|
35
|
+
resume?: string;
|
|
36
|
+
/** 已按 D16 清理的子进程环境(drivers/env.ts)。 */
|
|
37
|
+
env: NodeJS.ProcessEnv;
|
|
38
|
+
signal: AbortSignal;
|
|
39
|
+
/**
|
|
40
|
+
* [W5-E] 美元预算:能透传的驱动透传(Claude `--max-budget-usd`);其余由 ProcessRunner 按用量
|
|
41
|
+
* 累计、超限 cancel。
|
|
42
|
+
*/
|
|
43
|
+
budgetUsd?: number;
|
|
44
|
+
/** [W5-E] 无人值守(没有人能回答审批):Claude 以 `--permission-prompts none` 启动。 */
|
|
45
|
+
unattended?: boolean;
|
|
46
|
+
}
|
|
47
|
+
export interface AgentDriver {
|
|
48
|
+
readonly agentId: string;
|
|
49
|
+
readonly kind: DriverKind;
|
|
50
|
+
probe(): Promise<DriverProbe>;
|
|
51
|
+
open(options: DriverOpenOptions): Promise<DriverSession>;
|
|
52
|
+
}
|
|
53
|
+
/** ACP ToolKind。 */
|
|
54
|
+
export type AcpToolKind = "read" | "edit" | "delete" | "move" | "search" | "execute" | "think" | "fetch" | "switch_mode" | "other";
|
|
55
|
+
export type DriverEvent = {
|
|
56
|
+
type: "message_delta";
|
|
57
|
+
text: string;
|
|
58
|
+
} | {
|
|
59
|
+
type: "thought_delta";
|
|
60
|
+
text: string;
|
|
61
|
+
} | {
|
|
62
|
+
type: "tool_call";
|
|
63
|
+
id: string;
|
|
64
|
+
title: string;
|
|
65
|
+
kind: AcpToolKind;
|
|
66
|
+
status: "pending" | "in_progress" | "completed" | "failed";
|
|
67
|
+
locations?: string[];
|
|
68
|
+
} | {
|
|
69
|
+
type: "plan";
|
|
70
|
+
entries: {
|
|
71
|
+
content: string;
|
|
72
|
+
status: string;
|
|
73
|
+
}[];
|
|
74
|
+
} | {
|
|
75
|
+
type: "usage";
|
|
76
|
+
input?: number;
|
|
77
|
+
output?: number;
|
|
78
|
+
cacheRead?: number;
|
|
79
|
+
costUsd?: number;
|
|
80
|
+
contextTokens?: number;
|
|
81
|
+
contextWindow?: number;
|
|
82
|
+
} | {
|
|
83
|
+
type: "notice";
|
|
84
|
+
level: "info" | "warn";
|
|
85
|
+
text: string;
|
|
86
|
+
};
|
|
87
|
+
/** 外部 Agent 的权限请求 = 审批上下文里的 `origin`(会话 id 与 agent 由驱动填)。 */
|
|
88
|
+
export type DriverPermissionRequest = Omit<ExternalPermissionOrigin, "agent" | "sessionId">;
|
|
89
|
+
/** 人选了某个选项,或请求被取消(父 abort、`task_ctl stop`、超时、无人值守下的提问类请求)。 */
|
|
90
|
+
export type DriverPermissionOutcome = {
|
|
91
|
+
outcome: "selected";
|
|
92
|
+
optionId: string;
|
|
93
|
+
} | {
|
|
94
|
+
outcome: "cancelled";
|
|
95
|
+
};
|
|
96
|
+
export interface DriverTurnResult {
|
|
97
|
+
stopReason: "end_turn" | "max_tokens" | "max_turn_requests" | "refusal" | "cancelled";
|
|
98
|
+
finalText: string;
|
|
99
|
+
usage?: {
|
|
100
|
+
input?: number;
|
|
101
|
+
output?: number;
|
|
102
|
+
cacheRead?: number;
|
|
103
|
+
costUsd?: number;
|
|
104
|
+
};
|
|
105
|
+
filesTouched: string[];
|
|
106
|
+
/** ≤ 20 行。 */
|
|
107
|
+
toolSummary: string[];
|
|
108
|
+
}
|
|
109
|
+
export interface DriverPromptHooks {
|
|
110
|
+
onEvent(event: DriverEvent): void;
|
|
111
|
+
onPermission(request: DriverPermissionRequest, signal: AbortSignal): Promise<DriverPermissionOutcome>;
|
|
112
|
+
}
|
|
113
|
+
export interface DriverSession {
|
|
114
|
+
/** 一律存 CLI 自己的 id。 */
|
|
115
|
+
readonly sessionId: string;
|
|
116
|
+
prompt(content: ContentBlock[], hooks: DriverPromptHooks): Promise<DriverTurnResult>;
|
|
117
|
+
steer?(content: ContentBlock[]): Promise<void>;
|
|
118
|
+
/** 协议级中断;15 s 无回合结束 → 关 stdin → SIGTERM 进程树。 */
|
|
119
|
+
cancel(): Promise<void>;
|
|
120
|
+
/** 挂起审批统一回 cancelled。 */
|
|
121
|
+
close(): Promise<void>;
|
|
122
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 外部 Agent 驱动契约(docs/wave5-plan.md §5.1–§5.3,D14)。[W5-C0] 契约文件,实现归 W5-E。
|
|
3
|
+
*
|
|
4
|
+
* 内部词汇 = ACP v1 子集:各家原生协议(Claude stream-json、Codex app-server、一次性打印模式)
|
|
5
|
+
* 都映射成 `DriverEvent`;权限请求以 `DriverPermissionRequest` 交给 ama 的 broker 链——**只交给人,
|
|
6
|
+
* 不代答**(auto 分类器与模型都不参与)。`ProcessRunner`(drivers/runner.ts)把 `AgentDriver`
|
|
7
|
+
* 适配成 `SubagentRunner`,于是外部 Agent 与 ama 子 Agent 共用 `task(agent=…)` 入口。
|
|
8
|
+
*
|
|
9
|
+
* 本目录只依赖 agent / permissions / tools 的类型(零运行时依赖)。
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 状态行的 git 信息(docs/wave5-plan.md §1.3)。[W5-A]
|
|
3
|
+
*
|
|
4
|
+
* - 分支与短提交零依赖读 `.git/HEAD`(`checkpoints/git-head.ts`,worktree / 子模块的 gitdir 文件、
|
|
5
|
+
* packed-refs 都认);detached 时没有分支只显示短提交;还没有提交的分支只显示分支名。
|
|
6
|
+
* - 工作区增删行:`git diff --numstat HEAD`(含暂存,不含未跟踪文件)后台子进程,环境加
|
|
7
|
+
* `GIT_OPTIONAL_LOCKS=0`;两次之间 ≥ `minIntervalMs`(缺省 10 s),超过 `timeoutMs`(缺省 2 s)或
|
|
8
|
+
* 非零退出 / 起不来就省略增删项,并在本实例(本会话)停用 numstat,HEAD 仍照常显示。
|
|
9
|
+
* `AMA_STATUS_GIT=0` 直接关闭 numstat(排错用)。
|
|
10
|
+
* - 非 git 目录 `current()` 为 undefined(状态行整段省略)。
|
|
11
|
+
* - `refresh()` 在回合边界调用(agent_settled、写类工具结束、回滚、/tree),只发起读取、不阻塞;
|
|
12
|
+
* 结果有变化时通知 `onChange` 的监听者。
|
|
13
|
+
*/
|
|
14
|
+
export interface GitInfo {
|
|
15
|
+
/** detached 时 undefined,显示短提交。 */
|
|
16
|
+
branch?: string;
|
|
17
|
+
/** 7 位;还没有提交时 undefined。 */
|
|
18
|
+
shortHead?: string;
|
|
19
|
+
/** 工作区(含暂存)相对 HEAD;拿不到为 undefined。 */
|
|
20
|
+
insertions?: number;
|
|
21
|
+
deletions?: number;
|
|
22
|
+
}
|
|
23
|
+
/** numstat 子进程的最小接口(测试注入)。 */
|
|
24
|
+
export interface NumstatProcess {
|
|
25
|
+
stdout: NodeJS.ReadableStream | null;
|
|
26
|
+
on(event: "close", listener: (code: number | null) => void): unknown;
|
|
27
|
+
on(event: "error", listener: (error: Error) => void): unknown;
|
|
28
|
+
kill(signal?: NodeJS.Signals): unknown;
|
|
29
|
+
}
|
|
30
|
+
export type NumstatSpawn = (command: string, args: readonly string[], options: {
|
|
31
|
+
cwd: string;
|
|
32
|
+
env: NodeJS.ProcessEnv;
|
|
33
|
+
}) => NumstatProcess;
|
|
34
|
+
export interface GitInfoDeps {
|
|
35
|
+
spawn?: NumstatSpawn;
|
|
36
|
+
now?(): number;
|
|
37
|
+
minIntervalMs?: number;
|
|
38
|
+
timeoutMs?: number;
|
|
39
|
+
env?: NodeJS.ProcessEnv;
|
|
40
|
+
}
|
|
41
|
+
export declare const GIT_NUMSTAT_INTERVAL_MS = 10000;
|
|
42
|
+
export declare const GIT_NUMSTAT_TIMEOUT_MS = 2000;
|
|
43
|
+
/** 解析 `git diff --numstat` 输出(二进制文件的 `-\t-` 跳过)。 */
|
|
44
|
+
export declare function parseNumstat(text: string): {
|
|
45
|
+
insertions: number;
|
|
46
|
+
deletions: number;
|
|
47
|
+
};
|
|
48
|
+
export declare class GitInfoWatcher {
|
|
49
|
+
private readonly cwd;
|
|
50
|
+
private info;
|
|
51
|
+
private readonly listeners;
|
|
52
|
+
private readonly spawn;
|
|
53
|
+
private readonly now;
|
|
54
|
+
private readonly minIntervalMs;
|
|
55
|
+
private readonly timeoutMs;
|
|
56
|
+
private readonly env;
|
|
57
|
+
private numstatDisabled;
|
|
58
|
+
private lastNumstatAt;
|
|
59
|
+
private numstatRunning;
|
|
60
|
+
private headReading;
|
|
61
|
+
private headAgain;
|
|
62
|
+
private disposed;
|
|
63
|
+
private diff;
|
|
64
|
+
constructor(cwd: string, deps?: GitInfoDeps);
|
|
65
|
+
current(): GitInfo | undefined;
|
|
66
|
+
/** numstat 已因超时 / 失败 / 环境变量停用。 */
|
|
67
|
+
get numstatEnabled(): boolean;
|
|
68
|
+
onChange(listener: () => void): () => void;
|
|
69
|
+
/** 回合边界调用:重读 HEAD;距上次 numstat ≥ minInterval 则后台起一次。返回本次读取完成的 Promise(测试用)。 */
|
|
70
|
+
refresh(): Promise<void>;
|
|
71
|
+
dispose(): void;
|
|
72
|
+
private update;
|
|
73
|
+
private maybeNumstat;
|
|
74
|
+
private numstat;
|
|
75
|
+
}
|
package/dist/git/info.js
ADDED
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 状态行的 git 信息(docs/wave5-plan.md §1.3)。[W5-A]
|
|
3
|
+
*
|
|
4
|
+
* - 分支与短提交零依赖读 `.git/HEAD`(`checkpoints/git-head.ts`,worktree / 子模块的 gitdir 文件、
|
|
5
|
+
* packed-refs 都认);detached 时没有分支只显示短提交;还没有提交的分支只显示分支名。
|
|
6
|
+
* - 工作区增删行:`git diff --numstat HEAD`(含暂存,不含未跟踪文件)后台子进程,环境加
|
|
7
|
+
* `GIT_OPTIONAL_LOCKS=0`;两次之间 ≥ `minIntervalMs`(缺省 10 s),超过 `timeoutMs`(缺省 2 s)或
|
|
8
|
+
* 非零退出 / 起不来就省略增删项,并在本实例(本会话)停用 numstat,HEAD 仍照常显示。
|
|
9
|
+
* `AMA_STATUS_GIT=0` 直接关闭 numstat(排错用)。
|
|
10
|
+
* - 非 git 目录 `current()` 为 undefined(状态行整段省略)。
|
|
11
|
+
* - `refresh()` 在回合边界调用(agent_settled、写类工具结束、回滚、/tree),只发起读取、不阻塞;
|
|
12
|
+
* 结果有变化时通知 `onChange` 的监听者。
|
|
13
|
+
*/
|
|
14
|
+
import { spawn as nodeSpawn } from "node:child_process";
|
|
15
|
+
import { readFile } from "node:fs/promises";
|
|
16
|
+
import { join } from "node:path";
|
|
17
|
+
import { findGitDir, readGitHead } from "../checkpoints/git-head.js";
|
|
18
|
+
export const GIT_NUMSTAT_INTERVAL_MS = 10_000;
|
|
19
|
+
export const GIT_NUMSTAT_TIMEOUT_MS = 2_000;
|
|
20
|
+
/** 解析 `git diff --numstat` 输出(二进制文件的 `-\t-` 跳过)。 */
|
|
21
|
+
export function parseNumstat(text) {
|
|
22
|
+
let insertions = 0;
|
|
23
|
+
let deletions = 0;
|
|
24
|
+
for (const line of text.split("\n")) {
|
|
25
|
+
const match = /^(\d+)\t(\d+)\t/.exec(line);
|
|
26
|
+
if (match === null)
|
|
27
|
+
continue;
|
|
28
|
+
insertions += Number(match[1]);
|
|
29
|
+
deletions += Number(match[2]);
|
|
30
|
+
}
|
|
31
|
+
return { insertions, deletions };
|
|
32
|
+
}
|
|
33
|
+
async function readHead(cwd) {
|
|
34
|
+
const head = await readGitHead(cwd);
|
|
35
|
+
if (head !== undefined) {
|
|
36
|
+
return {
|
|
37
|
+
shortHead: head.head.slice(0, 7),
|
|
38
|
+
...(head.branch !== undefined ? { branch: head.branch } : {}),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
// 还没有提交(unborn 分支):只有分支名
|
|
42
|
+
const gitDir = await findGitDir(cwd);
|
|
43
|
+
if (gitDir === undefined)
|
|
44
|
+
return undefined;
|
|
45
|
+
const text = await readFile(join(gitDir, "HEAD"), "utf8").catch(() => undefined);
|
|
46
|
+
const match = /^ref:\s*refs\/heads\/(\S+)\s*$/.exec(text ?? "");
|
|
47
|
+
return match?.[1] !== undefined ? { branch: match[1] } : undefined;
|
|
48
|
+
}
|
|
49
|
+
const sameInfo = (a, b) => a?.branch === b?.branch &&
|
|
50
|
+
a?.shortHead === b?.shortHead &&
|
|
51
|
+
a?.insertions === b?.insertions &&
|
|
52
|
+
a?.deletions === b?.deletions &&
|
|
53
|
+
(a === undefined) === (b === undefined);
|
|
54
|
+
export class GitInfoWatcher {
|
|
55
|
+
cwd;
|
|
56
|
+
info;
|
|
57
|
+
listeners = new Set();
|
|
58
|
+
spawn;
|
|
59
|
+
now;
|
|
60
|
+
minIntervalMs;
|
|
61
|
+
timeoutMs;
|
|
62
|
+
env;
|
|
63
|
+
numstatDisabled;
|
|
64
|
+
lastNumstatAt = Number.NEGATIVE_INFINITY;
|
|
65
|
+
numstatRunning = false;
|
|
66
|
+
headReading;
|
|
67
|
+
headAgain = false;
|
|
68
|
+
disposed = false;
|
|
69
|
+
diff;
|
|
70
|
+
constructor(cwd, deps = {}) {
|
|
71
|
+
this.cwd = cwd;
|
|
72
|
+
this.spawn = deps.spawn ?? ((command, args, options) => nodeSpawn(command, args, options));
|
|
73
|
+
this.now = deps.now ?? Date.now;
|
|
74
|
+
this.minIntervalMs = deps.minIntervalMs ?? GIT_NUMSTAT_INTERVAL_MS;
|
|
75
|
+
this.timeoutMs = deps.timeoutMs ?? GIT_NUMSTAT_TIMEOUT_MS;
|
|
76
|
+
this.env = deps.env ?? process.env;
|
|
77
|
+
this.numstatDisabled = this.env["AMA_STATUS_GIT"] === "0";
|
|
78
|
+
}
|
|
79
|
+
current() {
|
|
80
|
+
return this.info;
|
|
81
|
+
}
|
|
82
|
+
/** numstat 已因超时 / 失败 / 环境变量停用。 */
|
|
83
|
+
get numstatEnabled() {
|
|
84
|
+
return !this.numstatDisabled;
|
|
85
|
+
}
|
|
86
|
+
onChange(listener) {
|
|
87
|
+
this.listeners.add(listener);
|
|
88
|
+
return () => void this.listeners.delete(listener);
|
|
89
|
+
}
|
|
90
|
+
/** 回合边界调用:重读 HEAD;距上次 numstat ≥ minInterval 则后台起一次。返回本次读取完成的 Promise(测试用)。 */
|
|
91
|
+
refresh() {
|
|
92
|
+
if (this.disposed)
|
|
93
|
+
return Promise.resolve();
|
|
94
|
+
if (this.headReading !== undefined) {
|
|
95
|
+
this.headAgain = true;
|
|
96
|
+
return this.headReading;
|
|
97
|
+
}
|
|
98
|
+
const run = async () => {
|
|
99
|
+
do {
|
|
100
|
+
this.headAgain = false;
|
|
101
|
+
const head = await readHead(this.cwd).catch(() => undefined);
|
|
102
|
+
this.update(head);
|
|
103
|
+
} while (this.headAgain && !this.disposed);
|
|
104
|
+
this.headReading = undefined;
|
|
105
|
+
if (this.info !== undefined)
|
|
106
|
+
await this.maybeNumstat();
|
|
107
|
+
};
|
|
108
|
+
this.headReading = run();
|
|
109
|
+
return this.headReading;
|
|
110
|
+
}
|
|
111
|
+
dispose() {
|
|
112
|
+
this.disposed = true;
|
|
113
|
+
this.listeners.clear();
|
|
114
|
+
}
|
|
115
|
+
update(head) {
|
|
116
|
+
const next = head === undefined
|
|
117
|
+
? undefined
|
|
118
|
+
: {
|
|
119
|
+
...head,
|
|
120
|
+
...(this.diff !== undefined && head.shortHead !== undefined ? this.diff : {}),
|
|
121
|
+
};
|
|
122
|
+
if (sameInfo(this.info, next))
|
|
123
|
+
return;
|
|
124
|
+
this.info = next;
|
|
125
|
+
for (const listener of [...this.listeners])
|
|
126
|
+
listener();
|
|
127
|
+
}
|
|
128
|
+
maybeNumstat() {
|
|
129
|
+
if (this.numstatDisabled || this.numstatRunning)
|
|
130
|
+
return Promise.resolve();
|
|
131
|
+
if (this.info?.shortHead === undefined)
|
|
132
|
+
return Promise.resolve();
|
|
133
|
+
const at = this.now();
|
|
134
|
+
if (at - this.lastNumstatAt < this.minIntervalMs)
|
|
135
|
+
return Promise.resolve();
|
|
136
|
+
this.lastNumstatAt = at;
|
|
137
|
+
this.numstatRunning = true;
|
|
138
|
+
return this.numstat().then((diff) => {
|
|
139
|
+
this.numstatRunning = false;
|
|
140
|
+
if (this.disposed)
|
|
141
|
+
return;
|
|
142
|
+
if (diff === undefined) {
|
|
143
|
+
this.numstatDisabled = true;
|
|
144
|
+
this.diff = undefined;
|
|
145
|
+
}
|
|
146
|
+
else
|
|
147
|
+
this.diff = diff;
|
|
148
|
+
const info = this.info;
|
|
149
|
+
if (info === undefined)
|
|
150
|
+
return;
|
|
151
|
+
const { insertions: _i, deletions: _d, ...head } = info;
|
|
152
|
+
this.update(head);
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
numstat() {
|
|
156
|
+
return new Promise((resolve) => {
|
|
157
|
+
let settled = false;
|
|
158
|
+
let timer;
|
|
159
|
+
const done = (value) => {
|
|
160
|
+
if (settled)
|
|
161
|
+
return;
|
|
162
|
+
settled = true;
|
|
163
|
+
clearTimeout(timer);
|
|
164
|
+
resolve(value);
|
|
165
|
+
};
|
|
166
|
+
let child;
|
|
167
|
+
try {
|
|
168
|
+
child = this.spawn("git", ["diff", "--numstat", "HEAD"], {
|
|
169
|
+
cwd: this.cwd,
|
|
170
|
+
env: { ...this.env, GIT_OPTIONAL_LOCKS: "0" },
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
resolve(undefined);
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
timer = setTimeout(() => {
|
|
178
|
+
child.kill("SIGKILL");
|
|
179
|
+
done(undefined);
|
|
180
|
+
}, this.timeoutMs);
|
|
181
|
+
timer.unref?.();
|
|
182
|
+
let out = "";
|
|
183
|
+
child.stdout?.setEncoding?.("utf8");
|
|
184
|
+
child.stdout?.on("data", (chunk) => {
|
|
185
|
+
out += String(chunk);
|
|
186
|
+
});
|
|
187
|
+
child.on("error", () => done(undefined));
|
|
188
|
+
child.on("close", (code) => done(code === 0 ? parseNumstat(out) : undefined));
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
}
|
package/dist/hooks/protocol.js
CHANGED
|
@@ -23,12 +23,17 @@ const ACCEPTED = {
|
|
|
23
23
|
SessionStart: ["block"],
|
|
24
24
|
Notification: [],
|
|
25
25
|
SessionEnd: [],
|
|
26
|
+
PostRewind: [],
|
|
27
|
+
PostCompact: [],
|
|
26
28
|
};
|
|
27
29
|
/** 退出码 2 映射的阻止决策;undefined = 该事件忽略退出码 2。 */
|
|
28
30
|
export function blockingDecision(event) {
|
|
29
31
|
if (event === "PreToolUse")
|
|
30
32
|
return "deny";
|
|
31
|
-
if (event === "Notification" ||
|
|
33
|
+
if (event === "Notification" ||
|
|
34
|
+
event === "SessionEnd" ||
|
|
35
|
+
event === "PostRewind" ||
|
|
36
|
+
event === "PostCompact")
|
|
32
37
|
return undefined;
|
|
33
38
|
return "block";
|
|
34
39
|
}
|
package/dist/hooks/types.d.ts
CHANGED
|
@@ -8,7 +8,9 @@
|
|
|
8
8
|
* - `HookDecision` = stdout JSON 里 `decision` 的取值;合并规则 deny > block > ask > allow。
|
|
9
9
|
*/
|
|
10
10
|
import type { PermissionMode } from "../permissions/types.js";
|
|
11
|
-
export type HookEvent = "SessionStart" | "UserPromptSubmit" | "PreToolUse" | "PostToolUse" | "Stop" | "SubagentStop" | "PreCompact" | "Notification" | "SessionEnd"
|
|
11
|
+
export type HookEvent = "SessionStart" | "UserPromptSubmit" | "PreToolUse" | "PostToolUse" | "Stop" | "SubagentStop" | "PreCompact" | "Notification" | "SessionEnd" | "PostRewind"
|
|
12
|
+
/** [W5-C0] 压缩完成后(不可阻止;additionalContext 追加在 ama.post_compact 之后,W5-H1 触发)。 */
|
|
13
|
+
| "PostCompact";
|
|
12
14
|
export declare const HOOK_EVENTS: readonly HookEvent[];
|
|
13
15
|
export type HookDecision = "allow" | "deny" | "ask" | "block";
|
|
14
16
|
export interface HookCommand {
|
|
@@ -65,7 +67,14 @@ export interface HookInput {
|
|
|
65
67
|
stopHookActive?: boolean;
|
|
66
68
|
tokensBefore?: number;
|
|
67
69
|
trigger?: "auto" | "manual";
|
|
70
|
+
/** [W5-C0] PostCompact:压缩后的估算 token。 */
|
|
71
|
+
tokensAfter?: number;
|
|
68
72
|
notification?: HookNotification;
|
|
73
|
+
/** 回滚到的用户消息条目 id。 */
|
|
74
|
+
entryId?: string;
|
|
75
|
+
mode?: "both" | "conversation" | "code";
|
|
76
|
+
/** 被恢复或删除的文件(cwd 内相对路径,cwd 外绝对路径);仅对话时为空。 */
|
|
77
|
+
files?: string[];
|
|
69
78
|
/** Pre/PostToolUse:本次调用来自 codemode 脚本里的 `tools.*`(设计 §5.5)。 */
|
|
70
79
|
viaCodemode?: boolean;
|
|
71
80
|
/** Pre/PostToolUse:codemode 内层调用时为外层 `codemode` 调用的 toolCallId。 */
|
package/dist/hooks/types.js
CHANGED
package/dist/host/api-impl.d.ts
CHANGED
|
@@ -5,7 +5,12 @@
|
|
|
5
5
|
* (B2 组装后才可用,所以全部是惰性函数)、指令收集、broker 槽、sendUser、UI 通知。
|
|
6
6
|
* 事件总线 `AgentEventBus` 由 bootstrap 创建并交给 AgentSession 发事件;处理器只观察,
|
|
7
7
|
* 抛错记日志;`emit` 等待全部处理器(`session_shutdown` 需要被 await)。
|
|
8
|
+
*
|
|
9
|
+
* [W5-EG] `runners.provide`(docs/wave5-plan.md §5.5,D17):宿主注入的 runner 进本适配器的
|
|
10
|
+
* {@link HostRunnerRegistry}(跨会话共享),每个主会话的外部 Agent 入口(agents/external.ts)经
|
|
11
|
+
* {@link hostRunnersOf} 取到它;有宿主时 ama 不自 spawn 外部 CLI,只认这里注入的。
|
|
8
12
|
*/
|
|
13
|
+
import { HostRunnerRegistry } from "../drivers/host-runners.js";
|
|
9
14
|
import type { AgentEventName, AgentEvents, ApprovalBroker, HostAdapter, HostAdapterHandle, HostApi, HostMode, InstructionSource } from "./types.js";
|
|
10
15
|
import type { ToolRegistryApi } from "../tools/types.js";
|
|
11
16
|
import type { WarmingDecisionHandler } from "../ai/cache/types.js";
|
|
@@ -71,5 +76,7 @@ export interface HostApiBinding {
|
|
|
71
76
|
/** [W3-C0] 宿主经 `cache.onWarmingDecision` 注册的否决钩子(最后注册且未注销的那个)。 */
|
|
72
77
|
warmingDecider(): WarmingDecisionHandler | undefined;
|
|
73
78
|
}
|
|
79
|
+
/** [W5-EG] 宿主经 `runners.provide` 注入的 runner(HostApi 不是本模块创建的返回 undefined)。 */
|
|
80
|
+
export declare function hostRunnersOf(api: HostApi): HostRunnerRegistry | undefined;
|
|
74
81
|
export declare function createHostApi(deps: HostApiDeps): HostApiBinding;
|
|
75
82
|
export {};
|
package/dist/host/api-impl.js
CHANGED
|
@@ -5,7 +5,12 @@
|
|
|
5
5
|
* (B2 组装后才可用,所以全部是惰性函数)、指令收集、broker 槽、sendUser、UI 通知。
|
|
6
6
|
* 事件总线 `AgentEventBus` 由 bootstrap 创建并交给 AgentSession 发事件;处理器只观察,
|
|
7
7
|
* 抛错记日志;`emit` 等待全部处理器(`session_shutdown` 需要被 await)。
|
|
8
|
+
*
|
|
9
|
+
* [W5-EG] `runners.provide`(docs/wave5-plan.md §5.5,D17):宿主注入的 runner 进本适配器的
|
|
10
|
+
* {@link HostRunnerRegistry}(跨会话共享),每个主会话的外部 Agent 入口(agents/external.ts)经
|
|
11
|
+
* {@link hostRunnersOf} 取到它;有宿主时 ama 不自 spawn 外部 CLI,只认这里注入的。
|
|
8
12
|
*/
|
|
13
|
+
import { HostRunnerRegistry } from "../drivers/host-runners.js";
|
|
9
14
|
import { AmaError } from "../errors.js";
|
|
10
15
|
import { AMA_VERSION } from "../version.js";
|
|
11
16
|
import { HOST_API_VERSION } from "./types.js";
|
|
@@ -43,6 +48,11 @@ export class AgentEventBus {
|
|
|
43
48
|
}
|
|
44
49
|
}
|
|
45
50
|
const TOOL_NAME = /^[a-z][a-z0-9_]{1,63}$/;
|
|
51
|
+
const hostRunnerRegistries = new WeakMap();
|
|
52
|
+
/** [W5-EG] 宿主经 `runners.provide` 注入的 runner(HostApi 不是本模块创建的返回 undefined)。 */
|
|
53
|
+
export function hostRunnersOf(api) {
|
|
54
|
+
return hostRunnerRegistries.get(api);
|
|
55
|
+
}
|
|
46
56
|
function validateTool(tool) {
|
|
47
57
|
if (typeof tool !== "object" || tool === null) {
|
|
48
58
|
throw new AmaError("invalid_arguments", "tools.register:工具定义应为对象");
|
|
@@ -65,6 +75,7 @@ export function createHostApi(deps) {
|
|
|
65
75
|
let broker;
|
|
66
76
|
const warmingHandlers = [];
|
|
67
77
|
let notify = deps.notify;
|
|
78
|
+
const runners = new HostRunnerRegistry();
|
|
68
79
|
const writeErr = deps.stderr ?? ((text) => void process.stderr.write(text));
|
|
69
80
|
const log = deps.log ??
|
|
70
81
|
((level, message) => {
|
|
@@ -154,7 +165,11 @@ export function createHostApi(deps) {
|
|
|
154
165
|
};
|
|
155
166
|
},
|
|
156
167
|
}),
|
|
168
|
+
runners: Object.freeze({
|
|
169
|
+
provide: (runner) => runners.provide(runner),
|
|
170
|
+
}),
|
|
157
171
|
});
|
|
172
|
+
hostRunnerRegistries.set(api, runners);
|
|
158
173
|
return {
|
|
159
174
|
api,
|
|
160
175
|
instructions,
|
package/dist/host/types.d.ts
CHANGED
|
@@ -10,13 +10,18 @@
|
|
|
10
10
|
* - (W3-C0)第三波 §1.10 / §1.7:`AgentEvents` 加 `cache_miss`、`context_pressure`;
|
|
11
11
|
* `HostApi.cache.onWarmingDecision` 为可选面(HOST_API_VERSION 不变,旧宿主不受影响),
|
|
12
12
|
* 多个处理器时最后注册的生效。
|
|
13
|
+
* - (W5-C0)第五波 §5.5 / §6.5 / §7.5:可选面 `HostApi.runners`(宿主注入的子 Agent runner,
|
|
14
|
+
* 以 `task(agent=…)` 入口出现;有宿主时内置外部 runner 一律不可用,实现归 W5-E / W5-G);
|
|
15
|
+
* `AgentEvents` 加 `subagent_start / subagent_end / plan_proposed / plan_resolved`。
|
|
16
|
+
* HOST_API_VERSION 不变。
|
|
13
17
|
*/
|
|
14
18
|
import type { CacheMiss, WarmingDecisionHandler } from "../ai/cache/types.js";
|
|
15
19
|
import type { HookEvent } from "../hooks/types.js";
|
|
16
20
|
import type { ApprovalBroker, ApprovalDecision } from "../permissions/types.js";
|
|
17
|
-
import type { ToolDefinition } from "../tools/types.js";
|
|
21
|
+
import type { SubagentRunner, ToolDefinition } from "../tools/types.js";
|
|
22
|
+
import type { PlanProposedEvent, PlanResolvedEvent, SubagentEndEvent, SubagentStartEvent } from "../agent/types-w5.js";
|
|
18
23
|
export type { ActionPreview, ActionPreviewTarget, ApprovalBroker, ApprovalDecision, ApprovalReason, ApprovalRequest, ApprovalRequestContext, } from "../permissions/types.js";
|
|
19
|
-
export type { ToolAnnotations, ToolContext, ToolDefinition, ToolExecutionMode, ToolPermission, ToolResult, } from "../tools/types.js";
|
|
24
|
+
export type { RunnerHandle, SubagentEvent, SubagentRunRequest, SubagentRunner, ToolAnnotations, ToolContext, ToolDefinition, ToolExecutionMode, ToolPermission, ToolResult, } from "../tools/types.js";
|
|
20
25
|
export type { JsonSchema } from "../ai/types.js";
|
|
21
26
|
export type { CacheMiss, WarmDecision, WarmingDecisionHandler } from "../ai/cache/types.js";
|
|
22
27
|
export declare const HOST_API_VERSION: 1;
|
|
@@ -104,7 +109,17 @@ export interface AgentEvents {
|
|
|
104
109
|
remainingTokens?: number;
|
|
105
110
|
estimatedTurnsLeft?: number;
|
|
106
111
|
};
|
|
112
|
+
/** [W5-C0] 子 Agent 任务开始 / 结束(含宿主 runner 与外部 Agent)。 */
|
|
113
|
+
subagent_start: Omit<SubagentStartEvent, "type">;
|
|
114
|
+
subagent_end: Omit<SubagentEndEvent, "type">;
|
|
115
|
+
/** [W5-C0] 计划提出 / 审批结果。 */
|
|
116
|
+
plan_proposed: Omit<PlanProposedEvent, "type">;
|
|
117
|
+
plan_resolved: Omit<PlanResolvedEvent, "type">;
|
|
107
118
|
}
|
|
119
|
+
/** [W5-C0] 宿主注入的 runner:`id` 即 `task(agent=<id>)` 的名字,`description` 进 task 工具描述。 */
|
|
120
|
+
export type HostRunner = SubagentRunner & {
|
|
121
|
+
readonly description: string;
|
|
122
|
+
};
|
|
108
123
|
export type AgentEventName = keyof AgentEvents;
|
|
109
124
|
export interface HostApi {
|
|
110
125
|
readonly version: HostApiVersion;
|
|
@@ -157,6 +172,13 @@ export interface HostApi {
|
|
|
157
172
|
readonly cache?: {
|
|
158
173
|
onWarmingDecision(handler: WarmingDecisionHandler): () => void;
|
|
159
174
|
};
|
|
175
|
+
/**
|
|
176
|
+
* [W5-C0] 宿主注入的子 Agent runner(画布节点等,docs/wave5-plan.md §5.5):注入后同名的内置
|
|
177
|
+
* 外部 runner 被替换;返回值用于注销。可选面:旧版本运行时没有它(实现归 W5-E / W5-G)。
|
|
178
|
+
*/
|
|
179
|
+
readonly runners?: {
|
|
180
|
+
provide(runner: HostRunner): () => void;
|
|
181
|
+
};
|
|
160
182
|
}
|
|
161
183
|
/** Runtime 持有的已激活适配器。 */
|
|
162
184
|
export interface HostAdapterHandle {
|
package/dist/host/types.js
CHANGED
|
@@ -10,5 +10,9 @@
|
|
|
10
10
|
* - (W3-C0)第三波 §1.10 / §1.7:`AgentEvents` 加 `cache_miss`、`context_pressure`;
|
|
11
11
|
* `HostApi.cache.onWarmingDecision` 为可选面(HOST_API_VERSION 不变,旧宿主不受影响),
|
|
12
12
|
* 多个处理器时最后注册的生效。
|
|
13
|
+
* - (W5-C0)第五波 §5.5 / §6.5 / §7.5:可选面 `HostApi.runners`(宿主注入的子 Agent runner,
|
|
14
|
+
* 以 `task(agent=…)` 入口出现;有宿主时内置外部 runner 一律不可用,实现归 W5-E / W5-G);
|
|
15
|
+
* `AgentEvents` 加 `subagent_start / subagent_end / plan_proposed / plan_resolved`。
|
|
16
|
+
* HOST_API_VERSION 不变。
|
|
13
17
|
*/
|
|
14
18
|
export const HOST_API_VERSION = 1;
|
package/dist/index.d.ts
CHANGED
|
@@ -10,6 +10,7 @@ export { HOST_API_VERSION } from "./host/types.js";
|
|
|
10
10
|
export { RPC_PROTOCOL_VERSION } from "./rpc.js";
|
|
11
11
|
export { SESSION_FORMAT_VERSION } from "./session/types.js";
|
|
12
12
|
export { HOOK_EVENTS } from "./hooks/types.js";
|
|
13
|
+
export { REWIND_NOTE_CUSTOM_TYPE } from "./checkpoints/types.js";
|
|
13
14
|
export { PERMISSION_MODES_STRICT_FIRST } from "./permissions/types.js";
|
|
14
15
|
export { ExitCode, describeExitCode } from "./cli/exit-codes.js";
|
|
15
16
|
export { defineTool } from "./tools/types.js";
|
|
@@ -24,10 +25,12 @@ export type * from "./hooks/types.js";
|
|
|
24
25
|
export type * from "./permissions/types.js";
|
|
25
26
|
export type * from "./host/types.js";
|
|
26
27
|
export type * from "./config/types.js";
|
|
28
|
+
export type * from "./checkpoints/types.js";
|
|
27
29
|
export type { AmaErrorOptions, ErrorCode, KnownErrorCode } from "./errors.js";
|
|
28
30
|
export type { Runtime, RuntimeMode, ResolvedPaths, TrustState, LoadedResources, } from "./cli/runtime.js";
|
|
29
31
|
export { createAgentSession, createRuntime } from "./sdk.js";
|
|
30
32
|
export type { CreateSessionOptions, RuntimeOptions, SessionAuth } from "./sdk.js";
|
|
33
|
+
export type { PlanDecision, PlanResponse, PlanResponseResult, SdkAgentSession, SessionPlanApi, SessionPlanOptions, } from "./sdk.js";
|
|
31
34
|
export { AgentSessionImpl } from "./agent/session.js";
|
|
32
35
|
export { SessionManager } from "./session/manager.js";
|
|
33
36
|
export { ProviderRegistry } from "./ai/providers/registry.js";
|
package/dist/index.js
CHANGED
|
@@ -11,6 +11,7 @@ export { HOST_API_VERSION } from "./host/types.js";
|
|
|
11
11
|
export { RPC_PROTOCOL_VERSION } from "./rpc.js";
|
|
12
12
|
export { SESSION_FORMAT_VERSION } from "./session/types.js";
|
|
13
13
|
export { HOOK_EVENTS } from "./hooks/types.js";
|
|
14
|
+
export { REWIND_NOTE_CUSTOM_TYPE } from "./checkpoints/types.js";
|
|
14
15
|
export { PERMISSION_MODES_STRICT_FIRST } from "./permissions/types.js";
|
|
15
16
|
export { ExitCode, describeExitCode } from "./cli/exit-codes.js";
|
|
16
17
|
export { defineTool } from "./tools/types.js";
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ama --mode acp`:ama 的会话事件 → ACP `session/update`(docs/wave5-plan.md §5.6)。[W5-E]
|
|
3
|
+
*
|
|
4
|
+
* | ama | ACP |
|
|
5
|
+
* | ------------------------------------ | ---------------------------------------------------------- |
|
|
6
|
+
* | message_update text_delta | agent_message_chunk |
|
|
7
|
+
* | message_update thinking_delta | agent_thought_chunk |
|
|
8
|
+
* | message_update toolcall_end | tool_call(pending,带 rawInput 与 locations) |
|
|
9
|
+
* | tool_execution_start / end | tool_call_update(in_progress → completed / failed) |
|
|
10
|
+
* | todo_updated | plan |
|
|
11
|
+
* | turn_end | usage_update(上下文用量、窗口、会话累计美元) |
|
|
12
|
+
* | permission_mode_changed | current_mode_update |
|
|
13
|
+
*
|
|
14
|
+
* 工具结果只回前 4 KB 文本(完整结果在 ama 会话里),codemode 内层调用(带 parentToolCallId)
|
|
15
|
+
* 不单列。`session/load` 回放同一套映射(用户消息 → user_message_chunk)。
|
|
16
|
+
*/
|
|
17
|
+
import type { AgentMessage } from "../../session/types.js";
|
|
18
|
+
import type { AgentSession, SessionEvent } from "../../agent/types.js";
|
|
19
|
+
import type { AcpSessionUpdate, AcpToolCallLocation, AcpToolKind } from "../../drivers/acp/types.js";
|
|
20
|
+
export declare const TOOL_OUTPUT_LIMIT: number;
|
|
21
|
+
export declare function toolKind(name: string): AcpToolKind;
|
|
22
|
+
export declare function toolTitle(name: string, args: unknown): string;
|
|
23
|
+
export declare function toolLocations(args: unknown, cwd: string): AcpToolCallLocation[] | undefined;
|
|
24
|
+
export declare function permissionModes(currentModeId: string): {
|
|
25
|
+
currentModeId: string;
|
|
26
|
+
availableModes: {
|
|
27
|
+
id: import("../../permissions/types.js").PermissionMode;
|
|
28
|
+
name: import("../../permissions/types.js").PermissionMode;
|
|
29
|
+
}[];
|
|
30
|
+
};
|
|
31
|
+
/** 一个会话的事件映射器(记住模型发出的工具调用,供权限请求关联 toolCallId)。 */
|
|
32
|
+
export declare class AcpEventMapper {
|
|
33
|
+
private readonly cwd;
|
|
34
|
+
private readonly emit;
|
|
35
|
+
private readonly session;
|
|
36
|
+
/** 模型已发出、尚未执行完的工具调用。 */
|
|
37
|
+
private readonly pendingCalls;
|
|
38
|
+
constructor(cwd: string, emit: (update: AcpSessionUpdate) => void, session: () => AgentSession);
|
|
39
|
+
/** 权限请求对应的工具调用 id(按工具名与参数匹配最近一个)。 */
|
|
40
|
+
toolCallIdFor(toolName: string, input: unknown): string | undefined;
|
|
41
|
+
onEvent(event: SessionEvent): void;
|
|
42
|
+
emitUsage(): void;
|
|
43
|
+
/** `session/load`:按消息回放历史。 */
|
|
44
|
+
replay(messages: readonly AgentMessage[]): void;
|
|
45
|
+
private emitToolCall;
|
|
46
|
+
}
|