@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,172 @@
1
+ /**
2
+ * Hard reasoning-effort caps (devlog/260710_subagent_effort_intercept).
3
+ *
4
+ * Prompt-side effort designation (injectionEffort) is advisory only: codex-rs inherits the
5
+ * parent's effective effort when spawn_agent carries no model/effort args
6
+ * (multi_agents_common.rs resolve defaults), rejects overrides on full-history forks, and a
7
+ * non-empty agent-role file rebuilds the child Config and silently drops spawn-time
8
+ * model/effort. So a session whose config default is ultra leaks max-tier children whenever
9
+ * the parent model spawns bare. This module is the enforcement path: it rewrites the effort
10
+ * of proxied turns at the single choke point every HTTP/WS turn passes through
11
+ * (handleResponses), using the same dual-shape rewrite contract as nativeEffortClamp —
12
+ * parsed.options.reasoning feeds routed adapters, _rawBody.reasoning.effort feeds the
13
+ * ChatGPT passthrough serializer.
14
+ */
15
+ import type { OcxConfig, OcxParsedRequest, OcxProviderConfig } from "../types";
16
+ import { modelInList } from "../types";
17
+ import { codexEffortRank, configuredReasoningEfforts, isCodexReasoningEffort, modelRecordValue } from "../reasoning-effort";
18
+ import { catalogModelEfforts } from "../codex/catalog";
19
+
20
+ /**
21
+ * True when the request carries codex-rs's spawned-child markers, matched EXACTLY.
22
+ * Source of truth (openai/codex @ 6138909d): every collab-spawned child turn sends
23
+ * `x-openai-subagent: collab_spawn` (core/src/responses_metadata.rs) and embeds
24
+ * `"subagent_kind":"thread_spawn"` in the JSON `x-codex-turn-metadata` compatibility
25
+ * header. Both are checked: the WS bridge rebuilds internal requests from the
26
+ * FORWARD_HEADERS allowlist, so either header alone is sufficient evidence.
27
+ *
28
+ * Exact matching matters: upstream emits `x-openai-subagent` for OTHER internal
29
+ * turn categories too (review, compact, memory_consolidation, arbitrary "other"
30
+ * sources — responses_metadata.rs subagent_source). Those are maintenance turns,
31
+ * not spawned children, and must never trip subagentEffortCap.
32
+ */
33
+ export function isThreadSpawnRequest(headers: Headers): boolean {
34
+ if (headers.get("x-openai-subagent") === "collab_spawn") return true;
35
+ const turnMeta = headers.get("x-codex-turn-metadata");
36
+ if (!turnMeta) return false;
37
+ try {
38
+ const parsed = JSON.parse(turnMeta) as { subagent_kind?: unknown };
39
+ return parsed.subagent_kind === "thread_spawn";
40
+ } catch {
41
+ return false;
42
+ }
43
+ }
44
+
45
+ /** The effective ceiling for this turn, or undefined when no configured cap applies. */
46
+ export function effortCapFor(config: OcxConfig, subagent: boolean): string | undefined {
47
+ const caps: string[] = [];
48
+ if (config.effortCap && isCodexReasoningEffort(config.effortCap)) caps.push(config.effortCap);
49
+ if (subagent && config.subagentEffortCap && isCodexReasoningEffort(config.subagentEffortCap)) {
50
+ caps.push(config.subagentEffortCap);
51
+ }
52
+ if (caps.length === 0) return undefined;
53
+ return caps.reduce((low, cap) => (codexEffortRank(cap) < codexEffortRank(low) ? cap : low));
54
+ }
55
+
56
+ /**
57
+ * Whether the effort caps apply to this turn at all. Caps are a V2-surface feature
58
+ * (v1 sub-agents are pinned via explicit spawn args + injectionEffort prompting, so
59
+ * the ultra-default leak this module intercepts is v2-specific):
60
+ * - compaction turns are maintenance, not agent turns: they bypass caps entirely so
61
+ * native /v1/responses/compact (forwarded, never enters handleResponses) and routed
62
+ * compaction (synthesized internal request) get identical cap semantics.
63
+ * - multiAgentMode "v1" disables caps entirely (mirrors the GUI hiding the panel).
64
+ * - a main turn qualifies when its own tool list carries the v2 collab surface.
65
+ * - a CHILD turn is admitted by its spawned-child markers (isThreadSpawnRequest)
66
+ * REGARDLESS of tool surface: depth-limited leaves carry no collab tools (surface
67
+ * null) while children below the spawn-depth limit retain collab tools (spec_plan.rs
68
+ * leaf guard), so tool sniffing alone would cap siblings inconsistently.
69
+ * - a v1-surface MAIN turn (no child markers) never qualifies.
70
+ */
71
+ export function effortCapAppliesTo(
72
+ surface: "v1" | "v2" | null,
73
+ headers: Headers,
74
+ config: OcxConfig,
75
+ compaction = false,
76
+ ): boolean {
77
+ if (compaction) return false;
78
+ if (config.multiAgentMode === "v1") return false;
79
+ return surface === "v2" || isThreadSpawnRequest(headers);
80
+ }
81
+
82
+ /**
83
+ * The routed model's supported effort ladder for cap resolution, from the ROUTE's
84
+ * registry-merged provider (router.ts routedProviderConfig) — the persisted
85
+ * config.providers entry misses registry seeds, and bare ids can route via
86
+ * defaultModel/model-list/default-provider, so no "/" heuristic anywhere.
87
+ *
88
+ * - `[]` -> the model intentionally exposes no effort control (noReasoningModels or
89
+ * an explicitly empty configured ladder): cap resolution strips.
90
+ * - list -> sanitized + healed ladder (configuredReasoningEfforts).
91
+ * - undefined -> unknown. Includes the raw-nonempty-but-non-rankable case (e.g. a
92
+ * thinking-toggle ladder of ["enabled"]): sanitizing would flatten it to []
93
+ * and mis-classify it as "no effort control", so it stays unknown.
94
+ *
95
+ * Catalog fallback fires only for the ChatGPT-backend native passthrough IDENTITY
96
+ * (adapter "openai-responses" + authMode "forward", the fresh-install `openai`
97
+ * provider shape): the injected catalog is authoritative exactly for models Codex
98
+ * validates against that backend. A custom responses provider (key mode) serving a
99
+ * native-looking bare id must NOT inherit the unrelated native ladder.
100
+ */
101
+ export function supportedLadderFor(route: { provider: OcxProviderConfig; modelId: string }): string[] | undefined {
102
+ const { provider, modelId } = route;
103
+ if (modelInList(provider.noReasoningModels, modelId)) return [];
104
+ const raw = modelRecordValue(provider.modelReasoningEfforts, modelId) ?? provider.reasoningEfforts;
105
+ if (raw !== undefined) {
106
+ const sanitized = configuredReasoningEfforts(provider, modelId) ?? [];
107
+ if (sanitized.length === 0 && raw.length > 0) return undefined;
108
+ return sanitized;
109
+ }
110
+ if (provider.adapter === "openai-responses" && provider.authMode === "forward") {
111
+ const efforts = catalogModelEfforts([modelId]).get(modelId);
112
+ if (efforts && efforts.length > 0) return efforts;
113
+ }
114
+ return undefined;
115
+ }
116
+
117
+ /**
118
+ * Resolve the configured cap against the model's supported ladder. Returns the effective
119
+ * ceiling rung, or null when the turn must be STRIPPED of its effort entirely. The cap
120
+ * NEVER raises: when rankable rungs exist but none sits at or below the cap, the model
121
+ * cannot run within the ceiling, so the effort is stripped and the provider default
122
+ * applies (never a rung above the cap).
123
+ */
124
+ export function resolveCappedEffort(cap: string, supported: readonly string[] | undefined): string | null {
125
+ if (supported === undefined) return cap;
126
+ const rankable = supported.filter(isCodexReasoningEffort);
127
+ if (rankable.length === 0) {
128
+ // Nonempty but non-rankable (e.g. ["enabled"]) -> unknown ladder, cap as-is.
129
+ // Genuinely empty -> no effort control at all -> strip.
130
+ return supported.length > 0 ? cap : null;
131
+ }
132
+ const capRank = codexEffortRank(cap);
133
+ let best: string | null = null;
134
+ for (const rung of rankable) {
135
+ const rank = codexEffortRank(rung);
136
+ if (rank <= capRank && (best === null || rank > codexEffortRank(best))) best = rung;
137
+ }
138
+ return best;
139
+ }
140
+
141
+ /**
142
+ * Cap the turn's reasoning effort in BOTH request shapes. Non-strip resolution only
143
+ * lowers: efforts at or below the resolved ceiling (and non-ladder/absent efforts) pass
144
+ * untouched. Strip resolution (model exposes no effort control, or no supported rung
145
+ * fits under the cap) removes whatever effort is present — regardless of its rank —
146
+ * from both shapes while preserving `reasoning.summary`. Returns the applied rewrite
147
+ * for request-log annotation (`to: "none"` on strip), or null when nothing changed.
148
+ */
149
+ export function applyEffortCap(
150
+ parsed: OcxParsedRequest,
151
+ headers: Headers,
152
+ config: OcxConfig,
153
+ supported?: readonly string[] | undefined,
154
+ ): { from: string; to: string; subagent: boolean } | null {
155
+ const subagent = isThreadSpawnRequest(headers);
156
+ const cap = effortCapFor(config, subagent);
157
+ if (!cap) return null;
158
+ const resolved = resolveCappedEffort(cap, supported);
159
+ const requested = parsed.options.reasoning;
160
+ const raw = parsed._rawBody as { reasoning?: { effort?: string } } | undefined;
161
+ if (resolved === null) {
162
+ if (!requested) return null;
163
+ parsed.options.reasoning = undefined;
164
+ if (raw?.reasoning && typeof raw.reasoning === "object") delete raw.reasoning.effort;
165
+ return { from: requested, to: "none", subagent };
166
+ }
167
+ if (!requested || !isCodexReasoningEffort(requested)) return null;
168
+ if (codexEffortRank(requested) <= codexEffortRank(resolved)) return null;
169
+ parsed.options.reasoning = resolved;
170
+ if (raw?.reasoning && typeof raw.reasoning === "object") raw.reasoning.effort = resolved;
171
+ return { from: requested, to: resolved, subagent };
172
+ }
@@ -0,0 +1,123 @@
1
+ import { existsSync, readFileSync, statSync } from "node:fs";
2
+ import { extname, isAbsolute, join, relative, resolve } from "node:path";
3
+ import { browserSecurityHeaders } from "./auth-cors";
4
+ import type { GuiSessionBootstrap } from "./management-auth";
5
+
6
+ /** opencodex version, read from the packaged package.json (same source as the server bootstrap). */
7
+ const VERSION = (() => {
8
+ try {
9
+ return JSON.parse(readFileSync(new URL("../../package.json", import.meta.url), "utf8")).version as string;
10
+ } catch {
11
+ return "0.0.0";
12
+ }
13
+ })();
14
+
15
+ const MIME_TYPES: Record<string, string> = {
16
+ ".html": "text/html", ".js": "application/javascript", ".css": "text/css",
17
+ ".json": "application/json", ".svg": "image/svg+xml", ".png": "image/png",
18
+ ".ico": "image/x-icon",
19
+ };
20
+
21
+ function findGuiDist(): string | null {
22
+ const candidates = [
23
+ join(import.meta.dir, "..", "..", "gui", "dist"),
24
+ join(import.meta.dir, "..", "..", "..", "gui", "dist"),
25
+ ];
26
+ for (const c of candidates) {
27
+ if (existsSync(join(c, "index.html"))) return c;
28
+ }
29
+ return null;
30
+ }
31
+
32
+ export function resolveGuiFilePath(guiDist: string, pathname: string): string | null {
33
+ let decodedPath: string;
34
+ try {
35
+ decodedPath = decodeURIComponent(pathname);
36
+ } catch {
37
+ return null;
38
+ }
39
+ if (decodedPath.includes("\0")) return null;
40
+
41
+ const relativePath = decodedPath === "/" || decodedPath === ""
42
+ ? "index.html"
43
+ : decodedPath.replace(/\\/g, "/").replace(/^\/+/, "");
44
+ const root = resolve(guiDist);
45
+ const filePath = resolve(root, relativePath);
46
+ const rel = relative(root, filePath);
47
+ if (rel === "" || rel.startsWith("..") || isAbsolute(rel)) return null;
48
+ return filePath;
49
+ }
50
+
51
+ function isFile(path: string): boolean {
52
+ try {
53
+ return statSync(path).isFile();
54
+ } catch {
55
+ return false;
56
+ }
57
+ }
58
+
59
+ function htmlResponse(path: string, session?: GuiSessionBootstrap): Response {
60
+ let html = readFileSync(path, "utf8");
61
+ if (session) {
62
+ const bootstrap = [
63
+ `<meta name="opencodex-session-token" content="${session.token}">`,
64
+ `<meta name="opencodex-session-csrf" content="${session.csrfToken}">`,
65
+ `<meta name="opencodex-session-origin" content="${session.origin}">`,
66
+ ].join("");
67
+ html = html.includes("</head>") ? html.replace("</head>", `${bootstrap}</head>`) : `${bootstrap}${html}`;
68
+ }
69
+ return new Response(html, {
70
+ headers: {
71
+ "Content-Type": "text/html",
72
+ "Cache-Control": "no-store",
73
+ Pragma: "no-cache",
74
+ ...browserSecurityHeaders(),
75
+ },
76
+ });
77
+ }
78
+
79
+ export function serveGuiFile(
80
+ pathname: string,
81
+ guiDist = findGuiDist(),
82
+ session?: GuiSessionBootstrap,
83
+ ): Response | null {
84
+ if (!guiDist) return null;
85
+ const filePath = resolveGuiFilePath(guiDist, pathname);
86
+ if (!filePath) return null;
87
+
88
+ if (!isFile(filePath)) {
89
+ if (!extname(pathname)) {
90
+ const indexPath = join(guiDist, "index.html");
91
+ if (isFile(indexPath)) {
92
+ return htmlResponse(indexPath, session);
93
+ }
94
+ }
95
+ return null;
96
+ }
97
+
98
+ const ext = extname(filePath);
99
+ const contentType = MIME_TYPES[ext] || "application/octet-stream";
100
+ if (ext === ".html") return htmlResponse(filePath, session);
101
+ return new Response(Bun.file(filePath), {
102
+ headers: { "Content-Type": contentType, ...browserSecurityHeaders() },
103
+ });
104
+ }
105
+
106
+ export function rootFallbackPayload() {
107
+ return {
108
+ status: "ok",
109
+ service: "opencodex",
110
+ version: VERSION,
111
+ dashboard: {
112
+ available: false,
113
+ reason: "GUI build not found. Run `bun run build:gui` from the opencodex repo, or use `ocx gui` from a packaged install.",
114
+ },
115
+ endpoints: {
116
+ health: "/healthz",
117
+ models: "/v1/models",
118
+ responses: "/v1/responses",
119
+ chatCompletions: "/v1/chat/completions",
120
+ management: "/api/*",
121
+ },
122
+ };
123
+ }
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Upstream-413 tightened-retry gate (devlog/260714_image_normalization_pipeline/030).
3
+ *
4
+ * When Anthropic still rejects a normalized request with 413 request_too_large (budget
5
+ * estimate missed: giant text share, tool schemas, ...), the proxy rebuilds the SAME
6
+ * request with `imageTierBias: 1` — every image one ladder position lower — and retries
7
+ * exactly once. The decision logic lives here so it is unit-testable; the fetch loop in
8
+ * responses.ts consumes it.
9
+ */
10
+
11
+ import type { OcxParsedRequest } from "../types";
12
+
13
+ /** True when the parsed request carries at least one inline (data-URL) image. */
14
+ export function parsedHasInlineImage(parsed: OcxParsedRequest): boolean {
15
+ const messages = (parsed as { context?: { messages?: unknown[] } }).context?.messages ?? [];
16
+ for (const message of messages) {
17
+ const content = (message as { content?: unknown }).content;
18
+ if (!Array.isArray(content)) continue;
19
+ for (const part of content) {
20
+ const imageUrl = (part as { imageUrl?: unknown })?.imageUrl;
21
+ if (typeof imageUrl === "string" && imageUrl.startsWith("data:")) return true;
22
+ }
23
+ }
24
+ return false;
25
+ }
26
+
27
+ /**
28
+ * One tier-biased rebuild per request (spiral guard), only for the anthropic adapter
29
+ * (others ignore imageTierBias — an identical retry would just duplicate cost), and only
30
+ * when the request actually carries inline images the bias can shrink.
31
+ */
32
+ export function shouldAttemptImageTierRetry(args: {
33
+ status: number;
34
+ adapterName: string;
35
+ parsed: OcxParsedRequest;
36
+ alreadyAttempted: boolean;
37
+ }): boolean {
38
+ return args.status === 413
39
+ && !args.alreadyAttempted
40
+ && args.adapterName === "anthropic"
41
+ && parsedHasInlineImage(args.parsed);
42
+ }