@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,354 @@
1
+ import type { Server } from "bun";
2
+ import { bridgeToResponsesSSE, buildResponseJSON, formatErrorResponse, type ResponsesTerminalStatus } from "../../bridge";
3
+ import {
4
+ getConfigPath,
5
+ multiAgentGuidanceEnabled,
6
+ resolveEnvValue,
7
+ } from "../../config";
8
+ import { parseRequest } from "../../responses/parser";
9
+ import { buildCompactV1Output, COMPACT_PROMPT, decodeCompactionSummary, extractCompactUserMessages } from "../../responses/compaction";
10
+ import { FORWARD_HEADERS, sanitizeReasoningInputContent } from "../../adapters/openai-responses";
11
+ import { expandPreviousResponseInput, previousResponseProviderState, rememberResponseState } from "../../responses/state";
12
+ import { routeModel } from "../../router";
13
+ import {
14
+ advanceComboAfterFailure,
15
+ comboDefaultEffort,
16
+ comboFailureDecision,
17
+ comboIdFromRawBody,
18
+ concreteComboRequestBody,
19
+ getCombo,
20
+ isComboTargetInCooldown,
21
+ NoAvailableComboTargetsError,
22
+ noteComboSuccess,
23
+ parseRetryAfterMs,
24
+ pickComboTarget,
25
+ targetKey,
26
+ } from "../../combos";
27
+ import { isInjectionDebugEnabled } from "../../lib/debug-settings";
28
+ import { injectionDebugLog } from "../../lib/injection-debug-log";
29
+ import { modelInList, namespacedToolName } from "../../types";
30
+ import type { AdapterEvent, OcxConfig, OcxParsedRequest, OcxProviderConfig, OcxProviderContinuationState, OcxUsage } from "../../types";
31
+ import {
32
+ forceRefreshOAuthAccessSnapshot,
33
+ getOAuthCredentialApiBaseUrl,
34
+ getOAuthCredentialProjectId,
35
+ getValidAccessTokenSnapshot,
36
+ type OAuthAccessSnapshot,
37
+ UnsupportedOAuthProviderError,
38
+ } from "../../oauth";
39
+ import { buildWebSearchTool, planWebSearch, runWithWebSearch, shouldResolveOpenAiWebSearchSidecar } from "../../web-search";
40
+ import { describeImagesInPlace, planVisionSidecar, shouldResolveOpenAiVisionSidecar, stripImagesInPlace } from "../../vision";
41
+ import { createAdapterEventQueue, preflightAdapterEvents } from "../../adapters/run-turn-queue";
42
+ import {
43
+ applyCodexAuthContextToProvider,
44
+ CodexAccountCooldownError,
45
+ CodexAuthContextError,
46
+ CodexDirectAuthenticationError,
47
+ CodexPoolAuthenticationError,
48
+ CodexThreadAffinityExpiredError,
49
+ headersForCodexAuthContext,
50
+ isCodexAuthContextUsable,
51
+ resolveCodexAuthContext,
52
+ type CodexAuthContext,
53
+ } from "../../codex/auth-context";
54
+ import {
55
+ formatCodexProviderForLog,
56
+ recordCodexUpstreamOutcome,
57
+ type CodexUpstreamOutcome,
58
+ } from "../../codex/routing";
59
+ import { fetchWithResetRetry, fetchWithTransientRetry, applyUpstreamRecoveryInit } from "../../lib/upstream-retry";
60
+ import { ForwardAdmissionCredentialError, validateForwardAdmissionCredential } from "../auth-cors";
61
+ import { listOpenAiForwardSidecarCandidates, resolveFirstUsableOpenAiSidecar, type ResolvedOpenAiForwardSidecar } from "../../providers/openai-sidecar";
62
+ import { isCanonicalOpenAiForwardProvider } from "../../providers/openai-tiers";
63
+ import { slugsEquivalent } from "../../providers/slug-codec";
64
+ import { subagentFallbackGuidanceText } from "../../codex/subagent-model-fallback";
65
+ import { applyOpenAiVirtualModel, resolveOpenAiCompactModel } from "../../providers/openai-virtual-models";
66
+ import { isUsageDebugEnabled } from "../../usage/debug";
67
+ import { readJsonRequestBody, DecompressedBodyTooLargeError, UnsupportedContentEncodingError } from "../request-decompress";
68
+ import { resolveAdapter, resolveWireProtocolOverride } from "../adapter-resolve";
69
+ import { hasKeyPoolFailover, rotateProviderTransportOn429 } from "../../providers/key-failover";
70
+ import { shouldAttemptImageTierRetry } from "../image-retry";
71
+ import { resolveProviderTransport } from "../../providers/xai-transport";
72
+ import type { WsData } from "../ws-bridge";
73
+ import { registerTurn, trackStreamLifetime, unregisterTurn } from "../lifecycle";
74
+ import { redactSecretString } from "../../lib/redact";
75
+ import { readBoundedResponseBody } from "../../lib/bounded-body";
76
+ import { supportedLadderFor } from "../effort-policy";
77
+ import {
78
+ beginRequestAttempt,
79
+ catalogModelSupportsServiceTier,
80
+ finishRequestAttempt,
81
+ inspectResponseLogJson,
82
+ noteAttemptSend,
83
+ readConfiguredCodexServiceTier,
84
+ requestLogSpeedLabel,
85
+ sealRequestAttemptIdentity,
86
+ usageFromResponsesPayload,
87
+ type RequestLogContext,
88
+ } from "../request-log";
89
+ import type { AttemptRecoveryKind } from "../../usage/log";
90
+ import {
91
+ consumeForInspection,
92
+ consumeForResponseLogMetadata,
93
+ markNativePassthroughSseResponse,
94
+ relaySseWithFailedTail,
95
+ relayWithAbort,
96
+ sanitizePassthroughHeaders,
97
+ } from "../relay";
98
+ import { hasResponsesItemIdRepair, relaySseWithResponsesItemIdRepair } from "../responses-item-id-repair";
99
+ import type { EffectiveSubagentRoster, SpawnAgentSurface } from "../../codex/catalog";
100
+ import type { TranslatorBudget } from "../../lib/translator-budget";
101
+
102
+
103
+ export function buildToolBridgeMaps(parsed: OcxParsedRequest, budget?: TranslatorBudget): {
104
+ toolNsMap: Map<string, { namespace: string; name: string }>;
105
+ freeformToolNames: Set<string>;
106
+ toolSearchToolNames: Set<string>;
107
+ } {
108
+ const toolNsMap = new Map<string, { namespace: string; name: string }>();
109
+ const freeformToolNames = new Set<string>();
110
+ const toolSearchToolNames = new Set<string>();
111
+ for (const t of parsed.context.tools ?? []) {
112
+ if (t.namespace) {
113
+ const wireName = namespacedToolName(t.namespace, t.name);
114
+ budget?.chargeRetained(new TextEncoder().encode(JSON.stringify([wireName, t.namespace, t.name])).byteLength, { kind: "retained_collectors" });
115
+ toolNsMap.set(wireName, { namespace: t.namespace, name: t.name });
116
+ }
117
+ if (t.freeform) {
118
+ budget?.chargeRetained(new TextEncoder().encode(t.name).byteLength, { kind: "retained_collectors" });
119
+ freeformToolNames.add(t.name);
120
+ }
121
+ if (t.toolSearch) {
122
+ budget?.chargeRetained(new TextEncoder().encode(t.name).byteLength, { kind: "retained_collectors" });
123
+ toolSearchToolNames.add(t.name);
124
+ }
125
+ }
126
+ return { toolNsMap, freeformToolNames, toolSearchToolNames };
127
+ }
128
+
129
+
130
+
131
+ export const PROACTIVE_MULTI_AGENT_MODE_TEXT = [
132
+ "Proactive multi-agent delegation is active.",
133
+ "Any earlier instruction requiring an explicit user request before spawning sub-agents no longer applies.",
134
+ "Delegate independent sub-tasks to sub-agents whenever parallel work would materially improve speed or quality — do not serialize work that can run concurrently.",
135
+ "Each sub-agent runs in its own context and can use all available tools; prefer spawning specialists over doing everything yourself.",
136
+ "This mode remains active until a later multi-agent mode developer message changes it.",
137
+ ].join(" ");
138
+
139
+ export function isV1CollabSurface(parsed: OcxParsedRequest): boolean {
140
+ return collabSurface(parsed) === "v1";
141
+ }
142
+
143
+
144
+
145
+ export function collabSurface(parsed: OcxParsedRequest): "v1" | "v2" | null {
146
+ let namespacedSpawn = false;
147
+ let flatSpawn = false;
148
+ let v1Only = false;
149
+ let v2Only = false;
150
+ for (const t of parsed.context.tools ?? []) {
151
+ if (t.name === "spawn_agent") {
152
+ if (t.namespace) namespacedSpawn = true;
153
+ else flatSpawn = true;
154
+ } else if (t.name === "send_input" || t.name === "resume_agent" || t.name === "close_agent") {
155
+ v1Only = true;
156
+ } else if (t.name === "send_message" || t.name === "followup_task" || t.name === "interrupt_agent" || t.name === "list_agents") {
157
+ v2Only = true;
158
+ }
159
+ }
160
+ if (!namespacedSpawn && !flatSpawn) return null; // no spawn_agent -> no collab surface
161
+ if (namespacedSpawn && flatSpawn) return null; // contradictory spawn shapes
162
+ if (v1Only && v2Only) return null; // contradictory companions
163
+ if (v1Only) return "v1";
164
+ if (v2Only) return "v2";
165
+ return namespacedSpawn ? "v1" : "v2"; // companionless fallbacks (legacy defaults)
166
+ }
167
+
168
+
169
+
170
+ export interface MultiAgentGuidanceOptions {
171
+ multiAgentGuidanceEnabled?: boolean;
172
+ injectionModel?: string;
173
+ injectionEffort?: string;
174
+ subagentModels?: string[];
175
+ subagentModelFallback?: string[];
176
+ injectionPrompt?: string;
177
+ }
178
+
179
+
180
+
181
+ export interface MultiAgentGuidanceDeps {
182
+ resolveEffectiveSubagentRoster?: (
183
+ configuredModels: readonly string[],
184
+ surface: SpawnAgentSurface,
185
+ ) => EffectiveSubagentRoster | Promise<EffectiveSubagentRoster>;
186
+ collectCatalogState?: () => { state: "fresh" | "stale" | "not_running" | "unknown" };
187
+ }
188
+
189
+ async function defaultCollectCatalogState(): Promise<{ state: "fresh" | "stale" | "not_running" | "unknown" }> {
190
+ // Explicit override for tests and diagnostics: process state is global and
191
+ // would otherwise leak the host machine's app-server into hermetic tests.
192
+ const override = process.env.OPENCODEX_APP_SERVER_CATALOG_STATE_OVERRIDE;
193
+ if (override === "fresh" || override === "stale" || override === "not_running" || override === "unknown") {
194
+ return { state: override };
195
+ }
196
+ const { collectCodexAppServerCatalogState } = await import("../../codex/app-server-processes");
197
+ return collectCodexAppServerCatalogState();
198
+ }
199
+
200
+
201
+
202
+ export async function resolveEffectiveSubagentRoster(
203
+ configuredModels: readonly string[],
204
+ surface: SpawnAgentSurface,
205
+ ): Promise<EffectiveSubagentRoster> {
206
+ const { effectiveSubagentRoster } = await import("../../codex/catalog");
207
+ return effectiveSubagentRoster(configuredModels, surface);
208
+ }
209
+
210
+
211
+
212
+ export async function multiAgentGuidanceText(
213
+ parsed: OcxParsedRequest,
214
+ options: MultiAgentGuidanceOptions = {},
215
+ deps: MultiAgentGuidanceDeps = {},
216
+ ): Promise<string | null> {
217
+ if (options.multiAgentGuidanceEnabled === false) return null;
218
+ const {
219
+ injectionModel,
220
+ injectionEffort,
221
+ subagentModels,
222
+ subagentModelFallback,
223
+ injectionPrompt,
224
+ } = options;
225
+ const surface = collabSurface(parsed);
226
+ if (surface === null) return null;
227
+
228
+ if (surface === "v2") {
229
+ // #857: the disk catalog may be newer than the running app-server's
230
+ // in-memory copy. Advertising preferred models or a roster the running
231
+ // Codex cannot actually spawn makes spawn_agent reject the override, so
232
+ // suppress positive model claims while the state is stale or unknown.
233
+ const catalogState = await (deps.collectCatalogState ?? defaultCollectCatalogState)();
234
+ if (catalogState.state === "stale" || catalogState.state === "unknown") {
235
+ return "<multi_agent_mode>The model catalog changed after Codex started; do not set "
236
+ + "model or reasoning_effort overrides until Codex restarts.</multi_agent_mode>";
237
+ }
238
+ // codex-rs supplies the Proactive text on v2; the proxy only adds model-designation
239
+ // guidance, and only when there is something concrete to designate: a configured
240
+ // injectionModel and/or a roster entry that resolves in the injected catalog.
241
+ const configuredForGuidance = [
242
+ ...(subagentModels ?? []),
243
+ ...(injectionModel ? [injectionModel] : []),
244
+ ];
245
+ const resolveRoster = deps.resolveEffectiveSubagentRoster ?? resolveEffectiveSubagentRoster;
246
+ const effective = await resolveRoster(configuredForGuidance, "v2");
247
+ const rosterModels = effective.advertised.filter(candidate =>
248
+ (subagentModels ?? []).some(model => slugsEquivalent(model, candidate.model))
249
+ );
250
+ const roster = subagentRosterText(rosterModels);
251
+ const preferred = injectionModel
252
+ ? effective.candidates.find(candidate => slugsEquivalent(injectionModel, candidate.model))
253
+ : undefined;
254
+
255
+ if (isInjectionDebugEnabled() && effective.excluded.length > 0) {
256
+ injectionDebugLog(`[opencodex] multi-agent guidance excluded: ${effective.excluded
257
+ .map(item => `${item.configured}:${item.reason}`)
258
+ .join(", ")}`);
259
+ }
260
+ const fallbackGuidance = subagentFallbackGuidanceText({ subagentModelFallback } as OcxConfig);
261
+ if (!injectionModel && roster === "" && fallbackGuidance === "") return null;
262
+ if (injectionPrompt) {
263
+ return `<multi_agent_mode>${applyInjectionPlaceholders(injectionPrompt, injectionModel, injectionEffort, roster, fallbackGuidance)}</multi_agent_mode>`;
264
+ }
265
+ if (!preferred && roster === "" && fallbackGuidance === "") return null;
266
+ let text = "When the active spawn_agent tool supports optional \"model\" or \"reasoning_effort\" overrides, "
267
+ + "use only models listed for this collaboration surface. "
268
+ + "When setting either override, set fork_turns to \"none\" "
269
+ + "(or a positive turn count such as \"3\"; full-history forks reject overrides) "
270
+ + "and make the task message self-contained.";
271
+ if (preferred) {
272
+ text += ` Preferred sub-agent: model "${preferred.model}"`
273
+ + (injectionEffort ? `, reasoning_effort "${injectionEffort}"` : "")
274
+ + " — use it unless the user names another.";
275
+ }
276
+ text += fallbackGuidance;
277
+ text += roster;
278
+ if (text.length > V2_GUIDANCE_CHAR_BUDGET) {
279
+ // Roster is the only unbounded part — drop it before breaking the budget.
280
+ text = text.slice(0, text.length - roster.length);
281
+ }
282
+ return `<multi_agent_mode>${text}</multi_agent_mode>`;
283
+ }
284
+
285
+ const effort = parsed.options.reasoning;
286
+ // v1 keeps only the upstream-parity behavior: Proactive text at the top tier
287
+ // (ultra arrives as max on the wire). No designation/roster payload here.
288
+ if (effort !== "max" && effort !== "ultra") return null;
289
+ return `<multi_agent_mode>${PROACTIVE_MULTI_AGENT_MODE_TEXT}</multi_agent_mode>`;
290
+ }
291
+
292
+
293
+
294
+ export const V2_GUIDANCE_CHAR_BUDGET = 700;
295
+
296
+ export function applyInjectionPlaceholders(prompt: string, model?: string, effort?: string, roster?: string, fallback?: string): string {
297
+ return prompt
298
+ .replaceAll("{{model}}", model ?? "")
299
+ .replaceAll("{{effort}}", effort ?? "")
300
+ .replaceAll("{{roster}}", roster ?? "")
301
+ .replaceAll("{{fallback}}", fallback ?? "");
302
+ }
303
+
304
+
305
+
306
+ export function subagentRosterText(models: Array<{ model: string; efforts: string[] }>): string {
307
+ if (models.length === 0) return "";
308
+ const ladders = new Set(models.map(model => model.efforts.join("/")));
309
+ if (!ladders.has("") && ladders.size === 1) {
310
+ return ` Available models (reasoning_effort ${[...ladders][0]}): ${models
311
+ .map(model => `"${model.model}"`)
312
+ .join(", ")}.`;
313
+ }
314
+ const entries = models.map(model => model.efforts.length > 0
315
+ ? `"${model.model}" (${model.efforts.join("/")})`
316
+ : `"${model.model}"`);
317
+ return ` Available models (valid reasoning_effort): ${entries.join(", ")}.`;
318
+ }
319
+
320
+
321
+
322
+ function isRecord(value: unknown): value is Record<string, unknown> {
323
+ return !!value && typeof value === "object" && !Array.isArray(value);
324
+ }
325
+
326
+ function isGeneratedDeveloperItem(item: unknown, text: string): boolean {
327
+ if (!isRecord(item) || item.type !== "message" || item.role !== "developer") return false;
328
+ if (!Array.isArray(item.content) || item.content.length !== 1) return false;
329
+ const [part] = item.content;
330
+ return isRecord(part) && part.type === "input_text" && part.text === text;
331
+ }
332
+
333
+ export function injectDeveloperMessage(parsed: OcxParsedRequest, text: string): void {
334
+ const raw = parsed._rawBody as { input?: unknown } | undefined;
335
+ const devItem = { type: "message", role: "developer", content: [{ type: "input_text", text }] };
336
+ if (raw && Array.isArray(raw.input)) {
337
+ const replayPrefixLen = Math.min(parsed._replayPrefixLen ?? 0, raw.input.length);
338
+ if (raw.input.slice(0, replayPrefixLen).some(item => isGeneratedDeveloperItem(item, text))) {
339
+ return;
340
+ }
341
+ }
342
+
343
+ parsed.context.messages.push({ role: "developer", content: text, timestamp: Date.now() });
344
+ if (raw && Array.isArray(raw.input)) {
345
+ // compaction_trigger must remain the final input item (codex-rs + ChatGPT backend both
346
+ // validate this). Insert the developer message BEFORE the trigger when present.
347
+ const last = raw.input[raw.input.length - 1];
348
+ if (last && typeof last === "object" && (last as { type?: string }).type === "compaction_trigger") {
349
+ raw.input.splice(raw.input.length - 1, 0, devItem);
350
+ } else {
351
+ raw.input.push(devItem);
352
+ }
353
+ }
354
+ }