@iislee/opencodex 2.11.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 (733) hide show
  1. package/AGENTS_INSTALL.md +109 -0
  2. package/README.md +117 -22
  3. package/bin/ocx.mjs +245 -88
  4. package/bin/package-main.mjs +1 -1
  5. package/gui/dist/assets/index-Be1sDpWw.css +1 -0
  6. package/gui/dist/assets/index-D4OKgUV4.js +114 -0
  7. package/gui/dist/index.html +2 -2
  8. package/gui/dist/provider-icons/alibaba-color.svg +1 -1
  9. package/gui/dist/provider-icons/antigravity-color.svg +1 -1
  10. package/gui/dist/provider-icons/claude-color.svg +1 -1
  11. package/gui/dist/provider-icons/cline-color.svg +16 -0
  12. package/gui/dist/provider-icons/cloudflare-ai-gateway-color.svg +1 -1
  13. package/gui/dist/provider-icons/commandcode-color.svg +1 -0
  14. package/gui/dist/provider-icons/copilot-color.svg +1 -1
  15. package/gui/dist/provider-icons/cursor-color.svg +1 -1
  16. package/gui/dist/provider-icons/deepseek-color.svg +1 -1
  17. package/gui/dist/provider-icons/firepass-color.svg +1 -1
  18. package/gui/dist/provider-icons/fireworks-color.svg +1 -1
  19. package/gui/dist/provider-icons/gemini-color.svg +1 -1
  20. package/gui/dist/provider-icons/github-copilot-color.svg +1 -1
  21. package/gui/dist/provider-icons/gitlab-duo-color.svg +1 -1
  22. package/gui/dist/provider-icons/grok.svg +1 -1
  23. package/gui/dist/provider-icons/groq-color.svg +1 -1
  24. package/gui/dist/provider-icons/huggingface-color.svg +1 -1
  25. package/gui/dist/provider-icons/kimi-color.svg +1 -1
  26. package/gui/dist/provider-icons/kiro-color.svg +2 -2
  27. package/gui/dist/provider-icons/lm-studio-color.svg +1 -1
  28. package/gui/dist/provider-icons/mistral-color.svg +1 -1
  29. package/gui/dist/provider-icons/moonshot-color.svg +1 -1
  30. package/gui/dist/provider-icons/nvidia-color.svg +1 -1
  31. package/gui/dist/provider-icons/ollama-color.svg +1 -1
  32. package/gui/dist/provider-icons/openai.svg +1 -1
  33. package/gui/dist/provider-icons/opencode.svg +2 -1
  34. package/gui/dist/provider-icons/openrouter-color.svg +1 -1
  35. package/gui/dist/provider-icons/pi.svg +2 -2
  36. package/gui/dist/provider-icons/qianfan-color.svg +1 -1
  37. package/gui/dist/provider-icons/qwen-portal-color.svg +1 -1
  38. package/gui/dist/provider-icons/vercel-ai-gateway-color.svg +1 -1
  39. package/gui/dist/provider-icons/vllm-color.svg +1 -1
  40. package/gui/dist/provider-icons/xiaomi-color.svg +1 -1
  41. package/package.json +21 -10
  42. package/src/adapters/anthropic-output-schema.ts +137 -0
  43. package/src/adapters/anthropic.ts +475 -62
  44. package/src/adapters/base.ts +82 -7
  45. package/src/adapters/client-fingerprint.ts +18 -12
  46. package/src/adapters/cline-pass-deepseek-v4-tool-replay.ts +69 -0
  47. package/src/adapters/command-code.ts +637 -0
  48. package/src/adapters/cursor/call-id.ts +44 -0
  49. package/src/adapters/cursor/catalog.ts +541 -0
  50. package/src/adapters/cursor/checkpoint-store.ts +308 -0
  51. package/src/adapters/cursor/cursor-errors.ts +144 -6
  52. package/src/adapters/cursor/discovery.ts +122 -14
  53. package/src/adapters/cursor/effort-map.ts +106 -4
  54. package/src/adapters/cursor/envelope-echo.ts +290 -0
  55. package/src/adapters/cursor/framing.ts +39 -0
  56. package/src/adapters/cursor/h2-pool.ts +123 -0
  57. package/src/adapters/cursor/http1-bidi.ts +361 -0
  58. package/src/adapters/cursor/images.ts +704 -0
  59. package/src/adapters/cursor/live-models.ts +180 -59
  60. package/src/adapters/cursor/live-transport.ts +623 -170
  61. package/src/adapters/cursor/message-mapper.ts +4 -1
  62. package/src/adapters/cursor/native-exec-common.ts +23 -2
  63. package/src/adapters/cursor/native-exec-desktop.ts +23 -0
  64. package/src/adapters/cursor/native-exec-fs.ts +10 -7
  65. package/src/adapters/cursor/native-exec-network.ts +1 -1
  66. package/src/adapters/cursor/native-exec-shell.ts +5 -3
  67. package/src/adapters/cursor/native-exec.ts +121 -14
  68. package/src/adapters/cursor/protobuf-events.ts +829 -11
  69. package/src/adapters/cursor/protobuf-request.ts +447 -75
  70. package/src/adapters/cursor/request-builder.ts +271 -35
  71. package/src/adapters/cursor/tool-definitions.ts +252 -12
  72. package/src/adapters/cursor/tool-result-normalize.ts +115 -0
  73. package/src/adapters/cursor/transport.ts +22 -0
  74. package/src/adapters/cursor/types.ts +48 -1
  75. package/src/adapters/cursor.ts +336 -39
  76. package/src/adapters/exec-tool-result-normalize.ts +99 -0
  77. package/src/adapters/google-antigravity-replay.ts +713 -41
  78. package/src/adapters/google-antigravity-wire.ts +48 -10
  79. package/src/adapters/google-errors.ts +44 -12
  80. package/src/adapters/google-http.ts +38 -10
  81. package/src/adapters/google-tool-schema.ts +80 -15
  82. package/src/adapters/google-truncation.ts +11 -0
  83. package/src/adapters/google.ts +742 -86
  84. package/src/adapters/identity.ts +39 -6
  85. package/src/adapters/image.ts +1 -1
  86. package/src/adapters/kiro-constants.ts +27 -0
  87. package/src/adapters/kiro-errors.ts +11 -0
  88. package/src/adapters/kiro-events.ts +19 -1
  89. package/src/adapters/kiro-thinking.ts +18 -2
  90. package/src/adapters/kiro-tools.ts +65 -17
  91. package/src/adapters/kiro.ts +270 -73
  92. package/src/adapters/mimo-free.ts +17 -0
  93. package/src/adapters/openai-chat-url.ts +11 -0
  94. package/src/adapters/openai-chat.ts +1377 -344
  95. package/src/adapters/openai-responses-url.ts +16 -0
  96. package/src/adapters/openai-responses.ts +1164 -64
  97. package/src/adapters/registry.ts +175 -0
  98. package/src/adapters/responses-tool-schema.ts +67 -0
  99. package/src/adapters/run-turn-queue.ts +36 -1
  100. package/src/adapters/tool-call-id.ts +119 -0
  101. package/src/adapters/tool-catalog-nudge.ts +105 -21
  102. package/src/adapters/xai-tool-schema.ts +436 -0
  103. package/src/adapters/xai-web-search.ts +186 -0
  104. package/src/bridge.ts +512 -92
  105. package/src/chat/inbound.ts +57 -20
  106. package/src/chat/outbound.ts +97 -33
  107. package/src/claude/agents-inject.ts +40 -10
  108. package/src/claude/context-windows.ts +37 -14
  109. package/src/claude/desktop-3p.ts +243 -9
  110. package/src/claude/gateway-cache.ts +41 -4
  111. package/src/claude/inbound.ts +72 -3
  112. package/src/claude/model-info.ts +38 -15
  113. package/src/claude/outbound.ts +88 -21
  114. package/src/cli/access.ts +46 -3
  115. package/src/cli/account-api.ts +150 -19
  116. package/src/cli/account-auth.ts +33 -6
  117. package/src/cli/account-catalog-refresh.ts +14 -0
  118. package/src/cli/account-extended.ts +648 -28
  119. package/src/cli/account-main.ts +317 -0
  120. package/src/cli/account.ts +97 -19
  121. package/src/cli/agent.ts +53 -2
  122. package/src/cli/alias.ts +66 -0
  123. package/src/cli/capabilities-command.ts +94 -0
  124. package/src/cli/capabilities.ts +496 -0
  125. package/src/cli/claude-agent-startup-sync.ts +73 -0
  126. package/src/cli/claude-desktop.ts +60 -15
  127. package/src/cli/claude.ts +129 -35
  128. package/src/cli/codex-log-guard-doctor.ts +103 -0
  129. package/src/cli/codex-shim-autorestore.ts +2 -0
  130. package/src/cli/codex-shim-readiness.ts +76 -0
  131. package/src/cli/combo.ts +8 -0
  132. package/src/cli/config-command.ts +74 -10
  133. package/src/cli/dispatch.ts +821 -0
  134. package/src/cli/doctor.ts +440 -56
  135. package/src/cli/ensure-desired-integrations.ts +152 -0
  136. package/src/cli/export-command.ts +46 -20
  137. package/src/cli/help.ts +34 -274
  138. package/src/cli/index.ts +417 -528
  139. package/src/cli/init.ts +5 -17
  140. package/src/cli/inspect.ts +230 -0
  141. package/src/cli/integrations.ts +120 -2
  142. package/src/cli/lab.ts +607 -0
  143. package/src/cli/launcher-context.ts +77 -0
  144. package/src/cli/minimax.ts +497 -0
  145. package/src/cli/models-runtime.ts +130 -2
  146. package/src/cli/models.ts +118 -16
  147. package/src/cli/observe.ts +123 -11
  148. package/src/cli/opencode.ts +4 -2
  149. package/src/cli/provider-runtime.ts +34 -3
  150. package/src/cli/provider.ts +25 -3
  151. package/src/cli/ready.ts +301 -0
  152. package/src/cli/registry.ts +476 -0
  153. package/src/cli/root.ts +86 -0
  154. package/src/cli/route-policy.ts +92 -0
  155. package/src/cli/runtime-api.ts +57 -10
  156. package/src/cli/star-prompt.ts +71 -15
  157. package/src/cli/status.ts +51 -4
  158. package/src/cli/storage.ts +234 -0
  159. package/src/cli/system-command.ts +16 -0
  160. package/src/cli/system-restart-client.ts +146 -0
  161. package/src/cli/tray-proxy.ts +153 -6
  162. package/src/cli/usage-report.ts +184 -0
  163. package/src/cli/v2.ts +137 -18
  164. package/src/cli/version-skew.ts +46 -0
  165. package/src/cli.ts +1 -1
  166. package/src/clients/config-export.ts +1442 -23
  167. package/src/clients/effective-status.ts +30 -2
  168. package/src/clients/probes/cline.ts +81 -0
  169. package/src/codex/account-label.ts +35 -1
  170. package/src/codex/account-lifecycle.ts +130 -13
  171. package/src/codex/account-namespaces.ts +49 -3
  172. package/src/codex/account-pause.ts +2 -1
  173. package/src/codex/account-priority.ts +84 -0
  174. package/src/codex/account-store.ts +29 -2
  175. package/src/codex/account-usability.ts +25 -2
  176. package/src/codex/admission.ts +256 -0
  177. package/src/codex/affinity-debug.ts +162 -0
  178. package/src/codex/app-server-processes.ts +570 -107
  179. package/src/codex/app-server-restart-service.ts +232 -0
  180. package/src/codex/auth-api.ts +893 -246
  181. package/src/codex/auth-collision.ts +5 -3
  182. package/src/codex/auth-context.ts +348 -32
  183. package/src/codex/autostart-health.ts +24 -1
  184. package/src/codex/catalog/account-models.ts +67 -0
  185. package/src/codex/catalog/aggregation.ts +86 -10
  186. package/src/codex/catalog/bundled.ts +331 -33
  187. package/src/codex/catalog/effort.ts +138 -32
  188. package/src/codex/catalog/filesystem-evidence.ts +302 -0
  189. package/src/codex/catalog/kinds.ts +2 -0
  190. package/src/codex/catalog/metadata.ts +555 -45
  191. package/src/codex/catalog/native-models.ts +75 -0
  192. package/src/codex/catalog/parsing.ts +269 -30
  193. package/src/codex/catalog/provider-fetch.ts +1626 -144
  194. package/src/codex/catalog/sync.ts +1576 -187
  195. package/src/codex/catalog-admission.ts +199 -0
  196. package/src/codex/catalog-refresh-status.ts +105 -0
  197. package/src/codex/catalog-write-serialization.ts +242 -0
  198. package/src/codex/catalog.ts +6 -3
  199. package/src/codex/codex-write-lock.ts +386 -0
  200. package/src/codex/convergence-types.ts +614 -0
  201. package/src/codex/convergence.ts +676 -0
  202. package/src/codex/coordinator-doctor.ts +332 -0
  203. package/src/codex/custom-model-catalog-migration.ts +176 -0
  204. package/src/codex/desired-state.ts +230 -0
  205. package/src/codex/desktop-app-restart.ts +355 -0
  206. package/src/codex/features.ts +636 -39
  207. package/src/codex/generation.ts +202 -0
  208. package/src/codex/history-job.ts +436 -0
  209. package/src/codex/history-lock.ts +242 -0
  210. package/src/codex/history-manifest.ts +112 -0
  211. package/src/codex/history-migration-guardian.ts +30 -24
  212. package/src/codex/history-provider.ts +1016 -235
  213. package/src/codex/history-transition.ts +105 -0
  214. package/src/codex/history-worker.ts +223 -0
  215. package/src/codex/inject-coordination.ts +373 -0
  216. package/src/codex/inject.ts +1114 -152
  217. package/src/codex/injected-marker.ts +37 -3
  218. package/src/codex/integration-record.ts +266 -0
  219. package/src/codex/internal/catalog-writer.ts +203 -0
  220. package/src/codex/internal/history-writer.ts +81 -0
  221. package/src/codex/journal.ts +66 -4
  222. package/src/codex/log-guard/inspect.ts +524 -0
  223. package/src/codex/log-guard/lock.ts +150 -0
  224. package/src/codex/log-guard/maintenance.ts +403 -0
  225. package/src/codex/log-guard/path-safety.ts +88 -0
  226. package/src/codex/log-guard/policy.ts +44 -0
  227. package/src/codex/log-guard/processes.ts +205 -0
  228. package/src/codex/log-guard/protection.ts +489 -0
  229. package/src/codex/log-guard/sqlite-errors.ts +9 -0
  230. package/src/codex/main-account-cache.ts +24 -0
  231. package/src/codex/main-account.ts +29 -1
  232. package/src/codex/management-convergence.ts +167 -0
  233. package/src/codex/model-cache.ts +56 -10
  234. package/src/codex/model-entitlements.ts +360 -0
  235. package/src/codex/native-main-admission.ts +47 -0
  236. package/src/codex/native-main-auth-temp.ts +187 -0
  237. package/src/codex/native-main-claim.ts +178 -0
  238. package/src/codex/native-main-lock-file.ts +162 -0
  239. package/src/codex/native-main-owner.ts +329 -0
  240. package/src/codex/native-profile-api.ts +247 -0
  241. package/src/codex/native-profile-manager.ts +1531 -0
  242. package/src/codex/native-profile-processes.ts +121 -0
  243. package/src/codex/native-profile-recovery.ts +99 -0
  244. package/src/codex/native-profile-stage-store.ts +387 -0
  245. package/src/codex/native-profile-startup.ts +622 -0
  246. package/src/codex/native-profile-store.ts +855 -0
  247. package/src/codex/native-profile-types.ts +120 -0
  248. package/src/codex/native-residue.ts +675 -0
  249. package/src/codex/paths.ts +80 -1
  250. package/src/codex/plan-from-token.ts +140 -0
  251. package/src/codex/plan.ts +40 -0
  252. package/src/codex/plugins-doctor.ts +1 -1
  253. package/src/codex/pool-rotation.ts +74 -4
  254. package/src/codex/project-config-warnings.ts +20 -6
  255. package/src/codex/prompt-journal.ts +352 -0
  256. package/src/codex/prompt-layers.ts +1313 -0
  257. package/src/codex/prompt-lock.ts +143 -0
  258. package/src/codex/prompt-text-probe.ts +238 -0
  259. package/src/codex/quota-rejection.ts +298 -0
  260. package/src/codex/quota.ts +264 -21
  261. package/src/codex/refresh.ts +11 -2
  262. package/src/codex/reset-credit-recovery.ts +1044 -0
  263. package/src/codex/routing.ts +514 -94
  264. package/src/codex/runtime.ts +159 -38
  265. package/src/codex/shim.ts +1065 -31
  266. package/src/codex/subagent-model-fallback.ts +437 -43
  267. package/src/codex/sync.ts +191 -2
  268. package/src/codex/transition-state.ts +720 -0
  269. package/src/codex/upstream-host-health.ts +368 -0
  270. package/src/codex/user-identity.ts +557 -0
  271. package/src/codex/warmup.ts +187 -81
  272. package/src/codex/write-coordination.ts +114 -0
  273. package/src/combos/failover.ts +47 -0
  274. package/src/combos/index.ts +4 -0
  275. package/src/combos/request.ts +32 -0
  276. package/src/combos/types.ts +91 -9
  277. package/src/compatibility/index.ts +26 -0
  278. package/src/compatibility/manifest.ts +253 -0
  279. package/src/compatibility/openai-responses.ts +121 -0
  280. package/src/config/atomic-write.ts +219 -0
  281. package/src/config/paths.ts +40 -0
  282. package/src/config/process-state.ts +309 -0
  283. package/src/config/provider-name.ts +24 -0
  284. package/src/config/provider-validation.ts +177 -0
  285. package/src/config/rebase-provenance.ts +68 -0
  286. package/src/config.ts +1713 -709
  287. package/src/generated/compatibility-version.json +3324 -0
  288. package/src/generated/{jawcode-model-metadata.ts → model-metadata.ts} +19 -17
  289. package/src/grok/inject.ts +16 -5
  290. package/src/grok/inspect.ts +45 -0
  291. package/src/grok/sync.ts +2 -2
  292. package/src/images/loop.ts +157 -33
  293. package/src/images/plan.ts +24 -13
  294. package/src/integrations/config-io.ts +269 -0
  295. package/src/integrations/journal.ts +315 -0
  296. package/src/integrations/merge.ts +135 -0
  297. package/src/integrations/mutation-flight.ts +71 -0
  298. package/src/integrations/native/ownership-preflight.ts +202 -0
  299. package/src/integrations/omp-yaml-source.ts +358 -0
  300. package/src/integrations/owned-refresh.ts +74 -0
  301. package/src/integrations/ownership-policy.ts +160 -0
  302. package/src/integrations/ownership.ts +155 -0
  303. package/src/integrations/registry.ts +166 -0
  304. package/src/integrations/serialize.ts +314 -0
  305. package/src/integrations/state.ts +433 -0
  306. package/src/integrations/store.ts +103 -0
  307. package/src/integrations/writer-lock.ts +98 -0
  308. package/src/integrations/writer.ts +715 -0
  309. package/src/lab/artifacts/sanitize.ts +586 -0
  310. package/src/lab/artifacts/secure-fs.ts +475 -0
  311. package/src/lab/artifacts/store.ts +310 -0
  312. package/src/lab/automation/budgets.ts +78 -0
  313. package/src/lab/automation/config-persistence.ts +256 -0
  314. package/src/lab/automation/constants.ts +39 -0
  315. package/src/lab/automation/cooldown.ts +103 -0
  316. package/src/lab/automation/dispatch.ts +211 -0
  317. package/src/lab/automation/index.ts +13 -0
  318. package/src/lab/automation/orchestrator.ts +499 -0
  319. package/src/lab/automation/persistence.ts +512 -0
  320. package/src/lab/automation/planner.ts +371 -0
  321. package/src/lab/automation/policy.ts +136 -0
  322. package/src/lab/automation/queue.ts +191 -0
  323. package/src/lab/automation/recovery.ts +24 -0
  324. package/src/lab/automation/route-context.ts +21 -0
  325. package/src/lab/automation/run-key.ts +44 -0
  326. package/src/lab/automation/runs-query.ts +34 -0
  327. package/src/lab/automation/types.ts +160 -0
  328. package/src/lab/conformance/assertion.ts +325 -0
  329. package/src/lab/conformance/digest.ts +22 -0
  330. package/src/lab/conformance/executor.ts +741 -0
  331. package/src/lab/conformance/fixture-provider.ts +27 -0
  332. package/src/lab/conformance/fixtures/live-v1-cases.json +175 -0
  333. package/src/lab/conformance/fixtures/protocol-v1-cases.json +461 -0
  334. package/src/lab/conformance/harness-budget.ts +47 -0
  335. package/src/lab/conformance/index.ts +5 -0
  336. package/src/lab/conformance/jcs.ts +64 -0
  337. package/src/lab/conformance/json-pointer.ts +39 -0
  338. package/src/lab/conformance/manifest.ts +180 -0
  339. package/src/lab/conformance/mcp-stub.ts +179 -0
  340. package/src/lab/conformance/negative-controls.ts +164 -0
  341. package/src/lab/conformance/observation.ts +355 -0
  342. package/src/lab/conformance/runner.ts +68 -0
  343. package/src/lab/conformance/sse-normalize.ts +59 -0
  344. package/src/lab/conformance/suite-manifest.ts +78 -0
  345. package/src/lab/conformance/types.ts +214 -0
  346. package/src/lab/constants.ts +126 -0
  347. package/src/lab/digest.ts +64 -0
  348. package/src/lab/events/errors.ts +9 -0
  349. package/src/lab/events/limits.ts +117 -0
  350. package/src/lab/events/types.ts +229 -0
  351. package/src/lab/events/validate.ts +781 -0
  352. package/src/lab/fabric/constants.ts +40 -0
  353. package/src/lab/fabric/executor.ts +492 -0
  354. package/src/lab/fabric/index.ts +80 -0
  355. package/src/lab/fabric/manifest.ts +222 -0
  356. package/src/lab/fabric/observe.ts +489 -0
  357. package/src/lab/fabric/patch.ts +79 -0
  358. package/src/lab/fabric/producer-child.ts +139 -0
  359. package/src/lab/fabric/producer-isolate.ts +276 -0
  360. package/src/lab/fabric/producer-protocol.ts +61 -0
  361. package/src/lab/fabric/scratch.ts +439 -0
  362. package/src/lab/fabric/subject.ts +106 -0
  363. package/src/lab/fabric/types.ts +134 -0
  364. package/src/lab/fabric/verifier.ts +98 -0
  365. package/src/lab/index.ts +54 -0
  366. package/src/lab/ledger/artifact-refs.ts +127 -0
  367. package/src/lab/ledger/invalidation.ts +136 -0
  368. package/src/lab/ledger/purge.ts +310 -0
  369. package/src/lab/ledger/store.ts +532 -0
  370. package/src/lab/live/credential-lease.ts +53 -0
  371. package/src/lab/live/destination.ts +155 -0
  372. package/src/lab/live/executor.ts +336 -0
  373. package/src/lab/live/inert-tools.ts +56 -0
  374. package/src/lab/live/manifest.ts +85 -0
  375. package/src/lab/live/mcp-loopback.ts +57 -0
  376. package/src/lab/live/runner.ts +19 -0
  377. package/src/lab/live/sandbox.ts +61 -0
  378. package/src/lab/live/suite-manifest.ts +41 -0
  379. package/src/lab/live/transport.ts +118 -0
  380. package/src/lab/live/types.ts +197 -0
  381. package/src/lab/observe/from-conformance.ts +301 -0
  382. package/src/lab/observe/from-live.ts +117 -0
  383. package/src/lab/paths.ts +153 -0
  384. package/src/lab/projection/rebuild.ts +495 -0
  385. package/src/lab/projection/schema.ts +135 -0
  386. package/src/lab/projection/verdicts.ts +474 -0
  387. package/src/lab/projection/verification.ts +412 -0
  388. package/src/lab/public/bundle.ts +217 -0
  389. package/src/lab/public/community-authority.ts +175 -0
  390. package/src/lab/public/community-files.ts +29 -0
  391. package/src/lab/public/community.ts +479 -0
  392. package/src/lab/public/file-safety.ts +155 -0
  393. package/src/lab/public/ids.ts +26 -0
  394. package/src/lab/public/index.ts +16 -0
  395. package/src/lab/public/mutation-lock.ts +424 -0
  396. package/src/lab/public/operator.ts +353 -0
  397. package/src/lab/public/origin-purge.ts +79 -0
  398. package/src/lab/public/origin.ts +203 -0
  399. package/src/lab/public/privacy.ts +143 -0
  400. package/src/lab/public/private-file.ts +261 -0
  401. package/src/lab/public/project.ts +124 -0
  402. package/src/lab/public/purge-test-fault.ts +21 -0
  403. package/src/lab/public/purge.ts +223 -0
  404. package/src/lab/public/registry.ts +44 -0
  405. package/src/lab/public/revocation.ts +252 -0
  406. package/src/lab/public/signature.ts +243 -0
  407. package/src/lab/public/storage.ts +105 -0
  408. package/src/lab/public/strict-json.ts +206 -0
  409. package/src/lab/public/time.ts +26 -0
  410. package/src/lab/public/types.ts +172 -0
  411. package/src/lab/public/validate.ts +391 -0
  412. package/src/lab/query/catalog.ts +101 -0
  413. package/src/lab/query/connection.ts +107 -0
  414. package/src/lab/query/constants.ts +4 -0
  415. package/src/lab/query/cursor.ts +132 -0
  416. package/src/lab/query/dto-map.ts +277 -0
  417. package/src/lab/query/errors.ts +22 -0
  418. package/src/lab/query/freshness.ts +53 -0
  419. package/src/lab/query/index.ts +45 -0
  420. package/src/lab/query/latest-observation.ts +59 -0
  421. package/src/lab/query/passive-production.ts +159 -0
  422. package/src/lab/query/queries.ts +444 -0
  423. package/src/lab/query/types.ts +266 -0
  424. package/src/lab/subject/behavior-fingerprint.ts +77 -0
  425. package/src/lab/subject/installation-salt.ts +112 -0
  426. package/src/lab/subject/protocol-subject.ts +80 -0
  427. package/src/lab/subject/route-subject.ts +74 -0
  428. package/src/lib/admin-secrets.ts +24 -0
  429. package/src/lib/app-owned-memory-stores.ts +22 -0
  430. package/src/lib/bounded-body.ts +167 -11
  431. package/src/lib/bun-runtime.ts +125 -12
  432. package/src/lib/bun-stream-caps.ts +13 -9
  433. package/src/lib/codex-restart-contract.ts +120 -0
  434. package/src/lib/config-ownership.ts +26 -2
  435. package/src/lib/destination-policy.ts +65 -1
  436. package/src/lib/errors.ts +80 -5
  437. package/src/lib/fabric-task-execution-authority.ts +7 -0
  438. package/src/lib/fabric-task-host.ts +29 -0
  439. package/src/lib/lab-activation.ts +223 -0
  440. package/src/lib/lab-live-execution-authority.ts +13 -0
  441. package/src/lib/lab-live-host.ts +30 -0
  442. package/src/lib/lab-live-pinned-sender.ts +56 -0
  443. package/src/lib/lab-live-route-production.ts +130 -0
  444. package/src/lib/lab-passive-linker-registration.ts +26 -0
  445. package/src/lib/local-management-attestation.ts +51 -0
  446. package/src/lib/local-management-capability.ts +100 -0
  447. package/src/lib/local-provider-reload-contract.ts +100 -0
  448. package/src/lib/optional-shutdown-hooks.ts +57 -0
  449. package/src/lib/package-tree-integrity.ts +101 -0
  450. package/src/lib/pinned-http.ts +145 -26
  451. package/src/lib/process-control.ts +6 -2
  452. package/src/lib/provider-outbound.ts +49 -9
  453. package/src/lib/redact.ts +419 -3
  454. package/src/lib/self-launch-argv.ts +15 -0
  455. package/src/lib/server-resource-ownership.ts +71 -0
  456. package/src/lib/service-secrets.ts +15 -0
  457. package/src/lib/shadow-call.ts +35 -4
  458. package/src/lib/sse-decoder.ts +41 -0
  459. package/src/lib/state-store-registrations.ts +10 -2
  460. package/src/lib/system-restart-contract.ts +73 -0
  461. package/src/lib/token-estimate.ts +19 -2
  462. package/src/lib/tool-argument-integers.ts +253 -0
  463. package/src/lib/translator-budget.ts +44 -0
  464. package/src/lib/upstream-http-version.ts +57 -0
  465. package/src/lib/upstream-reachability.ts +95 -0
  466. package/src/lib/upstream-retry.ts +156 -3
  467. package/src/lib/windows-atomic-replace.ts +155 -0
  468. package/src/lib/windows-elevation.ts +70 -2
  469. package/src/lib/windows-secret-acl.ts +409 -69
  470. package/src/lib/windows-service-wrappers.ts +72 -0
  471. package/src/lib/windows-text.ts +106 -0
  472. package/src/lib/windows-user-principal.ts +341 -0
  473. package/src/lib/winsw.ts +33 -5
  474. package/src/oauth/account-import/google-antigravity-adapter.ts +74 -0
  475. package/src/oauth/account-import/index.ts +15 -0
  476. package/src/oauth/account-import/parser.ts +83 -0
  477. package/src/oauth/account-import/registry.ts +18 -0
  478. package/src/oauth/account-import/service.ts +75 -0
  479. package/src/oauth/account-import/types.ts +91 -0
  480. package/src/oauth/anthropic.ts +12 -1
  481. package/src/oauth/callback-server.ts +30 -4
  482. package/src/oauth/chatgpt.ts +12 -1
  483. package/src/oauth/cline.ts +203 -0
  484. package/src/oauth/command-code.ts +239 -0
  485. package/src/oauth/cursor.ts +46 -5
  486. package/src/oauth/generic-account-failover.ts +231 -0
  487. package/src/oauth/google-antigravity.ts +35 -3
  488. package/src/oauth/health.ts +20 -12
  489. package/src/oauth/index.ts +462 -71
  490. package/src/oauth/key-providers.ts +25 -0
  491. package/src/oauth/kimi.ts +25 -3
  492. package/src/oauth/kiro.ts +95 -6
  493. package/src/oauth/local-token-detect.ts +13 -2
  494. package/src/oauth/log.ts +3 -1
  495. package/src/oauth/login-cli.ts +88 -28
  496. package/src/oauth/nous.ts +798 -0
  497. package/src/oauth/open-browser-choice.ts +26 -0
  498. package/src/oauth/store.ts +133 -26
  499. package/src/oauth/token-guardian.ts +9 -3
  500. package/src/oauth/types.ts +15 -0
  501. package/src/pi/models.ts +2 -2
  502. package/src/providers/alibaba-region-migration.ts +1 -1
  503. package/src/providers/antigravity-models.ts +521 -31
  504. package/src/providers/auto-compact-budget.ts +65 -0
  505. package/src/providers/base-url-choices.ts +10 -0
  506. package/src/providers/codex-capacity.ts +292 -0
  507. package/src/providers/command-code-efforts.ts +176 -0
  508. package/src/providers/context-cap.ts +26 -8
  509. package/src/providers/cursor-pool.ts +72 -0
  510. package/src/providers/default-aliases.ts +65 -0
  511. package/src/providers/derive.ts +281 -6
  512. package/src/providers/fastwire.ts +507 -0
  513. package/src/providers/free-directory.ts +10 -7
  514. package/src/providers/google-vertex-location.ts +14 -0
  515. package/src/providers/key-failover.ts +71 -3
  516. package/src/providers/label.ts +35 -2
  517. package/src/providers/model-discovery-limits.ts +16 -0
  518. package/src/providers/model-discovery.ts +115 -22
  519. package/src/providers/model-presets.ts +119 -0
  520. package/src/providers/model-rename-migration.ts +255 -0
  521. package/src/providers/model-rename-startup.ts +28 -0
  522. package/src/providers/new-model-policy.ts +146 -0
  523. package/src/providers/openai-sidecar.ts +72 -4
  524. package/src/providers/openai-tier-startup.ts +31 -2
  525. package/src/providers/openai-tiers.ts +119 -4
  526. package/src/providers/openai-virtual-models.ts +1 -0
  527. package/src/providers/opencode-zen-rate-limit.ts +102 -0
  528. package/src/providers/provider-id-rewrite.ts +30 -0
  529. package/src/providers/quota.ts +1379 -40
  530. package/src/providers/registry.ts +1545 -112
  531. package/src/providers/request-pacing.ts +310 -0
  532. package/src/providers/service-tier.ts +277 -0
  533. package/src/providers/slug-codec.ts +94 -6
  534. package/src/providers/static-model-discovery.ts +86 -0
  535. package/src/providers/xai-responses-opt-in.ts +15 -0
  536. package/src/providers/xai-transport.ts +32 -4
  537. package/src/reasoning-effort.ts +68 -3
  538. package/src/responses/apply-patch-envelope.ts +63 -0
  539. package/src/responses/code-mode-helper-compat.ts +50 -0
  540. package/src/responses/compaction.ts +26 -1
  541. package/src/responses/custom-tool-compat.ts +384 -0
  542. package/src/responses/hosted-tool-policy.ts +9 -0
  543. package/src/responses/namespace-tool-compat.ts +435 -0
  544. package/src/responses/parser.ts +225 -38
  545. package/src/responses/provider-continuation.ts +98 -0
  546. package/src/responses/provider-opaque-metadata.ts +73 -0
  547. package/src/responses/reasoning-envelope.ts +9 -1
  548. package/src/responses/reasoning-replay-cache.ts +504 -0
  549. package/src/responses/schema.ts +12 -2
  550. package/src/responses/spill-store.ts +75 -10
  551. package/src/responses/state.ts +659 -31
  552. package/src/responses/thought-signature-replay.ts +364 -0
  553. package/src/responses/tool-search-compat.ts +301 -0
  554. package/src/responses/truncated-stop-reason.ts +60 -0
  555. package/src/responses/turn-termination.ts +107 -0
  556. package/src/router.ts +405 -31
  557. package/src/routing/analytics.ts +379 -0
  558. package/src/routing/capability.ts +244 -0
  559. package/src/routing/compatibility/assemble.ts +73 -0
  560. package/src/routing/compatibility/behavior.ts +278 -0
  561. package/src/routing/compatibility/catalog.ts +99 -0
  562. package/src/routing/compatibility/endpoint.ts +52 -0
  563. package/src/routing/compatibility/lab-evidence-provider.ts +130 -0
  564. package/src/routing/compatibility/policy.ts +181 -0
  565. package/src/routing/compatibility/provider-slot.ts +56 -0
  566. package/src/routing/compatibility/reader.ts +110 -0
  567. package/src/routing/compatibility/subject.ts +191 -0
  568. package/src/routing/compatibility/types.ts +64 -0
  569. package/src/routing/compatibility/version.ts +104 -0
  570. package/src/routing/cost.ts +77 -0
  571. package/src/routing/evaluator.ts +495 -0
  572. package/src/routing/health.ts +412 -0
  573. package/src/routing/history/cursor.ts +43 -0
  574. package/src/routing/history/indexer.ts +605 -0
  575. package/src/routing/history/schema.ts +72 -0
  576. package/src/routing/profile-namespace.ts +15 -0
  577. package/src/routing/profile.ts +547 -0
  578. package/src/routing/quota.ts +155 -0
  579. package/src/routing/request-evidence.ts +45 -0
  580. package/src/routing/trace.ts +776 -0
  581. package/src/server/adapter-resolve.ts +2 -29
  582. package/src/server/auth-cors.ts +289 -48
  583. package/src/server/background-lifecycle.ts +182 -0
  584. package/src/server/chat-completions.ts +154 -72
  585. package/src/server/chat-native-sse.ts +331 -0
  586. package/src/server/chat-native.ts +445 -0
  587. package/src/server/claude-messages.ts +160 -44
  588. package/src/server/direct-local-http.ts +347 -0
  589. package/src/server/effort-policy.ts +18 -0
  590. package/src/server/github-copilot-responses-repair.ts +338 -0
  591. package/src/server/gui-static.ts +39 -10
  592. package/src/server/images.ts +94 -12
  593. package/src/server/index.ts +1021 -190
  594. package/src/server/lifecycle.ts +336 -14
  595. package/src/server/live.ts +136 -17
  596. package/src/server/local-management-read-client.ts +90 -0
  597. package/src/server/local-provider-reload-client.ts +137 -0
  598. package/src/server/management/agent-settings-routes.ts +433 -116
  599. package/src/server/management/api-key-usage.ts +31 -5
  600. package/src/server/management/body.ts +6 -0
  601. package/src/server/management/codex-prompt-routes.ts +570 -0
  602. package/src/server/management/combo-routes.ts +64 -25
  603. package/src/server/management/config-routes.ts +511 -51
  604. package/src/server/management/context.ts +89 -2
  605. package/src/server/management/integration-routes.ts +498 -0
  606. package/src/server/management/lab-automation-routes.ts +206 -0
  607. package/src/server/management/lab-routes.ts +563 -0
  608. package/src/server/management/logs-usage-routes.ts +127 -52
  609. package/src/server/management/model-routes.ts +461 -133
  610. package/src/server/management/model-rows.ts +167 -0
  611. package/src/server/management/native-integration-routes.ts +770 -0
  612. package/src/server/management/oauth-account-routes.ts +90 -8
  613. package/src/server/management/provider-capability-config.ts +48 -0
  614. package/src/server/management/provider-routes.ts +836 -159
  615. package/src/server/management/request-history-routes.ts +191 -0
  616. package/src/server/management/route-registry.ts +332 -0
  617. package/src/server/management/routing-analytics-routes.ts +74 -0
  618. package/src/server/management/routing-profile-routes.ts +380 -0
  619. package/src/server/management/shared.ts +27 -11
  620. package/src/server/management/sidebar-routes.ts +47 -31
  621. package/src/server/management/storage-log-guard-routes.ts +186 -0
  622. package/src/server/management/sync-response.ts +69 -0
  623. package/src/server/management/system-restart.ts +289 -33
  624. package/src/server/management/system-routes.ts +77 -0
  625. package/src/server/management/usage-summary-cache.ts +9 -1
  626. package/src/server/management/vision-sidecar-options.ts +167 -0
  627. package/src/server/management/web-search-sidecar-options.ts +120 -0
  628. package/src/server/management-api.ts +126 -23
  629. package/src/server/management-auth.ts +220 -5
  630. package/src/server/passive-route-linker.ts +66 -0
  631. package/src/server/port-reclaim.ts +1 -1
  632. package/src/server/ports.ts +41 -1
  633. package/src/server/proxy-liveness.ts +161 -10
  634. package/src/server/readiness.ts +99 -0
  635. package/src/server/relay-eager.ts +221 -54
  636. package/src/server/relay.ts +479 -87
  637. package/src/server/request-decompress.ts +113 -6
  638. package/src/server/request-log-conversation.ts +51 -0
  639. package/src/server/request-log.ts +298 -31
  640. package/src/server/responses/agent-task-recovery-cache.ts +143 -0
  641. package/src/server/responses/agent-task-recovery.ts +465 -0
  642. package/src/server/responses/codex-auth-error.ts +55 -0
  643. package/src/server/responses/collaboration.ts +239 -36
  644. package/src/server/responses/combo-stream-preflight.ts +178 -0
  645. package/src/server/responses/compact.ts +444 -72
  646. package/src/server/responses/core.ts +3579 -436
  647. package/src/server/responses/empty-completion-guard.ts +333 -0
  648. package/src/server/responses/encrypted-payload.ts +62 -39
  649. package/src/server/responses/fetch-helpers.ts +89 -99
  650. package/src/server/responses/input-admission.ts +187 -0
  651. package/src/server/responses/pacing-overload.ts +13 -0
  652. package/src/server/responses/passthrough-error.ts +33 -9
  653. package/src/server/responses/policy-fallback.ts +178 -0
  654. package/src/server/responses/responses-field-backfill.ts +343 -0
  655. package/src/server/responses/terminal-guard.ts +26 -5
  656. package/src/server/responses/upstream-error.ts +5 -0
  657. package/src/server/responses/ws-upstream.ts +381 -0
  658. package/src/server/responses-custom-tool-repair.ts +363 -0
  659. package/src/server/responses-item-id-repair.ts +54 -6
  660. package/src/server/responses-json-events.ts +90 -0
  661. package/src/server/responses-model-rewrite.ts +29 -0
  662. package/src/server/responses-reasoning-summary-rewrite.ts +178 -0
  663. package/src/server/responses-snapshot-repair.ts +621 -0
  664. package/src/server/responses-terminal-repair.ts +363 -0
  665. package/src/server/responses-tool-search-repair.ts +267 -0
  666. package/src/server/responses-undeclared-tool-guard.ts +376 -0
  667. package/src/server/responses.ts +18 -2
  668. package/src/server/search.ts +78 -13
  669. package/src/server/sse-frame-buffer.ts +319 -0
  670. package/src/server/sse-payload-rewrite.ts +110 -22
  671. package/src/server/startup-action-control.ts +8 -1
  672. package/src/server/startup-health-cache.ts +19 -1
  673. package/src/server/system-env.ts +80 -9
  674. package/src/server/ws-bridge.ts +53 -40
  675. package/src/service-manager-probe.ts +892 -0
  676. package/src/service.ts +1153 -94
  677. package/src/sidecar/auth.ts +92 -0
  678. package/src/sidecar/candidates.ts +83 -0
  679. package/src/storage/cleanup.ts +2 -2
  680. package/src/storage/policy-job.ts +14 -4
  681. package/src/storage/policy.ts +88 -23
  682. package/src/storage/scanner.ts +1 -1
  683. package/src/storage/worker-lifecycle.ts +14 -14
  684. package/src/tray/windows-tray.ps1 +83 -9
  685. package/src/tray/windows.ts +43 -16
  686. package/src/types/accounts.ts +37 -0
  687. package/src/types/config.ts +911 -0
  688. package/src/types/provider.ts +614 -0
  689. package/src/types/request.ts +397 -0
  690. package/src/types/tools.ts +236 -0
  691. package/src/types/wire.ts +80 -0
  692. package/src/types.ts +107 -1237
  693. package/src/update/index.ts +37 -23
  694. package/src/update/job.ts +445 -68
  695. package/src/update/notify.ts +12 -6
  696. package/src/update/npm-cache-preflight.d.mts +47 -0
  697. package/src/update/npm-cache-preflight.mjs +201 -0
  698. package/src/update/transactional-install.d.mts +22 -0
  699. package/src/update/transactional-install.mjs +266 -0
  700. package/src/usage/cost.ts +0 -0
  701. package/src/usage/expected-prices.ts +287 -16
  702. package/src/usage/log.ts +666 -50
  703. package/src/usage/summary.ts +388 -17
  704. package/src/usage/user-cost-overlay-reconciler.ts +313 -0
  705. package/src/usage/user-cost-overlays.ts +314 -0
  706. package/src/vision/anthropic-describe.ts +10 -6
  707. package/src/vision/backends.ts +97 -0
  708. package/src/vision/describe.ts +27 -16
  709. package/src/vision/eligibility.ts +250 -0
  710. package/src/vision/index.ts +238 -24
  711. package/src/vision/reasoning.ts +55 -0
  712. package/src/vision/routed-describe.ts +175 -0
  713. package/src/vision/timeout-bounds.ts +9 -0
  714. package/src/web-search/anthropic-executor.ts +13 -7
  715. package/src/web-search/backends.ts +108 -0
  716. package/src/web-search/exa-executor.ts +119 -0
  717. package/src/web-search/executor.ts +21 -6
  718. package/src/web-search/gemini-executor.ts +141 -0
  719. package/src/web-search/index.ts +150 -15
  720. package/src/web-search/loop.ts +284 -54
  721. package/src/web-search/parse.ts +125 -30
  722. package/src/web-search/sources.ts +60 -0
  723. package/src/web-search/xai-executor.ts +219 -0
  724. package/gui/dist/assets/index-DTpMHS4F.js +0 -67
  725. package/gui/dist/assets/index-ZNVDE3C7.css +0 -1
  726. package/gui/dist/provider-icons/antigravity.svg +0 -1
  727. package/gui/dist/provider-icons/claude.svg +0 -1
  728. package/gui/dist/provider-icons/copilot.svg +0 -1
  729. package/gui/dist/provider-icons/cursor.svg +0 -2
  730. package/gui/dist/provider-icons/gemini.svg +0 -1
  731. package/gui/dist/provider-icons/grok-color.svg +0 -1
  732. package/gui/dist/provider-icons/kiro.svg +0 -14
  733. package/src/cli/internal-dispatch.ts +0 -20
