@armadra/agent 0.5.1 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +203 -304
- package/CHANGELOG.zh-CN.md +462 -0
- package/README.md +408 -364
- package/README.zh-CN.md +705 -0
- package/dist/agent/session-plan.js +2 -2
- package/dist/agent/session-state.d.ts +3 -0
- package/dist/agent/session-state.js +20 -0
- package/dist/agent/session-subagent.d.ts +15 -1
- package/dist/agent/session-subagent.js +26 -3
- package/dist/agent/session-telemetry.d.ts +16 -2
- package/dist/agent/session-telemetry.js +29 -7
- package/dist/agent/session-tools.js +5 -2
- package/dist/agent/session-trace-writer.d.ts +27 -0
- package/dist/agent/session-trace-writer.js +253 -0
- package/dist/agent/session.d.ts +2 -0
- package/dist/agent/session.js +12 -0
- package/dist/agent/subagent-direct.d.ts +20 -0
- package/dist/agent/subagent-direct.js +76 -0
- package/dist/agent/subagent-registry.d.ts +8 -1
- package/dist/agent/subagent-registry.js +28 -1
- package/dist/agent/system-prompt.d.ts +3 -1
- package/dist/agent/system-prompt.js +3 -0
- package/dist/agent/tool-runner.d.ts +2 -1
- package/dist/agent/tool-runner.js +5 -4
- package/dist/agent/types-w6.d.ts +39 -0
- package/dist/agent/types-w6.js +4 -0
- package/dist/agent/types.d.ts +5 -2
- package/dist/agents/external.js +1 -1
- package/dist/agents/task-record.d.ts +74 -1
- package/dist/agents/task-record.js +100 -0
- package/dist/ai/apis/cache-params.js +2 -1
- package/dist/ai/apis/chatgpt-backend.d.ts +52 -0
- package/dist/ai/apis/chatgpt-backend.js +224 -0
- package/dist/ai/apis/chatgpt-rate-limits.d.ts +26 -0
- package/dist/ai/apis/chatgpt-rate-limits.js +91 -0
- package/dist/ai/apis/openai-responses-request.d.ts +2 -1
- package/dist/ai/apis/openai-responses-request.js +8 -2
- package/dist/ai/apis/openai-responses.d.ts +2 -0
- package/dist/ai/apis/openai-responses.js +51 -16
- package/dist/ai/overflow.d.ts +1 -1
- package/dist/ai/overflow.js +10 -7
- package/dist/ai/providers/auth.d.ts +15 -2
- package/dist/ai/providers/auth.js +69 -2
- package/dist/ai/providers/builtin.js +27 -0
- package/dist/ai/providers/catalog-data.js +1 -0
- package/dist/ai/providers/discovered-cache.d.ts +48 -0
- package/dist/ai/providers/discovered-cache.js +102 -0
- package/dist/ai/providers/enrich.js +2 -7
- package/dist/ai/providers/model-visibility.d.ts +33 -0
- package/dist/ai/providers/model-visibility.js +70 -0
- package/dist/ai/providers/models-dev-cache.js +15 -19
- package/dist/ai/providers/models-dev-snapshot.js +8 -7
- package/dist/ai/providers/models-dev.js +5 -15
- package/dist/ai/providers/registry.d.ts +2 -0
- package/dist/ai/providers/registry.js +6 -1
- package/dist/ai/providers/suggest.js +2 -16
- package/dist/ai/types.d.ts +27 -1
- package/dist/auth/chatgpt/backend-client.d.ts +26 -0
- package/dist/auth/chatgpt/backend-client.js +74 -0
- package/dist/auth/chatgpt/claims.d.ts +17 -0
- package/dist/auth/chatgpt/claims.js +46 -0
- package/dist/auth/chatgpt/cli.d.ts +35 -0
- package/dist/auth/chatgpt/cli.js +279 -0
- package/dist/auth/chatgpt/doctor.d.ts +17 -0
- package/dist/auth/chatgpt/doctor.js +36 -0
- package/dist/auth/chatgpt/host-id.d.ts +7 -0
- package/dist/auth/chatgpt/host-id.js +26 -0
- package/dist/auth/chatgpt/login.d.ts +30 -0
- package/dist/auth/chatgpt/login.js +130 -0
- package/dist/auth/chatgpt/presets.d.ts +66 -0
- package/dist/auth/chatgpt/presets.js +120 -0
- package/dist/auth/chatgpt/quota-text.d.ts +13 -0
- package/dist/auth/chatgpt/quota-text.js +36 -0
- package/dist/auth/oauth/browser.d.ts +12 -0
- package/dist/auth/oauth/browser.js +27 -0
- package/dist/auth/oauth/callback-server.d.ts +47 -0
- package/dist/auth/oauth/callback-server.js +147 -0
- package/dist/auth/oauth/flows.d.ts +62 -0
- package/dist/auth/oauth/flows.js +113 -0
- package/dist/auth/oauth/jwt.d.ts +24 -0
- package/dist/auth/oauth/jwt.js +81 -0
- package/dist/auth/oauth/live.d.ts +21 -0
- package/dist/auth/oauth/live.js +25 -0
- package/dist/auth/oauth/oidc.d.ts +26 -0
- package/dist/auth/oauth/oidc.js +72 -0
- package/dist/auth/oauth/pkce.d.ts +15 -0
- package/dist/auth/oauth/pkce.js +20 -0
- package/dist/auth/oauth/refresh.d.ts +35 -0
- package/dist/auth/oauth/refresh.js +129 -0
- package/dist/auth/oauth/token-client.d.ts +33 -0
- package/dist/auth/oauth/token-client.js +121 -0
- package/dist/auth/oauth/token-store.d.ts +23 -0
- package/dist/auth/oauth/token-store.js +125 -0
- package/dist/auth/testing/fake-oauth.d.ts +73 -0
- package/dist/auth/testing/fake-oauth.js +271 -0
- package/dist/auth/testing/refresh-child.d.ts +5 -0
- package/dist/auth/testing/refresh-child.js +16 -0
- package/dist/bundle/ama.cjs +26532 -11045
- package/dist/checkpoints/backend.js +6 -5
- package/dist/checkpoints/restore.js +3 -2
- package/dist/checkpoints/settings.js +2 -1
- package/dist/checkpoints/shadow-git.js +7 -6
- package/dist/checkpoints/shadow-restore.js +3 -2
- package/dist/checkpoints/tracker.js +4 -3
- package/dist/cli/args.d.ts +9 -2
- package/dist/cli/args.js +74 -27
- package/dist/cli/bootstrap.js +53 -31
- package/dist/cli/choice-prompt.js +8 -6
- package/dist/cli/codemode-notice.js +2 -2
- package/dist/cli/compose-agents.js +2 -1
- package/dist/cli/compose-extensions.js +2 -0
- package/dist/cli/compose-memory.d.ts +53 -0
- package/dist/cli/compose-memory.js +127 -0
- package/dist/cli/compose-providers.d.ts +6 -0
- package/dist/cli/compose-providers.js +38 -2
- package/dist/cli/compose-session.d.ts +5 -0
- package/dist/cli/compose-session.js +27 -13
- package/dist/cli/compose-store.d.ts +2 -0
- package/dist/cli/compose-store.js +9 -5
- package/dist/cli/compose.d.ts +2 -0
- package/dist/cli/compose.js +13 -5
- package/dist/cli/default-model.d.ts +0 -2
- package/dist/cli/default-model.js +5 -8
- package/dist/cli/deps.d.ts +5 -1
- package/dist/cli/exit-codes.d.ts +1 -1
- package/dist/cli/exit-codes.js +7 -16
- package/dist/cli/from-prompt.js +3 -2
- package/dist/cli/help-text.d.ts +2 -1
- package/dist/cli/help-text.js +5 -99
- package/dist/cli/main.d.ts +5 -0
- package/dist/cli/main.js +21 -2
- package/dist/cli/proxy.js +14 -9
- package/dist/cli/runtime.d.ts +5 -0
- package/dist/cli/startup-screen.js +20 -27
- package/dist/cli/startup-steps.js +6 -8
- package/dist/cli/subcommands/auth.d.ts +6 -3
- package/dist/cli/subcommands/auth.js +52 -22
- package/dist/cli/subcommands/config-set.d.ts +21 -0
- package/dist/cli/subcommands/config-set.js +145 -0
- package/dist/cli/subcommands/config.d.ts +2 -1
- package/dist/cli/subcommands/config.js +51 -37
- package/dist/cli/subcommands/doctor.d.ts +2 -1
- package/dist/cli/subcommands/doctor.js +97 -58
- package/dist/cli/subcommands/init.d.ts +1 -1
- package/dist/cli/subcommands/init.js +8 -7
- package/dist/cli/subcommands/memory.d.ts +18 -0
- package/dist/cli/subcommands/memory.js +189 -0
- package/dist/cli/subcommands/model-meta.js +11 -9
- package/dist/cli/subcommands/models-cache-probe.js +23 -20
- package/dist/cli/subcommands/models-discover.d.ts +4 -0
- package/dist/cli/subcommands/models-discover.js +60 -21
- package/dist/cli/subcommands/models-enable.d.ts +13 -0
- package/dist/cli/subcommands/models-enable.js +145 -0
- package/dist/cli/subcommands/models.d.ts +3 -1
- package/dist/cli/subcommands/models.js +39 -24
- package/dist/cli/subcommands/probe-runner.js +8 -7
- package/dist/cli/subcommands/providers-list.js +32 -21
- package/dist/cli/subcommands/providers-plan.js +24 -25
- package/dist/cli/subcommands/providers-probe.js +5 -6
- package/dist/cli/subcommands/providers.d.ts +1 -1
- package/dist/cli/subcommands/providers.js +45 -50
- package/dist/cli/subcommands/sessions-export.d.ts +1 -1
- package/dist/cli/subcommands/sessions-export.js +10 -9
- package/dist/cli/subcommands/sessions-search.d.ts +1 -1
- package/dist/cli/subcommands/sessions-search.js +11 -10
- package/dist/cli/subcommands/sessions-trace.d.ts +30 -0
- package/dist/cli/subcommands/sessions-trace.js +156 -0
- package/dist/cli/subcommands/sessions.d.ts +4 -3
- package/dist/cli/subcommands/sessions.js +40 -37
- package/dist/cli/subcommands/stats.d.ts +1 -1
- package/dist/cli/subcommands/stats.js +49 -30
- package/dist/cli/system-prompt-arg.js +3 -2
- package/dist/codemode/capability.js +3 -2
- package/dist/compaction/post-compact.d.ts +1 -0
- package/dist/compaction/post-compact.js +15 -1
- package/dist/compaction/prune-tier.d.ts +1 -1
- package/dist/compaction/prune-tier.js +3 -3
- package/dist/compaction/serialize.js +2 -1
- package/dist/config/auth-file.d.ts +12 -2
- package/dist/config/auth-file.js +32 -10
- package/dist/config/checker.js +12 -11
- package/dist/config/context-files.js +3 -2
- package/dist/config/edit.d.ts +106 -0
- package/dist/config/edit.js +350 -0
- package/dist/config/init.d.ts +4 -3
- package/dist/config/init.js +10 -18
- package/dist/config/json-schema.d.ts +2 -1
- package/dist/config/json-schema.js +102 -69
- package/dist/config/key-docs.d.ts +18 -7
- package/dist/config/key-docs.js +43 -128
- package/dist/config/load.js +7 -6
- package/dist/config/merge.d.ts +4 -1
- package/dist/config/merge.js +42 -22
- package/dist/config/paths.js +6 -5
- package/dist/config/profile.d.ts +5 -1
- package/dist/config/profile.js +7 -2
- package/dist/config/schema-w5.js +12 -4
- package/dist/config/schema-w6.d.ts +19 -0
- package/dist/config/schema-w6.js +115 -0
- package/dist/config/schema.js +34 -20
- package/dist/config/settings-registry.d.ts +81 -0
- package/dist/config/settings-registry.js +185 -0
- package/dist/config/types-w5.d.ts +7 -0
- package/dist/config/types-w5.js +2 -0
- package/dist/config/types-w6.d.ts +109 -0
- package/dist/config/types-w6.js +19 -0
- package/dist/config/types.d.ts +11 -8
- package/dist/config/types.js +1 -0
- package/dist/drivers/acp/client.js +1 -1
- package/dist/drivers/acp/driver.js +13 -8
- package/dist/drivers/agents.js +4 -3
- package/dist/drivers/base.js +3 -2
- package/dist/drivers/host-runners.js +2 -1
- package/dist/drivers/native/claude-stream.js +12 -11
- package/dist/drivers/native/codex-app-server.js +17 -12
- package/dist/drivers/native/oneshot.js +8 -7
- package/dist/drivers/pool.js +1 -1
- package/dist/drivers/runner.d.ts +3 -1
- package/dist/drivers/runner.js +68 -20
- package/dist/drivers/turn.js +1 -1
- package/dist/hooks/config.js +3 -2
- package/dist/hooks/protocol.js +18 -12
- package/dist/host/api-impl.js +11 -10
- package/dist/host/loader.js +9 -8
- package/dist/host/types.d.ts +3 -0
- package/dist/i18n/catalog.d.ts +2209 -0
- package/dist/i18n/catalog.js +72 -0
- package/dist/i18n/format.d.ts +21 -0
- package/dist/i18n/format.js +58 -0
- package/dist/i18n/index.d.ts +58 -0
- package/dist/i18n/index.js +72 -0
- package/dist/i18n/messages/agents.d.ts +84 -0
- package/dist/i18n/messages/agents.js +85 -0
- package/dist/i18n/messages/approval.d.ts +99 -0
- package/dist/i18n/messages/approval.js +100 -0
- package/dist/i18n/messages/auth.d.ts +189 -0
- package/dist/i18n/messages/auth.js +201 -0
- package/dist/i18n/messages/cli-args.d.ts +46 -0
- package/dist/i18n/messages/cli-args.js +46 -0
- package/dist/i18n/messages/cli-help.d.ts +12 -0
- package/dist/i18n/messages/cli-help.js +248 -0
- package/dist/i18n/messages/cli.d.ts +336 -0
- package/dist/i18n/messages/cli.js +311 -0
- package/dist/i18n/messages/config-keys.d.ts +293 -0
- package/dist/i18n/messages/config-keys.js +296 -0
- package/dist/i18n/messages/config.d.ts +508 -0
- package/dist/i18n/messages/config.js +241 -0
- package/dist/i18n/messages/drivers.d.ts +123 -0
- package/dist/i18n/messages/drivers.js +124 -0
- package/dist/i18n/messages/errors.d.ts +83 -0
- package/dist/i18n/messages/errors.js +171 -0
- package/dist/i18n/messages/interactive-line.d.ts +61 -0
- package/dist/i18n/messages/interactive-line.js +69 -0
- package/dist/i18n/messages/interactive-startup.d.ts +99 -0
- package/dist/i18n/messages/interactive-startup.js +100 -0
- package/dist/i18n/messages/interactive-view.d.ts +140 -0
- package/dist/i18n/messages/interactive-view.js +141 -0
- package/dist/i18n/messages/interactive.d.ts +489 -0
- package/dist/i18n/messages/interactive.js +248 -0
- package/dist/i18n/messages/memory.d.ts +123 -0
- package/dist/i18n/messages/memory.js +128 -0
- package/dist/i18n/messages/panels.d.ts +233 -0
- package/dist/i18n/messages/panels.js +232 -0
- package/dist/i18n/messages/permissions.d.ts +126 -0
- package/dist/i18n/messages/permissions.js +151 -0
- package/dist/i18n/messages/plan.d.ts +123 -0
- package/dist/i18n/messages/plan.js +124 -0
- package/dist/i18n/messages/print.d.ts +86 -0
- package/dist/i18n/messages/print.js +91 -0
- package/dist/i18n/messages/report.d.ts +391 -0
- package/dist/i18n/messages/report.js +490 -0
- package/dist/i18n/messages/rewind.d.ts +198 -0
- package/dist/i18n/messages/rewind.js +217 -0
- package/dist/i18n/messages/session.d.ts +230 -0
- package/dist/i18n/messages/session.js +258 -0
- package/dist/i18n/messages/settings.d.ts +355 -0
- package/dist/i18n/messages/settings.js +343 -0
- package/dist/i18n/messages/subcommands-config.d.ts +113 -0
- package/dist/i18n/messages/subcommands-config.js +129 -0
- package/dist/i18n/messages/subcommands-models.d.ts +34 -0
- package/dist/i18n/messages/subcommands-models.js +34 -0
- package/dist/i18n/messages/subcommands.d.ts +576 -0
- package/dist/i18n/messages/subcommands.js +477 -0
- package/dist/i18n/messages/trace.d.ts +243 -0
- package/dist/i18n/messages/trace.js +238 -0
- package/dist/i18n/types.d.ts +15 -0
- package/dist/i18n/types.js +7 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +2 -0
- package/dist/memory/edit.d.ts +24 -0
- package/dist/memory/edit.js +63 -0
- package/dist/memory/frontmatter.d.ts +37 -0
- package/dist/memory/frontmatter.js +79 -0
- package/dist/memory/index.d.ts +28 -0
- package/dist/memory/index.js +126 -0
- package/dist/memory/lock.d.ts +17 -0
- package/dist/memory/lock.js +62 -0
- package/dist/memory/paths.d.ts +57 -0
- package/dist/memory/paths.js +175 -0
- package/dist/memory/report.d.ts +36 -0
- package/dist/memory/report.js +86 -0
- package/dist/memory/runtime.d.ts +42 -0
- package/dist/memory/runtime.js +36 -0
- package/dist/memory/secrets.d.ts +8 -0
- package/dist/memory/secrets.js +27 -0
- package/dist/memory/section.d.ts +28 -0
- package/dist/memory/section.js +59 -0
- package/dist/memory/store.d.ts +70 -0
- package/dist/memory/store.js +284 -0
- package/dist/memory/tool.d.ts +31 -0
- package/dist/memory/tool.js +94 -0
- package/dist/modes/acp/acp-events.js +2 -1
- package/dist/modes/acp/acp-server.js +13 -12
- package/dist/modes/commands-core.d.ts +11 -0
- package/dist/modes/commands-core.js +93 -62
- package/dist/modes/image-input.js +20 -6
- package/dist/modes/interactive/agent-bar.d.ts +95 -0
- package/dist/modes/interactive/agent-bar.js +248 -0
- package/dist/modes/interactive/agent-panels.js +27 -26
- package/dist/modes/interactive/agent-transcript.d.ts +47 -0
- package/dist/modes/interactive/agent-transcript.js +191 -0
- package/dist/modes/interactive/agent-ui.d.ts +36 -1
- package/dist/modes/interactive/agent-ui.js +180 -14
- package/dist/modes/interactive/agent-view.d.ts +72 -0
- package/dist/modes/interactive/agent-view.js +281 -0
- package/dist/modes/interactive/approval-dialog.js +46 -34
- package/dist/modes/interactive/clipboard-paste.d.ts +2 -2
- package/dist/modes/interactive/clipboard-paste.js +9 -4
- package/dist/modes/interactive/commands.d.ts +22 -1
- package/dist/modes/interactive/commands.js +100 -49
- package/dist/modes/interactive/completion.js +2 -1
- package/dist/modes/interactive/config-panel.d.ts +70 -0
- package/dist/modes/interactive/config-panel.js +319 -0
- package/dist/modes/interactive/config-ui.d.ts +96 -0
- package/dist/modes/interactive/config-ui.js +397 -0
- package/dist/modes/interactive/confirm-dialog.js +6 -7
- package/dist/modes/interactive/event-notices.js +11 -9
- package/dist/modes/interactive/interactive-mode.d.ts +1 -1
- package/dist/modes/interactive/interactive-mode.js +21 -22
- package/dist/modes/interactive/key-dispatch.d.ts +12 -0
- package/dist/modes/interactive/key-dispatch.js +24 -9
- package/dist/modes/interactive/line/line-editor.js +2 -1
- package/dist/modes/interactive/line/line-mode.js +18 -7
- package/dist/modes/interactive/line/line-render.js +25 -24
- package/dist/modes/interactive/memory-panel.d.ts +64 -0
- package/dist/modes/interactive/memory-panel.js +221 -0
- package/dist/modes/interactive/message-view.d.ts +4 -2
- package/dist/modes/interactive/message-view.js +42 -33
- package/dist/modes/interactive/model-items.d.ts +45 -0
- package/dist/modes/interactive/model-items.js +134 -0
- package/dist/modes/interactive/model-picker.d.ts +57 -0
- package/dist/modes/interactive/model-picker.js +191 -0
- package/dist/modes/interactive/panels.js +39 -31
- package/dist/modes/interactive/pickers.d.ts +2 -1
- package/dist/modes/interactive/pickers.js +10 -6
- package/dist/modes/interactive/plan-command.d.ts +1 -1
- package/dist/modes/interactive/plan-command.js +24 -27
- package/dist/modes/interactive/plan-dialog.js +18 -17
- package/dist/modes/interactive/plan-flow.js +6 -5
- package/dist/modes/interactive/rewind-command.d.ts +1 -1
- package/dist/modes/interactive/rewind-command.js +18 -16
- package/dist/modes/interactive/rewind-flow.d.ts +0 -1
- package/dist/modes/interactive/rewind-flow.js +13 -14
- package/dist/modes/interactive/rewind-list.js +7 -6
- package/dist/modes/interactive/rewind-panel.js +40 -40
- package/dist/modes/interactive/rewind-text.d.ts +5 -3
- package/dist/modes/interactive/rewind-text.js +48 -38
- package/dist/modes/interactive/run-indicator.js +15 -12
- package/dist/modes/interactive/session-events.js +3 -2
- package/dist/modes/interactive/startup-header.js +22 -23
- package/dist/modes/interactive/startup-ui.d.ts +3 -9
- package/dist/modes/interactive/startup-ui.js +44 -88
- package/dist/modes/interactive/status-area.d.ts +2 -0
- package/dist/modes/interactive/status-area.js +8 -2
- package/dist/modes/interactive/status-bar.js +4 -3
- package/dist/modes/interactive/subagent-view.js +9 -7
- package/dist/modes/interactive/tasks-report.d.ts +6 -0
- package/dist/modes/interactive/tasks-report.js +28 -31
- package/dist/modes/interactive/terminal-setup.d.ts +9 -0
- package/dist/modes/interactive/terminal-setup.js +23 -0
- package/dist/modes/interactive/tool-summary.js +19 -17
- package/dist/modes/interactive/tool-view.js +7 -4
- package/dist/modes/interactive/trace-view.d.ts +89 -0
- package/dist/modes/interactive/trace-view.js +332 -0
- package/dist/modes/print/print-mode.js +14 -15
- package/dist/modes/rpc/commands.js +7 -3
- package/dist/modes/rpc/rpc-mode.js +9 -3
- package/dist/modes/session-report.d.ts +2 -0
- package/dist/modes/session-report.js +101 -105
- package/dist/modes/startup-ui-text.js +11 -6
- package/dist/permissions/bypass.d.ts +8 -10
- package/dist/permissions/bypass.js +19 -10
- package/dist/permissions/memory-class.d.ts +23 -0
- package/dist/permissions/memory-class.js +54 -0
- package/dist/permissions/modes.d.ts +3 -3
- package/dist/permissions/modes.js +21 -16
- package/dist/permissions/pipeline.d.ts +1 -1
- package/dist/permissions/pipeline.js +9 -2
- package/dist/permissions/preview.js +49 -42
- package/dist/permissions/rules.js +5 -2
- package/dist/permissions/types.d.ts +4 -0
- package/dist/plan/store.js +2 -1
- package/dist/rpc.d.ts +39 -1
- package/dist/rpc.js +3 -0
- package/dist/sandbox/bash.js +11 -8
- package/dist/sandbox/detect.js +14 -11
- package/dist/sdk.d.ts +17 -1
- package/dist/sdk.js +29 -7
- package/dist/session/export.js +31 -30
- package/dist/session/manager.d.ts +1 -1
- package/dist/session/manager.js +5 -3
- package/dist/session/reuse.js +5 -4
- package/dist/session/scan.js +3 -2
- package/dist/session/stats-aggregate.d.ts +3 -1
- package/dist/session/stats-aggregate.js +5 -1
- package/dist/session/stats-index.js +2 -1
- package/dist/session/stats-scan.d.ts +4 -1
- package/dist/session/stats-scan.js +6 -2
- package/dist/session/store.d.ts +11 -0
- package/dist/session/store.js +48 -1
- package/dist/session/types.d.ts +2 -0
- package/dist/skills/builtin.js +2 -1
- package/dist/tools/image-file.d.ts +26 -1
- package/dist/tools/image-file.js +55 -13
- package/dist/tools/presets.d.ts +14 -1
- package/dist/tools/presets.js +3 -3
- package/dist/tools/registry.js +1 -1
- package/dist/tools/truncate.d.ts +1 -1
- package/dist/tools/truncate.js +2 -2
- package/dist/tools/types.d.ts +17 -1
- package/dist/trace/build-index.d.ts +91 -0
- package/dist/trace/build-index.js +127 -0
- package/dist/trace/build-nodes.d.ts +24 -0
- package/dist/trace/build-nodes.js +279 -0
- package/dist/trace/build-util.d.ts +43 -0
- package/dist/trace/build-util.js +120 -0
- package/dist/trace/build.d.ts +82 -0
- package/dist/trace/build.js +382 -0
- package/dist/trace/detail.d.ts +35 -0
- package/dist/trace/detail.js +205 -0
- package/dist/trace/flatten.d.ts +69 -0
- package/dist/trace/flatten.js +173 -0
- package/dist/trace/format.d.ts +47 -0
- package/dist/trace/format.js +329 -0
- package/dist/trace/html-template.d.ts +19 -0
- package/dist/trace/html-template.js +150 -0
- package/dist/trace/html.d.ts +104 -0
- package/dist/trace/html.js +292 -0
- package/dist/trace/preview.d.ts +29 -0
- package/dist/trace/preview.js +59 -0
- package/dist/trace/query-session.d.ts +14 -0
- package/dist/trace/query-session.js +38 -0
- package/dist/trace/query.d.ts +55 -0
- package/dist/trace/query.js +188 -0
- package/dist/trace/session.d.ts +40 -0
- package/dist/trace/session.js +168 -0
- package/dist/trace/types.d.ts +243 -0
- package/dist/trace/types.js +13 -0
- package/dist/tui/components/editor-paste.d.ts +2 -0
- package/dist/tui/components/editor-paste.js +6 -3
- package/dist/tui/components/editor.js +2 -2
- package/dist/tui/components/loader.d.ts +3 -0
- package/dist/tui/components/loader.js +14 -0
- package/dist/tui/components/select-list.d.ts +2 -0
- package/dist/tui/components/select-list.js +7 -0
- package/dist/tui/components/settings-list.d.ts +61 -0
- package/dist/tui/components/settings-list.js +135 -0
- package/dist/tui/keybindings.d.ts +5 -0
- package/dist/tui/keybindings.js +17 -5
- package/dist/tui.d.ts +1 -0
- package/dist/tui.js +2 -0
- package/docs/en/host-api.md +167 -0
- package/docs/en/permissions.md +214 -0
- package/docs/en/providers.md +627 -0
- package/docs/en/rpc.md +361 -0
- package/docs/en/sessions.md +219 -0
- package/docs/en/tui.md +534 -0
- package/docs/host-api.md +18 -17
- package/docs/memory.md +172 -0
- package/docs/permissions.md +2 -2
- package/docs/providers.md +73 -1
- package/docs/rpc.md +31 -3
- package/docs/session-format.md +8 -2
- package/docs/sessions.md +29 -1
- package/docs/tui.md +140 -4
- package/package.json +8 -3
|
@@ -9,6 +9,8 @@
|
|
|
9
9
|
* 选项表与必填位置参数都从表里来。
|
|
10
10
|
*
|
|
11
11
|
* [W5-M1] `refresh`:models.dev 显式刷新(`refresh-catalog` 保留为别名)。
|
|
12
|
+
*
|
|
13
|
+
* `enable` / `disable` / `list --enabled`:模型选择器清单 `models.enabled`(models-enable.ts)。
|
|
12
14
|
*/
|
|
13
15
|
import { formatModelRef, modelRefOf } from "../../ai/providers/channels.js";
|
|
14
16
|
import { describeRefresh, modelsDevCachePath, refreshModelsDev, } from "../../ai/providers/models-dev-cache.js";
|
|
@@ -18,22 +20,25 @@ import { ExitCode } from "../exit-codes.js";
|
|
|
18
20
|
import { buildRegistry, loadUserLevel } from "./context.js";
|
|
19
21
|
import { CACHE_PROBE_ACTION } from "./models-cache-probe.js";
|
|
20
22
|
import { DISCOVER_ACTION } from "./models-discover.js";
|
|
23
|
+
import { DISABLE_ACTION, ENABLE_ACTION, listEnabled } from "./models-enable.js";
|
|
21
24
|
import { metadataOf, modelFlags, sourcesLine } from "./model-meta.js";
|
|
25
|
+
import { msg } from "../../i18n/index.js";
|
|
22
26
|
const COMMON_VALUE_OPTIONS = ["profile", "auth-file"];
|
|
23
27
|
export const CHECK_TIMEOUT_MS = 30_000;
|
|
24
28
|
async function list(io, registry, only) {
|
|
25
29
|
const providers = registry.list().filter((p) => only === undefined || p.id === only);
|
|
26
30
|
if (only !== undefined && providers.length === 0) {
|
|
27
|
-
io.stderr(
|
|
31
|
+
io.stderr(msg().subcommands.common.providerNotFound(only));
|
|
28
32
|
return ExitCode.NoModel;
|
|
29
33
|
}
|
|
30
34
|
for (const provider of providers) {
|
|
31
35
|
const key = await registry.resolveApiKey(provider.id);
|
|
36
|
+
const t = msg().subcommands.models;
|
|
32
37
|
const keyText = key.apiKey !== undefined
|
|
33
|
-
?
|
|
38
|
+
? t.keyFrom(key.source, key.origin)
|
|
34
39
|
: provider.requiresApiKey
|
|
35
|
-
?
|
|
36
|
-
:
|
|
40
|
+
? t.noKey
|
|
41
|
+
: t.keyNotNeeded;
|
|
37
42
|
io.stdout(`${provider.id} ${provider.api} ${keyText}\n`);
|
|
38
43
|
for (const channel of provider.channels ?? [])
|
|
39
44
|
io.stdout(` @${channel.name} ${channel.api} ${channel.baseUrl}\n`);
|
|
@@ -49,19 +54,18 @@ async function list(io, registry, only) {
|
|
|
49
54
|
async function check(io, registry, ref) {
|
|
50
55
|
const found = registry.findModel(ref);
|
|
51
56
|
if (!found.ok) {
|
|
52
|
-
|
|
53
|
-
io.stderr(`ama: 模型不存在:${ref}${hint}\n`);
|
|
57
|
+
io.stderr(msg().subcommands.common.modelNotFound(ref, found.candidates.slice(0, 10)));
|
|
54
58
|
return ExitCode.NoModel;
|
|
55
59
|
}
|
|
56
60
|
const { model, provider } = found;
|
|
57
61
|
const key = await registry.resolveApiKey(provider.id, model.channel);
|
|
58
62
|
if (key.apiKey === undefined && provider.requiresApiKey) {
|
|
59
|
-
io.stderr(
|
|
63
|
+
io.stderr(msg().subcommands.common.noApiKey(provider.id));
|
|
60
64
|
return ExitCode.NoModel;
|
|
61
65
|
}
|
|
62
66
|
const api = registry.getApi(model.api);
|
|
63
67
|
if (api === undefined) {
|
|
64
|
-
io.stderr(
|
|
68
|
+
io.stderr(msg().subcommands.common.apiNotImplemented(model.api));
|
|
65
69
|
return ExitCode.RuntimeError;
|
|
66
70
|
}
|
|
67
71
|
const started = Date.now();
|
|
@@ -74,11 +78,11 @@ async function check(io, registry, ref) {
|
|
|
74
78
|
const message = await stream.result();
|
|
75
79
|
const ms = Date.now() - started;
|
|
76
80
|
if (message.stopReason === "error" || message.stopReason === "aborted") {
|
|
77
|
-
io.stderr(
|
|
81
|
+
io.stderr(msg().subcommands.models.checkFailed(`${provider.id}/${model.id}`, ms, message.errorMessage ?? message.stopReason));
|
|
78
82
|
return ExitCode.RuntimeError;
|
|
79
83
|
}
|
|
80
84
|
const shown = formatModelRef(modelRefOf(model));
|
|
81
|
-
io.stdout(
|
|
85
|
+
io.stdout(msg().subcommands.models.checkOk(shown, model.api, ms, message.stopReason));
|
|
82
86
|
return ExitCode.Ok;
|
|
83
87
|
}
|
|
84
88
|
/**
|
|
@@ -94,7 +98,7 @@ const REFRESH_ACTION = {
|
|
|
94
98
|
?.split(",")
|
|
95
99
|
.map((p) => p.trim())
|
|
96
100
|
.filter(Boolean);
|
|
97
|
-
ctx.io.stdout(
|
|
101
|
+
ctx.io.stdout(msg().subcommands.models.refreshing(snapshotMeta().fetchedAt));
|
|
98
102
|
const result = await refreshModelsDev({
|
|
99
103
|
dataDir: ctx.level.dataDir,
|
|
100
104
|
env: ctx.io.env,
|
|
@@ -105,16 +109,19 @@ const REFRESH_ACTION = {
|
|
|
105
109
|
ctx.io.stdout(`${describeRefresh(result)}\n`);
|
|
106
110
|
if (result.status === "failed")
|
|
107
111
|
return ExitCode.RuntimeError;
|
|
108
|
-
ctx.io.stdout(
|
|
112
|
+
ctx.io.stdout(msg().subcommands.models.written(modelsDevCachePath(ctx.level.dataDir)));
|
|
109
113
|
return ExitCode.Ok;
|
|
110
114
|
},
|
|
111
115
|
};
|
|
112
116
|
/** 动作表:键是子命令名,顺序即用法文本顺序。 */
|
|
113
117
|
export const MODELS_ACTIONS = Object.freeze({
|
|
114
118
|
list: {
|
|
115
|
-
usage: "ama models list [--provider <id>]",
|
|
119
|
+
usage: "ama models list [--provider <id>] [--enabled]",
|
|
116
120
|
valueOptions: ["provider"],
|
|
117
|
-
|
|
121
|
+
flagOptions: ["enabled"],
|
|
122
|
+
run: (ctx) => ctx.flags.has("enabled")
|
|
123
|
+
? listEnabled(ctx)
|
|
124
|
+
: list(ctx.io, ctx.registry, ctx.values.get("provider")),
|
|
118
125
|
},
|
|
119
126
|
check: {
|
|
120
127
|
usage: "ama models check <provider/id>",
|
|
@@ -124,11 +131,19 @@ export const MODELS_ACTIONS = Object.freeze({
|
|
|
124
131
|
discover: DISCOVER_ACTION,
|
|
125
132
|
"cache-probe": CACHE_PROBE_ACTION,
|
|
126
133
|
refresh: REFRESH_ACTION,
|
|
127
|
-
|
|
134
|
+
// 用法行按界面语言取,用 getter(模块级求值会按 import 时的语言定死)
|
|
135
|
+
"refresh-catalog": {
|
|
136
|
+
...REFRESH_ACTION,
|
|
137
|
+
get usage() {
|
|
138
|
+
return msg().subcommands.models.refreshCatalogUsage;
|
|
139
|
+
},
|
|
140
|
+
},
|
|
141
|
+
enable: ENABLE_ACTION,
|
|
142
|
+
disable: DISABLE_ACTION,
|
|
128
143
|
});
|
|
129
|
-
export
|
|
130
|
-
.map((a) => a.usage)
|
|
131
|
-
|
|
144
|
+
export function modelsUsage() {
|
|
145
|
+
return msg().subcommands.models.usage(Object.values(MODELS_ACTIONS).map((a) => a.usage));
|
|
146
|
+
}
|
|
132
147
|
function unique(lists) {
|
|
133
148
|
return [...new Set(lists.flatMap((l) => l ?? []))];
|
|
134
149
|
}
|
|
@@ -137,12 +152,12 @@ export async function runModels(argv, io, deps) {
|
|
|
137
152
|
const { positionals, values, flags } = parseSubArgs(argv, unique([...actions.map((a) => a.valueOptions), COMMON_VALUE_OPTIONS]), unique(actions.map((a) => a.flagOptions)));
|
|
138
153
|
const name = positionals[0];
|
|
139
154
|
if (flags.has("help") || name === undefined) {
|
|
140
|
-
io.stdout(
|
|
155
|
+
io.stdout(modelsUsage());
|
|
141
156
|
return flags.has("help") ? ExitCode.Ok : ExitCode.Usage;
|
|
142
157
|
}
|
|
143
158
|
const action = Object.hasOwn(MODELS_ACTIONS, name) ? MODELS_ACTIONS[name] : undefined;
|
|
144
159
|
if (action === undefined)
|
|
145
|
-
throw new UsageError(
|
|
160
|
+
throw new UsageError(msg().subcommands.common.unknownSubcommand("models", name));
|
|
146
161
|
// 选项按全部动作的并集解析;这里再拒绝不属于本动作的(如 `list --json`)。
|
|
147
162
|
for (const option of [...values.keys(), ...flags]) {
|
|
148
163
|
const own = [
|
|
@@ -151,13 +166,13 @@ export async function runModels(argv, io, deps) {
|
|
|
151
166
|
...(action.flagOptions ?? []),
|
|
152
167
|
];
|
|
153
168
|
if (!own.includes(option))
|
|
154
|
-
throw new UsageError(
|
|
169
|
+
throw new UsageError(msg().subcommands.common.unknownOption(option));
|
|
155
170
|
}
|
|
156
171
|
const args = positionals.slice(1);
|
|
157
172
|
if (action.required !== undefined && args[0] === undefined)
|
|
158
|
-
throw new UsageError(`ama models ${name}
|
|
173
|
+
throw new UsageError(msg().subcommands.common.needsArg(`ama models ${name}`, action.required));
|
|
159
174
|
if (deps === undefined) {
|
|
160
|
-
io.stderr("
|
|
175
|
+
io.stderr(msg().subcommands.common.notAssembled("models"));
|
|
161
176
|
return ExitCode.RuntimeError;
|
|
162
177
|
}
|
|
163
178
|
const level = loadUserLevel(io, {
|
|
@@ -165,7 +180,7 @@ export async function runModels(argv, io, deps) {
|
|
|
165
180
|
authFile: values.get("auth-file"),
|
|
166
181
|
});
|
|
167
182
|
for (const warning of level.warnings)
|
|
168
|
-
io.stderr(
|
|
183
|
+
io.stderr(msg().subcommands.common.warning(warning));
|
|
169
184
|
const registry = await buildRegistry(level, io, deps);
|
|
170
185
|
return action.run({ io, registry, level, args, values, flags });
|
|
171
186
|
}
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
* `ama models check` 不走这里:它只发一次,要看到完整回复与耗时。
|
|
14
14
|
*/
|
|
15
15
|
import { UsageError } from "../args.js";
|
|
16
|
+
import { msg } from "../../i18n/index.js";
|
|
16
17
|
export const PROBE_TIMEOUT_MS = 15_000;
|
|
17
18
|
export const DEFAULT_PROBE_CONCURRENCY = 6;
|
|
18
19
|
export const MAX_PROBE_CONCURRENCY = 16;
|
|
@@ -36,7 +37,7 @@ const sleep = (ms, signal) => new Promise((resolve) => {
|
|
|
36
37
|
export async function probeOnce(registry, model, apiKey, tuning = {}, signal) {
|
|
37
38
|
const impl = registry.getApi(model.api);
|
|
38
39
|
if (impl === undefined)
|
|
39
|
-
return { error:
|
|
40
|
+
return { error: msg().subcommands.probe.apiNotImplemented(model.api) };
|
|
40
41
|
if (signal?.aborted)
|
|
41
42
|
return { aborted: true };
|
|
42
43
|
const timeoutMs = tuning.timeoutMs ?? PROBE_TIMEOUT_MS;
|
|
@@ -53,7 +54,7 @@ export async function probeOnce(registry, model, apiKey, tuning = {}, signal) {
|
|
|
53
54
|
if (signal?.aborted)
|
|
54
55
|
return { aborted: true };
|
|
55
56
|
if (timedOut)
|
|
56
|
-
return { error:
|
|
57
|
+
return { error: msg().subcommands.probe.timeout(Math.round(timeoutMs / 1000)) };
|
|
57
58
|
return outcome;
|
|
58
59
|
};
|
|
59
60
|
try {
|
|
@@ -147,7 +148,7 @@ export class ProbeScheduler {
|
|
|
147
148
|
return { aborted: true };
|
|
148
149
|
outcome = await probeOnce(this.registry, model, this.apiKey, this.options, this.signal);
|
|
149
150
|
if (outcome.error !== undefined && RATE_LIMITED.test(outcome.error)) {
|
|
150
|
-
this.stop(
|
|
151
|
+
this.stop(msg().subcommands.probe.rateLimitedStop(outcome.error));
|
|
151
152
|
return outcome;
|
|
152
153
|
}
|
|
153
154
|
}
|
|
@@ -208,7 +209,7 @@ export function parseProbeTuning(values) {
|
|
|
208
209
|
return fallback;
|
|
209
210
|
const n = Number(raw);
|
|
210
211
|
if (!Number.isInteger(n) || n < min || n > max)
|
|
211
|
-
throw new UsageError(
|
|
212
|
+
throw new UsageError(msg().subcommands.probe.intRange(name, min, max, raw));
|
|
212
213
|
return n;
|
|
213
214
|
};
|
|
214
215
|
return {
|
|
@@ -219,7 +220,7 @@ export function parseProbeTuning(values) {
|
|
|
219
220
|
/** 预估文案:`并发 6,单次最长 15 s,预计不超过 150 s`。 */
|
|
220
221
|
export function describeProbePlan(requests, concurrency, timeoutMs) {
|
|
221
222
|
const worst = Math.ceil(requests / concurrency) * Math.ceil(timeoutMs / 1000);
|
|
222
|
-
return
|
|
223
|
+
return msg().subcommands.probe.plan(concurrency, Math.round(timeoutMs / 1000), worst);
|
|
223
224
|
}
|
|
224
225
|
/** 进度:TTY 下单行刷新「探测 18/60」;非 TTY 只在结束时打印一行汇总。 */
|
|
225
226
|
export class ProbeProgress {
|
|
@@ -247,12 +248,12 @@ export class ProbeProgress {
|
|
|
247
248
|
finish() {
|
|
248
249
|
this.clear();
|
|
249
250
|
const seconds = ((Date.now() - this.started) / 1000).toFixed(1);
|
|
250
|
-
this.write(
|
|
251
|
+
this.write(msg().subcommands.probe.done(this.done, this.total, seconds));
|
|
251
252
|
}
|
|
252
253
|
draw() {
|
|
253
254
|
if (!this.tty)
|
|
254
255
|
return;
|
|
255
|
-
this.write(`\r\x1b[2K
|
|
256
|
+
this.write(`\r\x1b[2K${msg().subcommands.probe.progress(this.done, this.total)}`);
|
|
256
257
|
this.shown = true;
|
|
257
258
|
}
|
|
258
259
|
clear() {
|
|
@@ -8,23 +8,21 @@ import { writeConfigFile } from "../../config/write.js";
|
|
|
8
8
|
import { ExitCode } from "../exit-codes.js";
|
|
9
9
|
import { buildRegistry } from "./context.js";
|
|
10
10
|
import { userConfig } from "./providers.js";
|
|
11
|
+
import { msg } from "../../i18n/index.js";
|
|
11
12
|
async function keySource(registry, config, id, channel) {
|
|
13
|
+
const m = msg().subcommands.providersList;
|
|
12
14
|
const raw = channel !== undefined ? config?.channels?.[channel]?.apiKey : config?.apiKey;
|
|
13
15
|
if (raw !== undefined) {
|
|
14
16
|
const kind = classifyKeyValue(raw);
|
|
15
|
-
return kind === "env-ref"
|
|
16
|
-
? raw
|
|
17
|
-
: kind === "command"
|
|
18
|
-
? "!命令(config.json)"
|
|
19
|
-
: "字面量(config.json)";
|
|
17
|
+
return kind === "env-ref" ? raw : kind === "command" ? m.keyCommand : m.keyLiteral;
|
|
20
18
|
}
|
|
21
19
|
const resolved = await registry.resolveApiKey(id, channel);
|
|
22
20
|
if (resolved.apiKey === undefined)
|
|
23
|
-
return channel !== undefined ?
|
|
21
|
+
return channel !== undefined ? m.keySameProvider : m.keyNone;
|
|
24
22
|
if (channel !== undefined && resolved.source !== "auth-file")
|
|
25
|
-
return
|
|
23
|
+
return m.keySameProvider;
|
|
26
24
|
return resolved.source === "env"
|
|
27
|
-
?
|
|
25
|
+
? m.keyEnv(resolved.origin ?? "")
|
|
28
26
|
: resolved.source === "auth-file"
|
|
29
27
|
? "auth.json"
|
|
30
28
|
: resolved.source;
|
|
@@ -41,36 +39,49 @@ export async function listProviders(ctx) {
|
|
|
41
39
|
(await registry.resolveApiKey(provider.id)).apiKey !== undefined))
|
|
42
40
|
continue;
|
|
43
41
|
shown++;
|
|
44
|
-
const kind = provider.builtin ? "内置" : "自定义";
|
|
45
42
|
const channels = provider.channels ?? [];
|
|
46
|
-
|
|
47
|
-
|
|
43
|
+
const t = msg().subcommands.providersList;
|
|
44
|
+
ctx.io.stdout(t.providerLine({
|
|
45
|
+
id: provider.id,
|
|
46
|
+
builtin: provider.builtin,
|
|
47
|
+
channels: channels.length,
|
|
48
|
+
endpoint: `${provider.api} ${provider.baseUrl}`,
|
|
49
|
+
models: provider.models.length,
|
|
50
|
+
key: await keySource(registry, own, provider.id),
|
|
51
|
+
}));
|
|
48
52
|
for (const c of channels) {
|
|
49
53
|
const count = provider.models.filter((m) => m.channels?.includes(c.name)).length;
|
|
50
|
-
|
|
54
|
+
const key = await keySource(registry, own, provider.id, c.name);
|
|
55
|
+
ctx.io.stdout(t.channelLine(c.name, c.api, c.baseUrl, count, key));
|
|
51
56
|
}
|
|
52
57
|
}
|
|
53
58
|
if (shown === 0)
|
|
54
|
-
ctx.io.stdout(
|
|
59
|
+
ctx.io.stdout(msg().subcommands.providersList.noProviders);
|
|
55
60
|
return ExitCode.Ok;
|
|
56
61
|
}
|
|
57
62
|
export async function listChannels(ctx, id) {
|
|
58
63
|
const registry = await buildRegistry(ctx.level, ctx.io, ctx.deps);
|
|
59
64
|
const provider = registry.get(id);
|
|
60
65
|
if (provider === undefined) {
|
|
61
|
-
ctx.io.stderr(
|
|
66
|
+
ctx.io.stderr(msg().subcommands.common.providerNotFound(id));
|
|
62
67
|
return ExitCode.NoModel;
|
|
63
68
|
}
|
|
64
69
|
const own = userConfig(ctx.level).providers?.[id];
|
|
65
70
|
if (provider.channels === undefined) {
|
|
66
|
-
ctx.io.stdout(
|
|
71
|
+
ctx.io.stdout(msg().subcommands.providersList.singleChannel(id, provider.api, provider.baseUrl, provider.models.length));
|
|
67
72
|
return ExitCode.Ok;
|
|
68
73
|
}
|
|
69
74
|
for (const c of provider.channels) {
|
|
70
75
|
const models = provider.models.filter((m) => m.channels?.includes(c.name));
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
76
|
+
ctx.io.stdout(msg().subcommands.providersList.channelDetail({
|
|
77
|
+
name: c.name,
|
|
78
|
+
isDefault: c.name === provider.defaultChannel,
|
|
79
|
+
short: apiShortName(c.api),
|
|
80
|
+
api: c.api,
|
|
81
|
+
url: c.baseUrl,
|
|
82
|
+
key: await keySource(registry, own, id, c.name),
|
|
83
|
+
models: models.map((m) => m.id),
|
|
84
|
+
}));
|
|
74
85
|
}
|
|
75
86
|
return ExitCode.Ok;
|
|
76
87
|
}
|
|
@@ -80,7 +91,7 @@ export function removeProvider(ctx, id) {
|
|
|
80
91
|
if (had) {
|
|
81
92
|
delete config.providers?.[id];
|
|
82
93
|
writeConfigFile(ctx.level.userConfigPath, config, { backup: true });
|
|
83
|
-
ctx.io.stdout(
|
|
94
|
+
ctx.io.stdout(msg().subcommands.providersList.removed(ctx.level.userConfigPath, id));
|
|
84
95
|
}
|
|
85
96
|
const auth = readAuthFile(ctx.level.authFile).file;
|
|
86
97
|
let keys = 0;
|
|
@@ -88,9 +99,9 @@ export function removeProvider(ctx, id) {
|
|
|
88
99
|
if (name === id || name.startsWith(`${id}@`))
|
|
89
100
|
keys += removeAuthKey(ctx.level.authFile, name) ? 1 : 0;
|
|
90
101
|
if (keys > 0)
|
|
91
|
-
ctx.io.stdout(
|
|
102
|
+
ctx.io.stdout(msg().subcommands.providersList.keysRemoved(ctx.level.authFile, id, keys));
|
|
92
103
|
if (!had && keys === 0) {
|
|
93
|
-
ctx.io.stderr(
|
|
104
|
+
ctx.io.stderr(msg().subcommands.providersList.noSuchProvider(id));
|
|
94
105
|
return ExitCode.RuntimeError;
|
|
95
106
|
}
|
|
96
107
|
return ExitCode.Ok;
|
|
@@ -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) => {
|
|
@@ -15,7 +15,7 @@ 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">;
|