@iislee/opencodex 2.11.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 (476) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +225 -0
  3. package/assets/architecture.png +0 -0
  4. package/assets/banner.png +0 -0
  5. package/assets/claude-code-models.gif +0 -0
  6. package/assets/codex-app-picker.png +0 -0
  7. package/bin/ocx.mjs +451 -0
  8. package/bin/package-main.mjs +9 -0
  9. package/gui/dist/assets/index-DTpMHS4F.js +67 -0
  10. package/gui/dist/assets/index-ZNVDE3C7.css +1 -0
  11. package/gui/dist/favicon.png +0 -0
  12. package/gui/dist/icons.svg +24 -0
  13. package/gui/dist/index.html +25 -0
  14. package/gui/dist/logo.png +0 -0
  15. package/gui/dist/provider-icons/alibaba-color.svg +1 -0
  16. package/gui/dist/provider-icons/antigravity-color.svg +1 -0
  17. package/gui/dist/provider-icons/antigravity.svg +1 -0
  18. package/gui/dist/provider-icons/claude-color.svg +1 -0
  19. package/gui/dist/provider-icons/claude.svg +1 -0
  20. package/gui/dist/provider-icons/cloudflare-ai-gateway-color.svg +1 -0
  21. package/gui/dist/provider-icons/copilot-color.svg +1 -0
  22. package/gui/dist/provider-icons/copilot.svg +1 -0
  23. package/gui/dist/provider-icons/cursor-color.svg +2 -0
  24. package/gui/dist/provider-icons/cursor.svg +2 -0
  25. package/gui/dist/provider-icons/deepseek-color.svg +1 -0
  26. package/gui/dist/provider-icons/discord.svg +1 -0
  27. package/gui/dist/provider-icons/firepass-color.svg +1 -0
  28. package/gui/dist/provider-icons/fireworks-color.svg +1 -0
  29. package/gui/dist/provider-icons/gemini-color.svg +1 -0
  30. package/gui/dist/provider-icons/gemini.svg +1 -0
  31. package/gui/dist/provider-icons/github-copilot-color.svg +1 -0
  32. package/gui/dist/provider-icons/gitlab-duo-color.svg +1 -0
  33. package/gui/dist/provider-icons/grok-color.svg +1 -0
  34. package/gui/dist/provider-icons/grok.svg +1 -0
  35. package/gui/dist/provider-icons/groq-color.svg +1 -0
  36. package/gui/dist/provider-icons/huggingface-color.svg +1 -0
  37. package/gui/dist/provider-icons/kimi-color.svg +1 -0
  38. package/gui/dist/provider-icons/kiro-color.svg +15 -0
  39. package/gui/dist/provider-icons/kiro.svg +14 -0
  40. package/gui/dist/provider-icons/lm-studio-color.svg +1 -0
  41. package/gui/dist/provider-icons/mistral-color.svg +1 -0
  42. package/gui/dist/provider-icons/moonshot-color.svg +1 -0
  43. package/gui/dist/provider-icons/nvidia-color.svg +1 -0
  44. package/gui/dist/provider-icons/ollama-color.svg +1 -0
  45. package/gui/dist/provider-icons/openai.svg +1 -0
  46. package/gui/dist/provider-icons/opencode.svg +1 -0
  47. package/gui/dist/provider-icons/openrouter-color.svg +1 -0
  48. package/gui/dist/provider-icons/pi.svg +21 -0
  49. package/gui/dist/provider-icons/qianfan-color.svg +1 -0
  50. package/gui/dist/provider-icons/qwen-portal-color.svg +1 -0
  51. package/gui/dist/provider-icons/telegram.svg +1 -0
  52. package/gui/dist/provider-icons/vercel-ai-gateway-color.svg +1 -0
  53. package/gui/dist/provider-icons/vllm-color.svg +1 -0
  54. package/gui/dist/provider-icons/xiaomi-color.svg +1 -0
  55. package/package.json +102 -0
  56. package/src/AGENTS.md +28 -0
  57. package/src/adapters/anthropic-image-guard.ts +251 -0
  58. package/src/adapters/anthropic-image-normalize.ts +518 -0
  59. package/src/adapters/anthropic.ts +1003 -0
  60. package/src/adapters/azure.ts +36 -0
  61. package/src/adapters/base.ts +72 -0
  62. package/src/adapters/client-fingerprint.ts +59 -0
  63. package/src/adapters/cursor/arg-codec.ts +38 -0
  64. package/src/adapters/cursor/arg-normalize.ts +104 -0
  65. package/src/adapters/cursor/cursor-errors.ts +165 -0
  66. package/src/adapters/cursor/discovery.ts +276 -0
  67. package/src/adapters/cursor/effort-map.ts +127 -0
  68. package/src/adapters/cursor/exec-policy.ts +88 -0
  69. package/src/adapters/cursor/framing.ts +211 -0
  70. package/src/adapters/cursor/gen/agent_pb.ts +15274 -0
  71. package/src/adapters/cursor/kv-store.ts +52 -0
  72. package/src/adapters/cursor/live-models.ts +153 -0
  73. package/src/adapters/cursor/live-smoke-gate.ts +41 -0
  74. package/src/adapters/cursor/live-transport.ts +1214 -0
  75. package/src/adapters/cursor/mcp-config.ts +42 -0
  76. package/src/adapters/cursor/mcp-manager.ts +333 -0
  77. package/src/adapters/cursor/message-mapper.ts +49 -0
  78. package/src/adapters/cursor/native-exec-common.ts +55 -0
  79. package/src/adapters/cursor/native-exec-desktop.ts +184 -0
  80. package/src/adapters/cursor/native-exec-fs.ts +329 -0
  81. package/src/adapters/cursor/native-exec-mcp.ts +153 -0
  82. package/src/adapters/cursor/native-exec-network.ts +43 -0
  83. package/src/adapters/cursor/native-exec-shell.ts +548 -0
  84. package/src/adapters/cursor/native-exec-tools.ts +118 -0
  85. package/src/adapters/cursor/native-exec.ts +576 -0
  86. package/src/adapters/cursor/protobuf-events.ts +563 -0
  87. package/src/adapters/cursor/protobuf-request.ts +714 -0
  88. package/src/adapters/cursor/request-builder.ts +255 -0
  89. package/src/adapters/cursor/thread-continuity.ts +67 -0
  90. package/src/adapters/cursor/tool-definitions.ts +505 -0
  91. package/src/adapters/cursor/transport-retry.ts +132 -0
  92. package/src/adapters/cursor/transport.ts +57 -0
  93. package/src/adapters/cursor/types.ts +52 -0
  94. package/src/adapters/cursor.ts +196 -0
  95. package/src/adapters/google-antigravity-replay.ts +303 -0
  96. package/src/adapters/google-antigravity-wire.ts +108 -0
  97. package/src/adapters/google-errors.ts +85 -0
  98. package/src/adapters/google-http.ts +100 -0
  99. package/src/adapters/google-tool-schema.ts +173 -0
  100. package/src/adapters/google-truncation.ts +13 -0
  101. package/src/adapters/google-wire-compiler.ts +232 -0
  102. package/src/adapters/google.ts +758 -0
  103. package/src/adapters/identity.ts +44 -0
  104. package/src/adapters/image.ts +23 -0
  105. package/src/adapters/kiro-constants.ts +16 -0
  106. package/src/adapters/kiro-errors.ts +197 -0
  107. package/src/adapters/kiro-events.ts +179 -0
  108. package/src/adapters/kiro-images.ts +129 -0
  109. package/src/adapters/kiro-retry.ts +312 -0
  110. package/src/adapters/kiro-thinking.ts +96 -0
  111. package/src/adapters/kiro-tool-fallback.ts +36 -0
  112. package/src/adapters/kiro-tools.ts +215 -0
  113. package/src/adapters/kiro-truncation.ts +33 -0
  114. package/src/adapters/kiro-wire.ts +129 -0
  115. package/src/adapters/kiro.ts +1898 -0
  116. package/src/adapters/mimo-free.ts +263 -0
  117. package/src/adapters/openai-chat.ts +1005 -0
  118. package/src/adapters/openai-responses.ts +1137 -0
  119. package/src/adapters/run-turn-queue.ts +114 -0
  120. package/src/adapters/tool-catalog-nudge.ts +71 -0
  121. package/src/adapters/upstream-http-error.ts +48 -0
  122. package/src/bridge.ts +1619 -0
  123. package/src/chat/inbound.ts +295 -0
  124. package/src/chat/outbound.ts +765 -0
  125. package/src/claude/agents-inject.ts +243 -0
  126. package/src/claude/alias.ts +149 -0
  127. package/src/claude/auth-detect.ts +229 -0
  128. package/src/claude/auth-mode-migration.ts +32 -0
  129. package/src/claude/auth-mode.ts +62 -0
  130. package/src/claude/context-windows.ts +189 -0
  131. package/src/claude/desktop-3p-guard.ts +35 -0
  132. package/src/claude/desktop-3p-paths.ts +84 -0
  133. package/src/claude/desktop-3p.ts +381 -0
  134. package/src/claude/desktop-health.ts +26 -0
  135. package/src/claude/desktop-profile.ts +263 -0
  136. package/src/claude/gateway-cache.ts +70 -0
  137. package/src/claude/inbound-debug.ts +163 -0
  138. package/src/claude/inbound.ts +509 -0
  139. package/src/claude/model-info.ts +151 -0
  140. package/src/claude/outbound.ts +872 -0
  141. package/src/cli/access.ts +108 -0
  142. package/src/cli/account-api.ts +268 -0
  143. package/src/cli/account-auth.ts +223 -0
  144. package/src/cli/account-extended.ts +350 -0
  145. package/src/cli/account.ts +275 -0
  146. package/src/cli/agent-driven.ts +70 -0
  147. package/src/cli/agent.ts +184 -0
  148. package/src/cli/catalog-prewarm.ts +27 -0
  149. package/src/cli/claude-desktop.ts +188 -0
  150. package/src/cli/claude.ts +286 -0
  151. package/src/cli/codex-shim-autorestore.ts +45 -0
  152. package/src/cli/combo.ts +119 -0
  153. package/src/cli/config-command.ts +145 -0
  154. package/src/cli/debug.ts +228 -0
  155. package/src/cli/doctor.ts +930 -0
  156. package/src/cli/export-command.ts +187 -0
  157. package/src/cli/help.ts +354 -0
  158. package/src/cli/index.ts +1113 -0
  159. package/src/cli/init.ts +224 -0
  160. package/src/cli/integrations.ts +142 -0
  161. package/src/cli/interactive-confirm.ts +133 -0
  162. package/src/cli/internal-dispatch.ts +20 -0
  163. package/src/cli/models-runtime.ts +212 -0
  164. package/src/cli/models.ts +336 -0
  165. package/src/cli/observe.ts +117 -0
  166. package/src/cli/opencode.ts +586 -0
  167. package/src/cli/pi.ts +188 -0
  168. package/src/cli/provider-runtime.ts +162 -0
  169. package/src/cli/provider.ts +463 -0
  170. package/src/cli/runtime-api.ts +325 -0
  171. package/src/cli/star-prompt.ts +155 -0
  172. package/src/cli/status-oauth.ts +78 -0
  173. package/src/cli/status.ts +321 -0
  174. package/src/cli/sync-cloud.ts +283 -0
  175. package/src/cli/system-command.ts +112 -0
  176. package/src/cli/tray-proxy.ts +52 -0
  177. package/src/cli/v2.ts +173 -0
  178. package/src/cli.ts +10 -0
  179. package/src/clients/config-export.ts +377 -0
  180. package/src/clients/effective-status.ts +385 -0
  181. package/src/clients/probes/agy.ts +55 -0
  182. package/src/clients/probes/cc-switch.ts +110 -0
  183. package/src/clients/probes/claude.ts +90 -0
  184. package/src/clients/probes/codex.ts +125 -0
  185. package/src/clients/probes/grok.ts +29 -0
  186. package/src/clients/probes/opencode.ts +109 -0
  187. package/src/clients/probes/paseo.ts +55 -0
  188. package/src/clients/probes/pi.ts +55 -0
  189. package/src/cloud/onedrive-auth.ts +666 -0
  190. package/src/cloud/onedrive-graph.ts +108 -0
  191. package/src/cloud/settings.ts +75 -0
  192. package/src/cloud/sync.ts +212 -0
  193. package/src/cloud/types.ts +56 -0
  194. package/src/cloud/vault.ts +89 -0
  195. package/src/codex/account-id.ts +34 -0
  196. package/src/codex/account-label.ts +34 -0
  197. package/src/codex/account-lifecycle.ts +55 -0
  198. package/src/codex/account-namespace-match.ts +63 -0
  199. package/src/codex/account-namespaces.ts +149 -0
  200. package/src/codex/account-pause.ts +20 -0
  201. package/src/codex/account-runtime-state.ts +31 -0
  202. package/src/codex/account-store.ts +517 -0
  203. package/src/codex/account-usability.ts +20 -0
  204. package/src/codex/app-server-processes.ts +756 -0
  205. package/src/codex/auth-api.ts +1540 -0
  206. package/src/codex/auth-collision.ts +107 -0
  207. package/src/codex/auth-context.ts +352 -0
  208. package/src/codex/autostart-health.ts +149 -0
  209. package/src/codex/catalog/aggregation.ts +378 -0
  210. package/src/codex/catalog/bundled.ts +251 -0
  211. package/src/codex/catalog/effort.ts +355 -0
  212. package/src/codex/catalog/metadata.ts +180 -0
  213. package/src/codex/catalog/parsing.ts +456 -0
  214. package/src/codex/catalog/provider-fetch.ts +902 -0
  215. package/src/codex/catalog/sync.ts +620 -0
  216. package/src/codex/catalog.ts +12 -0
  217. package/src/codex/data/upstream-models.json +830 -0
  218. package/src/codex/exec-invocation.ts +22 -0
  219. package/src/codex/features.ts +969 -0
  220. package/src/codex/history-migration-guardian.ts +102 -0
  221. package/src/codex/history-provider.ts +776 -0
  222. package/src/codex/home.ts +206 -0
  223. package/src/codex/inject.ts +799 -0
  224. package/src/codex/injected-marker.ts +72 -0
  225. package/src/codex/journal.ts +163 -0
  226. package/src/codex/main-account-cache.ts +32 -0
  227. package/src/codex/main-account.ts +40 -0
  228. package/src/codex/model-cache.ts +227 -0
  229. package/src/codex/paths.ts +65 -0
  230. package/src/codex/plugins-doctor.ts +242 -0
  231. package/src/codex/pool-rotation.ts +225 -0
  232. package/src/codex/project-config-warnings.ts +411 -0
  233. package/src/codex/quota.ts +411 -0
  234. package/src/codex/refresh.ts +53 -0
  235. package/src/codex/routing.ts +1477 -0
  236. package/src/codex/runtime.ts +538 -0
  237. package/src/codex/shim.ts +1189 -0
  238. package/src/codex/subagent-defaults.ts +550 -0
  239. package/src/codex/subagent-model-fallback.ts +469 -0
  240. package/src/codex/sync.ts +130 -0
  241. package/src/codex/warmup.ts +192 -0
  242. package/src/codex/websocket-registry.ts +100 -0
  243. package/src/combos/failover.ts +140 -0
  244. package/src/combos/index.ts +41 -0
  245. package/src/combos/request.ts +62 -0
  246. package/src/combos/resolve.ts +232 -0
  247. package/src/combos/types.ts +326 -0
  248. package/src/config.ts +2356 -0
  249. package/src/generated/jawcode-model-metadata.ts +104 -0
  250. package/src/github/star-state.ts +203 -0
  251. package/src/grok/inject.ts +545 -0
  252. package/src/grok/status.ts +121 -0
  253. package/src/grok/sync.ts +103 -0
  254. package/src/grok/usage-hook/report.mjs +348 -0
  255. package/src/grok/usage-hook.ts +278 -0
  256. package/src/images/artifacts.ts +516 -0
  257. package/src/images/fulfill-video.ts +163 -0
  258. package/src/images/fulfill.ts +149 -0
  259. package/src/images/index.ts +4 -0
  260. package/src/images/loop.ts +829 -0
  261. package/src/images/plan.ts +133 -0
  262. package/src/images/synthetic-tool.ts +133 -0
  263. package/src/images/types.ts +41 -0
  264. package/src/images/xai-client.ts +141 -0
  265. package/src/images/xai-video-client.ts +163 -0
  266. package/src/index.ts +22 -0
  267. package/src/lib/abort.ts +146 -0
  268. package/src/lib/admin-secrets.ts +25 -0
  269. package/src/lib/admission.ts +83 -0
  270. package/src/lib/app-owned-memory-stores.ts +173 -0
  271. package/src/lib/app-owned-memory.ts +265 -0
  272. package/src/lib/bounded-body.ts +202 -0
  273. package/src/lib/bun-binary-validator.d.mts +3 -0
  274. package/src/lib/bun-binary-validator.mjs +18 -0
  275. package/src/lib/bun-runtime.ts +71 -0
  276. package/src/lib/bun-stream-caps.ts +126 -0
  277. package/src/lib/config-ownership.ts +360 -0
  278. package/src/lib/crash-guard.ts +344 -0
  279. package/src/lib/debug-log-buffer.ts +83 -0
  280. package/src/lib/debug-settings.ts +108 -0
  281. package/src/lib/debug.ts +31 -0
  282. package/src/lib/destination-policy.ts +316 -0
  283. package/src/lib/errors.ts +364 -0
  284. package/src/lib/eventstream-decoder.ts +253 -0
  285. package/src/lib/gcp-adc.ts +341 -0
  286. package/src/lib/injection-debug-log.ts +58 -0
  287. package/src/lib/open-url.ts +25 -0
  288. package/src/lib/pinned-http.ts +151 -0
  289. package/src/lib/privacy.ts +20 -0
  290. package/src/lib/process-control.ts +165 -0
  291. package/src/lib/provider-outbound.ts +170 -0
  292. package/src/lib/provider-url.ts +14 -0
  293. package/src/lib/proxy-env.ts +18 -0
  294. package/src/lib/redact.ts +105 -0
  295. package/src/lib/retry-after.ts +55 -0
  296. package/src/lib/service-secrets.ts +25 -0
  297. package/src/lib/shadow-call.ts +30 -0
  298. package/src/lib/sidecar-tracker.ts +52 -0
  299. package/src/lib/sse-decoder.ts +323 -0
  300. package/src/lib/state-store-registrations.ts +109 -0
  301. package/src/lib/state-store-sweeper.ts +184 -0
  302. package/src/lib/test-home-guard.ts +90 -0
  303. package/src/lib/token-estimate.ts +69 -0
  304. package/src/lib/translator-budget.ts +356 -0
  305. package/src/lib/upstream-retry.ts +239 -0
  306. package/src/lib/win-exec.ts +115 -0
  307. package/src/lib/win-paths.ts +68 -0
  308. package/src/lib/windows-elevation.ts +705 -0
  309. package/src/lib/windows-secret-acl.ts +514 -0
  310. package/src/lib/winsw.ts +375 -0
  311. package/src/oauth/anthropic-routing.ts +594 -0
  312. package/src/oauth/anthropic.ts +177 -0
  313. package/src/oauth/callback-server.ts +294 -0
  314. package/src/oauth/chatgpt.ts +150 -0
  315. package/src/oauth/cursor.ts +211 -0
  316. package/src/oauth/github-copilot.ts +428 -0
  317. package/src/oauth/google-antigravity.ts +230 -0
  318. package/src/oauth/health.ts +399 -0
  319. package/src/oauth/index.ts +1174 -0
  320. package/src/oauth/key-providers.ts +108 -0
  321. package/src/oauth/kimi.ts +213 -0
  322. package/src/oauth/kiro-credentials.ts +726 -0
  323. package/src/oauth/kiro.ts +577 -0
  324. package/src/oauth/local-token-detect.ts +121 -0
  325. package/src/oauth/log.ts +48 -0
  326. package/src/oauth/login-cli.ts +163 -0
  327. package/src/oauth/pkce.ts +15 -0
  328. package/src/oauth/store.ts +630 -0
  329. package/src/oauth/token-guardian.ts +303 -0
  330. package/src/oauth/types.ts +62 -0
  331. package/src/oauth/xai.ts +241 -0
  332. package/src/pi/extensions.ts +72 -0
  333. package/src/pi/home.ts +42 -0
  334. package/src/pi/index.ts +40 -0
  335. package/src/pi/models.ts +278 -0
  336. package/src/pi/packages.ts +219 -0
  337. package/src/pi/settings.ts +365 -0
  338. package/src/pi/status.ts +68 -0
  339. package/src/pi/sync.ts +75 -0
  340. package/src/providers/alibaba-region-backup.ts +75 -0
  341. package/src/providers/alibaba-region-migration.ts +156 -0
  342. package/src/providers/alibaba-region-startup.ts +36 -0
  343. package/src/providers/antigravity-models.ts +205 -0
  344. package/src/providers/api-keys.ts +140 -0
  345. package/src/providers/base-url-choices.ts +64 -0
  346. package/src/providers/context-cap.ts +65 -0
  347. package/src/providers/derive.ts +339 -0
  348. package/src/providers/free-directory.ts +184 -0
  349. package/src/providers/github-copilot-transport.ts +56 -0
  350. package/src/providers/key-failover.ts +203 -0
  351. package/src/providers/kiro-models.ts +67 -0
  352. package/src/providers/label.ts +19 -0
  353. package/src/providers/model-discovery.ts +356 -0
  354. package/src/providers/openai-sidecar.ts +175 -0
  355. package/src/providers/openai-tier-startup.ts +27 -0
  356. package/src/providers/openai-tiers.ts +301 -0
  357. package/src/providers/openai-virtual-models.ts +82 -0
  358. package/src/providers/openrouter-routing.ts +102 -0
  359. package/src/providers/provider-id-rewrite.ts +150 -0
  360. package/src/providers/quota.ts +1260 -0
  361. package/src/providers/registry.ts +1600 -0
  362. package/src/providers/slug-codec.ts +67 -0
  363. package/src/providers/xai-transport.ts +141 -0
  364. package/src/reasoning-effort.ts +135 -0
  365. package/src/responses/compaction.ts +117 -0
  366. package/src/responses/parser.ts +656 -0
  367. package/src/responses/reasoning-envelope.ts +52 -0
  368. package/src/responses/schema.ts +159 -0
  369. package/src/responses/spill-store.ts +394 -0
  370. package/src/responses/state.ts +895 -0
  371. package/src/responses/tool-groups.ts +19 -0
  372. package/src/router.ts +425 -0
  373. package/src/server/adapter-resolve.ts +80 -0
  374. package/src/server/auth-cors.ts +530 -0
  375. package/src/server/chat-completions.ts +368 -0
  376. package/src/server/claude-messages.ts +914 -0
  377. package/src/server/effort-policy.ts +172 -0
  378. package/src/server/gui-static.ts +123 -0
  379. package/src/server/image-retry.ts +42 -0
  380. package/src/server/images.ts +476 -0
  381. package/src/server/index.ts +1126 -0
  382. package/src/server/lifecycle.ts +227 -0
  383. package/src/server/live.ts +598 -0
  384. package/src/server/management/agent-settings-routes.ts +1169 -0
  385. package/src/server/management/api-access.ts +141 -0
  386. package/src/server/management/api-key-usage.ts +167 -0
  387. package/src/server/management/body.ts +35 -0
  388. package/src/server/management/clients-routes.ts +63 -0
  389. package/src/server/management/cloud-sync-routes.ts +266 -0
  390. package/src/server/management/combo-routes.ts +220 -0
  391. package/src/server/management/config-routes.ts +422 -0
  392. package/src/server/management/context.ts +31 -0
  393. package/src/server/management/logs-usage-routes.ts +707 -0
  394. package/src/server/management/model-routes.ts +525 -0
  395. package/src/server/management/oauth-account-routes.ts +563 -0
  396. package/src/server/management/provider-routes.ts +556 -0
  397. package/src/server/management/shared.ts +277 -0
  398. package/src/server/management/sidebar-routes.ts +90 -0
  399. package/src/server/management/system-restart.ts +179 -0
  400. package/src/server/management/system-routes.ts +117 -0
  401. package/src/server/management/usage-summary-cache.ts +86 -0
  402. package/src/server/management-api.ts +215 -0
  403. package/src/server/management-auth.ts +267 -0
  404. package/src/server/memory-watchdog.ts +156 -0
  405. package/src/server/port-reclaim.ts +307 -0
  406. package/src/server/ports.ts +116 -0
  407. package/src/server/proxy-liveness.ts +201 -0
  408. package/src/server/relay-eager.ts +313 -0
  409. package/src/server/relay.ts +1049 -0
  410. package/src/server/request-decompress.ts +132 -0
  411. package/src/server/request-log-conversation.ts +168 -0
  412. package/src/server/request-log.ts +1046 -0
  413. package/src/server/responses/collaboration.ts +354 -0
  414. package/src/server/responses/compact.ts +384 -0
  415. package/src/server/responses/core.ts +2758 -0
  416. package/src/server/responses/encrypted-payload.ts +308 -0
  417. package/src/server/responses/fetch-helpers.ts +157 -0
  418. package/src/server/responses/passthrough-error.ts +78 -0
  419. package/src/server/responses/terminal-guard.ts +230 -0
  420. package/src/server/responses/upstream-error.ts +48 -0
  421. package/src/server/responses-image-gen-repair.ts +132 -0
  422. package/src/server/responses-item-id-repair.ts +224 -0
  423. package/src/server/responses.ts +9 -0
  424. package/src/server/search.ts +136 -0
  425. package/src/server/sse-payload-rewrite.ts +175 -0
  426. package/src/server/startup-action-control.ts +308 -0
  427. package/src/server/startup-health-cache.ts +113 -0
  428. package/src/server/system-env.ts +413 -0
  429. package/src/server/windows-tcp-drop.ts +184 -0
  430. package/src/server/windows-tray-control.ts +41 -0
  431. package/src/server/ws-bridge.ts +471 -0
  432. package/src/service.ts +2554 -0
  433. package/src/stall-timeout.ts +20 -0
  434. package/src/storage/cleanup-job.ts +57 -0
  435. package/src/storage/cleanup.ts +3085 -0
  436. package/src/storage/policy-job.ts +457 -0
  437. package/src/storage/policy-scheduler.ts +40 -0
  438. package/src/storage/policy-worker.ts +59 -0
  439. package/src/storage/policy.ts +527 -0
  440. package/src/storage/restore-job.ts +299 -0
  441. package/src/storage/restore-worker.ts +58 -0
  442. package/src/storage/scanner.ts +238 -0
  443. package/src/storage/storage-mutation-coordinator.ts +139 -0
  444. package/src/storage/worker-lifecycle.ts +215 -0
  445. package/src/tray/assets/opencodex-tray-offline.ico +0 -0
  446. package/src/tray/assets/opencodex-tray-online.ico +0 -0
  447. package/src/tray/assets/opencodex-tray-warning.ico +0 -0
  448. package/src/tray/assets/opencodex-tray.png +0 -0
  449. package/src/tray/windows-tray.ps1 +290 -0
  450. package/src/tray/windows.ts +730 -0
  451. package/src/types.ts +1237 -0
  452. package/src/update/badge.ts +72 -0
  453. package/src/update/index.ts +407 -0
  454. package/src/update/job.ts +1520 -0
  455. package/src/update/notify.ts +257 -0
  456. package/src/update/npm-invocation.d.mts +23 -0
  457. package/src/update/npm-invocation.mjs +94 -0
  458. package/src/update/tray-update-plan.d.mts +18 -0
  459. package/src/update/tray-update-plan.mjs +38 -0
  460. package/src/usage/cost.ts +0 -0
  461. package/src/usage/debug.ts +97 -0
  462. package/src/usage/expected-prices.ts +164 -0
  463. package/src/usage/log.ts +658 -0
  464. package/src/usage/summary.ts +585 -0
  465. package/src/usage/totals.ts +14 -0
  466. package/src/vision/anthropic-describe.ts +185 -0
  467. package/src/vision/describe.ts +125 -0
  468. package/src/vision/index.ts +467 -0
  469. package/src/web-search/anthropic-executor.ts +189 -0
  470. package/src/web-search/executor.ts +105 -0
  471. package/src/web-search/format-result.ts +89 -0
  472. package/src/web-search/index.ts +196 -0
  473. package/src/web-search/loop.ts +664 -0
  474. package/src/web-search/parse.ts +220 -0
  475. package/src/web-search/progress-stream.ts +342 -0
  476. package/src/web-search/synthetic-tool.ts +47 -0
