@armadra/agent 0.5.1 → 0.6.1
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 +203 -304
- package/CHANGELOG.zh-CN.md +462 -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/discovered-cache.d.ts +48 -0
- package/dist/ai/providers/discovered-cache.js +102 -0
- package/dist/ai/providers/enrich.js +2 -7
- package/dist/ai/providers/model-visibility.d.ts +33 -0
- package/dist/ai/providers/model-visibility.js +70 -0
- 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/registry.d.ts +2 -0
- package/dist/ai/providers/registry.js +6 -1
- 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 +35 -0
- package/dist/auth/chatgpt/cli.js +279 -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 +26532 -11045
- 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 +6 -0
- package/dist/cli/compose-providers.js +38 -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 +145 -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 +4 -0
- package/dist/cli/subcommands/models-discover.js +60 -21
- package/dist/cli/subcommands/models-enable.d.ts +13 -0
- package/dist/cli/subcommands/models-enable.js +145 -0
- package/dist/cli/subcommands/models.d.ts +3 -1
- package/dist/cli/subcommands/models.js +39 -24
- 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 +102 -69
- 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 +12 -4
- 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 +81 -0
- package/dist/config/settings-registry.js +185 -0
- package/dist/config/types-w5.d.ts +7 -0
- package/dist/config/types-w5.js +2 -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 +2209 -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 +189 -0
- package/dist/i18n/messages/auth.js +201 -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 +248 -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 +293 -0
- package/dist/i18n/messages/config-keys.js +296 -0
- package/dist/i18n/messages/config.d.ts +508 -0
- package/dist/i18n/messages/config.js +241 -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 +99 -0
- package/dist/i18n/messages/interactive-startup.js +100 -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 +489 -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 +233 -0
- package/dist/i18n/messages/panels.js +232 -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 +355 -0
- package/dist/i18n/messages/settings.js +343 -0
- package/dist/i18n/messages/subcommands-config.d.ts +113 -0
- package/dist/i18n/messages/subcommands-config.js +129 -0
- package/dist/i18n/messages/subcommands-models.d.ts +34 -0
- package/dist/i18n/messages/subcommands-models.js +34 -0
- package/dist/i18n/messages/subcommands.d.ts +576 -0
- package/dist/i18n/messages/subcommands.js +477 -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 +22 -1
- package/dist/modes/interactive/commands.js +100 -49
- 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 +21 -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/model-items.d.ts +45 -0
- package/dist/modes/interactive/model-items.js +134 -0
- package/dist/modes/interactive/model-picker.d.ts +57 -0
- package/dist/modes/interactive/model-picker.js +191 -0
- 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.d.ts +3 -9
- package/dist/modes/interactive/startup-ui.js +44 -88
- 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/select-list.d.ts +2 -0
- package/dist/tui/components/select-list.js +7 -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 +627 -0
- package/docs/en/rpc.md +361 -0
- package/docs/en/sessions.md +219 -0
- package/docs/en/tui.md +534 -0
- package/docs/host-api.md +18 -17
- package/docs/memory.md +172 -0
- package/docs/permissions.md +2 -2
- package/docs/providers.md +73 -1
- package/docs/rpc.md +31 -3
- package/docs/session-format.md +8 -2
- package/docs/sessions.md +29 -1
- package/docs/tui.md +140 -4
- package/package.json +8 -3
package/dist/cli/help-text.js
CHANGED
|
@@ -1,102 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `ama --help` 的文本(从 args.ts 搬出,args.ts 再导出)。[W5-C0]
|
|
3
|
+
* [W6-I1] 文本进消息目录(`msg().cli.help`),按界面语言取;不能是模块级常量(会按 import 时的语言定死)。
|
|
3
4
|
*/
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
(缺省) 终端界面;stdin / stdout 非 TTY 或 TERM=dumb 时自动降级为行式
|
|
9
|
-
--no-tui 行式界面(readline + 括号粘贴)
|
|
10
|
-
-p, --print 非交互:执行提示后退出。提示 = 参数 + stdin 管道内容;有提示参数时
|
|
11
|
-
只等管道首字节 2 s(AMA_STDIN_WAIT_MS),没收到就忽略并提示;
|
|
12
|
-
末尾加 - 则一直等到 EOF(如 npm test | ama -p 找原因 -)
|
|
13
|
-
--no-stdin -p 不读 stdin(父进程留着管道、又不想等 2 s 时)
|
|
14
|
-
--output-format <格式> -p 的输出:text(缺省)| json | stream-json
|
|
15
|
-
--max-turns <N> -p 最多跑 N 轮(一次模型请求加其工具执行算一轮);到达上限仍有
|
|
16
|
-
未完成的工具调用时提前结束,退出码 8
|
|
17
|
-
--image <文件> -p 随提示发送图片(可重复;png / jpg / gif / webp,单张 ≤ 5 MB);
|
|
18
|
-
交互界面里写 @图片路径 或粘贴图片路径
|
|
19
|
-
--mode rpc stdio JSONL 协议(供嵌入)
|
|
20
|
-
--mode acp ACP 服务端(供 Zed / JetBrains / Armadra 驱动)
|
|
21
|
-
--max-cost <USD> 一次运行的美元上限(按目录价估算);到限结束运行,-p 退出码 8
|
|
22
|
-
--tui-mode <模式> 显示模式,第一期只有 regular(主屏)
|
|
23
|
-
--quiet-startup <档> 启动画面:normal | header | silent
|
|
24
|
-
|
|
25
|
-
模型
|
|
26
|
-
--model <provider/id> 模型(可配合 --provider 只写 id;@渠道 指定渠道,如 packy/kimi-k2.5@messages)
|
|
27
|
-
--provider <id> 供应商(必须同时给 --model)
|
|
28
|
-
--api-key <key> 只用于本次启动的 key(需要 --model;优先用 ama auth set)
|
|
29
|
-
--thinking <级别> off | minimal | low | medium | high | xhigh
|
|
30
|
-
|
|
31
|
-
会话
|
|
32
|
-
-c, --continue 继续本目录最近的会话
|
|
33
|
-
-r, --resume [id] 恢复会话(交互模式无 id 时弹选择器)
|
|
34
|
-
--session-id <id> 使用指定 id 的会话(不存在则新建)
|
|
35
|
-
--fork <id> 从指定会话分叉出新会话
|
|
36
|
-
--session-dir <目录> 会话目录(缺省 ~/.local/share/ama/sessions)
|
|
37
|
-
--no-session 会话只在内存里,不写会话文件(之后无法 --resume)
|
|
38
|
-
--from <id>[#编号] 用旧会话的一条用户消息作提示(缺省最后一条;-p 时连图片一起;
|
|
39
|
-
编号见 ama sessions show)
|
|
40
|
-
|
|
41
|
-
权限与信任
|
|
42
|
-
--permission-mode <模式> default | auto-edit | plan | auto | full-auto | allowlist
|
|
43
|
-
(auto 由 ama 判断每一步;allowlist 只放行 allow 规则命中的,适合 CI)
|
|
44
|
-
--allow <规则> 追加允许规则,可重复(如 "bash(git status*)")
|
|
45
|
-
--deny <规则> 追加拒绝规则,可重复(如 "write(**/.env*)")
|
|
46
|
-
--trust / --no-trust 信任 / 不信任当前项目(项目级 Hook、Skill、提示模板)
|
|
47
|
-
|
|
48
|
-
资源
|
|
49
|
-
--system-prompt <文本|@文件> 追加系统提示:缺省作为最后一条规则追加(工具表等前缀不变,利于缓存)
|
|
50
|
-
--system-prompt-mode <方式> append(缺省)| replace(替换开头的角色说明,工具与项目上下文保留)
|
|
51
|
-
--profile <文件> 宿主 profile.json(字段等价于对应参数,命令行优先)
|
|
52
|
-
--host <模块> 宿主适配器模块(CJS / ESM)
|
|
53
|
-
--instructions <文件> 追加指令文件,可重复
|
|
54
|
-
--skill-dir <目录> 追加 Skill 目录,可重复
|
|
55
|
-
--agent-dir <目录> 追加子 Agent 定义目录,可重复
|
|
56
|
-
--auth-file <文件> auth.json 位置(缺省 ~/.config/ama/auth.json)
|
|
57
|
-
--tools <a,b,…> 只启用这些工具
|
|
58
|
-
--exclude-tools <a,b,…> 禁用这些工具
|
|
59
|
-
--tools-preset <名> 工具预设:default(缺省)| minimal | codemode-only | coordinator
|
|
60
|
-
(codemode 是 codemode-only 的旧名,仍可用)
|
|
61
|
-
--codemode <模式> codemode 调用方式:off | on | only(缺省随预设)
|
|
62
|
-
|
|
63
|
-
子命令
|
|
64
|
-
ama auth set <provider> 从 stdin 读取 key 写入 auth.json(0600)
|
|
65
|
-
ama auth list 列出已保存 key 的供应商(不显示 key)
|
|
66
|
-
ama auth remove <provider> 删除已保存的 key
|
|
67
|
-
ama sessions list|show|prune 会话管理
|
|
68
|
-
ama sessions search <关键词|/正则/> [--all] [--role user|assistant|tool] [--since 7d] [--limit N]
|
|
69
|
-
跨会话全文检索
|
|
70
|
-
ama sessions export <id> [--format md|json|jsonl] [--output <文件>] [--branch leaf|all]
|
|
71
|
-
导出会话(已脱敏)
|
|
72
|
-
ama models list [--provider <id>] 列出模型(含来源与 key 状态)
|
|
73
|
-
ama models check <provider/id> 发一次最小请求检查可用性
|
|
74
|
-
ama models discover <provider> [--probe] [--write] [--limit N]
|
|
75
|
-
从中转 /v1/models 列出模型,探测协议并写入配置
|
|
76
|
-
ama models refresh [--provider <id>] 联网刷新 models.dev 元数据到数据目录(启动不联网;
|
|
77
|
-
旧名 refresh-catalog)
|
|
78
|
-
ama providers add <id> --base-url <url> [--key-env VAR] [--probe] [--channel n=api@url] [--yes]
|
|
79
|
-
一键接入:列模型、补 models.dev 元数据、探测渠道、写入配置
|
|
80
|
-
ama providers list|channels <id>|remove <id>|refresh <id>
|
|
81
|
-
供应商 → 渠道 → 模型;删除;重拉模型列表
|
|
82
|
-
ama models cache-probe <provider/id> [--tokens N] [--gap-ms MS] [--yes] [--json]
|
|
83
|
-
判断端点是否报告缓存命中
|
|
84
|
-
ama doctor 配置层级、信任、key 来源、Hook、终端能力
|
|
85
|
-
ama config show [--json] 生效配置与每项来源、将使用的模型
|
|
86
|
-
ama config path 配置目录、数据目录与各文件路径
|
|
87
|
-
ama config edit 用 $VISUAL / $EDITOR 打开 config.json
|
|
88
|
-
ama init [--force] 建配置目录(0700)与 config.json、config.schema.json;已有的不覆盖
|
|
89
|
-
ama stats [--since 7d] [--by day|week|month|provider|channel|model|project] [--all] [--json]
|
|
90
|
-
跨会话统计:请求、token、缓存命中率、费用、工具调用
|
|
91
|
-
|
|
92
|
-
其它
|
|
93
|
-
-h, --help 输出本帮助
|
|
94
|
-
-v, --version 输出版本
|
|
95
|
-
|
|
96
|
-
退出码:0 正常 · 1 运行期错误 · 2 用法错误 · 3 配置错误 · 4 无可用模型或 key ·
|
|
97
|
-
5 会话错误 · 6 宿主 / Hook 启动失败 · 7 -p 有工具调用被拒(无人审批;用
|
|
98
|
-
--permission-mode auto-edit|auto 或 --allow 放行)· 8 -p 到达预算上限 ·
|
|
99
|
-
9 -p 的计划已落盘待审批(plan.unattended: approve 则自动批准执行)·
|
|
100
|
-
78 宿主 API 版本不匹配 ·
|
|
101
|
-
130 SIGINT · 143 SIGTERM
|
|
102
|
-
`;
|
|
5
|
+
import { msg } from "../i18n/index.js";
|
|
6
|
+
export function helpText() {
|
|
7
|
+
return msg().cli.help;
|
|
8
|
+
}
|
package/dist/cli/main.d.ts
CHANGED
|
@@ -14,8 +14,11 @@
|
|
|
14
14
|
* `createRuntimeDeps()`(cli/compose.ts,动态 import)。
|
|
15
15
|
* - 签名 `main(argv): Promise<number>` 与「直接执行才自动运行」判定保持不变:
|
|
16
16
|
* src/bundle.ts 显式调用 `main()`。
|
|
17
|
+
* - [W6-C0] 界面语言在解析参数后、任何输出前定一次:`AMA_LANG` > `--lang` > 用户级 `ui.language` >
|
|
18
|
+
* `LC_ALL` / `LC_MESSAGES` / `LANG`(docs/i18n.md);profile / 项目级的 `ui.language` 由 bootstrap 合并后补定。
|
|
17
19
|
*/
|
|
18
20
|
import type { CliIo, RuntimeDeps, StdinKind } from "./deps.js";
|
|
21
|
+
import { type LanguageSetting } from "../i18n/index.js";
|
|
19
22
|
/** 集成批次注入运行时实现(B1 / B2 / B3 / B6 / B7)。 */
|
|
20
23
|
export declare function registerRuntimeDeps(deps: RuntimeDeps | undefined): void;
|
|
21
24
|
export interface MainOptions {
|
|
@@ -31,4 +34,6 @@ export declare function stdinKindDefault(): StdinKind;
|
|
|
31
34
|
/** 等 stdin 首字节至多 `timeoutMs`;超时则停止读取并返回 undefined,否则读到 EOF。 */
|
|
32
35
|
export declare function readStdinFirstByteDefault(timeoutMs: number): Promise<string | undefined>;
|
|
33
36
|
export declare function defaultIo(): CliIo;
|
|
37
|
+
/** 用户级 config.json 的 `ui.language`(只读、不校验、读不到当未设;完整校验在 bootstrap)。 */
|
|
38
|
+
export declare function peekUserLanguage(env: NodeJS.ProcessEnv): LanguageSetting | undefined;
|
|
34
39
|
export declare function main(argv: readonly string[], options?: MainOptions): Promise<number>;
|
package/dist/cli/main.js
CHANGED
|
@@ -14,8 +14,11 @@
|
|
|
14
14
|
* `createRuntimeDeps()`(cli/compose.ts,动态 import)。
|
|
15
15
|
* - 签名 `main(argv): Promise<number>` 与「直接执行才自动运行」判定保持不变:
|
|
16
16
|
* src/bundle.ts 显式调用 `main()`。
|
|
17
|
+
* - [W6-C0] 界面语言在解析参数后、任何输出前定一次:`AMA_LANG` > `--lang` > 用户级 `ui.language` >
|
|
18
|
+
* `LC_ALL` / `LC_MESSAGES` / `LANG`(docs/i18n.md);profile / 项目级的 `ui.language` 由 bootstrap 合并后补定。
|
|
17
19
|
*/
|
|
18
|
-
import { fstatSync, realpathSync } from "node:fs";
|
|
20
|
+
import { fstatSync, readFileSync, realpathSync } from "node:fs";
|
|
21
|
+
import { join } from "node:path";
|
|
19
22
|
import { fileURLToPath } from "node:url";
|
|
20
23
|
import { AMA_VERSION } from "../version.js";
|
|
21
24
|
import { parseArgs } from "./args.js";
|
|
@@ -32,6 +35,7 @@ import { resolveConfigDir } from "../config/paths.js";
|
|
|
32
35
|
import { runSessions } from "./subcommands/sessions.js";
|
|
33
36
|
import { runStats } from "./subcommands/stats.js";
|
|
34
37
|
import { enableEnvProxy, proxyHint } from "./proxy.js";
|
|
38
|
+
import { msg, resolveLocale, setLocale } from "../i18n/index.js";
|
|
35
39
|
let registeredDeps;
|
|
36
40
|
/** 集成批次注入运行时实现(B1 / B2 / B3 / B6 / B7)。 */
|
|
37
41
|
export function registerRuntimeDeps(deps) {
|
|
@@ -145,6 +149,17 @@ export function defaultIo() {
|
|
|
145
149
|
stdinKind: stdinKindDefault,
|
|
146
150
|
};
|
|
147
151
|
}
|
|
152
|
+
/** 用户级 config.json 的 `ui.language`(只读、不校验、读不到当未设;完整校验在 bootstrap)。 */
|
|
153
|
+
export function peekUserLanguage(env) {
|
|
154
|
+
try {
|
|
155
|
+
const raw = readFileSync(join(resolveConfigDir({ env }), "config.json"), "utf8");
|
|
156
|
+
const value = JSON.parse(raw).ui?.language;
|
|
157
|
+
return value === "auto" || value === "zh" || value === "en" ? value : undefined;
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
return undefined;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
148
163
|
let hooksInstalled = false;
|
|
149
164
|
function installProcessHooks(io) {
|
|
150
165
|
if (hooksInstalled)
|
|
@@ -152,7 +167,7 @@ function installProcessHooks(io) {
|
|
|
152
167
|
hooksInstalled = true;
|
|
153
168
|
const fatal = (error) => {
|
|
154
169
|
const message = error instanceof Error ? (error.stack ?? error.message) : String(error);
|
|
155
|
-
io.stderr(
|
|
170
|
+
io.stderr(msg().cli.main.uncaught(message.split("\n")[0] ?? ""));
|
|
156
171
|
process.exit(ExitCode.RuntimeError);
|
|
157
172
|
};
|
|
158
173
|
process.on("uncaughtException", fatal);
|
|
@@ -181,6 +196,8 @@ export async function main(argv, options = {}) {
|
|
|
181
196
|
});
|
|
182
197
|
try {
|
|
183
198
|
const parsed = parseArgs(argv);
|
|
199
|
+
const cliLang = parsed.kind === "run" ? parsed.args.lang : parsed.lang;
|
|
200
|
+
setLocale(resolveLocale(io.env, { language: peekUserLanguage(io.env) }, cliLang));
|
|
184
201
|
if (parsed.kind !== "subcommand")
|
|
185
202
|
noTui = parsed.args.noTui;
|
|
186
203
|
const informational = parsed.kind === "run" ? parsed.args.help || parsed.args.version : parsed.name === "init";
|
|
@@ -214,6 +231,8 @@ export async function main(argv, options = {}) {
|
|
|
214
231
|
return runInit(parsed.argv, io);
|
|
215
232
|
case "stats":
|
|
216
233
|
return await runStats(parsed.argv, io);
|
|
234
|
+
case "memory":
|
|
235
|
+
return await (await import("./subcommands/memory.js")).runMemory(parsed.argv, io);
|
|
217
236
|
}
|
|
218
237
|
}
|
|
219
238
|
if (parsed.args.version) {
|
package/dist/cli/proxy.js
CHANGED
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
* `ama doctor` 用 `describeProxy()` 显示同一份状态;代理 URL 里的账号密码打码。
|
|
11
11
|
*/
|
|
12
12
|
import * as http from "node:http";
|
|
13
|
+
import { msg } from "../i18n/index.js";
|
|
13
14
|
function pick(env, name) {
|
|
14
15
|
const value = env[name.toLowerCase()] ?? env[name.toUpperCase()];
|
|
15
16
|
return value !== undefined && value.trim() !== "" ? value.trim() : undefined;
|
|
@@ -58,7 +59,11 @@ export function inspectProxy(env, runtime = defaultProxyRuntime()) {
|
|
|
58
59
|
return { env: proxy, state: "unsupported" };
|
|
59
60
|
for (const value of [proxy.httpsProxy, proxy.httpProxy]) {
|
|
60
61
|
if (value !== undefined && !URL.canParse(value))
|
|
61
|
-
return {
|
|
62
|
+
return {
|
|
63
|
+
env: proxy,
|
|
64
|
+
state: "invalid",
|
|
65
|
+
error: msg().cli.proxy.unparsable(redactProxyUrl(value)),
|
|
66
|
+
};
|
|
62
67
|
}
|
|
63
68
|
return { env: proxy, state: "enabled" };
|
|
64
69
|
}
|
|
@@ -104,12 +109,11 @@ export function proxyHint(status, nodeVersion = process.versions.node) {
|
|
|
104
109
|
return undefined;
|
|
105
110
|
if (status.state === "unsupported") {
|
|
106
111
|
hinted = true;
|
|
107
|
-
return (
|
|
108
|
-
"升级到 Node 24+,或在 Node 22.21+ 上设 NODE_USE_ENV_PROXY=1\n");
|
|
112
|
+
return msg().cli.proxy.unsupportedHint(nodeVersion);
|
|
109
113
|
}
|
|
110
114
|
if (status.state === "invalid") {
|
|
111
115
|
hinted = true;
|
|
112
|
-
return
|
|
116
|
+
return msg().cli.proxy.invalidHint(status.error ?? "");
|
|
113
117
|
}
|
|
114
118
|
return undefined;
|
|
115
119
|
}
|
|
@@ -123,12 +127,13 @@ export function describeProxy(status) {
|
|
|
123
127
|
lines.push(`HTTP_PROXY=${redactProxyUrl(env.httpProxy)}`);
|
|
124
128
|
if (env.noProxy !== undefined)
|
|
125
129
|
lines.push(`NO_PROXY=${env.noProxy}`);
|
|
130
|
+
const m = msg().cli.proxy.state;
|
|
126
131
|
const state = {
|
|
127
|
-
none:
|
|
128
|
-
runtime:
|
|
129
|
-
enabled:
|
|
130
|
-
unsupported:
|
|
131
|
-
invalid:
|
|
132
|
+
none: m.none,
|
|
133
|
+
runtime: m.runtime,
|
|
134
|
+
enabled: m.enabled,
|
|
135
|
+
unsupported: m.unsupported(process.versions.node),
|
|
136
|
+
invalid: m.invalid(status.error ?? ""),
|
|
132
137
|
};
|
|
133
138
|
lines.push(state[status.state]);
|
|
134
139
|
return lines;
|
package/dist/cli/runtime.d.ts
CHANGED
|
@@ -83,6 +83,11 @@ export interface Runtime {
|
|
|
83
83
|
readonly tools: ToolRegistryApi;
|
|
84
84
|
readonly approvals: RuntimeApprovals;
|
|
85
85
|
readonly notifier: RuntimeNotifier;
|
|
86
|
+
/**
|
|
87
|
+
* [W6-S] 换上重新合并的配置(`/config` 改完立即写盘后调用):`config` 与之后 `/new` / `/resume` 组装的
|
|
88
|
+
* 会话读新值;已在运行的会话不受影响(「即时」档由界面另行热应用)。SDK 组装的运行时可以没有。
|
|
89
|
+
*/
|
|
90
|
+
replaceConfig?(config: AmaConfig): void;
|
|
86
91
|
/** 启动期收集的 warning(被忽略的放宽项、文件读错等)。 */
|
|
87
92
|
readonly warnings: readonly string[];
|
|
88
93
|
/** 发 session_shutdown、SessionEnd Hook、适配器 dispose;幂等。 */
|
|
@@ -14,25 +14,19 @@ import { isBuiltinSkill } from "../skills/builtin.js";
|
|
|
14
14
|
import { basename } from "node:path";
|
|
15
15
|
import { formatModelRef } from "../ai/providers/channels.js";
|
|
16
16
|
import { effectiveCodemodeMode } from "../tools/presets.js";
|
|
17
|
+
import { msg } from "../i18n/index.js";
|
|
17
18
|
import { AMA_VERSION } from "../version.js";
|
|
18
19
|
export function startupScreenLevel(runtime) {
|
|
19
20
|
return runtime.config.ui?.quietStartup ?? "normal";
|
|
20
21
|
}
|
|
21
22
|
export function headerLine() {
|
|
22
|
-
return
|
|
23
|
+
return msg().cli.startupScreen.header(AMA_VERSION);
|
|
23
24
|
}
|
|
24
25
|
function trustText(runtime) {
|
|
25
26
|
const { trusted, source, matchedPath } = runtime.trust;
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
? `trust.json${matchedPath === undefined ? "" : ` ${matchedPath}`}`
|
|
30
|
-
: source === "prompt"
|
|
31
|
-
? "本次确认"
|
|
32
|
-
: source === "profile"
|
|
33
|
-
? "profile"
|
|
34
|
-
: "缺省";
|
|
35
|
-
return `${trusted ? "已信任" : "未信任"}(${from})`;
|
|
27
|
+
const label = trustSourceLabel(source);
|
|
28
|
+
const from = source === "trust-file" && matchedPath !== undefined ? `${label} ${matchedPath}` : label;
|
|
29
|
+
return msg().cli.startupScreen.trust(trusted, from);
|
|
36
30
|
}
|
|
37
31
|
export function buildStartupScreen(runtime, level = startupScreenLevel(runtime)) {
|
|
38
32
|
if (level === "silent")
|
|
@@ -41,34 +35,33 @@ export function buildStartupScreen(runtime, level = startupScreenLevel(runtime))
|
|
|
41
35
|
if (level === "header")
|
|
42
36
|
return lines;
|
|
43
37
|
const { resources } = runtime;
|
|
44
|
-
|
|
45
|
-
lines.push(
|
|
38
|
+
const m = msg().cli.startupScreen;
|
|
39
|
+
lines.push(m.model(`${runtime.model.provider}/${runtime.model.id}`, runtime.thinkingLevel));
|
|
40
|
+
lines.push(m.cwd(runtime.paths.cwd, trustText(runtime)));
|
|
46
41
|
if (resources.contextFiles.length > 0) {
|
|
47
|
-
lines.push(
|
|
42
|
+
lines.push(m.context(resources.contextFiles.map((f) => f.path)));
|
|
48
43
|
}
|
|
49
44
|
const skills = resources.skills.filter((s) => !isBuiltinSkill(s));
|
|
50
45
|
if (skills.length > 0) {
|
|
51
|
-
lines.push(
|
|
46
|
+
lines.push(m.skills(skills.map((s) => s.name)));
|
|
52
47
|
}
|
|
53
48
|
if (resources.prompts.length > 0) {
|
|
54
|
-
lines.push(
|
|
49
|
+
lines.push(m.prompts(resources.prompts.map((p) => `/${p.name}`)));
|
|
55
50
|
}
|
|
56
51
|
const hooks = runtime.hooks.list();
|
|
57
52
|
if (hooks.length > 0)
|
|
58
|
-
lines.push(
|
|
53
|
+
lines.push(m.hooks(hooks.length));
|
|
59
54
|
if (runtime.host !== undefined)
|
|
60
|
-
lines.push(
|
|
55
|
+
lines.push(m.host(runtime.host.adapter.id));
|
|
61
56
|
if (runtime.warnings.length > 0)
|
|
62
|
-
lines.push(
|
|
57
|
+
lines.push(m.warnings(runtime.warnings.length));
|
|
63
58
|
return lines;
|
|
64
59
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
default: "缺省",
|
|
71
|
-
};
|
|
60
|
+
/** 信任来源的短名(按界面语言)。 */
|
|
61
|
+
function trustSourceLabel(source) {
|
|
62
|
+
const labels = msg().cli.startupScreen.trustSource;
|
|
63
|
+
return source === "trust-file" ? labels.trustFile : labels[source];
|
|
64
|
+
}
|
|
72
65
|
/** 家目录前缀缩写为 `~`(`/` 与 `\` 两种分隔都认,余下部分原样保留)。 */
|
|
73
66
|
export function tildePath(path, home) {
|
|
74
67
|
if (home === undefined || home === "")
|
|
@@ -89,7 +82,7 @@ export function startupInfo(runtime, home) {
|
|
|
89
82
|
thinking: runtime.thinkingLevel,
|
|
90
83
|
cwd: tildePath(runtime.paths.cwd, home),
|
|
91
84
|
trusted: runtime.trust.trusted,
|
|
92
|
-
trustSource:
|
|
85
|
+
trustSource: trustSourceLabel(runtime.trust.source),
|
|
93
86
|
permissionMode: runtime.session.state.permissionMode,
|
|
94
87
|
preset: runtime.config.tools?.preset ?? "default",
|
|
95
88
|
codemode: effectiveCodemodeMode(runtime.config),
|
|
@@ -11,6 +11,7 @@ import { UsageError } from "./args.js";
|
|
|
11
11
|
import { noModelGuidance, pickDefaultModel } from "./default-model.js";
|
|
12
12
|
import { hideFakeProvider } from "./fake-visibility.js";
|
|
13
13
|
import { ExitCode } from "./exit-codes.js";
|
|
14
|
+
import { msg } from "../i18n/index.js";
|
|
14
15
|
/** 把非 StartupError 包成指定退出码;StartupError / UsageError 原样透传。 */
|
|
15
16
|
export async function step(exitCode, label, fn) {
|
|
16
17
|
try {
|
|
@@ -41,7 +42,7 @@ export function toStartupError(error, exitCode, label) {
|
|
|
41
42
|
return new StartupError(error.code, error.message, mapped, { cause: error });
|
|
42
43
|
}
|
|
43
44
|
const message = error instanceof Error ? error.message : String(error);
|
|
44
|
-
return new StartupError("startup_failed",
|
|
45
|
+
return new StartupError("startup_failed", msg().cli.startupSteps.stepFailed(label, message), exitCode, { cause: error });
|
|
45
46
|
}
|
|
46
47
|
/** 第 4 步。 */
|
|
47
48
|
export function decideMode(args, io) {
|
|
@@ -106,7 +107,7 @@ export function lastEntry(manager, predicate) {
|
|
|
106
107
|
/** 第 11 步:解析模型与 key。 */
|
|
107
108
|
export async function resolveModel(args, registry, manager, defaultModel, deps, interactive, env = {}) {
|
|
108
109
|
if (args.provider !== undefined && args.model === undefined) {
|
|
109
|
-
throw new UsageError(
|
|
110
|
+
throw new UsageError(msg().cli.startupSteps.providerNeedsModel(args.provider));
|
|
110
111
|
}
|
|
111
112
|
const lookup = (ref, label) => {
|
|
112
113
|
const found = registry.findModel(ref);
|
|
@@ -156,10 +157,7 @@ export async function resolveModel(args, registry, manager, defaultModel, deps,
|
|
|
156
157
|
if (choice.provider.requiresApiKey) {
|
|
157
158
|
const key = await registry.resolveApiKey(choice.provider.id);
|
|
158
159
|
if (key.apiKey === undefined) {
|
|
159
|
-
|
|
160
|
-
? `,或设置环境变量 ${choice.provider.envKeys.join(" / ")}`
|
|
161
|
-
: "";
|
|
162
|
-
return pick(`供应商 ${choice.provider.id} 没有 API key:运行 \`ama auth set ${choice.provider.id}\`${envs}`);
|
|
160
|
+
return pick(msg().cli.startupSteps.noApiKey(choice.provider.id, choice.provider.envKeys));
|
|
163
161
|
}
|
|
164
162
|
}
|
|
165
163
|
return choice;
|
|
@@ -176,7 +174,7 @@ export function thinkingOf(args, manager, fallback) {
|
|
|
176
174
|
export function applyToolFilters(args, runtimeTools) {
|
|
177
175
|
const unknown = [...(args.tools ?? []), ...(args.excludeTools ?? [])].filter((n) => runtimeTools.get(n) === undefined);
|
|
178
176
|
if (unknown.length > 0) {
|
|
179
|
-
throw new UsageError(
|
|
177
|
+
throw new UsageError(msg().cli.startupSteps.unknownTools(unknown, runtimeTools.list()));
|
|
180
178
|
}
|
|
181
179
|
if (args.tools !== undefined)
|
|
182
180
|
runtimeTools.setActive(args.tools);
|
|
@@ -194,7 +192,7 @@ export function instructionSources(paths, cwd) {
|
|
|
194
192
|
ok = false;
|
|
195
193
|
}
|
|
196
194
|
if (!ok)
|
|
197
|
-
throw new StartupError("config_invalid",
|
|
195
|
+
throw new StartupError("config_invalid", msg().cli.startupSteps.instructionsMissing(abs), ExitCode.Config);
|
|
198
196
|
return { kind: "file", path: abs };
|
|
199
197
|
});
|
|
200
198
|
}
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `ama auth set|list|remove <provider>`(设计 §3.5、§16.2 B5 验收)。[B5]
|
|
3
|
+
* `ama auth login|logout|status chatgpt`(docs/wave6-plan.md §4.2)。[W6-O] 实现在 auth/chatgpt/cli.ts。
|
|
3
4
|
*
|
|
4
5
|
* - set:key 从 stdin 读取(TTY 下不回显),不经命令行参数,避免进 shell 历史;写 auth.json 0600。
|
|
5
|
-
* - list:只列供应商与 key 形态(字面量 / `!command` / `$ENV`
|
|
6
|
+
* - list:只列供应商与 key 形态(字面量 / `!command` / `$ENV` 引用 / oauth 的 flavor 与计划),从不输出 key 或 token。
|
|
6
7
|
* - `--auth-file <path>` 改变目标文件(缺省 `<configDir>/auth.json`)。
|
|
7
8
|
*/
|
|
9
|
+
import { type AuthCliDeps } from "../../auth/chatgpt/cli.js";
|
|
8
10
|
import type { CliIo } from "../deps.js";
|
|
9
|
-
|
|
11
|
+
/** 用法文本(按当前语言)。 */
|
|
12
|
+
export declare function authUsage(): string;
|
|
10
13
|
/** 取第一行并去掉首尾空白;stdin 为空返回 ""。 */
|
|
11
14
|
export declare function extractKey(raw: string): string;
|
|
12
|
-
export declare function runAuth(argv: readonly string[], io: CliIo): Promise<number>;
|
|
15
|
+
export declare function runAuth(argv: readonly string[], io: CliIo, deps?: AuthCliDeps): Promise<number>;
|
|
@@ -1,28 +1,46 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `ama auth set|list|remove <provider>`(设计 §3.5、§16.2 B5 验收)。[B5]
|
|
3
|
+
* `ama auth login|logout|status chatgpt`(docs/wave6-plan.md §4.2)。[W6-O] 实现在 auth/chatgpt/cli.ts。
|
|
3
4
|
*
|
|
4
5
|
* - set:key 从 stdin 读取(TTY 下不回显),不经命令行参数,避免进 shell 历史;写 auth.json 0600。
|
|
5
|
-
* - list:只列供应商与 key 形态(字面量 / `!command` / `$ENV`
|
|
6
|
+
* - list:只列供应商与 key 形态(字面量 / `!command` / `$ENV` 引用 / oauth 的 flavor 与计划),从不输出 key 或 token。
|
|
6
7
|
* - `--auth-file <path>` 改变目标文件(缺省 `<configDir>/auth.json`)。
|
|
7
8
|
*/
|
|
8
9
|
import { resolve } from "node:path";
|
|
10
|
+
import { runLogin, runLogout, runStatus } from "../../auth/chatgpt/cli.js";
|
|
9
11
|
import { PROVIDER_ID_PATTERN, defaultAuthFilePath, describeAuthFile, readAuthFile, removeAuthKey, setAuthKey, } from "../../config/auth-file.js";
|
|
10
12
|
import { resolveConfigDir } from "../../config/paths.js";
|
|
13
|
+
import { msg } from "../../i18n/index.js";
|
|
11
14
|
import { parseSubArgs, UsageError } from "../args.js";
|
|
12
15
|
import { ExitCode } from "../exit-codes.js";
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
/** 用法文本(按当前语言)。 */
|
|
17
|
+
export function authUsage() {
|
|
18
|
+
return msg().auth.usage;
|
|
19
|
+
}
|
|
20
|
+
function kindText(entry) {
|
|
21
|
+
const kind = msg().auth.kind;
|
|
22
|
+
switch (entry.kind) {
|
|
23
|
+
case "literal":
|
|
24
|
+
return kind.literal;
|
|
25
|
+
case "command":
|
|
26
|
+
return kind.command;
|
|
27
|
+
case "env-ref":
|
|
28
|
+
return kind.envRef;
|
|
29
|
+
case "oauth":
|
|
30
|
+
return entry.flavor === undefined
|
|
31
|
+
? kind.oauth
|
|
32
|
+
: `${kind.oauth} · ${msg().auth.oauthSummary(entry.flavor, entry.plan, entry.needsLogin === true)}`;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
18
35
|
function providerArg(positionals, action) {
|
|
36
|
+
const m = msg().auth;
|
|
19
37
|
const provider = positionals[1];
|
|
20
38
|
if (provider === undefined)
|
|
21
|
-
throw new UsageError(
|
|
39
|
+
throw new UsageError(m.needProvider(action));
|
|
22
40
|
if (positionals.length > 2)
|
|
23
|
-
throw new UsageError(
|
|
41
|
+
throw new UsageError(m.extraArgs(positionals.slice(2).join(" ")));
|
|
24
42
|
if (!PROVIDER_ID_PATTERN.test(provider))
|
|
25
|
-
throw new UsageError(
|
|
43
|
+
throw new UsageError(m.badProvider(provider));
|
|
26
44
|
return provider;
|
|
27
45
|
}
|
|
28
46
|
/** 取第一行并去掉首尾空白;stdin 为空返回 ""。 */
|
|
@@ -30,40 +48,52 @@ export function extractKey(raw) {
|
|
|
30
48
|
const line = raw.split(/\r?\n/).find((l) => l.trim() !== "") ?? "";
|
|
31
49
|
return line.trim();
|
|
32
50
|
}
|
|
33
|
-
export async function runAuth(argv, io) {
|
|
34
|
-
const
|
|
51
|
+
export async function runAuth(argv, io, deps = {}) {
|
|
52
|
+
const m = msg().auth;
|
|
53
|
+
const { positionals, values, flags } = parseSubArgs(argv, ["auth-file", "flavor", "port"], ["paste", "device", "no-browser", "yes"]);
|
|
35
54
|
const action = positionals[0];
|
|
36
55
|
if (flags.has("help") || action === undefined) {
|
|
37
|
-
io.stdout(
|
|
56
|
+
io.stdout(authUsage());
|
|
38
57
|
return flags.has("help") ? ExitCode.Ok : ExitCode.Usage;
|
|
39
58
|
}
|
|
40
59
|
const explicit = values.get("auth-file");
|
|
41
60
|
const path = explicit !== undefined
|
|
42
61
|
? resolve(io.cwd, explicit)
|
|
43
62
|
: defaultAuthFilePath(resolveConfigDir({ env: io.env }));
|
|
63
|
+
const loginOnly = ["flavor", "port"].filter((name) => values.has(name));
|
|
64
|
+
const loginFlags = ["paste", "device", "no-browser", "yes"].filter((name) => flags.has(name));
|
|
65
|
+
if (action !== "login" && [...loginOnly, ...loginFlags].length > 0)
|
|
66
|
+
throw new UsageError(m.extraArgs([...loginOnly, ...loginFlags].map((n) => `--${n}`).join(" ")));
|
|
67
|
+
const cli = { positionals, values, flags, path };
|
|
44
68
|
switch (action) {
|
|
69
|
+
case "login":
|
|
70
|
+
return runLogin(cli, io, deps);
|
|
71
|
+
case "logout":
|
|
72
|
+
return runLogout(cli, io, deps);
|
|
73
|
+
case "status":
|
|
74
|
+
return runStatus(cli, io, deps);
|
|
45
75
|
case "set": {
|
|
46
76
|
const provider = providerArg(positionals, "set");
|
|
47
77
|
if (io.stdinIsTTY)
|
|
48
|
-
io.stderr(
|
|
78
|
+
io.stderr(m.setPrompt(provider));
|
|
49
79
|
const key = extractKey(await io.readStdin());
|
|
50
80
|
if (io.stdinIsTTY)
|
|
51
81
|
io.stderr("\n");
|
|
52
82
|
if (key === "")
|
|
53
|
-
throw new UsageError(
|
|
83
|
+
throw new UsageError(m.noKeyFromStdin);
|
|
54
84
|
setAuthKey(path, provider, key);
|
|
55
|
-
io.stdout(
|
|
85
|
+
io.stdout(`${m.saved(provider, path)}\n`);
|
|
56
86
|
return ExitCode.Ok;
|
|
57
87
|
}
|
|
58
88
|
case "list": {
|
|
59
89
|
if (positionals.length > 1)
|
|
60
|
-
throw new UsageError(
|
|
90
|
+
throw new UsageError(m.extraArgs(positionals.slice(1).join(" ")));
|
|
61
91
|
const result = readAuthFile(path);
|
|
62
92
|
for (const warning of result.warnings)
|
|
63
|
-
io.stderr(
|
|
93
|
+
io.stderr(`${m.warning(warning)}\n`);
|
|
64
94
|
const entries = describeAuthFile(result.file);
|
|
65
95
|
if (entries.length === 0) {
|
|
66
|
-
io.stdout(`${path}
|
|
96
|
+
io.stdout(`${m.listEmpty(path)}\n`);
|
|
67
97
|
return ExitCode.Ok;
|
|
68
98
|
}
|
|
69
99
|
io.stdout(`${path}\n`);
|
|
@@ -72,20 +102,20 @@ export async function runAuth(argv, io) {
|
|
|
72
102
|
entry.hasBaseUrl ? "baseUrl" : undefined,
|
|
73
103
|
entry.envNames.length > 0 ? `env ${entry.envNames.join(",")}` : undefined,
|
|
74
104
|
].filter((x) => x !== undefined);
|
|
75
|
-
io.stdout(` ${entry.provider.padEnd(20)} ${
|
|
105
|
+
io.stdout(` ${entry.provider.padEnd(20)} ${kindText(entry)}${extra.length > 0 ? ` · ${extra.join(" · ")}` : ""}\n`);
|
|
76
106
|
}
|
|
77
107
|
return ExitCode.Ok;
|
|
78
108
|
}
|
|
79
109
|
case "remove": {
|
|
80
110
|
const provider = providerArg(positionals, "remove");
|
|
81
111
|
if (removeAuthKey(path, provider)) {
|
|
82
|
-
io.stdout(
|
|
112
|
+
io.stdout(`${m.removed(provider, path)}\n`);
|
|
83
113
|
return ExitCode.Ok;
|
|
84
114
|
}
|
|
85
|
-
io.stderr(
|
|
115
|
+
io.stderr(`${m.notFound(path, provider)}\n`);
|
|
86
116
|
return ExitCode.RuntimeError;
|
|
87
117
|
}
|
|
88
118
|
default:
|
|
89
|
-
throw new UsageError(
|
|
119
|
+
throw new UsageError(m.unknownAction(action));
|
|
90
120
|
}
|
|
91
121
|
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ama config get | set | unset | list` (docs/wave6-plan.md §6.4, D24-D26). [W6-S]
|
|
3
|
+
*
|
|
4
|
+
* Thin layer over config/edit.ts (the `/config` panel uses the same core):
|
|
5
|
+
* - `get <key> [--json]`: effective value, source layer and apply tier;
|
|
6
|
+
* - `set <key> <value> [--project] [--json-value] [--yes]`: write one key to the user file (or the
|
|
7
|
+
* project file, tighten only); lists and objects need `--json-value`; `permission.mode full-auto`
|
|
8
|
+
* asks once on a TTY and needs `--yes` otherwise;
|
|
9
|
+
* - `unset <key> [--project]`;
|
|
10
|
+
* - `list [prefix] [--json] [--all]`: panel settings (or every settable key with `--all`).
|
|
11
|
+
* Unknown keys, invalid values and refused project writes exit 3 (`ExitCode.Config`). `get` / `list`
|
|
12
|
+
* never create the config directory. `--profile <file>` adds the host profile layer to the view.
|
|
13
|
+
*/
|
|
14
|
+
import type { CliIo } from "../deps.js";
|
|
15
|
+
export declare const CONFIG_EDIT_ACTIONS: readonly ["get", "set", "unset", "list"];
|
|
16
|
+
export type ConfigEditAction = (typeof CONFIG_EDIT_ACTIONS)[number];
|
|
17
|
+
export interface ConfigSetDeps {
|
|
18
|
+
/** Ask before persisting Bypass (TTY only); default: the CLI y/N prompt. */
|
|
19
|
+
confirm?(question: string): Promise<boolean>;
|
|
20
|
+
}
|
|
21
|
+
export declare function runConfigEdit(action: ConfigEditAction, argv: readonly string[], io: CliIo, deps?: ConfigSetDeps): Promise<number>;
|