@codemieai/code 0.14.1 → 0.15.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (298) hide show
  1. package/README.md +23 -0
  2. package/bin/codemie-openwiki.js +18 -0
  3. package/dist/agents/core/AgentCLI.d.ts.map +1 -1
  4. package/dist/agents/core/AgentCLI.js +2 -0
  5. package/dist/agents/core/AgentCLI.js.map +1 -1
  6. package/dist/agents/core/BaseAgentAdapter.d.ts.map +1 -1
  7. package/dist/agents/core/BaseAgentAdapter.js +25 -11
  8. package/dist/agents/core/BaseAgentAdapter.js.map +1 -1
  9. package/dist/agents/core/extension/BaseExtensionInstaller.d.ts +1 -0
  10. package/dist/agents/core/extension/BaseExtensionInstaller.d.ts.map +1 -1
  11. package/dist/agents/core/extension/BaseExtensionInstaller.js +20 -0
  12. package/dist/agents/core/extension/BaseExtensionInstaller.js.map +1 -1
  13. package/dist/agents/core/types.d.ts +8 -0
  14. package/dist/agents/core/types.d.ts.map +1 -1
  15. package/dist/agents/plugins/claude/claude-message-types.d.ts +1 -0
  16. package/dist/agents/plugins/claude/claude-message-types.d.ts.map +1 -1
  17. package/dist/agents/plugins/claude/claude.plugin.d.ts.map +1 -1
  18. package/dist/agents/plugins/claude/claude.plugin.js +60 -6
  19. package/dist/agents/plugins/claude/claude.plugin.js.map +1 -1
  20. package/dist/agents/plugins/claude/plugin/__tests__/statusline.test.ts +26 -4
  21. package/dist/agents/plugins/claude/plugin/hooks/hooks.json +6 -6
  22. package/dist/agents/plugins/claude/plugin/statusline.mjs +5 -1
  23. package/dist/agents/plugins/codemie-code.plugin.d.ts +1 -0
  24. package/dist/agents/plugins/codemie-code.plugin.d.ts.map +1 -1
  25. package/dist/agents/plugins/codemie-code.plugin.js +12 -5
  26. package/dist/agents/plugins/codemie-code.plugin.js.map +1 -1
  27. package/dist/agents/plugins/codex/codex-message-types.d.ts +28 -0
  28. package/dist/agents/plugins/codex/codex-message-types.d.ts.map +1 -1
  29. package/dist/agents/plugins/codex/codex-message-types.js.map +1 -1
  30. package/dist/agents/plugins/codex/codex.plugin.d.ts.map +1 -1
  31. package/dist/agents/plugins/codex/codex.plugin.js +30 -2
  32. package/dist/agents/plugins/codex/codex.plugin.js.map +1 -1
  33. package/dist/agents/plugins/codex/index.d.ts +4 -2
  34. package/dist/agents/plugins/codex/index.d.ts.map +1 -1
  35. package/dist/agents/plugins/codex/index.js +3 -1
  36. package/dist/agents/plugins/codex/index.js.map +1 -1
  37. package/dist/agents/plugins/copilot-cli/copilot-cli.plugin.d.ts.map +1 -1
  38. package/dist/agents/plugins/copilot-cli/copilot-cli.plugin.js +3 -1
  39. package/dist/agents/plugins/copilot-cli/copilot-cli.plugin.js.map +1 -1
  40. package/dist/agents/plugins/gemini/extension/hooks/hooks.json +4 -4
  41. package/dist/agents/plugins/gemini/gemini.models.d.ts +33 -0
  42. package/dist/agents/plugins/gemini/gemini.models.d.ts.map +1 -0
  43. package/dist/agents/plugins/gemini/gemini.models.js +122 -0
  44. package/dist/agents/plugins/gemini/gemini.models.js.map +1 -0
  45. package/dist/agents/plugins/gemini/gemini.plugin.d.ts.map +1 -1
  46. package/dist/agents/plugins/gemini/gemini.plugin.js +6 -0
  47. package/dist/agents/plugins/gemini/gemini.plugin.js.map +1 -1
  48. package/dist/agents/plugins/gemini/gemini.session-adapter.d.ts +1 -1
  49. package/dist/agents/plugins/gemini/gemini.session-adapter.d.ts.map +1 -1
  50. package/dist/agents/plugins/gemini/gemini.session-adapter.js +155 -16
  51. package/dist/agents/plugins/gemini/gemini.session-adapter.js.map +1 -1
  52. package/dist/agents/plugins/gemini/session/processors/gemini.metrics-processor.d.ts.map +1 -1
  53. package/dist/agents/plugins/gemini/session/processors/gemini.metrics-processor.js +77 -31
  54. package/dist/agents/plugins/gemini/session/processors/gemini.metrics-processor.js.map +1 -1
  55. package/dist/agents/plugins/gemini/session/utils/turn-detector.d.ts +1 -1
  56. package/dist/agents/plugins/gemini/session/utils/turn-detector.d.ts.map +1 -1
  57. package/dist/agents/plugins/gemini/session/utils/turn-detector.js +7 -1
  58. package/dist/agents/plugins/gemini/session/utils/turn-detector.js.map +1 -1
  59. package/dist/agents/plugins/openwiki/openwiki.plugin.d.ts +30 -0
  60. package/dist/agents/plugins/openwiki/openwiki.plugin.d.ts.map +1 -0
  61. package/dist/agents/plugins/openwiki/openwiki.plugin.js +73 -0
  62. package/dist/agents/plugins/openwiki/openwiki.plugin.js.map +1 -0
  63. package/dist/agents/plugins/pi/pi.models.d.ts.map +1 -1
  64. package/dist/agents/plugins/pi/pi.models.js +62 -0
  65. package/dist/agents/plugins/pi/pi.models.js.map +1 -1
  66. package/dist/agents/plugins/pi/pi.plugin.d.ts.map +1 -1
  67. package/dist/agents/plugins/pi/pi.plugin.js +7 -3
  68. package/dist/agents/plugins/pi/pi.plugin.js.map +1 -1
  69. package/dist/agents/registry.d.ts.map +1 -1
  70. package/dist/agents/registry.js +2 -0
  71. package/dist/agents/registry.js.map +1 -1
  72. package/dist/bin/proxy-daemon.js +3 -0
  73. package/dist/bin/proxy-daemon.js.map +1 -1
  74. package/dist/cli/commands/analytics/aggregator.d.ts.map +1 -1
  75. package/dist/cli/commands/analytics/aggregator.js +1 -0
  76. package/dist/cli/commands/analytics/aggregator.js.map +1 -1
  77. package/dist/cli/commands/analytics/cost/cost-enricher.d.ts.map +1 -1
  78. package/dist/cli/commands/analytics/cost/cost-enricher.js +6 -1
  79. package/dist/cli/commands/analytics/cost/cost-enricher.js.map +1 -1
  80. package/dist/cli/commands/analytics/cost/types.d.ts +8 -0
  81. package/dist/cli/commands/analytics/cost/types.d.ts.map +1 -1
  82. package/dist/cli/commands/analytics/report/client/app.js +111 -1
  83. package/dist/cli/commands/analytics/report/payload-builder.d.ts.map +1 -1
  84. package/dist/cli/commands/analytics/report/payload-builder.js +6 -0
  85. package/dist/cli/commands/analytics/report/payload-builder.js.map +1 -1
  86. package/dist/cli/commands/analytics/report/template.html +9 -0
  87. package/dist/cli/commands/analytics/report/types.d.ts +1 -0
  88. package/dist/cli/commands/analytics/report/types.d.ts.map +1 -1
  89. package/dist/cli/commands/analytics/types.d.ts +1 -0
  90. package/dist/cli/commands/analytics/types.d.ts.map +1 -1
  91. package/dist/cli/commands/assistants/chat/claudeUploadsDetector.d.ts.map +1 -1
  92. package/dist/cli/commands/assistants/chat/claudeUploadsDetector.js +43 -67
  93. package/dist/cli/commands/assistants/chat/claudeUploadsDetector.js.map +1 -1
  94. package/dist/cli/commands/assistants/chat/codexUploadsDetector.d.ts +26 -0
  95. package/dist/cli/commands/assistants/chat/codexUploadsDetector.d.ts.map +1 -0
  96. package/dist/cli/commands/assistants/chat/codexUploadsDetector.js +240 -0
  97. package/dist/cli/commands/assistants/chat/codexUploadsDetector.js.map +1 -0
  98. package/dist/cli/commands/assistants/chat/historyLoader.d.ts +2 -2
  99. package/dist/cli/commands/assistants/chat/historyLoader.d.ts.map +1 -1
  100. package/dist/cli/commands/assistants/chat/historyLoader.js.map +1 -1
  101. package/dist/cli/commands/assistants/chat/index.d.ts.map +1 -1
  102. package/dist/cli/commands/assistants/chat/index.js +14 -3
  103. package/dist/cli/commands/assistants/chat/index.js.map +1 -1
  104. package/dist/cli/commands/assistants/setup/data.d.ts.map +1 -1
  105. package/dist/cli/commands/assistants/setup/data.js +7 -0
  106. package/dist/cli/commands/assistants/setup/data.js.map +1 -1
  107. package/dist/cli/commands/assistants/setup/selection/utils.d.ts +3 -3
  108. package/dist/cli/commands/assistants/setup/selection/utils.d.ts.map +1 -1
  109. package/dist/cli/commands/assistants/setup/selection/utils.js.map +1 -1
  110. package/dist/cli/commands/docs.d.ts +12 -0
  111. package/dist/cli/commands/docs.d.ts.map +1 -0
  112. package/dist/cli/commands/docs.js +141 -0
  113. package/dist/cli/commands/docs.js.map +1 -0
  114. package/dist/cli/commands/install.d.ts.map +1 -1
  115. package/dist/cli/commands/install.js +30 -18
  116. package/dist/cli/commands/install.js.map +1 -1
  117. package/dist/cli/commands/log/filter.js +1 -1
  118. package/dist/cli/commands/log/filter.js.map +1 -1
  119. package/dist/cli/commands/log/formatter.d.ts.map +1 -1
  120. package/dist/cli/commands/log/formatter.js +1 -0
  121. package/dist/cli/commands/log/formatter.js.map +1 -1
  122. package/dist/cli/commands/log/parser.d.ts.map +1 -1
  123. package/dist/cli/commands/log/parser.js +2 -0
  124. package/dist/cli/commands/log/parser.js.map +1 -1
  125. package/dist/cli/commands/log/types.d.ts +1 -1
  126. package/dist/cli/commands/log/types.d.ts.map +1 -1
  127. package/dist/cli/commands/models.d.ts.map +1 -1
  128. package/dist/cli/commands/models.js +12 -2
  129. package/dist/cli/commands/models.js.map +1 -1
  130. package/dist/cli/commands/profile/display.d.ts +3 -3
  131. package/dist/cli/commands/profile/display.d.ts.map +1 -1
  132. package/dist/cli/commands/profile/display.js +6 -6
  133. package/dist/cli/commands/profile/display.js.map +1 -1
  134. package/dist/cli/commands/profile/index.d.ts.map +1 -1
  135. package/dist/cli/commands/profile/index.js +4 -2
  136. package/dist/cli/commands/profile/index.js.map +1 -1
  137. package/dist/cli/commands/proxy/connect-orchestrator.d.ts +9 -0
  138. package/dist/cli/commands/proxy/connect-orchestrator.d.ts.map +1 -1
  139. package/dist/cli/commands/proxy/connect-orchestrator.js +15 -1
  140. package/dist/cli/commands/proxy/connect-orchestrator.js.map +1 -1
  141. package/dist/cli/commands/proxy/connectors/codex-desktop.d.ts +1 -1
  142. package/dist/cli/commands/proxy/connectors/codex-desktop.d.ts.map +1 -1
  143. package/dist/cli/commands/proxy/connectors/codex-desktop.js +19 -9
  144. package/dist/cli/commands/proxy/connectors/codex-desktop.js.map +1 -1
  145. package/dist/cli/commands/proxy/connectors/desktop.d.ts.map +1 -1
  146. package/dist/cli/commands/proxy/connectors/desktop.js +9 -0
  147. package/dist/cli/commands/proxy/connectors/desktop.js.map +1 -1
  148. package/dist/cli/commands/proxy/daemon-manager.d.ts +2 -0
  149. package/dist/cli/commands/proxy/daemon-manager.d.ts.map +1 -1
  150. package/dist/cli/commands/proxy/daemon-manager.js +2 -0
  151. package/dist/cli/commands/proxy/daemon-manager.js.map +1 -1
  152. package/dist/cli/commands/proxy/index.d.ts.map +1 -1
  153. package/dist/cli/commands/proxy/index.js +44 -2
  154. package/dist/cli/commands/proxy/index.js.map +1 -1
  155. package/dist/cli/commands/setup.d.ts +0 -16
  156. package/dist/cli/commands/setup.d.ts.map +1 -1
  157. package/dist/cli/commands/setup.js +8 -126
  158. package/dist/cli/commands/setup.js.map +1 -1
  159. package/dist/cli/commands/shared/api-response-guard.d.ts +20 -0
  160. package/dist/cli/commands/shared/api-response-guard.d.ts.map +1 -0
  161. package/dist/cli/commands/shared/api-response-guard.js +31 -0
  162. package/dist/cli/commands/shared/api-response-guard.js.map +1 -0
  163. package/dist/cli/commands/skills/setup/data.d.ts.map +1 -1
  164. package/dist/cli/commands/skills/setup/data.js +8 -0
  165. package/dist/cli/commands/skills/setup/data.js.map +1 -1
  166. package/dist/cli/index.js +2 -0
  167. package/dist/cli/index.js.map +1 -1
  168. package/dist/env/types.d.ts +22 -15
  169. package/dist/env/types.d.ts.map +1 -1
  170. package/dist/env/types.js.map +1 -1
  171. package/dist/frameworks/core/registry.d.ts +6 -0
  172. package/dist/frameworks/core/registry.d.ts.map +1 -1
  173. package/dist/frameworks/core/registry.js +8 -0
  174. package/dist/frameworks/core/registry.js.map +1 -1
  175. package/dist/frameworks/core/types.d.ts +7 -0
  176. package/dist/frameworks/core/types.d.ts.map +1 -1
  177. package/dist/frameworks/plugins/codebase-memory.plugin.d.ts.map +1 -1
  178. package/dist/frameworks/plugins/codebase-memory.plugin.js +1 -0
  179. package/dist/frameworks/plugins/codebase-memory.plugin.js.map +1 -1
  180. package/dist/frameworks/plugins/codegraph.plugin.d.ts +17 -0
  181. package/dist/frameworks/plugins/codegraph.plugin.d.ts.map +1 -0
  182. package/dist/frameworks/plugins/codegraph.plugin.js +74 -0
  183. package/dist/frameworks/plugins/codegraph.plugin.js.map +1 -0
  184. package/dist/frameworks/plugins/graphify.plugin.d.ts +20 -0
  185. package/dist/frameworks/plugins/graphify.plugin.d.ts.map +1 -0
  186. package/dist/frameworks/plugins/graphify.plugin.js +92 -0
  187. package/dist/frameworks/plugins/graphify.plugin.js.map +1 -0
  188. package/dist/frameworks/plugins/index.d.ts +2 -0
  189. package/dist/frameworks/plugins/index.d.ts.map +1 -1
  190. package/dist/frameworks/plugins/index.js +6 -0
  191. package/dist/frameworks/plugins/index.js.map +1 -1
  192. package/dist/hooks/executor.d.ts +2 -0
  193. package/dist/hooks/executor.d.ts.map +1 -1
  194. package/dist/hooks/executor.js +14 -1
  195. package/dist/hooks/executor.js.map +1 -1
  196. package/dist/migrations/001-config-rename.migration.d.ts +0 -1
  197. package/dist/migrations/001-config-rename.migration.d.ts.map +1 -1
  198. package/dist/migrations/001-config-rename.migration.js +0 -1
  199. package/dist/migrations/001-config-rename.migration.js.map +1 -1
  200. package/dist/migrations/002-consolidate-sessions.migration.d.ts +0 -1
  201. package/dist/migrations/002-consolidate-sessions.migration.d.ts.map +1 -1
  202. package/dist/migrations/002-consolidate-sessions.migration.js +0 -1
  203. package/dist/migrations/002-consolidate-sessions.migration.js.map +1 -1
  204. package/dist/migrations/003-remove-hooks-node.migration.d.ts +0 -1
  205. package/dist/migrations/003-remove-hooks-node.migration.d.ts.map +1 -1
  206. package/dist/migrations/003-remove-hooks-node.migration.js +0 -1
  207. package/dist/migrations/003-remove-hooks-node.migration.js.map +1 -1
  208. package/dist/migrations/006-resolve-hook-command-paths.migration.d.ts +9 -0
  209. package/dist/migrations/006-resolve-hook-command-paths.migration.d.ts.map +1 -0
  210. package/dist/migrations/006-resolve-hook-command-paths.migration.js +59 -0
  211. package/dist/migrations/006-resolve-hook-command-paths.migration.js.map +1 -0
  212. package/dist/migrations/007-decouple-provider-workspace-config.migration.d.ts +10 -0
  213. package/dist/migrations/007-decouple-provider-workspace-config.migration.d.ts.map +1 -0
  214. package/dist/migrations/007-decouple-provider-workspace-config.migration.js +118 -0
  215. package/dist/migrations/007-decouple-provider-workspace-config.migration.js.map +1 -0
  216. package/dist/migrations/index.d.ts +2 -0
  217. package/dist/migrations/index.d.ts.map +1 -1
  218. package/dist/migrations/index.js +2 -0
  219. package/dist/migrations/index.js.map +1 -1
  220. package/dist/migrations/types.d.ts +1 -3
  221. package/dist/migrations/types.d.ts.map +1 -1
  222. package/dist/plugins/loaders/hooks-loader.js +1 -1
  223. package/dist/plugins/loaders/hooks-loader.js.map +1 -1
  224. package/dist/providers/core/default-agent-hooks.d.ts.map +1 -1
  225. package/dist/providers/core/default-agent-hooks.js +21 -5
  226. package/dist/providers/core/default-agent-hooks.js.map +1 -1
  227. package/dist/providers/core/types.d.ts +2 -28
  228. package/dist/providers/core/types.d.ts.map +1 -1
  229. package/dist/providers/core/types.js.map +1 -1
  230. package/dist/providers/integration/setup-ui.d.ts +5 -0
  231. package/dist/providers/integration/setup-ui.d.ts.map +1 -1
  232. package/dist/providers/integration/setup-ui.js +17 -2
  233. package/dist/providers/integration/setup-ui.js.map +1 -1
  234. package/dist/providers/plugins/anthropic-subscription/anthropic-subscription.template.d.ts.map +1 -1
  235. package/dist/providers/plugins/anthropic-subscription/anthropic-subscription.template.js +12 -0
  236. package/dist/providers/plugins/anthropic-subscription/anthropic-subscription.template.js.map +1 -1
  237. package/dist/providers/plugins/litellm/litellm.setup-steps.d.ts.map +1 -1
  238. package/dist/providers/plugins/litellm/litellm.setup-steps.js +4 -21
  239. package/dist/providers/plugins/litellm/litellm.setup-steps.js.map +1 -1
  240. package/dist/providers/plugins/ollama/ollama.health.js +1 -1
  241. package/dist/providers/plugins/ollama/ollama.health.js.map +1 -1
  242. package/dist/providers/plugins/ollama/ollama.models.d.ts +29 -2
  243. package/dist/providers/plugins/ollama/ollama.models.d.ts.map +1 -1
  244. package/dist/providers/plugins/ollama/ollama.models.js +103 -22
  245. package/dist/providers/plugins/ollama/ollama.models.js.map +1 -1
  246. package/dist/providers/plugins/ollama/ollama.setup-steps.d.ts.map +1 -1
  247. package/dist/providers/plugins/ollama/ollama.setup-steps.js +71 -8
  248. package/dist/providers/plugins/ollama/ollama.setup-steps.js.map +1 -1
  249. package/dist/providers/plugins/ollama/ollama.template.d.ts.map +1 -1
  250. package/dist/providers/plugins/ollama/ollama.template.js +66 -6
  251. package/dist/providers/plugins/ollama/ollama.template.js.map +1 -1
  252. package/dist/providers/plugins/sso/proxy/plugins/claude-request-normalizer.plugin.d.ts +3 -25
  253. package/dist/providers/plugins/sso/proxy/plugins/claude-request-normalizer.plugin.d.ts.map +1 -1
  254. package/dist/providers/plugins/sso/proxy/plugins/claude-request-normalizer.plugin.js +93 -100
  255. package/dist/providers/plugins/sso/proxy/plugins/claude-request-normalizer.plugin.js.map +1 -1
  256. package/dist/providers/plugins/sso/proxy/plugins/codex-request-normalizer.plugin.js +7 -2
  257. package/dist/providers/plugins/sso/proxy/plugins/codex-request-normalizer.plugin.js.map +1 -1
  258. package/dist/providers/plugins/sso/proxy/plugins/header-injection.plugin.js +5 -1
  259. package/dist/providers/plugins/sso/proxy/plugins/header-injection.plugin.js.map +1 -1
  260. package/dist/providers/plugins/sso/proxy/plugins/sso-auth.plugin.d.ts.map +1 -1
  261. package/dist/providers/plugins/sso/proxy/plugins/sso-auth.plugin.js +32 -3
  262. package/dist/providers/plugins/sso/proxy/plugins/sso-auth.plugin.js.map +1 -1
  263. package/dist/providers/plugins/sso/proxy/proxy-errors.d.ts.map +1 -1
  264. package/dist/providers/plugins/sso/proxy/proxy-errors.js +27 -1
  265. package/dist/providers/plugins/sso/proxy/proxy-errors.js.map +1 -1
  266. package/dist/providers/plugins/sso/proxy/proxy-http-client.d.ts +7 -2
  267. package/dist/providers/plugins/sso/proxy/proxy-http-client.d.ts.map +1 -1
  268. package/dist/providers/plugins/sso/proxy/proxy-http-client.js +191 -15
  269. package/dist/providers/plugins/sso/proxy/proxy-http-client.js.map +1 -1
  270. package/dist/providers/plugins/sso/sso.auth.d.ts.map +1 -1
  271. package/dist/providers/plugins/sso/sso.auth.js +6 -2
  272. package/dist/providers/plugins/sso/sso.auth.js.map +1 -1
  273. package/dist/providers/plugins/sso/sso.setup-steps.d.ts.map +1 -1
  274. package/dist/providers/plugins/sso/sso.setup-steps.js +22 -39
  275. package/dist/providers/plugins/sso/sso.setup-steps.js.map +1 -1
  276. package/dist/utils/config.d.ts +20 -27
  277. package/dist/utils/config.d.ts.map +1 -1
  278. package/dist/utils/config.js +90 -84
  279. package/dist/utils/config.js.map +1 -1
  280. package/dist/utils/hardware.d.ts +36 -0
  281. package/dist/utils/hardware.d.ts.map +1 -0
  282. package/dist/utils/hardware.js +86 -0
  283. package/dist/utils/hardware.js.map +1 -0
  284. package/dist/utils/hook-command.d.ts +4 -0
  285. package/dist/utils/hook-command.d.ts.map +1 -0
  286. package/dist/utils/hook-command.js +82 -0
  287. package/dist/utils/hook-command.js.map +1 -0
  288. package/dist/utils/logger.d.ts +1 -0
  289. package/dist/utils/logger.d.ts.map +1 -1
  290. package/dist/utils/logger.js +21 -0
  291. package/dist/utils/logger.js.map +1 -1
  292. package/dist/utils/pricing.json +24 -0
  293. package/dist/utils/security.d.ts +28 -2
  294. package/dist/utils/security.d.ts.map +1 -1
  295. package/dist/utils/security.js +84 -24
  296. package/dist/utils/security.js.map +1 -1
  297. package/package.json +4 -10
  298. package/scripts/release.sh +3 -3
