@code-yeongyu/senpi-ai 2026.9.9 → 2026.9.10-2

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.
Files changed (140) hide show
  1. package/README.md +1 -0
  2. package/dist/api/anthropic-messages.d.ts +3 -1
  3. package/dist/api/anthropic-messages.d.ts.map +1 -1
  4. package/dist/api/anthropic-messages.js +6 -2
  5. package/dist/api/anthropic-messages.js.map +1 -1
  6. package/dist/api/azure-openai-responses.js.map +1 -1
  7. package/dist/api/bedrock-converse-stream.js.map +1 -1
  8. package/dist/api/bedrock-converse-stream.lazy.js.map +1 -1
  9. package/dist/api/context-room.d.ts.map +1 -1
  10. package/dist/api/cursor-agent/gen/agent_pb.d.ts.map +1 -1
  11. package/dist/api/cursor-agent/measure.js.map +1 -1
  12. package/dist/api/cursor-agent/stream-retry.d.ts.map +1 -1
  13. package/dist/api/cursor-agent.js.map +1 -1
  14. package/dist/api/cursor-agent.lazy.js.map +1 -1
  15. package/dist/api/cursor-conversation-rotation.js.map +1 -1
  16. package/dist/api/google-generative-ai.js.map +1 -1
  17. package/dist/api/google-shared.js.map +1 -1
  18. package/dist/api/google-vertex.js.map +1 -1
  19. package/dist/api/openai-codex-responses.js.map +1 -1
  20. package/dist/api/openai-completions.d.ts.map +1 -1
  21. package/dist/api/openai-completions.js +5 -0
  22. package/dist/api/openai-completions.js.map +1 -1
  23. package/dist/api/openai-images-edit.d.ts +4 -0
  24. package/dist/api/openai-images-edit.d.ts.map +1 -0
  25. package/dist/api/openai-images-edit.js +15 -0
  26. package/dist/api/openai-images-edit.js.map +1 -0
  27. package/dist/api/openai-images-params.d.ts +60 -0
  28. package/dist/api/openai-images-params.d.ts.map +1 -0
  29. package/dist/api/openai-images-params.js +93 -0
  30. package/dist/api/openai-images-params.js.map +1 -0
  31. package/dist/api/openai-images-result.d.ts +12 -0
  32. package/dist/api/openai-images-result.d.ts.map +1 -0
  33. package/dist/api/openai-images-result.js +96 -0
  34. package/dist/api/openai-images-result.js.map +1 -0
  35. package/dist/api/openai-images.d.ts +3 -6
  36. package/dist/api/openai-images.d.ts.map +1 -1
  37. package/dist/api/openai-images.js +26 -119
  38. package/dist/api/openai-images.js.map +1 -1
  39. package/dist/api/openai-responses-shared.js.map +1 -1
  40. package/dist/api/openai-responses.js.map +1 -1
  41. package/dist/api/pi-messages.d.ts.map +1 -1
  42. package/dist/api/pi-messages.js.map +1 -1
  43. package/dist/api/transform-messages.js.map +1 -1
  44. package/dist/api/warm-prompt-cache.js.map +1 -1
  45. package/dist/auth/credential-store.d.ts.map +1 -1
  46. package/dist/auth/oauth/kimi-coding.d.ts.map +1 -1
  47. package/dist/auth/oauth/kimi-coding.js +5 -1
  48. package/dist/auth/oauth/kimi-coding.js.map +1 -1
  49. package/dist/auth/oauth/kimi-identity.d.ts +24 -0
  50. package/dist/auth/oauth/kimi-identity.d.ts.map +1 -0
  51. package/dist/auth/oauth/kimi-identity.js +86 -0
  52. package/dist/auth/oauth/kimi-identity.js.map +1 -0
  53. package/dist/auth/oauth/load.d.ts.map +1 -1
  54. package/dist/auth/oauth/load.js.map +1 -1
  55. package/dist/auth/oauth/openai-codex.js.map +1 -1
  56. package/dist/auth/oauth-refresh.d.ts +47 -0
  57. package/dist/auth/oauth-refresh.d.ts.map +1 -0
  58. package/dist/auth/oauth-refresh.js +126 -0
  59. package/dist/auth/oauth-refresh.js.map +1 -0
  60. package/dist/auth/pool/failover.d.ts.map +1 -1
  61. package/dist/auth/pool/select.d.ts.map +1 -1
  62. package/dist/auth/refresh-credential.d.ts +12 -0
  63. package/dist/auth/refresh-credential.d.ts.map +1 -0
  64. package/dist/auth/refresh-credential.js +44 -0
  65. package/dist/auth/refresh-credential.js.map +1 -0
  66. package/dist/auth/resolve.d.ts +2 -0
  67. package/dist/auth/resolve.d.ts.map +1 -1
  68. package/dist/auth/resolve.js +26 -35
  69. package/dist/auth/resolve.js.map +1 -1
  70. package/dist/compat.js.map +1 -1
  71. package/dist/cursor/model-capabilities.js.map +1 -1
  72. package/dist/cursor/selection-descriptor.js.map +1 -1
  73. package/dist/env-api-keys.d.ts.map +1 -1
  74. package/dist/env-api-keys.js +1 -0
  75. package/dist/env-api-keys.js.map +1 -1
  76. package/dist/image-models.generated.d.ts +99 -66
  77. package/dist/image-models.generated.d.ts.map +1 -1
  78. package/dist/image-models.generated.js +35 -2
  79. package/dist/image-models.generated.js.map +1 -1
  80. package/dist/images.d.ts +1 -0
  81. package/dist/images.d.ts.map +1 -1
  82. package/dist/images.js +1 -0
  83. package/dist/images.js.map +1 -1
  84. package/dist/models-store.d.ts.map +1 -1
  85. package/dist/models.d.ts.map +1 -1
  86. package/dist/models.generated.d.ts +2 -0
  87. package/dist/models.generated.d.ts.map +1 -1
  88. package/dist/models.generated.js +2 -0
  89. package/dist/models.generated.js.map +1 -1
  90. package/dist/models.js +3 -28
  91. package/dist/models.js.map +1 -1
  92. package/dist/node/provider-scope.d.ts.map +1 -1
  93. package/dist/providers/all.d.ts.map +1 -1
  94. package/dist/providers/all.js +2 -0
  95. package/dist/providers/all.js.map +1 -1
  96. package/dist/providers/data/.manifest.json +1 -1
  97. package/dist/providers/data/amazon-bedrock.json +1 -1
  98. package/dist/providers/data/nvidia.json +1 -1
  99. package/dist/providers/data/opencode-go.json +1 -1
  100. package/dist/providers/data/openrouter.json +1 -1
  101. package/dist/providers/data/venice.json +1 -0
  102. package/dist/providers/data/vercel-ai-gateway.json +1 -1
  103. package/dist/providers/faux.js.map +1 -1
  104. package/dist/providers/ollama.js.map +1 -1
  105. package/dist/providers/radius.js.map +1 -1
  106. package/dist/providers/venice.d.ts +3 -0
  107. package/dist/providers/venice.d.ts.map +1 -0
  108. package/dist/providers/venice.js +15 -0
  109. package/dist/providers/venice.js.map +1 -0
  110. package/dist/providers/venice.models.d.ts +4 -0
  111. package/dist/providers/venice.models.d.ts.map +1 -0
  112. package/dist/providers/venice.models.js +6 -0
  113. package/dist/providers/venice.models.js.map +1 -0
  114. package/dist/tool-call-middleware/context-transformer.js.map +1 -1
  115. package/dist/tool-call-middleware/protocols/anthropic-xml/recovery-wrapper-state.d.ts.map +1 -1
  116. package/dist/tool-call-middleware/protocols/kimi-xtml/parse.js.map +1 -1
  117. package/dist/tool-call-middleware/recovery-content-lifecycle.d.ts.map +1 -1
  118. package/dist/tool-call-middleware/recovery-event-stream.d.ts.map +1 -1
  119. package/dist/tool-call-middleware/recovery-native-projection.d.ts.map +1 -1
  120. package/dist/tool-call-middleware/recovery-native-projection.js.map +1 -1
  121. package/dist/tool-call-middleware/recovery-stream-terminal.d.ts.map +1 -1
  122. package/dist/tool-call-middleware/recovery-stream-wrapper.js.map +1 -1
  123. package/dist/tool-call-middleware/recovery-text-projection.d.ts.map +1 -1
  124. package/dist/tool-call-middleware/recovery-text-projection.js.map +1 -1
  125. package/dist/tool-call-middleware/stream-thinking-projection.d.ts.map +1 -1
  126. package/dist/tool-call-middleware/stream-wrapper-shared.d.ts.map +1 -1
  127. package/dist/tool-call-middleware/stream-wrapper-shared.js.map +1 -1
  128. package/dist/tool-call-middleware/stream-wrapper.js.map +1 -1
  129. package/dist/types.d.ts +20 -3
  130. package/dist/types.d.ts.map +1 -1
  131. package/dist/types.js.map +1 -1
  132. package/dist/utils/deferred-tools.js.map +1 -1
  133. package/dist/utils/event-stream.d.ts.map +1 -1
  134. package/dist/utils/prompt-cache-ttl.d.ts +3 -1
  135. package/dist/utils/prompt-cache-ttl.d.ts.map +1 -1
  136. package/dist/utils/prompt-cache-ttl.js.map +1 -1
  137. package/dist/utils/provider-retry.js.map +1 -1
  138. package/dist/utils/retry.js.map +1 -1
  139. package/dist/utils/validation.js.map +1 -1
  140. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"model-capabilities.js","sourceRoot":"","sources":["../../src/cursor/model-capabilities.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ModelThinkingLevel } from \"../types.ts\";\nimport aliasData from \"./cursor-variant-aliases.json\" with { type: \"json\" };\n\nexport type CursorCapabilityEvidence = \"available-models\" | \"cli-live\" | \"suffix-only\";\nexport type CursorLevelEncoding = \"parameters\" | \"variant-id\";\nexport type CursorParameterId = \"thinking\" | \"context\" | \"effort\" | \"reasoning\" | \"fast\";\n\nexport interface CursorLevelSpec {\n\treadonly value: string;\n\treadonly encoding: CursorLevelEncoding;\n}\n\nexport interface CursorModelCapability {\n\treadonly catalogKey?: string;\n\treadonly evidence: CursorCapabilityEvidence;\n\treadonly window: number;\n\treadonly maxWindow?: number;\n\treadonly parameterOrder: readonly CursorParameterId[];\n\treadonly defaultContext?: string;\n\t/** Context token matching `window`; cursor truncates to whatever this asks for. */\n\treadonly requestContext?: string;\n\treadonly levels: Partial<Record<ModelThinkingLevel, CursorLevelSpec>>;\n}\n\nconst P = \"parameters\" as const;\nconst V = \"variant-id\" as const;\n\nfunction ladder(\n\tvalues: readonly string[],\n\tencoding: CursorLevelEncoding = P,\n): Partial<Record<ModelThinkingLevel, CursorLevelSpec>> {\n\tconst out: Partial<Record<ModelThinkingLevel, CursorLevelSpec>> = {};\n\tfor (const value of values) out[value === \"none\" ? \"off\" : (value as ModelThinkingLevel)] = { value, encoding };\n\treturn out;\n}\n\nconst CLAUDE_ORDER: readonly CursorParameterId[] = [\"thinking\", \"context\", \"effort\"];\nconst GPT_ORDER: readonly CursorParameterId[] = [\"context\", \"reasoning\", \"fast\"];\n\nfunction claude(\n\twindow: number,\n\tmaxWindow: number,\n\tlevels: readonly string[],\n\tdefaultContext: string,\n): CursorModelCapability {\n\treturn {\n\t\tevidence: \"available-models\",\n\t\twindow,\n\t\tmaxWindow,\n\t\tparameterOrder: CLAUDE_ORDER,\n\t\tdefaultContext,\n\t\trequestContext: window >= 1_000_000 ? \"1m\" : defaultContext,\n\t\tlevels: ladder(levels),\n\t};\n}\n\nfunction gpt(\n\tlevels: readonly string[],\n\torder: readonly CursorParameterId[] = GPT_ORDER,\n\twindow = 400000,\n\tmaxWindow = 400000,\n): CursorModelCapability {\n\treturn {\n\t\tevidence: \"available-models\",\n\t\twindow,\n\t\tmaxWindow,\n\t\tparameterOrder: order,\n\t\tdefaultContext: \"272k\",\n\t\trequestContext: order.includes(\"context\") && window >= 1_000_000 ? \"1m\" : undefined,\n\t\tlevels: ladder(levels),\n\t};\n}\n\n/**\n * Static cursor capability table. Values come from the live\n * aiserver.v1 AvailableModels capture of 2026-08-18 (evidence:\n * local-ignore/qa-evidence/20260818-cursor-reasoning-levels/available-models-catalog.json).\n * `GetUsableModels` carries no window or parameter field, so this table is the\n * authoritative source; see .omo/plans/cursor-reasoning-levels.md §3.1/§6.\n */\nexport const CURSOR_MODEL_CAPABILITIES: Record<string, CursorModelCapability> = {\n\t\"claude-fable-5\": claude(1000000, 1000000, [\"low\", \"medium\", \"high\", \"xhigh\", \"max\"], \"300k\"),\n\t\"claude-sonnet-5\": claude(1000000, 1000000, [\"low\", \"medium\", \"high\", \"xhigh\", \"max\"], \"300k\"),\n\t\"claude-opus-4-7\": claude(1000000, 1000000, [\"low\", \"medium\", \"high\", \"xhigh\", \"max\"], \"300k\"),\n\t\"claude-opus-4-8\": claude(1000000, 1000000, [\"low\", \"medium\", \"high\", \"xhigh\", \"max\"], \"300k\"),\n\t\"claude-opus-5\": claude(1000000, 1000000, [\"low\", \"medium\", \"high\", \"xhigh\", \"max\"], \"300k\"),\n\t\"claude-4.6-opus\": claude(1000000, 1000000, [\"high\", \"max\"], \"200k\"),\n\t\"claude-4.6-sonnet\": claude(1000000, 1000000, [\"medium\"], \"200k\"),\n\t\"claude-4.5-opus\": {\n\t\tevidence: \"available-models\",\n\t\twindow: 200000,\n\t\tparameterOrder: [\"thinking\"],\n\t\tlevels: { high: { value: \"high\", encoding: V } },\n\t},\n\t\"gpt-5.6-sol\": gpt([\"none\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"], GPT_ORDER, 1000000, 1000000),\n\t\"gpt-5.6-luna\": gpt([\"none\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"], GPT_ORDER, 1000000, 1000000),\n\t\"gpt-5.6-terra\": gpt([\"none\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"], GPT_ORDER, 272000, 272000),\n\t\"gpt-5.5\": {\n\t\t...gpt([\"none\", \"low\", \"medium\", \"high\"], GPT_ORDER, 1000000, 1000000),\n\t\tlevels: { ...ladder([\"none\", \"low\", \"medium\", \"high\"]), xhigh: { value: \"extra-high\", encoding: P } },\n\t},\n\t\"gpt-5.3-codex\": {\n\t\t...gpt([], [\"reasoning\", \"fast\"]),\n\t\tmaxWindow: undefined,\n\t\tdefaultContext: undefined,\n\t\tlevels: { ...ladder([\"low\", \"medium\", \"high\"]), xhigh: { value: \"extra-high\", encoding: P } },\n\t},\n\t\"gpt-5.1\": {\n\t\t...gpt([], [\"reasoning\"]),\n\t\tmaxWindow: undefined,\n\t\tdefaultContext: undefined,\n\t\tlevels: ladder([\"low\", \"high\"]),\n\t},\n\t\"gpt-5.2\": {\n\t\t...gpt([], [\"reasoning\"]),\n\t\tmaxWindow: undefined,\n\t\tdefaultContext: undefined,\n\t\tlevels: { ...ladder([\"low\", \"high\"]), xhigh: { value: \"xhigh\", encoding: V } },\n\t},\n\t\"gpt-5.4\": {\n\t\t...gpt([], [\"reasoning\"]),\n\t\tmaxWindow: undefined,\n\t\tdefaultContext: undefined,\n\t\tlevels: { ...ladder([\"low\", \"medium\", \"high\"]), xhigh: { value: \"xhigh\", encoding: V } },\n\t},\n\t\"gpt-5.4-mini\": {\n\t\tevidence: \"available-models\",\n\t\twindow: 400_000,\n\t\tparameterOrder: [],\n\t\tlevels: ladder([\"none\", \"low\", \"medium\", \"high\", \"xhigh\"], V),\n\t},\n\t\"gpt-5.4-nano\": {\n\t\t...gpt([], [\"reasoning\"]),\n\t\tmaxWindow: undefined,\n\t\tdefaultContext: undefined,\n\t\tlevels: ladder([\"none\", \"low\", \"medium\", \"high\", \"xhigh\"]),\n\t},\n\t\"gemini-3.7-flash\": {\n\t\tevidence: \"cli-live\",\n\t\twindow: 1_048_576,\n\t\tparameterOrder: [\"effort\"],\n\t\tlevels: ladder([\"low\", \"medium\", \"high\"]),\n\t},\n\t\"gemini-3.6-flash\": {\n\t\tevidence: \"suffix-only\",\n\t\twindow: 1_048_576,\n\t\tparameterOrder: [],\n\t\tlevels: ladder([\"minimal\", \"low\", \"medium\", \"high\"], V),\n\t},\n\t\"cursor-grok-4.6\": {\n\t\tevidence: \"available-models\",\n\t\twindow: 500_000,\n\t\tparameterOrder: [\"effort\", \"fast\"],\n\t\tlevels: ladder([\"low\", \"medium\", \"high\", \"xhigh\"]),\n\t},\n\t\"cursor-grok-4.5\": {\n\t\tevidence: \"suffix-only\",\n\t\twindow: 500_000,\n\t\tparameterOrder: [],\n\t\tlevels: ladder([\"low\", \"medium\", \"high\"], V),\n\t},\n\t\"glm-5.2\": {\n\t\tevidence: \"available-models\",\n\t\twindow: 1000000,\n\t\tparameterOrder: [\"reasoning\"],\n\t\tlevels: ladder([\"high\", \"max\"]),\n\t},\n\t\"kimi-k3\": {\n\t\tevidence: \"available-models\",\n\t\twindow: 1048576,\n\t\tparameterOrder: [\"reasoning\"],\n\t\tlevels: ladder([\"low\", \"high\", \"max\"]),\n\t},\n\t\"composer-2.5\": { evidence: \"available-models\", window: 200000, parameterOrder: [\"fast\"], levels: {} },\n\t\"claude-haiku-4-5\": { evidence: \"available-models\", window: 200000, parameterOrder: [\"thinking\"], levels: {} },\n\t\"claude-4-sonnet\": {\n\t\tevidence: \"available-models\",\n\t\twindow: 200000,\n\t\tparameterOrder: [\"thinking\", \"context\"],\n\t\tdefaultContext: \"200k\",\n\t\tlevels: {},\n\t},\n\t\"claude-4.5-sonnet\": {\n\t\tevidence: \"available-models\",\n\t\twindow: 200_000,\n\t\tparameterOrder: [\"thinking\", \"context\"],\n\t\tdefaultContext: \"200k\",\n\t\tlevels: {},\n\t},\n\t\"kimi-k2.7-code\": { evidence: \"available-models\", window: 262_144, parameterOrder: [], levels: {} },\n\t\"gemini-3-flash\": { evidence: \"available-models\", window: 1000000, parameterOrder: [], levels: {} },\n\t\"gemini-3.1-pro\": { evidence: \"available-models\", window: 1000000, parameterOrder: [], levels: {} },\n\t\"gemini-3.5-flash\": { evidence: \"available-models\", window: 1_048_576, parameterOrder: [], levels: {} },\n\t\"gpt-5-mini\": { evidence: \"available-models\", window: 400_000, parameterOrder: [], levels: {} },\n};\n\nexport interface CursorVariantAlias {\n\treadonly targetId: string;\n\treadonly level?: ModelThinkingLevel;\n\treadonly legacyVariantId: string;\n\treadonly encoding: \"legacy-variant\";\n}\n\nconst ALIASES = aliasData.aliases as Record<string, CursorVariantAlias>;\nconst LEVEL_TOKENS = [\"minimal\", \"low\", \"medium\", \"high\", \"extra-high\", \"xhigh\", \"max\", \"none\"] as const;\n\nexport interface CursorVariantParse {\n\treadonly baseId: string;\n\treadonly level: string | undefined;\n\treadonly thinking: boolean | undefined;\n\treadonly fast: boolean;\n\treadonly originalId: string;\n}\n\n/** Lossless suffix parser: trailing `-fast`, `-thinking-<level>` or `-<level>-thinking`, bare `-thinking`, trailing level. */\nexport function parseCursorVariantId(originalId: string): CursorVariantParse {\n\tlet rest = originalId;\n\tlet fast = false;\n\tif (rest.endsWith(\"-fast\")) {\n\t\tfast = true;\n\t\trest = rest.slice(0, -5);\n\t}\n\tlet level: string | undefined;\n\tlet thinking: boolean | undefined;\n\tconst alternation = LEVEL_TOKENS.join(\"|\");\n\tconst patterns: [RegExp, boolean][] = [\n\t\t[new RegExp(`-thinking-(${alternation})$`), true],\n\t\t[new RegExp(`-(${alternation})-thinking$`), true],\n\t];\n\tfor (const [pattern, flag] of patterns) {\n\t\tconst match = rest.match(pattern);\n\t\tif (match) {\n\t\t\tlevel = match[1];\n\t\t\tthinking = flag;\n\t\t\trest = rest.slice(0, match.index);\n\t\t\treturn { baseId: rest, level, thinking, fast, originalId };\n\t\t}\n\t}\n\tif (rest.endsWith(\"-thinking\")) {\n\t\treturn { baseId: rest.slice(0, -9), level, thinking: true, fast, originalId };\n\t}\n\tconst levelMatch = rest.match(new RegExp(`-(${alternation})$`));\n\tif (levelMatch) {\n\t\tlevel = levelMatch[1];\n\t\tthinking = false;\n\t\trest = rest.slice(0, levelMatch.index);\n\t}\n\treturn { baseId: rest, level, thinking, fast, originalId };\n}\n\nexport function getCursorVariantAlias(originalId: string): CursorVariantAlias | undefined {\n\treturn ALIASES[originalId];\n}\n\n/** Resolve any known variant id to its selectable base identity; unknown ids return undefined. */\nexport function getCursorBaseIdForVariant(originalId: string): string | undefined {\n\tconst alias = ALIASES[originalId];\n\tif (alias) {\n\t\tconst parsed = parseCursorVariantId(alias.targetId);\n\t\treturn parsed.baseId;\n\t}\n\treturn undefined;\n}\n\nexport function getCursorCapabilityForBase(baseId: string): CursorModelCapability | undefined {\n\treturn CURSOR_MODEL_CAPABILITIES[baseId];\n}\n"]}
