nexus-agents 11.6.2 → 11.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{ast-rule-runner-GRU2OC5H.js → ast-rule-runner-PIIAHXDA.js} +5 -5
- package/dist/{child-mcp-config-DNZN7CMS.js → child-mcp-config-B6BTYZT4.js} +4 -4
- package/dist/{chunk-L4QFWMXB.js → chunk-26WUCAGU.js} +4 -4
- package/dist/{chunk-MFBTGXR6.js → chunk-3QKRY72I.js} +8 -435
- package/dist/chunk-3QKRY72I.js.map +1 -0
- package/dist/{chunk-UMG4PRKT.js → chunk-4HOSKAB3.js} +4 -4
- package/dist/{chunk-2URHVZJR.js → chunk-4MKZAA6W.js} +5 -4
- package/dist/chunk-4MKZAA6W.js.map +1 -0
- package/dist/{chunk-JLJVZP7U.js → chunk-4NNCB7O2.js} +5 -5
- package/dist/{chunk-Z5XFIY4Q.js → chunk-5BEFQVPR.js} +2 -2
- package/dist/chunk-6IP3FOEC.js +365 -0
- package/dist/chunk-6IP3FOEC.js.map +1 -0
- package/dist/{chunk-4X4RJ6AP.js → chunk-6T6YL7MV.js} +4 -4
- package/dist/{chunk-RWBF3Y4A.js → chunk-7HI6EWY5.js} +2 -2
- package/dist/{chunk-45G5ZV3K.js → chunk-7Y6SB623.js} +2 -2
- package/dist/{chunk-N5YTX4UL.js → chunk-BSX3PMNN.js} +2 -2
- package/dist/{chunk-6A6YA4C4.js → chunk-BVUPPTAD.js} +6 -6
- package/dist/{chunk-L3VR5RXX.js → chunk-E5XKXB3G.js} +2 -2
- package/dist/chunk-ENX4WYFX.js +441 -0
- package/dist/chunk-ENX4WYFX.js.map +1 -0
- package/dist/{chunk-6WCFWNIR.js → chunk-FOJ2INSI.js} +3 -3
- package/dist/{chunk-OMQC4NWX.js → chunk-GCRXO43T.js} +2 -2
- package/dist/{chunk-U36QOTW3.js → chunk-HCTKX472.js} +8 -8
- package/dist/{chunk-2UEI7ZZ5.js → chunk-HT7QZ3JB.js} +5 -5
- package/dist/{chunk-7GTIW25A.js → chunk-IHGMXLLO.js} +6 -5
- package/dist/chunk-IHGMXLLO.js.map +1 -0
- package/dist/{chunk-UBK5LSLD.js → chunk-IJCEGKCM.js} +222 -152
- package/dist/{chunk-UBK5LSLD.js.map → chunk-IJCEGKCM.js.map} +1 -1
- package/dist/{chunk-4X3HAJWZ.js → chunk-IKGAI6ES.js} +2 -2
- package/dist/{chunk-GIW4L5PI.js → chunk-INVGMQKJ.js} +2 -2
- package/dist/{chunk-GP2O652R.js → chunk-JMKK6UBR.js} +34 -389
- package/dist/chunk-JMKK6UBR.js.map +1 -0
- package/dist/{chunk-STKHXNVO.js → chunk-ML7FSBBM.js} +4 -4
- package/dist/{chunk-CHYLIBKP.js → chunk-OHI6P6GE.js} +4 -4
- package/dist/{chunk-ZYZIRL4X.js → chunk-OMWOFIK5.js} +2657 -2525
- package/dist/chunk-OMWOFIK5.js.map +1 -0
- package/dist/{chunk-HWAJUCPO.js → chunk-PHLASJD2.js} +31 -26
- package/dist/chunk-PHLASJD2.js.map +1 -0
- package/dist/{chunk-2SFOJPJH.js → chunk-PYTN5UNL.js} +2 -2
- package/dist/{chunk-6KIQF3UT.js → chunk-RRZOCS22.js} +4 -4
- package/dist/{chunk-3QBKZZKE.js → chunk-U4GRHZRQ.js} +1705 -1490
- package/dist/chunk-U4GRHZRQ.js.map +1 -0
- package/dist/{chunk-UL2JGKCQ.js → chunk-VPRBPMVL.js} +3 -3
- package/dist/{chunk-O3FMPRQH.js → chunk-VVDPRJU7.js} +3 -1
- package/dist/chunk-VVDPRJU7.js.map +1 -0
- package/dist/{chunk-AZPPUDUR.js → chunk-YHW6FXKC.js} +7 -7
- package/dist/{chunk-PO2CMGVP.js → chunk-YI6DZGN6.js} +2 -2
- package/dist/{cli-circuit-breaker-KAOHEKYP.js → cli-circuit-breaker-HV7WXCVP.js} +5 -5
- package/dist/{cli-readiness-X7O3LCWW.js → cli-readiness-N4WWAROI.js} +10 -9
- package/dist/{cli-server-gateway-P4F66L2K.js → cli-server-gateway-5N7MHUO6.js} +15 -13
- package/dist/cli.js +88 -85
- package/dist/cli.js.map +1 -1
- package/dist/{composite-router-4QGXSANU.js → composite-router-TXGVXX56.js} +4 -4
- package/dist/{consensus-vote-ZCZJT3HS.js → consensus-vote-BYEM44JH.js} +19 -17
- package/dist/{context-retriever-2XMORQMD.js → context-retriever-NT2DYPFG.js} +11 -11
- package/dist/{doctor-deep-RLYWXUJX.js → doctor-deep-RUWHL6R5.js} +5 -5
- package/dist/{doctor-gateway-report-AKE3S2UH.js → doctor-gateway-report-BBMWMMVQ.js} +8 -8
- package/dist/{doctor-live-MA7S3NS7.js → doctor-live-NI27JU6K.js} +15 -13
- package/dist/{doctor-live-MA7S3NS7.js.map → doctor-live-NI27JU6K.js.map} +1 -1
- package/dist/{expert-bridge-2TNU6HKC.js → expert-bridge-V2R5PAXS.js} +6 -6
- package/dist/{factory-UCKSPZ5G.js → factory-3PBQNM44.js} +14 -12
- package/dist/{factory-5UWGAQOB.js → factory-YZILOS2Z.js} +7 -7
- package/dist/gemini-adapter-IZ3TS6KZ.js +28 -0
- package/dist/{improvement-review-PHNGPUYO.js → improvement-review-N6W2FWFO.js} +7 -7
- package/dist/index.d.ts +68 -2
- package/dist/index.js +132 -128
- package/dist/index.js.map +1 -1
- package/dist/{init-opencode-CII5S6XH.js → init-opencode-PLMPOB55.js} +7 -7
- package/dist/{issue-triage-DO6ATHBV.js → issue-triage-W5XKE324.js} +7 -7
- package/dist/{model-config-helpers-3U6IEHM6.js → model-config-helpers-5DTFDWYR.js} +7 -3
- package/dist/{openai-compat-adapter-7G6JYZLY.js → openai-compat-adapter-4VREPXZT.js} +7 -7
- package/dist/{pr-reviewer-helpers-JSLG5YYG.js → pr-reviewer-helpers-RAPVW52Y.js} +6 -6
- package/dist/{registry-command-X5NLFI3D.js → registry-command-3XWS7G6F.js} +2 -2
- package/dist/{repo-security-plan-DLROWMDR.js → repo-security-plan-BITATHGO.js} +4 -4
- package/dist/{research-helpers-synthesize-NE3I56IC.js → research-helpers-synthesize-FW47ZIMK.js} +6 -6
- package/dist/{routing-memory-YFSHH2AN.js → routing-memory-POESZPDJ.js} +4 -4
- package/dist/{session-memory-ZE2FUHO3.js → session-memory-TBBFP3XP.js} +5 -5
- package/dist/{setup-config-SFNU2QL4.js → setup-config-AKFLKDMP.js} +5 -5
- package/dist/{setup-custom-api-JBCH5YAW.js → setup-custom-api-WQMO2OV7.js} +5 -5
- package/dist/{tool-memory-Z3X6EFMS.js → tool-memory-RLCP6WVV.js} +7 -7
- package/dist/{unified-registry-2YSSICSB.js → unified-registry-MIANRTCJ.js} +14 -12
- package/dist/{weather-report-YSGMEYVV.js → weather-report-QB2TYTYU.js} +4 -4
- package/dist/weather-report-QB2TYTYU.js.map +1 -0
- package/package.json +1 -1
- package/dist/chunk-2URHVZJR.js.map +0 -1
- package/dist/chunk-3QBKZZKE.js.map +0 -1
- package/dist/chunk-7GTIW25A.js.map +0 -1
- package/dist/chunk-GP2O652R.js.map +0 -1
- package/dist/chunk-HWAJUCPO.js.map +0 -1
- package/dist/chunk-MFBTGXR6.js.map +0 -1
- package/dist/chunk-O3FMPRQH.js.map +0 -1
- package/dist/chunk-ZYZIRL4X.js.map +0 -1
- /package/dist/{ast-rule-runner-GRU2OC5H.js.map → ast-rule-runner-PIIAHXDA.js.map} +0 -0
- /package/dist/{child-mcp-config-DNZN7CMS.js.map → child-mcp-config-B6BTYZT4.js.map} +0 -0
- /package/dist/{chunk-L4QFWMXB.js.map → chunk-26WUCAGU.js.map} +0 -0
- /package/dist/{chunk-UMG4PRKT.js.map → chunk-4HOSKAB3.js.map} +0 -0
- /package/dist/{chunk-JLJVZP7U.js.map → chunk-4NNCB7O2.js.map} +0 -0
- /package/dist/{chunk-Z5XFIY4Q.js.map → chunk-5BEFQVPR.js.map} +0 -0
- /package/dist/{chunk-4X4RJ6AP.js.map → chunk-6T6YL7MV.js.map} +0 -0
- /package/dist/{chunk-RWBF3Y4A.js.map → chunk-7HI6EWY5.js.map} +0 -0
- /package/dist/{chunk-45G5ZV3K.js.map → chunk-7Y6SB623.js.map} +0 -0
- /package/dist/{chunk-N5YTX4UL.js.map → chunk-BSX3PMNN.js.map} +0 -0
- /package/dist/{chunk-6A6YA4C4.js.map → chunk-BVUPPTAD.js.map} +0 -0
- /package/dist/{chunk-L3VR5RXX.js.map → chunk-E5XKXB3G.js.map} +0 -0
- /package/dist/{chunk-6WCFWNIR.js.map → chunk-FOJ2INSI.js.map} +0 -0
- /package/dist/{chunk-OMQC4NWX.js.map → chunk-GCRXO43T.js.map} +0 -0
- /package/dist/{chunk-U36QOTW3.js.map → chunk-HCTKX472.js.map} +0 -0
- /package/dist/{chunk-2UEI7ZZ5.js.map → chunk-HT7QZ3JB.js.map} +0 -0
- /package/dist/{chunk-4X3HAJWZ.js.map → chunk-IKGAI6ES.js.map} +0 -0
- /package/dist/{chunk-GIW4L5PI.js.map → chunk-INVGMQKJ.js.map} +0 -0
- /package/dist/{chunk-STKHXNVO.js.map → chunk-ML7FSBBM.js.map} +0 -0
- /package/dist/{chunk-CHYLIBKP.js.map → chunk-OHI6P6GE.js.map} +0 -0
- /package/dist/{chunk-2SFOJPJH.js.map → chunk-PYTN5UNL.js.map} +0 -0
- /package/dist/{chunk-6KIQF3UT.js.map → chunk-RRZOCS22.js.map} +0 -0
- /package/dist/{chunk-UL2JGKCQ.js.map → chunk-VPRBPMVL.js.map} +0 -0
- /package/dist/{chunk-AZPPUDUR.js.map → chunk-YHW6FXKC.js.map} +0 -0
- /package/dist/{chunk-PO2CMGVP.js.map → chunk-YI6DZGN6.js.map} +0 -0
- /package/dist/{cli-circuit-breaker-KAOHEKYP.js.map → cli-circuit-breaker-HV7WXCVP.js.map} +0 -0
- /package/dist/{cli-readiness-X7O3LCWW.js.map → cli-readiness-N4WWAROI.js.map} +0 -0
- /package/dist/{cli-server-gateway-P4F66L2K.js.map → cli-server-gateway-5N7MHUO6.js.map} +0 -0
- /package/dist/{composite-router-4QGXSANU.js.map → composite-router-TXGVXX56.js.map} +0 -0
- /package/dist/{consensus-vote-ZCZJT3HS.js.map → consensus-vote-BYEM44JH.js.map} +0 -0
- /package/dist/{context-retriever-2XMORQMD.js.map → context-retriever-NT2DYPFG.js.map} +0 -0
- /package/dist/{doctor-deep-RLYWXUJX.js.map → doctor-deep-RUWHL6R5.js.map} +0 -0
- /package/dist/{doctor-gateway-report-AKE3S2UH.js.map → doctor-gateway-report-BBMWMMVQ.js.map} +0 -0
- /package/dist/{expert-bridge-2TNU6HKC.js.map → expert-bridge-V2R5PAXS.js.map} +0 -0
- /package/dist/{factory-5UWGAQOB.js.map → factory-3PBQNM44.js.map} +0 -0
- /package/dist/{factory-UCKSPZ5G.js.map → factory-YZILOS2Z.js.map} +0 -0
- /package/dist/{improvement-review-PHNGPUYO.js.map → gemini-adapter-IZ3TS6KZ.js.map} +0 -0
- /package/dist/{issue-triage-DO6ATHBV.js.map → improvement-review-N6W2FWFO.js.map} +0 -0
- /package/dist/{init-opencode-CII5S6XH.js.map → init-opencode-PLMPOB55.js.map} +0 -0
- /package/dist/{model-config-helpers-3U6IEHM6.js.map → issue-triage-W5XKE324.js.map} +0 -0
- /package/dist/{openai-compat-adapter-7G6JYZLY.js.map → model-config-helpers-5DTFDWYR.js.map} +0 -0
- /package/dist/{pr-reviewer-helpers-JSLG5YYG.js.map → openai-compat-adapter-4VREPXZT.js.map} +0 -0
- /package/dist/{repo-security-plan-DLROWMDR.js.map → pr-reviewer-helpers-RAPVW52Y.js.map} +0 -0
- /package/dist/{registry-command-X5NLFI3D.js.map → registry-command-3XWS7G6F.js.map} +0 -0
- /package/dist/{research-helpers-synthesize-NE3I56IC.js.map → repo-security-plan-BITATHGO.js.map} +0 -0
- /package/dist/{routing-memory-YFSHH2AN.js.map → research-helpers-synthesize-FW47ZIMK.js.map} +0 -0
- /package/dist/{session-memory-ZE2FUHO3.js.map → routing-memory-POESZPDJ.js.map} +0 -0
- /package/dist/{setup-config-SFNU2QL4.js.map → session-memory-TBBFP3XP.js.map} +0 -0
- /package/dist/{tool-memory-Z3X6EFMS.js.map → setup-config-AKFLKDMP.js.map} +0 -0
- /package/dist/{setup-custom-api-JBCH5YAW.js.map → setup-custom-api-WQMO2OV7.js.map} +0 -0
- /package/dist/{unified-registry-2YSSICSB.js.map → tool-memory-RLCP6WVV.js.map} +0 -0
- /package/dist/{weather-report-YSGMEYVV.js.map → unified-registry-MIANRTCJ.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/config/in-tree-data.ts","../src/config/model-derivation.ts","../src/config/model-identity.ts","../src/config/in-tree-entries.ts","../src/config/manifest-overlay.ts","../src/config/models-generated-loader.ts","../src/config/model-fuzzy-resolution.ts","../src/config/models-dev-snapshot-loader.ts","../src/config/model-registry.ts"],"sourcesContent":["/* eslint-disable max-lines -- data-only registry; grows with every supported model (#4176) */\n/**\n * nexus-agents/config - In-tree model data\n *\n * Hardcoded model capabilities matrix that feeds the ModelRegistry's\n * tier-2 (in-tree authoritative) entries via the converter in\n * `in-tree-entries.ts`. Renamed from `model-capabilities.ts` as the\n * finale of epic #2546 — the legacy helper surface (find*,\n * getModelCapabilities, modelSupportsAll) moved to\n * `model-config-helpers.ts` as registry-backed equivalents; this\n * file is data-only.\n *\n * Consumers should NOT import from here directly — they should read\n * via `getDefaultRegistry()` or the helpers in\n * `model-config-helpers.ts`. The only legitimate direct importers\n * are `in-tree-entries.ts` (the converter), `model-identity.ts`\n * (fallback vendor lookup for in-tree aliases, #6635), and the\n * helpers module itself.\n *\n * @module config/in-tree-data\n * (Source: Issue #683, Epic #682; renamed in #2546 slice E)\n */\n\nimport type {\n ModelCapabilitiesMatrix,\n ModelId,\n CliNameLiteral,\n} from './model-capabilities-types.js';\n\n// ---------------------------------------------------------------------------\n// Capabilities Data\n// ---------------------------------------------------------------------------\n\n/**\n * Built-in model capabilities matrix.\n *\n * Sources:\n * - Anthropic: docs.anthropic.com (Claude model cards)\n * - Google: ai.google.dev (Gemini API docs, Veo/Imagen release notes)\n * - OpenAI: platform.openai.com (Codex/GPT model cards)\n */\nexport const DEFAULT_MODEL_CAPABILITIES: ModelCapabilitiesMatrix = {\n version: 3,\n updatedAt: '2026-07-03',\n models: [\n // ----- Anthropic Claude -----\n {\n id: 'claude-fable-5.1',\n displayName: 'Claude Fable 5.1',\n provider: 'anthropic',\n contextWindow: 1_000_000,\n outputModalities: ['text', 'structured_json', 'code'],\n inputModalities: ['text', 'image', 'pdf', 'code'],\n toolCapabilities: ['mcp', 'function_calling', 'computer_use', 'structured_output'],\n specialFeatures: ['extended_thinking', 'streaming', 'citations', 'context_caching'],\n notes:\n 'Next-gen frontier Claude Fable (Issue #7104 / #6625); above Fable 5; 1M context; models.dev / OpenRouter 2026-09-01',\n pricing: { inputPer1M: 10.0, outputPer1M: 50.0 },\n qualityScores: { reasoning: 10, codeGeneration: 10, speed: 6, cost: 4 },\n maxOutputTokens: 128_000,\n cliName: 'claude',\n cliModelName: 'claude-fable-5.1',\n unsupportedParameters: ['temperature'],\n },\n {\n id: 'claude-fable-5',\n displayName: 'Claude Fable 5',\n provider: 'anthropic',\n contextWindow: 1_000_000,\n outputModalities: ['text', 'structured_json', 'code'],\n inputModalities: ['text', 'image', 'pdf', 'code'],\n toolCapabilities: ['mcp', 'function_calling', 'computer_use', 'structured_output'],\n specialFeatures: ['extended_thinking', 'streaming', 'citations', 'context_caching'],\n notes: 'Frontier Claude (models.dev 2026-06-29); above Opus 4.6; 1M context',\n pricing: { inputPer1M: 10.0, outputPer1M: 50.0 },\n qualityScores: { reasoning: 10, codeGeneration: 10, speed: 5, cost: 4 },\n maxOutputTokens: 128_000,\n cliName: 'claude',\n cliAlias: 'fable',\n cliModelName: 'claude-fable-5',\n // #4176 belt-and-braces: fable→5.0 regex fallback already rejects temperature.\n unsupportedParameters: ['temperature'],\n },\n {\n id: 'claude-opus-5.5',\n displayName: 'Claude Opus 5.5',\n provider: 'anthropic',\n contextWindow: 1_000_000,\n outputModalities: ['text', 'structured_json', 'code'],\n inputModalities: ['text', 'image', 'pdf', 'code'],\n toolCapabilities: ['mcp', 'function_calling', 'computer_use', 'structured_output'],\n specialFeatures: ['extended_thinking', 'streaming', 'citations', 'context_caching'],\n notes:\n 'Next-gen flagship Claude Opus (Issue #7100 / #6625); 1M context; models.dev / OpenRouter 2026-09-22',\n pricing: { inputPer1M: 4.0, outputPer1M: 20.0 },\n qualityScores: { reasoning: 10, codeGeneration: 9, speed: 6, cost: 6 },\n maxOutputTokens: 128_000,\n cliName: 'claude',\n cliModelName: 'claude-opus-5.5',\n },\n {\n id: 'claude-opus-5',\n displayName: 'Claude Opus 5',\n provider: 'anthropic',\n contextWindow: 1_000_000,\n outputModalities: ['text', 'structured_json', 'code'],\n inputModalities: ['text', 'image', 'pdf', 'code'],\n toolCapabilities: ['mcp', 'function_calling', 'computer_use', 'structured_output'],\n specialFeatures: ['extended_thinking', 'streaming', 'citations', 'context_caching'],\n notes:\n 'Frontier Claude Opus flagship (Issue #7374 / #6625); 1M context; models.dev / OpenRouter 2026-07-24',\n pricing: { inputPer1M: 5.0, outputPer1M: 25.0 },\n qualityScores: { reasoning: 10, codeGeneration: 9, speed: 6, cost: 5 },\n maxOutputTokens: 128_000,\n cliName: 'claude',\n cliModelName: 'claude-opus-5',\n },\n {\n id: 'claude-opus-4.8',\n displayName: 'Claude Opus 4.8',\n provider: 'anthropic',\n contextWindow: 1_000_000,\n outputModalities: ['text', 'structured_json', 'code'],\n inputModalities: ['text', 'image', 'pdf', 'code'],\n toolCapabilities: ['mcp', 'function_calling', 'computer_use', 'structured_output'],\n specialFeatures: ['extended_thinking', 'streaming', 'citations', 'context_caching'],\n notes:\n 'Frontier Claude Opus flagship (Issue #7378 / #6625); 1M context; models.dev / OpenRouter 2026-05-27',\n pricing: { inputPer1M: 5.0, outputPer1M: 25.0 },\n qualityScores: { reasoning: 10, codeGeneration: 9, speed: 6, cost: 5 },\n maxOutputTokens: 128_000,\n cliName: 'claude',\n cliModelName: 'claude-opus-4.8',\n },\n {\n id: 'claude-opus',\n displayName: 'Claude Opus 4.6',\n provider: 'anthropic',\n contextWindow: 1_000_000,\n outputModalities: ['text', 'structured_json', 'code'],\n inputModalities: ['text', 'image', 'pdf', 'code'],\n toolCapabilities: ['mcp', 'function_calling', 'computer_use', 'structured_output'],\n specialFeatures: ['extended_thinking', 'streaming', 'citations', 'context_caching'],\n notes:\n 'Strongest reasoning; 1M context GA (March 2026); ideal for architecture and complex analysis',\n pricing: { inputPer1M: 5.0, outputPer1M: 25.0 },\n qualityScores: { reasoning: 10, codeGeneration: 9, speed: 5, cost: 6 },\n maxOutputTokens: 128_000,\n cliName: 'claude',\n cliAlias: 'opus',\n cliModelName: 'claude-opus-4-6',\n aliases: ['claude-opus-4', 'claude-opus-4-5-20251101'],\n },\n {\n id: 'claude-sonnet',\n displayName: 'Claude Sonnet 4.6',\n provider: 'anthropic',\n contextWindow: 1_000_000,\n outputModalities: ['text', 'structured_json', 'code'],\n inputModalities: ['text', 'image', 'pdf', 'code'],\n toolCapabilities: ['mcp', 'function_calling', 'computer_use', 'structured_output'],\n specialFeatures: ['extended_thinking', 'streaming', 'citations', 'context_caching'],\n notes: 'Balanced performance and cost; 1M context GA (March 2026); default routing target',\n pricing: { inputPer1M: 3.0, outputPer1M: 15.0 },\n qualityScores: { reasoning: 9, codeGeneration: 9, speed: 7, cost: 6 },\n maxOutputTokens: 64_000,\n cliName: 'claude',\n cliAlias: 'sonnet',\n cliModelName: 'claude-sonnet-4-6',\n aliases: ['claude-sonnet-4', 'claude-sonnet-4-5-20250929'],\n },\n {\n id: 'claude-haiku',\n displayName: 'Claude Haiku 4.5',\n provider: 'anthropic',\n contextWindow: 200_000,\n outputModalities: ['text', 'structured_json', 'code'],\n inputModalities: ['text', 'image', 'pdf', 'code'],\n toolCapabilities: ['mcp', 'function_calling', 'structured_output'],\n specialFeatures: ['streaming'],\n notes: 'Fastest Claude model; optimized for speed and cost',\n pricing: { inputPer1M: 1.0, outputPer1M: 5.0 },\n qualityScores: { reasoning: 7, codeGeneration: 7, speed: 9, cost: 9 },\n maxOutputTokens: 64_000,\n cliName: 'claude',\n cliAlias: 'haiku',\n cliModelName: 'claude-haiku-4-5-20251001',\n aliases: ['claude-haiku-4', 'claude-haiku-3'],\n },\n // ----- Google Gemini -----\n {\n id: 'gemini-3-pro',\n displayName: 'Gemini 3.1 Pro (Preview)',\n provider: 'google',\n contextWindow: 1_048_576,\n outputModalities: [\n 'text',\n 'image_png',\n 'image_jpeg',\n 'audio_pcm',\n 'audio_wav',\n 'structured_json',\n 'code',\n ],\n inputModalities: ['text', 'image', 'audio', 'video', 'pdf', 'code'],\n toolCapabilities: [\n 'function_calling',\n 'code_execution_sandbox',\n 'web_search',\n 'structured_output',\n ],\n specialFeatures: ['deep_research', 'streaming', 'grounding', 'live_api'],\n notes: 'Gemini 3.1 Pro; replaces deprecated 3 Pro Preview (March 9 2026); 1M context',\n pricing: { inputPer1M: 2.0, outputPer1M: 12.0 },\n qualityScores: { reasoning: 10, codeGeneration: 9, speed: 8, cost: 6 },\n maxOutputTokens: 65_536,\n cliName: 'gemini',\n cliModelName: 'gemini-3.1-pro-preview',\n },\n {\n id: 'gemini-pro',\n displayName: 'Gemini 2.5 Pro',\n provider: 'google',\n contextWindow: 1_048_576,\n outputModalities: [\n 'text',\n 'image_png',\n 'image_jpeg',\n 'audio_pcm',\n 'audio_wav',\n 'structured_json',\n 'code',\n ],\n inputModalities: ['text', 'image', 'audio', 'video', 'pdf', 'code'],\n toolCapabilities: [\n 'function_calling',\n 'code_execution_sandbox',\n 'web_search',\n 'structured_output',\n ],\n specialFeatures: ['deep_research', 'streaming', 'grounding', 'live_api'],\n notes: 'Largest context (1M tokens); complex reasoning; native multimodal output',\n pricing: { inputPer1M: 1.25, outputPer1M: 10.0 },\n qualityScores: { reasoning: 9, codeGeneration: 8, speed: 8, cost: 7 },\n maxOutputTokens: 65_536,\n cliName: 'gemini',\n cliModelName: 'gemini-2.5-pro',\n },\n {\n id: 'gemini-3.8-flash',\n displayName: 'Gemini 3.8 Flash',\n provider: 'google',\n contextWindow: 1_048_576,\n outputModalities: ['text', 'structured_json', 'code'],\n inputModalities: ['text', 'image', 'audio', 'video', 'pdf', 'code'],\n toolCapabilities: [\n 'function_calling',\n 'code_execution_sandbox',\n 'web_search',\n 'structured_output',\n ],\n specialFeatures: ['streaming', 'grounding'],\n notes:\n 'Next-gen fast Gemini (Issue #7101 / #6625); flash tier; 1M context; models.dev / OpenRouter 2026-09-02',\n pricing: { inputPer1M: 0.75, outputPer1M: 3.75 },\n // Flash tier: reasoning stays BELOW gemini-3-pro (10) so pro keeps winning.\n qualityScores: { reasoning: 8, codeGeneration: 9, speed: 10, cost: 9 },\n maxOutputTokens: 65_536,\n cliName: 'gemini',\n cliModelName: 'gemini-3.8-flash',\n },\n {\n id: 'gemini-3.7-flash',\n displayName: 'Gemini 3.7 Flash',\n provider: 'google',\n contextWindow: 1_048_576,\n outputModalities: ['text', 'structured_json', 'code'],\n inputModalities: ['text', 'image', 'audio', 'video', 'pdf', 'code'],\n toolCapabilities: [\n 'function_calling',\n 'code_execution_sandbox',\n 'web_search',\n 'structured_output',\n ],\n specialFeatures: ['extended_thinking', 'streaming', 'citations'],\n notes:\n 'Fast Gemini frontier model (Issue #7375 / #6625); 1M context; models.dev / OpenRouter 2026-08-13',\n pricing: { inputPer1M: 0.75, outputPer1M: 3.75 },\n qualityScores: { reasoning: 9, codeGeneration: 9, speed: 9, cost: 8 },\n maxOutputTokens: 65_536,\n cliName: 'gemini',\n cliModelName: 'gemini-3.7-flash',\n },\n {\n id: 'gemini-3.5-flash',\n displayName: 'Gemini 3.5 Flash',\n provider: 'google',\n contextWindow: 1_048_576,\n outputModalities: ['text', 'structured_json', 'code'],\n inputModalities: ['text', 'image', 'audio', 'video', 'pdf', 'code'],\n toolCapabilities: [\n 'function_calling',\n 'code_execution_sandbox',\n 'web_search',\n 'structured_output',\n ],\n specialFeatures: ['streaming', 'grounding'],\n notes: 'Latest fast Gemini (models.dev 2026-06-29); flash tier, NOT the gemini default',\n pricing: { inputPer1M: 1.5, outputPer1M: 9.0 },\n // Flash tier: reasoning stays BELOW gemini-3-pro (10) so pro keeps winning.\n qualityScores: { reasoning: 8, codeGeneration: 9, speed: 10, cost: 8 },\n maxOutputTokens: 65_536,\n cliName: 'gemini',\n cliModelName: 'gemini-3.5-flash',\n },\n {\n id: 'gemini-3-flash',\n displayName: 'Gemini 3 Flash (Preview)',\n provider: 'google',\n contextWindow: 1_048_576,\n outputModalities: ['text', 'image_png', 'image_jpeg', 'structured_json', 'code'],\n inputModalities: ['text', 'image', 'audio', 'video', 'pdf', 'code'],\n toolCapabilities: [\n 'function_calling',\n 'code_execution_sandbox',\n 'web_search',\n 'structured_output',\n ],\n specialFeatures: ['streaming', 'grounding'],\n notes: 'Next-gen fast Gemini; improved over 2.5 Flash; 1M context',\n pricing: { inputPer1M: 0.5, outputPer1M: 3.0 },\n qualityScores: { reasoning: 8, codeGeneration: 8, speed: 10, cost: 9 },\n maxOutputTokens: 65_536,\n cliName: 'gemini',\n cliModelName: 'gemini-3-flash-preview',\n },\n {\n id: 'gemini-flash',\n displayName: 'Gemini 2.5 Flash',\n provider: 'google',\n contextWindow: 1_048_576,\n outputModalities: ['text', 'image_png', 'image_jpeg', 'structured_json', 'code'],\n inputModalities: ['text', 'image', 'audio', 'video', 'pdf', 'code'],\n toolCapabilities: [\n 'function_calling',\n 'code_execution_sandbox',\n 'web_search',\n 'structured_output',\n ],\n specialFeatures: ['streaming', 'grounding'],\n notes: 'Ultra-fast Gemini 2.5; 1M context; agents and streaming optimized',\n pricing: { inputPer1M: 0.3, outputPer1M: 2.5 },\n qualityScores: { reasoning: 7, codeGeneration: 7, speed: 10, cost: 9 },\n maxOutputTokens: 65_536,\n cliName: 'gemini',\n cliModelName: 'gemini-2.5-flash',\n },\n // ----- OpenAI Codex -----\n {\n // #6842, panel vote-1790834581155-7b39b83 (option A): register the served\n // slug and make it the codex default. All capability values below,\n // including context/output limits, quality scores and parameter support,\n // are CARRIED-OVER from gpt-5.6-sol, NOT measured for gpt-6.1-sol.\n // No pricing field: accounting reports priced:false until OpenAI\n // publishes pricing; budget filters and TOPSIS estimate it at codex's\n // highest known rates via unpricedCliCostPer1M (#6866).\n // Listed first so equal-scoring selections prefer the new default.\n id: 'gpt-6.1-sol',\n aliases: ['openai/gpt-6.1-sol'],\n displayName: 'GPT-6.1 Sol',\n provider: 'openai',\n contextWindow: 1_050_000,\n outputModalities: ['text', 'structured_json', 'code'],\n inputModalities: ['text', 'image', 'pdf', 'code'],\n toolCapabilities: [\n 'function_calling',\n 'code_execution_sandbox',\n 'web_search',\n 'file_operations',\n 'structured_output',\n 'apply_patch',\n 'computer_use',\n ],\n specialFeatures: ['streaming'],\n notes:\n 'GPT-6.1 Sol; codex default per #6842 (panel option A). Context window, output limit, modalities, tools, features, quality scores and parameter support are CARRIED-OVER from gpt-5.6-sol, NOT measured. No authoritative in-tree pricing; the runtime registry may supply catalog or overlay rates.',\n qualityScores: { reasoning: 10, codeGeneration: 10, speed: 7, cost: 4 },\n maxOutputTokens: 128_000,\n cliName: 'codex',\n cliModelName: 'gpt-6.1-sol',\n unsupportedParameters: ['temperature'],\n maxTokensParam: 'max_completion_tokens',\n },\n {\n id: 'gpt-6.1-sol-pro',\n displayName: 'GPT-6.1 Sol Pro',\n provider: 'openai',\n contextWindow: 1_050_000,\n outputModalities: ['text', 'structured_json', 'code'],\n inputModalities: ['text', 'image', 'audio', 'code'],\n toolCapabilities: [\n 'function_calling',\n 'code_execution_sandbox',\n 'web_search',\n 'file_operations',\n 'structured_output',\n 'apply_patch',\n 'computer_use',\n ],\n specialFeatures: ['streaming', 'citations'],\n notes:\n 'Frontier OpenAI Sol Pro flagship (Issue #7103 / #6625); 1.05M context; models.dev / OpenRouter 2026-09-29',\n pricing: { inputPer1M: 2.0, outputPer1M: 10.0 },\n qualityScores: { reasoning: 10, codeGeneration: 10, speed: 7, cost: 4 },\n maxOutputTokens: 65_536,\n cliName: 'codex',\n cliModelName: 'gpt-6.1-sol-pro',\n unsupportedParameters: ['temperature'],\n maxTokensParam: 'max_completion_tokens',\n },\n {\n // #6516 (panel option A): the former codex default; kept routable for pins.\n // ~/.codex/models_cache.json (codex-cli 0.155.1, read 2026-09-23) puts\n // an `upgrade` record on the gpt-5.5 row: retirement_at\n // 2026-10-14T19:00:00Z, upgrade.model gpt-5.6-sol. The id equals the\n // served slug (the #5489 direction), so no alias layer is needed.\n // SOURCES:\n // - displayName, contextWindow, maxOutputTokens, pricing: models.dev\n // `gpt-5.6-sol` in the committed models-dev-snapshot.json (2026-09-21),\n // matching `openai/gpt-5.6-sol` in model-registry.generated.json\n // (2026-09-23): $4/$20 per 1M, 1.05M context, 128K output.\n // - inputModalities (text/image/pdf): the same models.dev entry.\n // - notes' description, reasoning levels and 272K default window: the\n // codex cache row (default_reasoning_level low; supported low, medium,\n // high, xhigh, max, ultra; context_window 272000).\n // - qualityScores: CARRIED OVER from gpt-5.5, NOT measured. It is the\n // successor at the same tier position; `cost` stays 4 although the\n // price fell ($4/$20 vs $5/$30), so a rescore is a separate decision.\n // - toolCapabilities, outputModalities, unsupportedParameters,\n // maxTokensParam: carried from gpt-5.5 (same family and CLI transport).\n // Listed BEFORE gpt-5.5 so a scoring tie between the two resolves to the\n // served successor, not the retiring slug.\n id: 'gpt-5.6-sol',\n displayName: 'GPT-5.6 Sol',\n provider: 'openai',\n contextWindow: 1_050_000,\n outputModalities: ['text', 'structured_json', 'code'],\n inputModalities: ['text', 'image', 'pdf', 'code'],\n toolCapabilities: [\n 'function_calling',\n 'code_execution_sandbox',\n 'web_search',\n 'file_operations',\n 'structured_output',\n 'apply_patch',\n 'computer_use',\n ],\n specialFeatures: ['streaming'],\n notes:\n 'GPT-5.6 Sol (models.dev 2026-09-21; codex catalog: \"older coding model for complex work\"); former codex default and gpt-5.5 successor per the codex cache; served by codex-cli 0.155.1; reasoning low..ultra; 1.05M context (codex cache default window 272K)',\n pricing: { inputPer1M: 4.0, outputPer1M: 20.0 },\n qualityScores: { reasoning: 10, codeGeneration: 10, speed: 7, cost: 4 },\n maxOutputTokens: 128_000,\n cliName: 'codex',\n cliModelName: 'gpt-5.6-sol',\n unsupportedParameters: ['temperature'],\n maxTokensParam: 'max_completion_tokens',\n },\n {\n // Retires in codex 2026-10-14 (codex cache upgrade record); no longer the\n // codex default (#6516). Kept routable for configs that pin it; removal\n // is tracked in #6526.\n id: 'gpt-5.5',\n displayName: 'GPT-5.5',\n provider: 'openai',\n contextWindow: 1_050_000,\n outputModalities: ['text', 'structured_json', 'code'],\n inputModalities: ['text', 'image', 'pdf', 'code'],\n toolCapabilities: [\n 'function_calling',\n 'code_execution_sandbox',\n 'web_search',\n 'file_operations',\n 'structured_output',\n 'apply_patch',\n 'computer_use',\n ],\n specialFeatures: ['streaming'],\n notes: 'Frontier GPT (models.dev 2026-06-29); succeeds GPT-5.4 in Codex CLI; 1M context',\n pricing: { inputPer1M: 5.0, outputPer1M: 30.0 },\n qualityScores: { reasoning: 10, codeGeneration: 10, speed: 7, cost: 4 },\n maxOutputTokens: 128_000,\n cliName: 'codex',\n cliModelName: 'gpt-5.5',\n unsupportedParameters: ['temperature'],\n maxTokensParam: 'max_completion_tokens',\n },\n {\n id: 'codex-5.3',\n // #5694: repointed from gpt-5.4, which codex-cli 0.150.0 no longer serves\n // (the verify Codex Models check caught it on its first live run). Terra\n // is the served gpt-5.6 variant whose price position (2/12) sits where\n // gpt-5.4 (2.5/15) did, below gpt-5.5 (5/30). Pricing and context are\n // models.dev 2026-09-06; qualityScores are CARRIED OVER from the gpt-5.4\n // entry, not measured — a tier position, so the codex balanced/best\n // tie-breaks keep their order (panel #5694, option A, 2/3).\n displayName: 'GPT-5.6 Terra',\n provider: 'openai',\n contextWindow: 1_050_000,\n outputModalities: ['text', 'structured_json', 'code'],\n inputModalities: ['text', 'image', 'pdf', 'code'],\n toolCapabilities: [\n 'function_calling',\n 'code_execution_sandbox',\n 'web_search',\n 'file_operations',\n 'structured_output',\n 'apply_patch',\n 'computer_use',\n ],\n specialFeatures: ['streaming'],\n notes:\n 'GPT-5.6 Terra (\"balanced agentic coding model\" per the codex catalog); served by codex-cli 0.150.0; 1M context; the codex cache reports a 272K default window against models.dev\\'s 1.05M',\n pricing: { inputPer1M: 2.0, outputPer1M: 12.0 },\n qualityScores: { reasoning: 10, codeGeneration: 10, speed: 7, cost: 5 },\n maxOutputTokens: 128_000,\n cliName: 'codex',\n cliModelName: 'gpt-5.6-terra',\n unsupportedParameters: ['temperature'],\n maxTokensParam: 'max_completion_tokens',\n },\n {\n id: 'codex-5.2',\n displayName: 'GPT-5.6 Luna',\n provider: 'openai',\n contextWindow: 1_050_000,\n outputModalities: ['text', 'structured_json', 'code'],\n inputModalities: ['text', 'image', 'pdf', 'code'],\n toolCapabilities: [\n 'function_calling',\n 'code_execution_sandbox',\n 'web_search',\n 'file_operations',\n 'structured_output',\n 'apply_patch',\n ],\n specialFeatures: ['streaming'],\n constraints: [\n 'Sandboxed execution only (Landlock/seccomp on Linux)',\n 'No native image/audio/video generation',\n 'Network access restricted in sandbox',\n ],\n // 2026-09-23: repointed from gpt-5.3-codex-spark, which codex-cli 0.155.1\n // no longer serves (~/.codex/models_cache.json visibility=list; the\n // verify Codex Models check reported it). Same shape as #5091 option A:\n // the id stays (it holds the arm's outcome history), only the slug and\n // the metadata describing it move.\n // WHY gpt-5.6-luna: this id is the codex fast/spark tier. The served\n // fast models are the two \"luna\" variants (codex catalog: gpt-5.6-luna\n // \"Older fast and efficient model\"; gpt-6-luna \"Fast and affordable model\n // for easier tasks\"). gpt-6-luna is the cheaper of the two, so it takes\n // the mini id; this id takes gpt-5.6-luna.\n // Context window, max output and pricing are models.dev's figures for\n // this slug (snapshot 2026-09-21); the codex cache reports a 272K default\n // window. reasoning/codeGeneration/speed are tier positions CARRIED OVER\n // from the replaced entry, not a measurement of this slug; `cost` follows\n // the registry's price scale (9, as for $0.3/$1 openrouter-qwen-coder;\n // only the free model scores 10) — spark's 7 described a $1.75/$14 slug.\n // ROUTING CONSEQUENCE: `resolve-model-for-tier` ranks the balanced tier\n // by codeGeneration and breaks the 10/10/10 tie on the higher `cost`\n // score, so this entry (now cost 9) still wins the balanced codex tier\n // over codex-5.3 (5) and gpt-5.5 (4). `resolve-model-for-tier.test.ts`\n // pins it so a rescore is a visible decision, not a side effect.\n notes:\n 'GPT-5.6 Luna (models.dev 2026-09-21; codex catalog: \"older fast and efficient model\"); fast codex tier; served by codex-cli 0.155.1; 1.05M context (codex cache default window 272K)',\n pricing: { inputPer1M: 0.2, outputPer1M: 1.2 },\n qualityScores: { reasoning: 9, codeGeneration: 10, speed: 8, cost: 9 },\n maxOutputTokens: 128_000,\n cliName: 'codex',\n cliModelName: 'gpt-5.6-luna',\n unsupportedParameters: ['temperature'],\n maxTokensParam: 'max_completion_tokens',\n },\n {\n id: 'codex-5.1-mini',\n displayName: 'GPT-6 Luna',\n provider: 'openai',\n contextWindow: 1_050_000,\n outputModalities: ['text', 'structured_json', 'code'],\n inputModalities: ['text', 'image', 'code'],\n toolCapabilities: [\n 'function_calling',\n 'code_execution_sandbox',\n 'file_operations',\n 'structured_output',\n 'apply_patch',\n ],\n specialFeatures: ['streaming'],\n constraints: ['Sandboxed execution only', 'No native image/audio/video generation'],\n // 2026-09-23: repointed from gpt-5.4-mini, which codex-cli 0.155.1 no\n // longer serves (~/.codex/models_cache.json visibility=list); #5091 had\n // repointed it from o3-mini. WHY gpt-6-luna: it is the smallest served\n // model — $0.1/$0.5 per 1M, below gpt-5.6-luna's $0.2/$1.2 — and the\n // codex catalog calls it \"Fast and affordable model for easier tasks\".\n // SOURCE: the committed models.dev snapshot (2026-09-21) and generated\n // catalogue (2026-09-20) predate gpt-6-luna. Context window, max output\n // and pricing are the live models.dev / LiteLLM figures for\n // `openai/gpt-6-luna` as read by `pnpm build:registry` on 2026-09-23\n // (LiteLLM: 922K max input); the codex cache reports a 272K default\n // window. Quality scores are the codex arm's tier positions carried\n // over, not a measurement of this slug; `cost` stays 9 on the registry's\n // price scale (only the free model scores 10).\n notes:\n 'GPT-6 Luna (models.dev/LiteLLM 2026-09-23; codex catalog: \"fast and affordable model for easier tasks\"); compact codex tier; served by codex-cli 0.155.1; 1.05M context (codex cache default window 272K)',\n pricing: { inputPer1M: 0.1, outputPer1M: 0.5 },\n qualityScores: { reasoning: 7, codeGeneration: 8, speed: 9, cost: 9 },\n maxOutputTokens: 128_000,\n cliName: 'codex',\n cliModelName: 'gpt-6-luna',\n unsupportedParameters: ['temperature'],\n maxTokensParam: 'max_completion_tokens',\n },\n // ----- OpenCode (multi-provider proxy) -----\n {\n id: 'opencode-default',\n displayName: 'OpenCode Default',\n provider: 'anthropic',\n contextWindow: 1_000_000,\n outputModalities: ['text', 'structured_json', 'code'],\n inputModalities: ['text', 'image', 'code'],\n toolCapabilities: ['mcp', 'function_calling', 'file_operations', 'structured_output'],\n specialFeatures: ['streaming'],\n notes: 'OpenCode multi-provider proxy; model selected via --model flag',\n pricing: { inputPer1M: 3.0, outputPer1M: 15.0 },\n qualityScores: { reasoning: 9, codeGeneration: 9, speed: 7, cost: 6 },\n maxOutputTokens: 64_000,\n cliName: 'opencode',\n cliModelName: 'anthropic/claude-sonnet-4-6',\n },\n // ----- OpenCode + Custom OpenAI-compatible endpoint -----\n {\n id: 'opencode-custom-opus',\n displayName: 'Custom Endpoint — Claude Opus',\n provider: 'custom-openai',\n contextWindow: 1_000_000,\n outputModalities: ['text', 'structured_json', 'code'],\n inputModalities: ['text', 'image', 'pdf', 'code'],\n toolCapabilities: ['mcp', 'function_calling', 'structured_output'],\n specialFeatures: ['extended_thinking', 'streaming', 'citations', 'context_caching'],\n notes: 'Claude Opus via custom OpenAI-compatible gateway (opencode transport); 1M context',\n pricing: { inputPer1M: 5.0, outputPer1M: 25.0 },\n qualityScores: { reasoning: 10, codeGeneration: 9, speed: 5, cost: 6 },\n maxOutputTokens: 128_000,\n cliName: 'opencode',\n cliAlias: 'custom-opus',\n cliModelName: 'custom/claude-opus-4-6',\n },\n {\n id: 'opencode-custom-sonnet',\n displayName: 'Custom Endpoint — Claude Sonnet',\n provider: 'custom-openai',\n contextWindow: 1_000_000,\n outputModalities: ['text', 'structured_json', 'code'],\n inputModalities: ['text', 'image', 'pdf', 'code'],\n toolCapabilities: ['mcp', 'function_calling', 'structured_output'],\n specialFeatures: ['streaming', 'citations', 'context_caching'],\n notes: 'Claude Sonnet via custom OpenAI-compatible gateway (opencode transport); 1M context',\n pricing: { inputPer1M: 3.0, outputPer1M: 15.0 },\n qualityScores: { reasoning: 9, codeGeneration: 9, speed: 7, cost: 6 },\n maxOutputTokens: 64_000,\n cliName: 'opencode',\n cliAlias: 'custom-sonnet',\n cliModelName: 'custom/claude-sonnet-4-6',\n },\n\n // ── OpenRouter Free Models (via OpenAI-compatible API) ────────\n {\n id: 'nemotron-3.5-lightning',\n displayName: 'NVIDIA Nemotron 3.5 Lightning',\n provider: 'openrouter',\n contextWindow: 262_144,\n outputModalities: ['text', 'structured_json', 'code'],\n inputModalities: ['text', 'code'],\n toolCapabilities: ['function_calling', 'structured_output'],\n specialFeatures: ['streaming'],\n notes:\n 'Fast agentic reasoning MoE (Issue #7102 / #6625); 262K context; models.dev / OpenRouter 2026-08-11',\n pricing: { inputPer1M: 0.07, outputPer1M: 0.2 },\n qualityScores: { reasoning: 8, codeGeneration: 8, speed: 9, cost: 10 },\n maxOutputTokens: 32_768,\n cliName: 'opencode',\n cliModelName: 'nvidia/nemotron-3.5-lightning',\n },\n {\n id: 'nemotron-3.5-content-safety',\n displayName: 'NVIDIA Nemotron 3.5 Content Safety',\n provider: 'openrouter',\n contextWindow: 131_072,\n outputModalities: ['text', 'structured_json'],\n inputModalities: ['text', 'code'],\n toolCapabilities: ['structured_output'],\n specialFeatures: ['streaming'],\n notes:\n 'Content safety guardrail model (Issue #7376 / #6625); 131K context; models.dev / OpenRouter 2026-06-04',\n pricing: { inputPer1M: 0.2, outputPer1M: 0.2 },\n qualityScores: { reasoning: 7, codeGeneration: 6, speed: 9, cost: 9 },\n maxOutputTokens: 16_384,\n cliName: 'opencode',\n cliModelName: 'nvidia/nemotron-3.5-content-safety',\n },\n {\n id: 'gpt-6-luna-pro',\n displayName: 'GPT-6 Luna Pro',\n provider: 'openrouter',\n contextWindow: 1_050_000,\n outputModalities: ['text', 'structured_json', 'code'],\n inputModalities: ['text', 'image', 'audio', 'code'],\n toolCapabilities: [\n 'function_calling',\n 'code_execution_sandbox',\n 'web_search',\n 'file_operations',\n 'structured_output',\n 'apply_patch',\n 'computer_use',\n ],\n specialFeatures: ['streaming', 'citations'],\n notes: 'OpenAI GPT-6 Luna Pro (Issue #7377 / #6625); 1.05M context; OpenRouter 2026-09-22',\n pricing: { inputPer1M: 0.1, outputPer1M: 0.5 },\n qualityScores: { reasoning: 10, codeGeneration: 9, speed: 8, cost: 10 },\n maxOutputTokens: 65_536,\n cliName: 'opencode',\n cliModelName: 'openai/gpt-6-luna-pro',\n },\n {\n id: 'openrouter-nemotron-super',\n displayName: 'NVIDIA Nemotron 3 Super 120B (free)',\n provider: 'openrouter',\n // The `:free` SKU serves 262K; the paid `nvidia/nemotron-3-super-120b-a12b`\n // is the 1M one. Copying the paid variant's headline here made every\n // context-budgeting consumer overstate capacity by ~4x (#4416).\n contextWindow: 262_144,\n outputModalities: ['text', 'structured_json', 'code'],\n inputModalities: ['text', 'code'],\n toolCapabilities: ['function_calling', 'structured_output'],\n specialFeatures: ['streaming'],\n notes:\n 'Hybrid Mamba-Transformer MoE (120B total, 12B active). ' +\n 'Designed for agentic reasoning. Free via OpenRouter.',\n pricing: { inputPer1M: 0, outputPer1M: 0 },\n qualityScores: { reasoning: 7, codeGeneration: 7, speed: 8, cost: 10 },\n maxOutputTokens: 32_768,\n cliName: 'opencode',\n cliModelName: 'nvidia/nemotron-3-super-120b-a12b:free',\n },\n {\n id: 'openrouter-qwen-coder',\n displayName: 'Qwen3 Coder 480B A35B',\n provider: 'openrouter',\n contextWindow: 262_144,\n outputModalities: ['text', 'structured_json', 'code'],\n inputModalities: ['text', 'code'],\n toolCapabilities: ['function_calling', 'structured_output'],\n specialFeatures: ['streaming'],\n notes:\n 'Strongest coding-specialized model on OpenRouter. 480B parameters ' +\n '(35B active), 262K context. The zero-cost SKU this entry used to ' +\n 'point at was retired (#4410); `qwen/qwen3-coder` is the same ' +\n 'checkpoint at list price.',\n pricing: { inputPer1M: 0.3, outputPer1M: 1 },\n qualityScores: { reasoning: 7, codeGeneration: 8, speed: 6, cost: 9 },\n maxOutputTokens: 32_768,\n cliName: 'opencode',\n cliModelName: 'qwen/qwen3-coder',\n },\n ],\n};\n\n/**\n * Default model per CLI tool. Gemini selects the measured available Flash\n * family; the Google API retains its separate Pro default (#7423).\n */\nexport const DEFAULT_MODEL_PER_CLI: Record<CliNameLiteral, ModelId> = {\n // #6842: option A; revert this default to gpt-5.6-sol in one line if needed.\n claude: 'claude-fable-5',\n gemini: 'gemini-3.8-flash',\n codex: 'gpt-6.1-sol',\n opencode: 'opencode-default',\n};\n\n/** Google API default is independent of native AGY availability (#7423). */\nexport const DEFAULT_GOOGLE_API_MODEL: ModelId = 'gemini-3-pro';\n\n/** A per-1M-token USD pricing pair (input/output). */\nexport interface CostPer1M {\n readonly input: number;\n readonly output: number;\n}\n\n/**\n * Static per-CLI USD/1M-token fallback, used ONLY when the registry has no\n * pricing for a CLI's resolved default model (#4168). Single authoritative\n * representation of the former hardcoded per-CLI cost tables (previously\n * duplicated in `budget-utils.TOKEN_COSTS`, `budget-stage`'s\n * `COST_PER_1K_TOKENS`, and `test-metrics`).\n *\n * It is the LAST resort, not the primary source: a priced model always upgrades\n * to real registry data via `resolveModelCostPer1M`, and an unpriced model is\n * estimated at its CLI's highest known rates by {@link unpricedCliCostPer1M}.\n * This row is read only when that CLI has no positively-priced model at all.\n * These rates are estimates, not measured prices, and keep an UNPRICED\n * candidate CONSERVATIVE (never $0) — a $0 fails OPEN and gets the unknown model over-selected (#4168 cond. 2).\n * Each row is kept at or above every priced model of its CLI (#6866), so the\n * last resort cannot undercut a known price either.\n *\n * Lives in this leaf data module (not `model-config-helpers`) so the\n * module-load-time `buildTopsisProfiles` call reads it after initialization,\n * dodging the TDZ hazard documented for the registry builders.\n */\nexport const STATIC_CLI_COST_PER_1M: Record<CliNameLiteral, CostPer1M> = {\n claude: { input: 3.0, output: 15.0 },\n gemini: { input: 0.075, output: 0.3 },\n // gpt-5.5's $5/$30, the highest priced codex model (#6866).\n codex: { input: 5.0, output: 30.0 },\n opencode: { input: 2.0, output: 8.0 },\n};\n\n/**\n * Conservative per-1M estimate for an UNPRICED model served by `cli` (#6866):\n * the highest input and the highest output rate among that CLI's models with a\n * positive registry price. An unknown price must never look CHEAPER than a\n * known price on the same CLI — the static $2.5/$10 codex row undercut priced\n * gpt-5.6-sol ($4/$20), so budget filters and cost-weighted TOPSIS over-selected\n * the unpriced codex default. Only the estimate changes: usage accounting still\n * records the model as `priced:false`.\n *\n * Empty case: a CLI with no positively-priced model (none priced, or only\n * explicit $0 entries, which would make the estimate free) falls back to\n * {@link STATIC_CLI_COST_PER_1M}.\n *\n * Reads the in-tree matrix directly, not the registry singleton, so the\n * module-load-time builders (`buildTopsisProfiles`, `readCliModelData`) and\n * the runtime budget path share one definition without the TDZ hazard.\n * `models` exists so the empty case can be tested.\n */\n/** The fields {@link unpricedCliCostPer1M} reads: an owner and an optional price. */\nexport interface PricedSibling {\n readonly cliName?: string | undefined;\n readonly pricing?: { readonly inputPer1M: number; readonly outputPer1M: number } | undefined;\n}\n\nexport function unpricedCliCostPer1M(\n cli: CliNameLiteral,\n models: readonly PricedSibling[] = DEFAULT_MODEL_CAPABILITIES.models\n): CostPer1M {\n let input = 0;\n let output = 0;\n for (const model of models) {\n if (model.cliName !== cli || model.pricing === undefined) continue;\n input = Math.max(input, model.pricing.inputPer1M);\n output = Math.max(output, model.pricing.outputPer1M);\n }\n // Per component: a known positive rate wins, so a free-input/paid-output\n // sibling still bounds the output side; otherwise the static row (#6866).\n const fallback = STATIC_CLI_COST_PER_1M[cli];\n return {\n input: input > 0 ? input : fallback.input,\n output: output > 0 ? output : fallback.output,\n };\n}\n","/**\n * Pattern-derivation logic for ModelRegistry — extracted from\n * `model-registry.ts` to break a runtime circular import with\n * `in-tree-entries.ts` (which needs `deriveEntry` to build the\n * in-tree slice for `buildDefaultRegistry()`).\n *\n * No state lives here; everything is pure. The `ModelEntry` type\n * is imported type-only from `model-registry.ts` to avoid a runtime\n * dependency cycle.\n *\n * @module config/model-derivation\n */\n\nimport type { ModelHints, ModelVendor, ResolvedModelIdentity } from './model-identity.js';\nimport type { ModelEntry } from './model-registry.js';\n\n/**\n * Universal fallback. Used when nothing more specific matches —\n * unknown vendor + family + no probe data. Safe defaults.\n */\nexport const DEFAULT_ENTRY: Omit<ModelEntry, 'id' | 'vendor' | 'family' | 'profileId' | 'source'> =\n {\n parallelToolCalls: false,\n promptCaching: 'none',\n toolDefinitionFormat: 'openai',\n maxRecommendedTurnBudget: 10,\n strictJson: true,\n quirks: [],\n };\n\ntype VendorOverride = Partial<Omit<ModelEntry, 'id' | 'vendor' | 'family' | 'source'>>;\n\nconst VENDOR_DEFAULTS: Partial<Record<ModelVendor, VendorOverride>> = {\n anthropic: {\n profileId: 'anthropic-default',\n parallelToolCalls: true,\n promptCaching: 'ephemeral',\n toolDefinitionFormat: 'anthropic',\n maxRecommendedTurnBudget: 15,\n },\n openai: {\n profileId: 'openai-default',\n parallelToolCalls: true,\n toolDefinitionFormat: 'openai',\n maxRecommendedTurnBudget: 15,\n },\n google: {\n profileId: 'google-default',\n parallelToolCalls: true,\n toolDefinitionFormat: 'gemini',\n maxRecommendedTurnBudget: 15,\n },\n meta: {\n profileId: 'meta-default',\n parallelToolCalls: false,\n toolDefinitionFormat: 'openai',\n maxRecommendedTurnBudget: 8,\n },\n qwen: {\n profileId: 'qwen-default',\n parallelToolCalls: false,\n toolDefinitionFormat: 'openai',\n maxRecommendedTurnBudget: 8,\n },\n nvidia: {\n profileId: 'nvidia-nemotron-default',\n parallelToolCalls: false,\n toolDefinitionFormat: 'openai',\n maxRecommendedTurnBudget: 8,\n },\n mistral: {\n profileId: 'mistral-default',\n parallelToolCalls: false,\n toolDefinitionFormat: 'openai',\n maxRecommendedTurnBudget: 8,\n },\n cohere: {\n profileId: 'cohere-default',\n parallelToolCalls: false,\n toolDefinitionFormat: 'openai',\n maxRecommendedTurnBudget: 8,\n },\n deepseek: {\n profileId: 'deepseek-default',\n parallelToolCalls: false,\n toolDefinitionFormat: 'openai',\n maxRecommendedTurnBudget: 10,\n },\n};\n\ninterface FamilyOverrideEntry {\n readonly vendor: ModelVendor;\n readonly family: string;\n readonly override: VendorOverride;\n}\n\nconst FAMILY_DEFAULTS: readonly FamilyOverrideEntry[] = [\n {\n vendor: 'anthropic',\n family: 'claude-opus',\n override: { profileId: 'claude-opus', maxRecommendedTurnBudget: 20 },\n },\n {\n vendor: 'anthropic',\n family: 'claude-haiku',\n override: { profileId: 'claude-haiku', maxRecommendedTurnBudget: 8 },\n },\n {\n vendor: 'openai',\n family: 'o-reasoning',\n override: { profileId: 'openai-o-reasoning', maxRecommendedTurnBudget: 25 },\n },\n {\n vendor: 'google',\n family: 'gemini-flash',\n override: { profileId: 'gemini-flash', maxRecommendedTurnBudget: 8 },\n },\n];\n\n/**\n * Build an entry from vendor + family + quirks when no authoritative\n * row matches. Source stamped `'derived'`; capability fields left\n * undefined (derived entries don't have measured pricing/quality data).\n */\nexport function deriveEntry(modelId: string, identity: ResolvedModelIdentity): ModelEntry {\n const vendorOverride = VENDOR_DEFAULTS[identity.vendor] ?? {};\n const familyOverride =\n FAMILY_DEFAULTS.find((f) => f.vendor === identity.vendor && f.family === identity.family)\n ?.override ?? {};\n\n const merged = {\n ...DEFAULT_ENTRY,\n profileId: 'default',\n ...vendorOverride,\n ...familyOverride,\n };\n\n // Apply quirk overlay — `'thinking'` bumps budget 1.5×, `'embedding'`\n // is propagated for adapter consumers to refuse construction.\n const quirks = [...new Set([...merged.quirks, ...identity.quirks])];\n let budget = merged.maxRecommendedTurnBudget;\n if (identity.quirks.includes('thinking')) {\n budget = Math.ceil(budget * 1.5);\n }\n\n return {\n id: modelId,\n vendor: identity.vendor,\n family: identity.family,\n ...(identity.version !== undefined && { version: identity.version }),\n parallelToolCalls: merged.parallelToolCalls,\n promptCaching: merged.promptCaching,\n toolDefinitionFormat: merged.toolDefinitionFormat,\n maxRecommendedTurnBudget: budget,\n strictJson: merged.strictJson,\n quirks,\n profileId: merged.profileId,\n source: 'derived',\n };\n}\n\n// Re-export so old call sites that pulled hints type from this side\n// of the tree don't need to change.\nexport type { ModelHints };\n","/**\n * Dynamic model-identity resolver (#2529).\n *\n * Real-world `modelId` strings are messy:\n * - clean upstream: `claude-sonnet-4-6`, `gpt-4o`, `gemini-2.0-flash`\n * - vendor-prefixed: `anthropic/claude-sonnet-4-6`, `meta-llama/llama-3.3-70b`\n * - dated: `claude-3-5-sonnet-20241022`, `gpt-4o-2024-08-06`\n * - operator-renamed: `2025-claude-opus-4_0_high`, `workspace-claude-prod`\n * - opaque: `internal-fast-model`\n *\n * This module turns any of those into a `ResolvedModelIdentity` —\n * vendor + family + version + capability hints — so the\n * agentic-adapter layer can pick a behaviour profile based on the\n * actual served model, NOT on `IModelAdapter.providerId` (which for a\n * custom OpenAI gateway is always `openai` regardless of what model\n * the gateway is fronting).\n *\n * Resolution priority (highest first):\n * 1. operator `modelHints` — explicit override at construction\n * 2. probe of `IModelAdapter.listModels()` — `owned_by` field\n * 3. modelId-string parse — fuzzy regex table on the normalised id\n * 4. `unknown` defaults\n *\n * Each layer fills only the fields its higher-priority neighbour left\n * blank, so an operator can hint `{ vendor: 'anthropic' }` and still\n * let `family` come from the probe / parse.\n *\n * @module config/model-identity\n */\n\nimport type { IModelAdapter, ModelMetadata } from '../core/types/model.js';\nimport { DEFAULT_MODEL_CAPABILITIES } from './in-tree-data.js';\nimport type { Provider } from './model-capabilities-types.js';\n\n/** Coarse vendor bucket — drives behaviour-profile lookup downstream. */\nexport type ModelVendor =\n | 'anthropic'\n | 'openai'\n | 'google'\n | 'meta'\n | 'qwen'\n | 'nvidia'\n | 'mistral'\n | 'cohere'\n | 'deepseek'\n | 'unknown';\n\n/**\n * Family inside a vendor — `claude-opus`, `claude-sonnet`, `gpt-4o`,\n * `gemini-flash`, `llama-3`, etc. `unknown` when we recognised the\n * vendor but not the specific family (e.g., gateway-renamed model).\n */\nexport type ModelFamily = string;\n\n/** Where each piece of the resolved identity came from — useful for audit logs. */\nexport type IdentitySource = 'modelHints' | 'probe' | 'modelIdParse' | 'default';\n\n/**\n * Resolved identity for a served model. Returned by `resolveModelIdentity`.\n *\n * The `quirks` array carries free-form capability hints lifted from\n * the modelId string — `'embedding'` to flag non-chat models,\n * `'thinking'` for reasoning variants, `'vision'`, `'mini'`, `'high'`,\n * etc. Behaviour profiles consult this to override their defaults.\n */\nexport interface ResolvedModelIdentity {\n readonly vendor: ModelVendor;\n readonly family: ModelFamily;\n readonly version?: string;\n readonly quirks: readonly string[];\n readonly source: IdentitySource;\n readonly rawModelId: string;\n}\n\n/** Operator-supplied identity overrides. Any field forces; others fall through. */\nexport interface ModelHints {\n readonly vendor?: ModelVendor;\n readonly family?: ModelFamily;\n readonly version?: string;\n readonly quirks?: readonly string[];\n}\n\n/** Options for the resolver. Probe is on by default; `skipProbe: true` opts out. */\nexport interface ResolveModelIdentityOptions {\n readonly hints?: ModelHints;\n readonly skipProbe?: boolean;\n}\n\n// ============================================================================\n// Pattern table — vendor + family detection from the normalised modelId\n// ============================================================================\n\ninterface VendorPattern {\n readonly vendor: ModelVendor;\n readonly regex: RegExp;\n}\n\n/**\n * Vendor-detection patterns. `\\b` word boundary matters here — without\n * it, `claudia-7b` would match the `claude` vendor. With it,\n * `2025-claude-opus-4` (after normalisation: `2025-claude-opus-4`)\n * matches because the leading `-` and trailing `-` are non-word.\n */\nconst VENDOR_PATTERNS: readonly VendorPattern[] = [\n { vendor: 'anthropic', regex: /\\b(claude|anthropic)\\b/ },\n // OpenAI: gpt, o1-o9 reasoning, chatgpt, openai prefix\n { vendor: 'openai', regex: /\\b(gpt|o[1-9]|chatgpt|openai)\\b/ },\n { vendor: 'google', regex: /\\b(gemini|bison|gecko|palm|google)\\b/ },\n { vendor: 'meta', regex: /\\b(llama|meta-llama|meta)\\b/ },\n { vendor: 'qwen', regex: /\\b(qwen)\\b/ },\n { vendor: 'nvidia', regex: /\\b(nemotron|nvidia)\\b/ },\n { vendor: 'mistral', regex: /\\b(mistral|mixtral|codestral)\\b/ },\n { vendor: 'cohere', regex: /\\b(command-r|command|cohere)\\b/ },\n { vendor: 'deepseek', regex: /\\b(deepseek)\\b/ },\n];\n\ninterface FamilyPattern {\n readonly vendor: ModelVendor;\n readonly family: string;\n readonly regex: RegExp;\n}\n\n/**\n * Family-detection patterns. Vendor-scoped — only consulted after the\n * vendor is known. Order matters: more specific patterns come first\n * (`gpt-4o` before `gpt-4`).\n */\nconst FAMILY_PATTERNS: readonly FamilyPattern[] = [\n // Anthropic\n { vendor: 'anthropic', family: 'claude-opus', regex: /\\b(opus)\\b/ },\n { vendor: 'anthropic', family: 'claude-sonnet', regex: /\\b(sonnet)\\b/ },\n { vendor: 'anthropic', family: 'claude-haiku', regex: /\\b(haiku)\\b/ },\n // OpenAI\n { vendor: 'openai', family: 'o-reasoning', regex: /\\bo[1-9]\\b/ },\n { vendor: 'openai', family: 'gpt-4o', regex: /\\b(gpt-4o|gpt4o|4o)\\b/ },\n { vendor: 'openai', family: 'gpt-4', regex: /\\b(gpt-4)\\b/ },\n { vendor: 'openai', family: 'gpt-3.5', regex: /\\b(gpt-3-5|gpt-3\\.5|gpt35)\\b/ },\n // Google\n { vendor: 'google', family: 'gemini-pro', regex: /\\bgemini.*\\bpro\\b/ },\n { vendor: 'google', family: 'gemini-flash', regex: /\\bgemini.*\\bflash\\b/ },\n { vendor: 'google', family: 'gemini', regex: /\\bgemini\\b/ },\n // Meta\n { vendor: 'meta', family: 'llama-3', regex: /\\bllama-?3\\b/ },\n { vendor: 'meta', family: 'llama-2', regex: /\\bllama-?2\\b/ },\n // Qwen — version is in the family name\n { vendor: 'qwen', family: 'qwen-3', regex: /\\bqwen-?3\\b/ },\n { vendor: 'qwen', family: 'qwen-2.5', regex: /\\bqwen-?2-?5\\b/ },\n { vendor: 'qwen', family: 'qwen-2', regex: /\\bqwen-?2\\b/ },\n // Mistral\n { vendor: 'mistral', family: 'mixtral', regex: /\\bmixtral\\b/ },\n { vendor: 'mistral', family: 'codestral', regex: /\\bcodestral\\b/ },\n { vendor: 'mistral', family: 'mistral', regex: /\\bmistral\\b/ },\n];\n\n/**\n * Quirk hints lifted from the normalised id. Detected after vendor\n * resolution so they're free of false positives (\"opus\" inside a\n * Llama name won't trigger).\n */\nconst QUIRK_PATTERNS: ReadonlyArray<{ regex: RegExp; quirk: string }> = [\n { regex: /\\b(embedding|embed)\\b/, quirk: 'embedding' },\n { regex: /\\b(thinking|reasoning)\\b/, quirk: 'thinking' },\n { regex: /\\bvision\\b/, quirk: 'vision' },\n { regex: /\\b(coder|code)\\b/, quirk: 'coder' },\n { regex: /\\binstruct\\b/, quirk: 'instruct' },\n { regex: /\\b(mini|nano|tiny|small|lite)\\b/, quirk: 'small' },\n { regex: /\\b(large|xl|big|maxi)\\b/, quirk: 'large' },\n { regex: /\\bhigh\\b/, quirk: 'high-variant' },\n { regex: /\\b(\\d+)b\\b/, quirk: 'sized-suffix' }, // 7b, 70b, 405b\n { regex: /\\b(?:\\d{8}|\\d{4}-\\d{2}-\\d{2}|\\d{4}-\\d{2})\\b/, quirk: 'dated' }, // 20240806 / 2024-08-06 / 2024-08\n { regex: /\\b(image|imagen)\\b/, quirk: 'image' },\n];\n\n// ============================================================================\n// Public API\n// ============================================================================\n\n/**\n * Resolve a model adapter to a canonical identity. Always succeeds —\n * unknown models get `vendor: 'unknown'`, `family: 'unknown'`.\n *\n * @param adapter - the model adapter being identified\n * @param options - operator hints + probe controls\n */\nexport async function resolveModelIdentity(\n adapter: IModelAdapter,\n options: ResolveModelIdentityOptions = {}\n): Promise<ResolvedModelIdentity> {\n const rawModelId = adapter.modelId;\n const hints = options.hints ?? {};\n let probe: ProbeResult | undefined;\n if (options.skipProbe !== true && typeof adapter.listModels === 'function') {\n probe = await runProbe(adapter, rawModelId);\n }\n const parsed = parseModelId(rawModelId);\n\n return mergeIdentity({ rawModelId, hints, probe, parsed });\n}\n\n/**\n * Sync variant: skip the probe and resolve from `modelId` only.\n * Useful in hot paths (per-request routing) where the async probe\n * latency isn't tolerable. The async `resolveModelIdentity` caches\n * probe results internally so the perf delta after the first call\n * is small.\n */\nexport function resolveModelIdentitySync(\n modelId: string,\n hints?: ModelHints\n): ResolvedModelIdentity {\n return mergeIdentity({\n rawModelId: modelId,\n hints: hints ?? {},\n probe: undefined,\n parsed: parseModelId(modelId),\n });\n}\n\n// ============================================================================\n// Internals\n// ============================================================================\n\ninterface ParseResult {\n readonly vendor?: ModelVendor;\n readonly family?: string;\n readonly version?: string;\n readonly quirks: readonly string[];\n}\n\ninterface ProbeResult {\n readonly vendor?: ModelVendor;\n readonly metadata?: ModelMetadata;\n}\n\n/**\n * Parse a modelId string into vendor + family + version hints.\n * Public for tests; not re-exported from the package.\n */\nexport function parseModelId(modelId: string): ParseResult {\n const normalised = normaliseModelId(modelId);\n const vendor = detectVendor(normalised);\n const family = vendor !== undefined ? detectFamily(normalised, vendor) : undefined;\n const version =\n vendor !== undefined && family !== undefined ? extractVersion(normalised, family) : undefined;\n const quirks = detectQuirks(normalised);\n\n return {\n ...(vendor !== undefined && { vendor }),\n ...(family !== undefined && { family }),\n ...(version !== undefined && { version }),\n quirks,\n };\n}\n\n/**\n * Lowercase + replace `_` and `/` with `-` so word boundaries land on\n * the real model-name tokens. Collapses runs of `-` so we don't get\n * empty tokens from `--`.\n *\n * Exported (#4164) so the ModelRegistry's normalized-retry tier reuses\n * THIS normalizer for decorated gateway ids — do not add another one.\n */\nexport function normaliseModelId(modelId: string): string {\n return modelId.toLowerCase().replace(/[_/]/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '');\n}\n\n/**\n * Maps an in-tree provider to a ModelVendor (#6635). Gateway providers\n * ('custom-openai', 'openrouter') return undefined to preserve pattern fallback.\n */\nfunction inTreeProviderToVendor(provider: Provider): ModelVendor | undefined {\n switch (provider) {\n case 'anthropic':\n case 'google':\n case 'openai':\n return provider;\n default:\n return undefined;\n }\n}\n\n/**\n * Builds the map of in-tree model IDs and aliases to vendor (#6635).\n * Consulted when the modelId string matches no vendor regex in VENDOR_PATTERNS.\n * Bare CLI aliases (e.g. 'opus', 'sonnet') are intentionally excluded so they\n * remain unresolvable per #4390 unless qualified.\n */\nfunction buildInTreeVendorMap(): ReadonlyMap<string, ModelVendor> {\n const map = new Map<string, ModelVendor>();\n for (const model of DEFAULT_MODEL_CAPABILITIES.models) {\n const vendor = inTreeProviderToVendor(model.provider);\n if (vendor === undefined) continue;\n map.set(normaliseModelId(model.id), vendor);\n if (model.aliases !== undefined) {\n for (const alias of model.aliases) {\n map.set(normaliseModelId(alias), vendor);\n }\n }\n if (model.cliModelName !== undefined) {\n map.set(normaliseModelId(model.cliModelName), vendor);\n }\n }\n return map;\n}\n\nlet cachedInTreeVendors: ReadonlyMap<string, ModelVendor> | undefined;\n\nfunction inTreeVendor(normalised: string): ModelVendor | undefined {\n cachedInTreeVendors ??= buildInTreeVendorMap();\n return cachedInTreeVendors.get(normalised);\n}\n\nfunction detectVendor(normalised: string): ModelVendor | undefined {\n for (const { vendor, regex } of VENDOR_PATTERNS) {\n if (regex.test(normalised)) return vendor;\n }\n return inTreeVendor(normalised);\n}\n\nfunction detectFamily(normalised: string, vendor: ModelVendor): string | undefined {\n for (const fp of FAMILY_PATTERNS) {\n if (fp.vendor !== vendor) continue;\n if (fp.regex.test(normalised)) return fp.family;\n }\n return undefined;\n}\n\n/**\n * Pull the version-ish substring next to the family tier —\n * `claude-opus-4-1` → `4-1`, `gpt-4o-2024-08-06` → `2024-08-06`.\n *\n * A numeric run AFTER the tier wins. When there is none, the run immediately\n * BEFORE it is used (#6605): gateway catalogues write `claude_4_5_opus`, and\n * Google writes `gemini-2.5-pro`, and both used to come back versionless — so\n * two generations of a family shared one identity key. Dotted minor versions\n * straight after the root (`gpt-4.1` -> `1`) are matched identically to dashed\n * ones (#6616). Best-effort; an id with neither returns undefined.\n */\nfunction extractVersion(normalised: string, family: string): string | undefined {\n // Strip vendor prefix if present, then look for a numeric segment\n // after the family root.\n const familyRoot = family.replace(/^claude-|^gemini-|^llama-|^qwen-|^gpt-/, '');\n const idx = normalised.indexOf(familyRoot);\n if (idx === -1) return undefined;\n const tail = normalised.slice(idx + familyRoot.length);\n const after = /^[-.]?(\\d[\\d.\\-]*)/.exec(tail)?.[1]?.replace(/-+$/, '');\n if (after !== undefined && after !== '') return after;\n return /(?:^|-)(\\d+(?:[.-]\\d+)*)-$/.exec(normalised.slice(0, idx))?.[1];\n}\n\n/**\n * Comparison key for a version string: normalised like an id, with `.`\n * unified to `-`, so `4.5` and `4-5` compare equal (#6605). A KEY only —\n * `ResolvedModelIdentity.version` keeps the spelling it was parsed from, and\n * id normalisation stays {@link normaliseModelId}. Shared by the registry's\n * identity tier and `canonicalModelKey`, which must agree on it.\n */\nexport function canonicalVersionKey(version: string): string {\n return normaliseModelId(version).replace(/\\./g, '-');\n}\n\nfunction detectQuirks(normalised: string): readonly string[] {\n const out: string[] = [];\n for (const { regex, quirk } of QUIRK_PATTERNS) {\n if (regex.test(normalised) && !out.includes(quirk)) out.push(quirk);\n }\n return out;\n}\n\ninterface ListModelsCapable {\n listModels: () => Promise<readonly ModelMetadata[]>;\n}\n\nasync function runProbe(adapter: IModelAdapter, modelId: string): Promise<ProbeResult | undefined> {\n try {\n const capable = adapter as unknown as ListModelsCapable;\n const models = await capable.listModels();\n const matched = models.find((m) => m.id === modelId);\n if (matched === undefined) return undefined;\n const result: ProbeResult = { metadata: matched };\n if (matched.ownedBy !== undefined) {\n const vendor = vendorFromOwnedBy(matched.ownedBy);\n if (vendor !== undefined) {\n return { ...result, vendor };\n }\n }\n return result;\n } catch {\n // Probe is best-effort. Failure (network, unsupported endpoint,\n // bad auth) silently falls back to modelId-only resolution.\n return undefined;\n }\n}\n\n/**\n * Map an OpenAI `/v1/models` `owned_by` field to a vendor bucket.\n * Different gateways report differently — OpenRouter says `anthropic`,\n * upstream OpenAI says `openai`/`system`/`openai-internal`, vLLM says\n * the org name. We do conservative substring matching.\n *\n * Implemented as a data-driven lookup so the cyclomatic-complexity\n * check (max 10) doesn't trip on the chain of `if`s.\n */\nconst OWNED_BY_PATTERNS: ReadonlyArray<{ readonly substr: string; readonly vendor: ModelVendor }> =\n [\n { substr: 'anthropic', vendor: 'anthropic' },\n { substr: 'openai', vendor: 'openai' },\n { substr: 'google', vendor: 'google' },\n { substr: 'meta', vendor: 'meta' },\n { substr: 'alibaba', vendor: 'qwen' },\n { substr: 'qwen', vendor: 'qwen' },\n { substr: 'nvidia', vendor: 'nvidia' },\n { substr: 'nemotron', vendor: 'nvidia' },\n { substr: 'mistral', vendor: 'mistral' },\n { substr: 'cohere', vendor: 'cohere' },\n { substr: 'deepseek', vendor: 'deepseek' },\n ];\n\nfunction vendorFromOwnedBy(ownedBy: string): ModelVendor | undefined {\n const lc = ownedBy.toLowerCase();\n for (const { substr, vendor } of OWNED_BY_PATTERNS) {\n if (lc.includes(substr)) return vendor;\n }\n return undefined;\n}\n\ninterface MergeArgs {\n readonly rawModelId: string;\n readonly hints: ModelHints;\n readonly probe: ProbeResult | undefined;\n readonly parsed: ParseResult;\n}\n\nfunction mergeIdentity(args: MergeArgs): ResolvedModelIdentity {\n const { rawModelId, hints, probe, parsed } = args;\n const version = pickVersion(hints, parsed);\n return {\n vendor: hints.vendor ?? probe?.vendor ?? parsed.vendor ?? 'unknown',\n family: hints.family ?? parsed.family ?? 'unknown',\n ...(version !== undefined && { version }),\n quirks: [...new Set([...(hints.quirks ?? []), ...parsed.quirks])],\n source: pickSource(hints, probe, parsed),\n rawModelId,\n };\n}\n\nfunction pickVersion(hints: ModelHints, parsed: ParseResult): string | undefined {\n return hints.version ?? parsed.version;\n}\n\nfunction pickSource(\n hints: ModelHints,\n probe: ProbeResult | undefined,\n parsed: ParseResult\n): IdentitySource {\n if (hints.vendor !== undefined) return 'modelHints';\n if (probe?.vendor !== undefined) return 'probe';\n if (parsed.vendor !== undefined) return 'modelIdParse';\n return 'default';\n}\n","/**\n * Build the tier-2 `inTreeEntries` for the default ModelRegistry from\n * `DEFAULT_MODEL_CAPABILITIES`. This is the missing wiring identified\n * in #2546 slice A — `buildDefaultRegistry()` previously loaded\n * tiers 1 (manifest) and 3 (models.dev snapshot) but never the\n * authoritative in-tree data.\n *\n * Each `ModelCapability` is converted to a `ModelEntry` by running\n * pattern derivation for behaviour fields (parallelToolCalls,\n * promptCaching, profileId, etc.) and overlaying the matrix's\n * capability fields (contextWindow, pricing, modalities) on top.\n * Aliases include the matrix's `aliases` array plus `cliModelName` so\n * vendor-style lookups (`claude-opus-4-6`) resolve to the canonical\n * short id (`claude-opus`).\n *\n * @module config/in-tree-entries\n */\n\nimport { DEFAULT_MODEL_CAPABILITIES } from './in-tree-data.js';\nimport type { ModelCapability, Provider } from './model-capabilities-types.js';\nimport { deriveEntry } from './model-derivation.js';\nimport type { ModelEntry } from './model-registry.js';\nimport { resolveModelIdentitySync, type ModelVendor } from './model-identity.js';\n\n/**\n * Map the matrix's `provider` (which includes gateway labels like\n * `custom-openai` and `openrouter`) to the registry's coarser\n * `ModelVendor`. Gateway providers resolve to `'unknown'` so identity\n * resolution falls back to modelId pattern detection.\n */\nfunction providerToVendor(provider: Provider): ModelVendor {\n switch (provider) {\n case 'anthropic':\n case 'google':\n case 'openai':\n return provider;\n default:\n return 'unknown';\n }\n}\n\n/**\n * Convert one `ModelCapability` row into a `ModelEntry`. Behaviour\n * fields come from `deriveEntry()` (so vendor/family defaults apply);\n * capability fields come from the matrix.\n */\nfunction optionalFields(model: ModelCapability): Partial<ModelEntry> {\n const out: Partial<{ -readonly [K in keyof ModelEntry]: ModelEntry[K] }> = {};\n if (model.maxOutputTokens !== undefined) out.maxOutputTokens = model.maxOutputTokens;\n if (model.pricing !== undefined) out.pricing = model.pricing;\n if (model.qualityScores !== undefined) out.qualityScores = model.qualityScores;\n if (model.notes !== undefined) out.notes = model.notes;\n if (model.cliName !== undefined) out.cliName = model.cliName;\n if (model.cliAlias !== undefined) out.cliAlias = model.cliAlias;\n if (model.cliModelName !== undefined) out.cliModelName = model.cliModelName;\n if (model.unsupportedParameters !== undefined) {\n out.unsupportedParameters = model.unsupportedParameters;\n }\n if (model.maxTokensParam !== undefined) out.maxTokensParam = model.maxTokensParam;\n return out;\n}\n\nfunction toEntry(model: ModelCapability): ModelEntry {\n const vendorHint = providerToVendor(model.provider);\n const identity = resolveModelIdentitySync(model.id, { vendor: vendorHint });\n const derived = deriveEntry(model.id, identity);\n\n const allAliases = new Set<string>(model.aliases ?? []);\n if (model.cliModelName !== undefined && model.cliModelName !== model.id) {\n allAliases.add(model.cliModelName);\n }\n\n return {\n ...derived,\n id: model.id,\n ...(allAliases.size > 0 && { aliases: [...allAliases] }),\n displayName: model.displayName,\n contextWindow: model.contextWindow,\n inputModalities: model.inputModalities,\n outputModalities: model.outputModalities,\n toolCapabilities: model.toolCapabilities,\n specialFeatures: model.specialFeatures,\n ...optionalFields(model),\n source: 'in-tree',\n };\n}\n\n/**\n * Build the full set of in-tree entries from the static matrix. Called\n * once at default-registry construction.\n */\nexport function buildInTreeEntries(): readonly ModelEntry[] {\n return DEFAULT_MODEL_CAPABILITIES.models.map(toEntry);\n}\n","/**\n * Manifest overlay for the unified `ModelRegistry` (#2547 4a, #3351).\n *\n * Reads YAML or JSON manifests of `ModelEntry` records from disk and\n * returns them in a shape the `ModelRegistry` can ingest via its\n * `manifestEntries` option. Manifest entries win over in-tree\n * authoritative entries — used to override pricing or capability flags\n * without an npm release, or to declare models the in-tree registry\n * doesn't know about (gateway-fronted variants, vendor pre-releases).\n *\n * TWO paths are merged into the single `manifest` registry tier (#3351):\n *\n * 1. USER path — `~/.nexus-agents/models.yaml` (or whatever\n * `NEXUS_MODEL_REGISTRY_OVERLAY` points at). Loaded FIRST, lower\n * precedence. Lets an individual user override model data without a\n * release. As of #3351 this file uses the SAME ManifestSchema /\n * `ModelEntry` shape as the operator manifest below — the old\n * `ModelCapability` format (handled by the now-deleted\n * `capability-overlay.ts`) had zero production effect, so there is\n * nothing to migrate.\n * 2. OPERATOR path — `~/.nexus-agents/models-manifest.yaml` (or\n * whatever `NEXUS_MODELS_OVERLAY_PATH` points at). Loaded SECOND,\n * higher precedence. On an id collision the operator entry replaces\n * the user entry at the registry's merge point, except that an\n * operator entry without `pricing` keeps the user rate (#7132).\n *\n * Net registry precedence (low → high):\n * generated < models-dev < in-tree < USER-overlay < OPERATOR-manifest.\n * The whole manifest tier sits above in-tree; within it, operator beats\n * user via load order.\n *\n * Fully optional and fail-closed — missing file, empty file, malformed\n * YAML/JSON, schema-invalid entries, and oversized files all degrade to\n * the empty overlay with structured rejections instead of throwing.\n *\n * @module config/manifest-overlay\n */\n\nimport { existsSync, readFileSync, statSync } from 'node:fs';\nimport { parse as parseYaml } from 'yaml';\nimport { z } from 'zod';\n\nimport { createLogger } from '../core/logger.js';\nimport type { ILogger } from '../core/index.js';\nimport { previewNexusDataPath } from './nexus-data-dir.js';\nimport type { ModelEntry, ToolDefinitionFormat, PromptCachingMode } from './model-registry.js';\nimport type { ModelVendor } from './model-identity.js';\nimport {\n OUTPUT_MODALITIES,\n INPUT_MODALITIES,\n TOOL_CAPABILITIES,\n SPECIAL_FEATURES,\n PricingSchema,\n QualityScoresSchema,\n} from './model-capabilities-types.js';\n\n/** Env var an operator sets to point at a non-default OPERATOR manifest path. */\nexport const MANIFEST_ENV_VAR = 'NEXUS_MODELS_OVERLAY_PATH';\n\n/** Env var a USER sets to point at a non-default user overlay path (#3351). */\nexport const USER_MANIFEST_ENV_VAR = 'NEXUS_MODEL_REGISTRY_OVERLAY';\n\n/** Max manifest size accepted (1 MB — far larger than any realistic manifest). */\nexport const MANIFEST_MAX_BYTES = 1 * 1024 * 1024;\n\n/**\n * Default OPERATOR manifest location: `<NEXUS_DATA_DIR>/models-manifest.yaml`.\n */\nexport function defaultManifestPath(): string {\n return previewNexusDataPath('models-manifest.yaml');\n}\n\n/**\n * Default USER overlay location: `<NEXUS_DATA_DIR>/models.yaml` (#3351).\n * Lower precedence than the operator manifest; same ManifestSchema shape.\n */\nexport function defaultUserManifestPath(): string {\n return previewNexusDataPath('models.yaml');\n}\n\n/**\n * Resolve the OPERATOR manifest path. `NEXUS_MODELS_OVERLAY_PATH` wins if set;\n * otherwise the default `~/.nexus-agents/models-manifest.yaml`.\n */\nexport function resolveManifestPath(env: NodeJS.ProcessEnv = process.env): string {\n const override = env[MANIFEST_ENV_VAR];\n if (override !== undefined && override !== '') return override;\n return defaultManifestPath();\n}\n\n/**\n * Resolve the USER overlay path. `NEXUS_MODEL_REGISTRY_OVERLAY` wins if set;\n * otherwise the default `~/.nexus-agents/models.yaml` (#3351).\n */\nexport function resolveUserManifestPath(env: NodeJS.ProcessEnv = process.env): string {\n const override = env[USER_MANIFEST_ENV_VAR];\n if (override !== undefined && override !== '') return override;\n return defaultUserManifestPath();\n}\n\n// ============================================================================\n// Result shape\n// ============================================================================\n\nexport interface ManifestRejection {\n readonly index: number;\n readonly id?: string;\n readonly reason: string;\n}\n\nexport interface ManifestLoadResult {\n readonly entries: readonly ModelEntry[];\n readonly rejections: readonly ManifestRejection[];\n readonly path: string;\n readonly status: 'missing' | 'empty' | 'malformed' | 'too-large' | 'unreadable' | 'loaded';\n}\n\n// ============================================================================\n// Zod schema for a manifest entry\n// ============================================================================\n\nconst ModelVendorSchema: z.ZodType<ModelVendor> = z.enum([\n 'anthropic',\n 'openai',\n 'google',\n 'meta',\n 'qwen',\n 'nvidia',\n 'mistral',\n 'cohere',\n 'deepseek',\n 'unknown',\n]);\n\nconst ToolDefinitionFormatSchema = z.enum([\n 'openai',\n 'anthropic',\n 'gemini',\n]) satisfies z.ZodType<ToolDefinitionFormat>;\n\nconst PromptCachingModeSchema = z.enum([\n 'none',\n 'ephemeral',\n 'aggressive',\n]) satisfies z.ZodType<PromptCachingMode>;\n\n/**\n * Manifest entries are intentionally MORE permissive than the in-tree\n * ModelEntry: every behaviour field has a sensible default, so operators\n * can specify just `{id, vendor, family}` for a minimum-viable entry\n * and let the loader fill the rest from `DEFAULT_ENTRY` + vendor profile.\n */\nexport const ManifestEntrySchema = z.object({\n // Identity (required)\n id: z.string().min(1).max(200),\n vendor: ModelVendorSchema,\n family: z.string().min(1).max(80),\n\n // Identity (optional)\n aliases: z.array(z.string().min(1).max(200)).max(20).optional(),\n version: z.string().min(1).max(50).optional(),\n displayName: z.string().min(1).max(200).optional(),\n\n // Capabilities (all optional)\n contextWindow: z.number().int().positive().max(20_000_000).optional(),\n maxOutputTokens: z.number().int().positive().max(20_000_000).optional(),\n inputModalities: z.array(z.enum(INPUT_MODALITIES)).optional(),\n outputModalities: z.array(z.enum(OUTPUT_MODALITIES)).optional(),\n toolCapabilities: z.array(z.enum(TOOL_CAPABILITIES)).optional(),\n specialFeatures: z.array(z.enum(SPECIAL_FEATURES)).optional(),\n pricing: PricingSchema.optional(),\n qualityScores: QualityScoresSchema.optional(),\n notes: z.string().max(2000).optional(),\n\n // Behaviour (all optional — defaults fill in)\n parallelToolCalls: z.boolean().optional(),\n promptCaching: PromptCachingModeSchema.optional(),\n toolDefinitionFormat: ToolDefinitionFormatSchema.optional(),\n maxRecommendedTurnBudget: z.number().int().positive().max(100).optional(),\n strictJson: z.boolean().optional(),\n quirks: z.array(z.string().max(80)).max(20).optional(),\n profileId: z.string().min(1).max(80).optional(),\n\n // Provenance (optional)\n verifiedAt: z.string().min(8).max(40).optional(),\n});\n\nexport const ManifestSchema = z.object({\n version: z.literal(1),\n models: z.array(z.unknown()),\n});\n\n// ============================================================================\n// Loader\n// ============================================================================\n\n/**\n * Load + validate the merged manifest overlay (USER then OPERATOR, #3351).\n * Returns structured results; never throws. The registry consumer is\n * responsible for surfacing `rejections` (logger.warn / audit per #2547 DoD).\n *\n * When an explicit `path` is given (tests / single-file inspection) only that\n * file is loaded — single-path behaviour is preserved. With no `path`, both\n * the user overlay (`~/.nexus-agents/models.yaml`) and the operator manifest\n * (`~/.nexus-agents/models-manifest.yaml`) are returned in precedence order;\n * the registry merges same-id records (operator wins; omitted pricing inherits).\n */\nexport function loadManifestOverlay(options?: {\n readonly path?: string;\n readonly logger?: ILogger;\n readonly env?: NodeJS.ProcessEnv;\n}): ManifestLoadResult {\n const logger = options?.logger ?? createLogger({ component: 'manifest-overlay' });\n\n // Explicit path → single-file load (preserves the original contract).\n if (options?.path !== undefined) {\n return loadManifestFile(options.path, logger);\n }\n\n // Default → merge USER overlay (lower precedence) under the OPERATOR\n // manifest (higher precedence). Operator overwrites user on id collision.\n const userPath = resolveUserManifestPath(options?.env);\n const operatorPath = resolveManifestPath(options?.env);\n const user = loadManifestFile(userPath, logger);\n const operator = loadManifestFile(operatorPath, logger);\n return mergeOverlays(user, operator);\n}\n\n/**\n * Combine two overlay results: `lower` first, then `higher`. Keep same-id\n * records so the registry's merge point alone applies precedence and pricing\n * inheritance (#7132). Status/path/rejections\n * are reported for the OPERATOR (higher-precedence) result so the registry's\n * existing `status === 'loaded'` gate behaves unchanged; user-only state is\n * reported via {@link loadUserManifestOverlay} for the doctor.\n */\nfunction mergeOverlays(lower: ManifestLoadResult, higher: ManifestLoadResult): ManifestLoadResult {\n const entries = [...lower.entries, ...higher.entries];\n const merged: ManifestLoadResult = {\n entries,\n rejections: [...lower.rejections, ...higher.rejections],\n path: higher.path,\n status: entries.length > 0 ? 'loaded' : higher.status,\n };\n return merged;\n}\n\n/**\n * Load + validate just the USER overlay (`~/.nexus-agents/models.yaml` or the\n * `NEXUS_MODEL_REGISTRY_OVERLAY` override). Reported by `registry doctor` for\n * inspection of the user-path status / entryCount (#3351).\n */\nexport function loadUserManifestOverlay(options?: {\n readonly path?: string;\n readonly logger?: ILogger;\n readonly env?: NodeJS.ProcessEnv;\n}): ManifestLoadResult {\n const logger = options?.logger ?? createLogger({ component: 'manifest-overlay' });\n const path = options?.path ?? resolveUserManifestPath(options?.env);\n return loadManifestFile(path, logger);\n}\n\n/**\n * Load + validate a single manifest file. Returns structured results;\n * never throws.\n */\nfunction loadManifestFile(path: string, logger: ILogger): ManifestLoadResult {\n // Defensive: tests sometimes `vi.mock('node:fs', ...)` with a subset\n // of exports that omits `existsSync`. Treat any throw from the probe\n // as \"no manifest\" rather than letting it crash module-load callers.\n let exists = false;\n try {\n exists = existsSync(path);\n } catch {\n return { entries: [], rejections: [], path, status: 'missing' };\n }\n if (!exists) {\n return { entries: [], rejections: [], path, status: 'missing' };\n }\n\n // existsSync then statSync is a check-then-act: the file can vanish (or\n // become unreadable) in between, and a throw here crashes every module-load\n // caller of the registry. A vanished file is simply missing.\n let stat: ReturnType<typeof statSync>;\n try {\n stat = statSync(path);\n } catch (e: unknown) {\n return unreadableOrMissing(path, e, logger);\n }\n if (stat.size === 0) {\n return { entries: [], rejections: [], path, status: 'empty' };\n }\n if (stat.size > MANIFEST_MAX_BYTES) {\n logger.warn('Manifest overlay too large; skipping', {\n path,\n size: stat.size,\n max: MANIFEST_MAX_BYTES,\n });\n return { entries: [], rejections: [], path, status: 'too-large' };\n }\n\n let raw: string;\n try {\n raw = readFileSync(path, 'utf-8');\n } catch (e: unknown) {\n return unreadableOrMissing(path, e, logger);\n }\n return parseManifest(raw, path, logger);\n}\n\n/** ENOENT means the file vanished after the existence check; anything else is unreadable. */\nfunction unreadableOrMissing(path: string, e: unknown, logger: ILogger): ManifestLoadResult {\n const code = e instanceof Error && 'code' in e ? (e as NodeJS.ErrnoException).code : undefined;\n if (code === 'ENOENT') return { entries: [], rejections: [], path, status: 'missing' };\n logger.warn('Manifest overlay unreadable; skipping', {\n path,\n error: e instanceof Error ? e.message : String(e),\n });\n return { entries: [], rejections: [], path, status: 'unreadable' };\n}\n\nfunction parseManifest(raw: string, path: string, logger: ILogger): ManifestLoadResult {\n let parsed: unknown;\n try {\n if (path.endsWith('.json')) {\n parsed = JSON.parse(raw);\n } else {\n parsed = parseYaml(raw);\n }\n } catch (e: unknown) {\n logger.warn('Manifest overlay parse failure; skipping', {\n path,\n error: e instanceof Error ? e.message : String(e),\n });\n return { entries: [], rejections: [], path, status: 'malformed' };\n }\n\n const shape = ManifestSchema.safeParse(parsed);\n if (!shape.success) {\n logger.warn('Manifest overlay schema mismatch at root; skipping', {\n path,\n issues: shape.error.issues.slice(0, 5).map((i) => i.message),\n });\n return { entries: [], rejections: [], path, status: 'malformed' };\n }\n\n const entries: ModelEntry[] = [];\n const rejections: ManifestRejection[] = [];\n\n shape.data.models.forEach((rawEntry, index) => {\n const result = ManifestEntrySchema.safeParse(rawEntry);\n if (!result.success) {\n const candidateId =\n typeof rawEntry === 'object' &&\n rawEntry !== null &&\n 'id' in rawEntry &&\n typeof rawEntry.id === 'string'\n ? rawEntry.id\n : undefined;\n const baseRejection: { index: number; reason: string; id?: string } = {\n index,\n reason: result.error.issues\n .slice(0, 3)\n .map((i) => `${i.path.join('.')}: ${i.message}`)\n .join('; '),\n };\n if (candidateId !== undefined) baseRejection.id = candidateId;\n rejections.push(baseRejection);\n return;\n }\n entries.push(materializeEntry(result.data));\n });\n\n return { entries, rejections, path, status: 'loaded' };\n}\n\n/**\n * Convert a validated partial manifest entry into a full `ModelEntry`.\n * Behaviour fields default to `DEFAULT_ENTRY`; the merge mirrors the\n * registry's vendor-defaults logic so operators can specify the minimum\n * `{id, vendor, family}` and get a usable record.\n */\nfunction materializeEntry(input: z.infer<typeof ManifestEntrySchema>): ModelEntry {\n return {\n id: input.id,\n vendor: input.vendor,\n family: input.family,\n // Behaviour with sensible defaults\n parallelToolCalls: input.parallelToolCalls ?? false,\n promptCaching: input.promptCaching ?? 'none',\n toolDefinitionFormat: input.toolDefinitionFormat ?? 'openai',\n maxRecommendedTurnBudget: input.maxRecommendedTurnBudget ?? 10,\n strictJson: input.strictJson ?? true,\n quirks: input.quirks ?? [],\n profileId: input.profileId ?? `manifest-${input.vendor}`,\n source: 'manifest',\n ...pickOptionalFields(input),\n };\n}\n\n/**\n * Spread-helper that returns only the optional ModelEntry fields the\n * input actually carries. Keeps `materializeEntry` under the complexity\n * cap and makes the optional-passthrough pattern testable in isolation.\n */\n/**\n * Optional fields that pass through verbatim from manifest → ModelEntry\n * when present. Data-driven so we keep cyclomatic complexity flat.\n */\nconst OPTIONAL_PASSTHROUGH_KEYS = [\n 'aliases',\n 'version',\n 'displayName',\n 'contextWindow',\n 'maxOutputTokens',\n 'inputModalities',\n 'outputModalities',\n 'toolCapabilities',\n 'specialFeatures',\n 'pricing',\n 'qualityScores',\n 'notes',\n 'verifiedAt',\n] as const;\n\nfunction pickOptionalFields(\n input: z.infer<typeof ManifestEntrySchema>\n): Partial<{ -readonly [K in keyof ModelEntry]: ModelEntry[K] }> {\n const out: Record<string, unknown> = {};\n const inputRecord = input as Record<string, unknown>;\n for (const key of OPTIONAL_PASSTHROUGH_KEYS) {\n const value = inputRecord[key];\n if (value !== undefined) out[key] = value;\n }\n return out;\n}\n","/**\n * Loader for the bundled generated model registry (#3293).\n *\n * `model-registry.generated.json` is the broad (~1071-entry) LiteLLM/models.dev\n * catalog that the legacy `CapabilityDiscovery` T2 tier resolved against. To\n * complete the CapabilityDiscovery → ModelRegistry consolidation WITHOUT losing\n * that breadth (owner decision: \"connect the 1071, don't drop it\"), the registry\n * ingests these entries as a LOWEST-priority breadth tier: anything also present\n * in-tree / manifest / models-dev wins; otherwise the registry now has real\n * (litellm-sourced) context-window + pricing for the long tail instead of a bare\n * derived default.\n *\n * Each raw record is converted to a full `ModelEntry` by deriving the behavior\n * fields (`deriveEntry`) from the id's identity, then overlaying the catalog's\n * concrete data (displayName, contextWindow, maxOutputTokens, pricing). The\n * loader is fail-soft: a missing/malformed file yields no entries.\n *\n * @module config/models-generated-loader\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { createLogger } from '../core/logger.js';\nimport { previewNexusDataPath } from './nexus-data-dir.js';\nimport { resolveModelIdentitySync } from './model-identity.js';\nimport { deriveEntry } from './model-derivation.js';\nimport type { ModelEntry, ModelPricingProvenance } from './model-registry.js';\n\n/** Shape of a record in `model-registry.generated.json`'s `entries` array. */\ninterface GeneratedRecord {\n readonly id?: unknown;\n readonly displayName?: unknown;\n readonly contextWindow?: unknown;\n readonly maxOutputTokens?: unknown;\n readonly pricing?: {\n readonly inputPer1M?: unknown;\n readonly outputPer1M?: unknown;\n readonly cacheReadPer1M?: unknown;\n readonly cacheWritePer1M?: unknown;\n };\n readonly pricingProvenance?: unknown;\n}\n\ninterface GeneratedShape {\n readonly version?: unknown;\n readonly entries?: unknown;\n}\n\nexport interface GeneratedLoadResult {\n readonly entries: readonly ModelEntry[];\n readonly path: string;\n readonly status: 'loaded' | 'missing' | 'malformed';\n}\n\nfunction defaultGeneratedPath(): string {\n // #3707: `registry refresh` writes the regenerated catalog to the DATA dir\n // (nexusDataPath), but this loader historically read only the bundled PACKAGE\n // copy — so a refresh was silently never picked up (even after #3185's\n // reloadDefaultRegistry, which re-reads via this path). Prefer a refreshed file\n // in the data dir when present, falling back to the bundled copy — the same\n // data-dir > package precedence the overlay path already uses. The package dir\n // is also often read-only under a global npm install, so the data dir is the\n // only writable target a refresh has.\n try {\n const dataPath = previewNexusDataPath('model-registry.generated.json');\n if (existsSync(dataPath)) return dataPath;\n } catch {\n // Fall through to the bundled package copy on any data-dir resolution error.\n }\n const here = dirname(fileURLToPath(import.meta.url));\n return join(here, 'model-registry.generated.json');\n}\n\n/**\n * Cache rates from a record, carried only when numeric (#5170).\n *\n * Spread-if-defined, deliberately: an absent rate must stay ABSENT rather than\n * become 0. A zero would price a cache-heavy call as free, where absent makes\n * `computeTokenCost` report the component unpriced. Roughly half the catalogue\n * publishes no cache rate, so the absent path is the common one.\n */\nfunction cacheRates(rec: GeneratedRecord): {\n cacheReadPer1M?: number;\n cacheWritePer1M?: number;\n} {\n const read = rec.pricing?.cacheReadPer1M;\n const write = rec.pricing?.cacheWritePer1M;\n return {\n ...(typeof read === 'number' && { cacheReadPer1M: read }),\n ...(typeof write === 'number' && { cacheWritePer1M: write }),\n };\n}\n\n/**\n * Extract usable pricing from a raw catalog record.\n *\n * #4176: litellm carries placeholder $0/$0 rows for models it has no pricing\n * for (e.g. `amazon-bedrock/anthropic.claude-mythos-preview`). Treating that\n * as real pricing makes `computeCostDetail` report priced:true costUsd:0 — a\n * measured $0 for what is actually UNMEASURED (#4165). Drop BOTH-zero pricing\n * so the entry stays unpriced; one-sided zeros (free input tiers) are real\n * and kept.\n *\n * #4209 exception: ids ending in `:free` (openrouter free tiers, e.g.\n * `openrouter/meta-llama/llama-3.3-70b-instruct:free`) are GENUINELY free —\n * their $0/$0 is real pricing, not a placeholder, and they exist ONLY in this\n * generated catalog (not in-tree). They keep their pricing so the cost chain\n * reports a measured $0 (priced: true) instead of falling to UNPRICED.\n */\nfunction extractPricing(\n rec: GeneratedRecord,\n id: string\n):\n | {\n inputPer1M: number;\n outputPer1M: number;\n cacheReadPer1M?: number;\n cacheWritePer1M?: number;\n }\n | undefined {\n const inputPer1M = rec.pricing?.inputPer1M;\n const outputPer1M = rec.pricing?.outputPer1M;\n if (typeof inputPer1M !== 'number' || typeof outputPer1M !== 'number') return undefined;\n if (inputPer1M === 0 && outputPer1M === 0 && !id.endsWith(':free')) return undefined;\n return { inputPer1M, outputPer1M, ...cacheRates(rec) };\n}\n\n/** Keep the pricing caveat only when its official source and scope are intact. */\nfunction extractPricingProvenance(raw: unknown): ModelPricingProvenance | undefined {\n if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) return undefined;\n const value = raw as Record<string, unknown>;\n if (\n value['source'] !== 'anthropic' ||\n value['scope'] !== 'project-glasswing-participants' ||\n value['upstreamUrl'] !== 'https://www.anthropic.com/project/glasswing'\n ) {\n return undefined;\n }\n return {\n source: 'anthropic',\n scope: 'project-glasswing-participants',\n upstreamUrl: 'https://www.anthropic.com/project/glasswing',\n };\n}\n\n/** Convert one raw catalog record into a `ModelEntry` (derived base + overlay). */\nfunction toModelEntry(rec: GeneratedRecord): ModelEntry | undefined {\n if (typeof rec.id !== 'string' || rec.id === '') return undefined;\n const id = rec.id;\n const base = deriveEntry(id, resolveModelIdentitySync(id));\n const pricing = extractPricing(rec, id);\n const pricingProvenance =\n pricing === undefined ? undefined : extractPricingProvenance(rec.pricingProvenance);\n return {\n ...base,\n source: 'generated',\n ...(typeof rec.displayName === 'string' ? { displayName: rec.displayName } : {}),\n ...(typeof rec.contextWindow === 'number' ? { contextWindow: rec.contextWindow } : {}),\n ...(typeof rec.maxOutputTokens === 'number' ? { maxOutputTokens: rec.maxOutputTokens } : {}),\n ...(pricing !== undefined ? { pricing } : {}),\n ...(pricingProvenance !== undefined ? { pricingProvenance } : {}),\n };\n}\n\n/**\n * Load the generated catalog as `ModelEntry[]`. Fail-soft: missing/malformed →\n * empty (logged at warn). Records without a string `id` are skipped.\n */\nexport function loadGeneratedRegistryEntries(options?: {\n readonly path?: string;\n}): GeneratedLoadResult {\n const logger = createLogger({ component: 'models-generated' });\n const path = options?.path ?? defaultGeneratedPath();\n\n let exists = false;\n try {\n exists = existsSync(path);\n } catch {\n return { entries: [], path, status: 'missing' };\n }\n if (!exists) return { entries: [], path, status: 'missing' };\n\n let parsed: GeneratedShape;\n try {\n parsed = JSON.parse(readFileSync(path, 'utf-8')) as GeneratedShape;\n } catch (e: unknown) {\n logger.warn('generated registry parse failure; skipping', {\n path,\n error: e instanceof Error ? e.message : String(e),\n });\n return { entries: [], path, status: 'malformed' };\n }\n\n if (!Array.isArray(parsed.entries)) {\n logger.warn('generated registry missing entries array; skipping', { path });\n return { entries: [], path, status: 'malformed' };\n }\n\n const entries: ModelEntry[] = [];\n for (const raw of parsed.entries as readonly GeneratedRecord[]) {\n const entry = toModelEntry(raw);\n if (entry !== undefined) entries.push(entry);\n }\n return { entries, path, status: 'loaded' };\n}\n","/**\n * Identity-index helpers for the ModelRegistry's normalized/identity\n * resolution tier (#4164).\n *\n * OpenAI-compatible gateways frequently expose vendor models under\n * decorated names (`Claude_Opus_4.8_hardened`, `2025-claude-opus-4_0_high`).\n * An exact registry lookup misses those, which used to drop the request to\n * bare derivation — losing pricing/metadata the registry actually has for\n * the underlying model. This module supplies the second-chance machinery:\n *\n * - a load-time `vendor|family|version` index over loaded entries (built\n * once, never per-request O(N) scans),\n * - tier-ordered candidate selection (manifest/in-tree before\n * models-dev/generated) with effective-duplicate dedupe, failing CLOSED\n * when more than one distinct candidate survives,\n * - dated-decoration tolerance (#4183): ONE trailing snapshot-date\n * segment on the decorated side is stripped when the canonical's\n * version is date-free — snapshot-style dated canonicals still require\n * full equality,\n * - a sub-SKU guard (#4183): a size/tier quirk (`-mini`, `-lite`, `70b`)\n * on the decorated id that the canonical lacks fails CLOSED instead of\n * inheriting the parent SKU's pricing.\n *\n * The registry itself (model-registry.ts) owns the merge semantics —\n * matched entries grant PRICING/METADATA ONLY; behaviour fields still come\n * from derivation for the original decorated id.\n *\n * @module config/model-fuzzy-resolution\n */\n\nimport {\n canonicalVersionKey,\n normaliseModelId,\n resolveModelIdentitySync,\n} from './model-identity.js';\nimport type { ResolvedModelIdentity } from './model-identity.js';\nimport type { ModelEntry } from './model-registry.js';\nimport type { Pricing } from './model-capabilities-types.js';\n\n/**\n * Ids longer than this skip the fuzzy tier entirely (straight to\n * derivation). Guards the normalizer/regex parses against pathological\n * inputs; checked BEFORE normalization.\n */\nexport const MAX_FUZZY_ID_LENGTH = 256;\n\n/** Breadth catalog tiers — searched only when no authoritative tier matches. */\nconst BREADTH_SOURCES: ReadonlySet<ModelEntry['source']> = new Set(['models-dev', 'generated']);\n\n/**\n * Explicit tier priority (lower = higher). The registry's entry maps\n * iterate in LOAD order, which is lowest-priority-FIRST (generated →\n * models-dev → in-tree → manifest), so candidate selection must rank by\n * source explicitly — never rely on map insertion order.\n */\nconst SOURCE_RANK: Record<ModelEntry['source'], number> = {\n manifest: 0,\n 'in-tree': 1,\n 'models-dev': 2,\n generated: 3,\n derived: 4,\n};\n\nfunction byTierPriority(a: ModelEntry, b: ModelEntry): number {\n return SOURCE_RANK[a.source] - SOURCE_RANK[b.source];\n}\n\n/** Entry-side version: the stored field, else best-effort parse of the id. */\nfunction entryVersion(entry: ModelEntry): string | undefined {\n return entry.version ?? resolveModelIdentitySync(entry.id).version;\n}\n\n/**\n * `vendor|family|version` index key, or undefined when the identity cannot\n * participate in identity matching: version is REQUIRED on both sides, and\n * the `unknown` vendor/family sentinels never match anything.\n */\nfunction identityKeyFor(\n identity: Pick<ResolvedModelIdentity, 'vendor' | 'family' | 'version'>\n): string | undefined {\n if (identity.vendor === 'unknown' || identity.family === 'unknown') return undefined;\n if (identity.version === undefined) return undefined;\n return `${identity.vendor}|${identity.family}|${canonicalVersionKey(identity.version)}`;\n}\n\n/**\n * Build the identity index over loaded entries. Called ONCE (lazily, on the\n * first fuzzy lookup) — the registry's entry maps are immutable after\n * construction, so the index never goes stale.\n */\nexport function buildIdentityIndex(entries: Iterable<ModelEntry>): Map<string, ModelEntry[]> {\n const index = new Map<string, ModelEntry[]>();\n for (const entry of entries) {\n const version = entryVersion(entry);\n if (version === undefined) continue;\n const key = identityKeyFor({ vendor: entry.vendor, family: entry.family, version });\n if (key === undefined) continue;\n const bucket = index.get(key);\n if (bucket === undefined) index.set(key, [entry]);\n else bucket.push(entry);\n }\n return index;\n}\n\nfunction samePricing(a: Pricing, b: Pricing): boolean {\n return a.inputPer1M === b.inputPer1M && a.outputPer1M === b.outputPer1M;\n}\n\n/**\n * Two candidates are \"effectively the same model\" when their ids normalize\n * to the same canonical id, or when their pricing AND capability envelope\n * (contextWindow, maxOutputTokens) are all identical — LiteLLM catalogs\n * list the same model under many provider prefixes. Identical pricing\n * ALONE is not sufficient: a GA/preview pair can share a price while\n * differing on routing-relevant data like the context window.\n */\nfunction isEffectivelySameModel(a: ModelEntry, b: ModelEntry): boolean {\n if (normaliseModelId(a.id) === normaliseModelId(b.id)) return true;\n if (a.pricing === undefined || b.pricing === undefined) return false;\n return (\n samePricing(a.pricing, b.pricing) &&\n a.contextWindow === b.contextWindow &&\n a.maxOutputTokens === b.maxOutputTokens\n );\n}\n\n/**\n * Keep the first of each effective-duplicate group. Callers pass candidates\n * already ranked by tier priority, so \"first\" is the highest-priority\n * representative of the group.\n */\nfunction dedupeEffectiveDuplicates(candidates: readonly ModelEntry[]): readonly ModelEntry[] {\n const kept: ModelEntry[] = [];\n for (const candidate of candidates) {\n if (!kept.some((k) => isEffectivelySameModel(k, candidate))) kept.push(candidate);\n }\n return kept;\n}\n\n/** Unique candidate from one tier bucket, or undefined (fail closed on >1). */\nfunction uniqueCandidate(candidates: readonly ModelEntry[]): ModelEntry | undefined {\n const distinct = dedupeEffectiveDuplicates(candidates);\n return distinct.length === 1 ? distinct[0] : undefined;\n}\n\n/**\n * Tier-ordered uniqueness: manifest/in-tree candidates are considered\n * first; only when that bucket is EMPTY do the breadth tiers\n * (models-dev/generated) get a look. Within a bucket, effective duplicates\n * are collapsed before ambiguity is declared; if more than one distinct\n * candidate survives, fail closed (no match) rather than guess.\n */\nfunction selectIdentityCandidate(\n candidates: readonly ModelEntry[] | undefined\n): ModelEntry | undefined {\n if (candidates === undefined) return undefined;\n // Rank by tier priority first (stable sort keeps within-tier load order)\n // so dedupe keeps the highest-priority representative of each group.\n const ranked = [...candidates].sort(byTierPriority);\n const authoritative = ranked.filter((e) => !BREADTH_SOURCES.has(e.source));\n if (authoritative.length > 0) return uniqueCandidate(authoritative);\n return uniqueCandidate(ranked.filter((e) => BREADTH_SOURCES.has(e.source)));\n}\n\n// ============================================================================\n// #4183 — dated-decoration matching + sub-SKU fail-closed guard\n// ============================================================================\n\n/**\n * ONE trailing snapshot-date segment on a version KEY — `4-8-20250514`\n * ends in a strippable `-20250514`. Mirrors `parseClaudeMajorMinor`'s\n * date-tolerant parse (model-parameter-support.ts): 6–8 digits covers\n * `202505`/`20250514` while a short numeric segment (`-8`, `-70`) stays\n * version-significant. Applied AFTER normalization, so `_`/`.` separators\n * have already become `-`.\n */\nconst TRAILING_DATE_SEGMENT = /-\\d{6,8}$/;\n\n/**\n * Any date-LIKE segment inside a version key (`20250514`, `2024-08`,\n * `2024-08-06`). Detects snapshot-style versions where the date IS (part\n * of) the version — those require full equality and never participate in\n * date-stripped matching, on either side.\n */\nconst DATE_SEGMENT = /(?:^|-)(?:\\d{6,8}|\\d{4}-\\d{2}(?:-\\d{2})?)(?:-|$)/;\n\n/**\n * Size/tier quirk markers from model-identity.ts's QUIRK_PATTERNS (#4183).\n * These denote a DIFFERENT SKU with its own pricing, not a variant of the\n * matched model:\n * - 'small' (mini|nano|tiny|small|lite) and 'large' (large|xl|big|maxi)\n * are distinct size tiers sold at their own price points;\n * - 'sized-suffix' (7b/70b/405b) is a parameter-count SKU marker.\n * Deliberately EXCLUDED: 'thinking', 'high-variant', 'vision', 'coder',\n * 'instruct' (mode/feature variants of the same SKU, same price sheet),\n * 'embedding' (never reaches identity matching with a matching family),\n * and 'dated' (handled by the date-stripping rule above).\n */\nconst SIZE_TIER_QUIRKS: ReadonlySet<string> = new Set(['small', 'large', 'sized-suffix']);\n\n/**\n * Full identity-match for a decorated id (#4164 + #4183): primary exact\n * version-key lookup, then a date-stripped fallback for dated decorations,\n * then the sub-SKU guard. Fails closed at every step.\n */\nexport function matchIdentityCandidate(\n index: ReadonlyMap<string, ModelEntry[]>,\n identity: ResolvedModelIdentity\n): ModelEntry | undefined {\n const key = identityKeyFor(identity);\n if (key === undefined || identity.version === undefined) return undefined;\n const matched =\n selectIdentityCandidate(index.get(key)) ??\n selectDateStripped(index, identity, identity.version);\n if (matched === undefined) return undefined;\n return blockedBySizeQuirk(identity, matched) ? undefined : matched;\n}\n\n/** Date-stripped fallback lookup, scoped to the identity's vendor|family. */\nfunction selectDateStripped(\n index: ReadonlyMap<string, ModelEntry[]>,\n identity: Pick<ResolvedModelIdentity, 'vendor' | 'family'>,\n version: string\n): ModelEntry | undefined {\n const vk = canonicalVersionKey(version);\n if (!TRAILING_DATE_SEGMENT.test(vk)) return undefined;\n const stripped = vk.replace(TRAILING_DATE_SEGMENT, '');\n // FAIL-CLOSED guard: index buckets are keyed by the canonical side's\n // canonicalVersionKey, so requiring the stripped key to be date-FREE guarantees\n // every candidate's own version carries no date segment. Snapshot-style\n // canonicals (dated gpt-4o ids, version = the date) stay reachable only\n // through full equality on the primary key.\n if (stripped.length === 0 || DATE_SEGMENT.test(stripped)) return undefined;\n const strippedKey = identityKeyFor({\n vendor: identity.vendor,\n family: identity.family,\n version: stripped,\n });\n if (strippedKey === undefined) return undefined;\n return selectIdentityCandidate(index.get(strippedKey));\n}\n\n/**\n * Sub-SKU guard (#4183): a size/tier quirk on the DECORATED id that is\n * absent from the canonical candidate's identity means the decoration names\n * a different SKU (`claude-opus-4-8-mini` is not Opus 4.8) — fail closed\n * rather than grant the parent's pricing. Quirks present on BOTH sides\n * (`…-lite-hardened` matching a canonical `…-lite`) do not block.\n */\nfunction blockedBySizeQuirk(identity: ResolvedModelIdentity, matched: ModelEntry): boolean {\n const sizeQuirks = identity.quirks.filter((q) => SIZE_TIER_QUIRKS.has(q));\n if (sizeQuirks.length === 0) return false;\n const canonicalQuirks = resolveModelIdentitySync(matched.id).quirks;\n return sizeQuirks.some((q) => !canonicalQuirks.includes(q));\n}\n","/**\n * Loader for the models.dev snapshot (#2547 4b).\n *\n * The committed snapshot at `./models-dev-snapshot.json` is generated\n * by `scripts/sync-models-dev.ts` and shipped with the package. This\n * loader reads it at registry construction so models the in-tree\n * authoritative list doesn't know about still get pricing / context /\n * modality data from models.dev as a tier-3 fallback.\n *\n * Resolution chain (most specific first):\n * 1. operator manifest overlay (tier 1; #2547 4a)\n * 2. in-tree authoritative (tier 2)\n * 3. models.dev snapshot (this file; tier 3)\n * 4. derived from vendor+family (tier 4)\n * 5. universal default (tier 5)\n *\n * Like the manifest loader, this never throws — a missing or malformed\n * snapshot returns an empty entry list with a warn log.\n *\n * @module config/models-dev-snapshot-loader\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport { dirname, join } from 'node:path';\n\nimport { createLogger } from '../core/logger.js';\nimport type { ModelEntry } from './model-registry.js';\n\n// Path resolution: try the source-tree location first (development);\n// fall back to a sibling of this file (built dist). Both paths\n// shouldn't exist simultaneously, so the first hit wins.\nfunction defaultSnapshotPath(): string {\n // import.meta.url points at the .ts source in dev (via tsx), or at\n // the compiled .js in dist. The snapshot lives next to either.\n const here = dirname(fileURLToPath(import.meta.url));\n return join(here, 'models-dev-snapshot.json');\n}\n\nexport interface ModelsDevSnapshot {\n readonly version: 1;\n readonly fetchedAt: string;\n readonly sourceUrl: string;\n readonly entries: readonly ModelEntry[];\n readonly gatewaysByModel?: Readonly<Record<string, readonly string[]>>;\n}\n\ninterface SnapshotShape {\n version: number;\n fetchedAt?: string;\n sourceUrl?: string;\n entries?: unknown[];\n gatewaysByModel?: Record<string, readonly string[]>;\n}\n\nexport interface ModelsDevSnapshotLoadResult {\n readonly entries: readonly ModelEntry[];\n readonly path: string;\n readonly status: 'missing' | 'malformed' | 'loaded';\n readonly fetchedAt?: string;\n readonly gatewaysByModel?: Readonly<Record<string, readonly string[]>>;\n}\n\n/**\n * Drop pricing that is present but not numeric, keeping the entry.\n *\n * Strips the RATES rather than the model, mirroring\n * `models-generated-loader`'s `return undefined` for pricing alone: an entry\n * with a corrupt rate becomes an honestly UNPRICED model, which the cost chain\n * already represents via `priced: false`. Dropping the entry would silently\n * shrink the catalog instead — 15 of the 353 committed entries carry no pricing\n * at all, so absent pricing is a normal state, not a corruption signal.\n */\nfunction stripMalformedPricing(\n entries: readonly ModelEntry[],\n logger: ReturnType<typeof createLogger>,\n path: string\n): ModelEntry[] {\n let strippedPricing = 0;\n const out = entries.map((entry) => {\n const pricing = entry.pricing;\n if (pricing === undefined) return entry;\n if (typeof pricing.inputPer1M === 'number' && typeof pricing.outputPer1M === 'number') {\n return entry;\n }\n strippedPricing++;\n const withoutPricing: ModelEntry = { ...entry };\n delete (withoutPricing as { pricing?: unknown }).pricing;\n return withoutPricing;\n });\n if (strippedPricing > 0) {\n logger.warn('models.dev snapshot entries had non-numeric pricing; treated as unpriced', {\n path,\n strippedPricing,\n });\n }\n return out;\n}\n\nfunction parseSnapshotFile(\n path: string,\n logger: ReturnType<typeof createLogger>\n): SnapshotShape | 'missing' | 'malformed' {\n try {\n if (!existsSync(path)) return 'missing';\n } catch {\n return 'missing';\n }\n try {\n const parsed = JSON.parse(readFileSync(path, 'utf-8')) as SnapshotShape;\n if (parsed.version !== 1) {\n logger.warn('models.dev snapshot version unsupported; skipping', {\n path,\n version: parsed.version,\n });\n return 'malformed';\n }\n if (!Array.isArray(parsed.entries)) {\n logger.warn('models.dev snapshot missing entries array; skipping', { path });\n return 'malformed';\n }\n return parsed;\n } catch (e: unknown) {\n logger.warn('models.dev snapshot parse failure; skipping', {\n path,\n error: e instanceof Error ? e.message : String(e),\n });\n return 'malformed';\n }\n}\n\nexport function loadModelsDevSnapshot(options?: {\n readonly path?: string;\n}): ModelsDevSnapshotLoadResult {\n const logger = createLogger({ component: 'models-dev-snapshot' });\n const path = options?.path ?? defaultSnapshotPath();\n\n const parsed = parseSnapshotFile(path, logger);\n if (typeof parsed === 'string') {\n return { entries: [], path, status: parsed };\n }\n\n const entries = stripMalformedPricing(parsed.entries as ModelEntry[], logger, path);\n\n return {\n entries,\n path,\n status: 'loaded',\n ...(typeof parsed.fetchedAt === 'string' ? { fetchedAt: parsed.fetchedAt } : {}),\n ...(parsed.gatewaysByModel !== undefined ? { gatewaysByModel: parsed.gatewaysByModel } : {}),\n };\n}\n","/**\n * Unified ModelRegistry (#2540).\n *\n * Single source of truth for per-model metadata. Replaces the previous\n * split between:\n * - `model-capabilities.ts` (canonical hardcoded list; renamed to\n * `in-tree-data.ts` in #2546 slice E, helpers moved here + into\n * `model-config-helpers.ts`)\n * - `model-behavior-profile.ts` (vendor-pattern-matched runtime\n * behaviour; file deleted in #2540 PR 2)\n *\n * Each `ModelEntry` carries BOTH capability and behaviour fields. The\n * registry's `getEntry()` always returns something — exact match if\n * the modelId is known, derived entry if vendor + family can be\n * inferred, universal default otherwise.\n *\n * Resolution chain (highest priority first; the constructor loads\n * lowest-priority first so higher tiers overwrite lower ones field-by-field —\n * see {@link EntrySource} and `ModelRegistry` constructor):\n *\n * 1. modelHints / explicit alias ← operator override (resolver hints)\n * 2. manifest entries ← operator manifest overlay (#2547)\n * 3. in-tree authoritative entries ← measured/validated by us\n * 4. models.dev snapshot ← seeded externally\n * 5. generated catalog (LiteLLM) ← LOWEST tier; long-tail breadth (#3293)\n * 6. derived from vendor + family ← pattern-matched fallback\n * 7. universal default ← never fails\n *\n * This module ships the type + class + derived-fallback logic. The\n * authoritative in-tree entries are populated by `buildInTreeEntries()`; the\n * models.dev snapshot is loaded by `loadModelsDevSnapshot()` in\n * `buildDefaultRegistry()`.\n *\n * Availability is a SEPARATE concern — see `AvailableModelsCache`\n * (`config/available-models-cache.ts`). The registry tells you \"what does\n * this model id mean\"; `AvailableModelsCache` tells you \"is the harness\n * currently able to serve it.\" Routing decisions consume both.\n *\n * @module config/model-registry\n */\n\nimport {\n normaliseModelId,\n resolveModelIdentitySync,\n type ModelHints,\n type ModelVendor,\n type ResolvedModelIdentity,\n} from './model-identity.js';\nimport {\n MAX_FUZZY_ID_LENGTH,\n buildIdentityIndex,\n matchIdentityCandidate,\n} from './model-fuzzy-resolution.js';\nimport { buildInTreeEntries } from './in-tree-entries.js';\nimport { loadManifestOverlay } from './manifest-overlay.js';\nimport { DEFAULT_ENTRY, deriveEntry } from './model-derivation.js';\nimport { loadModelsDevSnapshot } from './models-dev-snapshot-loader.js';\nimport { loadGeneratedRegistryEntries } from './models-generated-loader.js';\nimport type {\n InputModality,\n OutputModality,\n Pricing,\n QualityScores,\n SpecialFeature,\n ToolCapability,\n} from './model-capabilities-types.js';\n\n// ============================================================================\n// Per-model behaviour types — were previously split into model-behavior-profile.ts\n// (deleted in #2540 PR 2 when AgenticAdapter migrated to ModelRegistry).\n// ============================================================================\n\n/**\n * Tool-definition format the model expects in `CompletionRequest.tools`.\n * Each `IModelAdapter` translates from the canonical `ToolDefinition`\n * shape to the provider's native form, so this field is informational\n * for routing/scoring, not request-side.\n */\nexport type ToolDefinitionFormat = 'openai' | 'anthropic' | 'gemini';\n\n/**\n * Prompt-caching opt-in level. `'ephemeral'` adds Anthropic-style\n * `cache_control` markers; other providers ignore the field.\n */\nexport type PromptCachingMode = 'none' | 'ephemeral' | 'aggressive';\n\n// ============================================================================\n// ModelEntry — the unified shape\n// ============================================================================\n\n/**\n * Where this entry came from. Higher-priority sources override lower\n * ones field-by-field; `derived` is always the fallback floor.\n */\nexport type EntrySource = 'in-tree' | 'models-dev' | 'manifest' | 'derived' | 'generated';\n\n/**\n * How the normalized/identity resolution tier (#4164) found a canonical\n * entry for a decorated gateway model id: `'normalized'` — the id matched\n * an entry/alias after `normaliseModelId`; `'identity'` — the parsed\n * {vendor, family, version} matched exactly one loaded entry.\n */\nexport type MatchedVia = 'normalized' | 'identity';\n\n/** An official rate that applies only within the named participant program. */\nexport interface ModelPricingProvenance {\n readonly source: 'anthropic';\n readonly scope: 'project-glasswing-participants';\n readonly upstreamUrl: string;\n}\n\n/**\n * One model's full metadata. Combines what was previously split\n * across `ModelCapability` (capability/pricing/quality) and\n * `ModelBehaviorProfile` (runtime behaviour toggles).\n *\n * All capability + pricing + quality fields are optional because\n * derived entries (vendor known but no authoritative data) won't\n * have them. Routing consumers must handle absence gracefully.\n *\n * Behaviour fields always have values (defaulted from vendor/family\n * profile if no exact entry exists).\n */\nexport interface ModelEntry {\n // ---- Identity ----\n /** Canonical id, e.g. `claude-opus-4-1`, `gpt-5.4`, `meta/llama-3-70b`. */\n readonly id: string;\n /**\n * Alternate strings that should resolve to this entry. Operators\n * extend via the manifest (PR 4) when a gateway exposes a renamed\n * version of a known model.\n */\n readonly aliases?: readonly string[];\n /** Coarse vendor bucket — drives behaviour-profile fallback chains. */\n readonly vendor: ModelVendor;\n /** Family inside a vendor — `claude-opus`, `gpt-4o`, `llama-3`. */\n readonly family: string;\n /** Version string (best-effort; `4-1`, `2024-08-06`, etc). */\n readonly version?: string;\n /** Human-readable display name for UI / logs. */\n readonly displayName?: string;\n\n // ---- Capabilities (carried from ModelCapability) ----\n readonly contextWindow?: number;\n readonly maxOutputTokens?: number;\n readonly inputModalities?: readonly InputModality[];\n readonly outputModalities?: readonly OutputModality[];\n readonly toolCapabilities?: readonly ToolCapability[];\n readonly specialFeatures?: readonly SpecialFeature[];\n readonly pricing?: Pricing;\n /** Present when pricing has a narrower scope than generic provider billing. */\n readonly pricingProvenance?: ModelPricingProvenance;\n readonly qualityScores?: QualityScores;\n readonly notes?: string;\n /**\n * Request parameters this model rejects (carried from\n * `ModelCapability.unsupportedParameters`, #4067). Consumed by\n * `model-parameter-support.ts`; absence means the regex fallback applies.\n */\n readonly unsupportedParameters?: readonly string[];\n /**\n * Max-tokens param name this model expects (carried from\n * `ModelCapability.maxTokensParam`, #4049/#4067). Absence defaults to\n * `'max_tokens'` (with the OpenAI-reasoning regex fallback).\n */\n readonly maxTokensParam?: 'max_tokens' | 'max_completion_tokens';\n\n // ---- CLI routing metadata (in-tree entries only) ----\n /** Which CLI tool this model belongs to (e.g. 'claude', 'gemini'). */\n readonly cliName?: string;\n /** Short alias the CLI accepts (e.g. 'opus' for claude). */\n readonly cliAlias?: string;\n /** Vendor model id the CLI passes upstream (e.g. 'claude-opus-4-6'). */\n readonly cliModelName?: string;\n /** Gateways or providers known to serve this model (#7072). */\n readonly gateways?: readonly string[];\n\n // ---- Behaviour (carried from ModelBehaviorProfile) ----\n readonly parallelToolCalls: boolean;\n readonly promptCaching: PromptCachingMode;\n readonly toolDefinitionFormat: ToolDefinitionFormat;\n readonly maxRecommendedTurnBudget: number;\n readonly strictJson: boolean;\n readonly quirks: readonly string[];\n readonly profileId: string;\n\n // ---- Provenance ----\n readonly source: EntrySource;\n /** ISO date when this entry was last validated against the upstream. */\n readonly verifiedAt?: string;\n /**\n * Set when the normalized/identity resolution tier (#4164) matched this\n * (decorated) id to a canonical entry. Absent for exact/alias hits and\n * pure derivation.\n */\n readonly matchedVia?: MatchedVia;\n /** Canonical id of the matched entry the pricing/metadata came from. */\n readonly resolvedFrom?: string;\n}\n\n// Derivation (DEFAULT_ENTRY, VENDOR_DEFAULTS, FAMILY_DEFAULTS, deriveEntry)\n// lives in `./model-derivation.ts` so `in-tree-entries.ts` can import\n// `deriveEntry` without creating a runtime cycle back through this file.\n// We re-export below for backward compatibility with existing call sites.\n\n// ============================================================================\n// Registry\n// ============================================================================\n\n// Price provenance belongs to the rate, not the entry's overall tier (#7132):\n// a metadata-only overlay entry is `source: 'manifest'` while its inherited\n// rate is still a list price. Keys are registry-owned rate objects, so\n// inheritance and fuzzy-match copies keep the key; a supplied rate gets a\n// fresh one.\nconst pricingSources = new WeakMap<Pricing, EntrySource>();\n\n/** Internal rate-tier lookup; unregistered entries retain their source semantics. */\nexport function pricingSourceOf(entry: ModelEntry): EntrySource {\n return (\n (entry.pricing === undefined ? undefined : pricingSources.get(entry.pricing)) ?? entry.source\n );\n}\n\nexport interface ModelRegistryOptions {\n /** Authoritative in-tree entries. Highest priority. */\n readonly inTreeEntries?: readonly ModelEntry[];\n /** models.dev snapshot entries. Lower priority than in-tree. */\n readonly modelsDevEntries?: readonly ModelEntry[];\n /** Operator manifest entries. Higher priority than in-tree. */\n readonly manifestEntries?: readonly ModelEntry[];\n /**\n * Broad generated-catalog (LiteLLM) breadth entries. LOWEST priority —\n * overwritten by every other tier; provides long-tail coverage so unknown\n * models resolve to real catalog data instead of a bare derived default\n * (#3293, preserving the legacy CapabilityDiscovery T2 breadth).\n */\n readonly generatedEntries?: readonly ModelEntry[];\n}\n\n/**\n * The unified model-metadata registry. Construct once, share across\n * the process. `getEntry(modelId)` always returns something.\n */\nexport class ModelRegistry {\n private readonly byId = new Map<string, ModelEntry>();\n private readonly byAlias = new Map<string, string>(); // alias → canonical id\n /**\n * `vendor|family|version` → candidate entries, for the identity tier\n * (#4164). Built ONCE, lazily on the first fuzzy lookup — the entry maps\n * are immutable after construction, so it never goes stale. No caching of\n * UNMATCHED ids happens anywhere (the index only holds loaded entries).\n */\n private identityIndex: Map<string, ModelEntry[]> | undefined;\n\n constructor(options: ModelRegistryOptions = {}) {\n // Load order: lowest priority first; later sources overwrite.\n if (options.generatedEntries !== undefined) {\n this.loadEntries(options.generatedEntries);\n }\n if (options.modelsDevEntries !== undefined) {\n this.loadEntries(options.modelsDevEntries);\n }\n if (options.inTreeEntries !== undefined) {\n this.loadEntries(options.inTreeEntries);\n }\n if (options.manifestEntries !== undefined) {\n this.loadEntries(options.manifestEntries);\n }\n }\n\n /**\n * Resolve a model id to its full metadata entry. Always returns —\n * unknown models get a derived entry with sensible defaults.\n *\n * On exact miss, the normalized/identity resolution tier (#4164) runs\n * BEFORE derivation so decorated gateway ids (`Claude_Opus_4.8_hardened`)\n * still pick up the canonical entry's pricing/metadata.\n */\n getEntry(modelId: string, hints?: ModelHints): ModelEntry {\n const direct = this.lookupExact(modelId);\n // 'models-dev' and 'generated' are catalog breadth tiers: merge their data\n // with derivation rather than returning blindly (in-tree/manifest are\n // authoritative and return directly). (#3293)\n if (direct !== undefined && direct.source !== 'models-dev' && direct.source !== 'generated') {\n return direct;\n }\n if (direct === undefined) {\n // Resolve the identity ONCE (#4183 perf): the fuzzy tier's identity\n // key and, on a miss, derivation both consume the same resolution.\n const identity = resolveModelIdentitySync(modelId, hints);\n const fuzzy = this.lookupFuzzy(modelId, identity, hints);\n if (fuzzy !== undefined) return fuzzy;\n return deriveEntry(modelId, identity);\n }\n\n const identity = resolveModelIdentitySync(modelId, augmentHints(hints, direct));\n const derived = deriveEntry(modelId, identity);\n if (identity.vendor !== 'unknown') {\n return mergeSnapshotWithDerived(direct, derived);\n }\n return direct;\n }\n\n /**\n * Has the registry got an authoritative entry for this id?\n * Consumers use this to distinguish \"we know X\" from \"we guessed.\"\n */\n hasAuthoritative(modelId: string): boolean {\n return this.lookupExact(modelId) !== undefined;\n }\n\n /**\n * All loaded entries across every tier (generated + models.dev + in-tree +\n * manifest), deduped by id (later sources overwrite earlier). This is NOT\n * filtered to authoritative entries — `models-dev`/`generated` are\n * catalog-breadth tiers; use `hasAuthoritative()` to tell them apart.\n */\n allEntries(): readonly ModelEntry[] {\n return [...this.byId.values()];\n }\n\n /** Snapshot of canonical id → entry mapping. */\n toMap(): ReadonlyMap<string, ModelEntry> {\n return new Map(this.byId);\n }\n\n private lookupExact(modelId: string): ModelEntry | undefined {\n const direct = this.byId.get(modelId);\n if (direct !== undefined) return direct;\n const canonical = this.byAlias.get(modelId);\n if (canonical !== undefined) return this.byId.get(canonical);\n return undefined;\n }\n\n /**\n * Normalized/identity resolution tier (#4164). Runs on exact miss only:\n * (a) retry `lookupExact` with the `normaliseModelId`-normalized id so\n * aliases + alias-shadow (#3293) keep working;\n * (b) identity-match {vendor, family, version} against the load-time\n * index — version required on both sides (ONE trailing date segment\n * tolerated on the decorated side, #4183), tier-ordered uniqueness,\n * fail closed on ambiguity and on sub-SKU size markers (see\n * model-fuzzy-resolution.ts).\n * Over-long ids skip the tier entirely (straight to derivation).\n * `identity` is the caller's already-resolved identity for `modelId`\n * (#4183 perf: resolved once per getEntry call).\n */\n private lookupFuzzy(\n modelId: string,\n identity: ResolvedModelIdentity,\n hints?: ModelHints\n ): ModelEntry | undefined {\n if (modelId.length > MAX_FUZZY_ID_LENGTH) return undefined;\n const normalized = normaliseModelId(modelId);\n const byNormalized = normalized === modelId ? undefined : this.lookupExact(normalized);\n if (byNormalized !== undefined) {\n return this.resolveMatched(byNormalized, modelId, hints, 'normalized');\n }\n this.identityIndex ??= buildIdentityIndex(this.byId.values());\n const matched = matchIdentityCandidate(this.identityIndex, identity);\n if (matched === undefined) return undefined;\n return this.resolveMatched(matched, modelId, hints, 'identity');\n }\n\n /**\n * Build the entry returned for a fuzzy match: a fresh COPY that keeps the\n * CALLER'S id and takes behaviour from derivation for that original id —\n * the matched entry grants pricing/metadata only.\n */\n private resolveMatched(\n matched: ModelEntry,\n modelId: string,\n hints: ModelHints | undefined,\n matchedVia: MatchedVia\n ): ModelEntry {\n const identity = resolveModelIdentitySync(modelId, augmentHints(hints, matched));\n const derived = deriveEntry(modelId, identity);\n return mergeMatchedWithDerived(matched, derived, matchedVia);\n }\n\n private loadEntries(entries: readonly ModelEntry[]): void {\n for (const entry of entries) {\n const merged: { -readonly [K in keyof ModelEntry]: ModelEntry[K] } = { ...entry };\n if (entry.pricing === undefined) {\n // #7132: a same-id overlay that omits pricing keeps the lower tier's\n // rate, its billing scope and (via pricingSources) its price basis.\n const lower = this.byId.get(entry.id);\n if (lower?.pricing !== undefined) {\n merged.pricing = lower.pricing;\n if (lower.pricingProvenance !== undefined) {\n merged.pricingProvenance = lower.pricingProvenance;\n }\n }\n } else {\n // A supplied rate is a fresh key even when its numbers match a lower\n // tier's, so an explicit overlay price is always `declared` (#4600).\n merged.pricing = { ...entry.pricing };\n pricingSources.set(merged.pricing, entry.source);\n }\n this.byId.set(entry.id, merged);\n if (merged.aliases !== undefined) {\n for (const alias of merged.aliases) {\n this.byAlias.set(alias, entry.id);\n // Tiers load lowest-priority first, so a direct `byId` entry under\n // this alias key can only come from a lower tier (e.g. the generated\n // breadth catalog). An authoritative alias must win: drop the shadow\n // so `lookupExact` resolves the alias to its canonical entry (#3293).\n if (alias !== entry.id) this.byId.delete(alias);\n }\n }\n }\n }\n}\n\n// When the modelId alone doesn't carry vendor info (e.g.\n// `text-embedding-3-large`), promote the snapshot's vendor/family\n// into resolver hints so identity can resolve and derivation can\n// supply the correct behaviour fields.\nfunction augmentHints(hints: ModelHints | undefined, direct: ModelEntry | undefined): ModelHints {\n const h = hints ?? {};\n if (direct === undefined) return h;\n const out: { -readonly [K in keyof ModelHints]: ModelHints[K] } = {\n vendor: h.vendor ?? direct.vendor,\n family: h.family ?? direct.family,\n };\n if (h.version !== undefined) out.version = h.version;\n if (h.quirks !== undefined) out.quirks = h.quirks;\n return out;\n}\n\n// Snapshot supplies per-version capability data (contextWindow,\n// pricing, displayName); derived entries carry richer behaviour\n// knowledge (parallelToolCalls, promptCaching, profileId, quirks).\n// Merge so each layer wins where it has the better data.\nfunction mergeSnapshotWithDerived(snapshot: ModelEntry, derived: ModelEntry): ModelEntry {\n return {\n ...snapshot,\n parallelToolCalls: derived.parallelToolCalls,\n promptCaching: derived.promptCaching,\n toolDefinitionFormat: derived.toolDefinitionFormat,\n maxRecommendedTurnBudget: derived.maxRecommendedTurnBudget,\n strictJson: derived.strictJson,\n quirks: derived.quirks,\n profileId: derived.profileId,\n source: 'derived',\n };\n}\n\n/**\n * Merge for the normalized/identity resolution tier (#4164) — extends the\n * #3293 `mergeSnapshotWithDerived` semantics: capability/metadata (pricing,\n * contextWindow, maxOutputTokens, displayName, modalities, quality) come\n * from the matched canonical entry, behaviour fields from the derived entry\n * for the ORIGINAL decorated id. On top of that base merge it:\n * - keeps the CALLER'S id (and its parsed version) — not the canonical's,\n * - withholds fields outside the pricing/metadata grant: alias/CLI routing\n * belongs to the canonical entry, request-shaping fields\n * (unsupportedParameters, maxTokensParam) must follow the original id,\n * and `verifiedAt` attests the canonical entry — not this derivation,\n * - stamps `matchedVia` + `resolvedFrom` provenance.\n * Always returns a fresh object — stored entries are never mutated.\n */\nfunction mergeMatchedWithDerived(\n matched: ModelEntry,\n derived: ModelEntry,\n matchedVia: MatchedVia\n): ModelEntry {\n const merged: { -readonly [K in keyof ModelEntry]?: ModelEntry[K] } = {\n ...mergeSnapshotWithDerived(matched, derived),\n };\n delete merged.aliases;\n delete merged.cliName;\n delete merged.cliAlias;\n delete merged.cliModelName;\n delete merged.unsupportedParameters;\n delete merged.maxTokensParam;\n delete merged.verifiedAt;\n merged.id = derived.id;\n if (derived.version !== undefined) merged.version = derived.version;\n merged.matchedVia = matchedVia;\n merged.resolvedFrom = matched.id;\n return merged as ModelEntry;\n}\n\n// Re-export the derivation surface so existing consumers keep working\n// without needing to update their import paths.\nexport { DEFAULT_ENTRY, deriveEntry };\n\n// ============================================================================\n// Convenience — global default registry, populated lazily\n// ============================================================================\n\nlet globalRegistry: ModelRegistry | undefined;\n\n/**\n * Lazy global registry. Most consumers should accept a `ModelRegistry`\n * via dependency injection instead, but this is the convenient default\n * for migration from the existing module-level constants.\n *\n * The first call constructs the registry and loads the operator\n * manifest overlay (#2547 4a) from `$NEXUS_MODELS_OVERLAY_PATH` or\n * `$NEXUS_DATA_DIR/models-manifest.yaml`. Missing / malformed manifests\n * never throw — rejections are logged at warn level and dropped.\n */\nexport function getDefaultRegistry(): ModelRegistry {\n globalRegistry ??= buildDefaultRegistry();\n return globalRegistry;\n}\n\n/**\n * Return the global registry ONLY if it has already been constructed; never\n * triggers lazy construction (#3185). Used by the early-bootstrap-sensitive\n * `getDefaultModelForCli` path so a module-load-time caller does NOT force the\n * filesystem-touching overlay load — that is the TDZ / re-entrancy hazard the\n * `inTreeById()` filesystem-free builders were created to dodge\n * (model-config-helpers.ts ~L60-69). Once any consumer has built the registry\n * (or after `reloadDefaultRegistry`), overlay-aware resolution kicks in.\n */\nexport function peekDefaultRegistry(): ModelRegistry | undefined {\n return globalRegistry;\n}\n\nfunction buildDefaultRegistry(): ModelRegistry {\n const overlay = loadManifestOverlay();\n const snapshot = loadModelsDevSnapshot();\n const generated = loadGeneratedRegistryEntries();\n const inTree = buildInTreeEntries();\n const options: ModelRegistryOptions = { inTreeEntries: inTree };\n if (overlay.status === 'loaded' && overlay.entries.length > 0) {\n (options as { manifestEntries?: readonly ModelEntry[] }).manifestEntries = overlay.entries;\n }\n if (snapshot.status === 'loaded' && snapshot.entries.length > 0) {\n (options as { modelsDevEntries?: readonly ModelEntry[] }).modelsDevEntries = snapshot.entries;\n }\n if (generated.status === 'loaded' && generated.entries.length > 0) {\n (options as { generatedEntries?: readonly ModelEntry[] }).generatedEntries = generated.entries;\n }\n return new ModelRegistry(options);\n}\n\n/** Replace the global registry. Reserved for tests + bootstrap. */\nexport function setDefaultRegistry(registry: ModelRegistry | undefined): void {\n globalRegistry = registry;\n}\n\n/**\n * Hot-reload the global model registry WITHOUT a process restart (#3185).\n *\n * Re-runs {@link buildDefaultRegistry} — which re-reads the operator/user\n * manifest overlays, the models.dev snapshot, and the generated catalog from\n * disk — and reassigns the singleton, so overlay edits made after startup\n * (e.g. an updated `NEXUS_MODELS_OVERLAY_PATH`) propagate to every consumer\n * that reads through `getDefaultRegistry()`.\n *\n * ATOMIC DUAL-SINGLETON RESET (vote condition 2): the model registry and the\n * `UnifiedAdapterRegistry` are two independent singletons; the latter resolves\n * routing through the former. Refreshing only the model registry would leave\n * the adapter registry's cached default-model strings stale. This is the ONE\n * reload entry point — it resets BOTH together so there is never a state where\n * one is fresh and the other stale. The adapter-registry reset is a dynamic\n * import to avoid a static import cycle\n * (unified-registry → model-config-helpers → model-registry).\n *\n * The overlay loader is fail-closed (never throws on a missing / malformed\n * manifest — vote condition 3); a bad re-read degrades to the in-tree floor\n * rather than throwing, exactly as first construction does.\n */\nexport async function reloadDefaultRegistry(): Promise<ModelRegistry> {\n globalRegistry = buildDefaultRegistry();\n // Reset the adapter-registry singleton so its routing (re-resolved on read\n // since #3185) and any cached adapters pick up the new model registry.\n // Dynamic import breaks the static cycle.\n const { resetGlobalRegistry } = await import('../adapters/unified-registry.js');\n resetGlobalRegistry();\n return globalRegistry;\n}\n"],"mappings":"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","names":["existsSync","readFileSync","existsSync","readFileSync","existsSync","readFileSync","fileURLToPath","dirname","join","dirname","fileURLToPath","join","existsSync","readFileSync","identity"]}
|
|
@@ -4,13 +4,13 @@ import {
|
|
|
4
4
|
loadPapersRegistry,
|
|
5
5
|
loadTechniquesRegistry,
|
|
6
6
|
savePapersRegistry
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-7HI6EWY5.js";
|
|
8
8
|
import {
|
|
9
9
|
getTsMorph
|
|
10
10
|
} from "./chunk-W654ME6B.js";
|
|
11
11
|
import {
|
|
12
12
|
resolveToken
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-7Y6SB623.js";
|
|
14
14
|
import {
|
|
15
15
|
beliefTrustTier,
|
|
16
16
|
getToolMemory,
|
|
@@ -18,7 +18,7 @@ import {
|
|
|
18
18
|
rankedItemTrustTier,
|
|
19
19
|
trustTierLabel,
|
|
20
20
|
withoutUntrustedMemory
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-4HOSKAB3.js";
|
|
22
22
|
import {
|
|
23
23
|
extractSystemPrompt,
|
|
24
24
|
generateCacheKey,
|
|
@@ -41,7 +41,7 @@ import {
|
|
|
41
41
|
sigmoidConfidence,
|
|
42
42
|
tokenizeFiltered,
|
|
43
43
|
truncateSentence
|
|
44
|
-
} from "./chunk-
|
|
44
|
+
} from "./chunk-OMWOFIK5.js";
|
|
45
45
|
import {
|
|
46
46
|
ensureLearningDir,
|
|
47
47
|
getRulesFile
|
|
@@ -4309,4 +4309,4 @@ export {
|
|
|
4309
4309
|
DEFAULT_CONTEXT_BUDGET_TOKENS,
|
|
4310
4310
|
getContextPromptPrefix
|
|
4311
4311
|
};
|
|
4312
|
-
//# sourceMappingURL=chunk-
|
|
4312
|
+
//# sourceMappingURL=chunk-4NNCB7O2.js.map
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
OPENAI_COMPAT_URL_ENV,
|
|
6
6
|
err,
|
|
7
7
|
ok
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-OMWOFIK5.js";
|
|
9
9
|
import {
|
|
10
10
|
createLogger
|
|
11
11
|
} from "./chunk-MQ23UGSY.js";
|
|
@@ -307,4 +307,4 @@ export {
|
|
|
307
307
|
hostnameOf,
|
|
308
308
|
redactApiKey
|
|
309
309
|
};
|
|
310
|
-
//# sourceMappingURL=chunk-
|
|
310
|
+
//# sourceMappingURL=chunk-5BEFQVPR.js.map
|