@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
@@ -0,0 +1,308 @@
1
+ import { createHash } from "node:crypto";
2
+ import { fromBinary } from "@bufbuild/protobuf";
3
+ import { ConversationStateStructureSchema, type ConversationStateStructure } from "./gen/agent_pb";
4
+ import {
5
+ createCursorBlobCheckpointLease,
6
+ pinCursorBlobIdsForCheckpoint,
7
+ releaseCursorBlobRequestScope,
8
+ type CursorBlobRequestScopeToken,
9
+ } from "./native-exec";
10
+
11
+ export const CURSOR_CHECKPOINT_TTL_MS = 15 * 60_000;
12
+ export const CURSOR_CHECKPOINT_MAX_ENTRIES = 64;
13
+ export const CURSOR_CHECKPOINT_MAX_TOTAL_BYTES = 16 * 1024 * 1024;
14
+
15
+ export type CursorCheckpointInvalidationReason =
16
+ | "missing_ref"
17
+ | "expired"
18
+ | "decode_failed"
19
+ | "conversation_changed"
20
+ | "identity_changed"
21
+ | "model_changed"
22
+ | "compaction"
23
+ | "trailing_tool_result"
24
+ | "force_fresh"
25
+ | "upstream_invalid_argument"
26
+ | "lineage_mismatch";
27
+
28
+ export interface CursorCheckpointSnapshot {
29
+ ref: string;
30
+ conversationId: string;
31
+ identityScope: string;
32
+ modelId: string;
33
+ checkpointBytes: Uint8Array;
34
+ createdAt: number;
35
+ lastAccessAt: number;
36
+ blobLease?: CursorBlobRequestScopeToken;
37
+ coveredMessageCount?: number;
38
+ prefixDigest?: string;
39
+ systemDigest?: string;
40
+ }
41
+
42
+ interface CursorCheckpointStore {
43
+ snapshots: Map<string, CursorCheckpointSnapshot>;
44
+ prefixIndex: Map<string, Set<string>>;
45
+ totalBytes: number;
46
+ }
47
+
48
+ const store: CursorCheckpointStore = {
49
+ snapshots: new Map(),
50
+ prefixIndex: new Map(),
51
+ totalBytes: 0,
52
+ };
53
+
54
+ let nowFn = (): number => Date.now();
55
+ let scheduleFn = (fn: () => void, ms: number): ReturnType<typeof setTimeout> => {
56
+ const timer = setTimeout(fn, ms);
57
+ timer.unref?.();
58
+ return timer;
59
+ };
60
+ let clearScheduleFn = (timer: ReturnType<typeof setTimeout>): void => {
61
+ clearTimeout(timer);
62
+ };
63
+ let pruneTimer: ReturnType<typeof setTimeout> | undefined;
64
+
65
+ function now(): number {
66
+ return nowFn();
67
+ }
68
+
69
+ export function installCursorCheckpointClockForTests(input: {
70
+ now?: () => number;
71
+ schedule?: (fn: () => void, ms: number) => ReturnType<typeof setTimeout>;
72
+ clear?: (timer: ReturnType<typeof setTimeout>) => void;
73
+ }): void {
74
+ if (input.now) nowFn = input.now;
75
+ if (input.schedule) scheduleFn = input.schedule;
76
+ if (input.clear) clearScheduleFn = input.clear;
77
+ }
78
+
79
+ export function resetCursorCheckpointClockForTests(): void {
80
+ nowFn = () => Date.now();
81
+ scheduleFn = (fn, ms) => {
82
+ const timer = setTimeout(fn, ms);
83
+ timer.unref?.();
84
+ return timer;
85
+ };
86
+ clearScheduleFn = timer => {
87
+ clearTimeout(timer);
88
+ };
89
+ stopPruneTimer();
90
+ }
91
+
92
+ function stopPruneTimer(): void {
93
+ if (pruneTimer !== undefined) clearScheduleFn(pruneTimer);
94
+ pruneTimer = undefined;
95
+ }
96
+
97
+ function schedulePrune(at = now()): void {
98
+ stopPruneTimer();
99
+ let nextExpiry = Number.POSITIVE_INFINITY;
100
+ for (const snapshot of store.snapshots.values()) {
101
+ nextExpiry = Math.min(nextExpiry, snapshot.lastAccessAt + CURSOR_CHECKPOINT_TTL_MS);
102
+ }
103
+ if (!Number.isFinite(nextExpiry)) return;
104
+ pruneTimer = scheduleFn(() => {
105
+ pruneTimer = undefined;
106
+ prune();
107
+ schedulePrune();
108
+ }, Math.max(0, nextExpiry - at));
109
+ }
110
+
111
+ function prune(at = now()): void {
112
+ for (const [ref, snapshot] of store.snapshots) {
113
+ if (at - snapshot.lastAccessAt > CURSOR_CHECKPOINT_TTL_MS) deleteSnapshot(ref);
114
+ }
115
+ while (store.snapshots.size > CURSOR_CHECKPOINT_MAX_ENTRIES || store.totalBytes > CURSOR_CHECKPOINT_MAX_TOTAL_BYTES) {
116
+ const oldest = store.snapshots.keys().next().value;
117
+ if (oldest === undefined) break;
118
+ deleteSnapshot(oldest);
119
+ }
120
+ schedulePrune(at);
121
+ }
122
+
123
+ function indexPrefix(digest: string | undefined, ref: string): void {
124
+ if (!digest) return;
125
+ const refs = store.prefixIndex.get(digest) ?? new Set<string>();
126
+ refs.add(ref);
127
+ store.prefixIndex.set(digest, refs);
128
+ }
129
+
130
+ function unindexPrefix(digest: string | undefined, ref: string): void {
131
+ if (!digest) return;
132
+ const refs = store.prefixIndex.get(digest);
133
+ if (!refs) return;
134
+ refs.delete(ref);
135
+ if (refs.size === 0) store.prefixIndex.delete(digest);
136
+ }
137
+
138
+ function deleteSnapshot(ref: string): void {
139
+ const existing = store.snapshots.get(ref);
140
+ if (!existing) return;
141
+ if (existing.blobLease) releaseCursorBlobRequestScope(existing.blobLease);
142
+ unindexPrefix(existing.prefixDigest, ref);
143
+ store.snapshots.delete(ref);
144
+ store.totalBytes = Math.max(0, store.totalBytes - existing.checkpointBytes.byteLength);
145
+ }
146
+
147
+ function collectStateBlobIds(state: ConversationStateStructure, ids: Uint8Array[]): void {
148
+ ids.push(
149
+ ...state.rootPromptMessagesJson,
150
+ ...state.turns,
151
+ ...state.turnsOld,
152
+ ...state.todos,
153
+ ...state.summaryArchives,
154
+ );
155
+ if (state.summary) ids.push(state.summary);
156
+ if (state.summaryArchive) ids.push(state.summaryArchive);
157
+ if (state.plan) ids.push(state.plan);
158
+ for (const value of Object.values(state.fileStates)) ids.push(value);
159
+ for (const value of Object.values(state.fileStatesV2)) {
160
+ if (value.content) ids.push(value.content);
161
+ if (value.initialContent) ids.push(value.initialContent);
162
+ }
163
+ for (const nested of Object.values(state.subagentStates)) {
164
+ if (nested.conversationState) collectStateBlobIds(nested.conversationState, ids);
165
+ }
166
+ }
167
+
168
+ function collectCheckpointBlobIds(checkpointBytes: Uint8Array): Uint8Array[] | undefined {
169
+ try {
170
+ const ids: Uint8Array[] = [];
171
+ collectStateBlobIds(fromBinary(ConversationStateStructureSchema, checkpointBytes), ids);
172
+ return ids.filter(id => id.byteLength > 0);
173
+ } catch {
174
+ return undefined;
175
+ }
176
+ }
177
+
178
+ export function cursorCheckpointRefHash(ref: string): string {
179
+ return createHash("sha256").update("ocx:cursor:ckpt-ref:").update(ref).digest("hex").slice(0, 16);
180
+ }
181
+
182
+ export function commitCursorCheckpoint(input: {
183
+ conversationId: string;
184
+ identityScope?: string;
185
+ modelId: string;
186
+ checkpointBytes: Uint8Array;
187
+ coveredMessageCount?: number;
188
+ prefixDigest?: string;
189
+ systemDigest?: string;
190
+ }): string | undefined {
191
+ if (!input.conversationId || !input.modelId || input.checkpointBytes.byteLength === 0) return undefined;
192
+ if (input.checkpointBytes.byteLength > CURSOR_CHECKPOINT_MAX_TOTAL_BYTES) return undefined;
193
+ prune();
194
+ const createdAt = now();
195
+ const ref = createHash("sha256")
196
+ .update("ocx:cursor:ckpt:")
197
+ .update(input.conversationId)
198
+ .update("|")
199
+ .update(input.identityScope?.trim() || "local")
200
+ .update("|")
201
+ .update(input.modelId)
202
+ .update("|")
203
+ .update(String(createdAt))
204
+ .update("|")
205
+ .update(input.checkpointBytes)
206
+ .digest("hex")
207
+ .slice(0, 32);
208
+ const snapshot: CursorCheckpointSnapshot = {
209
+ ref,
210
+ conversationId: input.conversationId,
211
+ identityScope: input.identityScope?.trim() || "local",
212
+ modelId: input.modelId,
213
+ checkpointBytes: input.checkpointBytes.slice(),
214
+ createdAt,
215
+ lastAccessAt: createdAt,
216
+ ...(input.coveredMessageCount !== undefined ? { coveredMessageCount: input.coveredMessageCount } : {}),
217
+ ...(input.prefixDigest ? { prefixDigest: input.prefixDigest } : {}),
218
+ ...(input.systemDigest ? { systemDigest: input.systemDigest } : {}),
219
+ };
220
+ const blobIds = collectCheckpointBlobIds(input.checkpointBytes);
221
+ if (blobIds === undefined) return undefined;
222
+ if (blobIds.length > 0) {
223
+ const lease = createCursorBlobCheckpointLease(ref);
224
+ if (!pinCursorBlobIdsForCheckpoint(blobIds, lease)) {
225
+ releaseCursorBlobRequestScope(lease);
226
+ return undefined;
227
+ }
228
+ snapshot.blobLease = lease;
229
+ }
230
+ deleteSnapshot(ref);
231
+ store.snapshots.set(ref, snapshot);
232
+ store.totalBytes += snapshot.checkpointBytes.byteLength;
233
+ indexPrefix(snapshot.prefixDigest, ref);
234
+ prune(createdAt);
235
+ return store.snapshots.has(ref) ? ref : undefined;
236
+ }
237
+
238
+ export function getCursorCheckpointForPrefix(input: {
239
+ conversationId: string;
240
+ prefixDigest: string;
241
+ systemDigest: string;
242
+ coveredMessageCount: number;
243
+ identityScope?: string;
244
+ modelId: string;
245
+ }): CursorCheckpointSnapshot | undefined {
246
+ prune();
247
+ const refs = store.prefixIndex.get(input.prefixDigest);
248
+ if (!refs) return undefined;
249
+ const identityScope = input.identityScope?.trim() || "local";
250
+ let foundRef: string | undefined;
251
+ for (const ref of refs) {
252
+ const snapshot = store.snapshots.get(ref);
253
+ if (!snapshot) continue;
254
+ if (snapshot.conversationId !== input.conversationId) continue;
255
+ if (snapshot.systemDigest !== input.systemDigest) continue;
256
+ if (snapshot.coveredMessageCount !== input.coveredMessageCount) continue;
257
+ if (snapshot.identityScope !== identityScope) continue;
258
+ if (snapshot.modelId !== input.modelId) continue;
259
+ if (foundRef) return undefined;
260
+ foundRef = ref;
261
+ }
262
+ return getCursorCheckpoint(foundRef);
263
+ }
264
+
265
+ export function getLatestCursorCheckpoint(
266
+ match: (snapshot: CursorCheckpointSnapshot) => boolean,
267
+ ): CursorCheckpointSnapshot | undefined {
268
+ prune();
269
+ let found: CursorCheckpointSnapshot | undefined;
270
+ for (const snapshot of store.snapshots.values()) {
271
+ if (match(snapshot)) found = snapshot;
272
+ }
273
+ return found ? getCursorCheckpoint(found.ref) : undefined;
274
+ }
275
+
276
+ export function getCursorCheckpoint(ref: string | undefined): CursorCheckpointSnapshot | undefined {
277
+ if (!ref) return undefined;
278
+ prune();
279
+ const snapshot = store.snapshots.get(ref);
280
+ if (!snapshot) return undefined;
281
+ const at = now();
282
+ if (at - snapshot.lastAccessAt > CURSOR_CHECKPOINT_TTL_MS) {
283
+ deleteSnapshot(ref);
284
+ return undefined;
285
+ }
286
+ snapshot.lastAccessAt = at;
287
+ store.snapshots.delete(ref);
288
+ store.snapshots.set(ref, snapshot);
289
+ return snapshot;
290
+ }
291
+
292
+ export function invalidateCursorCheckpoint(ref: string | undefined): void {
293
+ if (!ref) return;
294
+ deleteSnapshot(ref);
295
+ }
296
+
297
+ export function clearCursorCheckpointsForTests(): void {
298
+ stopPruneTimer();
299
+ for (const ref of [...store.snapshots.keys()]) deleteSnapshot(ref);
300
+ store.snapshots.clear();
301
+ store.prefixIndex.clear();
302
+ store.totalBytes = 0;
303
+ resetCursorCheckpointClockForTests();
304
+ }
305
+
306
+ export function cursorCheckpointStoreMetricsForTests(): { count: number; totalBytes: number } {
307
+ return { count: store.snapshots.size, totalBytes: store.totalBytes };
308
+ }
@@ -27,7 +27,56 @@ function errorCode(value: unknown): string {
27
27
  * True when Cursor intentionally cancelled the HTTP/2 stream after a client-tool suspend.
28
28
  * These are expected between multi-turn Responses bridge cycles, not upstream failures.
29
29
  */
30
+ /**
31
+ * A Cursor stream that ended cleanly at the HTTP/2 layer while a client tool call was still
32
+ * open — no `turnEnded`, no error trailer, just EOF. The call's buffered arguments are lost,
33
+ * so the turn is truncated: reporting it as success would hand Codex a turn whose tool call
34
+ * silently never happened. Not retryable — the request is committed once the session connects.
35
+ */
36
+ export class CursorStreamTruncatedError extends Error {
37
+ constructor(
38
+ public readonly openCallIds: readonly string[],
39
+ public readonly framesReceived: number,
40
+ ) {
41
+ super(
42
+ `Cursor stream ended without terminating the turn; ${openCallIds.length} tool call(s) left incomplete `
43
+ + `(${openCallIds.join(", ")}) after ${framesReceived} frame(s). Arguments may be truncated; the call was not committed.`,
44
+ );
45
+ this.name = "CursorStreamTruncatedError";
46
+ }
47
+ }
48
+
49
+ /**
50
+ * A cancel-shaped stream failure that WE did not request. `cancelCursorRun` is the only place
51
+ * that cancels our own stream, and it sets `expectedClose` first, so a cancel arriving without it
52
+ * came from Cursor or the network and is a real transport failure.
53
+ *
54
+ * It carries its own message on purpose. Left as a raw `NGHTTP2_CANCEL` error, the text is
55
+ * re-matched downstream (`classifyCursorError`) and labelled "Cursor stream suspended" — a turn
56
+ * that failed unexpectedly would report an intentional suspension and misdirect diagnosis.
57
+ */
58
+ export class CursorUnexpectedCancelError extends Error {
59
+ /**
60
+ * The originating error's transport code (typically `NGHTTP2_CANCEL`), re-exposed so the
61
+ * per-turn `turn-failed` diagnostic still records how the stream actually died. Wrapping
62
+ * without this made the summary for exactly this failure the one with no code.
63
+ */
64
+ public readonly code?: string;
65
+
66
+ constructor(public readonly cause?: unknown) {
67
+ super("Cursor connection was cancelled by the server before the turn completed");
68
+ this.name = "CursorUnexpectedCancelError";
69
+ const causeCode = errorCode(cause);
70
+ if (causeCode) this.code = causeCode;
71
+ }
72
+ }
73
+
30
74
  export function isCursorBenignCancelError(value: unknown): boolean {
75
+ // An unexpected cancel is never benign, however it is spelled. This class is raised only when
76
+ // the transport knows WE did not request the cancel, so its provenance outranks the code match
77
+ // below — otherwise the adapter would re-decide the same question from the error code alone
78
+ // and swallow a real transport failure (cursor.ts:181).
79
+ if (value instanceof CursorUnexpectedCancelError) return false;
31
80
  const message = errorMessage(value).toLowerCase();
32
81
  const code = errorCode(value).toUpperCase();
33
82
  if (code === "NGHTTP2_CANCEL") return true;
@@ -36,6 +85,21 @@ export function isCursorBenignCancelError(value: unknown): boolean {
36
85
  return false;
37
86
  }
38
87
 
88
+ /**
89
+ * True when the turn was torn down by an `AbortSignal` rather than by a transport fault.
90
+ *
91
+ * This is deliberately NOT part of `isCursorBenignCancelError`: an abort mid-turn is a real
92
+ * failure and must still surface. It is only meaningful in combination with a terminal frame
93
+ * having already been emitted, where it means "the answer landed and then the connection went
94
+ * away" (#1527).
95
+ */
96
+ export function isCursorAbortError(value: unknown): boolean {
97
+ const message = errorMessage(value).toLowerCase();
98
+ if (message.includes("cursor request was aborted")) return true;
99
+ const name = (value as { name?: unknown })?.name;
100
+ return typeof name === "string" && name === "AbortError";
101
+ }
102
+
39
103
  /**
40
104
  * True when Cursor Connect rejected the turn with invalid_argument.
41
105
  * Seen after stepCompleted on brittle external-model continuations.
@@ -48,6 +112,58 @@ export function isCursorInvalidArgumentError(value: unknown): boolean {
48
112
  }
49
113
 
50
114
  const QUOTA_RATE_CUES = ["too many requests", "quota", "rate limit", "rate-limit", "throttl"];
115
+ /**
116
+ * A bare `resource_exhausted` end-stream with no detail beyond a generic error wrapper
117
+ * ("Error" or empty tail) and zero tokens billed is the shape Cursor's backend emits when
118
+ * the request payload exceeded its context window — not when quota ran out (senpi #1009,
119
+ * #1036: same wording, two causes). Quota rejections always carry an explicit rate cue
120
+ * ("too many requests", "quota exhausted"), so the ABSENCE of those cues plus the
121
+ * absence of a size phrase means payload overflow. Classifying it as 429 makes Codex
122
+ * back off instead of compacting, which burns retries on an unfixable-by-retry failure.
123
+ */
124
+ const BARE_RE_TAILS = new Set(["error", "", "resource_exhausted", "resource exhausted"]);
125
+
126
+ /**
127
+ * Size prior for bare resource_exhausted classification (devlog 260, live probe 210):
128
+ * a plan-gated model returns the SAME bare RE shape on a ~20-token prompt that a real
129
+ * payload overflow produces, so the message alone cannot separate "compact and retry"
130
+ * from "this account cannot use this model". When the caller can supply how large the
131
+ * request actually was relative to the model's window, a small request keeps the
132
+ * 429-class mapping; only a plausibly-large one classifies as overflow. Unknown
133
+ * sizes keep today's overflow mapping so the prior only ever REMOVES false overflows
134
+ * it can prove.
135
+ */
136
+ export interface CursorSizeContext {
137
+ estimatedInputTokens?: number;
138
+ contextWindow?: number;
139
+ }
140
+
141
+ const OVERFLOW_MIN_FRACTION = 0.5;
142
+
143
+ function bareReLooksLikeOverflow(context?: CursorSizeContext): boolean {
144
+ if (!context) return true;
145
+ const { estimatedInputTokens, contextWindow } = context;
146
+ if (estimatedInputTokens === undefined || contextWindow === undefined || contextWindow <= 0) return true;
147
+ return estimatedInputTokens >= OVERFLOW_MIN_FRACTION * contextWindow;
148
+ }
149
+
150
+ export function isCursorZeroTokenResourceExhausted(lowerMessage: string): boolean {
151
+ if (!lowerMessage.includes("resource_exhausted") && !lowerMessage.includes("resource exhausted")) return false;
152
+ // Any explicit quota/rate cue wins: this is a real 429.
153
+ if (QUOTA_RATE_CUES.some(cue => lowerMessage.includes(cue))) return false;
154
+ // An explicit size phrase also wins (already handled by the existing classifier).
155
+ if (isCursorRequestTooLargeDetail(lowerMessage)) return false;
156
+ // Extract the tail after the resource_exhausted marker. If it names a specific
157
+ // non-quota, non-size cause, this is NOT bare overflow.
158
+ const idx = Math.max(
159
+ lowerMessage.indexOf("resource_exhausted"),
160
+ lowerMessage.indexOf("resource exhausted"),
161
+ );
162
+ const tail = lowerMessage.slice(idx + "resource_exhausted".length).trim().replace(/^[:\s]+/, "").trim();
163
+ if (!BARE_RE_TAILS.has(tail)) return false;
164
+ return true;
165
+ }
166
+
51
167
  const REQUEST_TOO_LARGE_PATTERNS: (string | RegExp)[] = [
52
168
  "tool catalog too large",
53
169
  "tool registration too large",
@@ -80,7 +196,7 @@ export function isCursorRequestTooLargeDetail(lowerMessage: string): boolean {
80
196
  * The returned prefix string is recognized by `src/lib/errors.ts` `classifyError` keywords,
81
197
  * so bridge-level error mapping produces the right Codex error type (rate_limit, auth, etc.).
82
198
  */
83
- export function classifyCursorError(message: string): string {
199
+ export function classifyCursorError(message: string, sizeContext?: CursorSizeContext): string {
84
200
  const lower = message.toLowerCase();
85
201
 
86
202
  if (isCursorBenignCancelError(message)) return "Cursor stream suspended";
@@ -94,9 +210,16 @@ export function classifyCursorError(message: string): string {
94
210
  // client-fixable 400; everything else surfaces as a 429 so Codex backs off
95
211
  // instead of hammering retries (live evidence: 6x 400 retry storm, devlog
96
212
  // 260723_cursor_context_continuity/000_plan.md).
97
- return isCursorRequestTooLargeDetail(lower)
98
- ? "Cursor resource limit exceeded"
99
- : "Cursor rate limit exceeded";
213
+ if (isCursorRequestTooLargeDetail(lower)) return "Cursor resource limit exceeded";
214
+ // A bare resource_exhausted with no quota cue and no size phrase is payload
215
+ // overflow, not rate limiting. Classifying it as 429 makes Codex back off on a
216
+ // failure that only compaction can fix (senpi #1009 / #1036; research unit T01).
217
+ // Refinement (devlog 260): plan-gated models emit the same bare shape on tiny
218
+ // requests — when the caller proves the request was small, keep the 429 class.
219
+ if (isCursorZeroTokenResourceExhausted(lower)) {
220
+ return bareReLooksLikeOverflow(sizeContext) ? "Cursor context limit exceeded" : "Cursor rate limit exceeded";
221
+ }
222
+ return "Cursor rate limit exceeded";
100
223
  }
101
224
 
102
225
  if (
@@ -118,6 +241,21 @@ export function classifyCursorError(message: string): string {
118
241
  lower.includes("access denied")
119
242
  ) return "Cursor authentication failed";
120
243
 
244
+ // gRPC FAILED_PRECONDITION is deterministic and non-retryable (unlike UNAVAILABLE):
245
+ // the backend rejected the call because the account/plan state does not allow it —
246
+ // seen live when a plan-gated model (e.g. claude-fable-5) runs on a plan without it.
247
+ // Leaving it as "Cursor upstream error" (502) made clients retry it as overload.
248
+ //
249
+ // This MUST precede the overload keywords. The explicit gRPC status code is a
250
+ // structured signal from the backend; the keywords are inference over free text. A
251
+ // plan-gated rejection routinely reads "failed_precondition: model unavailable for
252
+ // this plan", which matched "unavailable" first and came back as a retryable
253
+ // overload — the exact misclassification this branch was added to stop. Checking the
254
+ // code first lets the deterministic signal win over the words around it.
255
+ if (lower.includes("failed_precondition") || lower.includes("failed precondition")) {
256
+ return "Cursor invalid request";
257
+ }
258
+
121
259
  if (
122
260
  lower.includes("unavailable") ||
123
261
  lower.includes("overloaded") ||
@@ -156,8 +294,8 @@ export function classifyCursorError(message: string): string {
156
294
  * Produce a user-facing, secret-safe Cursor error message with an actionable category prefix.
157
295
  * Mirrors `safeKiroErrorMessage` / `safeKiroHttpErrorMessage` in kiro-errors.ts.
158
296
  */
159
- export function safeCursorErrorMessage(rawMessage: string): string {
160
- const prefix = classifyCursorError(rawMessage);
297
+ export function safeCursorErrorMessage(rawMessage: string, sizeContext?: CursorSizeContext): string {
298
+ const prefix = classifyCursorError(rawMessage, sizeContext);
161
299
  const detail = sanitize(rawMessage)
162
300
  .replace(/resource[_ ]exhausted/gi, "resource limit exceeded")
163
301
  .slice(0, 500);