@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
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ama memory list|show|edit|rm|path|enable|disable`(docs/wave6-plan.md §3.5)。[W6-M]
|
|
3
|
+
*
|
|
4
|
+
* - 作用域按用户级配置(`memory.scopes`,缺省 user + project);项目作用域以 cwd 定位,需项目已受信任
|
|
5
|
+
* (trust.json 记录),否则跳过并提示。`memory.enabled` 为 false 时照样能看、能改(条目保留但不使用)。
|
|
6
|
+
* - `list` / `show` / `path` 只读;`edit` 在 `$EDITOR` 里改副本,存回时同样查凭据与上限;`rm` 在终端里确认,
|
|
7
|
+
* 非终端需 `--yes`。
|
|
8
|
+
* - `enable` / `disable` 经 `config/edit.ts`(W6-S)改用户级 `config.json` 的 `memory.enabled`(校验、原子写 + `.bak`)。
|
|
9
|
+
*/
|
|
10
|
+
import { loadConfigFile } from "../../config/load.js";
|
|
11
|
+
import { CONFIG_FILE, resolveConfigDir, resolveDataDir, userFile } from "../../config/paths.js";
|
|
12
|
+
import { findTrustEntry, readTrustFile } from "../../config/trust.js";
|
|
13
|
+
import { ConfigEditError, setConfigValue } from "../../config/edit.js";
|
|
14
|
+
import { msg } from "../../i18n/index.js";
|
|
15
|
+
import { editMemory } from "../../memory/edit.js";
|
|
16
|
+
import { logicalPath, projectRootOf, standaloneRoots, } from "../../memory/paths.js";
|
|
17
|
+
import { findOne, listText, memoryErrorText, scopeSummaries } from "../../memory/report.js";
|
|
18
|
+
import { DEFAULT_MEMORY_LIMITS, MemoryStore } from "../../memory/store.js";
|
|
19
|
+
import { editExternally } from "../../modes/interactive/external-editor.js";
|
|
20
|
+
import { parseSubArgs, UsageError } from "../args.js";
|
|
21
|
+
import { confirmContinue } from "../choice-prompt.js";
|
|
22
|
+
import { ExitCode } from "../exit-codes.js";
|
|
23
|
+
function load(io) {
|
|
24
|
+
const configDir = resolveConfigDir({ env: io.env });
|
|
25
|
+
const dataDir = resolveDataDir({ env: io.env });
|
|
26
|
+
const configPath = userFile({ configDir }, CONFIG_FILE);
|
|
27
|
+
const memory = loadConfigFile("config", configPath)?.value.memory ?? {};
|
|
28
|
+
const scopes = memory.scopes ?? ["user", "project"];
|
|
29
|
+
const notes = [];
|
|
30
|
+
let projectRoot;
|
|
31
|
+
if (scopes.includes("project")) {
|
|
32
|
+
const trusted = findTrustEntry(readTrustFile(configDir).entries, io.cwd)?.trusted === true;
|
|
33
|
+
if (trusted)
|
|
34
|
+
projectRoot = projectRootOf(io.cwd);
|
|
35
|
+
else
|
|
36
|
+
notes.push(msg().memory.cli.untrusted(io.cwd));
|
|
37
|
+
}
|
|
38
|
+
if (memory.enabled !== true)
|
|
39
|
+
notes.push(msg().memory.cli.disabledNote);
|
|
40
|
+
const roots = standaloneRoots({ dataDir, projectRoot, user: scopes.includes("user") });
|
|
41
|
+
const limits = {
|
|
42
|
+
indexMaxBytes: memory.indexMaxBytes ?? DEFAULT_MEMORY_LIMITS.indexMaxBytes,
|
|
43
|
+
fileMaxBytes: memory.fileMaxBytes ?? DEFAULT_MEMORY_LIMITS.fileMaxBytes,
|
|
44
|
+
maxFiles: memory.maxFiles ?? DEFAULT_MEMORY_LIMITS.maxFiles,
|
|
45
|
+
};
|
|
46
|
+
const store = new MemoryStore(roots, limits, projectRoot === undefined ? {} : { projectRoot });
|
|
47
|
+
return { store, notes };
|
|
48
|
+
}
|
|
49
|
+
function scopeFilter(store, raw) {
|
|
50
|
+
if (raw === undefined || raw === "all")
|
|
51
|
+
return store.scopes();
|
|
52
|
+
if (raw !== "user" && raw !== "project")
|
|
53
|
+
throw new UsageError(msg().memory.cli.unknownScope(raw));
|
|
54
|
+
return store.scopes().filter((s) => s === raw);
|
|
55
|
+
}
|
|
56
|
+
/** 改用户级 `memory.enabled`(W6-S 的编辑核心:写前重读、只改这一项、校验、原子写 + `.bak`)。 */
|
|
57
|
+
function setEnabled(io, enabled) {
|
|
58
|
+
const m = msg().memory.cli;
|
|
59
|
+
try {
|
|
60
|
+
const result = setConfigValue({
|
|
61
|
+
configDir: resolveConfigDir({ env: io.env }),
|
|
62
|
+
cwd: io.cwd,
|
|
63
|
+
env: io.env,
|
|
64
|
+
scope: "user",
|
|
65
|
+
key: "memory.enabled",
|
|
66
|
+
value: enabled,
|
|
67
|
+
});
|
|
68
|
+
io.stdout(`${enabled ? m.enabled(result.path) : m.disabled(result.path)}\n`);
|
|
69
|
+
return ExitCode.Ok;
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
if (!(error instanceof ConfigEditError))
|
|
73
|
+
throw error;
|
|
74
|
+
io.stderr(`${error.message}\n`);
|
|
75
|
+
return ExitCode.Config;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
export async function runMemory(argv, io, deps = {}) {
|
|
79
|
+
const m = msg().memory;
|
|
80
|
+
const { positionals, values, flags } = parseSubArgs(argv, ["scope"], ["json", "yes"]);
|
|
81
|
+
const [sub, ...rest] = positionals;
|
|
82
|
+
if (flags.has("help") || sub === undefined) {
|
|
83
|
+
io.stdout(m.cli.usage);
|
|
84
|
+
return sub === undefined && !flags.has("help") ? ExitCode.Usage : ExitCode.Ok;
|
|
85
|
+
}
|
|
86
|
+
const ctx = load(io);
|
|
87
|
+
const { store } = ctx;
|
|
88
|
+
const name = rest.join(" ");
|
|
89
|
+
const notes = () => {
|
|
90
|
+
for (const note of ctx.notes)
|
|
91
|
+
io.stderr(`${note}\n`);
|
|
92
|
+
};
|
|
93
|
+
try {
|
|
94
|
+
switch (sub) {
|
|
95
|
+
case "list": {
|
|
96
|
+
const scopes = scopeFilter(store, values.get("scope"));
|
|
97
|
+
if (flags.has("json")) {
|
|
98
|
+
const out = scopeSummaries(store, scopes).map((s) => ({
|
|
99
|
+
scope: s.scope,
|
|
100
|
+
path: logicalPath(s.scope),
|
|
101
|
+
dir: store.root(s.scope),
|
|
102
|
+
indexBytes: s.indexBytes,
|
|
103
|
+
omitted: s.omitted,
|
|
104
|
+
entries: s.entries,
|
|
105
|
+
}));
|
|
106
|
+
io.stdout(`${JSON.stringify(out, null, 2)}\n`);
|
|
107
|
+
}
|
|
108
|
+
else
|
|
109
|
+
io.stdout(`${listText(store, { scopes })}\n`);
|
|
110
|
+
notes();
|
|
111
|
+
return ExitCode.Ok;
|
|
112
|
+
}
|
|
113
|
+
case "path": {
|
|
114
|
+
for (const scope of scopeFilter(store, values.get("scope")))
|
|
115
|
+
io.stdout(`${scope}\t${store.root(scope) ?? ""}\n`);
|
|
116
|
+
notes();
|
|
117
|
+
return ExitCode.Ok;
|
|
118
|
+
}
|
|
119
|
+
case "show": {
|
|
120
|
+
if (name === "")
|
|
121
|
+
throw new UsageError(m.cli.needName(sub));
|
|
122
|
+
const found = findOne(store, name);
|
|
123
|
+
if (!found.ok) {
|
|
124
|
+
io.stderr(`${found.message}\n`);
|
|
125
|
+
return ExitCode.Usage;
|
|
126
|
+
}
|
|
127
|
+
io.stdout(`${(store.readRaw(found.entry) ?? "").trimEnd()}\n`);
|
|
128
|
+
return ExitCode.Ok;
|
|
129
|
+
}
|
|
130
|
+
case "edit": {
|
|
131
|
+
const scope = values.get("scope");
|
|
132
|
+
const target = name !== "" ? name : scope === undefined ? undefined : scopeFilter(store, scope)[0];
|
|
133
|
+
const edit = deps.edit ??
|
|
134
|
+
((text, file) => editExternally(text, file, {
|
|
135
|
+
env: io.env,
|
|
136
|
+
suspend: () => undefined,
|
|
137
|
+
resume: () => undefined,
|
|
138
|
+
}));
|
|
139
|
+
const outcome = await editMemory(store, target, edit);
|
|
140
|
+
if (outcome.status === "not_found") {
|
|
141
|
+
io.stderr(`${outcome.message}\n`);
|
|
142
|
+
return ExitCode.Usage;
|
|
143
|
+
}
|
|
144
|
+
io.stdout(`${outcome.status === "saved"
|
|
145
|
+
? m.command.saved(outcome.path)
|
|
146
|
+
: outcome.status === "cancelled"
|
|
147
|
+
? m.command.editCancelled
|
|
148
|
+
: m.command.unchanged}\n`);
|
|
149
|
+
return ExitCode.Ok;
|
|
150
|
+
}
|
|
151
|
+
case "rm": {
|
|
152
|
+
if (name === "")
|
|
153
|
+
throw new UsageError(m.cli.needName(sub));
|
|
154
|
+
const found = findOne(store, name);
|
|
155
|
+
if (!found.ok) {
|
|
156
|
+
io.stderr(`${found.message}\n`);
|
|
157
|
+
return ExitCode.Usage;
|
|
158
|
+
}
|
|
159
|
+
const path = logicalPath(found.entry.scope, found.entry.file);
|
|
160
|
+
if (!flags.has("yes")) {
|
|
161
|
+
if (!io.stdinIsTTY && deps.confirm === undefined) {
|
|
162
|
+
io.stderr(`${m.cli.needsYes}\n`);
|
|
163
|
+
return ExitCode.Usage;
|
|
164
|
+
}
|
|
165
|
+
const question = m.cli.confirmRemove(path);
|
|
166
|
+
const ok = await (deps.confirm ?? ((q) => confirmContinue({ question: q, env: io.env })))(question);
|
|
167
|
+
if (!ok)
|
|
168
|
+
return ExitCode.Ok;
|
|
169
|
+
}
|
|
170
|
+
await store.remove(found.entry);
|
|
171
|
+
io.stdout(`${m.command.deleted(path)}\n`);
|
|
172
|
+
return ExitCode.Ok;
|
|
173
|
+
}
|
|
174
|
+
case "enable":
|
|
175
|
+
case "disable":
|
|
176
|
+
return setEnabled(io, sub === "enable");
|
|
177
|
+
default:
|
|
178
|
+
throw new UsageError(m.cli.usage.trimEnd());
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
if (error instanceof UsageError) {
|
|
183
|
+
io.stderr(`${error.message}\n`);
|
|
184
|
+
return ExitCode.Usage;
|
|
185
|
+
}
|
|
186
|
+
io.stderr(`${memoryErrorText(error)}\n`);
|
|
187
|
+
return ExitCode.RuntimeError;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { sourceText } from "../../ai/providers/enrich.js";
|
|
6
6
|
import { matchLabel } from "../../ai/providers/models-dev.js";
|
|
7
|
+
import { msg } from "../../i18n/index.js";
|
|
7
8
|
export function compactTokens(n) {
|
|
8
9
|
if (n === undefined)
|
|
9
10
|
return "?";
|
|
@@ -20,12 +21,13 @@ export function metadataOf(registry, providerId, modelId) {
|
|
|
20
21
|
}
|
|
21
22
|
/** `ctx 262k · out 64k · 思考 · 图片 · 渠道 chat,messages`。 */
|
|
22
23
|
export function modelFlags(model) {
|
|
24
|
+
const t = msg().subcommands.modelMeta;
|
|
23
25
|
return [
|
|
24
26
|
`ctx ${compactTokens(model.contextWindow)}`,
|
|
25
27
|
`out ${compactTokens(model.maxTokens)}`,
|
|
26
|
-
model.reasoning ?
|
|
27
|
-
model.input.includes("image") ?
|
|
28
|
-
model.channels !== undefined ?
|
|
28
|
+
model.reasoning ? t.reasoning : undefined,
|
|
29
|
+
model.input.includes("image") ? t.image : undefined,
|
|
30
|
+
model.channels !== undefined ? t.channels(model.channels) : undefined,
|
|
29
31
|
]
|
|
30
32
|
.filter((x) => x !== undefined)
|
|
31
33
|
.join(" · ");
|
|
@@ -40,15 +42,15 @@ export function sourcesLine(metadata) {
|
|
|
40
42
|
const values = Object.values(metadata.sources);
|
|
41
43
|
if (values.every((s) => s === "catalog" || s === "default") && !metadata.looked)
|
|
42
44
|
return undefined;
|
|
45
|
+
const t = msg().subcommands.modelMeta;
|
|
43
46
|
const label = {
|
|
44
47
|
contextWindow: "ctx",
|
|
45
48
|
maxTokens: "out",
|
|
46
|
-
input:
|
|
47
|
-
reasoning:
|
|
48
|
-
cost:
|
|
49
|
+
input: t.image,
|
|
50
|
+
reasoning: t.reasoning,
|
|
51
|
+
cost: t.price,
|
|
49
52
|
};
|
|
50
53
|
const parts = Object.keys(label).map((field) => `${label[field]} ${sourceText(metadata.sources[field])}`);
|
|
51
|
-
const match = metadata.looked ?
|
|
52
|
-
|
|
53
|
-
return `来源 ${parts.join(" · ")}${match}${tools}`;
|
|
54
|
+
const match = metadata.looked ? matchLabel(metadata.match) : undefined;
|
|
55
|
+
return t.sources(parts, match, metadata.toolCall === false);
|
|
54
56
|
}
|
|
@@ -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,9 @@
|
|
|
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` 不适用(订阅后端只有一种协议)。
|
|
19
22
|
*/
|
|
20
23
|
import type { Api, Model, ProviderData, ProviderRegistryApi } from "../../ai/types.js";
|
|
21
24
|
import type { ModelsAction } from "./models.js";
|
|
@@ -16,8 +16,14 @@
|
|
|
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` 不适用(订阅后端只有一种协议)。
|
|
19
22
|
*/
|
|
20
23
|
import { authHeaders, mergeHeaders } from "../../ai/http.js";
|
|
24
|
+
import { listChatGptModels } from "../../auth/chatgpt/backend-client.js";
|
|
25
|
+
import { CHATGPT_PROVIDER_ID } from "../../auth/chatgpt/presets.js";
|
|
26
|
+
import { liveToken } from "../../auth/oauth/live.js";
|
|
21
27
|
import { discoverLocalModels, materializeModel } from "../../ai/providers/registry.js";
|
|
22
28
|
import { withCustomDefaults } from "../../ai/providers/catalog.js";
|
|
23
29
|
import { describeModelsDev, loadModelsDevIndex } from "../../ai/providers/models-dev-cache.js";
|
|
@@ -26,6 +32,7 @@ import { existsSync } from "node:fs";
|
|
|
26
32
|
import { loadConfigFile } from "../../config/load.js";
|
|
27
33
|
import { writeConfigFile } from "../../config/write.js";
|
|
28
34
|
import { UsageError } from "../args.js";
|
|
35
|
+
import { msg } from "../../i18n/index.js";
|
|
29
36
|
import { ExitCode } from "../exit-codes.js";
|
|
30
37
|
import { compactTokens } from "./model-meta.js";
|
|
31
38
|
import { describeProbePlan, parseProbeTuning, ProbeProgress, ProbeScheduler, } from "./probe-runner.js";
|
|
@@ -47,6 +54,23 @@ export function modelsUrl(provider) {
|
|
|
47
54
|
}
|
|
48
55
|
export async function discoverModels(provider, apiKey, options = {}) {
|
|
49
56
|
const timeoutMs = options.timeoutMs ?? DISCOVER_TIMEOUT_MS;
|
|
57
|
+
if (provider.id === CHATGPT_PROVIDER_ID && apiKey !== undefined) {
|
|
58
|
+
const live = liveToken(apiKey);
|
|
59
|
+
const flavor = live?.flavor ?? (provider.defaultChannel === "codex" ? "codex" : "siwc");
|
|
60
|
+
const channel = provider.channels?.find((c) => c.name === flavor);
|
|
61
|
+
const models = await listChatGptModels(fetch, channel?.baseUrl ?? provider.baseUrl, {
|
|
62
|
+
flavor,
|
|
63
|
+
accessToken: apiKey,
|
|
64
|
+
accountId: live?.accountId,
|
|
65
|
+
originator: channel?.headers?.["originator"],
|
|
66
|
+
});
|
|
67
|
+
return models.map((m) => {
|
|
68
|
+
const model = withCustomDefaults({ id: m.id }, provider.id, provider.api);
|
|
69
|
+
if (m.name !== undefined)
|
|
70
|
+
model.name = m.name;
|
|
71
|
+
return model;
|
|
72
|
+
});
|
|
73
|
+
}
|
|
50
74
|
if (!provider.requiresApiKey && apiKey === undefined)
|
|
51
75
|
return discoverLocalModels(provider, { timeoutMs });
|
|
52
76
|
const anthropic = provider.api === "anthropic-messages";
|
|
@@ -114,17 +138,18 @@ function parseLimit(raw) {
|
|
|
114
138
|
return DEFAULT_PROBE_LIMIT;
|
|
115
139
|
const n = Number(raw);
|
|
116
140
|
if (!Number.isInteger(n) || n < 1)
|
|
117
|
-
throw new UsageError(
|
|
141
|
+
throw new UsageError(msg().subcommands.discover.limitPositive(raw));
|
|
118
142
|
return n;
|
|
119
143
|
}
|
|
120
144
|
/** 把新条目合并进用户级 config.json;返回写入条数。 */
|
|
121
145
|
function writeEntries(ctx, provider, entries, notes) {
|
|
122
146
|
const { io } = ctx;
|
|
147
|
+
const m = msg().subcommands.discover;
|
|
123
148
|
const path = ctx.level.userConfigPath;
|
|
124
149
|
const config = structuredClone(loadConfigFile("config", path)?.value ?? { version: 1 });
|
|
125
150
|
const providers = (config.providers ??= {});
|
|
126
151
|
if (providers[provider.id] === undefined && !provider.builtin) {
|
|
127
|
-
io.stderr(
|
|
152
|
+
io.stderr(m.notInUserConfig(provider.id, path));
|
|
128
153
|
return 0;
|
|
129
154
|
}
|
|
130
155
|
const target = (providers[provider.id] ??= {});
|
|
@@ -133,34 +158,33 @@ function writeEntries(ctx, provider, entries, notes) {
|
|
|
133
158
|
const added = entries.filter((entry) => !existing.has(entry.id));
|
|
134
159
|
const kept = entries.length - added.length;
|
|
135
160
|
if (added.length === 0) {
|
|
136
|
-
io.stdout(
|
|
161
|
+
io.stdout(m.nothingToWrite(kept));
|
|
137
162
|
return 0;
|
|
138
163
|
}
|
|
139
164
|
models.push(...added);
|
|
140
165
|
const backup = existsSync(path);
|
|
141
166
|
writeConfigFile(path, config, { backup: true });
|
|
142
|
-
io.stdout(
|
|
143
|
-
`${kept > 0 ? `,${kept} 个已存在未覆盖` : ""}${backup ? `(原文件备份为 ${path}.bak)` : ""}\n`);
|
|
167
|
+
io.stdout(m.written(path, provider.id, added.length, kept, backup));
|
|
144
168
|
if (notes.noTools.size > 0)
|
|
145
|
-
io.stdout(
|
|
169
|
+
io.stdout(m.skippedNoTools([...notes.noTools].join(", ")));
|
|
146
170
|
const blind = added.filter((entry) => notes.unmatched.has(entry.id)).map((entry) => entry.id);
|
|
147
171
|
if (blind.length > 0)
|
|
148
|
-
io.stderr(
|
|
149
|
-
`需要时在 config.json 里补上或写 modelsDev\n`);
|
|
172
|
+
io.stderr(m.unmatchedWarning(blind.join(", ")));
|
|
150
173
|
return added.length;
|
|
151
174
|
}
|
|
152
175
|
async function run(ctx) {
|
|
153
176
|
const { io, registry } = ctx;
|
|
177
|
+
const m = msg().subcommands.discover;
|
|
154
178
|
const id = ctx.args[0] ?? "";
|
|
155
179
|
const limit = parseLimit(ctx.values.get("limit"));
|
|
156
180
|
const provider = registry.get(id);
|
|
157
181
|
if (provider === undefined) {
|
|
158
|
-
io.stderr(
|
|
182
|
+
io.stderr(msg().subcommands.common.providerNotFound(id));
|
|
159
183
|
return ExitCode.NoModel;
|
|
160
184
|
}
|
|
161
185
|
const key = await registry.resolveApiKey(provider.id);
|
|
162
186
|
if (key.apiKey === undefined && provider.requiresApiKey) {
|
|
163
|
-
io.stderr(
|
|
187
|
+
io.stderr(msg().subcommands.common.noApiKey(provider.id));
|
|
164
188
|
return ExitCode.NoModel;
|
|
165
189
|
}
|
|
166
190
|
let found;
|
|
@@ -168,11 +192,11 @@ async function run(ctx) {
|
|
|
168
192
|
found = await discoverModels(provider, key.apiKey);
|
|
169
193
|
}
|
|
170
194
|
catch (error) {
|
|
171
|
-
io.stderr(
|
|
195
|
+
io.stderr(m.listFailed(provider.id, error.message));
|
|
172
196
|
return ExitCode.RuntimeError;
|
|
173
197
|
}
|
|
174
198
|
const configured = new Map(provider.models.map((m) => [m.id, m]));
|
|
175
|
-
io.stdout(
|
|
199
|
+
io.stdout(m.found(provider.id, found.length, modelsUrl(provider)));
|
|
176
200
|
// models.dev 只读本地(快照 ⊕ `ama models refresh` 的覆盖),不联网。
|
|
177
201
|
const mdIndex = loadModelsDevIndex(ctx.level.dataDir);
|
|
178
202
|
io.stdout(`${describeModelsDev(ctx.level.dataDir)}\n`);
|
|
@@ -187,14 +211,14 @@ async function run(ctx) {
|
|
|
187
211
|
if (match === undefined)
|
|
188
212
|
unmatched.add(model.id);
|
|
189
213
|
const meta = fields === undefined
|
|
190
|
-
?
|
|
214
|
+
? m.unmatched
|
|
191
215
|
: ` ctx ${compactTokens(fields.contextWindow)} · out ${compactTokens(fields.maxTokens)}` +
|
|
192
|
-
`${fields.input?.includes("image") ?
|
|
193
|
-
`${fields.toolCall === false ?
|
|
194
|
-
io.stdout(` ${model.id}${known !== undefined ?
|
|
216
|
+
`${fields.input?.includes("image") ? m.image : ""}${fields.reasoning ? m.reasoning : ""}` +
|
|
217
|
+
`${fields.toolCall === false ? m.noTools : ""} · ${matchLabel(match)}`;
|
|
218
|
+
io.stdout(` ${model.id}${known !== undefined ? m.configured(known.api) : ""}${meta}\n`);
|
|
195
219
|
}
|
|
196
220
|
const write = ctx.flags.has("write");
|
|
197
|
-
if (!ctx.flags.has("probe")) {
|
|
221
|
+
if (!ctx.flags.has("probe") || provider.id === CHATGPT_PROVIDER_ID) {
|
|
198
222
|
if (write)
|
|
199
223
|
writeEntries(ctx, provider, found.filter((m) => !noTools.has(m.id)).map((m) => ({ id: m.id })), { noTools, unmatched });
|
|
200
224
|
return ExitCode.Ok;
|
|
@@ -203,15 +227,14 @@ async function run(ctx) {
|
|
|
203
227
|
const count = Math.min(limit, ids.length);
|
|
204
228
|
const order = probeOrder(provider);
|
|
205
229
|
const tuning = parseProbeTuning(ctx.values);
|
|
206
|
-
io.stdout(
|
|
207
|
-
`${ids.length > count ? `;另有 ${ids.length - count} 个超出 --limit ${limit},未探测` : ""}\n` +
|
|
230
|
+
io.stdout(m.probeHeader(count, order.join(" → "), count * order.length, ids.length - count, limit) +
|
|
208
231
|
`${describeProbePlan(count * order.length, tuning.concurrency, tuning.timeoutMs)}\n`);
|
|
209
232
|
let stopped;
|
|
210
233
|
const progress = new ProbeProgress(io.stdout, io.stdoutIsTTY, count);
|
|
211
234
|
const probed = await probeModelApis(registry, provider, ids, limit, {
|
|
212
235
|
...tuning,
|
|
213
236
|
onSettled: () => progress.tick(),
|
|
214
|
-
onResult: (modelId, api) => progress.line(` ${modelId} ${api ??
|
|
237
|
+
onResult: (modelId, api) => progress.line(` ${modelId} ${api ?? m.unavailable}\n`),
|
|
215
238
|
onStop: (reason) => (stopped = reason),
|
|
216
239
|
});
|
|
217
240
|
progress.finish();
|
|
@@ -224,7 +247,7 @@ async function run(ctx) {
|
|
|
224
247
|
writeEntries(ctx, provider, entries, { noTools, unmatched });
|
|
225
248
|
}
|
|
226
249
|
if (stopped !== undefined) {
|
|
227
|
-
io.stderr(
|
|
250
|
+
io.stderr(m.probeStopped(stopped));
|
|
228
251
|
return ExitCode.RuntimeError;
|
|
229
252
|
}
|
|
230
253
|
return ExitCode.Ok;
|
|
@@ -38,5 +38,5 @@ export interface ModelsAction {
|
|
|
38
38
|
export declare const CHECK_TIMEOUT_MS = 30000;
|
|
39
39
|
/** 动作表:键是子命令名,顺序即用法文本顺序。 */
|
|
40
40
|
export declare const MODELS_ACTIONS: Readonly<Record<string, ModelsAction>>;
|
|
41
|
-
export declare
|
|
41
|
+
export declare function modelsUsage(): string;
|
|
42
42
|
export declare function runModels(argv: readonly string[], io: CliIo, deps: Pick<RuntimeDeps, "providers"> | undefined): Promise<number>;
|