@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
|
@@ -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>;
|
|
@@ -0,0 +1,189 @@
|
|
|
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 { loadConfigFile } from "../../config/load.js";
|
|
11
|
+
import { CONFIG_FILE, resolveConfigDir, resolveDataDir, userFile } from "../../config/paths.js";
|
|
12
|
+
import { findTrustEntry, readTrustFile } from "../../config/trust.js";
|
|
13
|
+
import { ConfigEditError, setConfigValue } from "../../config/edit.js";
|
|
14
|
+
import { msg } from "../../i18n/index.js";
|
|
15
|
+
import { editMemory } from "../../memory/edit.js";
|
|
16
|
+
import { logicalPath, projectRootOf, standaloneRoots, } from "../../memory/paths.js";
|
|
17
|
+
import { findOne, listText, memoryErrorText, scopeSummaries } from "../../memory/report.js";
|
|
18
|
+
import { DEFAULT_MEMORY_LIMITS, MemoryStore } from "../../memory/store.js";
|
|
19
|
+
import { editExternally } from "../../modes/interactive/external-editor.js";
|
|
20
|
+
import { parseSubArgs, UsageError } from "../args.js";
|
|
21
|
+
import { confirmContinue } from "../choice-prompt.js";
|
|
22
|
+
import { ExitCode } from "../exit-codes.js";
|
|
23
|
+
function load(io) {
|
|
24
|
+
const configDir = resolveConfigDir({ env: io.env });
|
|
25
|
+
const dataDir = resolveDataDir({ env: io.env });
|
|
26
|
+
const configPath = userFile({ configDir }, CONFIG_FILE);
|
|
27
|
+
const memory = loadConfigFile("config", configPath)?.value.memory ?? {};
|
|
28
|
+
const scopes = memory.scopes ?? ["user", "project"];
|
|
29
|
+
const notes = [];
|
|
30
|
+
let projectRoot;
|
|
31
|
+
if (scopes.includes("project")) {
|
|
32
|
+
const trusted = findTrustEntry(readTrustFile(configDir).entries, io.cwd)?.trusted === true;
|
|
33
|
+
if (trusted)
|
|
34
|
+
projectRoot = projectRootOf(io.cwd);
|
|
35
|
+
else
|
|
36
|
+
notes.push(msg().memory.cli.untrusted(io.cwd));
|
|
37
|
+
}
|
|
38
|
+
if (memory.enabled !== true)
|
|
39
|
+
notes.push(msg().memory.cli.disabledNote);
|
|
40
|
+
const roots = standaloneRoots({ dataDir, projectRoot, user: scopes.includes("user") });
|
|
41
|
+
const limits = {
|
|
42
|
+
indexMaxBytes: memory.indexMaxBytes ?? DEFAULT_MEMORY_LIMITS.indexMaxBytes,
|
|
43
|
+
fileMaxBytes: memory.fileMaxBytes ?? DEFAULT_MEMORY_LIMITS.fileMaxBytes,
|
|
44
|
+
maxFiles: memory.maxFiles ?? DEFAULT_MEMORY_LIMITS.maxFiles,
|
|
45
|
+
};
|
|
46
|
+
const store = new MemoryStore(roots, limits, projectRoot === undefined ? {} : { projectRoot });
|
|
47
|
+
return { store, notes };
|
|
48
|
+
}
|
|
49
|
+
function scopeFilter(store, raw) {
|
|
50
|
+
if (raw === undefined || raw === "all")
|
|
51
|
+
return store.scopes();
|
|
52
|
+
if (raw !== "user" && raw !== "project")
|
|
53
|
+
throw new UsageError(msg().memory.cli.unknownScope(raw));
|
|
54
|
+
return store.scopes().filter((s) => s === raw);
|
|
55
|
+
}
|
|
56
|
+
/** 改用户级 `memory.enabled`(W6-S 的编辑核心:写前重读、只改这一项、校验、原子写 + `.bak`)。 */
|
|
57
|
+
function setEnabled(io, enabled) {
|
|
58
|
+
const m = msg().memory.cli;
|
|
59
|
+
try {
|
|
60
|
+
const result = setConfigValue({
|
|
61
|
+
configDir: resolveConfigDir({ env: io.env }),
|
|
62
|
+
cwd: io.cwd,
|
|
63
|
+
env: io.env,
|
|
64
|
+
scope: "user",
|
|
65
|
+
key: "memory.enabled",
|
|
66
|
+
value: enabled,
|
|
67
|
+
});
|
|
68
|
+
io.stdout(`${enabled ? m.enabled(result.path) : m.disabled(result.path)}\n`);
|
|
69
|
+
return ExitCode.Ok;
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
if (!(error instanceof ConfigEditError))
|
|
73
|
+
throw error;
|
|
74
|
+
io.stderr(`${error.message}\n`);
|
|
75
|
+
return ExitCode.Config;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
export async function runMemory(argv, io, deps = {}) {
|
|
79
|
+
const m = msg().memory;
|
|
80
|
+
const { positionals, values, flags } = parseSubArgs(argv, ["scope"], ["json", "yes"]);
|
|
81
|
+
const [sub, ...rest] = positionals;
|
|
82
|
+
if (flags.has("help") || sub === undefined) {
|
|
83
|
+
io.stdout(m.cli.usage);
|
|
84
|
+
return sub === undefined && !flags.has("help") ? ExitCode.Usage : ExitCode.Ok;
|
|
85
|
+
}
|
|
86
|
+
const ctx = load(io);
|
|
87
|
+
const { store } = ctx;
|
|
88
|
+
const name = rest.join(" ");
|
|
89
|
+
const notes = () => {
|
|
90
|
+
for (const note of ctx.notes)
|
|
91
|
+
io.stderr(`${note}\n`);
|
|
92
|
+
};
|
|
93
|
+
try {
|
|
94
|
+
switch (sub) {
|
|
95
|
+
case "list": {
|
|
96
|
+
const scopes = scopeFilter(store, values.get("scope"));
|
|
97
|
+
if (flags.has("json")) {
|
|
98
|
+
const out = scopeSummaries(store, scopes).map((s) => ({
|
|
99
|
+
scope: s.scope,
|
|
100
|
+
path: logicalPath(s.scope),
|
|
101
|
+
dir: store.root(s.scope),
|
|
102
|
+
indexBytes: s.indexBytes,
|
|
103
|
+
omitted: s.omitted,
|
|
104
|
+
entries: s.entries,
|
|
105
|
+
}));
|
|
106
|
+
io.stdout(`${JSON.stringify(out, null, 2)}\n`);
|
|
107
|
+
}
|
|
108
|
+
else
|
|
109
|
+
io.stdout(`${listText(store, { scopes })}\n`);
|
|
110
|
+
notes();
|
|
111
|
+
return ExitCode.Ok;
|
|
112
|
+
}
|
|
113
|
+
case "path": {
|
|
114
|
+
for (const scope of scopeFilter(store, values.get("scope")))
|
|
115
|
+
io.stdout(`${scope}\t${store.root(scope) ?? ""}\n`);
|
|
116
|
+
notes();
|
|
117
|
+
return ExitCode.Ok;
|
|
118
|
+
}
|
|
119
|
+
case "show": {
|
|
120
|
+
if (name === "")
|
|
121
|
+
throw new UsageError(m.cli.needName(sub));
|
|
122
|
+
const found = findOne(store, name);
|
|
123
|
+
if (!found.ok) {
|
|
124
|
+
io.stderr(`${found.message}\n`);
|
|
125
|
+
return ExitCode.Usage;
|
|
126
|
+
}
|
|
127
|
+
io.stdout(`${(store.readRaw(found.entry) ?? "").trimEnd()}\n`);
|
|
128
|
+
return ExitCode.Ok;
|
|
129
|
+
}
|
|
130
|
+
case "edit": {
|
|
131
|
+
const scope = values.get("scope");
|
|
132
|
+
const target = name !== "" ? name : scope === undefined ? undefined : scopeFilter(store, scope)[0];
|
|
133
|
+
const edit = deps.edit ??
|
|
134
|
+
((text, file) => editExternally(text, file, {
|
|
135
|
+
env: io.env,
|
|
136
|
+
suspend: () => undefined,
|
|
137
|
+
resume: () => undefined,
|
|
138
|
+
}));
|
|
139
|
+
const outcome = await editMemory(store, target, edit);
|
|
140
|
+
if (outcome.status === "not_found") {
|
|
141
|
+
io.stderr(`${outcome.message}\n`);
|
|
142
|
+
return ExitCode.Usage;
|
|
143
|
+
}
|
|
144
|
+
io.stdout(`${outcome.status === "saved"
|
|
145
|
+
? m.command.saved(outcome.path)
|
|
146
|
+
: outcome.status === "cancelled"
|
|
147
|
+
? m.command.editCancelled
|
|
148
|
+
: m.command.unchanged}\n`);
|
|
149
|
+
return ExitCode.Ok;
|
|
150
|
+
}
|
|
151
|
+
case "rm": {
|
|
152
|
+
if (name === "")
|
|
153
|
+
throw new UsageError(m.cli.needName(sub));
|
|
154
|
+
const found = findOne(store, name);
|
|
155
|
+
if (!found.ok) {
|
|
156
|
+
io.stderr(`${found.message}\n`);
|
|
157
|
+
return ExitCode.Usage;
|
|
158
|
+
}
|
|
159
|
+
const path = logicalPath(found.entry.scope, found.entry.file);
|
|
160
|
+
if (!flags.has("yes")) {
|
|
161
|
+
if (!io.stdinIsTTY && deps.confirm === undefined) {
|
|
162
|
+
io.stderr(`${m.cli.needsYes}\n`);
|
|
163
|
+
return ExitCode.Usage;
|
|
164
|
+
}
|
|
165
|
+
const question = m.cli.confirmRemove(path);
|
|
166
|
+
const ok = await (deps.confirm ?? ((q) => confirmContinue({ question: q, env: io.env })))(question);
|
|
167
|
+
if (!ok)
|
|
168
|
+
return ExitCode.Ok;
|
|
169
|
+
}
|
|
170
|
+
await store.remove(found.entry);
|
|
171
|
+
io.stdout(`${m.command.deleted(path)}\n`);
|
|
172
|
+
return ExitCode.Ok;
|
|
173
|
+
}
|
|
174
|
+
case "enable":
|
|
175
|
+
case "disable":
|
|
176
|
+
return setEnabled(io, sub === "enable");
|
|
177
|
+
default:
|
|
178
|
+
throw new UsageError(m.cli.usage.trimEnd());
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
if (error instanceof UsageError) {
|
|
183
|
+
io.stderr(`${error.message}\n`);
|
|
184
|
+
return ExitCode.Usage;
|
|
185
|
+
}
|
|
186
|
+
io.stderr(`${memoryErrorText(error)}\n`);
|
|
187
|
+
return ExitCode.RuntimeError;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { sourceText } from "../../ai/providers/enrich.js";
|
|
6
6
|
import { matchLabel } from "../../ai/providers/models-dev.js";
|
|
7
|
+
import { msg } from "../../i18n/index.js";
|
|
7
8
|
export function compactTokens(n) {
|
|
8
9
|
if (n === undefined)
|
|
9
10
|
return "?";
|
|
@@ -20,12 +21,13 @@ export function metadataOf(registry, providerId, modelId) {
|
|
|
20
21
|
}
|
|
21
22
|
/** `ctx 262k · out 64k · 思考 · 图片 · 渠道 chat,messages`。 */
|
|
22
23
|
export function modelFlags(model) {
|
|
24
|
+
const t = msg().subcommands.modelMeta;
|
|
23
25
|
return [
|
|
24
26
|
`ctx ${compactTokens(model.contextWindow)}`,
|
|
25
27
|
`out ${compactTokens(model.maxTokens)}`,
|
|
26
|
-
model.reasoning ?
|
|
27
|
-
model.input.includes("image") ?
|
|
28
|
-
model.channels !== undefined ?
|
|
28
|
+
model.reasoning ? t.reasoning : undefined,
|
|
29
|
+
model.input.includes("image") ? t.image : undefined,
|
|
30
|
+
model.channels !== undefined ? t.channels(model.channels) : undefined,
|
|
29
31
|
]
|
|
30
32
|
.filter((x) => x !== undefined)
|
|
31
33
|
.join(" · ");
|
|
@@ -40,15 +42,15 @@ export function sourcesLine(metadata) {
|
|
|
40
42
|
const values = Object.values(metadata.sources);
|
|
41
43
|
if (values.every((s) => s === "catalog" || s === "default") && !metadata.looked)
|
|
42
44
|
return undefined;
|
|
45
|
+
const t = msg().subcommands.modelMeta;
|
|
43
46
|
const label = {
|
|
44
47
|
contextWindow: "ctx",
|
|
45
48
|
maxTokens: "out",
|
|
46
|
-
input:
|
|
47
|
-
reasoning:
|
|
48
|
-
cost:
|
|
49
|
+
input: t.image,
|
|
50
|
+
reasoning: t.reasoning,
|
|
51
|
+
cost: t.price,
|
|
49
52
|
};
|
|
50
53
|
const parts = Object.keys(label).map((field) => `${label[field]} ${sourceText(metadata.sources[field])}`);
|
|
51
|
-
const match = metadata.looked ?
|
|
52
|
-
|
|
53
|
-
return `来源 ${parts.join(" · ")}${match}${tools}`;
|
|
54
|
+
const match = metadata.looked ? matchLabel(metadata.match) : undefined;
|
|
55
|
+
return t.sources(parts, match, metadata.toolCall === false);
|
|
54
56
|
}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* (字段缺失或恒 0);其余(读到一点、只有写入)→ `inconclusive`(粒度或 TTL 问题)。
|
|
8
8
|
*
|
|
9
9
|
* 计费动作:执行前打印预估(两次 × `--tokens` × 目录输入价,无价 `$?`);非 TTY 必须 `--yes`
|
|
10
|
-
* (否则退出 2),TTY
|
|
10
|
+
* (否则退出 2),TTY 下方向键选一次「继续 / 取消」(choice-prompt.ts)。`--json` 时预估写 stderr,stdout 只有一个结果对象。
|
|
11
11
|
* 协议层不保留原始响应,「usage 字段」列的是该协议解析时读取的字段名。
|
|
12
12
|
*/
|
|
13
13
|
import type { Api, Model, Usage } from "../../ai/types.js";
|