@armadra/agent 0.5.1 → 0.6.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 +177 -304
- package/CHANGELOG.zh-CN.md +442 -0
- package/README.md +408 -364
- package/README.zh-CN.md +705 -0
- package/dist/agent/session-plan.js +2 -2
- package/dist/agent/session-state.d.ts +3 -0
- package/dist/agent/session-state.js +20 -0
- package/dist/agent/session-subagent.d.ts +15 -1
- package/dist/agent/session-subagent.js +26 -3
- package/dist/agent/session-telemetry.d.ts +16 -2
- package/dist/agent/session-telemetry.js +29 -7
- package/dist/agent/session-tools.js +5 -2
- package/dist/agent/session-trace-writer.d.ts +27 -0
- package/dist/agent/session-trace-writer.js +253 -0
- package/dist/agent/session.d.ts +2 -0
- package/dist/agent/session.js +12 -0
- package/dist/agent/subagent-direct.d.ts +20 -0
- package/dist/agent/subagent-direct.js +76 -0
- package/dist/agent/subagent-registry.d.ts +8 -1
- package/dist/agent/subagent-registry.js +28 -1
- package/dist/agent/system-prompt.d.ts +3 -1
- package/dist/agent/system-prompt.js +3 -0
- package/dist/agent/tool-runner.d.ts +2 -1
- package/dist/agent/tool-runner.js +5 -4
- package/dist/agent/types-w6.d.ts +39 -0
- package/dist/agent/types-w6.js +4 -0
- package/dist/agent/types.d.ts +5 -2
- package/dist/agents/external.js +1 -1
- package/dist/agents/task-record.d.ts +74 -1
- package/dist/agents/task-record.js +100 -0
- package/dist/ai/apis/cache-params.js +2 -1
- package/dist/ai/apis/chatgpt-backend.d.ts +52 -0
- package/dist/ai/apis/chatgpt-backend.js +224 -0
- package/dist/ai/apis/chatgpt-rate-limits.d.ts +26 -0
- package/dist/ai/apis/chatgpt-rate-limits.js +91 -0
- package/dist/ai/apis/openai-responses-request.d.ts +2 -1
- package/dist/ai/apis/openai-responses-request.js +8 -2
- package/dist/ai/apis/openai-responses.d.ts +2 -0
- package/dist/ai/apis/openai-responses.js +51 -16
- package/dist/ai/overflow.d.ts +1 -1
- package/dist/ai/overflow.js +10 -7
- package/dist/ai/providers/auth.d.ts +15 -2
- package/dist/ai/providers/auth.js +69 -2
- package/dist/ai/providers/builtin.js +27 -0
- package/dist/ai/providers/catalog-data.js +1 -0
- package/dist/ai/providers/enrich.js +2 -7
- package/dist/ai/providers/models-dev-cache.js +15 -19
- package/dist/ai/providers/models-dev-snapshot.js +8 -7
- package/dist/ai/providers/models-dev.js +5 -15
- package/dist/ai/providers/suggest.js +2 -16
- package/dist/ai/types.d.ts +27 -1
- package/dist/auth/chatgpt/backend-client.d.ts +26 -0
- package/dist/auth/chatgpt/backend-client.js +74 -0
- package/dist/auth/chatgpt/claims.d.ts +17 -0
- package/dist/auth/chatgpt/claims.js +46 -0
- package/dist/auth/chatgpt/cli.d.ts +33 -0
- package/dist/auth/chatgpt/cli.js +252 -0
- package/dist/auth/chatgpt/doctor.d.ts +17 -0
- package/dist/auth/chatgpt/doctor.js +36 -0
- package/dist/auth/chatgpt/host-id.d.ts +7 -0
- package/dist/auth/chatgpt/host-id.js +26 -0
- package/dist/auth/chatgpt/login.d.ts +30 -0
- package/dist/auth/chatgpt/login.js +130 -0
- package/dist/auth/chatgpt/presets.d.ts +66 -0
- package/dist/auth/chatgpt/presets.js +120 -0
- package/dist/auth/chatgpt/quota-text.d.ts +13 -0
- package/dist/auth/chatgpt/quota-text.js +36 -0
- package/dist/auth/oauth/browser.d.ts +12 -0
- package/dist/auth/oauth/browser.js +27 -0
- package/dist/auth/oauth/callback-server.d.ts +47 -0
- package/dist/auth/oauth/callback-server.js +147 -0
- package/dist/auth/oauth/flows.d.ts +62 -0
- package/dist/auth/oauth/flows.js +113 -0
- package/dist/auth/oauth/jwt.d.ts +24 -0
- package/dist/auth/oauth/jwt.js +81 -0
- package/dist/auth/oauth/live.d.ts +21 -0
- package/dist/auth/oauth/live.js +25 -0
- package/dist/auth/oauth/oidc.d.ts +26 -0
- package/dist/auth/oauth/oidc.js +72 -0
- package/dist/auth/oauth/pkce.d.ts +15 -0
- package/dist/auth/oauth/pkce.js +20 -0
- package/dist/auth/oauth/refresh.d.ts +35 -0
- package/dist/auth/oauth/refresh.js +129 -0
- package/dist/auth/oauth/token-client.d.ts +33 -0
- package/dist/auth/oauth/token-client.js +121 -0
- package/dist/auth/oauth/token-store.d.ts +23 -0
- package/dist/auth/oauth/token-store.js +125 -0
- package/dist/auth/testing/fake-oauth.d.ts +73 -0
- package/dist/auth/testing/fake-oauth.js +271 -0
- package/dist/auth/testing/refresh-child.d.ts +5 -0
- package/dist/auth/testing/refresh-child.js +16 -0
- package/dist/bundle/ama.cjs +25928 -11144
- package/dist/checkpoints/backend.js +6 -5
- package/dist/checkpoints/restore.js +3 -2
- package/dist/checkpoints/settings.js +2 -1
- package/dist/checkpoints/shadow-git.js +7 -6
- package/dist/checkpoints/shadow-restore.js +3 -2
- package/dist/checkpoints/tracker.js +4 -3
- package/dist/cli/args.d.ts +9 -2
- package/dist/cli/args.js +74 -27
- package/dist/cli/bootstrap.js +53 -31
- package/dist/cli/choice-prompt.js +8 -6
- package/dist/cli/codemode-notice.js +2 -2
- package/dist/cli/compose-agents.js +2 -1
- package/dist/cli/compose-extensions.js +2 -0
- package/dist/cli/compose-memory.d.ts +53 -0
- package/dist/cli/compose-memory.js +127 -0
- package/dist/cli/compose-providers.d.ts +5 -0
- package/dist/cli/compose-providers.js +32 -2
- package/dist/cli/compose-session.d.ts +5 -0
- package/dist/cli/compose-session.js +27 -13
- package/dist/cli/compose-store.d.ts +2 -0
- package/dist/cli/compose-store.js +9 -5
- package/dist/cli/compose.d.ts +2 -0
- package/dist/cli/compose.js +13 -5
- package/dist/cli/default-model.d.ts +0 -2
- package/dist/cli/default-model.js +5 -8
- package/dist/cli/deps.d.ts +5 -1
- package/dist/cli/exit-codes.d.ts +1 -1
- package/dist/cli/exit-codes.js +7 -16
- package/dist/cli/from-prompt.js +3 -2
- package/dist/cli/help-text.d.ts +2 -1
- package/dist/cli/help-text.js +5 -99
- package/dist/cli/main.d.ts +5 -0
- package/dist/cli/main.js +21 -2
- package/dist/cli/proxy.js +14 -9
- package/dist/cli/runtime.d.ts +5 -0
- package/dist/cli/startup-screen.js +20 -27
- package/dist/cli/startup-steps.js +6 -8
- package/dist/cli/subcommands/auth.d.ts +6 -3
- package/dist/cli/subcommands/auth.js +52 -22
- package/dist/cli/subcommands/config-set.d.ts +21 -0
- package/dist/cli/subcommands/config-set.js +137 -0
- package/dist/cli/subcommands/config.d.ts +2 -1
- package/dist/cli/subcommands/config.js +51 -37
- package/dist/cli/subcommands/doctor.d.ts +2 -1
- package/dist/cli/subcommands/doctor.js +97 -58
- package/dist/cli/subcommands/init.d.ts +1 -1
- package/dist/cli/subcommands/init.js +8 -7
- package/dist/cli/subcommands/memory.d.ts +18 -0
- package/dist/cli/subcommands/memory.js +189 -0
- package/dist/cli/subcommands/model-meta.js +11 -9
- package/dist/cli/subcommands/models-cache-probe.js +23 -20
- package/dist/cli/subcommands/models-discover.d.ts +3 -0
- package/dist/cli/subcommands/models-discover.js +44 -21
- package/dist/cli/subcommands/models.d.ts +1 -1
- package/dist/cli/subcommands/models.js +29 -22
- package/dist/cli/subcommands/probe-runner.js +8 -7
- package/dist/cli/subcommands/providers-list.js +32 -21
- package/dist/cli/subcommands/providers-plan.js +24 -25
- package/dist/cli/subcommands/providers-probe.js +5 -6
- package/dist/cli/subcommands/providers.d.ts +1 -1
- package/dist/cli/subcommands/providers.js +45 -50
- package/dist/cli/subcommands/sessions-export.d.ts +1 -1
- package/dist/cli/subcommands/sessions-export.js +10 -9
- package/dist/cli/subcommands/sessions-search.d.ts +1 -1
- package/dist/cli/subcommands/sessions-search.js +11 -10
- package/dist/cli/subcommands/sessions-trace.d.ts +30 -0
- package/dist/cli/subcommands/sessions-trace.js +156 -0
- package/dist/cli/subcommands/sessions.d.ts +4 -3
- package/dist/cli/subcommands/sessions.js +40 -37
- package/dist/cli/subcommands/stats.d.ts +1 -1
- package/dist/cli/subcommands/stats.js +49 -30
- package/dist/cli/system-prompt-arg.js +3 -2
- package/dist/codemode/capability.js +3 -2
- package/dist/compaction/post-compact.d.ts +1 -0
- package/dist/compaction/post-compact.js +15 -1
- package/dist/compaction/prune-tier.d.ts +1 -1
- package/dist/compaction/prune-tier.js +3 -3
- package/dist/compaction/serialize.js +2 -1
- package/dist/config/auth-file.d.ts +12 -2
- package/dist/config/auth-file.js +32 -10
- package/dist/config/checker.js +12 -11
- package/dist/config/context-files.js +3 -2
- package/dist/config/edit.d.ts +106 -0
- package/dist/config/edit.js +350 -0
- package/dist/config/init.d.ts +4 -3
- package/dist/config/init.js +10 -18
- package/dist/config/json-schema.d.ts +2 -1
- package/dist/config/json-schema.js +101 -68
- package/dist/config/key-docs.d.ts +18 -7
- package/dist/config/key-docs.js +43 -128
- package/dist/config/load.js +7 -6
- package/dist/config/merge.d.ts +4 -1
- package/dist/config/merge.js +42 -22
- package/dist/config/paths.js +6 -5
- package/dist/config/profile.d.ts +5 -1
- package/dist/config/profile.js +7 -2
- package/dist/config/schema-w5.js +3 -2
- package/dist/config/schema-w6.d.ts +19 -0
- package/dist/config/schema-w6.js +115 -0
- package/dist/config/schema.js +34 -20
- package/dist/config/settings-registry.d.ts +78 -0
- package/dist/config/settings-registry.js +184 -0
- package/dist/config/types-w6.d.ts +109 -0
- package/dist/config/types-w6.js +19 -0
- package/dist/config/types.d.ts +11 -8
- package/dist/config/types.js +1 -0
- package/dist/drivers/acp/client.js +1 -1
- package/dist/drivers/acp/driver.js +13 -8
- package/dist/drivers/agents.js +4 -3
- package/dist/drivers/base.js +3 -2
- package/dist/drivers/host-runners.js +2 -1
- package/dist/drivers/native/claude-stream.js +12 -11
- package/dist/drivers/native/codex-app-server.js +17 -12
- package/dist/drivers/native/oneshot.js +8 -7
- package/dist/drivers/pool.js +1 -1
- package/dist/drivers/runner.d.ts +3 -1
- package/dist/drivers/runner.js +68 -20
- package/dist/drivers/turn.js +1 -1
- package/dist/hooks/config.js +3 -2
- package/dist/hooks/protocol.js +18 -12
- package/dist/host/api-impl.js +11 -10
- package/dist/host/loader.js +9 -8
- package/dist/host/types.d.ts +3 -0
- package/dist/i18n/catalog.d.ts +2169 -0
- package/dist/i18n/catalog.js +72 -0
- package/dist/i18n/format.d.ts +21 -0
- package/dist/i18n/format.js +58 -0
- package/dist/i18n/index.d.ts +58 -0
- package/dist/i18n/index.js +72 -0
- package/dist/i18n/messages/agents.d.ts +84 -0
- package/dist/i18n/messages/agents.js +85 -0
- package/dist/i18n/messages/approval.d.ts +99 -0
- package/dist/i18n/messages/approval.js +100 -0
- package/dist/i18n/messages/auth.d.ts +187 -0
- package/dist/i18n/messages/auth.js +189 -0
- package/dist/i18n/messages/cli-args.d.ts +46 -0
- package/dist/i18n/messages/cli-args.js +46 -0
- package/dist/i18n/messages/cli-help.d.ts +12 -0
- package/dist/i18n/messages/cli-help.js +244 -0
- package/dist/i18n/messages/cli.d.ts +336 -0
- package/dist/i18n/messages/cli.js +311 -0
- package/dist/i18n/messages/config-keys.d.ts +289 -0
- package/dist/i18n/messages/config-keys.js +292 -0
- package/dist/i18n/messages/config.d.ts +502 -0
- package/dist/i18n/messages/config.js +239 -0
- package/dist/i18n/messages/drivers.d.ts +123 -0
- package/dist/i18n/messages/drivers.js +124 -0
- package/dist/i18n/messages/errors.d.ts +83 -0
- package/dist/i18n/messages/errors.js +171 -0
- package/dist/i18n/messages/interactive-line.d.ts +61 -0
- package/dist/i18n/messages/interactive-line.js +69 -0
- package/dist/i18n/messages/interactive-startup.d.ts +103 -0
- package/dist/i18n/messages/interactive-startup.js +104 -0
- package/dist/i18n/messages/interactive-view.d.ts +140 -0
- package/dist/i18n/messages/interactive-view.js +141 -0
- package/dist/i18n/messages/interactive.d.ts +493 -0
- package/dist/i18n/messages/interactive.js +248 -0
- package/dist/i18n/messages/memory.d.ts +123 -0
- package/dist/i18n/messages/memory.js +128 -0
- package/dist/i18n/messages/panels.d.ts +190 -0
- package/dist/i18n/messages/panels.js +189 -0
- package/dist/i18n/messages/permissions.d.ts +126 -0
- package/dist/i18n/messages/permissions.js +151 -0
- package/dist/i18n/messages/plan.d.ts +123 -0
- package/dist/i18n/messages/plan.js +124 -0
- package/dist/i18n/messages/print.d.ts +86 -0
- package/dist/i18n/messages/print.js +91 -0
- package/dist/i18n/messages/report.d.ts +391 -0
- package/dist/i18n/messages/report.js +490 -0
- package/dist/i18n/messages/rewind.d.ts +198 -0
- package/dist/i18n/messages/rewind.js +217 -0
- package/dist/i18n/messages/session.d.ts +230 -0
- package/dist/i18n/messages/session.js +258 -0
- package/dist/i18n/messages/settings.d.ts +348 -0
- package/dist/i18n/messages/settings.js +336 -0
- package/dist/i18n/messages/subcommands-config.d.ts +111 -0
- package/dist/i18n/messages/subcommands-config.js +127 -0
- package/dist/i18n/messages/subcommands.d.ts +548 -0
- package/dist/i18n/messages/subcommands.js +474 -0
- package/dist/i18n/messages/trace.d.ts +243 -0
- package/dist/i18n/messages/trace.js +238 -0
- package/dist/i18n/types.d.ts +15 -0
- package/dist/i18n/types.js +7 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +2 -0
- package/dist/memory/edit.d.ts +24 -0
- package/dist/memory/edit.js +63 -0
- package/dist/memory/frontmatter.d.ts +37 -0
- package/dist/memory/frontmatter.js +79 -0
- package/dist/memory/index.d.ts +28 -0
- package/dist/memory/index.js +126 -0
- package/dist/memory/lock.d.ts +17 -0
- package/dist/memory/lock.js +62 -0
- package/dist/memory/paths.d.ts +57 -0
- package/dist/memory/paths.js +175 -0
- package/dist/memory/report.d.ts +36 -0
- package/dist/memory/report.js +86 -0
- package/dist/memory/runtime.d.ts +42 -0
- package/dist/memory/runtime.js +36 -0
- package/dist/memory/secrets.d.ts +8 -0
- package/dist/memory/secrets.js +27 -0
- package/dist/memory/section.d.ts +28 -0
- package/dist/memory/section.js +59 -0
- package/dist/memory/store.d.ts +70 -0
- package/dist/memory/store.js +284 -0
- package/dist/memory/tool.d.ts +31 -0
- package/dist/memory/tool.js +94 -0
- package/dist/modes/acp/acp-events.js +2 -1
- package/dist/modes/acp/acp-server.js +13 -12
- package/dist/modes/commands-core.d.ts +11 -0
- package/dist/modes/commands-core.js +93 -62
- package/dist/modes/image-input.js +20 -6
- package/dist/modes/interactive/agent-bar.d.ts +95 -0
- package/dist/modes/interactive/agent-bar.js +248 -0
- package/dist/modes/interactive/agent-panels.js +27 -26
- package/dist/modes/interactive/agent-transcript.d.ts +47 -0
- package/dist/modes/interactive/agent-transcript.js +191 -0
- package/dist/modes/interactive/agent-ui.d.ts +36 -1
- package/dist/modes/interactive/agent-ui.js +180 -14
- package/dist/modes/interactive/agent-view.d.ts +72 -0
- package/dist/modes/interactive/agent-view.js +281 -0
- package/dist/modes/interactive/approval-dialog.js +46 -34
- package/dist/modes/interactive/clipboard-paste.d.ts +2 -2
- package/dist/modes/interactive/clipboard-paste.js +9 -4
- package/dist/modes/interactive/commands.d.ts +19 -1
- package/dist/modes/interactive/commands.js +84 -40
- package/dist/modes/interactive/completion.js +2 -1
- package/dist/modes/interactive/config-panel.d.ts +70 -0
- package/dist/modes/interactive/config-panel.js +319 -0
- package/dist/modes/interactive/config-ui.d.ts +96 -0
- package/dist/modes/interactive/config-ui.js +397 -0
- package/dist/modes/interactive/confirm-dialog.js +6 -7
- package/dist/modes/interactive/event-notices.js +11 -9
- package/dist/modes/interactive/interactive-mode.d.ts +1 -1
- package/dist/modes/interactive/interactive-mode.js +19 -22
- package/dist/modes/interactive/key-dispatch.d.ts +12 -0
- package/dist/modes/interactive/key-dispatch.js +24 -9
- package/dist/modes/interactive/line/line-editor.js +2 -1
- package/dist/modes/interactive/line/line-mode.js +18 -7
- package/dist/modes/interactive/line/line-render.js +25 -24
- package/dist/modes/interactive/memory-panel.d.ts +64 -0
- package/dist/modes/interactive/memory-panel.js +221 -0
- package/dist/modes/interactive/message-view.d.ts +4 -2
- package/dist/modes/interactive/message-view.js +42 -33
- package/dist/modes/interactive/panels.js +39 -31
- package/dist/modes/interactive/pickers.d.ts +2 -1
- package/dist/modes/interactive/pickers.js +10 -6
- package/dist/modes/interactive/plan-command.d.ts +1 -1
- package/dist/modes/interactive/plan-command.js +24 -27
- package/dist/modes/interactive/plan-dialog.js +18 -17
- package/dist/modes/interactive/plan-flow.js +6 -5
- package/dist/modes/interactive/rewind-command.d.ts +1 -1
- package/dist/modes/interactive/rewind-command.js +18 -16
- package/dist/modes/interactive/rewind-flow.d.ts +0 -1
- package/dist/modes/interactive/rewind-flow.js +13 -14
- package/dist/modes/interactive/rewind-list.js +7 -6
- package/dist/modes/interactive/rewind-panel.js +40 -40
- package/dist/modes/interactive/rewind-text.d.ts +5 -3
- package/dist/modes/interactive/rewind-text.js +48 -38
- package/dist/modes/interactive/run-indicator.js +15 -12
- package/dist/modes/interactive/session-events.js +3 -2
- package/dist/modes/interactive/startup-header.js +22 -23
- package/dist/modes/interactive/startup-ui.js +38 -30
- package/dist/modes/interactive/status-area.d.ts +2 -0
- package/dist/modes/interactive/status-area.js +8 -2
- package/dist/modes/interactive/status-bar.js +4 -3
- package/dist/modes/interactive/subagent-view.js +9 -7
- package/dist/modes/interactive/tasks-report.d.ts +6 -0
- package/dist/modes/interactive/tasks-report.js +28 -31
- package/dist/modes/interactive/terminal-setup.d.ts +9 -0
- package/dist/modes/interactive/terminal-setup.js +23 -0
- package/dist/modes/interactive/tool-summary.js +19 -17
- package/dist/modes/interactive/tool-view.js +7 -4
- package/dist/modes/interactive/trace-view.d.ts +89 -0
- package/dist/modes/interactive/trace-view.js +332 -0
- package/dist/modes/print/print-mode.js +14 -15
- package/dist/modes/rpc/commands.js +7 -3
- package/dist/modes/rpc/rpc-mode.js +9 -3
- package/dist/modes/session-report.d.ts +2 -0
- package/dist/modes/session-report.js +101 -105
- package/dist/modes/startup-ui-text.js +11 -6
- package/dist/permissions/bypass.d.ts +8 -10
- package/dist/permissions/bypass.js +19 -10
- package/dist/permissions/memory-class.d.ts +23 -0
- package/dist/permissions/memory-class.js +54 -0
- package/dist/permissions/modes.d.ts +3 -3
- package/dist/permissions/modes.js +21 -16
- package/dist/permissions/pipeline.d.ts +1 -1
- package/dist/permissions/pipeline.js +9 -2
- package/dist/permissions/preview.js +49 -42
- package/dist/permissions/rules.js +5 -2
- package/dist/permissions/types.d.ts +4 -0
- package/dist/plan/store.js +2 -1
- package/dist/rpc.d.ts +39 -1
- package/dist/rpc.js +3 -0
- package/dist/sandbox/bash.js +11 -8
- package/dist/sandbox/detect.js +14 -11
- package/dist/sdk.d.ts +17 -1
- package/dist/sdk.js +29 -7
- package/dist/session/export.js +31 -30
- package/dist/session/manager.d.ts +1 -1
- package/dist/session/manager.js +5 -3
- package/dist/session/reuse.js +5 -4
- package/dist/session/scan.js +3 -2
- package/dist/session/stats-aggregate.d.ts +3 -1
- package/dist/session/stats-aggregate.js +5 -1
- package/dist/session/stats-index.js +2 -1
- package/dist/session/stats-scan.d.ts +4 -1
- package/dist/session/stats-scan.js +6 -2
- package/dist/session/store.d.ts +11 -0
- package/dist/session/store.js +48 -1
- package/dist/session/types.d.ts +2 -0
- package/dist/skills/builtin.js +2 -1
- package/dist/tools/image-file.d.ts +26 -1
- package/dist/tools/image-file.js +55 -13
- package/dist/tools/presets.d.ts +14 -1
- package/dist/tools/presets.js +3 -3
- package/dist/tools/registry.js +1 -1
- package/dist/tools/truncate.d.ts +1 -1
- package/dist/tools/truncate.js +2 -2
- package/dist/tools/types.d.ts +17 -1
- package/dist/trace/build-index.d.ts +91 -0
- package/dist/trace/build-index.js +127 -0
- package/dist/trace/build-nodes.d.ts +24 -0
- package/dist/trace/build-nodes.js +279 -0
- package/dist/trace/build-util.d.ts +43 -0
- package/dist/trace/build-util.js +120 -0
- package/dist/trace/build.d.ts +82 -0
- package/dist/trace/build.js +382 -0
- package/dist/trace/detail.d.ts +35 -0
- package/dist/trace/detail.js +205 -0
- package/dist/trace/flatten.d.ts +69 -0
- package/dist/trace/flatten.js +173 -0
- package/dist/trace/format.d.ts +47 -0
- package/dist/trace/format.js +329 -0
- package/dist/trace/html-template.d.ts +19 -0
- package/dist/trace/html-template.js +150 -0
- package/dist/trace/html.d.ts +104 -0
- package/dist/trace/html.js +292 -0
- package/dist/trace/preview.d.ts +29 -0
- package/dist/trace/preview.js +59 -0
- package/dist/trace/query-session.d.ts +14 -0
- package/dist/trace/query-session.js +38 -0
- package/dist/trace/query.d.ts +55 -0
- package/dist/trace/query.js +188 -0
- package/dist/trace/session.d.ts +40 -0
- package/dist/trace/session.js +168 -0
- package/dist/trace/types.d.ts +243 -0
- package/dist/trace/types.js +13 -0
- package/dist/tui/components/editor-paste.d.ts +2 -0
- package/dist/tui/components/editor-paste.js +6 -3
- package/dist/tui/components/editor.js +2 -2
- package/dist/tui/components/loader.d.ts +3 -0
- package/dist/tui/components/loader.js +14 -0
- package/dist/tui/components/settings-list.d.ts +61 -0
- package/dist/tui/components/settings-list.js +135 -0
- package/dist/tui/keybindings.d.ts +5 -0
- package/dist/tui/keybindings.js +17 -5
- package/dist/tui.d.ts +1 -0
- package/dist/tui.js +2 -0
- package/docs/en/host-api.md +167 -0
- package/docs/en/permissions.md +214 -0
- package/docs/en/providers.md +625 -0
- package/docs/en/rpc.md +361 -0
- package/docs/en/sessions.md +219 -0
- package/docs/en/tui.md +527 -0
- package/docs/host-api.md +18 -17
- package/docs/memory.md +172 -0
- package/docs/permissions.md +2 -2
- package/docs/providers.md +67 -1
- package/docs/rpc.md +31 -3
- package/docs/session-format.md +8 -2
- package/docs/sessions.md +29 -1
- package/docs/tui.md +132 -3
- package/package.json +8 -3
package/dist/drivers/runner.js
CHANGED
|
@@ -17,6 +17,7 @@ import { AmaError } from "../errors.js";
|
|
|
17
17
|
import { defaultSetTimer } from "./base.js";
|
|
18
18
|
import { buildChildEnv } from "./env.js";
|
|
19
19
|
import { askHuman, clampMode, supportedMode } from "./permissions.js";
|
|
20
|
+
import { msg } from "../i18n/index.js";
|
|
20
21
|
export const RUN_TIMEOUT_MS = 30 * 60 * 1000;
|
|
21
22
|
export const IDLE_CLOSE_MS = 10 * 60 * 1000;
|
|
22
23
|
function toUsage(turn) {
|
|
@@ -50,13 +51,13 @@ function statusOf(turn, timedOut, stopped) {
|
|
|
50
51
|
return "failed";
|
|
51
52
|
}
|
|
52
53
|
}
|
|
53
|
-
/** 最终报告:最终文本 + 工具摘要 /
|
|
54
|
+
/** 最终报告:最终文本 + 工具摘要 / 触及文件(给协调者当资料,不是指令;[W6-C0] 标题固定英文)。 */
|
|
54
55
|
export function reportText(turn) {
|
|
55
56
|
const parts = [turn.finalText.trim()];
|
|
56
57
|
if (turn.toolSummary.length > 0)
|
|
57
|
-
parts.push(
|
|
58
|
+
parts.push(`Tool calls:\n${turn.toolSummary.map((l) => `- ${l}`).join("\n")}`);
|
|
58
59
|
if (turn.filesTouched.length > 0)
|
|
59
|
-
parts.push(
|
|
60
|
+
parts.push(`Files changed:\n${turn.filesTouched.map((f) => `- ${f}`).join("\n")}`);
|
|
60
61
|
return parts.filter((p) => p !== "").join("\n\n");
|
|
61
62
|
}
|
|
62
63
|
function failed(text, sessionId, runner) {
|
|
@@ -77,7 +78,7 @@ export class ProcessRunner {
|
|
|
77
78
|
this.deps = deps;
|
|
78
79
|
this.drivers = Array.isArray(driver) ? driver : [driver];
|
|
79
80
|
if (this.drivers.length === 0)
|
|
80
|
-
throw new AmaError("invalid_arguments", "ProcessRunner
|
|
81
|
+
throw new AmaError("invalid_arguments", "ProcessRunner needs at least one driver");
|
|
81
82
|
this.id = deps.id ?? this.drivers[0].agentId;
|
|
82
83
|
}
|
|
83
84
|
get agentId() {
|
|
@@ -93,12 +94,12 @@ export class ProcessRunner {
|
|
|
93
94
|
for (const driver of this.drivers) {
|
|
94
95
|
const probe = await driver.probe();
|
|
95
96
|
if (!probe.installed) {
|
|
96
|
-
reasons.push(`${driver.kind}
|
|
97
|
+
reasons.push(`${driver.kind} is not installed`);
|
|
97
98
|
continue;
|
|
98
99
|
}
|
|
99
100
|
const usable = supportedMode(mode, probe.capabilities.modes);
|
|
100
101
|
if (usable === undefined) {
|
|
101
|
-
reasons.push(`${driver.kind}
|
|
102
|
+
reasons.push(`${driver.kind} does not support "${mode}"`);
|
|
102
103
|
continue;
|
|
103
104
|
}
|
|
104
105
|
const warning = probe.warning;
|
|
@@ -109,14 +110,14 @@ export class ProcessRunner {
|
|
|
109
110
|
...(warning !== undefined ? { warning } : {}),
|
|
110
111
|
};
|
|
111
112
|
}
|
|
112
|
-
throw new AmaError("agent_unavailable",
|
|
113
|
+
throw new AmaError("agent_unavailable", `external agent ${this.id} is unavailable (${reasons.join("; ")})`);
|
|
113
114
|
}
|
|
114
115
|
async start(request) {
|
|
115
116
|
if (!this.deps.trusted(request.cwd))
|
|
116
|
-
throw new AmaError("agent_untrusted",
|
|
117
|
+
throw new AmaError("agent_untrusted", `${request.cwd} is not trusted by ama, so external agents cannot start here (they run the project's hooks and config); run ama trust there first`);
|
|
117
118
|
const budget = this.deps.config?.sessionBudgetUsd;
|
|
118
119
|
if (budget !== undefined && (this.deps.store?.totalUsd() ?? 0) >= budget)
|
|
119
|
-
throw new AmaError("budget_exhausted",
|
|
120
|
+
throw new AmaError("budget_exhausted", `external agent budget for this session ($${budget}) is used up`);
|
|
120
121
|
const entry = agentEntry(this.deps.config, this.agentId);
|
|
121
122
|
const mode = clampMode(request.mode, this.deps.parentMode?.(), entry?.maxMode);
|
|
122
123
|
const chosen = await this.choose(mode);
|
|
@@ -141,13 +142,15 @@ class ProcessHandle {
|
|
|
141
142
|
deps;
|
|
142
143
|
session;
|
|
143
144
|
sessionId = "";
|
|
144
|
-
chain = Promise.resolve(failed("
|
|
145
|
+
chain = Promise.resolve(failed("not started", "", ""));
|
|
145
146
|
busy = false;
|
|
146
147
|
turns = 0;
|
|
147
148
|
stopped = false;
|
|
148
149
|
lifetime = new AbortController();
|
|
149
150
|
clearIdle;
|
|
150
151
|
agent;
|
|
152
|
+
/** [W6-C0] 本回合工具的骨架(id → 种类 / 状态 / 起止),回合结束写 `turn_trace`。 */
|
|
153
|
+
turnTools = new Map();
|
|
151
154
|
constructor(runner, chosen, request, deps) {
|
|
152
155
|
this.runner = runner;
|
|
153
156
|
this.chosen = chosen;
|
|
@@ -165,7 +168,7 @@ class ProcessHandle {
|
|
|
165
168
|
request.onEvent({
|
|
166
169
|
type: "notice",
|
|
167
170
|
level: "info",
|
|
168
|
-
text:
|
|
171
|
+
text: msg().drivers.agent.modeClamped(this.agent, chosen.mode, request.mode),
|
|
169
172
|
});
|
|
170
173
|
}
|
|
171
174
|
get id() {
|
|
@@ -199,7 +202,7 @@ class ProcessHandle {
|
|
|
199
202
|
}
|
|
200
203
|
async send(text) {
|
|
201
204
|
if (this.stopped)
|
|
202
|
-
throw new AmaError("agent_closed", `${this.agent}
|
|
205
|
+
throw new AmaError("agent_closed", `${this.agent} stopped`);
|
|
203
206
|
if (this.busy && this.session?.steer !== undefined && this.chosen.capabilities.steer) {
|
|
204
207
|
await this.session.steer([{ type: "text", text }]);
|
|
205
208
|
return;
|
|
@@ -238,7 +241,18 @@ class ProcessHandle {
|
|
|
238
241
|
case "thought_delta":
|
|
239
242
|
this.emit({ type: "thought", delta: event.text });
|
|
240
243
|
return;
|
|
241
|
-
case "tool_call":
|
|
244
|
+
case "tool_call": {
|
|
245
|
+
const at = this.now();
|
|
246
|
+
const skeleton = this.turnTools.get(event.id) ?? {
|
|
247
|
+
kind: event.kind,
|
|
248
|
+
status: "in_progress",
|
|
249
|
+
startedAt: at,
|
|
250
|
+
};
|
|
251
|
+
if (event.status === "completed" || event.status === "failed") {
|
|
252
|
+
skeleton.status = event.status;
|
|
253
|
+
skeleton.endedAt = at;
|
|
254
|
+
}
|
|
255
|
+
this.turnTools.set(event.id, skeleton);
|
|
242
256
|
if (event.status === "pending")
|
|
243
257
|
return;
|
|
244
258
|
this.emit({
|
|
@@ -249,8 +263,11 @@ class ProcessHandle {
|
|
|
249
263
|
: event.status === "failed"
|
|
250
264
|
? "failed"
|
|
251
265
|
: "completed",
|
|
266
|
+
id: event.id,
|
|
267
|
+
at,
|
|
252
268
|
});
|
|
253
269
|
return;
|
|
270
|
+
}
|
|
254
271
|
case "notice":
|
|
255
272
|
this.emit({ type: "notice", level: event.level, text: event.text });
|
|
256
273
|
return;
|
|
@@ -265,7 +282,7 @@ class ProcessHandle {
|
|
|
265
282
|
this.emit({
|
|
266
283
|
type: "notice",
|
|
267
284
|
level: "warn",
|
|
268
|
-
text:
|
|
285
|
+
text: msg().drivers.agent.overBudget(this.agent),
|
|
269
286
|
});
|
|
270
287
|
cancel();
|
|
271
288
|
}
|
|
@@ -275,33 +292,61 @@ class ProcessHandle {
|
|
|
275
292
|
return;
|
|
276
293
|
}
|
|
277
294
|
}
|
|
295
|
+
now() {
|
|
296
|
+
return (this.deps.now ?? Date.now)();
|
|
297
|
+
}
|
|
298
|
+
/** [W6-C0] 回合骨架:只有种类、状态、时间与计数(不含工具标题、命令行、路径)。 */
|
|
299
|
+
emitTurnTrace(startedAt, stopReason, filesTouched) {
|
|
300
|
+
const tools = [...this.turnTools.values()];
|
|
301
|
+
this.turnTools = new Map();
|
|
302
|
+
this.emit({
|
|
303
|
+
type: "turn_trace",
|
|
304
|
+
trace: {
|
|
305
|
+
sessionId: this.sessionId,
|
|
306
|
+
turn: this.turns,
|
|
307
|
+
startedAt,
|
|
308
|
+
endedAt: this.now(),
|
|
309
|
+
stopReason,
|
|
310
|
+
tools,
|
|
311
|
+
toolCount: tools.length,
|
|
312
|
+
filesTouched,
|
|
313
|
+
},
|
|
314
|
+
});
|
|
315
|
+
}
|
|
278
316
|
/** 关掉空闲进程后再续聊:能续接的以 resume 重开。 */
|
|
279
317
|
async ensureSession() {
|
|
280
318
|
if (this.session !== undefined)
|
|
281
319
|
return this.session;
|
|
282
320
|
if (this.chosen.capabilities.resume === "none" || this.sessionId === "")
|
|
283
|
-
throw new AmaError("agent_closed", `${this.agent}
|
|
321
|
+
throw new AmaError("agent_closed", `${this.agent} session was closed while idle and cannot be resumed`);
|
|
284
322
|
await this.open(this.sessionId);
|
|
285
323
|
return this.session;
|
|
286
324
|
}
|
|
287
325
|
async runTurn(text) {
|
|
288
326
|
if (this.stopped)
|
|
289
|
-
return failed(`${this.agent}
|
|
327
|
+
return failed(`${this.agent} stopped`, this.sessionId, this.runner.id);
|
|
290
328
|
this.clearIdle?.();
|
|
291
329
|
let release;
|
|
292
330
|
const setTimer = this.deps.setTimer ?? defaultSetTimer;
|
|
293
331
|
let timedOut = false;
|
|
332
|
+
let turnStartedAt;
|
|
294
333
|
try {
|
|
295
334
|
release = await this.deps.pool.acquire(this.agent, this.lifetime.signal);
|
|
296
335
|
const session = this.session ?? (await this.ensureSession());
|
|
297
336
|
this.busy = true;
|
|
298
337
|
this.turns += 1;
|
|
338
|
+
turnStartedAt = this.now();
|
|
339
|
+
this.turnTools = new Map();
|
|
299
340
|
this.emit({ type: "turn", turn: this.turns });
|
|
300
341
|
const turnCost = { usd: 0 };
|
|
301
342
|
const cancel = () => void session.cancel();
|
|
302
343
|
const clearTimeout = setTimer(() => {
|
|
303
344
|
timedOut = true;
|
|
304
|
-
this.emit({
|
|
345
|
+
this.emit({
|
|
346
|
+
type: "notice",
|
|
347
|
+
level: "warn",
|
|
348
|
+
text: msg().drivers.agent.timedOut(this.agent),
|
|
349
|
+
});
|
|
305
350
|
cancel();
|
|
306
351
|
}, this.deps.timeoutMs ?? RUN_TIMEOUT_MS);
|
|
307
352
|
const onAbort = () => cancel();
|
|
@@ -344,10 +389,11 @@ class ProcessHandle {
|
|
|
344
389
|
this.emit({ type: "usage", usage, unit, amount });
|
|
345
390
|
}
|
|
346
391
|
const status = statusOf(turn, timedOut, this.stopped);
|
|
392
|
+
this.emitTurnTrace(turnStartedAt, timedOut ? "timeout" : turn.stopReason, turn.filesTouched.length);
|
|
347
393
|
this.armIdle();
|
|
348
394
|
return {
|
|
349
395
|
text: timedOut
|
|
350
|
-
? `${this.agent}
|
|
396
|
+
? `${this.agent} timed out and was interrupted.${turn.finalText !== "" ? `\n\n${reportText(turn)}` : ""}`
|
|
351
397
|
: reportText(turn),
|
|
352
398
|
usage,
|
|
353
399
|
stopReason: timedOut ? "timeout" : turn.stopReason,
|
|
@@ -357,12 +403,14 @@ class ProcessHandle {
|
|
|
357
403
|
};
|
|
358
404
|
}
|
|
359
405
|
catch (error) {
|
|
406
|
+
if (turnStartedAt !== undefined)
|
|
407
|
+
this.emitTurnTrace(turnStartedAt, this.stopped ? "cancelled" : "error", 0);
|
|
360
408
|
if (this.stopped)
|
|
361
409
|
return {
|
|
362
|
-
...failed(`${this.agent}
|
|
410
|
+
...failed(`${this.agent} stopped`, this.sessionId, this.runner.id),
|
|
363
411
|
status: "aborted",
|
|
364
412
|
};
|
|
365
|
-
return failed(`${this.agent}
|
|
413
|
+
return failed(`${this.agent} failed: ${error.message}`, this.sessionId, this.runner.id);
|
|
366
414
|
}
|
|
367
415
|
finally {
|
|
368
416
|
release?.();
|
package/dist/drivers/turn.js
CHANGED
|
@@ -78,7 +78,7 @@ export class TurnCollector {
|
|
|
78
78
|
const summary = lines.length > TOOL_SUMMARY_LINES
|
|
79
79
|
? [
|
|
80
80
|
...lines.slice(0, TOOL_SUMMARY_LINES - 1),
|
|
81
|
-
`…
|
|
81
|
+
`… ${lines.length - TOOL_SUMMARY_LINES + 1} more tool calls`,
|
|
82
82
|
]
|
|
83
83
|
: lines;
|
|
84
84
|
const result = {
|
package/dist/hooks/config.js
CHANGED
|
@@ -13,6 +13,7 @@ import { HOOKS_FILE, projectFile, userFile } from "../config/paths.js";
|
|
|
13
13
|
import { HOOK_TIMEOUT_MAX_MS } from "../config/schema.js";
|
|
14
14
|
import { checkMatcher } from "./matcher.js";
|
|
15
15
|
import { HOOK_EVENTS } from "./types.js";
|
|
16
|
+
import { msg } from "../i18n/index.js";
|
|
16
17
|
export const DEFAULT_HOOK_TIMEOUT_MS = 60_000;
|
|
17
18
|
export function clampTimeout(value, fallback) {
|
|
18
19
|
const v = value ?? fallback;
|
|
@@ -53,7 +54,7 @@ function validateMatchers(file, config) {
|
|
|
53
54
|
});
|
|
54
55
|
}
|
|
55
56
|
if (problems.length > 0) {
|
|
56
|
-
throw new StartupError("config_invalid",
|
|
57
|
+
throw new StartupError("config_invalid", msg().drivers.hooks.configInvalid(problems.map((p) => `${file}: ${p}`).join("\n ")), 3);
|
|
57
58
|
}
|
|
58
59
|
}
|
|
59
60
|
function readLayer(source, file, required) {
|
|
@@ -84,7 +85,7 @@ export function loadHookConfigs(input) {
|
|
|
84
85
|
else if (existsSync(projectPath)) {
|
|
85
86
|
// 未信任时不解析内容(不让不可信文件的语法错误阻断启动),只看存在性。
|
|
86
87
|
skippedProject = projectPath;
|
|
87
|
-
warnings.push(
|
|
88
|
+
warnings.push(msg().drivers.hooks.projectUntrusted(projectPath));
|
|
88
89
|
}
|
|
89
90
|
const result = {
|
|
90
91
|
hooks: flattenHookLayers(layers, input.defaultTimeoutMs ?? DEFAULT_HOOK_TIMEOUT_MS),
|
package/dist/hooks/protocol.js
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* 合并:决策最严 `deny > block > ask > allow`;`updatedInput` / `updatedPrompt` 只接受唯一
|
|
7
7
|
* 一个返回者(多个则全部忽略并 warning);`additionalContext` / `customInstructions` 按配置顺序拼接。
|
|
8
8
|
*/
|
|
9
|
+
import { msg } from "../i18n/index.js";
|
|
9
10
|
export const DECISION_SEVERITY = {
|
|
10
11
|
deny: 4,
|
|
11
12
|
block: 3,
|
|
@@ -60,7 +61,7 @@ export function parseHookOutput(stdout) {
|
|
|
60
61
|
output.decision = decision;
|
|
61
62
|
}
|
|
62
63
|
else {
|
|
63
|
-
warnings.push(
|
|
64
|
+
warnings.push(msg().drivers.hooks.unknownDecision(JSON.stringify(decision)));
|
|
64
65
|
}
|
|
65
66
|
}
|
|
66
67
|
for (const key of [
|
|
@@ -75,7 +76,7 @@ export function parseHookOutput(stdout) {
|
|
|
75
76
|
if (typeof v === "string")
|
|
76
77
|
output[key] = v;
|
|
77
78
|
else
|
|
78
|
-
warnings.push(
|
|
79
|
+
warnings.push(msg().drivers.hooks.notString(key));
|
|
79
80
|
}
|
|
80
81
|
if ("updatedInput" in raw)
|
|
81
82
|
output.updatedInput = raw["updatedInput"];
|
|
@@ -85,8 +86,9 @@ export function parseHookOutput(stdout) {
|
|
|
85
86
|
output.suppressOutput = true;
|
|
86
87
|
return { output, warnings };
|
|
87
88
|
}
|
|
88
|
-
|
|
89
|
-
|
|
89
|
+
/** [W6-C0] 回给模型的阻止理由固定英文(警告仍给人看)。 */
|
|
90
|
+
function describeForModel(result) {
|
|
91
|
+
return `Hook ${result.event} "${result.command}"`;
|
|
90
92
|
}
|
|
91
93
|
function normalizeDecision(event, decision) {
|
|
92
94
|
const accepted = ACCEPTED[event];
|
|
@@ -101,23 +103,27 @@ function normalizeDecision(event, decision) {
|
|
|
101
103
|
export function interpretResult(result) {
|
|
102
104
|
const event = result.event;
|
|
103
105
|
if (result.timedOut) {
|
|
104
|
-
const message =
|
|
106
|
+
const message = msg().drivers.hooks.timedOut(event, result.command, result.durationMs);
|
|
105
107
|
if (event === "PreToolUse")
|
|
106
|
-
return {
|
|
108
|
+
return {
|
|
109
|
+
decision: "deny",
|
|
110
|
+
reason: `${describeForModel(result)} timed out (${result.durationMs} ms)`,
|
|
111
|
+
warning: message,
|
|
112
|
+
useOutput: false,
|
|
113
|
+
};
|
|
107
114
|
return { warning: message, useOutput: false };
|
|
108
115
|
}
|
|
109
116
|
if (result.exitCode === 2) {
|
|
110
117
|
const decision = blockingDecision(event);
|
|
111
|
-
const reason = result.stderr.trim() || `${
|
|
118
|
+
const reason = result.stderr.trim() || `${describeForModel(result)} blocked with exit code 2`;
|
|
112
119
|
if (decision === undefined)
|
|
113
120
|
return { useOutput: false };
|
|
114
121
|
return { decision, reason, useOutput: false };
|
|
115
122
|
}
|
|
116
123
|
if (result.exitCode !== 0) {
|
|
117
124
|
const tail = result.stderr.trim().split("\n").slice(-3).join(" | ");
|
|
118
|
-
const code = result.exitCode === null ? "被信号终止" : `退出码 ${result.exitCode}`;
|
|
119
125
|
return {
|
|
120
|
-
warning:
|
|
126
|
+
warning: msg().drivers.hooks.failed(event, result.command, result.exitCode, tail),
|
|
121
127
|
useOutput: false,
|
|
122
128
|
};
|
|
123
129
|
}
|
|
@@ -128,7 +134,7 @@ export function interpretResult(result) {
|
|
|
128
134
|
if (decision === undefined) {
|
|
129
135
|
return {
|
|
130
136
|
useOutput: true,
|
|
131
|
-
warning:
|
|
137
|
+
warning: msg().drivers.hooks.invalidDecision(event, result.command, output.decision),
|
|
132
138
|
};
|
|
133
139
|
}
|
|
134
140
|
const interpreted = { decision, useOutput: true };
|
|
@@ -200,12 +206,12 @@ export function mergeResults(results, extraWarnings = []) {
|
|
|
200
206
|
outcome.hasUpdatedInput = true;
|
|
201
207
|
}
|
|
202
208
|
else if (inputs.length > 1) {
|
|
203
|
-
warnings.push(
|
|
209
|
+
warnings.push(msg().drivers.hooks.multipleInputs(inputs.length));
|
|
204
210
|
}
|
|
205
211
|
if (prompts.length === 1 && prompts[0] !== undefined)
|
|
206
212
|
outcome.updatedPrompt = prompts[0];
|
|
207
213
|
else if (prompts.length > 1)
|
|
208
|
-
warnings.push(
|
|
214
|
+
warnings.push(msg().drivers.hooks.multiplePrompts(prompts.length));
|
|
209
215
|
const additionalContext = joinTexts(contexts);
|
|
210
216
|
if (additionalContext !== undefined)
|
|
211
217
|
outcome.additionalContext = additionalContext;
|
package/dist/host/api-impl.js
CHANGED
|
@@ -14,6 +14,7 @@ import { HostRunnerRegistry } from "../drivers/host-runners.js";
|
|
|
14
14
|
import { AmaError } from "../errors.js";
|
|
15
15
|
import { AMA_VERSION } from "../version.js";
|
|
16
16
|
import { HOST_API_VERSION } from "./types.js";
|
|
17
|
+
import { msg } from "../i18n/index.js";
|
|
17
18
|
/** 进程内事件总线(宿主观察 AgentEvents)。 */
|
|
18
19
|
export class AgentEventBus {
|
|
19
20
|
handlers = new Map();
|
|
@@ -42,7 +43,7 @@ export class AgentEventBus {
|
|
|
42
43
|
await handler(event);
|
|
43
44
|
}
|
|
44
45
|
catch (error) {
|
|
45
|
-
this.log("error",
|
|
46
|
+
this.log("error", msg().drivers.host.handlerFailed(name), error);
|
|
46
47
|
}
|
|
47
48
|
}
|
|
48
49
|
}
|
|
@@ -55,16 +56,16 @@ export function hostRunnersOf(api) {
|
|
|
55
56
|
}
|
|
56
57
|
function validateTool(tool) {
|
|
57
58
|
if (typeof tool !== "object" || tool === null) {
|
|
58
|
-
throw new AmaError("invalid_arguments",
|
|
59
|
+
throw new AmaError("invalid_arguments", msg().drivers.host.toolNotObject);
|
|
59
60
|
}
|
|
60
61
|
if (typeof tool.name !== "string" || !TOOL_NAME.test(tool.name)) {
|
|
61
|
-
throw new AmaError("invalid_arguments",
|
|
62
|
+
throw new AmaError("invalid_arguments", msg().drivers.host.toolBadName(String(tool.name)));
|
|
62
63
|
}
|
|
63
64
|
if (typeof tool.execute !== "function") {
|
|
64
|
-
throw new AmaError("invalid_arguments",
|
|
65
|
+
throw new AmaError("invalid_arguments", msg().drivers.host.toolNoExecute(tool.name));
|
|
65
66
|
}
|
|
66
67
|
if (!["read", "write", "execute"].includes(tool.permission)) {
|
|
67
|
-
throw new AmaError("invalid_arguments",
|
|
68
|
+
throw new AmaError("invalid_arguments", msg().drivers.host.toolBadPermission(tool.name));
|
|
68
69
|
}
|
|
69
70
|
}
|
|
70
71
|
export function createHostApi(deps) {
|
|
@@ -97,7 +98,7 @@ export function createHostApi(deps) {
|
|
|
97
98
|
register(tool) {
|
|
98
99
|
validateTool(tool);
|
|
99
100
|
if (deps.tools.get(tool.name) !== undefined) {
|
|
100
|
-
throw new AmaError("tool_exists",
|
|
101
|
+
throw new AmaError("tool_exists", msg().drivers.host.toolExists(tool.name));
|
|
101
102
|
}
|
|
102
103
|
deps.tools.register(tool, "host");
|
|
103
104
|
registeredTools.push(tool.name);
|
|
@@ -112,10 +113,10 @@ export function createHostApi(deps) {
|
|
|
112
113
|
instructions: Object.freeze({
|
|
113
114
|
add(source) {
|
|
114
115
|
if (source.kind === "file" && typeof source.path !== "string") {
|
|
115
|
-
throw new AmaError("invalid_arguments",
|
|
116
|
+
throw new AmaError("invalid_arguments", msg().drivers.host.instructionNeedsPath);
|
|
116
117
|
}
|
|
117
118
|
if (source.kind === "text" && typeof source.text !== "string") {
|
|
118
|
-
throw new AmaError("invalid_arguments",
|
|
119
|
+
throw new AmaError("invalid_arguments", msg().drivers.host.instructionNeedsText);
|
|
119
120
|
}
|
|
120
121
|
instructions.push({ ...source });
|
|
121
122
|
},
|
|
@@ -126,7 +127,7 @@ export function createHostApi(deps) {
|
|
|
126
127
|
approvals: Object.freeze({
|
|
127
128
|
setBroker(next) {
|
|
128
129
|
if (typeof next?.ask !== "function") {
|
|
129
|
-
throw new AmaError("invalid_arguments",
|
|
130
|
+
throw new AmaError("invalid_arguments", msg().drivers.host.brokerNeedsAsk);
|
|
130
131
|
}
|
|
131
132
|
broker = next;
|
|
132
133
|
},
|
|
@@ -155,7 +156,7 @@ export function createHostApi(deps) {
|
|
|
155
156
|
cache: Object.freeze({
|
|
156
157
|
onWarmingDecision(handler) {
|
|
157
158
|
if (typeof handler !== "function") {
|
|
158
|
-
throw new AmaError("invalid_arguments",
|
|
159
|
+
throw new AmaError("invalid_arguments", msg().drivers.host.warmingNeedsFunction);
|
|
159
160
|
}
|
|
160
161
|
warmingHandlers.push(handler);
|
|
161
162
|
return () => {
|
package/dist/host/loader.js
CHANGED
|
@@ -15,6 +15,7 @@ import { isAbsolute, resolve } from "node:path";
|
|
|
15
15
|
import { pathToFileURL } from "node:url";
|
|
16
16
|
import { StartupError } from "../errors.js";
|
|
17
17
|
import { HOST_API_VERSION } from "./types.js";
|
|
18
|
+
import { msg } from "../i18n/index.js";
|
|
18
19
|
const EXIT_HOST = 6;
|
|
19
20
|
const EXIT_HOST_VERSION = 78;
|
|
20
21
|
export const HOST_CREATE_TIMEOUT_MS = 10_000;
|
|
@@ -66,25 +67,25 @@ export function extractHostModule(namespace, label) {
|
|
|
66
67
|
}
|
|
67
68
|
const found = candidates.find((c) => isRecord(c) && ("hostApi" in c || "create" in c));
|
|
68
69
|
if (!isRecord(found))
|
|
69
|
-
throw loadFailure(
|
|
70
|
+
throw loadFailure(msg().drivers.host.notAdapter(label));
|
|
70
71
|
if (found["hostApi"] !== HOST_API_VERSION) {
|
|
71
|
-
throw new StartupError("host_version_mismatch",
|
|
72
|
+
throw new StartupError("host_version_mismatch", msg().drivers.host.versionMismatch(label, String(found["hostApi"]), HOST_API_VERSION), EXIT_HOST_VERSION);
|
|
72
73
|
}
|
|
73
74
|
if (typeof found["create"] !== "function")
|
|
74
|
-
throw loadFailure(
|
|
75
|
+
throw loadFailure(msg().drivers.host.noCreate(label));
|
|
75
76
|
return found;
|
|
76
77
|
}
|
|
77
78
|
/** 加载并校验适配器模块。 */
|
|
78
79
|
export async function loadHostModule(spec, cwd = process.cwd()) {
|
|
79
80
|
const path = isAbsolute(spec) ? spec : resolve(cwd, spec);
|
|
80
81
|
if (!existsSync(path))
|
|
81
|
-
throw loadFailure(
|
|
82
|
+
throw loadFailure(msg().drivers.host.notFound(path));
|
|
82
83
|
let namespace;
|
|
83
84
|
try {
|
|
84
85
|
namespace = await importModule(path);
|
|
85
86
|
}
|
|
86
87
|
catch (error) {
|
|
87
|
-
throw loadFailure(
|
|
88
|
+
throw loadFailure(msg().drivers.host.loadFailed(path, errorText(error)), error);
|
|
88
89
|
}
|
|
89
90
|
return extractHostModule(namespace, path);
|
|
90
91
|
}
|
|
@@ -92,7 +93,7 @@ export async function loadHostModule(spec, cwd = process.cwd()) {
|
|
|
92
93
|
export async function createAdapter(module, api, label, timeoutMs = HOST_CREATE_TIMEOUT_MS) {
|
|
93
94
|
let timer;
|
|
94
95
|
const timeout = new Promise((_, reject) => {
|
|
95
|
-
timer = setTimeout(() => reject(loadFailure(
|
|
96
|
+
timer = setTimeout(() => reject(loadFailure(msg().drivers.host.createTimeout(label, timeoutMs))), timeoutMs);
|
|
96
97
|
});
|
|
97
98
|
let adapter;
|
|
98
99
|
try {
|
|
@@ -101,7 +102,7 @@ export async function createAdapter(module, api, label, timeoutMs = HOST_CREATE_
|
|
|
101
102
|
catch (error) {
|
|
102
103
|
if (error instanceof StartupError)
|
|
103
104
|
throw error;
|
|
104
|
-
throw loadFailure(
|
|
105
|
+
throw loadFailure(msg().drivers.host.createFailed(label, errorText(error)), error);
|
|
105
106
|
}
|
|
106
107
|
finally {
|
|
107
108
|
clearTimeout(timer);
|
|
@@ -109,7 +110,7 @@ export async function createAdapter(module, api, label, timeoutMs = HOST_CREATE_
|
|
|
109
110
|
if (adapter === undefined || adapter === null)
|
|
110
111
|
return undefined;
|
|
111
112
|
if (typeof adapter !== "object" || typeof adapter.id !== "string" || adapter.id === "") {
|
|
112
|
-
throw loadFailure(
|
|
113
|
+
throw loadFailure(msg().drivers.host.noId(label));
|
|
113
114
|
}
|
|
114
115
|
return adapter;
|
|
115
116
|
}
|
package/dist/host/types.d.ts
CHANGED
|
@@ -19,6 +19,7 @@ import type { CacheMiss, WarmingDecisionHandler } from "../ai/cache/types.js";
|
|
|
19
19
|
import type { HookEvent } from "../hooks/types.js";
|
|
20
20
|
import type { ApprovalBroker, ApprovalDecision } from "../permissions/types.js";
|
|
21
21
|
import type { SubagentRunner, ToolDefinition } from "../tools/types.js";
|
|
22
|
+
import type { QuotaUpdateEvent } from "../agent/types-w6.js";
|
|
22
23
|
import type { PlanProposedEvent, PlanResolvedEvent, SubagentEndEvent, SubagentStartEvent } from "../agent/types-w5.js";
|
|
23
24
|
export type { ActionPreview, ActionPreviewTarget, ApprovalBroker, ApprovalDecision, ApprovalReason, ApprovalRequest, ApprovalRequestContext, } from "../permissions/types.js";
|
|
24
25
|
export type { RunnerHandle, SubagentEvent, SubagentRunRequest, SubagentRunner, ToolAnnotations, ToolContext, ToolDefinition, ToolExecutionMode, ToolPermission, ToolResult, } from "../tools/types.js";
|
|
@@ -115,6 +116,8 @@ export interface AgentEvents {
|
|
|
115
116
|
/** [W5-C0] 计划提出 / 审批结果。 */
|
|
116
117
|
plan_proposed: Omit<PlanProposedEvent, "type">;
|
|
117
118
|
plan_resolved: Omit<PlanResolvedEvent, "type">;
|
|
119
|
+
/** [W6-O] ChatGPT 订阅配额更新(docs/wave6-plan.md §4.5)。 */
|
|
120
|
+
quota_update: Omit<QuotaUpdateEvent, "type">;
|
|
118
121
|
}
|
|
119
122
|
/** [W5-C0] 宿主注入的 runner:`id` 即 `task(agent=<id>)` 的名字,`description` 进 task 工具描述。 */
|
|
120
123
|
export type HostRunner = SubagentRunner & {
|