@bitkyc08/opencodex 2.83.0 → 2.86.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 (405) hide show
  1. package/README.md +0 -4
  2. package/bin/ocx.mjs +61 -3
  3. package/gui/dist/assets/App-BjlttVLy.js +58 -0
  4. package/gui/dist/assets/Tray-DyR9yBee.js +1 -0
  5. package/gui/dist/assets/{index-BAbcj51J.css → index-BB6uK6tU.css} +1 -1
  6. package/gui/dist/assets/index-BMssP4k3.js +94 -0
  7. package/gui/dist/assets/quota-summary-D8M1bc_R.js +1 -0
  8. package/gui/dist/index.html +2 -2
  9. package/package.json +2 -3
  10. package/src/adapters/anthropic/beta-allowlist.ts +87 -8
  11. package/src/adapters/anthropic/client-identity.ts +1 -1
  12. package/src/adapters/anthropic/passthrough.ts +33 -4
  13. package/src/adapters/azure.ts +19 -1
  14. package/src/adapters/client-fingerprint.ts +24 -0
  15. package/src/adapters/coding-agent/protocol.ts +15 -8
  16. package/src/adapters/coding-agent/turn.ts +22 -9
  17. package/src/adapters/cursor/arg-codec.ts +17 -5
  18. package/src/adapters/cursor/catalog.ts +8 -0
  19. package/src/adapters/cursor/effort-map.ts +3 -0
  20. package/src/adapters/cursor/freeform-args.ts +75 -0
  21. package/src/adapters/cursor/protobuf-events.ts +36 -23
  22. package/src/adapters/google-antigravity-wire.ts +22 -1
  23. package/src/adapters/google.ts +2 -2
  24. package/src/adapters/ollama-native.ts +29 -1
  25. package/src/adapters/openai-chat/messages.ts +8 -4
  26. package/src/adapters/openai-chat/response-events.ts +59 -1
  27. package/src/adapters/openai-chat.ts +8 -5
  28. package/src/adapters/openai-responses/empty-assistant.ts +32 -0
  29. package/src/adapters/openai-responses/passthrough.ts +3 -0
  30. package/src/adapters/openai-responses/request-strips.ts +10 -2
  31. package/src/adapters/qoder/adapter.ts +56 -15
  32. package/src/advisor/consult.ts +220 -0
  33. package/src/advisor/context.ts +226 -0
  34. package/src/advisor/disclosure.ts +20 -0
  35. package/src/advisor/runtime.ts +305 -0
  36. package/src/advisor/settings.ts +135 -0
  37. package/src/advisor/state.ts +369 -0
  38. package/src/advisor/synthetic-tool.ts +33 -0
  39. package/src/bridge/errors.ts +24 -0
  40. package/src/bridge.ts +1 -1
  41. package/src/chat/inbound.ts +30 -6
  42. package/src/chat/outbound.ts +5 -0
  43. package/src/claude/context-windows.ts +54 -1
  44. package/src/claude/desktop-3p-library.ts +43 -3
  45. package/src/claude/desktop-3p.ts +22 -8
  46. package/src/claude/desktop-picker-profile.ts +11 -4
  47. package/src/claude/desktop-profile.ts +10 -1
  48. package/src/claude/desktop-remote-store-io.ts +5 -3
  49. package/src/claude/inbound.ts +121 -50
  50. package/src/claude/intercept/connect-proxy.ts +10 -3
  51. package/src/claude/intercept/local-ca.ts +8 -1
  52. package/src/claude/intercept/picker-ca-persistence.ts +3 -1
  53. package/src/claude/intercept/picker-listener.ts +49 -1
  54. package/src/claude/intercept/settings-no-proxy.ts +146 -0
  55. package/src/claude/intercept/settings.ts +101 -9
  56. package/src/claude/model-default-settings.ts +154 -0
  57. package/src/claude/model-info.ts +7 -7
  58. package/src/claude/outbound.ts +13 -6
  59. package/src/cli/account-api.ts +65 -0
  60. package/src/cli/account-auth.ts +26 -2
  61. package/src/cli/account.ts +41 -5
  62. package/src/cli/advisor.ts +151 -0
  63. package/src/cli/auxiliary-listener-preflight.ts +37 -0
  64. package/src/cli/capabilities-access-remote.ts +8 -0
  65. package/src/cli/capabilities-agents-routing.ts +18 -0
  66. package/src/cli/capabilities-base.ts +14 -2
  67. package/src/cli/catalog-command-result.ts +2 -1
  68. package/src/cli/chatgpt-command.ts +35 -14
  69. package/src/cli/claude.ts +60 -11
  70. package/src/cli/config-command.ts +8 -2
  71. package/src/cli/debug.ts +8 -0
  72. package/src/cli/dispatch.ts +21 -4
  73. package/src/cli/doctor.ts +9 -0
  74. package/src/cli/ensure-desktop-cold-start.ts +329 -0
  75. package/src/cli/export-command.ts +15 -2
  76. package/src/cli/help.ts +2 -1
  77. package/src/cli/hub-disable.ts +99 -0
  78. package/src/cli/hub.ts +4 -2
  79. package/src/cli/index.ts +26 -8
  80. package/src/cli/integration-plan-dto.ts +2 -0
  81. package/src/cli/link-child.ts +104 -0
  82. package/src/cli/link-enrollment.ts +96 -0
  83. package/src/cli/link.ts +39 -24
  84. package/src/cli/observe-stream.ts +6 -1
  85. package/src/cli/observe.ts +10 -2
  86. package/src/cli/provider.ts +12 -0
  87. package/src/cli/registry.ts +20 -7
  88. package/src/cli/restart-scope.ts +3 -1
  89. package/src/cli/runtime-api.ts +27 -2
  90. package/src/cli/status.ts +104 -20
  91. package/src/client/connect.ts +39 -4
  92. package/src/client/hub-client.ts +14 -7
  93. package/src/client/hub-state.ts +25 -14
  94. package/src/client/link-home.ts +248 -0
  95. package/src/client/link-management-relay.ts +61 -0
  96. package/src/client/link-relay.ts +6 -1
  97. package/src/client/link-status.ts +14 -0
  98. package/src/client/machine-api.ts +14 -7
  99. package/src/client/machine-listener.ts +29 -4
  100. package/src/clients/config-export/contracts.ts +1 -0
  101. package/src/clients/config-export/model-metadata.ts +3 -2
  102. package/src/clients/config-export/qoder.ts +93 -0
  103. package/src/clients/config-export.ts +59 -16
  104. package/src/clients/omo-role-models.ts +6 -3
  105. package/src/codex/agent-role-models.ts +26 -8
  106. package/src/codex/auth-api/account-list.ts +17 -2
  107. package/src/codex/auth-api/account-selection.ts +17 -7
  108. package/src/codex/auth-api/pool-mode-gate.ts +5 -2
  109. package/src/codex/auth-api/routes.ts +5 -1
  110. package/src/codex/auth-context.ts +79 -5
  111. package/src/codex/autostart-health.ts +7 -1
  112. package/src/codex/catalog/build-entries.ts +11 -2
  113. package/src/codex/catalog/bundled.ts +5 -1
  114. package/src/codex/catalog/configured-tiers.ts +50 -0
  115. package/src/codex/catalog/effort.ts +6 -3
  116. package/src/codex/catalog/metadata.ts +4 -2
  117. package/src/codex/catalog/model-hints.ts +21 -3
  118. package/src/codex/catalog/native-models.ts +16 -2
  119. package/src/codex/catalog/native-ultrafast.ts +106 -0
  120. package/src/codex/catalog/parsing.ts +5 -0
  121. package/src/codex/catalog/provider-models.ts +4 -0
  122. package/src/codex/catalog/retained-sync.ts +2 -0
  123. package/src/codex/catalog/routed-gather.ts +22 -4
  124. package/src/codex/catalog/vendor-context.ts +82 -0
  125. package/src/codex/config-write-lock.ts +40 -2
  126. package/src/codex/convergence.ts +2 -0
  127. package/src/codex/desktop-app/types.ts +2 -0
  128. package/src/codex/desktop-app/windows.ts +29 -16
  129. package/src/codex/desktop-app-restart.ts +4 -2
  130. package/src/codex/desktop-compatibility/certificate-service.ts +99 -0
  131. package/src/codex/desktop-compatibility/certificate-store.ts +193 -0
  132. package/src/codex/desktop-compatibility/connection-store.ts +87 -0
  133. package/src/codex/desktop-compatibility/installed-build.ts +55 -0
  134. package/src/codex/desktop-compatibility/json-body.ts +29 -0
  135. package/src/codex/desktop-compatibility/native-identity.ts +62 -0
  136. package/src/codex/desktop-compatibility/relay-listener.ts +93 -0
  137. package/src/codex/desktop-compatibility/routing-binding.ts +10 -0
  138. package/src/codex/desktop-compatibility/routing-preflight.ts +69 -0
  139. package/src/codex/desktop-compatibility/runtime-ownership.ts +28 -0
  140. package/src/codex/desktop-compatibility/runtime.ts +173 -0
  141. package/src/codex/desktop-compatibility/service.ts +30 -0
  142. package/src/codex/desktop-compatibility/startup-settings.ts +50 -0
  143. package/src/codex/desktop-compatibility/usage-activation.ts +86 -0
  144. package/src/codex/desktop-compatibility/usage-controlled-fetch.ts +59 -0
  145. package/src/codex/desktop-compatibility/usage-controller.ts +107 -0
  146. package/src/codex/desktop-compatibility/usage-policy.ts +59 -0
  147. package/src/codex/desktop-compatibility/usage-refresh.ts +33 -0
  148. package/src/codex/desktop-compatibility/usage-sse-controller.ts +86 -0
  149. package/src/codex/desktop-compatibility/windows-activation-source.ts +44 -0
  150. package/src/codex/desktop-compatibility/windows-certificate-trust.ts +81 -0
  151. package/src/codex/desktop-compatibility/windows-key-protection.ts +59 -0
  152. package/src/codex/desktop-compatibility/windows-package-command.ts +86 -0
  153. package/src/codex/desktop-compatibility/windows-package-launch.ts +28 -0
  154. package/src/codex/history-provider.ts +1 -1
  155. package/src/codex/inject/config-write-section.ts +4 -1
  156. package/src/codex/inject/remove.ts +18 -6
  157. package/src/codex/journal.ts +16 -1
  158. package/src/codex/main-account.ts +99 -15
  159. package/src/codex/native-main-refresh-mode.ts +217 -0
  160. package/src/codex/native-profile-startup.ts +4 -1
  161. package/src/codex/prompt-journal.ts +20 -2
  162. package/src/codex/prompt-layers/encoding.ts +49 -0
  163. package/src/codex/prompt-layers/import-source.ts +30 -0
  164. package/src/codex/prompt-layers/toml-edit.ts +269 -37
  165. package/src/codex/prompt-layers/toml-read.ts +52 -4
  166. package/src/codex/prompt-layers.ts +383 -20
  167. package/src/codex/prompt-lock-claim.ts +13 -3
  168. package/src/codex/prompt-lock-evidence.ts +3 -3
  169. package/src/codex/prompt-lock-owner.ts +14 -6
  170. package/src/codex/prompt-text-probe.ts +34 -5
  171. package/src/codex/quota.ts +13 -6
  172. package/src/codex/role-auto-assign.ts +2 -5
  173. package/src/codex/routing/active-account.ts +21 -0
  174. package/src/codex/routing/health-store.ts +1 -1
  175. package/src/codex/routing/pool-recovery.ts +79 -0
  176. package/src/codex/routing.ts +1 -1
  177. package/src/codex/runtime.ts +196 -8
  178. package/src/codex/shim-diagnostics.ts +6 -0
  179. package/src/codex/shim-overlay.ts +15 -6
  180. package/src/codex/shim.ts +1 -1
  181. package/src/combos/failover.ts +3 -0
  182. package/src/config/api-key-reconcile.ts +34 -0
  183. package/src/config/diagnostics.ts +18 -1
  184. package/src/config/feature-flags.ts +5 -0
  185. package/src/config/live-reconcile.ts +56 -29
  186. package/src/config/live-topology.ts +29 -0
  187. package/src/config/load-degrade.ts +8 -2
  188. package/src/config/paths.ts +13 -3
  189. package/src/config/salvage.ts +3 -1
  190. package/src/config/schema/config-schema.ts +19 -0
  191. package/src/config/schema/desktop-compatibility.ts +9 -0
  192. package/src/config/schema/leaf-validators.ts +1 -0
  193. package/src/generated/compatibility-version.json +713 -285
  194. package/src/generated/model-metadata.ts +1 -1
  195. package/src/grok/grpc-web.ts +23 -1
  196. package/src/grok/reset-coupon-ledger.ts +75 -5
  197. package/src/grok/reset-coupons.ts +4 -2
  198. package/src/integrations/catalog-refresh.ts +1 -1
  199. package/src/integrations/config-io.ts +20 -2
  200. package/src/integrations/journal.ts +15 -1
  201. package/src/integrations/mutation-plan.ts +14 -7
  202. package/src/integrations/registry.ts +52 -11
  203. package/src/integrations/state.ts +19 -7
  204. package/src/integrations/store.ts +3 -0
  205. package/src/integrations/target.ts +42 -5
  206. package/src/integrations/writer.ts +24 -7
  207. package/src/lib/advisor-activation.ts +16 -0
  208. package/src/lib/app-owned-memory-stores.ts +4 -0
  209. package/src/lib/app-owned-memory.ts +11 -0
  210. package/src/lib/background-work.ts +65 -0
  211. package/src/lib/bounded-file-read.ts +58 -0
  212. package/src/lib/bun-path-runtime.d.mts +10 -1
  213. package/src/lib/bun-path-runtime.mjs +62 -3
  214. package/src/lib/desktop-proxy-route.ts +30 -0
  215. package/src/lib/desktop-upstream-tunnel.ts +107 -0
  216. package/src/lib/errors.ts +7 -0
  217. package/src/lib/json-byte-size.ts +31 -0
  218. package/src/lib/local-internal-call-capability.ts +55 -0
  219. package/src/lib/optional-shutdown-hooks.ts +35 -0
  220. package/src/lib/outbound-credential-registry.ts +210 -0
  221. package/src/lib/package-tree-integrity.ts +2 -2
  222. package/src/lib/passive-read.ts +35 -0
  223. package/src/lib/shadow-call.ts +44 -5
  224. package/src/lib/socks5-fetch.ts +48 -71
  225. package/src/lib/socks5-handshake.ts +112 -0
  226. package/src/lib/translator-budget.ts +7 -1
  227. package/src/link/codex-settings.ts +155 -0
  228. package/src/link/management-routes.ts +89 -0
  229. package/src/link/remote-probe.ts +38 -0
  230. package/src/link/ssh-argv.ts +26 -5
  231. package/src/link/ssh-runner.ts +58 -27
  232. package/src/link/status-projection.ts +22 -4
  233. package/src/link/supervisor.ts +144 -49
  234. package/src/link/tunnel-state.ts +11 -4
  235. package/src/oauth/anthropic-continuity.ts +4 -3
  236. package/src/oauth/anthropic-identity.ts +13 -2
  237. package/src/oauth/anthropic-model-quota.ts +13 -1
  238. package/src/oauth/anthropic-routing.ts +230 -23
  239. package/src/oauth/anthropic.ts +18 -4
  240. package/src/oauth/generic-account-failover.ts +29 -5
  241. package/src/oauth/google-antigravity.ts +24 -7
  242. package/src/oauth/index.ts +28 -17
  243. package/src/oauth/kiro-account-identity.ts +106 -0
  244. package/src/oauth/kiro-device-login.ts +2 -1
  245. package/src/oauth/kiro.ts +55 -6
  246. package/src/oauth/plan.ts +29 -0
  247. package/src/oauth/store.ts +40 -3
  248. package/src/oauth/types.ts +2 -0
  249. package/src/plugins/loader.ts +11 -0
  250. package/src/protocols/codecs/chat-ir.ts +467 -0
  251. package/src/protocols/codecs/chat.ts +10 -1
  252. package/src/protocols/codecs/messages-ir.ts +500 -0
  253. package/src/protocols/features.ts +10 -2
  254. package/src/protocols/path.ts +11 -1
  255. package/src/protocols/plan-snapshot.ts +39 -16
  256. package/src/protocols/plan.ts +9 -1
  257. package/src/protocols/settings.ts +8 -0
  258. package/src/providers/anthropic-billing-ownership.ts +74 -0
  259. package/src/providers/anthropic-billing-recovery.ts +31 -0
  260. package/src/providers/anthropic-billing-refusal.ts +55 -0
  261. package/src/providers/anthropic-reset-admission.ts +62 -0
  262. package/src/providers/anthropic-reset-grant-ledger.ts +28 -6
  263. package/src/providers/antigravity-account-roster.ts +102 -0
  264. package/src/providers/antigravity-models.ts +85 -7
  265. package/src/providers/api-key-resolve.ts +17 -2
  266. package/src/providers/key-failover.ts +52 -5
  267. package/src/providers/model-rename-fields.ts +2 -0
  268. package/src/providers/model-rename-migration.ts +5 -3
  269. package/src/providers/model-rename-startup.ts +5 -3
  270. package/src/providers/quota/account-cache.ts +11 -0
  271. package/src/providers/quota/anthropic-account-quota.ts +4 -2
  272. package/src/providers/quota/report-cache.ts +14 -0
  273. package/src/providers/quota/vendor-probes-oauth.ts +3 -3
  274. package/src/providers/quota.ts +4 -1
  275. package/src/providers/registry/entries-core.ts +21 -20
  276. package/src/providers/registry/entries-extended.ts +19 -1
  277. package/src/providers/registry/model-seeds.ts +17 -0
  278. package/src/providers/request-pacing.ts +9 -0
  279. package/src/providers/stale-no-vision-seed-migration.ts +72 -0
  280. package/src/responses/compaction.ts +14 -0
  281. package/src/responses/parser.ts +37 -20
  282. package/src/responses/state.ts +32 -29
  283. package/src/routing/history/build-file.ts +92 -0
  284. package/src/routing/history/indexer.ts +248 -216
  285. package/src/routing/history/ingest.ts +238 -0
  286. package/src/routing/history/rebuild-job.ts +111 -0
  287. package/src/routing/history/rebuild-protocol.ts +15 -0
  288. package/src/routing/history/rebuild-worker.ts +34 -0
  289. package/src/server/admission-model-scope.ts +4 -1
  290. package/src/server/antigravity-direct-eligibility.ts +208 -0
  291. package/src/server/auth-cors.ts +46 -0
  292. package/src/server/chat-completions.ts +75 -9
  293. package/src/server/claude-messages.ts +110 -20
  294. package/src/server/configured-credentials.ts +194 -0
  295. package/src/server/index/desktop-compatibility-startup.ts +56 -0
  296. package/src/server/index/link-management.ts +58 -0
  297. package/src/server/index/optional-listeners.ts +5 -1
  298. package/src/server/index/serve-options.ts +15 -2
  299. package/src/server/index/startup-warnings.ts +9 -0
  300. package/src/server/index/websocket-handler.ts +9 -0
  301. package/src/server/index.ts +13 -10
  302. package/src/server/inference/client-encoder-delivery.ts +6 -5
  303. package/src/server/lifecycle.ts +2 -1
  304. package/src/server/login-shell-path.ts +146 -0
  305. package/src/server/management/advisor-routes.ts +191 -0
  306. package/src/server/management/agent-settings-routes.ts +50 -14
  307. package/src/server/management/anthropic-reset-grant-routes.ts +17 -1
  308. package/src/server/management/codex-agent-role-routes.ts +19 -6
  309. package/src/server/management/codex-prompt-routes.ts +136 -5
  310. package/src/server/management/codex-role-auto-assign.ts +1 -1
  311. package/src/server/management/companion-routes.ts +4 -0
  312. package/src/server/management/config-routes.ts +2 -2
  313. package/src/server/management/context.ts +4 -0
  314. package/src/server/management/desktop-compatibility-routes.ts +46 -0
  315. package/src/server/management/desktop-compatibility-runtime-routes.ts +46 -0
  316. package/src/server/management/desktop-compatibility-settings-routes.ts +27 -0
  317. package/src/server/management/grok-coupon-routes.ts +78 -27
  318. package/src/server/management/link-enrollment.ts +192 -0
  319. package/src/server/management/link-route-state.ts +185 -0
  320. package/src/server/management/link-routes.ts +82 -402
  321. package/src/server/management/model-routes.ts +2 -2
  322. package/src/server/management/model-rows.ts +3 -1
  323. package/src/server/management/protocol-settings-patch.ts +1 -0
  324. package/src/server/management/provider-overwrite-carry.ts +10 -0
  325. package/src/server/management/provider-routes.ts +1 -0
  326. package/src/server/management/route-registry.ts +16 -3
  327. package/src/server/management/shared.ts +3 -0
  328. package/src/server/management/sibling-guard.ts +1 -0
  329. package/src/server/management-api.ts +9 -1
  330. package/src/server/messages-antigravity-direct.ts +195 -0
  331. package/src/server/messages-native.ts +73 -43
  332. package/src/server/relay-eager.ts +2 -0
  333. package/src/server/request-log-filter.ts +6 -1
  334. package/src/server/request-log-terminal-status.ts +63 -6
  335. package/src/server/request-log.ts +7 -0
  336. package/src/server/responses/adapter-continuation.ts +35 -18
  337. package/src/server/responses/adapter-delivery.ts +24 -2
  338. package/src/server/responses/adapter-dispatch.ts +261 -81
  339. package/src/server/responses/advisor-plan-slot.ts +27 -0
  340. package/src/server/responses/advisor-slot.ts +336 -0
  341. package/src/server/responses/code-mode-collab-surface.ts +313 -0
  342. package/src/server/responses/codex-ws-exchange.ts +147 -6
  343. package/src/server/responses/codex-ws-wire.ts +203 -0
  344. package/src/server/responses/collaboration.ts +36 -7
  345. package/src/server/responses/compact.ts +126 -48
  346. package/src/server/responses/context-overflow.ts +13 -1
  347. package/src/server/responses/core-codex-account.ts +105 -1
  348. package/src/server/responses/core-combo-failure.ts +24 -1
  349. package/src/server/responses/core-combo.ts +28 -2
  350. package/src/server/responses/core-errors.ts +29 -1
  351. package/src/server/responses/core-lifetime.ts +2 -0
  352. package/src/server/responses/core-normalize.ts +11 -0
  353. package/src/server/responses/core-options.ts +48 -0
  354. package/src/server/responses/core-replay.ts +7 -4
  355. package/src/server/responses/core.ts +1 -1
  356. package/src/server/responses/deferred-collab-surface.ts +158 -0
  357. package/src/server/responses/deferred-send-reporter.ts +25 -0
  358. package/src/server/responses/fetch-helpers.ts +12 -1
  359. package/src/server/responses/passthrough-delivery.ts +20 -11
  360. package/src/server/responses/passthrough-dispatch.ts +29 -7
  361. package/src/server/responses/request-prepare.ts +74 -9
  362. package/src/server/responses/request-transport.ts +22 -8
  363. package/src/server/responses/run-turn-execution.ts +70 -8
  364. package/src/server/responses/sidecar-execution.ts +89 -5
  365. package/src/server/responses/terminal-guard.ts +2 -1
  366. package/src/server/responses/ws-upstream.ts +9 -1
  367. package/src/server/responses-undeclared-tool-guard.ts +30 -9
  368. package/src/server/startup-action-control.ts +38 -4
  369. package/src/server/startup-health-cache.ts +5 -0
  370. package/src/server/system-env-shell.ts +7 -2
  371. package/src/server/system-env.ts +11 -1
  372. package/src/service/cli.ts +5 -1
  373. package/src/service/desktop-startup.ts +161 -34
  374. package/src/service/desktop-supervision.d.mts +27 -1
  375. package/src/service/desktop-supervision.mjs +111 -5
  376. package/src/service/health-sentinel-launch.ts +176 -0
  377. package/src/service/health-sentinel-main.ts +466 -0
  378. package/src/service/health-sentinel-policy.ts +241 -0
  379. package/src/service/health-sentinel-probe.ts +71 -0
  380. package/src/service/health-sentinel-windows.ts +87 -0
  381. package/src/service/linux-linger.ts +20 -0
  382. package/src/service/logging.ts +72 -0
  383. package/src/tray/windows-tray.ps1 +43 -24
  384. package/src/types/config.ts +68 -6
  385. package/src/types/provider.ts +7 -0
  386. package/src/types/request.ts +15 -0
  387. package/src/types/tools.ts +2 -0
  388. package/src/update/async-check.ts +1 -1
  389. package/src/update/badge.ts +2 -2
  390. package/src/update/index.ts +88 -15
  391. package/src/update/job-supervised-restart.ts +107 -0
  392. package/src/update/job.ts +32 -32
  393. package/src/update/notify.ts +1 -1
  394. package/src/update/refresh-scheduler.ts +2 -2
  395. package/src/update/supervised-recovery.d.mts +27 -0
  396. package/src/update/supervised-recovery.mjs +157 -0
  397. package/src/usage/cache-diagnostic.ts +2 -0
  398. package/src/usage/expected-prices.ts +16 -0
  399. package/src/usage/log.ts +19 -1
  400. package/src/web-search/gemini-executor.ts +2 -2
  401. package/assets/sponsors/packycode.png +0 -0
  402. package/gui/dist/assets/App-Ba8uG696.js +0 -54
  403. package/gui/dist/assets/Tray-IImbNPRy.js +0 -1
  404. package/gui/dist/assets/index-BHRZdJuv.js +0 -94
  405. package/gui/dist/assets/quota-summary-DiJO6sYY.js +0 -1
