@ai-agent-forge/agent-forge 0.87.0 → 0.88.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 +56 -0
- package/README.md +2 -2
- package/bundled-plugins/agent-loop-policy/agent-forge.json +19 -0
- package/bundled-plugins/agent-loop-policy/dist/entry.d.ts +28 -0
- package/bundled-plugins/agent-loop-policy/dist/entry.d.ts.map +1 -0
- package/bundled-plugins/agent-loop-policy/dist/entry.js +69 -0
- package/bundled-plugins/agent-loop-policy/dist/entry.js.map +1 -0
- package/bundled-plugins/agent-loop-policy/dist/loop-guard.d.ts +199 -0
- package/bundled-plugins/agent-loop-policy/dist/loop-guard.d.ts.map +1 -0
- package/bundled-plugins/agent-loop-policy/dist/loop-guard.js +208 -0
- package/bundled-plugins/agent-loop-policy/dist/loop-guard.js.map +1 -0
- package/bundled-plugins/agent-loop-policy/dist/run-loop-strategy.d.ts +17 -0
- package/bundled-plugins/agent-loop-policy/dist/run-loop-strategy.d.ts.map +1 -0
- package/bundled-plugins/agent-loop-policy/dist/run-loop-strategy.js +18 -0
- package/bundled-plugins/agent-loop-policy/dist/run-loop-strategy.js.map +1 -0
- package/bundled-plugins/agent-loop-policy/plugin.json +7 -0
- package/bundled-plugins/coding-tools/agent-forge.json +19 -0
- package/{dist/core/tools → bundled-plugins/coding-tools/dist}/bash.d.ts +5 -44
- package/bundled-plugins/coding-tools/dist/bash.d.ts.map +1 -0
- package/{dist/core/tools → bundled-plugins/coding-tools/dist}/bash.js +15 -119
- package/bundled-plugins/coding-tools/dist/bash.js.map +1 -0
- package/bundled-plugins/coding-tools/dist/capability.d.ts +25 -0
- package/bundled-plugins/coding-tools/dist/capability.d.ts.map +1 -0
- package/bundled-plugins/coding-tools/dist/capability.js +98 -0
- package/bundled-plugins/coding-tools/dist/capability.js.map +1 -0
- package/bundled-plugins/coding-tools/dist/config.d.ts +8 -0
- package/bundled-plugins/coding-tools/dist/config.d.ts.map +1 -0
- package/bundled-plugins/coding-tools/dist/config.js +8 -0
- package/bundled-plugins/coding-tools/dist/config.js.map +1 -0
- package/{dist/core/tools → bundled-plugins/coding-tools/dist}/edit.d.ts +3 -3
- package/bundled-plugins/coding-tools/dist/edit.d.ts.map +1 -0
- package/{dist/core/tools → bundled-plugins/coding-tools/dist}/edit.js +12 -10
- package/bundled-plugins/coding-tools/dist/edit.js.map +1 -0
- package/bundled-plugins/coding-tools/dist/entry.d.ts +14 -0
- package/bundled-plugins/coding-tools/dist/entry.d.ts.map +1 -0
- package/bundled-plugins/coding-tools/dist/entry.js +23 -0
- package/bundled-plugins/coding-tools/dist/entry.js.map +1 -0
- package/{dist/core/tools → bundled-plugins/coding-tools/dist}/find.d.ts +4 -4
- package/bundled-plugins/coding-tools/dist/find.d.ts.map +1 -0
- package/{dist/core/tools → bundled-plugins/coding-tools/dist}/find.js +10 -8
- package/bundled-plugins/coding-tools/dist/find.js.map +1 -0
- package/{dist/core/tools → bundled-plugins/coding-tools/dist}/grep.d.ts +3 -3
- package/bundled-plugins/coding-tools/dist/grep.d.ts.map +1 -0
- package/{dist/core/tools → bundled-plugins/coding-tools/dist}/grep.js +10 -8
- package/bundled-plugins/coding-tools/dist/grep.js.map +1 -0
- package/bundled-plugins/coding-tools/dist/index.d.ts +17 -0
- package/bundled-plugins/coding-tools/dist/index.d.ts.map +1 -0
- package/bundled-plugins/coding-tools/dist/index.js +17 -0
- package/bundled-plugins/coding-tools/dist/index.js.map +1 -0
- package/{dist/core/tools → bundled-plugins/coding-tools/dist}/ls.d.ts +3 -3
- package/bundled-plugins/coding-tools/dist/ls.d.ts.map +1 -0
- package/{dist/core/tools → bundled-plugins/coding-tools/dist}/ls.js +8 -6
- package/{dist/core/tools → bundled-plugins/coding-tools/dist}/ls.js.map +1 -1
- package/{dist/core/tools → bundled-plugins/coding-tools/dist}/powershell.d.ts +2 -1
- package/bundled-plugins/coding-tools/dist/powershell.d.ts.map +1 -0
- package/{dist/core/tools → bundled-plugins/coding-tools/dist}/powershell.js +6 -3
- package/bundled-plugins/coding-tools/dist/powershell.js.map +1 -0
- package/{dist/core/tools → bundled-plugins/coding-tools/dist}/read.d.ts +3 -3
- package/bundled-plugins/coding-tools/dist/read.d.ts.map +1 -0
- package/{dist/core/tools → bundled-plugins/coding-tools/dist}/read.js +15 -13
- package/bundled-plugins/coding-tools/dist/read.js.map +1 -0
- package/bundled-plugins/coding-tools/dist/types.d.ts +74 -0
- package/bundled-plugins/coding-tools/dist/types.d.ts.map +1 -0
- package/bundled-plugins/coding-tools/dist/types.js +28 -0
- package/bundled-plugins/coding-tools/dist/types.js.map +1 -0
- package/{dist/core/tools → bundled-plugins/coding-tools/dist}/write.d.ts +2 -2
- package/bundled-plugins/coding-tools/dist/write.d.ts.map +1 -0
- package/{dist/core/tools → bundled-plugins/coding-tools/dist}/write.js +11 -9
- package/bundled-plugins/coding-tools/dist/write.js.map +1 -0
- package/bundled-plugins/coding-tools/plugin.json +10 -0
- package/bundled-plugins/compaction-policy/agent-forge.json +19 -0
- package/bundled-plugins/compaction-policy/dist/branch-summary-policy.d.ts +6 -0
- package/bundled-plugins/compaction-policy/dist/branch-summary-policy.d.ts.map +1 -0
- package/bundled-plugins/compaction-policy/dist/branch-summary-policy.js +19 -0
- package/bundled-plugins/compaction-policy/dist/branch-summary-policy.js.map +1 -0
- package/bundled-plugins/compaction-policy/dist/compaction-policy.d.ts +6 -0
- package/bundled-plugins/compaction-policy/dist/compaction-policy.d.ts.map +1 -0
- package/bundled-plugins/compaction-policy/dist/compaction-policy.js +38 -0
- package/bundled-plugins/compaction-policy/dist/compaction-policy.js.map +1 -0
- package/bundled-plugins/compaction-policy/dist/entry.d.ts +13 -0
- package/bundled-plugins/compaction-policy/dist/entry.d.ts.map +1 -0
- package/bundled-plugins/compaction-policy/dist/entry.js +23 -0
- package/bundled-plugins/compaction-policy/dist/entry.js.map +1 -0
- package/bundled-plugins/compaction-policy/plugin.json +10 -0
- package/bundled-plugins/mcp-http/dist/index.d.ts +8 -0
- package/bundled-plugins/mcp-http/dist/index.d.ts.map +1 -0
- package/bundled-plugins/mcp-http/dist/index.js +8 -0
- package/bundled-plugins/mcp-http/dist/index.js.map +1 -0
- package/bundled-plugins/mcp-http/dist/mcp-http.d.ts.map +1 -0
- package/{dist/plugins → bundled-plugins/mcp-http/dist}/mcp-http.js +1 -1
- package/bundled-plugins/mcp-http/dist/mcp-http.js.map +1 -0
- package/bundled-plugins/overflow-policy/agent-forge.json +19 -0
- package/bundled-plugins/overflow-policy/dist/entry.d.ts +16 -0
- package/bundled-plugins/overflow-policy/dist/entry.d.ts.map +1 -0
- package/bundled-plugins/overflow-policy/dist/entry.js +35 -0
- package/bundled-plugins/overflow-policy/dist/entry.js.map +1 -0
- package/bundled-plugins/overflow-policy/plugin.json +10 -0
- package/bundled-plugins/provider-failover/agent-forge.json +19 -0
- package/bundled-plugins/provider-failover/dist/entry.d.ts +8 -0
- package/bundled-plugins/provider-failover/dist/entry.d.ts.map +1 -0
- package/bundled-plugins/provider-failover/dist/entry.js +8 -0
- package/bundled-plugins/provider-failover/dist/entry.js.map +1 -0
- package/bundled-plugins/provider-failover/dist/provider-failover.d.ts +122 -0
- package/bundled-plugins/provider-failover/dist/provider-failover.d.ts.map +1 -0
- package/{dist/core/extensions → bundled-plugins/provider-failover/dist}/provider-failover.js +149 -61
- package/bundled-plugins/provider-failover/dist/provider-failover.js.map +1 -0
- package/bundled-plugins/provider-failover/plugin.json +7 -0
- package/bundled-plugins/retry-policy/agent-forge.json +19 -0
- package/bundled-plugins/retry-policy/dist/entry.d.ts +16 -0
- package/bundled-plugins/retry-policy/dist/entry.d.ts.map +1 -0
- package/bundled-plugins/retry-policy/dist/entry.js +34 -0
- package/bundled-plugins/retry-policy/dist/entry.js.map +1 -0
- package/bundled-plugins/retry-policy/plugin.json +10 -0
- package/dist/bundle/.build-manifest.json +105 -183
- package/dist/bundle/chunks/{anthropic-messages-ALDZBUKI.js → anthropic-messages-PLAKXR73.js} +1 -1
- package/dist/bundle/chunks/{azure-openai-responses-A2WJWZFB.js → azure-openai-responses-OUWQ2AZD.js} +1 -1
- package/dist/bundle/chunks/{chunk-CIX3FSBK.js → chunk-A3JYRWB6.js} +1 -1
- package/dist/bundle/chunks/{chunk-SQFG22WN.js → chunk-AC2FIS4G.js} +1 -1
- package/dist/bundle/chunks/chunk-AQLNTW2B.js +664 -0
- package/dist/bundle/chunks/chunk-D3ARGZFR.js +13 -0
- package/dist/bundle/chunks/{chunk-YJCQVXW5.js → chunk-HTEVUY7F.js} +1 -1
- package/dist/bundle/chunks/{chunk-Y7HXTASS.js → chunk-HV64ASMT.js} +1 -1
- package/dist/bundle/chunks/chunk-LZOEQITZ.js +855 -0
- package/dist/bundle/chunks/{chunk-7ZY7IXZD.js → chunk-TRDNDS6A.js} +1 -1
- package/dist/bundle/chunks/chunk-Z72JWUZ4.js +4 -0
- package/dist/bundle/chunks/{google-generative-ai-NIB4WONV.js → google-generative-ai-DLII6DAT.js} +1 -1
- package/dist/bundle/chunks/{google-vertex-DCPYUEUO.js → google-vertex-G7BZL7GM.js} +1 -1
- package/dist/bundle/chunks/image-resize-worker.js +3 -3
- package/dist/bundle/chunks/{mistral-conversations-OC6LA5XL.js → mistral-conversations-JXUK24ID.js} +1 -1
- package/dist/bundle/chunks/{openai-codex-responses-IO2X4Y7L.js → openai-codex-responses-5GSGFIPG.js} +1 -1
- package/dist/bundle/chunks/{openai-completions-XYQQHETU.js → openai-completions-EI2I6DTG.js} +1 -1
- package/dist/bundle/chunks/{openai-responses-DLIRN3CI.js → openai-responses-AUJQ3NWT.js} +1 -1
- package/dist/bundle/chunks/{pi-messages-E6RRYBO7.js → pi-messages-PWU2VJMR.js} +1 -1
- package/dist/bundle/chunks/virtual-modules-WF6WRHP7.js +5 -0
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/client.js +1 -1
- package/dist/bundle/index.js +3 -3
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/capabilities/builtin.d.ts +1 -1
- package/dist/capabilities/builtin.d.ts.map +1 -1
- package/dist/capabilities/builtin.js +5 -0
- package/dist/capabilities/builtin.js.map +1 -1
- package/dist/cli/auth-check.d.ts.map +1 -1
- package/dist/cli/auth-check.js +14 -2
- package/dist/cli/auth-check.js.map +1 -1
- package/dist/cli/auth-command.d.ts.map +1 -1
- package/dist/cli/auth-command.js +1 -1
- package/dist/cli/auth-command.js.map +1 -1
- package/dist/cli/plugin-command.d.ts.map +1 -1
- package/dist/cli/plugin-command.js +17 -1
- package/dist/cli/plugin-command.js.map +1 -1
- package/dist/config.d.ts +2 -3
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +5 -6
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session-bash.d.ts +1 -1
- package/dist/core/agent-session-bash.d.ts.map +1 -1
- package/dist/core/agent-session-bash.js +1 -1
- package/dist/core/agent-session-bash.js.map +1 -1
- package/dist/core/agent-session-compaction.d.ts +6 -10
- package/dist/core/agent-session-compaction.d.ts.map +1 -1
- package/dist/core/agent-session-compaction.js +21 -112
- package/dist/core/agent-session-compaction.js.map +1 -1
- package/dist/core/agent-session-internal.d.ts +1 -7
- package/dist/core/agent-session-internal.d.ts.map +1 -1
- package/dist/core/agent-session-internal.js.map +1 -1
- package/dist/core/agent-session-loop.d.ts +4 -3
- package/dist/core/agent-session-loop.d.ts.map +1 -1
- package/dist/core/agent-session-loop.js +9 -6
- package/dist/core/agent-session-loop.js.map +1 -1
- package/dist/core/agent-session-retry.d.ts +1 -1
- package/dist/core/agent-session-retry.d.ts.map +1 -1
- package/dist/core/agent-session-retry.js +32 -4
- package/dist/core/agent-session-retry.js.map +1 -1
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js +30 -9
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session-tools.d.ts.map +1 -1
- package/dist/core/agent-session-tools.js +5 -1
- package/dist/core/agent-session-tools.js.map +1 -1
- package/dist/core/agent-session.d.ts +12 -33
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +61 -67
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/bash-executor.d.ts +1 -1
- package/dist/core/bash-executor.d.ts.map +1 -1
- package/dist/core/bash-executor.js.map +1 -1
- package/dist/core/extensions/bootstrap-agent-loop.d.ts +23 -151
- package/dist/core/extensions/bootstrap-agent-loop.d.ts.map +1 -1
- package/dist/core/extensions/bootstrap-agent-loop.js +28 -290
- package/dist/core/extensions/bootstrap-agent-loop.js.map +1 -1
- package/dist/core/extensions/capability-runtime-types.d.ts +5 -3
- package/dist/core/extensions/capability-runtime-types.d.ts.map +1 -1
- package/dist/core/extensions/capability-runtime-types.js.map +1 -1
- package/dist/core/extensions/capability-runtime.d.ts.map +1 -1
- package/dist/core/extensions/capability-runtime.js +42 -6
- package/dist/core/extensions/capability-runtime.js.map +1 -1
- package/dist/core/extensions/index.d.ts +12 -5
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js +12 -5
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/virtual-modules.d.ts.map +1 -1
- package/dist/core/extensions/virtual-modules.js +65 -0
- package/dist/core/extensions/virtual-modules.js.map +1 -1
- package/dist/core/facade/coding-agent-facade.d.ts +1 -7
- package/dist/core/facade/coding-agent-facade.d.ts.map +1 -1
- package/dist/core/facade/coding-agent-facade.js +0 -3
- package/dist/core/facade/coding-agent-facade.js.map +1 -1
- package/dist/core/i18n/locales/zh-cn/cli.d.ts.map +1 -1
- package/dist/core/i18n/locales/zh-cn/cli.js +3 -1
- package/dist/core/i18n/locales/zh-cn/cli.js.map +1 -1
- package/dist/core/i18n/locales/zh-cn/core-contract-core.d.ts +1 -1
- package/dist/core/i18n/locales/zh-cn/core-contract-core.d.ts.map +1 -1
- package/dist/core/i18n/locales/zh-cn/core-contract-core.js +1 -1
- package/dist/core/i18n/locales/zh-cn/core-contract-core.js.map +1 -1
- package/dist/core/i18n/locales/zh-cn/core-contract-extensions.d.ts.map +1 -1
- package/dist/core/i18n/locales/zh-cn/core-contract-extensions.js +2 -4
- package/dist/core/i18n/locales/zh-cn/core-contract-extensions.js.map +1 -1
- package/dist/core/i18n/locales/zh-cn/core-errors.d.ts.map +1 -1
- package/dist/core/i18n/locales/zh-cn/core-errors.js +3 -1
- package/dist/core/i18n/locales/zh-cn/core-errors.js.map +1 -1
- package/dist/core/i18n/locales/zh-cn/interactive-mode.d.ts.map +1 -1
- package/dist/core/i18n/locales/zh-cn/interactive-mode.js +2 -0
- package/dist/core/i18n/locales/zh-cn/interactive-mode.js.map +1 -1
- package/dist/core/i18n/locales/zh-cn/tui-components-selectors.d.ts.map +1 -1
- package/dist/core/i18n/locales/zh-cn/tui-components-selectors.js +0 -2
- package/dist/core/i18n/locales/zh-cn/tui-components-selectors.js.map +1 -1
- package/dist/core/model-config.d.ts +0 -1
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js +9 -1
- package/dist/core/model-config.js.map +1 -1
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +3 -3
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/provider-composer.d.ts +2 -2
- package/dist/core/provider-composer.d.ts.map +1 -1
- package/dist/core/provider-composer.js +7 -8
- package/dist/core/provider-composer.js.map +1 -1
- package/dist/core/sdk.d.ts +18 -3
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +267 -76
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/settings-manager.d.ts +9 -20
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +20 -54
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/tools/bash-operations.d.ts +41 -0
- package/dist/core/tools/bash-operations.d.ts.map +1 -0
- package/dist/core/tools/bash-operations.js +113 -0
- package/dist/core/tools/bash-operations.js.map +1 -0
- package/dist/core/tools/index.d.ts +12 -36
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +1 -117
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/readme-path.d.ts +3 -0
- package/dist/core/tools/readme-path.d.ts.map +1 -0
- package/dist/core/tools/readme-path.js +15 -0
- package/dist/core/tools/readme-path.js.map +1 -0
- package/dist/index.d.ts +3 -19
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -39
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +3 -2
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts +0 -2
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +2 -7
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +2 -6
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +6 -28
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts +0 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +9 -25
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +0 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +23 -36
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +0 -8
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +0 -12
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +0 -9
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +0 -19
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/plugins/ecosystem/cli.d.ts.map +1 -1
- package/dist/plugins/ecosystem/cli.js +14 -2
- package/dist/plugins/ecosystem/cli.js.map +1 -1
- package/dist/plugins/ecosystem/node-npm-registry-source.d.ts +7 -2
- package/dist/plugins/ecosystem/node-npm-registry-source.d.ts.map +1 -1
- package/dist/plugins/ecosystem/node-npm-registry-source.js +64 -9
- package/dist/plugins/ecosystem/node-npm-registry-source.js.map +1 -1
- package/dist/plugins/ecosystem/node-plugin-acquisition-host.d.ts.map +1 -1
- package/dist/plugins/ecosystem/node-plugin-acquisition-host.js +6 -0
- package/dist/plugins/ecosystem/node-plugin-acquisition-host.js.map +1 -1
- package/dist/plugins/ecosystem/node-plugin-bootstrap.d.ts +9 -2
- package/dist/plugins/ecosystem/node-plugin-bootstrap.d.ts.map +1 -1
- package/dist/plugins/ecosystem/node-plugin-bootstrap.js +23 -0
- package/dist/plugins/ecosystem/node-plugin-bootstrap.js.map +1 -1
- package/dist/plugins/ecosystem/plugin-bootstrap.d.ts +9 -1
- package/dist/plugins/ecosystem/plugin-bootstrap.d.ts.map +1 -1
- package/dist/plugins/ecosystem/plugin-bootstrap.js +5 -0
- package/dist/plugins/ecosystem/plugin-bootstrap.js.map +1 -1
- package/dist/profiles/builtin-suites.d.ts +5 -1
- package/dist/profiles/builtin-suites.d.ts.map +1 -1
- package/dist/profiles/builtin-suites.js +6 -1
- package/dist/profiles/builtin-suites.js.map +1 -1
- package/dist/utils/photon.d.ts +2 -2
- package/dist/utils/photon.d.ts.map +1 -1
- package/dist/utils/photon.js +2 -2
- package/dist/utils/photon.js.map +1 -1
- package/docs/compaction.md +1 -3
- package/docs/docs.json +4 -0
- package/docs/index.md +1 -0
- package/docs/mcp.md +103 -0
- package/docs/models.md +14 -22
- package/docs/providers.md +0 -1
- package/docs/rpc.md +1 -26
- package/docs/sdk.md +4 -6
- package/docs/settings.md +9 -12
- package/docs/skills.md +1 -9
- package/docs/usage.md +1 -1
- package/examples/extensions/bash-spawn-hook/index.ts +7 -2
- package/examples/extensions/built-in-tool-renderer/index.ts +4 -2
- package/examples/extensions/minimal-mode/index.ts +2 -2
- package/examples/extensions/truncated-tool/index.ts +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/examples/extensions/with-deps/plugin.json +1 -1
- package/examples/sdk/10-settings.ts +2 -4
- package/examples/sdk/12-full-control.ts +1 -2
- package/package.json +3 -4
- package/dist/bundle/chunks/chunk-6ZKDNZHA.js +0 -145
- package/dist/bundle/chunks/chunk-BFC2BDVJ.js +0 -13
- package/dist/bundle/chunks/chunk-MOHOLL3F.js +0 -1456
- package/dist/bundle/chunks/virtual-modules-KZ5DRH7Q.js +0 -2
- package/dist/core/extensions/bootstrap-branch-summary-policy.d.ts +0 -7
- package/dist/core/extensions/bootstrap-branch-summary-policy.d.ts.map +0 -1
- package/dist/core/extensions/bootstrap-branch-summary-policy.js +0 -28
- package/dist/core/extensions/bootstrap-branch-summary-policy.js.map +0 -1
- package/dist/core/extensions/bootstrap-compaction-policy.d.ts +0 -7
- package/dist/core/extensions/bootstrap-compaction-policy.d.ts.map +0 -1
- package/dist/core/extensions/bootstrap-compaction-policy.js +0 -82
- package/dist/core/extensions/bootstrap-compaction-policy.js.map +0 -1
- package/dist/core/extensions/bootstrap-overflow-policy.d.ts +0 -7
- package/dist/core/extensions/bootstrap-overflow-policy.d.ts.map +0 -1
- package/dist/core/extensions/bootstrap-overflow-policy.js +0 -30
- package/dist/core/extensions/bootstrap-overflow-policy.js.map +0 -1
- package/dist/core/extensions/bootstrap-retry-policy.d.ts +0 -7
- package/dist/core/extensions/bootstrap-retry-policy.d.ts.map +0 -1
- package/dist/core/extensions/bootstrap-retry-policy.js +0 -29
- package/dist/core/extensions/bootstrap-retry-policy.js.map +0 -1
- package/dist/core/extensions/bootstrap-tools.d.ts +0 -20
- package/dist/core/extensions/bootstrap-tools.d.ts.map +0 -1
- package/dist/core/extensions/bootstrap-tools.js +0 -36
- package/dist/core/extensions/bootstrap-tools.js.map +0 -1
- package/dist/core/extensions/microcompact.d.ts +0 -80
- package/dist/core/extensions/microcompact.d.ts.map +0 -1
- package/dist/core/extensions/microcompact.js +0 -134
- package/dist/core/extensions/microcompact.js.map +0 -1
- package/dist/core/extensions/provider-failover.d.ts +0 -106
- package/dist/core/extensions/provider-failover.d.ts.map +0 -1
- package/dist/core/extensions/provider-failover.js.map +0 -1
- package/dist/core/tools/bash.d.ts.map +0 -1
- package/dist/core/tools/bash.js.map +0 -1
- package/dist/core/tools/edit.d.ts.map +0 -1
- package/dist/core/tools/edit.js.map +0 -1
- package/dist/core/tools/find.d.ts.map +0 -1
- package/dist/core/tools/find.js.map +0 -1
- package/dist/core/tools/grep.d.ts.map +0 -1
- package/dist/core/tools/grep.js.map +0 -1
- package/dist/core/tools/ls.d.ts.map +0 -1
- package/dist/core/tools/powershell.d.ts.map +0 -1
- package/dist/core/tools/powershell.js.map +0 -1
- package/dist/core/tools/read.d.ts.map +0 -1
- package/dist/core/tools/read.js.map +0 -1
- package/dist/core/tools/write.d.ts.map +0 -1
- package/dist/core/tools/write.js.map +0 -1
- package/dist/plugins/mcp-http.d.ts.map +0 -1
- package/dist/plugins/mcp-http.js.map +0 -1
- package/dist/profile/child-facade.d.ts +0 -44
- package/dist/profile/child-facade.d.ts.map +0 -1
- package/dist/profile/child-facade.js +0 -56
- package/dist/profile/child-facade.js.map +0 -1
- package/dist/profile/dependency-wiring.d.ts +0 -48
- package/dist/profile/dependency-wiring.d.ts.map +0 -1
- package/dist/profile/dependency-wiring.js +0 -56
- package/dist/profile/dependency-wiring.js.map +0 -1
- package/dist/profile/domain-recovery.d.ts +0 -60
- package/dist/profile/domain-recovery.d.ts.map +0 -1
- package/dist/profile/domain-recovery.js +0 -94
- package/dist/profile/domain-recovery.js.map +0 -1
- package/dist/profile/first-roles.d.ts +0 -30
- package/dist/profile/first-roles.d.ts.map +0 -1
- package/dist/profile/first-roles.js +0 -83
- package/dist/profile/first-roles.js.map +0 -1
- package/dist/profile/goal-plugin.d.ts +0 -38
- package/dist/profile/goal-plugin.d.ts.map +0 -1
- package/dist/profile/goal-plugin.js +0 -132
- package/dist/profile/goal-plugin.js.map +0 -1
- package/dist/profile/plan-plugin.d.ts +0 -44
- package/dist/profile/plan-plugin.d.ts.map +0 -1
- package/dist/profile/plan-plugin.js +0 -157
- package/dist/profile/plan-plugin.js.map +0 -1
- package/dist/profile/policy-manifest.d.ts +0 -53
- package/dist/profile/policy-manifest.d.ts.map +0 -1
- package/dist/profile/policy-manifest.js +0 -53
- package/dist/profile/policy-manifest.js.map +0 -1
- package/dist/profile/role-assembly.d.ts +0 -47
- package/dist/profile/role-assembly.d.ts.map +0 -1
- package/dist/profile/role-assembly.js +0 -31
- package/dist/profile/role-assembly.js.map +0 -1
- package/dist/profile/role-catalog.d.ts +0 -43
- package/dist/profile/role-catalog.d.ts.map +0 -1
- package/dist/profile/role-catalog.js +0 -132
- package/dist/profile/role-catalog.js.map +0 -1
- package/dist/profile/role-orchestrator.d.ts +0 -123
- package/dist/profile/role-orchestrator.d.ts.map +0 -1
- package/dist/profile/role-orchestrator.js +0 -195
- package/dist/profile/role-orchestrator.js.map +0 -1
- package/dist/profile/role-runner.d.ts +0 -99
- package/dist/profile/role-runner.d.ts.map +0 -1
- package/dist/profile/role-runner.js +0 -79
- package/dist/profile/role-runner.js.map +0 -1
- package/dist/profile/root-facade.d.ts +0 -36
- package/dist/profile/root-facade.d.ts.map +0 -1
- package/dist/profile/root-facade.js +0 -49
- package/dist/profile/root-facade.js.map +0 -1
- package/dist/profile/skill-discovery-wiring.d.ts +0 -58
- package/dist/profile/skill-discovery-wiring.d.ts.map +0 -1
- package/dist/profile/skill-discovery-wiring.js +0 -80
- package/dist/profile/skill-discovery-wiring.js.map +0 -1
- package/dist/profile/state-store.d.ts +0 -62
- package/dist/profile/state-store.d.ts.map +0 -1
- package/dist/profile/state-store.js +0 -144
- package/dist/profile/state-store.js.map +0 -1
- package/dist/profile/todo-plugin.d.ts +0 -37
- package/dist/profile/todo-plugin.d.ts.map +0 -1
- package/dist/profile/todo-plugin.js +0 -137
- package/dist/profile/todo-plugin.js.map +0 -1
- package/dist/server/create-harness.d.ts +0 -26
- package/dist/server/create-harness.d.ts.map +0 -1
- package/dist/server/create-harness.js +0 -106
- package/dist/server/create-harness.js.map +0 -1
- /package/{dist/plugins → bundled-plugins/mcp-http/dist}/mcp-http.d.ts +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tui-components-selectors.js","sourceRoot":"","sources":["../../../../../src/core/i18n/locales/zh-cn/tui-components-selectors.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * 批次④ selectors 域词典(docs/design/国际化与本地化.md §词典结构):\n * 覆盖 components/ 下的 settings-selector、session-selector、config-selector、\n * model-selector、scoped-models-selector、thinking-selector、oauth-selector、\n * login-dialog、first-time-setup、plugin-manager-entry、plugin-selection-entry、\n * tree-selector、tree-list。key 为英文原文(与调用点逐字一致;`t()` 会 trim\n * key,故调用点的前导/尾随空白一律在 `t()` 外拼接,key 本身不含首尾空白),\n * value 为简体中文译文,`{占位符}` 原样保留。数据值(config 值、role 名、\n * plugin status/action)不入词典(调用点保留原文)。\n */\nexport const tuiComponentsSelectors: Record<string, string> = {\n\t// ---- settings-selector ----\n\t\"No reasoning\": \"无推理\",\n\t\"Very brief reasoning (~1k tokens)\": \"极简推理(约 1k tokens)\",\n\t\"Light reasoning (~2k tokens)\": \"轻度推理(约 2k tokens)\",\n\t\"Moderate reasoning (~8k tokens)\": \"中度推理(约 8k tokens)\",\n\t\"Deep reasoning (~16k tokens)\": \"深度推理(约 16k tokens)\",\n\t\"Extra-high reasoning (~32k tokens)\": \"超高推理(约 32k tokens)\",\n\t\"Maximum reasoning\": \"最大推理\",\n\t\"Anthropic extra usage\": \"Anthropic 额外用量\",\n\t\"Warn when Anthropic subscription auth may use paid extra usage\": \"当 Anthropic 订阅认证可能使用付费额外用量时警告\",\n\tnone: \"无\",\n\t\"{count} configured\": \"已配置 {count} 项\",\n\tAutomatic: \"自动\",\n\t\"Use separate themes for light and dark terminal appearance\": \"为终端浅色与深色外观分别使用不同主题\",\n\tTheme: \"主题\",\n\t\"Select a theme, or choose Automatic to follow terminal appearance.\": \"选择一个主题,或选择“自动”跟随终端外观。\",\n\t\"Automatic Theme\": \"自动主题\",\n\t\"Choose themes for terminal light and dark appearance.\": \"为终端浅色与深色外观选择主题。\",\n\t\"Light/dark detection requires terminal support.\": \"浅色/深色检测需要终端支持。\",\n\t\"Light theme\": \"浅色主题\",\n\t\"Theme to use in automatic mode when the terminal is light\": \"自动模式下终端为浅色时使用的主题\",\n\t\"Light Theme\": \"浅色主题\",\n\t\"Select the theme to use for light terminal appearance\": \"选择终端浅色外观时使用的主题\",\n\t\"Dark theme\": \"深色主题\",\n\t\"Theme to use in automatic mode when the terminal is dark\": \"自动模式下终端为深色时使用的主题\",\n\t\"Dark Theme\": \"深色主题\",\n\t\"Select the theme to use for dark terminal appearance\": \"选择终端深色外观时使用的主题\",\n\tApply: \"应用\",\n\t\"Save and go back\": \"保存并返回\",\n\t\"save and go back\": \"保存并返回\",\n\t\"Change mode\": \"切换模式\",\n\t\"Switch to one theme for light and dark\": \"切换为浅色与深色共用单一主题\",\n\t\"switch to single theme\": \"切换为单一主题\",\n\t\"Auto-compact\": \"自动压缩\",\n\t\"Automatically compact context when it gets too large\": \"上下文过大时自动压缩\",\n\t\"Steering mode\": \"转向模式\",\n\t\"Enter while streaming queues steering messages. 'one-at-a-time': deliver one, wait for response. 'all': deliver all at once.\":\n\t\t\"流式输出期间按 Enter 会将转向消息加入队列。'one-at-a-time':每次送达一条,等待响应。'all':一次性全部送达。\",\n\t\"Follow-up mode\": \"后续消息模式\",\n\t\"{key} queues follow-up messages until agent stops. 'one-at-a-time': deliver one, wait for response. 'all': deliver all at once.\":\n\t\t\"{key} 会将后续消息排队直至 agent 停止。'one-at-a-time':每次送达一条,等待响应。'all':一次性全部送达。\",\n\tTransport: \"传输方式\",\n\t\"Preferred transport for providers that support multiple transports\": \"支持多种传输方式的 provider 的首选传输方式\",\n\t\"HTTP idle timeout\": \"HTTP 空闲超时\",\n\t\"Maximum idle gap while waiting for HTTP headers or body chunks. Disable for local models that pause longer than five minutes.\":\n\t\t\"等待 HTTP 头或正文分块时的最大空闲间隔。本地模型暂停超过五分钟时请禁用。\",\n\t\"Hide thinking\": \"隐藏思考\",\n\t\"Hide thinking blocks in assistant responses\": \"隐藏助手回复中的思考块\",\n\t\"Mermaid diagrams\": \"Mermaid 图表\",\n\t\"Render Mermaid code blocks as Unicode diagrams\": \"将 Mermaid 代码块渲染为 Unicode 图表\",\n\t\"Cache miss notices\": \"缓存未命中提示\",\n\t\"Show transcript notices for cache costs and provider recovery diagnostics\":\n\t\t\"显示缓存成本与 provider 恢复诊断的会话记录提示\",\n\t\"Collapse changelog\": \"折叠更新日志\",\n\t\"Show condensed changelog after updates\": \"更新后显示精简版更新日志\",\n\t\"Quiet startup\": \"安静启动\",\n\t\"Disable verbose printing at startup\": \"禁用启动时的详细输出\",\n\t\"Double-escape action\": \"双击 Escape 动作\",\n\t\"Action when pressing Escape twice with empty editor\": \"编辑器为空时连按两次 Escape 执行的动作\",\n\t\"Interface language\": \"界面语言\",\n\t\"Language for UI text; takes effect immediately\": \"界面文本语言,立即生效\",\n\t\"Tree filter mode\": \"树视图过滤模式\",\n\t\"Default filter when opening /tree\": \"打开 /tree 时的默认过滤器\",\n\tWarnings: \"警告\",\n\t\"Enable or disable individual warnings\": \"启用或禁用各项警告\",\n\tconfigure: \"配置\",\n\t\"Default thinking level per model\": \"各模型默认思考级别\",\n\t\"Override the default thinking level for specific models. {key} cycles in-session.\":\n\t\t\"为特定模型覆盖默认思考级别。{key} 可在会话内循环切换。\",\n\t\"Per-Model Thinking Level\": \"各模型思考级别\",\n\t\"Select a model to configure\": \"选择要配置的模型\",\n\t\"No models available\": \"无可用模型\",\n\t\"Log in to a provider or configure an API key first\": \"请先登录 provider 或配置 API key\",\n\t\"Thinking Level for {model}\": \"{model} 的思考级别\",\n\t\"Select default thinking level for this model\": \"选择该模型的默认思考级别\",\n\t\"(clear override)\": \"(清除覆盖)\",\n\t\"Revert to global default ({level})\": \"恢复全局默认({level})\",\n\t\"TUI mode\": \"TUI 模式\",\n\t\"Interface layout; fullscreen mode is experimental\": \"界面布局;全屏模式为实验性\",\n\t\"Fullscreen exit output\": \"全屏退出输出\",\n\t\"Print the transcript or only a session resume hint when exiting fullscreen mode\":\n\t\t\"退出全屏模式时打印完整会话记录或仅打印会话恢复提示\",\n\t\"Fullscreen scrollbar\": \"全屏滚动条\",\n\t\"Scrollbar behavior in fullscreen mode; has no effect in regular mode\": \"全屏模式下的滚动条行为;常规模式下无效\",\n\t\"Fullscreen copy on select\": \"全屏选中即复制\",\n\t\"Automatically copy selected text in fullscreen mode; disable to copy selections with Ctrl+X\":\n\t\t\"全屏模式下自动复制选中文本;禁用后用 Ctrl+X 复制所选内容\",\n\t\"Fullscreen wheel scroll lines\": \"全屏滚轮滚动行数\",\n\t\"Lines scrolled per wheel event in fullscreen mode; auto accelerates with scroll speed\":\n\t\t\"全屏模式下每个滚轮事件滚动的行数;auto 随滚动速度加速\",\n\t\"Color theme for the interface\": \"界面配色主题\",\n\t\"Show images\": \"显示图片\",\n\t\"Render images inline in terminal\": \"在终端内联渲染图片\",\n\t\"Image width\": \"图片宽度\",\n\t\"Preferred inline image width in terminal cells\": \"首选的内联图片宽度(终端单元格)\",\n\t\"Auto-resize images\": \"自动缩放图片\",\n\t\"Resize large images to 2000x2000 max for better model compatibility\": \"将大图缩放至最大 2000x2000 以提升模型兼容性\",\n\t\"Block images\": \"阻止图片\",\n\t\"Prevent images from being sent to LLM providers\": \"阻止图片发送给 LLM provider\",\n\t\"Skill commands\": \"Skill 命令\",\n\t\"Register skills as /skill:name commands\": \"将 skill 注册为 /skill:name 命令\",\n\t\"Show hardware cursor\": \"显示硬件光标\",\n\t\"Show the terminal cursor while still positioning it for IME support\": \"显示终端光标,同时保持其定位以支持输入法\",\n\t\"Editor padding\": \"编辑器内边距\",\n\t\"Horizontal padding for input editor (0-3)\": \"输入编辑器的水平内边距(0-3)\",\n\t\"Output padding\": \"输出内边距\",\n\t\"Horizontal padding for user messages, assistant messages, and thinking\": \"用户消息、助手消息与思考内容的水平内边距\",\n\t\"Autocomplete max items\": \"自动补全最大条目数\",\n\t\"Max visible items in autocomplete dropdown (3-20)\": \"自动补全下拉菜单可见的最大条目数(3-20)\",\n\t\"Clear on shrink\": \"收缩时清屏\",\n\t\"Clear empty rows when content shrinks (may cause flicker)\": \"内容收缩时清除空行(可能导致闪烁)\",\n\t\"Terminal progress\": \"终端进度\",\n\t\"Show OSC 9;4 progress indicators in the terminal tab bar\": \"在终端标签栏显示 OSC 9;4 进度指示\",\n\n\t// ---- session-selector ----\n\t\"Resume Session (Current Folder)\": \"恢复会话(当前文件夹)\",\n\t\"Resume Session (All)\": \"恢复会话(全部)\",\n\t\"Resume Session (All Suites)\": \"恢复会话(所有 Suite)\",\n\t\"Resume Session (Suite: {suite})\": \"恢复会话(Suite:{suite})\",\n\tThreaded: \"线程式\",\n\tRecent: \"最近\",\n\tFuzzy: \"模糊\",\n\t\"Sort:\": \"排序:\",\n\tAll: \"全部\",\n\tNamed: \"已命名\",\n\t\"Name:\": \"名称:\",\n\t\"○ Current Folder\": \"○ 当前文件夹\",\n\t\"Loading {progress}\": \"加载中 {progress}\",\n\t\"◉ Current Folder\": \"◉ 当前文件夹\",\n\t\"○ All\": \"○ 全部\",\n\t\"◉ All\": \"◉ 全部\",\n\t\"Delete session? {confirm} · {cancel}\": \"删除会话?{confirm} · {cancel}\",\n\tconfirm: \"确认\",\n\tcancel: \"取消\",\n\t\"path (on)\": \"路径 (开)\",\n\t\"path (off)\": \"路径 (关)\",\n\tscope: \"范围\",\n\t're:<pattern> regex · \"phrase\" exact': 're:<模式> 正则 · \"词组\" 精确',\n\tsort: \"排序\",\n\tnamed: \"命名过滤\",\n\tdelete: \"删除\",\n\trename: \"重命名\",\n\t\"Cannot delete the currently active session\": \"无法删除当前活动会话\",\n\t\"No named sessions found. Press {key} to show all.\": \"未找到已命名会话。按 {key} 显示全部。\",\n\t\"No named sessions in current folder. Press {key} to show all, or Tab to view all.\":\n\t\t\"当前文件夹无已命名会话。按 {key} 显示全部,或按 Tab 查看全部。\",\n\t\"No sessions found\": \"未找到会话\",\n\t\"No sessions in current folder. Press Tab to view all.\": \"当前文件夹无会话。按 Tab 查看全部。\",\n\t\"Show sessions from all suites\": \"显示所有 suite 的会话\",\n\t\"Show current suite sessions only\": \"仅显示当前 suite 的会话\",\n\t\"Session moved to trash\": \"会话已移入回收站\",\n\t\"Session deleted\": \"会话已删除\",\n\t\"Unknown error\": \"未知错误\",\n\t\"Failed to delete: {error}\": \"删除失败:{error}\",\n\t\"Rename Session\": \"重命名会话\",\n\t\"{confirm} to save · {cancel} to cancel\": \"{confirm} 保存 · {cancel} 取消\",\n\t\"Failed to load sessions: {message}\": \"加载会话失败:{message}\",\n\n\t// ---- config-selector ----\n\tSkills: \"技能\",\n\tPrompts: \"提示词\",\n\tThemes: \"主题\",\n\t\"User ({dir})\": \"用户({dir})\",\n\t\"Project ({dir})\": \"项目({dir})\",\n\t\"User settings\": \"用户设置\",\n\t\"Project settings\": \"项目设置\",\n\t\"Project Local Resources\": \"项目本地资源\",\n\t\"Global Resources\": \"全局资源\",\n\t\"switch mode\": \"切换模式\",\n\t\"cycle inherit/+/-\": \"循环 继承/+/-\",\n\ttoggle: \"切换\",\n\tclose: \"关闭\",\n\t\"{config}/settings.json · inherited global resources are dimmed\":\n\t\t\"{config}/settings.json · 继承的全局资源以暗色显示\",\n\t\"No resources found\": \"未找到资源\",\n\t\"inherited global\": \"继承自全局\",\n\t\"project load\": \"项目加载\",\n\t\"project unload\": \"项目卸载\",\n\n\t// ---- model-selector / scoped-models-selector / thinking-selector ----\n\t\"Model Configuration\": \"模型配置\",\n\t\"Session-only. {key} to save to settings.\": \"仅本次会话生效。按 {key} 保存到设置。\",\n\t\"all enabled\": \"全部已启用\",\n\t\"{enabled}/{total} enabled\": \"已启用 {enabled}/{total}\",\n\t\"{count} unavailable\": \"{count} 个不可用\",\n\tall: \"全部\",\n\tclear: \"清空\",\n\treorder: \"排序\",\n\tsave: \"保存\",\n\t\"(unsaved)\": \"(未保存)\",\n\t\"No matching models\": \"没有匹配的模型\",\n\t\"[unavailable]\": \"[不可用]\",\n\t\"Model Name: {name}\": \"模型名称:{name}\",\n\t\"Model unavailable\": \"模型不可用\",\n\t\"Refreshing model catalogs…\": \"正在刷新模型目录…\",\n\t\"Only showing models from configured providers. Use /login to add providers.\":\n\t\t\"仅显示已配置 provider 的模型。使用 /login 添加 provider。\",\n\t\"{confirm} to select · {save} to set as default · {cancel} to cancel\":\n\t\t\"{confirm} 选择 · {save} 设为默认 · {cancel} 取消\",\n\t\"Model refresh timed out; showing cached models.\": \"模型刷新超时;显示缓存模型。\",\n\t\"Could not refresh {provider}; showing cached models.\": \"无法刷新 {provider};显示缓存的模型。\",\n\t\"Could not refresh {count} model catalogs ({providers}); showing cached models.\":\n\t\t\"无法刷新 {count} 个模型目录({providers});显示缓存的模型。\",\n\t\"Model catalogs refreshed.\": \"模型目录已刷新。\",\n\t\"Could not refresh model catalogs: {error}\": \"无法刷新模型目录:{error}\",\n\tscoped: \"会话内\",\n\t\"Scope:\": \"范围:\",\n\t\"(all/scoped)\": \"(全部/会话内)\",\n\tdefault: \"默认\",\n\t\"Thinking Level\": \"思考级别\",\n\t\"{key} sets thinking level\": \"{key} 设置思考级别\",\n\n\t// ---- oauth-selector / login-dialog ----\n\tsubscription: \"订阅\",\n\t\"Select provider to configure:\": \"选择要配置的 provider:\",\n\t\"Select provider to logout:\": \"选择要登出的 provider:\",\n\t\"No providers available\": \"无可用 provider\",\n\t\"No providers logged in. Use /login first.\": \"没有已登录的 provider。请先使用 /login。\",\n\t\"No matching providers\": \"没有匹配的 provider\",\n\tunconfigured: \"未配置\",\n\t\"subscription configured\": \"已配置订阅\",\n\t\"API key configured\": \"已配置 API key\",\n\t\"API key\": \"API key\",\n\tconfigured: \"已配置\",\n\t\"env: {source}\": \"环境变量:{source}\",\n\t\"Login to {provider}\": \"登录 {provider}\",\n\t\"Login cancelled\": \"登录已取消\",\n\t\"Cmd+click to open\": \"Cmd+点击打开\",\n\t\"Ctrl+click to open\": \"Ctrl+点击打开\",\n\t\"Enter code: {code}\": \"输入代码:{code}\",\n\t\"to cancel\": \"取消\",\n\t\"e.g., {placeholder}\": \"例如,{placeholder}\",\n\t\"to cancel,\": \"取消,\",\n\t\"to submit\": \"提交\",\n\t\"to close\": \"关闭\",\n\n\t// ---- first-time-setup ----\n\t\"Welcome to {name}, the minimal coding agent.\": \"欢迎使用 {name},极简编码 agent。\",\n\t\"Pick a theme.\": \"选择一个主题。\",\n\t\"Detected system appearance: {theme}\": \"检测到系统外观:{theme}\",\n\t\"Opt-in to anonymous usage data sharing?\": \"是否加入匿名使用数据分享?\",\n\t\"Opting in stores a tracking identifier in settings.json and enables anonymous\\nusage analytics. This helps us to better debug, reproduce, and resolve issues\\nand bugs within Agent Forge. You can observe what is shared using /privacy and make\\nchanges anytime in settings.json.\":\n\t\t\"选择加入后会在 settings.json 中存储一个追踪标识符,并启用匿名使用分析。\\n这有助于我们更好地调试、复现并解决 Agent Forge 中的问题与缺陷。\\n你可以使用 /privacy 查看所分享的内容,并可随时在 settings.json 中更改。\",\n\tDark: \"深色\",\n\tLight: \"浅色\",\n\t\"Share anonymous usage data\": \"分享匿名使用数据\",\n\t\"Don't share\": \"不分享\",\n\tnavigate: \"导航\",\n\tcontinue: \"继续\",\n\tfinish: \"完成\",\n\t\"skip setup\": \"跳过设置\",\n\n\t// ---- plugin-manager-entry / plugin-selection-entry ----\n\t\"catalog {count}\": \"目录 {count}\",\n\t\"catalog unavailable\": \"目录不可用\",\n\t\", bounded\": \",已截断\",\n\t\"Plugin manager · {state}{bounded} · Enter open\": \"插件管理器 · {state}{bounded} · Enter 打开\",\n\t\"Plugin manager\": \"插件管理器\",\n\t\"Working…\": \"处理中…\",\n\t\"Confirm {action} {plugin}@{version}? Enter confirm · Esc cancel\":\n\t\t\"确认{action} {plugin}@{version}?Enter 确认 · Esc 取消\",\n\t\"Error: {code}\": \"错误:{code}\",\n\t\"No plugins available\": \"无可用插件\",\n\t\"installed {version}\": \"已安装 {version}\",\n\t\"Action: {action} · Tab switch action · Enter confirm\": \"操作:{action} · Tab 切换操作 · Enter 确认\",\n\t\"Selected plugin is unavailable\": \"所选插件不可用\",\n\t\"(list bounded)\": \"(列表已截断)\",\n\t\"↑↓ navigate · Esc close\": \"↑↓ 导航 · Esc 关闭\",\n\t\"Plugins: unsupported (host selection entry not injected)\": \"插件:不支持(宿主选择入口未注入)\",\n\t\"Plugins · {profile}\": \"插件 · {profile}\",\n\t\"Enter/Space toggle · Esc close\": \"Enter/空格 切换 · Esc 关闭\",\n\t\"selected {selected}, disabled {disabled}\": \"已选 {selected},已禁用 {disabled}\",\n\t\"selection pending\": \"选择待定\",\n\t\"selection not loaded\": \"选择未加载\",\n\t\"catalog {count} ({ready} ready, {unavailable} unavailable)\": \"目录 {count}({ready} 就绪,{unavailable} 不可用)\",\n\t\"host store\": \"宿主存储\",\n\t\"open via host callback\": \"经宿主回调打开\",\n\t\"Plugins: profile {profile} · {selection} · {catalog} · {suffix}\":\n\t\t\"插件:配置文件 {profile} · {selection} · {catalog} · {suffix}\",\n\n\t// ---- tree-selector / tree-list ----\n\t\"Type to search:\": \"输入以搜索:\",\n\tmove: \"移动\",\n\tpage: \"翻页\",\n\tbranch: \"分支\",\n\tcopy: \"复制\",\n\tlabel: \"标签\",\n\t\"label time\": \"标签时间\",\n\tfilters: \"过滤器\",\n\tcycle: \"循环\",\n\t\"Label (empty to remove):\": \"标签(留空移除):\",\n\t\"Session Tree\": \"会话树\",\n\t\"[no-tools]\": \"[无工具]\",\n\t\"[user]\": \"[用户]\",\n\t\"[labeled]\": \"[已标注]\",\n\t\"[all]\": \"[全部]\",\n\t\"[+label time]\": \"[+标签时间]\",\n\t\"No entries found\": \"未找到条目\",\n};\n"]}
|
|
1
|
+
{"version":3,"file":"tui-components-selectors.js","sourceRoot":"","sources":["../../../../../src/core/i18n/locales/zh-cn/tui-components-selectors.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * 批次④ selectors 域词典(docs/design/国际化与本地化.md §词典结构):\n * 覆盖 components/ 下的 settings-selector、session-selector、config-selector、\n * model-selector、scoped-models-selector、thinking-selector、oauth-selector、\n * login-dialog、first-time-setup、plugin-manager-entry、plugin-selection-entry、\n * tree-selector、tree-list。key 为英文原文(与调用点逐字一致;`t()` 会 trim\n * key,故调用点的前导/尾随空白一律在 `t()` 外拼接,key 本身不含首尾空白),\n * value 为简体中文译文,`{占位符}` 原样保留。数据值(config 值、role 名、\n * plugin status/action)不入词典(调用点保留原文)。\n */\nexport const tuiComponentsSelectors: Record<string, string> = {\n\t// ---- settings-selector ----\n\t\"No reasoning\": \"无推理\",\n\t\"Very brief reasoning (~1k tokens)\": \"极简推理(约 1k tokens)\",\n\t\"Light reasoning (~2k tokens)\": \"轻度推理(约 2k tokens)\",\n\t\"Moderate reasoning (~8k tokens)\": \"中度推理(约 8k tokens)\",\n\t\"Deep reasoning (~16k tokens)\": \"深度推理(约 16k tokens)\",\n\t\"Extra-high reasoning (~32k tokens)\": \"超高推理(约 32k tokens)\",\n\t\"Maximum reasoning\": \"最大推理\",\n\t\"Anthropic extra usage\": \"Anthropic 额外用量\",\n\t\"Warn when Anthropic subscription auth may use paid extra usage\": \"当 Anthropic 订阅认证可能使用付费额外用量时警告\",\n\tnone: \"无\",\n\t\"{count} configured\": \"已配置 {count} 项\",\n\tAutomatic: \"自动\",\n\t\"Use separate themes for light and dark terminal appearance\": \"为终端浅色与深色外观分别使用不同主题\",\n\tTheme: \"主题\",\n\t\"Select a theme, or choose Automatic to follow terminal appearance.\": \"选择一个主题,或选择“自动”跟随终端外观。\",\n\t\"Automatic Theme\": \"自动主题\",\n\t\"Choose themes for terminal light and dark appearance.\": \"为终端浅色与深色外观选择主题。\",\n\t\"Light/dark detection requires terminal support.\": \"浅色/深色检测需要终端支持。\",\n\t\"Light theme\": \"浅色主题\",\n\t\"Theme to use in automatic mode when the terminal is light\": \"自动模式下终端为浅色时使用的主题\",\n\t\"Light Theme\": \"浅色主题\",\n\t\"Select the theme to use for light terminal appearance\": \"选择终端浅色外观时使用的主题\",\n\t\"Dark theme\": \"深色主题\",\n\t\"Theme to use in automatic mode when the terminal is dark\": \"自动模式下终端为深色时使用的主题\",\n\t\"Dark Theme\": \"深色主题\",\n\t\"Select the theme to use for dark terminal appearance\": \"选择终端深色外观时使用的主题\",\n\tApply: \"应用\",\n\t\"Save and go back\": \"保存并返回\",\n\t\"save and go back\": \"保存并返回\",\n\t\"Change mode\": \"切换模式\",\n\t\"Switch to one theme for light and dark\": \"切换为浅色与深色共用单一主题\",\n\t\"switch to single theme\": \"切换为单一主题\",\n\t\"Auto-compact\": \"自动压缩\",\n\t\"Automatically compact context when it gets too large\": \"上下文过大时自动压缩\",\n\t\"Steering mode\": \"转向模式\",\n\t\"Enter while streaming queues steering messages. 'one-at-a-time': deliver one, wait for response. 'all': deliver all at once.\":\n\t\t\"流式输出期间按 Enter 会将转向消息加入队列。'one-at-a-time':每次送达一条,等待响应。'all':一次性全部送达。\",\n\t\"Follow-up mode\": \"后续消息模式\",\n\t\"{key} queues follow-up messages until agent stops. 'one-at-a-time': deliver one, wait for response. 'all': deliver all at once.\":\n\t\t\"{key} 会将后续消息排队直至 agent 停止。'one-at-a-time':每次送达一条,等待响应。'all':一次性全部送达。\",\n\tTransport: \"传输方式\",\n\t\"Preferred transport for providers that support multiple transports\": \"支持多种传输方式的 provider 的首选传输方式\",\n\t\"HTTP idle timeout\": \"HTTP 空闲超时\",\n\t\"Maximum idle gap while waiting for HTTP headers or body chunks. Disable for local models that pause longer than five minutes.\":\n\t\t\"等待 HTTP 头或正文分块时的最大空闲间隔。本地模型暂停超过五分钟时请禁用。\",\n\t\"Hide thinking\": \"隐藏思考\",\n\t\"Hide thinking blocks in assistant responses\": \"隐藏助手回复中的思考块\",\n\t\"Mermaid diagrams\": \"Mermaid 图表\",\n\t\"Render Mermaid code blocks as Unicode diagrams\": \"将 Mermaid 代码块渲染为 Unicode 图表\",\n\t\"Cache miss notices\": \"缓存未命中提示\",\n\t\"Show transcript notices for cache costs and provider recovery diagnostics\":\n\t\t\"显示缓存成本与 provider 恢复诊断的会话记录提示\",\n\t\"Collapse changelog\": \"折叠更新日志\",\n\t\"Show condensed changelog after updates\": \"更新后显示精简版更新日志\",\n\t\"Quiet startup\": \"安静启动\",\n\t\"Disable verbose printing at startup\": \"禁用启动时的详细输出\",\n\t\"Double-escape action\": \"双击 Escape 动作\",\n\t\"Action when pressing Escape twice with empty editor\": \"编辑器为空时连按两次 Escape 执行的动作\",\n\t\"Interface language\": \"界面语言\",\n\t\"Language for UI text; takes effect immediately\": \"界面文本语言,立即生效\",\n\t\"Tree filter mode\": \"树视图过滤模式\",\n\t\"Default filter when opening /tree\": \"打开 /tree 时的默认过滤器\",\n\tWarnings: \"警告\",\n\t\"Enable or disable individual warnings\": \"启用或禁用各项警告\",\n\tconfigure: \"配置\",\n\t\"Default thinking level per model\": \"各模型默认思考级别\",\n\t\"Override the default thinking level for specific models. {key} cycles in-session.\":\n\t\t\"为特定模型覆盖默认思考级别。{key} 可在会话内循环切换。\",\n\t\"Per-Model Thinking Level\": \"各模型思考级别\",\n\t\"Select a model to configure\": \"选择要配置的模型\",\n\t\"No models available\": \"无可用模型\",\n\t\"Log in to a provider or configure an API key first\": \"请先登录 provider 或配置 API key\",\n\t\"Thinking Level for {model}\": \"{model} 的思考级别\",\n\t\"Select default thinking level for this model\": \"选择该模型的默认思考级别\",\n\t\"(clear override)\": \"(清除覆盖)\",\n\t\"Revert to global default ({level})\": \"恢复全局默认({level})\",\n\t\"TUI mode\": \"TUI 模式\",\n\t\"Interface layout; fullscreen mode is experimental\": \"界面布局;全屏模式为实验性\",\n\t\"Fullscreen exit output\": \"全屏退出输出\",\n\t\"Print the transcript or only a session resume hint when exiting fullscreen mode\":\n\t\t\"退出全屏模式时打印完整会话记录或仅打印会话恢复提示\",\n\t\"Fullscreen scrollbar\": \"全屏滚动条\",\n\t\"Scrollbar behavior in fullscreen mode; has no effect in regular mode\": \"全屏模式下的滚动条行为;常规模式下无效\",\n\t\"Fullscreen copy on select\": \"全屏选中即复制\",\n\t\"Automatically copy selected text in fullscreen mode; disable to copy selections with Ctrl+X\":\n\t\t\"全屏模式下自动复制选中文本;禁用后用 Ctrl+X 复制所选内容\",\n\t\"Fullscreen wheel scroll lines\": \"全屏滚轮滚动行数\",\n\t\"Lines scrolled per wheel event in fullscreen mode; auto accelerates with scroll speed\":\n\t\t\"全屏模式下每个滚轮事件滚动的行数;auto 随滚动速度加速\",\n\t\"Color theme for the interface\": \"界面配色主题\",\n\t\"Show images\": \"显示图片\",\n\t\"Render images inline in terminal\": \"在终端内联渲染图片\",\n\t\"Image width\": \"图片宽度\",\n\t\"Preferred inline image width in terminal cells\": \"首选的内联图片宽度(终端单元格)\",\n\t\"Auto-resize images\": \"自动缩放图片\",\n\t\"Resize large images to 2000x2000 max for better model compatibility\": \"将大图缩放至最大 2000x2000 以提升模型兼容性\",\n\t\"Block images\": \"阻止图片\",\n\t\"Prevent images from being sent to LLM providers\": \"阻止图片发送给 LLM provider\",\n\t\"Show hardware cursor\": \"显示硬件光标\",\n\t\"Show the terminal cursor while still positioning it for IME support\": \"显示终端光标,同时保持其定位以支持输入法\",\n\t\"Editor padding\": \"编辑器内边距\",\n\t\"Horizontal padding for input editor (0-3)\": \"输入编辑器的水平内边距(0-3)\",\n\t\"Output padding\": \"输出内边距\",\n\t\"Horizontal padding for user messages, assistant messages, and thinking\": \"用户消息、助手消息与思考内容的水平内边距\",\n\t\"Autocomplete max items\": \"自动补全最大条目数\",\n\t\"Max visible items in autocomplete dropdown (3-20)\": \"自动补全下拉菜单可见的最大条目数(3-20)\",\n\t\"Clear on shrink\": \"收缩时清屏\",\n\t\"Clear empty rows when content shrinks (may cause flicker)\": \"内容收缩时清除空行(可能导致闪烁)\",\n\t\"Terminal progress\": \"终端进度\",\n\t\"Show OSC 9;4 progress indicators in the terminal tab bar\": \"在终端标签栏显示 OSC 9;4 进度指示\",\n\n\t// ---- session-selector ----\n\t\"Resume Session (Current Folder)\": \"恢复会话(当前文件夹)\",\n\t\"Resume Session (All)\": \"恢复会话(全部)\",\n\t\"Resume Session (All Suites)\": \"恢复会话(所有 Suite)\",\n\t\"Resume Session (Suite: {suite})\": \"恢复会话(Suite:{suite})\",\n\tThreaded: \"线程式\",\n\tRecent: \"最近\",\n\tFuzzy: \"模糊\",\n\t\"Sort:\": \"排序:\",\n\tAll: \"全部\",\n\tNamed: \"已命名\",\n\t\"Name:\": \"名称:\",\n\t\"○ Current Folder\": \"○ 当前文件夹\",\n\t\"Loading {progress}\": \"加载中 {progress}\",\n\t\"◉ Current Folder\": \"◉ 当前文件夹\",\n\t\"○ All\": \"○ 全部\",\n\t\"◉ All\": \"◉ 全部\",\n\t\"Delete session? {confirm} · {cancel}\": \"删除会话?{confirm} · {cancel}\",\n\tconfirm: \"确认\",\n\tcancel: \"取消\",\n\t\"path (on)\": \"路径 (开)\",\n\t\"path (off)\": \"路径 (关)\",\n\tscope: \"范围\",\n\t're:<pattern> regex · \"phrase\" exact': 're:<模式> 正则 · \"词组\" 精确',\n\tsort: \"排序\",\n\tnamed: \"命名过滤\",\n\tdelete: \"删除\",\n\trename: \"重命名\",\n\t\"Cannot delete the currently active session\": \"无法删除当前活动会话\",\n\t\"No named sessions found. Press {key} to show all.\": \"未找到已命名会话。按 {key} 显示全部。\",\n\t\"No named sessions in current folder. Press {key} to show all, or Tab to view all.\":\n\t\t\"当前文件夹无已命名会话。按 {key} 显示全部,或按 Tab 查看全部。\",\n\t\"No sessions found\": \"未找到会话\",\n\t\"No sessions in current folder. Press Tab to view all.\": \"当前文件夹无会话。按 Tab 查看全部。\",\n\t\"Show sessions from all suites\": \"显示所有 suite 的会话\",\n\t\"Show current suite sessions only\": \"仅显示当前 suite 的会话\",\n\t\"Session moved to trash\": \"会话已移入回收站\",\n\t\"Session deleted\": \"会话已删除\",\n\t\"Unknown error\": \"未知错误\",\n\t\"Failed to delete: {error}\": \"删除失败:{error}\",\n\t\"Rename Session\": \"重命名会话\",\n\t\"{confirm} to save · {cancel} to cancel\": \"{confirm} 保存 · {cancel} 取消\",\n\t\"Failed to load sessions: {message}\": \"加载会话失败:{message}\",\n\n\t// ---- config-selector ----\n\tSkills: \"技能\",\n\tPrompts: \"提示词\",\n\tThemes: \"主题\",\n\t\"User ({dir})\": \"用户({dir})\",\n\t\"Project ({dir})\": \"项目({dir})\",\n\t\"User settings\": \"用户设置\",\n\t\"Project settings\": \"项目设置\",\n\t\"Project Local Resources\": \"项目本地资源\",\n\t\"Global Resources\": \"全局资源\",\n\t\"switch mode\": \"切换模式\",\n\t\"cycle inherit/+/-\": \"循环 继承/+/-\",\n\ttoggle: \"切换\",\n\tclose: \"关闭\",\n\t\"{config}/settings.json · inherited global resources are dimmed\":\n\t\t\"{config}/settings.json · 继承的全局资源以暗色显示\",\n\t\"No resources found\": \"未找到资源\",\n\t\"inherited global\": \"继承自全局\",\n\t\"project load\": \"项目加载\",\n\t\"project unload\": \"项目卸载\",\n\n\t// ---- model-selector / scoped-models-selector / thinking-selector ----\n\t\"Model Configuration\": \"模型配置\",\n\t\"Session-only. {key} to save to settings.\": \"仅本次会话生效。按 {key} 保存到设置。\",\n\t\"all enabled\": \"全部已启用\",\n\t\"{enabled}/{total} enabled\": \"已启用 {enabled}/{total}\",\n\t\"{count} unavailable\": \"{count} 个不可用\",\n\tall: \"全部\",\n\tclear: \"清空\",\n\treorder: \"排序\",\n\tsave: \"保存\",\n\t\"(unsaved)\": \"(未保存)\",\n\t\"No matching models\": \"没有匹配的模型\",\n\t\"[unavailable]\": \"[不可用]\",\n\t\"Model Name: {name}\": \"模型名称:{name}\",\n\t\"Model unavailable\": \"模型不可用\",\n\t\"Refreshing model catalogs…\": \"正在刷新模型目录…\",\n\t\"Only showing models from configured providers. Use /login to add providers.\":\n\t\t\"仅显示已配置 provider 的模型。使用 /login 添加 provider。\",\n\t\"{confirm} to select · {save} to set as default · {cancel} to cancel\":\n\t\t\"{confirm} 选择 · {save} 设为默认 · {cancel} 取消\",\n\t\"Model refresh timed out; showing cached models.\": \"模型刷新超时;显示缓存模型。\",\n\t\"Could not refresh {provider}; showing cached models.\": \"无法刷新 {provider};显示缓存的模型。\",\n\t\"Could not refresh {count} model catalogs ({providers}); showing cached models.\":\n\t\t\"无法刷新 {count} 个模型目录({providers});显示缓存的模型。\",\n\t\"Model catalogs refreshed.\": \"模型目录已刷新。\",\n\t\"Could not refresh model catalogs: {error}\": \"无法刷新模型目录:{error}\",\n\tscoped: \"会话内\",\n\t\"Scope:\": \"范围:\",\n\t\"(all/scoped)\": \"(全部/会话内)\",\n\tdefault: \"默认\",\n\t\"Thinking Level\": \"思考级别\",\n\t\"{key} sets thinking level\": \"{key} 设置思考级别\",\n\n\t// ---- oauth-selector / login-dialog ----\n\tsubscription: \"订阅\",\n\t\"Select provider to configure:\": \"选择要配置的 provider:\",\n\t\"Select provider to logout:\": \"选择要登出的 provider:\",\n\t\"No providers available\": \"无可用 provider\",\n\t\"No providers logged in. Use /login first.\": \"没有已登录的 provider。请先使用 /login。\",\n\t\"No matching providers\": \"没有匹配的 provider\",\n\tunconfigured: \"未配置\",\n\t\"subscription configured\": \"已配置订阅\",\n\t\"API key configured\": \"已配置 API key\",\n\t\"API key\": \"API key\",\n\tconfigured: \"已配置\",\n\t\"env: {source}\": \"环境变量:{source}\",\n\t\"Login to {provider}\": \"登录 {provider}\",\n\t\"Login cancelled\": \"登录已取消\",\n\t\"Cmd+click to open\": \"Cmd+点击打开\",\n\t\"Ctrl+click to open\": \"Ctrl+点击打开\",\n\t\"Enter code: {code}\": \"输入代码:{code}\",\n\t\"to cancel\": \"取消\",\n\t\"e.g., {placeholder}\": \"例如,{placeholder}\",\n\t\"to cancel,\": \"取消,\",\n\t\"to submit\": \"提交\",\n\t\"to close\": \"关闭\",\n\n\t// ---- first-time-setup ----\n\t\"Welcome to {name}, the minimal coding agent.\": \"欢迎使用 {name},极简编码 agent。\",\n\t\"Pick a theme.\": \"选择一个主题。\",\n\t\"Detected system appearance: {theme}\": \"检测到系统外观:{theme}\",\n\t\"Opt-in to anonymous usage data sharing?\": \"是否加入匿名使用数据分享?\",\n\t\"Opting in stores a tracking identifier in settings.json and enables anonymous\\nusage analytics. This helps us to better debug, reproduce, and resolve issues\\nand bugs within Agent Forge. You can observe what is shared using /privacy and make\\nchanges anytime in settings.json.\":\n\t\t\"选择加入后会在 settings.json 中存储一个追踪标识符,并启用匿名使用分析。\\n这有助于我们更好地调试、复现并解决 Agent Forge 中的问题与缺陷。\\n你可以使用 /privacy 查看所分享的内容,并可随时在 settings.json 中更改。\",\n\tDark: \"深色\",\n\tLight: \"浅色\",\n\t\"Share anonymous usage data\": \"分享匿名使用数据\",\n\t\"Don't share\": \"不分享\",\n\tnavigate: \"导航\",\n\tcontinue: \"继续\",\n\tfinish: \"完成\",\n\t\"skip setup\": \"跳过设置\",\n\n\t// ---- plugin-manager-entry / plugin-selection-entry ----\n\t\"catalog {count}\": \"目录 {count}\",\n\t\"catalog unavailable\": \"目录不可用\",\n\t\", bounded\": \",已截断\",\n\t\"Plugin manager · {state}{bounded} · Enter open\": \"插件管理器 · {state}{bounded} · Enter 打开\",\n\t\"Plugin manager\": \"插件管理器\",\n\t\"Working…\": \"处理中…\",\n\t\"Confirm {action} {plugin}@{version}? Enter confirm · Esc cancel\":\n\t\t\"确认{action} {plugin}@{version}?Enter 确认 · Esc 取消\",\n\t\"Error: {code}\": \"错误:{code}\",\n\t\"No plugins available\": \"无可用插件\",\n\t\"installed {version}\": \"已安装 {version}\",\n\t\"Action: {action} · Tab switch action · Enter confirm\": \"操作:{action} · Tab 切换操作 · Enter 确认\",\n\t\"Selected plugin is unavailable\": \"所选插件不可用\",\n\t\"(list bounded)\": \"(列表已截断)\",\n\t\"↑↓ navigate · Esc close\": \"↑↓ 导航 · Esc 关闭\",\n\t\"Plugins: unsupported (host selection entry not injected)\": \"插件:不支持(宿主选择入口未注入)\",\n\t\"Plugins · {profile}\": \"插件 · {profile}\",\n\t\"Enter/Space toggle · Esc close\": \"Enter/空格 切换 · Esc 关闭\",\n\t\"selected {selected}, disabled {disabled}\": \"已选 {selected},已禁用 {disabled}\",\n\t\"selection pending\": \"选择待定\",\n\t\"selection not loaded\": \"选择未加载\",\n\t\"catalog {count} ({ready} ready, {unavailable} unavailable)\": \"目录 {count}({ready} 就绪,{unavailable} 不可用)\",\n\t\"host store\": \"宿主存储\",\n\t\"open via host callback\": \"经宿主回调打开\",\n\t\"Plugins: profile {profile} · {selection} · {catalog} · {suffix}\":\n\t\t\"插件:配置文件 {profile} · {selection} · {catalog} · {suffix}\",\n\n\t// ---- tree-selector / tree-list ----\n\t\"Type to search:\": \"输入以搜索:\",\n\tmove: \"移动\",\n\tpage: \"翻页\",\n\tbranch: \"分支\",\n\tcopy: \"复制\",\n\tlabel: \"标签\",\n\t\"label time\": \"标签时间\",\n\tfilters: \"过滤器\",\n\tcycle: \"循环\",\n\t\"Label (empty to remove):\": \"标签(留空移除):\",\n\t\"Session Tree\": \"会话树\",\n\t\"[no-tools]\": \"[无工具]\",\n\t\"[user]\": \"[用户]\",\n\t\"[labeled]\": \"[已标注]\",\n\t\"[all]\": \"[全部]\",\n\t\"[+label time]\": \"[+标签时间]\",\n\t\"No entries found\": \"未找到条目\",\n};\n"]}
|
|
@@ -276,7 +276,6 @@ declare const ModelOverrideSchema: Type.TObject<{
|
|
|
276
276
|
declare const ProviderConfigSchema: Type.TObject<{
|
|
277
277
|
name: Type.TOptional<Type.TString>;
|
|
278
278
|
baseUrl: Type.TOptional<Type.TString>;
|
|
279
|
-
apiKey: Type.TOptional<Type.TString>;
|
|
280
279
|
api: Type.TOptional<Type.TString>;
|
|
281
280
|
oauth: Type.TOptional<Type.TLiteral<"radius">>;
|
|
282
281
|
headers: Type.TOptional<Type.TRecord<"^.*$", Type.TString>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-config.d.ts","sourceRoot":"","sources":["../../src/core/model-config.ts"],"names":[],"mappings":"AAAA,wDAAwD;AAGxD,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAuK5C,QAAA,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkBzB,CAAC;AAEH,QAAA,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoBvB,CAAC;AAEH,QAAA,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAWxB,CAAC;AAOH,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACnE,MAAM,MAAM,uBAAuB,GAAG,MAAM,CAAC,OAAO,mBAAmB,CAAC,CAAC;AACzE,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAsBrE,yCAAyC;AACzC,qBAAa,WAAW;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0C;IACpE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqB;IAE3C,OAAO,eAGN;IAED,OAAa,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CAuC1E;IAED,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAE9D;IAED,cAAc,IAAI,SAAS,MAAM,EAAE,CAElC;IAED,QAAQ,IAAI,MAAM,GAAG,SAAS,CAE7B;IAED;;;;;;;;OAQG;IACH,oBAAoB,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC,CAa7F;CACD","sourcesContent":["/** Immutable, credential-blind models.json snapshot. */\n\nimport { readFile } from \"node:fs/promises\";\nimport { type Static, Type } from \"typebox\";\nimport { Compile } from \"typebox/compile\";\nimport type { TLocalizedValidationError } from \"typebox/error\";\nimport { stripJsonComments } from \"../utils/json.ts\";\nimport { normalizePath } from \"../utils/paths.ts\";\nimport { stripBom } from \"../utils/text.ts\";\n\nconst PercentileCutoffsSchema = Type.Object({\n\tp50: Type.Optional(Type.Number()),\n\tp75: Type.Optional(Type.Number()),\n\tp90: Type.Optional(Type.Number()),\n\tp99: Type.Optional(Type.Number()),\n});\n\nconst OpenRouterRoutingSchema = Type.Object({\n\tallow_fallbacks: Type.Optional(Type.Boolean()),\n\trequire_parameters: Type.Optional(Type.Boolean()),\n\tdata_collection: Type.Optional(Type.Union([Type.Literal(\"deny\"), Type.Literal(\"allow\")])),\n\tzdr: Type.Optional(Type.Boolean()),\n\tenforce_distillable_text: Type.Optional(Type.Boolean()),\n\torder: Type.Optional(Type.Array(Type.String())),\n\tonly: Type.Optional(Type.Array(Type.String())),\n\tignore: Type.Optional(Type.Array(Type.String())),\n\tquantizations: Type.Optional(Type.Array(Type.String())),\n\tsort: Type.Optional(\n\t\tType.Union([\n\t\t\tType.String(),\n\t\t\tType.Object({\n\t\t\t\tby: Type.Optional(Type.String()),\n\t\t\t\tpartition: Type.Optional(Type.Union([Type.String(), Type.Null()])),\n\t\t\t}),\n\t\t]),\n\t),\n\tmax_price: Type.Optional(\n\t\tType.Object({\n\t\t\tprompt: Type.Optional(Type.Union([Type.Number(), Type.String()])),\n\t\t\tcompletion: Type.Optional(Type.Union([Type.Number(), Type.String()])),\n\t\t\timage: Type.Optional(Type.Union([Type.Number(), Type.String()])),\n\t\t\taudio: Type.Optional(Type.Union([Type.Number(), Type.String()])),\n\t\t\trequest: Type.Optional(Type.Union([Type.Number(), Type.String()])),\n\t\t}),\n\t),\n\tpreferred_min_throughput: Type.Optional(Type.Union([Type.Number(), PercentileCutoffsSchema])),\n\tpreferred_max_latency: Type.Optional(Type.Union([Type.Number(), PercentileCutoffsSchema])),\n});\n\nconst VercelGatewayRoutingSchema = Type.Object({\n\tonly: Type.Optional(Type.Array(Type.String())),\n\torder: Type.Optional(Type.Array(Type.String())),\n});\n\nconst ThinkingLevelMapValueSchema = Type.Union([Type.String(), Type.Null()]);\nconst ThinkingLevelMapSchema = Type.Object({\n\toff: Type.Optional(ThinkingLevelMapValueSchema),\n\tminimal: Type.Optional(ThinkingLevelMapValueSchema),\n\tlow: Type.Optional(ThinkingLevelMapValueSchema),\n\tmedium: Type.Optional(ThinkingLevelMapValueSchema),\n\thigh: Type.Optional(ThinkingLevelMapValueSchema),\n\txhigh: Type.Optional(ThinkingLevelMapValueSchema),\n\tmax: Type.Optional(ThinkingLevelMapValueSchema),\n});\n\nconst ChatTemplateKwargScalarSchema = Type.Union([Type.String(), Type.Number(), Type.Boolean(), Type.Null()]);\nconst ChatTemplateKwargVariableSchema = Type.Object({\n\t$var: Type.Union([Type.Literal(\"thinking.enabled\"), Type.Literal(\"thinking.effort\")]),\n\tomitWhenOff: Type.Optional(Type.Boolean()),\n});\nconst ChatTemplateKwargSchema = Type.Union([ChatTemplateKwargScalarSchema, ChatTemplateKwargVariableSchema]);\n\nconst OpenAICompletionsCompatSchema = Type.Object({\n\tsupportsStore: Type.Optional(Type.Boolean()),\n\tsupportsDeveloperRole: Type.Optional(Type.Boolean()),\n\tsupportsReasoningEffort: Type.Optional(Type.Boolean()),\n\tsupportsUsageInStreaming: Type.Optional(Type.Boolean()),\n\tsupportsFinishReason: Type.Optional(Type.Boolean()),\n\tmaxTokensField: Type.Optional(Type.Union([Type.Literal(\"max_completion_tokens\"), Type.Literal(\"max_tokens\")])),\n\trequiresToolResultName: Type.Optional(Type.Boolean()),\n\trequiresAssistantAfterToolResult: Type.Optional(Type.Boolean()),\n\trequiresThinkingAsText: Type.Optional(Type.Boolean()),\n\trequiresReasoningContentOnAssistantMessages: Type.Optional(Type.Boolean()),\n\tthinkingFormat: Type.Optional(\n\t\tType.Union([\n\t\t\tType.Literal(\"openai\"),\n\t\t\tType.Literal(\"openrouter\"),\n\t\t\tType.Literal(\"together\"),\n\t\t\tType.Literal(\"baseten\"),\n\t\t\tType.Literal(\"deepseek\"),\n\t\t\tType.Literal(\"zai\"),\n\t\t\tType.Literal(\"qwen\"),\n\t\t\tType.Literal(\"chat-template\"),\n\t\t\tType.Literal(\"qwen-chat-template\"),\n\t\t\tType.Literal(\"string-thinking\"),\n\t\t\tType.Literal(\"ant-ling\"),\n\t\t]),\n\t),\n\tchatTemplateKwargs: Type.Optional(Type.Record(Type.String(), ChatTemplateKwargSchema)),\n\tchatTemplateArgs: Type.Optional(Type.Record(Type.String(), ChatTemplateKwargSchema)),\n\tcacheControlFormat: Type.Optional(Type.Literal(\"anthropic\")),\n\topenRouterRouting: Type.Optional(OpenRouterRoutingSchema),\n\tvercelGatewayRouting: Type.Optional(VercelGatewayRoutingSchema),\n\tsupportsOpenAIGrammarTools: Type.Optional(Type.Boolean()),\n\tsupportsStrictMode: Type.Optional(Type.Boolean()),\n\tsendSessionAffinityHeaders: Type.Optional(Type.Boolean()),\n\tdeferredToolsMode: Type.Optional(Type.Literal(\"kimi\")),\n\tsessionAffinityFormat: Type.Optional(\n\t\tType.Union([Type.Literal(\"openai\"), Type.Literal(\"openai-nosession\"), Type.Literal(\"openrouter\")]),\n\t),\n\tsupportsLongCacheRetention: Type.Optional(Type.Boolean()),\n});\n\nconst OpenAIResponsesCompatSchema = Type.Object({\n\tsupportsDeveloperRole: Type.Optional(Type.Boolean()),\n\tsessionAffinityFormat: Type.Optional(\n\t\tType.Union([Type.Literal(\"openai\"), Type.Literal(\"openai-nosession\"), Type.Literal(\"openrouter\")]),\n\t),\n\tsupportsLongCacheRetention: Type.Optional(Type.Boolean()),\n\tsupportsStrictMode: Type.Optional(Type.Boolean()),\n\tsupportsOpenAIGrammarTools: Type.Optional(Type.Boolean()),\n\tsupportsAdditionalTools: Type.Optional(Type.Boolean()),\n\tsupportsToolSearch: Type.Optional(Type.Boolean()),\n\tsupportsMaxOutputTokens: Type.Optional(Type.Boolean()),\n});\n\nconst ModelCostRatesSchema = {\n\tinput: Type.Number(),\n\toutput: Type.Number(),\n\tcacheRead: Type.Number(),\n\tcacheWrite: Type.Number(),\n};\nconst ModelCostTierSchema = Type.Object({\n\tinputTokensAbove: Type.Number(),\n\t...ModelCostRatesSchema,\n});\nconst ModelCostSchema = Type.Object({\n\t...ModelCostRatesSchema,\n\ttiers: Type.Optional(Type.Array(ModelCostTierSchema)),\n});\n\nconst AnthropicMessagesCompatSchema = Type.Object({\n\tsupportsEagerToolInputStreaming: Type.Optional(Type.Boolean()),\n\tsupportsLongCacheRetention: Type.Optional(Type.Boolean()),\n\tsendSessionAffinityHeaders: Type.Optional(Type.Boolean()),\n\tsupportsCacheControlOnTools: Type.Optional(Type.Boolean()),\n\tsupportsTemperature: Type.Optional(Type.Boolean()),\n\tforceAdaptiveThinking: Type.Optional(Type.Boolean()),\n\tallowEmptySignature: Type.Optional(Type.Boolean()),\n\tsupportsStrictTools: Type.Optional(Type.Boolean()),\n\tsupportsMidConvoEffort: Type.Optional(Type.Boolean()),\n\tsupportsToolReferences: Type.Optional(Type.Boolean()),\n\tallowedFallbackModels: Type.Optional(\n\t\tType.Array(\n\t\t\tType.Object({\n\t\t\t\tprovider: Type.String({ minLength: 1 }),\n\t\t\t\tmodel: Type.String({ minLength: 1 }),\n\t\t\t\tcost: ModelCostSchema,\n\t\t\t}),\n\t\t\t{ maxItems: 3 },\n\t\t),\n\t),\n});\n\nconst ProviderCompatSchema = Type.Union([\n\tOpenAICompletionsCompatSchema,\n\tOpenAIResponsesCompatSchema,\n\tAnthropicMessagesCompatSchema,\n]);\n\nconst ModelDefinitionSchema = Type.Object({\n\tid: Type.String({ minLength: 1 }),\n\tname: Type.Optional(Type.String({ minLength: 1 })),\n\tapi: Type.Optional(Type.String({ minLength: 1 })),\n\tbaseUrl: Type.Optional(Type.String({ minLength: 1 })),\n\treasoning: Type.Optional(Type.Boolean()),\n\tthinkingLevelMap: Type.Optional(ThinkingLevelMapSchema),\n\tinput: Type.Optional(Type.Array(Type.Union([Type.Literal(\"text\"), Type.Literal(\"image\")]))),\n\t// 供应商能力槽位(设计 §3.1):语义与既有 ImagesModel.output 对齐,缺省 =\n\t// 纯文本(undefined 视为 [\"text\"])。生图供应商在 models.json 登记\n\t// \"output\": [\"image\"] 的模型即进入宿主注入的生图模型目录快照。\n\toutput: Type.Optional(Type.Array(Type.Union([Type.Literal(\"text\"), Type.Literal(\"image\")]))),\n\tcost: Type.Optional(ModelCostSchema),\n\tcontextWindow: Type.Optional(Type.Number()),\n\tmaxTokens: Type.Optional(Type.Number()),\n\tsamplingParams: Type.Optional(Type.Record(Type.String(), Type.Unknown())),\n\theaders: Type.Optional(Type.Record(Type.String(), Type.String())),\n\tcompat: Type.Optional(ProviderCompatSchema),\n});\n\nconst ModelOverrideSchema = Type.Object({\n\tname: Type.Optional(Type.String({ minLength: 1 })),\n\treasoning: Type.Optional(Type.Boolean()),\n\tthinkingLevelMap: Type.Optional(ThinkingLevelMapSchema),\n\tinput: Type.Optional(Type.Array(Type.Union([Type.Literal(\"text\"), Type.Literal(\"image\")]))),\n\toutput: Type.Optional(Type.Array(Type.Union([Type.Literal(\"text\"), Type.Literal(\"image\")]))),\n\tcost: Type.Optional(\n\t\tType.Object({\n\t\t\tinput: Type.Optional(Type.Number()),\n\t\t\toutput: Type.Optional(Type.Number()),\n\t\t\tcacheRead: Type.Optional(Type.Number()),\n\t\t\tcacheWrite: Type.Optional(Type.Number()),\n\t\t\ttiers: Type.Optional(Type.Array(ModelCostTierSchema)),\n\t\t}),\n\t),\n\tcontextWindow: Type.Optional(Type.Number()),\n\tmaxTokens: Type.Optional(Type.Number()),\n\tsamplingParams: Type.Optional(Type.Record(Type.String(), Type.Unknown())),\n\theaders: Type.Optional(Type.Record(Type.String(), Type.String())),\n\tcompat: Type.Optional(ProviderCompatSchema),\n});\n\nconst ProviderConfigSchema = Type.Object({\n\tname: Type.Optional(Type.String({ minLength: 1 })),\n\tbaseUrl: Type.Optional(Type.String({ minLength: 1 })),\n\tapiKey: Type.Optional(Type.String({ minLength: 1 })),\n\tapi: Type.Optional(Type.String({ minLength: 1 })),\n\toauth: Type.Optional(Type.Literal(\"radius\")),\n\theaders: Type.Optional(Type.Record(Type.String(), Type.String())),\n\tcompat: Type.Optional(ProviderCompatSchema),\n\tauthHeader: Type.Optional(Type.Boolean()),\n\tmodels: Type.Optional(Type.Array(ModelDefinitionSchema)),\n\tmodelOverrides: Type.Optional(Type.Record(Type.String(), ModelOverrideSchema)),\n});\n\nconst ModelsConfigSchema = Type.Object({\n\tproviders: Type.Record(Type.String(), ProviderConfigSchema),\n});\nconst validateModelsConfig = Compile(ModelsConfigSchema);\n\nexport type ModelsJsonModel = Static<typeof ModelDefinitionSchema>;\nexport type ModelsJsonModelOverride = Static<typeof ModelOverrideSchema>;\nexport type ModelsJsonProvider = Static<typeof ProviderConfigSchema>;\ntype ModelsJson = Static<typeof ModelsConfigSchema>;\n\nfunction formatValidationPath(error: TLocalizedValidationError): string {\n\tif (error.keyword === \"required\") {\n\t\tconst requiredProperties = (error.params as { requiredProperties?: string[] }).requiredProperties;\n\t\tconst requiredProperty = requiredProperties?.[0];\n\t\tif (requiredProperty) {\n\t\t\tconst basePath = error.instancePath.replace(/^\\//, \"\").replace(/\\//g, \".\");\n\t\t\treturn basePath ? `${basePath}.${requiredProperty}` : requiredProperty;\n\t\t}\n\t}\n\tconst path = error.instancePath.replace(/^\\//, \"\").replace(/\\//g, \".\");\n\treturn path || \"root\";\n}\n\nfunction deepFreeze<T>(value: T): T {\n\tif (typeof value !== \"object\" || value === null || Object.isFrozen(value)) return value;\n\tfor (const child of Object.values(value)) deepFreeze(child);\n\treturn Object.freeze(value);\n}\n\n/** One immutable load of models.json. */\nexport class ModelConfig {\n\tprivate readonly providers: ReadonlyMap<string, ModelsJsonProvider>;\n\tprivate readonly error: string | undefined;\n\n\tprivate constructor(providers: ReadonlyMap<string, ModelsJsonProvider>, error?: string) {\n\t\tthis.providers = providers;\n\t\tthis.error = error;\n\t}\n\n\tstatic async load(modelsJsonPath: string | undefined): Promise<ModelConfig> {\n\t\tif (!modelsJsonPath) return new ModelConfig(new Map());\n\t\tconst path = normalizePath(modelsJsonPath);\n\t\tlet content: string;\n\t\ttry {\n\t\t\tcontent = await readFile(path, \"utf-8\");\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") return new ModelConfig(new Map());\n\t\t\treturn new ModelConfig(\n\t\t\t\tnew Map(),\n\t\t\t\t`Failed to load models.json: ${error instanceof Error ? error.message : error}\\n\\nFile: ${path}`,\n\t\t\t);\n\t\t}\n\n\t\tlet parsed: unknown;\n\t\ttry {\n\t\t\tparsed = JSON.parse(stripJsonComments(stripBom(content)));\n\t\t} catch (error) {\n\t\t\treturn new ModelConfig(\n\t\t\t\tnew Map(),\n\t\t\t\t`Failed to parse models.json: ${error instanceof Error ? error.message : error}\\n\\nFile: ${path}`,\n\t\t\t);\n\t\t}\n\n\t\tif (!validateModelsConfig.Check(parsed)) {\n\t\t\tconst errors =\n\t\t\t\tvalidateModelsConfig\n\t\t\t\t\t.Errors(parsed)\n\t\t\t\t\t.map((error) => ` - ${formatValidationPath(error)}: ${error.message}`)\n\t\t\t\t\t.join(\"\\n\") || \"Unknown schema error\";\n\t\t\treturn new ModelConfig(new Map(), `Invalid models.json schema:\\n${errors}\\n\\nFile: ${path}`);\n\t\t}\n\n\t\tconst config = parsed as ModelsJson;\n\t\tconst providers = new Map<string, ModelsJsonProvider>();\n\t\tfor (const [providerId, provider] of Object.entries(config.providers)) {\n\t\t\tproviders.set(providerId, deepFreeze(structuredClone(provider)));\n\t\t}\n\t\treturn new ModelConfig(providers);\n\t}\n\n\tgetProvider(providerId: string): ModelsJsonProvider | undefined {\n\t\treturn this.providers.get(providerId);\n\t}\n\n\tgetProviderIds(): readonly string[] {\n\t\treturn [...this.providers.keys()];\n\t}\n\n\tgetError(): string | undefined {\n\t\treturn this.error;\n\t}\n\n\t/**\n\t * 生图模型目录快照(供应商能力槽位设计 §3.2 推断供料):models.json 中\n\t * `output` 含 `image` 的模型按 provider 分组,供宿主在装配期经\n\t * `configOverride` 注入 image-generation 插件(注入键 `imageModelCatalog`)。\n\t * 快照为装配期静态数据;插件运行期按会话当前 provider 动态查询。内建\n\t * 聊天目录不参与——内建 images 目录走 chat modalities 协议,与插件消费的\n\t * `/images/generations` 端点协议不互通(设计 §3.2 第 4 层)。保持\n\t * models.json 登记顺序(确定性来源);无生图模型的 provider 不出现在键集中。\n\t */\n\tgetImageModelCatalog(): Readonly<Record<string, ReadonlyArray<{ id: string; name?: string }>>> {\n\t\tconst catalog: Record<string, Array<{ id: string; name?: string }>> = {};\n\t\tfor (const [providerId, provider] of this.providers) {\n\t\t\tconst imageModels = (provider.models ?? []).filter(\n\t\t\t\t(model) => Array.isArray(model.output) && model.output.includes(\"image\"),\n\t\t\t);\n\t\t\tif (imageModels.length === 0) continue;\n\t\t\tcatalog[providerId] = imageModels.map((model) => ({\n\t\t\t\tid: model.id,\n\t\t\t\t...(model.name === undefined ? {} : { name: model.name }),\n\t\t\t}));\n\t\t}\n\t\treturn deepFreeze(catalog);\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"model-config.d.ts","sourceRoot":"","sources":["../../src/core/model-config.ts"],"names":[],"mappings":"AAAA,wDAAwD;AAGxD,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAuK5C,QAAA,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkBzB,CAAC;AAEH,QAAA,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoBvB,CAAC;AAEH,QAAA,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUxB,CAAC;AAOH,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACnE,MAAM,MAAM,uBAAuB,GAAG,MAAM,CAAC,OAAO,mBAAmB,CAAC,CAAC;AACzE,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAsBrE,yCAAyC;AACzC,qBAAa,WAAW;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0C;IACpE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqB;IAE3C,OAAO,eAGN;IAED,OAAa,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CAmD1E;IAED,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAE9D;IAED,cAAc,IAAI,SAAS,MAAM,EAAE,CAElC;IAED,QAAQ,IAAI,MAAM,GAAG,SAAS,CAE7B;IAED;;;;;;;;OAQG;IACH,oBAAoB,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC,CAa7F;CACD","sourcesContent":["/** Immutable, credential-blind models.json snapshot. */\n\nimport { readFile } from \"node:fs/promises\";\nimport { type Static, Type } from \"typebox\";\nimport { Compile } from \"typebox/compile\";\nimport type { TLocalizedValidationError } from \"typebox/error\";\nimport { stripJsonComments } from \"../utils/json.ts\";\nimport { normalizePath } from \"../utils/paths.ts\";\nimport { stripBom } from \"../utils/text.ts\";\n\nconst PercentileCutoffsSchema = Type.Object({\n\tp50: Type.Optional(Type.Number()),\n\tp75: Type.Optional(Type.Number()),\n\tp90: Type.Optional(Type.Number()),\n\tp99: Type.Optional(Type.Number()),\n});\n\nconst OpenRouterRoutingSchema = Type.Object({\n\tallow_fallbacks: Type.Optional(Type.Boolean()),\n\trequire_parameters: Type.Optional(Type.Boolean()),\n\tdata_collection: Type.Optional(Type.Union([Type.Literal(\"deny\"), Type.Literal(\"allow\")])),\n\tzdr: Type.Optional(Type.Boolean()),\n\tenforce_distillable_text: Type.Optional(Type.Boolean()),\n\torder: Type.Optional(Type.Array(Type.String())),\n\tonly: Type.Optional(Type.Array(Type.String())),\n\tignore: Type.Optional(Type.Array(Type.String())),\n\tquantizations: Type.Optional(Type.Array(Type.String())),\n\tsort: Type.Optional(\n\t\tType.Union([\n\t\t\tType.String(),\n\t\t\tType.Object({\n\t\t\t\tby: Type.Optional(Type.String()),\n\t\t\t\tpartition: Type.Optional(Type.Union([Type.String(), Type.Null()])),\n\t\t\t}),\n\t\t]),\n\t),\n\tmax_price: Type.Optional(\n\t\tType.Object({\n\t\t\tprompt: Type.Optional(Type.Union([Type.Number(), Type.String()])),\n\t\t\tcompletion: Type.Optional(Type.Union([Type.Number(), Type.String()])),\n\t\t\timage: Type.Optional(Type.Union([Type.Number(), Type.String()])),\n\t\t\taudio: Type.Optional(Type.Union([Type.Number(), Type.String()])),\n\t\t\trequest: Type.Optional(Type.Union([Type.Number(), Type.String()])),\n\t\t}),\n\t),\n\tpreferred_min_throughput: Type.Optional(Type.Union([Type.Number(), PercentileCutoffsSchema])),\n\tpreferred_max_latency: Type.Optional(Type.Union([Type.Number(), PercentileCutoffsSchema])),\n});\n\nconst VercelGatewayRoutingSchema = Type.Object({\n\tonly: Type.Optional(Type.Array(Type.String())),\n\torder: Type.Optional(Type.Array(Type.String())),\n});\n\nconst ThinkingLevelMapValueSchema = Type.Union([Type.String(), Type.Null()]);\nconst ThinkingLevelMapSchema = Type.Object({\n\toff: Type.Optional(ThinkingLevelMapValueSchema),\n\tminimal: Type.Optional(ThinkingLevelMapValueSchema),\n\tlow: Type.Optional(ThinkingLevelMapValueSchema),\n\tmedium: Type.Optional(ThinkingLevelMapValueSchema),\n\thigh: Type.Optional(ThinkingLevelMapValueSchema),\n\txhigh: Type.Optional(ThinkingLevelMapValueSchema),\n\tmax: Type.Optional(ThinkingLevelMapValueSchema),\n});\n\nconst ChatTemplateKwargScalarSchema = Type.Union([Type.String(), Type.Number(), Type.Boolean(), Type.Null()]);\nconst ChatTemplateKwargVariableSchema = Type.Object({\n\t$var: Type.Union([Type.Literal(\"thinking.enabled\"), Type.Literal(\"thinking.effort\")]),\n\tomitWhenOff: Type.Optional(Type.Boolean()),\n});\nconst ChatTemplateKwargSchema = Type.Union([ChatTemplateKwargScalarSchema, ChatTemplateKwargVariableSchema]);\n\nconst OpenAICompletionsCompatSchema = Type.Object({\n\tsupportsStore: Type.Optional(Type.Boolean()),\n\tsupportsDeveloperRole: Type.Optional(Type.Boolean()),\n\tsupportsReasoningEffort: Type.Optional(Type.Boolean()),\n\tsupportsUsageInStreaming: Type.Optional(Type.Boolean()),\n\tsupportsFinishReason: Type.Optional(Type.Boolean()),\n\tmaxTokensField: Type.Optional(Type.Union([Type.Literal(\"max_completion_tokens\"), Type.Literal(\"max_tokens\")])),\n\trequiresToolResultName: Type.Optional(Type.Boolean()),\n\trequiresAssistantAfterToolResult: Type.Optional(Type.Boolean()),\n\trequiresThinkingAsText: Type.Optional(Type.Boolean()),\n\trequiresReasoningContentOnAssistantMessages: Type.Optional(Type.Boolean()),\n\tthinkingFormat: Type.Optional(\n\t\tType.Union([\n\t\t\tType.Literal(\"openai\"),\n\t\t\tType.Literal(\"openrouter\"),\n\t\t\tType.Literal(\"together\"),\n\t\t\tType.Literal(\"baseten\"),\n\t\t\tType.Literal(\"deepseek\"),\n\t\t\tType.Literal(\"zai\"),\n\t\t\tType.Literal(\"qwen\"),\n\t\t\tType.Literal(\"chat-template\"),\n\t\t\tType.Literal(\"qwen-chat-template\"),\n\t\t\tType.Literal(\"string-thinking\"),\n\t\t\tType.Literal(\"ant-ling\"),\n\t\t]),\n\t),\n\tchatTemplateKwargs: Type.Optional(Type.Record(Type.String(), ChatTemplateKwargSchema)),\n\tchatTemplateArgs: Type.Optional(Type.Record(Type.String(), ChatTemplateKwargSchema)),\n\tcacheControlFormat: Type.Optional(Type.Literal(\"anthropic\")),\n\topenRouterRouting: Type.Optional(OpenRouterRoutingSchema),\n\tvercelGatewayRouting: Type.Optional(VercelGatewayRoutingSchema),\n\tsupportsOpenAIGrammarTools: Type.Optional(Type.Boolean()),\n\tsupportsStrictMode: Type.Optional(Type.Boolean()),\n\tsendSessionAffinityHeaders: Type.Optional(Type.Boolean()),\n\tdeferredToolsMode: Type.Optional(Type.Literal(\"kimi\")),\n\tsessionAffinityFormat: Type.Optional(\n\t\tType.Union([Type.Literal(\"openai\"), Type.Literal(\"openai-nosession\"), Type.Literal(\"openrouter\")]),\n\t),\n\tsupportsLongCacheRetention: Type.Optional(Type.Boolean()),\n});\n\nconst OpenAIResponsesCompatSchema = Type.Object({\n\tsupportsDeveloperRole: Type.Optional(Type.Boolean()),\n\tsessionAffinityFormat: Type.Optional(\n\t\tType.Union([Type.Literal(\"openai\"), Type.Literal(\"openai-nosession\"), Type.Literal(\"openrouter\")]),\n\t),\n\tsupportsLongCacheRetention: Type.Optional(Type.Boolean()),\n\tsupportsStrictMode: Type.Optional(Type.Boolean()),\n\tsupportsOpenAIGrammarTools: Type.Optional(Type.Boolean()),\n\tsupportsAdditionalTools: Type.Optional(Type.Boolean()),\n\tsupportsToolSearch: Type.Optional(Type.Boolean()),\n\tsupportsMaxOutputTokens: Type.Optional(Type.Boolean()),\n});\n\nconst ModelCostRatesSchema = {\n\tinput: Type.Number(),\n\toutput: Type.Number(),\n\tcacheRead: Type.Number(),\n\tcacheWrite: Type.Number(),\n};\nconst ModelCostTierSchema = Type.Object({\n\tinputTokensAbove: Type.Number(),\n\t...ModelCostRatesSchema,\n});\nconst ModelCostSchema = Type.Object({\n\t...ModelCostRatesSchema,\n\ttiers: Type.Optional(Type.Array(ModelCostTierSchema)),\n});\n\nconst AnthropicMessagesCompatSchema = Type.Object({\n\tsupportsEagerToolInputStreaming: Type.Optional(Type.Boolean()),\n\tsupportsLongCacheRetention: Type.Optional(Type.Boolean()),\n\tsendSessionAffinityHeaders: Type.Optional(Type.Boolean()),\n\tsupportsCacheControlOnTools: Type.Optional(Type.Boolean()),\n\tsupportsTemperature: Type.Optional(Type.Boolean()),\n\tforceAdaptiveThinking: Type.Optional(Type.Boolean()),\n\tallowEmptySignature: Type.Optional(Type.Boolean()),\n\tsupportsStrictTools: Type.Optional(Type.Boolean()),\n\tsupportsMidConvoEffort: Type.Optional(Type.Boolean()),\n\tsupportsToolReferences: Type.Optional(Type.Boolean()),\n\tallowedFallbackModels: Type.Optional(\n\t\tType.Array(\n\t\t\tType.Object({\n\t\t\t\tprovider: Type.String({ minLength: 1 }),\n\t\t\t\tmodel: Type.String({ minLength: 1 }),\n\t\t\t\tcost: ModelCostSchema,\n\t\t\t}),\n\t\t\t{ maxItems: 3 },\n\t\t),\n\t),\n});\n\nconst ProviderCompatSchema = Type.Union([\n\tOpenAICompletionsCompatSchema,\n\tOpenAIResponsesCompatSchema,\n\tAnthropicMessagesCompatSchema,\n]);\n\nconst ModelDefinitionSchema = Type.Object({\n\tid: Type.String({ minLength: 1 }),\n\tname: Type.Optional(Type.String({ minLength: 1 })),\n\tapi: Type.Optional(Type.String({ minLength: 1 })),\n\tbaseUrl: Type.Optional(Type.String({ minLength: 1 })),\n\treasoning: Type.Optional(Type.Boolean()),\n\tthinkingLevelMap: Type.Optional(ThinkingLevelMapSchema),\n\tinput: Type.Optional(Type.Array(Type.Union([Type.Literal(\"text\"), Type.Literal(\"image\")]))),\n\t// 供应商能力槽位(设计 §3.1):语义与既有 ImagesModel.output 对齐,缺省 =\n\t// 纯文本(undefined 视为 [\"text\"])。生图供应商在 models.json 登记\n\t// \"output\": [\"image\"] 的模型即进入宿主注入的生图模型目录快照。\n\toutput: Type.Optional(Type.Array(Type.Union([Type.Literal(\"text\"), Type.Literal(\"image\")]))),\n\tcost: Type.Optional(ModelCostSchema),\n\tcontextWindow: Type.Optional(Type.Number()),\n\tmaxTokens: Type.Optional(Type.Number()),\n\tsamplingParams: Type.Optional(Type.Record(Type.String(), Type.Unknown())),\n\theaders: Type.Optional(Type.Record(Type.String(), Type.String())),\n\tcompat: Type.Optional(ProviderCompatSchema),\n});\n\nconst ModelOverrideSchema = Type.Object({\n\tname: Type.Optional(Type.String({ minLength: 1 })),\n\treasoning: Type.Optional(Type.Boolean()),\n\tthinkingLevelMap: Type.Optional(ThinkingLevelMapSchema),\n\tinput: Type.Optional(Type.Array(Type.Union([Type.Literal(\"text\"), Type.Literal(\"image\")]))),\n\toutput: Type.Optional(Type.Array(Type.Union([Type.Literal(\"text\"), Type.Literal(\"image\")]))),\n\tcost: Type.Optional(\n\t\tType.Object({\n\t\t\tinput: Type.Optional(Type.Number()),\n\t\t\toutput: Type.Optional(Type.Number()),\n\t\t\tcacheRead: Type.Optional(Type.Number()),\n\t\t\tcacheWrite: Type.Optional(Type.Number()),\n\t\t\ttiers: Type.Optional(Type.Array(ModelCostTierSchema)),\n\t\t}),\n\t),\n\tcontextWindow: Type.Optional(Type.Number()),\n\tmaxTokens: Type.Optional(Type.Number()),\n\tsamplingParams: Type.Optional(Type.Record(Type.String(), Type.Unknown())),\n\theaders: Type.Optional(Type.Record(Type.String(), Type.String())),\n\tcompat: Type.Optional(ProviderCompatSchema),\n});\n\nconst ProviderConfigSchema = Type.Object({\n\tname: Type.Optional(Type.String({ minLength: 1 })),\n\tbaseUrl: Type.Optional(Type.String({ minLength: 1 })),\n\tapi: Type.Optional(Type.String({ minLength: 1 })),\n\toauth: Type.Optional(Type.Literal(\"radius\")),\n\theaders: Type.Optional(Type.Record(Type.String(), Type.String())),\n\tcompat: Type.Optional(ProviderCompatSchema),\n\tauthHeader: Type.Optional(Type.Boolean()),\n\tmodels: Type.Optional(Type.Array(ModelDefinitionSchema)),\n\tmodelOverrides: Type.Optional(Type.Record(Type.String(), ModelOverrideSchema)),\n});\n\nconst ModelsConfigSchema = Type.Object({\n\tproviders: Type.Record(Type.String(), ProviderConfigSchema),\n});\nconst validateModelsConfig = Compile(ModelsConfigSchema);\n\nexport type ModelsJsonModel = Static<typeof ModelDefinitionSchema>;\nexport type ModelsJsonModelOverride = Static<typeof ModelOverrideSchema>;\nexport type ModelsJsonProvider = Static<typeof ProviderConfigSchema>;\ntype ModelsJson = Static<typeof ModelsConfigSchema>;\n\nfunction formatValidationPath(error: TLocalizedValidationError): string {\n\tif (error.keyword === \"required\") {\n\t\tconst requiredProperties = (error.params as { requiredProperties?: string[] }).requiredProperties;\n\t\tconst requiredProperty = requiredProperties?.[0];\n\t\tif (requiredProperty) {\n\t\t\tconst basePath = error.instancePath.replace(/^\\//, \"\").replace(/\\//g, \".\");\n\t\t\treturn basePath ? `${basePath}.${requiredProperty}` : requiredProperty;\n\t\t}\n\t}\n\tconst path = error.instancePath.replace(/^\\//, \"\").replace(/\\//g, \".\");\n\treturn path || \"root\";\n}\n\nfunction deepFreeze<T>(value: T): T {\n\tif (typeof value !== \"object\" || value === null || Object.isFrozen(value)) return value;\n\tfor (const child of Object.values(value)) deepFreeze(child);\n\treturn Object.freeze(value);\n}\n\n/** One immutable load of models.json. */\nexport class ModelConfig {\n\tprivate readonly providers: ReadonlyMap<string, ModelsJsonProvider>;\n\tprivate readonly error: string | undefined;\n\n\tprivate constructor(providers: ReadonlyMap<string, ModelsJsonProvider>, error?: string) {\n\t\tthis.providers = providers;\n\t\tthis.error = error;\n\t}\n\n\tstatic async load(modelsJsonPath: string | undefined): Promise<ModelConfig> {\n\t\tif (!modelsJsonPath) return new ModelConfig(new Map());\n\t\tconst path = normalizePath(modelsJsonPath);\n\t\tlet content: string;\n\t\ttry {\n\t\t\tcontent = await readFile(path, \"utf-8\");\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") return new ModelConfig(new Map());\n\t\t\treturn new ModelConfig(\n\t\t\t\tnew Map(),\n\t\t\t\t`Failed to load models.json: ${error instanceof Error ? error.message : error}\\n\\nFile: ${path}`,\n\t\t\t);\n\t\t}\n\n\t\tlet parsed: unknown;\n\t\ttry {\n\t\t\tparsed = JSON.parse(stripJsonComments(stripBom(content)));\n\t\t} catch (error) {\n\t\t\treturn new ModelConfig(\n\t\t\t\tnew Map(),\n\t\t\t\t`Failed to parse models.json: ${error instanceof Error ? error.message : error}\\n\\nFile: ${path}`,\n\t\t\t);\n\t\t}\n\n\t\tif (!validateModelsConfig.Check(parsed)) {\n\t\t\tconst errors =\n\t\t\t\tvalidateModelsConfig\n\t\t\t\t\t.Errors(parsed)\n\t\t\t\t\t.map((error) => ` - ${formatValidationPath(error)}: ${error.message}`)\n\t\t\t\t\t.join(\"\\n\") || \"Unknown schema error\";\n\t\t\treturn new ModelConfig(new Map(), `Invalid models.json schema:\\n${errors}\\n\\nFile: ${path}`);\n\t\t}\n\n\t\tconst config = parsed as ModelsJson;\n\t\t// apiKey was removed from models.json: keys live in auth.json (via /login) or\n\t\t// --api-key. TypeBox objects allow additional properties, so reject explicitly.\n\t\tconst offenders = Object.entries(config.providers).filter(([, provider]) => Object.hasOwn(provider, \"apiKey\"));\n\t\tif (offenders.length > 0) {\n\t\t\tconst details = offenders\n\t\t\t\t.map(\n\t\t\t\t\t([providerId]) =>\n\t\t\t\t\t\t` - providers.${providerId}: \"apiKey\" is not allowed in models.json. Store provider keys in auth.json (via /login) or pass --api-key.`,\n\t\t\t\t)\n\t\t\t\t.join(\"\\n\");\n\t\t\treturn new ModelConfig(new Map(), `Invalid models.json schema:\\n${details}\\n\\nFile: ${path}`);\n\t\t}\n\t\tconst providers = new Map<string, ModelsJsonProvider>();\n\t\tfor (const [providerId, provider] of Object.entries(config.providers)) {\n\t\t\tproviders.set(providerId, deepFreeze(structuredClone(provider)));\n\t\t}\n\t\treturn new ModelConfig(providers);\n\t}\n\n\tgetProvider(providerId: string): ModelsJsonProvider | undefined {\n\t\treturn this.providers.get(providerId);\n\t}\n\n\tgetProviderIds(): readonly string[] {\n\t\treturn [...this.providers.keys()];\n\t}\n\n\tgetError(): string | undefined {\n\t\treturn this.error;\n\t}\n\n\t/**\n\t * 生图模型目录快照(供应商能力槽位设计 §3.2 推断供料):models.json 中\n\t * `output` 含 `image` 的模型按 provider 分组,供宿主在装配期经\n\t * `configOverride` 注入 image-generation 插件(注入键 `imageModelCatalog`)。\n\t * 快照为装配期静态数据;插件运行期按会话当前 provider 动态查询。内建\n\t * 聊天目录不参与——内建 images 目录走 chat modalities 协议,与插件消费的\n\t * `/images/generations` 端点协议不互通(设计 §3.2 第 4 层)。保持\n\t * models.json 登记顺序(确定性来源);无生图模型的 provider 不出现在键集中。\n\t */\n\tgetImageModelCatalog(): Readonly<Record<string, ReadonlyArray<{ id: string; name?: string }>>> {\n\t\tconst catalog: Record<string, Array<{ id: string; name?: string }>> = {};\n\t\tfor (const [providerId, provider] of this.providers) {\n\t\t\tconst imageModels = (provider.models ?? []).filter(\n\t\t\t\t(model) => Array.isArray(model.output) && model.output.includes(\"image\"),\n\t\t\t);\n\t\t\tif (imageModels.length === 0) continue;\n\t\t\tcatalog[providerId] = imageModels.map((model) => ({\n\t\t\t\tid: model.id,\n\t\t\t\t...(model.name === undefined ? {} : { name: model.name }),\n\t\t\t}));\n\t\t}\n\t\treturn deepFreeze(catalog);\n\t}\n}\n"]}
|
|
@@ -181,7 +181,6 @@ const ModelOverrideSchema = Type.Object({
|
|
|
181
181
|
const ProviderConfigSchema = Type.Object({
|
|
182
182
|
name: Type.Optional(Type.String({ minLength: 1 })),
|
|
183
183
|
baseUrl: Type.Optional(Type.String({ minLength: 1 })),
|
|
184
|
-
apiKey: Type.Optional(Type.String({ minLength: 1 })),
|
|
185
184
|
api: Type.Optional(Type.String({ minLength: 1 })),
|
|
186
185
|
oauth: Type.Optional(Type.Literal("radius")),
|
|
187
186
|
headers: Type.Optional(Type.Record(Type.String(), Type.String())),
|
|
@@ -249,6 +248,15 @@ export class ModelConfig {
|
|
|
249
248
|
return new ModelConfig(new Map(), `Invalid models.json schema:\n${errors}\n\nFile: ${path}`);
|
|
250
249
|
}
|
|
251
250
|
const config = parsed;
|
|
251
|
+
// apiKey was removed from models.json: keys live in auth.json (via /login) or
|
|
252
|
+
// --api-key. TypeBox objects allow additional properties, so reject explicitly.
|
|
253
|
+
const offenders = Object.entries(config.providers).filter(([, provider]) => Object.hasOwn(provider, "apiKey"));
|
|
254
|
+
if (offenders.length > 0) {
|
|
255
|
+
const details = offenders
|
|
256
|
+
.map(([providerId]) => ` - providers.${providerId}: "apiKey" is not allowed in models.json. Store provider keys in auth.json (via /login) or pass --api-key.`)
|
|
257
|
+
.join("\n");
|
|
258
|
+
return new ModelConfig(new Map(), `Invalid models.json schema:\n${details}\n\nFile: ${path}`);
|
|
259
|
+
}
|
|
252
260
|
const providers = new Map();
|
|
253
261
|
for (const [providerId, provider] of Object.entries(config.providers)) {
|
|
254
262
|
providers.set(providerId, deepFreeze(structuredClone(provider)));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-config.js","sourceRoot":"","sources":["../../src/core/model-config.ts"],"names":[],"mappings":"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","sourcesContent":["/** Immutable, credential-blind models.json snapshot. */\n\nimport { readFile } from \"node:fs/promises\";\nimport { type Static, Type } from \"typebox\";\nimport { Compile } from \"typebox/compile\";\nimport type { TLocalizedValidationError } from \"typebox/error\";\nimport { stripJsonComments } from \"../utils/json.ts\";\nimport { normalizePath } from \"../utils/paths.ts\";\nimport { stripBom } from \"../utils/text.ts\";\n\nconst PercentileCutoffsSchema = Type.Object({\n\tp50: Type.Optional(Type.Number()),\n\tp75: Type.Optional(Type.Number()),\n\tp90: Type.Optional(Type.Number()),\n\tp99: Type.Optional(Type.Number()),\n});\n\nconst OpenRouterRoutingSchema = Type.Object({\n\tallow_fallbacks: Type.Optional(Type.Boolean()),\n\trequire_parameters: Type.Optional(Type.Boolean()),\n\tdata_collection: Type.Optional(Type.Union([Type.Literal(\"deny\"), Type.Literal(\"allow\")])),\n\tzdr: Type.Optional(Type.Boolean()),\n\tenforce_distillable_text: Type.Optional(Type.Boolean()),\n\torder: Type.Optional(Type.Array(Type.String())),\n\tonly: Type.Optional(Type.Array(Type.String())),\n\tignore: Type.Optional(Type.Array(Type.String())),\n\tquantizations: Type.Optional(Type.Array(Type.String())),\n\tsort: Type.Optional(\n\t\tType.Union([\n\t\t\tType.String(),\n\t\t\tType.Object({\n\t\t\t\tby: Type.Optional(Type.String()),\n\t\t\t\tpartition: Type.Optional(Type.Union([Type.String(), Type.Null()])),\n\t\t\t}),\n\t\t]),\n\t),\n\tmax_price: Type.Optional(\n\t\tType.Object({\n\t\t\tprompt: Type.Optional(Type.Union([Type.Number(), Type.String()])),\n\t\t\tcompletion: Type.Optional(Type.Union([Type.Number(), Type.String()])),\n\t\t\timage: Type.Optional(Type.Union([Type.Number(), Type.String()])),\n\t\t\taudio: Type.Optional(Type.Union([Type.Number(), Type.String()])),\n\t\t\trequest: Type.Optional(Type.Union([Type.Number(), Type.String()])),\n\t\t}),\n\t),\n\tpreferred_min_throughput: Type.Optional(Type.Union([Type.Number(), PercentileCutoffsSchema])),\n\tpreferred_max_latency: Type.Optional(Type.Union([Type.Number(), PercentileCutoffsSchema])),\n});\n\nconst VercelGatewayRoutingSchema = Type.Object({\n\tonly: Type.Optional(Type.Array(Type.String())),\n\torder: Type.Optional(Type.Array(Type.String())),\n});\n\nconst ThinkingLevelMapValueSchema = Type.Union([Type.String(), Type.Null()]);\nconst ThinkingLevelMapSchema = Type.Object({\n\toff: Type.Optional(ThinkingLevelMapValueSchema),\n\tminimal: Type.Optional(ThinkingLevelMapValueSchema),\n\tlow: Type.Optional(ThinkingLevelMapValueSchema),\n\tmedium: Type.Optional(ThinkingLevelMapValueSchema),\n\thigh: Type.Optional(ThinkingLevelMapValueSchema),\n\txhigh: Type.Optional(ThinkingLevelMapValueSchema),\n\tmax: Type.Optional(ThinkingLevelMapValueSchema),\n});\n\nconst ChatTemplateKwargScalarSchema = Type.Union([Type.String(), Type.Number(), Type.Boolean(), Type.Null()]);\nconst ChatTemplateKwargVariableSchema = Type.Object({\n\t$var: Type.Union([Type.Literal(\"thinking.enabled\"), Type.Literal(\"thinking.effort\")]),\n\tomitWhenOff: Type.Optional(Type.Boolean()),\n});\nconst ChatTemplateKwargSchema = Type.Union([ChatTemplateKwargScalarSchema, ChatTemplateKwargVariableSchema]);\n\nconst OpenAICompletionsCompatSchema = Type.Object({\n\tsupportsStore: Type.Optional(Type.Boolean()),\n\tsupportsDeveloperRole: Type.Optional(Type.Boolean()),\n\tsupportsReasoningEffort: Type.Optional(Type.Boolean()),\n\tsupportsUsageInStreaming: Type.Optional(Type.Boolean()),\n\tsupportsFinishReason: Type.Optional(Type.Boolean()),\n\tmaxTokensField: Type.Optional(Type.Union([Type.Literal(\"max_completion_tokens\"), Type.Literal(\"max_tokens\")])),\n\trequiresToolResultName: Type.Optional(Type.Boolean()),\n\trequiresAssistantAfterToolResult: Type.Optional(Type.Boolean()),\n\trequiresThinkingAsText: Type.Optional(Type.Boolean()),\n\trequiresReasoningContentOnAssistantMessages: Type.Optional(Type.Boolean()),\n\tthinkingFormat: Type.Optional(\n\t\tType.Union([\n\t\t\tType.Literal(\"openai\"),\n\t\t\tType.Literal(\"openrouter\"),\n\t\t\tType.Literal(\"together\"),\n\t\t\tType.Literal(\"baseten\"),\n\t\t\tType.Literal(\"deepseek\"),\n\t\t\tType.Literal(\"zai\"),\n\t\t\tType.Literal(\"qwen\"),\n\t\t\tType.Literal(\"chat-template\"),\n\t\t\tType.Literal(\"qwen-chat-template\"),\n\t\t\tType.Literal(\"string-thinking\"),\n\t\t\tType.Literal(\"ant-ling\"),\n\t\t]),\n\t),\n\tchatTemplateKwargs: Type.Optional(Type.Record(Type.String(), ChatTemplateKwargSchema)),\n\tchatTemplateArgs: Type.Optional(Type.Record(Type.String(), ChatTemplateKwargSchema)),\n\tcacheControlFormat: Type.Optional(Type.Literal(\"anthropic\")),\n\topenRouterRouting: Type.Optional(OpenRouterRoutingSchema),\n\tvercelGatewayRouting: Type.Optional(VercelGatewayRoutingSchema),\n\tsupportsOpenAIGrammarTools: Type.Optional(Type.Boolean()),\n\tsupportsStrictMode: Type.Optional(Type.Boolean()),\n\tsendSessionAffinityHeaders: Type.Optional(Type.Boolean()),\n\tdeferredToolsMode: Type.Optional(Type.Literal(\"kimi\")),\n\tsessionAffinityFormat: Type.Optional(\n\t\tType.Union([Type.Literal(\"openai\"), Type.Literal(\"openai-nosession\"), Type.Literal(\"openrouter\")]),\n\t),\n\tsupportsLongCacheRetention: Type.Optional(Type.Boolean()),\n});\n\nconst OpenAIResponsesCompatSchema = Type.Object({\n\tsupportsDeveloperRole: Type.Optional(Type.Boolean()),\n\tsessionAffinityFormat: Type.Optional(\n\t\tType.Union([Type.Literal(\"openai\"), Type.Literal(\"openai-nosession\"), Type.Literal(\"openrouter\")]),\n\t),\n\tsupportsLongCacheRetention: Type.Optional(Type.Boolean()),\n\tsupportsStrictMode: Type.Optional(Type.Boolean()),\n\tsupportsOpenAIGrammarTools: Type.Optional(Type.Boolean()),\n\tsupportsAdditionalTools: Type.Optional(Type.Boolean()),\n\tsupportsToolSearch: Type.Optional(Type.Boolean()),\n\tsupportsMaxOutputTokens: Type.Optional(Type.Boolean()),\n});\n\nconst ModelCostRatesSchema = {\n\tinput: Type.Number(),\n\toutput: Type.Number(),\n\tcacheRead: Type.Number(),\n\tcacheWrite: Type.Number(),\n};\nconst ModelCostTierSchema = Type.Object({\n\tinputTokensAbove: Type.Number(),\n\t...ModelCostRatesSchema,\n});\nconst ModelCostSchema = Type.Object({\n\t...ModelCostRatesSchema,\n\ttiers: Type.Optional(Type.Array(ModelCostTierSchema)),\n});\n\nconst AnthropicMessagesCompatSchema = Type.Object({\n\tsupportsEagerToolInputStreaming: Type.Optional(Type.Boolean()),\n\tsupportsLongCacheRetention: Type.Optional(Type.Boolean()),\n\tsendSessionAffinityHeaders: Type.Optional(Type.Boolean()),\n\tsupportsCacheControlOnTools: Type.Optional(Type.Boolean()),\n\tsupportsTemperature: Type.Optional(Type.Boolean()),\n\tforceAdaptiveThinking: Type.Optional(Type.Boolean()),\n\tallowEmptySignature: Type.Optional(Type.Boolean()),\n\tsupportsStrictTools: Type.Optional(Type.Boolean()),\n\tsupportsMidConvoEffort: Type.Optional(Type.Boolean()),\n\tsupportsToolReferences: Type.Optional(Type.Boolean()),\n\tallowedFallbackModels: Type.Optional(\n\t\tType.Array(\n\t\t\tType.Object({\n\t\t\t\tprovider: Type.String({ minLength: 1 }),\n\t\t\t\tmodel: Type.String({ minLength: 1 }),\n\t\t\t\tcost: ModelCostSchema,\n\t\t\t}),\n\t\t\t{ maxItems: 3 },\n\t\t),\n\t),\n});\n\nconst ProviderCompatSchema = Type.Union([\n\tOpenAICompletionsCompatSchema,\n\tOpenAIResponsesCompatSchema,\n\tAnthropicMessagesCompatSchema,\n]);\n\nconst ModelDefinitionSchema = Type.Object({\n\tid: Type.String({ minLength: 1 }),\n\tname: Type.Optional(Type.String({ minLength: 1 })),\n\tapi: Type.Optional(Type.String({ minLength: 1 })),\n\tbaseUrl: Type.Optional(Type.String({ minLength: 1 })),\n\treasoning: Type.Optional(Type.Boolean()),\n\tthinkingLevelMap: Type.Optional(ThinkingLevelMapSchema),\n\tinput: Type.Optional(Type.Array(Type.Union([Type.Literal(\"text\"), Type.Literal(\"image\")]))),\n\t// 供应商能力槽位(设计 §3.1):语义与既有 ImagesModel.output 对齐,缺省 =\n\t// 纯文本(undefined 视为 [\"text\"])。生图供应商在 models.json 登记\n\t// \"output\": [\"image\"] 的模型即进入宿主注入的生图模型目录快照。\n\toutput: Type.Optional(Type.Array(Type.Union([Type.Literal(\"text\"), Type.Literal(\"image\")]))),\n\tcost: Type.Optional(ModelCostSchema),\n\tcontextWindow: Type.Optional(Type.Number()),\n\tmaxTokens: Type.Optional(Type.Number()),\n\tsamplingParams: Type.Optional(Type.Record(Type.String(), Type.Unknown())),\n\theaders: Type.Optional(Type.Record(Type.String(), Type.String())),\n\tcompat: Type.Optional(ProviderCompatSchema),\n});\n\nconst ModelOverrideSchema = Type.Object({\n\tname: Type.Optional(Type.String({ minLength: 1 })),\n\treasoning: Type.Optional(Type.Boolean()),\n\tthinkingLevelMap: Type.Optional(ThinkingLevelMapSchema),\n\tinput: Type.Optional(Type.Array(Type.Union([Type.Literal(\"text\"), Type.Literal(\"image\")]))),\n\toutput: Type.Optional(Type.Array(Type.Union([Type.Literal(\"text\"), Type.Literal(\"image\")]))),\n\tcost: Type.Optional(\n\t\tType.Object({\n\t\t\tinput: Type.Optional(Type.Number()),\n\t\t\toutput: Type.Optional(Type.Number()),\n\t\t\tcacheRead: Type.Optional(Type.Number()),\n\t\t\tcacheWrite: Type.Optional(Type.Number()),\n\t\t\ttiers: Type.Optional(Type.Array(ModelCostTierSchema)),\n\t\t}),\n\t),\n\tcontextWindow: Type.Optional(Type.Number()),\n\tmaxTokens: Type.Optional(Type.Number()),\n\tsamplingParams: Type.Optional(Type.Record(Type.String(), Type.Unknown())),\n\theaders: Type.Optional(Type.Record(Type.String(), Type.String())),\n\tcompat: Type.Optional(ProviderCompatSchema),\n});\n\nconst ProviderConfigSchema = Type.Object({\n\tname: Type.Optional(Type.String({ minLength: 1 })),\n\tbaseUrl: Type.Optional(Type.String({ minLength: 1 })),\n\tapiKey: Type.Optional(Type.String({ minLength: 1 })),\n\tapi: Type.Optional(Type.String({ minLength: 1 })),\n\toauth: Type.Optional(Type.Literal(\"radius\")),\n\theaders: Type.Optional(Type.Record(Type.String(), Type.String())),\n\tcompat: Type.Optional(ProviderCompatSchema),\n\tauthHeader: Type.Optional(Type.Boolean()),\n\tmodels: Type.Optional(Type.Array(ModelDefinitionSchema)),\n\tmodelOverrides: Type.Optional(Type.Record(Type.String(), ModelOverrideSchema)),\n});\n\nconst ModelsConfigSchema = Type.Object({\n\tproviders: Type.Record(Type.String(), ProviderConfigSchema),\n});\nconst validateModelsConfig = Compile(ModelsConfigSchema);\n\nexport type ModelsJsonModel = Static<typeof ModelDefinitionSchema>;\nexport type ModelsJsonModelOverride = Static<typeof ModelOverrideSchema>;\nexport type ModelsJsonProvider = Static<typeof ProviderConfigSchema>;\ntype ModelsJson = Static<typeof ModelsConfigSchema>;\n\nfunction formatValidationPath(error: TLocalizedValidationError): string {\n\tif (error.keyword === \"required\") {\n\t\tconst requiredProperties = (error.params as { requiredProperties?: string[] }).requiredProperties;\n\t\tconst requiredProperty = requiredProperties?.[0];\n\t\tif (requiredProperty) {\n\t\t\tconst basePath = error.instancePath.replace(/^\\//, \"\").replace(/\\//g, \".\");\n\t\t\treturn basePath ? `${basePath}.${requiredProperty}` : requiredProperty;\n\t\t}\n\t}\n\tconst path = error.instancePath.replace(/^\\//, \"\").replace(/\\//g, \".\");\n\treturn path || \"root\";\n}\n\nfunction deepFreeze<T>(value: T): T {\n\tif (typeof value !== \"object\" || value === null || Object.isFrozen(value)) return value;\n\tfor (const child of Object.values(value)) deepFreeze(child);\n\treturn Object.freeze(value);\n}\n\n/** One immutable load of models.json. */\nexport class ModelConfig {\n\tprivate readonly providers: ReadonlyMap<string, ModelsJsonProvider>;\n\tprivate readonly error: string | undefined;\n\n\tprivate constructor(providers: ReadonlyMap<string, ModelsJsonProvider>, error?: string) {\n\t\tthis.providers = providers;\n\t\tthis.error = error;\n\t}\n\n\tstatic async load(modelsJsonPath: string | undefined): Promise<ModelConfig> {\n\t\tif (!modelsJsonPath) return new ModelConfig(new Map());\n\t\tconst path = normalizePath(modelsJsonPath);\n\t\tlet content: string;\n\t\ttry {\n\t\t\tcontent = await readFile(path, \"utf-8\");\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") return new ModelConfig(new Map());\n\t\t\treturn new ModelConfig(\n\t\t\t\tnew Map(),\n\t\t\t\t`Failed to load models.json: ${error instanceof Error ? error.message : error}\\n\\nFile: ${path}`,\n\t\t\t);\n\t\t}\n\n\t\tlet parsed: unknown;\n\t\ttry {\n\t\t\tparsed = JSON.parse(stripJsonComments(stripBom(content)));\n\t\t} catch (error) {\n\t\t\treturn new ModelConfig(\n\t\t\t\tnew Map(),\n\t\t\t\t`Failed to parse models.json: ${error instanceof Error ? error.message : error}\\n\\nFile: ${path}`,\n\t\t\t);\n\t\t}\n\n\t\tif (!validateModelsConfig.Check(parsed)) {\n\t\t\tconst errors =\n\t\t\t\tvalidateModelsConfig\n\t\t\t\t\t.Errors(parsed)\n\t\t\t\t\t.map((error) => ` - ${formatValidationPath(error)}: ${error.message}`)\n\t\t\t\t\t.join(\"\\n\") || \"Unknown schema error\";\n\t\t\treturn new ModelConfig(new Map(), `Invalid models.json schema:\\n${errors}\\n\\nFile: ${path}`);\n\t\t}\n\n\t\tconst config = parsed as ModelsJson;\n\t\tconst providers = new Map<string, ModelsJsonProvider>();\n\t\tfor (const [providerId, provider] of Object.entries(config.providers)) {\n\t\t\tproviders.set(providerId, deepFreeze(structuredClone(provider)));\n\t\t}\n\t\treturn new ModelConfig(providers);\n\t}\n\n\tgetProvider(providerId: string): ModelsJsonProvider | undefined {\n\t\treturn this.providers.get(providerId);\n\t}\n\n\tgetProviderIds(): readonly string[] {\n\t\treturn [...this.providers.keys()];\n\t}\n\n\tgetError(): string | undefined {\n\t\treturn this.error;\n\t}\n\n\t/**\n\t * 生图模型目录快照(供应商能力槽位设计 §3.2 推断供料):models.json 中\n\t * `output` 含 `image` 的模型按 provider 分组,供宿主在装配期经\n\t * `configOverride` 注入 image-generation 插件(注入键 `imageModelCatalog`)。\n\t * 快照为装配期静态数据;插件运行期按会话当前 provider 动态查询。内建\n\t * 聊天目录不参与——内建 images 目录走 chat modalities 协议,与插件消费的\n\t * `/images/generations` 端点协议不互通(设计 §3.2 第 4 层)。保持\n\t * models.json 登记顺序(确定性来源);无生图模型的 provider 不出现在键集中。\n\t */\n\tgetImageModelCatalog(): Readonly<Record<string, ReadonlyArray<{ id: string; name?: string }>>> {\n\t\tconst catalog: Record<string, Array<{ id: string; name?: string }>> = {};\n\t\tfor (const [providerId, provider] of this.providers) {\n\t\t\tconst imageModels = (provider.models ?? []).filter(\n\t\t\t\t(model) => Array.isArray(model.output) && model.output.includes(\"image\"),\n\t\t\t);\n\t\t\tif (imageModels.length === 0) continue;\n\t\t\tcatalog[providerId] = imageModels.map((model) => ({\n\t\t\t\tid: model.id,\n\t\t\t\t...(model.name === undefined ? {} : { name: model.name }),\n\t\t\t}));\n\t\t}\n\t\treturn deepFreeze(catalog);\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"model-config.js","sourceRoot":"","sources":["../../src/core/model-config.ts"],"names":[],"mappings":"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","sourcesContent":["/** Immutable, credential-blind models.json snapshot. */\n\nimport { readFile } from \"node:fs/promises\";\nimport { type Static, Type } from \"typebox\";\nimport { Compile } from \"typebox/compile\";\nimport type { TLocalizedValidationError } from \"typebox/error\";\nimport { stripJsonComments } from \"../utils/json.ts\";\nimport { normalizePath } from \"../utils/paths.ts\";\nimport { stripBom } from \"../utils/text.ts\";\n\nconst PercentileCutoffsSchema = Type.Object({\n\tp50: Type.Optional(Type.Number()),\n\tp75: Type.Optional(Type.Number()),\n\tp90: Type.Optional(Type.Number()),\n\tp99: Type.Optional(Type.Number()),\n});\n\nconst OpenRouterRoutingSchema = Type.Object({\n\tallow_fallbacks: Type.Optional(Type.Boolean()),\n\trequire_parameters: Type.Optional(Type.Boolean()),\n\tdata_collection: Type.Optional(Type.Union([Type.Literal(\"deny\"), Type.Literal(\"allow\")])),\n\tzdr: Type.Optional(Type.Boolean()),\n\tenforce_distillable_text: Type.Optional(Type.Boolean()),\n\torder: Type.Optional(Type.Array(Type.String())),\n\tonly: Type.Optional(Type.Array(Type.String())),\n\tignore: Type.Optional(Type.Array(Type.String())),\n\tquantizations: Type.Optional(Type.Array(Type.String())),\n\tsort: Type.Optional(\n\t\tType.Union([\n\t\t\tType.String(),\n\t\t\tType.Object({\n\t\t\t\tby: Type.Optional(Type.String()),\n\t\t\t\tpartition: Type.Optional(Type.Union([Type.String(), Type.Null()])),\n\t\t\t}),\n\t\t]),\n\t),\n\tmax_price: Type.Optional(\n\t\tType.Object({\n\t\t\tprompt: Type.Optional(Type.Union([Type.Number(), Type.String()])),\n\t\t\tcompletion: Type.Optional(Type.Union([Type.Number(), Type.String()])),\n\t\t\timage: Type.Optional(Type.Union([Type.Number(), Type.String()])),\n\t\t\taudio: Type.Optional(Type.Union([Type.Number(), Type.String()])),\n\t\t\trequest: Type.Optional(Type.Union([Type.Number(), Type.String()])),\n\t\t}),\n\t),\n\tpreferred_min_throughput: Type.Optional(Type.Union([Type.Number(), PercentileCutoffsSchema])),\n\tpreferred_max_latency: Type.Optional(Type.Union([Type.Number(), PercentileCutoffsSchema])),\n});\n\nconst VercelGatewayRoutingSchema = Type.Object({\n\tonly: Type.Optional(Type.Array(Type.String())),\n\torder: Type.Optional(Type.Array(Type.String())),\n});\n\nconst ThinkingLevelMapValueSchema = Type.Union([Type.String(), Type.Null()]);\nconst ThinkingLevelMapSchema = Type.Object({\n\toff: Type.Optional(ThinkingLevelMapValueSchema),\n\tminimal: Type.Optional(ThinkingLevelMapValueSchema),\n\tlow: Type.Optional(ThinkingLevelMapValueSchema),\n\tmedium: Type.Optional(ThinkingLevelMapValueSchema),\n\thigh: Type.Optional(ThinkingLevelMapValueSchema),\n\txhigh: Type.Optional(ThinkingLevelMapValueSchema),\n\tmax: Type.Optional(ThinkingLevelMapValueSchema),\n});\n\nconst ChatTemplateKwargScalarSchema = Type.Union([Type.String(), Type.Number(), Type.Boolean(), Type.Null()]);\nconst ChatTemplateKwargVariableSchema = Type.Object({\n\t$var: Type.Union([Type.Literal(\"thinking.enabled\"), Type.Literal(\"thinking.effort\")]),\n\tomitWhenOff: Type.Optional(Type.Boolean()),\n});\nconst ChatTemplateKwargSchema = Type.Union([ChatTemplateKwargScalarSchema, ChatTemplateKwargVariableSchema]);\n\nconst OpenAICompletionsCompatSchema = Type.Object({\n\tsupportsStore: Type.Optional(Type.Boolean()),\n\tsupportsDeveloperRole: Type.Optional(Type.Boolean()),\n\tsupportsReasoningEffort: Type.Optional(Type.Boolean()),\n\tsupportsUsageInStreaming: Type.Optional(Type.Boolean()),\n\tsupportsFinishReason: Type.Optional(Type.Boolean()),\n\tmaxTokensField: Type.Optional(Type.Union([Type.Literal(\"max_completion_tokens\"), Type.Literal(\"max_tokens\")])),\n\trequiresToolResultName: Type.Optional(Type.Boolean()),\n\trequiresAssistantAfterToolResult: Type.Optional(Type.Boolean()),\n\trequiresThinkingAsText: Type.Optional(Type.Boolean()),\n\trequiresReasoningContentOnAssistantMessages: Type.Optional(Type.Boolean()),\n\tthinkingFormat: Type.Optional(\n\t\tType.Union([\n\t\t\tType.Literal(\"openai\"),\n\t\t\tType.Literal(\"openrouter\"),\n\t\t\tType.Literal(\"together\"),\n\t\t\tType.Literal(\"baseten\"),\n\t\t\tType.Literal(\"deepseek\"),\n\t\t\tType.Literal(\"zai\"),\n\t\t\tType.Literal(\"qwen\"),\n\t\t\tType.Literal(\"chat-template\"),\n\t\t\tType.Literal(\"qwen-chat-template\"),\n\t\t\tType.Literal(\"string-thinking\"),\n\t\t\tType.Literal(\"ant-ling\"),\n\t\t]),\n\t),\n\tchatTemplateKwargs: Type.Optional(Type.Record(Type.String(), ChatTemplateKwargSchema)),\n\tchatTemplateArgs: Type.Optional(Type.Record(Type.String(), ChatTemplateKwargSchema)),\n\tcacheControlFormat: Type.Optional(Type.Literal(\"anthropic\")),\n\topenRouterRouting: Type.Optional(OpenRouterRoutingSchema),\n\tvercelGatewayRouting: Type.Optional(VercelGatewayRoutingSchema),\n\tsupportsOpenAIGrammarTools: Type.Optional(Type.Boolean()),\n\tsupportsStrictMode: Type.Optional(Type.Boolean()),\n\tsendSessionAffinityHeaders: Type.Optional(Type.Boolean()),\n\tdeferredToolsMode: Type.Optional(Type.Literal(\"kimi\")),\n\tsessionAffinityFormat: Type.Optional(\n\t\tType.Union([Type.Literal(\"openai\"), Type.Literal(\"openai-nosession\"), Type.Literal(\"openrouter\")]),\n\t),\n\tsupportsLongCacheRetention: Type.Optional(Type.Boolean()),\n});\n\nconst OpenAIResponsesCompatSchema = Type.Object({\n\tsupportsDeveloperRole: Type.Optional(Type.Boolean()),\n\tsessionAffinityFormat: Type.Optional(\n\t\tType.Union([Type.Literal(\"openai\"), Type.Literal(\"openai-nosession\"), Type.Literal(\"openrouter\")]),\n\t),\n\tsupportsLongCacheRetention: Type.Optional(Type.Boolean()),\n\tsupportsStrictMode: Type.Optional(Type.Boolean()),\n\tsupportsOpenAIGrammarTools: Type.Optional(Type.Boolean()),\n\tsupportsAdditionalTools: Type.Optional(Type.Boolean()),\n\tsupportsToolSearch: Type.Optional(Type.Boolean()),\n\tsupportsMaxOutputTokens: Type.Optional(Type.Boolean()),\n});\n\nconst ModelCostRatesSchema = {\n\tinput: Type.Number(),\n\toutput: Type.Number(),\n\tcacheRead: Type.Number(),\n\tcacheWrite: Type.Number(),\n};\nconst ModelCostTierSchema = Type.Object({\n\tinputTokensAbove: Type.Number(),\n\t...ModelCostRatesSchema,\n});\nconst ModelCostSchema = Type.Object({\n\t...ModelCostRatesSchema,\n\ttiers: Type.Optional(Type.Array(ModelCostTierSchema)),\n});\n\nconst AnthropicMessagesCompatSchema = Type.Object({\n\tsupportsEagerToolInputStreaming: Type.Optional(Type.Boolean()),\n\tsupportsLongCacheRetention: Type.Optional(Type.Boolean()),\n\tsendSessionAffinityHeaders: Type.Optional(Type.Boolean()),\n\tsupportsCacheControlOnTools: Type.Optional(Type.Boolean()),\n\tsupportsTemperature: Type.Optional(Type.Boolean()),\n\tforceAdaptiveThinking: Type.Optional(Type.Boolean()),\n\tallowEmptySignature: Type.Optional(Type.Boolean()),\n\tsupportsStrictTools: Type.Optional(Type.Boolean()),\n\tsupportsMidConvoEffort: Type.Optional(Type.Boolean()),\n\tsupportsToolReferences: Type.Optional(Type.Boolean()),\n\tallowedFallbackModels: Type.Optional(\n\t\tType.Array(\n\t\t\tType.Object({\n\t\t\t\tprovider: Type.String({ minLength: 1 }),\n\t\t\t\tmodel: Type.String({ minLength: 1 }),\n\t\t\t\tcost: ModelCostSchema,\n\t\t\t}),\n\t\t\t{ maxItems: 3 },\n\t\t),\n\t),\n});\n\nconst ProviderCompatSchema = Type.Union([\n\tOpenAICompletionsCompatSchema,\n\tOpenAIResponsesCompatSchema,\n\tAnthropicMessagesCompatSchema,\n]);\n\nconst ModelDefinitionSchema = Type.Object({\n\tid: Type.String({ minLength: 1 }),\n\tname: Type.Optional(Type.String({ minLength: 1 })),\n\tapi: Type.Optional(Type.String({ minLength: 1 })),\n\tbaseUrl: Type.Optional(Type.String({ minLength: 1 })),\n\treasoning: Type.Optional(Type.Boolean()),\n\tthinkingLevelMap: Type.Optional(ThinkingLevelMapSchema),\n\tinput: Type.Optional(Type.Array(Type.Union([Type.Literal(\"text\"), Type.Literal(\"image\")]))),\n\t// 供应商能力槽位(设计 §3.1):语义与既有 ImagesModel.output 对齐,缺省 =\n\t// 纯文本(undefined 视为 [\"text\"])。生图供应商在 models.json 登记\n\t// \"output\": [\"image\"] 的模型即进入宿主注入的生图模型目录快照。\n\toutput: Type.Optional(Type.Array(Type.Union([Type.Literal(\"text\"), Type.Literal(\"image\")]))),\n\tcost: Type.Optional(ModelCostSchema),\n\tcontextWindow: Type.Optional(Type.Number()),\n\tmaxTokens: Type.Optional(Type.Number()),\n\tsamplingParams: Type.Optional(Type.Record(Type.String(), Type.Unknown())),\n\theaders: Type.Optional(Type.Record(Type.String(), Type.String())),\n\tcompat: Type.Optional(ProviderCompatSchema),\n});\n\nconst ModelOverrideSchema = Type.Object({\n\tname: Type.Optional(Type.String({ minLength: 1 })),\n\treasoning: Type.Optional(Type.Boolean()),\n\tthinkingLevelMap: Type.Optional(ThinkingLevelMapSchema),\n\tinput: Type.Optional(Type.Array(Type.Union([Type.Literal(\"text\"), Type.Literal(\"image\")]))),\n\toutput: Type.Optional(Type.Array(Type.Union([Type.Literal(\"text\"), Type.Literal(\"image\")]))),\n\tcost: Type.Optional(\n\t\tType.Object({\n\t\t\tinput: Type.Optional(Type.Number()),\n\t\t\toutput: Type.Optional(Type.Number()),\n\t\t\tcacheRead: Type.Optional(Type.Number()),\n\t\t\tcacheWrite: Type.Optional(Type.Number()),\n\t\t\ttiers: Type.Optional(Type.Array(ModelCostTierSchema)),\n\t\t}),\n\t),\n\tcontextWindow: Type.Optional(Type.Number()),\n\tmaxTokens: Type.Optional(Type.Number()),\n\tsamplingParams: Type.Optional(Type.Record(Type.String(), Type.Unknown())),\n\theaders: Type.Optional(Type.Record(Type.String(), Type.String())),\n\tcompat: Type.Optional(ProviderCompatSchema),\n});\n\nconst ProviderConfigSchema = Type.Object({\n\tname: Type.Optional(Type.String({ minLength: 1 })),\n\tbaseUrl: Type.Optional(Type.String({ minLength: 1 })),\n\tapi: Type.Optional(Type.String({ minLength: 1 })),\n\toauth: Type.Optional(Type.Literal(\"radius\")),\n\theaders: Type.Optional(Type.Record(Type.String(), Type.String())),\n\tcompat: Type.Optional(ProviderCompatSchema),\n\tauthHeader: Type.Optional(Type.Boolean()),\n\tmodels: Type.Optional(Type.Array(ModelDefinitionSchema)),\n\tmodelOverrides: Type.Optional(Type.Record(Type.String(), ModelOverrideSchema)),\n});\n\nconst ModelsConfigSchema = Type.Object({\n\tproviders: Type.Record(Type.String(), ProviderConfigSchema),\n});\nconst validateModelsConfig = Compile(ModelsConfigSchema);\n\nexport type ModelsJsonModel = Static<typeof ModelDefinitionSchema>;\nexport type ModelsJsonModelOverride = Static<typeof ModelOverrideSchema>;\nexport type ModelsJsonProvider = Static<typeof ProviderConfigSchema>;\ntype ModelsJson = Static<typeof ModelsConfigSchema>;\n\nfunction formatValidationPath(error: TLocalizedValidationError): string {\n\tif (error.keyword === \"required\") {\n\t\tconst requiredProperties = (error.params as { requiredProperties?: string[] }).requiredProperties;\n\t\tconst requiredProperty = requiredProperties?.[0];\n\t\tif (requiredProperty) {\n\t\t\tconst basePath = error.instancePath.replace(/^\\//, \"\").replace(/\\//g, \".\");\n\t\t\treturn basePath ? `${basePath}.${requiredProperty}` : requiredProperty;\n\t\t}\n\t}\n\tconst path = error.instancePath.replace(/^\\//, \"\").replace(/\\//g, \".\");\n\treturn path || \"root\";\n}\n\nfunction deepFreeze<T>(value: T): T {\n\tif (typeof value !== \"object\" || value === null || Object.isFrozen(value)) return value;\n\tfor (const child of Object.values(value)) deepFreeze(child);\n\treturn Object.freeze(value);\n}\n\n/** One immutable load of models.json. */\nexport class ModelConfig {\n\tprivate readonly providers: ReadonlyMap<string, ModelsJsonProvider>;\n\tprivate readonly error: string | undefined;\n\n\tprivate constructor(providers: ReadonlyMap<string, ModelsJsonProvider>, error?: string) {\n\t\tthis.providers = providers;\n\t\tthis.error = error;\n\t}\n\n\tstatic async load(modelsJsonPath: string | undefined): Promise<ModelConfig> {\n\t\tif (!modelsJsonPath) return new ModelConfig(new Map());\n\t\tconst path = normalizePath(modelsJsonPath);\n\t\tlet content: string;\n\t\ttry {\n\t\t\tcontent = await readFile(path, \"utf-8\");\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") return new ModelConfig(new Map());\n\t\t\treturn new ModelConfig(\n\t\t\t\tnew Map(),\n\t\t\t\t`Failed to load models.json: ${error instanceof Error ? error.message : error}\\n\\nFile: ${path}`,\n\t\t\t);\n\t\t}\n\n\t\tlet parsed: unknown;\n\t\ttry {\n\t\t\tparsed = JSON.parse(stripJsonComments(stripBom(content)));\n\t\t} catch (error) {\n\t\t\treturn new ModelConfig(\n\t\t\t\tnew Map(),\n\t\t\t\t`Failed to parse models.json: ${error instanceof Error ? error.message : error}\\n\\nFile: ${path}`,\n\t\t\t);\n\t\t}\n\n\t\tif (!validateModelsConfig.Check(parsed)) {\n\t\t\tconst errors =\n\t\t\t\tvalidateModelsConfig\n\t\t\t\t\t.Errors(parsed)\n\t\t\t\t\t.map((error) => ` - ${formatValidationPath(error)}: ${error.message}`)\n\t\t\t\t\t.join(\"\\n\") || \"Unknown schema error\";\n\t\t\treturn new ModelConfig(new Map(), `Invalid models.json schema:\\n${errors}\\n\\nFile: ${path}`);\n\t\t}\n\n\t\tconst config = parsed as ModelsJson;\n\t\t// apiKey was removed from models.json: keys live in auth.json (via /login) or\n\t\t// --api-key. TypeBox objects allow additional properties, so reject explicitly.\n\t\tconst offenders = Object.entries(config.providers).filter(([, provider]) => Object.hasOwn(provider, \"apiKey\"));\n\t\tif (offenders.length > 0) {\n\t\t\tconst details = offenders\n\t\t\t\t.map(\n\t\t\t\t\t([providerId]) =>\n\t\t\t\t\t\t` - providers.${providerId}: \"apiKey\" is not allowed in models.json. Store provider keys in auth.json (via /login) or pass --api-key.`,\n\t\t\t\t)\n\t\t\t\t.join(\"\\n\");\n\t\t\treturn new ModelConfig(new Map(), `Invalid models.json schema:\\n${details}\\n\\nFile: ${path}`);\n\t\t}\n\t\tconst providers = new Map<string, ModelsJsonProvider>();\n\t\tfor (const [providerId, provider] of Object.entries(config.providers)) {\n\t\t\tproviders.set(providerId, deepFreeze(structuredClone(provider)));\n\t\t}\n\t\treturn new ModelConfig(providers);\n\t}\n\n\tgetProvider(providerId: string): ModelsJsonProvider | undefined {\n\t\treturn this.providers.get(providerId);\n\t}\n\n\tgetProviderIds(): readonly string[] {\n\t\treturn [...this.providers.keys()];\n\t}\n\n\tgetError(): string | undefined {\n\t\treturn this.error;\n\t}\n\n\t/**\n\t * 生图模型目录快照(供应商能力槽位设计 §3.2 推断供料):models.json 中\n\t * `output` 含 `image` 的模型按 provider 分组,供宿主在装配期经\n\t * `configOverride` 注入 image-generation 插件(注入键 `imageModelCatalog`)。\n\t * 快照为装配期静态数据;插件运行期按会话当前 provider 动态查询。内建\n\t * 聊天目录不参与——内建 images 目录走 chat modalities 协议,与插件消费的\n\t * `/images/generations` 端点协议不互通(设计 §3.2 第 4 层)。保持\n\t * models.json 登记顺序(确定性来源);无生图模型的 provider 不出现在键集中。\n\t */\n\tgetImageModelCatalog(): Readonly<Record<string, ReadonlyArray<{ id: string; name?: string }>>> {\n\t\tconst catalog: Record<string, Array<{ id: string; name?: string }>> = {};\n\t\tfor (const [providerId, provider] of this.providers) {\n\t\t\tconst imageModels = (provider.models ?? []).filter(\n\t\t\t\t(model) => Array.isArray(model.output) && model.output.includes(\"image\"),\n\t\t\t);\n\t\t\tif (imageModels.length === 0) continue;\n\t\t\tcatalog[providerId] = imageModels.map((model) => ({\n\t\t\t\tid: model.id,\n\t\t\t\t...(model.name === undefined ? {} : { name: model.name }),\n\t\t\t}));\n\t\t}\n\t\treturn deepFreeze(catalog);\n\t}\n}\n"]}
|