@@ -0,0 +1,202 @@
1
+ /** Maximum number of response-body bytes that may be retained for an error. */
2
+ export const BOUNDED_BODY_MAX_BYTES = 65_536;
3
+
4
+ /** Default wall-clock and continuous-silence deadlines. */
5
+ export const BOUNDED_BODY_TIMEOUT_MS = 5_000;
6
+
7
+ export interface BoundedBodyOptions {
8
+ /** Abort the read with this signal. Its reason is rethrown by identity. */
9
+ signal?: AbortSignal;
10
+ /** Total wall-clock deadline. Exposed for focused tests. */
11
+ totalTimeoutMs?: number;
12
+ /** Deadline between non-empty raw chunks. Exposed for focused tests. */
13
+ inactivityTimeoutMs?: number;
14
+ }
15
+
16
+ export interface BoundedBodyResult {
17
+ /** UTF-8 text retained from the response. Empty when the size limit was exceeded. */
18
+ text: string;
19
+ /** True when EOF was not observed. */
20
+ truncated: boolean;
21
+ /** True for either total-deadline or inactivity-deadline expiry. */
22
+ timedOut: boolean;
23
+ /** Distinguishes the wall-clock deadline from an inactivity deadline. */
24
+ totalTimedOut: boolean;
25
+ /** True only when continuous inactivity caused the timeout. */
26
+ inactivityTimedOut: boolean;
27
+ /** True when the body was observed to exceed the byte cap. */
28
+ oversized: boolean;
29
+ /** False means callers should use a status-only fallback, not `text`. */
30
+ displaySafe: boolean;
31
+ }
32
+
33
+ const TOTAL_TIMEOUT = Symbol("bounded body total timeout");
34
+ const INACTIVITY_TIMEOUT = Symbol("bounded body inactivity timeout");
35
+
36
+ function timeoutPromise(ms: number, value: symbol): { promise: Promise<symbol>; clear: () => void } {
37
+ let timer: ReturnType<typeof setTimeout> | undefined;
38
+ const promise = new Promise<symbol>((resolve) => {
39
+ timer = setTimeout(() => resolve(value), Math.max(0, ms));
40
+ });
41
+ return {
42
+ promise,
43
+ clear: () => {
44
+ if (timer !== undefined) clearTimeout(timer);
45
+ },
46
+ };
47
+ }
48
+
49
+ function cancelWithoutWaiting(reader: ReadableStreamDefaultReader<Uint8Array>, reason?: unknown): void {
50
+ // A hostile/broken stream may reject or never settle cancel(). Neither should
51
+ // escape as an unhandled rejection or extend this primitive's own deadline.
52
+ try {
53
+ void reader.cancel(reason).catch(() => undefined);
54
+ } catch {
55
+ // Some stream implementations throw synchronously from cancel().
56
+ }
57
+ }
58
+
59
+ function decodeUtf8(chunks: readonly Uint8Array[]): string {
60
+ const decoder = new TextDecoder();
61
+ let text = "";
62
+ for (const chunk of chunks) text += decoder.decode(chunk, { stream: true });
63
+ // Flush an incomplete trailing UTF-8 sequence deterministically.
64
+ text += decoder.decode();
65
+ return text;
66
+ }
67
+
68
+ /**
69
+ * Consume the original response body under strict memory and time bounds.
70
+ *
71
+ * This deliberately calls `getReader()` on `response.body`: it never clones or
72
+ * tees the response. Once an over-limit byte is observed, all retained raw data
73
+ * is discarded so an untrusted prefix can never become a client-facing error.
74
+ */
75
+ export async function readBoundedResponseBody(
76
+ response: Response,
77
+ options: BoundedBodyOptions = {},
78
+ ): Promise<BoundedBodyResult> {
79
+ const signal = options.signal;
80
+ if (signal?.aborted) throw signal.reason;
81
+
82
+ const body = response.body;
83
+ if (!body) {
84
+ return {
85
+ text: "",
86
+ truncated: false,
87
+ timedOut: false,
88
+ totalTimedOut: false,
89
+ inactivityTimedOut: false,
90
+ oversized: false,
91
+ displaySafe: true,
92
+ };
93
+ }
94
+
95
+ const reader = body.getReader();
96
+ const chunks: Uint8Array[] = [];
97
+ let retainedBytes = 0;
98
+ let mustCancel = false;
99
+ let cancelReason: unknown;
100
+ const total = timeoutPromise(options.totalTimeoutMs ?? BOUNDED_BODY_TIMEOUT_MS, TOTAL_TIMEOUT);
101
+ let inactivity = timeoutPromise(
102
+ options.inactivityTimeoutMs ?? BOUNDED_BODY_TIMEOUT_MS,
103
+ INACTIVITY_TIMEOUT,
104
+ );
105
+
106
+ let rejectForAbort: ((reason: unknown) => void) | undefined;
107
+ const aborted = new Promise<never>((_resolve, reject) => {
108
+ rejectForAbort = reject;
109
+ });
110
+ const onAbort = () => rejectForAbort?.(signal?.reason);
111
+ signal?.addEventListener("abort", onAbort, { once: true });
112
+ // Close the narrow race between the preflight check and listener install.
113
+ if (signal?.aborted) onAbort();
114
+
115
+ try {
116
+ while (true) {
117
+ // Attach a rejection handler before racing. If a deadline wins and
118
+ // cancellation later rejects this read, it remains observed.
119
+ const read = reader.read();
120
+ void read.catch(() => undefined);
121
+ const outcome = await Promise.race([read, total.promise, inactivity.promise, aborted]);
122
+ // Cancellation owns the body lifetime even when EOF/readability settles in
123
+ // the same turn. Promise.race otherwise lets array order hide the abort.
124
+ if (signal?.aborted) {
125
+ mustCancel = true;
126
+ cancelReason = signal.reason;
127
+ throw signal.reason;
128
+ }
129
+
130
+ if (outcome === TOTAL_TIMEOUT || outcome === INACTIVITY_TIMEOUT) {
131
+ mustCancel = true;
132
+ cancelReason = new DOMException(
133
+ outcome === TOTAL_TIMEOUT ? "Error body total timeout" : "Error body inactivity timeout",
134
+ "TimeoutError",
135
+ );
136
+ return {
137
+ text: decodeUtf8(chunks),
138
+ truncated: true,
139
+ timedOut: true,
140
+ totalTimedOut: outcome === TOTAL_TIMEOUT,
141
+ inactivityTimedOut: outcome === INACTIVITY_TIMEOUT,
142
+ oversized: false,
143
+ displaySafe: false,
144
+ };
145
+ }
146
+
147
+ const { value, done } = outcome as ReadableStreamReadResult<Uint8Array>;
148
+ if (done) {
149
+ return {
150
+ text: decodeUtf8(chunks),
151
+ truncated: false,
152
+ timedOut: false,
153
+ totalTimedOut: false,
154
+ inactivityTimedOut: false,
155
+ oversized: false,
156
+ displaySafe: true,
157
+ };
158
+ }
159
+
160
+ if (!value || value.byteLength === 0) continue;
161
+
162
+ inactivity.clear();
163
+ inactivity = timeoutPromise(
164
+ options.inactivityTimeoutMs ?? BOUNDED_BODY_TIMEOUT_MS,
165
+ INACTIVITY_TIMEOUT,
166
+ );
167
+
168
+ if (value.byteLength > BOUNDED_BODY_MAX_BYTES - retainedBytes) {
169
+ mustCancel = true;
170
+ cancelReason = new DOMException("Error body size limit reached", "QuotaExceededError");
171
+ chunks.length = 0;
172
+ retainedBytes = 0;
173
+ return {
174
+ text: "",
175
+ truncated: true,
176
+ timedOut: false,
177
+ totalTimedOut: false,
178
+ inactivityTimedOut: false,
179
+ oversized: true,
180
+ displaySafe: false,
181
+ };
182
+ }
183
+
184
+ chunks.push(value);
185
+ retainedBytes += value.byteLength;
186
+ }
187
+ } catch (error) {
188
+ mustCancel = true;
189
+ cancelReason = error;
190
+ throw error;
191
+ } finally {
192
+ total.clear();
193
+ inactivity.clear();
194
+ signal?.removeEventListener("abort", onAbort);
195
+ if (mustCancel) cancelWithoutWaiting(reader, cancelReason);
196
+ try {
197
+ reader.releaseLock();
198
+ } catch {
199
+ // A pending read can keep the lock briefly while cancel settles.
200
+ }
201
+ }
202
+ }
@@ -0,0 +1,3 @@
1
+ export declare const REAL_BUN_MIN_BYTES: number;
2
+
3
+ export declare function isRealBunBinary(path: string): boolean;
@@ -0,0 +1,18 @@
1
+ import { existsSync, statSync } from "node:fs";
2
+
3
+ // The `bun` package leaves a tiny ASCII placeholder at bin/bun.exe until its
4
+ // postinstall downloads the real ~60MB binary. Keep the threshold and the
5
+ // false-on-filesystem-error contract shared by the Node launcher and Bun code.
6
+ export const REAL_BUN_MIN_BYTES = 1_000_000;
7
+
8
+ /**
9
+ * @param {string} path
10
+ * @returns {boolean}
11
+ */
12
+ export function isRealBunBinary(path) {
13
+ try {
14
+ return existsSync(path) && statSync(path).size >= REAL_BUN_MIN_BYTES;
15
+ } catch {
16
+ return false;
17
+ }
18
+ }
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Bundled Bun runtime resolution.
3
+ *
4
+ * opencodex ships the Bun runtime via the `bun` npm dependency (esbuild-style:
5
+ * a tiny main package + platform-specific `@oven/bun-*` optionalDependencies,
6
+ * finalized by the package's own postinstall `node install.js`). The npm `bin`
7
+ * launcher (bin/ocx.mjs) and the durable service/shim integrations both need a
8
+ * stable path to that binary. This module is the single source of truth.
9
+ *
10
+ * In a from-source dev checkout the `bun` dependency may be absent; callers fall
11
+ * back to `process.execPath` (which is itself Bun when run via `bun src/cli/index.ts`).
12
+ */
13
+ import { createRequire } from "node:module";
14
+ import { dirname, join, resolve } from "node:path";
15
+ import { isRealBunBinary } from "./bun-binary-validator.mjs";
16
+
17
+ export { isRealBunBinary };
18
+
19
+ const require = createRequire(import.meta.url);
20
+
21
+ const BUN_OVERRIDE_ENV = "OPENCODEX_BUN_PATH";
22
+
23
+ export type DurableBunRuntime = {
24
+ path: string;
25
+ source: "override" | "bundled" | "process";
26
+ overrideEnv: typeof BUN_OVERRIDE_ENV;
27
+ };
28
+
29
+ /**
30
+ * Absolute path to the bundled Bun binary, or null if the `bun` dependency is
31
+ * not installed/resolvable (or only the un-downloaded placeholder is present).
32
+ * The npm `bun` package ships the binary as `bin/bun.exe` on every platform;
33
+ * we also probe `bin/bun` for forward compatibility.
34
+ */
35
+ export function bundledBunPath(): string | null {
36
+ try {
37
+ const bunDir = dirname(require.resolve("bun/package.json"));
38
+ for (const name of ["bun.exe", "bun"]) {
39
+ const p = join(bunDir, "bin", name);
40
+ if (isRealBunBinary(p)) return p;
41
+ }
42
+ return null;
43
+ } catch {
44
+ return null;
45
+ }
46
+ }
47
+
48
+ export function overrideBunPath(): string | null {
49
+ const value = process.env[BUN_OVERRIDE_ENV]?.trim();
50
+ if (!value) return null;
51
+ const resolved = resolve(value);
52
+ return isRealBunBinary(resolved) ? resolved : null;
53
+ }
54
+
55
+ export function durableBunRuntime(): DurableBunRuntime {
56
+ const override = overrideBunPath();
57
+ if (override) return { path: override, source: "override", overrideEnv: BUN_OVERRIDE_ENV };
58
+ const bundled = bundledBunPath();
59
+ if (bundled) return { path: bundled, source: "bundled", overrideEnv: BUN_OVERRIDE_ENV };
60
+ return { path: process.execPath, source: "process", overrideEnv: BUN_OVERRIDE_ENV };
61
+ }
62
+
63
+ /**
64
+ * Bun path to bake into durable artifacts (launchd/systemd/Task Scheduler and
65
+ * the Codex auto-start shim). Prefer the bundled binary — it lives under the
66
+ * npm global prefix and survives across `ocx update` — and fall back to the
67
+ * current runtime, which is Bun when launched normally.
68
+ */
69
+ export function durableBunPath(): string {
70
+ return durableBunRuntime().path;
71
+ }
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Bun runtime stream-capability gate for eager SSE passthrough (#314).
3
+ *
4
+ * The eager bounded relay (src/server/relay-eager.ts) uses a JS async producer
5
+ * loop — the exact shape of the Bun#32111 use-after-free (fixed upstream by Bun
6
+ * PR #32120, merged 2026-06-21). No RELEASED Bun version is proven to carry
7
+ * that fix yet, so `MIN_FIXED_BUN_VERSION` is null: every runtime is
8
+ * "known-bad" until a bundle-bump commit sets it. Windows no-rewrite traffic
9
+ * follows this runtime/config decision. Darwin no-rewrite traffic stays on tee
10
+ * for `auto` regardless of runtime capability and reaches eager relay only via
11
+ * explicit `streamMode: "eager-relay"` opt-in (see
12
+ * devlog/_plan/260731_macos_rss_retention/100_darwin_eager_optin.md).
13
+ *
14
+ * Prerelease conservatism: a version carrying a prerelease suffix (e.g.
15
+ * `1.4.0-canary.3`) is NEVER treated as fixed even when its numeric triple
16
+ * reaches the threshold — canaries are exactly the OPENCODEX_BUN_PATH audience
17
+ * and may predate the fix commit.
18
+ */
19
+
20
+ /**
21
+ * Bump in the SAME commit that bumps package.json's bundled Bun to a version
22
+ * verified to include Bun PR #32120. null = no released version is known-fixed.
23
+ */
24
+ export const MIN_FIXED_BUN_VERSION: string | null = null;
25
+
26
+ export type StreamMode = "auto" | "legacy-tee" | "eager-relay";
27
+
28
+ export const STREAM_MODES: readonly StreamMode[] = ["auto", "legacy-tee", "eager-relay"];
29
+
30
+ export function isStreamMode(value: unknown): value is StreamMode {
31
+ return typeof value === "string" && (STREAM_MODES as readonly string[]).includes(value);
32
+ }
33
+
34
+ /** Numeric [major, minor, patch] triple, or null for unparseable input. */
35
+ export function parseBunVersion(version: string): [number, number, number] | null {
36
+ const m = /^(\d+)\.(\d+)\.(\d+)/.exec(version.trim());
37
+ if (!m) return null;
38
+ return [Number(m[1]), Number(m[2]), Number(m[3])];
39
+ }
40
+
41
+ /** Compare two version strings numerically; null when either is unparseable. */
42
+ export function compareBunVersions(a: string, b: string): number | null {
43
+ const pa = parseBunVersion(a);
44
+ const pb = parseBunVersion(b);
45
+ if (!pa || !pb) return null;
46
+ for (let i = 0; i < 3; i++) {
47
+ if (pa[i]! !== pb[i]!) return pa[i]! - pb[i]!;
48
+ }
49
+ return 0;
50
+ }
51
+
52
+ function hasPrereleaseSuffix(version: string): boolean {
53
+ return /^\d+\.\d+\.\d+-/.test(version.trim());
54
+ }
55
+
56
+ /**
57
+ * True only when `version` is proven to carry the Bun#32120 async-pull cancel
58
+ * fix. Conservative: unknown, unparseable, prerelease, or no threshold → false.
59
+ */
60
+ export function bunHasAsyncPullCancelFix(
61
+ version: string,
62
+ minFixed: string | null = MIN_FIXED_BUN_VERSION,
63
+ ): boolean {
64
+ if (!minFixed) return false;
65
+ if (hasPrereleaseSuffix(version)) return false;
66
+ const cmp = compareBunVersions(version, minFixed);
67
+ return cmp !== null && cmp >= 0;
68
+ }
69
+
70
+ export type EagerRelayDecision = {
71
+ useEagerRelay: boolean;
72
+ reason: "config-legacy" | "config-eager" | "auto-fixed-runtime" | "auto-known-bad";
73
+ };
74
+
75
+ /**
76
+ * Decide the runtime/config SSE client-path capability. `version`/`minFixed`
77
+ * are injectable for tests; `selectEagerPath` applies platform policy.
78
+ */
79
+ export function decideEagerRelay(
80
+ mode: StreamMode,
81
+ version: string = Bun.version,
82
+ minFixed: string | null = MIN_FIXED_BUN_VERSION,
83
+ ): EagerRelayDecision {
84
+ if (mode === "legacy-tee") return { useEagerRelay: false, reason: "config-legacy" };
85
+ if (mode === "eager-relay") return { useEagerRelay: true, reason: "config-eager" };
86
+ return bunHasAsyncPullCancelFix(version, minFixed)
87
+ ? { useEagerRelay: true, reason: "auto-fixed-runtime" }
88
+ : { useEagerRelay: false, reason: "auto-known-bad" };
89
+ }
90
+
91
+ /**
92
+ * Apply the two-platform eager-relay policy to the runtime/config capability.
93
+ * Windows preserves the decision for no-rewrite traffic. Darwin permits only
94
+ * explicit config opt-in; `auto` remains tee even on a future fixed runtime.
95
+ * Returns the normalized effective decision, or null when platform policy,
96
+ * rewrite needs, or a Darwin non-config-eager mode selects tee.
97
+ */
98
+ export function selectEagerPath(
99
+ platform: NodeJS.Platform,
100
+ needsClientRewrite: boolean,
101
+ mode: StreamMode,
102
+ version: string = Bun.version,
103
+ minFixed: string | null = MIN_FIXED_BUN_VERSION,
104
+ ): EagerRelayDecision | null {
105
+ if (needsClientRewrite || (platform !== "win32" && platform !== "darwin")) {
106
+ return null;
107
+ }
108
+
109
+ const decision = decideEagerRelay(mode, version, minFixed);
110
+ if (platform === "win32") return decision;
111
+ return decision.reason === "config-eager" ? decision : null;
112
+ }
113
+
114
+ /**
115
+ * #864 transport gate: win32 traffic that needs a client payload rewrite must
116
+ * use the eager single reader with the rewrite applied inline, because the
117
+ * alternative tee()+JS-pull chain is the Bun#32111-unsafe path that loses the
118
+ * terminal SSE block on Windows. Independent of the version-based eager
119
+ * policy: the pull chain is unsafe on the AFFECTED runtimes by definition.
120
+ */
121
+ export function isWin32EagerRewrite(
122
+ platform: NodeJS.Platform,
123
+ needsClientRewrite: boolean,
124
+ ): boolean {
125
+ return platform === "win32" && needsClientRewrite;
126
+ }