@@ -56,6 +56,20 @@ export const SUMMARY_PREFIX = "Another language model started to solve this prob
56
56
 
57
57
  export const OPAQUE_COMPACTION_NOTE = "[earlier conversation was compacted; the summary is stored in a format this model cannot read]";
58
58
 
59
+ /**
60
+ * Prompt contract for a routed model receiving a decoded `ocx1` checkpoint as user text (#6764).
61
+ * It preserves existing authorization scope and permission gates; it grants no authority.
62
+ * Kept apart from SUMMARY_PREFIX, which the v1 retention and recovery paths match exactly.
63
+ */
64
+ export const CHECKPOINT_CONTINUATION_NOTE = "This conversation was compacted automatically. A checkpoint summary from an earlier context window appears as a user message and records prior work. Treat earlier requests it reports as completed as history; do not repeat them unless a later user message asks you to. Continue an unfinished task only when it was already authorized and remains within the scope of that authorization. Do not ask for the same authorization again while it still applies. Preserve all existing permission and confirmation gates; if a decision or required permission is pending, wait for it before taking the dependent action. A checkpoint or delegation, including one from another thread, does not itself grant authority or expand the task's scope. Later user messages take priority; obey any pause, cancellation, replacement, or change of scope.";
65
+
66
+ /** Append the continuation note to existing instructions once. */
67
+ export function appendCheckpointContinuationNote(instructions: unknown): string {
68
+ const existing = typeof instructions === "string" ? instructions : "";
69
+ if (existing.includes(CHECKPOINT_CONTINUATION_NOTE)) return existing;
70
+ return existing.trim().length > 0 ? `${existing}\n\n${CHECKPOINT_CONTINUATION_NOTE}` : CHECKPOINT_CONTINUATION_NOTE;
71
+ }
72
+
59
73
  /**
60
74
  * Item types in the compact wire family. Each carries an `encrypted_content` blob the client
61
75
  * replays verbatim on every later turn, and the minting backend verifies it is unmodified.
@@ -15,7 +15,7 @@ import { createToolChoiceResolver, namespacedToolName } from "../types";
15
15
  import { responsesRequestSchema } from "./schema";
16
16
  import { providerMetadataFromResponsesFunctionCall } from "./provider-opaque-metadata";
17
17
  import { lookupReplayThoughtSignature } from "./thought-signature-replay";
18
- import { compactionItemToText, isCompactionItemType } from "./compaction";
18
+ import { CHECKPOINT_CONTINUATION_NOTE, compactionItemToText, decodeCompactionSummary, isCompactionItemType } from "./compaction";
19
19
  import { previousResponseReplayPrefixLength } from "./state";
20
20
  import { decodeReasoningEnvelope } from "./reasoning-envelope";
21
21
  import { hasRoutedIdentity, nameRoutedIdentity } from "../adapters/identity";
@@ -66,6 +66,35 @@ function repairJsonObjectEnvelope(text: string): Record<string, unknown> | undef
66
66
  return undefined;
67
67
  }
68
68
 
69
+ /**
70
+ * Decode a function call's serialized arguments the way history replay tolerates them: empty
71
+ * or non-JSON text becomes `{}` instead of failing every later turn, and the one bounded
72
+ * lost-brace corruption above is repaired. Shared with the direct Chat decoder
73
+ * (`src/protocols/codecs/chat-ir.ts`) so both decode the same call to the same object.
74
+ */
75
+ export function functionCallArgumentsFromText(callId: string, rawArguments: string | undefined): Record<string, unknown> {
76
+ let args: Record<string, unknown> = {};
77
+ const rawArgs = rawArguments?.trim();
78
+ if (rawArgs) {
79
+ try {
80
+ const parsed: unknown = JSON.parse(rawArgs);
81
+ if (isObj(parsed)) args = parsed;
82
+ } catch {
83
+ // One observed serialization corruption loses exactly the JSON object's opening
84
+ // brace; the closed envelope is tight enough to repair back into a call the
85
+ // routed model can still see and retry, instead of replaying {} forever.
86
+ const repaired = repairJsonObjectEnvelope(rawArgs);
87
+ if (repaired === undefined) {
88
+ console.warn(`[parser] function_call ${callId} has non-JSON arguments; defaulting to {}`);
89
+ } else {
90
+ args = repaired;
91
+ console.warn(`[parser] function_call ${callId} arguments lost the JSON opening brace; repaired from history`);
92
+ }
93
+ }
94
+ }
95
+ return args;
96
+ }
97
+
69
98
 