@@ -1,8 +1,11 @@
1
1
  import {
2
2
  CANONICAL_EFFORT_SUFFIXES,
3
3
  cursorModelEffortLadder,
4
+ cursorModelHasEffortTiers,
4
5
  cursorWireModelIdWithEffort,
6
+ CURSOR_THINKING_MODEL_IDS,
5
7
  } from "./effort-map";
8
+ import { parseCursorVariantId } from "./catalog";
6
9
 
7
10
  export interface CursorModelInfo {
8
11
  id: string;
@@ -26,10 +29,10 @@ export function inferCursorContextWindow(modelId: string): number {
26
29
  const id = modelId.trim().toLowerCase();
27
30
  if (id.includes("1m")) return CONTEXT_1M;
28
31
  if (id.startsWith("gemini-")) return CONTEXT_1M;
29
- if (id === "glm-5.2") return CONTEXT_1M;
32
+ if (id === "glm-5.3" || id === "glm-5.2") return CONTEXT_1M;
30
33
  if (id.startsWith("gpt-5.6-")) return CONTEXT_1M;
31
34
  if (id.startsWith("gpt-5") || id === "gpt-5-codex") return CONTEXT_272K;
32
- if (id.startsWith("grok-4.5")) return 500_000;
35
+ if (id.startsWith("grok-4.5") || id.startsWith("grok-4.6")) return 500_000;
33
36
  if (id.startsWith("grok-")) return CONTEXT_256K;
34
37
  if (id.includes("claude")) return CONTEXT_200K;
35
38
  return CURSOR_DEFAULT_CONTEXT_WINDOW;
@@ -74,9 +77,16 @@ function stripCursorWirePrefix(id: string): string {
74
77
  * ordinary `{base}-{effort}` form, or Cursor's current `{base-without-fast}-{effort}-fast` form.
75
78
  */
76
79
  export function isCursorModelAvailableForAccount(modelId: string, liveIds: readonly string[]): boolean {
80
+ // Umbrella matching (devlog 260828_cursor_umbrella_catalog): a live suffix
81
+ // id counts toward its BASE — any variant dimension (thinking/fast/effort)
82
+ // proves the account can reach the umbrella. Unknown ids fall back to the
83
+ // legacy exact/suffix comparison so non-cataloged rows keep matching.
84
+ const parsedTarget = parseCursorVariantId(modelId);
77
85
  return liveIds.some(raw => {
78
86
  const id = stripCursorWirePrefix(raw);
79
87
  if (id === modelId) return true;
88
+ const parsedLive = parseCursorVariantId(id);
89
+ if (parsedLive.known && parsedTarget.known && parsedLive.baseId === parsedTarget.baseId) return true;
80
90
  for (const effort of CANONICAL_EFFORT_SUFFIXES) {
81
91
  if (
82
92
  id === `${modelId}-${effort}` ||
@@ -103,6 +113,28 @@ export const CURSOR_ROUTER_MODEL_IDS = [
103
113
  ...CURSOR_ROUTING_LEVELS.map(level => `${CURSOR_AUTO_MODEL_ID}-${level}`),
104
114
  ] as const;
105
115
 
116
+ /**
117
+ * Cursor models that cannot see images natively. OpenCodex routes them through the vision
118
+ * sidecar (the catalog still advertises image so Codex can attach). Evidence:
119
+ * - Composer family: Cursor staff — text-only; "Model does not support images"
120
+ * - Auto / router modes: Cursor docs omit Images for Auto Cost; staff — pick Claude/GPT for images
121
+ * - glm-5.2: Cursor docs omit Images; Z.ai GLM-5.2 is text-only (vision is GLM-5V)
122
+ * - glm-5.3: same family; seeded as text-only ahead of Cursor's lineup update
123
+ *
124
+ * Composer ids are enumerated explicitly — prefix wildcard matching is deliberately out of
125
+ * scope here; a live-discovered new Composer slug stays native-path until curated. Everyone
126
+ * else in the static seed (Claude, Gemini, GPT, Kimi, Grok) takes SelectedImage. Other
127
+ * live-discovered ids stay unclassified (native path) until curated.
128
+ */
129
+ export const CURSOR_NO_VISION_MODELS = [
130
+ ...CURSOR_ROUTER_MODEL_IDS,
131
+ "composer-1",
132
+ "composer-2.5",
133
+ "composer-2.5-fast",
134
+ "glm-5.2",
135
+ "glm-5.3",
136
+ ] as const;
137
+
106
138
  /** Wire id Cursor Connect expects for the auto-router (GetUsableModels returns `default`, not `auto`). */
107
139
  export const CURSOR_AUTO_WIRE_MODEL_ID = "default";
108
140
 
@@ -130,6 +162,25 @@ export function cursorCodexToWireModelId(modelId: string): string {
130
162
  return cursorWireModelSelection(modelId).modelId;
131
163
  }
132
164
 
165
+ /**
166
+ * Synthetic ultra/big-context picker marker (devlog 260826 070). A `cursor/<base>-1m` row is a
167
+ * picker-only variant: the wire request keeps `<base>` (plus effort suffix) and turns on Cursor
168
+ * Max Mode instead. Only ids listed here are treated as synthetic — a real upstream wire id that
169
+ * happens to end in `-1m` never collides because it will not be in this set.
170
+ */
171
+ export const CURSOR_ULTRA_1M_MODEL_IDS: ReadonlySet<string> = new Set([
172
+ "kimi-k3-1m",
173
+ ]);
174
+
175
+ const CURSOR_ULTRA_1M_SUFFIX = "-1m";
176
+
177
+ /** Resolve a synthetic ultra marker id to its wire base, or undefined for ordinary ids. */
178
+ export function cursorUltraBaseModelId(modelId: string): string | undefined {
179
+ const normalized = modelId.startsWith("cursor/") ? modelId.slice("cursor/".length) : modelId;
180
+ if (!CURSOR_ULTRA_1M_MODEL_IDS.has(normalized)) return undefined;
181
+ return normalized.slice(0, -CURSOR_ULTRA_1M_SUFFIX.length);
182
+ }
183
+
133
184
  /**
134
185
  * Cursor-native wire models keep server-side conversation state reliably.
135
186
  * External models (gpt/claude/gemini/grok families and similar) are more brittle on resumeAction.
@@ -146,6 +197,24 @@ export function isCursorExternalWireModel(modelId: string): boolean {
146
197
  return !isCursorNativeWireModel(modelId);
147
198
  }
148
199
 
200
+ /**
201
+ * Native composer models whose tool-result continuation must still be sent as a
202
+ * userMessageAction with the plain "Continue:" text instead of a bare resumeAction.
203
+ *
204
+ * Observed on live Cursor Connect traffic (2026-08-20): `composer-2.5` (the
205
+ * standard, non-fast build) resumes a tool-result turn with server-side native
206
+ * tool calls (read/grep/exec) instead of answering, or completes with zero text
207
+ * (empty `content` + `stop`). `composer-2.5-fast` answers correctly on the same
208
+ * resumeAction path, so only the affected id is listed here. Sending the same
209
+ * continuation as an explicit user message (external path) makes the model
210
+ * answer reliably.
211
+ */
212
+ export function cursorNeedsExternalToolContinuation(modelId: string): boolean {
213
+ if (isCursorExternalWireModel(modelId)) return true;
214
+ const wire = cursorCodexToWireModelId(modelId).trim().toLowerCase();
215
+ return wire === "composer-2.5";
216
+ }
217
+
149
218
  function stripCursorEffortSuffix(wireModelId: string): string {
150
219
  const suffixes = [...CANONICAL_EFFORT_SUFFIXES].sort((a, b) => b.length - a.length);
151
220
  for (const suffix of suffixes) {
@@ -155,6 +224,13 @@ function stripCursorEffortSuffix(wireModelId: string): string {
155
224
  return wireModelId;
156
225
  }
157
226
 
227
+ /** Compare Cursor wire models without effort suffix or the grok cursor- request prefix. */
228
+ export function cursorCheckpointModelAffinityId(modelId: string): string {
229
+ const wire = cursorCodexToWireModelId(modelId).trim().toLowerCase();
230
+ const withoutPrefix = wire.startsWith("cursor-") ? wire.slice("cursor-".length) : wire;
231
+ return stripCursorEffortSuffix(withoutPrefix);
232
+ }
233
+
158
234
  export function isCursorRouterModelId(modelId: string): boolean {
159
235
  return (CURSOR_ROUTER_MODEL_IDS as readonly string[]).includes(modelId);
160
236
  }
@@ -165,10 +241,25 @@ export function filterCursorConfiguredModelsByLiveDiscovery<T extends { id: stri
165
241
  liveIds: readonly string[],
166
242
  ): T[] {
167
243
  return configured.filter(model =>
168
- isCursorRouterModelId(model.id) || isCursorModelAvailableForAccount(model.id, liveIds),
244
+ !CURSOR_KNOWN_UNCALLABLE_MODEL_IDS.has(model.id)
245
+ && (
246
+ isCursorRouterModelId(model.id)
247
+ // Synthetic ultra rows ride their base model's account availability.
248
+ || isCursorModelAvailableForAccount(cursorUltraBaseModelId(model.id) ?? model.id, liveIds)
249
+ ),
169
250
  );
170
251
  }
171
252
 
253
+ /**
254
+ * Models GetUsableModels advertises but whose every Run returns not_found (catalog honesty,
255
+ * devlog 260826_cursor_responses_gap 060). The claude-opus-5 REGULAR wire family is the known
256
+ * case (probes 2026-08-26: 100% not_found while -fast/-thinking succeed) — under the umbrella
257
+ * catalog (devlog 260828) that quarantine moved to the RESOLVER level: the capability marks the
258
+ * regular VARIANT quarantined, the bare slug routes the healthy thinking variant, and the base
259
+ * row stays in the seed. This row-level set stays for future whole-base quarantines.
260
+ */
261
+ export const CURSOR_KNOWN_UNCALLABLE_MODEL_IDS: ReadonlySet<string> = new Set([]);
262
+
172
263
  export const CURSOR_STATIC_MODELS: readonly CursorModelInfo[] = normalizeCursorModels([
173
264
  // Context windows and the model lineup mirror Cursor's public models/pricing docs plus the jawcode
174
265
  // SOT (../jawcode/packages/ai/src/models.json, `cursor` provider), which mirrors the real
@@ -180,20 +271,26 @@ export const CURSOR_STATIC_MODELS: readonly CursorModelInfo[] = normalizeCursorM
180
271
  // gemini/grok/kimi-k2.7/gpt-5-mini are reasoning models in the SOT but are sent bare (no tier picker).
181
272
  ...CURSOR_ROUTER_MODEL_IDS.map(id => ({ id, contextWindow: CONTEXT_200K, supportsReasoningEffort: false })),
182
273
 
183
- { id: "claude-sonnet-5", contextWindow: CONTEXT_200K, supportsReasoningEffort: true },
274
+ // Umbrella seed (devlog 260828_cursor_umbrella_catalog): one row per BASE
275
+ // model. Thinking merges into the base (the resolver routes the thinking
276
+ // variant); fast / thinking-fast / -1m stay routable as aliases but add no
277
+ // rows. Windows follow CURSOR_CAPABILITIES where the base is cataloged.
278
+ { id: "claude-sonnet-5", contextWindow: CONTEXT_1M, supportsReasoningEffort: true },
184
279
  { id: "claude-4-sonnet", contextWindow: CONTEXT_200K },
185
280
  { id: "claude-4-sonnet-1m", contextWindow: CONTEXT_1M },
186
281
  { id: "claude-4.5-haiku", contextWindow: CONTEXT_200K },
187
282
  { id: "claude-4.5-sonnet", contextWindow: CONTEXT_200K },
188
283
  { id: "claude-4.5-opus", contextWindow: CONTEXT_200K, supportsReasoningEffort: true },
189
- { id: "claude-4.6-opus", contextWindow: CONTEXT_200K, supportsReasoningEffort: true },
190
- { id: "claude-4.6-sonnet", contextWindow: CONTEXT_200K, supportsReasoningEffort: true },
191
- { id: "claude-opus-4-7", contextWindow: CONTEXT_200K, supportsReasoningEffort: true },
192
- // opus-4-7-fast: effort-suffix tiers unverified -> no tier picker; sent bare like live-only ids.
193
- { id: "claude-opus-4-7-fast", contextWindow: CONTEXT_200K },
194
- { id: "claude-opus-4-8", contextWindow: CONTEXT_200K, supportsReasoningEffort: true },
195
- { id: "claude-opus-5", contextWindow: CONTEXT_200K, supportsReasoningEffort: true },
196
- { id: "claude-fable-5", contextWindow: CONTEXT_200K, supportsReasoningEffort: true },
284
+ { id: "claude-4.6-opus", contextWindow: CONTEXT_1M, supportsReasoningEffort: true },
285
+ { id: "claude-4.6-sonnet", contextWindow: CONTEXT_1M, supportsReasoningEffort: true },
286
+ { id: "claude-opus-4-7", contextWindow: CONTEXT_1M, supportsReasoningEffort: true },
287
+ { id: "claude-opus-4-8", contextWindow: CONTEXT_1M, supportsReasoningEffort: true },
288
+ // claude-opus-5: regular variant is quarantined (not_found on every Run) but
289
+ // the umbrella row routes the THINKING variant, which is live — so the base
290
+ // row returns to the seed under the umbrella (resolver never sends the
291
+ // quarantined regular wire id for the bare slug).
292
+ { id: "claude-opus-5", contextWindow: CONTEXT_1M, supportsReasoningEffort: true },
293
+ { id: "claude-fable-5", contextWindow: CONTEXT_1M, supportsReasoningEffort: true },
197
294
 
198
295
  { id: "composer-1", contextWindow: CONTEXT_200K },
199
296
  { id: "composer-2.5", contextWindow: CONTEXT_200K },
@@ -205,6 +302,10 @@ export const CURSOR_STATIC_MODELS: readonly CursorModelInfo[] = normalizeCursorM
205
302
  { id: "gemini-3-pro-image-preview", contextWindow: CONTEXT_200K },
206
303
  { id: "gemini-3.1-pro", contextWindow: CONTEXT_GEMINI },
207
304
  { id: "gemini-3.5-flash", contextWindow: CONTEXT_200K },
305
+ // 260825 live GetUsableModels: both ship only as effort-suffixed ids, so each exposes a tier
306
+ // picker. 3.6 is the only Cursor model with a `minimal` rung.
307
+ { id: "gemini-3.6-flash", contextWindow: CONTEXT_GEMINI, supportsReasoningEffort: true },
308
+ { id: "gemini-3.7-flash", contextWindow: CONTEXT_GEMINI, supportsReasoningEffort: true },
208
309
 
209
310
  { id: "gpt-5-codex", contextWindow: CONTEXT_272K },
210
311
  { id: "gpt-5-fast", contextWindow: CONTEXT_272K },
@@ -233,13 +334,20 @@ export const CURSOR_STATIC_MODELS: readonly CursorModelInfo[] = normalizeCursorM
233
334
  // Conflict resolution (260709): keep the refreshed 1M context + kimi-k2.7-code from de12fc8,
234
335
  // take PR #73's supportsReasoningEffort for glm-5.2 (its effort-map tiers landed with the PR).
235
336
  { id: "glm-5.2", contextWindow: CONTEXT_1M, supportsReasoningEffort: true },
337
+ // 260814 preemptive: glm-5.3 seeded ahead of Cursor's lineup update (mirrors glm-5.2).
338
+ { id: "glm-5.3", contextWindow: CONTEXT_1M, supportsReasoningEffort: true },
236
339
  { id: "kimi-k2.7-code", contextWindow: CONTEXT_262K },
237
340
  // kimi-k3: cursor.com/docs/models/kimi-k3; account-verified via GetUsableModels (2026-07-28) —
238
341
  // ships only as effort-suffixed kimi-k3-{low,high,max}, so the tier picker is exposed.
239
- { id: "kimi-k3", contextWindow: CONTEXT_262K, supportsReasoningEffort: true },
342
+ // kimi-k3 folds the old synthetic kimi-k3-1m row into the umbrella: the base
343
+ // is maxModeVerified (user-verified 1M on the Ultra plan, devlog 260826/025),
344
+ // so the ultra effort rung arms Max Mode on the wire and the separate picker
345
+ // row is gone. cursor/kimi-k3-1m stays routable as an alias.
346
+ { id: "kimi-k3", contextWindow: CONTEXT_1M, supportsReasoningEffort: true },
240
347
 
241
348
  { id: "grok-4.5", contextWindow: 500_000, supportsReasoningEffort: true },
242
- { id: "grok-4.5-fast", contextWindow: 500_000, supportsReasoningEffort: true },
349
+ // 260813 preemptive: grok-4.6 seeded ahead of Cursor's lineup update (mirrors grok-4.5).
350
+ { id: "grok-4.6", contextWindow: 500_000, supportsReasoningEffort: true },
243
351
  ]);
244
352
 
245
353
  export function cursorModelIds(models: readonly CursorModelInfo[] = CURSOR_STATIC_MODELS): string[] {
@@ -4,7 +4,7 @@
4
4
  * Cursor model ids encode the reasoning effort as a suffix (`claude-4.6-opus-high`), and the available
5
5
  * tiers differ per model — `claude-4.6-opus` tops out at `-max`, `claude-opus-4-8` at `-xhigh`,
6
6
  * `claude-4.6-sonnet` only has `-medium`, and most `composer`/`gemini` models take no suffix at all.
7
- * Grok Fast puts its mode marker after the effort (`grok-4.5-high-fast`). A bare id for a model that
7
+ * Grok Fast puts its mode marker after the effort (`grok-4.6-xhigh-fast`). A bare id for a model that
8
8
  * requires a suffix is rejected `ERROR_BAD_MODEL_NAME` (devlog 350.105).
9
9
  *
10
10
  * Canonical effort order is always low < medium < high < xhigh < max (max is the top tier, confirmed
@@ -24,17 +24,50 @@ const CURSOR_MODEL_EFFORT_TIERS: Record<string, readonly string[]> = {
24
24
  // against Anthropic's effort ladder docs and Cursor's live model lineup.
25
25
  "claude-fable-5": ["low", "medium", "high", "xhigh", "max"],
26
26
  "claude-opus-4-7": ["low", "medium", "high", "xhigh", "max"],
27
+ // Opus Fast tiers from the 260822 GetUsableModels dump (devlog .../300): the wire
28
+ // exposes {base-without-fast}-{effort}-fast only; suffix derivation at the bottom of
29
+ // this file produces those ids. opus-5-fast has no xhigh/max (non-thinking) yet.
30
+ "claude-opus-4-7-fast": ["low", "medium", "high", "xhigh", "max"],
27
31
  "claude-opus-4-8": ["low", "medium", "high", "xhigh", "max"],
32
+ "claude-opus-4-8-fast": ["low", "medium", "high", "xhigh", "max"],
28
33
  "claude-opus-5": ["low", "medium", "high", "xhigh", "max"],
34
+ "claude-opus-5-fast": ["low", "medium", "high"],
29
35
  "claude-sonnet-5": ["low", "medium", "high", "xhigh", "max"],
30
36
  "glm-5.2": ["high", "max"],
37
+ // 260825 live GetUsableModels. gemini-3.6-flash is the only Cursor model exposing `minimal`;
38
+ // listing it here is also what admits the suffix into CANONICAL_EFFORT_SUFFIXES below.
39
+ "gemini-3.6-flash": ["minimal", "low", "medium", "high"],
40
+ "gemini-3.7-flash": ["low", "medium", "high"],
41
+ // Explicit-thinking variants (260825 live roster). Tiers are the rungs the wire actually
42
+ // lists for each family, which is not always the same set the non-thinking id carries:
43
+ // 4.6-opus thinks only at high/max, 4.5-opus only at high, 4.6-sonnet only at medium.
44
+ "claude-opus-5-thinking": ["low", "medium", "high", "xhigh", "max"],
45
+ "claude-opus-5-thinking-fast": ["low", "medium", "high", "xhigh", "max"],
46
+ "claude-opus-4-8-thinking": ["low", "medium", "high", "xhigh", "max"],
47
+ "claude-opus-4-8-thinking-fast": ["low", "medium", "high", "xhigh", "max"],
48
+ "claude-opus-4-7-thinking": ["low", "medium", "high", "xhigh", "max"],
49
+ "claude-opus-4-7-thinking-fast": ["low", "medium", "high", "xhigh", "max"],
50
+ "claude-sonnet-5-thinking": ["low", "medium", "high", "xhigh", "max"],
51
+ "claude-fable-5-thinking": ["low", "medium", "high", "xhigh", "max"],
52
+ "claude-4.6-opus-thinking": ["high", "max"],
53
+ "claude-4.5-opus-thinking": ["high"],
54
+ "claude-4.6-sonnet-thinking": ["medium"],
55
+ // 260814 preemptive: glm-5.3 seeded ahead of Cursor's lineup update. Unlike 5.2, Z.AI folds
56
+ // 5.3 efforts into low/high/max (docs.z.ai/devpack/latest-model), so `low` is a real tier.
57
+ "glm-5.3": ["low", "high", "max"],
31
58
  // GetUsableModels (2026-07-28) lists kimi-k3 only as effort-suffixed kimi-k3-{low,high,max};
32
59
  // the bare id returns not_found. Tiers mirror the native Kimi provider's K3 ladder.
33
60
  "kimi-k3": ["low", "high", "max"],
61
+ // Synthetic ultra picker variant (devlog 260826 070): same tier ladder as kimi-k3; the -1m
62
+ // marker is stripped before wire-id composition, so these tiers never form a wire suffix.
63
+ "kimi-k3-1m": ["low", "high", "max"],
34
64
  // Cursor renamed the Grok 4.5 slugs to cursor-grok-4.5-{low,medium,high} and
35
65
  // cursor-grok-4.5-{low,medium,high}-fast. The bare Fast id returns not_found.
36
66
  "grok-4.5": ["low", "medium", "high"],
37
67
  "grok-4.5-fast": ["low", "medium", "high"],
68
+ // Cursor's 260813 lineup exposes Grok 4.6 Extra High in both regular and Fast forms.
69
+ "grok-4.6": ["low", "medium", "high", "xhigh"],
70
+ "grok-4.6-fast": ["low", "medium", "high", "xhigh"],
38
71
  "gpt-5.1": ["low", "high"],
39
72
  "gpt-5.1-codex-max": ["low", "medium", "high", "xhigh"],
40
73
  "gpt-5.1-codex-mini": ["low", "high"],
@@ -59,6 +92,46 @@ export const CANONICAL_EFFORT_SUFFIXES: ReadonlySet<string> = new Set([
59
92
 
60
93
  const CANONICAL_CODEX_EFFORT_ORDER = ["low", "medium", "high", "xhigh", "max"] as const;
61
94
 
95
+ /**
96
+ * Cursor's explicit-thinking variants, exposed as first-class Codex model ids the same way the
97
+ * `-fast` families were.
98
+ *
99
+ * `source` is the id whose wire name the variant is built from; `order` is where Cursor puts the
100
+ * thinking marker relative to the effort rung. All three shapes exist in the live roster
101
+ * (GetUsableModels, 260825), and using the wrong one is rejected with ERROR_BAD_MODEL_NAME:
102
+ *
103
+ * thinking-then-effort claude-opus-5-thinking-high, claude-opus-5-thinking-high-fast
104
+ * effort-then-thinking claude-4.6-opus-high-thinking
105
+ * bare claude-4.5-sonnet-thinking (the model has no effort rung)
106
+ */
107
+ const CURSOR_THINKING_FAMILIES: Readonly<Record<string, { source: string; order: "thinking-then-effort" | "effort-then-thinking" | "bare" }>> = {
108
+ "claude-opus-5-thinking": { source: "claude-opus-5", order: "thinking-then-effort" },
109
+ "claude-opus-5-thinking-fast": { source: "claude-opus-5-fast", order: "thinking-then-effort" },
110
+ "claude-opus-4-8-thinking": { source: "claude-opus-4-8", order: "thinking-then-effort" },
111
+ "claude-opus-4-8-thinking-fast": { source: "claude-opus-4-8-fast", order: "thinking-then-effort" },
112
+ "claude-opus-4-7-thinking": { source: "claude-opus-4-7", order: "thinking-then-effort" },
113
+ "claude-opus-4-7-thinking-fast": { source: "claude-opus-4-7-fast", order: "thinking-then-effort" },
114
+ "claude-sonnet-5-thinking": { source: "claude-sonnet-5", order: "thinking-then-effort" },
115
+ "claude-fable-5-thinking": { source: "claude-fable-5", order: "thinking-then-effort" },
116
+ "claude-4.6-opus-thinking": { source: "claude-4.6-opus", order: "effort-then-thinking" },
117
+ "claude-4.5-opus-thinking": { source: "claude-4.5-opus", order: "effort-then-thinking" },
118
+ "claude-4.6-sonnet-thinking": { source: "claude-4.6-sonnet", order: "effort-then-thinking" },
119
+ "claude-4.5-sonnet-thinking": { source: "claude-4.5-sonnet", order: "bare" },
120
+ "claude-4-sonnet-thinking": { source: "claude-4-sonnet", order: "bare" },
121
+ };
122
+
123
+ /** Codex-facing ids for Cursor's explicit-thinking variants. */
124
+ export const CURSOR_THINKING_MODEL_IDS = Object.keys(CURSOR_THINKING_FAMILIES);
125
+
126
+ /**
127
+ * Picker order, which is the canonical ladder plus the declared sentinels that rank below `low`.
128
+ *
129
+ * `cursorModelEffortLadder` filters against this, so a tier absent from it is silently dropped
130
+ * from the Codex picker even though `cursorEffortSuffix` would happily send it. That is what
131
+ * hid `gemini-3.6-flash-minimal`, the one Cursor model with a `minimal` rung.
132
+ */
133
+ const CURSOR_PICKER_EFFORT_ORDER = ["minimal", ...CANONICAL_CODEX_EFFORT_ORDER] as const;
134
+
62
135
  function normalizeRequestedEffort(reasoning: string | undefined): string | undefined {
63
136
  const normalized = reasoning?.toLowerCase();
64
137
  return normalized === "ultra" ? "max" : normalized;
@@ -107,7 +180,7 @@ export function cursorModelEffortLadder(baseModelId: string): string[] | undefin
107
180
  const tiers = CURSOR_MODEL_EFFORT_TIERS[baseModelId];
108
181
  if (!tiers || tiers.length === 0) return undefined;
109
182
  const tierSet = new Set(tiers);
110
- return CANONICAL_CODEX_EFFORT_ORDER.filter(effort => tierSet.has(effort));
183
+ return CURSOR_PICKER_EFFORT_ORDER.filter(effort => tierSet.has(effort));
111
184
  }
112
185
 
113
186
  /** Base models known to carry a reasoning-effort suffix (everything else is sent bare). */
@@ -116,12 +189,41 @@ export function cursorModelHasEffortTiers(baseModelId: string): boolean {
116
189
  }
117
190
 
118
191
  /**
119
- * Compose a Cursor wire id from a Codex-facing base id and effort tier.
120
- * Fast variants put the mode after the effort; other models use the ordinary `{base}-{effort}` form.
192
+ * Compose Cursor's flattened model id from a Codex-facing base id and effort tier. Discovery uses
193
+ * this for the ids returned by GetUsableModels. Parameterized Grok Fast requests bypass the flat id
194
+ * and send the base model plus requested_model parameters instead.
121
195
  */
122
196
  export function cursorWireModelIdWithEffort(baseModelId: string, effortSuffix: string): string {
197
+ const thinking = CURSOR_THINKING_FAMILIES[baseModelId];
198
+ if (thinking) {
199
+ const { source, order } = thinking;
200
+ // Cursor writes the thinking marker on either side of the effort depending on family
201
+ // (measured against GetUsableModels, 260825):
202
+ // thinking-then-effort claude-opus-5-thinking-high, ...-thinking-high-fast
203
+ // effort-then-thinking claude-4.6-opus-high-thinking
204
+ // bare claude-4.5-sonnet-thinking (no effort rung at all)
205
+ // Sending the wrong order returns ERROR_BAD_MODEL_NAME, so this is not cosmetic.
206
+ if (order === "bare") return `${source}-thinking`;
207
+ if (order === "effort-then-thinking") return `${source}-${effortSuffix}-thinking`;
208
+ if (source.endsWith("-fast")) {
209
+ const stem = source.slice(0, -"-fast".length);
210
+ return `${stem}-thinking-${effortSuffix}-fast`;
211
+ }
212
+ return `${source}-thinking-${effortSuffix}`;
213
+ }
123
214
  if (baseModelId.endsWith("-fast")) {
124
215
  return `${baseModelId.slice(0, -"-fast".length)}-${effortSuffix}-fast`;
125
216
  }
126
217
  return `${baseModelId}-${effortSuffix}`;
127
218
  }
219
+
220
+ /**
221
+ * Compose the exact flattened id sent by AgentService/Run. Discovery normalizes Cursor's optional
222
+ * `cursor-` prefix only for catalog matching, but regular Grok 4.5 requests require that prefix on
223
+ * the wire. Keep this separate from {@link cursorWireModelIdWithEffort} so discovery can continue
224
+ * comparing canonical, prefix-free ids. Grok Fast uses requested_model parameters instead.
225
+ */
226
+ export function cursorRequestWireModelIdWithEffort(baseModelId: string, effortSuffix: string): string {
227
+ const flattened = cursorWireModelIdWithEffort(baseModelId, effortSuffix);
228
+ return baseModelId === "grok-4.5" || baseModelId === "grok-4.6" ? `cursor-${flattened}` : flattened;
229
+ }