@iislee/opencodex 2.11.0 → 2.35.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 (733) hide show
  1. package/AGENTS_INSTALL.md +109 -0
  2. package/README.md +117 -22
  3. package/bin/ocx.mjs +245 -88
  4. package/bin/package-main.mjs +1 -1
  5. package/gui/dist/assets/index-Be1sDpWw.css +1 -0
  6. package/gui/dist/assets/index-D4OKgUV4.js +114 -0
  7. package/gui/dist/index.html +2 -2
  8. package/gui/dist/provider-icons/alibaba-color.svg +1 -1
  9. package/gui/dist/provider-icons/antigravity-color.svg +1 -1
  10. package/gui/dist/provider-icons/claude-color.svg +1 -1
  11. package/gui/dist/provider-icons/cline-color.svg +16 -0
  12. package/gui/dist/provider-icons/cloudflare-ai-gateway-color.svg +1 -1
  13. package/gui/dist/provider-icons/commandcode-color.svg +1 -0
  14. package/gui/dist/provider-icons/copilot-color.svg +1 -1
  15. package/gui/dist/provider-icons/cursor-color.svg +1 -1
  16. package/gui/dist/provider-icons/deepseek-color.svg +1 -1
  17. package/gui/dist/provider-icons/firepass-color.svg +1 -1
  18. package/gui/dist/provider-icons/fireworks-color.svg +1 -1
  19. package/gui/dist/provider-icons/gemini-color.svg +1 -1
  20. package/gui/dist/provider-icons/github-copilot-color.svg +1 -1
  21. package/gui/dist/provider-icons/gitlab-duo-color.svg +1 -1
  22. package/gui/dist/provider-icons/grok.svg +1 -1
  23. package/gui/dist/provider-icons/groq-color.svg +1 -1
  24. package/gui/dist/provider-icons/huggingface-color.svg +1 -1
  25. package/gui/dist/provider-icons/kimi-color.svg +1 -1
  26. package/gui/dist/provider-icons/kiro-color.svg +2 -2
  27. package/gui/dist/provider-icons/lm-studio-color.svg +1 -1
  28. package/gui/dist/provider-icons/mistral-color.svg +1 -1
  29. package/gui/dist/provider-icons/moonshot-color.svg +1 -1
  30. package/gui/dist/provider-icons/nvidia-color.svg +1 -1
  31. package/gui/dist/provider-icons/ollama-color.svg +1 -1
  32. package/gui/dist/provider-icons/openai.svg +1 -1
  33. package/gui/dist/provider-icons/opencode.svg +2 -1
  34. package/gui/dist/provider-icons/openrouter-color.svg +1 -1
  35. package/gui/dist/provider-icons/pi.svg +2 -2
  36. package/gui/dist/provider-icons/qianfan-color.svg +1 -1
  37. package/gui/dist/provider-icons/qwen-portal-color.svg +1 -1
  38. package/gui/dist/provider-icons/vercel-ai-gateway-color.svg +1 -1
  39. package/gui/dist/provider-icons/vllm-color.svg +1 -1
  40. package/gui/dist/provider-icons/xiaomi-color.svg +1 -1
  41. package/package.json +21 -10
  42. package/src/adapters/anthropic-output-schema.ts +137 -0
  43. package/src/adapters/anthropic.ts +475 -62
  44. package/src/adapters/base.ts +82 -7
  45. package/src/adapters/client-fingerprint.ts +18 -12
  46. package/src/adapters/cline-pass-deepseek-v4-tool-replay.ts +69 -0
  47. package/src/adapters/command-code.ts +637 -0
  48. package/src/adapters/cursor/call-id.ts +44 -0
  49. package/src/adapters/cursor/catalog.ts +541 -0
  50. package/src/adapters/cursor/checkpoint-store.ts +308 -0
  51. package/src/adapters/cursor/cursor-errors.ts +144 -6
  52. package/src/adapters/cursor/discovery.ts +122 -14
  53. package/src/adapters/cursor/effort-map.ts +106 -4
  54. package/src/adapters/cursor/envelope-echo.ts +290 -0
  55. package/src/adapters/cursor/framing.ts +39 -0
  56. package/src/adapters/cursor/h2-pool.ts +123 -0
  57. package/src/adapters/cursor/http1-bidi.ts +361 -0
  58. package/src/adapters/cursor/images.ts +704 -0
  59. package/src/adapters/cursor/live-models.ts +180 -59
  60. package/src/adapters/cursor/live-transport.ts +623 -170
  61. package/src/adapters/cursor/message-mapper.ts +4 -1
  62. package/src/adapters/cursor/native-exec-common.ts +23 -2
  63. package/src/adapters/cursor/native-exec-desktop.ts +23 -0
  64. package/src/adapters/cursor/native-exec-fs.ts +10 -7
  65. package/src/adapters/cursor/native-exec-network.ts +1 -1
  66. package/src/adapters/cursor/native-exec-shell.ts +5 -3
  67. package/src/adapters/cursor/native-exec.ts +121 -14
  68. package/src/adapters/cursor/protobuf-events.ts +829 -11
  69. package/src/adapters/cursor/protobuf-request.ts +447 -75
  70. package/src/adapters/cursor/request-builder.ts +271 -35
  71. package/src/adapters/cursor/tool-definitions.ts +252 -12
  72. package/src/adapters/cursor/tool-result-normalize.ts +115 -0
  73. package/src/adapters/cursor/transport.ts +22 -0
  74. package/src/adapters/cursor/types.ts +48 -1
  75. package/src/adapters/cursor.ts +336 -39
  76. package/src/adapters/exec-tool-result-normalize.ts +99 -0
  77. package/src/adapters/google-antigravity-replay.ts +713 -41
  78. package/src/adapters/google-antigravity-wire.ts +48 -10
  79. package/src/adapters/google-errors.ts +44 -12
  80. package/src/adapters/google-http.ts +38 -10
  81. package/src/adapters/google-tool-schema.ts +80 -15
  82. package/src/adapters/google-truncation.ts +11 -0
  83. package/src/adapters/google.ts +742 -86
  84. package/src/adapters/identity.ts +39 -6
  85. package/src/adapters/image.ts +1 -1
  86. package/src/adapters/kiro-constants.ts +27 -0
  87. package/src/adapters/kiro-errors.ts +11 -0
  88. package/src/adapters/kiro-events.ts +19 -1
  89. package/src/adapters/kiro-thinking.ts +18 -2
  90. package/src/adapters/kiro-tools.ts +65 -17
  91. package/src/adapters/kiro.ts +270 -73
  92. package/src/adapters/mimo-free.ts +17 -0
  93. package/src/adapters/openai-chat-url.ts +11 -0
  94. package/src/adapters/openai-chat.ts +1377 -344
  95. package/src/adapters/openai-responses-url.ts +16 -0
  96. package/src/adapters/openai-responses.ts +1164 -64
  97. package/src/adapters/registry.ts +175 -0
  98. package/src/adapters/responses-tool-schema.ts +67 -0
  99. package/src/adapters/run-turn-queue.ts +36 -1
  100. package/src/adapters/tool-call-id.ts +119 -0
  101. package/src/adapters/tool-catalog-nudge.ts +105 -21
  102. package/src/adapters/xai-tool-schema.ts +436 -0
  103. package/src/adapters/xai-web-search.ts +186 -0
  104. package/src/bridge.ts +512 -92
  105. package/src/chat/inbound.ts +57 -20
  106. package/src/chat/outbound.ts +97 -33
  107. package/src/claude/agents-inject.ts +40 -10
  108. package/src/claude/context-windows.ts +37 -14
  109. package/src/claude/desktop-3p.ts +243 -9
  110. package/src/claude/gateway-cache.ts +41 -4
  111. package/src/claude/inbound.ts +72 -3
  112. package/src/claude/model-info.ts +38 -15
  113. package/src/claude/outbound.ts +88 -21
  114. package/src/cli/access.ts +46 -3
  115. package/src/cli/account-api.ts +150 -19
  116. package/src/cli/account-auth.ts +33 -6
  117. package/src/cli/account-catalog-refresh.ts +14 -0
  118. package/src/cli/account-extended.ts +648 -28
  119. package/src/cli/account-main.ts +317 -0
  120. package/src/cli/account.ts +97 -19
  121. package/src/cli/agent.ts +53 -2
  122. package/src/cli/alias.ts +66 -0
  123. package/src/cli/capabilities-command.ts +94 -0
  124. package/src/cli/capabilities.ts +496 -0
  125. package/src/cli/claude-agent-startup-sync.ts +73 -0
  126. package/src/cli/claude-desktop.ts +60 -15
  127. package/src/cli/claude.ts +129 -35
  128. package/src/cli/codex-log-guard-doctor.ts +103 -0
  129. package/src/cli/codex-shim-autorestore.ts +2 -0
  130. package/src/cli/codex-shim-readiness.ts +76 -0
  131. package/src/cli/combo.ts +8 -0
  132. package/src/cli/config-command.ts +74 -10
  133. package/src/cli/dispatch.ts +821 -0
  134. package/src/cli/doctor.ts +440 -56
  135. package/src/cli/ensure-desired-integrations.ts +152 -0
  136. package/src/cli/export-command.ts +46 -20
  137. package/src/cli/help.ts +34 -274
  138. package/src/cli/index.ts +417 -528
  139. package/src/cli/init.ts +5 -17
  140. package/src/cli/inspect.ts +230 -0
  141. package/src/cli/integrations.ts +120 -2
  142. package/src/cli/lab.ts +607 -0
  143. package/src/cli/launcher-context.ts +77 -0
  144. package/src/cli/minimax.ts +497 -0
  145. package/src/cli/models-runtime.ts +130 -2
  146. package/src/cli/models.ts +118 -16
  147. package/src/cli/observe.ts +123 -11
  148. package/src/cli/opencode.ts +4 -2
  149. package/src/cli/provider-runtime.ts +34 -3
  150. package/src/cli/provider.ts +25 -3
  151. package/src/cli/ready.ts +301 -0
  152. package/src/cli/registry.ts +476 -0
  153. package/src/cli/root.ts +86 -0
  154. package/src/cli/route-policy.ts +92 -0
  155. package/src/cli/runtime-api.ts +57 -10
  156. package/src/cli/star-prompt.ts +71 -15
  157. package/src/cli/status.ts +51 -4
  158. package/src/cli/storage.ts +234 -0
  159. package/src/cli/system-command.ts +16 -0
  160. package/src/cli/system-restart-client.ts +146 -0
  161. package/src/cli/tray-proxy.ts +153 -6
  162. package/src/cli/usage-report.ts +184 -0
  163. package/src/cli/v2.ts +137 -18
  164. package/src/cli/version-skew.ts +46 -0
  165. package/src/cli.ts +1 -1
  166. package/src/clients/config-export.ts +1442 -23
  167. package/src/clients/effective-status.ts +30 -2
  168. package/src/clients/probes/cline.ts +81 -0
  169. package/src/codex/account-label.ts +35 -1
  170. package/src/codex/account-lifecycle.ts +130 -13
  171. package/src/codex/account-namespaces.ts +49 -3
  172. package/src/codex/account-pause.ts +2 -1
  173. package/src/codex/account-priority.ts +84 -0
  174. package/src/codex/account-store.ts +29 -2
  175. package/src/codex/account-usability.ts +25 -2
  176. package/src/codex/admission.ts +256 -0
  177. package/src/codex/affinity-debug.ts +162 -0
  178. package/src/codex/app-server-processes.ts +570 -107
  179. package/src/codex/app-server-restart-service.ts +232 -0
  180. package/src/codex/auth-api.ts +893 -246
  181. package/src/codex/auth-collision.ts +5 -3
  182. package/src/codex/auth-context.ts +348 -32
  183. package/src/codex/autostart-health.ts +24 -1
  184. package/src/codex/catalog/account-models.ts +67 -0
  185. package/src/codex/catalog/aggregation.ts +86 -10
  186. package/src/codex/catalog/bundled.ts +331 -33
  187. package/src/codex/catalog/effort.ts +138 -32
  188. package/src/codex/catalog/filesystem-evidence.ts +302 -0
  189. package/src/codex/catalog/kinds.ts +2 -0
  190. package/src/codex/catalog/metadata.ts +555 -45
  191. package/src/codex/catalog/native-models.ts +75 -0
  192. package/src/codex/catalog/parsing.ts +269 -30
  193. package/src/codex/catalog/provider-fetch.ts +1626 -144
  194. package/src/codex/catalog/sync.ts +1576 -187
  195. package/src/codex/catalog-admission.ts +199 -0
  196. package/src/codex/catalog-refresh-status.ts +105 -0
  197. package/src/codex/catalog-write-serialization.ts +242 -0
  198. package/src/codex/catalog.ts +6 -3
  199. package/src/codex/codex-write-lock.ts +386 -0
  200. package/src/codex/convergence-types.ts +614 -0
  201. package/src/codex/convergence.ts +676 -0
  202. package/src/codex/coordinator-doctor.ts +332 -0
  203. package/src/codex/custom-model-catalog-migration.ts +176 -0
  204. package/src/codex/desired-state.ts +230 -0
  205. package/src/codex/desktop-app-restart.ts +355 -0
  206. package/src/codex/features.ts +636 -39
  207. package/src/codex/generation.ts +202 -0
  208. package/src/codex/history-job.ts +436 -0
  209. package/src/codex/history-lock.ts +242 -0
  210. package/src/codex/history-manifest.ts +112 -0
  211. package/src/codex/history-migration-guardian.ts +30 -24
  212. package/src/codex/history-provider.ts +1016 -235
  213. package/src/codex/history-transition.ts +105 -0
  214. package/src/codex/history-worker.ts +223 -0
  215. package/src/codex/inject-coordination.ts +373 -0
  216. package/src/codex/inject.ts +1114 -152
  217. package/src/codex/injected-marker.ts +37 -3
  218. package/src/codex/integration-record.ts +266 -0
  219. package/src/codex/internal/catalog-writer.ts +203 -0
  220. package/src/codex/internal/history-writer.ts +81 -0
  221. package/src/codex/journal.ts +66 -4
  222. package/src/codex/log-guard/inspect.ts +524 -0
  223. package/src/codex/log-guard/lock.ts +150 -0
  224. package/src/codex/log-guard/maintenance.ts +403 -0
  225. package/src/codex/log-guard/path-safety.ts +88 -0
  226. package/src/codex/log-guard/policy.ts +44 -0
  227. package/src/codex/log-guard/processes.ts +205 -0
  228. package/src/codex/log-guard/protection.ts +489 -0
  229. package/src/codex/log-guard/sqlite-errors.ts +9 -0
  230. package/src/codex/main-account-cache.ts +24 -0
  231. package/src/codex/main-account.ts +29 -1
  232. package/src/codex/management-convergence.ts +167 -0
  233. package/src/codex/model-cache.ts +56 -10
  234. package/src/codex/model-entitlements.ts +360 -0
  235. package/src/codex/native-main-admission.ts +47 -0
  236. package/src/codex/native-main-auth-temp.ts +187 -0
  237. package/src/codex/native-main-claim.ts +178 -0
  238. package/src/codex/native-main-lock-file.ts +162 -0
  239. package/src/codex/native-main-owner.ts +329 -0
  240. package/src/codex/native-profile-api.ts +247 -0
  241. package/src/codex/native-profile-manager.ts +1531 -0
  242. package/src/codex/native-profile-processes.ts +121 -0
  243. package/src/codex/native-profile-recovery.ts +99 -0
  244. package/src/codex/native-profile-stage-store.ts +387 -0
  245. package/src/codex/native-profile-startup.ts +622 -0
  246. package/src/codex/native-profile-store.ts +855 -0
  247. package/src/codex/native-profile-types.ts +120 -0
  248. package/src/codex/native-residue.ts +675 -0
  249. package/src/codex/paths.ts +80 -1
  250. package/src/codex/plan-from-token.ts +140 -0
  251. package/src/codex/plan.ts +40 -0
  252. package/src/codex/plugins-doctor.ts +1 -1
  253. package/src/codex/pool-rotation.ts +74 -4
  254. package/src/codex/project-config-warnings.ts +20 -6
  255. package/src/codex/prompt-journal.ts +352 -0
  256. package/src/codex/prompt-layers.ts +1313 -0
  257. package/src/codex/prompt-lock.ts +143 -0
  258. package/src/codex/prompt-text-probe.ts +238 -0
  259. package/src/codex/quota-rejection.ts +298 -0
  260. package/src/codex/quota.ts +264 -21
  261. package/src/codex/refresh.ts +11 -2
  262. package/src/codex/reset-credit-recovery.ts +1044 -0
  263. package/src/codex/routing.ts +514 -94
  264. package/src/codex/runtime.ts +159 -38
  265. package/src/codex/shim.ts +1065 -31
  266. package/src/codex/subagent-model-fallback.ts +437 -43
  267. package/src/codex/sync.ts +191 -2
  268. package/src/codex/transition-state.ts +720 -0
  269. package/src/codex/upstream-host-health.ts +368 -0
  270. package/src/codex/user-identity.ts +557 -0
  271. package/src/codex/warmup.ts +187 -81
  272. package/src/codex/write-coordination.ts +114 -0
  273. package/src/combos/failover.ts +47 -0
  274. package/src/combos/index.ts +4 -0
  275. package/src/combos/request.ts +32 -0
  276. package/src/combos/types.ts +91 -9
  277. package/src/compatibility/index.ts +26 -0
  278. package/src/compatibility/manifest.ts +253 -0
  279. package/src/compatibility/openai-responses.ts +121 -0
  280. package/src/config/atomic-write.ts +219 -0
  281. package/src/config/paths.ts +40 -0
  282. package/src/config/process-state.ts +309 -0
  283. package/src/config/provider-name.ts +24 -0
  284. package/src/config/provider-validation.ts +177 -0
  285. package/src/config/rebase-provenance.ts +68 -0
  286. package/src/config.ts +1713 -709
  287. package/src/generated/compatibility-version.json +3324 -0
  288. package/src/generated/{jawcode-model-metadata.ts → model-metadata.ts} +19 -17
  289. package/src/grok/inject.ts +16 -5
  290. package/src/grok/inspect.ts +45 -0
  291. package/src/grok/sync.ts +2 -2
  292. package/src/images/loop.ts +157 -33
  293. package/src/images/plan.ts +24 -13
  294. package/src/integrations/config-io.ts +269 -0
  295. package/src/integrations/journal.ts +315 -0
  296. package/src/integrations/merge.ts +135 -0
  297. package/src/integrations/mutation-flight.ts +71 -0
  298. package/src/integrations/native/ownership-preflight.ts +202 -0
  299. package/src/integrations/omp-yaml-source.ts +358 -0
  300. package/src/integrations/owned-refresh.ts +74 -0
  301. package/src/integrations/ownership-policy.ts +160 -0
  302. package/src/integrations/ownership.ts +155 -0
  303. package/src/integrations/registry.ts +166 -0
  304. package/src/integrations/serialize.ts +314 -0
  305. package/src/integrations/state.ts +433 -0
  306. package/src/integrations/store.ts +103 -0
  307. package/src/integrations/writer-lock.ts +98 -0
  308. package/src/integrations/writer.ts +715 -0
  309. package/src/lab/artifacts/sanitize.ts +586 -0
  310. package/src/lab/artifacts/secure-fs.ts +475 -0
  311. package/src/lab/artifacts/store.ts +310 -0
  312. package/src/lab/automation/budgets.ts +78 -0
  313. package/src/lab/automation/config-persistence.ts +256 -0
  314. package/src/lab/automation/constants.ts +39 -0
  315. package/src/lab/automation/cooldown.ts +103 -0
  316. package/src/lab/automation/dispatch.ts +211 -0
  317. package/src/lab/automation/index.ts +13 -0
  318. package/src/lab/automation/orchestrator.ts +499 -0
  319. package/src/lab/automation/persistence.ts +512 -0
  320. package/src/lab/automation/planner.ts +371 -0
  321. package/src/lab/automation/policy.ts +136 -0
  322. package/src/lab/automation/queue.ts +191 -0
  323. package/src/lab/automation/recovery.ts +24 -0
  324. package/src/lab/automation/route-context.ts +21 -0
  325. package/src/lab/automation/run-key.ts +44 -0
  326. package/src/lab/automation/runs-query.ts +34 -0
  327. package/src/lab/automation/types.ts +160 -0
  328. package/src/lab/conformance/assertion.ts +325 -0
  329. package/src/lab/conformance/digest.ts +22 -0
  330. package/src/lab/conformance/executor.ts +741 -0
  331. package/src/lab/conformance/fixture-provider.ts +27 -0
  332. package/src/lab/conformance/fixtures/live-v1-cases.json +175 -0
  333. package/src/lab/conformance/fixtures/protocol-v1-cases.json +461 -0
  334. package/src/lab/conformance/harness-budget.ts +47 -0
  335. package/src/lab/conformance/index.ts +5 -0
  336. package/src/lab/conformance/jcs.ts +64 -0
  337. package/src/lab/conformance/json-pointer.ts +39 -0
  338. package/src/lab/conformance/manifest.ts +180 -0
  339. package/src/lab/conformance/mcp-stub.ts +179 -0
  340. package/src/lab/conformance/negative-controls.ts +164 -0
  341. package/src/lab/conformance/observation.ts +355 -0
  342. package/src/lab/conformance/runner.ts +68 -0
  343. package/src/lab/conformance/sse-normalize.ts +59 -0
  344. package/src/lab/conformance/suite-manifest.ts +78 -0
  345. package/src/lab/conformance/types.ts +214 -0
  346. package/src/lab/constants.ts +126 -0
  347. package/src/lab/digest.ts +64 -0
  348. package/src/lab/events/errors.ts +9 -0
  349. package/src/lab/events/limits.ts +117 -0
  350. package/src/lab/events/types.ts +229 -0
  351. package/src/lab/events/validate.ts +781 -0
  352. package/src/lab/fabric/constants.ts +40 -0
  353. package/src/lab/fabric/executor.ts +492 -0
  354. package/src/lab/fabric/index.ts +80 -0
  355. package/src/lab/fabric/manifest.ts +222 -0
  356. package/src/lab/fabric/observe.ts +489 -0
  357. package/src/lab/fabric/patch.ts +79 -0
  358. package/src/lab/fabric/producer-child.ts +139 -0
  359. package/src/lab/fabric/producer-isolate.ts +276 -0
  360. package/src/lab/fabric/producer-protocol.ts +61 -0
  361. package/src/lab/fabric/scratch.ts +439 -0
  362. package/src/lab/fabric/subject.ts +106 -0
  363. package/src/lab/fabric/types.ts +134 -0
  364. package/src/lab/fabric/verifier.ts +98 -0
  365. package/src/lab/index.ts +54 -0
  366. package/src/lab/ledger/artifact-refs.ts +127 -0
  367. package/src/lab/ledger/invalidation.ts +136 -0
  368. package/src/lab/ledger/purge.ts +310 -0
  369. package/src/lab/ledger/store.ts +532 -0
  370. package/src/lab/live/credential-lease.ts +53 -0
  371. package/src/lab/live/destination.ts +155 -0
  372. package/src/lab/live/executor.ts +336 -0
  373. package/src/lab/live/inert-tools.ts +56 -0
  374. package/src/lab/live/manifest.ts +85 -0
  375. package/src/lab/live/mcp-loopback.ts +57 -0
  376. package/src/lab/live/runner.ts +19 -0
  377. package/src/lab/live/sandbox.ts +61 -0
  378. package/src/lab/live/suite-manifest.ts +41 -0
  379. package/src/lab/live/transport.ts +118 -0
  380. package/src/lab/live/types.ts +197 -0
  381. package/src/lab/observe/from-conformance.ts +301 -0
  382. package/src/lab/observe/from-live.ts +117 -0
  383. package/src/lab/paths.ts +153 -0
  384. package/src/lab/projection/rebuild.ts +495 -0
  385. package/src/lab/projection/schema.ts +135 -0
  386. package/src/lab/projection/verdicts.ts +474 -0
  387. package/src/lab/projection/verification.ts +412 -0
  388. package/src/lab/public/bundle.ts +217 -0
  389. package/src/lab/public/community-authority.ts +175 -0
  390. package/src/lab/public/community-files.ts +29 -0
  391. package/src/lab/public/community.ts +479 -0
  392. package/src/lab/public/file-safety.ts +155 -0
  393. package/src/lab/public/ids.ts +26 -0
  394. package/src/lab/public/index.ts +16 -0
  395. package/src/lab/public/mutation-lock.ts +424 -0
  396. package/src/lab/public/operator.ts +353 -0
  397. package/src/lab/public/origin-purge.ts +79 -0
  398. package/src/lab/public/origin.ts +203 -0
  399. package/src/lab/public/privacy.ts +143 -0
  400. package/src/lab/public/private-file.ts +261 -0
  401. package/src/lab/public/project.ts +124 -0
  402. package/src/lab/public/purge-test-fault.ts +21 -0
  403. package/src/lab/public/purge.ts +223 -0
  404. package/src/lab/public/registry.ts +44 -0
  405. package/src/lab/public/revocation.ts +252 -0
  406. package/src/lab/public/signature.ts +243 -0
  407. package/src/lab/public/storage.ts +105 -0
  408. package/src/lab/public/strict-json.ts +206 -0
  409. package/src/lab/public/time.ts +26 -0
  410. package/src/lab/public/types.ts +172 -0
  411. package/src/lab/public/validate.ts +391 -0
  412. package/src/lab/query/catalog.ts +101 -0
  413. package/src/lab/query/connection.ts +107 -0
  414. package/src/lab/query/constants.ts +4 -0
  415. package/src/lab/query/cursor.ts +132 -0
  416. package/src/lab/query/dto-map.ts +277 -0
  417. package/src/lab/query/errors.ts +22 -0
  418. package/src/lab/query/freshness.ts +53 -0
  419. package/src/lab/query/index.ts +45 -0
  420. package/src/lab/query/latest-observation.ts +59 -0
  421. package/src/lab/query/passive-production.ts +159 -0
  422. package/src/lab/query/queries.ts +444 -0
  423. package/src/lab/query/types.ts +266 -0
  424. package/src/lab/subject/behavior-fingerprint.ts +77 -0
  425. package/src/lab/subject/installation-salt.ts +112 -0
  426. package/src/lab/subject/protocol-subject.ts +80 -0
  427. package/src/lab/subject/route-subject.ts +74 -0
  428. package/src/lib/admin-secrets.ts +24 -0
  429. package/src/lib/app-owned-memory-stores.ts +22 -0
  430. package/src/lib/bounded-body.ts +167 -11
  431. package/src/lib/bun-runtime.ts +125 -12
  432. package/src/lib/bun-stream-caps.ts +13 -9
  433. package/src/lib/codex-restart-contract.ts +120 -0
  434. package/src/lib/config-ownership.ts +26 -2
  435. package/src/lib/destination-policy.ts +65 -1
  436. package/src/lib/errors.ts +80 -5
  437. package/src/lib/fabric-task-execution-authority.ts +7 -0
  438. package/src/lib/fabric-task-host.ts +29 -0
  439. package/src/lib/lab-activation.ts +223 -0
  440. package/src/lib/lab-live-execution-authority.ts +13 -0
  441. package/src/lib/lab-live-host.ts +30 -0
  442. package/src/lib/lab-live-pinned-sender.ts +56 -0
  443. package/src/lib/lab-live-route-production.ts +130 -0
  444. package/src/lib/lab-passive-linker-registration.ts +26 -0
  445. package/src/lib/local-management-attestation.ts +51 -0
  446. package/src/lib/local-management-capability.ts +100 -0
  447. package/src/lib/local-provider-reload-contract.ts +100 -0
  448. package/src/lib/optional-shutdown-hooks.ts +57 -0
  449. package/src/lib/package-tree-integrity.ts +101 -0
  450. package/src/lib/pinned-http.ts +145 -26
  451. package/src/lib/process-control.ts +6 -2
  452. package/src/lib/provider-outbound.ts +49 -9
  453. package/src/lib/redact.ts +419 -3
  454. package/src/lib/self-launch-argv.ts +15 -0
  455. package/src/lib/server-resource-ownership.ts +71 -0
  456. package/src/lib/service-secrets.ts +15 -0
  457. package/src/lib/shadow-call.ts +35 -4
  458. package/src/lib/sse-decoder.ts +41 -0
  459. package/src/lib/state-store-registrations.ts +10 -2
  460. package/src/lib/system-restart-contract.ts +73 -0
  461. package/src/lib/token-estimate.ts +19 -2
  462. package/src/lib/tool-argument-integers.ts +253 -0
  463. package/src/lib/translator-budget.ts +44 -0
  464. package/src/lib/upstream-http-version.ts +57 -0
  465. package/src/lib/upstream-reachability.ts +95 -0
  466. package/src/lib/upstream-retry.ts +156 -3
  467. package/src/lib/windows-atomic-replace.ts +155 -0
  468. package/src/lib/windows-elevation.ts +70 -2
  469. package/src/lib/windows-secret-acl.ts +409 -69
  470. package/src/lib/windows-service-wrappers.ts +72 -0
  471. package/src/lib/windows-text.ts +106 -0
  472. package/src/lib/windows-user-principal.ts +341 -0
  473. package/src/lib/winsw.ts +33 -5
  474. package/src/oauth/account-import/google-antigravity-adapter.ts +74 -0
  475. package/src/oauth/account-import/index.ts +15 -0
  476. package/src/oauth/account-import/parser.ts +83 -0
  477. package/src/oauth/account-import/registry.ts +18 -0
  478. package/src/oauth/account-import/service.ts +75 -0
  479. package/src/oauth/account-import/types.ts +91 -0
  480. package/src/oauth/anthropic.ts +12 -1
  481. package/src/oauth/callback-server.ts +30 -4
  482. package/src/oauth/chatgpt.ts +12 -1
  483. package/src/oauth/cline.ts +203 -0
  484. package/src/oauth/command-code.ts +239 -0
  485. package/src/oauth/cursor.ts +46 -5
  486. package/src/oauth/generic-account-failover.ts +231 -0
  487. package/src/oauth/google-antigravity.ts +35 -3
  488. package/src/oauth/health.ts +20 -12
  489. package/src/oauth/index.ts +462 -71
  490. package/src/oauth/key-providers.ts +25 -0
  491. package/src/oauth/kimi.ts +25 -3
  492. package/src/oauth/kiro.ts +95 -6
  493. package/src/oauth/local-token-detect.ts +13 -2
  494. package/src/oauth/log.ts +3 -1
  495. package/src/oauth/login-cli.ts +88 -28
  496. package/src/oauth/nous.ts +798 -0
  497. package/src/oauth/open-browser-choice.ts +26 -0
  498. package/src/oauth/store.ts +133 -26
  499. package/src/oauth/token-guardian.ts +9 -3
  500. package/src/oauth/types.ts +15 -0
  501. package/src/pi/models.ts +2 -2
  502. package/src/providers/alibaba-region-migration.ts +1 -1
  503. package/src/providers/antigravity-models.ts +521 -31
  504. package/src/providers/auto-compact-budget.ts +65 -0
  505. package/src/providers/base-url-choices.ts +10 -0
  506. package/src/providers/codex-capacity.ts +292 -0
  507. package/src/providers/command-code-efforts.ts +176 -0
  508. package/src/providers/context-cap.ts +26 -8
  509. package/src/providers/cursor-pool.ts +72 -0
  510. package/src/providers/default-aliases.ts +65 -0
  511. package/src/providers/derive.ts +281 -6
  512. package/src/providers/fastwire.ts +507 -0
  513. package/src/providers/free-directory.ts +10 -7
  514. package/src/providers/google-vertex-location.ts +14 -0
  515. package/src/providers/key-failover.ts +71 -3
  516. package/src/providers/label.ts +35 -2
  517. package/src/providers/model-discovery-limits.ts +16 -0
  518. package/src/providers/model-discovery.ts +115 -22
  519. package/src/providers/model-presets.ts +119 -0
  520. package/src/providers/model-rename-migration.ts +255 -0
  521. package/src/providers/model-rename-startup.ts +28 -0
  522. package/src/providers/new-model-policy.ts +146 -0
  523. package/src/providers/openai-sidecar.ts +72 -4
  524. package/src/providers/openai-tier-startup.ts +31 -2
  525. package/src/providers/openai-tiers.ts +119 -4
  526. package/src/providers/openai-virtual-models.ts +1 -0
  527. package/src/providers/opencode-zen-rate-limit.ts +102 -0
  528. package/src/providers/provider-id-rewrite.ts +30 -0
  529. package/src/providers/quota.ts +1379 -40
  530. package/src/providers/registry.ts +1545 -112
  531. package/src/providers/request-pacing.ts +310 -0
  532. package/src/providers/service-tier.ts +277 -0
  533. package/src/providers/slug-codec.ts +94 -6
  534. package/src/providers/static-model-discovery.ts +86 -0
  535. package/src/providers/xai-responses-opt-in.ts +15 -0
  536. package/src/providers/xai-transport.ts +32 -4
  537. package/src/reasoning-effort.ts +68 -3
  538. package/src/responses/apply-patch-envelope.ts +63 -0
  539. package/src/responses/code-mode-helper-compat.ts +50 -0
  540. package/src/responses/compaction.ts +26 -1
  541. package/src/responses/custom-tool-compat.ts +384 -0
  542. package/src/responses/hosted-tool-policy.ts +9 -0
  543. package/src/responses/namespace-tool-compat.ts +435 -0
  544. package/src/responses/parser.ts +225 -38
  545. package/src/responses/provider-continuation.ts +98 -0
  546. package/src/responses/provider-opaque-metadata.ts +73 -0
  547. package/src/responses/reasoning-envelope.ts +9 -1
  548. package/src/responses/reasoning-replay-cache.ts +504 -0
  549. package/src/responses/schema.ts +12 -2
  550. package/src/responses/spill-store.ts +75 -10
  551. package/src/responses/state.ts +659 -31
  552. package/src/responses/thought-signature-replay.ts +364 -0
  553. package/src/responses/tool-search-compat.ts +301 -0
  554. package/src/responses/truncated-stop-reason.ts +60 -0
  555. package/src/responses/turn-termination.ts +107 -0
  556. package/src/router.ts +405 -31
  557. package/src/routing/analytics.ts +379 -0
  558. package/src/routing/capability.ts +244 -0
  559. package/src/routing/compatibility/assemble.ts +73 -0
  560. package/src/routing/compatibility/behavior.ts +278 -0
  561. package/src/routing/compatibility/catalog.ts +99 -0
  562. package/src/routing/compatibility/endpoint.ts +52 -0
  563. package/src/routing/compatibility/lab-evidence-provider.ts +130 -0
  564. package/src/routing/compatibility/policy.ts +181 -0
  565. package/src/routing/compatibility/provider-slot.ts +56 -0
  566. package/src/routing/compatibility/reader.ts +110 -0
  567. package/src/routing/compatibility/subject.ts +191 -0
  568. package/src/routing/compatibility/types.ts +64 -0
  569. package/src/routing/compatibility/version.ts +104 -0
  570. package/src/routing/cost.ts +77 -0
  571. package/src/routing/evaluator.ts +495 -0
  572. package/src/routing/health.ts +412 -0
  573. package/src/routing/history/cursor.ts +43 -0
  574. package/src/routing/history/indexer.ts +605 -0
  575. package/src/routing/history/schema.ts +72 -0
  576. package/src/routing/profile-namespace.ts +15 -0
  577. package/src/routing/profile.ts +547 -0
  578. package/src/routing/quota.ts +155 -0
  579. package/src/routing/request-evidence.ts +45 -0
  580. package/src/routing/trace.ts +776 -0
  581. package/src/server/adapter-resolve.ts +2 -29
  582. package/src/server/auth-cors.ts +289 -48
  583. package/src/server/background-lifecycle.ts +182 -0
  584. package/src/server/chat-completions.ts +154 -72
  585. package/src/server/chat-native-sse.ts +331 -0
  586. package/src/server/chat-native.ts +445 -0
  587. package/src/server/claude-messages.ts +160 -44
  588. package/src/server/direct-local-http.ts +347 -0
  589. package/src/server/effort-policy.ts +18 -0
  590. package/src/server/github-copilot-responses-repair.ts +338 -0
  591. package/src/server/gui-static.ts +39 -10
  592. package/src/server/images.ts +94 -12
  593. package/src/server/index.ts +1021 -190
  594. package/src/server/lifecycle.ts +336 -14
  595. package/src/server/live.ts +136 -17
  596. package/src/server/local-management-read-client.ts +90 -0
  597. package/src/server/local-provider-reload-client.ts +137 -0
  598. package/src/server/management/agent-settings-routes.ts +433 -116
  599. package/src/server/management/api-key-usage.ts +31 -5
  600. package/src/server/management/body.ts +6 -0
  601. package/src/server/management/codex-prompt-routes.ts +570 -0
  602. package/src/server/management/combo-routes.ts +64 -25
  603. package/src/server/management/config-routes.ts +511 -51
  604. package/src/server/management/context.ts +89 -2
  605. package/src/server/management/integration-routes.ts +498 -0
  606. package/src/server/management/lab-automation-routes.ts +206 -0
  607. package/src/server/management/lab-routes.ts +563 -0
  608. package/src/server/management/logs-usage-routes.ts +127 -52
  609. package/src/server/management/model-routes.ts +461 -133
  610. package/src/server/management/model-rows.ts +167 -0
  611. package/src/server/management/native-integration-routes.ts +770 -0
  612. package/src/server/management/oauth-account-routes.ts +90 -8
  613. package/src/server/management/provider-capability-config.ts +48 -0
  614. package/src/server/management/provider-routes.ts +836 -159
  615. package/src/server/management/request-history-routes.ts +191 -0
  616. package/src/server/management/route-registry.ts +332 -0
  617. package/src/server/management/routing-analytics-routes.ts +74 -0
  618. package/src/server/management/routing-profile-routes.ts +380 -0
  619. package/src/server/management/shared.ts +27 -11
  620. package/src/server/management/sidebar-routes.ts +47 -31
  621. package/src/server/management/storage-log-guard-routes.ts +186 -0
  622. package/src/server/management/sync-response.ts +69 -0
  623. package/src/server/management/system-restart.ts +289 -33
  624. package/src/server/management/system-routes.ts +77 -0
  625. package/src/server/management/usage-summary-cache.ts +9 -1
  626. package/src/server/management/vision-sidecar-options.ts +167 -0
  627. package/src/server/management/web-search-sidecar-options.ts +120 -0
  628. package/src/server/management-api.ts +126 -23
  629. package/src/server/management-auth.ts +220 -5
  630. package/src/server/passive-route-linker.ts +66 -0
  631. package/src/server/port-reclaim.ts +1 -1
  632. package/src/server/ports.ts +41 -1
  633. package/src/server/proxy-liveness.ts +161 -10
  634. package/src/server/readiness.ts +99 -0
  635. package/src/server/relay-eager.ts +221 -54
  636. package/src/server/relay.ts +479 -87
  637. package/src/server/request-decompress.ts +113 -6
  638. package/src/server/request-log-conversation.ts +51 -0
  639. package/src/server/request-log.ts +298 -31
  640. package/src/server/responses/agent-task-recovery-cache.ts +143 -0
  641. package/src/server/responses/agent-task-recovery.ts +465 -0
  642. package/src/server/responses/codex-auth-error.ts +55 -0
  643. package/src/server/responses/collaboration.ts +239 -36
  644. package/src/server/responses/combo-stream-preflight.ts +178 -0
  645. package/src/server/responses/compact.ts +444 -72
  646. package/src/server/responses/core.ts +3579 -436
  647. package/src/server/responses/empty-completion-guard.ts +333 -0
  648. package/src/server/responses/encrypted-payload.ts +62 -39
  649. package/src/server/responses/fetch-helpers.ts +89 -99
  650. package/src/server/responses/input-admission.ts +187 -0
  651. package/src/server/responses/pacing-overload.ts +13 -0
  652. package/src/server/responses/passthrough-error.ts +33 -9
  653. package/src/server/responses/policy-fallback.ts +178 -0
  654. package/src/server/responses/responses-field-backfill.ts +343 -0
  655. package/src/server/responses/terminal-guard.ts +26 -5
  656. package/src/server/responses/upstream-error.ts +5 -0
  657. package/src/server/responses/ws-upstream.ts +381 -0
  658. package/src/server/responses-custom-tool-repair.ts +363 -0
  659. package/src/server/responses-item-id-repair.ts +54 -6
  660. package/src/server/responses-json-events.ts +90 -0
  661. package/src/server/responses-model-rewrite.ts +29 -0
  662. package/src/server/responses-reasoning-summary-rewrite.ts +178 -0
  663. package/src/server/responses-snapshot-repair.ts +621 -0
  664. package/src/server/responses-terminal-repair.ts +363 -0
  665. package/src/server/responses-tool-search-repair.ts +267 -0
  666. package/src/server/responses-undeclared-tool-guard.ts +376 -0
  667. package/src/server/responses.ts +18 -2
  668. package/src/server/search.ts +78 -13
  669. package/src/server/sse-frame-buffer.ts +319 -0
  670. package/src/server/sse-payload-rewrite.ts +110 -22
  671. package/src/server/startup-action-control.ts +8 -1
  672. package/src/server/startup-health-cache.ts +19 -1
  673. package/src/server/system-env.ts +80 -9
  674. package/src/server/ws-bridge.ts +53 -40
  675. package/src/service-manager-probe.ts +892 -0
  676. package/src/service.ts +1153 -94
  677. package/src/sidecar/auth.ts +92 -0
  678. package/src/sidecar/candidates.ts +83 -0
  679. package/src/storage/cleanup.ts +2 -2
  680. package/src/storage/policy-job.ts +14 -4
  681. package/src/storage/policy.ts +88 -23
  682. package/src/storage/scanner.ts +1 -1
  683. package/src/storage/worker-lifecycle.ts +14 -14
  684. package/src/tray/windows-tray.ps1 +83 -9
  685. package/src/tray/windows.ts +43 -16
  686. package/src/types/accounts.ts +37 -0
  687. package/src/types/config.ts +911 -0
  688. package/src/types/provider.ts +614 -0
  689. package/src/types/request.ts +397 -0
  690. package/src/types/tools.ts +236 -0
  691. package/src/types/wire.ts +80 -0
  692. package/src/types.ts +107 -1237
  693. package/src/update/index.ts +37 -23
  694. package/src/update/job.ts +445 -68
  695. package/src/update/notify.ts +12 -6
  696. package/src/update/npm-cache-preflight.d.mts +47 -0
  697. package/src/update/npm-cache-preflight.mjs +201 -0
  698. package/src/update/transactional-install.d.mts +22 -0
  699. package/src/update/transactional-install.mjs +266 -0
  700. package/src/usage/cost.ts +0 -0
  701. package/src/usage/expected-prices.ts +287 -16
  702. package/src/usage/log.ts +666 -50
  703. package/src/usage/summary.ts +388 -17
  704. package/src/usage/user-cost-overlay-reconciler.ts +313 -0
  705. package/src/usage/user-cost-overlays.ts +314 -0
  706. package/src/vision/anthropic-describe.ts +10 -6
  707. package/src/vision/backends.ts +97 -0
  708. package/src/vision/describe.ts +27 -16
  709. package/src/vision/eligibility.ts +250 -0
  710. package/src/vision/index.ts +238 -24
  711. package/src/vision/reasoning.ts +55 -0
  712. package/src/vision/routed-describe.ts +175 -0
  713. package/src/vision/timeout-bounds.ts +9 -0
  714. package/src/web-search/anthropic-executor.ts +13 -7
  715. package/src/web-search/backends.ts +108 -0
  716. package/src/web-search/exa-executor.ts +119 -0
  717. package/src/web-search/executor.ts +21 -6
  718. package/src/web-search/gemini-executor.ts +141 -0
  719. package/src/web-search/index.ts +150 -15
  720. package/src/web-search/loop.ts +284 -54
  721. package/src/web-search/parse.ts +125 -30
  722. package/src/web-search/sources.ts +60 -0
  723. package/src/web-search/xai-executor.ts +219 -0
  724. package/gui/dist/assets/index-DTpMHS4F.js +0 -67
  725. package/gui/dist/assets/index-ZNVDE3C7.css +0 -1
  726. package/gui/dist/provider-icons/antigravity.svg +0 -1
  727. package/gui/dist/provider-icons/claude.svg +0 -1
  728. package/gui/dist/provider-icons/copilot.svg +0 -1
  729. package/gui/dist/provider-icons/cursor.svg +0 -2
  730. package/gui/dist/provider-icons/gemini.svg +0 -1
  731. package/gui/dist/provider-icons/grok-color.svg +0 -1
  732. package/gui/dist/provider-icons/kiro.svg +0 -14
  733. package/src/cli/internal-dispatch.ts +0 -20