1
+ {"version":3,"file":"model-capabilities.js","sourceRoot":"","sources":["../../src/cursor/model-capabilities.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ModelThinkingLevel } from \"../types.ts\";\nimport aliasData from \"./cursor-variant-aliases.json\" with { type: \"json\" };\n\nexport type CursorCapabilityEvidence = \"available-models\" | \"cli-live\" | \"suffix-only\";\nexport type CursorLevelEncoding = \"parameters\" | \"variant-id\";\nexport type CursorParameterId = \"thinking\" | \"context\" | \"effort\" | \"reasoning\" | \"fast\";\n\nexport interface CursorLevelSpec {\n\treadonly value: string;\n\treadonly encoding: CursorLevelEncoding;\n}\n\nexport interface CursorModelCapability {\n\treadonly catalogKey?: string;\n\treadonly evidence: CursorCapabilityEvidence;\n\treadonly window: number;\n\treadonly maxWindow?: number;\n\treadonly parameterOrder: readonly CursorParameterId[];\n\treadonly defaultContext?: string;\n\t/** Context token matching `window`; cursor truncates to whatever this asks for. */\n\treadonly requestContext?: string;\n\treadonly levels: Partial<Record<ModelThinkingLevel, CursorLevelSpec>>;\n}\n\nconst P = \"parameters\" as const;\nconst V = \"variant-id\" as const;\n\nfunction ladder(\n\tvalues: readonly string[],\n\tencoding: CursorLevelEncoding = P,\n): Partial<Record<ModelThinkingLevel, CursorLevelSpec>> {\n\tconst out: Partial<Record<ModelThinkingLevel, CursorLevelSpec>> = {};\n\tfor (const value of values) out[value === \"none\" ? \"off\" : (value as ModelThinkingLevel)] = { value, encoding };\n\treturn out;\n}\n\nconst CLAUDE_ORDER: readonly CursorParameterId[] = [\"thinking\", \"context\", \"effort\"];\nconst GPT_ORDER: readonly CursorParameterId[] = [\"context\", \"reasoning\", \"fast\"];\n\nfunction claude(\n\twindow: number,\n\tmaxWindow: number,\n\tlevels: readonly string[],\n\tdefaultContext: string,\n): CursorModelCapability {\n\treturn {\n\t\tevidence: \"available-models\",\n\t\twindow,\n\t\tmaxWindow,\n\t\tparameterOrder: CLAUDE_ORDER,\n\t\tdefaultContext,\n\t\trequestContext: window >= 1_000_000 ? \"1m\" : defaultContext,\n\t\tlevels: ladder(levels),\n\t};\n}\n\nfunction gpt(\n\tlevels: readonly string[],\n\torder: readonly CursorParameterId[] = GPT_ORDER,\n\twindow = 400000,\n\tmaxWindow = 400000,\n): CursorModelCapability {\n\treturn {\n\t\tevidence: \"available-models\",\n\t\twindow,\n\t\tmaxWindow,\n\t\tparameterOrder: order,\n\t\tdefaultContext: \"272k\",\n\t\trequestContext: order.includes(\"context\") && window >= 1_000_000 ? \"1m\" : undefined,\n\t\tlevels: ladder(levels),\n\t};\n}\n\n/**\n * Static cursor capability table. Values come from the live\n * aiserver.v1 AvailableModels capture of 2026-08-18 (evidence:\n * local-ignore/qa-evidence/20260818-cursor-reasoning-levels/available-models-catalog.json).\n * `GetUsableModels` carries no window or parameter field, so this table is the\n * authoritative source; see .omo/plans/cursor-reasoning-levels.md §3.1/§6.\n */\nexport const CURSOR_MODEL_CAPABILITIES: Record<string, CursorModelCapability> = {\n\t\"claude-fable-5\": claude(1000000, 1000000, [\"low\", \"medium\", \"high\", \"xhigh\", \"max\"], \"300k\"),\n\t\"claude-sonnet-5\": claude(1000000, 1000000, [\"low\", \"medium\", \"high\", \"xhigh\", \"max\"], \"300k\"),\n\t\"claude-opus-4-7\": claude(1000000, 1000000, [\"low\", \"medium\", \"high\", \"xhigh\", \"max\"], \"300k\"),\n\t\"claude-opus-4-8\": claude(1000000, 1000000, [\"low\", \"medium\", \"high\", \"xhigh\", \"max\"], \"300k\"),\n\t\"claude-opus-5\": claude(1000000, 1000000, [\"low\", \"medium\", \"high\", \"xhigh\", \"max\"], \"300k\"),\n\t\"claude-4.6-opus\": claude(1000000, 1000000, [\"high\", \"max\"], \"200k\"),\n\t\"claude-4.6-sonnet\": claude(1000000, 1000000, [\"medium\"], \"200k\"),\n\t\"claude-4.5-opus\": {\n\t\tevidence: \"available-models\",\n\t\twindow: 200000,\n\t\tparameterOrder: [\"thinking\"],\n\t\tlevels: { high: { value: \"high\", encoding: V } },\n\t},\n\t\"gpt-5.6-sol\": gpt([\"none\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"], GPT_ORDER, 1000000, 1000000),\n\t\"gpt-5.6-luna\": gpt([\"none\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"], GPT_ORDER, 1000000, 1000000),\n\t\"gpt-5.6-terra\": gpt([\"none\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"], GPT_ORDER, 272000, 272000),\n\t\"gpt-5.5\": {\n\t\t...gpt([\"none\", \"low\", \"medium\", \"high\"], GPT_ORDER, 1000000, 1000000),\n\t\tlevels: { ...ladder([\"none\", \"low\", \"medium\", \"high\"]), xhigh: { value: \"extra-high\", encoding: P } },\n\t},\n\t\"gpt-5.3-codex\": {\n\t\t...gpt([], [\"reasoning\", \"fast\"]),\n\t\tmaxWindow: undefined,\n\t\tdefaultContext: undefined,\n\t\tlevels: { ...ladder([\"low\", \"medium\", \"high\"]), xhigh: { value: \"extra-high\", encoding: P } },\n\t},\n\t\"gpt-5.1\": {\n\t\t...gpt([], [\"reasoning\"]),\n\t\tmaxWindow: undefined,\n\t\tdefaultContext: undefined,\n\t\tlevels: ladder([\"low\", \"high\"]),\n\t},\n\t\"gpt-5.2\": {\n\t\t...gpt([], [\"reasoning\"]),\n\t\tmaxWindow: undefined,\n\t\tdefaultContext: undefined,\n\t\tlevels: { ...ladder([\"low\", \"high\"]), xhigh: { value: \"xhigh\", encoding: V } },\n\t},\n\t\"gpt-5.4\": {\n\t\t...gpt([], [\"reasoning\"]),\n\t\tmaxWindow: undefined,\n\t\tdefaultContext: undefined,\n\t\tlevels: { ...ladder([\"low\", \"medium\", \"high\"]), xhigh: { value: \"xhigh\", encoding: V } },\n\t},\n\t\"gpt-5.4-mini\": {\n\t\tevidence: \"available-models\",\n\t\twindow: 400_000,\n\t\tparameterOrder: [],\n\t\tlevels: ladder([\"none\", \"low\", \"medium\", \"high\", \"xhigh\"], V),\n\t},\n\t\"gpt-5.4-nano\": {\n\t\t...gpt([], [\"reasoning\"]),\n\t\tmaxWindow: undefined,\n\t\tdefaultContext: undefined,\n\t\tlevels: ladder([\"none\", \"low\", \"medium\", \"high\", \"xhigh\"]),\n\t},\n\t\"gemini-3.7-flash\": {\n\t\tevidence: \"cli-live\",\n\t\twindow: 1_048_576,\n\t\tparameterOrder: [\"effort\"],\n\t\tlevels: ladder([\"low\", \"medium\", \"high\"]),\n\t},\n\t\"gemini-3.6-flash\": {\n\t\tevidence: \"suffix-only\",\n\t\twindow: 1_048_576,\n\t\tparameterOrder: [],\n\t\tlevels: ladder([\"minimal\", \"low\", \"medium\", \"high\"], V),\n\t},\n\t\"cursor-grok-4.6\": {\n\t\tevidence: \"available-models\",\n\t\twindow: 500_000,\n\t\tparameterOrder: [\"effort\", \"fast\"],\n\t\tlevels: ladder([\"low\", \"medium\", \"high\", \"xhigh\"]),\n\t},\n\t\"cursor-grok-4.5\": {\n\t\tevidence: \"suffix-only\",\n\t\twindow: 500_000,\n\t\tparameterOrder: [],\n\t\tlevels: ladder([\"low\", \"medium\", \"high\"], V),\n\t},\n\t\"glm-5.2\": {\n\t\tevidence: \"available-models\",\n\t\twindow: 1000000,\n\t\tparameterOrder: [\"reasoning\"],\n\t\tlevels: ladder([\"high\", \"max\"]),\n\t},\n\t\"kimi-k3\": {\n\t\tevidence: \"available-models\",\n\t\twindow: 1048576,\n\t\tparameterOrder: [\"reasoning\"],\n\t\tlevels: ladder([\"low\", \"high\", \"max\"]),\n\t},\n\t\"composer-2.5\": { evidence: \"available-models\", window: 200000, parameterOrder: [\"fast\"], levels: {} },\n\t\"claude-haiku-4-5\": { evidence: \"available-models\", window: 200000, parameterOrder: [\"thinking\"], levels: {} },\n\t\"claude-4-sonnet\": {\n\t\tevidence: \"available-models\",\n\t\twindow: 200000,\n\t\tparameterOrder: [\"thinking\", \"context\"],\n\t\tdefaultContext: \"200k\",\n\t\tlevels: {},\n\t},\n\t\"claude-4.5-sonnet\": {\n\t\tevidence: \"available-models\",\n\t\twindow: 200_000,\n\t\tparameterOrder: [\"thinking\", \"context\"],\n\t\tdefaultContext: \"200k\",\n\t\tlevels: {},\n\t},\n\t\"kimi-k2.7-code\": { evidence: \"available-models\", window: 262_144, parameterOrder: [], levels: {} },\n\t\"gemini-3-flash\": { evidence: \"available-models\", window: 1000000, parameterOrder: [], levels: {} },\n\t\"gemini-3.1-pro\": { evidence: \"available-models\", window: 1000000, parameterOrder: [], levels: {} },\n\t\"gemini-3.5-flash\": { evidence: \"available-models\", window: 1_048_576, parameterOrder: [], levels: {} },\n\t\"gpt-5-mini\": { evidence: \"available-models\", window: 400_000, parameterOrder: [], levels: {} },\n};\n\nexport interface CursorVariantAlias {\n\treadonly targetId: string;\n\treadonly level?: ModelThinkingLevel;\n\treadonly legacyVariantId: string;\n\treadonly encoding: \"legacy-variant\";\n}\n\nconst ALIASES = aliasData.aliases as Record<string, CursorVariantAlias>;\nconst LEVEL_TOKENS = [\"minimal\", \"low\", \"medium\", \"high\", \"extra-high\", \"xhigh\", \"max\", \"none\"] as const;\n\nexport interface CursorVariantParse {\n\treadonly baseId: string;\n\treadonly level: string | undefined;\n\treadonly thinking: boolean | undefined;\n\treadonly fast: boolean;\n\treadonly originalId: string;\n}\n\n/** Lossless suffix parser: trailing `-fast`, `-thinking-<level>` or `-<level>-thinking`, bare `-thinking`, trailing level. */\nexport function parseCursorVariantId(originalId: string): CursorVariantParse {\n\tlet rest = originalId;\n\tlet fast = false;\n\tif (rest.endsWith(\"-fast\")) {\n\t\tfast = true;\n\t\trest = rest.slice(0, -5);\n\t}\n\tlet level: string | undefined;\n\tlet thinking: boolean | undefined;\n\tconst alternation = LEVEL_TOKENS.join(\"|\");\n\tconst patterns: [RegExp, boolean][] = [\n\t\t[new RegExp(`-thinking-(${alternation})$`), true],\n\t\t[new RegExp(`-(${alternation})-thinking$`), true],\n\t];\n\tfor (const [pattern, flag] of patterns) {\n\t\tconst match = rest.match(pattern);\n\t\tif (match) {\n\t\t\tlevel = match[1];\n\t\t\tthinking = flag;\n\t\t\trest = rest.slice(0, match.index);\n\t\t\treturn { baseId: rest, level, thinking, fast, originalId };\n\t\t}\n\t}\n\tif (rest.endsWith(\"-thinking\")) {\n\t\treturn { baseId: rest.slice(0, -9), level, thinking: true, fast, originalId };\n\t}\n\tconst levelMatch = rest.match(new RegExp(`-(${alternation})$`));\n\tif (levelMatch) {\n\t\tlevel = levelMatch[1];\n\t\tthinking = false;\n\t\trest = rest.slice(0, levelMatch.index);\n\t}\n\treturn { baseId: rest, level, thinking, fast, originalId };\n}\n\nexport function getCursorVariantAlias(originalId: string): CursorVariantAlias | undefined {\n\treturn ALIASES[originalId];\n}\n\n/** Resolve any known variant id to its selectable base identity; unknown ids return undefined. */\nexport function getCursorBaseIdForVariant(originalId: string): string | undefined {\n\tconst alias = ALIASES[originalId];\n\tif (alias) {\n\t\tconst parsed = parseCursorVariantId(alias.targetId);\n\t\treturn parsed.baseId;\n\t}\n\treturn undefined;\n}\n\nexport function getCursorCapabilityForBase(baseId: string): CursorModelCapability | undefined {\n\treturn CURSOR_MODEL_CAPABILITIES[baseId];\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"selection-descriptor.js","sourceRoot":"","sources":["../../src/cursor/selection-descriptor.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CursorAgentCompat, Model } from \"../model.ts\";\nimport type { ModelThinkingLevel, ThinkingSelection } from \"../types.ts\";\nimport {\n\tCURSOR_MODEL_CAPABILITIES,\n\ttype CursorLevelSpec,\n\ttype CursorParameterId,\n\tgetCursorVariantAlias,\n} from \"./model-capabilities.ts\";\n\nexport interface CursorResolvedSelection {\n\treadonly modelId: string;\n\treadonly parameters: readonly { readonly id: CursorParameterId; readonly value: string }[];\n}\n\nfunction identityCompat(model: Model<\"cursor-agent\">): CursorAgentCompat[\"cursorReasoning\"] {\n\treturn model.compat?.cursorReasoning;\n}\n\ntype CursorReasoningIdentity = NonNullable<CursorAgentCompat[\"cursorReasoning\"]>;\n\n/**\n * Catalog-guaranteed suffix alias for a base + level, or undefined. Cursor Run\n * rejects bare capability ids with Connect `not_found` (issue #1008; live\n * probes 2026-08-20), so every resolvable level prefers the suffix variant id\n * the `GetUsableModels` catalog actually serves. Candidates try the level's\n * wire value first, then the level token itself (`extra-high` vs `xhigh`),\n * with thinking-infixed forms for thinking Claude identities.\n */\nfunction suffixAliasId(\n\tcompat: CursorReasoningIdentity,\n\tlevel: ModelThinkingLevel,\n\tspec: CursorLevelSpec,\n): string | undefined {\n\tconst suffixes = level === \"off\" ? [\"none\"] : spec.value === level ? [spec.value] : [spec.value, level];\n\tfor (const suffix of suffixes) {\n\t\tconst candidates =\n\t\t\tcompat.thinkingMode === true\n\t\t\t\t? [`${compat.capabilityId}-thinking-${suffix}`, `${compat.capabilityId}-${suffix}-thinking`]\n\t\t\t\t: [`${compat.capabilityId}-${suffix}`];\n\t\tfor (const candidate of candidates) {\n\t\t\tconst alias = getCursorVariantAlias(candidate);\n\t\t\tif (alias) return alias.legacyVariantId;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction buildParameters(\n\tcapabilityId: string,\n\tvalue: string,\n\tthinkingMode: boolean | undefined,\n): { id: CursorParameterId; value: string }[] {\n\tconst capability = CURSOR_MODEL_CAPABILITIES[capabilityId];\n\tif (!capability) return [];\n\tconst out: { id: CursorParameterId; value: string }[] = [];\n\tfor (const id of capability.parameterOrder) {\n\t\tswitch (id) {\n\t\t\tcase \"thinking\":\n\t\t\t\tout.push({ id, value: thinkingMode === true ? \"true\" : \"false\" });\n\t\t\t\tbreak;\n\t\t\tcase \"context\": {\n\t\t\t\tconst context = capability.requestContext ?? capability.defaultContext;\n\t\t\t\tif (context !== undefined) out.push({ id, value: context });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"effort\":\n\t\t\tcase \"reasoning\":\n\t\t\t\tout.push({ id, value });\n\t\t\t\tbreak;\n\t\t\tcase \"fast\":\n\t\t\t\tout.push({ id, value: \"false\" });\n\t\t\t\tbreak;\n\t\t}\n\t}\n\treturn out;\n}\n\n/**\n * Resolve a Cursor model + thinking selection to its wire descriptor: the exact\n * model id plus ordered parameters. Both Cursor transports consume this; the\n * native lane renders parameters into protobuf, the CLI lane renders a model\n * string. Absent/unsupported selections return the representative or upstream\n * id with zero parameters.\n */\nexport function resolveCursorSelectionDescriptor(\n\tmodel: Model<\"cursor-agent\">,\n\tselection: ThinkingSelection | undefined,\n): CursorResolvedSelection {\n\tconst compat = identityCompat(model);\n\tconst fallback: CursorResolvedSelection = { modelId: model.upstreamModelId ?? model.id, parameters: [] };\n\tif (!compat) return fallback;\n\n\tif (selection === undefined) {\n\t\treturn { modelId: compat.representativeVariantId, parameters: [] };\n\t}\n\n\tif (selection.source === \"legacy-variant\") {\n\t\tif (selection.legacyVariantId === undefined || getCursorVariantAlias(selection.legacyVariantId) === undefined) {\n\t\t\treturn { modelId: compat.representativeVariantId, parameters: [] };\n\t\t}\n\t\treturn { modelId: selection.legacyVariantId, parameters: [] };\n\t}\n\n\tconst capability = CURSOR_MODEL_CAPABILITIES[compat.capabilityId];\n\tconst spec = capability?.levels[selection.level];\n\tif (!capability || !spec) {\n\t\treturn { modelId: compat.representativeVariantId, parameters: [] };\n\t}\n\n\tconst suffixId = suffixAliasId(compat, selection.level, spec);\n\tif (suffixId !== undefined) return { modelId: suffixId, parameters: [] };\n\n\tif (spec.encoding === \"variant-id\") {\n\t\treturn { modelId: compat.representativeVariantId, parameters: [] };\n\t}\n\n\treturn {\n\t\tmodelId: compat.capabilityId,\n\t\tparameters: buildParameters(compat.capabilityId, spec.value, compat.thinkingMode),\n\t};\n}\n\n/** Render the resolved descriptor as one CLI `--model` argv element (bracket or suffix form). */\nexport function renderCursorCliModelString(\n\tmodel: Model<\"cursor-agent\">,\n\tselection: ThinkingSelection | undefined,\n): string {\n\tconst resolved = resolveCursorSelectionDescriptor(model, selection);\n\tif (resolved.parameters.length === 0) return resolved.modelId;\n\tconst args = resolved.parameters.map((parameter) => `${parameter.id}=${parameter.value}`).join(\",\");\n\treturn `${resolved.modelId}[${args}]`;\n}\n"]}
1
+ {"version":3,"file":"selection-descriptor.js","sourceRoot":"","sources":["../../src/cursor/selection-descriptor.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CursorAgentCompat, Model } from \"../model.ts\";\nimport type { ModelThinkingLevel, ThinkingSelection } from \"../types.ts\";\nimport {\n\tCURSOR_MODEL_CAPABILITIES,\n\ttype CursorLevelSpec,\n\ttype CursorParameterId,\n\tgetCursorVariantAlias,\n} from \"./model-capabilities.ts\";\n\nexport interface CursorResolvedSelection {\n\treadonly modelId: string;\n\treadonly parameters: readonly { readonly id: CursorParameterId; readonly value: string }[];\n}\n\nfunction identityCompat(model: Model<\"cursor-agent\">): CursorAgentCompat[\"cursorReasoning\"] {\n\treturn model.compat?.cursorReasoning;\n}\n\ntype CursorReasoningIdentity = NonNullable<CursorAgentCompat[\"cursorReasoning\"]>;\n\n/**\n * Catalog-guaranteed suffix alias for a base + level, or undefined. Cursor Run\n * rejects bare capability ids with Connect `not_found` (issue #1008; live\n * probes 2026-08-20), so every resolvable level prefers the suffix variant id\n * the `GetUsableModels` catalog actually serves. Candidates try the level's\n * wire value first, then the level token itself (`extra-high` vs `xhigh`),\n * with thinking-infixed forms for thinking Claude identities.\n */\nfunction suffixAliasId(\n\tcompat: CursorReasoningIdentity,\n\tlevel: ModelThinkingLevel,\n\tspec: CursorLevelSpec,\n): string | undefined {\n\tconst suffixes = level === \"off\" ? [\"none\"] : spec.value === level ? [spec.value] : [spec.value, level];\n\tfor (const suffix of suffixes) {\n\t\tconst candidates =\n\t\t\tcompat.thinkingMode === true\n\t\t\t\t? [`${compat.capabilityId}-thinking-${suffix}`, `${compat.capabilityId}-${suffix}-thinking`]\n\t\t\t\t: [`${compat.capabilityId}-${suffix}`];\n\t\tfor (const candidate of candidates) {\n\t\t\tconst alias = getCursorVariantAlias(candidate);\n\t\t\tif (alias) return alias.legacyVariantId;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction buildParameters(\n\tcapabilityId: string,\n\tvalue: string,\n\tthinkingMode: boolean | undefined,\n): { id: CursorParameterId; value: string }[] {\n\tconst capability = CURSOR_MODEL_CAPABILITIES[capabilityId];\n\tif (!capability) return [];\n\tconst out: { id: CursorParameterId; value: string }[] = [];\n\tfor (const id of capability.parameterOrder) {\n\t\tswitch (id) {\n\t\t\tcase \"thinking\":\n\t\t\t\tout.push({ id, value: thinkingMode === true ? \"true\" : \"false\" });\n\t\t\t\tbreak;\n\t\t\tcase \"context\": {\n\t\t\t\tconst context = capability.requestContext ?? capability.defaultContext;\n\t\t\t\tif (context !== undefined) out.push({ id, value: context });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"effort\":\n\t\t\tcase \"reasoning\":\n\t\t\t\tout.push({ id, value });\n\t\t\t\tbreak;\n\t\t\tcase \"fast\":\n\t\t\t\tout.push({ id, value: \"false\" });\n\t\t\t\tbreak;\n\t\t}\n\t}\n\treturn out;\n}\n\n/**\n * Resolve a Cursor model + thinking selection to its wire descriptor: the exact\n * model id plus ordered parameters. Both Cursor transports consume this; the\n * native lane renders parameters into protobuf, the CLI lane renders a model\n * string. Absent/unsupported selections return the representative or upstream\n * id with zero parameters.\n */\nexport function resolveCursorSelectionDescriptor(\n\tmodel: Model<\"cursor-agent\">,\n\tselection: ThinkingSelection | undefined,\n): CursorResolvedSelection {\n\tconst compat = identityCompat(model);\n\tconst fallback: CursorResolvedSelection = { modelId: model.upstreamModelId ?? model.id, parameters: [] };\n\tif (!compat) return fallback;\n\n\tif (selection === undefined) {\n\t\treturn { modelId: compat.representativeVariantId, parameters: [] };\n\t}\n\n\tif (selection.source === \"legacy-variant\") {\n\t\tif (selection.legacyVariantId === undefined || getCursorVariantAlias(selection.legacyVariantId) === undefined) {\n\t\t\treturn { modelId: compat.representativeVariantId, parameters: [] };\n\t\t}\n\t\treturn { modelId: selection.legacyVariantId, parameters: [] };\n\t}\n\n\tconst capability = CURSOR_MODEL_CAPABILITIES[compat.capabilityId];\n\tconst spec = capability?.levels[selection.level];\n\tif (!capability || !spec) {\n\t\treturn { modelId: compat.representativeVariantId, parameters: [] };\n\t}\n\n\tconst suffixId = suffixAliasId(compat, selection.level, spec);\n\tif (suffixId !== undefined) return { modelId: suffixId, parameters: [] };\n\n\tif (spec.encoding === \"variant-id\") {\n\t\treturn { modelId: compat.representativeVariantId, parameters: [] };\n\t}\n\n\treturn {\n\t\tmodelId: compat.capabilityId,\n\t\tparameters: buildParameters(compat.capabilityId, spec.value, compat.thinkingMode),\n\t};\n}\n\n/** Render the resolved descriptor as one CLI `--model` argv element (bracket or suffix form). */\nexport function renderCursorCliModelString(\n\tmodel: Model<\"cursor-agent\">,\n\tselection: ThinkingSelection | undefined,\n): string {\n\tconst resolved = resolveCursorSelectionDescriptor(model, selection);\n\tif (resolved.parameters.length === 0) return resolved.modelId;\n\tconst args = resolved.parameters.map((parameter) => `${parameter.id}=${parameter.value}`).join(\",\");\n\treturn `${resolved.modelId}[${args}]`;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"env-api-keys.d.ts","sourceRoot":"","sources":["../src/env-api-keys.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG7D,eAAO,MAAM,wBAAwB,yBAAyB,CAAC;AAC/D,eAAO,MAAM,yBAAyB,0BAA0B,CAAC;AACjE,eAAO,MAAM,qBAAqB,sBAAsB,CAAC;AAqCzD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,SAAS,CAuDhF;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,CAAC,EAAE,WAAW,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;AAC9F,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,WAAW,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;AASvF;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,CAAC;AAC7F,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,CAAC"}
1
+ {"version":3,"file":"env-api-keys.d.ts","sourceRoot":"","sources":["../src/env-api-keys.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG7D,eAAO,MAAM,wBAAwB,yBAAyB,CAAC;AAC/D,eAAO,MAAM,yBAAyB,0BAA0B,CAAC;AACjE,eAAO,MAAM,qBAAqB,sBAAsB,CAAC;AAqCzD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,GAAG,SAAS,CAwDhF;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,CAAC,EAAE,WAAW,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;AAC9F,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,WAAW,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;AASvF;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,CAAC;AAC7F,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,CAAC"}
@@ -89,6 +89,7 @@ export function getApiKeyEnvVars(provider) {
89
89
  "google-vertex": "GOOGLE_CLOUD_API_KEY",
90
90
  groq: "GROQ_API_KEY",
91
91
  cerebras: "CEREBRAS_API_KEY",
92
+ venice: "VENICE_API_KEY",
92
93
  xai: "XAI_API_KEY",
93
94
  radius: "RADIUS_API_KEY",
94
95
  openrouter: "OPENROUTER_API_KEY",
@@ -1 +1 @@
1
- {"version":3,"file":"env-api-keys.js","sourceRoot":"","sources":["../src/env-api-keys.ts"],"names":[],"mappings":"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","sourcesContent":["// NEVER convert to top-level imports - breaks browser/Vite builds\nlet _existsSync: typeof import(\"node:fs\").existsSync | null = null;\nlet _homedir: typeof import(\"node:os\").homedir | null = null;\nlet _join: typeof import(\"node:path\").join | null = null;\n\ntype DynamicImport = (specifier: string) => Promise<unknown>;\n\nconst dynamicImport: DynamicImport = (specifier) => import(specifier);\nconst NODE_FS_SPECIFIER = \"node:\" + \"fs\";\nconst NODE_OS_SPECIFIER = \"node:\" + \"os\";\nconst NODE_PATH_SPECIFIER = \"node:\" + \"path\";\n\n// Eagerly load in Node.js/Bun environment only\nif (typeof process !== \"undefined\" && (process.versions?.node || process.versions?.bun)) {\n\tdynamicImport(NODE_FS_SPECIFIER).then((m) => {\n\t\t_existsSync = (m as typeof import(\"node:fs\")).existsSync;\n\t});\n\tdynamicImport(NODE_OS_SPECIFIER).then((m) => {\n\t\t_homedir = (m as typeof import(\"node:os\")).homedir;\n\t});\n\tdynamicImport(NODE_PATH_SPECIFIER).then((m) => {\n\t\t_join = (m as typeof import(\"node:path\")).join;\n\t});\n}\n\nimport type { KnownProvider, ProviderEnv } from \"./types.ts\";\nimport { getProviderEnvValue } from \"./utils/provider-env.ts\";\n\nexport const ANTHROPIC_AUTH_TOKEN_ENV = \"ANTHROPIC_AUTH_TOKEN\";\nexport const ANTHROPIC_OAUTH_TOKEN_ENV = \"ANTHROPIC_OAUTH_TOKEN\";\nexport const ANTHROPIC_API_KEY_ENV = \"ANTHROPIC_API_KEY\";\n\nlet cachedVertexAdcCredentialsExists: boolean | null = null;\n\nfunction hasVertexAdcCredentials(env?: ProviderEnv): boolean {\n\tconst explicitCredentialsPath = env?.GOOGLE_APPLICATION_CREDENTIALS;\n\tif (explicitCredentialsPath) {\n\t\treturn _existsSync ? _existsSync(explicitCredentialsPath) : false;\n\t}\n\n\tif (cachedVertexAdcCredentialsExists === null) {\n\t\t// If node modules haven't loaded yet (async import race at startup),\n\t\t// return false WITHOUT caching so the next call retries once they're ready.\n\t\t// Only cache false permanently in a browser environment where fs is never available.\n\t\tif (!_existsSync || !_homedir || !_join) {\n\t\t\tconst isNode = typeof process !== \"undefined\" && (process.versions?.node || process.versions?.bun);\n\t\t\tif (!isNode) {\n\t\t\t\t// Definitively in a browser — safe to cache false permanently\n\t\t\t\tcachedVertexAdcCredentialsExists = false;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\t// Check GOOGLE_APPLICATION_CREDENTIALS env var first (standard way)\n\t\tconst gacPath = getProviderEnvValue(\"GOOGLE_APPLICATION_CREDENTIALS\", env);\n\t\tif (gacPath) {\n\t\t\tcachedVertexAdcCredentialsExists = _existsSync(gacPath);\n\t\t} else {\n\t\t\t// Fall back to default ADC path (lazy evaluation)\n\t\t\tcachedVertexAdcCredentialsExists = _existsSync(\n\t\t\t\t_join(_homedir(), \".config\", \"gcloud\", \"application_default_credentials.json\"),\n\t\t\t);\n\t\t}\n\t}\n\treturn cachedVertexAdcCredentialsExists;\n}\n\n/**\n * The canonical provider-id to API-key env-var mapping. Exported so numbered\n * env credential slots (`OPENAI_API_KEY_2`, ...) can generalize over the same\n * source of truth instead of duplicating it.\n */\nexport function getApiKeyEnvVars(provider: string): readonly string[] | undefined {\n\tif (provider === \"github-copilot\") {\n\t\treturn [\"COPILOT_GITHUB_TOKEN\"];\n\t}\n\n\t// ANTHROPIC_AUTH_TOKEN participates in env discovery/status, but\n\t// getEnvApiKey() skips it because requests must pass it as Authorization: Bearer.\n\tif (provider === \"anthropic\") {\n\t\treturn [ANTHROPIC_AUTH_TOKEN_ENV, ANTHROPIC_OAUTH_TOKEN_ENV, ANTHROPIC_API_KEY_ENV];\n\t}\n\n\tconst envMap: Record<string, string> = {\n\t\t\"alibaba-token-plan\": \"ALIBABA_TOKEN_PLAN_API_KEY\",\n\t\t\"ant-ling\": \"ANT_LING_API_KEY\",\n\t\t\"qwen-token-plan\": \"QWEN_TOKEN_PLAN_API_KEY\",\n\t\t\"qwen-token-plan-cn\": \"QWEN_TOKEN_PLAN_CN_API_KEY\",\n\t\t\"qwen-token-plan-individual\": \"QWEN_TOKEN_PLAN_API_KEY\",\n\t\topenai: \"OPENAI_API_KEY\",\n\t\tollama: \"OLLAMA_API_KEY\",\n\t\t\"azure-openai-responses\": \"AZURE_OPENAI_API_KEY\",\n\t\tnvidia: \"NVIDIA_API_KEY\",\n\t\tdeepseek: \"DEEPSEEK_API_KEY\",\n\t\tgoogle: \"GEMINI_API_KEY\",\n\t\t\"google-vertex\": \"GOOGLE_CLOUD_API_KEY\",\n\t\tgroq: \"GROQ_API_KEY\",\n\t\tcerebras: \"CEREBRAS_API_KEY\",\n\t\txai: \"XAI_API_KEY\",\n\t\tradius: \"RADIUS_API_KEY\",\n\t\topenrouter: \"OPENROUTER_API_KEY\",\n\t\t\"vercel-ai-gateway\": \"AI_GATEWAY_API_KEY\",\n\t\topengateway: \"OPENGATEWAY_API_KEY\",\n\t\tzai: \"ZAI_API_KEY\",\n\t\t\"zai-coding-cn\": \"ZAI_CODING_CN_API_KEY\",\n\t\tmistral: \"MISTRAL_API_KEY\",\n\t\tminimax: \"MINIMAX_API_KEY\",\n\t\t\"minimax-cn\": \"MINIMAX_CN_API_KEY\",\n\t\tmoonshotai: \"MOONSHOT_API_KEY\",\n\t\t\"moonshotai-cn\": \"MOONSHOT_API_KEY\",\n\t\thuggingface: \"HF_TOKEN\",\n\t\tfireworks: \"FIREWORKS_API_KEY\",\n\t\ttogether: \"TOGETHER_API_KEY\",\n\t\tbaseten: \"BASETEN_API_KEY\",\n\t\topencode: \"OPENCODE_API_KEY\",\n\t\t\"opencode-go\": \"OPENCODE_API_KEY\",\n\t\t\"kimi-coding\": \"KIMI_API_KEY\",\n\t\t\"cloudflare-workers-ai\": \"CLOUDFLARE_API_KEY\",\n\t\t\"cloudflare-ai-gateway\": \"CLOUDFLARE_API_KEY\",\n\t\txiaomi: \"XIAOMI_API_KEY\",\n\t\t\"xiaomi-token-plan-cn\": \"XIAOMI_TOKEN_PLAN_CN_API_KEY\",\n\t\t\"xiaomi-token-plan-ams\": \"XIAOMI_TOKEN_PLAN_AMS_API_KEY\",\n\t\t\"xiaomi-token-plan-sgp\": \"XIAOMI_TOKEN_PLAN_SGP_API_KEY\",\n\t};\n\n\tconst envVar = envMap[provider];\n\treturn envVar ? [envVar] : undefined;\n}\n\n/**\n * Find configured environment variables that can provide an API key for a provider.\n *\n * This only reports actual API key variables. It intentionally excludes ambient\n * credential sources such as AWS profiles, AWS IAM credentials, and Google\n * Application Default Credentials.\n */\nexport function findEnvKeys(provider: KnownProvider, env?: ProviderEnv): string[] | undefined;\nexport function findEnvKeys(provider: string, env?: ProviderEnv): string[] | undefined;\nexport function findEnvKeys(provider: string, env?: ProviderEnv): string[] | undefined {\n\tconst envVars = getApiKeyEnvVars(provider);\n\tif (!envVars) return undefined;\n\n\tconst found = envVars.filter((envVar) => !!getProviderEnvValue(envVar, env));\n\treturn found.length > 0 ? found : undefined;\n}\n\n/**\n * Get API key for provider from known environment variables, e.g. OPENAI_API_KEY.\n *\n * Will not return API keys for providers that require OAuth tokens.\n */\nexport function getEnvApiKey(provider: KnownProvider, env?: ProviderEnv): string | undefined;\nexport function getEnvApiKey(provider: string, env?: ProviderEnv): string | undefined;\nexport function getEnvApiKey(provider: string, env?: ProviderEnv): string | undefined {\n\tconst envKeys = findEnvKeys(provider, env);\n\tif (envKeys?.[0]) {\n\t\tconst apiKeyEnv = provider === \"anthropic\" ? envKeys.find((key) => key !== ANTHROPIC_AUTH_TOKEN_ENV) : envKeys[0];\n\t\tif (apiKeyEnv) return getProviderEnvValue(apiKeyEnv, env);\n\t}\n\n\t// Vertex AI supports either an explicit API key or Application Default Credentials.\n\t// Auth is configured via `gcloud auth application-default login`.\n\tif (provider === \"google-vertex\") {\n\t\tconst hasCredentials = hasVertexAdcCredentials(env);\n\t\tconst hasProject = !!(\n\t\t\tgetProviderEnvValue(\"GOOGLE_CLOUD_PROJECT\", env) || getProviderEnvValue(\"GCLOUD_PROJECT\", env)\n\t\t);\n\t\tconst hasLocation = !!getProviderEnvValue(\"GOOGLE_CLOUD_LOCATION\", env);\n\n\t\tif (hasCredentials && hasProject && hasLocation) {\n\t\t\treturn \"<authenticated>\";\n\t\t}\n\t}\n\n\tif (provider === \"amazon-bedrock\") {\n\t\t// Amazon Bedrock supports multiple credential sources:\n\t\t// 1. AWS_PROFILE - named profile from ~/.aws/credentials\n\t\t// 2. AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY - standard IAM keys\n\t\t// 3. AWS_BEARER_TOKEN_BEDROCK - Bedrock bearer token\n\t\t// 4. AWS_CONTAINER_CREDENTIALS_RELATIVE_URI - ECS task roles\n\t\t// 5. AWS_CONTAINER_CREDENTIALS_FULL_URI - ECS task roles (full URI)\n\t\t// 6. AWS_WEB_IDENTITY_TOKEN_FILE - IRSA (IAM Roles for Service Accounts)\n\t\tif (\n\t\t\tgetProviderEnvValue(\"AWS_PROFILE\", env) ||\n\t\t\t(getProviderEnvValue(\"AWS_ACCESS_KEY_ID\", env) && getProviderEnvValue(\"AWS_SECRET_ACCESS_KEY\", env)) ||\n\t\t\tgetProviderEnvValue(\"AWS_BEARER_TOKEN_BEDROCK\", env) ||\n\t\t\tgetProviderEnvValue(\"AWS_CONTAINER_CREDENTIALS_RELATIVE_URI\", env) ||\n\t\t\tgetProviderEnvValue(\"AWS_CONTAINER_CREDENTIALS_FULL_URI\", env) ||\n\t\t\tgetProviderEnvValue(\"AWS_WEB_IDENTITY_TOKEN_FILE\", env)\n\t\t) {\n\t\t\treturn \"<authenticated>\";\n\t\t}\n\t}\n\n\treturn undefined;\n}\n"]}
1
+ {"version":3,"file":"env-api-keys.js","sourceRoot":"","sources":["../src/env-api-keys.ts"],"names":[],"mappings":"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","sourcesContent":["// NEVER convert to top-level imports - breaks browser/Vite builds\nlet _existsSync: typeof import(\"node:fs\").existsSync | null = null;\nlet _homedir: typeof import(\"node:os\").homedir | null = null;\nlet _join: typeof import(\"node:path\").join | null = null;\n\ntype DynamicImport = (specifier: string) => Promise<unknown>;\n\nconst dynamicImport: DynamicImport = (specifier) => import(specifier);\nconst NODE_FS_SPECIFIER = \"node:\" + \"fs\";\nconst NODE_OS_SPECIFIER = \"node:\" + \"os\";\nconst NODE_PATH_SPECIFIER = \"node:\" + \"path\";\n\n// Eagerly load in Node.js/Bun environment only\nif (typeof process !== \"undefined\" && (process.versions?.node || process.versions?.bun)) {\n\tdynamicImport(NODE_FS_SPECIFIER).then((m) => {\n\t\t_existsSync = (m as typeof import(\"node:fs\")).existsSync;\n\t});\n\tdynamicImport(NODE_OS_SPECIFIER).then((m) => {\n\t\t_homedir = (m as typeof import(\"node:os\")).homedir;\n\t});\n\tdynamicImport(NODE_PATH_SPECIFIER).then((m) => {\n\t\t_join = (m as typeof import(\"node:path\")).join;\n\t});\n}\n\nimport type { KnownProvider, ProviderEnv } from \"./types.ts\";\nimport { getProviderEnvValue } from \"./utils/provider-env.ts\";\n\nexport const ANTHROPIC_AUTH_TOKEN_ENV = \"ANTHROPIC_AUTH_TOKEN\";\nexport const ANTHROPIC_OAUTH_TOKEN_ENV = \"ANTHROPIC_OAUTH_TOKEN\";\nexport const ANTHROPIC_API_KEY_ENV = \"ANTHROPIC_API_KEY\";\n\nlet cachedVertexAdcCredentialsExists: boolean | null = null;\n\nfunction hasVertexAdcCredentials(env?: ProviderEnv): boolean {\n\tconst explicitCredentialsPath = env?.GOOGLE_APPLICATION_CREDENTIALS;\n\tif (explicitCredentialsPath) {\n\t\treturn _existsSync ? _existsSync(explicitCredentialsPath) : false;\n\t}\n\n\tif (cachedVertexAdcCredentialsExists === null) {\n\t\t// If node modules haven't loaded yet (async import race at startup),\n\t\t// return false WITHOUT caching so the next call retries once they're ready.\n\t\t// Only cache false permanently in a browser environment where fs is never available.\n\t\tif (!_existsSync || !_homedir || !_join) {\n\t\t\tconst isNode = typeof process !== \"undefined\" && (process.versions?.node || process.versions?.bun);\n\t\t\tif (!isNode) {\n\t\t\t\t// Definitively in a browser — safe to cache false permanently\n\t\t\t\tcachedVertexAdcCredentialsExists = false;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\t// Check GOOGLE_APPLICATION_CREDENTIALS env var first (standard way)\n\t\tconst gacPath = getProviderEnvValue(\"GOOGLE_APPLICATION_CREDENTIALS\", env);\n\t\tif (gacPath) {\n\t\t\tcachedVertexAdcCredentialsExists = _existsSync(gacPath);\n\t\t} else {\n\t\t\t// Fall back to default ADC path (lazy evaluation)\n\t\t\tcachedVertexAdcCredentialsExists = _existsSync(\n\t\t\t\t_join(_homedir(), \".config\", \"gcloud\", \"application_default_credentials.json\"),\n\t\t\t);\n\t\t}\n\t}\n\treturn cachedVertexAdcCredentialsExists;\n}\n\n/**\n * The canonical provider-id to API-key env-var mapping. Exported so numbered\n * env credential slots (`OPENAI_API_KEY_2`, ...) can generalize over the same\n * source of truth instead of duplicating it.\n */\nexport function getApiKeyEnvVars(provider: string): readonly string[] | undefined {\n\tif (provider === \"github-copilot\") {\n\t\treturn [\"COPILOT_GITHUB_TOKEN\"];\n\t}\n\n\t// ANTHROPIC_AUTH_TOKEN participates in env discovery/status, but\n\t// getEnvApiKey() skips it because requests must pass it as Authorization: Bearer.\n\tif (provider === \"anthropic\") {\n\t\treturn [ANTHROPIC_AUTH_TOKEN_ENV, ANTHROPIC_OAUTH_TOKEN_ENV, ANTHROPIC_API_KEY_ENV];\n\t}\n\n\tconst envMap: Record<string, string> = {\n\t\t\"alibaba-token-plan\": \"ALIBABA_TOKEN_PLAN_API_KEY\",\n\t\t\"ant-ling\": \"ANT_LING_API_KEY\",\n\t\t\"qwen-token-plan\": \"QWEN_TOKEN_PLAN_API_KEY\",\n\t\t\"qwen-token-plan-cn\": \"QWEN_TOKEN_PLAN_CN_API_KEY\",\n\t\t\"qwen-token-plan-individual\": \"QWEN_TOKEN_PLAN_API_KEY\",\n\t\topenai: \"OPENAI_API_KEY\",\n\t\tollama: \"OLLAMA_API_KEY\",\n\t\t\"azure-openai-responses\": \"AZURE_OPENAI_API_KEY\",\n\t\tnvidia: \"NVIDIA_API_KEY\",\n\t\tdeepseek: \"DEEPSEEK_API_KEY\",\n\t\tgoogle: \"GEMINI_API_KEY\",\n\t\t\"google-vertex\": \"GOOGLE_CLOUD_API_KEY\",\n\t\tgroq: \"GROQ_API_KEY\",\n\t\tcerebras: \"CEREBRAS_API_KEY\",\n\t\tvenice: \"VENICE_API_KEY\",\n\t\txai: \"XAI_API_KEY\",\n\t\tradius: \"RADIUS_API_KEY\",\n\t\topenrouter: \"OPENROUTER_API_KEY\",\n\t\t\"vercel-ai-gateway\": \"AI_GATEWAY_API_KEY\",\n\t\topengateway: \"OPENGATEWAY_API_KEY\",\n\t\tzai: \"ZAI_API_KEY\",\n\t\t\"zai-coding-cn\": \"ZAI_CODING_CN_API_KEY\",\n\t\tmistral: \"MISTRAL_API_KEY\",\n\t\tminimax: \"MINIMAX_API_KEY\",\n\t\t\"minimax-cn\": \"MINIMAX_CN_API_KEY\",\n\t\tmoonshotai: \"MOONSHOT_API_KEY\",\n\t\t\"moonshotai-cn\": \"MOONSHOT_API_KEY\",\n\t\thuggingface: \"HF_TOKEN\",\n\t\tfireworks: \"FIREWORKS_API_KEY\",\n\t\ttogether: \"TOGETHER_API_KEY\",\n\t\tbaseten: \"BASETEN_API_KEY\",\n\t\topencode: \"OPENCODE_API_KEY\",\n\t\t\"opencode-go\": \"OPENCODE_API_KEY\",\n\t\t\"kimi-coding\": \"KIMI_API_KEY\",\n\t\t\"cloudflare-workers-ai\": \"CLOUDFLARE_API_KEY\",\n\t\t\"cloudflare-ai-gateway\": \"CLOUDFLARE_API_KEY\",\n\t\txiaomi: \"XIAOMI_API_KEY\",\n\t\t\"xiaomi-token-plan-cn\": \"XIAOMI_TOKEN_PLAN_CN_API_KEY\",\n\t\t\"xiaomi-token-plan-ams\": \"XIAOMI_TOKEN_PLAN_AMS_API_KEY\",\n\t\t\"xiaomi-token-plan-sgp\": \"XIAOMI_TOKEN_PLAN_SGP_API_KEY\",\n\t};\n\n\tconst envVar = envMap[provider];\n\treturn envVar ? [envVar] : undefined;\n}\n\n/**\n * Find configured environment variables that can provide an API key for a provider.\n *\n * This only reports actual API key variables. It intentionally excludes ambient\n * credential sources such as AWS profiles, AWS IAM credentials, and Google\n * Application Default Credentials.\n */\nexport function findEnvKeys(provider: KnownProvider, env?: ProviderEnv): string[] | undefined;\nexport function findEnvKeys(provider: string, env?: ProviderEnv): string[] | undefined;\nexport function findEnvKeys(provider: string, env?: ProviderEnv): string[] | undefined {\n\tconst envVars = getApiKeyEnvVars(provider);\n\tif (!envVars) return undefined;\n\n\tconst found = envVars.filter((envVar) => !!getProviderEnvValue(envVar, env));\n\treturn found.length > 0 ? found : undefined;\n}\n\n/**\n * Get API key for provider from known environment variables, e.g. OPENAI_API_KEY.\n *\n * Will not return API keys for providers that require OAuth tokens.\n */\nexport function getEnvApiKey(provider: KnownProvider, env?: ProviderEnv): string | undefined;\nexport function getEnvApiKey(provider: string, env?: ProviderEnv): string | undefined;\nexport function getEnvApiKey(provider: string, env?: ProviderEnv): string | undefined {\n\tconst envKeys = findEnvKeys(provider, env);\n\tif (envKeys?.[0]) {\n\t\tconst apiKeyEnv = provider === \"anthropic\" ? envKeys.find((key) => key !== ANTHROPIC_AUTH_TOKEN_ENV) : envKeys[0];\n\t\tif (apiKeyEnv) return getProviderEnvValue(apiKeyEnv, env);\n\t}\n\n\t// Vertex AI supports either an explicit API key or Application Default Credentials.\n\t// Auth is configured via `gcloud auth application-default login`.\n\tif (provider === \"google-vertex\") {\n\t\tconst hasCredentials = hasVertexAdcCredentials(env);\n\t\tconst hasProject = !!(\n\t\t\tgetProviderEnvValue(\"GOOGLE_CLOUD_PROJECT\", env) || getProviderEnvValue(\"GCLOUD_PROJECT\", env)\n\t\t);\n\t\tconst hasLocation = !!getProviderEnvValue(\"GOOGLE_CLOUD_LOCATION\", env);\n\n\t\tif (hasCredentials && hasProject && hasLocation) {\n\t\t\treturn \"<authenticated>\";\n\t\t}\n\t}\n\n\tif (provider === \"amazon-bedrock\") {\n\t\t// Amazon Bedrock supports multiple credential sources:\n\t\t// 1. AWS_PROFILE - named profile from ~/.aws/credentials\n\t\t// 2. AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY - standard IAM keys\n\t\t// 3. AWS_BEARER_TOKEN_BEDROCK - Bedrock bearer token\n\t\t// 4. AWS_CONTAINER_CREDENTIALS_RELATIVE_URI - ECS task roles\n\t\t// 5. AWS_CONTAINER_CREDENTIALS_FULL_URI - ECS task roles (full URI)\n\t\t// 6. AWS_WEB_IDENTITY_TOKEN_FILE - IRSA (IAM Roles for Service Accounts)\n\t\tif (\n\t\t\tgetProviderEnvValue(\"AWS_PROFILE\", env) ||\n\t\t\t(getProviderEnvValue(\"AWS_ACCESS_KEY_ID\", env) && getProviderEnvValue(\"AWS_SECRET_ACCESS_KEY\", env)) ||\n\t\t\tgetProviderEnvValue(\"AWS_BEARER_TOKEN_BEDROCK\", env) ||\n\t\t\tgetProviderEnvValue(\"AWS_CONTAINER_CREDENTIALS_RELATIVE_URI\", env) ||\n\t\t\tgetProviderEnvValue(\"AWS_CONTAINER_CREDENTIALS_FULL_URI\", env) ||\n\t\t\tgetProviderEnvValue(\"AWS_WEB_IDENTITY_TOKEN_FILE\", env)\n\t\t) {\n\t\t\treturn \"<authenticated>\";\n\t\t}\n\t}\n\n\treturn undefined;\n}\n"]}