@iislee/opencodex 2.31.0 → 2.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (261) hide show
  1. package/README.md +3 -3
  2. package/bin/ocx.mjs +99 -70
  3. package/gui/dist/assets/index-Be1sDpWw.css +1 -0
  4. package/gui/dist/assets/index-D4OKgUV4.js +114 -0
  5. package/gui/dist/index.html +2 -2
  6. package/package.json +3 -1
  7. package/src/adapters/anthropic.ts +104 -15
  8. package/src/adapters/base.ts +29 -1
  9. package/src/adapters/command-code.ts +42 -6
  10. package/src/adapters/cursor/call-id.ts +44 -0
  11. package/src/adapters/cursor/catalog.ts +541 -0
  12. package/src/adapters/cursor/checkpoint-store.ts +15 -10
  13. package/src/adapters/cursor/cursor-errors.ts +15 -0
  14. package/src/adapters/cursor/discovery.ts +69 -18
  15. package/src/adapters/cursor/effort-map.ts +79 -1
  16. package/src/adapters/cursor/envelope-echo.ts +290 -0
  17. package/src/adapters/cursor/live-models.ts +7 -2
  18. package/src/adapters/cursor/live-transport.ts +14 -0
  19. package/src/adapters/cursor/message-mapper.ts +4 -1
  20. package/src/adapters/cursor/native-exec-desktop.ts +23 -0
  21. package/src/adapters/cursor/native-exec-fs.ts +2 -2
  22. package/src/adapters/cursor/native-exec-network.ts +1 -1
  23. package/src/adapters/cursor/native-exec-shell.ts +5 -2
  24. package/src/adapters/cursor/native-exec.ts +20 -0
  25. package/src/adapters/cursor/protobuf-request.ts +68 -14
  26. package/src/adapters/cursor/request-builder.ts +40 -10
  27. package/src/adapters/cursor/tool-definitions.ts +14 -4
  28. package/src/adapters/cursor/tool-result-normalize.ts +28 -5
  29. package/src/adapters/cursor/types.ts +20 -0
  30. package/src/adapters/cursor.ts +209 -38
  31. package/src/adapters/exec-tool-result-normalize.ts +99 -0
  32. package/src/adapters/google-antigravity-replay.ts +173 -25
  33. package/src/adapters/google-antigravity-wire.ts +5 -0
  34. package/src/adapters/google-errors.ts +44 -12
  35. package/src/adapters/google.ts +136 -24
  36. package/src/adapters/image.ts +1 -1
  37. package/src/adapters/kiro-constants.ts +27 -0
  38. package/src/adapters/kiro-tools.ts +55 -16
  39. package/src/adapters/kiro.ts +182 -23
  40. package/src/adapters/openai-chat.ts +300 -242
  41. package/src/adapters/openai-responses.ts +353 -27
  42. package/src/adapters/run-turn-queue.ts +36 -1
  43. package/src/adapters/tool-catalog-nudge.ts +4 -3
  44. package/src/adapters/xai-tool-schema.ts +436 -0
  45. package/src/adapters/xai-web-search.ts +17 -16
  46. package/src/bridge.ts +90 -37
  47. package/src/chat/inbound.ts +14 -1
  48. package/src/chat/outbound.ts +15 -7
  49. package/src/claude/agents-inject.ts +8 -1
  50. package/src/claude/context-windows.ts +16 -9
  51. package/src/claude/outbound.ts +24 -11
  52. package/src/cli/access.ts +46 -3
  53. package/src/cli/account-api.ts +116 -19
  54. package/src/cli/account-extended.ts +262 -29
  55. package/src/cli/account-main.ts +12 -12
  56. package/src/cli/account.ts +69 -15
  57. package/src/cli/agent.ts +8 -1
  58. package/src/cli/alias.ts +66 -0
  59. package/src/cli/capabilities-command.ts +94 -0
  60. package/src/cli/capabilities.ts +496 -0
  61. package/src/cli/claude-desktop.ts +31 -11
  62. package/src/cli/claude.ts +26 -1
  63. package/src/cli/dispatch.ts +256 -28
  64. package/src/cli/doctor.ts +126 -14
  65. package/src/cli/help.ts +17 -6
  66. package/src/cli/index.ts +39 -9
  67. package/src/cli/init.ts +1 -0
  68. package/src/cli/inspect.ts +230 -0
  69. package/src/cli/models-runtime.ts +95 -0
  70. package/src/cli/models.ts +26 -10
  71. package/src/cli/observe.ts +31 -8
  72. package/src/cli/provider-runtime.ts +16 -2
  73. package/src/cli/provider.ts +2 -1
  74. package/src/cli/registry.ts +49 -10
  75. package/src/cli/runtime-api.ts +51 -7
  76. package/src/cli/status.ts +41 -1
  77. package/src/cli/storage.ts +234 -0
  78. package/src/cli/system-command.ts +16 -0
  79. package/src/cli/system-restart-client.ts +1 -1
  80. package/src/cli/usage-report.ts +184 -0
  81. package/src/cli/v2.ts +34 -10
  82. package/src/cli/version-skew.ts +46 -0
  83. package/src/clients/config-export.ts +85 -3
  84. package/src/clients/effective-status.ts +30 -2
  85. package/src/clients/probes/cline.ts +81 -0
  86. package/src/codex/account-label.ts +21 -0
  87. package/src/codex/account-pause.ts +2 -1
  88. package/src/codex/account-priority.ts +3 -2
  89. package/src/codex/app-server-processes.ts +83 -7
  90. package/src/codex/auth-api.ts +50 -10
  91. package/src/codex/auth-context.ts +21 -18
  92. package/src/codex/autostart-health.ts +16 -0
  93. package/src/codex/catalog/aggregation.ts +18 -0
  94. package/src/codex/catalog/effort.ts +18 -3
  95. package/src/codex/catalog/metadata.ts +27 -1
  96. package/src/codex/catalog/native-models.ts +5 -2
  97. package/src/codex/catalog/parsing.ts +72 -27
  98. package/src/codex/catalog/provider-fetch.ts +187 -31
  99. package/src/codex/catalog/sync.ts +131 -5
  100. package/src/codex/catalog.ts +1 -1
  101. package/src/codex/codex-write-lock.ts +3 -1
  102. package/src/codex/convergence-types.ts +1 -1
  103. package/src/codex/convergence.ts +27 -2
  104. package/src/codex/desired-state.ts +2 -2
  105. package/src/codex/desktop-app-restart.ts +355 -0
  106. package/src/codex/history-job.ts +32 -3
  107. package/src/codex/history-manifest.ts +112 -0
  108. package/src/codex/history-migration-guardian.ts +5 -5
  109. package/src/codex/history-provider.ts +825 -247
  110. package/src/codex/history-worker.ts +8 -5
  111. package/src/codex/inject-coordination.ts +83 -0
  112. package/src/codex/inject.ts +63 -22
  113. package/src/codex/injected-marker.ts +1 -1
  114. package/src/codex/internal/history-writer.ts +4 -3
  115. package/src/codex/log-guard/inspect.ts +22 -4
  116. package/src/codex/model-entitlements.ts +9 -2
  117. package/src/codex/native-profile-startup.ts +157 -27
  118. package/src/codex/native-residue.ts +26 -33
  119. package/src/codex/prompt-layers.ts +371 -25
  120. package/src/codex/prompt-text-probe.ts +238 -0
  121. package/src/codex/quota.ts +91 -10
  122. package/src/codex/routing.ts +9 -0
  123. package/src/codex/shim.ts +56 -3
  124. package/src/codex/subagent-model-fallback.ts +104 -25
  125. package/src/codex/transition-state.ts +116 -8
  126. package/src/combos/failover.ts +27 -0
  127. package/src/combos/types.ts +10 -0
  128. package/src/compatibility/index.ts +26 -0
  129. package/src/compatibility/manifest.ts +253 -0
  130. package/src/compatibility/openai-responses.ts +121 -0
  131. package/src/config/atomic-write.ts +219 -0
  132. package/src/config/paths.ts +40 -0
  133. package/src/config/process-state.ts +309 -0
  134. package/src/config/provider-validation.ts +177 -0
  135. package/src/config/rebase-provenance.ts +68 -0
  136. package/src/config.ts +206 -824
  137. package/src/generated/compatibility-version.json +373 -213
  138. package/src/images/loop.ts +5 -4
  139. package/src/images/plan.ts +5 -4
  140. package/src/integrations/ownership-policy.ts +160 -0
  141. package/src/integrations/ownership.ts +46 -2
  142. package/src/integrations/registry.ts +7 -0
  143. package/src/integrations/state.ts +79 -7
  144. package/src/integrations/writer.ts +26 -2
  145. package/src/lab/conformance/fixtures/protocol-v1-cases.json +1 -1
  146. package/src/lab/fabric/producer-child.ts +1 -1
  147. package/src/lib/admin-secrets.ts +24 -0
  148. package/src/lib/bounded-body.ts +14 -2
  149. package/src/lib/config-ownership.ts +20 -0
  150. package/src/lib/errors.ts +36 -3
  151. package/src/lib/package-tree-integrity.ts +101 -0
  152. package/src/lib/process-control.ts +2 -1
  153. package/src/lib/service-secrets.ts +15 -0
  154. package/src/lib/tool-argument-integers.ts +56 -5
  155. package/src/oauth/callback-server.ts +22 -2
  156. package/src/oauth/cline.ts +203 -0
  157. package/src/oauth/generic-account-failover.ts +231 -0
  158. package/src/oauth/health.ts +1 -1
  159. package/src/oauth/index.ts +65 -6
  160. package/src/oauth/key-providers.ts +10 -1
  161. package/src/oauth/kimi.ts +9 -1
  162. package/src/oauth/kiro.ts +45 -0
  163. package/src/oauth/local-token-detect.ts +2 -0
  164. package/src/oauth/open-browser-choice.ts +26 -0
  165. package/src/oauth/store.ts +14 -5
  166. package/src/oauth/types.ts +15 -0
  167. package/src/providers/auto-compact-budget.ts +65 -0
  168. package/src/providers/command-code-efforts.ts +38 -6
  169. package/src/providers/context-cap.ts +4 -3
  170. package/src/providers/default-aliases.ts +65 -0
  171. package/src/providers/derive.ts +28 -0
  172. package/src/providers/fastwire.ts +7 -1
  173. package/src/providers/label.ts +34 -1
  174. package/src/providers/model-presets.ts +119 -0
  175. package/src/providers/new-model-policy.ts +146 -0
  176. package/src/providers/provider-id-rewrite.ts +2 -1
  177. package/src/providers/quota.ts +65 -7
  178. package/src/providers/registry.ts +184 -69
  179. package/src/providers/slug-codec.ts +52 -0
  180. package/src/providers/xai-transport.ts +21 -0
  181. package/src/reasoning-effort.ts +19 -2
  182. package/src/responses/apply-patch-envelope.ts +63 -0
  183. package/src/responses/code-mode-helper-compat.ts +50 -0
  184. package/src/responses/custom-tool-compat.ts +157 -39
  185. package/src/responses/namespace-tool-compat.ts +84 -4
  186. package/src/responses/parser.ts +7 -2
  187. package/src/responses/reasoning-replay-cache.ts +81 -3
  188. package/src/responses/schema.ts +5 -1
  189. package/src/responses/state.ts +94 -4
  190. package/src/responses/thought-signature-replay.ts +17 -0
  191. package/src/responses/turn-termination.ts +107 -0
  192. package/src/router.ts +40 -2
  193. package/src/routing/analytics.ts +1 -0
  194. package/src/routing/quota.ts +10 -0
  195. package/src/server/auth-cors.ts +27 -7
  196. package/src/server/chat-completions.ts +24 -16
  197. package/src/server/chat-native-sse.ts +3 -3
  198. package/src/server/chat-native.ts +30 -11
  199. package/src/server/claude-messages.ts +1 -1
  200. package/src/server/index.ts +179 -32
  201. package/src/server/lifecycle.ts +52 -1
  202. package/src/server/local-management-read-client.ts +1 -1
  203. package/src/server/local-provider-reload-client.ts +1 -1
  204. package/src/server/management/agent-settings-routes.ts +45 -23
  205. package/src/server/management/codex-prompt-routes.ts +570 -0
  206. package/src/server/management/combo-routes.ts +2 -1
  207. package/src/server/management/config-routes.ts +59 -12
  208. package/src/server/management/context.ts +10 -1
  209. package/src/server/management/logs-usage-routes.ts +30 -24
  210. package/src/server/management/model-routes.ts +274 -4
  211. package/src/server/management/model-rows.ts +4 -0
  212. package/src/server/management/native-integration-routes.ts +2 -1
  213. package/src/server/management/oauth-account-routes.ts +10 -4
  214. package/src/server/management/provider-capability-config.ts +1 -1
  215. package/src/server/management/provider-routes.ts +81 -11
  216. package/src/server/management/route-registry.ts +332 -0
  217. package/src/server/management/routing-profile-routes.ts +2 -2
  218. package/src/server/management/system-restart.ts +1 -1
  219. package/src/server/management-api.ts +18 -16
  220. package/src/server/port-reclaim.ts +1 -1
  221. package/src/server/proxy-liveness.ts +29 -5
  222. package/src/server/relay-eager.ts +147 -20
  223. package/src/server/relay.ts +251 -19
  224. package/src/server/request-log-conversation.ts +51 -0
  225. package/src/server/request-log.ts +70 -16
  226. package/src/server/responses/codex-auth-error.ts +55 -0
  227. package/src/server/responses/collaboration.ts +37 -3
  228. package/src/server/responses/combo-stream-preflight.ts +178 -0
  229. package/src/server/responses/compact.ts +6 -21
  230. package/src/server/responses/core.ts +810 -208
  231. package/src/server/responses/empty-completion-guard.ts +63 -6
  232. package/src/server/responses/fetch-helpers.ts +17 -102
  233. package/src/server/responses/input-admission.ts +3 -1
  234. package/src/server/responses/passthrough-error.ts +33 -9
  235. package/src/server/responses/responses-field-backfill.ts +105 -13
  236. package/src/server/responses/ws-upstream.ts +75 -2
  237. package/src/server/responses-custom-tool-repair.ts +87 -6
  238. package/src/server/responses-terminal-repair.ts +25 -4
  239. package/src/server/responses-undeclared-tool-guard.ts +241 -18
  240. package/src/server/sse-frame-buffer.ts +31 -4
  241. package/src/server/ws-bridge.ts +14 -2
  242. package/src/service.ts +42 -4
  243. package/src/storage/policy-job.ts +14 -4
  244. package/src/storage/policy.ts +88 -23
  245. package/src/types/config.ts +66 -0
  246. package/src/types/provider.ts +69 -0
  247. package/src/types/request.ts +17 -4
  248. package/src/types/tools.ts +116 -11
  249. package/src/types.ts +3 -1
  250. package/src/update/index.ts +5 -4
  251. package/src/update/job.ts +3 -1
  252. package/src/update/transactional-install.mjs +8 -1
  253. package/src/usage/expected-prices.ts +43 -24
  254. package/src/usage/log.ts +63 -12
  255. package/src/usage/summary.ts +211 -8
  256. package/src/vision/describe.ts +18 -13
  257. package/src/web-search/exa-executor.ts +40 -9
  258. package/src/web-search/executor.ts +10 -3
  259. package/src/web-search/loop.ts +5 -4
  260. package/gui/dist/assets/index-BF38heuV.js +0 -104
  261. package/gui/dist/assets/index-DMiI18Kv.css +0 -1
