@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,347 @@
1
+ import net, { type Socket } from "node:net";
2
+
3
+ const DIRECT_LOCAL_HTTP_MAX_BYTES = 8 * 1024 * 1024;
4
+ const DIRECT_LOCAL_HTTP_TIMEOUT_MS = 10_000;
5
+
6
+ type DirectLocalHttpIo = {
7
+ timeoutMs?: number;
8
+ connect?: (hostname: string, port: number) => Socket;
9
+ };
10
+
11
+ function abortReason(signal: AbortSignal): Error {
12
+ if (signal.reason instanceof Error) return signal.reason;
13
+ const error = new Error("direct local HTTP request aborted");
14
+ error.name = "AbortError";
15
+ return error;
16
+ }
17
+
18
+ function headerBoundary(bytes: Buffer): number {
19
+ return bytes.indexOf("\r\n\r\n");
20
+ }
21
+
22
+ function validateTrailerLines(bytes: Buffer, start: number, end: number): void {
23
+ if (end === start) return;
24
+ for (const line of bytes.subarray(start, end).toString("latin1").split("\r\n")) {
25
+ if (line.indexOf(":") <= 0) {
26
+ throw new Error("direct local HTTP response has an invalid chunk trailer");
27
+ }
28
+ }
29
+ }
30
+
31
+ function decodeChunkedBody(body: Buffer): Buffer {
32
+ const chunks: Buffer[] = [];
33
+ let offset = 0;
34
+ for (;;) {
35
+ const lineEnd = body.indexOf("\r\n", offset);
36
+ if (lineEnd < 0) throw new Error("direct local HTTP response has a truncated chunk header");
37
+ const rawSize = body.subarray(offset, lineEnd).toString("ascii").split(";", 1)[0]?.trim() ?? "";
38
+ if (!/^[0-9a-f]+$/i.test(rawSize)) throw new Error("direct local HTTP response has an invalid chunk size");
39
+ const size = Number.parseInt(rawSize, 16);
40
+ offset = lineEnd + 2;
41
+ if (size === 0) {
42
+ if (body.length < offset + 2) throw new Error("direct local HTTP response has a truncated chunk trailer");
43
+ if (body[offset] !== 13 || body[offset + 1] !== 10) {
44
+ const trailerEnd = body.indexOf("\r\n\r\n", offset);
45
+ if (trailerEnd < 0) {
46
+ throw new Error("direct local HTTP response has a truncated chunk trailer");
47
+ }
48
+ validateTrailerLines(body, offset, trailerEnd);
49
+ if (trailerEnd + 4 !== body.length) {
50
+ throw new Error("direct local HTTP response has trailing bytes");
51
+ }
52
+ } else if (offset + 2 !== body.length) {
53
+ throw new Error("direct local HTTP response has trailing bytes");
54
+ }
55
+ return Buffer.concat(chunks);
56
+ }
57
+ if (!Number.isSafeInteger(size) || offset + size + 2 > body.length) {
58
+ throw new Error("direct local HTTP response has a truncated chunk body");
59
+ }
60
+ chunks.push(body.subarray(offset, offset + size));
61
+ offset += size;
62
+ if (body[offset] !== 13 || body[offset + 1] !== 10) {
63
+ throw new Error("direct local HTTP response has an invalid chunk terminator");
64
+ }
65
+ offset += 2;
66
+ }
67
+ }
68
+
69
+ type ResponseFraming =
70
+ | { kind: "head"; searchFrom: number }
71
+ | { kind: "content-length"; totalBytes: number }
72
+ | { kind: "chunk-size"; offset: number; searchFrom: number }
73
+ | { kind: "chunk-body"; offset: number; size: number }
74
+ | { kind: "trailers"; offset: number; searchFrom: number }
75
+ | { kind: "close" }
76
+ | { kind: "complete" };
77
+
78
+ function parseResponseHead(bytes: Buffer, boundary: number): {
79
+ status: number;
80
+ statusText: string;
81
+ headers: Headers;
82
+ } {
83
+ const lines = bytes.subarray(0, boundary).toString("latin1").split("\r\n");
84
+ const statusLine = lines.shift() ?? "";
85
+ const match = /^HTTP\/1\.[01] ([0-9]{3})(?: (.*))?$/.exec(statusLine);
86
+ if (!match) throw new Error("direct local HTTP response has an invalid status line");
87
+ const status = Number(match[1]);
88
+ if (status < 200 || status > 599) throw new Error("direct local HTTP response has an unsupported status");
89
+ const headers = new Headers();
90
+ for (const line of lines) {
91
+ const colon = line.indexOf(":");
92
+ if (colon <= 0) throw new Error("direct local HTTP response has an invalid header");
93
+ headers.append(line.slice(0, colon).trim(), line.slice(colon + 1).trim());
94
+ }
95
+ return { status, statusText: match[2] ?? "", headers };
96
+ }
97
+
98
+ function advanceResponseFraming(bytes: Buffer, initial: ResponseFraming): ResponseFraming {
99
+ let framing = initial;
100
+ for (;;) {
101
+ if (framing.kind === "complete" || framing.kind === "close") return framing;
102
+ if (framing.kind === "head") {
103
+ const boundary = bytes.indexOf("\r\n\r\n", framing.searchFrom);
104
+ if (boundary < 0) {
105
+ if (bytes.length > 64 * 1024) throw new Error("direct local HTTP response headers exceed the byte cap");
106
+ return { kind: "head", searchFrom: Math.max(0, bytes.length - 3) };
107
+ }
108
+ const { status, headers } = parseResponseHead(bytes, boundary);
109
+ const bodyStart = boundary + 4;
110
+ if (status === 204 || status === 205 || status === 304) {
111
+ if (bytes.length > bodyStart) {
112
+ throw new Error("direct local HTTP response has a body for a bodyless status");
113
+ }
114
+ return { kind: "complete" };
115
+ }
116
+ if (/\bchunked\b/i.test(headers.get("transfer-encoding") ?? "")) {
117
+ framing = { kind: "chunk-size", offset: bodyStart, searchFrom: bodyStart };
118
+ continue;
119
+ }
120
+ const rawLength = headers.get("content-length");
121
+ if (rawLength === null) return { kind: "close" };
122
+ if (!/^[0-9]+$/.test(rawLength)) throw new Error("direct local HTTP response has an invalid content length");
123
+ const length = Number(rawLength);
124
+ const totalBytes = bodyStart + length;
125
+ if (!Number.isSafeInteger(length) || totalBytes > DIRECT_LOCAL_HTTP_MAX_BYTES) {
126
+ throw new Error("direct local HTTP response exceeds the byte cap");
127
+ }
128
+ framing = { kind: "content-length", totalBytes };
129
+ continue;
130
+ }
131
+ if (framing.kind === "content-length") {
132
+ if (bytes.length > framing.totalBytes) {
133
+ throw new Error("direct local HTTP response has trailing bytes");
134
+ }
135
+ return bytes.length === framing.totalBytes ? { kind: "complete" } : framing;
136
+ }
137
+ if (framing.kind === "chunk-size") {
138
+ const lineEnd = bytes.indexOf("\r\n", framing.searchFrom);
139
+ if (lineEnd < 0) {
140
+ if (bytes.length - framing.offset > 8 * 1024) {
141
+ throw new Error("direct local HTTP response chunk header exceeds the byte cap");
142
+ }
143
+ return {
144
+ ...framing,
145
+ searchFrom: Math.max(framing.offset, bytes.length - 1),
146
+ };
147
+ }
148
+ const rawSize = bytes.subarray(framing.offset, lineEnd).toString("ascii").split(";", 1)[0]?.trim() ?? "";
149
+ if (!/^[0-9a-f]+$/i.test(rawSize)) throw new Error("direct local HTTP response has an invalid chunk size");
150
+ const size = Number.parseInt(rawSize, 16);
151
+ if (!Number.isSafeInteger(size) || size > DIRECT_LOCAL_HTTP_MAX_BYTES) {
152
+ throw new Error("direct local HTTP response chunk exceeds the byte cap");
153
+ }
154
+ const offset = lineEnd + 2;
155
+ framing = size === 0
156
+ ? { kind: "trailers", offset, searchFrom: offset }
157
+ : { kind: "chunk-body", offset, size };
158
+ continue;
159
+ }
160
+ if (framing.kind === "chunk-body") {
161
+ const terminator = framing.offset + framing.size;
162
+ if (terminator + 2 > bytes.length) return framing;
163
+ if (bytes[terminator] !== 13 || bytes[terminator + 1] !== 10) {
164
+ throw new Error("direct local HTTP response has an invalid chunk terminator");
165
+ }
166
+ framing = { kind: "chunk-size", offset: terminator + 2, searchFrom: terminator + 2 };
167
+ continue;
168
+ }
169
+ if (bytes.length < framing.offset + 2) return framing;
170
+ if (bytes[framing.offset] === 13 && bytes[framing.offset + 1] === 10) {
171
+ if (bytes.length > framing.offset + 2) {
172
+ throw new Error("direct local HTTP response has trailing bytes");
173
+ }
174
+ return { kind: "complete" };
175
+ }
176
+ const trailerEnd = bytes.indexOf("\r\n\r\n", framing.searchFrom);
177
+ if (trailerEnd >= 0) {
178
+ validateTrailerLines(bytes, framing.offset, trailerEnd);
179
+ if (bytes.length > trailerEnd + 4) {
180
+ throw new Error("direct local HTTP response has trailing bytes");
181
+ }
182
+ return { kind: "complete" };
183
+ }
184
+ if (bytes.length - framing.offset > 64 * 1024) {
185
+ throw new Error("direct local HTTP response trailers exceed the byte cap");
186
+ }
187
+ return { ...framing, searchFrom: Math.max(framing.offset, bytes.length - 3) };
188
+ }
189
+ }
190
+
191
+ function parseResponse(bytes: Buffer): Response {
192
+ const boundary = headerBoundary(bytes);
193
+ if (boundary < 0) throw new Error("direct local HTTP response has no header boundary");
194
+ const { status, statusText, headers } = parseResponseHead(bytes, boundary);
195
+
196
+ let body = bytes.subarray(boundary + 4);
197
+ if (/\bchunked\b/i.test(headers.get("transfer-encoding") ?? "")) {
198
+ body = decodeChunkedBody(body);
199
+ headers.delete("transfer-encoding");
200
+ headers.delete("content-length");
201
+ } else {
202
+ const rawLength = headers.get("content-length");
203
+ if (rawLength !== null) {
204
+ if (!/^[0-9]+$/.test(rawLength)) throw new Error("direct local HTTP response has an invalid content length");
205
+ const length = Number(rawLength);
206
+ if (!Number.isSafeInteger(length) || body.byteLength < length) {
207
+ throw new Error("direct local HTTP response body is truncated");
208
+ }
209
+ body = body.subarray(0, length);
210
+ }
211
+ }
212
+
213
+ const bodyless = status === 204 || status === 205 || status === 304;
214
+ return new Response(bodyless ? null : new Uint8Array(body), {
215
+ status,
216
+ statusText,
217
+ headers,
218
+ });
219
+ }
220
+
221
+ /**
222
+ * Fetch one bodyless local HTTP GET or POST over a direct TCP connection.
223
+ *
224
+ * Bun's global fetch and Bun 1.3's node:http compatibility layer can honor
225
+ * HTTP(S)_PROXY. Local identity and capability probes must not expose headers
226
+ * to, or accept a fabricated response from, such a proxy. node:net connects to
227
+ * the selected listener without consulting proxy environment variables. Each
228
+ * caller retains an injected fetch seam for deterministic unit tests.
229
+ */
230
+ export async function directLocalHttpFetch(
231
+ input: string | URL | Request,
232
+ init: RequestInit = {},
233
+ io: DirectLocalHttpIo = {},
234
+ ): Promise<Response> {
235
+ const url = new URL(input instanceof Request ? input.url : String(input));
236
+ const method = (init.method ?? (input instanceof Request ? input.method : "GET")).toUpperCase();
237
+ const signal = init.signal ?? (input instanceof Request ? input.signal : undefined);
238
+ const body = init.body ?? (input instanceof Request ? input.body : null);
239
+
240
+ if (url.protocol !== "http:") throw new Error("direct local request must use HTTP");
241
+ if (url.username || url.password) throw new Error("direct local request URL must not contain credentials");
242
+ if ((method !== "GET" && method !== "POST") || body !== null) {
243
+ throw new Error("direct local request must be a bodyless GET or POST");
244
+ }
245
+ if (signal?.aborted) throw abortReason(signal);
246
+
247
+ const headers = new Headers(init.headers ?? (input instanceof Request ? input.headers : undefined));
248
+ headers.delete("proxy-authorization");
249
+ headers.delete("proxy-connection");
250
+ if (method === "POST") headers.set("content-length", "0");
251
+ else headers.delete("content-length");
252
+ headers.set("host", url.host);
253
+ headers.set("connection", "close");
254
+ const headerLines: string[] = [];
255
+ headers.forEach((value, key) => { headerLines.push(`${key}: ${value}`); });
256
+ const requestBytes = Buffer.from(
257
+ `${method} ${url.pathname}${url.search} HTTP/1.1\r\n${headerLines.join("\r\n")}\r\n\r\n`,
258
+ "latin1",
259
+ );
260
+ const parsedHostname = url.hostname.startsWith("[") && url.hostname.endsWith("]")
261
+ ? url.hostname.slice(1, -1)
262
+ : url.hostname;
263
+ const hostname = parsedHostname;
264
+ const port = url.port ? Number(url.port) : 80;
265
+ const timeoutMs = io.timeoutMs ?? DIRECT_LOCAL_HTTP_TIMEOUT_MS;
266
+ if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {
267
+ throw new Error("direct local HTTP timeout must be positive");
268
+ }
269
+
270
+ return await new Promise<Response>((resolve, reject) => {
271
+ let socket: Socket | undefined;
272
+ let settled = false;
273
+ let receivedBytes = 0;
274
+ let responseBytes = Buffer.allocUnsafe(4 * 1024);
275
+ let framing: ResponseFraming = { kind: "head", searchFrom: 0 };
276
+ const cleanup = () => {
277
+ signal?.removeEventListener("abort", onAbort);
278
+ socket?.setTimeout(0);
279
+ };
280
+ const finish = (error?: Error) => {
281
+ if (settled) return;
282
+ settled = true;
283
+ cleanup();
284
+ try { socket?.destroy(); } catch { /* ignore */ }
285
+ if (error) {
286
+ reject(error);
287
+ return;
288
+ }
289
+ try {
290
+ resolve(parseResponse(responseBytes.subarray(0, receivedBytes)));
291
+ } catch (parseError) {
292
+ reject(parseError instanceof Error ? parseError : new Error(String(parseError)));
293
+ }
294
+ };
295
+ const onAbort = () => {
296
+ const error = signal ? abortReason(signal) : new Error("direct local HTTP request aborted");
297
+ finish(error);
298
+ };
299
+
300
+ socket = (io.connect ?? ((host, selectedPort) => net.createConnection({
301
+ host,
302
+ port: selectedPort,
303
+ autoSelectFamily: true,
304
+ })))(hostname, port);
305
+ socket.setTimeout(timeoutMs, () => {
306
+ const error = new Error("direct local HTTP request timed out");
307
+ error.name = "TimeoutError";
308
+ finish(error);
309
+ });
310
+ signal?.addEventListener("abort", onAbort, { once: true });
311
+ if (signal?.aborted) {
312
+ onAbort();
313
+ return;
314
+ }
315
+ socket.on("connect", () => {
316
+ try { socket?.write(requestBytes); } catch (error) {
317
+ finish(error instanceof Error ? error : new Error(String(error)));
318
+ }
319
+ });
320
+ socket.on("data", chunk => {
321
+ if (settled) return;
322
+ const bytes = Buffer.from(chunk);
323
+ receivedBytes += bytes.byteLength;
324
+ if (receivedBytes > DIRECT_LOCAL_HTTP_MAX_BYTES) {
325
+ finish(new Error("direct local HTTP response exceeds the byte cap"));
326
+ return;
327
+ }
328
+ if (receivedBytes > responseBytes.byteLength) {
329
+ let capacity = responseBytes.byteLength;
330
+ while (capacity < receivedBytes) capacity = Math.min(DIRECT_LOCAL_HTTP_MAX_BYTES, capacity * 2);
331
+ const grown = Buffer.allocUnsafe(capacity);
332
+ responseBytes.copy(grown);
333
+ responseBytes = grown;
334
+ }
335
+ bytes.copy(responseBytes, receivedBytes - bytes.byteLength);
336
+ try {
337
+ framing = advanceResponseFraming(responseBytes.subarray(0, receivedBytes), framing);
338
+ if (framing.kind === "complete") finish();
339
+ } catch (error) {
340
+ finish(error instanceof Error ? error : new Error(String(error)));
341
+ }
342
+ });
343
+ socket.once("end", () => finish());
344
+ socket.once("error", error => finish(error));
345
+ socket.once("close", () => finish());
346
+ });
347
+ }
@@ -0,0 +1,190 @@
1
+ /**
2
+ * Hard reasoning-effort caps (devlog/260710_subagent_effort_intercept).
3
+ *
4
+ * Prompt-side effort designation (injectionEffort) is advisory only: codex-rs inherits the
5
+ * parent's effective effort when spawn_agent carries no model/effort args
6
+ * (multi_agents_common.rs resolve defaults), rejects overrides on full-history forks, and a
7
+ * non-empty agent-role file rebuilds the child Config and silently drops spawn-time
8
+ * model/effort. So a session whose config default is ultra leaks max-tier children whenever
9
+ * the parent model spawns bare. This module is the enforcement path: it rewrites the effort
10
+ * of proxied turns at the single choke point every HTTP/WS turn passes through
11
+ * (handleResponses), using the same dual-shape rewrite contract as nativeEffortClamp —
12
+ * parsed.options.reasoning feeds routed adapters, _rawBody.reasoning.effort feeds the
13
+ * ChatGPT passthrough serializer.
14
+ */
15
+ import type { OcxConfig, OcxParsedRequest, OcxProviderConfig } from "../types";
16
+ import { modelInList } from "../types";
17
+ import { codexEffortRank, configuredReasoningEfforts, isCodexReasoningEffort, modelRecordValue } from "../reasoning-effort";
18
+ import { catalogModelEfforts } from "../codex/catalog";
19
+
20
+ /**
21
+ * True when the request carries codex-rs's spawned-child markers, matched EXACTLY.
22
+ * Source of truth (openai/codex @ 6138909d): every collab-spawned child turn sends
23
+ * `x-openai-subagent: collab_spawn` (core/src/responses_metadata.rs) and embeds
24
+ * `"subagent_kind":"thread_spawn"` in the JSON `x-codex-turn-metadata` compatibility
25
+ * header. Both are checked: the WS bridge rebuilds internal requests from the
26
+ * FORWARD_HEADERS allowlist, so either header alone is sufficient evidence.
27
+ *
28
+ * Exact matching matters: upstream emits `x-openai-subagent` for OTHER internal
29
+ * turn categories too (review, compact, memory_consolidation, arbitrary "other"
30
+ * sources — responses_metadata.rs subagent_source). Those are maintenance turns,
31
+ * not spawned children, and must never trip subagentEffortCap.
32
+ */
33
+ export function isThreadSpawnRequest(headers: Headers): boolean {
34
+ if (headers.get("x-openai-subagent") === "collab_spawn") return true;
35
+ const turnMeta = headers.get("x-codex-turn-metadata");
36
+ if (!turnMeta) return false;
37
+ try {
38
+ const parsed = JSON.parse(turnMeta) as { subagent_kind?: unknown };
39
+ return parsed.subagent_kind === "thread_spawn";
40
+ } catch {
41
+ return false;
42
+ }
43
+ }
44
+
45
+ /** The effective ceiling for this turn, or undefined when no configured cap applies. */
46
+ export function effortCapFor(config: OcxConfig, subagent: boolean): string | undefined {
47
+ const caps: string[] = [];
48
+ if (config.effortCap && isCodexReasoningEffort(config.effortCap)) caps.push(config.effortCap);
49
+ if (subagent && config.subagentEffortCap && isCodexReasoningEffort(config.subagentEffortCap)) {
50
+ caps.push(config.subagentEffortCap);
51
+ }
52
+ if (caps.length === 0) return undefined;
53
+ return caps.reduce((low, cap) => (codexEffortRank(cap) < codexEffortRank(low) ? cap : low));
54
+ }
55
+
56
+ /**
57
+ * Whether the effort caps apply to this turn at all. Caps are a V2-surface feature
58
+ * (v1 sub-agents are pinned via explicit spawn args + injectionEffort prompting, so
59
+ * the ultra-default leak this module intercepts is v2-specific):
60
+ * - compaction turns are maintenance, not agent turns: they bypass caps entirely so
61
+ * native /v1/responses/compact (forwarded, never enters handleResponses) and routed
62
+ * compaction (synthesized internal request) get identical cap semantics.
63
+ * - multiAgentMode "v1" disables caps entirely (mirrors the GUI hiding the panel).
64
+ * - a main turn qualifies when its own tool list carries the v2 collab surface.
65
+ * - a CHILD turn is admitted by its spawned-child markers (isThreadSpawnRequest)
66
+ * REGARDLESS of tool surface: depth-limited leaves carry no collab tools (surface
67
+ * null) while children below the spawn-depth limit retain collab tools (spec_plan.rs
68
+ * leaf guard), so tool sniffing alone would cap siblings inconsistently.
69
+ * - a v1-surface MAIN turn (no child markers) never qualifies.
70
+ */
71
+ export function effortCapAppliesTo(
72
+ surface: "v1" | "v2" | null,
73
+ headers: Headers,
74
+ config: OcxConfig,
75
+ compaction = false,
76
+ ): boolean {
77
+ if (compaction) return false;
78
+ if (config.multiAgentMode === "v1") return false;
79
+ return surface === "v2" || isThreadSpawnRequest(headers);
80
+ }
81
+
82
+ /**
83
+ * The routed model's supported effort ladder for cap resolution, from the ROUTE's
84
+ * registry-merged provider (router.ts routedProviderConfig) — the persisted
85
+ * config.providers entry misses registry seeds, and bare ids can route via
86
+ * defaultModel/model-list/default-provider, so no "/" heuristic anywhere.
87
+ *
88
+ * - `[]` -> the model intentionally exposes no effort control (noReasoningModels or
89
+ * an explicitly empty configured ladder): cap resolution strips.
90
+ * - list -> sanitized + healed ladder (configuredReasoningEfforts).
91
+ * - undefined -> unknown. Includes the raw-nonempty-but-non-rankable case (e.g. a
92
+ * thinking-toggle ladder of ["enabled"]): sanitizing would flatten it to []
93
+ * and mis-classify it as "no effort control", so it stays unknown.
94
+ *
95
+ * Catalog fallback fires only for the ChatGPT-backend native passthrough IDENTITY
96
+ * (adapter "openai-responses" + authMode "forward", the fresh-install `openai`
97
+ * provider shape): the injected catalog is authoritative exactly for models Codex
98
+ * validates against that backend. A custom responses provider (key mode) serving a
99
+ * native-looking bare id must NOT inherit the unrelated native ladder.
100
+ */
101
+ /**
102
+ * Empty ladders mean "no effort control", not "this model cannot emit reasoning".
103
+ * Drop only `effort` so a Chat Completions `include_reasoning` / `reasoning.summary`
104
+ * request still reaches parseRequest and is not hidden by hideThinkingSummary.
105
+ */
106
+ export function stripEmptyLadderEffort(
107
+ reasoning: unknown,
108
+ ladder: readonly string[] | undefined,
109
+ ): unknown {
110
+ if (ladder === undefined || ladder.length > 0) return reasoning;
111
+ if (reasoning === undefined || reasoning === null || typeof reasoning !== "object" || Array.isArray(reasoning)) {
112
+ return reasoning;
113
+ }
114
+ const next = { ...(reasoning as Record<string, unknown>) };
115
+ delete next.effort;
116
+ return Object.keys(next).length > 0 ? next : undefined;
117
+ }
118
+
119
+ export function supportedLadderFor(route: { provider: OcxProviderConfig; modelId: string }): string[] | undefined {
120
+ const { provider, modelId } = route;
121
+ if (modelInList(provider.noReasoningModels, modelId)) return [];
122
+ const raw = modelRecordValue(provider.modelReasoningEfforts, modelId) ?? provider.reasoningEfforts;
123
+ if (raw !== undefined) {
124
+ const sanitized = configuredReasoningEfforts(provider, modelId) ?? [];
125
+ if (sanitized.length === 0 && raw.length > 0) return undefined;
126
+ return sanitized;
127
+ }
128
+ if (provider.adapter === "openai-responses" && provider.authMode === "forward") {
129
+ const efforts = catalogModelEfforts([modelId]).get(modelId);
130
+ if (efforts && efforts.length > 0) return efforts;
131
+ }
132
+ return undefined;
133
+ }
134
+
135
+ /**
136
+ * Resolve the configured cap against the model's supported ladder. Returns the effective
137
+ * ceiling rung, or null when the turn must be STRIPPED of its effort entirely. The cap
138
+ * NEVER raises: when rankable rungs exist but none sits at or below the cap, the model
139
+ * cannot run within the ceiling, so the effort is stripped and the provider default
140
+ * applies (never a rung above the cap).
141
+ */
142
+ export function resolveCappedEffort(cap: string, supported: readonly string[] | undefined): string | null {
143
+ if (supported === undefined) return cap;
144
+ const rankable = supported.filter(isCodexReasoningEffort);
145
+ if (rankable.length === 0) {
146
+ // Nonempty but non-rankable (e.g. ["enabled"]) -> unknown ladder, cap as-is.
147
+ // Genuinely empty -> no effort control at all -> strip.
148
+ return supported.length > 0 ? cap : null;
149
+ }
150
+ const capRank = codexEffortRank(cap);
151
+ let best: string | null = null;
152
+ for (const rung of rankable) {
153
+ const rank = codexEffortRank(rung);
154
+ if (rank <= capRank && (best === null || rank > codexEffortRank(best))) best = rung;
155
+ }
156
+ return best;
157
+ }
158
+
159
+ /**
160
+ * Cap the turn's reasoning effort in BOTH request shapes. Non-strip resolution only
161
+ * lowers: efforts at or below the resolved ceiling (and non-ladder/absent efforts) pass
162
+ * untouched. Strip resolution (model exposes no effort control, or no supported rung
163
+ * fits under the cap) removes whatever effort is present — regardless of its rank —
164
+ * from both shapes while preserving `reasoning.summary`. Returns the applied rewrite
165
+ * for request-log annotation (`to: "none"` on strip), or null when nothing changed.
166
+ */
167
+ export function applyEffortCap(
168
+ parsed: OcxParsedRequest,
169
+ headers: Headers,
170
+ config: OcxConfig,
171
+ supported?: readonly string[] | undefined,
172
+ ): { from: string; to: string; subagent: boolean } | null {
173
+ const subagent = isThreadSpawnRequest(headers);
174
+ const cap = effortCapFor(config, subagent);
175
+ if (!cap) return null;
176
+ const resolved = resolveCappedEffort(cap, supported);
177
+ const requested = parsed.options.reasoning;
178
+ const raw = parsed._rawBody as { reasoning?: { effort?: string } } | undefined;
179
+ if (resolved === null) {
180
+ if (!requested) return null;
181
+ parsed.options.reasoning = undefined;
182
+ if (raw?.reasoning && typeof raw.reasoning === "object") delete raw.reasoning.effort;
183
+ return { from: requested, to: "none", subagent };
184
+ }
185
+ if (!requested || !isCodexReasoningEffort(requested)) return null;
186
+ if (codexEffortRank(requested) <= codexEffortRank(resolved)) return null;
187
+ parsed.options.reasoning = resolved;
188
+ if (raw?.reasoning && typeof raw.reasoning === "object") raw.reasoning.effort = resolved;
189
+ return { from: requested, to: resolved, subagent };
190
+ }