@armadra/agent 0.5.1 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +177 -304
- package/CHANGELOG.zh-CN.md +442 -0
- package/README.md +408 -364
- package/README.zh-CN.md +705 -0
- package/dist/agent/session-plan.js +2 -2
- package/dist/agent/session-state.d.ts +3 -0
- package/dist/agent/session-state.js +20 -0
- package/dist/agent/session-subagent.d.ts +15 -1
- package/dist/agent/session-subagent.js +26 -3
- package/dist/agent/session-telemetry.d.ts +16 -2
- package/dist/agent/session-telemetry.js +29 -7
- package/dist/agent/session-tools.js +5 -2
- package/dist/agent/session-trace-writer.d.ts +27 -0
- package/dist/agent/session-trace-writer.js +253 -0
- package/dist/agent/session.d.ts +2 -0
- package/dist/agent/session.js +12 -0
- package/dist/agent/subagent-direct.d.ts +20 -0
- package/dist/agent/subagent-direct.js +76 -0
- package/dist/agent/subagent-registry.d.ts +8 -1
- package/dist/agent/subagent-registry.js +28 -1
- package/dist/agent/system-prompt.d.ts +3 -1
- package/dist/agent/system-prompt.js +3 -0
- package/dist/agent/tool-runner.d.ts +2 -1
- package/dist/agent/tool-runner.js +5 -4
- package/dist/agent/types-w6.d.ts +39 -0
- package/dist/agent/types-w6.js +4 -0
- package/dist/agent/types.d.ts +5 -2
- package/dist/agents/external.js +1 -1
- package/dist/agents/task-record.d.ts +74 -1
- package/dist/agents/task-record.js +100 -0
- package/dist/ai/apis/cache-params.js +2 -1
- package/dist/ai/apis/chatgpt-backend.d.ts +52 -0
- package/dist/ai/apis/chatgpt-backend.js +224 -0
- package/dist/ai/apis/chatgpt-rate-limits.d.ts +26 -0
- package/dist/ai/apis/chatgpt-rate-limits.js +91 -0
- package/dist/ai/apis/openai-responses-request.d.ts +2 -1
- package/dist/ai/apis/openai-responses-request.js +8 -2
- package/dist/ai/apis/openai-responses.d.ts +2 -0
- package/dist/ai/apis/openai-responses.js +51 -16
- package/dist/ai/overflow.d.ts +1 -1
- package/dist/ai/overflow.js +10 -7
- package/dist/ai/providers/auth.d.ts +15 -2
- package/dist/ai/providers/auth.js +69 -2
- package/dist/ai/providers/builtin.js +27 -0
- package/dist/ai/providers/catalog-data.js +1 -0
- package/dist/ai/providers/enrich.js +2 -7
- package/dist/ai/providers/models-dev-cache.js +15 -19
- package/dist/ai/providers/models-dev-snapshot.js +8 -7
- package/dist/ai/providers/models-dev.js +5 -15
- package/dist/ai/providers/suggest.js +2 -16
- package/dist/ai/types.d.ts +27 -1
- package/dist/auth/chatgpt/backend-client.d.ts +26 -0
- package/dist/auth/chatgpt/backend-client.js +74 -0
- package/dist/auth/chatgpt/claims.d.ts +17 -0
- package/dist/auth/chatgpt/claims.js +46 -0
- package/dist/auth/chatgpt/cli.d.ts +33 -0
- package/dist/auth/chatgpt/cli.js +252 -0
- package/dist/auth/chatgpt/doctor.d.ts +17 -0
- package/dist/auth/chatgpt/doctor.js +36 -0
- package/dist/auth/chatgpt/host-id.d.ts +7 -0
- package/dist/auth/chatgpt/host-id.js +26 -0
- package/dist/auth/chatgpt/login.d.ts +30 -0
- package/dist/auth/chatgpt/login.js +130 -0
- package/dist/auth/chatgpt/presets.d.ts +66 -0
- package/dist/auth/chatgpt/presets.js +120 -0
- package/dist/auth/chatgpt/quota-text.d.ts +13 -0
- package/dist/auth/chatgpt/quota-text.js +36 -0
- package/dist/auth/oauth/browser.d.ts +12 -0
- package/dist/auth/oauth/browser.js +27 -0
- package/dist/auth/oauth/callback-server.d.ts +47 -0
- package/dist/auth/oauth/callback-server.js +147 -0
- package/dist/auth/oauth/flows.d.ts +62 -0
- package/dist/auth/oauth/flows.js +113 -0
- package/dist/auth/oauth/jwt.d.ts +24 -0
- package/dist/auth/oauth/jwt.js +81 -0
- package/dist/auth/oauth/live.d.ts +21 -0
- package/dist/auth/oauth/live.js +25 -0
- package/dist/auth/oauth/oidc.d.ts +26 -0
- package/dist/auth/oauth/oidc.js +72 -0
- package/dist/auth/oauth/pkce.d.ts +15 -0
- package/dist/auth/oauth/pkce.js +20 -0
- package/dist/auth/oauth/refresh.d.ts +35 -0
- package/dist/auth/oauth/refresh.js +129 -0
- package/dist/auth/oauth/token-client.d.ts +33 -0
- package/dist/auth/oauth/token-client.js +121 -0
- package/dist/auth/oauth/token-store.d.ts +23 -0
- package/dist/auth/oauth/token-store.js +125 -0
- package/dist/auth/testing/fake-oauth.d.ts +73 -0
- package/dist/auth/testing/fake-oauth.js +271 -0
- package/dist/auth/testing/refresh-child.d.ts +5 -0
- package/dist/auth/testing/refresh-child.js +16 -0
- package/dist/bundle/ama.cjs +25928 -11144
- package/dist/checkpoints/backend.js +6 -5
- package/dist/checkpoints/restore.js +3 -2
- package/dist/checkpoints/settings.js +2 -1
- package/dist/checkpoints/shadow-git.js +7 -6
- package/dist/checkpoints/shadow-restore.js +3 -2
- package/dist/checkpoints/tracker.js +4 -3
- package/dist/cli/args.d.ts +9 -2
- package/dist/cli/args.js +74 -27
- package/dist/cli/bootstrap.js +53 -31
- package/dist/cli/choice-prompt.js +8 -6
- package/dist/cli/codemode-notice.js +2 -2
- package/dist/cli/compose-agents.js +2 -1
- package/dist/cli/compose-extensions.js +2 -0
- package/dist/cli/compose-memory.d.ts +53 -0
- package/dist/cli/compose-memory.js +127 -0
- package/dist/cli/compose-providers.d.ts +5 -0
- package/dist/cli/compose-providers.js +32 -2
- package/dist/cli/compose-session.d.ts +5 -0
- package/dist/cli/compose-session.js +27 -13
- package/dist/cli/compose-store.d.ts +2 -0
- package/dist/cli/compose-store.js +9 -5
- package/dist/cli/compose.d.ts +2 -0
- package/dist/cli/compose.js +13 -5
- package/dist/cli/default-model.d.ts +0 -2
- package/dist/cli/default-model.js +5 -8
- package/dist/cli/deps.d.ts +5 -1
- package/dist/cli/exit-codes.d.ts +1 -1
- package/dist/cli/exit-codes.js +7 -16
- package/dist/cli/from-prompt.js +3 -2
- package/dist/cli/help-text.d.ts +2 -1
- package/dist/cli/help-text.js +5 -99
- package/dist/cli/main.d.ts +5 -0
- package/dist/cli/main.js +21 -2
- package/dist/cli/proxy.js +14 -9
- package/dist/cli/runtime.d.ts +5 -0
- package/dist/cli/startup-screen.js +20 -27
- package/dist/cli/startup-steps.js +6 -8
- package/dist/cli/subcommands/auth.d.ts +6 -3
- package/dist/cli/subcommands/auth.js +52 -22
- package/dist/cli/subcommands/config-set.d.ts +21 -0
- package/dist/cli/subcommands/config-set.js +137 -0
- package/dist/cli/subcommands/config.d.ts +2 -1
- package/dist/cli/subcommands/config.js +51 -37
- package/dist/cli/subcommands/doctor.d.ts +2 -1
- package/dist/cli/subcommands/doctor.js +97 -58
- package/dist/cli/subcommands/init.d.ts +1 -1
- package/dist/cli/subcommands/init.js +8 -7
- package/dist/cli/subcommands/memory.d.ts +18 -0
- package/dist/cli/subcommands/memory.js +189 -0
- package/dist/cli/subcommands/model-meta.js +11 -9
- package/dist/cli/subcommands/models-cache-probe.js +23 -20
- package/dist/cli/subcommands/models-discover.d.ts +3 -0
- package/dist/cli/subcommands/models-discover.js +44 -21
- package/dist/cli/subcommands/models.d.ts +1 -1
- package/dist/cli/subcommands/models.js +29 -22
- package/dist/cli/subcommands/probe-runner.js +8 -7
- package/dist/cli/subcommands/providers-list.js +32 -21
- package/dist/cli/subcommands/providers-plan.js +24 -25
- package/dist/cli/subcommands/providers-probe.js +5 -6
- package/dist/cli/subcommands/providers.d.ts +1 -1
- package/dist/cli/subcommands/providers.js +45 -50
- package/dist/cli/subcommands/sessions-export.d.ts +1 -1
- package/dist/cli/subcommands/sessions-export.js +10 -9
- package/dist/cli/subcommands/sessions-search.d.ts +1 -1
- package/dist/cli/subcommands/sessions-search.js +11 -10
- package/dist/cli/subcommands/sessions-trace.d.ts +30 -0
- package/dist/cli/subcommands/sessions-trace.js +156 -0
- package/dist/cli/subcommands/sessions.d.ts +4 -3
- package/dist/cli/subcommands/sessions.js +40 -37
- package/dist/cli/subcommands/stats.d.ts +1 -1
- package/dist/cli/subcommands/stats.js +49 -30
- package/dist/cli/system-prompt-arg.js +3 -2
- package/dist/codemode/capability.js +3 -2
- package/dist/compaction/post-compact.d.ts +1 -0
- package/dist/compaction/post-compact.js +15 -1
- package/dist/compaction/prune-tier.d.ts +1 -1
- package/dist/compaction/prune-tier.js +3 -3
- package/dist/compaction/serialize.js +2 -1
- package/dist/config/auth-file.d.ts +12 -2
- package/dist/config/auth-file.js +32 -10
- package/dist/config/checker.js +12 -11
- package/dist/config/context-files.js +3 -2
- package/dist/config/edit.d.ts +106 -0
- package/dist/config/edit.js +350 -0
- package/dist/config/init.d.ts +4 -3
- package/dist/config/init.js +10 -18
- package/dist/config/json-schema.d.ts +2 -1
- package/dist/config/json-schema.js +101 -68
- package/dist/config/key-docs.d.ts +18 -7
- package/dist/config/key-docs.js +43 -128
- package/dist/config/load.js +7 -6
- package/dist/config/merge.d.ts +4 -1
- package/dist/config/merge.js +42 -22
- package/dist/config/paths.js +6 -5
- package/dist/config/profile.d.ts +5 -1
- package/dist/config/profile.js +7 -2
- package/dist/config/schema-w5.js +3 -2
- package/dist/config/schema-w6.d.ts +19 -0
- package/dist/config/schema-w6.js +115 -0
- package/dist/config/schema.js +34 -20
- package/dist/config/settings-registry.d.ts +78 -0
- package/dist/config/settings-registry.js +184 -0
- package/dist/config/types-w6.d.ts +109 -0
- package/dist/config/types-w6.js +19 -0
- package/dist/config/types.d.ts +11 -8
- package/dist/config/types.js +1 -0
- package/dist/drivers/acp/client.js +1 -1
- package/dist/drivers/acp/driver.js +13 -8
- package/dist/drivers/agents.js +4 -3
- package/dist/drivers/base.js +3 -2
- package/dist/drivers/host-runners.js +2 -1
- package/dist/drivers/native/claude-stream.js +12 -11
- package/dist/drivers/native/codex-app-server.js +17 -12
- package/dist/drivers/native/oneshot.js +8 -7
- package/dist/drivers/pool.js +1 -1
- package/dist/drivers/runner.d.ts +3 -1
- package/dist/drivers/runner.js +68 -20
- package/dist/drivers/turn.js +1 -1
- package/dist/hooks/config.js +3 -2
- package/dist/hooks/protocol.js +18 -12
- package/dist/host/api-impl.js +11 -10
- package/dist/host/loader.js +9 -8
- package/dist/host/types.d.ts +3 -0
- package/dist/i18n/catalog.d.ts +2169 -0
- package/dist/i18n/catalog.js +72 -0
- package/dist/i18n/format.d.ts +21 -0
- package/dist/i18n/format.js +58 -0
- package/dist/i18n/index.d.ts +58 -0
- package/dist/i18n/index.js +72 -0
- package/dist/i18n/messages/agents.d.ts +84 -0
- package/dist/i18n/messages/agents.js +85 -0
- package/dist/i18n/messages/approval.d.ts +99 -0
- package/dist/i18n/messages/approval.js +100 -0
- package/dist/i18n/messages/auth.d.ts +187 -0
- package/dist/i18n/messages/auth.js +189 -0
- package/dist/i18n/messages/cli-args.d.ts +46 -0
- package/dist/i18n/messages/cli-args.js +46 -0
- package/dist/i18n/messages/cli-help.d.ts +12 -0
- package/dist/i18n/messages/cli-help.js +244 -0
- package/dist/i18n/messages/cli.d.ts +336 -0
- package/dist/i18n/messages/cli.js +311 -0
- package/dist/i18n/messages/config-keys.d.ts +289 -0
- package/dist/i18n/messages/config-keys.js +292 -0
- package/dist/i18n/messages/config.d.ts +502 -0
- package/dist/i18n/messages/config.js +239 -0
- package/dist/i18n/messages/drivers.d.ts +123 -0
- package/dist/i18n/messages/drivers.js +124 -0
- package/dist/i18n/messages/errors.d.ts +83 -0
- package/dist/i18n/messages/errors.js +171 -0
- package/dist/i18n/messages/interactive-line.d.ts +61 -0
- package/dist/i18n/messages/interactive-line.js +69 -0
- package/dist/i18n/messages/interactive-startup.d.ts +103 -0
- package/dist/i18n/messages/interactive-startup.js +104 -0
- package/dist/i18n/messages/interactive-view.d.ts +140 -0
- package/dist/i18n/messages/interactive-view.js +141 -0
- package/dist/i18n/messages/interactive.d.ts +493 -0
- package/dist/i18n/messages/interactive.js +248 -0
- package/dist/i18n/messages/memory.d.ts +123 -0
- package/dist/i18n/messages/memory.js +128 -0
- package/dist/i18n/messages/panels.d.ts +190 -0
- package/dist/i18n/messages/panels.js +189 -0
- package/dist/i18n/messages/permissions.d.ts +126 -0
- package/dist/i18n/messages/permissions.js +151 -0
- package/dist/i18n/messages/plan.d.ts +123 -0
- package/dist/i18n/messages/plan.js +124 -0
- package/dist/i18n/messages/print.d.ts +86 -0
- package/dist/i18n/messages/print.js +91 -0
- package/dist/i18n/messages/report.d.ts +391 -0
- package/dist/i18n/messages/report.js +490 -0
- package/dist/i18n/messages/rewind.d.ts +198 -0
- package/dist/i18n/messages/rewind.js +217 -0
- package/dist/i18n/messages/session.d.ts +230 -0
- package/dist/i18n/messages/session.js +258 -0
- package/dist/i18n/messages/settings.d.ts +348 -0
- package/dist/i18n/messages/settings.js +336 -0
- package/dist/i18n/messages/subcommands-config.d.ts +111 -0
- package/dist/i18n/messages/subcommands-config.js +127 -0
- package/dist/i18n/messages/subcommands.d.ts +548 -0
- package/dist/i18n/messages/subcommands.js +474 -0
- package/dist/i18n/messages/trace.d.ts +243 -0
- package/dist/i18n/messages/trace.js +238 -0
- package/dist/i18n/types.d.ts +15 -0
- package/dist/i18n/types.js +7 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +2 -0
- package/dist/memory/edit.d.ts +24 -0
- package/dist/memory/edit.js +63 -0
- package/dist/memory/frontmatter.d.ts +37 -0
- package/dist/memory/frontmatter.js +79 -0
- package/dist/memory/index.d.ts +28 -0
- package/dist/memory/index.js +126 -0
- package/dist/memory/lock.d.ts +17 -0
- package/dist/memory/lock.js +62 -0
- package/dist/memory/paths.d.ts +57 -0
- package/dist/memory/paths.js +175 -0
- package/dist/memory/report.d.ts +36 -0
- package/dist/memory/report.js +86 -0
- package/dist/memory/runtime.d.ts +42 -0
- package/dist/memory/runtime.js +36 -0
- package/dist/memory/secrets.d.ts +8 -0
- package/dist/memory/secrets.js +27 -0
- package/dist/memory/section.d.ts +28 -0
- package/dist/memory/section.js +59 -0
- package/dist/memory/store.d.ts +70 -0
- package/dist/memory/store.js +284 -0
- package/dist/memory/tool.d.ts +31 -0
- package/dist/memory/tool.js +94 -0
- package/dist/modes/acp/acp-events.js +2 -1
- package/dist/modes/acp/acp-server.js +13 -12
- package/dist/modes/commands-core.d.ts +11 -0
- package/dist/modes/commands-core.js +93 -62
- package/dist/modes/image-input.js +20 -6
- package/dist/modes/interactive/agent-bar.d.ts +95 -0
- package/dist/modes/interactive/agent-bar.js +248 -0
- package/dist/modes/interactive/agent-panels.js +27 -26
- package/dist/modes/interactive/agent-transcript.d.ts +47 -0
- package/dist/modes/interactive/agent-transcript.js +191 -0
- package/dist/modes/interactive/agent-ui.d.ts +36 -1
- package/dist/modes/interactive/agent-ui.js +180 -14
- package/dist/modes/interactive/agent-view.d.ts +72 -0
- package/dist/modes/interactive/agent-view.js +281 -0
- package/dist/modes/interactive/approval-dialog.js +46 -34
- package/dist/modes/interactive/clipboard-paste.d.ts +2 -2
- package/dist/modes/interactive/clipboard-paste.js +9 -4
- package/dist/modes/interactive/commands.d.ts +19 -1
- package/dist/modes/interactive/commands.js +84 -40
- package/dist/modes/interactive/completion.js +2 -1
- package/dist/modes/interactive/config-panel.d.ts +70 -0
- package/dist/modes/interactive/config-panel.js +319 -0
- package/dist/modes/interactive/config-ui.d.ts +96 -0
- package/dist/modes/interactive/config-ui.js +397 -0
- package/dist/modes/interactive/confirm-dialog.js +6 -7
- package/dist/modes/interactive/event-notices.js +11 -9
- package/dist/modes/interactive/interactive-mode.d.ts +1 -1
- package/dist/modes/interactive/interactive-mode.js +19 -22
- package/dist/modes/interactive/key-dispatch.d.ts +12 -0
- package/dist/modes/interactive/key-dispatch.js +24 -9
- package/dist/modes/interactive/line/line-editor.js +2 -1
- package/dist/modes/interactive/line/line-mode.js +18 -7
- package/dist/modes/interactive/line/line-render.js +25 -24
- package/dist/modes/interactive/memory-panel.d.ts +64 -0
- package/dist/modes/interactive/memory-panel.js +221 -0
- package/dist/modes/interactive/message-view.d.ts +4 -2
- package/dist/modes/interactive/message-view.js +42 -33
- package/dist/modes/interactive/panels.js +39 -31
- package/dist/modes/interactive/pickers.d.ts +2 -1
- package/dist/modes/interactive/pickers.js +10 -6
- package/dist/modes/interactive/plan-command.d.ts +1 -1
- package/dist/modes/interactive/plan-command.js +24 -27
- package/dist/modes/interactive/plan-dialog.js +18 -17
- package/dist/modes/interactive/plan-flow.js +6 -5
- package/dist/modes/interactive/rewind-command.d.ts +1 -1
- package/dist/modes/interactive/rewind-command.js +18 -16
- package/dist/modes/interactive/rewind-flow.d.ts +0 -1
- package/dist/modes/interactive/rewind-flow.js +13 -14
- package/dist/modes/interactive/rewind-list.js +7 -6
- package/dist/modes/interactive/rewind-panel.js +40 -40
- package/dist/modes/interactive/rewind-text.d.ts +5 -3
- package/dist/modes/interactive/rewind-text.js +48 -38
- package/dist/modes/interactive/run-indicator.js +15 -12
- package/dist/modes/interactive/session-events.js +3 -2
- package/dist/modes/interactive/startup-header.js +22 -23
- package/dist/modes/interactive/startup-ui.js +38 -30
- package/dist/modes/interactive/status-area.d.ts +2 -0
- package/dist/modes/interactive/status-area.js +8 -2
- package/dist/modes/interactive/status-bar.js +4 -3
- package/dist/modes/interactive/subagent-view.js +9 -7
- package/dist/modes/interactive/tasks-report.d.ts +6 -0
- package/dist/modes/interactive/tasks-report.js +28 -31
- package/dist/modes/interactive/terminal-setup.d.ts +9 -0
- package/dist/modes/interactive/terminal-setup.js +23 -0
- package/dist/modes/interactive/tool-summary.js +19 -17
- package/dist/modes/interactive/tool-view.js +7 -4
- package/dist/modes/interactive/trace-view.d.ts +89 -0
- package/dist/modes/interactive/trace-view.js +332 -0
- package/dist/modes/print/print-mode.js +14 -15
- package/dist/modes/rpc/commands.js +7 -3
- package/dist/modes/rpc/rpc-mode.js +9 -3
- package/dist/modes/session-report.d.ts +2 -0
- package/dist/modes/session-report.js +101 -105
- package/dist/modes/startup-ui-text.js +11 -6
- package/dist/permissions/bypass.d.ts +8 -10
- package/dist/permissions/bypass.js +19 -10
- package/dist/permissions/memory-class.d.ts +23 -0
- package/dist/permissions/memory-class.js +54 -0
- package/dist/permissions/modes.d.ts +3 -3
- package/dist/permissions/modes.js +21 -16
- package/dist/permissions/pipeline.d.ts +1 -1
- package/dist/permissions/pipeline.js +9 -2
- package/dist/permissions/preview.js +49 -42
- package/dist/permissions/rules.js +5 -2
- package/dist/permissions/types.d.ts +4 -0
- package/dist/plan/store.js +2 -1
- package/dist/rpc.d.ts +39 -1
- package/dist/rpc.js +3 -0
- package/dist/sandbox/bash.js +11 -8
- package/dist/sandbox/detect.js +14 -11
- package/dist/sdk.d.ts +17 -1
- package/dist/sdk.js +29 -7
- package/dist/session/export.js +31 -30
- package/dist/session/manager.d.ts +1 -1
- package/dist/session/manager.js +5 -3
- package/dist/session/reuse.js +5 -4
- package/dist/session/scan.js +3 -2
- package/dist/session/stats-aggregate.d.ts +3 -1
- package/dist/session/stats-aggregate.js +5 -1
- package/dist/session/stats-index.js +2 -1
- package/dist/session/stats-scan.d.ts +4 -1
- package/dist/session/stats-scan.js +6 -2
- package/dist/session/store.d.ts +11 -0
- package/dist/session/store.js +48 -1
- package/dist/session/types.d.ts +2 -0
- package/dist/skills/builtin.js +2 -1
- package/dist/tools/image-file.d.ts +26 -1
- package/dist/tools/image-file.js +55 -13
- package/dist/tools/presets.d.ts +14 -1
- package/dist/tools/presets.js +3 -3
- package/dist/tools/registry.js +1 -1
- package/dist/tools/truncate.d.ts +1 -1
- package/dist/tools/truncate.js +2 -2
- package/dist/tools/types.d.ts +17 -1
- package/dist/trace/build-index.d.ts +91 -0
- package/dist/trace/build-index.js +127 -0
- package/dist/trace/build-nodes.d.ts +24 -0
- package/dist/trace/build-nodes.js +279 -0
- package/dist/trace/build-util.d.ts +43 -0
- package/dist/trace/build-util.js +120 -0
- package/dist/trace/build.d.ts +82 -0
- package/dist/trace/build.js +382 -0
- package/dist/trace/detail.d.ts +35 -0
- package/dist/trace/detail.js +205 -0
- package/dist/trace/flatten.d.ts +69 -0
- package/dist/trace/flatten.js +173 -0
- package/dist/trace/format.d.ts +47 -0
- package/dist/trace/format.js +329 -0
- package/dist/trace/html-template.d.ts +19 -0
- package/dist/trace/html-template.js +150 -0
- package/dist/trace/html.d.ts +104 -0
- package/dist/trace/html.js +292 -0
- package/dist/trace/preview.d.ts +29 -0
- package/dist/trace/preview.js +59 -0
- package/dist/trace/query-session.d.ts +14 -0
- package/dist/trace/query-session.js +38 -0
- package/dist/trace/query.d.ts +55 -0
- package/dist/trace/query.js +188 -0
- package/dist/trace/session.d.ts +40 -0
- package/dist/trace/session.js +168 -0
- package/dist/trace/types.d.ts +243 -0
- package/dist/trace/types.js +13 -0
- package/dist/tui/components/editor-paste.d.ts +2 -0
- package/dist/tui/components/editor-paste.js +6 -3
- package/dist/tui/components/editor.js +2 -2
- package/dist/tui/components/loader.d.ts +3 -0
- package/dist/tui/components/loader.js +14 -0
- package/dist/tui/components/settings-list.d.ts +61 -0
- package/dist/tui/components/settings-list.js +135 -0
- package/dist/tui/keybindings.d.ts +5 -0
- package/dist/tui/keybindings.js +17 -5
- package/dist/tui.d.ts +1 -0
- package/dist/tui.js +2 -0
- package/docs/en/host-api.md +167 -0
- package/docs/en/permissions.md +214 -0
- package/docs/en/providers.md +625 -0
- package/docs/en/rpc.md +361 -0
- package/docs/en/sessions.md +219 -0
- package/docs/en/tui.md +527 -0
- package/docs/host-api.md +18 -17
- package/docs/memory.md +172 -0
- package/docs/permissions.md +2 -2
- package/docs/providers.md +67 -1
- package/docs/rpc.md +31 -3
- package/docs/session-format.md +8 -2
- package/docs/sessions.md +29 -1
- package/docs/tui.md +132 -3
- package/package.json +8 -3
|
@@ -19,21 +19,23 @@ import { buildRegistry, loadUserLevel } from "./context.js";
|
|
|
19
19
|
import { CACHE_PROBE_ACTION } from "./models-cache-probe.js";
|
|
20
20
|
import { DISCOVER_ACTION } from "./models-discover.js";
|
|
21
21
|
import { metadataOf, modelFlags, sourcesLine } from "./model-meta.js";
|
|
22
|
+
import { msg } from "../../i18n/index.js";
|
|
22
23
|
const COMMON_VALUE_OPTIONS = ["profile", "auth-file"];
|
|
23
24
|
export const CHECK_TIMEOUT_MS = 30_000;
|
|
24
25
|
async function list(io, registry, only) {
|
|
25
26
|
const providers = registry.list().filter((p) => only === undefined || p.id === only);
|
|
26
27
|
if (only !== undefined && providers.length === 0) {
|
|
27
|
-
io.stderr(
|
|
28
|
+
io.stderr(msg().subcommands.common.providerNotFound(only));
|
|
28
29
|
return ExitCode.NoModel;
|
|
29
30
|
}
|
|
30
31
|
for (const provider of providers) {
|
|
31
32
|
const key = await registry.resolveApiKey(provider.id);
|
|
33
|
+
const t = msg().subcommands.models;
|
|
32
34
|
const keyText = key.apiKey !== undefined
|
|
33
|
-
?
|
|
35
|
+
? t.keyFrom(key.source, key.origin)
|
|
34
36
|
: provider.requiresApiKey
|
|
35
|
-
?
|
|
36
|
-
:
|
|
37
|
+
? t.noKey
|
|
38
|
+
: t.keyNotNeeded;
|
|
37
39
|
io.stdout(`${provider.id} ${provider.api} ${keyText}\n`);
|
|
38
40
|
for (const channel of provider.channels ?? [])
|
|
39
41
|
io.stdout(` @${channel.name} ${channel.api} ${channel.baseUrl}\n`);
|
|
@@ -49,19 +51,18 @@ async function list(io, registry, only) {
|
|
|
49
51
|
async function check(io, registry, ref) {
|
|
50
52
|
const found = registry.findModel(ref);
|
|
51
53
|
if (!found.ok) {
|
|
52
|
-
|
|
53
|
-
io.stderr(`ama: 模型不存在:${ref}${hint}\n`);
|
|
54
|
+
io.stderr(msg().subcommands.common.modelNotFound(ref, found.candidates.slice(0, 10)));
|
|
54
55
|
return ExitCode.NoModel;
|
|
55
56
|
}
|
|
56
57
|
const { model, provider } = found;
|
|
57
58
|
const key = await registry.resolveApiKey(provider.id, model.channel);
|
|
58
59
|
if (key.apiKey === undefined && provider.requiresApiKey) {
|
|
59
|
-
io.stderr(
|
|
60
|
+
io.stderr(msg().subcommands.common.noApiKey(provider.id));
|
|
60
61
|
return ExitCode.NoModel;
|
|
61
62
|
}
|
|
62
63
|
const api = registry.getApi(model.api);
|
|
63
64
|
if (api === undefined) {
|
|
64
|
-
io.stderr(
|
|
65
|
+
io.stderr(msg().subcommands.common.apiNotImplemented(model.api));
|
|
65
66
|
return ExitCode.RuntimeError;
|
|
66
67
|
}
|
|
67
68
|
const started = Date.now();
|
|
@@ -74,11 +75,11 @@ async function check(io, registry, ref) {
|
|
|
74
75
|
const message = await stream.result();
|
|
75
76
|
const ms = Date.now() - started;
|
|
76
77
|
if (message.stopReason === "error" || message.stopReason === "aborted") {
|
|
77
|
-
io.stderr(
|
|
78
|
+
io.stderr(msg().subcommands.models.checkFailed(`${provider.id}/${model.id}`, ms, message.errorMessage ?? message.stopReason));
|
|
78
79
|
return ExitCode.RuntimeError;
|
|
79
80
|
}
|
|
80
81
|
const shown = formatModelRef(modelRefOf(model));
|
|
81
|
-
io.stdout(
|
|
82
|
+
io.stdout(msg().subcommands.models.checkOk(shown, model.api, ms, message.stopReason));
|
|
82
83
|
return ExitCode.Ok;
|
|
83
84
|
}
|
|
84
85
|
/**
|
|
@@ -94,7 +95,7 @@ const REFRESH_ACTION = {
|
|
|
94
95
|
?.split(",")
|
|
95
96
|
.map((p) => p.trim())
|
|
96
97
|
.filter(Boolean);
|
|
97
|
-
ctx.io.stdout(
|
|
98
|
+
ctx.io.stdout(msg().subcommands.models.refreshing(snapshotMeta().fetchedAt));
|
|
98
99
|
const result = await refreshModelsDev({
|
|
99
100
|
dataDir: ctx.level.dataDir,
|
|
100
101
|
env: ctx.io.env,
|
|
@@ -105,7 +106,7 @@ const REFRESH_ACTION = {
|
|
|
105
106
|
ctx.io.stdout(`${describeRefresh(result)}\n`);
|
|
106
107
|
if (result.status === "failed")
|
|
107
108
|
return ExitCode.RuntimeError;
|
|
108
|
-
ctx.io.stdout(
|
|
109
|
+
ctx.io.stdout(msg().subcommands.models.written(modelsDevCachePath(ctx.level.dataDir)));
|
|
109
110
|
return ExitCode.Ok;
|
|
110
111
|
},
|
|
111
112
|
};
|
|
@@ -124,11 +125,17 @@ export const MODELS_ACTIONS = Object.freeze({
|
|
|
124
125
|
discover: DISCOVER_ACTION,
|
|
125
126
|
"cache-probe": CACHE_PROBE_ACTION,
|
|
126
127
|
refresh: REFRESH_ACTION,
|
|
127
|
-
|
|
128
|
+
// 用法行按界面语言取,用 getter(模块级求值会按 import 时的语言定死)
|
|
129
|
+
"refresh-catalog": {
|
|
130
|
+
...REFRESH_ACTION,
|
|
131
|
+
get usage() {
|
|
132
|
+
return msg().subcommands.models.refreshCatalogUsage;
|
|
133
|
+
},
|
|
134
|
+
},
|
|
128
135
|
});
|
|
129
|
-
export
|
|
130
|
-
.map((a) => a.usage)
|
|
131
|
-
|
|
136
|
+
export function modelsUsage() {
|
|
137
|
+
return msg().subcommands.models.usage(Object.values(MODELS_ACTIONS).map((a) => a.usage));
|
|
138
|
+
}
|
|
132
139
|
function unique(lists) {
|
|
133
140
|
return [...new Set(lists.flatMap((l) => l ?? []))];
|
|
134
141
|
}
|
|
@@ -137,12 +144,12 @@ export async function runModels(argv, io, deps) {
|
|
|
137
144
|
const { positionals, values, flags } = parseSubArgs(argv, unique([...actions.map((a) => a.valueOptions), COMMON_VALUE_OPTIONS]), unique(actions.map((a) => a.flagOptions)));
|
|
138
145
|
const name = positionals[0];
|
|
139
146
|
if (flags.has("help") || name === undefined) {
|
|
140
|
-
io.stdout(
|
|
147
|
+
io.stdout(modelsUsage());
|
|
141
148
|
return flags.has("help") ? ExitCode.Ok : ExitCode.Usage;
|
|
142
149
|
}
|
|
143
150
|
const action = Object.hasOwn(MODELS_ACTIONS, name) ? MODELS_ACTIONS[name] : undefined;
|
|
144
151
|
if (action === undefined)
|
|
145
|
-
throw new UsageError(
|
|
152
|
+
throw new UsageError(msg().subcommands.common.unknownSubcommand("models", name));
|
|
146
153
|
// 选项按全部动作的并集解析;这里再拒绝不属于本动作的(如 `list --json`)。
|
|
147
154
|
for (const option of [...values.keys(), ...flags]) {
|
|
148
155
|
const own = [
|
|
@@ -151,13 +158,13 @@ export async function runModels(argv, io, deps) {
|
|
|
151
158
|
...(action.flagOptions ?? []),
|
|
152
159
|
];
|
|
153
160
|
if (!own.includes(option))
|
|
154
|
-
throw new UsageError(
|
|
161
|
+
throw new UsageError(msg().subcommands.common.unknownOption(option));
|
|
155
162
|
}
|
|
156
163
|
const args = positionals.slice(1);
|
|
157
164
|
if (action.required !== undefined && args[0] === undefined)
|
|
158
|
-
throw new UsageError(`ama models ${name}
|
|
165
|
+
throw new UsageError(msg().subcommands.common.needsArg(`ama models ${name}`, action.required));
|
|
159
166
|
if (deps === undefined) {
|
|
160
|
-
io.stderr("
|
|
167
|
+
io.stderr(msg().subcommands.common.notAssembled("models"));
|
|
161
168
|
return ExitCode.RuntimeError;
|
|
162
169
|
}
|
|
163
170
|
const level = loadUserLevel(io, {
|
|
@@ -165,7 +172,7 @@ export async function runModels(argv, io, deps) {
|
|
|
165
172
|
authFile: values.get("auth-file"),
|
|
166
173
|
});
|
|
167
174
|
for (const warning of level.warnings)
|
|
168
|
-
io.stderr(
|
|
175
|
+
io.stderr(msg().subcommands.common.warning(warning));
|
|
169
176
|
const registry = await buildRegistry(level, io, deps);
|
|
170
177
|
return action.run({ io, registry, level, args, values, flags });
|
|
171
178
|
}
|
|
@@ -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">;
|