@iislee/opencodex 2.11.0 → 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 (675) hide show
  1. package/AGENTS_INSTALL.md +109 -0
  2. package/README.md +114 -19
  3. package/bin/ocx.mjs +164 -36
  4. package/bin/package-main.mjs +1 -1
  5. package/gui/dist/assets/index-BF38heuV.js +104 -0
  6. package/gui/dist/assets/index-DMiI18Kv.css +1 -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 +19 -10
  42. package/src/adapters/anthropic-output-schema.ts +137 -0
  43. package/src/adapters/anthropic.ts +376 -52
  44. package/src/adapters/base.ts +54 -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 +601 -0
  48. package/src/adapters/cursor/checkpoint-store.ts +303 -0
  49. package/src/adapters/cursor/cursor-errors.ts +129 -6
  50. package/src/adapters/cursor/discovery.ts +61 -4
  51. package/src/adapters/cursor/effort-map.ts +27 -3
  52. package/src/adapters/cursor/framing.ts +39 -0
  53. package/src/adapters/cursor/h2-pool.ts +123 -0
  54. package/src/adapters/cursor/http1-bidi.ts +361 -0
  55. package/src/adapters/cursor/images.ts +704 -0
  56. package/src/adapters/cursor/live-models.ts +174 -58
  57. package/src/adapters/cursor/live-transport.ts +609 -170
  58. package/src/adapters/cursor/native-exec-common.ts +23 -2
  59. package/src/adapters/cursor/native-exec-fs.ts +10 -7
  60. package/src/adapters/cursor/native-exec-network.ts +1 -1
  61. package/src/adapters/cursor/native-exec-shell.ts +0 -1
  62. package/src/adapters/cursor/native-exec.ts +101 -14
  63. package/src/adapters/cursor/protobuf-events.ts +829 -11
  64. package/src/adapters/cursor/protobuf-request.ts +383 -65
  65. package/src/adapters/cursor/request-builder.ts +237 -31
  66. package/src/adapters/cursor/tool-definitions.ts +242 -12
  67. package/src/adapters/cursor/tool-result-normalize.ts +92 -0
  68. package/src/adapters/cursor/transport.ts +22 -0
  69. package/src/adapters/cursor/types.ts +28 -1
  70. package/src/adapters/cursor.ts +133 -7
  71. package/src/adapters/google-antigravity-replay.ts +558 -34
  72. package/src/adapters/google-antigravity-wire.ts +43 -10
  73. package/src/adapters/google-http.ts +38 -10
  74. package/src/adapters/google-tool-schema.ts +80 -15
  75. package/src/adapters/google-truncation.ts +11 -0
  76. package/src/adapters/google.ts +618 -74
  77. package/src/adapters/identity.ts +39 -6
  78. package/src/adapters/kiro-errors.ts +11 -0
  79. package/src/adapters/kiro-events.ts +19 -1
  80. package/src/adapters/kiro-thinking.ts +18 -2
  81. package/src/adapters/kiro-tools.ts +10 -1
  82. package/src/adapters/kiro.ts +92 -54
  83. package/src/adapters/mimo-free.ts +17 -0
  84. package/src/adapters/openai-chat-url.ts +11 -0
  85. package/src/adapters/openai-chat.ts +1311 -336
  86. package/src/adapters/openai-responses-url.ts +16 -0
  87. package/src/adapters/openai-responses.ts +830 -56
  88. package/src/adapters/registry.ts +175 -0
  89. package/src/adapters/responses-tool-schema.ts +67 -0
  90. package/src/adapters/tool-call-id.ts +119 -0
  91. package/src/adapters/tool-catalog-nudge.ts +104 -21
  92. package/src/adapters/xai-web-search.ts +185 -0
  93. package/src/bridge.ts +428 -61
  94. package/src/chat/inbound.ts +43 -19
  95. package/src/chat/outbound.ts +82 -26
  96. package/src/claude/agents-inject.ts +32 -9
  97. package/src/claude/context-windows.ts +21 -5
  98. package/src/claude/desktop-3p.ts +243 -9
  99. package/src/claude/gateway-cache.ts +41 -4
  100. package/src/claude/inbound.ts +72 -3
  101. package/src/claude/model-info.ts +38 -15
  102. package/src/claude/outbound.ts +70 -16
  103. package/src/cli/account-api.ts +35 -1
  104. package/src/cli/account-auth.ts +33 -6
  105. package/src/cli/account-catalog-refresh.ts +14 -0
  106. package/src/cli/account-extended.ts +389 -2
  107. package/src/cli/account-main.ts +317 -0
  108. package/src/cli/account.ts +30 -6
  109. package/src/cli/agent.ts +45 -1
  110. package/src/cli/claude-agent-startup-sync.ts +73 -0
  111. package/src/cli/claude-desktop.ts +29 -4
  112. package/src/cli/claude.ts +103 -34
  113. package/src/cli/codex-log-guard-doctor.ts +103 -0
  114. package/src/cli/codex-shim-autorestore.ts +2 -0
  115. package/src/cli/codex-shim-readiness.ts +76 -0
  116. package/src/cli/combo.ts +8 -0
  117. package/src/cli/config-command.ts +74 -10
  118. package/src/cli/dispatch.ts +593 -0
  119. package/src/cli/doctor.ts +315 -43
  120. package/src/cli/ensure-desired-integrations.ts +152 -0
  121. package/src/cli/export-command.ts +46 -20
  122. package/src/cli/help.ts +20 -271
  123. package/src/cli/index.ts +378 -519
  124. package/src/cli/init.ts +4 -17
  125. package/src/cli/integrations.ts +120 -2
  126. package/src/cli/lab.ts +607 -0
  127. package/src/cli/launcher-context.ts +77 -0
  128. package/src/cli/minimax.ts +497 -0
  129. package/src/cli/models-runtime.ts +35 -2
  130. package/src/cli/models.ts +100 -14
  131. package/src/cli/observe.ts +92 -3
  132. package/src/cli/opencode.ts +4 -2
  133. package/src/cli/provider-runtime.ts +18 -1
  134. package/src/cli/provider.ts +24 -3
  135. package/src/cli/ready.ts +301 -0
  136. package/src/cli/registry.ts +437 -0
  137. package/src/cli/root.ts +86 -0
  138. package/src/cli/route-policy.ts +92 -0
  139. package/src/cli/runtime-api.ts +6 -3
  140. package/src/cli/star-prompt.ts +71 -15
  141. package/src/cli/status.ts +10 -3
  142. package/src/cli/system-restart-client.ts +146 -0
  143. package/src/cli/tray-proxy.ts +153 -6
  144. package/src/cli/v2.ts +105 -10
  145. package/src/cli.ts +1 -1
  146. package/src/clients/config-export.ts +1358 -21
  147. package/src/codex/account-label.ts +14 -1
  148. package/src/codex/account-lifecycle.ts +130 -13
  149. package/src/codex/account-namespaces.ts +49 -3
  150. package/src/codex/account-priority.ts +83 -0
  151. package/src/codex/account-store.ts +29 -2
  152. package/src/codex/account-usability.ts +25 -2
  153. package/src/codex/admission.ts +256 -0
  154. package/src/codex/affinity-debug.ts +162 -0
  155. package/src/codex/app-server-processes.ts +493 -106
  156. package/src/codex/app-server-restart-service.ts +232 -0
  157. package/src/codex/auth-api.ts +849 -242
  158. package/src/codex/auth-collision.ts +5 -3
  159. package/src/codex/auth-context.ts +345 -32
  160. package/src/codex/autostart-health.ts +8 -1
  161. package/src/codex/catalog/account-models.ts +67 -0
  162. package/src/codex/catalog/aggregation.ts +68 -10
  163. package/src/codex/catalog/bundled.ts +331 -33
  164. package/src/codex/catalog/effort.ts +121 -30
  165. package/src/codex/catalog/filesystem-evidence.ts +302 -0
  166. package/src/codex/catalog/kinds.ts +2 -0
  167. package/src/codex/catalog/metadata.ts +529 -45
  168. package/src/codex/catalog/native-models.ts +72 -0
  169. package/src/codex/catalog/parsing.ts +224 -30
  170. package/src/codex/catalog/provider-fetch.ts +1460 -134
  171. package/src/codex/catalog/sync.ts +1449 -186
  172. package/src/codex/catalog-admission.ts +199 -0
  173. package/src/codex/catalog-refresh-status.ts +105 -0
  174. package/src/codex/catalog-write-serialization.ts +242 -0
  175. package/src/codex/catalog.ts +6 -3
  176. package/src/codex/codex-write-lock.ts +384 -0
  177. package/src/codex/convergence-types.ts +614 -0
  178. package/src/codex/convergence.ts +651 -0
  179. package/src/codex/coordinator-doctor.ts +332 -0
  180. package/src/codex/custom-model-catalog-migration.ts +176 -0
  181. package/src/codex/desired-state.ts +230 -0
  182. package/src/codex/features.ts +636 -39
  183. package/src/codex/generation.ts +202 -0
  184. package/src/codex/history-job.ts +407 -0
  185. package/src/codex/history-lock.ts +242 -0
  186. package/src/codex/history-migration-guardian.ts +26 -20
  187. package/src/codex/history-provider.ts +231 -28
  188. package/src/codex/history-transition.ts +105 -0
  189. package/src/codex/history-worker.ts +220 -0
  190. package/src/codex/inject-coordination.ts +290 -0
  191. package/src/codex/inject.ts +1073 -152
  192. package/src/codex/injected-marker.ts +37 -3
  193. package/src/codex/integration-record.ts +266 -0
  194. package/src/codex/internal/catalog-writer.ts +203 -0
  195. package/src/codex/internal/history-writer.ts +80 -0
  196. package/src/codex/journal.ts +66 -4
  197. package/src/codex/log-guard/inspect.ts +506 -0
  198. package/src/codex/log-guard/lock.ts +150 -0
  199. package/src/codex/log-guard/maintenance.ts +403 -0
  200. package/src/codex/log-guard/path-safety.ts +88 -0
  201. package/src/codex/log-guard/policy.ts +44 -0
  202. package/src/codex/log-guard/processes.ts +205 -0
  203. package/src/codex/log-guard/protection.ts +489 -0
  204. package/src/codex/log-guard/sqlite-errors.ts +9 -0
  205. package/src/codex/main-account-cache.ts +24 -0
  206. package/src/codex/main-account.ts +29 -1
  207. package/src/codex/management-convergence.ts +167 -0
  208. package/src/codex/model-cache.ts +56 -10
  209. package/src/codex/model-entitlements.ts +353 -0
  210. package/src/codex/native-main-admission.ts +47 -0
  211. package/src/codex/native-main-auth-temp.ts +187 -0
  212. package/src/codex/native-main-claim.ts +178 -0
  213. package/src/codex/native-main-lock-file.ts +162 -0
  214. package/src/codex/native-main-owner.ts +329 -0
  215. package/src/codex/native-profile-api.ts +247 -0
  216. package/src/codex/native-profile-manager.ts +1531 -0
  217. package/src/codex/native-profile-processes.ts +121 -0
  218. package/src/codex/native-profile-recovery.ts +99 -0
  219. package/src/codex/native-profile-stage-store.ts +387 -0
  220. package/src/codex/native-profile-startup.ts +492 -0
  221. package/src/codex/native-profile-store.ts +855 -0
  222. package/src/codex/native-profile-types.ts +120 -0
  223. package/src/codex/native-residue.ts +682 -0
  224. package/src/codex/paths.ts +80 -1
  225. package/src/codex/plan-from-token.ts +140 -0
  226. package/src/codex/plan.ts +40 -0
  227. package/src/codex/plugins-doctor.ts +1 -1
  228. package/src/codex/pool-rotation.ts +74 -4
  229. package/src/codex/project-config-warnings.ts +20 -6
  230. package/src/codex/prompt-journal.ts +352 -0
  231. package/src/codex/prompt-layers.ts +967 -0
  232. package/src/codex/prompt-lock.ts +143 -0
  233. package/src/codex/quota-rejection.ts +298 -0
  234. package/src/codex/quota.ts +175 -13
  235. package/src/codex/refresh.ts +11 -2
  236. package/src/codex/reset-credit-recovery.ts +1044 -0
  237. package/src/codex/routing.ts +505 -94
  238. package/src/codex/runtime.ts +159 -38
  239. package/src/codex/shim.ts +1009 -28
  240. package/src/codex/subagent-model-fallback.ts +350 -35
  241. package/src/codex/sync.ts +191 -2
  242. package/src/codex/transition-state.ts +612 -0
  243. package/src/codex/upstream-host-health.ts +368 -0
  244. package/src/codex/user-identity.ts +557 -0
  245. package/src/codex/warmup.ts +187 -81
  246. package/src/codex/write-coordination.ts +114 -0
  247. package/src/combos/failover.ts +20 -0
  248. package/src/combos/index.ts +4 -0
  249. package/src/combos/request.ts +32 -0
  250. package/src/combos/types.ts +81 -9
  251. package/src/config/provider-name.ts +24 -0
  252. package/src/config.ts +1762 -140
  253. package/src/generated/compatibility-version.json +3164 -0
  254. package/src/generated/{jawcode-model-metadata.ts → model-metadata.ts} +19 -17
  255. package/src/grok/inject.ts +16 -5
  256. package/src/grok/inspect.ts +45 -0
  257. package/src/grok/sync.ts +2 -2
  258. package/src/images/loop.ts +152 -29
  259. package/src/images/plan.ts +23 -13
  260. package/src/integrations/config-io.ts +269 -0
  261. package/src/integrations/journal.ts +315 -0
  262. package/src/integrations/merge.ts +135 -0
  263. package/src/integrations/mutation-flight.ts +71 -0
  264. package/src/integrations/native/ownership-preflight.ts +202 -0
  265. package/src/integrations/omp-yaml-source.ts +358 -0
  266. package/src/integrations/owned-refresh.ts +74 -0
  267. package/src/integrations/ownership.ts +111 -0
  268. package/src/integrations/registry.ts +159 -0
  269. package/src/integrations/serialize.ts +314 -0
  270. package/src/integrations/state.ts +361 -0
  271. package/src/integrations/store.ts +103 -0
  272. package/src/integrations/writer-lock.ts +98 -0
  273. package/src/integrations/writer.ts +691 -0
  274. package/src/lab/artifacts/sanitize.ts +586 -0
  275. package/src/lab/artifacts/secure-fs.ts +475 -0
  276. package/src/lab/artifacts/store.ts +310 -0
  277. package/src/lab/automation/budgets.ts +78 -0
  278. package/src/lab/automation/config-persistence.ts +256 -0
  279. package/src/lab/automation/constants.ts +39 -0
  280. package/src/lab/automation/cooldown.ts +103 -0
  281. package/src/lab/automation/dispatch.ts +211 -0
  282. package/src/lab/automation/index.ts +13 -0
  283. package/src/lab/automation/orchestrator.ts +499 -0
  284. package/src/lab/automation/persistence.ts +512 -0
  285. package/src/lab/automation/planner.ts +371 -0
  286. package/src/lab/automation/policy.ts +136 -0
  287. package/src/lab/automation/queue.ts +191 -0
  288. package/src/lab/automation/recovery.ts +24 -0
  289. package/src/lab/automation/route-context.ts +21 -0
  290. package/src/lab/automation/run-key.ts +44 -0
  291. package/src/lab/automation/runs-query.ts +34 -0
  292. package/src/lab/automation/types.ts +160 -0
  293. package/src/lab/conformance/assertion.ts +325 -0
  294. package/src/lab/conformance/digest.ts +22 -0
  295. package/src/lab/conformance/executor.ts +741 -0
  296. package/src/lab/conformance/fixture-provider.ts +27 -0
  297. package/src/lab/conformance/fixtures/live-v1-cases.json +175 -0
  298. package/src/lab/conformance/fixtures/protocol-v1-cases.json +461 -0
  299. package/src/lab/conformance/harness-budget.ts +47 -0
  300. package/src/lab/conformance/index.ts +5 -0
  301. package/src/lab/conformance/jcs.ts +64 -0
  302. package/src/lab/conformance/json-pointer.ts +39 -0
  303. package/src/lab/conformance/manifest.ts +180 -0
  304. package/src/lab/conformance/mcp-stub.ts +179 -0
  305. package/src/lab/conformance/negative-controls.ts +164 -0
  306. package/src/lab/conformance/observation.ts +355 -0
  307. package/src/lab/conformance/runner.ts +68 -0
  308. package/src/lab/conformance/sse-normalize.ts +59 -0
  309. package/src/lab/conformance/suite-manifest.ts +78 -0
  310. package/src/lab/conformance/types.ts +214 -0
  311. package/src/lab/constants.ts +126 -0
  312. package/src/lab/digest.ts +64 -0
  313. package/src/lab/events/errors.ts +9 -0
  314. package/src/lab/events/limits.ts +117 -0
  315. package/src/lab/events/types.ts +229 -0
  316. package/src/lab/events/validate.ts +781 -0
  317. package/src/lab/fabric/constants.ts +40 -0
  318. package/src/lab/fabric/executor.ts +492 -0
  319. package/src/lab/fabric/index.ts +80 -0
  320. package/src/lab/fabric/manifest.ts +222 -0
  321. package/src/lab/fabric/observe.ts +489 -0
  322. package/src/lab/fabric/patch.ts +79 -0
  323. package/src/lab/fabric/producer-child.ts +139 -0
  324. package/src/lab/fabric/producer-isolate.ts +276 -0
  325. package/src/lab/fabric/producer-protocol.ts +61 -0
  326. package/src/lab/fabric/scratch.ts +439 -0
  327. package/src/lab/fabric/subject.ts +106 -0
  328. package/src/lab/fabric/types.ts +134 -0
  329. package/src/lab/fabric/verifier.ts +98 -0
  330. package/src/lab/index.ts +54 -0
  331. package/src/lab/ledger/artifact-refs.ts +127 -0
  332. package/src/lab/ledger/invalidation.ts +136 -0
  333. package/src/lab/ledger/purge.ts +310 -0
  334. package/src/lab/ledger/store.ts +532 -0
  335. package/src/lab/live/credential-lease.ts +53 -0
  336. package/src/lab/live/destination.ts +155 -0
  337. package/src/lab/live/executor.ts +336 -0
  338. package/src/lab/live/inert-tools.ts +56 -0
  339. package/src/lab/live/manifest.ts +85 -0
  340. package/src/lab/live/mcp-loopback.ts +57 -0
  341. package/src/lab/live/runner.ts +19 -0
  342. package/src/lab/live/sandbox.ts +61 -0
  343. package/src/lab/live/suite-manifest.ts +41 -0
  344. package/src/lab/live/transport.ts +118 -0
  345. package/src/lab/live/types.ts +197 -0
  346. package/src/lab/observe/from-conformance.ts +301 -0
  347. package/src/lab/observe/from-live.ts +117 -0
  348. package/src/lab/paths.ts +153 -0
  349. package/src/lab/projection/rebuild.ts +495 -0
  350. package/src/lab/projection/schema.ts +135 -0
  351. package/src/lab/projection/verdicts.ts +474 -0
  352. package/src/lab/projection/verification.ts +412 -0
  353. package/src/lab/public/bundle.ts +217 -0
  354. package/src/lab/public/community-authority.ts +175 -0
  355. package/src/lab/public/community-files.ts +29 -0
  356. package/src/lab/public/community.ts +479 -0
  357. package/src/lab/public/file-safety.ts +155 -0
  358. package/src/lab/public/ids.ts +26 -0
  359. package/src/lab/public/index.ts +16 -0
  360. package/src/lab/public/mutation-lock.ts +424 -0
  361. package/src/lab/public/operator.ts +353 -0
  362. package/src/lab/public/origin-purge.ts +79 -0
  363. package/src/lab/public/origin.ts +203 -0
  364. package/src/lab/public/privacy.ts +143 -0
  365. package/src/lab/public/private-file.ts +261 -0
  366. package/src/lab/public/project.ts +124 -0
  367. package/src/lab/public/purge-test-fault.ts +21 -0
  368. package/src/lab/public/purge.ts +223 -0
  369. package/src/lab/public/registry.ts +44 -0
  370. package/src/lab/public/revocation.ts +252 -0
  371. package/src/lab/public/signature.ts +243 -0
  372. package/src/lab/public/storage.ts +105 -0
  373. package/src/lab/public/strict-json.ts +206 -0
  374. package/src/lab/public/time.ts +26 -0
  375. package/src/lab/public/types.ts +172 -0
  376. package/src/lab/public/validate.ts +391 -0
  377. package/src/lab/query/catalog.ts +101 -0
  378. package/src/lab/query/connection.ts +107 -0
  379. package/src/lab/query/constants.ts +4 -0
  380. package/src/lab/query/cursor.ts +132 -0
  381. package/src/lab/query/dto-map.ts +277 -0
  382. package/src/lab/query/errors.ts +22 -0
  383. package/src/lab/query/freshness.ts +53 -0
  384. package/src/lab/query/index.ts +45 -0
  385. package/src/lab/query/latest-observation.ts +59 -0
  386. package/src/lab/query/passive-production.ts +159 -0
  387. package/src/lab/query/queries.ts +444 -0
  388. package/src/lab/query/types.ts +266 -0
  389. package/src/lab/subject/behavior-fingerprint.ts +77 -0
  390. package/src/lab/subject/installation-salt.ts +112 -0
  391. package/src/lab/subject/protocol-subject.ts +80 -0
  392. package/src/lab/subject/route-subject.ts +74 -0
  393. package/src/lib/app-owned-memory-stores.ts +22 -0
  394. package/src/lib/bounded-body.ts +153 -9
  395. package/src/lib/bun-runtime.ts +125 -12
  396. package/src/lib/bun-stream-caps.ts +13 -9
  397. package/src/lib/codex-restart-contract.ts +120 -0
  398. package/src/lib/config-ownership.ts +6 -2
  399. package/src/lib/destination-policy.ts +65 -1
  400. package/src/lib/errors.ts +44 -2
  401. package/src/lib/fabric-task-execution-authority.ts +7 -0
  402. package/src/lib/fabric-task-host.ts +29 -0
  403. package/src/lib/lab-activation.ts +223 -0
  404. package/src/lib/lab-live-execution-authority.ts +13 -0
  405. package/src/lib/lab-live-host.ts +30 -0
  406. package/src/lib/lab-live-pinned-sender.ts +56 -0
  407. package/src/lib/lab-live-route-production.ts +130 -0
  408. package/src/lib/lab-passive-linker-registration.ts +26 -0
  409. package/src/lib/local-management-attestation.ts +51 -0
  410. package/src/lib/local-management-capability.ts +100 -0
  411. package/src/lib/local-provider-reload-contract.ts +100 -0
  412. package/src/lib/optional-shutdown-hooks.ts +57 -0
  413. package/src/lib/pinned-http.ts +145 -26
  414. package/src/lib/process-control.ts +4 -1
  415. package/src/lib/provider-outbound.ts +49 -9
  416. package/src/lib/redact.ts +419 -3
  417. package/src/lib/self-launch-argv.ts +15 -0
  418. package/src/lib/server-resource-ownership.ts +71 -0
  419. package/src/lib/shadow-call.ts +35 -4
  420. package/src/lib/sse-decoder.ts +41 -0
  421. package/src/lib/state-store-registrations.ts +10 -2
  422. package/src/lib/system-restart-contract.ts +73 -0
  423. package/src/lib/token-estimate.ts +19 -2
  424. package/src/lib/tool-argument-integers.ts +202 -0
  425. package/src/lib/translator-budget.ts +44 -0
  426. package/src/lib/upstream-http-version.ts +57 -0
  427. package/src/lib/upstream-reachability.ts +95 -0
  428. package/src/lib/upstream-retry.ts +156 -3
  429. package/src/lib/windows-atomic-replace.ts +155 -0
  430. package/src/lib/windows-elevation.ts +70 -2
  431. package/src/lib/windows-secret-acl.ts +409 -69
  432. package/src/lib/windows-service-wrappers.ts +72 -0
  433. package/src/lib/windows-text.ts +106 -0
  434. package/src/lib/windows-user-principal.ts +341 -0
  435. package/src/lib/winsw.ts +33 -5
  436. package/src/oauth/account-import/google-antigravity-adapter.ts +74 -0
  437. package/src/oauth/account-import/index.ts +15 -0
  438. package/src/oauth/account-import/parser.ts +83 -0
  439. package/src/oauth/account-import/registry.ts +18 -0
  440. package/src/oauth/account-import/service.ts +75 -0
  441. package/src/oauth/account-import/types.ts +91 -0
  442. package/src/oauth/anthropic.ts +12 -1
  443. package/src/oauth/callback-server.ts +8 -2
  444. package/src/oauth/chatgpt.ts +12 -1
  445. package/src/oauth/command-code.ts +239 -0
  446. package/src/oauth/cursor.ts +46 -5
  447. package/src/oauth/google-antigravity.ts +35 -3
  448. package/src/oauth/health.ts +20 -12
  449. package/src/oauth/index.ts +398 -66
  450. package/src/oauth/key-providers.ts +16 -0
  451. package/src/oauth/kimi.ts +16 -2
  452. package/src/oauth/kiro.ts +50 -6
  453. package/src/oauth/local-token-detect.ts +11 -2
  454. package/src/oauth/log.ts +3 -1
  455. package/src/oauth/login-cli.ts +88 -28
  456. package/src/oauth/nous.ts +798 -0
  457. package/src/oauth/store.ts +119 -21
  458. package/src/oauth/token-guardian.ts +9 -3
  459. package/src/pi/models.ts +2 -2
  460. package/src/providers/alibaba-region-migration.ts +1 -1
  461. package/src/providers/antigravity-models.ts +521 -31
  462. package/src/providers/base-url-choices.ts +10 -0
  463. package/src/providers/codex-capacity.ts +292 -0
  464. package/src/providers/command-code-efforts.ts +144 -0
  465. package/src/providers/context-cap.ts +22 -5
  466. package/src/providers/cursor-pool.ts +72 -0
  467. package/src/providers/derive.ts +253 -6
  468. package/src/providers/fastwire.ts +501 -0
  469. package/src/providers/free-directory.ts +10 -7
  470. package/src/providers/google-vertex-location.ts +14 -0
  471. package/src/providers/key-failover.ts +71 -3
  472. package/src/providers/label.ts +1 -1
  473. package/src/providers/model-discovery-limits.ts +16 -0
  474. package/src/providers/model-discovery.ts +115 -22
  475. package/src/providers/model-rename-migration.ts +255 -0
  476. package/src/providers/model-rename-startup.ts +28 -0
  477. package/src/providers/openai-sidecar.ts +72 -4
  478. package/src/providers/openai-tier-startup.ts +31 -2
  479. package/src/providers/openai-tiers.ts +119 -4
  480. package/src/providers/openai-virtual-models.ts +1 -0
  481. package/src/providers/opencode-zen-rate-limit.ts +102 -0
  482. package/src/providers/provider-id-rewrite.ts +29 -0
  483. package/src/providers/quota.ts +1319 -38
  484. package/src/providers/registry.ts +1429 -111
  485. package/src/providers/request-pacing.ts +310 -0
  486. package/src/providers/service-tier.ts +277 -0
  487. package/src/providers/slug-codec.ts +42 -6
  488. package/src/providers/static-model-discovery.ts +86 -0
  489. package/src/providers/xai-responses-opt-in.ts +15 -0
  490. package/src/providers/xai-transport.ts +11 -4
  491. package/src/reasoning-effort.ts +49 -1
  492. package/src/responses/compaction.ts +26 -1
  493. package/src/responses/custom-tool-compat.ts +266 -0
  494. package/src/responses/hosted-tool-policy.ts +9 -0
  495. package/src/responses/namespace-tool-compat.ts +355 -0
  496. package/src/responses/parser.ts +220 -38
  497. package/src/responses/provider-continuation.ts +98 -0
  498. package/src/responses/provider-opaque-metadata.ts +73 -0
  499. package/src/responses/reasoning-envelope.ts +9 -1
  500. package/src/responses/reasoning-replay-cache.ts +426 -0
  501. package/src/responses/schema.ts +7 -1
  502. package/src/responses/spill-store.ts +75 -10
  503. package/src/responses/state.ts +565 -27
  504. package/src/responses/thought-signature-replay.ts +347 -0
  505. package/src/responses/tool-search-compat.ts +301 -0
  506. package/src/responses/truncated-stop-reason.ts +60 -0
  507. package/src/router.ts +366 -30
  508. package/src/routing/analytics.ts +378 -0
  509. package/src/routing/capability.ts +244 -0
  510. package/src/routing/compatibility/assemble.ts +73 -0
  511. package/src/routing/compatibility/behavior.ts +278 -0
  512. package/src/routing/compatibility/catalog.ts +99 -0
  513. package/src/routing/compatibility/endpoint.ts +52 -0
  514. package/src/routing/compatibility/lab-evidence-provider.ts +130 -0
  515. package/src/routing/compatibility/policy.ts +181 -0
  516. package/src/routing/compatibility/provider-slot.ts +56 -0
  517. package/src/routing/compatibility/reader.ts +110 -0
  518. package/src/routing/compatibility/subject.ts +191 -0
  519. package/src/routing/compatibility/types.ts +64 -0
  520. package/src/routing/compatibility/version.ts +104 -0
  521. package/src/routing/cost.ts +77 -0
  522. package/src/routing/evaluator.ts +495 -0
  523. package/src/routing/health.ts +412 -0
  524. package/src/routing/history/cursor.ts +43 -0
  525. package/src/routing/history/indexer.ts +605 -0
  526. package/src/routing/history/schema.ts +72 -0
  527. package/src/routing/profile-namespace.ts +15 -0
  528. package/src/routing/profile.ts +547 -0
  529. package/src/routing/quota.ts +145 -0
  530. package/src/routing/request-evidence.ts +45 -0
  531. package/src/routing/trace.ts +776 -0
  532. package/src/server/adapter-resolve.ts +2 -29
  533. package/src/server/auth-cors.ts +267 -46
  534. package/src/server/background-lifecycle.ts +182 -0
  535. package/src/server/chat-completions.ts +130 -56
  536. package/src/server/chat-native-sse.ts +331 -0
  537. package/src/server/chat-native.ts +426 -0
  538. package/src/server/claude-messages.ts +159 -43
  539. package/src/server/direct-local-http.ts +347 -0
  540. package/src/server/effort-policy.ts +18 -0
  541. package/src/server/github-copilot-responses-repair.ts +338 -0
  542. package/src/server/gui-static.ts +39 -10
  543. package/src/server/images.ts +94 -12
  544. package/src/server/index.ts +865 -181
  545. package/src/server/lifecycle.ts +284 -13
  546. package/src/server/live.ts +136 -17
  547. package/src/server/local-management-read-client.ts +90 -0
  548. package/src/server/local-provider-reload-client.ts +137 -0
  549. package/src/server/management/agent-settings-routes.ts +398 -103
  550. package/src/server/management/api-key-usage.ts +31 -5
  551. package/src/server/management/body.ts +6 -0
  552. package/src/server/management/combo-routes.ts +62 -24
  553. package/src/server/management/config-routes.ts +464 -51
  554. package/src/server/management/context.ts +80 -2
  555. package/src/server/management/integration-routes.ts +498 -0
  556. package/src/server/management/lab-automation-routes.ts +206 -0
  557. package/src/server/management/lab-routes.ts +563 -0
  558. package/src/server/management/logs-usage-routes.ts +101 -32
  559. package/src/server/management/model-routes.ts +189 -131
  560. package/src/server/management/model-rows.ts +163 -0
  561. package/src/server/management/native-integration-routes.ts +769 -0
  562. package/src/server/management/oauth-account-routes.ts +80 -4
  563. package/src/server/management/provider-capability-config.ts +48 -0
  564. package/src/server/management/provider-routes.ts +764 -157
  565. package/src/server/management/request-history-routes.ts +191 -0
  566. package/src/server/management/routing-analytics-routes.ts +74 -0
  567. package/src/server/management/routing-profile-routes.ts +380 -0
  568. package/src/server/management/shared.ts +27 -11
  569. package/src/server/management/sidebar-routes.ts +47 -31
  570. package/src/server/management/storage-log-guard-routes.ts +186 -0
  571. package/src/server/management/sync-response.ts +69 -0
  572. package/src/server/management/system-restart.ts +288 -32
  573. package/src/server/management/system-routes.ts +77 -0
  574. package/src/server/management/usage-summary-cache.ts +9 -1
  575. package/src/server/management/vision-sidecar-options.ts +167 -0
  576. package/src/server/management/web-search-sidecar-options.ts +120 -0
  577. package/src/server/management-api.ts +115 -14
  578. package/src/server/management-auth.ts +220 -5
  579. package/src/server/passive-route-linker.ts +66 -0
  580. package/src/server/ports.ts +41 -1
  581. package/src/server/proxy-liveness.ts +132 -5
  582. package/src/server/readiness.ts +99 -0
  583. package/src/server/relay-eager.ts +82 -42
  584. package/src/server/relay.ts +236 -76
  585. package/src/server/request-decompress.ts +113 -6
  586. package/src/server/request-log.ts +235 -22
  587. package/src/server/responses/agent-task-recovery-cache.ts +143 -0
  588. package/src/server/responses/agent-task-recovery.ts +465 -0
  589. package/src/server/responses/collaboration.ts +204 -35
  590. package/src/server/responses/compact.ts +442 -55
  591. package/src/server/responses/core.ts +2872 -331
  592. package/src/server/responses/empty-completion-guard.ts +276 -0
  593. package/src/server/responses/encrypted-payload.ts +62 -39
  594. package/src/server/responses/fetch-helpers.ts +79 -4
  595. package/src/server/responses/input-admission.ts +185 -0
  596. package/src/server/responses/pacing-overload.ts +13 -0
  597. package/src/server/responses/policy-fallback.ts +178 -0
  598. package/src/server/responses/responses-field-backfill.ts +251 -0
  599. package/src/server/responses/terminal-guard.ts +26 -5
  600. package/src/server/responses/upstream-error.ts +5 -0
  601. package/src/server/responses/ws-upstream.ts +308 -0
  602. package/src/server/responses-custom-tool-repair.ts +282 -0
  603. package/src/server/responses-item-id-repair.ts +54 -6
  604. package/src/server/responses-json-events.ts +90 -0
  605. package/src/server/responses-model-rewrite.ts +29 -0
  606. package/src/server/responses-reasoning-summary-rewrite.ts +178 -0
  607. package/src/server/responses-snapshot-repair.ts +621 -0
  608. package/src/server/responses-terminal-repair.ts +342 -0
  609. package/src/server/responses-tool-search-repair.ts +267 -0
  610. package/src/server/responses-undeclared-tool-guard.ts +153 -0
  611. package/src/server/responses.ts +18 -2
  612. package/src/server/search.ts +78 -13
  613. package/src/server/sse-frame-buffer.ts +292 -0
  614. package/src/server/sse-payload-rewrite.ts +110 -22
  615. package/src/server/startup-action-control.ts +8 -1
  616. package/src/server/startup-health-cache.ts +19 -1
  617. package/src/server/system-env.ts +80 -9
  618. package/src/server/ws-bridge.ts +39 -38
  619. package/src/service-manager-probe.ts +892 -0
  620. package/src/service.ts +1111 -90
  621. package/src/sidecar/auth.ts +92 -0
  622. package/src/sidecar/candidates.ts +83 -0
  623. package/src/storage/cleanup.ts +2 -2
  624. package/src/storage/scanner.ts +1 -1
  625. package/src/storage/worker-lifecycle.ts +14 -14
  626. package/src/tray/windows-tray.ps1 +83 -9
  627. package/src/tray/windows.ts +43 -16
  628. package/src/types/accounts.ts +37 -0
  629. package/src/types/config.ts +845 -0
  630. package/src/types/provider.ts +545 -0
  631. package/src/types/request.ts +384 -0
  632. package/src/types/tools.ts +131 -0
  633. package/src/types/wire.ts +80 -0
  634. package/src/types.ts +104 -1236
  635. package/src/update/index.ts +32 -19
  636. package/src/update/job.ts +442 -67
  637. package/src/update/notify.ts +12 -6
  638. package/src/update/npm-cache-preflight.d.mts +47 -0
  639. package/src/update/npm-cache-preflight.mjs +201 -0
  640. package/src/update/transactional-install.d.mts +22 -0
  641. package/src/update/transactional-install.mjs +259 -0
  642. package/src/usage/cost.ts +0 -0
  643. package/src/usage/expected-prices.ts +268 -16
  644. package/src/usage/log.ts +606 -41
  645. package/src/usage/summary.ts +177 -9
  646. package/src/usage/user-cost-overlay-reconciler.ts +313 -0
  647. package/src/usage/user-cost-overlays.ts +314 -0
  648. package/src/vision/anthropic-describe.ts +10 -6
  649. package/src/vision/backends.ts +97 -0
  650. package/src/vision/describe.ts +9 -3
  651. package/src/vision/eligibility.ts +250 -0
  652. package/src/vision/index.ts +238 -24
  653. package/src/vision/reasoning.ts +55 -0
  654. package/src/vision/routed-describe.ts +175 -0
  655. package/src/vision/timeout-bounds.ts +9 -0
  656. package/src/web-search/anthropic-executor.ts +13 -7
  657. package/src/web-search/backends.ts +108 -0
  658. package/src/web-search/exa-executor.ts +88 -0
  659. package/src/web-search/executor.ts +11 -3
  660. package/src/web-search/gemini-executor.ts +141 -0
  661. package/src/web-search/index.ts +150 -15
  662. package/src/web-search/loop.ts +279 -50
  663. package/src/web-search/parse.ts +125 -30
  664. package/src/web-search/sources.ts +60 -0
  665. package/src/web-search/xai-executor.ts +219 -0
  666. package/gui/dist/assets/index-DTpMHS4F.js +0 -67
  667. package/gui/dist/assets/index-ZNVDE3C7.css +0 -1
  668. package/gui/dist/provider-icons/antigravity.svg +0 -1
  669. package/gui/dist/provider-icons/claude.svg +0 -1
  670. package/gui/dist/provider-icons/copilot.svg +0 -1
  671. package/gui/dist/provider-icons/cursor.svg +0 -2
  672. package/gui/dist/provider-icons/gemini.svg +0 -1
  673. package/gui/dist/provider-icons/grok-color.svg +0 -1
  674. package/gui/dist/provider-icons/kiro.svg +0 -14
  675. package/src/cli/internal-dispatch.ts +0 -20