@@ -0,0 +1,911 @@
1
+ import type { OcxProviderConfig } from "./provider";
2
+ import type { CodexAccount } from "./accounts";
3
+
4
+ /**
5
+ * Claude Code inbound settings (devlog/260711_claude_inbound). Consumed by the
6
+ * /v1/messages surface, the `ocx claude` launcher, and the GUI Claude page.
7
+ */
8
+ export interface OcxClaudeCodeConfig {
9
+ /** Kill switch for the /v1/messages inbound (GUI "Claude ON" toggle). Default: enabled. */
10
+ enabled?: boolean;
11
+ /**
12
+ * Verbatim passthrough of unmapped claude/anthropic models to api.anthropic.com with the
13
+ * caller's own sk-ant-* credential (Claude Code subscription OAuth). Default: enabled.
14
+ */
15
+ nativePassthrough?: boolean;
16
+ /** Upstream for the native passthrough (tests/enterprise gateways). Default: https://api.anthropic.com */
17
+ anthropicBaseUrl?: string;
18
+ /**
19
+ * Native passthrough body inactivity budget in SECONDS — raw upstream-byte silence
20
+ * while a read is pending, NOT total duration (slow-but-alive streams never trip it;
21
+ * devlog 260716_passthrough_followups/010). Default 90. Min 1. Exactly 0 disables;
22
+ * negative/non-finite values fall back to the default.
23
+ */
24
+ bodyStallSec?: number;
25
+ /**
26
+ * Native passthrough cumulative body byte cap (streamed SSE and buffered non-stream
27
+ * alike) — an OOM/occupancy guard, not a correctness limit. Default 67108864 (64 MiB).
28
+ * Exactly 0 disables; negative/non-finite values fall back to the default.
29
+ */
30
+ bodyMaxBytes?: number;
31
+ /** Default model slot injected as ANTHROPIC_MODEL by `ocx claude`. */
32
+ model?: string;
33
+ /** Haiku/small-fast slot injected as ANTHROPIC_DEFAULT_HAIKU_MODEL (+ legacy SMALL_FAST). */
34
+ smallFastModel?: string;
35
+ /** Inbound model id remaps: exact id first, then date-stripped (`-\d{8}$`). */
36
+ modelMap?: Record<string, string>;
37
+ /**
38
+ * Explicit classifier model for Claude Code Auto Mode safety checks (e.g. "RelayA/claude-opus-5").
39
+ * When unset, bare classifier requests check modelMap, then same-provider affinity from
40
+ * `claudeCode.model`, then compatible Anthropic-adapter providers, and finally fallbacks.
41
+ */
42
+ classifierModel?: string;
43
+ /**
44
+ * Ordered fallback candidates for Claude Code Auto Mode classifier routing when the primary
45
+ * classifier route is not available.
46
+ */
47
+ classifierFallbacks?: string[];
48
+ /**
49
+ * Inject ANTHROPIC_BASE_URL etc. into the macOS user domain via `launchctl setenv`
50
+ * so plain `claude` commands route through the proxy without `ocx claude`. Reverted
51
+ * on stop/shutdown. Default: false (opt-in). macOS only.
52
+ */
53
+ systemEnv?: boolean;
54
+ /**
55
+ * Auth mode for Claude Code inbound requests — a THREE-state intent.
56
+ *
57
+ * "proxy": inject the dummy ANTHROPIC_AUTH_TOKEN so Claude Code routes through the
58
+ * proxy without a real Anthropic key. "subscription": never inject it. UNSET means
59
+ * AUTO: the mode is resolved from detected Claude auth on every launch and every
60
+ * status read (src/claude/auth-mode.ts), so registering a Claude login switches the
61
+ * behaviour with no migration and no stored state.
62
+ *
63
+ * An explicit value always wins over detection and is never rewritten by the auto
64
+ * logic — that is what makes a manual choice stick (devlog 260726_claude_auth_auto).
65
+ */
66
+ authMode?: "proxy" | "subscription";
67
+ /**
68
+ * ISO timestamp of the one-time authMode migration. Before auto existed, choosing
69
+ * "Subscription" DELETED the key, so a pre-upgrade config cannot distinguish an
70
+ * explicit subscription choice from "never chose". Its ABSENCE identifies a
71
+ * pre-upgrade block; the migration writes it once and never re-runs, so a user who
72
+ * later picks Auto (which deletes authMode) is not silently converted back.
73
+ */
74
+ authModeMigratedAt?: string;
75
+ /**
76
+ * Context-window override for Claude Code/Desktop clients (devlog 136 B6):
77
+ * injected as CLAUDE_CODE_MAX_CONTEXT_TOKENS + DISABLE_COMPACT=1 (the official
78
+ * env pair — recognized claude-shaped ids need both). WARNING: DISABLE_COMPACT
79
+ * turns off auto-compaction. Unset = client defaults.
80
+ */
81
+ maxContextTokens?: number;
82
+ /**
83
+ * Opt-in CLAUDE_CODE_ALWAYS_ENABLE_EFFORT=1 injection. Default OFF: opus-shaped
84
+ * aliases already carry output_config.effort on the wire (devlog 136 실측), and
85
+ * forcing effort on every request can leak reasoning params to non-reasoning routes.
86
+ */
87
+ alwaysEnableEffort?: boolean;
88
+ /**
89
+ * Subagent tier slots (devlog 260712 B2): injected as ANTHROPIC_DEFAULT_*_MODEL so
90
+ * Claude Code's Agent-tool aliases (opus/sonnet/haiku/fable + parent-inherit) route
91
+ * to proxy models. haiku falls back to smallFastModel (one effective value feeds
92
+ * both ANTHROPIC_DEFAULT_HAIKU_MODEL and legacy ANTHROPIC_SMALL_FAST_MODEL).
93
+ */
94
+ tierModels?: { opus?: string; sonnet?: string; haiku?: string; fable?: string };
95
+ /**
96
+ * Auto-context (devlog 260712 020): when not false, routed/native models whose
97
+ * authoritative window is > 200k AND >= the compact window get the [1m] marker
98
+ * (Claude Code then accounts 1M) and CLAUDE_CODE_AUTO_COMPACT_WINDOW is injected
99
+ * so compaction fires at the real budget. 2.1.207 semantics (binary-verified):
100
+ * effective compact window = min(believed window, env) — one global env behaves
101
+ * like a per-model floor. Default: enabled. Inert while maxContextTokens is set
102
+ * (the legacy DISABLE_COMPACT pair takes rule-1 precedence in the CLI).
103
+ */
104
+ autoContext?: boolean;
105
+ /** Compact-window tokens for auto-context. Default 829_800 (AUTO_COMPACT_WINDOW_DEFAULT). */
106
+ autoCompactWindow?: number;
107
+ /**
108
+ * Bundled-skill content elision for ROUTED (non-Anthropic) models (devlog 260712
109
+ * 060): Skill-tool results whose skill name matches an entry here are replaced
110
+ * with a short stub in the anthropic->responses translation. Third-party models
111
+ * are not trained on these Anthropic doc bundles, and claude-api alone injects
112
+ * ~136k tokens (GitHub anthropics/claude-code#74473). Native Anthropic
113
+ * passthrough never goes through the translation, so Claude models keep the
114
+ * full content. Default: ["claude-api"]. Empty array = explicitly off.
115
+ */
116
+ blockedSkills?: string[];
117
+ /**
118
+ * Sync the featured subagent roster (config.subagentModels + main model) into
119
+ * ~/.claude/agents/ocx-*.md custom agent definitions at launch (devlog 260712
120
+ * 070) so any routed model is dispatchable as a subagent_type — the Agent
121
+ * tool's model argument is a hard 4-alias enum, but definition frontmatter is
122
+ * free. Only ocx-*.md files are owned/pruned. Default: enabled.
123
+ */
124
+ injectAgents?: boolean;
125
+ /**
126
+ * Optional Claude Code effort pinned in every generated ocx-* subagent
127
+ * definition. Unset inherits the parent session effort.
128
+ */
129
+ subagentEffort?: "low" | "medium" | "high" | "xhigh" | "max";
130
+ /** Claude-originated web-search override. Unset fields inherit the global sidecar settings. */
131
+ webSearchSidecar?: { backend?: "openai" | "anthropic" | "xai" | "gemini" | "exa"; model?: string };
132
+ /** Claude-originated vision override. Unset fields inherit the global sidecar settings. */
133
+ visionSidecar?: { backend?: "openai" | "anthropic" | "routed"; model?: string };
134
+ /** Persisted Claude Desktop four-family routing profile. */
135
+ desktopProfile?: OcxClaudeDesktopProfile;
136
+ /** Auto-reconcile Desktop 3P config when provider catalog changes. Default: enabled. */
137
+ desktopAutoApply?: boolean;
138
+ /**
139
+ * When false, omit `native/*` rows from Claude Desktop show/export/apply. Default: enabled.
140
+ * Routing-sidecar alias decoding is unchanged — only the Desktop model list writer.
141
+ */
142
+ desktopNativeModels?: boolean;
143
+ }
144
+
145
+ export type OcxClaudeDesktopFamily = "opus" | "fable" | "sonnet" | "haiku";
146
+
147
+ export interface OcxClaudeDesktopAssignment {
148
+ family: OcxClaudeDesktopFamily;
149
+ alias: string;
150
+ }
151
+
152
+ export interface OcxClaudeDesktopProfile {
153
+ version: 1;
154
+ assignments: Record<string, OcxClaudeDesktopAssignment>;
155
+ defaults: Record<OcxClaudeDesktopFamily, string | null>;
156
+ /** SHA-256 fingerprint of the last successfully applied 3P config content. */
157
+ appliedFingerprint?: string;
158
+ /** ISO timestamp of the last successful apply. */
159
+ appliedAt?: string;
160
+ }
161
+
162
+ /**
163
+ * Opt-in archived-session auto-cleanup policy (issue #42 Phase 3).
164
+ * Persisted under `OcxConfig.storageCleanupPolicy`. Default `enabled: false`.
165
+ */
166
+ export interface StorageCleanupPolicy {
167
+ /** When false/unset, the engine never mutates. Default false. */
168
+ enabled: boolean;
169
+ /** Run when archived session bytes exceed this threshold. */
170
+ trigger: { archivedBytesOver: number };
171
+ /** Either shrink archives toward a byte floor, or remove the oldest N%. */
172
+ target: { reduceToBytes?: number } | { removeOldestPercent?: number };
173
+ schedule: "startup" | "daily" | "weekly" | "manual";
174
+ /** Default quarantine. Permanent only when explicitly set. */
175
+ mode: "quarantine" | "permanent";
176
+ lastRun?: { at: number; freedBytes: number; removed: number };
177
+ /** Epoch ms when the next scheduled evaluation is due. */
178
+ nextRun?: number;
179
+ }
180
+
181
+ /** 사용자가 대시보드에서 직접 추가한 커스텀 모델 정의. */
182
+ export interface OcxCustomModel {
183
+ /** 고유 ID (crypto.randomUUID()) */
184
+ id: string;
185
+ /** 프로바이더 키 (기존 providers[name]) */
186
+ provider: string;
187
+ /** Native provider model id; slashes are allowed and encoded for Codex as provider/<hyphenated-id>. */
188
+ modelId: string;
189
+ /** 인간 가독 표시명 (선택, 슬래시 불가) */
190
+ displayName?: string;
191
+ /** 컨텍스트 윈도우 (토큰) */
192
+ contextWindow?: number;
193
+ /** 입력 모달리티 (선택, 기본 ["text"]) */
194
+ inputModalities?: string[];
195
+ /**
196
+ * Reasoning ladder (Codex labels) this custom row explicitly advertises. An empty array
197
+ * hides the effort control; an omitted key leaves the provider-derived ladder in charge.
198
+ */
199
+ reasoningEfforts?: string[];
200
+ /** Default effort label when `reasoningEfforts` is non-empty. */
201
+ defaultReasoningEffort?: string;
202
+ /**
203
+ * Codex tool calling mode override for this custom model.
204
+ * "code_mode_only" (default) sets entry.tool_mode = "code_mode_only".
205
+ * "shell" leaves tool_mode unset so Codex declares top-level shell tools (exec_command).
206
+ */
207
+ codexToolMode?: "code_mode_only" | "shell";
208
+ /** 추가 시각 (ISO 8601) */
209
+ addedAt?: string;
210
+ }
211
+
212
+ /**
213
+ * A generated `ocx_` data-plane key. `key` is the secret itself and never leaves
214
+ * the server except in the one-time POST /api/keys response; every other surface
215
+ * sees only the masked prefix.
216
+ */
217
+ export interface OcxApiKeyEntry {
218
+ id: string;
219
+ name: string;
220
+ key: string;
221
+ createdAt: string;
222
+ }
223
+
224
+ /**
225
+ * Durable per-client intent. One key today, deliberately.
226
+ *
227
+ * A top-level `codexEnabled` would force every later client to invent an
228
+ * unrelated name and its own helpers; a ten-key union recreated the coupling
229
+ * that failed two audits, because every phase then had to touch every client's
230
+ * write path. A one-key object keeps the extension point without letting this
231
+ * phase claim ownership over a client it does not implement.
232
+ */
233
+ export interface OcxClientIntegrationsConfig {
234
+ /** Durable desired state for native Codex. MISSING MEANS ON. */
235
+ codex?: boolean;
236
+ /** Durable desired state for Grok Build. MISSING MEANS ON. */
237
+ grok?: boolean;
238
+ /** Durable desired state for Claude Desktop. MISSING MEANS ON. */
239
+ "claude-desktop"?: boolean;
240
+ }
241
+
242
+ export interface OcxConfigRebaseProvenance {
243
+ version: 1;
244
+ deletedTopLevelKeys: string[];
245
+ }
246
+
247
+ export interface OcxConfig {
248
+ port: number;
249
+ /** Opt in to one identical-turn retry when a Responses completion has no text or tool call. */
250
+ emptyCompletionRetry?: boolean;
251
+ /**
252
+ * Whether a login may open a browser on the machine running the proxy.
253
+ *
254
+ * Absent and `true` both mean "open", which is what every existing install
255
+ * already does. Only an explicit `false` declines — for an operator who wants
256
+ * to paste the authorization URL into a different browser profile, or who is
257
+ * driving the dashboard from a different machine than the proxy.
258
+ *
259
+ * Deliberately a boolean and not an "auto" mode: inferring headlessness from
260
+ * SSH_CONNECTION or a missing DISPLAY breaks a working login silently when
261
+ * the guess is wrong.
262
+ */
263
+ oauthOpenBrowser?: boolean;
264
+ /** Maximum usage-log bytes read for one management snapshot. */
265
+ managementUsageMaxReadBytes?: number;
266
+ providers: Record<string, OcxProviderConfig>;
267
+ defaultProvider: string;
268
+ /** Persisted state for newly discovered provider models (#2464). Absent keeps legacy "on" behavior. */
269
+ modelDiscovery?: {
270
+ newModelPolicy?: "on" | "off";
271
+ knownModels?: Record<string, {
272
+ ids: string[];
273
+ removed: string[];
274
+ updatedAt: string;
275
+ /** Consecutive successful discoveries in which an active id was absent. */
276
+ missing?: Record<string, number>;
277
+ }>;
278
+ recentArrivals?: Record<string, Array<{ id: string; at: string }>>;
279
+ };
280
+ /** Enable the shipped model alias patterns for providers without an override. */
281
+ defaultModelAliases?: boolean;
282
+ /** Explicit top-level deletion intent used by stale whole-config rebases. */
283
+ configRebaseProvenance?: OcxConfigRebaseProvenance | Record<string, unknown>;
284
+ /** OpenAI provider-contract migration marker (v2 = single `openai` provider with account mode). */
285
+ openaiProviderTierVersion?: 1 | 2;
286
+ /** One-time migration marker for Antigravity's static-catalog defaults. */
287
+ googleAntigravityStaticCatalogVersion?: 1 | 2;
288
+ /** Claude Code inbound + launcher settings. */
289
+ claudeCode?: OcxClaudeCodeConfig;
290
+ /**
291
+ * Per-client durable intent. This phase owns only `codex`; later phases extend
292
+ * one key at a time rather than widening a shared union.
293
+ */
294
+ clientIntegrations?: OcxClientIntegrationsConfig;
295
+ /**
296
+ * Up to 5 Codex-facing catalog ids to feature first. Values may be bare catalog ids,
297
+ * exact account-qualified "<selector>/<native-openai-model>" ids, or routed
298
+ * "<provider>/<model>" ids. With account selectors, one bare native choice can expand
299
+ * into a selector-qualified group; Codex still advertises only the first 5 visible rows.
300
+ */
301
+ subagentModels?: string[];
302
+ /**
303
+ * Optional full picker ordering for the Codex model catalog, independent of the
304
+ * 5-slot `subagentModels` spawn_agent cap. DISPLAY-ONLY: it controls the visual order of
305
+ * the Codex model picker for large routed catalogs (10-20+ models) that would otherwise sort
306
+ * arbitrarily and reshuffle on every rebuild. Values are routed `<provider>/<model>` catalog
307
+ * slugs (matched by exact slug or `provider/id`); native OpenAI passthrough rows and
308
+ * account-qualified native rows are not reordered (order native rows via `subagentModels`).
309
+ * Listed routed rows appear in array order; rows not listed keep their normal display order.
310
+ * `subagentModels`-featured rows keep their top position. When unset or empty, catalog
311
+ * priority is unchanged. This changes ONLY what the user sees in the picker: the spawn_agent
312
+ * candidate set is derived from each row's natural priority and is provably unaffected, even
313
+ * when every routed row is listed (see opencodex_spawn_priority / effectiveSubagentRoster).
314
+ */
315
+ modelPickerOrder?: string[];
316
+ /**
317
+ * Priority-ordered fallback models for spawned sub-agents. When the requested
318
+ * model is quota-exhausted or recently failed, opencodex rewrites the child
319
+ * turn to the next available entry before routing.
320
+ */
321
+ subagentModelFallback?: string[];
322
+ /**
323
+ * Per-primary-model fallback chains for spawned sub-agents, keyed by the
324
+ * requested primary model id (bare native or "provider/model"). Entries for
325
+ * the matching key are consulted after the requested model and before the
326
+ * global `subagentModelFallback` list.
327
+ *
328
+ * This is the supported home for per-role fallback metadata: storing it as
329
+ * `model_fallback` inside `$CODEX_HOME/agents/*.toml` makes Codex >= 0.146
330
+ * reject the whole role file as an unknown field (#1190).
331
+ */
332
+ subagentModelFallbackByModel?: Record<string, string[]>;
333
+ /**
334
+ * TTL (ms) for cached sub-agent model availability probes. Default 60_000.
335
+ */
336
+ subagentModelFallbackPollMs?: number;
337
+ injectionModel?: string;
338
+ /**
339
+ * Opt in to synchronizing the selected injection model into Codex's native
340
+ * sub-agent defaults. Only meaningful while `injectionModel` is set.
341
+ */
342
+ syncCodexSubagentDefaults?: boolean;
343
+ /**
344
+ * Optional reasoning effort the delegation prompt tells the agent to pass in spawn_agent calls
345
+ * (`reasoning_effort` argument). Only meaningful while `injectionModel` is set; validated against
346
+ * the Codex ladder (src/reasoning-effort.ts CODEX_REASONING_LEVELS) at the API boundary.
347
+ */
348
+ injectionEffort?: string;
349
+ /**
350
+ * Explicit sideband websocket base for realtime/live joins, mirroring upstream's
351
+ * `experimental_realtime_ws_base_url`. The value is a ROOT (or a recognized
352
+ * `/realtime`, `/realtime/calls/<id>`, `/live/<id>` endpoint form, which is
353
+ * stripped back to the root); `/v1` is appended during normalization. Intended
354
+ * for local development against a fake realtime server — plaintext `http`/`ws`
355
+ * is accepted only for loopback hosts, and URL userinfo is rejected; both
356
+ * failures close to the canonical `https://api.openai.com/v1`. Configured by
357
+ * editing this file; there is deliberately no management-API or GUI surface.
358
+ */
359
+ experimentalRealtimeWsBaseUrl?: string;
360
+ /**
361
+ * Model ids the user has EXCLUDED from the Grok Build managed block. Absent or empty
362
+ * means "everything visible", which is the historical behaviour — so an existing
363
+ * config keeps the fence it already had.
364
+ *
365
+ * Exclusion list rather than an inclusion list on purpose: a newly added provider
366
+ * model should appear in Grok by default, exactly as it does today. An inclusion list
367
+ * would silently hide every future model behind a switch nobody knew to flip.
368
+ */
369
+ grokExcludedModels?: string[];
370
+ /**
371
+ * When true, OpenAI-routed requests include `service_tier: "priority"` (fast inference).
372
+ * When false, service_tier is stripped so requests use default speed.
373
+ * Undefined = passthrough (don't modify what the client sends).
374
+ */
375
+ fastMode?: boolean;
376
+ /**
377
+ * Windows/macOS SSE passthrough stream shape (#314 mitigation).
378
+ * On Windows, "auto" (default) selects eager relay only on a runtime proven
379
+ * to carry the Bun#32111 fix. On macOS, "auto" always stays on legacy tee and
380
+ * eager relay is explicit-only. "eager-relay" opts into the new relay (and
381
+ * accepts #32111 crash risk on Bun 1.3.14); "legacy-tee" pins the tee path.
382
+ * Persisted in config.json so service users can select the stream shape.
383
+ * See src/lib/bun-stream-caps.ts.
384
+ */
385
+ streamMode?: "auto" | "legacy-tee" | "eager-relay";
386
+ /**
387
+ * Custom override for the injected v2 multi-agent guidance body (the text inside
388
+ * the <multi_agent_mode> tags). After guidance is enabled and the v2 surface and
389
+ * catalog-state gates pass, a configured injectionModel is sufficient to render it;
390
+ * otherwise an eligible roster or fallback is required. Placeholders: `{{model}}` -> the
391
+ * effective preferred model for the request (a bare native model is account-qualified
392
+ * only when the request targets an explicit account selector; unresolved or ambiguous
393
+ * bare values become "", while unresolved explicit routed or account-qualified values
394
+ * remain unchanged),
395
+ * `{{effort}}` -> injectionEffort, `{{roster}}` -> the resolved sub-agent roster
396
+ * block ("" when nothing resolves), `{{fallback}}` -> the configured subagent
397
+ * model fallback guidance block ("" when unset).
398
+ */
399
+ injectionPrompt?: string;
400
+ /**
401
+ * Proxy-authored multi-agent developer guidance. Undefined/true = enabled for
402
+ * backward compatibility; false suppresses both v1 and v2 guidance injection.
403
+ */
404
+ multiAgentGuidanceEnabled?: boolean;
405
+ /**
406
+ * Global hard ceiling for the reasoning effort of EVERY proxied turn (main agent AND
407
+ * sub-agents). Ladder value "low".."max"; incoming efforts ranking above it are rewritten
408
+ * in both request shapes before any adapter or clamp. Unset = no cap. codex-rs converts
409
+ * ultra -> max client-side, so e.g. a "high" cap sends ultra/max-tier turns as high.
410
+ */
411
+ effortCap?: string;
412
+ /**
413
+ * Hard ceiling applied ONLY to sub-agent turns — requests carrying codex-rs's spawned-child
414
+ * markers (`x-openai-subagent` header, or `subagent_kind` inside `x-codex-turn-metadata`).
415
+ * Lets the main agent keep its tier while delegated children are capped. When both caps are
416
+ * set, the lower one wins for sub-agents. See src/server/effort-policy.ts.
417
+ */
418
+ subagentEffortCap?: string;
419
+ /**
420
+ * Models hidden from Codex discovery without blocking direct proxy calls. Routed provider ids
421
+ * are excluded from the catalog + /v1/models entirely. Account-qualified native ids hide only
422
+ * their generated selector row and are omitted from raw /v1/models. BARE native GPT ids hide
423
+ * the bare row plus every generated selector row and omit that model family from raw discovery.
424
+ */
425
+ disabledModels?: string[];
426
+ /** 사용자가 대시보드에서 직접 추가한 커스텀 모델 목록. */
427
+ customModels?: OcxCustomModel[];
428
+ /**
429
+ * Internal, versioned evidence for reconciling custom-model deletions with
430
+ * pre-marker Codex catalog rows. Consumers must parse this defensively so a
431
+ * future state written by a newer binary survives older whole-config saves.
432
+ */
433
+ customModelCatalogMigration?: unknown;
434
+ /**
435
+ * Shadow call intercept: redirect Codex's hard-coded helper calls (title generation,
436
+ * commit messages, skill orchestration) to a user-chosen model. Default intercepted
437
+ * source models: gpt-5.4-mini (older clients) and gpt-5.6-luna (Codex 0.145.0+).
438
+ * Opt-in; disabled by default. Matching maintenance/helper requests are forced to low.
439
+ * All requests for configured shadow source models are intercepted unconditionally.
440
+ */
441
+ shadowCallIntercept?: {
442
+ /** When true, requests for known shadow/helper source models are rewritten to the configured model. */
443
+ enabled?: boolean;
444
+ /** Replacement model id (e.g. "gpt-5.5"). */
445
+ model?: string;
446
+ /** Optional override of intercepted source-model prefixes (default: gpt-5.4-mini, gpt-5.6-luna). */
447
+ sourceModels?: string[];
448
+ };
449
+ /**
450
+ * 3-state multi-agent surface override:
451
+ * - "v1": force ALL models to v1 surface (override upstream pins)
452
+ * - "default" | undefined: respect upstream model pins (sol/terra=v2, luna=v1, rest=codex flag)
453
+ * - "v2": force ALL models to v2 surface (override upstream pins)
454
+ */
455
+ multiAgentMode?: "v1" | "default" | "v2";
456
+ /**
457
+ * When `multiAgentMode` is `"v2"`, keep ChatGPT-native catalog rows on v1.
458
+ * Routed parents get v2 tools; Sol/Terra can still spawn Grok/Claude (issue #92).
459
+ */
460
+ keepNativeChatGptOnV1?: boolean;
461
+ /** Experimental, default-off ChatGPT recovery for encrypted V2 routed tasks. */
462
+ agentTaskRecovery?: {
463
+ enabled?: boolean;
464
+ /** ChatGPT model used by the recovery request. Default: gpt-5.6-sol. */
465
+ model?: string;
466
+ /** Recovery request timeout in milliseconds. Default: 45000. */
467
+ timeoutMs?: number;
468
+ /** Maximum in-memory ciphertext-to-assignment entries. Default: 200. */
469
+ cacheEntries?: number;
470
+ };
471
+ /** Provider-level Codex-visible context caps. Values only lower known model context windows. */
472
+ providerContextCaps?: Record<string, number>;
473
+ /** Global Codex-visible context cap value (tokens). Falls back to DEFAULT_PROVIDER_CONTEXT_CAP. */
474
+ contextCapValue?: number;
475
+ /** Bind hostname. Default "127.0.0.1" (loopback only). Set "0.0.0.0" to expose on all interfaces. */
476
+ hostname?: string;
477
+ /**
478
+ * Optional second listener bound to 127.0.0.1 that admits data-plane requests without a
479
+ * credential (issue #1102).
480
+ *
481
+ * Why a separate listener rather than an exemption on the main one: when `hostname` is a
482
+ * wildcard, every caller needs `x-opencodex-api-key`, but a `codex app-server` spawned
483
+ * directly from the resolved entrypoint never goes through the generated shim and so never
484
+ * inherits the token. Exempting "loopback-looking peers" on the public listener would be
485
+ * unsound — `requestIP()` only proves the last transport hop, and Docker Desktop port
486
+ * forwarding, host-network containers, WSL mirrored networking and tunnels all terminate
487
+ * remote connections locally. Binding a second socket to 127.0.0.1 makes the kernel refuse
488
+ * remote connections outright, so there is no address to judge.
489
+ *
490
+ * The public listener's admission policy is unchanged. This adds an explicit local trust
491
+ * surface: every process on the machine can reach it, spend account quota, and consume paid
492
+ * provider credentials. Off by default; not for multi-tenant hosts.
493
+ *
494
+ * The port is required when enabled and must differ from the proxy port. An OS-assigned port
495
+ * would change across restarts, which would break already-running app-servers holding the
496
+ * previous `base_url` — the exact symptom #1102 reported and we disproved for token rotation.
497
+ */
498
+ unauthenticatedLoopbackListener?:
499
+ | { enabled: false }
500
+ | { enabled: true; port: number };
501
+ /**
502
+ * Outbound HTTP(S) proxy URL for provider requests (e.g. "http://user:pass@proxy:8080", or
503
+ * "${HTTPS_PROXY}"-style env reference). Mirrored into HTTP_PROXY/HTTPS_PROXY at startup when
504
+ * those are unset — Bun's fetch honors them for all outbound calls; localhost is excluded.
505
+ */
506
+ proxy?: string;
507
+ /**
508
+ * Hosts that bypass `proxy` for OpenCodex's own outbound provider calls, merged into
509
+ * NO_PROXY at startup. Accepts a comma-separated string (NO_PROXY syntax) or an array.
510
+ * Loopback is always excluded regardless of this setting, and an inherited NO_PROXY is
511
+ * preserved — this ADDS entries, it never replaces the environment.
512
+ */
513
+ noProxy?: string | string[];
514
+ /**
515
+ * Upstream stall timeout (seconds). After this many seconds of no upstream data, emits
516
+ * response.incomplete. Default 300. Min 1.
517
+ */
518
+ stallTimeoutSec?: number;
519
+ /** Connect timeout (ms) for upstream fetch — covers DNS, TCP, TLS, and response header. Default 200000. */
520
+ connectTimeoutMs?: number;
521
+ /** Graceful shutdown drain timeout (ms). Active turns are aborted after this deadline. Default 5000. */
522
+ shutdownTimeoutMs?: number;
523
+ /** Advertise supports_websockets so Codex opens the WS endpoint. Default false; set true to opt in. */
524
+ websockets?: boolean;
525
+ /**
526
+ * Opt-in auto-cleanup policy for archived Codex sessions (issue #42 Phase 3).
527
+ * Default OFF (`enabled` false / unset). Never enabled implicitly.
528
+ * See `src/storage/policy.ts`.
529
+ */
530
+ storageCleanupPolicy?: StorageCleanupPolicy;
531
+ /** Generated API keys for external access to the proxy's /v1/responses endpoint. */
532
+ apiKeys?: OcxApiKeyEntry[];
533
+ /** Auto-start/sync the proxy from the Codex shim before launching Codex. Default true. */
534
+ codexAutoStart?: boolean;
535
+ /** Restore an installed shim after a stable external Codex update replaces it. Default true. */
536
+ codexShimAutoRestore?: boolean;
537
+ /**
538
+ * Compatibility mode: temporarily rewrite Codex resume-history metadata while the proxy is active
539
+ * so Codex App can show old OpenAI chats and opencodex-created exec chats under its default
540
+ * interactive-source/provider filters. Default true; originals are backed up and restored by
541
+ * `ocx stop` / `ocx restore`. Set false to opt out of history remapping.
542
+ */
543
+ syncResumeHistory?: boolean;
544
+ /** Freshness window (ms) for the per-provider live `/models` cache. Defaults to 5 min. */
545
+ modelCacheTtlMs?: number;
546
+ /** Evictable retained app-state budget in MiB. Default 256; valid 64..4096. */
547
+ appOwnedMemoryBudgetMb?: number;
548
+ /** Anthropic prompt-cache retention: "short" = 5-min ephemeral (default), "long" = 1-hour extended, "none" = disabled. */
549
+ cacheRetention?: "none" | "short" | "long";
550
+ /** Web-search sidecar: route web_search for non-OpenAI models through a gpt-mini via ChatGPT passthrough. */
551
+ webSearchSidecar?: OcxWebSearchSidecarConfig;
552
+ /** Vision sidecar: describe images via a gpt vision model so text-only models can "see" them. */
553
+ visionSidecar?: OcxVisionSidecarConfig;
554
+ /** /v1/images relay for codex's built-in image_gen tool. */
555
+ images?: OcxImagesConfig;
556
+ /** /v1/alpha/search relay for codex's built-in web search client. */
557
+ search?: OcxSearchConfig;
558
+ /** Codex multi-account pool. */
559
+ codexAccounts?: CodexAccount[];
560
+ /** Account ids administratively excluded from future pool selection until resumed. */
561
+ pausedCodexAccountIds?: string[];
562
+ /**
563
+ * Selection order per account id, higher used earlier; absent = 0. Keyed by id
564
+ * rather than stored on `codexAccounts` rows so the Desktop login (`__main__`),
565
+ * which has no row, can be ordered too. Range -100..100.
566
+ */
567
+ codexAccountPriorities?: Record<string, number>;
568
+ /**
569
+ * Account id the operator last selected by hand. Suppresses upward priority
570
+ * preemption until that account crosses the auto-switch threshold. Stores the
571
+ * id (not a flag) so a stale pin cannot outlive the selection it described.
572
+ */
573
+ activeCodexAccountPinned?: string;
574
+ /**
575
+ * Public model-selector namespaces bound to one Codex account. Values are stored account ids;
576
+ * `"@main"` selects the Codex Desktop/main auth.json account. Account display aliases
577
+ * are intentionally separate from these selectors.
578
+ */
579
+ codexAccountNamespaces?: Record<string, string>;
580
+ /**
581
+ * Picker visibility override for account-qualified native models. When omitted, a non-empty
582
+ * selector map remains visible for compatibility with hand-written configurations.
583
+ */
584
+ codexAccountPickerEnabled?: boolean;
585
+ /**
586
+ * Show the GPT-5.3-Codex-Spark weekly window on Codex quota surfaces. Default false.
587
+ *
588
+ * Spark is a single-model window that reads 0% for most operators, and on a multi-account
589
+ * pool it doubles the bar count for information almost nobody acts on. Hidden by default and
590
+ * revealed by an explicit `true`; a malformed value reads as hidden rather than rejecting the
591
+ * whole config.
592
+ */
593
+ showCodexSparkQuota?: boolean;
594
+ /** Active pool account id for next session. undefined = main (passthrough as-is). */
595
+ activeCodexAccountId?: string;
596
+ /** Auto-switch threshold (0-100). Default 80. 0 = disabled. */
597
+ autoSwitchThreshold?: number;
598
+ /** New-session account rotation strategy for the Codex pool. Default quota (today's behaviour). */
599
+ accountPoolStrategy?: OcxAccountPoolRotationStrategy;
600
+ /** Successful new-session binds retained on one round-robin selection. Default 1; range 1..100. */
601
+ accountPoolStickyLimit?: number;
602
+ /** Consecutive non-2xx upstream responses before switching future new threads. Default 3. 0 = disabled. */
603
+ upstreamFailoverThreshold?: number;
604
+ /**
605
+ * Opt-in provider-origin circuit threshold for proven pre-connection reachability failures.
606
+ * Default 0 (disabled); range 0..20. The circuit never counts timeouts or HTTP responses.
607
+ */
608
+ upstreamHostCircuitThreshold?: number;
609
+ /**
610
+ * Opt-in Anthropic OAuth account pool (#294). Default OFF.
611
+ * Failover on 429 + sticky affinity; new sessions may pick lowest known 5h usage.
612
+ * Experimental — see docs and GUI warning before enabling.
613
+ */
614
+ anthropicAccountPool?: {
615
+ enabled?: boolean;
616
+ /** Usage % threshold for new-session auto-pick. Default 80. 0 = disabled (affinity/active only). */
617
+ autoSwitchThreshold?: number;
618
+ /** New-session rotation strategy. Default quota (today's behaviour). */
619
+ strategy?: OcxAccountPoolRotationStrategy;
620
+ /** Successful new-session binds retained on one round-robin selection. Default 1; range 1..100. */
621
+ stickyLimit?: number;
622
+ };
623
+ /**
624
+ * Generic OAuth multi-account 429 failover (#2568). Presence-driven by default.
625
+ *
626
+ * Rotates to another logged-in account of the SAME provider when one is rate-limited, for
627
+ * OAuth providers that have no pool of their own — xAI, Cursor, Kimi, GitHub Copilot,
628
+ * Antigravity, Nous. The Codex pool and the Anthropic pool own their own rotation and are
629
+ * excluded; this setting changes neither.
630
+ *
631
+ * With the key absent, rotation activates when a provider has 2 or more eligible stored
632
+ * accounts — the same consent rule API-key pools already apply to a 2+ key pool (#2568d). A
633
+ * single account is a strict no-op. Set `false` to keep strict single-account behaviour;
634
+ * `providers.<name>.oauthAccountFailover` overrides this per provider.
635
+ */
636
+ oauthAccountFailover?: {
637
+ enabled?: boolean;
638
+ };
639
+ /** Virtual `combo/<id>` models spanning concrete provider/model targets (issue #133). */
640
+ combos?: Record<string, OcxComboConfig>;
641
+ /**
642
+ * Routing policy profiles (Router Intelligence, RI-04+): explicitly requested
643
+ * `policy/<id>` (or configured alias) models select among an explicit
644
+ * candidate allowlist using hard capability requirements and deterministic
645
+ * scoring. Existing model ids are never routed through profiles implicitly.
646
+ */
647
+ routingProfiles?: Record<string, OcxRoutingProfileConfig>;
648
+ /** Background proactive token refresh ("Token Guardian"). Off by default; see OcxTokenGuardianConfig. */
649
+ tokenGuardian?: OcxTokenGuardianConfig;
650
+ /** Additional exact origins allowed for CORS (e.g. HTTPS or chrome-extension://<id>). Loopback origins are always allowed. */
651
+ corsAllowOrigins?: string[];
652
+ }
653
+
654
+ export type OcxAccountPoolRotationStrategy = "quota" | "round-robin" | "fill-first";
655
+
656
+ export type OcxComboStrategy = "failover" | "round-robin";
657
+ export type OcxComboDefaultEffort = "low" | "medium" | "high" | "xhigh" | "max" | "ultra";
658
+
659
+ export interface OcxComboTarget {
660
+ provider: string;
661
+ model: string;
662
+ /** Relative SWRR batch weight. Default 1; valid range 1..10000. */
663
+ weight?: number;
664
+ }
665
+
666
+ export interface OcxComboConfig {
667
+ targets: OcxComboTarget[];
668
+ /** Ordered failover (default) or deterministic smooth weighted round-robin. */
669
+ strategy?: OcxComboStrategy;
670
+ /** Successful requests retained on one RR selection batch. Default 1; range 1..100. */
671
+ stickyLimit?: number;
672
+ /** Used when the client omits reasoning.effort. null/omitted leaves the target default unchanged. */
673
+ defaultEffort?: OcxComboDefaultEffort | null;
674
+ /**
675
+ * Disable image input even when every target supports it.
676
+ * Omitted / `"auto"` keeps automatic capability derivation (default: enabled when
677
+ * the target intersection includes image).
678
+ */
679
+ imageInput?: "auto" | "disabled";
680
+ /**
681
+ * Optional public model name replacing the default `combo/<id>` slug. Bare names
682
+ * without "/" are allowed (e.g. "deepseek-v4-flash") so the combo can answer to a
683
+ * mandated model id; exact-match requests route here before any provider resolution.
684
+ */
685
+ alias?: string;
686
+ /**
687
+ * Explicitly allow a bare OpenAI-native alias (for example `gpt-5.6-sol`) to
688
+ * be represented by this routed combo. Never inferred from `alias`.
689
+ */
690
+ nativeAlias?: boolean;
691
+ /** Display-only label for the public catalog row. Required for native aliases. */
692
+ displayName?: string;
693
+ }
694
+
695
+ export type OcxRoutingUnknownEvidenceMode = "allow" | "penalize" | "exclude";
696
+
697
+ export interface OcxRoutingProfileCandidate {
698
+ provider: string;
699
+ model: string;
700
+ }
701
+
702
+ export interface OcxRoutingProfileRequirements {
703
+ /** Minimum model context window in tokens. */
704
+ minContextWindow?: number;
705
+ /** Minimum remaining quota headroom fraction (0..1). */
706
+ minQuotaHeadroom?: number;
707
+ tools?: boolean;
708
+ imageInput?: boolean;
709
+ structuredOutput?: boolean;
710
+ reasoningEffort?: string;
711
+ serviceTier?: string;
712
+ localOnly?: boolean;
713
+ remoteAllowed?: boolean;
714
+ /** Special encrypted Codex task readability (ChatGPT forward pool). */
715
+ encryptedCodexTasks?: boolean;
716
+ }
717
+
718
+ export interface OcxRoutingProfileOptimize {
719
+ latency?: number;
720
+ health?: number;
721
+ cost?: number;
722
+ quota?: number;
723
+ }
724
+
725
+ /**
726
+ * Policy for the hard cost ceiling when a candidate has no finite cost
727
+ * estimate. `"allow"` (default) preserves the documented dry-run contract:
728
+ * the cap only excludes evidence known to exceed it, and the candidate's
729
+ * `cost.capOutcome` is `"unknown-allowed"`. `"exclude"` makes the ceiling
730
+ * fail-closed (`cost-limit-unknown` + `capOutcome: "unknown-excluded"`).
731
+ */
732
+ export type OcxRoutingUnknownCostCapMode = "allow" | "exclude";
733
+
734
+ export interface OcxRoutingProfileLimits {
735
+ /** Hard per-request estimated-cost ceiling in USD. */
736
+ maxEstimatedCostUsd?: number;
737
+ /**
738
+ * How `maxEstimatedCostUsd` behaves when the estimate is unknown.
739
+ * Defaults to `"allow"` (eligible + `cost.capOutcome: "unknown-allowed"`);
740
+ * opt in to `"exclude"` for a true hard ceiling.
741
+ */
742
+ onUnknownCost?: OcxRoutingUnknownCostCapMode;
743
+ }
744
+
745
+ export interface OcxRoutingProfileUnknownEvidence {
746
+ capability?: OcxRoutingUnknownEvidenceMode;
747
+ health?: OcxRoutingUnknownEvidenceMode;
748
+ quota?: OcxRoutingUnknownEvidenceMode;
749
+ cost?: OcxRoutingUnknownEvidenceMode;
750
+ }
751
+
752
+ export interface OcxRoutingProfileCompatibilitySuite {
753
+ suiteId: string;
754
+ evidenceLayer: "protocol_conformance" | "live_route_compatibility";
755
+ }
756
+
757
+ export interface OcxRoutingProfileCompatibility {
758
+ requiredSuites?: OcxRoutingProfileCompatibilitySuite[];
759
+ minStatus?: "PROBED" | "VERIFIED";
760
+ maxEvidenceAgeMs?: number;
761
+ unknownEvidence?: OcxRoutingUnknownEvidenceMode;
762
+ degradedEvidence?: OcxRoutingUnknownEvidenceMode;
763
+ }
764
+
765
+ export interface OcxRoutingProfileConfig {
766
+ /**
767
+ * Explicit candidate allowlist (`provider/model` refs). No implicit
768
+ * expansion in v1.
769
+ */
770
+ candidates: OcxRoutingProfileCandidate[];
771
+ /** Optional public model name replacing the default `policy/<id>` slug. */
772
+ alias?: string;
773
+ /** Hard requirements evaluated before scoring. */
774
+ require?: OcxRoutingProfileRequirements;
775
+ /** Optimization weights; normalized deterministically. */
776
+ optimize?: OcxRoutingProfileOptimize;
777
+ limits?: OcxRoutingProfileLimits;
778
+ /** How unknown evidence is handled per dimension. */
779
+ unknownEvidence?: OcxRoutingProfileUnknownEvidence;
780
+ /** Optional Compatibility Lab policy (CL-06). */
781
+ compatibility?: OcxRoutingProfileCompatibility;
782
+ }
783
+
784
+
785
+ export interface OcxTokenGuardianConfig {
786
+ /** Global kill-switch. Default false — the guardian does nothing unless explicitly enabled. */
787
+ enabled?: boolean;
788
+ /** Seconds between refresh sweeps. Default 21600 (6h). Min 60. */
789
+ tickSeconds?: number;
790
+ /** Random 0..jitterSeconds added before each sweep to de-synchronize. Default 300. */
791
+ jitterSeconds?: number;
792
+ /** Max concurrent refreshes per sweep. Default 3. Min 1. */
793
+ concurrency?: number;
794
+ /** Extra lead (seconds) beyond one tick when deciding a token is "expiring soon". Default 900. */
795
+ leadSeconds?: number;
796
+ /** First backoff (seconds) after a permanent refresh failure. Default 300. */
797
+ failureBackoffBaseSeconds?: number;
798
+ /** Backoff ceiling (seconds). Default 3600. */
799
+ failureBackoffMaxSeconds?: number;
800
+ /** Optional Codex pool session warmup sweep. Default false to avoid background synthetic traffic. */
801
+ codexWarmupEnabled?: boolean;
802
+ /** Max age before a Codex pool account is revalidated via `/codex/responses`. Default 691200 (8d). */
803
+ codexWarmupMaxAgeSeconds?: number;
804
+ /** Model used for optional Codex pool warmup. Default gpt-5.4-mini. */
805
+ codexWarmupModel?: string;
806
+ }
807
+
808
+ export interface OcxImagesConfig {
809
+ /** Optional custom API-key provider for /v1/images relays. Built-in OpenAI tiers remain automatic. */
810
+ provider?: string;
811
+ /** Upstream timeout (ms) for one image generation/edit call (bridge xAI + /v1/images relay). Default 60000 for the bridge; relay may use a higher default (300000). */
812
+ timeoutMs?: number;
813
+ /** Master switch for the image bridge. Default false — set true to enable paid xAI Grok Imagine generation. */
814
+ bridgeEnabled?: boolean;
815
+ /** xAI image model id. Default "grok-imagine-image-quality" (see DEFAULT_MODEL in images/plan.ts). */
816
+ bridgeModel?: string;
817
+ /** Max image-generation loop iterations before forced-final. Default 3; clamped to [0, 10]. */
818
+ maxRounds?: number;
819
+ /** Max files retained under artifacts/. Oldest deleted when exceeded. Default 200. */
820
+ artifactsKeepCount?: number;
821
+ /** Master switch for the video bridge. Default false — must be explicitly opted in. */
822
+ videoBridgeEnabled?: boolean;
823
+ /** Model for xAI video generation. Default "grok-imagine-video". */
824
+ videoBridgeModel?: string;
825
+ /** Max video-gen rounds before forced-final. Default 2 (video is slower than image). */
826
+ videoMaxRounds?: number;
827
+ /** Per-video generation timeout (ms) including polling. Default 300000 (5 min). */
828
+ videoTimeoutMs?: number;
829
+ }
830
+
831
+ export interface OcxSearchConfig {
832
+ /**
833
+ * Total upstream deadline (ms) for one /v1/alpha/search relay. Default 200000. The endpoint
834
+ * is non-streaming JSON (headers arrive only when the search completes), so this is a whole-
835
+ * request budget — deliberately NOT connectTimeoutMs, which is a header-arrival budget.
836
+ */
837
+ timeoutMs?: number;
838
+ }
839
+
840
+ export interface OcxVisionSidecarConfig {
841
+ /** Master switch. Default: enabled when the selected backend has a usable credential. */
842
+ enabled?: boolean;
843
+ /**
844
+ * Description backend. Unset prefers a usable stored Anthropic OAuth credential, else OpenAI —
845
+ * the historical default order, deliberately unchanged by the union widening (#2188 roadmap
846
+ * 170/180 revised): "routed" describes through the proxy's OWN routing (loopback
847
+ * /v1/chat/completions) with a NAMESPACED "provider/model" describer, is explicit-only, and is
848
+ * never auto-selected from credential availability.
849
+ */
850
+ backend?: "openai" | "anthropic" | "routed";
851
+ /** Vision model that describes images. */
852
+ model?: string;
853
+ /** Max description cache misses admitted in one main-model turn. Zero disables description calls. */
854
+ maxDescriptionsPerTurn?: number;
855
+ /** Sidecar fetch timeout (ms). */
856
+ timeoutMs?: number;
857
+ }
858
+
859
+ export interface OcxWebSearchSidecarConfig {
860
+ /** Master switch. Default: enabled when a forward (ChatGPT) provider exists and the caller is logged in. */
861
+ enabled?: boolean;
862
+ /**
863
+ * Which backend actually runs the server-side search. "openai" replays the hosted web_search via
864
+ * the ChatGPT forward provider (gpt-mini sidecar); "anthropic" runs web_search_20250305 on a Claude
865
+ * model authenticated by the STORED anthropic OAuth credential. "xai" runs Grok hosted web_search
866
+ * and optional x_search through stored Grok OAuth. "gemini" (google_search grounding via the
867
+ * Antigravity CCA transport) and "exa" (non-LLM search JSON via an operator key) are explicit-only
868
+ * and stay inactive until their executors ship. Unset ALWAYS resolves to "openai"; no backend is ever
869
+ * auto-selected from credential availability (that once sent incompatible models to the
870
+ * Anthropic API — see resolveSidecarBackend).
871
+ */
872
+ backend?: "openai" | "anthropic" | "xai" | "gemini" | "exa";
873
+ /** Sidecar model that runs the real server-side web_search (must be a native ChatGPT model). */
874
+ model?: string;
875
+ /**
876
+ * Operator-supplied Exa API key for the "exa" backend. Management GET responses never echo it,
877
+ * and src/lib/redact.ts strips it from any logged structure or error string.
878
+ */
879
+ exaApiKey?: string;
880
+ /**
881
+ * Opt-in X (Twitter) search for the xai backend: adds the hosted x_search tool next to
882
+ * web_search. Limits are doc-validated at the management layer AND in the executor:
883
+ * handles <=20 per list, allow XOR exclude, ISO-8601 dates.
884
+ */
885
+ xSearch?: {
886
+ enabled?: boolean;
887
+ allowedXHandles?: string[];
888
+ excludedXHandles?: string[];
889
+ fromDate?: string;
890
+ toDate?: string;
891
+ };
892
+ /** Reasoning effort for the sidecar — "minimal" (non-thinking) keeps it fast/cheap. */
893
+ reasoning?: string;
894
+ /** Max searches executed per main-model turn (loop guard). */
895
+ maxSearchesPerTurn?: number;
896
+ /** Sidecar fetch timeout (ms). */
897
+ timeoutMs?: number;
898
+ /**
899
+ * Config-file-only deadline (ms) for continuous routed-model response-body raw-byte inactivity
900
+ * during a web-search turn. Default 200000. Must be an integer from 1 through 2147483647.
901
+ */
902
+ routedModelStallTimeoutMs?: number;
903
+ /**
904
+ * Stream the routed model's leading output (text/thinking deltas) live instead of buffering the
905
+ * whole iteration. Live delivery stops at the first tool-call boundary so web_search interception
906
+ * stays atomic. Tradeoff: text the model emits BEFORE deciding to search — which buffered mode
907
+ * silently drops — becomes visible to the client and may partially repeat in the post-search
908
+ * answer. Default: false (buffered, previous behavior).
909
+ */
910
+ streamRoutedModelOutput?: boolean;
911
+ }