@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
@@ -8,19 +8,32 @@ import type {
8
8
  OcxToolResultMessage,
9
9
  } from "../../types";
10
10
  import { isAllowedToolChoice, namespacedToolName, toolChoiceAliases, type OcxTool, type OcxToolChoice } from "../../types";
11
- import type { CursorRequestMessage, CursorRunRequest } from "./types";
12
- import { cursorWireModelSelection, type CursorRoutingLevel } from "./discovery";
13
- import { cursorEffortSuffix, cursorWireModelIdWithEffort } from "./effort-map";
11
+ import type { CursorRequestMessage, CursorRequestedModelParameter, CursorRunRequest } from "./types";
12
+ import { cursorCheckpointModelAffinityId, cursorWireModelSelection, type CursorRoutingLevel } from "./discovery";
13
+ import { cursorUltraBaseModelId } from "./discovery";
14
+ import { decodeCursorCallId } from "./call-id";
15
+ import { cursorGrokFastSelection, resolveCursorSelection } from "./catalog";
14
16
  import {
15
17
  cursorMcpToolEncodedSize,
16
18
  cursorMcpToolsEncodedSize,
17
19
  cursorToolAllowedByChoice,
18
20
  cursorToolChoiceAliases,
21
+ cursorStructuredEditTools,
19
22
  cursorToolWireName,
20
23
  cursorToolsForActivePrompt,
24
+ isCursorStructuredEditToolName,
21
25
  isBareCodexShellBridgeTool,
26
+ isCursorExecutionPathTool,
27
+ isCursorWaitTool,
22
28
  } from "./tool-definitions";
23
29
  import { lookupCursorThreadConversation } from "./thread-continuity";
30
+ import {
31
+ getCursorCheckpoint,
32
+ getCursorCheckpointForPrefix,
33
+ type CursorCheckpointInvalidationReason,
34
+ type CursorCheckpointSnapshot,
35
+ } from "./checkpoint-store";
36
+ import { extractCursorImageUrls } from "./images";
24
37
 
25
38
  /** Probe-verified Cursor Connect boundaries, with byte headroom for the enclosing field. */
26
39
  export const CURSOR_TOOL_COUNT_LIMIT = 330;
@@ -37,18 +50,25 @@ function explicitlySelectedNames(choice: OcxToolChoice | undefined): Set<string>
37
50
  }
38
51
 
39
52
  function toolPriority(tool: OcxTool, selectedNames: ReadonlySet<string>): number {
40
- // Shell bridge and apply_patch outrank unrelated allowed_tools entries so a large
41
- // selected filler cannot starve the Codex execution path during truncation (#399).
53
+ // Execution path (bare or opencodex-responses `exec` / `exec_command` / `shell_command`)
54
+ // outranks filler so a crowded catalog cannot drop the Codex shell bridge (#399).
55
+ if (isCursorExecutionPathTool(tool)) return 0;
42
56
  if (isBareCodexShellBridgeTool(tool)) return 0;
43
- if (!tool.namespace && tool.name === "apply_patch") return 1;
44
- if (cursorToolChoiceAliases(tool).some(name => selectedNames.has(name))) return 2;
45
- if (tool.loadedFromToolSearch) return 3;
46
- if (!tool.namespace) return 4;
47
- return 5;
57
+ // `wait` only resumes a yielded exec cell. Keep it with the execution path, but after
58
+ // `exec` itself so a large wait schema cannot starve the tool that creates the cell.
59
+ if (isCursorWaitTool(tool)) return 1;
60
+ if (!tool.namespace && tool.name === "apply_patch") return 2;
61
+ // Structured edit tools convert to apply_patch on the return path, so they must survive the
62
+ // same byte/count truncation as the freeform tool they stand in for (#1017).
63
+ if (!tool.namespace && isCursorStructuredEditToolName(tool.name)) return 2;
64
+ if (cursorToolChoiceAliases(tool).some(name => selectedNames.has(name))) return 3;
65
+ if (tool.loadedFromToolSearch) return 4;
66
+ if (!tool.namespace) return 5;
67
+ return 6;
48
68
  }
49
69
 
50
70
  function isPinnedCursorTool(tool: OcxTool, selectedNames: ReadonlySet<string>): boolean {
51
- return toolPriority(tool, selectedNames) <= 2;
71
+ return toolPriority(tool, selectedNames) <= 3;
52
72
  }
