@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
|
@@ -10,6 +10,7 @@ import { CHANNEL_NAME_PATTERN } from "../../config/types.js";
|
|
|
10
10
|
import { padToWidth, visibleWidth } from "../../tui/ansi.js";
|
|
11
11
|
import { UsageError } from "../args.js";
|
|
12
12
|
import { compactTokens } from "./model-meta.js";
|
|
13
|
+
import { msg } from "../../i18n/index.js";
|
|
13
14
|
export const PROBE_APIS = [
|
|
14
15
|
"openai-completions",
|
|
15
16
|
"openai-responses",
|
|
@@ -21,14 +22,14 @@ const API_CHOICES = [...PROBE_APIS, "google-generative-ai"];
|
|
|
21
22
|
export function parseChannelSpec(spec) {
|
|
22
23
|
const m = /^([^=]+)=([^@]+)@(.+)$/.exec(spec.trim());
|
|
23
24
|
if (!m)
|
|
24
|
-
throw new UsageError(
|
|
25
|
+
throw new UsageError(msg().subcommands.providersPlan.channelSpec(spec));
|
|
25
26
|
const [, name = "", api = "", baseUrl = ""] = m;
|
|
26
27
|
if (!CHANNEL_NAME_PATTERN.test(name))
|
|
27
|
-
throw new UsageError(
|
|
28
|
+
throw new UsageError(msg().subcommands.providersPlan.channelName(name));
|
|
28
29
|
if (!API_CHOICES.includes(api))
|
|
29
|
-
throw new UsageError(
|
|
30
|
+
throw new UsageError(msg().subcommands.providersPlan.channelApi(API_CHOICES, api));
|
|
30
31
|
if (!/^https?:\/\//.test(baseUrl))
|
|
31
|
-
throw new UsageError(
|
|
32
|
+
throw new UsageError(msg().subcommands.providersPlan.channelUrl(baseUrl));
|
|
32
33
|
return { name, api: api, baseUrl: baseUrl.replace(/\/+$/, "") };
|
|
33
34
|
}
|
|
34
35
|
/** 从 `--base-url` 推出候选渠道;`api` 给定(非 auto)时只留对应的一个。 */
|
|
@@ -43,7 +44,7 @@ export function defaultChannels(baseUrl, api) {
|
|
|
43
44
|
if (api === undefined || api === "auto")
|
|
44
45
|
return all;
|
|
45
46
|
if (!API_CHOICES.includes(api))
|
|
46
|
-
throw new UsageError(
|
|
47
|
+
throw new UsageError(msg().subcommands.common.invalidChoice("--api", [...PROBE_APIS, "auto"], api));
|
|
47
48
|
const one = all.find((c) => c.api === api);
|
|
48
49
|
return [one ?? { name: apiShortName(api), api: api, baseUrl: base }];
|
|
49
50
|
}
|
|
@@ -166,32 +167,30 @@ export function mergeProvider(existing, input) {
|
|
|
166
167
|
config.models = models;
|
|
167
168
|
return { config, addedChannels, addedModels };
|
|
168
169
|
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
"no-tools": "不支持工具调用,不写入",
|
|
174
|
-
"no-channel": "候选渠道都不支持,不写入",
|
|
175
|
-
existing: "已存在,未改动",
|
|
176
|
-
};
|
|
170
|
+
function statusText(status) {
|
|
171
|
+
const t = msg().subcommands.providersPlan.status;
|
|
172
|
+
return status === "no-tools" ? t.noTools : status === "no-channel" ? t.noChannel : t[status];
|
|
173
|
+
}
|
|
177
174
|
function cost(fields) {
|
|
178
175
|
return fields.cost !== undefined ? `$${fields.cost.input}/${fields.cost.output}` : "—";
|
|
179
176
|
}
|
|
180
177
|
function yesNo(value) {
|
|
181
|
-
|
|
178
|
+
const t = msg().subcommands.providersPlan;
|
|
179
|
+
return value === undefined ? "?" : value ? t.yes : t.no;
|
|
182
180
|
}
|
|
183
181
|
/** 表格:id、渠道、上下文、输出、图像、推理、工具、价格($/M 入/出)、状态、models.dev 匹配。 */
|
|
184
182
|
export function renderTable(plans) {
|
|
183
|
+
const h = msg().subcommands.providersPlan.head;
|
|
185
184
|
const head = [
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
185
|
+
h.model,
|
|
186
|
+
h.channel,
|
|
187
|
+
h.context,
|
|
188
|
+
h.output,
|
|
189
|
+
h.image,
|
|
190
|
+
h.reasoning,
|
|
191
|
+
h.tools,
|
|
192
|
+
h.price,
|
|
193
|
+
h.status,
|
|
195
194
|
"models.dev",
|
|
196
195
|
];
|
|
197
196
|
const rows = plans.map((p) => [
|
|
@@ -199,11 +198,11 @@ export function renderTable(plans) {
|
|
|
199
198
|
p.channels.length > 0 ? p.channels.join(",") : "—",
|
|
200
199
|
compactTokens(p.fields.contextWindow),
|
|
201
200
|
compactTokens(p.fields.maxTokens),
|
|
202
|
-
p.fields.input === undefined ? "?" : p.fields.input.includes("image")
|
|
201
|
+
p.fields.input === undefined ? "?" : yesNo(p.fields.input.includes("image")),
|
|
203
202
|
yesNo(p.fields.reasoning),
|
|
204
203
|
yesNo(p.fields.toolCall),
|
|
205
204
|
cost(p.fields),
|
|
206
|
-
|
|
205
|
+
statusText(p.status),
|
|
207
206
|
matchLabel(p.match),
|
|
208
207
|
]);
|
|
209
208
|
const widths = head.map((h, i) => Math.max(visibleWidth(h), ...rows.map((r) => visibleWidth(r[i] ?? ""))));
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import { withCustomDefaults } from "../../ai/providers/catalog.js";
|
|
6
6
|
import { materializeModel } from "../../ai/providers/registry.js";
|
|
7
7
|
import { ProbeProgress, ProbeScheduler } from "./probe-runner.js";
|
|
8
|
+
import { msg } from "../../i18n/index.js";
|
|
8
9
|
/** 渠道的探测用供应商数据(key 由调用方传入)。 */
|
|
9
10
|
function probeProvider(id, channel) {
|
|
10
11
|
return {
|
|
@@ -33,8 +34,8 @@ export async function probeChannels(input) {
|
|
|
33
34
|
concurrency: input.concurrency,
|
|
34
35
|
timeoutMs: input.timeoutMs,
|
|
35
36
|
retryDelayMs: input.retryDelayMs,
|
|
36
|
-
onThrottle: (n) => progress.line(
|
|
37
|
-
onRecover: (n) => progress.line(
|
|
37
|
+
onThrottle: (n) => progress.line(msg().subcommands.probe.throttled(n)),
|
|
38
|
+
onRecover: (n) => progress.line(msg().subcommands.probe.recovered(n)),
|
|
38
39
|
});
|
|
39
40
|
let printed = 0;
|
|
40
41
|
/** 按模型顺序输出:前面的模型都探完才输出后面的。 */
|
|
@@ -55,15 +56,13 @@ export async function probeChannels(input) {
|
|
|
55
56
|
result.ok.push(name);
|
|
56
57
|
else {
|
|
57
58
|
result.error = firstLine(outcome.error);
|
|
58
|
-
failed.push(
|
|
59
|
+
failed.push({ name, error: result.error });
|
|
59
60
|
}
|
|
60
61
|
}
|
|
61
62
|
if (!complete && result.ok.length === 0)
|
|
62
63
|
continue;
|
|
63
64
|
results.set(id, result);
|
|
64
|
-
progress.line(
|
|
65
|
-
`${failed.length > 0 ? `(失败 ${failed.join(";")})` : ""}` +
|
|
66
|
-
`${complete ? "" : "(探测提前停止,部分渠道未探)"}\n`);
|
|
65
|
+
progress.line(msg().subcommands.probe.modelLine(id, result.ok, failed, complete));
|
|
67
66
|
}
|
|
68
67
|
};
|
|
69
68
|
await scheduler.run(tasks.length, async (index) => {
|
|
@@ -8,14 +8,14 @@
|
|
|
8
8
|
* - list / channels:供应商 → 渠道 → 模型数与 key 来源(从不显示 key)。remove:删配置与 auth.json 条目。
|
|
9
9
|
*
|
|
10
10
|
* 计费:`--probe` 每模型每渠道一次最小请求(并发执行,见到首个流事件即判可用并断开,见
|
|
11
|
-
* probe-runner.ts);执行前打印预估,TTY
|
|
11
|
+
* probe-runner.ts);执行前打印预估,TTY 下方向键选「继续 / 取消」(choice-prompt.ts,y / n 直选),非 TTY 必须 `--yes`。
|
|
12
12
|
*/
|
|
13
13
|
import type { AmaConfig } from "../../config/types.js";
|
|
14
14
|
import type { CliIo, RuntimeDeps } from "../deps.js";
|
|
15
15
|
import { type UserLevel } from "./context.js";
|
|
16
16
|
export declare const DEFAULT_MAX_REQUESTS = 60;
|
|
17
17
|
export declare const DEFAULT_LIMIT = 30;
|
|
18
|
-
export declare
|
|
18
|
+
export declare function providersUsage(): string;
|
|
19
19
|
export interface Ctx {
|
|
20
20
|
io: CliIo;
|
|
21
21
|
deps: Pick<RuntimeDeps, "providers">;
|
|
@@ -8,10 +8,9 @@
|
|
|
8
8
|
* - list / channels:供应商 → 渠道 → 模型数与 key 来源(从不显示 key)。remove:删配置与 auth.json 条目。
|
|
9
9
|
*
|
|
10
10
|
* 计费:`--probe` 每模型每渠道一次最小请求(并发执行,见到首个流事件即判可用并断开,见
|
|
11
|
-
* probe-runner.ts);执行前打印预估,TTY
|
|
11
|
+
* probe-runner.ts);执行前打印预估,TTY 下方向键选「继续 / 取消」(choice-prompt.ts,y / n 直选),非 TTY 必须 `--yes`。
|
|
12
12
|
*/
|
|
13
13
|
import { existsSync } from "node:fs";
|
|
14
|
-
import { createInterface } from "node:readline/promises";
|
|
15
14
|
import { describeModelsDev, loadModelsDevIndex } from "../../ai/providers/models-dev-cache.js";
|
|
16
15
|
import { modelsDevFields } from "../../ai/providers/models-dev.js";
|
|
17
16
|
import { PROVIDER_ID_PATTERN, setAuthKey } from "../../config/auth-file.js";
|
|
@@ -19,6 +18,7 @@ import { loadConfigFile } from "../../config/load.js";
|
|
|
19
18
|
import { CONFIG_FILE_VERSION } from "../../config/types.js";
|
|
20
19
|
import { writeConfigFile } from "../../config/write.js";
|
|
21
20
|
import { parseSubArgs, UsageError } from "../args.js";
|
|
21
|
+
import { confirmContinue } from "../choice-prompt.js";
|
|
22
22
|
import { pickByPrice } from "../default-model.js";
|
|
23
23
|
import { ExitCode } from "../exit-codes.js";
|
|
24
24
|
import { extractKey } from "./auth.js";
|
|
@@ -28,19 +28,12 @@ import { DISCOVER_TIMEOUT_MS } from "./models-discover.js";
|
|
|
28
28
|
import { describeProbePlan, parseProbeTuning } from "./probe-runner.js";
|
|
29
29
|
import { probeChannels } from "./providers-probe.js";
|
|
30
30
|
import { DEFAULT_PREFER, capRequests, defaultChannels, hintedChannels, listingTarget, mergeProvider, orderChannels, parseChannelSpec, parseModelList, probeSelection, renderTable, } from "./providers-plan.js";
|
|
31
|
+
import { msg } from "../../i18n/index.js";
|
|
31
32
|
export const DEFAULT_MAX_REQUESTS = 60;
|
|
32
33
|
export const DEFAULT_LIMIT = 30;
|
|
33
|
-
export
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
[--max-requests N] [--concurrency N] [--probe-timeout ms]
|
|
37
|
-
[--prefer chat,responses,messages] [--include-no-tools] [--yes]
|
|
38
|
-
ama providers list
|
|
39
|
-
ama providers channels <id>
|
|
40
|
-
ama providers remove <id>
|
|
41
|
-
ama providers refresh <id> [--probe] [--limit N] [--probe-models a,b,…] [--max-requests N]
|
|
42
|
-
[--concurrency N] [--probe-timeout ms] [--yes]
|
|
43
|
-
`;
|
|
34
|
+
export function providersUsage() {
|
|
35
|
+
return msg().subcommands.providers.usage;
|
|
36
|
+
}
|
|
44
37
|
const VALUE_OPTIONS = [
|
|
45
38
|
"base-url",
|
|
46
39
|
"api",
|
|
@@ -62,7 +55,7 @@ function intValue(ctx, name, fallback) {
|
|
|
62
55
|
return fallback;
|
|
63
56
|
const n = Number(raw);
|
|
64
57
|
if (!Number.isInteger(n) || n < 1)
|
|
65
|
-
throw new UsageError(
|
|
58
|
+
throw new UsageError(msg().subcommands.providers.positiveInt(name, raw));
|
|
66
59
|
return n;
|
|
67
60
|
}
|
|
68
61
|
function list(raw) {
|
|
@@ -76,20 +69,14 @@ export function userConfig(level) {
|
|
|
76
69
|
}
|
|
77
70
|
async function confirm(io, question) {
|
|
78
71
|
io.stderr(question);
|
|
79
|
-
|
|
80
|
-
try {
|
|
81
|
-
return /^y(es)?$/i.test((await rl.question("继续?[y/N] ")).trim());
|
|
82
|
-
}
|
|
83
|
-
finally {
|
|
84
|
-
rl.close();
|
|
85
|
-
}
|
|
72
|
+
return confirmContinue({ env: io.env });
|
|
86
73
|
}
|
|
87
74
|
/** --yes / TTY 确认;非 TTY 且没有 --yes 返回 false 并提示(调用方退出 2)。 */
|
|
88
75
|
async function approved(ctx, what) {
|
|
89
76
|
if (ctx.flags.has("yes"))
|
|
90
77
|
return true;
|
|
91
78
|
if (!ctx.io.stdinIsTTY) {
|
|
92
|
-
ctx.io.stderr(
|
|
79
|
+
ctx.io.stderr(msg().subcommands.providers.needsYes(what));
|
|
93
80
|
return "usage";
|
|
94
81
|
}
|
|
95
82
|
return confirm(ctx.io, `${what}\n`);
|
|
@@ -144,10 +131,8 @@ async function plan(ctx, input) {
|
|
|
144
131
|
const max = intValue(ctx, "max-requests", DEFAULT_MAX_REQUESTS);
|
|
145
132
|
const capped = capRequests(selected, tryChannels, max);
|
|
146
133
|
const tuning = parseProbeTuning(ctx.values);
|
|
147
|
-
io.stdout(
|
|
148
|
-
|
|
149
|
-
`${describeProbePlan(capped.requests, tuning.concurrency, tuning.timeoutMs)}\n`);
|
|
150
|
-
const ok = await approved(ctx, `将发 ${capped.requests} 次计费请求并写入 ${ctx.level.userConfigPath}`);
|
|
134
|
+
io.stdout(msg().subcommands.providers.probePlan(capped.ids.length, capped.requests, max, capped.dropped) + `${describeProbePlan(capped.requests, tuning.concurrency, tuning.timeoutMs)}\n`);
|
|
135
|
+
const ok = await approved(ctx, msg().subcommands.providers.confirmProbe(capped.requests, ctx.level.userConfigPath));
|
|
151
136
|
if (ok === "usage")
|
|
152
137
|
return { plans: [], cancelled: ExitCode.Usage };
|
|
153
138
|
if (!ok)
|
|
@@ -203,10 +188,10 @@ async function obtainKey(ctx, id, registry) {
|
|
|
203
188
|
const keyEnv = ctx.values.get("key-env");
|
|
204
189
|
if (keyEnv !== undefined) {
|
|
205
190
|
if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(keyEnv))
|
|
206
|
-
throw new UsageError(
|
|
191
|
+
throw new UsageError(msg().subcommands.providers.invalidKeyEnv(keyEnv));
|
|
207
192
|
const value = ctx.io.env[keyEnv]?.trim();
|
|
208
193
|
if (!value)
|
|
209
|
-
ctx.io.stderr(
|
|
194
|
+
ctx.io.stderr(msg().subcommands.providers.keyEnvUnset(keyEnv));
|
|
210
195
|
return { apiKey: value || undefined, configValue: `$${keyEnv}` };
|
|
211
196
|
}
|
|
212
197
|
if (registry.get(id) !== undefined) {
|
|
@@ -215,22 +200,23 @@ async function obtainKey(ctx, id, registry) {
|
|
|
215
200
|
return { apiKey: existing.apiKey };
|
|
216
201
|
}
|
|
217
202
|
if (ctx.io.stdinIsTTY)
|
|
218
|
-
ctx.io.stderr(
|
|
203
|
+
ctx.io.stderr(msg().subcommands.providers.keyPrompt(id));
|
|
219
204
|
const key = extractKey(await ctx.io.readStdin());
|
|
220
205
|
if (ctx.io.stdinIsTTY)
|
|
221
206
|
ctx.io.stderr("\n");
|
|
222
207
|
if (key === "")
|
|
223
|
-
throw new UsageError(
|
|
208
|
+
throw new UsageError(msg().subcommands.providers.noKeyOnStdin);
|
|
224
209
|
return { apiKey: key, store: key };
|
|
225
210
|
}
|
|
226
211
|
async function add(ctx, id, refresh) {
|
|
227
212
|
const { io, level } = ctx;
|
|
213
|
+
const m = msg().subcommands.providers;
|
|
228
214
|
if (!PROVIDER_ID_PATTERN.test(id) || id.includes("@"))
|
|
229
|
-
throw new UsageError(
|
|
215
|
+
throw new UsageError(m.invalidId(id));
|
|
230
216
|
const config = userConfig(level);
|
|
231
217
|
const existing = config.providers?.[id];
|
|
232
218
|
if (refresh && existing === undefined) {
|
|
233
|
-
io.stderr(
|
|
219
|
+
io.stderr(m.missingInConfig(level.userConfigPath, id));
|
|
234
220
|
return ExitCode.Usage;
|
|
235
221
|
}
|
|
236
222
|
const registry = await buildRegistry(level, io, ctx.deps);
|
|
@@ -242,28 +228,28 @@ async function add(ctx, id, refresh) {
|
|
|
242
228
|
else {
|
|
243
229
|
const baseUrl = ctx.values.get("base-url");
|
|
244
230
|
if (baseUrl === undefined)
|
|
245
|
-
throw new UsageError(
|
|
231
|
+
throw new UsageError(m.needsBaseUrl);
|
|
246
232
|
if (!/^https?:\/\//.test(baseUrl))
|
|
247
|
-
throw new UsageError(
|
|
233
|
+
throw new UsageError(m.baseUrlNotHttp(baseUrl));
|
|
248
234
|
candidates = defaultChannels(baseUrl, ctx.values.get("api"));
|
|
249
235
|
}
|
|
250
236
|
const target = listingTarget(candidates);
|
|
251
237
|
if (target === undefined)
|
|
252
|
-
throw new UsageError(
|
|
238
|
+
throw new UsageError(m.noChannel(id));
|
|
253
239
|
const key = await obtainKey(ctx, id, registry);
|
|
254
240
|
let listed;
|
|
255
241
|
try {
|
|
256
242
|
listed = await fetchModelList(target, key.apiKey);
|
|
257
243
|
}
|
|
258
244
|
catch (error) {
|
|
259
|
-
io.stderr(
|
|
245
|
+
io.stderr(m.listFailed(id, error.message));
|
|
260
246
|
return ExitCode.RuntimeError;
|
|
261
247
|
}
|
|
262
|
-
io.stdout(
|
|
248
|
+
io.stdout(m.discovered(id, listed.length, target.url));
|
|
263
249
|
// models.dev 只读本地(快照 ⊕ `ama models refresh` 的覆盖),不联网。
|
|
264
250
|
const mdIndex = loadModelsDevIndex(level.dataDir);
|
|
265
251
|
io.stdout(`${describeModelsDev(level.dataDir)}\n`);
|
|
266
|
-
io.stdout(
|
|
252
|
+
io.stdout(m.candidates(candidates));
|
|
267
253
|
const existingIds = new Set((existing?.models ?? []).map((m) => m.id));
|
|
268
254
|
const result = await plan(ctx, {
|
|
269
255
|
id,
|
|
@@ -281,7 +267,7 @@ async function add(ctx, id, refresh) {
|
|
|
281
267
|
if (refresh) {
|
|
282
268
|
const gone = [...existingIds].filter((m) => !listed.some((l) => l.id === m));
|
|
283
269
|
if (gone.length > 0)
|
|
284
|
-
io.stdout(
|
|
270
|
+
io.stdout(m.goneUpstream(gone));
|
|
285
271
|
}
|
|
286
272
|
const writable = result.plans.filter((p) => p.status === "ok" || p.status === "unprobed");
|
|
287
273
|
const legacy = existing !== undefined && existing.channels === undefined;
|
|
@@ -296,7 +282,6 @@ async function add(ctx, id, refresh) {
|
|
|
296
282
|
models: writable,
|
|
297
283
|
prefer: list(ctx.values.get("prefer")) ?? [...DEFAULT_PREFER],
|
|
298
284
|
});
|
|
299
|
-
const keyNote = key.store !== undefined ? `;key → ${level.authFile}(0600)` : "";
|
|
300
285
|
// 还没有缺省模型时按价格规则挑一个写进 defaultModel(default-model.ts 的 pickByPrice);
|
|
301
286
|
// 探测过时只在探测通过的模型里挑
|
|
302
287
|
const verified = writable.filter((p) => p.status === "ok");
|
|
@@ -308,26 +293,30 @@ async function add(ctx, id, refresh) {
|
|
|
308
293
|
toolCall: p.fields.toolCall,
|
|
309
294
|
})))
|
|
310
295
|
: undefined;
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
296
|
+
io.stdout(m.writeSummary({
|
|
297
|
+
path: level.userConfigPath,
|
|
298
|
+
id,
|
|
299
|
+
channels: merged.addedChannels,
|
|
300
|
+
models: merged.addedModels.length,
|
|
301
|
+
authFile: key.store !== undefined ? level.authFile : undefined,
|
|
302
|
+
defaultModel: defaultPick !== undefined ? `${id}/${defaultPick.id}` : undefined,
|
|
303
|
+
}));
|
|
315
304
|
if (defaultPick !== undefined)
|
|
316
|
-
io.stdout(
|
|
305
|
+
io.stdout(m.defaultPick(defaultPick.id, defaultPick.reason));
|
|
317
306
|
else if (level.merged.config.defaultModel === undefined && writable.length > 0)
|
|
318
|
-
io.stdout(
|
|
307
|
+
io.stdout(m.noDefaultPick);
|
|
319
308
|
if (merged.addedModels.length === 0 &&
|
|
320
309
|
merged.addedChannels.length === 0 &&
|
|
321
310
|
key.store === undefined) {
|
|
322
|
-
io.stdout(
|
|
311
|
+
io.stdout(m.nothingToWrite);
|
|
323
312
|
return result.stopped !== undefined ? ExitCode.RuntimeError : ExitCode.Ok;
|
|
324
313
|
}
|
|
325
314
|
if (!ctx.flags.has("probe")) {
|
|
326
|
-
const ok = await approved(ctx,
|
|
315
|
+
const ok = await approved(ctx, m.confirmWrite);
|
|
327
316
|
if (ok === "usage")
|
|
328
317
|
return ExitCode.Usage;
|
|
329
318
|
if (!ok) {
|
|
330
|
-
io.stderr(
|
|
319
|
+
io.stderr(msg().subcommands.common.cancelled);
|
|
331
320
|
return ExitCode.Ok;
|
|
332
321
|
}
|
|
333
322
|
}
|
|
@@ -339,14 +328,14 @@ async function add(ctx, id, refresh) {
|
|
|
339
328
|
writeConfigFile(level.userConfigPath, config, { backup: true });
|
|
340
329
|
if (key.store !== undefined)
|
|
341
330
|
setAuthKey(level.authFile, id, key.store);
|
|
342
|
-
io.stdout(
|
|
331
|
+
io.stdout(m.written(level.userConfigPath, backup));
|
|
343
332
|
const sample = defaultPick?.id ??
|
|
344
333
|
result.plans.find((p) => p.status === "ok" && merged.addedModels.includes(p.id))?.id ??
|
|
345
334
|
merged.addedModels[0];
|
|
346
335
|
if (sample !== undefined)
|
|
347
|
-
io.stdout(
|
|
336
|
+
io.stdout(m.tryIt(`${id}/${sample}`));
|
|
348
337
|
if (result.stopped !== undefined) {
|
|
349
|
-
io.stderr(
|
|
338
|
+
io.stderr(m.probeStopped(result.stopped));
|
|
350
339
|
return ExitCode.RuntimeError;
|
|
351
340
|
}
|
|
352
341
|
return ExitCode.Ok;
|
|
@@ -381,7 +370,7 @@ function takeChannels(argv) {
|
|
|
381
370
|
if (token === "--channel") {
|
|
382
371
|
const value = argv[++i];
|
|
383
372
|
if (value === undefined || value === "")
|
|
384
|
-
throw new UsageError(
|
|
373
|
+
throw new UsageError(msg().subcommands.providers.channelNeedsValue);
|
|
385
374
|
specs.push(value);
|
|
386
375
|
}
|
|
387
376
|
else if (token.startsWith("--channel="))
|
|
@@ -396,11 +385,11 @@ export async function runProviders(argv, io, deps) {
|
|
|
396
385
|
const { positionals, values, flags } = parseSubArgs(rest, VALUE_OPTIONS, FLAG_OPTIONS);
|
|
397
386
|
const action = positionals[0];
|
|
398
387
|
if (flags.has("help") || action === undefined) {
|
|
399
|
-
io.stdout(
|
|
388
|
+
io.stdout(providersUsage());
|
|
400
389
|
return flags.has("help") ? ExitCode.Ok : ExitCode.Usage;
|
|
401
390
|
}
|
|
402
391
|
if (deps === undefined) {
|
|
403
|
-
io.stderr("
|
|
392
|
+
io.stderr(msg().subcommands.common.notAssembled("providers"));
|
|
404
393
|
return ExitCode.RuntimeError;
|
|
405
394
|
}
|
|
406
395
|
const level = loadUserLevel(io, {
|
|
@@ -408,14 +397,14 @@ export async function runProviders(argv, io, deps) {
|
|
|
408
397
|
authFile: values.get("auth-file"),
|
|
409
398
|
});
|
|
410
399
|
for (const warning of level.warnings)
|
|
411
|
-
io.stderr(
|
|
400
|
+
io.stderr(msg().subcommands.common.warning(warning));
|
|
412
401
|
const ctx = { io, deps, level, values, flags, channelSpecs: specs };
|
|
413
402
|
const target = positionals[1];
|
|
414
403
|
const need = () => {
|
|
415
404
|
if (target === undefined)
|
|
416
|
-
throw new UsageError(`ama providers ${action}
|
|
405
|
+
throw new UsageError(msg().subcommands.common.needsArg(`ama providers ${action}`, "<id>"));
|
|
417
406
|
if (positionals.length > 2)
|
|
418
|
-
throw new UsageError(
|
|
407
|
+
throw new UsageError(msg().subcommands.common.extraArgs(positionals.slice(2).join(" ")));
|
|
419
408
|
return target;
|
|
420
409
|
};
|
|
421
410
|
switch (action) {
|
|
@@ -430,6 +419,6 @@ export async function runProviders(argv, io, deps) {
|
|
|
430
419
|
case "remove":
|
|
431
420
|
return removeProvider(ctx, need());
|
|
432
421
|
default:
|
|
433
|
-
throw new UsageError(
|
|
422
|
+
throw new UsageError(msg().subcommands.common.unknownSubcommand("providers", action));
|
|
434
423
|
}
|
|
435
424
|
}
|
|
@@ -6,5 +6,5 @@
|
|
|
6
6
|
* - 导出内容先脱敏(session/redact.ts),格式说明见 docs/sessions.md「导出」。
|
|
7
7
|
*/
|
|
8
8
|
import type { CliIo } from "../deps.js";
|
|
9
|
-
export declare
|
|
9
|
+
export declare function sessionsExportUsage(): string;
|
|
10
10
|
export declare function runSessionsExport(argv: readonly string[], io: CliIo): Promise<number>;
|
|
@@ -12,9 +12,10 @@ import { renderExport } from "../../session/export.js";
|
|
|
12
12
|
import { findSessionFileReadOnly, readSessionReadOnly } from "../../session/scan.js";
|
|
13
13
|
import { parseSubArgs, UsageError } from "../args.js";
|
|
14
14
|
import { ExitCode } from "../exit-codes.js";
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
import { msg } from "../../i18n/index.js";
|
|
16
|
+
export function sessionsExportUsage() {
|
|
17
|
+
return msg().subcommands.sessionsExport.usage;
|
|
18
|
+
}
|
|
18
19
|
const FORMATS = ["md", "json", "jsonl"];
|
|
19
20
|
const BRANCHES = ["leaf", "all"];
|
|
20
21
|
export async function runSessionsExport(argv, io) {
|
|
@@ -25,21 +26,21 @@ export async function runSessionsExport(argv, io) {
|
|
|
25
26
|
"session-dir",
|
|
26
27
|
]);
|
|
27
28
|
if (flags.has("help")) {
|
|
28
|
-
io.stdout(
|
|
29
|
+
io.stdout(sessionsExportUsage());
|
|
29
30
|
return ExitCode.Ok;
|
|
30
31
|
}
|
|
31
32
|
const [id, extra] = positionals;
|
|
32
33
|
if (id === undefined)
|
|
33
|
-
throw new UsageError("ama sessions export
|
|
34
|
+
throw new UsageError(msg().subcommands.common.needsArg("ama sessions export", "<id>"));
|
|
34
35
|
if (extra !== undefined)
|
|
35
|
-
throw new UsageError(
|
|
36
|
+
throw new UsageError(msg().subcommands.common.extraArgs(extra));
|
|
36
37
|
const format = (values.get("format") ?? "md");
|
|
37
38
|
if (!FORMATS.includes(format)) {
|
|
38
|
-
throw new UsageError(
|
|
39
|
+
throw new UsageError(msg().subcommands.common.invalidChoice("--format", FORMATS, format));
|
|
39
40
|
}
|
|
40
41
|
const branch = (values.get("branch") ?? "leaf");
|
|
41
42
|
if (!BRANCHES.includes(branch)) {
|
|
42
|
-
throw new UsageError(
|
|
43
|
+
throw new UsageError(msg().subcommands.common.invalidChoice("--branch", BRANCHES, branch));
|
|
43
44
|
}
|
|
44
45
|
const dirFlag = values.get("session-dir");
|
|
45
46
|
const root = dirFlag !== undefined
|
|
@@ -54,6 +55,6 @@ export async function runSessionsExport(argv, io) {
|
|
|
54
55
|
}
|
|
55
56
|
const target = resolve(io.cwd, expandHome(output, { env: io.env }));
|
|
56
57
|
writeFileSync(target, text, { mode: 0o600 });
|
|
57
|
-
io.stderr(
|
|
58
|
+
io.stderr(msg().subcommands.sessionsExport.exported(target));
|
|
58
59
|
return ExitCode.Ok;
|
|
59
60
|
}
|
|
@@ -8,6 +8,6 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import { type SearchHit } from "../../session/search.js";
|
|
10
10
|
import type { CliIo } from "../deps.js";
|
|
11
|
-
export declare
|
|
11
|
+
export declare function sessionsSearchUsage(): string;
|
|
12
12
|
export declare function renderHit(hit: SearchHit, color: boolean): string;
|
|
13
13
|
export declare function runSessionsSearch(argv: readonly string[], io: CliIo): Promise<number>;
|
|
@@ -13,9 +13,10 @@ import { compileQuery, searchSessions, } from "../../session/search.js";
|
|
|
13
13
|
import { parseSubArgs, UsageError } from "../args.js";
|
|
14
14
|
import { ExitCode } from "../exit-codes.js";
|
|
15
15
|
import { parseDaySpec } from "./stats.js";
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
import { msg } from "../../i18n/index.js";
|
|
17
|
+
export function sessionsSearchUsage() {
|
|
18
|
+
return msg().subcommands.sessionsSearch.usage;
|
|
19
|
+
}
|
|
19
20
|
const ROLES = ["user", "assistant", "tool"];
|
|
20
21
|
function highlight(text, ranges, color) {
|
|
21
22
|
if (!color || ranges.length === 0)
|
|
@@ -44,18 +45,18 @@ export function renderHit(hit, color) {
|
|
|
44
45
|
export async function runSessionsSearch(argv, io) {
|
|
45
46
|
const { positionals, values, flags } = parseSubArgs(argv, ["role", "since", "limit", "session-dir"], ["all", "json"]);
|
|
46
47
|
if (flags.has("help")) {
|
|
47
|
-
io.stdout(
|
|
48
|
+
io.stdout(sessionsSearchUsage());
|
|
48
49
|
return ExitCode.Ok;
|
|
49
50
|
}
|
|
50
51
|
const pattern = positionals.join(" ");
|
|
51
52
|
if (pattern.trim() === "")
|
|
52
|
-
throw new UsageError(
|
|
53
|
+
throw new UsageError(msg().subcommands.sessionsSearch.needsPattern);
|
|
53
54
|
let query;
|
|
54
55
|
try {
|
|
55
56
|
query = compileQuery(pattern);
|
|
56
57
|
}
|
|
57
58
|
catch (error) {
|
|
58
|
-
throw new UsageError(
|
|
59
|
+
throw new UsageError(msg().subcommands.sessionsSearch.invalidRegex(error.message));
|
|
59
60
|
}
|
|
60
61
|
let roles;
|
|
61
62
|
const roleRaw = values.get("role");
|
|
@@ -63,14 +64,14 @@ export async function runSessionsSearch(argv, io) {
|
|
|
63
64
|
roles = new Set();
|
|
64
65
|
for (const role of roleRaw.split(",").map((r) => r.trim())) {
|
|
65
66
|
if (!ROLES.includes(role)) {
|
|
66
|
-
throw new UsageError(
|
|
67
|
+
throw new UsageError(msg().subcommands.common.invalidChoice("--role", ROLES, role));
|
|
67
68
|
}
|
|
68
69
|
roles.add(role);
|
|
69
70
|
}
|
|
70
71
|
}
|
|
71
72
|
const limit = Number(values.get("limit") ?? "20");
|
|
72
73
|
if (!Number.isInteger(limit) || limit < 1)
|
|
73
|
-
throw new UsageError(
|
|
74
|
+
throw new UsageError(msg().subcommands.sessionsSearch.limitPositive);
|
|
74
75
|
const sinceRaw = values.get("since");
|
|
75
76
|
const sinceIso = sinceRaw === undefined
|
|
76
77
|
? undefined
|
|
@@ -91,13 +92,13 @@ export async function runSessionsSearch(argv, io) {
|
|
|
91
92
|
return ExitCode.Ok;
|
|
92
93
|
}
|
|
93
94
|
if (hits.length === 0) {
|
|
94
|
-
io.stdout(flags.has("all")
|
|
95
|
+
io.stdout(msg().subcommands.sessionsSearch.noHits(flags.has("all")));
|
|
95
96
|
return ExitCode.Ok;
|
|
96
97
|
}
|
|
97
98
|
const color = io.stdoutIsTTY && (io.env["NO_COLOR"] ?? "") === "";
|
|
98
99
|
for (const hit of hits)
|
|
99
100
|
io.stdout(renderHit(hit, color));
|
|
100
101
|
if (truncated)
|
|
101
|
-
io.stdout(
|
|
102
|
+
io.stdout(msg().subcommands.sessionsSearch.truncated(limit));
|
|
102
103
|
return ExitCode.Ok;
|
|
103
104
|
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ama sessions trace <id|文件>`:会话轨迹导出(docs/wave6-plan.md §2.5、D7)。[W6-T2]
|
|
3
|
+
*
|
|
4
|
+
* - 缺省 / `--html [文件]` / `--format html`:自包含 HTML(`trace/html.ts`);`--json` / `--format json`:与 RPC
|
|
5
|
+
* `get_trace` 同形的 JSON(全部回合、已加载子会话、`previews` 只含本会话节点;`--no-content` 时没有)。
|
|
6
|
+
* - 输出:`--html <文件>` 或 `--output <文件>` 写文件(0600),否则 stdout;`--open` 写好后用系统浏览器打开
|
|
7
|
+
* (没给文件时写到临时目录)。
|
|
8
|
+
* - `--branch leaf|all`、`--no-content`(只留结构与数字)、`--children`(HTML 内嵌子会话预览)、
|
|
9
|
+
* `--now <ms>`(生成时间,确定性)。
|
|
10
|
+
* - 只读:不加锁、不改会话文件(推算出的时间不写回);子会话缺失只标 childMissing。
|
|
11
|
+
*/
|
|
12
|
+
import { type TraceInput } from "../../trace/build.js";
|
|
13
|
+
import type { CliIo } from "../deps.js";
|
|
14
|
+
export declare function sessionsTraceUsage(): string;
|
|
15
|
+
export interface SessionsTraceDeps {
|
|
16
|
+
/** 打开浏览器(测试替身;缺省 detached spawn)。 */
|
|
17
|
+
open?: (command: OpenCommand) => Promise<void>;
|
|
18
|
+
/** 生成时间(缺省 `Date.now()`;`--now` 优先)。 */
|
|
19
|
+
now?: () => number;
|
|
20
|
+
platform?: NodeJS.Platform;
|
|
21
|
+
/** 读子会话(测试替身)。 */
|
|
22
|
+
readChild?: (file: string) => TraceInput | undefined;
|
|
23
|
+
}
|
|
24
|
+
export interface OpenCommand {
|
|
25
|
+
command: string;
|
|
26
|
+
args: string[];
|
|
27
|
+
}
|
|
28
|
+
/** 各平台「用缺省程序打开文件」的命令。 */
|
|
29
|
+
export declare function openCommand(platform: NodeJS.Platform, file: string): OpenCommand;
|
|
30
|
+
export declare function runSessionsTrace(argv: readonly string[], io: CliIo, deps?: SessionsTraceDeps): Promise<number>;
|