@armadra/agent 0.5.0 → 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 -294
- 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 +28307 -13241
- 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.d.ts +58 -0
- package/dist/cli/choice-prompt.js +142 -0
- 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.d.ts +1 -1
- package/dist/cli/subcommands/models-cache-probe.js +26 -32
- 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 +2 -2
- package/dist/cli/subcommands/providers.js +48 -59
- 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 +17 -0
- package/dist/modes/commands-core.js +101 -61
- 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 +22 -1
- package/dist/modes/interactive/commands.js +93 -38
- 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.d.ts +49 -0
- package/dist/modes/interactive/confirm-dialog.js +120 -0
- 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 +25 -22
- package/dist/modes/interactive/key-dispatch.d.ts +18 -0
- package/dist/modes/interactive/key-dispatch.js +39 -13
- package/dist/modes/interactive/line/line-editor.js +2 -1
- package/dist/modes/interactive/line/line-mode.d.ts +2 -0
- package/dist/modes/interactive/line/line-mode.js +24 -4
- 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 +41 -29
- 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 +30 -0
- package/dist/permissions/bypass.js +45 -0
- 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 +6 -1
- package/dist/tui/keybindings.js +18 -6
- 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 +3 -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 +189 -21
- package/package.json +8 -3
|
@@ -14,6 +14,7 @@ import { emptyCodeResult, gitHintFor, restoreCheckpoint } from "./restore.js";
|
|
|
14
14
|
import { GitMissingError, ShadowRepo, unsafeShadowCwd, } from "./shadow-git.js";
|
|
15
15
|
import { latestShadowCommit, restoreFromShadow } from "./shadow-restore.js";
|
|
16
16
|
import { CheckpointTracker } from "./tracker.js";
|
|
17
|
+
import { msg } from "../i18n/index.js";
|
|
17
18
|
export function createCheckpointBackendFactory(settings) {
|
|
18
19
|
return (ctx) => {
|
|
19
20
|
if (settings.mode === "off")
|
|
@@ -33,7 +34,7 @@ export function createCheckpointBackendFactory(settings) {
|
|
|
33
34
|
});
|
|
34
35
|
if (!registered && settings.sessionsRoot !== undefined) {
|
|
35
36
|
registered = true;
|
|
36
|
-
registerSessionRoot(settings.dataDir, settings.sessionsRoot).catch((error) => ctx.log("debug",
|
|
37
|
+
registerSessionRoot(settings.dataDir, settings.sessionsRoot).catch((error) => ctx.log("debug", msg().session.checkpoints.registerFailed(String(error))));
|
|
37
38
|
}
|
|
38
39
|
return tracker;
|
|
39
40
|
};
|
|
@@ -41,7 +42,7 @@ export function createCheckpointBackendFactory(settings) {
|
|
|
41
42
|
let shadow = settings.mode === "shadow-git" ? undefined : null;
|
|
42
43
|
const degrade = (message) => {
|
|
43
44
|
shadow = null;
|
|
44
|
-
warn(
|
|
45
|
+
warn(msg().session.checkpoints.shadowUnavailable(message));
|
|
45
46
|
};
|
|
46
47
|
const getShadow = () => {
|
|
47
48
|
if (shadow !== undefined)
|
|
@@ -66,7 +67,7 @@ export function createCheckpointBackendFactory(settings) {
|
|
|
66
67
|
return snap.commit;
|
|
67
68
|
}
|
|
68
69
|
catch (error) {
|
|
69
|
-
degrade(error instanceof GitMissingError ?
|
|
70
|
+
degrade(error instanceof GitMissingError ? msg().session.checkpoints.gitMissing : describe(error));
|
|
70
71
|
return undefined;
|
|
71
72
|
}
|
|
72
73
|
};
|
|
@@ -82,7 +83,7 @@ export function createCheckpointBackendFactory(settings) {
|
|
|
82
83
|
await get().snapshot(userEntryId, shadowCommit !== undefined ? { shadowCommit } : {});
|
|
83
84
|
}
|
|
84
85
|
catch (error) {
|
|
85
|
-
warn(
|
|
86
|
+
warn(msg().session.checkpoints.createFailed(describe(error)));
|
|
86
87
|
}
|
|
87
88
|
},
|
|
88
89
|
hasCheckpoint: (userEntryId) => isRewindable(get().state, userEntryId, settings.keep),
|
|
@@ -117,7 +118,7 @@ export function createCheckpointBackendFactory(settings) {
|
|
|
117
118
|
});
|
|
118
119
|
}
|
|
119
120
|
catch (error) {
|
|
120
|
-
warn(
|
|
121
|
+
warn(msg().session.checkpoints.shadowRestoreFailed(describe(error)));
|
|
121
122
|
}
|
|
122
123
|
}
|
|
123
124
|
}
|
|
@@ -24,6 +24,7 @@ import { unifiedDiff } from "../tools/edit.js";
|
|
|
24
24
|
import { DEFAULT_MAX_FILE_BYTES, hashFile, isNotFound, keyToPath, readBlob, realParentOf, } from "./blobs.js";
|
|
25
25
|
import { readGitHead } from "./git-head.js";
|
|
26
26
|
import { latestCheckpoint } from "./replay.js";
|
|
27
|
+
import { msg } from "../i18n/index.js";
|
|
27
28
|
/** 单文件不恢复的原因(安全检查不通过等);`settleFile` 把它记进 `skipped`。 */
|
|
28
29
|
export class RestoreSkip extends Error {
|
|
29
30
|
reason;
|
|
@@ -198,7 +199,7 @@ async function removeRegular(abs, before) {
|
|
|
198
199
|
if (now.nlink > 1)
|
|
199
200
|
throw new Skip("hardlink");
|
|
200
201
|
if (now.dev !== before.dev || now.ino !== before.ino)
|
|
201
|
-
throw new Error(
|
|
202
|
+
throw new Error(msg().session.checkpoints.replacedDuringRestore);
|
|
202
203
|
await unlink(abs);
|
|
203
204
|
}
|
|
204
205
|
async function writeBack(abs, bytes, record, before) {
|
|
@@ -239,7 +240,7 @@ async function writeBack(abs, bytes, record, before) {
|
|
|
239
240
|
opened.ino !== before.ino ||
|
|
240
241
|
now.dev !== opened.dev ||
|
|
241
242
|
now.ino !== opened.ino) {
|
|
242
|
-
throw new Error(
|
|
243
|
+
throw new Error(msg().session.checkpoints.replacedDuringRestore);
|
|
243
244
|
}
|
|
244
245
|
if (opened.nlink > 1)
|
|
245
246
|
throw new Skip("hardlink");
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* 无效的环境变量值 warn 后忽略。`maxFileBytes` / `keep` 取配置,缺省 5 MiB / 100。
|
|
6
6
|
*/
|
|
7
7
|
import { CHECKPOINT_MODES, DEFAULT_CHECKPOINTS_CONFIG } from "../config/types.js";
|
|
8
|
+
import { msg } from "../i18n/index.js";
|
|
8
9
|
export function resolveCheckpointSettings(config, env = process.env, warn = () => { }) {
|
|
9
10
|
const section = config?.checkpoints ?? {};
|
|
10
11
|
let mode = section.mode ?? DEFAULT_CHECKPOINTS_CONFIG.mode;
|
|
@@ -13,7 +14,7 @@ export function resolveCheckpointSettings(config, env = process.env, warn = () =
|
|
|
13
14
|
if (CHECKPOINT_MODES.includes(raw))
|
|
14
15
|
mode = raw;
|
|
15
16
|
else
|
|
16
|
-
warn(
|
|
17
|
+
warn(msg().session.checkpoints.invalidEnv(raw, CHECKPOINT_MODES));
|
|
17
18
|
}
|
|
18
19
|
return {
|
|
19
20
|
mode,
|
|
@@ -19,6 +19,7 @@ import { mkdir, readFile, readdir, rm, stat, writeFile } from "node:fs/promises"
|
|
|
19
19
|
import { homedir } from "node:os";
|
|
20
20
|
import { join, parse, resolve } from "node:path";
|
|
21
21
|
import { fileHistoryDir } from "./blobs.js";
|
|
22
|
+
import { msg } from "../i18n/index.js";
|
|
22
23
|
export const SHADOW_DIR = "shadow";
|
|
23
24
|
/** cwd 下(不含忽略的)文件数上限,超出本会话降级为 tools。 */
|
|
24
25
|
export const SHADOW_MAX_FILES = 20_000;
|
|
@@ -42,9 +43,9 @@ export function shadowRepoDir(dataDir, cwd) {
|
|
|
42
43
|
export function unsafeShadowCwd(cwd, home = homedir()) {
|
|
43
44
|
const abs = resolve(cwd);
|
|
44
45
|
if (parse(abs).root === abs)
|
|
45
|
-
return
|
|
46
|
+
return msg().session.checkpoints.cwdIsRoot;
|
|
46
47
|
if (home !== "" && sameDir(abs, resolve(home)))
|
|
47
|
-
return
|
|
48
|
+
return msg().session.checkpoints.cwdIsHome;
|
|
48
49
|
return undefined;
|
|
49
50
|
}
|
|
50
51
|
function sameDir(a, b) {
|
|
@@ -53,7 +54,7 @@ function sameDir(a, b) {
|
|
|
53
54
|
/** git 不在 PATH(或指定的可执行文件不存在)。 */
|
|
54
55
|
export class GitMissingError extends Error {
|
|
55
56
|
constructor() {
|
|
56
|
-
super(
|
|
57
|
+
super(msg().session.checkpoints.gitNotFound);
|
|
57
58
|
}
|
|
58
59
|
}
|
|
59
60
|
export const MODE_ABSENT = "000000";
|
|
@@ -220,7 +221,7 @@ export class ShadowRepo {
|
|
|
220
221
|
return {
|
|
221
222
|
degrade: {
|
|
222
223
|
reason: "too_many_files",
|
|
223
|
-
message:
|
|
224
|
+
message: msg().session.checkpoints.tooManyFiles(files, this.maxFiles),
|
|
224
225
|
},
|
|
225
226
|
};
|
|
226
227
|
}
|
|
@@ -236,7 +237,7 @@ export class ShadowRepo {
|
|
|
236
237
|
commit,
|
|
237
238
|
degrade: {
|
|
238
239
|
reason: "too_slow",
|
|
239
|
-
message:
|
|
240
|
+
message: msg().session.checkpoints.tooSlow((elapsed / 1000).toFixed(1), this.maxSnapshotMs / 1000),
|
|
240
241
|
},
|
|
241
242
|
};
|
|
242
243
|
}
|
|
@@ -412,7 +413,7 @@ function runGit(git, args, options) {
|
|
|
412
413
|
return;
|
|
413
414
|
}
|
|
414
415
|
const detail = errText.trim().split("\n").slice(-2).join("; ");
|
|
415
|
-
reject(new Error(
|
|
416
|
+
reject(new Error(msg().session.checkpoints.gitFailed(args.find((a) => !a.startsWith("--")) ?? "", String(signal ?? code), detail)));
|
|
416
417
|
});
|
|
417
418
|
child.stdin.on("error", () => undefined);
|
|
418
419
|
child.stdin.end(options.input ?? "");
|
|
@@ -17,6 +17,7 @@ import { DEFAULT_MAX_FILE_BYTES, hashBytes, keyToPath } from "./blobs.js";
|
|
|
17
17
|
import { latestCheckpoint } from "./replay.js";
|
|
18
18
|
import { emptyCodeResult, restoreCheckpoint, restoreFile, settleFile, } from "./restore.js";
|
|
19
19
|
import { MODE_ABSENT, MODE_EXECUTABLE, MODE_GITLINK, MODE_SYMLINK, } from "./shadow-git.js";
|
|
20
|
+
import { msg } from "../i18n/index.js";
|
|
20
21
|
const IS_WINDOWS = process.platform === "win32";
|
|
21
22
|
/** 文件顺序上最后一个带影子提交的检查点。 */
|
|
22
23
|
export function latestShadowCommit(state) {
|
|
@@ -32,9 +33,9 @@ export async function restoreFromShadow(options) {
|
|
|
32
33
|
const { repo } = options;
|
|
33
34
|
const target = options.target.shadowCommit;
|
|
34
35
|
if (target === undefined)
|
|
35
|
-
throw new Error(
|
|
36
|
+
throw new Error(msg().session.checkpoints.noShadowCommit);
|
|
36
37
|
if (!(await repo.hasCommit(target)))
|
|
37
|
-
throw new Error(
|
|
38
|
+
throw new Error(msg().session.checkpoints.shadowCommitMissing(target.slice(0, 12)));
|
|
38
39
|
const maxBytes = options.maxFileBytes ?? DEFAULT_MAX_FILE_BYTES;
|
|
39
40
|
const current = await repo.currentTree();
|
|
40
41
|
const changes = (await repo.diff(target, current)).filter((c) => c.oldMode !== MODE_GITLINK && c.newMode !== MODE_GITLINK);
|
|
@@ -14,6 +14,7 @@ import { readGitHead } from "./git-head.js";
|
|
|
14
14
|
import { DEFAULT_MAX_FILE_BYTES, hashBytes, isNotFound, keyToPath, pathKey, putBlob, realParentOf, recordFile, } from "./blobs.js";
|
|
15
15
|
import { applyCheckpoint, applyTrack, emptyCheckpoints } from "./replay.js";
|
|
16
16
|
import { CHECKPOINT_CUSTOM_TYPE, CHECKPOINT_TRACK_CUSTOM_TYPE, } from "./types.js";
|
|
17
|
+
import { msg } from "../i18n/index.js";
|
|
17
18
|
/** mtime 粒度余量(FAT 2 s;其它文件系统更细)。 */
|
|
18
19
|
export const MTIME_GRANULARITY_MS = 2_000;
|
|
19
20
|
export class CheckpointTracker {
|
|
@@ -87,7 +88,7 @@ export class CheckpointTracker {
|
|
|
87
88
|
this.recordedAt.set(key, at);
|
|
88
89
|
}
|
|
89
90
|
catch (error) {
|
|
90
|
-
this.warn(
|
|
91
|
+
this.warn(msg().session.checkpoints.backupFailed(key, describe(error)));
|
|
91
92
|
}
|
|
92
93
|
}
|
|
93
94
|
afterWrite(absolutePath, content) {
|
|
@@ -95,7 +96,7 @@ export class CheckpointTracker {
|
|
|
95
96
|
this.lastWritten.set(absolutePath, hashBytes(content));
|
|
96
97
|
}
|
|
97
98
|
catch (error) {
|
|
98
|
-
this.warn(
|
|
99
|
+
this.warn(msg().session.checkpoints.recordFailed(absolutePath, describe(error)));
|
|
99
100
|
}
|
|
100
101
|
}
|
|
101
102
|
/** 新回合:重拍全部已跟踪文件,追加 `ama.checkpoint`,返回它。`extra.shadowCommit` 来自影子 git。 */
|
|
@@ -114,7 +115,7 @@ export class CheckpointTracker {
|
|
|
114
115
|
times.set(key, next.at);
|
|
115
116
|
}
|
|
116
117
|
catch (error) {
|
|
117
|
-
this.warn(
|
|
118
|
+
this.warn(msg().session.checkpoints.snapshotFailed(key, describe(error)));
|
|
118
119
|
}
|
|
119
120
|
}
|
|
120
121
|
const data = { v: 1, userEntryId, files };
|
package/dist/cli/args.d.ts
CHANGED
|
@@ -10,12 +10,14 @@
|
|
|
10
10
|
* - `--resume [id]`:下一个参数形如会话 id(无空白、不以 `-` 开头)才被当作 id;
|
|
11
11
|
* 否则仍作为提示文本。显式写法 `--resume=<id>`。
|
|
12
12
|
* - `--provider` 不带 `--model` 不在这里报错,由 bootstrap 第 11 步报(退出码 2)。
|
|
13
|
+
* - [W6-C0] `--lang zh|en` 也可写在子命令名之前(`ama --lang en doctor`);`--memory` / `--no-memory`。
|
|
13
14
|
*/
|
|
14
15
|
import { AmaError } from "../errors.js";
|
|
15
16
|
import type { ModelThinkingLevel } from "../ai/types.js";
|
|
16
17
|
import { type PermissionMode } from "../permissions/types.js";
|
|
17
18
|
import { type CodemodeMode, type ToolsPreset } from "../config/types.js";
|
|
18
|
-
|
|
19
|
+
import { type Locale } from "../i18n/index.js";
|
|
20
|
+
export declare const SUBCOMMANDS: readonly ["auth", "sessions", "models", "providers", "doctor", "config", "init", "stats", "memory"];
|
|
19
21
|
export type SubcommandName = (typeof SUBCOMMANDS)[number];
|
|
20
22
|
export type OutputFormat = "text" | "json" | "stream-json";
|
|
21
23
|
export type QuietStartup = "normal" | "header" | "silent";
|
|
@@ -80,6 +82,10 @@ export interface ParsedArgs {
|
|
|
80
82
|
prompt?: string;
|
|
81
83
|
/** 原始位置参数。 */
|
|
82
84
|
positionals: string[];
|
|
85
|
+
/** [W6-C0] `--lang zh|en`:界面语言(`AMA_LANG` 优先,docs/i18n.md)。 */
|
|
86
|
+
lang?: Locale;
|
|
87
|
+
/** [W6-C0] `--memory` → true、`--no-memory` → false:覆盖 `memory.enabled`(W6-M)。 */
|
|
88
|
+
memory?: boolean;
|
|
83
89
|
}
|
|
84
90
|
export type ParseResult = {
|
|
85
91
|
kind: "run";
|
|
@@ -88,11 +94,12 @@ export type ParseResult = {
|
|
|
88
94
|
kind: "subcommand";
|
|
89
95
|
name: SubcommandName;
|
|
90
96
|
argv: string[];
|
|
97
|
+
lang?: Locale;
|
|
91
98
|
};
|
|
92
99
|
export declare class UsageError extends AmaError {
|
|
93
100
|
constructor(message: string);
|
|
94
101
|
}
|
|
95
|
-
export {
|
|
102
|
+
export { helpText } from "./help-text.js";
|
|
96
103
|
export declare function emptyArgs(): ParsedArgs;
|
|
97
104
|
/** 解析 argv(不含 node 与脚本路径);用法错误抛 UsageError(退出码 2)。 */
|
|
98
105
|
export declare function parseArgs(argv: readonly string[]): ParseResult;
|
package/dist/cli/args.js
CHANGED
|
@@ -10,11 +10,13 @@
|
|
|
10
10
|
* - `--resume [id]`:下一个参数形如会话 id(无空白、不以 `-` 开头)才被当作 id;
|
|
11
11
|
* 否则仍作为提示文本。显式写法 `--resume=<id>`。
|
|
12
12
|
* - `--provider` 不带 `--model` 不在这里报错,由 bootstrap 第 11 步报(退出码 2)。
|
|
13
|
+
* - [W6-C0] `--lang zh|en` 也可写在子命令名之前(`ama --lang en doctor`);`--memory` / `--no-memory`。
|
|
13
14
|
*/
|
|
14
15
|
import { AmaError } from "../errors.js";
|
|
15
16
|
import { PERMISSION_MODES_STRICT_FIRST } from "../permissions/types.js";
|
|
16
17
|
import { canonicalPreset } from "../config/types.js";
|
|
17
18
|
import { CODEMODE_MODES } from "../config/types.js";
|
|
19
|
+
import { LOCALES, msg } from "../i18n/index.js";
|
|
18
20
|
export const SUBCOMMANDS = [
|
|
19
21
|
"auth",
|
|
20
22
|
"sessions",
|
|
@@ -24,6 +26,8 @@ export const SUBCOMMANDS = [
|
|
|
24
26
|
"config",
|
|
25
27
|
"init",
|
|
26
28
|
"stats",
|
|
29
|
+
// [W6-C0] W6-M 实现(cli/subcommands/memory.ts);之前 main.ts 报「尚未提供」
|
|
30
|
+
"memory",
|
|
27
31
|
];
|
|
28
32
|
export class UsageError extends AmaError {
|
|
29
33
|
constructor(message) {
|
|
@@ -45,7 +49,7 @@ const QUIET_LEVELS = ["normal", "header", "silent"];
|
|
|
45
49
|
/** 帮助与报错按常用顺序列出(校验集合同 TOOLS_PRESET_INPUTS;`codemode` 是 `codemode-only` 的别名)。 */
|
|
46
50
|
const PRESET_CHOICES = ["default", "minimal", "codemode-only", "coordinator", "codemode"];
|
|
47
51
|
const SESSION_ID_LIKE = /^[A-Za-z0-9][A-Za-z0-9._:-]*$/;
|
|
48
|
-
export {
|
|
52
|
+
export { helpText } from "./help-text.js";
|
|
49
53
|
const VALUE_OPTIONS = new Set([
|
|
50
54
|
"profile",
|
|
51
55
|
"host",
|
|
@@ -77,6 +81,7 @@ const VALUE_OPTIONS = new Set([
|
|
|
77
81
|
"system-prompt",
|
|
78
82
|
"system-prompt-mode",
|
|
79
83
|
"from",
|
|
84
|
+
"lang",
|
|
80
85
|
]);
|
|
81
86
|
const FLAG_ALIASES = {
|
|
82
87
|
"-h": "help",
|
|
@@ -88,7 +93,7 @@ const FLAG_ALIASES = {
|
|
|
88
93
|
function choice(option, value, choices) {
|
|
89
94
|
if (choices.includes(value))
|
|
90
95
|
return value;
|
|
91
|
-
throw new UsageError(
|
|
96
|
+
throw new UsageError(msg().cli.args.invalidChoice(option, choices, value));
|
|
92
97
|
}
|
|
93
98
|
function list(value) {
|
|
94
99
|
return value
|
|
@@ -117,7 +122,7 @@ export function emptyArgs() {
|
|
|
117
122
|
}
|
|
118
123
|
function applyValue(args, option, value) {
|
|
119
124
|
if (value === "")
|
|
120
|
-
throw new UsageError(
|
|
125
|
+
throw new UsageError(msg().cli.args.emptyValue(option));
|
|
121
126
|
switch (option) {
|
|
122
127
|
case "profile":
|
|
123
128
|
args.profile = value;
|
|
@@ -172,7 +177,7 @@ function applyValue(args, option, value) {
|
|
|
172
177
|
break;
|
|
173
178
|
case "tui-mode":
|
|
174
179
|
if (value === "fullscreen")
|
|
175
|
-
throw new UsageError(
|
|
180
|
+
throw new UsageError(msg().cli.args.fullscreenUnsupported);
|
|
176
181
|
args.tuiMode = choice(option, value, ["regular"]);
|
|
177
182
|
break;
|
|
178
183
|
case "quiet-startup":
|
|
@@ -202,14 +207,14 @@ function applyValue(args, option, value) {
|
|
|
202
207
|
case "max-turns": {
|
|
203
208
|
const turns = Number(value);
|
|
204
209
|
if (!Number.isInteger(turns) || turns < 1)
|
|
205
|
-
throw new UsageError(
|
|
210
|
+
throw new UsageError(msg().cli.args.maxTurnsPositive(value));
|
|
206
211
|
args.maxTurns = turns;
|
|
207
212
|
break;
|
|
208
213
|
}
|
|
209
214
|
case "max-cost": {
|
|
210
215
|
const usd = Number(value);
|
|
211
216
|
if (!Number.isFinite(usd) || usd <= 0)
|
|
212
|
-
throw new UsageError(
|
|
217
|
+
throw new UsageError(msg().cli.args.maxCostPositive(value));
|
|
213
218
|
args.maxCostUsd = usd;
|
|
214
219
|
break;
|
|
215
220
|
}
|
|
@@ -219,6 +224,9 @@ function applyValue(args, option, value) {
|
|
|
219
224
|
case "from":
|
|
220
225
|
args.from = value;
|
|
221
226
|
break;
|
|
227
|
+
case "lang":
|
|
228
|
+
args.lang = choice(option, value, LOCALES);
|
|
229
|
+
break;
|
|
222
230
|
}
|
|
223
231
|
}
|
|
224
232
|
function applyFlag(args, name) {
|
|
@@ -248,18 +256,27 @@ function applyFlag(args, name) {
|
|
|
248
256
|
case "no-trust": {
|
|
249
257
|
const value = name === "trust";
|
|
250
258
|
if (args.trust !== undefined && args.trust !== value) {
|
|
251
|
-
throw new UsageError("--trust
|
|
259
|
+
throw new UsageError(msg().cli.args.flagConflict("--trust", "--no-trust"));
|
|
252
260
|
}
|
|
253
261
|
args.trust = value;
|
|
254
262
|
return true;
|
|
255
263
|
}
|
|
264
|
+
case "memory":
|
|
265
|
+
case "no-memory": {
|
|
266
|
+
const value = name === "memory";
|
|
267
|
+
if (args.memory !== undefined && args.memory !== value)
|
|
268
|
+
throw new UsageError(msg().cli.args.flagConflict("--memory", "--no-memory"));
|
|
269
|
+
args.memory = value;
|
|
270
|
+
return true;
|
|
271
|
+
}
|
|
256
272
|
default:
|
|
257
273
|
return false;
|
|
258
274
|
}
|
|
259
275
|
}
|
|
260
276
|
function validate(args) {
|
|
277
|
+
const m = msg().cli.args;
|
|
261
278
|
if (args.print && args.mode !== undefined)
|
|
262
|
-
throw new UsageError(
|
|
279
|
+
throw new UsageError(m.printWithMode(args.mode));
|
|
263
280
|
const sessionFlags = [
|
|
264
281
|
args.continue ? "--continue" : undefined,
|
|
265
282
|
args.resume ? "--resume" : undefined,
|
|
@@ -267,38 +284,44 @@ function validate(args) {
|
|
|
267
284
|
args.fork !== undefined ? "--fork" : undefined,
|
|
268
285
|
].filter((f) => f !== undefined);
|
|
269
286
|
if (sessionFlags.length > 1)
|
|
270
|
-
throw new UsageError(
|
|
287
|
+
throw new UsageError(m.flagsConflict(sessionFlags));
|
|
271
288
|
if (args.noSession && sessionFlags.length > 0) {
|
|
272
|
-
throw new UsageError(
|
|
289
|
+
throw new UsageError(m.flagConflict("--no-session", sessionFlags[0] ?? ""));
|
|
273
290
|
}
|
|
274
291
|
if (args.apiKey !== undefined && args.model === undefined) {
|
|
275
|
-
throw new UsageError(
|
|
292
|
+
throw new UsageError(m.apiKeyNeedsModel);
|
|
276
293
|
}
|
|
277
294
|
if (args.outputFormat !== undefined && !args.print) {
|
|
278
|
-
throw new UsageError("--output-format
|
|
295
|
+
throw new UsageError(m.printOnly("--output-format"));
|
|
279
296
|
}
|
|
280
297
|
if (args.systemPromptMode !== undefined && args.systemPrompt === undefined) {
|
|
281
|
-
throw new UsageError(
|
|
298
|
+
throw new UsageError(m.systemPromptModeNeedsPrompt);
|
|
282
299
|
}
|
|
283
300
|
if (args.maxTurns !== undefined && !args.print) {
|
|
284
|
-
throw new UsageError("--max-turns
|
|
301
|
+
throw new UsageError(m.printOnly("--max-turns"));
|
|
285
302
|
}
|
|
286
303
|
if (args.noStdin && !args.print)
|
|
287
|
-
throw new UsageError("--no-stdin
|
|
304
|
+
throw new UsageError(m.printOnly("--no-stdin"));
|
|
288
305
|
if (args.noStdin && args.stdin)
|
|
289
|
-
throw new UsageError(
|
|
306
|
+
throw new UsageError(m.noStdinWithDash);
|
|
290
307
|
if (args.stdin && !args.print) {
|
|
291
|
-
throw new UsageError(
|
|
308
|
+
throw new UsageError(m.dashPrintOnly);
|
|
292
309
|
}
|
|
293
310
|
if (args.images.length > 0 && !args.print) {
|
|
294
|
-
throw new UsageError(
|
|
311
|
+
throw new UsageError(m.imagePrintOnly);
|
|
295
312
|
}
|
|
296
313
|
}
|
|
297
314
|
/** 解析 argv(不含 node 与脚本路径);用法错误抛 UsageError(退出码 2)。 */
|
|
298
315
|
export function parseArgs(argv) {
|
|
299
|
-
const
|
|
316
|
+
const lead = leadingLang(argv);
|
|
317
|
+
const first = argv[lead.next];
|
|
300
318
|
if (first !== undefined && SUBCOMMANDS.includes(first)) {
|
|
301
|
-
return {
|
|
319
|
+
return {
|
|
320
|
+
kind: "subcommand",
|
|
321
|
+
name: first,
|
|
322
|
+
argv: argv.slice(lead.next + 1),
|
|
323
|
+
...(lead.lang !== undefined ? { lang: lead.lang } : {}),
|
|
324
|
+
};
|
|
302
325
|
}
|
|
303
326
|
const args = emptyArgs();
|
|
304
327
|
for (let i = 0; i < argv.length; i++) {
|
|
@@ -325,7 +348,7 @@ export function parseArgs(argv) {
|
|
|
325
348
|
else {
|
|
326
349
|
const alias = FLAG_ALIASES[token];
|
|
327
350
|
if (alias === undefined)
|
|
328
|
-
throw new UsageError(
|
|
351
|
+
throw new UsageError(msg().cli.args.unknownOption(token));
|
|
329
352
|
name = alias;
|
|
330
353
|
}
|
|
331
354
|
if (name === "resume") {
|
|
@@ -333,7 +356,7 @@ export function parseArgs(argv) {
|
|
|
333
356
|
const next = argv[i + 1];
|
|
334
357
|
if (inline !== undefined) {
|
|
335
358
|
if (inline === "")
|
|
336
|
-
throw new UsageError(
|
|
359
|
+
throw new UsageError(msg().cli.args.emptyResumeId);
|
|
337
360
|
args.resumeId = inline;
|
|
338
361
|
}
|
|
339
362
|
else if (next !== undefined && SESSION_ID_LIKE.test(next)) {
|
|
@@ -347,16 +370,16 @@ export function parseArgs(argv) {
|
|
|
347
370
|
if (value === undefined) {
|
|
348
371
|
value = argv[i + 1];
|
|
349
372
|
if (value === undefined)
|
|
350
|
-
throw new UsageError(
|
|
373
|
+
throw new UsageError(msg().cli.args.needsValue(name));
|
|
351
374
|
i++;
|
|
352
375
|
}
|
|
353
376
|
applyValue(args, name, value);
|
|
354
377
|
continue;
|
|
355
378
|
}
|
|
356
379
|
if (inline !== undefined)
|
|
357
|
-
throw new UsageError(
|
|
380
|
+
throw new UsageError(msg().cli.args.noValue(name));
|
|
358
381
|
if (!applyFlag(args, name))
|
|
359
|
-
throw new UsageError(
|
|
382
|
+
throw new UsageError(msg().cli.args.unknownOption(token));
|
|
360
383
|
}
|
|
361
384
|
if (args.positionals.length > 0)
|
|
362
385
|
args.prompt = args.positionals.join(" ");
|
|
@@ -364,6 +387,30 @@ export function parseArgs(argv) {
|
|
|
364
387
|
validate(args);
|
|
365
388
|
return { kind: "run", args };
|
|
366
389
|
}
|
|
390
|
+
/** [W6-C0] 子命令名之前的 `--lang X` / `--lang=X`(可重复,后者为准)。 */
|
|
391
|
+
function leadingLang(argv) {
|
|
392
|
+
let lang;
|
|
393
|
+
let i = 0;
|
|
394
|
+
for (;;) {
|
|
395
|
+
const token = argv[i];
|
|
396
|
+
if (token === "--lang" && argv[i + 1] !== undefined) {
|
|
397
|
+
const value = argv[i + 1];
|
|
398
|
+
lang = choice("lang", value, LOCALES);
|
|
399
|
+
i += 2;
|
|
400
|
+
}
|
|
401
|
+
else if (token?.startsWith("--lang=") === true) {
|
|
402
|
+
lang = choice("lang", token.slice("--lang=".length), LOCALES);
|
|
403
|
+
i += 1;
|
|
404
|
+
}
|
|
405
|
+
else
|
|
406
|
+
break;
|
|
407
|
+
}
|
|
408
|
+
// 后面不是子命令时整段交回普通解析(--lang 照常进 ParsedArgs)
|
|
409
|
+
const next = argv[i];
|
|
410
|
+
if (next === undefined || !SUBCOMMANDS.includes(next))
|
|
411
|
+
return { next: 0 };
|
|
412
|
+
return lang === undefined ? { next: i } : { lang, next: i };
|
|
413
|
+
}
|
|
367
414
|
/** 子命令内部的小解析器:`--name value` / `--name=value` / 位置参数。 */
|
|
368
415
|
export function parseSubArgs(argv, valueOptions, flagOptions = []) {
|
|
369
416
|
const positionals = [];
|
|
@@ -387,14 +434,14 @@ export function parseSubArgs(argv, valueOptions, flagOptions = []) {
|
|
|
387
434
|
if (valueOptions.includes(name)) {
|
|
388
435
|
const value = eq === -1 ? argv[++i] : token.slice(eq + 1);
|
|
389
436
|
if (value === undefined || value === "")
|
|
390
|
-
throw new UsageError(
|
|
437
|
+
throw new UsageError(msg().cli.args.needsValue(name));
|
|
391
438
|
values.set(name, value);
|
|
392
439
|
}
|
|
393
440
|
else if (flagOptions.includes(name) && eq === -1) {
|
|
394
441
|
flags.add(name);
|
|
395
442
|
}
|
|
396
443
|
else {
|
|
397
|
-
throw new UsageError(
|
|
444
|
+
throw new UsageError(msg().cli.args.unknownOption(token));
|
|
398
445
|
}
|
|
399
446
|
}
|
|
400
447
|
return { positionals, values, flags };
|