@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
|
@@ -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>;
|
|
@@ -0,0 +1,137 @@
|
|
|
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 { msg } from "../../i18n/index.js";
|
|
15
|
+
import { assertSettable, formatSettingValue, getConfigValue, parseValue, readSnapshot, setConfigValue, } from "../../config/edit.js";
|
|
16
|
+
import { existsSync } from "node:fs";
|
|
17
|
+
import { join } from "node:path";
|
|
18
|
+
import { initConfigDir } from "../../config/init.js";
|
|
19
|
+
import { CONFIG_FILE, resolveConfigDir } from "../../config/paths.js";
|
|
20
|
+
import { loadProfile } from "../../config/profile.js";
|
|
21
|
+
import { settableKeys, settingSpec, settingsRegistry } from "../../config/settings-registry.js";
|
|
22
|
+
import { confirmContinue } from "../choice-prompt.js";
|
|
23
|
+
import { parseSubArgs, UsageError } from "../args.js";
|
|
24
|
+
import { ExitCode } from "../exit-codes.js";
|
|
25
|
+
export const CONFIG_EDIT_ACTIONS = ["get", "set", "unset", "list"];
|
|
26
|
+
function layerInput(io, profilePath) {
|
|
27
|
+
const input = {
|
|
28
|
+
configDir: resolveConfigDir({ env: io.env }),
|
|
29
|
+
cwd: io.cwd,
|
|
30
|
+
env: io.env,
|
|
31
|
+
};
|
|
32
|
+
if (profilePath !== undefined) {
|
|
33
|
+
const profile = loadProfile(profilePath, io.cwd);
|
|
34
|
+
input.profile = { config: profile.config };
|
|
35
|
+
input.hasProfile = true;
|
|
36
|
+
}
|
|
37
|
+
return input;
|
|
38
|
+
}
|
|
39
|
+
function applyText(key) {
|
|
40
|
+
const spec = settingSpec(key);
|
|
41
|
+
const s = msg().settings;
|
|
42
|
+
if (spec === undefined)
|
|
43
|
+
return s.cli.applyNone;
|
|
44
|
+
return spec.prefix === true ? `${s.apply[spec.apply]} · ${s.prefixTag}` : s.apply[spec.apply];
|
|
45
|
+
}
|
|
46
|
+
function jsonRow(value) {
|
|
47
|
+
const spec = settingSpec(value.key);
|
|
48
|
+
return {
|
|
49
|
+
key: value.key,
|
|
50
|
+
value: value.value ?? null,
|
|
51
|
+
source: value.source,
|
|
52
|
+
...(value.envName !== undefined ? { env: value.envName } : {}),
|
|
53
|
+
apply: spec?.apply ?? null,
|
|
54
|
+
prefix: spec?.prefix === true,
|
|
55
|
+
project: spec?.project ?? null,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function textRow(value) {
|
|
59
|
+
const source = value.envName !== undefined ? `env ${value.envName}` : value.source;
|
|
60
|
+
return msg().settings.cli.getLine(value.key, formatSettingValue(value.value), source, applyText(value.key));
|
|
61
|
+
}
|
|
62
|
+
function scopeLabel(scope) {
|
|
63
|
+
return msg().settings.scope[scope];
|
|
64
|
+
}
|
|
65
|
+
function report(io, result, unset) {
|
|
66
|
+
const s = msg().settings;
|
|
67
|
+
const value = formatSettingValue(result.after.value);
|
|
68
|
+
io.stdout(`${unset
|
|
69
|
+
? s.unsetDone(result.key, value, scopeLabel(result.scope))
|
|
70
|
+
: s.setDone(result.key, value, scopeLabel(result.scope))}\n`);
|
|
71
|
+
if (result.overriddenBy !== undefined) {
|
|
72
|
+
const by = result.after.envName ?? result.overriddenBy;
|
|
73
|
+
io.stdout(`${s.stillOverridden(result.key, by)}\n`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/** Confirm persisting `permission.mode full-auto`: TTY asks, otherwise `--yes` is required. */
|
|
77
|
+
async function confirmBypass(io, yes, deps) {
|
|
78
|
+
const s = msg().settings.cli;
|
|
79
|
+
if (yes)
|
|
80
|
+
return true;
|
|
81
|
+
if (!io.stdinIsTTY) {
|
|
82
|
+
io.stderr(`ama: ${s.needYes}\n`);
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
const ask = deps.confirm ?? ((question) => confirmContinue({ question, env: io.env }));
|
|
86
|
+
if (await ask(s.confirmBypass))
|
|
87
|
+
return true;
|
|
88
|
+
io.stderr(`${s.cancelled}\n`);
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
export async function runConfigEdit(action, argv, io, deps = {}) {
|
|
92
|
+
const { positionals, values, flags } = parseSubArgs(argv, ["profile"], ["json", "project", "json-value", "yes", "all"]);
|
|
93
|
+
const s = msg().settings;
|
|
94
|
+
if (flags.has("help")) {
|
|
95
|
+
io.stdout(s.cli.usage);
|
|
96
|
+
return ExitCode.Ok;
|
|
97
|
+
}
|
|
98
|
+
const input = layerInput(io, values.get("profile"));
|
|
99
|
+
const scope = flags.has("project") ? "project" : "user";
|
|
100
|
+
if (action === "list") {
|
|
101
|
+
const snapshot = readSnapshot(input);
|
|
102
|
+
const prefix = positionals[0] ?? "";
|
|
103
|
+
const keys = (flags.has("all") ? settableKeys() : settingsRegistry().map((spec) => spec.key)).filter((key) => key.startsWith(prefix));
|
|
104
|
+
const rows = keys.map((key) => getConfigValue(snapshot, key));
|
|
105
|
+
if (flags.has("json"))
|
|
106
|
+
io.stdout(`${JSON.stringify(rows.map(jsonRow), null, 2)}\n`);
|
|
107
|
+
else
|
|
108
|
+
io.stdout(`${[s.cli.listHeader, ...rows.map((r) => ` ${textRow(r)}`)].join("\n")}\n`);
|
|
109
|
+
return ExitCode.Ok;
|
|
110
|
+
}
|
|
111
|
+
const key = positionals[0];
|
|
112
|
+
if (key === undefined)
|
|
113
|
+
throw new UsageError(s.cli.missingKey);
|
|
114
|
+
if (action === "get") {
|
|
115
|
+
assertSettable(key);
|
|
116
|
+
const value = getConfigValue(readSnapshot(input), key);
|
|
117
|
+
io.stdout(flags.has("json") ? `${JSON.stringify(jsonRow(value), null, 2)}\n` : `${textRow(value)}\n`);
|
|
118
|
+
return ExitCode.Ok;
|
|
119
|
+
}
|
|
120
|
+
if (action === "unset") {
|
|
121
|
+
report(io, setConfigValue({ ...input, scope, key, value: undefined }), true);
|
|
122
|
+
return ExitCode.Ok;
|
|
123
|
+
}
|
|
124
|
+
const raw = positionals.slice(1).join(" ");
|
|
125
|
+
if (positionals.length < 2)
|
|
126
|
+
throw new UsageError(s.cli.missingValue);
|
|
127
|
+
const value = parseValue(key, raw, flags.has("json-value"));
|
|
128
|
+
if (key === "permission.mode" && value === "full-auto" && scope === "user") {
|
|
129
|
+
if (!(await confirmBypass(io, flags.has("yes"), deps)))
|
|
130
|
+
return ExitCode.Config;
|
|
131
|
+
}
|
|
132
|
+
// first write to a fresh config dir: lay out config.json + config.schema.json like `ama init`
|
|
133
|
+
if (scope === "user" && !existsSync(join(input.configDir, CONFIG_FILE)))
|
|
134
|
+
initConfigDir(input.configDir);
|
|
135
|
+
report(io, setConfigValue({ ...input, scope, key, value }), value === undefined);
|
|
136
|
+
return ExitCode.Ok;
|
|
137
|
+
}
|
|
@@ -14,7 +14,8 @@
|
|
|
14
14
|
import { type AmaConfig, type CodemodeMode } from "../../config/types.js";
|
|
15
15
|
import type { Api, ProviderRegistryApi } from "../../ai/types.js";
|
|
16
16
|
import type { CliIo, RuntimeDeps } from "../deps.js";
|
|
17
|
-
|
|
17
|
+
/** `ama config --help` 的前半(get / set 等编辑子命令的用法接在后面)。 */
|
|
18
|
+
export declare const configUsage: () => string;
|
|
18
19
|
type Layer = {
|
|
19
20
|
name: "default" | "user" | "profile" | "project" | "cli";
|
|
20
21
|
label: string;
|
|
@@ -34,26 +34,30 @@ import { ExitCode } from "../exit-codes.js";
|
|
|
34
34
|
import { buildRegistry, loadUserLevel } from "./context.js";
|
|
35
35
|
import { osSandboxStatus } from "../../sandbox/detect.js";
|
|
36
36
|
import { resolveBashSandbox } from "../../sandbox/bash.js";
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
37
|
+
import { msg } from "../../i18n/index.js";
|
|
38
|
+
import { padToWidth, visibleWidth } from "../../tui/ansi.js";
|
|
39
|
+
import { CONFIG_EDIT_ACTIONS, runConfigEdit } from "./config-set.js";
|
|
40
|
+
const isEditAction = (value) => CONFIG_EDIT_ACTIONS.includes(value);
|
|
41
|
+
/** `ama config --help` 的前半(get / set 等编辑子命令的用法接在后面)。 */
|
|
42
|
+
export const configUsage = () => msg().subcommands.configShow.usage;
|
|
42
43
|
/** `ama config path`:目录与文件路径,标出是否存在。 */
|
|
43
44
|
function showPaths(io) {
|
|
44
45
|
const configDir = resolveConfigDir({ env: io.env });
|
|
45
46
|
const dataDir = resolveDataDir({ env: io.env });
|
|
46
|
-
const
|
|
47
|
+
const m = msg().subcommands.configShow;
|
|
48
|
+
const mark = (path) => `${path}${existsSync(path) ? "" : m.missing}`;
|
|
49
|
+
const width = Math.max(...[m.configDir, m.dataDir, m.projectLevel].map(visibleWidth)) + 2;
|
|
50
|
+
const label = (text) => padToWidth(text, width);
|
|
47
51
|
const lines = [
|
|
48
|
-
|
|
52
|
+
`${label(m.configDir)}${mark(configDir)}`,
|
|
49
53
|
` config.json ${mark(join(configDir, CONFIG_FILE))}`,
|
|
50
54
|
` config.schema.json ${mark(join(configDir, CONFIG_SCHEMA_FILE))}`,
|
|
51
55
|
` auth.json ${mark(join(configDir, AUTH_FILE))}`,
|
|
52
56
|
` hooks.json ${mark(join(configDir, HOOKS_FILE))}`,
|
|
53
|
-
|
|
57
|
+
`${label(m.dataDir)}${mark(dataDir)}`,
|
|
54
58
|
` sessions/ ${mark(join(dataDir, "sessions"))}`,
|
|
55
59
|
` models-dev.json ${mark(modelsDevCachePath(dataDir))}`,
|
|
56
|
-
|
|
60
|
+
`${label(m.projectLevel)}${mark(projectFile(io.cwd, CONFIG_FILE))}`,
|
|
57
61
|
];
|
|
58
62
|
io.stdout(`${lines.join("\n")}\n`);
|
|
59
63
|
return ExitCode.Ok;
|
|
@@ -66,13 +70,13 @@ function editConfig(io) {
|
|
|
66
70
|
initConfigDir(configDir);
|
|
67
71
|
const editor = (io.env["VISUAL"] ?? io.env["EDITOR"] ?? "").trim();
|
|
68
72
|
if (editor === "") {
|
|
69
|
-
io.stdout(
|
|
73
|
+
io.stdout(msg().subcommands.configShow.noEditor(path));
|
|
70
74
|
return ExitCode.Ok;
|
|
71
75
|
}
|
|
72
76
|
const quoted = process.platform === "win32" ? `"${path}"` : `'${path.replace(/'/g, `'\\''`)}'`;
|
|
73
77
|
const result = spawnSync(`${editor} ${quoted}`, { stdio: "inherit", shell: true });
|
|
74
78
|
if (result.error !== undefined || result.status !== 0) {
|
|
75
|
-
io.stderr(
|
|
79
|
+
io.stderr(msg().subcommands.configShow.editorFailed(editor, path));
|
|
76
80
|
return ExitCode.RuntimeError;
|
|
77
81
|
}
|
|
78
82
|
return ExitCode.Ok;
|
|
@@ -111,19 +115,20 @@ function display(path, value) {
|
|
|
111
115
|
export async function describeModel(config, registry) {
|
|
112
116
|
if (config.defaultModel !== undefined)
|
|
113
117
|
return { ref: config.defaultModel, reason: "config.defaultModel" };
|
|
118
|
+
const m = msg().subcommands.configShow;
|
|
114
119
|
if (registry === undefined)
|
|
115
|
-
return { ref: undefined, reason:
|
|
120
|
+
return { ref: undefined, reason: m.registryMissing };
|
|
116
121
|
const picked = await pickDefaultModel(registry);
|
|
117
122
|
if (picked === undefined)
|
|
118
123
|
return { ref: undefined, reason: noModelGuidance(registry) };
|
|
119
124
|
const ref = `${picked.provider.id}/${picked.model.id}`;
|
|
120
125
|
if (picked.via === "local")
|
|
121
|
-
return { ref, reason:
|
|
126
|
+
return { ref, reason: m.zeroConfigLocal(picked.provider.id, picked.rule) };
|
|
122
127
|
const key = await registry.resolveApiKey(picked.provider.id);
|
|
123
128
|
const origin = key.origin !== undefined ? ` ${key.origin}` : "";
|
|
124
129
|
return {
|
|
125
130
|
ref,
|
|
126
|
-
reason:
|
|
131
|
+
reason: m.zeroConfigKey(picked.provider.id, `${key.source}${origin}`, picked.rule),
|
|
127
132
|
};
|
|
128
133
|
}
|
|
129
134
|
/** config 里出现的供应商 + baseUrl 来自环境变量的内置供应商。 */
|
|
@@ -170,9 +175,10 @@ export function describeProviders(config, registry) {
|
|
|
170
175
|
function providerLines(providers) {
|
|
171
176
|
if (providers.length === 0)
|
|
172
177
|
return [];
|
|
173
|
-
const
|
|
178
|
+
const m = msg().subcommands.configShow;
|
|
179
|
+
const lines = ["", m.providersHeading];
|
|
174
180
|
for (const p of providers) {
|
|
175
|
-
const env = p.baseUrlEnv !== undefined ?
|
|
181
|
+
const env = p.baseUrlEnv !== undefined ? m.baseUrlFromEnv(p.baseUrlEnv) : "";
|
|
176
182
|
lines.push(` ${p.id} ${p.api} ${p.baseUrl}${env}`);
|
|
177
183
|
for (const c of p.channels ?? [])
|
|
178
184
|
lines.push(` @${c.name} ${c.api} ${c.baseUrl}`);
|
|
@@ -185,7 +191,8 @@ function providerLines(providers) {
|
|
|
185
191
|
return lines;
|
|
186
192
|
}
|
|
187
193
|
function layersOf(level, project, effective, cli) {
|
|
188
|
-
const
|
|
194
|
+
const m = msg().subcommands.configShow;
|
|
195
|
+
const layers = [{ name: "default", label: m.layerDefault, value: DISPLAY_DEFAULTS }];
|
|
189
196
|
const user = loadConfigFile("config", level.userConfigPath)?.value;
|
|
190
197
|
if (user !== undefined)
|
|
191
198
|
layers.push({ name: "user", label: level.userConfigPath, value: user });
|
|
@@ -209,7 +216,7 @@ function layersOf(level, project, effective, cli) {
|
|
|
209
216
|
layers.push({ name: "project", label: ".ama/config.json", value: unflatten(accepted) });
|
|
210
217
|
}
|
|
211
218
|
if (cli !== undefined && Object.keys(cli).length > 0)
|
|
212
|
-
layers.push({ name: "cli", label:
|
|
219
|
+
layers.push({ name: "cli", label: m.layerCli, value: cli });
|
|
213
220
|
return layers;
|
|
214
221
|
}
|
|
215
222
|
function unflatten(flat) {
|
|
@@ -243,14 +250,15 @@ export function sourcesOf(effective, layers) {
|
|
|
243
250
|
export function describeCodemode(config, nodeVersion) {
|
|
244
251
|
const capability = nodeVersion === undefined ? sandboxCapabilityFor(config) : detectSandboxCapability(nodeVersion);
|
|
245
252
|
const resolved = resolveCodemodeMode(config, capability.strict);
|
|
253
|
+
const m = msg().subcommands.configShow;
|
|
246
254
|
const sandbox = capability.nodeMajor >= 25
|
|
247
|
-
?
|
|
255
|
+
? m.sandboxIsolated(capability.nodeMajor)
|
|
248
256
|
: capability.strict
|
|
249
|
-
?
|
|
250
|
-
:
|
|
257
|
+
? m.sandboxOs(capability.nodeMajor, capability.os.kind)
|
|
258
|
+
: m.sandboxNone(capability.nodeMajor);
|
|
251
259
|
const reason = resolved.source === "config"
|
|
252
|
-
?
|
|
253
|
-
:
|
|
260
|
+
? m.codemodeExplicit(sandbox)
|
|
261
|
+
: m.codemodeFollowsPreset(resolved.preset, sandbox);
|
|
254
262
|
const out = {
|
|
255
263
|
mode: resolved.mode,
|
|
256
264
|
source: resolved.source,
|
|
@@ -270,7 +278,7 @@ function presetAliasNotes(layers) {
|
|
|
270
278
|
for (const layer of layers) {
|
|
271
279
|
const preset = layer.value?.tools?.preset;
|
|
272
280
|
if (preset !== undefined && Object.hasOwn(TOOLS_PRESET_ALIASES, preset))
|
|
273
|
-
notes.push(
|
|
281
|
+
notes.push(msg().subcommands.configShow.presetAlias(layer.name, layer.label, preset, canonicalPreset(preset)));
|
|
274
282
|
}
|
|
275
283
|
return notes;
|
|
276
284
|
}
|
|
@@ -279,21 +287,26 @@ function choice(name, value, all) {
|
|
|
279
287
|
return undefined;
|
|
280
288
|
if (all.includes(value))
|
|
281
289
|
return value;
|
|
282
|
-
throw new UsageError(`--${name}
|
|
290
|
+
throw new UsageError(msg().subcommands.common.invalidChoice(`--${name}`, all, value));
|
|
283
291
|
}
|
|
284
292
|
export async function runConfig(argv, io, deps) {
|
|
293
|
+
// [W6-S] get / set / unset / list(config-set.ts)
|
|
294
|
+
const edit = argv.findIndex((a) => !a.startsWith("-"));
|
|
295
|
+
if (edit !== -1 && isEditAction(argv[edit]))
|
|
296
|
+
return runConfigEdit(argv[edit], [...argv.slice(0, edit), ...argv.slice(edit + 1)], io);
|
|
285
297
|
const { positionals, values, flags } = parseSubArgs(argv, ["profile", "auth-file", "tools-preset", "codemode"], ["json"]);
|
|
286
298
|
const action = positionals[0] ?? "show";
|
|
287
299
|
if (flags.has("help")) {
|
|
288
|
-
io.stdout(
|
|
300
|
+
io.stdout(`${configUsage()}${msg().settings.cli.usage}`);
|
|
289
301
|
return ExitCode.Ok;
|
|
290
302
|
}
|
|
291
303
|
if (action === "path")
|
|
292
304
|
return showPaths(io);
|
|
293
305
|
if (action === "edit")
|
|
294
306
|
return editConfig(io);
|
|
307
|
+
const m = msg().subcommands.configShow;
|
|
295
308
|
if (action !== "show")
|
|
296
|
-
throw new UsageError(
|
|
309
|
+
throw new UsageError(m.unknownAction(action));
|
|
297
310
|
const cli = {};
|
|
298
311
|
const presetFlag = choice("tools-preset", values.get("tools-preset"), TOOLS_PRESET_INPUTS);
|
|
299
312
|
if (presetFlag !== undefined)
|
|
@@ -338,7 +351,7 @@ export async function runConfig(argv, io, deps) {
|
|
|
338
351
|
rows.push({
|
|
339
352
|
path: "codemode.mode",
|
|
340
353
|
value: codemode.mode,
|
|
341
|
-
source:
|
|
354
|
+
source: m.defaultSource(codemode.reason),
|
|
342
355
|
});
|
|
343
356
|
rows.sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : 0));
|
|
344
357
|
if (flags.has("json")) {
|
|
@@ -350,9 +363,9 @@ export async function runConfig(argv, io, deps) {
|
|
|
350
363
|
io.stdout(`${JSON.stringify({ model, providers, tools: preset.builtin, preset: preset.preset, codemode, bashSandbox: { active: bashSandbox.active, detail: bashSandbox.detail }, entries, layers: layers.map((l) => ({ name: l.name, file: l.label })), notes, warnings }, null, 2)}\n`);
|
|
351
364
|
return ExitCode.Ok;
|
|
352
365
|
}
|
|
353
|
-
const lines = [
|
|
366
|
+
const lines = [m.heading];
|
|
354
367
|
for (const layer of layers.slice(1))
|
|
355
|
-
lines.push(
|
|
368
|
+
lines.push(m.layerLine(layer.name, layer.label));
|
|
356
369
|
lines.push("");
|
|
357
370
|
const texts = rows.map((row) => [`${row.path} = ${display(row.path, row.value)}`, row.source]);
|
|
358
371
|
const width = Math.min(60, Math.max(...texts.map(([text]) => (text ?? "").length)));
|
|
@@ -360,16 +373,17 @@ export async function runConfig(argv, io, deps) {
|
|
|
360
373
|
lines.push(` ${(text ?? "").padEnd(width)} ${source}`);
|
|
361
374
|
lines.push(...providerLines(providers));
|
|
362
375
|
lines.push("");
|
|
363
|
-
lines.push(
|
|
364
|
-
lines.push(
|
|
365
|
-
lines.push(
|
|
376
|
+
lines.push(m.model(model.ref, model.reason));
|
|
377
|
+
lines.push(m.tools(preset.builtin.join(", "), preset.preset, preset.codemode));
|
|
378
|
+
lines.push(m.codemode(codemode.mode, codemode.reason));
|
|
366
379
|
if (codemode.unavailable !== undefined)
|
|
367
380
|
lines.push(` ${codemode.unavailable}`);
|
|
368
|
-
lines.push(
|
|
381
|
+
lines.push(m.bashSandbox(bashSandbox.detail));
|
|
369
382
|
for (const note of notes)
|
|
370
|
-
lines.push(
|
|
371
|
-
|
|
372
|
-
|
|
383
|
+
lines.push(m.note(note));
|
|
384
|
+
const presetWarnings = preset.warnings.map((w) => msg().session.codemode.presetWarning(w));
|
|
385
|
+
for (const warning of [...warnings, ...presetWarnings])
|
|
386
|
+
lines.push(m.warning(warning));
|
|
373
387
|
io.stdout(`${lines.join("\n")}\n`);
|
|
374
388
|
return ExitCode.Ok;
|
|
375
389
|
}
|
|
@@ -7,5 +7,6 @@
|
|
|
7
7
|
* [W3-B12] baseUrl 来自 `OPENAI_BASE_URL` / `ANTHROPIC_BASE_URL` 时在 key 行后标出变量与地址。
|
|
8
8
|
*/
|
|
9
9
|
import type { CliIo, RuntimeDeps } from "../deps.js";
|
|
10
|
-
|
|
10
|
+
/** 用法(随界面语言)。 */
|
|
11
|
+
export declare function doctorUsage(): string;
|
|
11
12
|
export declare function runDoctor(argv: readonly string[], io: CliIo, deps: RuntimeDeps | undefined): Promise<number>;
|