@yansigit/opencodex 2.31.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 (826) hide show
  1. package/AGENTS_INSTALL.md +109 -0
  2. package/LICENSE +21 -0
  3. package/README.md +303 -0
  4. package/assets/architecture.png +0 -0
  5. package/assets/banner.png +0 -0
  6. package/assets/claude-code-models.gif +0 -0
  7. package/assets/codex-app-picker.png +0 -0
  8. package/bin/ocx.mjs +587 -0
  9. package/bin/package-main.mjs +9 -0
  10. package/gui/dist/assets/index-BNJ7r4Gd.js +102 -0
  11. package/gui/dist/assets/index-CGoDO3uO.css +1 -0
  12. package/gui/dist/favicon.png +0 -0
  13. package/gui/dist/icons.svg +24 -0
  14. package/gui/dist/index.html +25 -0
  15. package/gui/dist/logo.png +0 -0
  16. package/gui/dist/provider-icons/alibaba-color.svg +1 -0
  17. package/gui/dist/provider-icons/antigravity-color.svg +1 -0
  18. package/gui/dist/provider-icons/claude-color.svg +1 -0
  19. package/gui/dist/provider-icons/cline-color.svg +16 -0
  20. package/gui/dist/provider-icons/cloudflare-ai-gateway-color.svg +1 -0
  21. package/gui/dist/provider-icons/commandcode-color.svg +1 -0
  22. package/gui/dist/provider-icons/copilot-color.svg +1 -0
  23. package/gui/dist/provider-icons/cursor-color.svg +2 -0
  24. package/gui/dist/provider-icons/deepseek-color.svg +1 -0
  25. package/gui/dist/provider-icons/discord.svg +1 -0
  26. package/gui/dist/provider-icons/firepass-color.svg +1 -0
  27. package/gui/dist/provider-icons/fireworks-color.svg +1 -0
  28. package/gui/dist/provider-icons/gemini-color.svg +1 -0
  29. package/gui/dist/provider-icons/github-copilot-color.svg +1 -0
  30. package/gui/dist/provider-icons/gitlab-duo-color.svg +1 -0
  31. package/gui/dist/provider-icons/grok.svg +1 -0
  32. package/gui/dist/provider-icons/groq-color.svg +1 -0
  33. package/gui/dist/provider-icons/huggingface-color.svg +1 -0
  34. package/gui/dist/provider-icons/kimi-color.svg +1 -0
  35. package/gui/dist/provider-icons/kiro-color.svg +15 -0
  36. package/gui/dist/provider-icons/lm-studio-color.svg +1 -0
  37. package/gui/dist/provider-icons/mistral-color.svg +1 -0
  38. package/gui/dist/provider-icons/moonshot-color.svg +1 -0
  39. package/gui/dist/provider-icons/nvidia-color.svg +1 -0
  40. package/gui/dist/provider-icons/ollama-color.svg +1 -0
  41. package/gui/dist/provider-icons/openai.svg +1 -0
  42. package/gui/dist/provider-icons/opencode.svg +2 -0
  43. package/gui/dist/provider-icons/openrouter-color.svg +1 -0
  44. package/gui/dist/provider-icons/pi.svg +21 -0
  45. package/gui/dist/provider-icons/qianfan-color.svg +1 -0
  46. package/gui/dist/provider-icons/qwen-portal-color.svg +1 -0
  47. package/gui/dist/provider-icons/telegram.svg +1 -0
  48. package/gui/dist/provider-icons/vercel-ai-gateway-color.svg +1 -0
  49. package/gui/dist/provider-icons/vllm-color.svg +1 -0
  50. package/gui/dist/provider-icons/xiaomi-color.svg +1 -0
  51. package/package.json +108 -0
  52. package/src/AGENTS.md +28 -0
  53. package/src/adapters/anthropic-image-guard.ts +251 -0
  54. package/src/adapters/anthropic-image-normalize.ts +518 -0
  55. package/src/adapters/anthropic-output-schema.ts +137 -0
  56. package/src/adapters/anthropic.ts +1327 -0
  57. package/src/adapters/azure.ts +36 -0
  58. package/src/adapters/base.ts +121 -0
  59. package/src/adapters/client-fingerprint.ts +65 -0
  60. package/src/adapters/cline-pass-deepseek-v4-tool-replay.ts +69 -0
  61. package/src/adapters/command-code.ts +601 -0
  62. package/src/adapters/cursor/arg-codec.ts +38 -0
  63. package/src/adapters/cursor/arg-normalize.ts +104 -0
  64. package/src/adapters/cursor/checkpoint-store.ts +303 -0
  65. package/src/adapters/cursor/cursor-errors.ts +288 -0
  66. package/src/adapters/cursor/discovery.ts +333 -0
  67. package/src/adapters/cursor/effort-map.ts +151 -0
  68. package/src/adapters/cursor/exec-policy.ts +88 -0
  69. package/src/adapters/cursor/framing.ts +250 -0
  70. package/src/adapters/cursor/gen/agent_pb.ts +15274 -0
  71. package/src/adapters/cursor/h2-pool.ts +123 -0
  72. package/src/adapters/cursor/http1-bidi.ts +361 -0
  73. package/src/adapters/cursor/images.ts +704 -0
  74. package/src/adapters/cursor/kv-store.ts +52 -0
  75. package/src/adapters/cursor/live-models.ts +269 -0
  76. package/src/adapters/cursor/live-smoke-gate.ts +41 -0
  77. package/src/adapters/cursor/live-transport.ts +1653 -0
  78. package/src/adapters/cursor/mcp-config.ts +42 -0
  79. package/src/adapters/cursor/mcp-manager.ts +333 -0
  80. package/src/adapters/cursor/message-mapper.ts +49 -0
  81. package/src/adapters/cursor/native-exec-common.ts +76 -0
  82. package/src/adapters/cursor/native-exec-desktop.ts +184 -0
  83. package/src/adapters/cursor/native-exec-fs.ts +332 -0
  84. package/src/adapters/cursor/native-exec-mcp.ts +153 -0
  85. package/src/adapters/cursor/native-exec-network.ts +43 -0
  86. package/src/adapters/cursor/native-exec-shell.ts +547 -0
  87. package/src/adapters/cursor/native-exec-tools.ts +118 -0
  88. package/src/adapters/cursor/native-exec.ts +663 -0
  89. package/src/adapters/cursor/protobuf-events.ts +1381 -0
  90. package/src/adapters/cursor/protobuf-request.ts +1032 -0
  91. package/src/adapters/cursor/request-builder.ts +461 -0
  92. package/src/adapters/cursor/thread-continuity.ts +67 -0
  93. package/src/adapters/cursor/tool-definitions.ts +735 -0
  94. package/src/adapters/cursor/tool-result-normalize.ts +92 -0
  95. package/src/adapters/cursor/transport-retry.ts +132 -0
  96. package/src/adapters/cursor/transport.ts +79 -0
  97. package/src/adapters/cursor/types.ts +79 -0
  98. package/src/adapters/cursor.ts +322 -0
  99. package/src/adapters/google-antigravity-hosts.ts +48 -0
  100. package/src/adapters/google-antigravity-replay.ts +827 -0
  101. package/src/adapters/google-antigravity-tools.ts +105 -0
  102. package/src/adapters/google-antigravity-wire.ts +141 -0
  103. package/src/adapters/google-errors.ts +92 -0
  104. package/src/adapters/google-http.ts +460 -0
  105. package/src/adapters/google-tool-schema.ts +238 -0
  106. package/src/adapters/google-truncation.ts +24 -0
  107. package/src/adapters/google-wire-compiler.ts +232 -0
  108. package/src/adapters/google.ts +1377 -0
  109. package/src/adapters/identity.ts +77 -0
  110. package/src/adapters/image.ts +23 -0
  111. package/src/adapters/kiro-constants.ts +16 -0
  112. package/src/adapters/kiro-errors.ts +208 -0
  113. package/src/adapters/kiro-events.ts +197 -0
  114. package/src/adapters/kiro-images.ts +129 -0
  115. package/src/adapters/kiro-retry.ts +312 -0
  116. package/src/adapters/kiro-thinking.ts +112 -0
  117. package/src/adapters/kiro-tool-fallback.ts +36 -0
  118. package/src/adapters/kiro-tools.ts +224 -0
  119. package/src/adapters/kiro-truncation.ts +33 -0
  120. package/src/adapters/kiro-wire.ts +129 -0
  121. package/src/adapters/kiro.ts +1936 -0
  122. package/src/adapters/mimo-free.ts +280 -0
  123. package/src/adapters/openai-chat-url.ts +11 -0
  124. package/src/adapters/openai-chat.ts +1980 -0
  125. package/src/adapters/openai-responses-url.ts +16 -0
  126. package/src/adapters/openai-responses.ts +1911 -0
  127. package/src/adapters/registry.ts +175 -0
  128. package/src/adapters/responses-tool-schema.ts +67 -0
  129. package/src/adapters/run-turn-queue.ts +114 -0
  130. package/src/adapters/tool-call-id.ts +119 -0
  131. package/src/adapters/tool-catalog-nudge.ts +154 -0
  132. package/src/adapters/upstream-http-error.ts +48 -0
  133. package/src/adapters/xai-web-search.ts +185 -0
  134. package/src/bridge.ts +1986 -0
  135. package/src/chat/inbound.ts +319 -0
  136. package/src/chat/outbound.ts +821 -0
  137. package/src/claude/agents-inject.ts +266 -0
  138. package/src/claude/alias.ts +149 -0
  139. package/src/claude/auth-detect.ts +229 -0
  140. package/src/claude/auth-mode-migration.ts +32 -0
  141. package/src/claude/auth-mode.ts +62 -0
  142. package/src/claude/context-windows.ts +205 -0
  143. package/src/claude/desktop-3p-guard.ts +35 -0
  144. package/src/claude/desktop-3p-paths.ts +84 -0
  145. package/src/claude/desktop-3p.ts +615 -0
  146. package/src/claude/desktop-health.ts +26 -0
  147. package/src/claude/desktop-profile.ts +263 -0
  148. package/src/claude/gateway-cache.ts +107 -0
  149. package/src/claude/inbound-debug.ts +163 -0
  150. package/src/claude/inbound.ts +578 -0
  151. package/src/claude/model-info.ts +174 -0
  152. package/src/claude/outbound.ts +926 -0
  153. package/src/cli/access.ts +108 -0
  154. package/src/cli/account-api.ts +302 -0
  155. package/src/cli/account-auth.ts +250 -0
  156. package/src/cli/account-catalog-refresh.ts +14 -0
  157. package/src/cli/account-extended.ts +737 -0
  158. package/src/cli/account-main.ts +317 -0
  159. package/src/cli/account.ts +299 -0
  160. package/src/cli/agent-driven.ts +70 -0
  161. package/src/cli/agent.ts +290 -0
  162. package/src/cli/catalog-prewarm.ts +27 -0
  163. package/src/cli/claude-agent-startup-sync.ts +73 -0
  164. package/src/cli/claude-desktop.ts +213 -0
  165. package/src/cli/claude.ts +355 -0
  166. package/src/cli/codex-log-guard-doctor.ts +103 -0
  167. package/src/cli/codex-shim-autorestore.ts +47 -0
  168. package/src/cli/codex-shim-readiness.ts +76 -0
  169. package/src/cli/combo.ts +127 -0
  170. package/src/cli/config-command.ts +209 -0
  171. package/src/cli/debug.ts +228 -0
  172. package/src/cli/dispatch.ts +585 -0
  173. package/src/cli/doctor.ts +1202 -0
  174. package/src/cli/ensure-desired-integrations.ts +152 -0
  175. package/src/cli/export-command.ts +213 -0
  176. package/src/cli/help.ts +101 -0
  177. package/src/cli/index.ts +973 -0
  178. package/src/cli/init.ts +211 -0
  179. package/src/cli/integrations.ts +260 -0
  180. package/src/cli/interactive-confirm.ts +133 -0
  181. package/src/cli/lab.ts +607 -0
  182. package/src/cli/launcher-context.ts +77 -0
  183. package/src/cli/minimax.ts +497 -0
  184. package/src/cli/models-runtime.ts +245 -0
  185. package/src/cli/models.ts +422 -0
  186. package/src/cli/observe.ts +206 -0
  187. package/src/cli/opencode.ts +588 -0
  188. package/src/cli/provider-replit.ts +232 -0
  189. package/src/cli/provider-runtime.ts +179 -0
  190. package/src/cli/provider.ts +492 -0
  191. package/src/cli/ready.ts +301 -0
  192. package/src/cli/registry.ts +422 -0
  193. package/src/cli/replit-gateway-key-input.ts +138 -0
  194. package/src/cli/root.ts +86 -0
  195. package/src/cli/route-policy.ts +92 -0
  196. package/src/cli/runtime-api.ts +328 -0
  197. package/src/cli/star-prompt.ts +211 -0
  198. package/src/cli/status-oauth.ts +78 -0
  199. package/src/cli/status.ts +328 -0
  200. package/src/cli/system-command.ts +112 -0
  201. package/src/cli/system-restart-client.ts +146 -0
  202. package/src/cli/tray-proxy.ts +199 -0
  203. package/src/cli/v2.ts +268 -0
  204. package/src/cli.ts +10 -0
  205. package/src/clients/config-export.ts +1704 -0
  206. package/src/codex/account-id.ts +34 -0
  207. package/src/codex/account-label.ts +47 -0
  208. package/src/codex/account-lifecycle.ts +172 -0
  209. package/src/codex/account-namespace-match.ts +63 -0
  210. package/src/codex/account-namespaces.ts +195 -0
  211. package/src/codex/account-pause.ts +20 -0
  212. package/src/codex/account-priority.ts +83 -0
  213. package/src/codex/account-runtime-state.ts +31 -0
  214. package/src/codex/account-store.ts +544 -0
  215. package/src/codex/account-usability.ts +43 -0
  216. package/src/codex/admission.ts +256 -0
  217. package/src/codex/affinity-debug.ts +162 -0
  218. package/src/codex/agent-roles-sync.ts +225 -0
  219. package/src/codex/agent-roles.ts +238 -0
  220. package/src/codex/app-server-processes.ts +1143 -0
  221. package/src/codex/app-server-restart-service.ts +232 -0
  222. package/src/codex/auth-api.ts +2147 -0
  223. package/src/codex/auth-collision.ts +109 -0
  224. package/src/codex/auth-context.ts +665 -0
  225. package/src/codex/autostart-health.ts +156 -0
  226. package/src/codex/catalog/account-models.ts +67 -0
  227. package/src/codex/catalog/aggregation.ts +436 -0
  228. package/src/codex/catalog/bundled.ts +549 -0
  229. package/src/codex/catalog/effort.ts +446 -0
  230. package/src/codex/catalog/filesystem-evidence.ts +302 -0
  231. package/src/codex/catalog/kinds.ts +2 -0
  232. package/src/codex/catalog/metadata.ts +664 -0
  233. package/src/codex/catalog/native-models.ts +72 -0
  234. package/src/codex/catalog/parsing.ts +650 -0
  235. package/src/codex/catalog/provider-fetch.ts +2064 -0
  236. package/src/codex/catalog/sync.ts +1883 -0
  237. package/src/codex/catalog-admission.ts +199 -0
  238. package/src/codex/catalog-refresh-status.ts +105 -0
  239. package/src/codex/catalog-write-serialization.ts +242 -0
  240. package/src/codex/catalog.ts +14 -0
  241. package/src/codex/codex-write-lock.ts +384 -0
  242. package/src/codex/convergence-types.ts +614 -0
  243. package/src/codex/convergence.ts +651 -0
  244. package/src/codex/coordinator-doctor.ts +332 -0
  245. package/src/codex/custom-model-catalog-migration.ts +176 -0
  246. package/src/codex/data/upstream-models.json +830 -0
  247. package/src/codex/desired-state.ts +230 -0
  248. package/src/codex/exec-invocation.ts +22 -0
  249. package/src/codex/features.ts +1566 -0
  250. package/src/codex/generation.ts +202 -0
  251. package/src/codex/history-job.ts +407 -0
  252. package/src/codex/history-lock.ts +242 -0
  253. package/src/codex/history-migration-guardian.ts +108 -0
  254. package/src/codex/history-provider.ts +979 -0
  255. package/src/codex/history-transition.ts +105 -0
  256. package/src/codex/history-worker.ts +220 -0
  257. package/src/codex/home.ts +206 -0
  258. package/src/codex/inject-coordination.ts +290 -0
  259. package/src/codex/inject.ts +1733 -0
  260. package/src/codex/injected-marker.ts +106 -0
  261. package/src/codex/integration-record.ts +266 -0
  262. package/src/codex/internal/catalog-writer.ts +203 -0
  263. package/src/codex/internal/history-writer.ts +80 -0
  264. package/src/codex/journal.ts +225 -0
  265. package/src/codex/log-guard/inspect.ts +506 -0
  266. package/src/codex/log-guard/lock.ts +150 -0
  267. package/src/codex/log-guard/maintenance.ts +403 -0
  268. package/src/codex/log-guard/path-safety.ts +88 -0
  269. package/src/codex/log-guard/policy.ts +44 -0
  270. package/src/codex/log-guard/processes.ts +205 -0
  271. package/src/codex/log-guard/protection.ts +489 -0
  272. package/src/codex/log-guard/sqlite-errors.ts +9 -0
  273. package/src/codex/main-account-cache.ts +56 -0
  274. package/src/codex/main-account.ts +68 -0
  275. package/src/codex/management-convergence.ts +167 -0
  276. package/src/codex/model-cache.ts +273 -0
  277. package/src/codex/model-entitlements.ts +353 -0
  278. package/src/codex/native-main-admission.ts +47 -0
  279. package/src/codex/native-main-auth-temp.ts +187 -0
  280. package/src/codex/native-main-claim.ts +178 -0
  281. package/src/codex/native-main-lock-file.ts +162 -0
  282. package/src/codex/native-main-owner.ts +329 -0
  283. package/src/codex/native-profile-api.ts +247 -0
  284. package/src/codex/native-profile-manager.ts +1531 -0
  285. package/src/codex/native-profile-processes.ts +121 -0
  286. package/src/codex/native-profile-recovery.ts +99 -0
  287. package/src/codex/native-profile-stage-store.ts +387 -0
  288. package/src/codex/native-profile-startup.ts +492 -0
  289. package/src/codex/native-profile-store.ts +855 -0
  290. package/src/codex/native-profile-types.ts +120 -0
  291. package/src/codex/native-residue.ts +682 -0
  292. package/src/codex/paths.ts +144 -0
  293. package/src/codex/plan-from-token.ts +140 -0
  294. package/src/codex/plan.ts +40 -0
  295. package/src/codex/plugins-doctor.ts +242 -0
  296. package/src/codex/pool-rotation.ts +295 -0
  297. package/src/codex/project-config-warnings.ts +425 -0
  298. package/src/codex/prompt-journal.ts +352 -0
  299. package/src/codex/prompt-layers.ts +967 -0
  300. package/src/codex/prompt-lock.ts +143 -0
  301. package/src/codex/quota-rejection.ts +298 -0
  302. package/src/codex/quota.ts +573 -0
  303. package/src/codex/refresh.ts +62 -0
  304. package/src/codex/reset-credit-recovery.ts +1044 -0
  305. package/src/codex/routing.ts +1888 -0
  306. package/src/codex/runtime.ts +659 -0
  307. package/src/codex/shim.ts +2170 -0
  308. package/src/codex/subagent-defaults.ts +550 -0
  309. package/src/codex/subagent-model-fallback.ts +784 -0
  310. package/src/codex/sync.ts +319 -0
  311. package/src/codex/transition-state.ts +612 -0
  312. package/src/codex/upstream-host-health.ts +368 -0
  313. package/src/codex/user-identity.ts +557 -0
  314. package/src/codex/warmup.ts +298 -0
  315. package/src/codex/websocket-registry.ts +100 -0
  316. package/src/codex/write-coordination.ts +114 -0
  317. package/src/combos/failover.ts +160 -0
  318. package/src/combos/index.ts +45 -0
  319. package/src/combos/request.ts +94 -0
  320. package/src/combos/resolve.ts +232 -0
  321. package/src/combos/types.ts +398 -0
  322. package/src/config/provider-name.ts +24 -0
  323. package/src/config.ts +4041 -0
  324. package/src/fork/register.ts +3 -0
  325. package/src/generated/compatibility-version.json +3116 -0
  326. package/src/generated/model-metadata.ts +106 -0
  327. package/src/github/star-state.ts +203 -0
  328. package/src/grok/inject.ts +530 -0
  329. package/src/grok/inspect.ts +45 -0
  330. package/src/grok/status.ts +121 -0
  331. package/src/grok/sync.ts +66 -0
  332. package/src/images/artifacts.ts +516 -0
  333. package/src/images/fulfill-video.ts +163 -0
  334. package/src/images/fulfill.ts +149 -0
  335. package/src/images/index.ts +4 -0
  336. package/src/images/loop.ts +955 -0
  337. package/src/images/plan.ts +143 -0
  338. package/src/images/synthetic-tool.ts +133 -0
  339. package/src/images/types.ts +41 -0
  340. package/src/images/xai-client.ts +141 -0
  341. package/src/images/xai-video-client.ts +163 -0
  342. package/src/index.ts +22 -0
  343. package/src/integrations/config-io.ts +269 -0
  344. package/src/integrations/journal.ts +315 -0
  345. package/src/integrations/merge.ts +135 -0
  346. package/src/integrations/mutation-flight.ts +71 -0
  347. package/src/integrations/native/ownership-preflight.ts +202 -0
  348. package/src/integrations/omp-yaml-source.ts +358 -0
  349. package/src/integrations/owned-refresh.ts +74 -0
  350. package/src/integrations/ownership.ts +111 -0
  351. package/src/integrations/registry.ts +159 -0
  352. package/src/integrations/serialize.ts +314 -0
  353. package/src/integrations/state.ts +361 -0
  354. package/src/integrations/store.ts +103 -0
  355. package/src/integrations/writer-lock.ts +98 -0
  356. package/src/integrations/writer.ts +691 -0
  357. package/src/lab/artifacts/sanitize.ts +586 -0
  358. package/src/lab/artifacts/secure-fs.ts +475 -0
  359. package/src/lab/artifacts/store.ts +310 -0
  360. package/src/lab/automation/budgets.ts +78 -0
  361. package/src/lab/automation/config-persistence.ts +256 -0
  362. package/src/lab/automation/constants.ts +39 -0
  363. package/src/lab/automation/cooldown.ts +103 -0
  364. package/src/lab/automation/dispatch.ts +211 -0
  365. package/src/lab/automation/index.ts +13 -0
  366. package/src/lab/automation/orchestrator.ts +499 -0
  367. package/src/lab/automation/persistence.ts +512 -0
  368. package/src/lab/automation/planner.ts +371 -0
  369. package/src/lab/automation/policy.ts +136 -0
  370. package/src/lab/automation/queue.ts +191 -0
  371. package/src/lab/automation/recovery.ts +24 -0
  372. package/src/lab/automation/route-context.ts +21 -0
  373. package/src/lab/automation/run-key.ts +44 -0
  374. package/src/lab/automation/runs-query.ts +34 -0
  375. package/src/lab/automation/types.ts +160 -0
  376. package/src/lab/conformance/assertion.ts +325 -0
  377. package/src/lab/conformance/digest.ts +22 -0
  378. package/src/lab/conformance/executor.ts +741 -0
  379. package/src/lab/conformance/fixture-provider.ts +27 -0
  380. package/src/lab/conformance/fixtures/live-v1-cases.json +175 -0
  381. package/src/lab/conformance/fixtures/protocol-v1-cases.json +461 -0
  382. package/src/lab/conformance/harness-budget.ts +47 -0
  383. package/src/lab/conformance/index.ts +5 -0
  384. package/src/lab/conformance/jcs.ts +64 -0
  385. package/src/lab/conformance/json-pointer.ts +39 -0
  386. package/src/lab/conformance/manifest.ts +180 -0
  387. package/src/lab/conformance/mcp-stub.ts +179 -0
  388. package/src/lab/conformance/negative-controls.ts +164 -0
  389. package/src/lab/conformance/observation.ts +355 -0
  390. package/src/lab/conformance/runner.ts +68 -0
  391. package/src/lab/conformance/sse-normalize.ts +59 -0
  392. package/src/lab/conformance/suite-manifest.ts +78 -0
  393. package/src/lab/conformance/types.ts +214 -0
  394. package/src/lab/constants.ts +126 -0
  395. package/src/lab/digest.ts +64 -0
  396. package/src/lab/events/errors.ts +9 -0
  397. package/src/lab/events/limits.ts +117 -0
  398. package/src/lab/events/types.ts +229 -0
  399. package/src/lab/events/validate.ts +781 -0
  400. package/src/lab/fabric/constants.ts +40 -0
  401. package/src/lab/fabric/executor.ts +492 -0
  402. package/src/lab/fabric/index.ts +80 -0
  403. package/src/lab/fabric/manifest.ts +222 -0
  404. package/src/lab/fabric/observe.ts +489 -0
  405. package/src/lab/fabric/patch.ts +79 -0
  406. package/src/lab/fabric/producer-child.ts +139 -0
  407. package/src/lab/fabric/producer-isolate.ts +276 -0
  408. package/src/lab/fabric/producer-protocol.ts +61 -0
  409. package/src/lab/fabric/scratch.ts +439 -0
  410. package/src/lab/fabric/subject.ts +106 -0
  411. package/src/lab/fabric/types.ts +134 -0
  412. package/src/lab/fabric/verifier.ts +98 -0
  413. package/src/lab/index.ts +54 -0
  414. package/src/lab/ledger/artifact-refs.ts +127 -0
  415. package/src/lab/ledger/invalidation.ts +136 -0
  416. package/src/lab/ledger/purge.ts +310 -0
  417. package/src/lab/ledger/store.ts +532 -0
  418. package/src/lab/live/credential-lease.ts +53 -0
  419. package/src/lab/live/destination.ts +155 -0
  420. package/src/lab/live/executor.ts +336 -0
  421. package/src/lab/live/inert-tools.ts +56 -0
  422. package/src/lab/live/manifest.ts +85 -0
  423. package/src/lab/live/mcp-loopback.ts +57 -0
  424. package/src/lab/live/runner.ts +19 -0
  425. package/src/lab/live/sandbox.ts +61 -0
  426. package/src/lab/live/suite-manifest.ts +41 -0
  427. package/src/lab/live/transport.ts +118 -0
  428. package/src/lab/live/types.ts +197 -0
  429. package/src/lab/observe/from-conformance.ts +301 -0
  430. package/src/lab/observe/from-live.ts +117 -0
  431. package/src/lab/paths.ts +153 -0
  432. package/src/lab/projection/rebuild.ts +495 -0
  433. package/src/lab/projection/schema.ts +135 -0
  434. package/src/lab/projection/verdicts.ts +474 -0
  435. package/src/lab/projection/verification.ts +412 -0
  436. package/src/lab/public/bundle.ts +217 -0
  437. package/src/lab/public/community-authority.ts +175 -0
  438. package/src/lab/public/community-files.ts +29 -0
  439. package/src/lab/public/community.ts +479 -0
  440. package/src/lab/public/file-safety.ts +155 -0
  441. package/src/lab/public/ids.ts +26 -0
  442. package/src/lab/public/index.ts +16 -0
  443. package/src/lab/public/mutation-lock.ts +424 -0
  444. package/src/lab/public/operator.ts +353 -0
  445. package/src/lab/public/origin-purge.ts +79 -0
  446. package/src/lab/public/origin.ts +203 -0
  447. package/src/lab/public/privacy.ts +143 -0
  448. package/src/lab/public/private-file.ts +261 -0
  449. package/src/lab/public/project.ts +124 -0
  450. package/src/lab/public/purge-test-fault.ts +21 -0
  451. package/src/lab/public/purge.ts +223 -0
  452. package/src/lab/public/registry.ts +44 -0
  453. package/src/lab/public/revocation.ts +252 -0
  454. package/src/lab/public/signature.ts +243 -0
  455. package/src/lab/public/storage.ts +105 -0
  456. package/src/lab/public/strict-json.ts +206 -0
  457. package/src/lab/public/time.ts +26 -0
  458. package/src/lab/public/types.ts +172 -0
  459. package/src/lab/public/validate.ts +391 -0
  460. package/src/lab/query/catalog.ts +101 -0
  461. package/src/lab/query/connection.ts +107 -0
  462. package/src/lab/query/constants.ts +4 -0
  463. package/src/lab/query/cursor.ts +132 -0
  464. package/src/lab/query/dto-map.ts +277 -0
  465. package/src/lab/query/errors.ts +22 -0
  466. package/src/lab/query/freshness.ts +53 -0
  467. package/src/lab/query/index.ts +45 -0
  468. package/src/lab/query/latest-observation.ts +59 -0
  469. package/src/lab/query/passive-production.ts +159 -0
  470. package/src/lab/query/queries.ts +444 -0
  471. package/src/lab/query/types.ts +266 -0
  472. package/src/lab/subject/behavior-fingerprint.ts +77 -0
  473. package/src/lab/subject/installation-salt.ts +112 -0
  474. package/src/lab/subject/protocol-subject.ts +80 -0
  475. package/src/lab/subject/route-subject.ts +74 -0
  476. package/src/lib/abort.ts +146 -0
  477. package/src/lib/admin-secrets.ts +25 -0
  478. package/src/lib/admission.ts +83 -0
  479. package/src/lib/app-owned-memory-stores.ts +195 -0
  480. package/src/lib/app-owned-memory.ts +265 -0
  481. package/src/lib/bounded-body.ts +346 -0
  482. package/src/lib/bun-binary-validator.d.mts +3 -0
  483. package/src/lib/bun-binary-validator.mjs +18 -0
  484. package/src/lib/bun-runtime.ts +184 -0
  485. package/src/lib/bun-stream-caps.ts +130 -0
  486. package/src/lib/codex-restart-contract.ts +120 -0
  487. package/src/lib/config-ownership.ts +364 -0
  488. package/src/lib/crash-guard.ts +344 -0
  489. package/src/lib/debug-log-buffer.ts +83 -0
  490. package/src/lib/debug-settings.ts +108 -0
  491. package/src/lib/debug.ts +31 -0
  492. package/src/lib/destination-policy.ts +380 -0
  493. package/src/lib/errors.ts +406 -0
  494. package/src/lib/eventstream-decoder.ts +253 -0
  495. package/src/lib/fabric-task-execution-authority.ts +7 -0
  496. package/src/lib/fabric-task-host.ts +29 -0
  497. package/src/lib/gcp-adc.ts +341 -0
  498. package/src/lib/injection-debug-log.ts +58 -0
  499. package/src/lib/lab-activation.ts +223 -0
  500. package/src/lib/lab-live-execution-authority.ts +13 -0
  501. package/src/lib/lab-live-host.ts +30 -0
  502. package/src/lib/lab-live-pinned-sender.ts +56 -0
  503. package/src/lib/lab-live-route-production.ts +130 -0
  504. package/src/lib/lab-passive-linker-registration.ts +26 -0
  505. package/src/lib/local-management-attestation.ts +51 -0
  506. package/src/lib/local-management-capability.ts +100 -0
  507. package/src/lib/local-provider-reload-contract.ts +100 -0
  508. package/src/lib/open-url.ts +25 -0
  509. package/src/lib/optional-shutdown-hooks.ts +57 -0
  510. package/src/lib/pinned-http.ts +270 -0
  511. package/src/lib/privacy.ts +20 -0
  512. package/src/lib/process-control.ts +168 -0
  513. package/src/lib/provider-outbound.ts +210 -0
  514. package/src/lib/provider-url.ts +14 -0
  515. package/src/lib/proxy-env.ts +18 -0
  516. package/src/lib/redact.ts +521 -0
  517. package/src/lib/retry-after.ts +55 -0
  518. package/src/lib/self-launch-argv.ts +15 -0
  519. package/src/lib/server-resource-ownership.ts +71 -0
  520. package/src/lib/service-secrets.ts +25 -0
  521. package/src/lib/shadow-call.ts +61 -0
  522. package/src/lib/sidecar-tracker.ts +52 -0
  523. package/src/lib/sse-decoder.ts +364 -0
  524. package/src/lib/state-store-registrations.ts +119 -0
  525. package/src/lib/state-store-sweeper.ts +184 -0
  526. package/src/lib/system-restart-contract.ts +73 -0
  527. package/src/lib/test-home-guard.ts +90 -0
  528. package/src/lib/token-estimate.ts +86 -0
  529. package/src/lib/tool-argument-integers.ts +202 -0
  530. package/src/lib/translator-budget.ts +400 -0
  531. package/src/lib/upstream-http-version.ts +57 -0
  532. package/src/lib/upstream-reachability.ts +95 -0
  533. package/src/lib/upstream-retry.ts +392 -0
  534. package/src/lib/win-exec.ts +115 -0
  535. package/src/lib/win-paths.ts +68 -0
  536. package/src/lib/windows-atomic-replace.ts +156 -0
  537. package/src/lib/windows-elevation.ts +773 -0
  538. package/src/lib/windows-secret-acl.ts +854 -0
  539. package/src/lib/windows-service-wrappers.ts +72 -0
  540. package/src/lib/windows-text.ts +106 -0
  541. package/src/lib/windows-user-principal.ts +341 -0
  542. package/src/lib/winsw.ts +403 -0
  543. package/src/oauth/account-import/google-antigravity-adapter.ts +74 -0
  544. package/src/oauth/account-import/index.ts +15 -0
  545. package/src/oauth/account-import/parser.ts +83 -0
  546. package/src/oauth/account-import/registry.ts +18 -0
  547. package/src/oauth/account-import/service.ts +75 -0
  548. package/src/oauth/account-import/types.ts +91 -0
  549. package/src/oauth/anthropic-routing.ts +594 -0
  550. package/src/oauth/anthropic.ts +188 -0
  551. package/src/oauth/antigravity-routing.ts +151 -0
  552. package/src/oauth/callback-server.ts +300 -0
  553. package/src/oauth/chatgpt.ts +161 -0
  554. package/src/oauth/command-code.ts +239 -0
  555. package/src/oauth/cursor.ts +252 -0
  556. package/src/oauth/github-copilot.ts +428 -0
  557. package/src/oauth/google-antigravity.ts +262 -0
  558. package/src/oauth/health.ts +407 -0
  559. package/src/oauth/index.ts +1504 -0
  560. package/src/oauth/key-providers.ts +124 -0
  561. package/src/oauth/kimi.ts +227 -0
  562. package/src/oauth/kiro-credentials.ts +726 -0
  563. package/src/oauth/kiro.ts +621 -0
  564. package/src/oauth/local-token-detect.ts +130 -0
  565. package/src/oauth/log.ts +50 -0
  566. package/src/oauth/login-cli.ts +223 -0
  567. package/src/oauth/nous.ts +798 -0
  568. package/src/oauth/pkce.ts +15 -0
  569. package/src/oauth/store.ts +728 -0
  570. package/src/oauth/token-guardian.ts +309 -0
  571. package/src/oauth/types.ts +62 -0
  572. package/src/oauth/xai.ts +241 -0
  573. package/src/providers/alibaba-region-backup.ts +75 -0
  574. package/src/providers/alibaba-region-migration.ts +156 -0
  575. package/src/providers/alibaba-region-startup.ts +36 -0
  576. package/src/providers/antigravity-models.ts +695 -0
  577. package/src/providers/antigravity-quota.ts +216 -0
  578. package/src/providers/api-keys.ts +140 -0
  579. package/src/providers/base-url-choices.ts +74 -0
  580. package/src/providers/codex-capacity.ts +292 -0
  581. package/src/providers/command-code-efforts.ts +144 -0
  582. package/src/providers/context-cap.ts +82 -0
  583. package/src/providers/cursor-pool.ts +72 -0
  584. package/src/providers/derive.ts +586 -0
  585. package/src/providers/fastwire.ts +501 -0
  586. package/src/providers/free-directory.ts +187 -0
  587. package/src/providers/github-copilot-transport.ts +56 -0
  588. package/src/providers/google-vertex-location.ts +14 -0
  589. package/src/providers/key-failover.ts +271 -0
  590. package/src/providers/kiro-models.ts +67 -0
  591. package/src/providers/label.ts +19 -0
  592. package/src/providers/model-discovery-limits.ts +16 -0
  593. package/src/providers/model-discovery.ts +449 -0
  594. package/src/providers/model-rename-migration.ts +255 -0
  595. package/src/providers/model-rename-startup.ts +28 -0
  596. package/src/providers/openai-sidecar.ts +243 -0
  597. package/src/providers/openai-tier-startup.ts +56 -0
  598. package/src/providers/openai-tiers.ts +423 -0
  599. package/src/providers/openai-virtual-models.ts +83 -0
  600. package/src/providers/opencode-zen-rate-limit.ts +102 -0
  601. package/src/providers/openrouter-routing.ts +102 -0
  602. package/src/providers/provider-id-rewrite.ts +185 -0
  603. package/src/providers/quota.ts +2345 -0
  604. package/src/providers/registry.ts +2918 -0
  605. package/src/providers/replit/constants.ts +27 -0
  606. package/src/providers/replit/derive.ts +85 -0
  607. package/src/providers/replit/headers.ts +28 -0
  608. package/src/providers/replit/origin.ts +55 -0
  609. package/src/providers/replit/pair-install-response.ts +72 -0
  610. package/src/providers/replit/probe.ts +199 -0
  611. package/src/providers/replit/setup.ts +350 -0
  612. package/src/providers/request-pacing.ts +310 -0
  613. package/src/providers/service-tier.ts +277 -0
  614. package/src/providers/slug-codec.ts +103 -0
  615. package/src/providers/static-model-discovery.ts +86 -0
  616. package/src/providers/xai-responses-opt-in.ts +15 -0
  617. package/src/providers/xai-transport.ts +148 -0
  618. package/src/reasoning-effort.ts +183 -0
  619. package/src/responses/compaction.ts +142 -0
  620. package/src/responses/custom-tool-compat.ts +266 -0
  621. package/src/responses/hosted-tool-policy.ts +9 -0
  622. package/src/responses/namespace-tool-compat.ts +355 -0
  623. package/src/responses/parser.ts +838 -0
  624. package/src/responses/provider-continuation.ts +98 -0
  625. package/src/responses/provider-opaque-metadata.ts +73 -0
  626. package/src/responses/reasoning-envelope.ts +60 -0
  627. package/src/responses/reasoning-replay-cache.ts +426 -0
  628. package/src/responses/schema.ts +165 -0
  629. package/src/responses/spill-store.ts +459 -0
  630. package/src/responses/state.ts +1433 -0
  631. package/src/responses/thought-signature-replay.ts +347 -0
  632. package/src/responses/tool-groups.ts +19 -0
  633. package/src/responses/tool-search-compat.ts +301 -0
  634. package/src/responses/truncated-stop-reason.ts +60 -0
  635. package/src/router.ts +761 -0
  636. package/src/routing/analytics.ts +378 -0
  637. package/src/routing/capability.ts +244 -0
  638. package/src/routing/compatibility/assemble.ts +73 -0
  639. package/src/routing/compatibility/behavior.ts +278 -0
  640. package/src/routing/compatibility/catalog.ts +99 -0
  641. package/src/routing/compatibility/endpoint.ts +52 -0
  642. package/src/routing/compatibility/lab-evidence-provider.ts +130 -0
  643. package/src/routing/compatibility/policy.ts +181 -0
  644. package/src/routing/compatibility/provider-slot.ts +56 -0
  645. package/src/routing/compatibility/reader.ts +110 -0
  646. package/src/routing/compatibility/subject.ts +191 -0
  647. package/src/routing/compatibility/types.ts +64 -0
  648. package/src/routing/compatibility/version.ts +104 -0
  649. package/src/routing/cost.ts +77 -0
  650. package/src/routing/evaluator.ts +495 -0
  651. package/src/routing/health.ts +412 -0
  652. package/src/routing/history/cursor.ts +43 -0
  653. package/src/routing/history/indexer.ts +605 -0
  654. package/src/routing/history/schema.ts +72 -0
  655. package/src/routing/profile-namespace.ts +15 -0
  656. package/src/routing/profile.ts +547 -0
  657. package/src/routing/quota.ts +145 -0
  658. package/src/routing/request-evidence.ts +45 -0
  659. package/src/routing/trace.ts +776 -0
  660. package/src/server/adapter-resolve.ts +53 -0
  661. package/src/server/auth-cors.ts +751 -0
  662. package/src/server/background-lifecycle.ts +182 -0
  663. package/src/server/chat-completions.ts +442 -0
  664. package/src/server/chat-native-sse.ts +331 -0
  665. package/src/server/chat-native.ts +426 -0
  666. package/src/server/claude-messages.ts +1030 -0
  667. package/src/server/direct-local-http.ts +347 -0
  668. package/src/server/effort-policy.ts +190 -0
  669. package/src/server/github-copilot-responses-repair.ts +338 -0
  670. package/src/server/gui-static.ts +152 -0
  671. package/src/server/image-retry.ts +42 -0
  672. package/src/server/images.ts +568 -0
  673. package/src/server/index.ts +1813 -0
  674. package/src/server/lifecycle.ts +498 -0
  675. package/src/server/live.ts +717 -0
  676. package/src/server/local-management-read-client.ts +90 -0
  677. package/src/server/local-provider-reload-client.ts +137 -0
  678. package/src/server/management/agent-settings-routes.ts +1433 -0
  679. package/src/server/management/api-access.ts +141 -0
  680. package/src/server/management/api-key-usage.ts +193 -0
  681. package/src/server/management/body.ts +41 -0
  682. package/src/server/management/combo-routes.ts +263 -0
  683. package/src/server/management/config-routes.ts +835 -0
  684. package/src/server/management/context.ts +113 -0
  685. package/src/server/management/integration-routes.ts +498 -0
  686. package/src/server/management/lab-automation-routes.ts +206 -0
  687. package/src/server/management/lab-routes.ts +563 -0
  688. package/src/server/management/logs-usage-routes.ts +586 -0
  689. package/src/server/management/model-routes.ts +560 -0
  690. package/src/server/management/model-rows.ts +163 -0
  691. package/src/server/management/native-integration-routes.ts +769 -0
  692. package/src/server/management/oauth-account-routes.ts +637 -0
  693. package/src/server/management/provider-capability-config.ts +48 -0
  694. package/src/server/management/provider-routes.ts +1033 -0
  695. package/src/server/management/replit-provider-routes.ts +86 -0
  696. package/src/server/management/request-history-routes.ts +191 -0
  697. package/src/server/management/routing-analytics-routes.ts +74 -0
  698. package/src/server/management/routing-profile-routes.ts +385 -0
  699. package/src/server/management/shared.ts +286 -0
  700. package/src/server/management/sidebar-routes.ts +106 -0
  701. package/src/server/management/storage-log-guard-routes.ts +186 -0
  702. package/src/server/management/sync-response.ts +69 -0
  703. package/src/server/management/system-restart.ts +435 -0
  704. package/src/server/management/system-routes.ts +194 -0
  705. package/src/server/management/usage-summary-cache.ts +94 -0
  706. package/src/server/management/vision-sidecar-options.ts +167 -0
  707. package/src/server/management/web-search-sidecar-options.ts +120 -0
  708. package/src/server/management-api.ts +314 -0
  709. package/src/server/management-auth.ts +482 -0
  710. package/src/server/memory-watchdog.ts +156 -0
  711. package/src/server/passive-route-linker.ts +66 -0
  712. package/src/server/port-reclaim.ts +307 -0
  713. package/src/server/ports.ts +156 -0
  714. package/src/server/proxy-liveness.ts +328 -0
  715. package/src/server/readiness.ts +99 -0
  716. package/src/server/relay-eager.ts +353 -0
  717. package/src/server/relay.ts +1209 -0
  718. package/src/server/request-decompress.ts +239 -0
  719. package/src/server/request-log-conversation.ts +168 -0
  720. package/src/server/request-log.ts +1259 -0
  721. package/src/server/responses/agent-task-recovery-cache.ts +143 -0
  722. package/src/server/responses/agent-task-recovery.ts +465 -0
  723. package/src/server/responses/collaboration.ts +551 -0
  724. package/src/server/responses/compact.ts +771 -0
  725. package/src/server/responses/core.ts +5389 -0
  726. package/src/server/responses/empty-completion-guard.ts +276 -0
  727. package/src/server/responses/encrypted-payload.ts +331 -0
  728. package/src/server/responses/fetch-helpers.ts +232 -0
  729. package/src/server/responses/input-admission.ts +185 -0
  730. package/src/server/responses/pacing-overload.ts +13 -0
  731. package/src/server/responses/passthrough-error.ts +78 -0
  732. package/src/server/responses/policy-fallback.ts +178 -0
  733. package/src/server/responses/responses-field-backfill.ts +251 -0
  734. package/src/server/responses/terminal-guard.ts +251 -0
  735. package/src/server/responses/upstream-error.ts +53 -0
  736. package/src/server/responses/ws-upstream.ts +308 -0
  737. package/src/server/responses-custom-tool-repair.ts +282 -0
  738. package/src/server/responses-image-gen-repair.ts +132 -0
  739. package/src/server/responses-item-id-repair.ts +272 -0
  740. package/src/server/responses-json-events.ts +90 -0
  741. package/src/server/responses-model-rewrite.ts +29 -0
  742. package/src/server/responses-reasoning-summary-rewrite.ts +178 -0
  743. package/src/server/responses-snapshot-repair.ts +621 -0
  744. package/src/server/responses-terminal-repair.ts +342 -0
  745. package/src/server/responses-tool-search-repair.ts +267 -0
  746. package/src/server/responses-undeclared-tool-guard.ts +153 -0
  747. package/src/server/responses.ts +25 -0
  748. package/src/server/search.ts +201 -0
  749. package/src/server/sse-frame-buffer.ts +292 -0
  750. package/src/server/sse-payload-rewrite.ts +263 -0
  751. package/src/server/startup-action-control.ts +315 -0
  752. package/src/server/startup-health-cache.ts +131 -0
  753. package/src/server/system-env.ts +484 -0
  754. package/src/server/windows-tcp-drop.ts +184 -0
  755. package/src/server/windows-tray-control.ts +41 -0
  756. package/src/server/ws-bridge.ts +472 -0
  757. package/src/service-manager-probe.ts +892 -0
  758. package/src/service.ts +3575 -0
  759. package/src/sidecar/auth.ts +92 -0
  760. package/src/sidecar/candidates.ts +83 -0
  761. package/src/stall-timeout.ts +20 -0
  762. package/src/storage/cleanup-job.ts +57 -0
  763. package/src/storage/cleanup.ts +3085 -0
  764. package/src/storage/policy-job.ts +457 -0
  765. package/src/storage/policy-scheduler.ts +40 -0
  766. package/src/storage/policy-worker.ts +59 -0
  767. package/src/storage/policy.ts +527 -0
  768. package/src/storage/restore-job.ts +299 -0
  769. package/src/storage/restore-worker.ts +58 -0
  770. package/src/storage/scanner.ts +238 -0
  771. package/src/storage/storage-mutation-coordinator.ts +139 -0
  772. package/src/storage/worker-lifecycle.ts +215 -0
  773. package/src/tray/assets/opencodex-tray-offline.ico +0 -0
  774. package/src/tray/assets/opencodex-tray-online.ico +0 -0
  775. package/src/tray/assets/opencodex-tray-warning.ico +0 -0
  776. package/src/tray/assets/opencodex-tray.png +0 -0
  777. package/src/tray/windows-tray.ps1 +364 -0
  778. package/src/tray/windows.ts +757 -0
  779. package/src/types/accounts.ts +37 -0
  780. package/src/types/config.ts +876 -0
  781. package/src/types/provider.ts +545 -0
  782. package/src/types/request.ts +384 -0
  783. package/src/types/tools.ts +131 -0
  784. package/src/types/wire.ts +80 -0
  785. package/src/types.ts +106 -0
  786. package/src/update/badge.ts +72 -0
  787. package/src/update/index.ts +415 -0
  788. package/src/update/job.ts +1887 -0
  789. package/src/update/notify.ts +263 -0
  790. package/src/update/npm-cache-preflight.d.mts +47 -0
  791. package/src/update/npm-cache-preflight.mjs +201 -0
  792. package/src/update/npm-invocation.d.mts +23 -0
  793. package/src/update/npm-invocation.mjs +94 -0
  794. package/src/update/transactional-install.d.mts +22 -0
  795. package/src/update/transactional-install.mjs +259 -0
  796. package/src/update/tray-update-plan.d.mts +18 -0
  797. package/src/update/tray-update-plan.mjs +38 -0
  798. package/src/usage/cost.ts +625 -0
  799. package/src/usage/debug.ts +97 -0
  800. package/src/usage/expected-prices.ts +416 -0
  801. package/src/usage/log.ts +1223 -0
  802. package/src/usage/summary.ts +753 -0
  803. package/src/usage/totals.ts +14 -0
  804. package/src/usage/user-cost-overlay-reconciler.ts +313 -0
  805. package/src/usage/user-cost-overlays.ts +314 -0
  806. package/src/vision/anthropic-describe.ts +189 -0
  807. package/src/vision/backends.ts +97 -0
  808. package/src/vision/describe.ts +131 -0
  809. package/src/vision/eligibility.ts +250 -0
  810. package/src/vision/index.ts +681 -0
  811. package/src/vision/reasoning.ts +55 -0
  812. package/src/vision/routed-describe.ts +175 -0
  813. package/src/vision/timeout-bounds.ts +9 -0
  814. package/src/web-search/anthropic-executor.ts +195 -0
  815. package/src/web-search/backends.ts +108 -0
  816. package/src/web-search/exa-executor.ts +88 -0
  817. package/src/web-search/executor.ts +113 -0
  818. package/src/web-search/format-result.ts +89 -0
  819. package/src/web-search/gemini-executor.ts +141 -0
  820. package/src/web-search/index.ts +331 -0
  821. package/src/web-search/loop.ts +896 -0
  822. package/src/web-search/parse.ts +315 -0
  823. package/src/web-search/progress-stream.ts +342 -0
  824. package/src/web-search/sources.ts +60 -0
  825. package/src/web-search/synthetic-tool.ts +47 -0
  826. package/src/web-search/xai-executor.ts +219 -0
