@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/config/types.d.ts
CHANGED
|
@@ -15,7 +15,10 @@ import type { Api, AuthHeader, CacheRetention, Model, ModelThinkingLevel, Provid
|
|
|
15
15
|
import type { PermissionMode } from "../permissions/types.js";
|
|
16
16
|
import type { CheckpointMode } from "../checkpoints/types.js";
|
|
17
17
|
import type { AmaConfigW5, PruneConfig, StatusLineMode } from "./types-w5.js";
|
|
18
|
+
import type { AmaConfigW6, AuthFileEntry, ProfileMemoryOptions, UiConfigW6 } from "./types-w6.js";
|
|
18
19
|
export type * from "./types-w5.js";
|
|
20
|
+
export type * from "./types-w6.js";
|
|
21
|
+
export { AGENT_BAR_MODES, CHATGPT_FLAVORS, LANGUAGE_SETTINGS, MEMORY_SCOPES, MEMORY_SUBAGENT_MODES, apiKeyEntry, isOAuthEntry, } from "./types-w6.js";
|
|
19
22
|
export { AGENTS_RESERVED_KEYS, IMAGE_RESIZE_MODES, PLAN_BASH_MODES_STRICT_FIRST, PLAN_UNATTENDED_MODES, STATUS_LINE_MODES, agentEntry, } from "./types-w5.js";
|
|
20
23
|
export declare const CONFIG_FILE_VERSION: 1;
|
|
21
24
|
/**
|
|
@@ -130,7 +133,7 @@ export interface CodemodeConfig {
|
|
|
130
133
|
export interface HooksSettings {
|
|
131
134
|
timeoutMs?: number;
|
|
132
135
|
}
|
|
133
|
-
export interface UiConfig {
|
|
136
|
+
export interface UiConfig extends UiConfigW6 {
|
|
134
137
|
/** auto 按 `COLORFGBG` / `TERM_PROGRAM` 猜(不发查询序列),猜不出用 dark。 */
|
|
135
138
|
theme?: "dark" | "light" | "auto";
|
|
136
139
|
markdown?: boolean;
|
|
@@ -209,7 +212,7 @@ export interface SandboxConfig {
|
|
|
209
212
|
writable?: string[];
|
|
210
213
|
}
|
|
211
214
|
/** config.json(用户级 / 项目级 / profile.config 同形状;项目级只接受受限字段,§10.2)。 */
|
|
212
|
-
export interface AmaConfig extends AmaConfigW5 {
|
|
215
|
+
export interface AmaConfig extends AmaConfigW5, AmaConfigW6 {
|
|
213
216
|
version: typeof CONFIG_FILE_VERSION;
|
|
214
217
|
/** `provider/model-id`。 */
|
|
215
218
|
defaultModel?: string;
|
|
@@ -228,14 +231,10 @@ export interface AmaConfig extends AmaConfigW5 {
|
|
|
228
231
|
checkpoints?: CheckpointsConfig;
|
|
229
232
|
sandbox?: SandboxConfig;
|
|
230
233
|
}
|
|
231
|
-
/** auth.json(0600)。 */
|
|
234
|
+
/** auth.json(0600)。[W6-C0] 条目可以是 API key 或 OAuth(`isOAuthEntry` / `apiKeyEntry` 区分)。 */
|
|
232
235
|
export interface AuthFile {
|
|
233
236
|
version: typeof CONFIG_FILE_VERSION;
|
|
234
|
-
providers: Record<string,
|
|
235
|
-
apiKey: string;
|
|
236
|
-
env?: Record<string, string>;
|
|
237
|
-
baseUrl?: string;
|
|
238
|
-
}>;
|
|
237
|
+
providers: Record<string, AuthFileEntry>;
|
|
239
238
|
}
|
|
240
239
|
/** profile.json(宿主用,§10.3;与 Armadra 文档 B §2.4 一致);路径必须是绝对路径,不含密钥。 */
|
|
241
240
|
export interface ProfileFile {
|
|
@@ -253,6 +252,10 @@ export interface ProfileFile {
|
|
|
253
252
|
sessionDir?: string;
|
|
254
253
|
config?: string;
|
|
255
254
|
trustProject?: boolean;
|
|
255
|
+
/** [W6-C0] 宿主界面语言(跟随画布);优先于配置的 `ui.language`,`AMA_LANG` / `--lang` 仍更优先。 */
|
|
256
|
+
language?: "zh" | "en";
|
|
257
|
+
/** [W6-C0] 记忆(W6-M):缺省禁用;`enabled: true` 时 `dir` 必填(按工作空间隔离的绝对路径)。 */
|
|
258
|
+
memory?: ProfileMemoryOptions;
|
|
256
259
|
}
|
|
257
260
|
export interface TrustEntry {
|
|
258
261
|
path: string;
|
package/dist/config/types.js
CHANGED
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
* (W5-C0)第五波配置键(docs/wave5-plan.md §9):新段的形状在 types-w5.ts(`AmaConfigW5` 并入
|
|
11
11
|
* `AmaConfig`),已有段加 `ui.statusLine`、`compaction.prune / pruneExclude`、profile `agentDirs`。
|
|
12
12
|
*/
|
|
13
|
+
export { AGENT_BAR_MODES, CHATGPT_FLAVORS, LANGUAGE_SETTINGS, MEMORY_SCOPES, MEMORY_SUBAGENT_MODES, apiKeyEntry, isOAuthEntry, } from "./types-w6.js";
|
|
13
14
|
export { AGENTS_RESERVED_KEYS, IMAGE_RESIZE_MODES, PLAN_BASH_MODES_STRICT_FIRST, PLAN_UNATTENDED_MODES, STATUS_LINE_MODES, agentEntry, } from "./types-w5.js";
|
|
14
15
|
export const CONFIG_FILE_VERSION = 1;
|
|
15
16
|
/** 渠道名:不含 `/` 与 `@`(`provider/model@channel`)。 */
|
|
@@ -66,7 +66,7 @@ export class AcpClient {
|
|
|
66
66
|
...(this.options.clientInfo !== undefined ? { clientInfo: this.options.clientInfo } : {}),
|
|
67
67
|
}, signal);
|
|
68
68
|
if (result.protocolVersion !== ACP_PROTOCOL_VERSION)
|
|
69
|
-
throw new RpcError(RPC_ERRORS.invalidRequest, `ACP
|
|
69
|
+
throw new RpcError(RPC_ERRORS.invalidRequest, `incompatible ACP protocol version: agent ${String(result.protocolVersion)}, client ${ACP_PROTOCOL_VERSION}`);
|
|
70
70
|
this.initResult = result;
|
|
71
71
|
return result;
|
|
72
72
|
}
|
|
@@ -14,6 +14,7 @@ import { stderrHint } from "../process.js";
|
|
|
14
14
|
import { TurnCollector, oneLine } from "../turn.js";
|
|
15
15
|
import { AcpClient } from "./client.js";
|
|
16
16
|
import { AMA_VERSION } from "../../version.js";
|
|
17
|
+
import { msg } from "../../i18n/index.js";
|
|
17
18
|
export function toAcpContent(blocks, images) {
|
|
18
19
|
const out = [];
|
|
19
20
|
for (const block of blocks) {
|
|
@@ -111,7 +112,7 @@ export class AcpDriver {
|
|
|
111
112
|
if (error instanceof AmaError)
|
|
112
113
|
throw error;
|
|
113
114
|
const hint = stderrHint(transport);
|
|
114
|
-
throw new AmaError("agent_start_failed", `${this.agentId}
|
|
115
|
+
throw new AmaError("agent_start_failed", `${this.agentId}: ACP failed to start (${error.message})${hint !== "" ? `: ${hint}` : ""}`, { cause: error });
|
|
115
116
|
}
|
|
116
117
|
return session;
|
|
117
118
|
}
|
|
@@ -164,7 +165,7 @@ class AcpDriverSession {
|
|
|
164
165
|
this.id = options.resume;
|
|
165
166
|
}
|
|
166
167
|
else {
|
|
167
|
-
this.notices.push(
|
|
168
|
+
this.notices.push(msg().drivers.agent.resumeUnsupported(this.agentId));
|
|
168
169
|
}
|
|
169
170
|
}
|
|
170
171
|
if (this.id === "") {
|
|
@@ -178,17 +179,17 @@ class AcpDriverSession {
|
|
|
178
179
|
await this.client.setMode(this.id, modeId);
|
|
179
180
|
}
|
|
180
181
|
else if (isReadOnlyMode(options.mode)) {
|
|
181
|
-
throw new AmaError("agent_mode_unsupported", `${this.agentId}
|
|
182
|
+
throw new AmaError("agent_mode_unsupported", `${this.agentId} has no read-only mode matching ama's "${options.mode}"; its default mode cannot stand in for it`);
|
|
182
183
|
}
|
|
183
184
|
else if (modes != null) {
|
|
184
|
-
this.notices.push(
|
|
185
|
+
this.notices.push(msg().drivers.agent.noMatchingMode(this.agentId, options.mode));
|
|
185
186
|
}
|
|
186
187
|
}
|
|
187
188
|
async prompt(content, hooks) {
|
|
188
189
|
if (this.closed)
|
|
189
|
-
throw new AmaError("agent_closed", `${this.agentId}
|
|
190
|
+
throw new AmaError("agent_closed", `${this.agentId} session is closed`);
|
|
190
191
|
if (this.running !== undefined)
|
|
191
|
-
throw new AmaError("busy", `${this.agentId}
|
|
192
|
+
throw new AmaError("busy", `${this.agentId} is already running`);
|
|
192
193
|
const turn = new TurnCollector((e) => hooks.onEvent(e));
|
|
193
194
|
for (const text of this.notices.splice(0))
|
|
194
195
|
turn.push({ type: "notice", level: "info", text });
|
|
@@ -196,7 +197,11 @@ class AcpDriverSession {
|
|
|
196
197
|
this.turn = turn;
|
|
197
198
|
const images = this.client.supportsImages();
|
|
198
199
|
if (!images && content.some((b) => b.type === "image"))
|
|
199
|
-
turn.push({
|
|
200
|
+
turn.push({
|
|
201
|
+
type: "notice",
|
|
202
|
+
level: "warn",
|
|
203
|
+
text: msg().drivers.agent.noImages(this.agentId),
|
|
204
|
+
});
|
|
200
205
|
const request = this.client.prompt(this.id, toAcpContent(content, images));
|
|
201
206
|
this.running = request;
|
|
202
207
|
try {
|
|
@@ -204,7 +209,7 @@ class AcpDriverSession {
|
|
|
204
209
|
if (this.client.isOpen)
|
|
205
210
|
throw error;
|
|
206
211
|
const hint = stderrHint(this.transport);
|
|
207
|
-
throw new AmaError("agent_exited", `${this.agentId}
|
|
212
|
+
throw new AmaError("agent_exited", `${this.agentId} process exited${hint !== "" ? `: ${hint}` : ""}`, {
|
|
208
213
|
cause: error,
|
|
209
214
|
});
|
|
210
215
|
});
|
package/dist/drivers/agents.js
CHANGED
|
@@ -22,6 +22,7 @@ import { poolFromConfig } from "./pool.js";
|
|
|
22
22
|
import { ProgramProbe } from "./probe.js";
|
|
23
23
|
import { spawnTransport } from "./process.js";
|
|
24
24
|
import { ProcessRunner } from "./runner.js";
|
|
25
|
+
import { msg } from "../i18n/index.js";
|
|
25
26
|
/** 按候选种类建驱动。 */
|
|
26
27
|
export function createDriver(agentId, candidate, deps) {
|
|
27
28
|
switch (candidate.kind) {
|
|
@@ -55,7 +56,7 @@ export class ExternalAgents {
|
|
|
55
56
|
.reapOrphans()
|
|
56
57
|
.then((killed) => {
|
|
57
58
|
if (killed.length > 0)
|
|
58
|
-
options.log?.("info",
|
|
59
|
+
options.log?.("info", msg().drivers.agent.reapedOrphans(killed.join(", ")));
|
|
59
60
|
})
|
|
60
61
|
.catch(() => undefined);
|
|
61
62
|
}
|
|
@@ -82,13 +83,13 @@ export class ExternalAgents {
|
|
|
82
83
|
if (hosted !== undefined)
|
|
83
84
|
return hosted;
|
|
84
85
|
if (this.options.hosted)
|
|
85
|
-
throw new AmaError("agent_host_only",
|
|
86
|
+
throw new AmaError("agent_host_only", `when embedded, external agents come from the host: "${spec}" was not provided by the host (ama does not start external CLIs itself)`);
|
|
86
87
|
const cached = this.runners.get(spec);
|
|
87
88
|
if (cached !== undefined)
|
|
88
89
|
return cached;
|
|
89
90
|
const found = candidatesFor(spec);
|
|
90
91
|
if (found === undefined)
|
|
91
|
-
throw new AmaError("agent_unknown",
|
|
92
|
+
throw new AmaError("agent_unknown", `unknown external agent: ${spec}`);
|
|
92
93
|
const drivers = found.candidates.map((c) => createDriver(found.agentId, c, this.driverDeps));
|
|
93
94
|
const o = this.options;
|
|
94
95
|
const runner = new ProcessRunner(drivers, {
|
package/dist/drivers/base.js
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
import { candidateCapabilities } from "./catalog.js";
|
|
5
5
|
import { versionSatisfies } from "./probe.js";
|
|
6
6
|
import { spawnTransport } from "./process.js";
|
|
7
|
+
import { msg } from "../i18n/index.js";
|
|
7
8
|
/** 中断后等回合结束的宽限;过了关 stdin,再 SIGTERM 进程树(§5.2 cancel)。 */
|
|
8
9
|
export const CANCEL_GRACE_MS = 15_000;
|
|
9
10
|
export function defaultSetTimer(fn, ms) {
|
|
@@ -32,7 +33,7 @@ export async function probeCandidate(candidate, deps) {
|
|
|
32
33
|
if (candidate.verified !== undefined &&
|
|
33
34
|
located.version !== undefined &&
|
|
34
35
|
!versionSatisfies(located.version, candidate.verified))
|
|
35
|
-
out.warning =
|
|
36
|
+
out.warning = msg().drivers.agent.unverifiedVersion(candidate.program, located.version, candidate.verified);
|
|
36
37
|
return out;
|
|
37
38
|
}
|
|
38
39
|
/**
|
|
@@ -44,7 +45,7 @@ export function armCancelWatchdog(transport, turnDone, deps) {
|
|
|
44
45
|
let fired = false;
|
|
45
46
|
const clear = setTimer(() => {
|
|
46
47
|
fired = true;
|
|
47
|
-
deps.log?.("warn",
|
|
48
|
+
deps.log?.("warn", msg().drivers.agent.cancelGraceExpired);
|
|
48
49
|
void transport.terminate();
|
|
49
50
|
}, deps.cancelGraceMs ?? CANCEL_GRACE_MS);
|
|
50
51
|
void turnDone.finally(() => {
|
|
@@ -6,12 +6,13 @@
|
|
|
6
6
|
* `onChange` 供 `/agents` / RPC `get_agents` 的缓存刷新。
|
|
7
7
|
*/
|
|
8
8
|
import { AmaError } from "../errors.js";
|
|
9
|
+
import { msg } from "../i18n/index.js";
|
|
9
10
|
export class HostRunnerRegistry {
|
|
10
11
|
runners = new Map();
|
|
11
12
|
listeners = new Set();
|
|
12
13
|
provide(runner) {
|
|
13
14
|
if (typeof runner?.id !== "string" || runner.id === "" || typeof runner.start !== "function")
|
|
14
|
-
throw new AmaError("invalid_arguments",
|
|
15
|
+
throw new AmaError("invalid_arguments", msg().drivers.host.runnerNeedsIdStart);
|
|
15
16
|
this.runners.set(runner.id, runner);
|
|
16
17
|
this.changed();
|
|
17
18
|
return () => {
|
|
@@ -21,6 +21,7 @@ import { armCancelWatchdog, probeCandidate, spawnOf } from "../base.js";
|
|
|
21
21
|
import { stderrHint } from "../process.js";
|
|
22
22
|
import { TurnCollector, oneLine } from "../turn.js";
|
|
23
23
|
import { CLAUDE_QUESTION_TOOLS, claudePermissionMode, claudeStopReason, claudeTodos, claudeToolKind, claudeToolLocations, claudeToolTitle, sessionScopedSuggestions, } from "./claude-normalize.js";
|
|
24
|
+
import { msg as messages } from "../../i18n/index.js";
|
|
24
25
|
export function claudeArgs(options, sessionId, manualName = "manual") {
|
|
25
26
|
const args = [
|
|
26
27
|
"-p",
|
|
@@ -93,7 +94,7 @@ export class ClaudeStreamDriver {
|
|
|
93
94
|
}
|
|
94
95
|
catch (error) {
|
|
95
96
|
await session.close();
|
|
96
|
-
throw new AmaError("agent_start_failed", `${this.agentId}
|
|
97
|
+
throw new AmaError("agent_start_failed", `${this.agentId}: failed to start (${error.message})${stderrHint(transport) !== "" ? `: ${stderrHint(transport)}` : ""}`, { cause: error });
|
|
97
98
|
}
|
|
98
99
|
return session;
|
|
99
100
|
}
|
|
@@ -143,14 +144,14 @@ class ClaudeStreamSession {
|
|
|
143
144
|
catch (error) {
|
|
144
145
|
if (this.exited || signal.aborted)
|
|
145
146
|
throw error;
|
|
146
|
-
this.deps.log?.("debug",
|
|
147
|
+
this.deps.log?.("debug", messages().drivers.agent.initializeRejected(this.agentId, error.message));
|
|
147
148
|
}
|
|
148
149
|
}
|
|
149
150
|
async prompt(content, hooks) {
|
|
150
151
|
if (this.closed || this.exited)
|
|
151
|
-
throw new AmaError("agent_closed", `${this.agentId}
|
|
152
|
+
throw new AmaError("agent_closed", `${this.agentId} session is closed`);
|
|
152
153
|
if (this.running !== undefined)
|
|
153
|
-
throw new AmaError("busy", `${this.agentId}
|
|
154
|
+
throw new AmaError("busy", `${this.agentId} is already running`);
|
|
154
155
|
const turn = new TurnCollector((e) => hooks.onEvent(e));
|
|
155
156
|
for (const text of this.notices.splice(0))
|
|
156
157
|
turn.push({ type: "notice", level: "warn", text });
|
|
@@ -177,7 +178,7 @@ class ClaudeStreamSession {
|
|
|
177
178
|
}
|
|
178
179
|
async steer(content) {
|
|
179
180
|
if (this.closed || this.exited)
|
|
180
|
-
throw new AmaError("agent_closed", `${this.agentId}
|
|
181
|
+
throw new AmaError("agent_closed", `${this.agentId} session is closed`);
|
|
181
182
|
this.write(userLine(content));
|
|
182
183
|
}
|
|
183
184
|
async cancel() {
|
|
@@ -224,18 +225,18 @@ class ClaudeStreamSession {
|
|
|
224
225
|
turn.push({
|
|
225
226
|
type: "notice",
|
|
226
227
|
level: "info",
|
|
227
|
-
text:
|
|
228
|
+
text: messages().drivers.agent.denials(this.agentId, denials),
|
|
228
229
|
});
|
|
229
230
|
if (result.subtype === "error_max_budget_usd")
|
|
230
231
|
turn.push({
|
|
231
232
|
type: "notice",
|
|
232
233
|
level: "warn",
|
|
233
|
-
text:
|
|
234
|
+
text: messages().drivers.agent.budgetStop(this.agentId),
|
|
234
235
|
});
|
|
235
236
|
const stop = claudeStopReason(result, this.interrupted);
|
|
236
237
|
if (stop === undefined) {
|
|
237
238
|
const detail = result.errors?.join("; ") ?? result.result ?? result.subtype ?? "unknown";
|
|
238
|
-
throw new AmaError("agent_failed", `${this.agentId}
|
|
239
|
+
throw new AmaError("agent_failed", `${this.agentId} turn failed: ${oneLine(detail, 300)}`);
|
|
239
240
|
}
|
|
240
241
|
return turn.result(stop);
|
|
241
242
|
}
|
|
@@ -261,7 +262,7 @@ class ClaudeStreamSession {
|
|
|
261
262
|
this.exited = true;
|
|
262
263
|
for (const controller of this.permissions.values())
|
|
263
264
|
controller.abort();
|
|
264
|
-
const error = new AmaError("agent_exited", `${this.agentId}
|
|
265
|
+
const error = new AmaError("agent_exited", `${this.agentId} process exited${stderrHint(this.transport) !== "" ? `: ${stderrHint(this.transport)}` : ""}`);
|
|
265
266
|
for (const pending of this.controls.values())
|
|
266
267
|
pending.reject(error);
|
|
267
268
|
this.controls.clear();
|
|
@@ -273,7 +274,7 @@ class ClaudeStreamSession {
|
|
|
273
274
|
msg = JSON.parse(line);
|
|
274
275
|
}
|
|
275
276
|
catch {
|
|
276
|
-
this.deps.log?.("debug",
|
|
277
|
+
this.deps.log?.("debug", messages().drivers.agent.nonJson(this.agentId));
|
|
277
278
|
return;
|
|
278
279
|
}
|
|
279
280
|
switch (msg["type"]) {
|
|
@@ -396,7 +397,7 @@ class ClaudeStreamSession {
|
|
|
396
397
|
this.turn?.push({
|
|
397
398
|
type: "notice",
|
|
398
399
|
level: "warn",
|
|
399
|
-
text:
|
|
400
|
+
text: messages().drivers.agent.askedQuestion(this.agentId, name),
|
|
400
401
|
});
|
|
401
402
|
this.respond(requestId, {
|
|
402
403
|
behavior: "deny",
|
|
@@ -19,6 +19,7 @@ import { JsonRpcPeer, RpcError } from "../jsonrpc.js";
|
|
|
19
19
|
import { stderrHint } from "../process.js";
|
|
20
20
|
import { TurnCollector, oneLine } from "../turn.js";
|
|
21
21
|
import { codexDecision, codexPlan, codexPolicy, codexToolEvent, grantedProfile, readTokens, } from "./codex-normalize.js";
|
|
22
|
+
import { msg } from "../../i18n/index.js";
|
|
22
23
|
const DECISION_OPTIONS = [
|
|
23
24
|
{ optionId: "accept", kind: "allow_once" },
|
|
24
25
|
{ optionId: "acceptForSession", kind: "allow_always" },
|
|
@@ -58,7 +59,7 @@ export class CodexAppServerDriver {
|
|
|
58
59
|
await session.close();
|
|
59
60
|
if (error instanceof AmaError)
|
|
60
61
|
throw error;
|
|
61
|
-
throw new AmaError("agent_start_failed", `${this.agentId}
|
|
62
|
+
throw new AmaError("agent_start_failed", `${this.agentId}: app-server failed to start (${error.message})${stderrHint(transport) !== "" ? `: ${stderrHint(transport)}` : ""}`, { cause: error });
|
|
62
63
|
}
|
|
63
64
|
return session;
|
|
64
65
|
}
|
|
@@ -125,25 +126,29 @@ class CodexSession {
|
|
|
125
126
|
catch (error) {
|
|
126
127
|
if (signal.aborted || !(error instanceof RpcError))
|
|
127
128
|
throw error;
|
|
128
|
-
this.notices.push(
|
|
129
|
+
this.notices.push(msg().drivers.agent.resumeNotFound(this.agentId, options.resume));
|
|
129
130
|
}
|
|
130
131
|
}
|
|
131
132
|
const started = await this.peer.request("thread/start", common, signal);
|
|
132
133
|
const id = started.thread?.id;
|
|
133
134
|
if (typeof id !== "string" || id === "")
|
|
134
|
-
throw new Error("thread/start
|
|
135
|
+
throw new Error("thread/start returned no thread.id");
|
|
135
136
|
this.threadId = id;
|
|
136
137
|
}
|
|
137
138
|
async prompt(content, hooks) {
|
|
138
139
|
if (this.closed || !this.peer.isOpen)
|
|
139
|
-
throw new AmaError("agent_closed", `${this.agentId}
|
|
140
|
+
throw new AmaError("agent_closed", `${this.agentId} session is closed`);
|
|
140
141
|
if (this.running !== undefined)
|
|
141
|
-
throw new AmaError("busy", `${this.agentId}
|
|
142
|
+
throw new AmaError("busy", `${this.agentId} is already running`);
|
|
142
143
|
const turn = new TurnCollector((e) => hooks.onEvent(e));
|
|
143
144
|
for (const text of this.notices.splice(0))
|
|
144
145
|
turn.push({ type: "notice", level: "info", text });
|
|
145
146
|
if (content.some((b) => b.type === "image"))
|
|
146
|
-
turn.push({
|
|
147
|
+
turn.push({
|
|
148
|
+
type: "notice",
|
|
149
|
+
level: "warn",
|
|
150
|
+
text: msg().drivers.agent.noImagesDriver(this.agentId),
|
|
151
|
+
});
|
|
147
152
|
this.turn = turn;
|
|
148
153
|
this.hooks = hooks;
|
|
149
154
|
this.messages.clear();
|
|
@@ -151,7 +156,7 @@ class CodexSession {
|
|
|
151
156
|
this.interruptRequested = false;
|
|
152
157
|
const completed = new Promise((resolve) => (this.finishTurn = resolve));
|
|
153
158
|
const closed = this.peer.closed.then(() => {
|
|
154
|
-
throw new AmaError("agent_exited", `${this.agentId}
|
|
159
|
+
throw new AmaError("agent_exited", `${this.agentId} process exited${stderrHint(this.transport) !== "" ? `: ${stderrHint(this.transport)}` : ""}`);
|
|
155
160
|
});
|
|
156
161
|
void closed.catch(() => undefined);
|
|
157
162
|
this.running = (async () => {
|
|
@@ -180,7 +185,7 @@ class CodexSession {
|
|
|
180
185
|
}
|
|
181
186
|
async steer(content) {
|
|
182
187
|
if (this.turnId === undefined)
|
|
183
|
-
throw new AmaError("not_running", `${this.agentId}
|
|
188
|
+
throw new AmaError("not_running", `${this.agentId} has no turn in progress`);
|
|
184
189
|
await this.peer.request("turn/steer", {
|
|
185
190
|
threadId: this.threadId,
|
|
186
191
|
input: textInput(content),
|
|
@@ -240,7 +245,7 @@ class CodexSession {
|
|
|
240
245
|
return turn.result("cancelled");
|
|
241
246
|
if (status === "failed") {
|
|
242
247
|
const error = (turnInfo["error"] ?? {});
|
|
243
|
-
throw new AmaError("agent_failed", `${this.agentId}
|
|
248
|
+
throw new AmaError("agent_failed", `${this.agentId} turn failed: ${oneLine(String(error["message"] ?? "unknown"), 300)}`);
|
|
244
249
|
}
|
|
245
250
|
return turn.result("end_turn");
|
|
246
251
|
}
|
|
@@ -311,7 +316,7 @@ class CodexSession {
|
|
|
311
316
|
turn.push({
|
|
312
317
|
type: "notice",
|
|
313
318
|
level: "warn",
|
|
314
|
-
text:
|
|
319
|
+
text: msg().drivers.agent.error(this.agentId, oneLine(String(error["message"] ?? "error"), 200), params["willRetry"] === true),
|
|
315
320
|
});
|
|
316
321
|
return;
|
|
317
322
|
}
|
|
@@ -390,14 +395,14 @@ class CodexSession {
|
|
|
390
395
|
this.turn?.push({
|
|
391
396
|
type: "notice",
|
|
392
397
|
level: "warn",
|
|
393
|
-
text:
|
|
398
|
+
text: msg().drivers.agent.askedQuestionCodex(this.agentId),
|
|
394
399
|
});
|
|
395
400
|
throw new RpcError(-32601, "The coordinator cannot relay interactive questions");
|
|
396
401
|
case "mcpServer/elicitation/request":
|
|
397
402
|
this.turn?.push({
|
|
398
403
|
type: "notice",
|
|
399
404
|
level: "warn",
|
|
400
|
-
text:
|
|
405
|
+
text: msg().drivers.agent.mcpElicitation(this.agentId),
|
|
401
406
|
});
|
|
402
407
|
return { action: "cancel", content: null, _meta: null };
|
|
403
408
|
default:
|
|
@@ -15,6 +15,7 @@ import { isReadOnlyMode, probeCandidate, spawnOf } from "../base.js";
|
|
|
15
15
|
import { stderrHint } from "../process.js";
|
|
16
16
|
import { TurnCollector, oneLine } from "../turn.js";
|
|
17
17
|
import { claudeStopReason } from "./claude-normalize.js";
|
|
18
|
+
import { msg as messages } from "../../i18n/index.js";
|
|
18
19
|
export function oneshotArgs(dialect, options, session, prompt) {
|
|
19
20
|
switch (dialect) {
|
|
20
21
|
case "claude": {
|
|
@@ -66,7 +67,7 @@ export class OneshotDriver {
|
|
|
66
67
|
}
|
|
67
68
|
async open(options) {
|
|
68
69
|
if (!isReadOnlyMode(options.mode))
|
|
69
|
-
throw new AmaError("agent_mode_unsupported", `${this.agentId}
|
|
70
|
+
throw new AmaError("agent_mode_unsupported", `${this.agentId} only has a one-shot print mode, which cannot ask for approval; use it for read-only (plan) tasks only`);
|
|
70
71
|
const probed = await probeCandidate(this.candidate, this.deps);
|
|
71
72
|
const dialect = this.candidate.oneshot ?? "claude";
|
|
72
73
|
return new OneshotSession(this.agentId, dialect, probed.path ?? this.candidate.program, options, this.deps);
|
|
@@ -97,16 +98,16 @@ class OneshotSession {
|
|
|
97
98
|
}
|
|
98
99
|
async prompt(content, hooks) {
|
|
99
100
|
if (this.closed)
|
|
100
|
-
throw new AmaError("agent_closed", `${this.agentId}
|
|
101
|
+
throw new AmaError("agent_closed", `${this.agentId} session is closed`);
|
|
101
102
|
if (this.transport !== undefined)
|
|
102
|
-
throw new AmaError("busy", `${this.agentId}
|
|
103
|
+
throw new AmaError("busy", `${this.agentId} is already running`);
|
|
103
104
|
const turn = new TurnCollector((e) => hooks.onEvent(e));
|
|
104
105
|
const text = content.map((b) => (b.type === "text" ? b.text : "")).join("\n");
|
|
105
106
|
if (content.some((b) => b.type === "image"))
|
|
106
107
|
turn.push({
|
|
107
108
|
type: "notice",
|
|
108
109
|
level: "warn",
|
|
109
|
-
text:
|
|
110
|
+
text: messages().drivers.agent.noImagesOneshot(this.agentId),
|
|
110
111
|
});
|
|
111
112
|
const resume = this.resumable && this.id !== "";
|
|
112
113
|
const transport = spawnOf(this.deps)({
|
|
@@ -147,7 +148,7 @@ class OneshotSession {
|
|
|
147
148
|
if (this.interrupted)
|
|
148
149
|
return turn.result("cancelled");
|
|
149
150
|
if (failure !== undefined || code !== 0)
|
|
150
|
-
throw new AmaError("agent_failed", `${this.agentId}
|
|
151
|
+
throw new AmaError("agent_failed", `${this.agentId} failed: ${oneLine(failure ?? (stderrHint(transport) || `exit code ${String(code)}`), 300)}`);
|
|
151
152
|
this.resumable = this.dialect !== "gemini" && this.id !== "";
|
|
152
153
|
return turn.result("end_turn");
|
|
153
154
|
}
|
|
@@ -169,7 +170,7 @@ class OneshotSession {
|
|
|
169
170
|
if (result === undefined) {
|
|
170
171
|
if (this.interrupted)
|
|
171
172
|
return turn.result("cancelled");
|
|
172
|
-
throw new AmaError("agent_failed", `${this.agentId}
|
|
173
|
+
throw new AmaError("agent_failed", `${this.agentId} produced no result (exit code ${String(code)}): ${stderrHint(transport)}`);
|
|
173
174
|
}
|
|
174
175
|
if (typeof result.session_id === "string")
|
|
175
176
|
this.id = result.session_id;
|
|
@@ -186,7 +187,7 @@ class OneshotSession {
|
|
|
186
187
|
turn.setFinalText(result.result);
|
|
187
188
|
const stop = claudeStopReason(result, this.interrupted);
|
|
188
189
|
if (stop === undefined)
|
|
189
|
-
throw new AmaError("agent_failed", `${this.agentId}
|
|
190
|
+
throw new AmaError("agent_failed", `${this.agentId} failed: ${oneLine(result.result ?? result.subtype ?? "", 300)}`);
|
|
190
191
|
return turn.result(stop);
|
|
191
192
|
}
|
|
192
193
|
/** codex exec --json 的一行;返回失败信息(turn.failed / error)。 */
|
package/dist/drivers/pool.js
CHANGED
|
@@ -82,7 +82,7 @@ export class DriverPool {
|
|
|
82
82
|
}
|
|
83
83
|
}
|
|
84
84
|
function abortedError() {
|
|
85
|
-
return new AmaError("aborted", "
|
|
85
|
+
return new AmaError("aborted", "external agent was interrupted while queued");
|
|
86
86
|
}
|
|
87
87
|
/** 按配置建池(`agents.maxConcurrent`、`agents.<id>.maxConcurrent`)。 */
|
|
88
88
|
export function poolFromConfig(config) {
|
package/dist/drivers/runner.d.ts
CHANGED
|
@@ -40,9 +40,11 @@ export interface ProcessRunnerDeps {
|
|
|
40
40
|
timeoutMs?: number;
|
|
41
41
|
idleMs?: number;
|
|
42
42
|
setTimer?(fn: () => void, ms: number): () => void;
|
|
43
|
+
/** [W6-C0] 轨迹计时的时钟(测试注入);缺省 Date.now。 */
|
|
44
|
+
now?(): number;
|
|
43
45
|
log?(level: "debug" | "info" | "warn", message: string): void;
|
|
44
46
|
}
|
|
45
|
-
/** 最终报告:最终文本 + 工具摘要 /
|
|
47
|
+
/** 最终报告:最终文本 + 工具摘要 / 触及文件(给协调者当资料,不是指令;[W6-C0] 标题固定英文)。 */
|
|
46
48
|
export declare function reportText(turn: DriverTurnResult): string;
|
|
47
49
|
export declare class ProcessRunner implements SubagentRunner {
|
|
48
50
|
private readonly deps;
|