@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,62 @@
1
+ /**
2
+ * Claude auth-mode resolution.
3
+ *
4
+ * The resolver answers exactly ONE question: does the opencodex-owned dummy token
5
+ * (`ANTHROPIC_AUTH_TOKEN=opencodex-proxy`) get injected? That is narrower than "how
6
+ * will Claude authenticate" — native passthrough additionally needs an `sk-ant-`
7
+ * credential on the incoming request — so the field is `markerMode`, not
8
+ * `effectiveAuthMode` (devlog/_plan/260726_claude_auth_auto/002 R2-1).
9
+ *
10
+ * The admission-key axis is separate and untouched: when the proxy requires an
11
+ * admission key, `buildClaudeEnv` injects it regardless of mode.
12
+ */
13
+ import type { OcxConfig } from "../types";
14
+ import type { AuthDetectResult, AuthSourceId } from "./auth-detect";
15
+
16
+ export type MarkerMode = "proxy" | "subscription";
17
+
18
+ export type AuthModeOrigin = "manual" | "auto-present" | "auto-absent" | "auto-unknown";
19
+
20
+ export interface ResolvedAuthMode {
21
+ /** Does the owned dummy marker get injected. NOT a claim about native auth. */
22
+ markerMode: MarkerMode;
23
+ origin: AuthModeOrigin;
24
+ /** The detector source that proved presence (origin auto-present only). */
25
+ foundBy?: AuthSourceId;
26
+ detection: AuthDetectResult;
27
+ }
28
+
29
+ /**
30
+ * Reads `authMode`; never writes it. An explicit "proxy"/"subscription" bypasses the
31
+ * detector forever, which is what makes a manual choice stick across auth changes.
32
+ *
33
+ * `unknown` resolves to subscription — the historical default — because flipping a
34
+ * subscriber into proxy mode on a failed read (denied keychain, unreadable file) is
35
+ * the worst outcome this feature can produce.
36
+ */
37
+ export function resolveClaudeAuthMode(config: OcxConfig, detection: AuthDetectResult): ResolvedAuthMode {
38
+ const authMode = config.claudeCode?.authMode;
39
+ if (authMode === "proxy") return { markerMode: "proxy", origin: "manual", detection };
40
+ if (authMode === "subscription") return { markerMode: "subscription", origin: "manual", detection };
41
+
42
+ switch (detection.presence) {
43
+ case "present":
44
+ return {
45
+ markerMode: "subscription",
46
+ origin: "auto-present",
47
+ ...(detection.foundBy ? { foundBy: detection.foundBy } : {}),
48
+ detection,
49
+ };
50
+ case "absent":
51
+ return { markerMode: "proxy", origin: "auto-absent", detection };
52
+ default:
53
+ return { markerMode: "subscription", origin: "auto-unknown", detection };
54
+ }
55
+ }
56
+
57
+ /** The three-state intent as the API and GUI express it. */
58
+ export type AuthModeIntent = "auto" | "proxy" | "subscription";
59
+
60
+ export function authModeIntent(config: OcxConfig): AuthModeIntent {
61
+ return config.claudeCode?.authMode ?? "auto";
62
+ }
@@ -0,0 +1,189 @@
1
+ /**
2
+ * Claude-surface context-window map + effective model-env computation
3
+ * (devlog/260712_cli_context_cache/010 B2, audit R2#1/R3#1/R3#4/R4#3).
4
+ *
5
+ * The map registers EVERY selector form a Claude Code model slot might store —
6
+ * bare native slug, provider/id, desktop3p alias, legacy claude-ocx-* alias —
7
+ * with first-wins dedupe (mirrors the desktop3p registry collision policy).
8
+ * Values are authoritative context windows only (native override table /
9
+ * adapter-reported CatalogModel.contextWindow); nothing is guessed.
10
+ */
11
+ import { aliasForNative, aliasForRoute } from "./alias";
12
+ import { desktop3pAlias } from "./desktop-3p";
13
+ import { nativeOpenAiContextWindow, type CatalogModel } from "../codex/catalog";
14
+
15
+ const ONE_MILLION = 1_000_000;
16
+
17
+ /** Auto-context defaults (devlog 260712 020, user-approved). */
18
+ export const AUTO_COMPACT_WINDOW_DEFAULT = 350_000;
19
+ export const AUTO_CONTEXT_FLOOR = 200_000;
20
+ /** Binary-verified accepted range for CLAUDE_CODE_AUTO_COMPACT_WINDOW (2.1.207: pSo=1e5, yDs=1e6). */
21
+ export const AUTO_COMPACT_WINDOW_MIN = 100_000;
22
+ export const AUTO_COMPACT_WINDOW_MAX = ONE_MILLION;
23
+
24
+ /** Case-insensitive [1m] marker helpers — the CLI matches /\[1m\]/i (audit 021 #7). */
25
+ const ONE_M_MARKER_RE = /\[1m\]$/i;
26
+ export function hasOneMillionMarker(value: string): boolean {
27
+ return ONE_M_MARKER_RE.test(value);
28
+ }
29
+ export function stripOneMillionMarker(value: string): string {
30
+ return value.replace(ONE_M_MARKER_RE, "");
31
+ }
32
+
33
+ export interface AutoContextMode {
34
+ enabled: boolean;
35
+ /** Effective CLAUDE_CODE_AUTO_COMPACT_WINDOW value (tokens). */
36
+ compactWindow: number;
37
+ }
38
+
39
+ export const AUTO_CONTEXT_OFF: AutoContextMode = { enabled: false, compactWindow: AUTO_COMPACT_WINDOW_DEFAULT };
40
+
41
+ interface AutoContextConfigSlice {
42
+ autoContext?: boolean;
43
+ autoCompactWindow?: number;
44
+ maxContextTokens?: number;
45
+ }
46
+
47
+ function inAutoCompactRange(value: number): boolean {
48
+ return Number.isInteger(value) && value >= AUTO_COMPACT_WINDOW_MIN && value <= AUTO_COMPACT_WINDOW_MAX;
49
+ }
50
+
51
+ /**
52
+ * Resolve the auto-context mode from claudeCode config. Disabled when the user
53
+ * turned it off OR when the legacy maxContextTokens override is set — that pair
54
+ * (MAX_CONTEXT_TOKENS + DISABLE_COMPACT) takes rule-1 precedence inside the CLI,
55
+ * making both AUTO_COMPACT_WINDOW and [1m] accounting inert.
56
+ *
57
+ * `envOverride` is the raw CLAUDE_CODE_AUTO_COMPACT_WINDOW the USER already
58
+ * exported (user-wins injection keeps it): a valid value drives the marking
59
+ * predicate so marker and threshold never separate (audit 021 #2); an invalid
60
+ * value disables auto marking entirely (the CLI would ignore it, leaving marked
61
+ * sub-1M models without their safety net). Out-of-range CONFIG values fall back
62
+ * to the 350k default (the management API rejects them; this guards hand-edits).
63
+ */
64
+ export function resolveAutoContext(claudeCode: AutoContextConfigSlice | undefined, envOverride?: string): AutoContextMode {
65
+ if (claudeCode?.autoContext === false) return AUTO_CONTEXT_OFF;
66
+ const maxCtx = claudeCode?.maxContextTokens;
67
+ if (typeof maxCtx === "number" && Number.isFinite(maxCtx) && maxCtx > 0) return AUTO_CONTEXT_OFF;
68
+ if (typeof envOverride === "string" && envOverride !== "") {
69
+ const parsed = Number(envOverride);
70
+ return inAutoCompactRange(parsed) ? { enabled: true, compactWindow: parsed } : AUTO_CONTEXT_OFF;
71
+ }
72
+ const raw = claudeCode?.autoCompactWindow;
73
+ const compactWindow = typeof raw === "number" && inAutoCompactRange(raw) ? raw : AUTO_COMPACT_WINDOW_DEFAULT;
74
+ return { enabled: true, compactWindow };
75
+ }
76
+
77
+ /**
78
+ * [1m]-marking predicate. Windows >= 1M always mark (CLI accounts exactly 1M).
79
+ * Auto-context additionally marks windows > 200k that can safely host the compact
80
+ * window — marking a model whose real window is BELOW the compact window would put
81
+ * the compaction safety net behind the real API limit (mid-session 400s).
82
+ */
83
+ export function shouldMarkOneMillion(window: number | undefined, auto: AutoContextMode): boolean {
84
+ if (typeof window !== "number" || window <= 0) return false;
85
+ if (window >= ONE_MILLION) return true;
86
+ return auto.enabled && window > AUTO_CONTEXT_FLOOR && window >= auto.compactWindow;
87
+ }
88
+
89
+ export function buildClaudeContextWindows(
90
+ nativeSlugs: readonly string[],
91
+ routedModels: readonly CatalogModel[],
92
+ ): Record<string, number> {
93
+ const out: Record<string, number> = {};
94
+ const put = (key: string | null, value: number) => {
95
+ if (!key) return;
96
+ if (out[key] === undefined) out[key] = value; // first-wins (registry policy)
97
+ };
98
+ for (const slug of nativeSlugs) {
99
+ const window = nativeOpenAiContextWindow(slug);
100
+ if (typeof window !== "number" || window <= 0) continue;
101
+ put(slug, window);
102
+ put(desktop3pAlias("native", slug), window);
103
+ put(aliasForNative(slug), window);
104
+ }
105
+ // Bare routed ids are registered only when unambiguous across providers (audit
106
+ // 021 #5) — natives are registered first, so a native slug always wins the bare key.
107
+ const bareCounts = new Map<string, number>();
108
+ for (const m of routedModels) bareCounts.set(m.id, (bareCounts.get(m.id) ?? 0) + 1);
109
+ for (const m of routedModels) {
110
+ const window = m.contextWindow;
111
+ if (typeof window !== "number" || window <= 0) continue;
112
+ // Anthropic passthrough guard (audit 021 #3): canonical claude ids ride the
113
+ // subscription passthrough — marking a sub-1M one would strap [1m]/1M-beta onto
114
+ // a model that cannot host it. Register anthropic rows only at >=1M.
115
+ if (m.provider === "anthropic" && window < ONE_MILLION) continue;
116
+ put(`${m.provider}/${m.id}`, window);
117
+ put(desktop3pAlias(m.provider, m.id), window);
118
+ put(aliasForRoute(m.provider, m.id), window);
119
+ if (bareCounts.get(m.id) === 1) put(m.id, window);
120
+ }
121
+ return out;
122
+ }
123
+
124
+ /** Strip a trailing [1m] marker before map lookup (selector may already carry it). */
125
+ function bareSelector(value: string): string {
126
+ return stripOneMillionMarker(value);
127
+ }
128
+
129
+ /**
130
+ * Apply the [1m] context-variant marker to a model selector when its authoritative
131
+ * window is >= 1M (Claude Code accounts exactly 1M for the marker; compaction stays
132
+ * alive) — or, in auto-context mode, when the window clears the marking predicate
133
+ * above. Already-marked selectors pass through; unknown selectors stay untouched.
134
+ */
135
+ export function withOneMillionMarker(selector: string | undefined, windows: Record<string, number>, auto: AutoContextMode = AUTO_CONTEXT_OFF): string | undefined {
136
+ if (!selector) return selector;
137
+ if (hasOneMillionMarker(selector)) return selector;
138
+ const window = windows[bareSelector(selector)];
139
+ return shouldMarkOneMillion(window, auto) ? `${selector}[1m]` : selector;
140
+ }
141
+
142
+ export interface ClaudeTierModels {
143
+ opus?: string;
144
+ sonnet?: string;
145
+ haiku?: string;
146
+ fable?: string;
147
+ }
148
+
149
+ /**
150
+ * The exact env map Claude Code consumes for model slots (audit R4#4):
151
+ * ANTHROPIC_MODEL + the four tier defaults + the legacy small-fast alias.
152
+ * effective-haiku contract (audit R1#8): tierModels.haiku ?? smallFastModel, one
153
+ * value injected into BOTH haiku variables.
154
+ */
155
+ export function effectiveModelEnv(
156
+ claudeCode: { model?: string; smallFastModel?: string; tierModels?: ClaudeTierModels; autoContext?: boolean; autoCompactWindow?: number; maxContextTokens?: number } | undefined,
157
+ windows: Record<string, number>,
158
+ autoOverride?: AutoContextMode,
159
+ ): Record<string, string> {
160
+ const out: Record<string, string> = {};
161
+ const auto = autoOverride ?? resolveAutoContext(claudeCode);
162
+ const set = (name: string, value: string | undefined) => {
163
+ const marked = withOneMillionMarker(value, windows, auto);
164
+ if (marked) out[name] = marked;
165
+ };
166
+ set("ANTHROPIC_MODEL", claudeCode?.model);
167
+ set("ANTHROPIC_DEFAULT_OPUS_MODEL", claudeCode?.tierModels?.opus);
168
+ set("ANTHROPIC_DEFAULT_SONNET_MODEL", claudeCode?.tierModels?.sonnet);
169
+ set("ANTHROPIC_DEFAULT_FABLE_MODEL", claudeCode?.tierModels?.fable);
170
+ const effectiveHaiku = claudeCode?.tierModels?.haiku ?? claudeCode?.smallFastModel;
171
+ set("ANTHROPIC_DEFAULT_HAIKU_MODEL", effectiveHaiku);
172
+ set("ANTHROPIC_SMALL_FAST_MODEL", effectiveHaiku);
173
+ return out;
174
+ }
175
+
176
+ /** Shared 3s bounded acquisition (audit R4#3) for context-window sources. */
177
+ export async function boundedContextWindows(
178
+ acquire: () => Promise<Record<string, number>>,
179
+ timeoutMs = 3_000,
180
+ ): Promise<Record<string, number> | null> {
181
+ try {
182
+ return await Promise.race([
183
+ acquire(),
184
+ new Promise<null>(resolve => setTimeout(() => resolve(null), timeoutMs)),
185
+ ]);
186
+ } catch {
187
+ return null;
188
+ }
189
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Write-path validation for the Desktop 3P model list.
3
+ *
4
+ * The request path has its own guards (anthropic-image-guard.ts); this is the
5
+ * config-output counterpart. A bad entry here ships inside a user-visible config file,
6
+ * so it fails LOUD at the write boundary rather than silently producing a config
7
+ * Desktop rejects or mislabels.
8
+ */
9
+ import type { Desktop3pModelEntry } from "./desktop-3p";
10
+
11
+ const NAME_PATTERN = /^claude-[a-z0-9-]+$/;
12
+ const MAX_LABEL_CHARS = 80;
13
+ /** Bracket capability markers must already have been normalized away by displayModelId. */
14
+ const FORBIDDEN_LABEL_CHARS = /[[\]]/;
15
+
16
+ export function assertDesktop3pModelsValid(models: readonly Desktop3pModelEntry[]): void {
17
+ const seen = new Set<string>();
18
+ for (const model of models) {
19
+ if (!NAME_PATTERN.test(model.name)) {
20
+ throw new Error(`Desktop 3P model name is not a valid Claude-shaped id: ${model.name}`);
21
+ }
22
+ // Alias collisions are skipped upstream; if that skip ever regresses, a duplicate
23
+ // must fail here instead of writing a config Desktop cannot decode.
24
+ if (seen.has(model.name)) {
25
+ throw new Error(`Desktop 3P model name duplicated: ${model.name}`);
26
+ }
27
+ seen.add(model.name);
28
+ if (FORBIDDEN_LABEL_CHARS.test(model.labelOverride)) {
29
+ throw new Error(`Desktop 3P label carries a raw capability marker: ${model.labelOverride}`);
30
+ }
31
+ if (model.labelOverride.length > MAX_LABEL_CHARS) {
32
+ throw new Error(`Desktop 3P label exceeds ${MAX_LABEL_CHARS} chars: ${model.labelOverride}`);
33
+ }
34
+ }
35
+ }
@@ -0,0 +1,84 @@
1
+ import { homedir } from "node:os";
2
+ import { posix, win32 } from "node:path";
3
+
4
+ /**
5
+ * Claude Desktop's own configLibrary location, ported from the shipped app bundle.
6
+ *
7
+ * Desktop assembles the directory name at runtime, which is why searching the
8
+ * bundle for the literal "Claude-3p" finds almost nothing (app.asar, v1.18286.0):
9
+ *
10
+ * const Bu = "-3p", zW = "Claude", ND = `${zW}${Bu}`;
11
+ * function GE(){
12
+ * if (process.env.CLAUDE_USER_DATA_DIR) return app.getPath("userData");
13
+ * if (process.platform === "win32" && process.env.LOCALAPPDATA) return join(process.env.LOCALAPPDATA, ND);
14
+ * const t = app.getPath("userData");
15
+ * return t.endsWith(Bu) ? t : `${t}${Bu}`;
16
+ * }
17
+ * function mD(){ return join(GE(), "configLibrary") }
18
+ *
19
+ * So `Claude-3p` is Desktop's correct default, not a mistake to "fix" — but the
20
+ * first two branches were missing here, which is what GitHub #539 actually hit.
21
+ *
22
+ * Resolution is a pure function of (env, platform, home) so tests can exercise the
23
+ * win32 branch on any host: stubbing `process.platform` does NOT propagate to
24
+ * `os.platform()` under Bun, so a platform-sniffing implementation would be
25
+ * untestable in this repo.
26
+ */
27
+ const SUFFIX = "-3p";
28
+ const APP_DIR = `Claude${SUFFIX}`;
29
+
30
+ function joinForPlatform(platform: NodeJS.Platform, ...parts: string[]): string {
31
+ return platform === "win32" ? win32.join(...parts) : posix.join(...parts);
32
+ }
33
+
34
+ export interface DesktopPathInputs {
35
+ env: Record<string, string | undefined>;
36
+ platform: NodeJS.Platform;
37
+ home: string;
38
+ }
39
+
40
+ /** Electron `app.getPath("userData")`: per-platform appData + productName ("Claude"). */
41
+ export function resolveElectronUserData(inputs: DesktopPathInputs): string {
42
+ const { env, platform, home } = inputs;
43
+ if (platform === "win32") {
44
+ const appData = env.APPDATA?.trim();
45
+ return appData ? win32.join(appData, "Claude") : win32.join(home, "AppData", "Roaming", "Claude");
46
+ }
47
+ if (platform === "darwin") return posix.join(home, "Library", "Application Support", "Claude");
48
+ const xdg = env.XDG_CONFIG_HOME?.trim();
49
+ return xdg ? posix.join(xdg, "Claude") : posix.join(home, ".config", "Claude");
50
+ }
51
+
52
+ /** Desktop's userData root, mirroring `GE()` branch for branch. */
53
+ export function resolveUserDataDir(inputs: DesktopPathInputs): string {
54
+ const explicit = inputs.env.CLAUDE_USER_DATA_DIR?.trim();
55
+ // Desktop calls app.setPath("userData", CLAUDE_USER_DATA_DIR) at startup, so this
56
+ // path is used verbatim — notably WITHOUT the "-3p" suffix.
57
+ if (explicit) return explicit;
58
+
59
+ if (inputs.platform === "win32") {
60
+ const localAppData = inputs.env.LOCALAPPDATA?.trim();
61
+ if (localAppData) return win32.join(localAppData, APP_DIR);
62
+ }
63
+
64
+ const root = resolveElectronUserData(inputs);
65
+ // Concatenated, not joined: "Claude-3p" is one path component.
66
+ return root.endsWith(SUFFIX) ? root : `${root}${SUFFIX}`;
67
+ }
68
+
69
+ /**
70
+ * The directory opencodex writes its 3P profile into.
71
+ *
72
+ * OPENCODEX_CLAUDE_DESKTOP_CONFIG_DIR wins over every other branch and is returned
73
+ * verbatim (no `join`), because tests point it straight at a temp directory.
74
+ */
75
+ export function resolveConfigLibraryDir(inputs: DesktopPathInputs): string {
76
+ const override = inputs.env.OPENCODEX_CLAUDE_DESKTOP_CONFIG_DIR?.trim();
77
+ if (override) return override;
78
+ return joinForPlatform(inputs.platform, resolveUserDataDir(inputs), "configLibrary");
79
+ }
80
+
81
+ /** Runtime wrapper. Keep it thin: all branching lives in the pure functions above. */
82
+ export function claudeDesktopConfigLibraryDir(): string {
83
+ return resolveConfigLibraryDir({ env: process.env, platform: process.platform, home: homedir() });
84
+ }