@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,411 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import path, { dirname, join, resolve } from "node:path";
3
+ import { expandUserPath } from "../config";
4
+ import { defaultCodexHome } from "./home";
5
+ import { readRootTomlString } from "./paths";
6
+ import { truncateRetainedUtf8 } from "../lib/admission";
7
+
8
+ const OCX_SECTION_MARKER = "# Auto-injected by opencodex";
9
+ const DIAGNOSTICS_CACHE_TTL_MS = 30_000;
10
+ const MAX_DIAGNOSTIC_VALUE_BYTES = 8 * 1024;
11
+
12
+ function resolveCodexConfigPath(): string {
13
+ const raw = process.env.CODEX_HOME?.trim();
14
+ const home = raw ? resolve(expandUserPath(raw)) : defaultCodexHome();
15
+ return join(home, "config.toml");
16
+ }
17
+
18
+ export type ProjectCodexConfigIssueCode = "model_providers_table" | "profile_selector" | "model_provider_root";
19
+
20
+ export interface ProjectCodexConfigWarning {
21
+ path: string;
22
+ code: ProjectCodexConfigIssueCode;
23
+ /** Effective provider id that bypasses OpenCodex. */
24
+ detail: string;
25
+ /** Profile name when the bypass is selected via profile = "…". */
26
+ profileName?: string;
27
+ message: string;
28
+ }
29
+
30
+ interface TomlDocument {
31
+ root: Record<string, string>;
32
+ sections: Map<string, Record<string, string>>;
33
+ }
34
+
35
+ let diagnosticsCache: { at: number; warnings: ProjectCodexConfigWarning[] } | null = null;
36
+
37
+ function hasInjectedOpenaiBaseUrl(content: string): boolean {
38
+ const lines = content.split("\n");
39
+ const firstTable = lines.findIndex(l => /^\s*\[/.test(l));
40
+ const rootEnd = firstTable === -1 ? lines.length : firstTable;
41
+ for (let i = 1; i < rootEnd; i++) {
42
+ if (/^\s*openai_base_url\s*=/.test(lines[i]) && lines[i - 1].includes(OCX_SECTION_MARKER)) return true;
43
+ }
44
+ return false;
45
+ }
46
+
47
+ function parseTomlString(raw: string): string {
48
+ if (raw.startsWith("\"")) {
49
+ try {
50
+ return JSON.parse(raw) as string;
51
+ } catch {
52
+ return raw.slice(1, -1);
53
+ }
54
+ }
55
+ return raw.slice(1, -1);
56
+ }
57
+
58
+ /** Lightweight TOML parse for root keys and [section] tables (Codex config shape). */
59
+ export function parseTomlDocument(content: string): TomlDocument {
60
+ const root: Record<string, string> = {};
61
+ const sections = new Map<string, Record<string, string>>();
62
+ let current = root;
63
+
64
+ for (const line of content.split("\n")) {
65
+ const table = line.match(/^\s*\[([^\]]+)\]\s*$/);
66
+ if (table) {
67
+ const name = table[1]!.trim();
68
+ const section = sections.get(name) ?? {};
69
+ sections.set(name, section);
70
+ current = section;
71
+ continue;
72
+ }
73
+ const kv = line.match(/^\s*([A-Za-z0-9_.-]+)\s*=\s*("(?:\\.|[^"])*"|'[^']*'|[^\s#]+)\s*(?:#.*)?$/);
74
+ if (kv) current[kv[1]!] = parseTomlString(kv[2]!);
75
+ }
76
+
77
+ return { root, sections };
78
+ }
79
+
80
+ function profileSectionKeys(profileName: string): string[] {
81
+ return [
82
+ `profiles.${profileName}`,
83
+ `profiles."${profileName}"`,
84
+ `profiles.'${profileName}'`,
85
+ ];
86
+ }
87
+
88
+ function readProfileModelProvider(sections: Map<string, Record<string, string>>, profileName: string): string | null {
89
+ for (const key of profileSectionKeys(profileName)) {
90
+ const provider = sections.get(key)?.model_provider;
91
+ if (provider) return provider;
92
+ }
93
+ return null;
94
+ }
95
+
96
+ function hasModelProviderTable(sections: Map<string, Record<string, string>>, provider: string): boolean {
97
+ return sections.has(`model_providers.${provider}`);
98
+ }
99
+
100
+ /** Built-in openai provider still routes through the proxy under Design B (marker-owned openai_base_url). */
101
+ function isProxyCompatibleProvider(provider: string): boolean {
102
+ return provider === "opencodex" || provider === "openai";
103
+ }
104
+
105
+ export interface EffectiveProjectModelRouting {
106
+ provider: string | null;
107
+ profileName: string | null;
108
+ via: "profile" | "root" | null;
109
+ }
110
+
111
+ /** Resolve the provider Codex would actually use from a project .codex/config.toml. */
112
+ export function resolveEffectiveProjectModelProvider(content: string): EffectiveProjectModelRouting {
113
+ const { root, sections } = parseTomlDocument(content);
114
+ const rootProfile = root.profile ?? null;
115
+ const rootProvider = root.model_provider ?? null;
116
+
117
+ if (rootProfile) {
118
+ const fromProfile = readProfileModelProvider(sections, rootProfile);
119
+ if (fromProfile) {
120
+ return { provider: fromProfile, profileName: rootProfile, via: "profile" };
121
+ }
122
+ if (rootProvider) {
123
+ return { provider: rootProvider, profileName: rootProfile, via: "root" };
124
+ }
125
+ return { provider: null, profileName: rootProfile, via: null };
126
+ }
127
+
128
+ if (rootProvider) {
129
+ return { provider: rootProvider, profileName: null, via: "root" };
130
+ }
131
+
132
+ return { provider: null, profileName: null, via: null };
133
+ }
134
+
135
+ /** True when global Codex config routes through the opencodex proxy. */
136
+ export function isGlobalOpencodexRoutingActive(
137
+ codexConfigPath: string = resolveCodexConfigPath(),
138
+ content?: string,
139
+ ): boolean {
140
+ let text = content;
141
+ if (text === undefined) {
142
+ if (!existsSync(codexConfigPath)) return false;
143
+ try {
144
+ text = readFileSync(codexConfigPath, "utf-8");
145
+ } catch {
146
+ return false;
147
+ }
148
+ }
149
+ if (hasInjectedOpenaiBaseUrl(text)) return true;
150
+ if (readRootTomlString(text, "model_provider") === "opencodex") return true;
151
+ return false;
152
+ }
153
+
154
+ export function parseTrustedProjectPathsFromCodexConfig(content: string): string[] {
155
+ const { sections } = parseTomlDocument(content);
156
+ const paths: string[] = [];
157
+
158
+ for (const [name, keys] of sections) {
159
+ const quoted = name.match(/^projects\.(?:'([^']*)'|"([^"]*)")$/);
160
+ if (!quoted) continue;
161
+ const raw = (quoted[1] ?? quoted[2] ?? "").trim();
162
+ if (!raw) continue;
163
+ if ((keys.trust_level ?? "").toLowerCase() !== "trusted") continue;
164
+ paths.push(raw);
165
+ }
166
+
167
+ return paths;
168
+ }
169
+
170
+ export function analyzeProjectCodexConfig(content: string, configPath: string): ProjectCodexConfigWarning[] {
171
+ const { sections } = parseTomlDocument(content);
172
+ const routing = resolveEffectiveProjectModelProvider(content);
173
+ const provider = routing.provider;
174
+
175
+ if (!provider || isProxyCompatibleProvider(provider)) return [];
176
+
177
+ const rel = relPath(configPath);
178
+ if (hasModelProviderTable(sections, provider)) {
179
+ return [{
180
+ path: configPath,
181
+ code: "model_providers_table",
182
+ detail: provider,
183
+ profileName: routing.profileName ?? undefined,
184
+ message:
185
+ `Project Codex config selects provider "${provider}" via `
186
+ + `${routing.via === "profile" ? `profile = "${routing.profileName}"` : "model_provider"} and defines `
187
+ + `[model_providers.${provider}] (${rel}). That routes this trusted project away from the OpenCodex proxy.`,
188
+ }];
189
+ }
190
+
191
+ if (routing.via === "profile" && routing.profileName) {
192
+ return [{
193
+ path: configPath,
194
+ code: "profile_selector",
195
+ detail: provider,
196
+ profileName: routing.profileName,
197
+ message:
198
+ `Project Codex config profile "${routing.profileName}" sets model_provider = "${provider}" (${rel}). `
199
+ + "That routes this trusted project away from the OpenCodex proxy.",
200
+ }];
201
+ }
202
+
203
+ return [{
204
+ path: configPath,
205
+ code: "model_provider_root",
206
+ detail: provider,
207
+ message:
208
+ `Project Codex config sets model_provider = "${provider}" (${rel}). `
209
+ + "Use global ~/.codex/config.toml for OpenCodex routing instead of a project-local provider override.",
210
+ }];
211
+ }
212
+
213
+ /** profile/model_provider that selects an already-flagged [model_providers.X] table is one bypass, not two. */
214
+ export function dedupeRelatedProjectCodexWarnings(
215
+ warnings: ProjectCodexConfigWarning[],
216
+ ): ProjectCodexConfigWarning[] {
217
+ const providerTables = new Set(
218
+ warnings.filter(w => w.code === "model_providers_table").map(w => w.detail),
219
+ );
220
+ if (providerTables.size === 0) return warnings;
221
+ return warnings.filter(w => {
222
+ if (w.code === "profile_selector" && providerTables.has(w.detail)) return false;
223
+ if (w.code === "model_provider_root" && providerTables.has(w.detail)) return false;
224
+ return true;
225
+ });
226
+ }
227
+
228
+ /**
229
+ * Render a path under the user's home as `~/...` for warning display.
230
+ * Platform-correct containment (devlog 260715_cross_platform_audit/030): the old
231
+ * lowercase prefix match had no component boundary (`C:\Users\bob2` rendered as
232
+ * inside `~` for home `C:\Users\bob`) and case-folded on case-sensitive POSIX
233
+ * filesystems. `relative()` carries the right case semantics per platform; reject
234
+ * parent (`..`, `..\x`) and cross-drive (absolute) results.
235
+ */
236
+ export function relPath(
237
+ abs: string,
238
+ pathApi: Pick<typeof path, "relative" | "sep" | "isAbsolute"> = path,
239
+ ): string {
240
+ const home = process.env.USERPROFILE ?? process.env.HOME ?? "";
241
+ if (!home) return abs;
242
+ const rel = pathApi.relative(home, abs);
243
+ if (rel === "") return "~";
244
+ if (rel === ".." || rel.startsWith(`..${pathApi.sep}`) || pathApi.isAbsolute(rel)) return abs;
245
+ return `~/${rel.replace(/\\/g, "/")}`;
246
+ }
247
+
248
+ export function discoverProjectCodexConfigPaths(options: {
249
+ cwd?: string;
250
+ codexConfigPath?: string;
251
+ maxWalkParents?: number;
252
+ } = {}): string[] {
253
+ const found = new Set<string>();
254
+ const codexConfigPath = options.codexConfigPath ?? resolveCodexConfigPath();
255
+ const addIfExists = (projectRoot: string) => {
256
+ const path = join(resolve(projectRoot), ".codex", "config.toml");
257
+ if (existsSync(path)) found.add(path);
258
+ };
259
+
260
+ let cwd = resolve(options.cwd ?? process.cwd());
261
+ const maxWalk = options.maxWalkParents ?? 12;
262
+ for (let depth = 0; depth < maxWalk; depth++) {
263
+ addIfExists(cwd);
264
+ const parent = dirname(cwd);
265
+ if (parent === cwd) break;
266
+ cwd = parent;
267
+ }
268
+
269
+ if (existsSync(codexConfigPath)) {
270
+ try {
271
+ const global = readFileSync(codexConfigPath, "utf-8");
272
+ for (const projectPath of parseTrustedProjectPathsFromCodexConfig(global)) {
273
+ addIfExists(projectPath);
274
+ }
275
+ } catch {
276
+ /* ignore unreadable global config */
277
+ }
278
+ }
279
+
280
+ return [...found];
281
+ }
282
+
283
+ export function collectProjectCodexConfigWarnings(options: {
284
+ cwd?: string;
285
+ codexConfigPath?: string;
286
+ requireOpencodexRouting?: boolean;
287
+ } = {}): ProjectCodexConfigWarning[] {
288
+ const codexConfigPath = options.codexConfigPath ?? resolveCodexConfigPath();
289
+ const requireRouting = options.requireOpencodexRouting ?? true;
290
+ if (requireRouting && !isGlobalOpencodexRoutingActive(codexConfigPath)) return [];
291
+
292
+ const warnings: ProjectCodexConfigWarning[] = [];
293
+ for (const path of discoverProjectCodexConfigPaths({ cwd: options.cwd, codexConfigPath })) {
294
+ try {
295
+ const content = readFileSync(path, "utf-8");
296
+ warnings.push(...analyzeProjectCodexConfig(content, path));
297
+ } catch {
298
+ /* skip unreadable project config */
299
+ }
300
+ }
301
+ return warnings;
302
+ }
303
+
304
+ export function invalidateProjectConfigDiagnosticsCache(): void {
305
+ diagnosticsCache = null;
306
+ }
307
+
308
+ export function getCachedProjectConfigDiagnostics(): {
309
+ warnings: ProjectCodexConfigWarning[];
310
+ grouped: ProjectCodexConfigWarningGroup[];
311
+ } {
312
+ const now = Date.now();
313
+ if (!diagnosticsCache || now - diagnosticsCache.at > DIAGNOSTICS_CACHE_TTL_MS) {
314
+ diagnosticsCache = {
315
+ at: now,
316
+ warnings: collectProjectCodexConfigWarnings().map(warning => ({
317
+ ...warning,
318
+ path: truncateRetainedUtf8(warning.path, MAX_DIAGNOSTIC_VALUE_BYTES),
319
+ detail: truncateRetainedUtf8(warning.detail, MAX_DIAGNOSTIC_VALUE_BYTES),
320
+ ...(warning.profileName === undefined ? {} : { profileName: truncateRetainedUtf8(warning.profileName, MAX_DIAGNOSTIC_VALUE_BYTES) }),
321
+ message: truncateRetainedUtf8(warning.message, MAX_DIAGNOSTIC_VALUE_BYTES),
322
+ })),
323
+ };
324
+ }
325
+ const warnings = diagnosticsCache.warnings;
326
+ return { warnings, grouped: groupProjectCodexConfigWarningsByPath(warnings) };
327
+ }
328
+
329
+ export function summarizeProjectCodexIssue(warning: ProjectCodexConfigWarning): string {
330
+ switch (warning.code) {
331
+ case "model_providers_table":
332
+ return `[model_providers.${warning.detail}]`;
333
+ case "profile_selector":
334
+ return warning.profileName ? `profile="${warning.profileName}"` : `model_provider="${warning.detail}"`;
335
+ case "model_provider_root":
336
+ return `model_provider="${warning.detail}"`;
337
+ }
338
+ }
339
+
340
+ function humanizeProviderDetail(detail: string): string {
341
+ if (detail === "opencode_go") return "OpenCode Go";
342
+ if (detail.startsWith("opencode")) return "OpenCode";
343
+ if (detail === "opencodex") return "OpenCodex";
344
+ return detail;
345
+ }
346
+
347
+ /** Short "why" line: what this project config overrides and where traffic goes instead. */
348
+ export function explainProjectConfigBypass(warnings: ProjectCodexConfigWarning[]): string {
349
+ const targets = [...new Set(warnings.map(w => humanizeProviderDetail(w.detail)))];
350
+ const via = targets.length === 1 ? targets[0]! : targets.join(" / ");
351
+ return `Overrides OpenCodex — Codex uses ${via} for this repo instead of the proxy (~/.codex/config.toml).`;
352
+ }
353
+
354
+ export interface ProjectCodexConfigWarningGroup {
355
+ path: string;
356
+ issues: string[];
357
+ bypass: string;
358
+ }
359
+
360
+ export function groupProjectCodexConfigWarningsByPath(
361
+ warnings: ProjectCodexConfigWarning[],
362
+ ): ProjectCodexConfigWarningGroup[] {
363
+ const grouped = new Map<string, ProjectCodexConfigWarning[]>();
364
+ for (const warning of warnings) {
365
+ const list = grouped.get(warning.path) ?? [];
366
+ list.push(warning);
367
+ grouped.set(warning.path, list);
368
+ }
369
+ return [...grouped.entries()].map(([path, pathWarnings]) => ({
370
+ path,
371
+ issues: pathWarnings.map(summarizeProjectCodexIssue),
372
+ bypass: explainProjectConfigBypass(pathWarnings),
373
+ }));
374
+ }
375
+
376
+ export function formatProjectCodexConfigWarningsForDoctor(warnings: ProjectCodexConfigWarning[]): string[] {
377
+ const grouped = groupProjectCodexConfigWarningsByPath(warnings);
378
+ if (grouped.length === 0) return [];
379
+ const lines: string[] = [];
380
+ for (const { path, issues, bypass } of grouped) {
381
+ lines.push(` -- ${relPath(path)} — ${issues.join(", ")}`);
382
+ lines.push(` ${bypass}`);
383
+ }
384
+ lines.push(" fix: remove those entries so OpenCodex proxy routing applies in this project");
385
+ return lines;
386
+ }
387
+
388
+ export function formatProjectCodexConfigWarningsForConsole(warnings: ProjectCodexConfigWarning[]): string[] {
389
+ const grouped = groupProjectCodexConfigWarningsByPath(warnings);
390
+ if (grouped.length === 0) return [];
391
+ const lines = ["⚠️ Project Codex config bypasses OpenCodex:"];
392
+ for (const { path, issues, bypass } of grouped) {
393
+ lines.push(` ${relPath(path)} — ${issues.join(", ")}`);
394
+ lines.push(` ${bypass}`);
395
+ }
396
+ lines.push(" fix: remove those entries so OpenCodex proxy routing applies in this project");
397
+ return lines;
398
+ }
399
+
400
+ export function printProjectCodexConfigWarnings(
401
+ log?: Pick<Console, "log"> | null,
402
+ options?: Parameters<typeof collectProjectCodexConfigWarnings>[0],
403
+ ): ProjectCodexConfigWarning[] {
404
+ const warnings = collectProjectCodexConfigWarnings(options);
405
+ if (log) {
406
+ for (const line of formatProjectCodexConfigWarningsForConsole(warnings)) {
407
+ log.log(line);
408
+ }
409
+ }
410
+ return warnings;
411
+ }