70
99
 
71
100
  function ensureAssistantPlaceholder(messages: OcxMessage[], modelId: string, now: number): OcxAssistantMessage {
@@ -193,6 +222,7 @@ export function parseRequest(
193
222
  // Remote compaction v2: the input tail carries `{type:"compaction_trigger"}` and Codex expects a
194
223
  // synthetic `{type:"compaction"}` output item (src/responses/compaction.ts). Flagged for the server.
195
224
  let compactionRequest = false;
225
+ let decodedCheckpoint = false;
196
226
  let contextCompactionBoundary = false;
197
227
  let continuationConversationMessageIndex: number | undefined;
198
228
 
@@ -261,6 +291,7 @@ export function parseRequest(
261
291
  if (inputIndex >= replayedInputPrefixLength) contextCompactionBoundary = true;
262
292
  const encrypted = (item as { encrypted_content?: unknown }).encrypted_content;
263
293
  if (effectiveType === "context_compaction" && typeof encrypted !== "string") continue;
294
+ if (typeof encrypted === "string" && decodeCompactionSummary(encrypted) !== null) decodedCheckpoint = true;
264
295
  pendingReasoning.length = 0;
265
296
  messages.push({
266
297
  role: "user",
@@ -395,25 +426,7 @@ export function parseRequest(
395
426
  const call = item as { id?: string; call_id: string; name: string; arguments?: string; namespace?: string; extra_content?: unknown };
396
427
  // Tolerate empty/non-JSON arguments (e.g. a no-arg tool call serialized as "") instead of
397
428
  // throwing — a single poisoned history item would otherwise 400 every subsequent turn.
398
- let args: Record<string, unknown> = {};
399
- const rawArgs = call.arguments?.trim();
400
- if (rawArgs) {
401
- try {
402
- const parsed: unknown = JSON.parse(rawArgs);
403
- if (isObj(parsed)) args = parsed;
404
- } catch {
405
- // One observed serialization corruption loses exactly the JSON object's opening
406
- // brace; the closed envelope is tight enough to repair back into a call the
407
- // routed model can still see and retry, instead of replaying {} forever.
408
- const repaired = repairJsonObjectEnvelope(rawArgs);
409
- if (repaired === undefined) {
410
- console.warn(`[parser] function_call ${call.call_id} has non-JSON arguments; defaulting to {}`);
411
- } else {
412
- args = repaired;
413
- console.warn(`[parser] function_call ${call.call_id} arguments lost the JSON opening brace; repaired from history`);
414
- }
415
- }
416
- }
429
+ const args = functionCallArgumentsFromText(call.call_id, call.arguments);
417
430
  // Do NOT map Responses item `id` (fc_/ctc_/…) onto `thoughtSignature`. That field is
418
431
  // reserved for Gemini/Antigravity opaque thought tokens; forwarding item ids as
419
432
  // thoughtSignature 400s Antigravity (Base64 / TYPE_BYTES). Continuity for CCA comes from
@@ -586,6 +599,10 @@ export function parseRequest(
586
599
  .map(t => loadedToolNames.has(namespacedToolName(t.namespace, t.name))
587
600
  ? { ...t, loadedFromToolSearch: true }
588
601
  : t);
602
+ // #6764: the decoded checkpoint is ordinary user text on this route. Say in the system prompt
603
+ // what it is, so a retained earlier request that it reports as completed is not repeated.
604
+ // A compaction request is a summarizer turn and must not be told to continue.
605
+ if (decodedCheckpoint && !compactionRequest) systemPrompt.push(CHECKPOINT_CONTINUATION_NOTE);
589
606
  const context: OcxContext = {
590
607
  ...(systemPrompt.length > 0 ? { systemPrompt } : {}),
591
608
  messages,
@@ -710,11 +710,6 @@ export function sweepOrphanedResponseSpills(): number {
710
710
  type SnapshotWriteOutcome = "stable" | "unstable" | "failed";
711
711
 
712
712
  async function writeBoundedSnapshot(path: string, attemptLimit: number): Promise<SnapshotWriteOutcome> {
713
- // Serialize writers so concurrent flush + debounce cannot race on temps / ACL (#612).
714
- const previous = persistGate;
715
- let release!: () => void;
716
- persistGate = new Promise<void>(resolve => { release = resolve; });
717
- await previous;
718
713
  try {
719
714
  for (let attempt = 0; attempt < attemptLimit; attempt += 1) {
720
715
  const revision = stateRevision;
@@ -751,13 +746,19 @@ async function writeBoundedSnapshot(path: string, attemptLimit: number): Promise
751
746
  lastSnapshotTarget = resolveWriteTarget(path);
752
747
  }
753
748
  persistAttemptHookForTests?.();
754
- if (revision === stateRevision) return "stable";
749
+ if (revision === stateRevision) {
750
+ // Cancel only the timer whose mutation this stable revision includes,
751
+ // before an awaiting caller's microtask can record a newer revision.
752
+ if (persistTimer) clearTimeout(persistTimer);
753
+ persistTimer = null;
754
+ pendingPersistPath = null;
755
+ drainPendingSpillUnlinks();
756
+ return "stable";
757
+ }
755
758
  }
756
759
  return "unstable";
757
760
  } catch {
758
761
  return "failed";
759
- } finally {
760
- release();
761
762
  }
762
763
  }
763
764
 
@@ -792,21 +793,30 @@ function schedulePersistAt(path: string, replace = false): void {
792
793
  }
793
794
 
794
795
  async function persistNow(path: string, awaitFollowUp = false): Promise<void> {
795
- if (persistTimer) {
796
- clearTimeout(persistTimer);
797
- persistTimer = null;
798
- }
799
- pendingPersistPath = null;
800
- const attemptLimit = awaitFollowUp ? MAX_SNAPSHOT_REWRITE_ATTEMPTS : 1;
801
- let outcome = await writeBoundedSnapshot(path, attemptLimit);
802
- if (outcome === "unstable" && awaitFollowUp) {
803
- if (persistTimer) clearTimeout(persistTimer);
804
- persistTimer = null;
796
+ // Include follow-up scheduling in the gate: releasing after only the disk write
797
+ // lets shutdown observe an empty timer before the background pass re-arms it.
798
+ const previous = persistGate;
799
+ let release!: () => void;
800
+ persistGate = new Promise<void>(resolve => { release = resolve; });
801
+ await previous;
802
+ try {
803
+ if (persistTimer) {
804
+ clearTimeout(persistTimer);
805
+ persistTimer = null;
806
+ }
805
807
  pendingPersistPath = null;
806
- outcome = await writeBoundedSnapshot(path, attemptLimit);
808
+ const attemptLimit = awaitFollowUp ? MAX_SNAPSHOT_REWRITE_ATTEMPTS : 1;
809
+ let outcome = await writeBoundedSnapshot(path, attemptLimit);
810
+ if (outcome === "unstable" && awaitFollowUp) {
811
+ if (persistTimer) clearTimeout(persistTimer);
812
+ persistTimer = null;
813
+ pendingPersistPath = null;
814
+ outcome = await writeBoundedSnapshot(path, attemptLimit);
815
+ }
816
+ if (outcome === "unstable" && !awaitFollowUp) schedulePersistAt(path, true);
817
+ } finally {
818
+ release();
807
819
  }
808
- if (outcome === "stable") drainPendingSpillUnlinks();
809
- else if (outcome === "unstable" && !awaitFollowUp) schedulePersistAt(path, true);
810
820
  }
811
821
 
812
822
  function schedulePersist(): void {
@@ -816,15 +826,8 @@ function schedulePersist(): void {
816
826
  }
817
827
 
818
828
  async function flushResponseSnapshot(): Promise<void> {
819
- if (persistTimer) {
820
- await persistNow(pendingPersistPath ?? snapshotPath(), true);
821
- return;
822
- }
823
- // No pending timer: still await any in-flight write so shutdown does not race (#612).
829
+ // The gate includes the background pass's timer decision, not just its write.
824
830
  await persistGate;
825
- // A bounded background pass may have scheduled its same-path follow-up while
826
- // this flush was waiting on the single-flight gate. Shutdown owns one awaited
827
- // bounded follow-up rather than returning behind that unref'd timer.
828
831
  if (persistTimer) await persistNow(pendingPersistPath ?? snapshotPath(), true);
829
832
  }
830
833
 
@@ -0,0 +1,92 @@
1
+ /**
2
+ * The private build file of a worker rebuild (#6990).
3
+ *
4
+ * The worker writes the whole index into `<index>.rebuild-<pid>-<n>` next to
5
+ * the published file; the serving thread swaps it in only once it is complete,
6
+ * so no reader ever sees a partial index.
7
+ */
8
+
9
+ import { Database } from "bun:sqlite";
10
+ import { readdirSync, rmSync } from "node:fs";
11
+ import { basename, dirname, join } from "node:path";
12
+ import type { UsageLogRevision } from "../../usage/log";
13
+ import { ingestSourceTail, recordSourceMeta, resetAndCreateSchema, setMeta } from "./ingest";
14
+ import { HISTORY_META_KEYS } from "./schema";
15
+
16
+ const BUILD_SIDE_FILES = ["", "-journal", "-wal", "-shm"] as const;
17
+
18
+ export function buildFilePath(indexPath: string, pid: number, sequence: number): string {
19
+ return `${indexPath}.rebuild-${pid}-${sequence}`;
20
+ }
21
+
22
+ export function removeBuildFiles(buildPath: string): void {
23
+ for (const suffix of BUILD_SIDE_FILES) {
24
+ try { rmSync(`${buildPath}${suffix}`, { force: true }); } catch { /* best effort; swept on a later build */ }
25
+ }
26
+ }
27
+
28
+ function processIsAlive(pid: number): boolean {
29
+ try {
30
+ process.kill(pid, 0);
31
+ return true;
32
+ } catch (error) {
33
+ // EPERM: the process exists under another user. Anything but ESRCH is treated as alive.
34
+ return (error as { code?: unknown } | null)?.code !== "ESRCH";
35
+ }
36
+ }
37
+
38
+ /**
39
+ * Remove build files a crashed process left beside the index. A build of this
40
+ * process, or of another live process, is left alone; this process removes
41
+ * its own builds once their worker has exited.
42
+ */
43
+ export function removeAbandonedBuilds(indexPath: string): number {
44
+ const prefix = `${basename(indexPath)}.rebuild-`;
45
+ let names: string[];
46
+ try {
47
+ names = readdirSync(dirname(indexPath));
48
+ } catch {
49
+ return 0;
50
+ }
51
+ const abandoned = new Set<string>();
52
+ for (const name of names) {
53
+ if (!name.startsWith(prefix)) continue;
54
+ const match = /^(\d+)-(\d+)/.exec(name.slice(prefix.length));
55
+ if (!match) continue;
56
+ const pid = Number(match[1]);
57
+ if (pid === process.pid || processIsAlive(pid)) continue;
58
+ abandoned.add(`${prefix}${match[1]}-${match[2]}`);
59
+ }
60
+ for (const name of abandoned) removeBuildFiles(join(dirname(indexPath), name));
61
+ return abandoned.size;
62
+ }
63
+
64
+ /**
65
+ * Build a complete index of the ledger snapshot `revision` describes into
66
+ * `buildPath`, leave it in WAL mode and close it. Returns the rows ingested.
67
+ * A private build needs no crash durability: an interrupted one is discarded.
68
+ */
69
+ export function buildIndexFile(buildPath: string, reason: string, revision: UsageLogRevision): number {
70
+ removeBuildFiles(buildPath);
71
+ const build = new Database(buildPath, { create: true, readwrite: true });
72
+ try {
73
+ build.exec("PRAGMA journal_mode = MEMORY");
74
+ build.exec("PRAGMA synchronous = OFF");
75
+ resetAndCreateSchema(build);
76
+ setMeta(build, HISTORY_META_KEYS.lastError, reason);
77
+ recordSourceMeta(build, revision);
78
+ const inserted = ingestSourceTail(build, revision.path, 0, {
79
+ expected: revision,
80
+ endOffset: Number(revision.size),
81
+ });
82
+ // The serving thread opens the published file in WAL mode; switching here
83
+ // keeps that first open from rewriting the database header.
84
+ build.exec("PRAGMA journal_mode = WAL");
85
+ build.close();
86
+ return inserted;
87
+ } catch (error) {
88
+ try { build.close(); } catch { /* already unusable */ }
89
+ removeBuildFiles(buildPath);
90
+ throw error;
91
+ }
92
+ }