@@ -0,0 +1,72 @@
1
+ /** ChatGPT/Codex wire id observed for the account-native Daybreak Blue surface. */
2
+ export const NATIVE_DAYBREAK_BLUE_MODEL = "gpt-daybreak-blue-latest";
3
+
4
+ /** Native ChatGPT/Codex ids whose availability is proven per authenticated account. */
5
+ export const ACCOUNT_GATED_NATIVE_OPENAI_MODELS: ReadonlySet<string> = new Set([
6
+ NATIVE_DAYBREAK_BLUE_MODEL,
7
+ ]);
8
+
9
+ /**
10
+ * Account-native aliases whose Codex capabilities track another pinned native row.
11
+ *
12
+ * This is catalog metadata inheritance only. Routing always preserves the requested
13
+ * wire id for the separately billed API-key `daybreak-*-latest` surface, so the two never
14
+ * collapse into each other.
15
+ *
16
+ * The ChatGPT/Codex surface is different: an account-gated request IS rewritten to its
17
+ * canonical wire model before it leaves the process (`applyCodexAccountGatedWireNormalization`
18
+ * in src/server/responses/core.ts), because the authenticated backend rejects the gated slug
19
+ * on shards that do not carry it. The catalog keeps the product identity; only the wire moves.
20
+ */
21
+ const NATIVE_OPENAI_CAPABILITY_SOURCES: Readonly<Record<string, string>> = Object.freeze({
22
+ [NATIVE_DAYBREAK_BLUE_MODEL]: "gpt-5.6-sol",
23
+ });
24
+
25
+ /**
26
+ * Native ids whose capability metadata is inherited from another pinned native row.
27
+ *
28
+ * Membership here is about METADATA INHERITANCE only, and is independent of whether the
29
+ * slug is also present in `NATIVE_OPENAI_MODELS`. `gpt-daybreak-blue-latest` is now in BOTH:
30
+ * it inherits Sol's capability shape AND is a supported account-gated native id (owner decision,
31
+ * devlog 260816_codexrs_multiagent_v2_and_history_perf/011).
32
+ *
33
+ * The maps that consume the union of these two lists (`PINNED_NATIVE_CAPABILITY_ENTRIES`,
34
+ * `UPSTREAM_NATIVE_ENTRIES`) are keyed by slug, so an overlapping id collapses to one
35
+ * entry. Catalog row generation iterates `NATIVE_OPENAI_MODELS`, then entitlement evidence limits
36
+ * it to at most one bare row and one row per entitled account selector.
37
+ */
38
+ export const NATIVE_OPENAI_CAPABILITY_ALIAS_MODELS = Object.freeze(
39
+ Object.keys(NATIVE_OPENAI_CAPABILITY_SOURCES),
40
+ );
41
+
42
+ export function isNativeOpenAiCapabilityAliasModel(slug: string): boolean {
43
+ return Object.hasOwn(NATIVE_OPENAI_CAPABILITY_SOURCES, slug);
44
+ }
45
+
46
+ export function nativeOpenAiCapabilitySourceSlug(slug: string): string {
47
+ return NATIVE_OPENAI_CAPABILITY_SOURCES[slug] ?? slug;
48
+ }
49
+
50
+ /**
51
+ * Native OpenAI model ids that this release can route and restore with authoritative metadata.
52
+ *
53
+ * `gpt-daybreak-blue-latest` is entitlement-gated upstream: it is absent from codex-rs's
54
+ * bundled catalog and reaches a client only through an authenticated `/models` response.
55
+ * It is listed here by explicit owner decision so the capability template exists without waiting
56
+ * for an observation, because opencodex injects `model_catalog_json` and codex-rs therefore builds
57
+ * a `StaticModelsManager` whose refresh is a no-op — an entitled account had no way to
58
+ * discover it on a clean install.
59
+ *
60
+ * Availability is not static: catalog sync and Pool routing require the account's authenticated
61
+ * `/models` roster to contain the slug. An unconfirmed or unentitled account never receives the
62
+ * request. `disabledModels` remains the independent user visibility control.
63
+ *
64
+ * Devlog: 260816_codexrs_multiagent_v2_and_history_perf/011 §4-bis.
65
+ */
66
+ export const NATIVE_OPENAI_MODELS = [
67
+ "gpt-5.5", "gpt-5.4", "gpt-5.4-mini", "gpt-5.3-codex-spark",
68
+ "gpt-5.6-sol", "gpt-5.6-terra", "gpt-5.6-luna",
69
+ NATIVE_DAYBREAK_BLUE_MODEL,
70
+ ];
71
+
72
+ export const SUPPORTED_NATIVE_OPENAI_SLUGS = new Set(NATIVE_OPENAI_MODELS);
@@ -9,7 +9,7 @@ import { buildModelsRequest, resolveModelsAuthToken } from "../../oauth";
9
9
  import type { OcxConfig, OcxProviderConfig } from "../../types";
