@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
|
@@ -14,6 +14,7 @@ import { priceTokens } from "../../ai/cost.js";
|
|
|
14
14
|
import { UsageError } from "../args.js";
|
|
15
15
|
import { confirmContinue } from "../choice-prompt.js";
|
|
16
16
|
import { ExitCode } from "../exit-codes.js";
|
|
17
|
+
import { msg } from "../../i18n/index.js";
|
|
17
18
|
export const PROBE_DEFAULT_TOKENS = 2048;
|
|
18
19
|
export const PROBE_DEFAULT_GAP_MS = 3000;
|
|
19
20
|
export const PROBE_REQUEST_TIMEOUT_MS = 60_000;
|
|
@@ -56,17 +57,16 @@ export function judgeProbe(first, second) {
|
|
|
56
57
|
return any === 0 ? "silent" : "inconclusive";
|
|
57
58
|
}
|
|
58
59
|
export function probeAdvice(verdict, model, samples = []) {
|
|
60
|
+
const t = msg().subcommands.cacheProbe;
|
|
59
61
|
if (verdict === "silent") {
|
|
60
62
|
// 实测:同一中转的 Kimi 间隔 3 s 两次都是 0、间隔更久才命中——字段存在时提示写入延迟的可能
|
|
61
|
-
const present = samples.some((s) => s.cacheReported === true)
|
|
62
|
-
|
|
63
|
-
: "";
|
|
64
|
-
return `可在 config 里设 providers.${model.provider}.compat.cacheReporting: "silent",状态栏将显示未报告${present}`;
|
|
63
|
+
const present = samples.some((s) => s.cacheReported === true);
|
|
64
|
+
return t.adviceSilent(model.provider, present);
|
|
65
65
|
}
|
|
66
66
|
if (verdict === "inconclusive")
|
|
67
|
-
return
|
|
67
|
+
return t.adviceInconclusive;
|
|
68
68
|
if (model.promptCache === undefined)
|
|
69
|
-
return
|
|
69
|
+
return t.advicePromptCache(model.provider, model.id);
|
|
70
70
|
return undefined;
|
|
71
71
|
}
|
|
72
72
|
function intOption(ctx, name, fallback, min) {
|
|
@@ -75,12 +75,13 @@ function intOption(ctx, name, fallback, min) {
|
|
|
75
75
|
return fallback;
|
|
76
76
|
const value = Number(raw);
|
|
77
77
|
if (!Number.isInteger(value) || value < min)
|
|
78
|
-
throw new UsageError(
|
|
78
|
+
throw new UsageError(msg().subcommands.cacheProbe.intAtLeast(name, min));
|
|
79
79
|
return value;
|
|
80
80
|
}
|
|
81
81
|
function sampleLine(index, s) {
|
|
82
|
-
const
|
|
83
|
-
|
|
82
|
+
const t = msg().subcommands.cacheProbe;
|
|
83
|
+
const field = s.cacheReported === undefined ? "?" : s.cacheReported ? t.yes : t.no;
|
|
84
|
+
return t.sample(index, s.input, s.cacheRead, s.cacheWrite, field);
|
|
84
85
|
}
|
|
85
86
|
async function run(ctx) {
|
|
86
87
|
const { io, registry } = ctx;
|
|
@@ -90,31 +91,33 @@ async function run(ctx) {
|
|
|
90
91
|
const json = ctx.flags.has("json");
|
|
91
92
|
const found = registry.findModel(ref);
|
|
92
93
|
if (!found.ok) {
|
|
93
|
-
io.stderr(
|
|
94
|
+
io.stderr(msg().subcommands.common.modelNotFound(ref));
|
|
94
95
|
return ExitCode.NoModel;
|
|
95
96
|
}
|
|
96
97
|
const { model, provider } = found;
|
|
97
98
|
const key = await registry.resolveApiKey(provider.id, model.channel);
|
|
98
99
|
if (key.apiKey === undefined && provider.requiresApiKey) {
|
|
99
|
-
io.stderr(
|
|
100
|
+
io.stderr(msg().subcommands.common.noApiKey(provider.id));
|
|
100
101
|
return ExitCode.NoModel;
|
|
101
102
|
}
|
|
102
103
|
const api = registry.getApi(model.api);
|
|
103
104
|
if (api === undefined) {
|
|
104
|
-
io.stderr(
|
|
105
|
+
io.stderr(msg().subcommands.common.apiNotImplemented(model.api));
|
|
105
106
|
return ExitCode.RuntimeError;
|
|
106
107
|
}
|
|
107
108
|
const estimate = priceTokens(model, { input: tokens * 2, output: 32 });
|
|
108
109
|
const name = `${provider.id}/${model.id}`;
|
|
109
|
-
const
|
|
110
|
+
const t = msg().subcommands.cacheProbe;
|
|
111
|
+
const cost = estimate === undefined ? "$?" : `$${estimate.toFixed(4)}`;
|
|
112
|
+
const head = t.head(name, model.api, tokens, gapMs, cost);
|
|
110
113
|
(json ? io.stderr : io.stdout)(head);
|
|
111
114
|
if (!ctx.flags.has("yes")) {
|
|
112
115
|
if (!io.stdinIsTTY) {
|
|
113
|
-
io.stderr(
|
|
116
|
+
io.stderr(t.needsYes);
|
|
114
117
|
return ExitCode.Usage;
|
|
115
118
|
}
|
|
116
119
|
if (!(await confirmContinue({ env: io.env }))) {
|
|
117
|
-
io.stderr(
|
|
120
|
+
io.stderr(msg().subcommands.common.cancelled);
|
|
118
121
|
return ExitCode.Ok;
|
|
119
122
|
}
|
|
120
123
|
}
|
|
@@ -136,7 +139,7 @@ async function run(ctx) {
|
|
|
136
139
|
})
|
|
137
140
|
.result();
|
|
138
141
|
if (message.stopReason === "error" || message.stopReason === "aborted") {
|
|
139
|
-
io.stderr(
|
|
142
|
+
io.stderr(t.requestFailed(i + 1, message.errorMessage ?? message.stopReason));
|
|
140
143
|
return ExitCode.RuntimeError;
|
|
141
144
|
}
|
|
142
145
|
samples.push(sampleOf(message.usage));
|
|
@@ -161,14 +164,14 @@ async function run(ctx) {
|
|
|
161
164
|
return ExitCode.Ok;
|
|
162
165
|
}
|
|
163
166
|
const share = first.promptTokens > 0
|
|
164
|
-
?
|
|
167
|
+
? t.share(Math.round((second.cacheRead / first.promptTokens) * 100))
|
|
165
168
|
: "";
|
|
166
169
|
io.stdout([
|
|
167
170
|
sampleLine(1, first),
|
|
168
171
|
sampleLine(2, second),
|
|
169
|
-
...(fields.length > 0 ? [
|
|
170
|
-
|
|
171
|
-
...(advice !== undefined ? [
|
|
172
|
+
...(fields.length > 0 ? [t.usageFields(model.api, fields)] : []),
|
|
173
|
+
t.verdict(verdict, share),
|
|
174
|
+
...(advice !== undefined ? [t.advice(advice)] : []),
|
|
172
175
|
].join("\n") + "\n");
|
|
173
176
|
return ExitCode.Ok;
|
|
174
177
|
}
|
|
@@ -16,6 +16,10 @@
|
|
|
16
16
|
*
|
|
17
17
|
* models.dev:列表之后按需刷新缓存(24 小时内不重拉),每个模型标出上下文、输出、图片、工具调用与
|
|
18
18
|
* 匹配结果;`--write` 跳过 models.dev 标明不支持工具调用的模型。元数据不写进配置——运行时从缓存补。
|
|
19
|
+
*
|
|
20
|
+
* [W6-O] `chatgpt`:按登录的 flavor 调对应后端的模型列表(SIWC `GET /v1/models` 筛 `visibility: list`;codex
|
|
21
|
+
* `GET /models?client_version=…`),只取 slug 与显示名;`--probe` 不适用(订阅后端只有一种协议)。结果另写进
|
|
22
|
+
* 发现缓存 `<dataDir>/models/discovered/chatgpt.json`(discovered-cache.ts),`/model` 选择器由此列出。
|
|
19
23
|
*/
|
|
20
24
|
import type { Api, Model, ProviderData, ProviderRegistryApi } from "../../ai/types.js";
|
|
21
25
|
import type { ModelsAction } from "./models.js";
|
|
@@ -16,9 +16,17 @@
|
|
|
16
16
|
*
|
|
17
17
|
* models.dev:列表之后按需刷新缓存(24 小时内不重拉),每个模型标出上下文、输出、图片、工具调用与
|
|
18
18
|
* 匹配结果;`--write` 跳过 models.dev 标明不支持工具调用的模型。元数据不写进配置——运行时从缓存补。
|
|
19
|
+
*
|
|
20
|
+
* [W6-O] `chatgpt`:按登录的 flavor 调对应后端的模型列表(SIWC `GET /v1/models` 筛 `visibility: list`;codex
|
|
21
|
+
* `GET /models?client_version=…`),只取 slug 与显示名;`--probe` 不适用(订阅后端只有一种协议)。结果另写进
|
|
22
|
+
* 发现缓存 `<dataDir>/models/discovered/chatgpt.json`(discovered-cache.ts),`/model` 选择器由此列出。
|
|
19
23
|
*/
|
|
20
24
|
import { authHeaders, mergeHeaders } from "../../ai/http.js";
|
|
25
|
+
import { listChatGptModels } from "../../auth/chatgpt/backend-client.js";
|
|
26
|
+
import { CHATGPT_PROVIDER_ID } from "../../auth/chatgpt/presets.js";
|
|
27
|
+
import { liveToken } from "../../auth/oauth/live.js";
|
|
21
28
|
import { discoverLocalModels, materializeModel } from "../../ai/providers/registry.js";
|
|
29
|
+
import { writeDiscoveredCache } from "../../ai/providers/discovered-cache.js";
|
|
22
30
|
import { withCustomDefaults } from "../../ai/providers/catalog.js";
|
|
23
31
|
import { describeModelsDev, loadModelsDevIndex } from "../../ai/providers/models-dev-cache.js";
|
|
24
32
|
import { matchLabel, modelsDevFields } from "../../ai/providers/models-dev.js";
|
|
@@ -26,6 +34,7 @@ import { existsSync } from "node:fs";
|
|
|
26
34
|
import { loadConfigFile } from "../../config/load.js";
|
|
27
35
|
import { writeConfigFile } from "../../config/write.js";
|
|
28
36
|
import { UsageError } from "../args.js";
|
|
37
|
+
import { msg } from "../../i18n/index.js";
|
|
29
38
|
import { ExitCode } from "../exit-codes.js";
|
|
30
39
|
import { compactTokens } from "./model-meta.js";
|
|
31
40
|
import { describeProbePlan, parseProbeTuning, ProbeProgress, ProbeScheduler, } from "./probe-runner.js";
|
|
@@ -47,6 +56,23 @@ export function modelsUrl(provider) {
|
|
|
47
56
|
}
|
|
48
57
|
export async function discoverModels(provider, apiKey, options = {}) {
|
|
49
58
|
const timeoutMs = options.timeoutMs ?? DISCOVER_TIMEOUT_MS;
|
|
59
|
+
if (provider.id === CHATGPT_PROVIDER_ID && apiKey !== undefined) {
|
|
60
|
+
const live = liveToken(apiKey);
|
|
61
|
+
const flavor = live?.flavor ?? (provider.defaultChannel === "codex" ? "codex" : "siwc");
|
|
62
|
+
const channel = provider.channels?.find((c) => c.name === flavor);
|
|
63
|
+
const models = await listChatGptModels(fetch, channel?.baseUrl ?? provider.baseUrl, {
|
|
64
|
+
flavor,
|
|
65
|
+
accessToken: apiKey,
|
|
66
|
+
accountId: live?.accountId,
|
|
67
|
+
originator: channel?.headers?.["originator"],
|
|
68
|
+
});
|
|
69
|
+
return models.map((m) => {
|
|
70
|
+
const model = withCustomDefaults({ id: m.id }, provider.id, provider.api);
|
|
71
|
+
if (m.name !== undefined)
|
|
72
|
+
model.name = m.name;
|
|
73
|
+
return model;
|
|
74
|
+
});
|
|
75
|
+
}
|
|
50
76
|
if (!provider.requiresApiKey && apiKey === undefined)
|
|
51
77
|
return discoverLocalModels(provider, { timeoutMs });
|
|
52
78
|
const anthropic = provider.api === "anthropic-messages";
|
|
@@ -114,17 +140,18 @@ function parseLimit(raw) {
|
|
|
114
140
|
return DEFAULT_PROBE_LIMIT;
|
|
115
141
|
const n = Number(raw);
|
|
116
142
|
if (!Number.isInteger(n) || n < 1)
|
|
117
|
-
throw new UsageError(
|
|
143
|
+
throw new UsageError(msg().subcommands.discover.limitPositive(raw));
|
|
118
144
|
return n;
|
|
119
145
|
}
|
|
120
146
|
/** 把新条目合并进用户级 config.json;返回写入条数。 */
|
|
121
147
|
function writeEntries(ctx, provider, entries, notes) {
|
|
122
148
|
const { io } = ctx;
|
|
149
|
+
const m = msg().subcommands.discover;
|
|
123
150
|
const path = ctx.level.userConfigPath;
|
|
124
151
|
const config = structuredClone(loadConfigFile("config", path)?.value ?? { version: 1 });
|
|
125
152
|
const providers = (config.providers ??= {});
|
|
126
153
|
if (providers[provider.id] === undefined && !provider.builtin) {
|
|
127
|
-
io.stderr(
|
|
154
|
+
io.stderr(m.notInUserConfig(provider.id, path));
|
|
128
155
|
return 0;
|
|
129
156
|
}
|
|
130
157
|
const target = (providers[provider.id] ??= {});
|
|
@@ -133,34 +160,33 @@ function writeEntries(ctx, provider, entries, notes) {
|
|
|
133
160
|
const added = entries.filter((entry) => !existing.has(entry.id));
|
|
134
161
|
const kept = entries.length - added.length;
|
|
135
162
|
if (added.length === 0) {
|
|
136
|
-
io.stdout(
|
|
163
|
+
io.stdout(m.nothingToWrite(kept));
|
|
137
164
|
return 0;
|
|
138
165
|
}
|
|
139
166
|
models.push(...added);
|
|
140
167
|
const backup = existsSync(path);
|
|
141
168
|
writeConfigFile(path, config, { backup: true });
|
|
142
|
-
io.stdout(
|
|
143
|
-
`${kept > 0 ? `,${kept} 个已存在未覆盖` : ""}${backup ? `(原文件备份为 ${path}.bak)` : ""}\n`);
|
|
169
|
+
io.stdout(m.written(path, provider.id, added.length, kept, backup));
|
|
144
170
|
if (notes.noTools.size > 0)
|
|
145
|
-
io.stdout(
|
|
171
|
+
io.stdout(m.skippedNoTools([...notes.noTools].join(", ")));
|
|
146
172
|
const blind = added.filter((entry) => notes.unmatched.has(entry.id)).map((entry) => entry.id);
|
|
147
173
|
if (blind.length > 0)
|
|
148
|
-
io.stderr(
|
|
149
|
-
`需要时在 config.json 里补上或写 modelsDev\n`);
|
|
174
|
+
io.stderr(m.unmatchedWarning(blind.join(", ")));
|
|
150
175
|
return added.length;
|
|
151
176
|
}
|
|
152
177
|
async function run(ctx) {
|
|
153
178
|
const { io, registry } = ctx;
|
|
179
|
+
const m = msg().subcommands.discover;
|
|
154
180
|
const id = ctx.args[0] ?? "";
|
|
155
181
|
const limit = parseLimit(ctx.values.get("limit"));
|
|
156
182
|
const provider = registry.get(id);
|
|
157
183
|
if (provider === undefined) {
|
|
158
|
-
io.stderr(
|
|
184
|
+
io.stderr(msg().subcommands.common.providerNotFound(id));
|
|
159
185
|
return ExitCode.NoModel;
|
|
160
186
|
}
|
|
161
187
|
const key = await registry.resolveApiKey(provider.id);
|
|
162
188
|
if (key.apiKey === undefined && provider.requiresApiKey) {
|
|
163
|
-
io.stderr(
|
|
189
|
+
io.stderr(msg().subcommands.common.noApiKey(provider.id));
|
|
164
190
|
return ExitCode.NoModel;
|
|
165
191
|
}
|
|
166
192
|
let found;
|
|
@@ -168,11 +194,13 @@ async function run(ctx) {
|
|
|
168
194
|
found = await discoverModels(provider, key.apiKey);
|
|
169
195
|
}
|
|
170
196
|
catch (error) {
|
|
171
|
-
io.stderr(
|
|
197
|
+
io.stderr(m.listFailed(provider.id, error.message));
|
|
172
198
|
return ExitCode.RuntimeError;
|
|
173
199
|
}
|
|
174
200
|
const configured = new Map(provider.models.map((m) => [m.id, m]));
|
|
175
|
-
io.stdout(
|
|
201
|
+
io.stdout(m.found(provider.id, found.length, modelsUrl(provider)));
|
|
202
|
+
if (provider.id === CHATGPT_PROVIDER_ID)
|
|
203
|
+
cacheChatGpt(ctx, found, key.apiKey);
|
|
176
204
|
// models.dev 只读本地(快照 ⊕ `ama models refresh` 的覆盖),不联网。
|
|
177
205
|
const mdIndex = loadModelsDevIndex(ctx.level.dataDir);
|
|
178
206
|
io.stdout(`${describeModelsDev(ctx.level.dataDir)}\n`);
|
|
@@ -187,14 +215,14 @@ async function run(ctx) {
|
|
|
187
215
|
if (match === undefined)
|
|
188
216
|
unmatched.add(model.id);
|
|
189
217
|
const meta = fields === undefined
|
|
190
|
-
?
|
|
218
|
+
? m.unmatched
|
|
191
219
|
: ` ctx ${compactTokens(fields.contextWindow)} · out ${compactTokens(fields.maxTokens)}` +
|
|
192
|
-
`${fields.input?.includes("image") ?
|
|
193
|
-
`${fields.toolCall === false ?
|
|
194
|
-
io.stdout(` ${model.id}${known !== undefined ?
|
|
220
|
+
`${fields.input?.includes("image") ? m.image : ""}${fields.reasoning ? m.reasoning : ""}` +
|
|
221
|
+
`${fields.toolCall === false ? m.noTools : ""} · ${matchLabel(match)}`;
|
|
222
|
+
io.stdout(` ${model.id}${known !== undefined ? m.configured(known.api) : ""}${meta}\n`);
|
|
195
223
|
}
|
|
196
224
|
const write = ctx.flags.has("write");
|
|
197
|
-
if (!ctx.flags.has("probe")) {
|
|
225
|
+
if (!ctx.flags.has("probe") || provider.id === CHATGPT_PROVIDER_ID) {
|
|
198
226
|
if (write)
|
|
199
227
|
writeEntries(ctx, provider, found.filter((m) => !noTools.has(m.id)).map((m) => ({ id: m.id })), { noTools, unmatched });
|
|
200
228
|
return ExitCode.Ok;
|
|
@@ -203,15 +231,14 @@ async function run(ctx) {
|
|
|
203
231
|
const count = Math.min(limit, ids.length);
|
|
204
232
|
const order = probeOrder(provider);
|
|
205
233
|
const tuning = parseProbeTuning(ctx.values);
|
|
206
|
-
io.stdout(
|
|
207
|
-
`${ids.length > count ? `;另有 ${ids.length - count} 个超出 --limit ${limit},未探测` : ""}\n` +
|
|
234
|
+
io.stdout(m.probeHeader(count, order.join(" → "), count * order.length, ids.length - count, limit) +
|
|
208
235
|
`${describeProbePlan(count * order.length, tuning.concurrency, tuning.timeoutMs)}\n`);
|
|
209
236
|
let stopped;
|
|
210
237
|
const progress = new ProbeProgress(io.stdout, io.stdoutIsTTY, count);
|
|
211
238
|
const probed = await probeModelApis(registry, provider, ids, limit, {
|
|
212
239
|
...tuning,
|
|
213
240
|
onSettled: () => progress.tick(),
|
|
214
|
-
onResult: (modelId, api) => progress.line(` ${modelId} ${api ??
|
|
241
|
+
onResult: (modelId, api) => progress.line(` ${modelId} ${api ?? m.unavailable}\n`),
|
|
215
242
|
onStop: (reason) => (stopped = reason),
|
|
216
243
|
});
|
|
217
244
|
progress.finish();
|
|
@@ -224,11 +251,23 @@ async function run(ctx) {
|
|
|
224
251
|
writeEntries(ctx, provider, entries, { noTools, unmatched });
|
|
225
252
|
}
|
|
226
253
|
if (stopped !== undefined) {
|
|
227
|
-
io.stderr(
|
|
254
|
+
io.stderr(m.probeStopped(stopped));
|
|
228
255
|
return ExitCode.RuntimeError;
|
|
229
256
|
}
|
|
230
257
|
return ExitCode.Ok;
|
|
231
258
|
}
|
|
259
|
+
/** chatgpt 的发现结果写进发现缓存(选择器与注册表读它);写失败不影响列表输出。 */
|
|
260
|
+
function cacheChatGpt(ctx, found, apiKey) {
|
|
261
|
+
try {
|
|
262
|
+
const flavor = liveToken(apiKey)?.flavor;
|
|
263
|
+
const models = found.map((m) => ({ id: m.id, ...(m.name !== m.id ? { name: m.name } : {}) }));
|
|
264
|
+
const path = writeDiscoveredCache(ctx.level.dataDir, CHATGPT_PROVIDER_ID, { models, flavor });
|
|
265
|
+
ctx.io.stdout(msg().subcommands.discover.cached(path));
|
|
266
|
+
}
|
|
267
|
+
catch (error) {
|
|
268
|
+
ctx.io.stderr(`ama: ${error.message}\n`);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
232
271
|
export const DISCOVER_ACTION = {
|
|
233
272
|
usage: "ama models discover <provider> [--probe] [--write] [--limit <n>] [--concurrency <n>] [--probe-timeout <ms>]",
|
|
234
273
|
required: "<provider>",
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ama models enable <ref…>` / `ama models disable <ref…>` / `ama models list --enabled`:编辑与查看用户级
|
|
3
|
+
* `models.enabled`(模型选择器的显式清单,见 ai/providers/model-visibility.ts)。
|
|
4
|
+
*
|
|
5
|
+
* 写回走 config/edit.ts(重读目标文件、校验、`.bak` 备份、原子写);`models` 只认用户级,没有 `--project`。
|
|
6
|
+
* 引用要是 `provider/model[@channel]` 或 `provider/*`,供应商必须存在;模型不在模型表里只警告(中转站与
|
|
7
|
+
* 订阅后端接受任意 id)。清单移空时删掉这个键。
|
|
8
|
+
*/
|
|
9
|
+
import type { ModelsAction, ModelsActionContext } from "./models.js";
|
|
10
|
+
/** `ama models list --enabled`:清单(及各项供应商状态);没设清单时列出选择器缺省显示的模型。 */
|
|
11
|
+
export declare function listEnabled(ctx: ModelsActionContext): Promise<number>;
|
|
12
|
+
export declare const ENABLE_ACTION: ModelsAction;
|
|
13
|
+
export declare const DISABLE_ACTION: ModelsAction;
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ama models enable <ref…>` / `ama models disable <ref…>` / `ama models list --enabled`:编辑与查看用户级
|
|
3
|
+
* `models.enabled`(模型选择器的显式清单,见 ai/providers/model-visibility.ts)。
|
|
4
|
+
*
|
|
5
|
+
* 写回走 config/edit.ts(重读目标文件、校验、`.bak` 备份、原子写);`models` 只认用户级,没有 `--project`。
|
|
6
|
+
* 引用要是 `provider/model[@channel]` 或 `provider/*`,供应商必须存在;模型不在模型表里只警告(中转站与
|
|
7
|
+
* 订阅后端接受任意 id)。清单移空时删掉这个键。
|
|
8
|
+
*/
|
|
9
|
+
import { accessReady, addEnabled, enabledList, providerAccess, removeEnabled, splitEnabledRef, } from "../../ai/providers/model-visibility.js";
|
|
10
|
+
import { readSnapshot, setConfigValue } from "../../config/edit.js";
|
|
11
|
+
import { MODELS_ENABLED_REF } from "../../config/types-w5.js";
|
|
12
|
+
import { msg } from "../../i18n/index.js";
|
|
13
|
+
import { UsageError } from "../args.js";
|
|
14
|
+
import { ExitCode } from "../exit-codes.js";
|
|
15
|
+
function layerInput(ctx) {
|
|
16
|
+
const input = {
|
|
17
|
+
configDir: ctx.level.configDir,
|
|
18
|
+
cwd: ctx.io.cwd,
|
|
19
|
+
env: ctx.io.env,
|
|
20
|
+
};
|
|
21
|
+
if (ctx.level.profile !== undefined) {
|
|
22
|
+
input.profile = { config: ctx.level.profile.config };
|
|
23
|
+
input.hasProfile = true;
|
|
24
|
+
}
|
|
25
|
+
return input;
|
|
26
|
+
}
|
|
27
|
+
/** 校验引用;供应商不存在返回退出码,模型不在表里只警告。 */
|
|
28
|
+
function checkRefs(ctx, refs) {
|
|
29
|
+
const m = msg().subcommands.modelsEnabled;
|
|
30
|
+
for (const ref of refs) {
|
|
31
|
+
const parts = splitEnabledRef(ref);
|
|
32
|
+
if (!MODELS_ENABLED_REF.test(ref) || parts === undefined)
|
|
33
|
+
throw new UsageError(m.badRef(ref));
|
|
34
|
+
const provider = ctx.registry.get(parts.provider);
|
|
35
|
+
if (provider === undefined) {
|
|
36
|
+
ctx.io.stderr(msg().subcommands.common.providerNotFound(parts.provider));
|
|
37
|
+
return ExitCode.NoModel;
|
|
38
|
+
}
|
|
39
|
+
if (parts.model !== "*" &&
|
|
40
|
+
provider.models.length > 0 &&
|
|
41
|
+
!provider.models.some((model) => model.id === parts.model))
|
|
42
|
+
ctx.io.stderr(m.unknownModel(ref));
|
|
43
|
+
}
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
function userList(input) {
|
|
47
|
+
return enabledList(readSnapshot(input).user?.models?.enabled);
|
|
48
|
+
}
|
|
49
|
+
async function enable(ctx) {
|
|
50
|
+
const m = msg().subcommands.modelsEnabled;
|
|
51
|
+
const refs = [...new Set(ctx.args)];
|
|
52
|
+
const bad = checkRefs(ctx, refs);
|
|
53
|
+
if (bad !== undefined)
|
|
54
|
+
return bad;
|
|
55
|
+
const input = layerInput(ctx);
|
|
56
|
+
const current = userList(input);
|
|
57
|
+
const fresh = refs.filter((ref) => !(current ?? []).includes(ref));
|
|
58
|
+
if (fresh.length === 0) {
|
|
59
|
+
ctx.io.stdout(m.alreadyListed(refs.join(", ")));
|
|
60
|
+
return ExitCode.Ok;
|
|
61
|
+
}
|
|
62
|
+
const result = setConfigValue({
|
|
63
|
+
...input,
|
|
64
|
+
scope: "user",
|
|
65
|
+
key: "models.enabled",
|
|
66
|
+
value: addEnabled(current, fresh),
|
|
67
|
+
});
|
|
68
|
+
ctx.io.stdout(m.added(fresh.join(", "), result.path));
|
|
69
|
+
return ExitCode.Ok;
|
|
70
|
+
}
|
|
71
|
+
async function disable(ctx) {
|
|
72
|
+
const m = msg().subcommands.modelsEnabled;
|
|
73
|
+
const refs = [...new Set(ctx.args)];
|
|
74
|
+
for (const ref of refs)
|
|
75
|
+
if (!MODELS_ENABLED_REF.test(ref))
|
|
76
|
+
throw new UsageError(m.badRef(ref));
|
|
77
|
+
const input = layerInput(ctx);
|
|
78
|
+
const current = userList(input) ?? [];
|
|
79
|
+
const listed = refs.filter((ref) => current.includes(ref));
|
|
80
|
+
const missing = refs.filter((ref) => !current.includes(ref));
|
|
81
|
+
if (missing.length > 0)
|
|
82
|
+
ctx.io.stderr(m.notListed(missing.join(", ")));
|
|
83
|
+
if (listed.length === 0)
|
|
84
|
+
return missing.length > 0 ? ExitCode.RuntimeError : ExitCode.Ok;
|
|
85
|
+
const next = removeEnabled(current, listed);
|
|
86
|
+
const result = setConfigValue({ ...input, scope: "user", key: "models.enabled", value: next });
|
|
87
|
+
ctx.io.stdout(next === undefined ? m.cleared(result.path) : m.removed(listed.join(", "), result.path));
|
|
88
|
+
return ExitCode.Ok;
|
|
89
|
+
}
|
|
90
|
+
/** `ama models list --enabled`:清单(及各项供应商状态);没设清单时列出选择器缺省显示的模型。 */
|
|
91
|
+
export async function listEnabled(ctx) {
|
|
92
|
+
const m = msg().subcommands.modelsEnabled;
|
|
93
|
+
const labels = msg().panels.model;
|
|
94
|
+
const list = enabledList(ctx.level.merged.config.models?.enabled);
|
|
95
|
+
const status = async (providerId) => {
|
|
96
|
+
const provider = ctx.registry.get(providerId);
|
|
97
|
+
if (provider === undefined)
|
|
98
|
+
return "?";
|
|
99
|
+
const access = await providerAccess(ctx.registry, provider);
|
|
100
|
+
return access === "none" ? labels.noKey : labels[access];
|
|
101
|
+
};
|
|
102
|
+
if (list !== undefined) {
|
|
103
|
+
ctx.io.stdout(m.listHeader(ctx.level.userConfigPath));
|
|
104
|
+
for (const ref of list) {
|
|
105
|
+
const parts = splitEnabledRef(ref);
|
|
106
|
+
const provider = parts === undefined ? undefined : ctx.registry.get(parts.provider);
|
|
107
|
+
const known = parts === undefined ||
|
|
108
|
+
parts.model === "*" ||
|
|
109
|
+
provider === undefined ||
|
|
110
|
+
provider.models.length === 0 ||
|
|
111
|
+
provider.models.some((model) => model.id === parts.model);
|
|
112
|
+
const notes = [
|
|
113
|
+
parts === undefined ? "?" : await status(parts.provider),
|
|
114
|
+
...(known ? [] : [m.notInTable]),
|
|
115
|
+
];
|
|
116
|
+
ctx.io.stdout(` ${ref} ${notes.join(" · ")}\n`);
|
|
117
|
+
}
|
|
118
|
+
return ExitCode.Ok;
|
|
119
|
+
}
|
|
120
|
+
ctx.io.stdout(m.listUnset);
|
|
121
|
+
let shown = 0;
|
|
122
|
+
for (const provider of ctx.registry.list()) {
|
|
123
|
+
const access = await providerAccess(ctx.registry, provider);
|
|
124
|
+
if (!accessReady(access))
|
|
125
|
+
continue;
|
|
126
|
+
const label = access === "none" ? labels.noKey : labels[access];
|
|
127
|
+
for (const model of provider.models) {
|
|
128
|
+
ctx.io.stdout(` ${provider.id}/${model.id} ${label}\n`);
|
|
129
|
+
shown++;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
if (shown === 0)
|
|
133
|
+
ctx.io.stdout(m.nothing);
|
|
134
|
+
return ExitCode.Ok;
|
|
135
|
+
}
|
|
136
|
+
export const ENABLE_ACTION = {
|
|
137
|
+
usage: "ama models enable <provider/model[@channel]|provider/*>…",
|
|
138
|
+
required: "<provider/model>",
|
|
139
|
+
run: enable,
|
|
140
|
+
};
|
|
141
|
+
export const DISABLE_ACTION = {
|
|
142
|
+
usage: "ama models disable <provider/model[@channel]|provider/*>…",
|
|
143
|
+
required: "<provider/model>",
|
|
144
|
+
run: disable,
|
|
145
|
+
};
|
|
@@ -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 type { ProviderRegistryApi } from "../../ai/types.js";
|
|
14
16
|
import type { CliIo, RuntimeDeps } from "../deps.js";
|
|
@@ -38,5 +40,5 @@ export interface ModelsAction {
|
|
|
38
40
|
export declare const CHECK_TIMEOUT_MS = 30000;
|
|
39
41
|
/** 动作表:键是子命令名,顺序即用法文本顺序。 */
|
|
40
42
|
export declare const MODELS_ACTIONS: Readonly<Record<string, ModelsAction>>;
|
|
41
|
-
export declare
|
|
43
|
+
export declare function modelsUsage(): string;
|
|
42
44
|
export declare function runModels(argv: readonly string[], io: CliIo, deps: Pick<RuntimeDeps, "providers"> | undefined): Promise<number>;
|