@@ -8,6 +8,7 @@
8
8
  */
9
9
  import { ProviderRegistry } from '../../core/registry.js';
10
10
  import { OllamaTemplate } from './ollama.template.js';
11
+ import { toCloudOffloadTag } from './ollama.models.js';
11
12
  /**
12
13
  * Ollama setup steps implementation
13
14
  *
@@ -17,7 +18,8 @@ export const OllamaSetupSteps = {
17
18
  name: 'ollama',
18
19
  /**
19
20
  * Get credentials for Ollama
20
- * Ollama runs locally so no API key needed, just verify it's running
21
+ * The local daemon needs no API key; an optional ollama.com API key
22
+ * additionally enables listing models available on Ollama cloud.
21
23
  */
22
24
  async getCredentials() {
23
25
  const inquirer = (await import('inquirer')).default;
@@ -74,26 +76,83 @@ export const OllamaSetupSteps = {
74
76
  healthSpinner.fail(chalk.red('Failed to check Ollama health'));
75
77
  throw error;
76
78
  }
79
+ // Detect system capabilities (with GPU probe) so model selection can
80
+ // recommend only the local models that actually fit this machine
81
+ const { detectSystemCapabilities } = await import('../../../utils/hardware.js');
82
+ const capabilities = await detectSystemCapabilities();
83
+ console.log(chalk.dim(` System: ~${Math.round(capabilities.totalMemoryGb)}GB RAM` +
84
+ (capabilities.gpuMemoryGb ? `, ~${Math.round(capabilities.gpuMemoryGb)}GB GPU VRAM` : '') +
85
+ ` (~${Math.round(capabilities.usableMemoryGb)}GB usable for local models)\n`));
86
+ // Optional ollama.com API key - lets agents run cloud models directly
87
+ // on ollama.com (no local daemon) and unlocks Ollama's web search/fetch
88
+ // API (https://ollama.com/settings/keys). Not needed for local usage.
89
+ const { apiKey: cloudApiKey } = await inquirer.prompt([
90
+ {
91
+ type: 'password',
92
+ name: 'apiKey',
93
+ message: 'Ollama cloud API key (optional, for ollama.com direct access):',
94
+ mask: '*'
95
+ }
96
+ ]);
97
+ let apiKey = (cloudApiKey || '').trim();
98
+ // Validate the key against ollama.com before saving it
99
+ if (apiKey) {
100
+ const keySpinner = ora('Validating Ollama cloud API key...').start();
101
+ const { validateOllamaCloudApiKey } = await import('./ollama.models.js');
102
+ if (await validateOllamaCloudApiKey(apiKey)) {
103
+ keySpinner.succeed(chalk.green('Ollama cloud API key is valid'));
104
+ }
105
+ else {
106
+ keySpinner.fail(chalk.red('Ollama cloud API key validation failed'));
107
+ console.log(chalk.yellow(' Check your key at https://ollama.com/settings/keys\n'));
108
+ const { keepKey } = await inquirer.prompt([
109
+ {
110
+ type: 'confirm',
111
+ name: 'keepKey',
112
+ message: 'Save this key anyway?',
113
+ default: false
114
+ }
115
+ ]);
116
+ if (!keepKey) {
117
+ apiKey = '';
118
+ }
119
+ }
120
+ }
77
121
  return {
78
122
  baseUrl,
79
- apiKey: '' // Ollama doesn't use API keys
123
+ apiKey
80
124
  };
81
125
  },