10
10
  import { modelInList } from "../../types";
11
11
  import { CODEX_REASONING_LEVELS, codexEffortRank, configuredReasoningEfforts, modelRecordValue, sanitizeCodexReasoningEfforts } from "../../reasoning-effort";
12
- import { getJawcodeModelMetadata, getJawcodeModelMetadataCaseInsensitive, listJawcodeModelMetadata, resolveJawcodeProvider } from "../../generated/jawcode-model-metadata";
12
+ import { getModelMetadata, getModelMetadataCaseInsensitive, listModelMetadata, resolveMetadataProvider } from "../../generated/model-metadata";
13
13
  import { enrichProviderFromRegistry, shouldCaseFoldMetadataModelId } from "../../providers/derive";
14
14
  import { getProviderRegistryEntry } from "../../providers/registry";
15
15
  import { applyProviderContextCap, providerContextCap } from "../../providers/context-cap";
@@ -31,7 +31,9 @@ import { redactSecretString } from "../../lib/redact";
31
31
  import upstreamModelsSnapshot from "../data/upstream-models.json";
32
32
 
33
33
 
34
- import { NATIVE_OPENAI_CONTEXT_OVERRIDES, SUPPORTED_NATIVE_OPENAI_SLUGS, UPSTREAM_NATIVE_ENTRIES } from "./metadata";
34
+ import { NATIVE_OPENAI_CONTEXT_OVERRIDES, SUPPORTED_NATIVE_OPENAI_SLUGS, UPSTREAM_NATIVE_ENTRIES, isNativeOpenAiCapabilityAliasModel, nativeMultiAgentVersion, nativeOpenAiContextWindow, nativeOpenAiMaxInputTokens, type NativeContextLimitsInput } from "./metadata";
35
+ import { trustedAccountBoundNativeCatalogSlug } from "./account-models";
36
+ import { CODEX_NATIVE_ALIAS_CATALOG_KIND } from "./kinds";
35
37
 
