@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,112 @@
1
+ import {
2
+ CliUsageError,
3
+ printData,
4
+ rejectArgs,
5
+ runCliAction,
6
+ runtimeRequest,
7
+ summaryLines,
8
+ takeBooleanOption,
9
+ takeFlag,
10
+ takeOption,
11
+ type RuntimeApiDeps,
12
+ } from "./runtime-api";
13
+
14
+ const USAGE = `Usage:
15
+ ocx system [status] [--json]
16
+ ocx system settings [--auto-start <on|off>] [--stream-mode <auto|legacy-tee|eager-relay>] [--json]
17
+ ocx system startup <health|install-service|install-shim> [--json]
18
+ ocx system diagnostics [--json]
19
+ ocx system sync [--json]
20
+ ocx system update check [--channel <latest|preview>] [--json]
21
+ ocx system update run [--channel <latest|preview>] [--restart <on|off>] --yes [--json]
22
+ ocx system update status <job-id> [--json]`;
23
+
24
+ async function status(argv: string[], deps: RuntimeApiDeps): Promise<void> {
25
+ const args = [...argv];
26
+ const wantsJson = takeFlag(args, "--json");
27
+ rejectArgs(args, USAGE);
28
+ const [settings, startup, memory] = await Promise.all([
29
+ runtimeRequest("/api/settings", {}, deps),
30
+ runtimeRequest("/api/startup-health", {}, deps),
31
+ runtimeRequest("/api/system/memory", {}, deps),
32
+ ]);
33
+ const result = { settings, startup, memory };
34
+ printData(result, wantsJson, summaryLines(result));
35
+ }
36
+
37
+ async function settings(argv: string[], deps: RuntimeApiDeps): Promise<void> {
38
+ const args = [...argv];
39
+ const wantsJson = takeFlag(args, "--json");
40
+ const autoStart = takeBooleanOption(args, "--auto-start");
41
+ const streamMode = takeOption(args, "--stream-mode");
42
+ rejectArgs(args, USAGE);
43
+ if (autoStart === undefined && streamMode === undefined) {
44
+ const result = await runtimeRequest("/api/settings", {}, deps);
45
+ printData(result, wantsJson, summaryLines(result));
46
+ return;
47
+ }
48
+ const body = { ...(autoStart !== undefined ? { codexAutoStart: autoStart } : {}), ...(streamMode !== undefined ? { streamMode } : {}) };
49
+ const result = await runtimeRequest("/api/settings", { method: "PUT", body: JSON.stringify(body) }, deps);
50
+ printData(result, wantsJson, ["System settings updated."]);
51
+ }
52
+
53
+ async function startup(argv: string[], deps: RuntimeApiDeps): Promise<void> {
54
+ const args = [...argv];
55
+ const action = (args.shift() ?? "health").toLowerCase();
56
+ const wantsJson = takeFlag(args, "--json");
57
+ rejectArgs(args, USAGE);
58
+ if (action === "health" || action === "status") {
59
+ const result = await runtimeRequest("/api/startup-health", {}, deps);
60
+ printData(result, wantsJson, summaryLines(result));
61
+ return;
62
+ }
63
+ if (action !== "install-service" && action !== "install-shim") throw new CliUsageError("startup action must be health, install-service, or install-shim", USAGE);
64
+ const result = await runtimeRequest("/api/startup-action", { method: "POST", body: JSON.stringify({ action }) }, deps);
65
+ printData(result, wantsJson, [String((result as Record<string, unknown>).message ?? `${action} complete.`)]);
66
+ }
67
+
68
+ async function update(argv: string[], deps: RuntimeApiDeps): Promise<void> {
69
+ const args = [...argv];
70
+ const action = (args.shift() ?? "check").toLowerCase();
71
+ const wantsJson = takeFlag(args, "--json");
72
+ if (action === "status") {
73
+ const jobId = args.shift();
74
+ if (!jobId) throw new CliUsageError("update job id is required", USAGE);
75
+ rejectArgs(args, USAGE);
76
+ printData(await runtimeRequest(`/api/update/status?jobId=${encodeURIComponent(jobId)}`, {}, deps), wantsJson);
77
+ return;
78
+ }
79
+ const channel = takeOption(args, "--channel") ?? "latest";
80
+ if (channel !== "latest" && channel !== "preview") throw new CliUsageError("--channel must be latest or preview", USAGE);
81
+ if (action === "check") {
82
+ rejectArgs(args, USAGE);
83
+ printData(await runtimeRequest(`/api/update/check?tag=${channel}`, {}, deps), wantsJson);
84
+ return;
85
+ }
86
+ if (action !== "run") throw new CliUsageError(`unknown update action ${action}`, USAGE);
87
+ const restart = takeBooleanOption(args, "--restart") ?? true;
88
+ const yes = takeFlag(args, "--yes");
89
+ if (!yes) throw new CliUsageError("update run requires --yes", USAGE);
90
+ rejectArgs(args, USAGE);
91
+ const result = await runtimeRequest("/api/update/run", { method: "POST", body: JSON.stringify({ tag: channel, restart }) }, deps);
92
+ printData(result, wantsJson, [`Update started (${channel}).`]);
93
+ }
94
+
95
+ export async function handleSystemCommand(argv: string[], deps: RuntimeApiDeps = {}): Promise<number> {
96
+ return runCliAction(async () => {
97
+ const [sub = "status", ...rest] = argv;
98
+ if (sub === "status") await status(rest, deps);
99
+ else if (sub === "settings") await settings(rest, deps);
100
+ else if (sub === "startup") await startup(rest, deps);
101
+ else if (sub === "diagnostics") {
102
+ const args = [...rest]; const wantsJson = takeFlag(args, "--json"); rejectArgs(args, USAGE);
103
+ printData(await runtimeRequest("/api/diagnostics/project-config", {}, deps), wantsJson);
104
+ } else if (sub === "sync") {
105
+ const args = [...rest]; const wantsJson = takeFlag(args, "--json"); rejectArgs(args, USAGE);
106
+ printData(await runtimeRequest("/api/sync", { method: "POST" }, deps), wantsJson);
107
+ } else if (sub === "update") await update(rest, deps);
108
+ else throw new CliUsageError(`unknown system command ${sub}`, USAGE);
109
+ });
110
+ }
111
+
112
+ export const SYSTEM_USAGE = USAGE;
@@ -0,0 +1,52 @@
1
+ export interface TrayProxyLive { port: number }
2
+
3
+ export interface TrayProxyServiceState {
4
+ installed: boolean;
5
+ startable: boolean;
6
+ summary: string;
7
+ }
8
+
9
+ export interface TrayProxyStartIo {
10
+ findLive: () => Promise<TrayProxyLive | null>;
11
+ diagnoseService: () => TrayProxyServiceState;
12
+ startService: () => void | Promise<void>;
13
+ startDirect: () => void | Promise<void>;
14
+ waitForProxy: () => Promise<TrayProxyLive | null>;
15
+ info: (message: string) => void;
16
+ error: (message: string) => void;
17
+ }
18
+
19
+ /** Side-effect coordinator for the tray's fixed proxy-start action. */
20
+ export async function runTrayProxyStart(io: TrayProxyStartIo): Promise<boolean> {
21
+ const live = await io.findLive();
22
+ if (live) {
23
+ io.info(`Proxy already running on port ${live.port}.`);
24
+ return true;
25
+ }
26
+
27
+ const service = io.diagnoseService();
28
+ if (service.installed && !service.startable) {
29
+ io.error(`Cannot start from the tray because the installed service is not viable: ${service.summary}`);
30
+ io.error("Repair or remove the service before starting a direct proxy.");
31
+ return false;
32
+ }
33
+
34
+ if (service.startable) await io.startService();
35
+ else await io.startDirect();
36
+
37
+ const started = await io.waitForProxy();
38
+ if (!started) {
39
+ io.error("Proxy did not become healthy after the tray start action.");
40
+ return false;
41
+ }
42
+ io.info(`Proxy running on port ${started.port}.`);
43
+ return true;
44
+ }
45
+
46
+ export async function runTrayProxyRestart(io: {
47
+ stop: () => boolean | Promise<boolean>;
48
+ start: () => boolean | Promise<boolean>;
49
+ }): Promise<boolean> {
50
+ if (!await io.stop()) return false;
51
+ return io.start();
52
+ }
package/src/cli/v2.ts ADDED
@@ -0,0 +1,173 @@
1
+ /**
2
+ * `ocx v2 status|on|off` — toggle/report the codex `multi_agent_v2` feature that
3
+ * controls the multi-agent surface (v1 vs v2 collab mode).
4
+ *
5
+ * Contract:
6
+ * - config.toml writes go through the official `codex features enable|disable`
7
+ * CLI only (format-preserving TOML edit stays upstream-owned).
8
+ * - after a successful flip the catalog is RESYNCED so model metadata stays fresh.
9
+ * - flips preserve the active thread limit while moving it between the v1/v2
10
+ * config keys, with byte-for-byte rollback when the feature command fails.
11
+ * - nothing in the catalog build path calls this module; no auto-flip exists.
12
+ */
13
+ import { execFileSync } from "node:child_process";
14
+ import { getAgentsEnabled, getAgentsMaxDepth, getLogicalMaxThreads, getSubagentDeveloperInstructions, hasAgentsMaxThreads, isMultiAgentV2Enabled, transitionMultiAgentV2 } from "../codex/features";
15
+
16
+ import { commandInvocation, type SpawnInvocation } from "../lib/win-exec";
17
+ import { loadConfig, saveConfig } from "../config";
18
+ import { resolveAndPersistCodexRuntime, type ResolveCodexRuntimeDeps } from "../codex/runtime";
19
+
20
+ export interface V2CliDeps {
21
+ execFile?: (file: string, args: string[], options?: SpawnInvocation["options"]) => void;
22
+ isEnabled?: typeof isMultiAgentV2Enabled;
23
+ hasMaxThreads?: typeof hasAgentsMaxThreads;
24
+ sync?: (port?: number) => Promise<unknown>;
25
+ log?: Pick<Console, "log" | "error">;
26
+ }
27
+
28
+ export type CodexFeaturesInvocationDeps =
29
+ & Parameters<typeof commandInvocation>[3]
30
+ & Pick<ResolveCodexRuntimeDeps, "existsSync" | "execFileSync" | "configDir" | "readFileSync">;
31
+
32
+ /**
33
+ * Shared invocation for `codex features enable|disable multi_agent_v2` — the single
34
+ * source of truth for the CLI and the management API fallback. Windows npm installs
35
+ * expose `codex` as a `.cmd` shim, which needs the win-exec launcher
36
+ * (devlog 260715_cross_platform_audit/020).
37
+ */
38
+ export function codexFeaturesInvocation(
39
+ action: "enable" | "disable",
40
+ platform: NodeJS.Platform = process.platform,
41
+ deps: CodexFeaturesInvocationDeps = {},
42
+ ): SpawnInvocation {
43
+ const command = resolveAndPersistCodexRuntime({
44
+ env: deps.env ?? process.env,
45
+ platform,
46
+ existsSync: deps.existsSync,
47
+ execFileSync: deps.execFileSync,
48
+ configDir: deps.configDir,
49
+ readFileSync: deps.readFileSync,
50
+ }).runtime.command || "codex";
51
+ return commandInvocation(command, ["features", action, "multi_agent_v2"], platform, deps);
52
+ }
53
+
54
+ function runCodexFeatures(action: "enable" | "disable", deps: V2CliDeps): void {
55
+ const exec = deps.execFile ?? ((file: string, args: string[], options?: SpawnInvocation["options"]) => {
56
+ execFileSync(file, args, { stdio: ["ignore", "pipe", "pipe"], timeout: 15_000, windowsHide: true, ...options });
57
+ });
58
+ const inv = codexFeaturesInvocation(action);
59
+ exec(inv.file, inv.args, inv.options);
60
+ }
61
+
62
+ export function v2StatusLine(enabled: boolean): string {
63
+ return enabled
64
+ ? "multi_agent_v2: ON — v2 multi-agent surface active"
65
+ : "multi_agent_v2: OFF — v1 multi-agent surface (default install)";
66
+ }
67
+
68
+ export function multiAgentModeLine(mode: string): string {
69
+ switch (mode) {
70
+ case "v1": return "multi_agent_mode: v1 — ALL models forced to v1 surface (upstream pins overridden)";
71
+ case "v2": return "multi_agent_mode: v2 — ALL models forced to v2 surface (upstream pins overridden)";
72
+ default: return "multi_agent_mode: default — upstream model pins respected (sol/terra=v2, luna=v1, rest=codex flag)";
73
+ }
74
+ }
75
+
76
+ export async function cmdV2(args: string[], deps: V2CliDeps = {}, findPort?: () => Promise<number | undefined>): Promise<number> {
77
+ const log = deps.log ?? console;
78
+ const isEnabled = deps.isEnabled ?? isMultiAgentV2Enabled;
79
+ const hasMaxThreads = deps.hasMaxThreads ?? hasAgentsMaxThreads;
80
+ const verb = (args[0] ?? "status").trim().toLowerCase();
81
+
82
+ if (verb === "status") {
83
+ log.log(v2StatusLine(isEnabled()));
84
+ const cfg = loadConfig();
85
+ log.log(multiAgentModeLine(cfg.multiAgentMode ?? "default"));
86
+ const threads = getLogicalMaxThreads();
87
+ log.log(`max_threads: ${threads ?? "(unset — codex default)"}`);
88
+ const v2Active = isEnabled();
89
+ const agentsEnabled = getAgentsEnabled();
90
+ log.log(`agents.enabled: ${agentsEnabled === null ? "(unset — upstream default true)" : agentsEnabled}`);
91
+ const maxDepth = getAgentsMaxDepth();
92
+ // max_depth is V1-only upstream; say so whenever V2 is active so the number
93
+ // cannot be misread as an effective V2 limit.
94
+ log.log(`agents.max_depth: ${maxDepth ?? "(unset — upstream default 1)"}${v2Active ? " (V1-only — ignored while multi_agent_v2 is enabled)" : ""}`);
95
+ const instructions = getSubagentDeveloperInstructions();
96
+ log.log(`subagent_developer_instructions: ${instructions === null ? "(unset — children inherit)" : instructions === "" ? '"" (clears inherited instructions)' : JSON.stringify(instructions)}`);
97
+ if (isEnabled() && hasMaxThreads()) {
98
+ log.log("WARNING: [agents] max_threads is set — codex refuses to start while multi_agent_v2 is enabled. Remove it from config.toml (concurrency lives in features.multi_agent_v2.max_concurrent_threads_per_session).");
99
+ }
100
+ return 0;
101
+ }
102
+ if (verb === "threads") {
103
+ const value = Number((args[1] ?? "").trim());
104
+ if (!Number.isInteger(value) || value < 1) {
105
+ log.error("v2 threads: pass an integer >= 1 (features.multi_agent_v2.max_concurrent_threads_per_session)");
106
+ return 1;
107
+ }
108
+ const enabled = isEnabled();
109
+ const result = transitionMultiAgentV2(enabled, next => runCodexFeatures(next ? "enable" : "disable", deps), { threadLimit: value });
110
+ if (!result.ok) { log.error(`v2 threads: ${result.error}`); return 1; }
111
+ log.log(result.changed
112
+ ? `max_threads = ${value} (${enabled ? "v2" : "v1"}) — applies to new sessions.`
113
+ : `max_threads already ${value} — nothing to do.`);
114
+ return 0;
115
+ }
116
+ if (verb === "mode") {
117
+ const modeArg = (args[1] ?? "").trim().toLowerCase();
118
+ if (modeArg !== "v1" && modeArg !== "default" && modeArg !== "v2") {
119
+ log.error("v2 mode: expected v1|default|v2");
120
+ return 1;
121
+ }
122
+ const cfg = loadConfig();
123
+ if (modeArg !== "default") {
124
+ const target = modeArg === "v2";
125
+ const transition = transitionMultiAgentV2(target, enabled => runCodexFeatures(enabled ? "enable" : "disable", deps));
126
+ if (!transition.ok) {
127
+ log.error(`multi-agent mode transition failed: ${transition.error}`);
128
+ return 1;
129
+ }
130
+ }
131
+ if (modeArg === "default") delete cfg.multiAgentMode;
132
+ else cfg.multiAgentMode = modeArg as "v1" | "v2";
133
+ saveConfig(cfg);
134
+ try {
135
+ const sync = deps.sync ?? (await import("../codex/sync")).syncModelsToCodex;
136
+ await sync(findPort ? await findPort() : undefined);
137
+ } catch (err) {
138
+ log.error(`catalog resync failed: ${err instanceof Error ? err.message : String(err)} — run 'ocx sync' manually.`);
139
+ return 1;
140
+ }
141
+ log.log(multiAgentModeLine(modeArg));
142
+ log.log("Applies to NEW sessions; running sessions keep their pinned multi-agent version.");
143
+ return 0;
144
+ }
145
+ if (verb !== "on" && verb !== "off") {
146
+ log.error(`v2: unknown verb '${verb}' (expected status|on|off|mode <v1|default|v2>|threads <n>)`);
147
+ return 1;
148
+ }
149
+
150
+ const want = verb === "on";
151
+ const transition = transitionMultiAgentV2(want, enabled => runCodexFeatures(enabled ? "enable" : "disable", deps));
152
+ if (!transition.ok) {
153
+ log.error(`codex features ${want ? "enable" : "disable"} multi_agent_v2 failed: ${transition.error}`);
154
+ return 1;
155
+ }
156
+ if (!transition.changed) {
157
+ log.log(`multi_agent_v2 already ${want ? "ON" : "OFF"} — nothing to do.`);
158
+ return 0;
159
+ }
160
+
161
+ // Resync catalog so multi-agent surface metadata stays fresh in both the
162
+ // on-disk catalog and models_cache.json after the toggle flip.
163
+ try {
164
+ const sync = deps.sync ?? (await import("../codex/sync")).syncModelsToCodex;
165
+ await sync(findPort ? await findPort() : undefined);
166
+ } catch (err) {
167
+ log.error(`catalog resync failed (flag IS flipped): ${err instanceof Error ? err.message : String(err)} — run 'ocx sync' manually.`);
168
+ return 1;
169
+ }
170
+ log.log(v2StatusLine(want));
171
+ log.log("Applies to NEW sessions; running sessions keep their pinned multi-agent version. Restart the Codex app (or wait out its picker cache) to see the ladder change.");
172
+ return 0;
173
+ }
package/src/cli.ts ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env bun
2
+ // Compatibility stub for the pre-restructure entrypoint path.
3
+ //
4
+ // Before the src/ restructure the CLI lived at src/cli.ts, and durable launchers
5
+ // (codex shim wrappers, installed service definitions) baked that absolute path
6
+ // into their command lines. Users who upgrade in place with a bare
7
+ // `npm install -g @iislee/opencodex` (instead of `ocx update`, which repairs the
8
+ // shim/service) would otherwise be stranded on a dead path. Keep this stub for at
9
+ // least one release cycle after the restructure ships.
10
+ import "./cli/index.ts";