53
73
 
54
74
  /**
@@ -61,7 +81,11 @@ export function applyCursorToolBudget(
61
81
  toolChoice: OcxToolChoice | undefined,
62
82
  ): CursorToolBudgetResult {
63
83
  const catalog = tools ?? [];
64
- const eligible = catalog.filter(tool => cursorToolAllowedByChoice(tool, toolChoice, catalog));
84
+ const baseEligible = catalog.filter(tool => cursorToolAllowedByChoice(tool, toolChoice, catalog));
85
+ // Synthetic structured edit tools ride along with the freeform apply_patch tool (#1017). They are
86
+ // part of the advertised catalog, so their serialized size counts toward the byte ceiling here.
87
+ const synthetic = cursorStructuredEditTools(catalog, toolChoice);
88
+ const eligible = [...baseEligible, ...synthetic];
65
89
  if (
66
90
  eligible.length <= CURSOR_TOOL_COUNT_LIMIT
67
91
  && cursorMcpToolsEncodedSize(eligible, toolChoice) <= CURSOR_TOOL_BYTES_LIMIT
@@ -87,7 +111,7 @@ export function applyCursorToolBudget(
87
111
  return true;
88
112
  };
89
113
 
90
- // Phase 1: selected tools + shell bridge + apply_patch (priority <= 2).
114
+ // Phase 1: selected tools + execution path + apply_patch (priority <= 3).
91
115
  // Pins are admitted before filler so a crowded catalog cannot drop the Codex execution path (#399).
92
116
  for (const candidate of candidates) {
93
117
  if (!isPinnedCursorTool(candidate.tool, selectedNames)) continue;
@@ -99,9 +123,49 @@ export function applyCursorToolBudget(
99
123
  tryKeep(candidate.tool);
100
124
  }
101
125
 
126
+ const evictNonExecutionPath = (needBytes: number): void => {
127
+ for (let i = kept.length - 1; i >= 0; i--) {
128
+ const occupant = kept[i];
129
+ if (!occupant || isCursorExecutionPathTool(occupant)) continue;
130
+ kept.splice(i, 1);
131
+ keptSet.delete(occupant);
132
+ keptBytes -= cursorMcpToolEncodedSize(occupant, toolChoice);
133
+ if (kept.length < CURSOR_TOOL_COUNT_LIMIT && keptBytes + needBytes <= CURSOR_TOOL_BYTES_LIMIT) {
134
+ return;
135
+ }
136
+ }
137
+ };
138
+
139
+ // Force-admit at least one execution-path tool when one was eligible. Priority-0
140
+ // admission can still fail if the tool itself is larger than leftover room after
141
+ // earlier same-priority pins; evict wait/patch/filler rather than ship wait-only.
142
+ for (const tool of eligible) {
143
+ if (!isCursorExecutionPathTool(tool) || keptSet.has(tool)) continue;
144
+ const need = cursorMcpToolEncodedSize(tool, toolChoice);
145
+ if (need > CURSOR_TOOL_BYTES_LIMIT) continue;
146
+ evictNonExecutionPath(need);
147
+ tryKeep(tool);
148
+ if (keptSet.has(tool)) break;
149
+ }
150
+
151
+ const eligibleHasExecutionPath = eligible.some(isCursorExecutionPathTool);
152
+ const keptHasExecutionPath = eligible.some(tool => keptSet.has(tool) && isCursorExecutionPathTool(tool));
153
+ // Never advertise `wait` after dropping the tool that creates the exec cell.
154
+ if (eligibleHasExecutionPath && !keptHasExecutionPath) {
155
+ for (const tool of eligible) {
156
+ if (!isCursorWaitTool(tool) || !keptSet.has(tool)) continue;
157
+ keptSet.delete(tool);
158
+ const index = kept.indexOf(tool);
159
+ if (index >= 0) kept.splice(index, 1);
160
+ keptBytes -= cursorMcpToolEncodedSize(tool, toolChoice);
161
+ }
162
+ }
163
+
102
164
  return {
103
165
  tools: eligible.filter(tool => keptSet.has(tool)),
104
- omitted: eligible.filter(tool => !keptSet.has(tool)),
166
+ // Synthetic tools are pinned in phase 1 and never reported as omitted; the note counts only
167
+ // tools the client itself requested.
168
+ omitted: baseEligible.filter(tool => !keptSet.has(tool)),
105
169
  };
106
170
  }
107
171
 
@@ -117,17 +181,43 @@ function catalogLimitNote(kept: readonly OcxTool[], omitted: readonly OcxTool[])
117
181
  }
118
182
 
119
183
  /**
120
- * Resolve a `cursor/<model>` selection + Codex reasoning effort to the actual Cursor model id. Cursor
121
- * encodes the effort as a per-model suffix (`claude-4.6-opus-high`); `cursorEffortSuffix` picks the
122
- * right tier for that specific model (literal pass-through, with rank clamp fallback) or
123
- * `undefined` for non-reasoning models like `composer-2.5`. A fully-qualified id (one that isn't a
124
- * known effort base) passes through unchanged.
184
+ * Resolve a `cursor/<model>` selection + Codex reasoning effort to Cursor's requested model shape.
185
+ * Most models encode effort in a flat id (`claude-4.6-opus-high`). Grok Fast is parameterized
186
+ * instead: current Cursor clients send the matching Grok base id plus `effort` and `fast` parameters.
187
+ * A fully-qualified id (one that is not a known effort base) passes through unchanged.
125
188
  */