36
38
  export function legacyCatalogBackupPath(): string {
37
39
  return join(getConfigDir(), "catalog-backup.json");
@@ -84,11 +86,18 @@ export function isDefaultCatalogPath(path: string): boolean {
84
86
  return samePath(path, activeDefaultCatalogPath());
85
87
  }
86
88
 
89
+ /** Stable nonsemantic ownership marker for rows projected from config.customModels. */
90
+ export const CODEX_CUSTOM_MODEL_CATALOG_KIND = "custom-model-v1";
91
+ /** A formerly ambiguous slug was authoritatively observed as an ordinary provider row. */
92
+ export const CODEX_PROVIDER_MODEL_CATALOG_KIND = "provider-model-v1";
93
+
87
94
  export interface CatalogModel {
88
95
  id: string;
89
96
  provider: string;
90
97
  /** Public Codex-facing slug override (used by combo aliases). */
91
98
  alias?: string;
99
+ /** Explicit combo takeover of a bare OpenAI-native catalog id. */
100
+ nativeAlias?: boolean;
92
101
  /**
93
102
  * Display-only Codex catalog `display_name` override. Relabels the picker row ONLY — it never
94
103
  * affects the routing slug, alias-collision order, native marketing-name precedence, or provider
@@ -107,18 +116,35 @@ export interface CatalogModel {
107
116
  inputModalities?: string[];
108
117
  /** Provider opted into parallel tool calls (OcxProviderConfig.parallelToolCalls). */
109
118
  parallelToolCalls?: boolean;
119
+ /**
120
+ * This routed row is an explicitly configured account-native alias on the canonical ChatGPT
121
+ * forward provider. It may inherit pinned native Codex metadata without changing its wire id.
122
+ */
123
+ codexForwardNativeCapabilityAlias?: boolean;
110
124
  /** Whether Codex may send Responses text.verbosity for this routed model. */
111
125
  supportsVerbosity?: boolean;
126
+ /** Whether this exact routed model has a verified OpenAI-compatible service tier. */
127
+ supportsServiceTier?: boolean;
128
+ /** Optional provider-specific copy for the advertised Fast tier. */
129
+ fastTierDescription?: string;
112
130
  supportsReasoningSummaries?: boolean;
131
+ /**
132
+ * Codex tool calling mode for this routed model.
133
+ * "code_mode_only" (default) sets entry.tool_mode = "code_mode_only".
134
+ * "shell" leaves tool_mode unset so Codex declares top-level shell tools (exec_command).
135
+ */
136
+ codexToolMode?: "code_mode_only" | "shell";
113
137
  /** Normalized upstream capability names retained for management/API consumers (#485 follow-up). */
114
138
  capabilities?: string[];
139
+ /** OpenCodex-only catalog ownership marker; Codex ignores the serialized extension field. */
140
+ catalogKind?: typeof CODEX_CUSTOM_MODEL_CATALOG_KIND | typeof CODEX_PROVIDER_MODEL_CATALOG_KIND;
115
141
  }
116
142
 
117
143
  export type RawEntry = Record<string, unknown>;
118
144
 
119
145
  export type RawCatalog = { models?: RawEntry[]; [k: string]: unknown };
120
146
 
121
- export const JAWCODE_CATALOG_AUGMENT_PROVIDERS = new Set(["opencode-go"]);
147
+ export const JAWCODE_CATALOG_AUGMENT_PROVIDERS = new Set(["opencode-go", "deepseek"]);
122
148
 
123
149
  export const ROUTED_MODEL_COMPATIBILITY_EXCLUSIONS = new Set([
124
150
  // Issue #82: Zen Go /models advertises HY3, but Console Go rejects it as outside the lite list.
@@ -192,7 +218,12 @@ export function readCatalog(path: string): RawCatalog | null {
192
218
 
193
219
  export function findNativeTemplate(catalog: RawCatalog | null): RawEntry | null {
194
220
  return catalog?.models?.find(
195
- m => typeof m.slug === "string" && !m.slug.includes("/") && "base_instructions" in m,
221
+ m => typeof m.slug === "string"
222
+ && !m.slug.includes("/")
223
+ && "base_instructions" in m
224
+ && m.opencodex_catalog_kind !== CODEX_NATIVE_ALIAS_CATALOG_KIND
225
+ && m.owned_by !== COMBO_NAMESPACE
226
+ && !(typeof m.description === "string" && m.description.startsWith("Routed via opencodex → ")),
196
227
  ) ?? null;
197
228
  }
198
229
 
@@ -243,16 +274,83 @@ export function isNativeOpenAiEntry(entry: RawEntry): boolean {
243
274
  return typeof entry.slug === "string" && !entry.slug.includes("/");
244
275
  }
245
276
 
246
- export function applyNativeOpenAiContextOverride(entry: RawEntry): void {
247
- if (!isNativeOpenAiEntry(entry)) return;
248
- const override = NATIVE_OPENAI_CONTEXT_OVERRIDES[entry.slug as string];
249
- if (!override) return;
250
- if (typeof override.contextWindow === "number") {
251
- entry.context_window = override.contextWindow;
252
- entry.auto_compact_token_limit = Math.floor(override.contextWindow * 0.9);
277
+ /**
278
+ * Auto-compaction threshold for a native row.
279
+ *
280
+ * The usual rule is 90% of the window, but a row whose input ceiling sits below that has to
281
+ * clamp to the ceiling instead — otherwise the client keeps filling until upstream answers
282
+ * `context_length_exceeded` and compaction never gets a chance to run. Native GPT-5.6 no
283
+ * longer trips this (922,000 window, 829,800 at 90%), but the routed and API-key rows carry
284
+ * the same family at a 1,050,000 window where 90% would be 945,000 — past the ceiling.
285
+ */
286
+ function nativeAutoCompactLimit(contextWindow: number, maxInputTokens: number | undefined, contextCap?: number): number {
287
+ const ninety = Math.floor(contextWindow * 0.9);
288
+ if (typeof maxInputTokens !== "number" || maxInputTokens <= 0) return ninety;
289
+ const cappedMaxInput = applyProviderContextCap(maxInputTokens, contextCap) ?? maxInputTokens;
290
+ return Math.min(ninety, cappedMaxInput, contextWindow);
291
+ }
292
+
293
+ /**
294
+ * Narrow any already-resolved native window by the user levers.
295
+ *
296
+ * Used for the fields the accessors do not own (`max_context_window`, and preserved rows
297
+ * that carry no static override) so every field on a row lands at the same width.
298
+ */
299
+ function narrowNativeMaxContextWindow(
300
+ slug: string,
301
+ value: number | undefined,
302
+ limits?: NativeContextLimitsInput,
303
+ ): number | undefined {
304
+ if (typeof value !== "number" || value <= 0) return value;
305
+ const resolved = nativeOpenAiContextWindow(slug, limits);
306
+ const authoritative = nativeOpenAiContextWindow(slug);
307
+ // The accessor pair tells us how far the levers moved this slug; apply the same delta to a
308
+ // field the accessor does not model, without ever raising it.
309
+ if (resolved === undefined || authoritative === undefined) return value;
310
+ return Math.min(value, Math.max(resolved, 1));
311
+ }
312
+
313
+ export function applyNativeOpenAiContextOverride(entry: RawEntry, limits?: NativeContextLimitsInput): void {
314
+ const nativeSlug = trustedAccountBoundNativeCatalogSlug(entry)
315
+ ?? (isNativeOpenAiEntry(entry) ? entry.slug as string : undefined);
316
+ if (!nativeSlug) return;
317
+ const override = NATIVE_OPENAI_CONTEXT_OVERRIDES[nativeSlug];
318
+ if (override) {
319
+ // Read the effective values through the accessors rather than re-deriving them from the
320
+ // static table: this function used to apply only the provider cap, so a per-model window
321
+ // the dashboard had already accepted was silently written back at full width here.
322
+ if (typeof override.contextWindow === "number") {
323
+ const contextWindow = nativeOpenAiContextWindow(nativeSlug, limits) ?? override.contextWindow;
324
+ entry.context_window = contextWindow;
325
+ entry.auto_compact_token_limit = nativeAutoCompactLimit(
326
+ contextWindow,
327
+ nativeOpenAiMaxInputTokens(nativeSlug, limits) ?? override.maxInputTokens,
328
+ undefined,
329
+ );
330
+ }
331
+ if (typeof override.maxContextWindow === "number") {
332
+ const maxContextWindow = narrowNativeMaxContextWindow(nativeSlug, override.maxContextWindow, limits);
333
+ entry.max_context_window = maxContextWindow;
334
+ }
253
335
  }
254
- if (typeof override.maxContextWindow === "number") {
255
- entry.max_context_window = override.maxContextWindow;
336
+ // providerContextCaps.openai is a ceiling for native OpenAI rows regardless of where the
337
+ // advertised window came from (#1430): preserved rows without a hardcoded override (e.g.
338
+ // gpt-5.4-mini) must stay under the cap too, and auto-compaction follows the capped window.
339
+ // The per-model window narrows the same rows for the same reason.
340
+ const currentContext = typeof entry.context_window === "number" ? entry.context_window : undefined;
341
+ const cappedContext = narrowNativeMaxContextWindow(nativeSlug, currentContext, limits);
342
+ if (cappedContext !== currentContext && typeof cappedContext === "number") {
343
+ entry.context_window = cappedContext;
344
+ entry.auto_compact_token_limit = nativeAutoCompactLimit(
345
+ cappedContext,
346
+ nativeOpenAiMaxInputTokens(nativeSlug, limits) ?? override?.maxInputTokens,
347
+ undefined,
348
+ );
349
+ }
350
+ const currentMax = typeof entry.max_context_window === "number" ? entry.max_context_window : undefined;
351
+ const cappedMax = narrowNativeMaxContextWindow(nativeSlug, currentMax, limits);
352
+ if (cappedMax !== currentMax) {
353
+ entry.max_context_window = cappedMax;
256
354
  }
257
355
  }
258
356
 
@@ -300,6 +398,51 @@ export function ensureStrictCatalogFields(
300
398
 
301
399
  export type MultiAgentMode = "v1" | "default" | "v2";
302
400
 
401
+ export interface MultiAgentModeOptions {
402
+ /**
403
+ * When the catalog is in v2 mode, stamp ChatGPT-native rows as v1 instead.
404
+ * Routed parents get v2 (plaintext child tasks). Native Sol/Terra stay on v1
405
+ * so they can still spawn Grok/Claude — ChatGPT encrypts v2 NEW_TASK bodies.
406
+ */
407
+ keepNativeChatGptOnV1?: boolean;
408
+ }
409
+
410
+ /** Catalog rows that run on the ChatGPT backend (encrypt v2 child tasks). */
411
+ export function catalogEntryIsNativeChatGpt(entry: RawEntry): boolean {
412
+ const slug = typeof entry.slug === "string" ? entry.slug : "";
413
+ // combo-native-alias-v1 occupies a bare native slug but is routed through
414
+ // OpenCodex. Keep those on v2 unless the row still carries the ChatGPT-forward
415
+ // contract (`use_responses_lite`).
416
+ if (entry.opencodex_catalog_kind === CODEX_NATIVE_ALIAS_CATALOG_KIND) {
417
+ return entry.use_responses_lite === true;
418
+ }
419
+ if (trustedAccountBoundNativeCatalogSlug(entry)) return true;
420
+ const routedNativeSlug = slug.startsWith(`${OPENAI_CODEX_PROVIDER_ID}/`)
421
+ ? slug.slice(OPENAI_CODEX_PROVIDER_ID.length + 1)
422
+ : "";
423
+ if (
424
+ entry.opencodex_catalog_kind === CODEX_CUSTOM_MODEL_CATALOG_KIND
425
+ && entry.use_responses_lite === true
426
+ && isNativeOpenAiCapabilityAliasModel(routedNativeSlug)
427
+ ) return true;
428
+ if (UPSTREAM_NATIVE_ENTRIES.has(slug) || SUPPORTED_NATIVE_OPENAI_SLUGS.has(slug)) return true;
429
+ return false;
430
+ }
431
+
432
+ export const ROUTED_CODEX_TOOL_MODE = "code_mode_only";
433
+
434
+ export function applyRoutedCodexToolMode(
435
+ entry: RawEntry,
436
+ toolMode?: "code_mode_only" | "shell" | string,
437
+ ): RawEntry {
438
+ if (toolMode === "shell") {
439
+ delete entry.tool_mode;
440
+ return entry;
441
+ }
442
+ entry.tool_mode = ROUTED_CODEX_TOOL_MODE;
443
+ return entry;
444
+ }
445
+
303
446
  /**
304
447
  * @param v2FeatureEnabled When the native multi_agent_v2 feature is on, "default"
305
448
  * mode stamps unpinned entries as "v2" instead of deleting the key. The native
@@ -310,15 +453,42 @@ export type MultiAgentMode = "v1" | "default" | "v2";
310
453
  * 260730_codex_rs_upstream_v2_live_handoff/060). Upstream pins are always
311
454
  * preserved: a genuine "v1" pin is a real capability statement and stays excluded.
312
455
  * With the feature off the output is byte-identical to the historical behavior.
456
+ *
457
+ * `keepNativeChatGptOnV1` only applies when `mode === "v2"`. It leaves Sol/Terra
458
+ * (and other ChatGPT-native rows) on v1 so a native parent can still spawn a
459
+ * routed child. See issue #92.
313
460
  */
314
- export function applyMultiAgentMode(entries: RawEntry[], mode: MultiAgentMode, v2FeatureEnabled = false): RawEntry[] {
461
+ export function applyMultiAgentMode(
462
+ entries: RawEntry[],
463
+ mode: MultiAgentMode,
464
+ v2FeatureEnabled = false,
465
+ options: MultiAgentModeOptions = {},
466
+ ): RawEntry[] {
467
+ if (mode === "v2" && options.keepNativeChatGptOnV1 === true) {
468
+ for (const entry of entries) {
469
+ entry.multi_agent_version = catalogEntryIsNativeChatGpt(entry) ? "v1" : "v2";
470
+ }
471
+ return entries;
472
+ }
315
473
  if (mode === "default") {
316
474
  // Restore upstream defaults: clear any stale forced multi_agent_version and
317
475
  // re-apply upstream pins from the snapshot for native entries that have one.
318
476
  for (const entry of entries) {
319
477
  const slug = typeof entry.slug === "string" ? entry.slug : "";
320
- const upstream = UPSTREAM_NATIVE_ENTRIES.get(slug);
321
- const upstreamPin = upstream?.multi_agent_version;
478
+ const nativeAlias = entry.opencodex_catalog_kind === CODEX_NATIVE_ALIAS_CATALOG_KIND;
479
+ const routedNativeSlug = slug.startsWith(`${OPENAI_CODEX_PROVIDER_ID}/`)
480
+ ? slug.slice(OPENAI_CODEX_PROVIDER_ID.length + 1)
481
+ : "";
482
+ const codexForwardCapabilityAlias = entry.opencodex_catalog_kind === CODEX_CUSTOM_MODEL_CATALOG_KIND
483
+ && entry.use_responses_lite === true
484
+ && isNativeOpenAiCapabilityAliasModel(routedNativeSlug)
485
+ ? routedNativeSlug
486
+ : undefined;
487
+ const upstreamPin = nativeAlias
488
+ ? nativeMultiAgentVersion(slug)
489
+ : codexForwardCapabilityAlias
490
+ ? nativeMultiAgentVersion(codexForwardCapabilityAlias)
491
+ : UPSTREAM_NATIVE_ENTRIES.get(trustedAccountBoundNativeCatalogSlug(entry) ?? slug)?.multi_agent_version;
322
492
  if (typeof upstreamPin === "string") {
323
493
  entry.multi_agent_version = upstreamPin;
324
494
  } else if (v2FeatureEnabled) {
@@ -335,9 +505,14 @@ export function applyMultiAgentMode(entries: RawEntry[], mode: MultiAgentMode, v
335
505
  return entries;
336
506
  }
337
507
 
338
- export function normalizeRoutedCatalogEntry(entry: RawEntry, parallelToolCalls = false): RawEntry {
508
+ export function normalizeRoutedCatalogEntry(
509
+ entry: RawEntry,
510
+ parallelToolCalls = false,
511
+ toolMode?: "code_mode_only" | "shell" | string,
512
+ ): RawEntry {
339
513
  delete entry.model_messages;
340
514
  delete entry.tool_mode;
515
+ applyRoutedCodexToolMode(entry, toolMode);
341
516
  delete entry.multi_agent_version;
342
517
  delete entry.use_responses_lite;
343
518
  delete entry.supports_websockets;
@@ -346,20 +521,24 @@ export function normalizeRoutedCatalogEntry(entry: RawEntry, parallelToolCalls =
346
521
  delete entry.service_tiers;
347
522
  delete entry.default_service_tier;
348
523
  // Routed rows cloned from native templates must not inherit OpenAI-only summary delivery.
349
- // Per-model routed opt-ins can be added once provider metadata exposes this capability.
524
+ // Explicit provider/model metadata is re-applied after this normalization step.
350
525
  delete entry.supports_reasoning_summaries;
351
526
  const isCursorEntry = typeof entry.slug === "string" && entry.slug.startsWith("cursor/");
352
- // Routed providers use opencodex sidecars and client-executed tool discovery. The sidecar
353
- // runs through native gpt-5.4-mini, so image search is available and verbalized for text-only
354
- // models. EXCEPT cursor: its runTurn transport bypasses the web-search plan entirely and
355
- // rejects server search queries advertising the tool would make models call into a void.
527
+ // `supports_search_tool` selects Codex's deferred tool-discovery surface; it is not the hosted
528
+ // web-search capability. Routed rows also carry tool_mode=code_mode_only (below), and under code
529
+ // mode DEFERRED MCP tools remain callable through exec's `tools` global / ALL_TOOLS without any
530
+ // tool_search round-trip (upstream codex-rs code_mode suite; live canary 2026-08-13: routed
531
+ // kimi/k3 called tools.mcp__node_repl__js → isError:false). Stamping false here instead forces
532
+ // every MCP declaration into exec.description — a measured 2.7x turn-1 payload regression
533
+ // (96,699 → 258,929 chars; devlog/_plan/260813_tool_catalog_deferral/010). So every routed
534
+ // code-mode row advertises deferred discovery. Cursor still omits hosted web-search metadata below,
535
+ // but disabling this separate exposure bit can inflate `exec` past Cursor's 120 KB wire cap (#1830).
356
536
  if (isCursorEntry) {
357
537
  delete entry.web_search_tool_type;
358
- entry.supports_search_tool = false;
359
538
  } else {
360
539
  entry.web_search_tool_type = "text_and_image";
361
- entry.supports_search_tool = true;
362
540
  }
541
+ entry.supports_search_tool = true;
363
542
  // Cursor's transport already serializes overlapping tool calls into atomic Responses tool events.
364
543
  // Advertising parallel calls lets Codex send the same native capability bit it sends for OpenAI.
365
544
  // Opt-in providers (OcxProviderConfig.parallelToolCalls, e.g. xAI) advertise it too: the
@@ -389,11 +568,25 @@ export function catalogModelSupportsReasoningSummaries(modelId: string): boolean
389
568
  return values.size === 1 ? values.values().next().value : undefined;
390
569
  }
391
570
 
392
- export function applyJawcodeCatalogMetadata(entry: RawEntry, provider: string, modelId: string, contextCap?: number): void {
393
- const jawcodeProvider = resolveJawcodeProvider(provider);
394
- if (!jawcodeProvider) return;
395
- const meta = getJawcodeModelMetadata(jawcodeProvider, modelId)
396
- ?? (shouldCaseFoldMetadataModelId(provider) ? getJawcodeModelMetadataCaseInsensitive(jawcodeProvider, modelId) : undefined);
571
+ /**
572
+ * Resolve the generated jawcode metadata row for a provider/model pair.
573
+ *
574
+ * Exported because it is the SECOND source of real capability assertions:
575
+ * `applyCatalogMetadata` writes context/modalities from it without ever
576
+ * touching a `CatalogModel`, so the routing-evidence provenance stamp in
577
+ * `applyCatalogModelMetadata` has to consult the same table. Both callers share
578
+ * this one lookup rather than duplicating the resolve/case-fold rules, which is
579
+ * what keeps the serialized entry and its provenance from drifting apart.
580
+ */
581
+ export function generatedModelMetadata(provider: string, modelId: string) {
582
+ const jawcodeProvider = resolveMetadataProvider(provider);
583
+ if (!jawcodeProvider) return undefined;
584
+ return getModelMetadata(jawcodeProvider, modelId)
585
+ ?? (shouldCaseFoldMetadataModelId(provider) ? getModelMetadataCaseInsensitive(jawcodeProvider, modelId) : undefined);
586
+ }
587
+
588
+ export function applyCatalogMetadata(entry: RawEntry, provider: string, modelId: string, contextCap?: number): void {
589
+ const meta = generatedModelMetadata(provider, modelId);
397
590
  if (!meta) return;
398
591
  if (typeof meta.contextWindow === "number" && meta.contextWindow > 0) {
399
592
  const contextWindow = applyProviderContextCap(meta.contextWindow, contextCap) ?? meta.contextWindow;
@@ -422,7 +615,8 @@ export function readCatalogBackup(catalogPath: string): RawCatalog | null {
422
615
  }
423
616
 
424
617
  export function catalogHasRoutedEntries(catalog: RawCatalog | null): boolean {
425
- return (catalog?.models ?? []).some(m => typeof m.slug === "string" && m.slug.includes("/"));
618
+ return (catalog?.models ?? []).some(m => typeof m.slug === "string"
619
+ && (m.slug.includes("/") || m.opencodex_catalog_kind === CODEX_NATIVE_ALIAS_CATALOG_KIND));
426
620
  }
427
621
 
428
622
  export function writePristineCatalogBackup(backupPath: string, catalogPath: string, catalog: RawCatalog): void {