@@ -0,0 +1,578 @@
1
+ /**
2
+ * Claude Code inbound: Anthropic Messages API request -> internal /v1/responses body.
3
+ *
4
+ * Design (devlog/260711_claude_inbound/010, 003_evidence.md):
5
+ * - translate-and-replay: the produced body MUST pass the real responsesRequestSchema
6
+ * parse so routing/OAuth/pool/failover are inherited unchanged.
7
+ * - thinking/redacted_thinking blocks on replay are DROPPED (v1 policy) — routed
8
+ * providers carry reasoning in Responses items/ocxr1 envelopes instead.
9
+ * - thinking.budget_tokens is NEVER forwarded raw; it maps to an effort tier.
10
+ * - top_k is accepted and silently dropped (no Responses equivalent, CCR parity).
11
+ */
12
+ import type { OcxClaudeCodeConfig } from "../types";
13
+ import { isAnthropicOutputSchema } from "../adapters/anthropic-output-schema";
14
+ import { resolveAlias } from "./alias";
15
+ import { stripOneMillionMarker } from "./context-windows";
16
+ import { resolveDesktop3pAlias } from "./desktop-3p";
17
+ import { isClaudeWebSearchToolName } from "./outbound";
18
+ import { createHash } from "node:crypto";
19
+
20
+ export class AnthropicRequestError extends Error {}
21
+
22
+ type Rec = Record<string, unknown>;
23
+
24
+ function isRec(v: unknown): v is Rec {
25
+ return !!v && typeof v === "object" && !Array.isArray(v);
26
+ }
27
+
28
+ function isClaudeClassifierModel(model: string): boolean {
29
+ const stripped = model.replace(/-\d{8}$/, "");
30
+ return /^claude-opus-[45]/.test(stripped);
31
+ }
32
+
33
+ /**
34
+ * Explicitly configured classifier route for Claude Code Auto Mode safety checks (#1697).
35
+ *
36
+ * Only OPERATOR-DECLARED targets are used: `classifierModel`, then the ordered
37
+ * `classifierFallbacks`. Both are qualified `provider/model` strings the operator chose, so
38
+ * routing them crosses no boundary the operator did not ask for.
39
+ *
40
+ * Deliberately NOT here: inferring a provider from `claudeCode.model`. That value is the
41
+ * injected/default config slot, not the provider the live session actually selected, so it goes
42
+ * stale the moment the user changes the model picker -- and acting on it would silently move a
43
+ * classifier turn onto a provider with its own privacy and billing consequences. Live session
44
+ * affinity needs the request/session state this function does not have; it is tracked as
45
+ * follow-up work rather than approximated from static config.
46
+ */
47
+ function configuredClassifierRoute(cc?: OcxClaudeCodeConfig): string | undefined {
48
+ const explicit = typeof cc?.classifierModel === "string" ? cc.classifierModel.trim() : "";
49
+ if (explicit.length > 0) return explicit;
50
+ if (Array.isArray(cc?.classifierFallbacks)) {
51
+ for (const candidate of cc.classifierFallbacks) {
52
+ if (typeof candidate === "string" && candidate.trim().length > 0) return candidate.trim();
53
+ }
54
+ }
55
+ return undefined;
56
+ }
57
+
58
+ /** Alias first, then modelMap: exact id, then date-suffix-stripped (`-\d{8}$`), then classifier affinity/config, else passthrough. */
59
+ export function resolveInboundModel(model: string, cc?: OcxClaudeCodeConfig): string {
60
+ // Defensive: Desktop/CLI strip the [1m] context-variant marker client-side, but a
61
+ // leaking build must not break alias decode (devlog 138 — the 1M signal is the
62
+ // anthropic-beta header, never the id). Case-insensitive: the CLI matches /\[1m\]/i.
63
+ model = stripOneMillionMarker(model);
64
+ const aliased = resolveAlias(model);
65
+ if (aliased) return aliased;
66
+ // Desktop 3P aliases: claude-opus-4-{code} → provider/model route key
67
+ const desktop3p = resolveDesktop3pAlias(model);
68
+ if (desktop3p) {
69
+ // Native pseudo-provider returns bare slug; routed returns provider/model
70
+ const sep = desktop3p.indexOf("/");
71
+ if (sep > 0 && desktop3p.slice(0, sep) === "native") return desktop3p.slice(sep + 1);
72
+ return desktop3p;
73
+ }
74
+ const map = cc?.modelMap ?? {};
75
+ const exact = map[model];
76
+ if (typeof exact === "string" && exact.length > 0) return exact;
77
+ const stripped = model.replace(/-\d{8}$/, "");
78
+ const dateless = map[stripped];
79
+ if (typeof dateless === "string" && dateless.length > 0) return dateless;
80
+
81
+ // Claude Code Auto Mode classifier routing (#1697). Bare classifier checks such as
82
+ // `claude-opus-5` carry no provider, so without this they fall through to defaultProvider --
83
+ // which may not speak Anthropic at all. Only an operator-declared target is used.
84
+ if (isClaudeClassifierModel(model)) {
85
+ const configured = configuredClassifierRoute(cc);
86
+ if (configured) return configured;
87
+ }
88
+ return model;
89
+ }
90
+
91
+ /** budget_tokens ladder -> Responses reasoning effort (003: real API min is 1024; never forward raw). */
92
+ export function effortForThinkingBudget(budget: number): string {
93
+ if (budget <= 4096) return "low";
94
+ if (budget <= 16384) return "medium";
95
+ return "high";
96
+ }
97
+
98
+ /**
99
+ * Adaptive-thinking wire (devlog 080): Claude Code /effort sends
100
+ * `thinking:{type:"adaptive"}` + `output_config:{effort:"..."}` (verified by local
101
+ * capture of claude 2.1.207 and CLIProxyAPI#1540). Forward the level verbatim when it
102
+ * is a known Responses effort; unknown strings are dropped so downstream defaults win.
103
+ */
104
+ const OUTPUT_CONFIG_EFFORTS = new Set(["minimal", "low", "medium", "high", "xhigh", "max", "ultra"]);
105
+ export function effortFromOutputConfig(outputConfig: unknown): string | undefined {
106
+ if (!isRec(outputConfig)) return undefined;
107
+ const effort = outputConfig.effort;
108
+ return typeof effort === "string" && OUTPUT_CONFIG_EFFORTS.has(effort) ? effort : undefined;
109
+ }
110
+
111
+ function formatFromOutputConfig(outputConfig: unknown): Rec | undefined {
112
+ if (!isRec(outputConfig) || !isRec(outputConfig.format)) return undefined;
113
+ const format = outputConfig.format;
114
+ if (
115
+ format.type !== "json_schema"
116
+ || !isRec(format.schema)
117
+ || !isAnthropicOutputSchema(format.schema)
118
+ ) return undefined;
119
+ return { type: "json_schema", name: "response", schema: format.schema };
120
+ }
121
+
122
+ function systemToInstructions(system: unknown): string | undefined {
123
+ if (typeof system === "string") return system.length > 0 ? system : undefined;
124
+ if (Array.isArray(system)) {
125
+ const parts: string[] = [];
126
+ for (const block of system) {
127
+ if (isRec(block) && block.type === "text" && typeof block.text === "string") parts.push(block.text);
128
+ }
129
+ return parts.length > 0 ? parts.join("\n\n") : undefined;
130
+ }
131
+ return undefined;
132
+ }
133
+
134
+ function imageBlockToInputImage(block: Rec): Rec | null {
135
+ const source = block.source;
136
+ if (!isRec(source)) return null;
137
+ if (source.type === "base64" && typeof source.data === "string") {
138
+ const media = typeof source.media_type === "string" ? source.media_type : "image/png";
139
+ return { type: "input_image", image_url: `data:${media};base64,${source.data}` };
140
+ }
141
+ if (source.type === "url" && typeof source.url === "string") {
142
+ return { type: "input_image", image_url: source.url };
143
+ }
144
+ return null;
145
+ }
146
+
147
+ function toolResultOutput(block: Rec): string | Rec[] {
148
+ const isError = block.is_error === true;
149
+ const content = block.content;
150
+ if (typeof content === "string") return isError ? `[tool error] ${content}` : content;
151
+ if (Array.isArray(content)) {
152
+ const out: Rec[] = [];
153
+ for (const item of content) {
154
+ if (!isRec(item)) continue;
155
+ if (item.type === "text" && typeof item.text === "string") {
156
+ out.push({ type: "input_text", text: item.text });
157
+ } else if (item.type === "image") {
158
+ const img = imageBlockToInputImage(item);
159
+ if (img) out.push(img);
160
+ } else if (item.type === "document") {
161
+ // Same marker as the user-message document case below: the model should see the
162
+ // attachment happened instead of an empty tool output.
163
+ out.push({ type: "input_text", text: `[document${typeof item.title === "string" ? `: ${item.title}` : ""}]` });
164
+ }
165
+ }
166
+ if (isError) out.unshift({ type: "input_text", text: "[tool error]" });
167
+ if (out.length === 0) return isError ? "[tool error]" : "";
168
+ return out;
169
+ }
170
+ return isError ? "[tool error]" : "";
171
+ }
172
+
173
+ function pushUserMessage(input: Rec[], blocks: Rec[]): void {
174
+ if (blocks.length === 0) return;
175
+ input.push({ type: "message", role: "user", content: blocks });
176
+ }
177
+
178
+ /**
179
+ * Bundled-skill elision for routed models (devlog 060). Claude Code loads a skill
180
+ * by calling the `Skill` tool; the ~136k-token document bundle then rides the
181
+ * paired tool_result on EVERY subsequent turn. Third-party models are not trained
182
+ * on these Anthropic bundles, so for blocked skills we substitute the result body
183
+ * with a short stub — the function_call_output item itself stays (pairing intact).
184
+ * Native Anthropic passthrough never reaches this translation.
185
+ */
186
+ export const DEFAULT_BLOCKED_SKILLS = ["claude-api"];
187
+
188
+ /** Shared effective policy for proxy elision and generated routed-agent guards. */
189
+ export function effectiveBlockedSkillNames(cc?: Pick<OcxClaudeCodeConfig, "blockedSkills">): string[] {
190
+ const names = cc?.blockedSkills ?? DEFAULT_BLOCKED_SKILLS;
191
+ return [...new Set(names
192
+ .filter((name): name is string => typeof name === "string")
193
+ .map(name => name.trim().toLowerCase())
194
+ .filter(name => name.length > 0))];
195
+ }
196
+
197
+ /**
198
+ * ocx-route directive (devlog 072): injected agent-definition bodies carry
199
+ * `<!-- ocx-route: <model> -->` because Claude Code 2.1.207 ignores custom
200
+ * gateway ids in agent frontmatter (live-proven fallback to sonnet). The body
201
+ * rides the subagent's system prompt, so the proxy re-routes here. Only the
202
+ * FIRST directive wins; the scan is bounded to the system field.
203
+ */
204
+ const OCX_ROUTE_RE = /<!--\s*ocx-route:\s*([^\s]+)\s*-->/;
205
+ const OCX_EFFORT_RE = /<!--\s*ocx-effort:\s*(low|medium|high|xhigh|max)\s*-->/;
206
+
207
+ function systemText(body: unknown): string | null {
208
+ if (!isRec(body)) return null;
209
+ const system = body.system;
210
+ if (typeof system === "string") return system || null;
211
+ if (!Array.isArray(system)) return null;
212
+ const text = system
213
+ .filter((b): b is Rec => isRec(b) && b.type === "text" && typeof b.text === "string")
214
+ .map(b => b.text as string)
215
+ .join("\n");
216
+ return text || null;
217
+ }
218
+
219
+ export function extractOcxRouteDirective(body: unknown): string | null {
220
+ const text = systemText(body);
221
+ if (!text) return null;
222
+ const match = OCX_ROUTE_RE.exec(text);
223
+ return match ? match[1]! : null;
224
+ }
225
+
226
+ /**
227
+ * Claude Code 2.1.220 collapses custom-agent frontmatter `effort: max` and
228
+ * `effort: xhigh` into the legacy `thinking.budget_tokens` shape. Preserve the
229
+ * exact generated-agent setting through the same trusted system-body channel as
230
+ * ocx-route so the inbound translator can restore `output_config.effort`.
231
+ */
232
+ export function extractOcxEffortDirective(body: unknown): NonNullable<OcxClaudeCodeConfig["subagentEffort"]> | null {
233
+ const text = systemText(body);
234
+ if (!text) return null;
235
+ const match = OCX_EFFORT_RE.exec(text);
236
+ return match ? match[1] as NonNullable<OcxClaudeCodeConfig["subagentEffort"]> : null;
237
+ }
238
+
239
+ /** Injected-skill payloads below this size are never stubbed (not worth it). */
240
+ const SKILL_ELISION_MIN_CHARS = 10_000;
241
+ const SKILL_TEXT_MARKER = "Base directory for this skill: ";
242
+
243
+ interface SkillElisionContext {
244
+ /** Skill-tool call ids whose input names a blocked skill (result-body carrier). */
245
+ callIds: ReadonlySet<string>;
246
+ /** Lowercased blocked skill names (text-block carrier). */
247
+ names: readonly string[];
248
+ }
249
+
250
+ const NO_ELISION: SkillElisionContext = { callIds: new Set(), names: [] };
251
+
252
+ /**
253
+ * Claude Code 2.1.207 (live capture, devlog 060 follow-up): the Skill tool_result is
254
+ * a tiny "Launching skill: <name>" note; the actual ~570k-char document bundle rides
255
+ * as a SEPARATE text block in the same user message, whose first line is
256
+ * `Base directory for this skill: <dir>/<skill-name>`. Stub that block when the
257
+ * directory basename matches a blocked skill.
258
+ */
259
+ function maybeElideSkillText(text: string, names: readonly string[]): string {
260
+ if (names.length === 0 || text.length < SKILL_ELISION_MIN_CHARS) return text;
261
+ if (!text.startsWith(SKILL_TEXT_MARKER)) return text;
262
+ const firstLineEnd = text.indexOf("\n");
263
+ const dir = text.slice(SKILL_TEXT_MARKER.length, firstLineEnd === -1 ? text.length : firstLineEnd).trim();
264
+ // Windows clients send `C:\Users\...\claude-api`; normalize separators before
265
+ // basenaming (repo precedent: src/codex/inject.ts isOpencodexCatalogPath).
266
+ const base = dir.replace(/\\/g, "/").split("/").filter(Boolean).pop()?.toLowerCase() ?? "";
267
+ if (!names.includes(base)) return text;
268
+ return `[opencodex] '${base}' skill document bundle (${text.length} chars) elided for routed models `
269
+ + "(claudeCode.blockedSkills). The skill is loaded; answer from general knowledge instead of citing the bundle.";
270
+ }
271
+
272
+ function skillElisionStub(callId: string): string {
273
+ return "[opencodex] Skill document bundle elided for routed models (claudeCode.blockedSkills). "
274
+ + `The skill loaded, but its reference documents were removed to save context (call ${callId}). `
275
+ + "Answer from general knowledge instead of citing the bundle.";
276
+ }
277
+
278
+ /** Collect Skill-tool call ids whose input names a blocked skill. */
279
+ function blockedSkillCallIds(messages: readonly unknown[], blocked: readonly string[]): Set<string> {
280
+ const ids = new Set<string>();
281
+ if (blocked.length === 0) return ids;
282
+ const needles = blocked.map(name => name.toLowerCase()).filter(name => name.length > 0);
283
+ if (needles.length === 0) return ids;
284
+ for (const msg of messages) {
285
+ if (!isRec(msg) || msg.role !== "assistant" || !Array.isArray(msg.content)) continue;
286
+ for (const block of msg.content) {
287
+ if (!isRec(block) || block.type !== "tool_use" || block.name !== "Skill") continue;
288
+ if (typeof block.id !== "string" || block.id.length === 0) continue;
289
+ const inputJson = JSON.stringify(block.input ?? {}).toLowerCase();
290
+ if (needles.some(name => inputJson.includes(name))) ids.add(block.id);
291
+ }
292
+ }
293
+ return ids;
294
+ }
295
+
296
+ /**
297
+ * Claude Code (observed 2026-07-11, real CLI smoke) sends `role:"system"` entries in
298
+ * `messages` despite the published API having no system role. Map them to Responses
299
+ * instructions text: the native ChatGPT backend rejects system message items in
300
+ * `input` ("System messages are not allowed", verified live), so folding into
301
+ * `instructions` is the only shape that works on every route.
302
+ */
303
+ function systemMessageText(content: unknown): string {
304
+ if (typeof content === "string") return content;
305
+ if (!Array.isArray(content)) return "";
306
+ const parts: string[] = [];
307
+ for (const raw of content) {
308
+ if (isRec(raw) && raw.type === "text" && typeof raw.text === "string") parts.push(raw.text);
309
+ }
310
+ return parts.join("\n\n");
311
+ }
312
+
313
+ function userMessageToItems(content: unknown, input: Rec[], elide: SkillElisionContext = NO_ELISION): void {
314
+ if (typeof content === "string") {
315
+ if (content.length > 0) pushUserMessage(input, [{ type: "input_text", text: content }]);
316
+ return;
317
+ }
318
+ if (!Array.isArray(content)) return;
319
+ // Preserve block order: tool_result blocks become standalone function_call_output
320
+ // items; contiguous text/image runs become one user message.
321
+ let pending: Rec[] = [];
322
+ for (const raw of content) {
323
+ if (!isRec(raw)) continue;
324
+ switch (raw.type) {
325
+ case "text":
326
+ if (typeof raw.text === "string") pending.push({ type: "input_text", text: maybeElideSkillText(raw.text, elide.names) });
327
+ break;
328
+ case "image": {
329
+ const img = imageBlockToInputImage(raw);
330
+ if (img) pending.push(img);
331
+ break;
332
+ }
333
+ case "tool_result": {
334
+ pushUserMessage(input, pending);
335
+ pending = [];
336
+ if (typeof raw.tool_use_id !== "string" || raw.tool_use_id.length === 0) {
337
+ throw new AnthropicRequestError("tool_result requires tool_use_id");
338
+ }
339
+ input.push({
340
+ type: "function_call_output",
341
+ call_id: raw.tool_use_id,
342
+ // Blocked-skill bundles are stubbed out for routed models (devlog 060).
343
+ output: elide.callIds.has(raw.tool_use_id) ? skillElisionStub(raw.tool_use_id) : toolResultOutput(raw),
344
+ });
345
+ break;
346
+ }
347
+ case "document":
348
+ // No Responses equivalent for raw document blocks; surface the title so the
349
+ // model at least sees the attachment happened.
350
+ pending.push({ type: "input_text", text: `[document${typeof raw.title === "string" ? `: ${raw.title}` : ""}]` });
351
+ break;
352
+ default:
353
+ break; // thinking/redacted_thinking never appear in user messages; ignore unknowns
354
+ }
355
+ }
356
+ pushUserMessage(input, pending);
357
+ }
358
+
359
+ function assistantMessageToItems(content: unknown, input: Rec[]): void {
360
+ if (typeof content === "string") {
361
+ if (content.length > 0) input.push({ type: "message", role: "assistant", content: [{ type: "output_text", text: content }] });
362
+ return;
363
+ }
364
+ if (!Array.isArray(content)) return;
365
+ let pendingText: Rec[] = [];
366
+ const flush = () => {
367
+ if (pendingText.length > 0) input.push({ type: "message", role: "assistant", content: pendingText });
368
+ pendingText = [];
369
+ };
370
+ for (const raw of content) {
371
+ if (!isRec(raw)) continue;
372
+ switch (raw.type) {
373
+ case "text":
374
+ if (typeof raw.text === "string") pendingText.push({ type: "output_text", text: raw.text });
375
+ break;
376
+ case "tool_use": {
377
+ flush();
378
+ if (typeof raw.id !== "string" || raw.id.length === 0 || typeof raw.name !== "string" || raw.name.length === 0) {
379
+ throw new AnthropicRequestError("tool_use requires id and name");
380
+ }
381
+ input.push({ type: "function_call", call_id: raw.id, name: raw.name, arguments: JSON.stringify(raw.input ?? {}) });
382
+ break;
383
+ }
384
+ case "thinking":
385
+ case "redacted_thinking":
386
+ break; // v1 policy: dropped on replay (003 evidence — safe for routed providers)
387
+ default:
388
+ break;
389
+ }
390
+ }
391
+ flush();
392
+ }
393
+
394
+ function toolsToResponses(tools: unknown): Rec[] | undefined {
395
+ if (!Array.isArray(tools) || tools.length === 0) return undefined;
396
+ const out: Rec[] = [];
397
+ for (const raw of tools) {
398
+ if (!isRec(raw)) continue;
399
+ const type = typeof raw.type === "string" ? raw.type : "";
400
+ if (type.startsWith("web_search")) {
401
+ out.push({ type: "web_search" }); // hosted sidecar path
402
+ continue;
403
+ }
404
+ if (typeof raw.name === "string" && raw.name.length > 0 && isRec(raw.input_schema)) {
405
+ out.push({
406
+ type: "function",
407
+ name: raw.name,
408
+ ...(typeof raw.description === "string" ? { description: raw.description } : {}),
409
+ parameters: raw.input_schema as Record<string, unknown>,
410
+ });
411
+ continue;
412
+ }
413
+ // Other server tools (bash_*, text_editor_*, ...) have no routed equivalent: drop.
414
+ }
415
+ return out.length > 0 ? out : undefined;
416
+ }
417
+
418
+ function toolChoiceToResponses(choice: unknown, body: Rec): void {
419
+ if (!isRec(choice)) return;
420
+ if (choice.disable_parallel_tool_use === true) body.parallel_tool_calls = false;
421
+ switch (choice.type) {
422
+ case "auto": body.tool_choice = "auto"; break;
423
+ case "none": body.tool_choice = "none"; break;
424
+ case "any": body.tool_choice = "required"; break;
425
+ case "tool":
426
+ if (typeof choice.name !== "string" || choice.name.length === 0) {
427
+ throw new AnthropicRequestError("tool_choice.tool requires a name");
428
+ }
429
+ // Anthropic represents hosted WebSearch as a named tool choice, while
430
+ // Responses requires the choice type to match the hosted declaration.
431
+ // Preserve forced-tool intent rather than weakening it to `auto`.
432
+ body.tool_choice = isClaudeWebSearchToolName(choice.name)
433
+ ? { type: "web_search" }
434
+ : { type: "function", name: choice.name };
435
+ break;
436
+ default: break;
437
+ }
438
+ }
439
+
440
+ /** Recursive canonical JSON (keys sorted at every depth) — stable cache-cohort input. */
441
+ function canonicalJson(value: unknown): string {
442
+ if (Array.isArray(value)) return `[${value.map(canonicalJson).join(",")}]`;
443
+ if (value && typeof value === "object") {
444
+ const entries = Object.entries(value as Rec).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0);
445
+ return `{${entries.map(([k, v]) => `${JSON.stringify(k)}:${canonicalJson(v)}`).join(",")}}`;
446
+ }
447
+ return JSON.stringify(value) ?? "null";
448
+ }
449
+
450
+ /** Provenance of the generated prompt_cache_key (never serialized into the wire body). */
451
+ export type ClaudeCacheKeySource = "metadata" | "system" | null;
452
+
453
+ export interface ClaudeInboundTranslation {
454
+ body: Rec;
455
+ cacheKeySource: ClaudeCacheKeySource;
456
+ }
457
+
458
+ /**
459
+ * Translate an Anthropic Messages request body into a /v1/responses request body.
460
+ * Throws AnthropicRequestError (-> 400 invalid_request_error) on malformed input.
461
+ */
462
+ export function anthropicToResponsesBody(raw: unknown, cc?: OcxClaudeCodeConfig): Rec {
463
+ return anthropicToResponsesTranslation(raw, cc).body;
464
+ }
465
+
466
+ /**
467
+ * Full translation result: the wire body plus the prompt-cache-key provenance as an
468
+ * OUT-OF-BODY tuple (audit 133 R3#1 — an in-body marker would leak upstream through
469
+ * the native Responses forward and 400).
470
+ */
471
+ export function anthropicToResponsesTranslation(raw: unknown, cc?: OcxClaudeCodeConfig): ClaudeInboundTranslation {
472
+ if (!isRec(raw)) throw new AnthropicRequestError("request body must be a JSON object");
473
+ if (typeof raw.model !== "string" || raw.model.length === 0) {
474
+ throw new AnthropicRequestError("model is required");
475
+ }
476
+ if (!Array.isArray(raw.messages) || raw.messages.length === 0) {
477
+ throw new AnthropicRequestError("messages must be a non-empty array");
478
+ }
479
+
480
+ const input: Rec[] = [];
481
+ const systemParts: string[] = [];
482
+ const topLevelSystem = systemToInstructions(raw.system);
483
+ if (topLevelSystem !== undefined) systemParts.push(topLevelSystem);
484
+ const blockedNames = effectiveBlockedSkillNames(cc);
485
+ const elide: SkillElisionContext = {
486
+ callIds: blockedSkillCallIds(raw.messages, blockedNames),
487
+ names: blockedNames,
488
+ };
489
+ for (const msg of raw.messages) {
490
+ if (!isRec(msg)) throw new AnthropicRequestError("each message must be an object");
491
+ if (msg.role === "user") userMessageToItems(msg.content, input, elide);
492
+ else if (msg.role === "assistant") assistantMessageToItems(msg.content, input);
493
+ else if (msg.role === "system") {
494
+ const text = systemMessageText(msg.content);
495
+ if (text.length > 0) systemParts.push(text);
496
+ }
497
+ else throw new AnthropicRequestError(`unsupported message role: ${String(msg.role)}`);
498
+ }
499
+
500
+ const body: Rec = {
501
+ model: resolveInboundModel(raw.model, cc),
502
+ input,
503
+ store: false,
504
+ stream: raw.stream === true,
505
+ };
506
+
507
+ if (systemParts.length > 0) body.instructions = systemParts.join("\n\n");
508
+
509
+ const tools = toolsToResponses(raw.tools);
510
+ if (tools) body.tools = tools;
511
+ toolChoiceToResponses(raw.tool_choice, body);
512
+
513
+ if (typeof raw.max_tokens === "number") body.max_output_tokens = raw.max_tokens;
514
+ if (typeof raw.temperature === "number") body.temperature = raw.temperature;
515
+ if (typeof raw.top_p === "number") body.top_p = raw.top_p;
516
+ // top_k: accepted and dropped (no Responses equivalent).
517
+ if (Array.isArray(raw.stop_sequences) && raw.stop_sequences.length > 0) {
518
+ body.stop = raw.stop_sequences.filter((s): s is string => typeof s === "string");
519
+ }
520
+ const outputConfigFormat = formatFromOutputConfig(raw.output_config);
521
+ if (outputConfigFormat) body.text = { format: outputConfigFormat };
522
+ let cacheKeySource: ClaudeCacheKeySource = null;
523
+ if (isRec(raw.metadata) && typeof raw.metadata.user_id === "string") {
524
+ body.user = raw.metadata.user_id;
525
+ // OpenAI-side prompt caching is routed by prompt_cache_key (Codex clients send
526
+ // their session id; without it consecutive /v1/messages turns reported
527
+ // cached_tokens: 0 on the ChatGPT backend — devlog 090). Claude Code's
528
+ // metadata.user_id embeds the session uuid, so hashing it yields a stable
529
+ // per-session key with a bounded length/charset.
530
+ body.prompt_cache_key = createHash("sha256").update(raw.metadata.user_id).digest("hex").slice(0, 32);
531
+ cacheKeySource = "metadata";
532
+ } else if (systemParts.length > 0) {
533
+ // Claude Desktop sends no metadata.user_id (H1, devlog 130): without any key the
534
+ // ChatGPT/OpenAI backends reported cached_tokens:0 on every turn. Fall back to a
535
+ // cache-cohort hash (devlog 260712 B4 + Pro review 012): fingerprint what the
536
+ // upstream actually receives — resolved model, post-translation system, and the
537
+ // FULL translated tool definitions in WIRE ORDER (sorting the hash while sending
538
+ // a different order would break the key↔prefix correspondence). canonical JSON
539
+ // (recursive key sort) + a version field so future normalization changes never
540
+ // mix cohorts. system-only keys herded different models/toolsets into one key
541
+ // and burned OpenAI's ~15 RPM per-key routing budget (audit R1#4/R2#5/R1#10).
542
+ // Exact-prefix matching still isolates content; the key only steers routing
543
+ // affinity. Callers must NOT synthesize a session_id header from this fallback
544
+ // (audit 133 R2#3).
545
+ body.prompt_cache_key = createHash("sha256")
546
+ .update(canonicalJson({
547
+ version: 2,
548
+ model: body.model,
549
+ system: systemParts,
550
+ tools: Array.isArray(body.tools) ? body.tools : [],
551
+ }))
552
+ .digest("hex").slice(0, 32);
553
+ cacheKeySource = "system";
554
+ }
555
+
556
+ const thinking = raw.thinking;
557
+ const outputConfigEffort = effortFromOutputConfig(raw.output_config);
558
+ const thinkingDisabled = isRec(thinking) && thinking.type === "disabled";
559
+ if (thinkingDisabled) {
560
+ // An explicit "disabled" is an instruction, not an absence. Dropping it made this
561
+ // indistinguishable from a request that never mentioned thinking — and for models that
562
+ // think by default, omission means thinking is ON, sharing the caller's max_tokens (#545).
563
+ // `none` is the effort disable sentinel. It is not a valid OpenAI summary
564
+ // value, so do not attach the similarly named internal catalog sentinel.
565
+ body.reasoning = { effort: "none" };
566
+ } else if (isRec(thinking) || outputConfigEffort !== undefined) {
567
+ const reasoning: Rec = { summary: "auto" };
568
+ if (outputConfigEffort !== undefined) {
569
+ // Adaptive wire: /effort arrives as output_config.effort (devlog 080).
570
+ reasoning.effort = outputConfigEffort;
571
+ } else if (isRec(thinking) && thinking.type === "enabled" && typeof thinking.budget_tokens === "number") {
572
+ reasoning.effort = effortForThinkingBudget(thinking.budget_tokens);
573
+ }
574
+ body.reasoning = reasoning;
575
+ }
576
+
577
+ return { body, cacheKeySource };
578
+ }