@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,255 @@
1
+ import { createHash } from "node:crypto";
2
+ import type {
3
+ OcxAssistantContentPart,
4
+ OcxContentPart,
5
+ OcxMessage,
6
+ OcxParsedRequest,
7
+ OcxToolCall,
8
+ OcxToolResultMessage,
9
+ } from "../../types";
10
+ import { isAllowedToolChoice, namespacedToolName, toolChoiceAliases, type OcxTool, type OcxToolChoice } from "../../types";
11
+ import type { CursorRequestMessage, CursorRunRequest } from "./types";
12
+ import { cursorWireModelSelection, type CursorRoutingLevel } from "./discovery";
13
+ import { cursorEffortSuffix, cursorWireModelIdWithEffort } from "./effort-map";
14
+ import {
15
+ cursorMcpToolEncodedSize,
16
+ cursorMcpToolsEncodedSize,
17
+ cursorToolAllowedByChoice,
18
+ cursorToolChoiceAliases,
19
+ cursorToolWireName,
20
+ cursorToolsForActivePrompt,
21
+ isBareCodexShellBridgeTool,
22
+ } from "./tool-definitions";
23
+ import { lookupCursorThreadConversation } from "./thread-continuity";
24
+
25
+ /** Probe-verified Cursor Connect boundaries, with byte headroom for the enclosing field. */
26
+ export const CURSOR_TOOL_COUNT_LIMIT = 330;
27
+ export const CURSOR_TOOL_BYTES_LIMIT = 120_000;
28
+
29
+ interface CursorToolBudgetResult {
30
+ tools: OcxTool[];
31
+ omitted: OcxTool[];
32
+ }
33
+
34
+ function explicitlySelectedNames(choice: OcxToolChoice | undefined): Set<string> {
35
+ if (!choice || choice === "auto" || choice === "none" || choice === "required") return new Set();
36
+ return new Set("name" in choice ? [choice.name] : isAllowedToolChoice(choice) ? choice.allowedTools : []);
37
+ }
38
+
39
+ function toolPriority(tool: OcxTool, selectedNames: ReadonlySet<string>): number {
40
+ // Shell bridge and apply_patch outrank unrelated allowed_tools entries so a large
41
+ // selected filler cannot starve the Codex execution path during truncation (#399).
42
+ if (isBareCodexShellBridgeTool(tool)) return 0;
43
+ if (!tool.namespace && tool.name === "apply_patch") return 1;
44
+ if (cursorToolChoiceAliases(tool).some(name => selectedNames.has(name))) return 2;
45
+ if (tool.loadedFromToolSearch) return 3;
46
+ if (!tool.namespace) return 4;
47
+ return 5;
48
+ }
49
+
50
+ function isPinnedCursorTool(tool: OcxTool, selectedNames: ReadonlySet<string>): boolean {
51
+ return toolPriority(tool, selectedNames) <= 2;
52
+ }
53
+
54
+ /**
55
+ * Select one catalog used by both Cursor protobuf registration and call recognition.
56
+ * Actual McpTools serialization is measured after every candidate so descriptions,
57
+ * names, provider identifiers, and schemas all count toward the byte ceiling.
58
+ */
59
+ export function applyCursorToolBudget(
60
+ tools: readonly OcxTool[] | undefined,
61
+ toolChoice: OcxToolChoice | undefined,
62
+ ): CursorToolBudgetResult {
63
+ const catalog = tools ?? [];
64
+ const eligible = catalog.filter(tool => cursorToolAllowedByChoice(tool, toolChoice, catalog));
65
+ if (
66
+ eligible.length <= CURSOR_TOOL_COUNT_LIMIT
67
+ && cursorMcpToolsEncodedSize(eligible, toolChoice) <= CURSOR_TOOL_BYTES_LIMIT
68
+ ) return { tools: [...eligible], omitted: [] };
69
+
70
+ const selectedNames = explicitlySelectedNames(toolChoice);
71
+ const candidates = eligible
72
+ .map((tool, index) => ({ tool, index, priority: toolPriority(tool, selectedNames) }))
73
+ .sort((a, b) => a.priority - b.priority || a.index - b.index);
74
+ const kept: OcxTool[] = [];
75
+ const keptSet = new Set<OcxTool>();
76
+ let keptBytes = 0;
77
+
78
+ const tryKeep = (tool: OcxTool): boolean => {
79
+ if (keptSet.has(tool) || kept.length >= CURSOR_TOOL_COUNT_LIMIT) return keptSet.has(tool);
80
+ // Repeated protobuf message fields serialize as concatenated tag/length/value entries,
81
+ // so each one-entry wrapper size is the exact additive contribution to McpTools.
82
+ const candidateBytes = cursorMcpToolEncodedSize(tool, toolChoice);
83
+ if (keptBytes + candidateBytes > CURSOR_TOOL_BYTES_LIMIT) return false;
84
+ kept.push(tool);
85
+ keptSet.add(tool);
86
+ keptBytes += candidateBytes;
87
+ return true;
88
+ };
89
+
90
+ // Phase 1: selected tools + shell bridge + apply_patch (priority <= 2).
91
+ // Pins are admitted before filler so a crowded catalog cannot drop the Codex execution path (#399).
92
+ for (const candidate of candidates) {
93
+ if (!isPinnedCursorTool(candidate.tool, selectedNames)) continue;
94
+ tryKeep(candidate.tool);
95
+ }
96
+
97
+ // Phase 2: remaining tools by priority.
98
+ for (const candidate of candidates) {
99
+ tryKeep(candidate.tool);
100
+ }
101
+
102
+ return {
103
+ tools: eligible.filter(tool => keptSet.has(tool)),
104
+ omitted: eligible.filter(tool => !keptSet.has(tool)),
105
+ };
106
+ }
107
+
108
+ function catalogLimitNote(kept: readonly OcxTool[], omitted: readonly OcxTool[]): string | undefined {
109
+ if (omitted.length === 0) return undefined;
110
+ const recoverable = kept.some(tool => tool.toolSearch || cursorToolWireName(tool) === "tool_search");
111
+ const names = omitted.slice(0, 12).map(cursorToolWireName);
112
+ const remainder = omitted.length - names.length;
113
+ const omittedSummary = `${names.join(", ")}${remainder > 0 ? `, and ${remainder} more` : ""}`;
114
+ return recoverable
115
+ ? `[opencodex] Cursor's transport limit allows ${kept.length} of ${kept.length + omitted.length} client tools this turn. Omitted: ${omittedSummary}. Use tool_search for a needed omitted tool; tools returned by tool_search are prioritized on the next turn.`
116
+ : `[opencodex] Cursor's transport limit allows ${kept.length} of ${kept.length + omitted.length} client tools this turn. Omitted and unavailable this turn: ${omittedSummary}.`;
117
+ }
118
+
119
+ /**
120
+ * Resolve a `cursor/<model>` selection + Codex reasoning effort to the actual Cursor model id. Cursor
121
+ * encodes the effort as a per-model suffix (`claude-4.6-opus-high`); `cursorEffortSuffix` picks the
122
+ * right tier for that specific model (literal pass-through, with rank clamp fallback) or
123
+ * `undefined` for non-reasoning models like `composer-2.5`. A fully-qualified id (one that isn't a
124
+ * known effort base) passes through unchanged.
125
+ */
126
+ function normalizeCursorModelId(modelId: string, reasoning?: string): { modelId: string; routingLevel?: CursorRoutingLevel } {
127
+ const selection = cursorWireModelSelection(modelId);
128
+ const id = selection.modelId;
129
+ const suffix = cursorEffortSuffix(id, reasoning);
130
+ return { ...selection, modelId: suffix ? cursorWireModelIdWithEffort(id, suffix) : id };
131
+ }
132
+
133
+ function contentPartToText(part: OcxContentPart | OcxAssistantContentPart): string | undefined {
134
+ switch (part.type) {
135
+ case "text":
136
+ return part.text;
137
+ case "thinking":
138
+ return part.thinking;
139
+ case "image":
140
+ return `[image input unsupported by Cursor adapter phase 3: ${part.detail ?? "auto"}]`;
141
+ case "toolCall":
142
+ // Cursor does not accept OpenAI Responses assistant tool-call parts as native history here.
143
+ // Rendering them as visible "[tool_call]" text leaks synthetic protocol markers back into
144
+ // model output and can halt multi-tool continuations. The paired tool result carries the
145
+ // call id/name/output Cursor needs for the next action.
146
+ return undefined;
147
+ }
148
+ }
149
+
150
+ function toolResultToText(message: OcxToolResultMessage): string {
151
+ return [
152
+ "[tool_result]",
153
+ `call_id: ${message.toolCallId}`,
154
+ `name: ${namespacedToolName(message.toolNamespace, message.toolName)}`,
155
+ `is_error: ${message.isError}`,
156
+ "output:",
157
+ contentToText(message.content),
158
+ ].join("\n");
159
+ }
160
+
161
+ function contentToText(content: string | readonly (OcxContentPart | OcxAssistantContentPart)[]): string {
162
+ if (typeof content === "string") return content;
163
+ return content
164
+ .map(contentPartToText)
165
+ .filter((value): value is string => typeof value === "string" && value.length > 0)
166
+ .join("\n");
167
+ }
168
+
169
+ function requestMessage(message: OcxMessage): CursorRequestMessage | undefined {
170
+ switch (message.role) {
171
+ case "user":
172
+ case "developer":
173
+ return { role: message.role, content: contentToText(message.content) };
174
+ case "assistant":
175
+ return { role: "assistant", content: contentToText(message.content) };
176
+ case "toolResult":
177
+ return {
178
+ role: "tool",
179
+ content: toolResultToText(message),
180
+ };
181
+ }
182
+ }
183
+
184
+ export function generatedCursorConversationId(): string {
185
+ return `cursor_${crypto.randomUUID().replace(/-/g, "")}`;
186
+ }
187
+
188
+ /** Derive an opaque provider-scoped Cursor id from the upstream client's conversation identity. */
189
+ export function cursorConversationIdFromClientThread(threadId: string, identityScope?: string): string {
190
+ const digest = createHash("sha256")
191
+ .update("ocx:cursor:thread:")
192
+ .update(identityScope?.trim() || "local")
193
+ .update("\0")
194
+ .update(threadId)
195
+ .digest("hex")
196
+ .slice(0, 32);
197
+ return `cursor_${digest}`;
198
+ }
199
+
200
+ /**
201
+ * Resolve the Cursor conversation id for this turn.
202
+ * Priority: force-fresh → isolate helper → remembered → thread override → client thread → random.
203
+ * Never use OpenAI Responses `previous_response_id` (resp_*) or shared `prompt_cache_key`
204
+ * (cache-cohort fingerprint, not conversation ownership).
205
+ */
206
+ export function resolveCursorConversationId(
207
+ parsed: OcxParsedRequest,
208
+ _wireModelId: string,
209
+ options: CreateCursorRequestOptions = {},
210
+ ): string {
211
+ if (options.forceFreshConversation === true) return generatedCursorConversationId();
212
+ // Helper/shadow/compaction turns must not append into the parent's Cursor conversation,
213
+ // even when previous_response_id restored the parent's remembered id.
214
+ if (parsed._cursorIsolateConversation === true) return generatedCursorConversationId();
215
+ if (parsed._cursorConversationId) return parsed._cursorConversationId;
216
+ const threadId = parsed._clientThreadId?.trim();
217
+ if (threadId) {
218
+ const recovered = lookupCursorThreadConversation(threadId, parsed._cursorIdentityScope);
219
+ if (recovered) return recovered;
220
+ return cursorConversationIdFromClientThread(threadId, parsed._cursorIdentityScope);
221
+ }
222
+ return generatedCursorConversationId();
223
+ }
224
+
225
+ export interface CreateCursorRequestOptions {
226
+ /** Force a brand-new Cursor conversation id even when remembered state exists. */
227
+ forceFreshConversation?: boolean;
228
+ }
229
+
230
+ export function createCursorRequest(
231
+ parsed: OcxParsedRequest,
232
+ options: CreateCursorRequestOptions = {},
233
+ ): CursorRunRequest {
234
+ const messages = parsed.context.messages
235
+ .map(requestMessage)
236
+ .filter((message): message is CursorRequestMessage => !!message && message.content.length > 0);
237
+ const activeText = [...messages].reverse().find(message => message.role === "user" || message.role === "developer")?.content ?? "";
238
+ const visibleTools = cursorToolsForActivePrompt(parsed.context.tools, activeText, parsed.options.toolChoice);
239
+ const budget = applyCursorToolBudget(visibleTools, parsed.options.toolChoice);
240
+ const limitNote = catalogLimitNote(budget.tools, budget.omitted);
241
+ const model = normalizeCursorModelId(parsed.modelId, parsed.options.reasoning);
242
+ return {
243
+ modelId: model.modelId,
244
+ ...(model.routingLevel ? { routingLevel: model.routingLevel } : {}),
245
+ conversationId: resolveCursorConversationId(parsed, model.modelId, options),
246
+ system: [...(parsed.context.systemPrompt ?? []), ...(limitNote ? [limitNote] : [])],
247
+ messages,
248
+ rawMessages: parsed.context.messages,
249
+ ...(parsed._compactionRequest === true || parsed._contextCompactionBoundary === true ? { contextUsageReset: true } : {}),
250
+ ...(parsed._compactionRequest === true ? { contextUsageStoreCheckpoints: false } : {}),
251
+ ...(budget.tools.length ? { tools: budget.tools } : {}),
252
+ ...(parsed.options.toolChoice ? { toolChoice: parsed.options.toolChoice } : {}),
253
+ ...(parsed.options.parallelToolCalls !== undefined ? { parallelToolCalls: parsed.options.parallelToolCalls } : {}),
254
+ };
255
+ }
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Bounded in-memory overrides for Cursor conversation continuity.
3
+ *
4
+ * When an invalid_argument recovery mints a fresh conversation id for a store:false
5
+ * thread-identified client, later turns without previous_response_id must reuse that
6
+ * recovered id instead of recomputing the stale deterministic thread hash.
7
+ */
8
+
9
+ const OVERRIDE_TTL_MS = 60 * 60 * 1000;
10
+ const OVERRIDE_MAX_ENTRIES = 2048;
11
+
12
+ const overrides = new Map<string, { conversationId: string; updatedAt: number }>();
13
+
14
+ function now(): number {
15
+ return Date.now();
16
+ }
17
+
18
+ function prune(at: number): void {
19
+ for (const [key, entry] of overrides) {
20
+ if (at - entry.updatedAt > OVERRIDE_TTL_MS) overrides.delete(key);
21
+ else break; // Map iterates insertion order; refreshed entries are moved to the end
22
+ }
23
+ while (overrides.size > OVERRIDE_MAX_ENTRIES) {
24
+ const oldest = overrides.keys().next().value;
25
+ if (oldest === undefined) break;
26
+ overrides.delete(oldest);
27
+ }
28
+ }
29
+
30
+ /** Scope key for a client thread, optionally namespaced by authenticated tenant/operator identity. */
31
+ export function cursorThreadScopeKey(threadId: string, identityScope?: string): string {
32
+ const scope = identityScope?.trim() || "local";
33
+ return `${scope}\0${threadId}`;
34
+ }
35
+
36
+ export function rememberCursorThreadConversation(
37
+ threadId: string,
38
+ conversationId: string,
39
+ identityScope?: string,
40
+ ): void {
41
+ const key = cursorThreadScopeKey(threadId, identityScope);
42
+ const at = now();
43
+ overrides.delete(key);
44
+ overrides.set(key, { conversationId, updatedAt: at });
45
+ prune(at);
46
+ }
47
+
48
+ export function lookupCursorThreadConversation(
49
+ threadId: string,
50
+ identityScope?: string,
51
+ ): string | undefined {
52
+ const key = cursorThreadScopeKey(threadId, identityScope);
53
+ const entry = overrides.get(key);
54
+ if (!entry) return undefined;
55
+ const at = now();
56
+ if (at - entry.updatedAt > OVERRIDE_TTL_MS) {
57
+ overrides.delete(key);
58
+ return undefined;
59
+ }
60
+ overrides.delete(key);
61
+ overrides.set(key, { conversationId: entry.conversationId, updatedAt: at });
62
+ return entry.conversationId;
63
+ }
64
+
65
+ export function clearCursorThreadContinuityForTests(): void {
66
+ overrides.clear();
67
+ }