@@ -250,6 +250,18 @@ export interface ProviderRegistryEntry {
250
250
  preserveResponsesReasoningContent?: boolean;
251
251
  /** Registry defaults for per-model Codex reasoning propagation; explicit user keys win during enrichment. */
252
252
  modelSupportsReasoningSummaries?: Record<string, boolean>;
253
+ /** Registry defaults for per-model Codex Responses verbosity support. */
254
+ modelSupportsVerbosity?: Record<string, boolean>;
255
+ /**
256
+ * Registry default applied to EVERY model of this provider, including ids that arrive from
257
+ * live discovery after this table was written.
258
+ *
259
+ * `modelSupportsVerbosity` only covers the ids enumerated here, so a newly discovered model
260
+ * fell through and re-advertised a control the upstream accepts and ignores. Where the opt-out
261
+ * is a property of the provider's API rather than of one model, declare it here; a per-model
262
+ * entry still wins over it.
263
+ */
264
+ supportsVerbosity?: boolean;
253
265
  modelDiscovery?: ProviderModelDiscoverySpec;
254
266
  contextWindow?: number;
255
267
  modelContextWindows?: Record<string, number>;
@@ -328,9 +340,31 @@ const ANTHROPIC_MODEL_CONTEXT_WINDOWS: Record<string, number> = { "claude-sonnet
328
340
  // The non-Z.AI providers below are speculative on purpose: they carry 5.2 today and are
329
341
  // expected to pick 5.3 up on their usual lag. Providers whose live /v1/models discovery is
330
342
  // enabled self-correct on the next successful fetch; static ones need a follow-up refresh.
331
- const ZAI_GLM_53_MODELS = ["glm-5.3", "glm-5.3[1m]"];
343
+ // Every 5.3 family member, so the effort ladder, the default effort and the output
344
+ // cap are derived in ONE place. `glm-5.3-flash` was seeded into the model list and
345
+ // the context map by hand and left out of this constant, which meant it advertised
346
+ // a 1M context with a null effort ladder, no default effort and no output cap while
347
+ // its siblings carried three tiers, a `max` default and 131072 tokens. A member
348
+ // added to the list but not to the family is a model whose metadata silently
349
+ // disappears.
350
+ const ZAI_GLM_53_MODELS = ["glm-5.3", "glm-5.3[1m]", "glm-5.3-flash"];
332
351
  const ZAI_GLM_52_MODELS = ["glm-5.2", "glm-5.2[1m]"];
333
352
  const ZAI_GLM_5X_MODELS = [...ZAI_GLM_53_MODELS, ...ZAI_GLM_52_MODELS];
353
+ /**
354
+ * The 5.x rows whose images the PROXY has to describe, which is NOT the same set as
355
+ * the 5.x rows themselves.
356
+ *
357
+ * `glm-5.3-flash` is a native VLM (docs.z.ai/guides/vlm/glm-5.3-flash), so listing it
358
+ * in `noVisionModels` sent an image through the vision sidecar and handed the model a
359
+ * text description of a picture it could have read itself - no error, worse answer,
360
+ * extra call. The correction commit fixed the Alibaba entries and left the eight
361
+ * providers that reach this constant behind.
362
+ *
363
+ * Kept separate from ZAI_GLM_5X_MODELS rather than filtered at each use site: that
364
+ * constant also drives `modelSupportsReasoningSummaries` and
365
+ * `preserveReasoningContentModels`, where flash DOES belong.
366
+ */
367
+ const ZAI_GLM_5X_SIDECAR_VISION_MODELS = ZAI_GLM_5X_MODELS.filter(id => id !== "glm-5.3-flash");
334
368
  const ZAI_GLM_52_REASONING_EFFORTS = ["low", "medium", "high", "xhigh", "max"];
335
369
  /**
336
370
  * GLM-5.3 does NOT share 5.2's five-tier ladder. docs.z.ai/devpack/latest-model folds every
@@ -416,6 +450,15 @@ const OPENAI_DAYBREAK_REASONING_EFFORTS: Record<string, string[]> = Object.fromE
416
450
  OPENAI_DAYBREAK_MODELS.map(id => [id, [] as string[]]),
417
451
  );
418
452
  const OPENROUTER_GPT56_MODELS = OPENAI_GPT56_MODELS.map(id => `openai/${id}`);
453
+ const XAI_MODELS = [
454
+ "grok-4.6",
455
+ "grok-4.5",
456
+ "grok-4.3",
457
+ "grok-4.20-0309-reasoning",
458
+ "grok-4.20-0309-non-reasoning",
459
+ "grok-build-0.1",
460
+ "grok-composer-2.5-fast",
461
+ ];
419
462
  // OpenRouter's live /endpoints routes report 1,050,000; keep this separate from the
420
463
  // unverified OpenAI API-key seed. Evidence: devlog/_plan/260710_provider_hardening/003_research_aggregators.md.
421
464
  const OPENROUTER_GPT56_CONTEXT_WINDOW = 1_050_000;
@@ -442,7 +485,7 @@ const THINKING_TOGGLE_MAP: Record<string, string> = {
442
485
  max: "enabled",
443
486
  };
444
487
  const OPENCODE_GO_THINKING_TOGGLE_MODELS = [
445
- "mimo-v2.5", "mimo-v2.5-pro", "mimo-v2-omni", "mimo-v2-pro", "glm-5", "glm-5.1",
488
+ "mimo-v2.5", "mimo-v2.5-pro", "glm-5", "glm-5.1",
446
489
  ];
447
490
  /**
448
491
  * Zhipu's domestic BigModel platform. Text families first, then the vision member: modalities are
@@ -450,13 +493,15 @@ const OPENCODE_GO_THINKING_TOGGLE_MODELS = [
450
493
  * images through the proxy's vision sidecar (src/codex/catalog/provider-fetch.ts), a claim nobody
451
494
  * has verified for BigModel-hosted GLM.
452
495
  */
496
+ // `glm-5.3-flash` is deliberately absent: it is a native VLM
497
+ // (docs.z.ai/guides/vlm/glm-5.3-flash), unlike glm-5.3 itself.
453
498
  const ZHIPU_BIGMODEL_TEXT_MODELS = ["glm-4.6", "glm-4.7", "glm-4.7-flash", "glm-5", "glm-5.1", "glm-5.2", "glm-5.3"];
454
499
  const ZHIPU_BIGMODEL_MODELS = [...ZHIPU_BIGMODEL_TEXT_MODELS, "glm-4.6v"];
455
500
  const ZHIPU_BIGMODEL_INPUT_MODALITIES: Record<string, string[]> = {
456
501
  ...Object.fromEntries(ZHIPU_BIGMODEL_TEXT_MODELS.map(id => [id, ["text"]])),
457
502
  "glm-4.6v": ["text", "image"],
458
503
  };
459
- const ZHIPU_BIGMODEL_THINKING_TOGGLE_MODELS = ["glm-4.6", "glm-4.7", "glm-5", "glm-5.1", "glm-5.2", "glm-5.3"];
504
+ const ZHIPU_BIGMODEL_THINKING_TOGGLE_MODELS = ["glm-4.6", "glm-4.7", "glm-5", "glm-5.1", "glm-5.2", "glm-5.3", "glm-5.3-flash"];
460
505
  const THINKING_BUDGET_EFFORTS = ["low", "medium", "high", "xhigh", "max"];
461
506
  // Qwen3.8-Max is the first Qwen3.x model with official direct `reasoning_effort` support.
462
507
  // Evidence: https://qwen.ai/blog?id=qwen3.8
@@ -474,16 +519,27 @@ const DEEPSEEK_THINKING_MODELS = ["deepseek-v4-pro", "deepseek-v4-flash"];
474
519
  * at which point this id retires the same way deepseek-chat/reasoner did.
475
520
  */
476
521
  const DEEPSEEK_VISION_PREVIEW_MODEL = "deepseek-v4-flash-vision-exp";
477
- const OPENCODE_FREE_DEEPSEEK_MODELS = ["deepseek-v4-flash-free"];
478
- /*
479
- * OpenCode Zen's free slug for the OpenRouter stealth model "Ox Alpha"
480
- * (openrouter.ai/stealth/ox-alpha): 1,048,576-token context, multimodal
481
- * (text+image+video upstream; Zen serves text+image), mandatory reasoning,
482
- * free during the stealth window. Zen displays it as "Ox Alpha Free" under
483
- * this exact id (opencode.ai/docs/zen, verified 2026-08-21).
522
+ /**
523
+ * CommandCode routes verified to accept image input end-to-end (#2406).
524
+ *
525
+ * Verified-negative and therefore deliberately ABSENT: deepseek/deepseek-v4-flash,
526
+ * deepseek/deepseek-v4-pro, zai-org/GLM-5.2, zai-org/GLM-5.3, xai/grok-4.6. Those
527
+ * routes accept the request and drop the image, which is worse than declining it — the
528
+ * model answers about an image it never saw. Do not add an id here on family resemblance;
529
+ * capability intersection trusts this map.
484
530
  */
485
- const OPENCODE_OX_ALPHA_FREE_MODEL = "x-preview-f-free";
486
- const OX_ALPHA_CONTEXT_WINDOW = 1_048_576;
531
+ const COMMAND_CODE_IMAGE_MODELS = [
532
+ `deepseek/${DEEPSEEK_VISION_PREVIEW_MODEL}`,
533
+ "gpt-5.6-luna",
534
+ "gpt-5.6-sol",
535
+ "MiniMaxAI/MiniMax-M3",
536
+ "moonshotai/Kimi-K3",
537
+ "meta/muse-spark-1.2",
538
+ "meta/muse-spark-1.2-contributor",
539
+ ] as const;
540
+ const COMMAND_CODE_MODEL_INPUT_MODALITIES: Record<string, ["text", "image"]> =
541
+ Object.fromEntries(COMMAND_CODE_IMAGE_MODELS.map(id => [id, ["text", "image"]]));
542
+ const OPENCODE_FREE_DEEPSEEK_MODELS = ["deepseek-v4-flash-free"];
487
543
  /*
488
544
  * Zen free models that reject `image_url` upstream (#1043, and the reproducible
489
545
  * half of #1024).
@@ -570,7 +626,7 @@ const deepseekReasoningMapFor = (modelId: string): Record<string, string> =>
570
626
  // https://help.aliyun.com/en/model-studio/token-plan-quickstart
571
627
  const ALIBABA_TOKEN_PLAN_MODELS = [
572
628
  "qwen3.8-max", "qwen3.7-max", "qwen3.7-plus", "qwen3.6-flash",
573
- "glm-5.3", "glm-5.2", "deepseek-v4-pro",
629
+ "glm-5.3", "glm-5.3-flash", "glm-5.2", "deepseek-v4-pro",
574
630
  ];
575
631
  const ALIBABA_TOKEN_PLAN_QWEN_MODELS = [
576
632
  "qwen3.8-max", "qwen3.7-max", "qwen3.7-plus", "qwen3.6-flash",
@@ -581,6 +637,7 @@ const ALIBABA_TOKEN_PLAN_INPUT_MODALITIES: Record<string, string[]> = {
581
637
  "qwen3.7-plus": ["text", "image"],
582
638
  "qwen3.6-flash": ["text", "image"],
583
639
  "glm-5.3": ["text"],
640
+ "glm-5.3-flash": ["text", "image"],
584
641
  "glm-5.2": ["text"],
585
642
  "deepseek-v4-pro": ["text"],
586
643
  };
@@ -593,7 +650,7 @@ const ALIBABA_INTL_TOKEN_PLAN_MODELS = [
593
650
  "qwen3.8-max", "qwen3.7-max", "qwen3.7-plus", "qwen3.6-plus", "qwen3.6-flash",
594
651
  "deepseek-v4-pro", "deepseek-v4-flash", "deepseek-v3.2",
595
652
  "kimi-k2.7-code", "kimi-k2.6", "kimi-k2.5",
596
- "glm-5.3", "glm-5.2", "glm-5.1", "glm-5",
653
+ "glm-5.3", "glm-5.3-flash", "glm-5.2", "glm-5.1", "glm-5",
597
654
  "MiniMax-M2.5",
598
655
  ];
599
656
  const ALIBABA_INTL_TOKEN_PLAN_QWEN_MODELS = [
@@ -643,6 +700,7 @@ const VOLCENGINE_CODING_PLAN_MODELS = [
643
700
  "deepseek-v4-pro",
644
701
  "deepseek-v4-flash",
645
702
  "glm-5.3",
703
+ "glm-5.3-flash",
646
704
  "glm-5.2",
647
705
  "kimi-k2.6",
648
706
  "minimax-m3",
@@ -651,6 +709,7 @@ const VOLCENGINE_AGENT_PLAN_MODELS = [
651
709
  "deepseek-v4-pro",
652
710
  "deepseek-v4-flash",
653
711
  "glm-5.3",
712
+ "glm-5.3-flash",
654
713
  "glm-5.2",
655
714
  "kimi-k2.6",
656
715
  "minimax-m3",
@@ -659,6 +718,9 @@ const VOLCENGINE_AGENT_PLAN_MODELS = [
659
718
  const VOLCENGINE_PLAN_INPUT_MODALITIES: Record<string, string[]> = {
660
719
  "kimi-k2.6": ["text", "image"],
661
720
  "minimax-m3": ["text", "image"],
721
+ // Native VLM (docs.z.ai/guides/vlm/glm-5.3-flash), so it is declared here and left
722
+ // out of the text-only list below.
723
+ "glm-5.3-flash": ["text", "image"],
662
724
  };
663
725
  // Every other Plan model is text-only. Declaring this explicitly keeps the vision
664
726
  // sidecar from advertising image input for models that cannot accept it — the same
@@ -685,6 +747,7 @@ const ALIBABA_INTL_TOKEN_PLAN_INPUT_MODALITIES: Record<string, string[]> = {
685
747
  "kimi-k2.6": ["text", "image"],
686
748
  "kimi-k2.5": ["text", "image"],
687
749
  "glm-5.3": ["text"],
750
+ "glm-5.3-flash": ["text", "image"],
688
751
  "glm-5.2": ["text"],
689
752
  "glm-5.1": ["text"],
690
753
  "glm-5": ["text"],
@@ -775,6 +838,7 @@ const NVIDIA_NIM_VISION_MODELS = [
775
838
  "minimaxai/minimax-m3", "moonshotai/kimi-k2.6", "moonshotai/kimi-k2.5",
776
839
  "stepfun-ai/step-3.7-flash", "thinkingmachines/inkling",
777
840
  "mistralai/mistral-medium-3.5-128b",
841
+ "z-ai/glm-5.3-flash",
778
842
  ];
779
843
  /**
780
844
  * The catalog advertises image input only for `noVisionModels` members, so a natively
@@ -808,6 +872,10 @@ const NVIDIA_NIM_NO_VISION_MODELS = [
808
872
  "nvidia/nemotron-3-ultra-550b-a55b", "nvidia/nemotron-mini-4b-instruct",
809
873
  "nvidia/nvidia-nemotron-nano-9b-v2",
810
874
  "openai/gpt-oss-120b", "openai/gpt-oss-20b",
875
+ // z-ai/glm-5.3-flash belongs in NVIDIA_NIM_VISION_MODELS, not here: Z.AI documents
876
+ // it under docs.z.ai/guides/vlm/. The header above says an id must be classified
877
+ // deliberately rather than assumed from its name, and inheriting glm-5.3's
878
+ // text-only verdict because of the shared prefix is exactly that mistake.
811
879
  "poolside/laguna-xs-2.1", "z-ai/glm-5.3", "z-ai/glm-5.2",
812
880
  ];
813
881
  const KIMI_CODING_MODEL_CONTEXT_WINDOWS: Record<string, number> = Object.fromEntries(
@@ -817,7 +885,7 @@ const KIMI_CODING_MODEL_INPUT_MODALITIES = Object.fromEntries(
817
885
  KIMI_CODING_K3_MODELS.map(id => [id, ["text", "image"]]),
818
886
  );
819
887
  const NEURALWATT_REASONING_HISTORY_MODELS = [
820
- "glm-5.3", "glm-5.3-short",
888
+ "glm-5.3", "glm-5.3-short", "glm-5.3-flash",
821
889
  "glm-5.2", "glm-5.2-short",
822
890
  "kimi-k2.6", "kimi-k2.7-code",
823
891
  "qwen3.5-397b", "qwen3.6-35b",
@@ -898,6 +966,7 @@ const DIGITALOCEAN_CHAT_COMPLETION_MODELS = [
898
966
  "nemotron-nano-12b-v2-vl",
899
967
  "mimo-v2.5-pro",
900
968
  "glm-5.3",
969
+ "glm-5.3-flash",
901
970
  "glm-5.2",
902
971
  "glm-5.1",
903
972
  "glm-5",
@@ -906,6 +975,7 @@ const DIGITALOCEAN_CHAT_COMPLETION_MODELS = [
906
975
  ] as const;
907
976
  const SCALEWAY_SERVERLESS_CHAT_MODELS = [
908
977
  "glm-5.3",
978
+ "glm-5.3-flash",
909
979
  "glm-5.2",
910
980
  // gpt-oss-120b is intentionally omitted: Scaleway requires Responses API for tool calling,
911
981
  // while this preset routes Codex agent tools through Chat Completions.
@@ -927,6 +997,7 @@ const UMANS_MODELS = [
927
997
  "umans-kimi-k2.7",
928
998
  "umans-flash",
929
999
  "umans-glm-5.3",
1000
+ "umans-glm-5.3-flash",
930
1001
  "umans-glm-5.2",
931
1002
  "umans-glm-5.1",
932
1003
  "umans-qwen3.6-35b-a3b",
@@ -936,12 +1007,19 @@ const UMANS_GLM_REASONING_EFFORTS = ["high", "xhigh", "max"];
936
1007
  // 260814: Z.AI folds GLM-5.3 efforts into low/high/max, so `low` is a real tier here and
937
1008
  // `xhigh` is not distinct from `max` (docs.z.ai/devpack/latest-model).
938
1009
  const UMANS_GLM_53_REASONING_EFFORTS = ["low", "high", "max"];
1010
+ // `umans-glm-5.3-flash` is NOT here: Z.AI documents glm-5.3-flash under
1011
+ // docs.z.ai/guides/vlm/, so it takes images natively and does not need the proxy's
1012
+ // vision sidecar. The seeding pass classified it from the family name and a later
1013
+ // pass corrected only some of the providers; this is one it missed.
939
1014
  const UMANS_TEXT_ONLY_MODELS = ["umans-glm-5.3", "umans-glm-5.2", "umans-glm-5.1"];
940
1015
  const UMANS_MODEL_CONTEXT_WINDOWS: Record<string, number> = {
941
1016
  "umans-coder": 262_144,
942
1017
  "umans-kimi-k2.7": 262_144,
943
1018
  "umans-flash": 262_144,
944
1019
  "umans-glm-5.3": 405_504,
1020
+ // Mirrors the sibling this provider already carries. Umans has not published a
1021
+ // separate window for the flash tier; asserting a different number would be a guess.
1022
+ "umans-glm-5.3-flash": 405_504,
945
1023
  "umans-glm-5.2": 405_504,
946
1024
  "umans-glm-5.1": 202_752,
947
1025
  "umans-qwen3.6-35b-a3b": 262_144,
@@ -951,6 +1029,7 @@ const UMANS_MODEL_INPUT_MODALITIES: Record<string, string[]> = Object.fromEntrie
951
1029
  );
952
1030
  const CLINE_PASS_MODELS = [
953
1031
  "cline-pass/glm-5.3",
1032
+ "cline-pass/glm-5.3-flash",
954
1033
  "cline-pass/glm-5.2",
955
1034
  "cline-pass/kimi-k3",
956
1035
  "cline-pass/kimi-k2.7-code",
@@ -966,6 +1045,7 @@ const CLINE_PASS_MODELS = [
966
1045
  ];
967
1046
  const CLINE_PASS_MODEL_CONTEXT_WINDOWS: Record<string, number> = {
968
1047
  "cline-pass/glm-5.3": 1_048_576,
1048
+ "cline-pass/glm-5.3-flash": 1_048_576,
969
1049
  "cline-pass/glm-5.2": 1_048_576,
970
1050
  "cline-pass/kimi-k3": 1_048_576,
971
1051
  "cline-pass/kimi-k2.7-code": 262_144,
@@ -985,6 +1065,11 @@ const CLINE_PASS_IMAGE_MODELS = new Set([
985
1065
  "cline-pass/mimo-v2.5",
986
1066
  "cline-pass/minimax-m3",
987
1067
  "cline-pass/qwen3.7-plus",
1068
+ // Native VLM (docs.z.ai/guides/vlm/), so its images do not go through the proxy's
1069
+ // sidecar. Adding it here moves it out of CLINE_PASS_TEXT_ONLY_MODELS and flips its
1070
+ // declared modalities to ["text", "image"] in one edit, because both are derived
1071
+ // from this set.
1072
+ "cline-pass/glm-5.3-flash",
988
1073
  ]);
989
1074
  const CLINE_PASS_MODALITY_KNOWN_MODELS = CLINE_PASS_MODELS.filter(id => id !== "cline-pass/qwen3.8-max");
990
1075
  const CLINE_PASS_TEXT_ONLY_MODELS = CLINE_PASS_MODALITY_KNOWN_MODELS.filter(id => !CLINE_PASS_IMAGE_MODELS.has(id));
@@ -1067,7 +1152,18 @@ export const PROVIDER_REGISTRY: readonly ProviderRegistryEntry[] = [
1067
1152
  // transport returns 400 ("Multi Agent requests are not allowed on chat completions").
1068
1153
  // 260813: grok-4.6 added per docs.x.ai/developers/grok-4-6. Context/vision still match
1069
1154
  // grok-4.5; the reasoning ladder does not — 4.6 adds the documented xhigh rung.
1070
- models: ["grok-4.6", "grok-4.5", "grok-4.3", "grok-4.20-0309-reasoning", "grok-4.20-0309-non-reasoning", "grok-build-0.1", "grok-composer-2.5-fast"],
1155
+ models: XAI_MODELS,
1156
+ // Measured only on grok-4.6 against cli-chat-proxy.grok.com: even an invalid
1157
+ // `text.verbosity` value is accepted and low/high/omitted output length is non-monotonic.
1158
+ // Apply the resulting opt-out to the whole xAI lineup because `text.verbosity` is an OpenAI
1159
+ // Responses parameter absent from xAI's documented API, not because every model was probed.
1160
+ // Keep this separate from reasoning-summary support: that bit gates Codex's
1161
+ // entire Responses reasoning object, including reasoning.effort.
1162
+ modelSupportsVerbosity: Object.fromEntries(XAI_MODELS.map(id => [id, false])),
1163
+ // Provider-wide, not merely per-model: `text.verbosity` is an OpenAI Responses parameter
1164
+ // absent from xAI's documented API, so a model discovered later has no more support for it
1165
+ // than the seeded ones do.
1166
+ supportsVerbosity: false,
1071
1167
  defaultModel: "grok-4.5",
1072
1168
  // Keep Codex Responses callers on the compatibility Chat wire until xAI can replay
1073
1169
  // opaque reasoning continuation and compaction state across later turns. The scoped
@@ -1142,17 +1238,12 @@ export const PROVIDER_REGISTRY: readonly ProviderRegistryEntry[] = [
1142
1238
  // Unknown/new live models deliberately do not advertise a reasoning picker.
1143
1239
  reasoningEfforts: [],
1144
1240
  modelReasoningEfforts: COMMAND_CODE_MODEL_REASONING_EFFORTS,
1145
- // Ox Alpha (stealth preview, changelog v1.31.0): free 1M multimodal reasoning
1146
- // model on every plan. DeepSeek vision preview id is preemptive metadata —
1147
- // it is expected to merge into deepseek-v4-flash later.
1241
+ // The DeepSeek vision preview id is preemptive metadata it is expected to
1242
+ // merge into deepseek-v4-flash later.
1148
1243
  modelContextWindows: {
1149
- "stealth/ox-alpha": OX_ALPHA_CONTEXT_WINDOW,
1150
1244
  [`deepseek/${DEEPSEEK_VISION_PREVIEW_MODEL}`]: 1_048_576,
1151
1245
  },
1152
- modelInputModalities: {
1153
- "stealth/ox-alpha": ["text", "image"],
1154
- [`deepseek/${DEEPSEEK_VISION_PREVIEW_MODEL}`]: ["text", "image"],
1155
- },
1246
+ modelInputModalities: COMMAND_CODE_MODEL_INPUT_MODALITIES,
1156
1247
  defaultMaxOutputTokens: 64_000,
1157
1248
  // The proprietary generate wire has no verified per-request serialization flag.
1158
1249
  parallelToolCalls: false,
@@ -1237,6 +1328,7 @@ export const PROVIDER_REGISTRY: readonly ProviderRegistryEntry[] = [
1237
1328
  // Per-model context metadata is maintained next to the Kiro model list.
1238
1329
  modelContextWindows: KIRO_MODEL_CONTEXT_WINDOWS,
1239
1330
  modelReasoningEfforts: KIRO_MODEL_REASONING_EFFORTS,
1331
+ modelSupportsVerbosity: Object.fromEntries(KIRO_MODELS.map(id => [id, false])),
1240
1332
  },
1241
1333
  {
1242
1334
  // Nous Portal — Nous Research subscription gateway (same backend Hermes Agent
@@ -1321,6 +1413,7 @@ export const PROVIDER_REGISTRY: readonly ProviderRegistryEntry[] = [
1321
1413
  "umans-kimi-k2.7": UMANS_REASONING_EFFORTS,
1322
1414
  "umans-flash": UMANS_REASONING_EFFORTS,
1323
1415
  "umans-glm-5.3": UMANS_GLM_53_REASONING_EFFORTS,
1416
+ "umans-glm-5.3-flash": UMANS_GLM_53_REASONING_EFFORTS,
1324
1417
  "umans-glm-5.2": UMANS_GLM_REASONING_EFFORTS,
1325
1418
  "umans-glm-5.1": UMANS_GLM_REASONING_EFFORTS,
1326
1419
  "umans-qwen3.6-35b-a3b": UMANS_REASONING_EFFORTS,
@@ -1336,31 +1429,36 @@ export const PROVIDER_REGISTRY: readonly ProviderRegistryEntry[] = [
1336
1429
  // finish_reason or [DONE] (#2260). The adapter still rejects incomplete argument JSON.
1337
1430
  openaiChatEofTolerance: true,
1338
1431
  /* [Decision Log]
1339
- - 목적과 의도: Route GPT 5.6 Luna to the Responses endpoint that OpenCode Go documents for that exact model.
1432
+ - 목적과 의도: Route the exact models OpenCode Go documents on the Responses endpoint GPT 5.6 Luna, and Muse Spark 1.2 Contributor (#2617).
1340
1433
  - 기존 구현 및 제약 조건: The provider is mixed-wire but its provider-wide `openai-chat` adapter sent Luna to `/chat/completions`; explicit user `modelAdapters` entries must remain authoritative.
1341
1434
  - 검토한 주요 대안: Change the whole provider to Responses; infer the wire from model-family names; add one registry-only exact-model default.
1342
- - 선택한 방식: Declare only `gpt-5.6-luna` as `openai-responses` through the existing registry default mechanism.
1435
+ - 선택한 방식: Declare only the named models as `openai-responses` through the existing registry default mechanism; the map stays an exact-model allowlist rather than a family or provider-wide rule.
1343
1436
  - 다른 대안 대신 이 방식을 선택한 이유: OpenCode Go documents sibling models on Chat or Anthropic endpoints, and an exact registry default preserves both those routes and explicit opt-out precedence.
1344
- - 장점, 단점 및 영향: Luna reaches `/responses` from every inbound surface without changing siblings; a future upstream endpoint change requires an evidence-backed registry update.
1437
+ - 장점, 단점 및 영향: Each listed model reaches `/responses` from every inbound surface without changing siblings; a future upstream endpoint change requires an evidence-backed registry update.
1345
1438
  */
1346
- modelWireDefaults: { "gpt-5.6-luna": "openai-responses" },
1439
+ modelWireDefaults: { "gpt-5.6-luna": "openai-responses", "muse-spark-1.2-contributor": "openai-responses" },
1347
1440
  modelContextWindows: {
1348
1441
  "kimi-k3": KIMI_K3_STANDARD_CONTEXT_WINDOW,
1349
- // Ox Alpha (stealth 1M multimodal) and the DeepSeek vision preview are
1350
- // metadata-only here: the Go roster is discovered live, so these apply
1351
- // the moment the gateway starts serving the ids.
1352
- [OPENCODE_OX_ALPHA_FREE_MODEL]: OX_ALPHA_CONTEXT_WINDOW,
1442
+ // The DeepSeek vision preview id is metadata-only here: the Go roster is
1443
+ // discovered live, so it applies the moment the gateway serves the id.
1353
1444
  [DEEPSEEK_VISION_PREVIEW_MODEL]: 1_048_576,
1354
1445
  },
1355
1446
  modelInputModalities: {
1356
1447
  "kimi-k3": ["text", "image"],
1357
- [OPENCODE_OX_ALPHA_FREE_MODEL]: ["text", "image"],
1358
1448
  // Experimental DeepSeek vision preview — expected to merge into deepseek-v4-flash later.
1359
1449
  [DEEPSEEK_VISION_PREVIEW_MODEL]: ["text", "image"],
1450
+ // Muse Spark 1.2 Contributor is natively multimodal on Zen Go: it accepts input_image
1451
+ // parts over /responses (probed 2026-08-26). Without this declaration the catalog
1452
+ // advertises it text-only and the Codex app blocks image attachments client-side with
1453
+ // "This model does not support image inputs" before the request ever reaches the proxy.
1454
+ "muse-spark-1.2-contributor": ["text", "image"],
1360
1455
  },
1361
1456
  modelReasoningEfforts: {
1457
+ "gpt-5.6-luna": OPENAI_API_GPT56_REASONING_EFFORTS,
1362
1458
  "glm-5.3": ZAI_GLM_53_REASONING_EFFORTS,
1459
+ "glm-5.3-flash": ZAI_GLM_53_REASONING_EFFORTS,
1363
1460
  "glm-5.2": ZAI_GLM_52_REASONING_EFFORTS,
1461
+ "qwen3.8-max": QWEN38_REASONING_EFFORTS,
1364
1462
  "kimi-k3": KIMI_CODING_K3_REASONING_EFFORTS,
1365
1463
  "kimi-k2.7-code": [],
1366
1464
  "kimi-k2.7-code-highspeed": [],
@@ -1378,6 +1476,7 @@ export const PROVIDER_REGISTRY: readonly ProviderRegistryEntry[] = [
1378
1476
  },
1379
1477
  modelSupportsReasoningSummaries: {
1380
1478
  "glm-5.3": true,
1479
+ "glm-5.3-flash": true,
1381
1480
  "glm-5.2": true,
1382
1481
  "glm-5.1": true,
1383
1482
  "glm-5": true,
@@ -1401,7 +1500,7 @@ export const PROVIDER_REGISTRY: readonly ProviderRegistryEntry[] = [
1401
1500
  noPenaltyModels: ["kimi-k3", "kimi-k2.7-code", "kimi-k2.7-code-highspeed"],
1402
1501
  autoToolChoiceOnlyModels: ["kimi-k2.7-code", "kimi-k2.7-code-highspeed"],
1403
1502
  // Issue #78: DeepSeek V4 thinking mode requires reasoning_content replay on tool-call turns.
1404
- preserveReasoningContentModels: ["glm-5.3", "glm-5.2", "kimi-k3", "kimi-k2.7-code", "kimi-k2.7-code-highspeed", ...DEEPSEEK_THINKING_MODELS],
1503
+ preserveReasoningContentModels: ["glm-5.3", "glm-5.3-flash", "glm-5.2", "kimi-k3", "kimi-k2.7-code", "kimi-k2.7-code-highspeed", ...DEEPSEEK_THINKING_MODELS],
1405
1504
  },
1406
1505
  {
1407
1506
  id: "neuralwatt",
@@ -1417,6 +1516,7 @@ export const PROVIDER_REGISTRY: readonly ProviderRegistryEntry[] = [
1417
1516
  // Evidence: devlog/_plan/260710_provider_hardening/003_research_aggregators.md and https://api.neuralwatt.com/v1/models.
1418
1517
  models: [
1419
1518
  "glm-5.3", "glm-5.3-fast", "glm-5.3-short", "glm-5.3-short-fast",
1519
+ "glm-5.3-flash",
1420
1520
  "glm-5.2", "glm-5.2-fast", "glm-5.2-short", "glm-5.2-short-fast",
1421
1521
  "kimi-k2.6", "kimi-k2.6-fast",
1422
1522
  "kimi-k2.7-code",
@@ -1428,6 +1528,9 @@ export const PROVIDER_REGISTRY: readonly ProviderRegistryEntry[] = [
1428
1528
  "glm-5.3-fast": [],
1429
1529
  "glm-5.3-short": ZAI_GLM_53_REASONING_EFFORTS,
1430
1530
  "glm-5.3-short-fast": [],
1531
+ // No `-fast`/`-short` variants are asserted for the flash tier: those suffixes
1532
+ // encode routing Neuralwatt documents per model, and this seed has no source for them.
1533
+ "glm-5.3-flash": ZAI_GLM_53_REASONING_EFFORTS,
1431
1534
  "glm-5.2": ZAI_GLM_52_REASONING_EFFORTS,
1432
1535
  "glm-5.2-fast": [],
1433
1536
  "glm-5.2-short": ZAI_GLM_52_REASONING_EFFORTS,
@@ -1460,16 +1563,11 @@ export const PROVIDER_REGISTRY: readonly ProviderRegistryEntry[] = [
1460
1563
  featured: true,
1461
1564
  dashboardUrl: "https://openrouter.ai/keys",
1462
1565
  jawcodeBundle: "openrouter",
1463
- // stealth/ox-alpha: free stealth-window frontier model (launched 2026-08-20).
1464
- // /api/v1/models reports 1,048,576 context, 131,072 max output, text+image+video
1465
- // input, $0 pricing, mandatory reasoning. Single provider slug: `stealth`.
1466
- models: ["anthropic/claude-sonnet-5", "stealth/ox-alpha", ...OPENROUTER_GPT56_MODELS],
1566
+ models: ["anthropic/claude-sonnet-5", ...OPENROUTER_GPT56_MODELS],
1467
1567
  modelContextWindows: {
1468
1568
  "anthropic/claude-sonnet-5": 1_000_000,
1469
- "stealth/ox-alpha": OX_ALPHA_CONTEXT_WINDOW,
1470
1569
  ...OPENROUTER_GPT56_CONTEXT_WINDOWS,
1471
1570
  },
1472
- modelInputModalities: { "stealth/ox-alpha": ["text", "image"] },
1473
1571
  // OpenRouter documents priority support for OpenAI endpoints, but not Anthropic. Keep the
1474
1572
  // provider unclassified and opt in only the exact OpenAI-backed slugs we ship. These facts
1475
1573
  // belong only to the canonical destination; a same-named custom gateway is unknown to us.
@@ -1519,6 +1617,29 @@ export const PROVIDER_REGISTRY: readonly ProviderRegistryEntry[] = [
1519
1617
  label: "Cline",
1520
1618
  adapter: "openai-chat",
1521
1619
  baseUrl: "https://api.cline.bot/api/v1",
1620
+ authKind: "oauth",
1621
+ oauthId: "cline",
1622
+ featured: true,
1623
+ dashboardUrl: "https://app.cline.bot",
1624
+ liveModels: true,
1625
+ preserveCustomDestination: true,
1626
+ defaultModel: "anthropic/claude-sonnet-4-6",
1627
+ models: [
1628
+ "anthropic/claude-sonnet-4-6",
1629
+ "openai/gpt-4o",
1630
+ "openai/gpt-4o-mini",
1631
+ "google/gemini-2.5-pro",
1632
+ "deepseek/deepseek-chat",
1633
+ "minimax/minimax-m2.5",
1634
+ "stealth/ox-alpha",
1635
+ ],
1636
+ note: "Log in with your Cline account (imports an existing local Cline CLI / VS Code credential when present).",
1637
+ },
1638
+ {
1639
+ id: "cline-apikey",
1640
+ label: "Cline - API Key",
1641
+ adapter: "openai-chat",
1642
+ baseUrl: "https://api.cline.bot/api/v1",
1522
1643
  authKind: "key",
1523
1644
  dashboardUrl: "https://app.cline.bot",
1524
1645
  liveModels: true,
@@ -1880,17 +2001,12 @@ export const PROVIDER_REGISTRY: readonly ProviderRegistryEntry[] = [
1880
2001
  // slash ids — so a Codex-facing slug like `commandcode/deepseek-deepseek-v4-pro`
1881
2002
  // is sent upstream verbatim and rejected with `unsupported_model`.
1882
2003
  modelReasoningEfforts: COMMAND_CODE_MODEL_REASONING_EFFORTS,
1883
- // Ox Alpha (stealth preview, Command Code changelog v1.31.0) ships with a
1884
- // 1.05M-token multimodal context; the DeepSeek vision preview id is
1885
- // preemptive for when the catalog serves it (merges into v4-flash later).
2004
+ // The DeepSeek vision preview id is preemptive for when the catalog serves it
2005
+ // (merges into v4-flash later).
1886
2006
  modelContextWindows: {
1887
- "stealth/ox-alpha": OX_ALPHA_CONTEXT_WINDOW,
1888
2007
  [`deepseek/${DEEPSEEK_VISION_PREVIEW_MODEL}`]: 1_048_576,
1889
2008
  },
1890
- modelInputModalities: {
1891
- "stealth/ox-alpha": ["text", "image"],
1892
- [`deepseek/${DEEPSEEK_VISION_PREVIEW_MODEL}`]: ["text", "image"],
1893
- },
2009
+ modelInputModalities: COMMAND_CODE_MODEL_INPUT_MODALITIES,
1894
2010
  modelDiscovery: {
1895
2011
  path: "models",
1896
2012
  maxResponseBytes: 256 * 1024,
@@ -2147,11 +2263,11 @@ export const PROVIDER_REGISTRY: readonly ProviderRegistryEntry[] = [
2147
2263
  id: "zai", label: "Z.AI — GLM Coding Plan", baseUrl: "https://api.z.ai/api/coding/paas/v4", adapter: "openai-chat", authKind: "key",
2148
2264
  dashboardUrl: "https://z.ai/manage-apikey/apikey-list", defaultModel: "glm-5.3",
2149
2265
  note: "GLM-5.3 coding subscription",
2150
- models: ["glm-5.3", "glm-5.3[1m]", "glm-5.2", "glm-5.2[1m]", "glm-5.1", "glm-5", "glm-4.6"],
2151
- modelContextWindows: { "glm-5.3": 1_000_000, "glm-5.3[1m]": 1_000_000, "glm-5.2": 1_000_000, "glm-5.2[1m]": 1_000_000 },
2266
+ models: ["glm-5.3", "glm-5.3[1m]", "glm-5.3-flash", "glm-5.2", "glm-5.2[1m]", "glm-5.1", "glm-5", "glm-4.6"],
2267
+ modelContextWindows: { "glm-5.3": 1_000_000, "glm-5.3[1m]": 1_000_000, "glm-5.3-flash": 1_000_000, "glm-5.2": 1_000_000, "glm-5.2[1m]": 1_000_000 },
2152
2268
  // Z.AI's OpenAI path returns 400 code 1211 for bracketed model ids.
2153
2269
  modelSuffixBracketStrip: true,
2154
- noVisionModels: ZAI_GLM_5X_MODELS,
2270
+ noVisionModels: ZAI_GLM_5X_SIDECAR_VISION_MODELS,
2155
2271
  modelReasoningEfforts: ZAI_GLM_5X_REASONING_EFFORTS,
2156
2272
  modelDefaultReasoningEfforts: Object.fromEntries(ZAI_GLM_53_MODELS.map(id => [id, "max"])),
2157
2273
  modelMaxOutputTokens: Object.fromEntries(ZAI_GLM_53_MODELS.map(id => [id, 131_072])),
@@ -2228,11 +2344,11 @@ export const PROVIDER_REGISTRY: readonly ProviderRegistryEntry[] = [
2228
2344
  authKind: "key",
2229
2345
  dashboardUrl: "https://bigmodel.cn/console/usercenter/apikeys",
2230
2346
  defaultModel: "glm-5.3",
2231
- models: ["glm-5.3", "glm-5.3[1m]", "glm-5.2", "glm-5.2[1m]", "glm-5.1", "glm-5", "glm-4.6"],
2347
+ models: ["glm-5.3", "glm-5.3[1m]", "glm-5.3-flash", "glm-5.2", "glm-5.2[1m]", "glm-5.1", "glm-5", "glm-4.6"],
2232
2348
  jawcodeBundle: "zai",
2233
- modelContextWindows: { "glm-5.3": 1_000_000, "glm-5.3[1m]": 1_000_000, "glm-5.2": 1_000_000, "glm-5.2[1m]": 1_000_000 },
2349
+ modelContextWindows: { "glm-5.3": 1_000_000, "glm-5.3[1m]": 1_000_000, "glm-5.3-flash": 1_000_000, "glm-5.2": 1_000_000, "glm-5.2[1m]": 1_000_000 },
2234
2350
  modelSuffixBracketStrip: true,
2235
- noVisionModels: ZAI_GLM_5X_MODELS,
2351
+ noVisionModels: ZAI_GLM_5X_SIDECAR_VISION_MODELS,
2236
2352
  modelReasoningEfforts: ZAI_GLM_5X_REASONING_EFFORTS,
2237
2353
  modelSupportsReasoningSummaries: Object.fromEntries(ZAI_GLM_5X_MODELS.map(id => [id, true])),
2238
2354
  preserveReasoningContentModels: ZAI_GLM_5X_MODELS,
@@ -2374,12 +2490,13 @@ export const PROVIDER_REGISTRY: readonly ProviderRegistryEntry[] = [
2374
2490
  modelInputModalities: ALIBABA_TOKEN_PLAN_INPUT_MODALITIES,
2375
2491
  modelContextWindows: {
2376
2492
  "qwen3.8-max": 983_616, "qwen3.7-max": 1_000_000, "qwen3.7-plus": 1_000_000,
2377
- "qwen3.6-flash": 1_000_000, "glm-5.3": 1_000_000, "glm-5.2": 1_000_000, "deepseek-v4-pro": 1_000_000,
2493
+ "qwen3.6-flash": 1_000_000, "glm-5.3": 1_000_000, "glm-5.3-flash": 1_000_000, "glm-5.2": 1_000_000, "deepseek-v4-pro": 1_000_000,
2378
2494
  },
2379
2495
  modelReasoningEfforts: {
2380
2496
  ...Object.fromEntries(ALIBABA_TOKEN_PLAN_QWEN_MODELS.map(id => [id, THINKING_BUDGET_EFFORTS])),
2381
2497
  "qwen3.8-max": QWEN38_REASONING_EFFORTS,
2382
2498
  "glm-5.3": ZAI_GLM_53_REASONING_EFFORTS,
2499
+ "glm-5.3-flash": ZAI_GLM_53_REASONING_EFFORTS,
2383
2500
  "glm-5.2": ZAI_GLM_52_REASONING_EFFORTS,
2384
2501
  "deepseek-v4-pro": deepseekThinkingEffortsFor("deepseek-v4-pro"),
2385
2502
  },
@@ -2387,7 +2504,7 @@ export const PROVIDER_REGISTRY: readonly ProviderRegistryEntry[] = [
2387
2504
  modelReasoningEffortMap: { "deepseek-v4-pro": deepseekReasoningMapFor("deepseek-v4-pro") },
2388
2505
  directReasoningEffortModels: ["qwen3.8-max"],
2389
2506
  thinkingBudgetModels: ALIBABA_TOKEN_PLAN_QWEN_MODELS.filter(id => id !== "qwen3.8-max"),
2390
- preserveReasoningContentModels: ["glm-5.3", "glm-5.2", "deepseek-v4-pro", "qwen3.8-max", "qwen3.7-max", "qwen3.7-plus", "qwen3.6-flash"],
2507
+ preserveReasoningContentModels: ["glm-5.3", "glm-5.3-flash", "glm-5.2", "deepseek-v4-pro", "qwen3.8-max", "qwen3.7-max", "qwen3.7-plus", "qwen3.6-flash"],
2391
2508
  noVisionModels: ["glm-5.3", "glm-5.2", "deepseek-v4-pro"],
2392
2509
  },
2393
2510
  {
@@ -2410,13 +2527,14 @@ export const PROVIDER_REGISTRY: readonly ProviderRegistryEntry[] = [
2410
2527
  "qwen3.7-max": 1_000_000, "qwen3.7-plus": 1_000_000, "qwen3.6-plus": 1_000_000, "qwen3.6-flash": 1_000_000,
2411
2528
  "deepseek-v4-pro": 1_000_000, "deepseek-v4-flash": 1_000_000, "deepseek-v3.2": 131_072,
2412
2529
  "kimi-k2.7-code": 262_144, "kimi-k2.6": 262_144, "kimi-k2.5": 262_144,
2413
- "glm-5.3": 1_000_000, "glm-5.2": 1_000_000, "glm-5.1": 1_000_000, "glm-5": 1_000_000,
2530
+ "glm-5.3": 1_000_000, "glm-5.3-flash": 1_000_000, "glm-5.2": 1_000_000, "glm-5.1": 1_000_000, "glm-5": 1_000_000,
2414
2531
  "MiniMax-M2.5": 204_800,
2415
2532
  },
2416
2533
  modelReasoningEfforts: {
2417
2534
  ...Object.fromEntries(ALIBABA_INTL_TOKEN_PLAN_QWEN_MODELS.map(id => [id, THINKING_BUDGET_EFFORTS])),
2418
2535
  "qwen3.8-max": QWEN38_REASONING_EFFORTS,
2419
2536
  "glm-5.3": ZAI_GLM_53_REASONING_EFFORTS,
2537
+ "glm-5.3-flash": ZAI_GLM_53_REASONING_EFFORTS,
2420
2538
  "glm-5.2": ZAI_GLM_52_REASONING_EFFORTS,
2421
2539
  "deepseek-v4-pro": deepseekThinkingEffortsFor("deepseek-v4-pro"),
2422
2540
  "deepseek-v4-flash": deepseekThinkingEffortsFor("deepseek-v4-flash"),
@@ -2427,7 +2545,7 @@ export const PROVIDER_REGISTRY: readonly ProviderRegistryEntry[] = [
2427
2545
  },
2428
2546
  directReasoningEffortModels: ["qwen3.8-max"],
2429
2547
  thinkingBudgetModels: ALIBABA_INTL_TOKEN_PLAN_QWEN_MODELS.filter(id => id !== "qwen3.8-max"),
2430
- preserveReasoningContentModels: ["glm-5.3", "glm-5.2", "deepseek-v4-pro", "deepseek-v4-flash", "qwen3.8-max", "qwen3.7-max", "qwen3.7-plus", "qwen3.6-plus", "qwen3.6-flash"],
2548
+ preserveReasoningContentModels: ["glm-5.3", "glm-5.3-flash", "glm-5.2", "deepseek-v4-pro", "deepseek-v4-flash", "qwen3.8-max", "qwen3.7-max", "qwen3.7-plus", "qwen3.6-plus", "qwen3.6-flash"],
2431
2549
  noVisionModels: ["deepseek-v4-pro", "deepseek-v4-flash", "deepseek-v3.2", "glm-5.3", "glm-5.2", "glm-5.1", "glm-5", "MiniMax-M2.5"],
2432
2550
  noReasoningModels: ["kimi-k2.7-code", "kimi-k2.6", "kimi-k2.5", "deepseek-v3.2", "glm-5.1", "glm-5", "MiniMax-M2.5"],
2433
2551
  modelDefaultReasoningEfforts: { "qwen3.8-max": "xhigh" },
@@ -2460,9 +2578,11 @@ export const PROVIDER_REGISTRY: readonly ProviderRegistryEntry[] = [
2460
2578
  authKind: "key",
2461
2579
  dashboardUrl: "https://ollama.com/settings/keys",
2462
2580
  // Live IDs verified 2026-07-10; qwen3-coder:480b retires 2026-07-15.
2463
- models: ["glm-5.3", "glm-5.2", "deepseek-v4-pro", "qwen3-coder:480b", "gpt-oss:120b", "kimi-k2.6", "minimax-m3", "qwen3.5:397b", "gemma4:31b"],
2581
+ models: ["glm-5.3", "glm-5.3-flash", "glm-5.2", "deepseek-v4-pro", "qwen3-coder:480b", "gpt-oss:120b", "kimi-k2.6", "minimax-m3", "qwen3.5:397b", "gemma4:31b"],
2464
2582
  defaultModel: "glm-5.3",
2465
2583
  noVisionModels: [
2584
+ // glm-5.3-flash is absent on purpose: native VLM
2585
+ // (docs.z.ai/guides/vlm/glm-5.3-flash), so its images skip the sidecar.
2466
2586
  "glm-5.3", "glm-5.2", "glm-5.1", "glm-5", "glm-4.7",
2467
2587
  "minimax-m2.7", "minimax-m2.5", "minimax-m2.1",
2468
2588
  "nemotron-3-ultra", "nemotron-3-super",
@@ -2535,14 +2655,12 @@ export const PROVIDER_REGISTRY: readonly ProviderRegistryEntry[] = [
2535
2655
  [...DEEPSEEK_THINKING_MODELS, ...OPENCODE_FREE_DEEPSEEK_MODELS].map(id => [id, deepseekReasoningMapFor(id)]),
2536
2656
  ),
2537
2657
  preserveReasoningContentModels: [...DEEPSEEK_THINKING_MODELS, ...OPENCODE_FREE_DEEPSEEK_MODELS],
2538
- // Same Zen gateway as opencode-free: Ox Alpha Free (1M multimodal stealth model)
2539
- // and the DeepSeek vision preview (merges into deepseek-v4-flash later).
2658
+ // Same Zen gateway as opencode-free: the DeepSeek vision preview id
2659
+ // (merges into deepseek-v4-flash later).
2540
2660
  modelContextWindows: {
2541
- [OPENCODE_OX_ALPHA_FREE_MODEL]: OX_ALPHA_CONTEXT_WINDOW,
2542
2661
  [DEEPSEEK_VISION_PREVIEW_MODEL]: 1_048_576,
2543
2662
  },
2544
2663
  modelInputModalities: {
2545
- [OPENCODE_OX_ALPHA_FREE_MODEL]: ["text", "image"],
2546
2664
  [DEEPSEEK_VISION_PREVIEW_MODEL]: ["text", "image"],
2547
2665
  },
2548
2666
  noVisionModels: [...OPENCODE_ZEN_TEXT_ONLY_MODELS, ...DEEPSEEK_THINKING_MODELS],
@@ -2575,16 +2693,12 @@ export const PROVIDER_REGISTRY: readonly ProviderRegistryEntry[] = [
2575
2693
  modelReasoningEfforts: Object.fromEntries(OPENCODE_FREE_DEEPSEEK_MODELS.map(id => [id, deepseekThinkingEffortsFor(id)])),
2576
2694
  modelReasoningEffortMap: Object.fromEntries(OPENCODE_FREE_DEEPSEEK_MODELS.map(id => [id, deepseekReasoningMapFor(id)])),
2577
2695
  preserveReasoningContentModels: OPENCODE_FREE_DEEPSEEK_MODELS,
2578
- // Ox Alpha Free (`x-preview-f-free`): the OpenRouter stealth model on Zen's
2579
- // free tier 1,048,576 context, text+image input. Deliberately NOT in the
2580
- // text-only list below. The DeepSeek vision preview id is preemptive
2581
- // metadata for when Zen starts serving it (merges into v4-flash later).
2696
+ // The DeepSeek vision preview id is preemptive metadata for when Zen starts
2697
+ // serving it (merges into v4-flash later).
2582
2698
  modelContextWindows: {
2583
- [OPENCODE_OX_ALPHA_FREE_MODEL]: OX_ALPHA_CONTEXT_WINDOW,
2584
2699
  [DEEPSEEK_VISION_PREVIEW_MODEL]: 1_048_576,
2585
2700
  },
2586
2701
  modelInputModalities: {
2587
- [OPENCODE_OX_ALPHA_FREE_MODEL]: ["text", "image"],
2588
2702
  [DEEPSEEK_VISION_PREVIEW_MODEL]: ["text", "image"],
2589
2703
  },
2590
2704
  // Same Zen roster behind the same base URL, so it carries the same measured
@@ -2676,6 +2790,7 @@ export const PROVIDER_REGISTRY: readonly ProviderRegistryEntry[] = [
2676
2790
  "@cf/deepseek-ai/deepseek-r1-distill-qwen-32b",
2677
2791
  "@cf/moonshotai/kimi-k2.7-code",
2678
2792
  "@cf/zai-org/glm-5.3",
2793
+ "@cf/zai-org/glm-5.3-flash",
2679
2794
  "@cf/zai-org/glm-5.2",
2680
2795
  "@cf/mistralai/mistral-small-3.1-24b-instruct",
2681
2796
  ],