@armadra/agent 0.5.1 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +177 -304
- package/CHANGELOG.zh-CN.md +442 -0
- package/README.md +408 -364
- package/README.zh-CN.md +705 -0
- package/dist/agent/session-plan.js +2 -2
- package/dist/agent/session-state.d.ts +3 -0
- package/dist/agent/session-state.js +20 -0
- package/dist/agent/session-subagent.d.ts +15 -1
- package/dist/agent/session-subagent.js +26 -3
- package/dist/agent/session-telemetry.d.ts +16 -2
- package/dist/agent/session-telemetry.js +29 -7
- package/dist/agent/session-tools.js +5 -2
- package/dist/agent/session-trace-writer.d.ts +27 -0
- package/dist/agent/session-trace-writer.js +253 -0
- package/dist/agent/session.d.ts +2 -0
- package/dist/agent/session.js +12 -0
- package/dist/agent/subagent-direct.d.ts +20 -0
- package/dist/agent/subagent-direct.js +76 -0
- package/dist/agent/subagent-registry.d.ts +8 -1
- package/dist/agent/subagent-registry.js +28 -1
- package/dist/agent/system-prompt.d.ts +3 -1
- package/dist/agent/system-prompt.js +3 -0
- package/dist/agent/tool-runner.d.ts +2 -1
- package/dist/agent/tool-runner.js +5 -4
- package/dist/agent/types-w6.d.ts +39 -0
- package/dist/agent/types-w6.js +4 -0
- package/dist/agent/types.d.ts +5 -2
- package/dist/agents/external.js +1 -1
- package/dist/agents/task-record.d.ts +74 -1
- package/dist/agents/task-record.js +100 -0
- package/dist/ai/apis/cache-params.js +2 -1
- package/dist/ai/apis/chatgpt-backend.d.ts +52 -0
- package/dist/ai/apis/chatgpt-backend.js +224 -0
- package/dist/ai/apis/chatgpt-rate-limits.d.ts +26 -0
- package/dist/ai/apis/chatgpt-rate-limits.js +91 -0
- package/dist/ai/apis/openai-responses-request.d.ts +2 -1
- package/dist/ai/apis/openai-responses-request.js +8 -2
- package/dist/ai/apis/openai-responses.d.ts +2 -0
- package/dist/ai/apis/openai-responses.js +51 -16
- package/dist/ai/overflow.d.ts +1 -1
- package/dist/ai/overflow.js +10 -7
- package/dist/ai/providers/auth.d.ts +15 -2
- package/dist/ai/providers/auth.js +69 -2
- package/dist/ai/providers/builtin.js +27 -0
- package/dist/ai/providers/catalog-data.js +1 -0
- package/dist/ai/providers/enrich.js +2 -7
- package/dist/ai/providers/models-dev-cache.js +15 -19
- package/dist/ai/providers/models-dev-snapshot.js +8 -7
- package/dist/ai/providers/models-dev.js +5 -15
- package/dist/ai/providers/suggest.js +2 -16
- package/dist/ai/types.d.ts +27 -1
- package/dist/auth/chatgpt/backend-client.d.ts +26 -0
- package/dist/auth/chatgpt/backend-client.js +74 -0
- package/dist/auth/chatgpt/claims.d.ts +17 -0
- package/dist/auth/chatgpt/claims.js +46 -0
- package/dist/auth/chatgpt/cli.d.ts +33 -0
- package/dist/auth/chatgpt/cli.js +252 -0
- package/dist/auth/chatgpt/doctor.d.ts +17 -0
- package/dist/auth/chatgpt/doctor.js +36 -0
- package/dist/auth/chatgpt/host-id.d.ts +7 -0
- package/dist/auth/chatgpt/host-id.js +26 -0
- package/dist/auth/chatgpt/login.d.ts +30 -0
- package/dist/auth/chatgpt/login.js +130 -0
- package/dist/auth/chatgpt/presets.d.ts +66 -0
- package/dist/auth/chatgpt/presets.js +120 -0
- package/dist/auth/chatgpt/quota-text.d.ts +13 -0
- package/dist/auth/chatgpt/quota-text.js +36 -0
- package/dist/auth/oauth/browser.d.ts +12 -0
- package/dist/auth/oauth/browser.js +27 -0
- package/dist/auth/oauth/callback-server.d.ts +47 -0
- package/dist/auth/oauth/callback-server.js +147 -0
- package/dist/auth/oauth/flows.d.ts +62 -0
- package/dist/auth/oauth/flows.js +113 -0
- package/dist/auth/oauth/jwt.d.ts +24 -0
- package/dist/auth/oauth/jwt.js +81 -0
- package/dist/auth/oauth/live.d.ts +21 -0
- package/dist/auth/oauth/live.js +25 -0
- package/dist/auth/oauth/oidc.d.ts +26 -0
- package/dist/auth/oauth/oidc.js +72 -0
- package/dist/auth/oauth/pkce.d.ts +15 -0
- package/dist/auth/oauth/pkce.js +20 -0
- package/dist/auth/oauth/refresh.d.ts +35 -0
- package/dist/auth/oauth/refresh.js +129 -0
- package/dist/auth/oauth/token-client.d.ts +33 -0
- package/dist/auth/oauth/token-client.js +121 -0
- package/dist/auth/oauth/token-store.d.ts +23 -0
- package/dist/auth/oauth/token-store.js +125 -0
- package/dist/auth/testing/fake-oauth.d.ts +73 -0
- package/dist/auth/testing/fake-oauth.js +271 -0
- package/dist/auth/testing/refresh-child.d.ts +5 -0
- package/dist/auth/testing/refresh-child.js +16 -0
- package/dist/bundle/ama.cjs +25928 -11144
- package/dist/checkpoints/backend.js +6 -5
- package/dist/checkpoints/restore.js +3 -2
- package/dist/checkpoints/settings.js +2 -1
- package/dist/checkpoints/shadow-git.js +7 -6
- package/dist/checkpoints/shadow-restore.js +3 -2
- package/dist/checkpoints/tracker.js +4 -3
- package/dist/cli/args.d.ts +9 -2
- package/dist/cli/args.js +74 -27
- package/dist/cli/bootstrap.js +53 -31
- package/dist/cli/choice-prompt.js +8 -6
- package/dist/cli/codemode-notice.js +2 -2
- package/dist/cli/compose-agents.js +2 -1
- package/dist/cli/compose-extensions.js +2 -0
- package/dist/cli/compose-memory.d.ts +53 -0
- package/dist/cli/compose-memory.js +127 -0
- package/dist/cli/compose-providers.d.ts +5 -0
- package/dist/cli/compose-providers.js +32 -2
- package/dist/cli/compose-session.d.ts +5 -0
- package/dist/cli/compose-session.js +27 -13
- package/dist/cli/compose-store.d.ts +2 -0
- package/dist/cli/compose-store.js +9 -5
- package/dist/cli/compose.d.ts +2 -0
- package/dist/cli/compose.js +13 -5
- package/dist/cli/default-model.d.ts +0 -2
- package/dist/cli/default-model.js +5 -8
- package/dist/cli/deps.d.ts +5 -1
- package/dist/cli/exit-codes.d.ts +1 -1
- package/dist/cli/exit-codes.js +7 -16
- package/dist/cli/from-prompt.js +3 -2
- package/dist/cli/help-text.d.ts +2 -1
- package/dist/cli/help-text.js +5 -99
- package/dist/cli/main.d.ts +5 -0
- package/dist/cli/main.js +21 -2
- package/dist/cli/proxy.js +14 -9
- package/dist/cli/runtime.d.ts +5 -0
- package/dist/cli/startup-screen.js +20 -27
- package/dist/cli/startup-steps.js +6 -8
- package/dist/cli/subcommands/auth.d.ts +6 -3
- package/dist/cli/subcommands/auth.js +52 -22
- package/dist/cli/subcommands/config-set.d.ts +21 -0
- package/dist/cli/subcommands/config-set.js +137 -0
- package/dist/cli/subcommands/config.d.ts +2 -1
- package/dist/cli/subcommands/config.js +51 -37
- package/dist/cli/subcommands/doctor.d.ts +2 -1
- package/dist/cli/subcommands/doctor.js +97 -58
- package/dist/cli/subcommands/init.d.ts +1 -1
- package/dist/cli/subcommands/init.js +8 -7
- package/dist/cli/subcommands/memory.d.ts +18 -0
- package/dist/cli/subcommands/memory.js +189 -0
- package/dist/cli/subcommands/model-meta.js +11 -9
- package/dist/cli/subcommands/models-cache-probe.js +23 -20
- package/dist/cli/subcommands/models-discover.d.ts +3 -0
- package/dist/cli/subcommands/models-discover.js +44 -21
- package/dist/cli/subcommands/models.d.ts +1 -1
- package/dist/cli/subcommands/models.js +29 -22
- package/dist/cli/subcommands/probe-runner.js +8 -7
- package/dist/cli/subcommands/providers-list.js +32 -21
- package/dist/cli/subcommands/providers-plan.js +24 -25
- package/dist/cli/subcommands/providers-probe.js +5 -6
- package/dist/cli/subcommands/providers.d.ts +1 -1
- package/dist/cli/subcommands/providers.js +45 -50
- package/dist/cli/subcommands/sessions-export.d.ts +1 -1
- package/dist/cli/subcommands/sessions-export.js +10 -9
- package/dist/cli/subcommands/sessions-search.d.ts +1 -1
- package/dist/cli/subcommands/sessions-search.js +11 -10
- package/dist/cli/subcommands/sessions-trace.d.ts +30 -0
- package/dist/cli/subcommands/sessions-trace.js +156 -0
- package/dist/cli/subcommands/sessions.d.ts +4 -3
- package/dist/cli/subcommands/sessions.js +40 -37
- package/dist/cli/subcommands/stats.d.ts +1 -1
- package/dist/cli/subcommands/stats.js +49 -30
- package/dist/cli/system-prompt-arg.js +3 -2
- package/dist/codemode/capability.js +3 -2
- package/dist/compaction/post-compact.d.ts +1 -0
- package/dist/compaction/post-compact.js +15 -1
- package/dist/compaction/prune-tier.d.ts +1 -1
- package/dist/compaction/prune-tier.js +3 -3
- package/dist/compaction/serialize.js +2 -1
- package/dist/config/auth-file.d.ts +12 -2
- package/dist/config/auth-file.js +32 -10
- package/dist/config/checker.js +12 -11
- package/dist/config/context-files.js +3 -2
- package/dist/config/edit.d.ts +106 -0
- package/dist/config/edit.js +350 -0
- package/dist/config/init.d.ts +4 -3
- package/dist/config/init.js +10 -18
- package/dist/config/json-schema.d.ts +2 -1
- package/dist/config/json-schema.js +101 -68
- package/dist/config/key-docs.d.ts +18 -7
- package/dist/config/key-docs.js +43 -128
- package/dist/config/load.js +7 -6
- package/dist/config/merge.d.ts +4 -1
- package/dist/config/merge.js +42 -22
- package/dist/config/paths.js +6 -5
- package/dist/config/profile.d.ts +5 -1
- package/dist/config/profile.js +7 -2
- package/dist/config/schema-w5.js +3 -2
- package/dist/config/schema-w6.d.ts +19 -0
- package/dist/config/schema-w6.js +115 -0
- package/dist/config/schema.js +34 -20
- package/dist/config/settings-registry.d.ts +78 -0
- package/dist/config/settings-registry.js +184 -0
- package/dist/config/types-w6.d.ts +109 -0
- package/dist/config/types-w6.js +19 -0
- package/dist/config/types.d.ts +11 -8
- package/dist/config/types.js +1 -0
- package/dist/drivers/acp/client.js +1 -1
- package/dist/drivers/acp/driver.js +13 -8
- package/dist/drivers/agents.js +4 -3
- package/dist/drivers/base.js +3 -2
- package/dist/drivers/host-runners.js +2 -1
- package/dist/drivers/native/claude-stream.js +12 -11
- package/dist/drivers/native/codex-app-server.js +17 -12
- package/dist/drivers/native/oneshot.js +8 -7
- package/dist/drivers/pool.js +1 -1
- package/dist/drivers/runner.d.ts +3 -1
- package/dist/drivers/runner.js +68 -20
- package/dist/drivers/turn.js +1 -1
- package/dist/hooks/config.js +3 -2
- package/dist/hooks/protocol.js +18 -12
- package/dist/host/api-impl.js +11 -10
- package/dist/host/loader.js +9 -8
- package/dist/host/types.d.ts +3 -0
- package/dist/i18n/catalog.d.ts +2169 -0
- package/dist/i18n/catalog.js +72 -0
- package/dist/i18n/format.d.ts +21 -0
- package/dist/i18n/format.js +58 -0
- package/dist/i18n/index.d.ts +58 -0
- package/dist/i18n/index.js +72 -0
- package/dist/i18n/messages/agents.d.ts +84 -0
- package/dist/i18n/messages/agents.js +85 -0
- package/dist/i18n/messages/approval.d.ts +99 -0
- package/dist/i18n/messages/approval.js +100 -0
- package/dist/i18n/messages/auth.d.ts +187 -0
- package/dist/i18n/messages/auth.js +189 -0
- package/dist/i18n/messages/cli-args.d.ts +46 -0
- package/dist/i18n/messages/cli-args.js +46 -0
- package/dist/i18n/messages/cli-help.d.ts +12 -0
- package/dist/i18n/messages/cli-help.js +244 -0
- package/dist/i18n/messages/cli.d.ts +336 -0
- package/dist/i18n/messages/cli.js +311 -0
- package/dist/i18n/messages/config-keys.d.ts +289 -0
- package/dist/i18n/messages/config-keys.js +292 -0
- package/dist/i18n/messages/config.d.ts +502 -0
- package/dist/i18n/messages/config.js +239 -0
- package/dist/i18n/messages/drivers.d.ts +123 -0
- package/dist/i18n/messages/drivers.js +124 -0
- package/dist/i18n/messages/errors.d.ts +83 -0
- package/dist/i18n/messages/errors.js +171 -0
- package/dist/i18n/messages/interactive-line.d.ts +61 -0
- package/dist/i18n/messages/interactive-line.js +69 -0
- package/dist/i18n/messages/interactive-startup.d.ts +103 -0
- package/dist/i18n/messages/interactive-startup.js +104 -0
- package/dist/i18n/messages/interactive-view.d.ts +140 -0
- package/dist/i18n/messages/interactive-view.js +141 -0
- package/dist/i18n/messages/interactive.d.ts +493 -0
- package/dist/i18n/messages/interactive.js +248 -0
- package/dist/i18n/messages/memory.d.ts +123 -0
- package/dist/i18n/messages/memory.js +128 -0
- package/dist/i18n/messages/panels.d.ts +190 -0
- package/dist/i18n/messages/panels.js +189 -0
- package/dist/i18n/messages/permissions.d.ts +126 -0
- package/dist/i18n/messages/permissions.js +151 -0
- package/dist/i18n/messages/plan.d.ts +123 -0
- package/dist/i18n/messages/plan.js +124 -0
- package/dist/i18n/messages/print.d.ts +86 -0
- package/dist/i18n/messages/print.js +91 -0
- package/dist/i18n/messages/report.d.ts +391 -0
- package/dist/i18n/messages/report.js +490 -0
- package/dist/i18n/messages/rewind.d.ts +198 -0
- package/dist/i18n/messages/rewind.js +217 -0
- package/dist/i18n/messages/session.d.ts +230 -0
- package/dist/i18n/messages/session.js +258 -0
- package/dist/i18n/messages/settings.d.ts +348 -0
- package/dist/i18n/messages/settings.js +336 -0
- package/dist/i18n/messages/subcommands-config.d.ts +111 -0
- package/dist/i18n/messages/subcommands-config.js +127 -0
- package/dist/i18n/messages/subcommands.d.ts +548 -0
- package/dist/i18n/messages/subcommands.js +474 -0
- package/dist/i18n/messages/trace.d.ts +243 -0
- package/dist/i18n/messages/trace.js +238 -0
- package/dist/i18n/types.d.ts +15 -0
- package/dist/i18n/types.js +7 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +2 -0
- package/dist/memory/edit.d.ts +24 -0
- package/dist/memory/edit.js +63 -0
- package/dist/memory/frontmatter.d.ts +37 -0
- package/dist/memory/frontmatter.js +79 -0
- package/dist/memory/index.d.ts +28 -0
- package/dist/memory/index.js +126 -0
- package/dist/memory/lock.d.ts +17 -0
- package/dist/memory/lock.js +62 -0
- package/dist/memory/paths.d.ts +57 -0
- package/dist/memory/paths.js +175 -0
- package/dist/memory/report.d.ts +36 -0
- package/dist/memory/report.js +86 -0
- package/dist/memory/runtime.d.ts +42 -0
- package/dist/memory/runtime.js +36 -0
- package/dist/memory/secrets.d.ts +8 -0
- package/dist/memory/secrets.js +27 -0
- package/dist/memory/section.d.ts +28 -0
- package/dist/memory/section.js +59 -0
- package/dist/memory/store.d.ts +70 -0
- package/dist/memory/store.js +284 -0
- package/dist/memory/tool.d.ts +31 -0
- package/dist/memory/tool.js +94 -0
- package/dist/modes/acp/acp-events.js +2 -1
- package/dist/modes/acp/acp-server.js +13 -12
- package/dist/modes/commands-core.d.ts +11 -0
- package/dist/modes/commands-core.js +93 -62
- package/dist/modes/image-input.js +20 -6
- package/dist/modes/interactive/agent-bar.d.ts +95 -0
- package/dist/modes/interactive/agent-bar.js +248 -0
- package/dist/modes/interactive/agent-panels.js +27 -26
- package/dist/modes/interactive/agent-transcript.d.ts +47 -0
- package/dist/modes/interactive/agent-transcript.js +191 -0
- package/dist/modes/interactive/agent-ui.d.ts +36 -1
- package/dist/modes/interactive/agent-ui.js +180 -14
- package/dist/modes/interactive/agent-view.d.ts +72 -0
- package/dist/modes/interactive/agent-view.js +281 -0
- package/dist/modes/interactive/approval-dialog.js +46 -34
- package/dist/modes/interactive/clipboard-paste.d.ts +2 -2
- package/dist/modes/interactive/clipboard-paste.js +9 -4
- package/dist/modes/interactive/commands.d.ts +19 -1
- package/dist/modes/interactive/commands.js +84 -40
- package/dist/modes/interactive/completion.js +2 -1
- package/dist/modes/interactive/config-panel.d.ts +70 -0
- package/dist/modes/interactive/config-panel.js +319 -0
- package/dist/modes/interactive/config-ui.d.ts +96 -0
- package/dist/modes/interactive/config-ui.js +397 -0
- package/dist/modes/interactive/confirm-dialog.js +6 -7
- package/dist/modes/interactive/event-notices.js +11 -9
- package/dist/modes/interactive/interactive-mode.d.ts +1 -1
- package/dist/modes/interactive/interactive-mode.js +19 -22
- package/dist/modes/interactive/key-dispatch.d.ts +12 -0
- package/dist/modes/interactive/key-dispatch.js +24 -9
- package/dist/modes/interactive/line/line-editor.js +2 -1
- package/dist/modes/interactive/line/line-mode.js +18 -7
- package/dist/modes/interactive/line/line-render.js +25 -24
- package/dist/modes/interactive/memory-panel.d.ts +64 -0
- package/dist/modes/interactive/memory-panel.js +221 -0
- package/dist/modes/interactive/message-view.d.ts +4 -2
- package/dist/modes/interactive/message-view.js +42 -33
- package/dist/modes/interactive/panels.js +39 -31
- package/dist/modes/interactive/pickers.d.ts +2 -1
- package/dist/modes/interactive/pickers.js +10 -6
- package/dist/modes/interactive/plan-command.d.ts +1 -1
- package/dist/modes/interactive/plan-command.js +24 -27
- package/dist/modes/interactive/plan-dialog.js +18 -17
- package/dist/modes/interactive/plan-flow.js +6 -5
- package/dist/modes/interactive/rewind-command.d.ts +1 -1
- package/dist/modes/interactive/rewind-command.js +18 -16
- package/dist/modes/interactive/rewind-flow.d.ts +0 -1
- package/dist/modes/interactive/rewind-flow.js +13 -14
- package/dist/modes/interactive/rewind-list.js +7 -6
- package/dist/modes/interactive/rewind-panel.js +40 -40
- package/dist/modes/interactive/rewind-text.d.ts +5 -3
- package/dist/modes/interactive/rewind-text.js +48 -38
- package/dist/modes/interactive/run-indicator.js +15 -12
- package/dist/modes/interactive/session-events.js +3 -2
- package/dist/modes/interactive/startup-header.js +22 -23
- package/dist/modes/interactive/startup-ui.js +38 -30
- package/dist/modes/interactive/status-area.d.ts +2 -0
- package/dist/modes/interactive/status-area.js +8 -2
- package/dist/modes/interactive/status-bar.js +4 -3
- package/dist/modes/interactive/subagent-view.js +9 -7
- package/dist/modes/interactive/tasks-report.d.ts +6 -0
- package/dist/modes/interactive/tasks-report.js +28 -31
- package/dist/modes/interactive/terminal-setup.d.ts +9 -0
- package/dist/modes/interactive/terminal-setup.js +23 -0
- package/dist/modes/interactive/tool-summary.js +19 -17
- package/dist/modes/interactive/tool-view.js +7 -4
- package/dist/modes/interactive/trace-view.d.ts +89 -0
- package/dist/modes/interactive/trace-view.js +332 -0
- package/dist/modes/print/print-mode.js +14 -15
- package/dist/modes/rpc/commands.js +7 -3
- package/dist/modes/rpc/rpc-mode.js +9 -3
- package/dist/modes/session-report.d.ts +2 -0
- package/dist/modes/session-report.js +101 -105
- package/dist/modes/startup-ui-text.js +11 -6
- package/dist/permissions/bypass.d.ts +8 -10
- package/dist/permissions/bypass.js +19 -10
- package/dist/permissions/memory-class.d.ts +23 -0
- package/dist/permissions/memory-class.js +54 -0
- package/dist/permissions/modes.d.ts +3 -3
- package/dist/permissions/modes.js +21 -16
- package/dist/permissions/pipeline.d.ts +1 -1
- package/dist/permissions/pipeline.js +9 -2
- package/dist/permissions/preview.js +49 -42
- package/dist/permissions/rules.js +5 -2
- package/dist/permissions/types.d.ts +4 -0
- package/dist/plan/store.js +2 -1
- package/dist/rpc.d.ts +39 -1
- package/dist/rpc.js +3 -0
- package/dist/sandbox/bash.js +11 -8
- package/dist/sandbox/detect.js +14 -11
- package/dist/sdk.d.ts +17 -1
- package/dist/sdk.js +29 -7
- package/dist/session/export.js +31 -30
- package/dist/session/manager.d.ts +1 -1
- package/dist/session/manager.js +5 -3
- package/dist/session/reuse.js +5 -4
- package/dist/session/scan.js +3 -2
- package/dist/session/stats-aggregate.d.ts +3 -1
- package/dist/session/stats-aggregate.js +5 -1
- package/dist/session/stats-index.js +2 -1
- package/dist/session/stats-scan.d.ts +4 -1
- package/dist/session/stats-scan.js +6 -2
- package/dist/session/store.d.ts +11 -0
- package/dist/session/store.js +48 -1
- package/dist/session/types.d.ts +2 -0
- package/dist/skills/builtin.js +2 -1
- package/dist/tools/image-file.d.ts +26 -1
- package/dist/tools/image-file.js +55 -13
- package/dist/tools/presets.d.ts +14 -1
- package/dist/tools/presets.js +3 -3
- package/dist/tools/registry.js +1 -1
- package/dist/tools/truncate.d.ts +1 -1
- package/dist/tools/truncate.js +2 -2
- package/dist/tools/types.d.ts +17 -1
- package/dist/trace/build-index.d.ts +91 -0
- package/dist/trace/build-index.js +127 -0
- package/dist/trace/build-nodes.d.ts +24 -0
- package/dist/trace/build-nodes.js +279 -0
- package/dist/trace/build-util.d.ts +43 -0
- package/dist/trace/build-util.js +120 -0
- package/dist/trace/build.d.ts +82 -0
- package/dist/trace/build.js +382 -0
- package/dist/trace/detail.d.ts +35 -0
- package/dist/trace/detail.js +205 -0
- package/dist/trace/flatten.d.ts +69 -0
- package/dist/trace/flatten.js +173 -0
- package/dist/trace/format.d.ts +47 -0
- package/dist/trace/format.js +329 -0
- package/dist/trace/html-template.d.ts +19 -0
- package/dist/trace/html-template.js +150 -0
- package/dist/trace/html.d.ts +104 -0
- package/dist/trace/html.js +292 -0
- package/dist/trace/preview.d.ts +29 -0
- package/dist/trace/preview.js +59 -0
- package/dist/trace/query-session.d.ts +14 -0
- package/dist/trace/query-session.js +38 -0
- package/dist/trace/query.d.ts +55 -0
- package/dist/trace/query.js +188 -0
- package/dist/trace/session.d.ts +40 -0
- package/dist/trace/session.js +168 -0
- package/dist/trace/types.d.ts +243 -0
- package/dist/trace/types.js +13 -0
- package/dist/tui/components/editor-paste.d.ts +2 -0
- package/dist/tui/components/editor-paste.js +6 -3
- package/dist/tui/components/editor.js +2 -2
- package/dist/tui/components/loader.d.ts +3 -0
- package/dist/tui/components/loader.js +14 -0
- package/dist/tui/components/settings-list.d.ts +61 -0
- package/dist/tui/components/settings-list.js +135 -0
- package/dist/tui/keybindings.d.ts +5 -0
- package/dist/tui/keybindings.js +17 -5
- package/dist/tui.d.ts +1 -0
- package/dist/tui.js +2 -0
- package/docs/en/host-api.md +167 -0
- package/docs/en/permissions.md +214 -0
- package/docs/en/providers.md +625 -0
- package/docs/en/rpc.md +361 -0
- package/docs/en/sessions.md +219 -0
- package/docs/en/tui.md +527 -0
- package/docs/host-api.md +18 -17
- package/docs/memory.md +172 -0
- package/docs/permissions.md +2 -2
- package/docs/providers.md +67 -1
- package/docs/rpc.md +31 -3
- package/docs/session-format.md +8 -2
- package/docs/sessions.md +29 -1
- package/docs/tui.md +132 -3
- package/package.json +8 -3
|
@@ -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>;
|
|
@@ -26,8 +26,14 @@ import { ExitCode } from "../exit-codes.js";
|
|
|
26
26
|
import { describeProxy, inspectProxy } from "../proxy.js";
|
|
27
27
|
import { describeCodemode, describeModel } from "./config.js";
|
|
28
28
|
import { buildRegistry, loadUserLevel } from "./context.js";
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
import { apiKeyEntry } from "../../config/types-w6.js";
|
|
30
|
+
import { oauthDoctorLines } from "../../auth/chatgpt/doctor.js";
|
|
31
|
+
import { readOAuthEntry } from "../../auth/oauth/token-store.js";
|
|
32
|
+
import { getLocale, msg, resolveLocaleWithSource } from "../../i18n/index.js";
|
|
33
|
+
/** 用法(随界面语言)。 */
|
|
34
|
+
export function doctorUsage() {
|
|
35
|
+
return msg().report.doctor.usage;
|
|
36
|
+
}
|
|
31
37
|
class Report {
|
|
32
38
|
lines = [];
|
|
33
39
|
problems = 0;
|
|
@@ -50,24 +56,25 @@ class Report {
|
|
|
50
56
|
function probeLine(report, label, kind, path) {
|
|
51
57
|
const probe = probeConfigFile(kind, path);
|
|
52
58
|
if (!probe.exists) {
|
|
53
|
-
report.item(
|
|
59
|
+
report.item(msg().report.doctor.missing(label, path));
|
|
54
60
|
return;
|
|
55
61
|
}
|
|
56
62
|
if (!probe.ok) {
|
|
57
|
-
report.problem(
|
|
63
|
+
report.problem(msg().report.doctor.labeled(label, probe.messages.join("; ")));
|
|
58
64
|
return;
|
|
59
65
|
}
|
|
60
|
-
report.item(
|
|
66
|
+
report.item(msg().report.doctor.labeled(label, path));
|
|
61
67
|
for (const message of probe.messages)
|
|
62
|
-
report.item(`
|
|
68
|
+
report.item(` ${msg().report.doctor.warning(message)}`);
|
|
63
69
|
}
|
|
64
70
|
function trustSection(report, io, level, flag) {
|
|
65
|
-
report.
|
|
71
|
+
const m = msg().report.doctor;
|
|
72
|
+
report.section(m.trustTitle);
|
|
66
73
|
let trusted = false;
|
|
67
74
|
let from;
|
|
68
75
|
if (flag !== undefined) {
|
|
69
76
|
trusted = flag;
|
|
70
|
-
from =
|
|
77
|
+
from = m.fromCli;
|
|
71
78
|
}
|
|
72
79
|
else if (level.profile?.trustProject === true) {
|
|
73
80
|
trusted = true;
|
|
@@ -77,33 +84,34 @@ function trustSection(report, io, level, flag) {
|
|
|
77
84
|
try {
|
|
78
85
|
const entry = findTrustEntry(readTrustFile(level.configDir).entries, io.cwd);
|
|
79
86
|
trusted = entry?.trusted ?? false;
|
|
80
|
-
from = entry === undefined ?
|
|
87
|
+
from = entry === undefined ? m.noRecord : `trust.json ${entry.path}`;
|
|
81
88
|
}
|
|
82
89
|
catch (error) {
|
|
83
90
|
report.problem(error.message);
|
|
84
|
-
from =
|
|
91
|
+
from = m.trustInvalid;
|
|
85
92
|
}
|
|
86
93
|
}
|
|
87
|
-
report.item(
|
|
94
|
+
report.item(m.trust(io.cwd, trusted, from));
|
|
88
95
|
const gated = trustGatedResources(io.cwd);
|
|
89
96
|
if (gated.length > 0) {
|
|
90
|
-
report.item(
|
|
97
|
+
report.item(m.gated(trusted));
|
|
91
98
|
for (const path of gated)
|
|
92
99
|
report.item(` ${path}`);
|
|
93
100
|
}
|
|
94
101
|
return trusted;
|
|
95
102
|
}
|
|
96
103
|
async function keySection(report, io, level, deps) {
|
|
97
|
-
report.
|
|
104
|
+
const m = msg().report.doctor;
|
|
105
|
+
report.section(m.keysTitle);
|
|
98
106
|
try {
|
|
99
107
|
const auth = readAuthFile(level.authFile);
|
|
100
108
|
const mode = fileMode(level.authFile);
|
|
101
109
|
if (!auth.exists)
|
|
102
|
-
report.item(
|
|
110
|
+
report.item(m.missing("auth.json", level.authFile));
|
|
103
111
|
else if (isModeTooOpen(mode))
|
|
104
|
-
report.problem(
|
|
112
|
+
report.problem(m.authMode(mode?.toString(8) ?? "?", level.authFile));
|
|
105
113
|
else
|
|
106
|
-
report.item(
|
|
114
|
+
report.item(m.labeled("auth.json", level.authFile));
|
|
107
115
|
}
|
|
108
116
|
catch (error) {
|
|
109
117
|
report.problem(error.message);
|
|
@@ -112,29 +120,44 @@ async function keySection(report, io, level, deps) {
|
|
|
112
120
|
try {
|
|
113
121
|
const registry = await buildRegistry(level, io, deps);
|
|
114
122
|
for (const provider of registry.list()) {
|
|
123
|
+
// [W6-O] OAuth 条目:只读文件,不刷新 token
|
|
124
|
+
const oauth = readOAuthEntry(level.authFile, provider.id);
|
|
125
|
+
if (oauth !== undefined) {
|
|
126
|
+
const lines = await oauthDoctorLines(provider.id, oauth, {
|
|
127
|
+
env: io.env,
|
|
128
|
+
config: level.merged.config.auth?.chatgpt,
|
|
129
|
+
});
|
|
130
|
+
report.item(`${provider.id.padEnd(20)} ${lines.line}`);
|
|
131
|
+
if (lines.quota !== undefined)
|
|
132
|
+
report.item(`${"".padEnd(20)} ${lines.quota}`);
|
|
133
|
+
if (lines.problem !== undefined)
|
|
134
|
+
report.problem(lines.problem);
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
115
137
|
const key = await registry.resolveApiKey(provider.id);
|
|
116
138
|
const text = key.apiKey !== undefined
|
|
117
|
-
?
|
|
139
|
+
? m.keySource(key.source, key.origin)
|
|
118
140
|
: provider.requiresApiKey
|
|
119
|
-
?
|
|
120
|
-
:
|
|
141
|
+
? m.none
|
|
142
|
+
: m.notNeeded;
|
|
121
143
|
report.item(`${provider.id.padEnd(20)} ${text}`);
|
|
122
144
|
const env = baseUrlEnvOf(registry, provider.id);
|
|
123
145
|
if (env !== undefined)
|
|
124
|
-
report.item(`${"".padEnd(20)}
|
|
146
|
+
report.item(`${"".padEnd(20)} ${m.baseUrlEnv(env, provider.baseUrl)}`);
|
|
125
147
|
}
|
|
126
148
|
const model = await describeModel(level.merged.config, registry);
|
|
127
|
-
report.item(
|
|
149
|
+
report.item(m.model(model.ref, model.reason));
|
|
128
150
|
return;
|
|
129
151
|
}
|
|
130
152
|
catch (error) {
|
|
131
|
-
report.problem(
|
|
153
|
+
report.problem(m.registry(error.message));
|
|
132
154
|
}
|
|
133
155
|
}
|
|
134
156
|
// 未装配注册表:按文件与环境变量名列出能看到的来源。
|
|
135
157
|
try {
|
|
136
158
|
for (const [id, entry] of Object.entries(readAuthFile(level.authFile).file.providers)) {
|
|
137
|
-
|
|
159
|
+
const key = apiKeyEntry(entry)?.apiKey;
|
|
160
|
+
report.item(`${id.padEnd(20)} ${m.keySource("auth-file", key === undefined ? "oauth" : classifyKeyValue(key))}`);
|
|
138
161
|
}
|
|
139
162
|
}
|
|
140
163
|
catch {
|
|
@@ -142,16 +165,17 @@ async function keySection(report, io, level, deps) {
|
|
|
142
165
|
}
|
|
143
166
|
for (const [id, provider] of Object.entries(level.merged.config.providers ?? {})) {
|
|
144
167
|
if (provider.apiKey !== undefined) {
|
|
145
|
-
report.item(`${id.padEnd(20)} config
|
|
168
|
+
report.item(`${id.padEnd(20)} ${m.keySource("config", classifyKeyValue(provider.apiKey))}`);
|
|
146
169
|
}
|
|
147
170
|
}
|
|
148
171
|
const envNames = Object.keys(io.env)
|
|
149
172
|
.filter((n) => /_API_KEY$/.test(n) || n.startsWith("AMA_API_KEY_"))
|
|
150
173
|
.filter((n) => (io.env[n] ?? "") !== "")
|
|
151
174
|
.sort();
|
|
152
|
-
report.item(
|
|
175
|
+
report.item(m.envVars(envNames));
|
|
153
176
|
}
|
|
154
177
|
function hookSection(report, io, level, trusted) {
|
|
178
|
+
const m = msg().report.doctor;
|
|
155
179
|
report.section("Hook");
|
|
156
180
|
try {
|
|
157
181
|
const hooks = loadHookConfigs({
|
|
@@ -162,13 +186,13 @@ function hookSection(report, io, level, trusted) {
|
|
|
162
186
|
defaultTimeoutMs: level.merged.config.hooks?.timeoutMs,
|
|
163
187
|
});
|
|
164
188
|
if (hooks.hooks.length === 0)
|
|
165
|
-
report.item(
|
|
189
|
+
report.item(m.empty);
|
|
166
190
|
for (const hook of hooks.hooks) {
|
|
167
191
|
const matcher = hook.matcher !== undefined ? ` [${hook.matcher}]` : "";
|
|
168
|
-
report.item(`${hook.source.padEnd(7)} ${hook.event}${matcher} → ${hook.command
|
|
192
|
+
report.item(`${hook.source.padEnd(7)} ${hook.event}${matcher} → ${m.hookCommand(hook.command, hook.timeoutMs)}`);
|
|
169
193
|
}
|
|
170
194
|
if (hooks.skippedProject !== undefined) {
|
|
171
|
-
report.item(
|
|
195
|
+
report.item(m.hookSkipped(hooks.skippedProject));
|
|
172
196
|
}
|
|
173
197
|
}
|
|
174
198
|
catch (error) {
|
|
@@ -176,22 +200,34 @@ function hookSection(report, io, level, trusted) {
|
|
|
176
200
|
}
|
|
177
201
|
}
|
|
178
202
|
function terminalSection(report, io) {
|
|
179
|
-
report.
|
|
203
|
+
const m = msg().report.doctor;
|
|
204
|
+
report.section(m.terminalTitle);
|
|
180
205
|
const env = io.env;
|
|
181
|
-
report.item(
|
|
182
|
-
report.item(
|
|
206
|
+
report.item(m.tty(io.stdinIsTTY, io.stdoutIsTTY));
|
|
207
|
+
report.item(m.term(env["TERM"], env["COLORTERM"]));
|
|
183
208
|
if (env["NO_COLOR"] !== undefined)
|
|
184
|
-
report.item(
|
|
209
|
+
report.item(m.noColor);
|
|
185
210
|
if (env["TMUX"] !== undefined)
|
|
186
|
-
report.item(
|
|
211
|
+
report.item(m.tmux);
|
|
187
212
|
const columns = process.stdout.columns;
|
|
188
213
|
if (io.stdoutIsTTY && columns !== undefined)
|
|
189
|
-
report.item(
|
|
214
|
+
report.item(m.size(columns, process.stdout.rows));
|
|
190
215
|
const tui = io.stdinIsTTY && io.stdoutIsTTY && env["TERM"] !== "dumb";
|
|
191
|
-
report.item(
|
|
216
|
+
report.item(m.defaultUi(tui));
|
|
217
|
+
}
|
|
218
|
+
/** [W6-I3] 「界面语言:zh(来源 LANG=zh_CN.UTF-8)」;按环境与配置重算,与实际语言不同时说明来自 --lang。 */
|
|
219
|
+
function languageLine(report, io, level) {
|
|
220
|
+
const m = msg().report.doctor;
|
|
221
|
+
const language = level.profile?.language ?? level.merged.config.ui?.language;
|
|
222
|
+
const found = resolveLocaleWithSource(io.env, { language });
|
|
223
|
+
const locale = getLocale();
|
|
224
|
+
const source = found.locale === locale ? found.source : { kind: "cli" };
|
|
225
|
+
const name = source.kind === "env" || source.kind === "locale" ? source.name : undefined;
|
|
226
|
+
const value = source.kind === "env" || source.kind === "locale" ? source.value : undefined;
|
|
227
|
+
report.item(m.language(locale, m.languageSource(source.kind, name, value)));
|
|
192
228
|
}
|
|
193
229
|
function proxySection(report, io) {
|
|
194
|
-
report.section(
|
|
230
|
+
report.section(msg().report.doctor.proxyTitle);
|
|
195
231
|
for (const line of describeProxy(inspectProxy(io.env)))
|
|
196
232
|
report.item(line);
|
|
197
233
|
}
|
|
@@ -200,17 +236,18 @@ async function fileHistoryLine(report, dataDir) {
|
|
|
200
236
|
try {
|
|
201
237
|
const usage = await blobUsage(dataDir);
|
|
202
238
|
const shadow = await shadowUsage(dataDir);
|
|
203
|
-
const
|
|
204
|
-
|
|
239
|
+
const m = msg().report.doctor;
|
|
240
|
+
const shadowText = shadow.repos === 0 ? undefined : m.shadowRepos(shadow.repos, formatBytes(shadow.bytes));
|
|
241
|
+
report.item(m.fileHistory(usage.blobs, formatBytes(usage.bytes), shadowText, fileHistoryDir(dataDir)));
|
|
205
242
|
}
|
|
206
243
|
catch (error) {
|
|
207
|
-
report.item(
|
|
244
|
+
report.item(msg().report.doctor.fileHistoryFailed(error.message));
|
|
208
245
|
}
|
|
209
246
|
}
|
|
210
247
|
export async function runDoctor(argv, io, deps) {
|
|
211
248
|
const { values, flags } = parseSubArgs(argv, ["profile", "auth-file"], ["trust", "no-trust"]);
|
|
212
249
|
if (flags.has("help")) {
|
|
213
|
-
io.stdout(
|
|
250
|
+
io.stdout(doctorUsage());
|
|
214
251
|
return ExitCode.Ok;
|
|
215
252
|
}
|
|
216
253
|
const report = new Report();
|
|
@@ -227,52 +264,54 @@ export async function runDoctor(argv, io, deps) {
|
|
|
227
264
|
io.stdout(report.text());
|
|
228
265
|
return ExitCode.Config;
|
|
229
266
|
}
|
|
230
|
-
report.
|
|
231
|
-
report.
|
|
232
|
-
report.item(
|
|
267
|
+
const m = msg().report.doctor;
|
|
268
|
+
report.section(m.dirsTitle);
|
|
269
|
+
report.item(m.configDir(level.configDir));
|
|
270
|
+
report.item(m.dataDir(level.dataDir, existsSync(level.dataDir)));
|
|
233
271
|
await fileHistoryLine(report, level.dataDir);
|
|
234
|
-
report.section(
|
|
235
|
-
report.item(
|
|
236
|
-
probeLine(report,
|
|
272
|
+
report.section(m.layersTitle);
|
|
273
|
+
report.item(m.builtinDefaults);
|
|
274
|
+
probeLine(report, m.userLevel, "config", level.userConfigPath);
|
|
237
275
|
if (level.profile !== undefined) {
|
|
238
|
-
report.item(
|
|
276
|
+
report.item(m.labeled("profile", level.profile.path));
|
|
239
277
|
if (level.profile.configFile !== undefined)
|
|
240
278
|
probeLine(report, "profile.config", "config", level.profile.configFile);
|
|
241
279
|
}
|
|
242
280
|
const projectPath = projectFile(io.cwd, CONFIG_FILE);
|
|
243
|
-
probeLine(report,
|
|
281
|
+
probeLine(report, m.projectLevel, "config", projectPath);
|
|
244
282
|
try {
|
|
245
283
|
const project = loadConfigFile("config", projectPath);
|
|
246
284
|
const merged = mergeProjectAndCli(level.merged, project?.value, undefined);
|
|
247
285
|
for (const warning of merged.warnings)
|
|
248
|
-
report.item(
|
|
249
|
-
report.item(
|
|
286
|
+
report.item(m.tightened(warning));
|
|
287
|
+
report.item(m.permissionMode(merged.config.permission?.mode ?? "default"));
|
|
250
288
|
const codemode = describeCodemode(merged.config);
|
|
251
|
-
report.item(
|
|
289
|
+
report.item(m.codemode(codemode.mode, codemode.reason));
|
|
252
290
|
if (codemode.unavailable !== undefined)
|
|
253
291
|
report.item(` ${codemode.unavailable}`);
|
|
254
292
|
const os = osSandboxStatus(merged.config.sandbox?.enabled ?? "auto");
|
|
255
|
-
report.item(
|
|
256
|
-
report.item(
|
|
293
|
+
report.item(m.osSandbox(os.kind, os.detail, os.kind !== "none" && !os.restrictsWrites));
|
|
294
|
+
report.item(m.bashSandbox(resolveBashSandbox(merged.config.sandbox, { status: os }).detail));
|
|
257
295
|
}
|
|
258
296
|
catch {
|
|
259
297
|
// probeLine 已报告
|
|
260
298
|
}
|
|
261
299
|
for (const warning of level.warnings)
|
|
262
|
-
report.item(
|
|
300
|
+
report.item(m.warning(warning));
|
|
263
301
|
const flag = flags.has("trust") ? true : flags.has("no-trust") ? false : undefined;
|
|
264
302
|
const trusted = trustSection(report, io, level, flag);
|
|
265
|
-
report.section(
|
|
303
|
+
report.section(m.contextTitle);
|
|
266
304
|
const context = findContextFiles({ cwd: io.cwd, configDir: level.configDir });
|
|
267
305
|
if (context.files.length === 0)
|
|
268
|
-
report.item(
|
|
306
|
+
report.item(m.empty);
|
|
269
307
|
for (const file of context.files)
|
|
270
|
-
report.item(`${file.scope === "user" ?
|
|
308
|
+
report.item(`${file.scope === "user" ? m.contextUser : m.contextProject} ${file.path}`);
|
|
271
309
|
await keySection(report, io, level, deps);
|
|
272
310
|
hookSection(report, io, level, trusted);
|
|
273
|
-
report.item(
|
|
311
|
+
report.item(m.userHooks(userFile(level, HOOKS_FILE)));
|
|
274
312
|
proxySection(report, io);
|
|
275
313
|
terminalSection(report, io);
|
|
314
|
+
languageLine(report, io, level);
|
|
276
315
|
io.stdout(report.text());
|
|
277
316
|
return report.problems > 0 ? ExitCode.Config : ExitCode.Ok;
|
|
278
317
|
}
|
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
* `ama init [--force]`(docs/providers.md「配置目录」):建配置目录与缺省文件,逐个报告状态。
|
|
3
3
|
*/
|
|
4
4
|
import type { CliIo } from "../deps.js";
|
|
5
|
-
export declare
|
|
5
|
+
export declare function initUsage(): string;
|
|
6
6
|
export declare function runInit(argv: readonly string[], io: CliIo): number;
|
|
@@ -1,23 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `ama init [--force]`(docs/providers.md「配置目录」):建配置目录与缺省文件,逐个报告状态。
|
|
3
3
|
*/
|
|
4
|
-
import {
|
|
4
|
+
import { describeInit, initConfigDir, initNextSteps } from "../../config/init.js";
|
|
5
5
|
import { resolveConfigDir } from "../../config/paths.js";
|
|
6
6
|
import { parseSubArgs, UsageError } from "../args.js";
|
|
7
7
|
import { ExitCode } from "../exit-codes.js";
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
import { msg } from "../../i18n/index.js";
|
|
9
|
+
export function initUsage() {
|
|
10
|
+
return msg().subcommands.init.usage;
|
|
11
|
+
}
|
|
11
12
|
export function runInit(argv, io) {
|
|
12
13
|
const { positionals, flags } = parseSubArgs(argv, [], ["force"]);
|
|
13
14
|
if (flags.has("help")) {
|
|
14
|
-
io.stdout(
|
|
15
|
+
io.stdout(initUsage());
|
|
15
16
|
return ExitCode.Ok;
|
|
16
17
|
}
|
|
17
18
|
if (positionals.length > 0)
|
|
18
|
-
throw new UsageError(
|
|
19
|
+
throw new UsageError(msg().subcommands.common.extraArgs(positionals.join(" ")));
|
|
19
20
|
const result = initConfigDir(resolveConfigDir({ env: io.env }), { force: flags.has("force") });
|
|
20
21
|
io.stdout(describeInit(result));
|
|
21
|
-
io.stdout(`\n${
|
|
22
|
+
io.stdout(`\n${initNextSteps().join("\n")}\n`);
|
|
22
23
|
return ExitCode.Ok;
|
|
23
24
|
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ama memory list|show|edit|rm|path|enable|disable`(docs/wave6-plan.md §3.5)。[W6-M]
|
|
3
|
+
*
|
|
4
|
+
* - 作用域按用户级配置(`memory.scopes`,缺省 user + project);项目作用域以 cwd 定位,需项目已受信任
|
|
5
|
+
* (trust.json 记录),否则跳过并提示。`memory.enabled` 为 false 时照样能看、能改(条目保留但不使用)。
|
|
6
|
+
* - `list` / `show` / `path` 只读;`edit` 在 `$EDITOR` 里改副本,存回时同样查凭据与上限;`rm` 在终端里确认,
|
|
7
|
+
* 非终端需 `--yes`。
|
|
8
|
+
* - `enable` / `disable` 经 `config/edit.ts`(W6-S)改用户级 `config.json` 的 `memory.enabled`(校验、原子写 + `.bak`)。
|
|
9
|
+
*/
|
|
10
|
+
import { type EditText } from "../../memory/edit.js";
|
|
11
|
+
import type { CliIo } from "../deps.js";
|
|
12
|
+
export interface MemoryCliDeps {
|
|
13
|
+
/** 测试注入:代替真实编辑器。 */
|
|
14
|
+
edit?: EditText;
|
|
15
|
+
/** 测试注入:终端里的删除确认。 */
|
|
16
|
+
confirm?(question: string): Promise<boolean>;
|
|
17
|
+
}
|
|
18
|
+
export declare function runMemory(argv: readonly string[], io: CliIo, deps?: MemoryCliDeps): Promise<number>;
|