82
126
  /**
83
127
  * Fetch available models from Ollama
128
+ *
129
+ * Offers installed local models, the template's curated recommendations,
130
+ * and the ollama.com cloud catalog (capability filtering happens in the
131
+ * selection UI via modelMetadata).
132
+ *
133
+ * For local setups (daemon at localhost) cloud catalog entries are mapped
134
+ * to their local cloud-offload tag (`gpt-oss:120b` -> `gpt-oss:120b-cloud`,
135
+ * `kimi-k2.6` -> `kimi-k2.6:cloud`) so selecting one pulls an instant
136
+ * manifest and runs it on Ollama cloud through the signed-in daemon.
137
+ * When the base URL points at ollama.com directly, raw catalog ids are
138
+ * used as-is.
84
139
  */
85
140
  async fetchModels(credentials) {
86
141
  const { OllamaModelProxy } = await import('./ollama.models.js');
87
- const modelProxy = new OllamaModelProxy(credentials.baseUrl);
142
+ const modelProxy = new OllamaModelProxy(credentials.baseUrl, credentials.apiKey);
88
143
  try {
89
144
  const models = await modelProxy.fetchModels({
90
145
  provider: 'ollama',
91
146
  baseUrl: credentials.baseUrl,
92
- apiKey: '',
147
+ apiKey: credentials.apiKey || '',
93
148
  model: 'temp',
94
149
  timeout: 300
95
150
  });
96
- return models.map(m => m.id);
151
+ const isCloudHost = (credentials.baseUrl || '').includes('ollama.com');
152
+ const ids = models.map(m => !isCloudHost && m.metadata?.origin === 'cloud'
153
+ ? toCloudOffloadTag(m.id)
154
+ : m.id);
155
+ return [...new Set([...ids, ...OllamaTemplate.recommendedModels])];
97
156
  }
98
157
  catch {
99
158
  // If fetch fails, return empty so setup prompts the user to enter a
@@ -108,7 +167,7 @@ export const OllamaSetupSteps = {
108
167
  const ora = (await import('ora')).default;
109
168
  const chalk = (await import('chalk')).default;
110
169
  const { OllamaModelProxy } = await import('./ollama.models.js');
111
- const modelProxy = new OllamaModelProxy(credentials.baseUrl);
170
+ const modelProxy = new OllamaModelProxy(credentials.baseUrl, credentials.apiKey);
112
171
  // Check if model is actually installed by querying Ollama directly
113
172
  let isInstalled = false;
114
173
  try {
@@ -143,7 +202,11 @@ export const OllamaSetupSteps = {
143
202
  }
144
203
  catch (error) {
145
204
  installSpinner.fail(chalk.red('Model installation failed'));
146
- throw new Error(`Failed to install model: ${error instanceof Error ? error.message : 'Unknown error'}`);
205
+ const isCloudModel = selectedModel.endsWith('-cloud') || selectedModel.endsWith(':cloud');
206
+ const hint = isCloudModel
207
+ ? ' (cloud models require `ollama signin` or a configured Ollama cloud API key)'
208
+ : '';
209
+ throw new Error(`Failed to install model: ${error instanceof Error ? error.message : 'Unknown error'}${hint}`);
147
210
  }
148
211
  },
149
212
  /**
@@ -159,7 +222,7 @@ export const OllamaSetupSteps = {
159
222
  return {
160
223
  provider: 'ollama',
161
224
  baseUrl,
162
- apiKey: '', // Ollama doesn't use API keys
225
+ apiKey: credentials.apiKey || '', // Optional ollama.com cloud API key
163
226
  model,
164
227
  timeout: 300,
165
228
  debug: false
@@ -1 +1 @@
1
- {"version":3,"file":"ollama.setup-steps.js","sourceRoot":"","sources":["../../../../src/providers/plugins/ollama/ollama.setup-steps.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ollama.setup-steps.js","sourceRoot":"","sources":["../../../../src/providers/plugins/ollama/ollama.setup-steps.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ollama.template.d.ts","sourceRoot":"","sources":["../../../../src/providers/plugins/ollama/ollama.template.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAG5D,eAAO,MAAM,cAAc,kBAsDzB,CAAC"}
1
+ {"version":3,"file":"ollama.template.d.ts","sourceRoot":"","sources":["../../../../src/providers/plugins/ollama/ollama.template.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAG5D,eAAO,MAAM,cAAc,kBAqHzB,CAAC"}
@@ -17,15 +17,66 @@ export const OllamaTemplate = registerProvider({
17
17
  authType: 'none',
18
18
  recommendedModels: [
19
19
  'qwen2.5-coder',
20
- 'qwen3-vl:235b-cloud',
21
- 'deepseek-coder-v2',
22
- 'deepseek-v3.1:671b-cloud'
20
+ 'gpt-oss:120b-cloud',
21
+ 'deepseek-coder-v2'
23
22
  ],
23
+ modelMetadata: {
24
+ 'qwen2.5-coder': {
25
+ name: 'Qwen 2.5 Coder',
26
+ description: 'Excellent coding model with tool support (7B, ~5GB download)',
27
+ popular: true,
28
+ minMemoryGb: 8
29
+ },
30
+ 'gpt-oss:120b-cloud': {
31
+ name: 'GPT-OSS 120B (cloud)',
32
+ description: 'OpenAI open-weight model on Ollama cloud - no local memory required',
33
+ popular: true
34
+ // No minMemoryGb: runs on ollama.com, not on the local machine
35
+ },
36
+ 'deepseek-coder-v2': {
37
+ name: 'DeepSeek Coder V2',
38
+ description: 'Advanced coding model with tool support (16B, ~9GB download)',
39
+ popular: true,
40
+ minMemoryGb: 12
41
+ }
42
+ },
24
43
  capabilities: ['streaming', 'tools', 'embeddings', 'model-management'],
25
44
  supportsModelInstallation: true,
26
45
  healthCheckEndpoint: '/api/version',
27
46
  // Agent lifecycle hooks
28
- agentHooks: {},
47
+ agentHooks: {
48
+ // Wildcard hook: adjust env for ALL agents when running against Ollama.
49
+ // Chained before each agent's own default hooks (see resolveHook).
50
+ '*': {
51
+ beforeRun: async (env, config) => {
52
+ // Claude Code speaks the Anthropic Messages API, which Ollama serves
53
+ // at the host root (https://docs.ollama.com/api/anthropic-compatibility),
54
+ // while the profile baseUrl carries the OpenAI-compatible /v1 suffix.
55
+ if (env.ANTHROPIC_BASE_URL) {
56
+ env.ANTHROPIC_BASE_URL = env.ANTHROPIC_BASE_URL.replace(/\/v1\/?$/, '');
57
+ // Ollama ignores the token but Claude Code requires it to be set.
58
+ // A real ollama.com API key is used when configured (cloud access).
59
+ env.ANTHROPIC_AUTH_TOKEN =
60
+ config.apiKey && config.apiKey !== 'not-required' ? config.apiKey : 'ollama';
61
+ // Model tiers: ollama model names never match the haiku/sonnet/opus
62
+ // auto-selection, so route every tier to the selected model instead
63
+ // of letting Claude Code fall back to its built-in claude-* defaults.
64
+ if (env.CODEMIE_MODEL) {
65
+ if (!env.ANTHROPIC_DEFAULT_HAIKU_MODEL) {
66
+ env.ANTHROPIC_DEFAULT_HAIKU_MODEL = env.CODEMIE_MODEL;
67
+ }
68
+ if (!env.ANTHROPIC_DEFAULT_SONNET_MODEL) {
69
+ env.ANTHROPIC_DEFAULT_SONNET_MODEL = env.CODEMIE_MODEL;
70
+ }
71
+ if (!env.ANTHROPIC_DEFAULT_OPUS_MODEL) {
72
+ env.ANTHROPIC_DEFAULT_OPUS_MODEL = env.CODEMIE_MODEL;
73
+ }
74
+ }
75
+ }
76
+ return env;
77
+ }
78
+ }
79
+ },
29
80
  setupInstructions: `
30
81
  # Ollama Setup Instructions
31
82
 
@@ -47,12 +98,21 @@ Download from: https://ollama.com/download
47
98
  **Important**: Some agents require models with function calling/tool support.
48
99
 
49
100
  - **qwen2.5-coder**: Excellent for coding tasks with tool support (7B, ~5GB)
50
- - **qwen3-vl:235b-cloud**: Latest Qwen with vision and tool support (235B)
101
+ - **gpt-oss:120b-cloud**: OpenAI's open-weight model via Ollama cloud (120B, no download)
51
102
  - **deepseek-coder-v2**: Advanced coding model with tool support (16B, ~9GB)
52
- - **deepseek-v3.1:671b-cloud**: Latest DeepSeek with advanced reasoning (671B)
53
103
 
54
104
  **Note**: Models without tool support (like codellama) will fail with agents that require function calling.
55
105
 
106
+ ## Ollama Cloud (ollama.com)
107
+
108
+ Signed in locally via \`ollama signin\`? The local daemon authenticates cloud
109
+ models automatically - no extra configuration needed to *run* \`-cloud\` models.
110
+ The cloud model catalog is listed automatically during setup (public endpoint).
111
+
112
+ An optional API key from https://ollama.com/settings/keys additionally enables:
113
+ - Running cloud models directly on ollama.com (no local daemon required)
114
+ - Ollama's web search / web fetch API
115
+
56
116
  ## Documentation
57
117
 
58
118
  - Official website: https://ollama.com
@@ -1 +1 @@
1
- {"version":3,"file":"ollama.template.js","sourceRoot":"","sources":["../../../../src/providers/plugins/ollama/ollama.template.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D,MAAM,CAAC,MAAM,cAAc,GAAG,gBAAgB,CAAmB;IAC/D,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,QAAQ;IACrB,WAAW,EAAE,2EAA2E;IACxF,WAAW,EAAE,KAAK;IAClB,cAAc,EAAE,wBAAwB;IACxC,YAAY,EAAE,KAAK;IACnB,QAAQ,EAAE,MAAM;IAChB,iBAAiB,EAAE;QACjB,eAAe;QACf,qBAAqB;QACrB,mBAAmB;QACnB,0BAA0B;KAC3B;IACD,YAAY,EAAE,CAAC,WAAW,EAAE,OAAO,EAAE,YAAY,EAAE,kBAAkB,CAAC;IACtE,yBAAyB,EAAE,IAAI;IAC/B,mBAAmB,EAAE,cAAc;IAEnC,wBAAwB;IACxB,UAAU,EAAE,EAAE;IAEd,iBAAiB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgCpB;CACA,CAAC,CAAC"}
1
+ {"version":3,"file":"ollama.template.js","sourceRoot":"","sources":["../../../../src/providers/plugins/ollama/ollama.template.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D,MAAM,CAAC,MAAM,cAAc,GAAG,gBAAgB,CAAmB;IAC/D,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,QAAQ;IACrB,WAAW,EAAE,2EAA2E;IACxF,WAAW,EAAE,KAAK;IAClB,cAAc,EAAE,wBAAwB;IACxC,YAAY,EAAE,KAAK;IACnB,QAAQ,EAAE,MAAM;IAChB,iBAAiB,EAAE;QACjB,eAAe;QACf,oBAAoB;QACpB,mBAAmB;KACpB;IACD,aAAa,EAAE;QACb,eAAe,EAAE;YACf,IAAI,EAAE,gBAAgB;YACtB,WAAW,EAAE,8DAA8D;YAC3E,OAAO,EAAE,IAAI;YACb,WAAW,EAAE,CAAC;SACf;QACD,oBAAoB,EAAE;YACpB,IAAI,EAAE,sBAAsB;YAC5B,WAAW,EAAE,qEAAqE;YAClF,OAAO,EAAE,IAAI;YACb,+DAA+D;SAChE;QACD,mBAAmB,EAAE;YACnB,IAAI,EAAE,mBAAmB;YACzB,WAAW,EAAE,8DAA8D;YAC3E,OAAO,EAAE,IAAI;YACb,WAAW,EAAE,EAAE;SAChB;KACF;IACD,YAAY,EAAE,CAAC,WAAW,EAAE,OAAO,EAAE,YAAY,EAAE,kBAAkB,CAAC;IACtE,yBAAyB,EAAE,IAAI;IAC/B,mBAAmB,EAAE,cAAc;IAEnC,wBAAwB;IACxB,UAAU,EAAE;QACV,wEAAwE;QACxE,mEAAmE;QACnE,GAAG,EAAE;YACH,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;gBAC/B,qEAAqE;gBACrE,0EAA0E;gBAC1E,sEAAsE;gBACtE,IAAI,GAAG,CAAC,kBAAkB,EAAE,CAAC;oBAC3B,GAAG,CAAC,kBAAkB,GAAG,GAAG,CAAC,kBAAkB,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;oBAExE,kEAAkE;oBAClE,oEAAoE;oBACpE,GAAG,CAAC,oBAAoB;wBACtB,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;oBAE/E,oEAAoE;oBACpE,oEAAoE;oBACpE,sEAAsE;oBACtE,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;wBACtB,IAAI,CAAC,GAAG,CAAC,6BAA6B,EAAE,CAAC;4BACvC,GAAG,CAAC,6BAA6B,GAAG,GAAG,CAAC,aAAa,CAAC;wBACxD,CAAC;wBACD,IAAI,CAAC,GAAG,CAAC,8BAA8B,EAAE,CAAC;4BACxC,GAAG,CAAC,8BAA8B,GAAG,GAAG,CAAC,aAAa,CAAC;wBACzD,CAAC;wBACD,IAAI,CAAC,GAAG,CAAC,4BAA4B,EAAE,CAAC;4BACtC,GAAG,CAAC,4BAA4B,GAAG,GAAG,CAAC,aAAa,CAAC;wBACvD,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,OAAO,GAAG,CAAC;YACb,CAAC;SACF;KACF;IAED,iBAAiB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyCpB;CACA,CAAC,CAAC"}
@@ -1,29 +1,7 @@
1
1
  /**
2
- * Claude Request Normalizer Plugin
3
- * Priority: 14 (runs before RequestSanitizer at 15)
4
- *
5
- * Normalizes Claude API requests to match model-specific requirements.
6
- * Handles thinking parameter variations across Claude model versions:
7
- *
8
- * 1. Models that DO NOT support thinking (e.g. claude-haiku-4-5, 4-6):
9
- * → strips the thinking field entirely to prevent API errors
10
- *
11
- * 2. Models that require adaptive thinking API (e.g. claude-opus-4-7+, claude-sonnet-5):
12
- * → "enabled" → thinking: { type: "adaptive" } + output_config.effort
13
- * → "disabled" → either preserve or delete the field depending on model support
14
- *
15
- * 3. Models that deprecate sampling parameters (e.g. claude-sonnet-5):
16
- * → strips temperature / top_p / top_k entirely to prevent API errors
17
- *
18
- * Problem: Claude Code sends `thinking: { type: "enabled", budget_tokens: N }`.
19
- * - Haiku models reject thinking field with HTTP 400
20
- * - Opus 4-7+ requires adaptive thinking format with output_config.effort
21
- * - Sonnet 5 rejects manual extended thinking and sampling parameters
22
- *
23
- * Scope: Enabled for codemie-claude (Claude Code via SSO proxy), codemie-copilot
24
- * (GitHub Copilot CLI via BYOK Anthropic shape), and claude-desktop (Desktop 3P mode).
25
- *
26
- * To add model support: update NO_THINKING_MODEL_PATTERNS or ADAPTIVE_THINKING_MODEL_PATTERNS.
2
+ * Normalizes Claude API requests per model. Every model-specific decision reads
3
+ * from MODEL_CAPABILITY_TABLE; add/edit a row to change support. Priority 14
4
+ * (before RequestSanitizer at 15). See EPMCDME-14035.
27
5
  */
28
6
  import { ProxyPlugin, PluginContext, ProxyInterceptor } from './types.js';
29
7
  export declare class ClaudeRequestNormalizerPlugin implements ProxyPlugin {
@@ -1 +1 @@
1
- {"version":3,"file":"claude-request-normalizer.plugin.d.ts","sourceRoot":"","sources":["../../../../../../src/providers/plugins/sso/proxy/plugins/claude-request-normalizer.plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAqI1E,qBAAa,6BAA8B,YAAW,WAAW;IAC/D,EAAE,SAA8C;IAChD,IAAI,SAA+B;IACnC,OAAO,SAAW;IAClB,QAAQ,SAAM;IAER,iBAAiB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAS3E"}
1
+ {"version":3,"file":"claude-request-normalizer.plugin.d.ts","sourceRoot":"","sources":["../../../../../../src/providers/plugins/sso/proxy/plugins/claude-request-normalizer.plugin.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AA8J1E,qBAAa,6BAA8B,YAAW,WAAW;IAC/D,EAAE,SAA8C;IAChD,IAAI,SAA+B;IACnC,OAAO,SAAW;IAClB,QAAQ,SAAM;IAER,iBAAiB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAQ3E"}
@@ -1,65 +1,44 @@
1
1
  /**
2
- * Claude Request Normalizer Plugin
3
- * Priority: 14 (runs before RequestSanitizer at 15)
4
- *
5
- * Normalizes Claude API requests to match model-specific requirements.
6
- * Handles thinking parameter variations across Claude model versions:
7
- *
8
- * 1. Models that DO NOT support thinking (e.g. claude-haiku-4-5, 4-6):
9
- * → strips the thinking field entirely to prevent API errors
10
- *
11
- * 2. Models that require adaptive thinking API (e.g. claude-opus-4-7+, claude-sonnet-5):
12
- * → "enabled" → thinking: { type: "adaptive" } + output_config.effort
13
- * → "disabled" → either preserve or delete the field depending on model support
14
- *
15
- * 3. Models that deprecate sampling parameters (e.g. claude-sonnet-5):
16
- * → strips temperature / top_p / top_k entirely to prevent API errors
17
- *
18
- * Problem: Claude Code sends `thinking: { type: "enabled", budget_tokens: N }`.
19
- * - Haiku models reject thinking field with HTTP 400
20
- * - Opus 4-7+ requires adaptive thinking format with output_config.effort
21
- * - Sonnet 5 rejects manual extended thinking and sampling parameters
22
- *
23
- * Scope: Enabled for codemie-claude (Claude Code via SSO proxy), codemie-copilot
24
- * (GitHub Copilot CLI via BYOK Anthropic shape), and claude-desktop (Desktop 3P mode).
25
- *
26
- * To add model support: update NO_THINKING_MODEL_PATTERNS or ADAPTIVE_THINKING_MODEL_PATTERNS.
2
+ * Normalizes Claude API requests per model. Every model-specific decision reads
3
+ * from MODEL_CAPABILITY_TABLE; add/edit a row to change support. Priority 14
4
+ * (before RequestSanitizer at 15). See EPMCDME-14035.
27
5
  */
28
6
  import { logger } from '../../../../../utils/logger.js';
29
- /**
30
- * Model name patterns that DO NOT support thinking at all.
31
- * Matches claude-haiku-3-5, 4-5, and date-tagged variants (e.g. claude-haiku-4-5-20251001).
32
- */
33
- const NO_THINKING_MODEL_PATTERNS = [
34
- /claude-haiku-(3-5|4-5)(?:[^0-9]|$)/i, // claude-haiku-3-5, 4-5 and date-tagged variants
35
- ];
36
- /**
37
- * Model name patterns that require the adaptive thinking API.
38
- * Matches claude-opus-4-7, claude-opus-4-7-20250514, and future date-tagged variants.
39
- * Extend this list as Anthropic migrates additional models — see EPMCDME-11821.
40
- */
41
- const ADAPTIVE_THINKING_MODEL_PATTERNS = [
42
- /claude-opus-4-[7-9](?:[^0-9]|$)/i, // claude-opus-4-7/8/9 and date-tagged variants (e.g. claude-opus-4-7-20250514); excludes claude-opus-4-70+
43
- /claude-sonnet-5(?:[^0-9]|$)/i, // claude-sonnet-5 and date-tagged variants
7
+ // Applied when no MODEL_CAPABILITY_TABLE row matches.
8
+ const DEFAULT_CAPABILITIES = {
9
+ thinking: 'standard',
10
+ effort: false,
11
+ sampling: true,
12
+ preserveDisabledThinking: false,
13
+ };
14
+ // Pattern → capabilities, first match wins. The `(?:[^0-9]|$)` after each version
15
+ // stops `4-7` from matching `4-70`. See EPMCDME-11821 / EPMCDME-14035.
16
+ const MODEL_CAPABILITY_TABLE = [
17
+ {
18
+ // claude-haiku-3-5 / 4-5 (+ date-tagged): no extended thinking at all.
19
+ pattern: /claude-haiku-(3-5|4-5)(?:[^0-9]|$)/i,
20
+ capabilities: { thinking: 'none', effort: false, sampling: true, preserveDisabledThinking: false },
21
+ },
22
+ {
23
+ // claude-opus-4-7/8/9 (+ date-tagged; excludes 4-70+): adaptive thinking + effort.
24
+ pattern: /claude-opus-4-[7-9](?:[^0-9]|$)/i,
25
+ capabilities: { thinking: 'adaptive', effort: true, sampling: true, preserveDisabledThinking: false },
26
+ },
27
+ {
28
+ // claude-sonnet-5 (+ date-tagged): adaptive thinking + effort; rejects manual
29
+ // sampling params; keeps thinking.type="disabled".
30
+ pattern: /claude-sonnet-5(?:[^0-9]|$)/i,
31
+ capabilities: { thinking: 'adaptive', effort: true, sampling: false, preserveDisabledThinking: true },
32
+ },
44
33
  ];
45
- function modelDisablesThinking(modelName) {
46
- return NO_THINKING_MODEL_PATTERNS.some(p => p.test(modelName));
47
- }
48
- function modelRequiresAdaptiveThinking(modelName) {
49
- return ADAPTIVE_THINKING_MODEL_PATTERNS.some(p => p.test(modelName));
50
- }
51
- function modelPreservesDisabledThinking(modelName) {
52
- return /claude-sonnet-5(?:[^0-9]|$)/i.test(modelName);
53
- }
54
- function modelDisablesSamplingParameters(modelName) {
55
- return /claude-sonnet-5(?:[^0-9]|$)/i.test(modelName);
34
+ function capabilitiesFor(model) {
35
+ for (const entry of MODEL_CAPABILITY_TABLE) {
36
+ if (entry.pattern.test(model))
37
+ return entry.capabilities;
38
+ }
39
+ return DEFAULT_CAPABILITIES;
56
40
  }
57
- /**
58
- * Map legacy budget_tokens to the closest output_config.effort level.
59
- *
60
- * budget_tokens was the maximum token budget for thinking in the old API.
61
- * effort is a coarser control in the new API: low / medium / high.
62
- */
41
+ // Map legacy budget_tokens to the coarser new-API effort level.
63
42
  function budgetTokensToEffort(budgetTokens) {
64
43
  const tokens = typeof budgetTokens === 'number' ? budgetTokens : 0;
65
44
  if (tokens <= 2048)
@@ -68,50 +47,66 @@ function budgetTokensToEffort(budgetTokens) {
68
47
  return 'medium';
69
48
  return 'high';
70
49
  }
71
- /**
72
- * Handler: strips thinking field for models that don't support it.
73
- * Returns true if thinking was stripped (early exit), false to continue chain.
74
- */
75
- function handleNoThinkingModels(body, model) {
76
- if (!modelDisablesThinking(model)) {
77
- return false;
78
- }
79
- delete body.thinking;
80
- logger.debug(`[claude-request-normalizer] Stripped thinking field for unsupported model: ${model}`);
81
- return true;
82
- }
83
- /**
84
- * Handler: transforms thinking.type "enabled"/"disabled" to adaptive API format.
85
- * Returns true if transformation applied, false if nothing changed.
86
- */
87
- function handleAdaptiveThinkingTransform(body, model) {
88
- const thinkingType = body.thinking?.type;
89
- if (thinkingType !== 'enabled' && thinkingType !== 'disabled') {
90
- return false;
91
- }
92
- if (!modelRequiresAdaptiveThinking(model)) {
93
- return false;
50
+ // Normalize the thinking field per caps.thinking. Called only when body.thinking is set.
51
+ function handleThinkingField(body, caps, model) {
52
+ if (caps.thinking === 'none') {
53
+ delete body.thinking;
54
+ logger.debug(`[claude-request-normalizer] Stripped thinking field for unsupported model: ${model}`);
55
+ return true;
94
56
  }
95
- if (thinkingType === 'enabled') {
96
- const effort = budgetTokensToEffort(body.thinking.budget_tokens);
97
- body.thinking = { type: 'adaptive' };
98
- if (!body.output_config?.effort) {
99
- body.output_config = { ...(body.output_config ?? {}), effort };
57
+ if (caps.thinking === 'adaptive') {
58
+ const thinkingType = body.thinking?.type;
59
+ if (thinkingType !== 'enabled' && thinkingType !== 'disabled') {
60
+ return false;
100
61
  }
101
- logger.debug(`[claude-request-normalizer] Transformed thinking: "enabled" → "adaptive", effort="${effort}" for model: ${model}`);
102
- }
103
- else {
104
- if (modelPreservesDisabledThinking(model)) {
62
+ if (thinkingType === 'enabled') {
63
+ const effort = budgetTokensToEffort(body.thinking.budget_tokens);
64
+ body.thinking = { type: 'adaptive' };
65
+ if (!body.output_config?.effort) {
66
+ body.output_config = { ...(body.output_config ?? {}), effort };
67
+ }
68
+ logger.debug(`[claude-request-normalizer] Transformed thinking: "enabled" → "adaptive", effort="${effort}" for model: ${model}`);
69
+ return true;
70
+ }
71
+ // thinkingType === 'disabled'
72
+ if (caps.preserveDisabledThinking) {
105
73
  logger.debug(`[claude-request-normalizer] Preserved thinking.type="disabled" for model: ${model}`);
106
74
  return false;
107
75
  }
108
76
  delete body.thinking;
109
77
  logger.debug(`[claude-request-normalizer] Removed unsupported thinking.type="disabled" for model: ${model}`);
78
+ return true;
110
79
  }
111
- return true;
80
+ // 'standard' — leave the thinking field untouched.
81
+ return false;
82
+ }
83
+ // Strip effort for models that reject it: Claude Code's --effort flag becomes
84
+ // output_config.effort (or top-level effort) and 400s on e.g. claude-4-5-sonnet.
85
+ function handleUnsupportedEffort(body, caps, model) {
86
+ if (caps.effort) {
87
+ return false;
88
+ }
89
+ let stripped = false;
90
+ const outputConfig = body.output_config;
91
+ if (outputConfig && typeof outputConfig === 'object' && 'effort' in outputConfig) {
92
+ delete outputConfig.effort;
93
+ stripped = true;
94
+ if (Object.keys(outputConfig).length === 0) {
95
+ delete body.output_config;
96
+ }
97
+ }
98
+ if ('effort' in body) {
99
+ delete body.effort;
100
+ stripped = true;
101
+ }
102
+ if (stripped) {
103
+ logger.debug(`[claude-request-normalizer] Stripped unsupported effort parameter for model: ${model}`);
104
+ }
105
+ return stripped;
112
106
  }
113
- function handleDeprecatedSamplingParams(body, model) {
114
- if (!modelDisablesSamplingParameters(model)) {
107
+ // Strip sampling params (temperature/top_p/top_k) for models that reject them.
108
+ function handleDeprecatedSamplingParams(body, caps, model) {
109
+ if (caps.sampling) {
115
110
  return false;
116
111
  }
117
112
  const stripped = [];
@@ -127,7 +122,6 @@ function handleDeprecatedSamplingParams(body, model) {
127
122
  logger.debug(`[claude-request-normalizer] Stripped deprecated sampling params for model ${model}: ${stripped.join(', ')}`);
128
123
  return true;
129
124
  }
130
- /** Agents whose Claude API requests need thinking normalization */
131
125
  const ALLOWED_AGENTS = ['codemie-claude', 'codemie-copilot', 'claude-desktop'];
132
126
  export class ClaudeRequestNormalizerPlugin {
133
127
  id = '@codemie/proxy-claude-request-normalizer';
@@ -139,7 +133,6 @@ export class ClaudeRequestNormalizerPlugin {
139
133
  if (!clientType || !ALLOWED_AGENTS.includes(clientType)) {
140
134
  throw new Error(`Plugin disabled for agent: ${clientType}`);
141
135
  }
142
- // Pass the configured model as a fallback for requests that omit body.model
143
136
  const configModel = context.config.model;
144
137
  return new ClaudeRequestNormalizerInterceptor(configModel);
145
138
  }
@@ -161,15 +154,15 @@ class ClaudeRequestNormalizerInterceptor {
161
154
  if (!model) {
162
155
  return;
163
156
  }
164
- const modifiedBySampling = handleDeprecatedSamplingParams(body, model);
157
+ const caps = capabilitiesFor(model);
158
+ const modifiedBySampling = handleDeprecatedSamplingParams(body, caps, model);
159
+ // Not behind the thinking guard: Claude Code can send effort without thinking.
160
+ const modifiedByEffort = handleUnsupportedEffort(body, caps, model);
165
161
  let modifiedByThinking = false;
166
162
  if (body.thinking) {
167
- // Chain handlers: first match wins and modifies body
168
- modifiedByThinking =
169
- handleNoThinkingModels(body, model) ||
170
- handleAdaptiveThinkingTransform(body, model);
163
+ modifiedByThinking = handleThinkingField(body, caps, model);
171
164
  }
172
- if (modifiedBySampling || modifiedByThinking) {
165
+ if (modifiedBySampling || modifiedByEffort || modifiedByThinking) {
173
166
  const newBodyStr = JSON.stringify(body);
174
167
  context.requestBody = Buffer.from(newBodyStr, 'utf-8');
175
168
  context.headers['content-length'] = String(context.requestBody.length);
@@ -1 +1 @@
1
- {"version":3,"file":"claude-request-normalizer.plugin.js","sourceRoot":"","sources":["../../../../../../src/providers/plugins/sso/proxy/plugins/claude-request-normalizer.plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAIH,OAAO,EAAE,MAAM,EAAE,MAAM,gCAAgC,CAAC;AAExD;;;GAGG;AACH,MAAM,0BAA0B,GAAa;IAC3C,qCAAqC,EAAG,iDAAiD;CAC1F,CAAC;AAEF;;;;GAIG;AACH,MAAM,gCAAgC,GAAa;IACjD,kCAAkC,EAAG,2GAA2G;IAChJ,8BAA8B,EAAO,2CAA2C;CACjF,CAAC;AAEF,SAAS,qBAAqB,CAAC,SAAiB;IAC9C,OAAO,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,6BAA6B,CAAC,SAAiB;IACtD,OAAO,gCAAgC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,SAAS,8BAA8B,CAAC,SAAiB;IACvD,OAAO,8BAA8B,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,+BAA+B,CAAC,SAAiB;IACxD,OAAO,8BAA8B,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACxD,CAAC;AAED;;;;;GAKG;AACH,SAAS,oBAAoB,CAAC,YAAqB;IACjD,MAAM,MAAM,GAAG,OAAO,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,IAAI,MAAM,IAAI,IAAI;QAAE,OAAO,KAAK,CAAC;IACjC,IAAI,MAAM,IAAI,IAAI;QAAE,OAAO,QAAQ,CAAC;IACpC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,SAAS,sBAAsB,CAAC,IAAS,EAAE,KAAa;IACtD,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC;QAClC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC,QAAQ,CAAC;IACrB,MAAM,CAAC,KAAK,CAAC,8EAA8E,KAAK,EAAE,CAAC,CAAC;IACpG,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,SAAS,+BAA+B,CAAC,IAAS,EAAE,KAAa;IAC/D,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC;IACzC,IAAI,YAAY,KAAK,SAAS,IAAI,YAAY,KAAK,UAAU,EAAE,CAAC;QAC9D,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC,6BAA6B,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QACjE,IAAI,CAAC,QAAQ,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;QAErC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC;YAChC,IAAI,CAAC,aAAa,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;QACjE,CAAC;QAED,MAAM,CAAC,KAAK,CACV,qFAAqF,MAAM,gBAAgB,KAAK,EAAE,CACnH,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,IAAI,8BAA8B,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1C,MAAM,CAAC,KAAK,CACV,6EAA6E,KAAK,EAAE,CACrF,CAAC;YACF,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,IAAI,CAAC,QAAQ,CAAC;QACrB,MAAM,CAAC,KAAK,CACV,uFAAuF,KAAK,EAAE,CAC/F,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,8BAA8B,CAAC,IAAS,EAAE,KAAa;IAC9D,IAAI,CAAC,+BAA+B,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,OAAO,CAAU,EAAE,CAAC;QAC7D,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;YACjB,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,CAAC,KAAK,CACV,6EAA6E,KAAK,KAAK,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC7G,CAAC;IACF,OAAO,IAAI,CAAC;AACd,CAAC;AAED,mEAAmE;AACnE,MAAM,cAAc,GAAG,CAAC,gBAAgB,EAAE,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;AAE/E,MAAM,OAAO,6BAA6B;IACxC,EAAE,GAAG,0CAA0C,CAAC;IAChD,IAAI,GAAG,2BAA2B,CAAC;IACnC,OAAO,GAAG,OAAO,CAAC;IAClB,QAAQ,GAAG,EAAE,CAAC,CAAC,+BAA+B;IAE9C,KAAK,CAAC,iBAAiB,CAAC,OAAsB;QAC5C,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC;QAC7C,IAAI,CAAC,UAAU,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACxD,MAAM,IAAI,KAAK,CAAC,8BAA8B,UAAU,EAAE,CAAC,CAAC;QAC9D,CAAC;QACD,4EAA4E;QAC5E,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;QACzC,OAAO,IAAI,kCAAkC,CAAC,WAAW,CAAC,CAAC;IAC7D,CAAC;CACF;AAED,MAAM,kCAAkC;IAGT;IAF7B,IAAI,GAAG,2BAA2B,CAAC;IAEnC,YAA6B,WAAoB;QAApB,gBAAW,GAAX,WAAW,CAAS;IAAG,CAAC;IAErD,KAAK,CAAC,SAAS,CAAC,OAAqB;QACnC,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAC3F,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACtD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAEjC,MAAM,KAAK,GAAG,CAAC,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;YACvF,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO;YACT,CAAC;YAED,MAAM,kBAAkB,GAAG,8BAA8B,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAEvE,IAAI,kBAAkB,GAAG,KAAK,CAAC;YAC/B,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,qDAAqD;gBACrD,kBAAkB;oBAChB,sBAAsB,CAAC,IAAI,EAAE,KAAK,CAAC;wBACnC,+BAA+B,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACjD,CAAC;YAED,IAAI,kBAAkB,IAAI,kBAAkB,EAAE,CAAC;gBAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBACxC,OAAO,CAAC,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBACvD,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YACzE,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,kEAAkE;QACpE,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"claude-request-normalizer.plugin.js","sourceRoot":"","sources":["../../../../../../src/providers/plugins/sso/proxy/plugins/claude-request-normalizer.plugin.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,MAAM,EAAE,MAAM,gCAAgC,CAAC;AAcxD,sDAAsD;AACtD,MAAM,oBAAoB,GAAsB;IAC9C,QAAQ,EAAE,UAAU;IACpB,MAAM,EAAE,KAAK;IACb,QAAQ,EAAE,IAAI;IACd,wBAAwB,EAAE,KAAK;CAChC,CAAC;AAEF,kFAAkF;AAClF,uEAAuE;AACvE,MAAM,sBAAsB,GAAwE;IAClG;QACE,uEAAuE;QACvE,OAAO,EAAE,qCAAqC;QAC9C,YAAY,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,wBAAwB,EAAE,KAAK,EAAE;KACnG;IACD;QACE,mFAAmF;QACnF,OAAO,EAAE,kCAAkC;QAC3C,YAAY,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,wBAAwB,EAAE,KAAK,EAAE;KACtG;IACD;QACE,8EAA8E;QAC9E,mDAAmD;QACnD,OAAO,EAAE,8BAA8B;QACvC,YAAY,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,wBAAwB,EAAE,IAAI,EAAE;KACtG;CACF,CAAC;AAEF,SAAS,eAAe,CAAC,KAAa;IACpC,KAAK,MAAM,KAAK,IAAI,sBAAsB,EAAE,CAAC;QAC3C,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC,YAAY,CAAC;IAC3D,CAAC;IACD,OAAO,oBAAoB,CAAC;AAC9B,CAAC;AAED,gEAAgE;AAChE,SAAS,oBAAoB,CAAC,YAAqB;IACjD,MAAM,MAAM,GAAG,OAAO,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,IAAI,MAAM,IAAI,IAAI;QAAE,OAAO,KAAK,CAAC;IACjC,IAAI,MAAM,IAAI,IAAI;QAAE,OAAO,QAAQ,CAAC;IACpC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,yFAAyF;AACzF,SAAS,mBAAmB,CAAC,IAAS,EAAE,IAAuB,EAAE,KAAa;IAC5E,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC,QAAQ,CAAC;QACrB,MAAM,CAAC,KAAK,CAAC,8EAA8E,KAAK,EAAE,CAAC,CAAC;QACpG,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,IAAI,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;QACjC,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC;QACzC,IAAI,YAAY,KAAK,SAAS,IAAI,YAAY,KAAK,UAAU,EAAE,CAAC;YAC9D,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;YACjE,IAAI,CAAC,QAAQ,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;YAErC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC;gBAChC,IAAI,CAAC,aAAa,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;YACjE,CAAC;YAED,MAAM,CAAC,KAAK,CACV,qFAAqF,MAAM,gBAAgB,KAAK,EAAE,CACnH,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QAED,8BAA8B;QAC9B,IAAI,IAAI,CAAC,wBAAwB,EAAE,CAAC;YAClC,MAAM,CAAC,KAAK,CAAC,6EAA6E,KAAK,EAAE,CAAC,CAAC;YACnG,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,IAAI,CAAC,QAAQ,CAAC;QACrB,MAAM,CAAC,KAAK,CAAC,uFAAuF,KAAK,EAAE,CAAC,CAAC;QAC7G,OAAO,IAAI,CAAC;IACd,CAAC;IAED,mDAAmD;IACnD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,8EAA8E;AAC9E,iFAAiF;AACjF,SAAS,uBAAuB,CAAC,IAAS,EAAE,IAAuB,EAAE,KAAa;IAChF,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC;IACxC,IAAI,YAAY,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,QAAQ,IAAI,YAAY,EAAE,CAAC;QACjF,OAAO,YAAY,CAAC,MAAM,CAAC;QAC3B,QAAQ,GAAG,IAAI,CAAC;QAChB,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3C,OAAO,IAAI,CAAC,aAAa,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC,MAAM,CAAC;QACnB,QAAQ,GAAG,IAAI,CAAC;IAClB,CAAC;IAED,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,gFAAgF,KAAK,EAAE,CAAC,CAAC;IACxG,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,+EAA+E;AAC/E,SAAS,8BAA8B,CAAC,IAAS,EAAE,IAAuB,EAAE,KAAa;IACvF,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE,OAAO,CAAU,EAAE,CAAC;QAC7D,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;YACjB,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,CAAC,KAAK,CACV,6EAA6E,KAAK,KAAK,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC7G,CAAC;IACF,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,cAAc,GAAG,CAAC,gBAAgB,EAAE,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;AAE/E,MAAM,OAAO,6BAA6B;IACxC,EAAE,GAAG,0CAA0C,CAAC;IAChD,IAAI,GAAG,2BAA2B,CAAC;IACnC,OAAO,GAAG,OAAO,CAAC;IAClB,QAAQ,GAAG,EAAE,CAAC,CAAC,+BAA+B;IAE9C,KAAK,CAAC,iBAAiB,CAAC,OAAsB;QAC5C,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC;QAC7C,IAAI,CAAC,UAAU,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACxD,MAAM,IAAI,KAAK,CAAC,8BAA8B,UAAU,EAAE,CAAC,CAAC;QAC9D,CAAC;QACD,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;QACzC,OAAO,IAAI,kCAAkC,CAAC,WAAW,CAAC,CAAC;IAC7D,CAAC;CACF;AAED,MAAM,kCAAkC;IAGT;IAF7B,IAAI,GAAG,2BAA2B,CAAC;IAEnC,YAA6B,WAAoB;QAApB,gBAAW,GAAX,WAAW,CAAS;IAAG,CAAC;IAErD,KAAK,CAAC,SAAS,CAAC,OAAqB;QACnC,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAC3F,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACtD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAEjC,MAAM,KAAK,GAAG,CAAC,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;YACvF,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;YAEpC,MAAM,kBAAkB,GAAG,8BAA8B,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YAE7E,+EAA+E;YAC/E,MAAM,gBAAgB,GAAG,uBAAuB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YAEpE,IAAI,kBAAkB,GAAG,KAAK,CAAC;YAC/B,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,kBAAkB,GAAG,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YAC9D,CAAC;YAED,IAAI,kBAAkB,IAAI,gBAAgB,IAAI,kBAAkB,EAAE,CAAC;gBACjE,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBACxC,OAAO,CAAC,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBACvD,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YACzE,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,kEAAkE;QACpE,CAAC;IACH,CAAC;CACF"}
@@ -185,8 +185,13 @@ class CodexRequestNormalizerInterceptor {
185
185
  */
186
186
  resolveFallbackModel() {
187
187
  const pinned = this.context.config.model;
188
- if (pinned && this.availableModels.includes(pinned))
189
- return pinned;
188
+ if (pinned) {
189
+ // The pinned value may be the profile's undated picker name; resolve it to
190
+ // its dated deployment the same way an in-flight request is resolved.
191
+ const resolution = resolveCodexDeployment(pinned, this.availableModels, undefined);
192
+ if (resolution.kind === 'exact' || resolution.kind === 'resolved')
193
+ return resolution.model;
194
+ }
190
195
  return rankDeploymentsByRecency(this.availableModels)[0];
191
196
  }
192
197
  /**