126
- function normalizeCursorModelId(modelId: string, reasoning?: string): { modelId: string; routingLevel?: CursorRoutingLevel } {
189
+ function normalizeCursorModelId(modelId: string, reasoning?: string): {
190
+ modelId: string;
191
+ requestedModelParameters?: readonly CursorRequestedModelParameter[];
192
+ routingLevel?: CursorRoutingLevel;
193
+ maxMode?: boolean;
194
+ } {
195
+ // Router ids (auto / auto-<level>) keep their dedicated wire selection.
127
196
  const selection = cursorWireModelSelection(modelId);
197
+ if (selection.routingLevel !== undefined || selection.modelId === "default") return selection;
198
+ // Umbrella catalog resolution (devlog 260828_cursor_umbrella_catalog): one
199
+ // resolver owns effort composition, variant dimensions, the synthetic -1m
200
+ // marker (ultra -> Max Mode, evidence-gated), and the cursor- wire prefix.
128
201
  const id = selection.modelId;
129
- const suffix = cursorEffortSuffix(id, reasoning);
130
- return { ...selection, modelId: suffix ? cursorWireModelIdWithEffort(id, suffix) : id };
202
+ // Grok Fast stays parameterized: current Cursor clients send the base id
203
+ // plus effort/fast parameters instead of the flattened -fast id.
204
+ const grokFast = cursorGrokFastSelection(id, reasoning);
205
+ if (grokFast) {
206
+ return {
207
+ ...selection,
208
+ modelId: grokFast.wireBaseId,
209
+ requestedModelParameters: [
210
+ { id: "effort", value: grokFast.effort },
211
+ { id: "fast", value: "true" },
212
+ ],
213
+ };
214
+ }
215
+ const resolved = resolveCursorSelection(id, reasoning);
216
+ return {
217
+ ...selection,
218
+ ...(resolved.maxMode ? { maxMode: true } : {}),
219
+ modelId: resolved.wireId,
220
+ };
131
221
  }
132
222
 
133
223
  function contentPartToText(part: OcxContentPart | OcxAssistantContentPart): string | undefined {
@@ -137,7 +227,8 @@ function contentPartToText(part: OcxContentPart | OcxAssistantContentPart): stri
137
227
  case "thinking":
138
228
  return part.thinking;
139
229
  case "image":
140
- return `[image input unsupported by Cursor adapter phase 3: ${part.detail ?? "auto"}]`;
230
+ // Images ride UserMessage.selected_context (SelectedImage) instead of text.
231
+ return undefined;
141
232
  case "toolCall":
142
233
  // Cursor does not accept OpenAI Responses assistant tool-call parts as native history here.
143
234
  // Rendering them as visible "[tool_call]" text leaks synthetic protocol markers back into
@@ -150,7 +241,7 @@ function contentPartToText(part: OcxContentPart | OcxAssistantContentPart): stri
150
241
  function toolResultToText(message: OcxToolResultMessage): string {
151
242
  return [
152
243
  "[tool_result]",
153
- `call_id: ${message.toolCallId}`,
244
+ `call_id: ${decodeCursorCallId(message.toolCallId)}`,
154
245
  `name: ${namespacedToolName(message.toolNamespace, message.toolName)}`,
155
246
  `is_error: ${message.isError}`,
156
247
  "output:",
@@ -170,9 +261,19 @@ function requestMessage(message: OcxMessage): CursorRequestMessage | undefined {
170
261
  switch (message.role) {
171
262
  case "user":
172
263
  case "developer":
173
- return { role: message.role, content: contentToText(message.content) };
264
+ {
265
+ const content = contentToText(message.content);
266
+ // Image-only turns survive as empty content; the encoder keeps them userMessageAction.
267
+ if (content.length === 0 && extractCursorImageUrls(message.content).length === 0) {
268
+ return undefined;
269
+ }
270
+ return { role: message.role, content };
271
+ }
174
272
  case "assistant":
175
- return { role: "assistant", content: contentToText(message.content) };
273
+ {
274
+ const content = contentToText(message.content);
275
+ return content.length > 0 ? { role: "assistant", content } : undefined;
276
+ }
176
277
  case "toolResult":
177
278
  return {
178
279
  role: "tool",
@@ -181,6 +282,19 @@ function requestMessage(message: OcxMessage): CursorRequestMessage | undefined {
181
282
  }
182
283
  }
183
284
 
285
+ /**
286
+ * Rebuild the text `messages` channel from prepared `rawMessages` so omission markers
287
+ * and JPEG-rewritten parts stay visible to activePromptText after image preparation.
288
+ */
289
+ export function cursorRequestMessagesFromRaw(
290
+ messages: readonly OcxMessage[] | undefined,
291
+ ): CursorRequestMessage[] {
292
+ if (!messages?.length) return [];
293
+ return messages
294
+ .map(requestMessage)
295
+ .filter((message): message is CursorRequestMessage => !!message);
296
+ }
297
+
184
298
  export function generatedCursorConversationId(): string {
185
299
  return `cursor_${crypto.randomUUID().replace(/-/g, "")}`;
186
300
  }
@@ -199,7 +313,7 @@ export function cursorConversationIdFromClientThread(threadId: string, identityS
199
313
 
200
314
  /**
201
315
  * Resolve the Cursor conversation id for this turn.
202
- * Priority: force-fresh → isolate helper → remembered → thread override → client thread → random.
316
+ * Priority: force-fresh → isolate helper → remembered → client thread owner → random.
203
317
  * Never use OpenAI Responses `previous_response_id` (resp_*) or shared `prompt_cache_key`
204
318
  * (cache-cohort fingerprint, not conversation ownership).
205
319
  */
@@ -209,39 +323,144 @@ export function resolveCursorConversationId(
209
323
  options: CreateCursorRequestOptions = {},
210
324
  ): string {
211
325
  if (options.forceFreshConversation === true) return generatedCursorConversationId();
212
- // Helper/shadow/compaction turns must not append into the parent's Cursor conversation,
213
- // even when previous_response_id restored the parent's remembered id.
214
326
  if (parsed._cursorIsolateConversation === true) return generatedCursorConversationId();
215
327
  if (parsed._cursorConversationId) return parsed._cursorConversationId;
216
- const threadId = parsed._clientThreadId?.trim();
328
+ const threadId = cursorClientThreadOwner(parsed);
217
329
  if (threadId) {
218
330
  const recovered = lookupCursorThreadConversation(threadId, parsed._cursorIdentityScope);
219
331
  if (recovered) return recovered;
220
- return cursorConversationIdFromClientThread(threadId, parsed._cursorIdentityScope);
332
+ return cursorConversationIdFromClientThread(`thread:${threadId}`, parsed._cursorIdentityScope);
221
333
  }
222
334
  return generatedCursorConversationId();
223
335
  }
224
336
 
337
+ export function cursorClientThreadOwner(parsed: OcxParsedRequest): string | undefined {
338
+ return parsed._clientThreadId?.trim() || parsed._cursorClientThreadId?.trim() || undefined;
339
+ }
340
+
341
+ function updateFramed(hash: ReturnType<typeof createHash>, value: string): void {
342
+ const bytes = Buffer.from(value, "utf8");
343
+ const length = Buffer.allocUnsafe(4);
344
+ length.writeUInt32BE(bytes.byteLength);
345
+ hash.update(length);
346
+ hash.update(bytes);
347
+ }
348
+
349
+ export function cursorInstructionDigest(parsed: OcxParsedRequest): string {
350
+ const hash = createHash("sha256").update("ocx:cursor:sys:");
351
+ for (const line of parsed.context.systemPrompt ?? []) updateFramed(hash, line);
352
+ for (const message of parsed.context.messages) {
353
+ if (message.role !== "developer") continue;
354
+ updateFramed(hash, contentToText(message.content));
355
+ }
356
+ return hash.digest("hex");
357
+ }
358
+
359
+ export function cursorCoveredPrefixDigest(parsed: OcxParsedRequest, coveredMessageCount: number): string {
360
+ const hash = createHash("sha256").update("ocx:cursor:prefix:");
361
+ updateFramed(hash, cursorInstructionDigest(parsed));
362
+ for (const message of parsed.context.messages.slice(0, coveredMessageCount)) {
363
+ updateFramed(hash, message.role);
364
+ updateFramed(hash, contentToText(message.content));
365
+ }
366
+ return hash.digest("hex");
367
+ }
368
+
225
369
  export interface CreateCursorRequestOptions {
226
370
  /** Force a brand-new Cursor conversation id even when remembered state exists. */
227
371
  forceFreshConversation?: boolean;
228
372
  }
229
373
 
374
+ function lookupPrefixSnapshot(
375
+ parsed: OcxParsedRequest,
376
+ request: CursorRunRequest,
377
+ identityScope: string,
378
+ ): CursorCheckpointSnapshot | undefined {
379
+ const systemDigest = cursorInstructionDigest(parsed);
380
+ const modelId = cursorCheckpointModelAffinityId(request.modelId);
381
+ for (let covered = parsed.context.messages.length; covered >= 1; covered--) {
382
+ const snapshot = getCursorCheckpointForPrefix({
383
+ conversationId: request.conversationId,
384
+ prefixDigest: cursorCoveredPrefixDigest(parsed, covered),
385
+ systemDigest,
386
+ coveredMessageCount: covered,
387
+ identityScope,
388
+ modelId,
389
+ });
390
+ if (snapshot) return snapshot;
391
+ }
392
+ return undefined;
393
+ }
394
+
395
+ function lineageMismatch(
396
+ parsed: OcxParsedRequest,
397
+ snapshot: CursorCheckpointSnapshot,
398
+ ): CursorCheckpointInvalidationReason | undefined {
399
+ const covered = snapshot.coveredMessageCount;
400
+ if (covered === undefined || covered < 0 || covered > parsed.context.messages.length) {
401
+ return "lineage_mismatch";
402
+ }
403
+ if (!snapshot.prefixDigest || !snapshot.systemDigest) return "lineage_mismatch";
404
+ if (snapshot.systemDigest !== cursorInstructionDigest(parsed)) return "lineage_mismatch";
405
+ if (snapshot.prefixDigest !== cursorCoveredPrefixDigest(parsed, covered)) return "lineage_mismatch";
406
+ const lastRole = parsed.context.messages.at(-1)?.role;
407
+ if (lastRole === "toolResult" && covered >= parsed.context.messages.length) return "trailing_tool_result";
408
+ return undefined;
409
+ }
410
+
411
+ function resolveCursorCheckpoint(
412
+ parsed: OcxParsedRequest,
413
+ request: CursorRunRequest,
414
+ options: CreateCursorRequestOptions,
415
+ ): { snapshot: CursorCheckpointSnapshot } | { reason: CursorCheckpointInvalidationReason } {
416
+ if (options.forceFreshConversation === true) return { reason: "force_fresh" };
417
+ if (parsed._compactionRequest === true || parsed._contextCompactionBoundary === true) return { reason: "compaction" };
418
+ const isolated = parsed._cursorIsolateConversation === true;
419
+ const cursorState = parsed._providerContinuation?.cursor;
420
+ const ref = isolated ? undefined : cursorState?.checkpointRef;
421
+ const identityScope = parsed._cursorIdentityScope?.trim() || "local";
422
+ let snapshot: CursorCheckpointSnapshot | undefined;
423
+ if (ref) {
424
+ snapshot = getCursorCheckpoint(ref);
425
+ if (!snapshot) return { reason: "expired" };
426
+ } else {
427
+ if (
428
+ isolated
429
+ || (!parsed._cursorConversationId && !cursorClientThreadOwner(parsed))
430
+ ) return { reason: "missing_ref" };
431
+ snapshot = lookupPrefixSnapshot(parsed, request, identityScope);
432
+ if (!snapshot) return { reason: "missing_ref" };
433
+ }
434
+ if (snapshot.conversationId !== request.conversationId) {
435
+ return { reason: "conversation_changed" };
436
+ }
437
+ if (snapshot.identityScope !== identityScope) return { reason: "identity_changed" };
438
+ if (cursorCheckpointModelAffinityId(snapshot.modelId) !== cursorCheckpointModelAffinityId(request.modelId)) {
439
+ return { reason: "model_changed" };
440
+ }
441
+ if (parsed.context.messages.at(-1)?.role !== "toolResult" && cursorState?.checkpointUsable === false) {
442
+ return { reason: "trailing_tool_result" };
443
+ }
444
+ const lineage = lineageMismatch(parsed, snapshot);
445
+ if (lineage) return { reason: lineage };
446
+ return { snapshot };
447
+ }
448
+
230
449
  export function createCursorRequest(
231
450
  parsed: OcxParsedRequest,
232
451
  options: CreateCursorRequestOptions = {},
233
452
  ): CursorRunRequest {
234
- const messages = parsed.context.messages
235
- .map(requestMessage)
236
- .filter((message): message is CursorRequestMessage => !!message && message.content.length > 0);
453
+ const messages = cursorRequestMessagesFromRaw(parsed.context.messages);
237
454
  const activeText = [...messages].reverse().find(message => message.role === "user" || message.role === "developer")?.content ?? "";
238
455
  const visibleTools = cursorToolsForActivePrompt(parsed.context.tools, activeText, parsed.options.toolChoice);
239
456
  const budget = applyCursorToolBudget(visibleTools, parsed.options.toolChoice);
240
457
  const limitNote = catalogLimitNote(budget.tools, budget.omitted);
241
458
  const model = normalizeCursorModelId(parsed.modelId, parsed.options.reasoning);
242
- return {
459
+ const request: CursorRunRequest = {
243
460
  modelId: model.modelId,
461
+ ...(model.requestedModelParameters ? { requestedModelParameters: model.requestedModelParameters } : {}),
244
462
  ...(model.routingLevel ? { routingLevel: model.routingLevel } : {}),
463
+ ...(model.maxMode ? { maxMode: true } : {}),
245
464
  conversationId: resolveCursorConversationId(parsed, model.modelId, options),
246
465
  system: [...(parsed.context.systemPrompt ?? []), ...(limitNote ? [limitNote] : [])],
247
466
  messages,
@@ -249,7 +468,24 @@ export function createCursorRequest(
249
468
  ...(parsed._compactionRequest === true || parsed._contextCompactionBoundary === true ? { contextUsageReset: true } : {}),
250
469
  ...(parsed._compactionRequest === true ? { contextUsageStoreCheckpoints: false } : {}),
251
470
  ...(budget.tools.length ? { tools: budget.tools } : {}),
471
+ // Bare API caller (no tools, no Codex thread identity): suppress Cursor's default
472
+ // native tool catalog instead of paying its ~10-15K token preamble (devlog 260826 040).
473
+ ...(budget.tools.length === 0 && !cursorClientThreadOwner(parsed)
474
+ ? { suppressDefaultCursorToolCatalog: true }
475
+ : {}),
252
476
  ...(parsed.options.toolChoice ? { toolChoice: parsed.options.toolChoice } : {}),
253
477
  ...(parsed.options.parallelToolCalls !== undefined ? { parallelToolCalls: parsed.options.parallelToolCalls } : {}),
254
478
  };
479
+ const resolved = resolveCursorCheckpoint(parsed, request, options);
480
+ if ("reason" in resolved) {
481
+ request.continuationMode = "full-replay";
482
+ request.checkpointInvalidationReason = resolved.reason;
483
+ return request;
484
+ }
485
+ request.checkpointBytes = resolved.snapshot.checkpointBytes;
486
+ request.continuationMode = "checkpoint";
487
+ if (parsed.context.messages.at(-1)?.role === "toolResult" && resolved.snapshot.coveredMessageCount !== undefined) {
488
+ request.checkpointSuffixStart = resolved.snapshot.coveredMessageCount;
489
+ }
490
+ return request;
255
491
  }