@yansigit/opencodex 2.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (826) hide show
  1. package/AGENTS_INSTALL.md +109 -0
  2. package/LICENSE +21 -0
  3. package/README.md +303 -0
  4. package/assets/architecture.png +0 -0
  5. package/assets/banner.png +0 -0
  6. package/assets/claude-code-models.gif +0 -0
  7. package/assets/codex-app-picker.png +0 -0
  8. package/bin/ocx.mjs +587 -0
  9. package/bin/package-main.mjs +9 -0
  10. package/gui/dist/assets/index-BNJ7r4Gd.js +102 -0
  11. package/gui/dist/assets/index-CGoDO3uO.css +1 -0
  12. package/gui/dist/favicon.png +0 -0
  13. package/gui/dist/icons.svg +24 -0
  14. package/gui/dist/index.html +25 -0
  15. package/gui/dist/logo.png +0 -0
  16. package/gui/dist/provider-icons/alibaba-color.svg +1 -0
  17. package/gui/dist/provider-icons/antigravity-color.svg +1 -0
  18. package/gui/dist/provider-icons/claude-color.svg +1 -0
  19. package/gui/dist/provider-icons/cline-color.svg +16 -0
  20. package/gui/dist/provider-icons/cloudflare-ai-gateway-color.svg +1 -0
  21. package/gui/dist/provider-icons/commandcode-color.svg +1 -0
  22. package/gui/dist/provider-icons/copilot-color.svg +1 -0
  23. package/gui/dist/provider-icons/cursor-color.svg +2 -0
  24. package/gui/dist/provider-icons/deepseek-color.svg +1 -0
  25. package/gui/dist/provider-icons/discord.svg +1 -0
  26. package/gui/dist/provider-icons/firepass-color.svg +1 -0
  27. package/gui/dist/provider-icons/fireworks-color.svg +1 -0
  28. package/gui/dist/provider-icons/gemini-color.svg +1 -0
  29. package/gui/dist/provider-icons/github-copilot-color.svg +1 -0
  30. package/gui/dist/provider-icons/gitlab-duo-color.svg +1 -0
  31. package/gui/dist/provider-icons/grok.svg +1 -0
  32. package/gui/dist/provider-icons/groq-color.svg +1 -0
  33. package/gui/dist/provider-icons/huggingface-color.svg +1 -0
  34. package/gui/dist/provider-icons/kimi-color.svg +1 -0
  35. package/gui/dist/provider-icons/kiro-color.svg +15 -0
  36. package/gui/dist/provider-icons/lm-studio-color.svg +1 -0
  37. package/gui/dist/provider-icons/mistral-color.svg +1 -0
  38. package/gui/dist/provider-icons/moonshot-color.svg +1 -0
  39. package/gui/dist/provider-icons/nvidia-color.svg +1 -0
  40. package/gui/dist/provider-icons/ollama-color.svg +1 -0
  41. package/gui/dist/provider-icons/openai.svg +1 -0
  42. package/gui/dist/provider-icons/opencode.svg +2 -0
  43. package/gui/dist/provider-icons/openrouter-color.svg +1 -0
  44. package/gui/dist/provider-icons/pi.svg +21 -0
  45. package/gui/dist/provider-icons/qianfan-color.svg +1 -0
  46. package/gui/dist/provider-icons/qwen-portal-color.svg +1 -0
  47. package/gui/dist/provider-icons/telegram.svg +1 -0
  48. package/gui/dist/provider-icons/vercel-ai-gateway-color.svg +1 -0
  49. package/gui/dist/provider-icons/vllm-color.svg +1 -0
  50. package/gui/dist/provider-icons/xiaomi-color.svg +1 -0
  51. package/package.json +108 -0
  52. package/src/AGENTS.md +28 -0
  53. package/src/adapters/anthropic-image-guard.ts +251 -0
  54. package/src/adapters/anthropic-image-normalize.ts +518 -0
  55. package/src/adapters/anthropic-output-schema.ts +137 -0
  56. package/src/adapters/anthropic.ts +1327 -0
  57. package/src/adapters/azure.ts +36 -0
  58. package/src/adapters/base.ts +121 -0
  59. package/src/adapters/client-fingerprint.ts +65 -0
  60. package/src/adapters/cline-pass-deepseek-v4-tool-replay.ts +69 -0
  61. package/src/adapters/command-code.ts +601 -0
  62. package/src/adapters/cursor/arg-codec.ts +38 -0
  63. package/src/adapters/cursor/arg-normalize.ts +104 -0
  64. package/src/adapters/cursor/checkpoint-store.ts +303 -0
  65. package/src/adapters/cursor/cursor-errors.ts +288 -0
  66. package/src/adapters/cursor/discovery.ts +333 -0
  67. package/src/adapters/cursor/effort-map.ts +151 -0
  68. package/src/adapters/cursor/exec-policy.ts +88 -0
  69. package/src/adapters/cursor/framing.ts +250 -0
  70. package/src/adapters/cursor/gen/agent_pb.ts +15274 -0
  71. package/src/adapters/cursor/h2-pool.ts +123 -0
  72. package/src/adapters/cursor/http1-bidi.ts +361 -0
  73. package/src/adapters/cursor/images.ts +704 -0
  74. package/src/adapters/cursor/kv-store.ts +52 -0
  75. package/src/adapters/cursor/live-models.ts +269 -0
  76. package/src/adapters/cursor/live-smoke-gate.ts +41 -0
  77. package/src/adapters/cursor/live-transport.ts +1653 -0
  78. package/src/adapters/cursor/mcp-config.ts +42 -0
  79. package/src/adapters/cursor/mcp-manager.ts +333 -0
  80. package/src/adapters/cursor/message-mapper.ts +49 -0
  81. package/src/adapters/cursor/native-exec-common.ts +76 -0
  82. package/src/adapters/cursor/native-exec-desktop.ts +184 -0
  83. package/src/adapters/cursor/native-exec-fs.ts +332 -0
  84. package/src/adapters/cursor/native-exec-mcp.ts +153 -0
  85. package/src/adapters/cursor/native-exec-network.ts +43 -0
  86. package/src/adapters/cursor/native-exec-shell.ts +547 -0
  87. package/src/adapters/cursor/native-exec-tools.ts +118 -0
  88. package/src/adapters/cursor/native-exec.ts +663 -0
  89. package/src/adapters/cursor/protobuf-events.ts +1381 -0
  90. package/src/adapters/cursor/protobuf-request.ts +1032 -0
  91. package/src/adapters/cursor/request-builder.ts +461 -0
  92. package/src/adapters/cursor/thread-continuity.ts +67 -0
  93. package/src/adapters/cursor/tool-definitions.ts +735 -0
  94. package/src/adapters/cursor/tool-result-normalize.ts +92 -0
  95. package/src/adapters/cursor/transport-retry.ts +132 -0
  96. package/src/adapters/cursor/transport.ts +79 -0
  97. package/src/adapters/cursor/types.ts +79 -0
  98. package/src/adapters/cursor.ts +322 -0
  99. package/src/adapters/google-antigravity-hosts.ts +48 -0
  100. package/src/adapters/google-antigravity-replay.ts +827 -0
  101. package/src/adapters/google-antigravity-tools.ts +105 -0
  102. package/src/adapters/google-antigravity-wire.ts +141 -0
  103. package/src/adapters/google-errors.ts +92 -0
  104. package/src/adapters/google-http.ts +460 -0
  105. package/src/adapters/google-tool-schema.ts +238 -0
  106. package/src/adapters/google-truncation.ts +24 -0
  107. package/src/adapters/google-wire-compiler.ts +232 -0
  108. package/src/adapters/google.ts +1377 -0
  109. package/src/adapters/identity.ts +77 -0
  110. package/src/adapters/image.ts +23 -0
  111. package/src/adapters/kiro-constants.ts +16 -0
  112. package/src/adapters/kiro-errors.ts +208 -0
  113. package/src/adapters/kiro-events.ts +197 -0
  114. package/src/adapters/kiro-images.ts +129 -0
  115. package/src/adapters/kiro-retry.ts +312 -0
  116. package/src/adapters/kiro-thinking.ts +112 -0
  117. package/src/adapters/kiro-tool-fallback.ts +36 -0
  118. package/src/adapters/kiro-tools.ts +224 -0
  119. package/src/adapters/kiro-truncation.ts +33 -0
  120. package/src/adapters/kiro-wire.ts +129 -0
  121. package/src/adapters/kiro.ts +1936 -0
  122. package/src/adapters/mimo-free.ts +280 -0
  123. package/src/adapters/openai-chat-url.ts +11 -0
  124. package/src/adapters/openai-chat.ts +1980 -0
  125. package/src/adapters/openai-responses-url.ts +16 -0
  126. package/src/adapters/openai-responses.ts +1911 -0
  127. package/src/adapters/registry.ts +175 -0
  128. package/src/adapters/responses-tool-schema.ts +67 -0
  129. package/src/adapters/run-turn-queue.ts +114 -0
  130. package/src/adapters/tool-call-id.ts +119 -0
  131. package/src/adapters/tool-catalog-nudge.ts +154 -0
  132. package/src/adapters/upstream-http-error.ts +48 -0
  133. package/src/adapters/xai-web-search.ts +185 -0
  134. package/src/bridge.ts +1986 -0
  135. package/src/chat/inbound.ts +319 -0
  136. package/src/chat/outbound.ts +821 -0
  137. package/src/claude/agents-inject.ts +266 -0
  138. package/src/claude/alias.ts +149 -0
  139. package/src/claude/auth-detect.ts +229 -0
  140. package/src/claude/auth-mode-migration.ts +32 -0
  141. package/src/claude/auth-mode.ts +62 -0
  142. package/src/claude/context-windows.ts +205 -0
  143. package/src/claude/desktop-3p-guard.ts +35 -0
  144. package/src/claude/desktop-3p-paths.ts +84 -0
  145. package/src/claude/desktop-3p.ts +615 -0
  146. package/src/claude/desktop-health.ts +26 -0
  147. package/src/claude/desktop-profile.ts +263 -0
  148. package/src/claude/gateway-cache.ts +107 -0
  149. package/src/claude/inbound-debug.ts +163 -0
  150. package/src/claude/inbound.ts +578 -0
  151. package/src/claude/model-info.ts +174 -0
  152. package/src/claude/outbound.ts +926 -0
  153. package/src/cli/access.ts +108 -0
  154. package/src/cli/account-api.ts +302 -0
  155. package/src/cli/account-auth.ts +250 -0
  156. package/src/cli/account-catalog-refresh.ts +14 -0
  157. package/src/cli/account-extended.ts +737 -0
  158. package/src/cli/account-main.ts +317 -0
  159. package/src/cli/account.ts +299 -0
  160. package/src/cli/agent-driven.ts +70 -0
  161. package/src/cli/agent.ts +290 -0
  162. package/src/cli/catalog-prewarm.ts +27 -0
  163. package/src/cli/claude-agent-startup-sync.ts +73 -0
  164. package/src/cli/claude-desktop.ts +213 -0
  165. package/src/cli/claude.ts +355 -0
  166. package/src/cli/codex-log-guard-doctor.ts +103 -0
  167. package/src/cli/codex-shim-autorestore.ts +47 -0
  168. package/src/cli/codex-shim-readiness.ts +76 -0
  169. package/src/cli/combo.ts +127 -0
  170. package/src/cli/config-command.ts +209 -0
  171. package/src/cli/debug.ts +228 -0
  172. package/src/cli/dispatch.ts +585 -0
  173. package/src/cli/doctor.ts +1202 -0
  174. package/src/cli/ensure-desired-integrations.ts +152 -0
  175. package/src/cli/export-command.ts +213 -0
  176. package/src/cli/help.ts +101 -0
  177. package/src/cli/index.ts +973 -0
  178. package/src/cli/init.ts +211 -0
  179. package/src/cli/integrations.ts +260 -0
  180. package/src/cli/interactive-confirm.ts +133 -0
  181. package/src/cli/lab.ts +607 -0
  182. package/src/cli/launcher-context.ts +77 -0
  183. package/src/cli/minimax.ts +497 -0
  184. package/src/cli/models-runtime.ts +245 -0
  185. package/src/cli/models.ts +422 -0
  186. package/src/cli/observe.ts +206 -0
  187. package/src/cli/opencode.ts +588 -0
  188. package/src/cli/provider-replit.ts +232 -0
  189. package/src/cli/provider-runtime.ts +179 -0
  190. package/src/cli/provider.ts +492 -0
  191. package/src/cli/ready.ts +301 -0
  192. package/src/cli/registry.ts +422 -0
  193. package/src/cli/replit-gateway-key-input.ts +138 -0
  194. package/src/cli/root.ts +86 -0
  195. package/src/cli/route-policy.ts +92 -0
  196. package/src/cli/runtime-api.ts +328 -0
  197. package/src/cli/star-prompt.ts +211 -0
  198. package/src/cli/status-oauth.ts +78 -0
  199. package/src/cli/status.ts +328 -0
  200. package/src/cli/system-command.ts +112 -0
  201. package/src/cli/system-restart-client.ts +146 -0
  202. package/src/cli/tray-proxy.ts +199 -0
  203. package/src/cli/v2.ts +268 -0
  204. package/src/cli.ts +10 -0
  205. package/src/clients/config-export.ts +1704 -0
  206. package/src/codex/account-id.ts +34 -0
  207. package/src/codex/account-label.ts +47 -0
  208. package/src/codex/account-lifecycle.ts +172 -0
  209. package/src/codex/account-namespace-match.ts +63 -0
  210. package/src/codex/account-namespaces.ts +195 -0
  211. package/src/codex/account-pause.ts +20 -0
  212. package/src/codex/account-priority.ts +83 -0
  213. package/src/codex/account-runtime-state.ts +31 -0
  214. package/src/codex/account-store.ts +544 -0
  215. package/src/codex/account-usability.ts +43 -0
  216. package/src/codex/admission.ts +256 -0
  217. package/src/codex/affinity-debug.ts +162 -0
  218. package/src/codex/agent-roles-sync.ts +225 -0
  219. package/src/codex/agent-roles.ts +238 -0
  220. package/src/codex/app-server-processes.ts +1143 -0
  221. package/src/codex/app-server-restart-service.ts +232 -0
  222. package/src/codex/auth-api.ts +2147 -0
  223. package/src/codex/auth-collision.ts +109 -0
  224. package/src/codex/auth-context.ts +665 -0
  225. package/src/codex/autostart-health.ts +156 -0
  226. package/src/codex/catalog/account-models.ts +67 -0
  227. package/src/codex/catalog/aggregation.ts +436 -0
  228. package/src/codex/catalog/bundled.ts +549 -0
  229. package/src/codex/catalog/effort.ts +446 -0
  230. package/src/codex/catalog/filesystem-evidence.ts +302 -0
  231. package/src/codex/catalog/kinds.ts +2 -0
  232. package/src/codex/catalog/metadata.ts +664 -0
  233. package/src/codex/catalog/native-models.ts +72 -0
  234. package/src/codex/catalog/parsing.ts +650 -0
  235. package/src/codex/catalog/provider-fetch.ts +2064 -0
  236. package/src/codex/catalog/sync.ts +1883 -0
  237. package/src/codex/catalog-admission.ts +199 -0
  238. package/src/codex/catalog-refresh-status.ts +105 -0
  239. package/src/codex/catalog-write-serialization.ts +242 -0
  240. package/src/codex/catalog.ts +14 -0
  241. package/src/codex/codex-write-lock.ts +384 -0
  242. package/src/codex/convergence-types.ts +614 -0
  243. package/src/codex/convergence.ts +651 -0
  244. package/src/codex/coordinator-doctor.ts +332 -0
  245. package/src/codex/custom-model-catalog-migration.ts +176 -0
  246. package/src/codex/data/upstream-models.json +830 -0
  247. package/src/codex/desired-state.ts +230 -0
  248. package/src/codex/exec-invocation.ts +22 -0
  249. package/src/codex/features.ts +1566 -0
  250. package/src/codex/generation.ts +202 -0
  251. package/src/codex/history-job.ts +407 -0
  252. package/src/codex/history-lock.ts +242 -0
  253. package/src/codex/history-migration-guardian.ts +108 -0
  254. package/src/codex/history-provider.ts +979 -0
  255. package/src/codex/history-transition.ts +105 -0
  256. package/src/codex/history-worker.ts +220 -0
  257. package/src/codex/home.ts +206 -0
  258. package/src/codex/inject-coordination.ts +290 -0
  259. package/src/codex/inject.ts +1733 -0
  260. package/src/codex/injected-marker.ts +106 -0
  261. package/src/codex/integration-record.ts +266 -0
  262. package/src/codex/internal/catalog-writer.ts +203 -0
  263. package/src/codex/internal/history-writer.ts +80 -0
  264. package/src/codex/journal.ts +225 -0
  265. package/src/codex/log-guard/inspect.ts +506 -0
  266. package/src/codex/log-guard/lock.ts +150 -0
  267. package/src/codex/log-guard/maintenance.ts +403 -0
  268. package/src/codex/log-guard/path-safety.ts +88 -0
  269. package/src/codex/log-guard/policy.ts +44 -0
  270. package/src/codex/log-guard/processes.ts +205 -0
  271. package/src/codex/log-guard/protection.ts +489 -0
  272. package/src/codex/log-guard/sqlite-errors.ts +9 -0
  273. package/src/codex/main-account-cache.ts +56 -0
  274. package/src/codex/main-account.ts +68 -0
  275. package/src/codex/management-convergence.ts +167 -0
  276. package/src/codex/model-cache.ts +273 -0
  277. package/src/codex/model-entitlements.ts +353 -0
  278. package/src/codex/native-main-admission.ts +47 -0
  279. package/src/codex/native-main-auth-temp.ts +187 -0
  280. package/src/codex/native-main-claim.ts +178 -0
  281. package/src/codex/native-main-lock-file.ts +162 -0
  282. package/src/codex/native-main-owner.ts +329 -0
  283. package/src/codex/native-profile-api.ts +247 -0
  284. package/src/codex/native-profile-manager.ts +1531 -0
  285. package/src/codex/native-profile-processes.ts +121 -0
  286. package/src/codex/native-profile-recovery.ts +99 -0
  287. package/src/codex/native-profile-stage-store.ts +387 -0
  288. package/src/codex/native-profile-startup.ts +492 -0
  289. package/src/codex/native-profile-store.ts +855 -0
  290. package/src/codex/native-profile-types.ts +120 -0
  291. package/src/codex/native-residue.ts +682 -0
  292. package/src/codex/paths.ts +144 -0
  293. package/src/codex/plan-from-token.ts +140 -0
  294. package/src/codex/plan.ts +40 -0
  295. package/src/codex/plugins-doctor.ts +242 -0
  296. package/src/codex/pool-rotation.ts +295 -0
  297. package/src/codex/project-config-warnings.ts +425 -0
  298. package/src/codex/prompt-journal.ts +352 -0
  299. package/src/codex/prompt-layers.ts +967 -0
  300. package/src/codex/prompt-lock.ts +143 -0
  301. package/src/codex/quota-rejection.ts +298 -0
  302. package/src/codex/quota.ts +573 -0
  303. package/src/codex/refresh.ts +62 -0
  304. package/src/codex/reset-credit-recovery.ts +1044 -0
  305. package/src/codex/routing.ts +1888 -0
  306. package/src/codex/runtime.ts +659 -0
  307. package/src/codex/shim.ts +2170 -0
  308. package/src/codex/subagent-defaults.ts +550 -0
  309. package/src/codex/subagent-model-fallback.ts +784 -0
  310. package/src/codex/sync.ts +319 -0
  311. package/src/codex/transition-state.ts +612 -0
  312. package/src/codex/upstream-host-health.ts +368 -0
  313. package/src/codex/user-identity.ts +557 -0
  314. package/src/codex/warmup.ts +298 -0
  315. package/src/codex/websocket-registry.ts +100 -0
  316. package/src/codex/write-coordination.ts +114 -0
  317. package/src/combos/failover.ts +160 -0
  318. package/src/combos/index.ts +45 -0
  319. package/src/combos/request.ts +94 -0
  320. package/src/combos/resolve.ts +232 -0
  321. package/src/combos/types.ts +398 -0
  322. package/src/config/provider-name.ts +24 -0
  323. package/src/config.ts +4041 -0
  324. package/src/fork/register.ts +3 -0
  325. package/src/generated/compatibility-version.json +3116 -0
  326. package/src/generated/model-metadata.ts +106 -0
  327. package/src/github/star-state.ts +203 -0
  328. package/src/grok/inject.ts +530 -0
  329. package/src/grok/inspect.ts +45 -0
  330. package/src/grok/status.ts +121 -0
  331. package/src/grok/sync.ts +66 -0
  332. package/src/images/artifacts.ts +516 -0
  333. package/src/images/fulfill-video.ts +163 -0
  334. package/src/images/fulfill.ts +149 -0
  335. package/src/images/index.ts +4 -0
  336. package/src/images/loop.ts +955 -0
  337. package/src/images/plan.ts +143 -0
  338. package/src/images/synthetic-tool.ts +133 -0
  339. package/src/images/types.ts +41 -0
  340. package/src/images/xai-client.ts +141 -0
  341. package/src/images/xai-video-client.ts +163 -0
  342. package/src/index.ts +22 -0
  343. package/src/integrations/config-io.ts +269 -0
  344. package/src/integrations/journal.ts +315 -0
  345. package/src/integrations/merge.ts +135 -0
  346. package/src/integrations/mutation-flight.ts +71 -0
  347. package/src/integrations/native/ownership-preflight.ts +202 -0
  348. package/src/integrations/omp-yaml-source.ts +358 -0
  349. package/src/integrations/owned-refresh.ts +74 -0
  350. package/src/integrations/ownership.ts +111 -0
  351. package/src/integrations/registry.ts +159 -0
  352. package/src/integrations/serialize.ts +314 -0
  353. package/src/integrations/state.ts +361 -0
  354. package/src/integrations/store.ts +103 -0
  355. package/src/integrations/writer-lock.ts +98 -0
  356. package/src/integrations/writer.ts +691 -0
  357. package/src/lab/artifacts/sanitize.ts +586 -0
  358. package/src/lab/artifacts/secure-fs.ts +475 -0
  359. package/src/lab/artifacts/store.ts +310 -0
  360. package/src/lab/automation/budgets.ts +78 -0
  361. package/src/lab/automation/config-persistence.ts +256 -0
  362. package/src/lab/automation/constants.ts +39 -0
  363. package/src/lab/automation/cooldown.ts +103 -0
  364. package/src/lab/automation/dispatch.ts +211 -0
  365. package/src/lab/automation/index.ts +13 -0
  366. package/src/lab/automation/orchestrator.ts +499 -0
  367. package/src/lab/automation/persistence.ts +512 -0
  368. package/src/lab/automation/planner.ts +371 -0
  369. package/src/lab/automation/policy.ts +136 -0
  370. package/src/lab/automation/queue.ts +191 -0
  371. package/src/lab/automation/recovery.ts +24 -0
  372. package/src/lab/automation/route-context.ts +21 -0
  373. package/src/lab/automation/run-key.ts +44 -0
  374. package/src/lab/automation/runs-query.ts +34 -0
  375. package/src/lab/automation/types.ts +160 -0
  376. package/src/lab/conformance/assertion.ts +325 -0
  377. package/src/lab/conformance/digest.ts +22 -0
  378. package/src/lab/conformance/executor.ts +741 -0
  379. package/src/lab/conformance/fixture-provider.ts +27 -0
  380. package/src/lab/conformance/fixtures/live-v1-cases.json +175 -0
  381. package/src/lab/conformance/fixtures/protocol-v1-cases.json +461 -0
  382. package/src/lab/conformance/harness-budget.ts +47 -0
  383. package/src/lab/conformance/index.ts +5 -0
  384. package/src/lab/conformance/jcs.ts +64 -0
  385. package/src/lab/conformance/json-pointer.ts +39 -0
  386. package/src/lab/conformance/manifest.ts +180 -0
  387. package/src/lab/conformance/mcp-stub.ts +179 -0
  388. package/src/lab/conformance/negative-controls.ts +164 -0
  389. package/src/lab/conformance/observation.ts +355 -0
  390. package/src/lab/conformance/runner.ts +68 -0
  391. package/src/lab/conformance/sse-normalize.ts +59 -0
  392. package/src/lab/conformance/suite-manifest.ts +78 -0
  393. package/src/lab/conformance/types.ts +214 -0
  394. package/src/lab/constants.ts +126 -0
  395. package/src/lab/digest.ts +64 -0
  396. package/src/lab/events/errors.ts +9 -0
  397. package/src/lab/events/limits.ts +117 -0
  398. package/src/lab/events/types.ts +229 -0
  399. package/src/lab/events/validate.ts +781 -0
  400. package/src/lab/fabric/constants.ts +40 -0
  401. package/src/lab/fabric/executor.ts +492 -0
  402. package/src/lab/fabric/index.ts +80 -0
  403. package/src/lab/fabric/manifest.ts +222 -0
  404. package/src/lab/fabric/observe.ts +489 -0
  405. package/src/lab/fabric/patch.ts +79 -0
  406. package/src/lab/fabric/producer-child.ts +139 -0
  407. package/src/lab/fabric/producer-isolate.ts +276 -0
  408. package/src/lab/fabric/producer-protocol.ts +61 -0
  409. package/src/lab/fabric/scratch.ts +439 -0
  410. package/src/lab/fabric/subject.ts +106 -0
  411. package/src/lab/fabric/types.ts +134 -0
  412. package/src/lab/fabric/verifier.ts +98 -0
  413. package/src/lab/index.ts +54 -0
  414. package/src/lab/ledger/artifact-refs.ts +127 -0
  415. package/src/lab/ledger/invalidation.ts +136 -0
  416. package/src/lab/ledger/purge.ts +310 -0
  417. package/src/lab/ledger/store.ts +532 -0
  418. package/src/lab/live/credential-lease.ts +53 -0
  419. package/src/lab/live/destination.ts +155 -0
  420. package/src/lab/live/executor.ts +336 -0
  421. package/src/lab/live/inert-tools.ts +56 -0
  422. package/src/lab/live/manifest.ts +85 -0
  423. package/src/lab/live/mcp-loopback.ts +57 -0
  424. package/src/lab/live/runner.ts +19 -0
  425. package/src/lab/live/sandbox.ts +61 -0
  426. package/src/lab/live/suite-manifest.ts +41 -0
  427. package/src/lab/live/transport.ts +118 -0
  428. package/src/lab/live/types.ts +197 -0
  429. package/src/lab/observe/from-conformance.ts +301 -0
  430. package/src/lab/observe/from-live.ts +117 -0
  431. package/src/lab/paths.ts +153 -0
  432. package/src/lab/projection/rebuild.ts +495 -0
  433. package/src/lab/projection/schema.ts +135 -0
  434. package/src/lab/projection/verdicts.ts +474 -0
  435. package/src/lab/projection/verification.ts +412 -0
  436. package/src/lab/public/bundle.ts +217 -0
  437. package/src/lab/public/community-authority.ts +175 -0
  438. package/src/lab/public/community-files.ts +29 -0
  439. package/src/lab/public/community.ts +479 -0
  440. package/src/lab/public/file-safety.ts +155 -0
  441. package/src/lab/public/ids.ts +26 -0
  442. package/src/lab/public/index.ts +16 -0
  443. package/src/lab/public/mutation-lock.ts +424 -0
  444. package/src/lab/public/operator.ts +353 -0
  445. package/src/lab/public/origin-purge.ts +79 -0
  446. package/src/lab/public/origin.ts +203 -0
  447. package/src/lab/public/privacy.ts +143 -0
  448. package/src/lab/public/private-file.ts +261 -0
  449. package/src/lab/public/project.ts +124 -0
  450. package/src/lab/public/purge-test-fault.ts +21 -0
  451. package/src/lab/public/purge.ts +223 -0
  452. package/src/lab/public/registry.ts +44 -0
  453. package/src/lab/public/revocation.ts +252 -0
  454. package/src/lab/public/signature.ts +243 -0
  455. package/src/lab/public/storage.ts +105 -0
  456. package/src/lab/public/strict-json.ts +206 -0
  457. package/src/lab/public/time.ts +26 -0
  458. package/src/lab/public/types.ts +172 -0
  459. package/src/lab/public/validate.ts +391 -0
  460. package/src/lab/query/catalog.ts +101 -0
  461. package/src/lab/query/connection.ts +107 -0
  462. package/src/lab/query/constants.ts +4 -0
  463. package/src/lab/query/cursor.ts +132 -0
  464. package/src/lab/query/dto-map.ts +277 -0
  465. package/src/lab/query/errors.ts +22 -0
  466. package/src/lab/query/freshness.ts +53 -0
  467. package/src/lab/query/index.ts +45 -0
  468. package/src/lab/query/latest-observation.ts +59 -0
  469. package/src/lab/query/passive-production.ts +159 -0
  470. package/src/lab/query/queries.ts +444 -0
  471. package/src/lab/query/types.ts +266 -0
  472. package/src/lab/subject/behavior-fingerprint.ts +77 -0
  473. package/src/lab/subject/installation-salt.ts +112 -0
  474. package/src/lab/subject/protocol-subject.ts +80 -0
  475. package/src/lab/subject/route-subject.ts +74 -0
  476. package/src/lib/abort.ts +146 -0
  477. package/src/lib/admin-secrets.ts +25 -0
  478. package/src/lib/admission.ts +83 -0
  479. package/src/lib/app-owned-memory-stores.ts +195 -0
  480. package/src/lib/app-owned-memory.ts +265 -0
  481. package/src/lib/bounded-body.ts +346 -0
  482. package/src/lib/bun-binary-validator.d.mts +3 -0
  483. package/src/lib/bun-binary-validator.mjs +18 -0
  484. package/src/lib/bun-runtime.ts +184 -0
  485. package/src/lib/bun-stream-caps.ts +130 -0
  486. package/src/lib/codex-restart-contract.ts +120 -0
  487. package/src/lib/config-ownership.ts +364 -0
  488. package/src/lib/crash-guard.ts +344 -0
  489. package/src/lib/debug-log-buffer.ts +83 -0
  490. package/src/lib/debug-settings.ts +108 -0
  491. package/src/lib/debug.ts +31 -0
  492. package/src/lib/destination-policy.ts +380 -0
  493. package/src/lib/errors.ts +406 -0
  494. package/src/lib/eventstream-decoder.ts +253 -0
  495. package/src/lib/fabric-task-execution-authority.ts +7 -0
  496. package/src/lib/fabric-task-host.ts +29 -0
  497. package/src/lib/gcp-adc.ts +341 -0
  498. package/src/lib/injection-debug-log.ts +58 -0
  499. package/src/lib/lab-activation.ts +223 -0
  500. package/src/lib/lab-live-execution-authority.ts +13 -0
  501. package/src/lib/lab-live-host.ts +30 -0
  502. package/src/lib/lab-live-pinned-sender.ts +56 -0
  503. package/src/lib/lab-live-route-production.ts +130 -0
  504. package/src/lib/lab-passive-linker-registration.ts +26 -0
  505. package/src/lib/local-management-attestation.ts +51 -0
  506. package/src/lib/local-management-capability.ts +100 -0
  507. package/src/lib/local-provider-reload-contract.ts +100 -0
  508. package/src/lib/open-url.ts +25 -0
  509. package/src/lib/optional-shutdown-hooks.ts +57 -0
  510. package/src/lib/pinned-http.ts +270 -0
  511. package/src/lib/privacy.ts +20 -0
  512. package/src/lib/process-control.ts +168 -0
  513. package/src/lib/provider-outbound.ts +210 -0
  514. package/src/lib/provider-url.ts +14 -0
  515. package/src/lib/proxy-env.ts +18 -0
  516. package/src/lib/redact.ts +521 -0
  517. package/src/lib/retry-after.ts +55 -0
  518. package/src/lib/self-launch-argv.ts +15 -0
  519. package/src/lib/server-resource-ownership.ts +71 -0
  520. package/src/lib/service-secrets.ts +25 -0
  521. package/src/lib/shadow-call.ts +61 -0
  522. package/src/lib/sidecar-tracker.ts +52 -0
  523. package/src/lib/sse-decoder.ts +364 -0
  524. package/src/lib/state-store-registrations.ts +119 -0
  525. package/src/lib/state-store-sweeper.ts +184 -0
  526. package/src/lib/system-restart-contract.ts +73 -0
  527. package/src/lib/test-home-guard.ts +90 -0
  528. package/src/lib/token-estimate.ts +86 -0
  529. package/src/lib/tool-argument-integers.ts +202 -0
  530. package/src/lib/translator-budget.ts +400 -0
  531. package/src/lib/upstream-http-version.ts +57 -0
  532. package/src/lib/upstream-reachability.ts +95 -0
  533. package/src/lib/upstream-retry.ts +392 -0
  534. package/src/lib/win-exec.ts +115 -0
  535. package/src/lib/win-paths.ts +68 -0
  536. package/src/lib/windows-atomic-replace.ts +156 -0
  537. package/src/lib/windows-elevation.ts +773 -0
  538. package/src/lib/windows-secret-acl.ts +854 -0
  539. package/src/lib/windows-service-wrappers.ts +72 -0
  540. package/src/lib/windows-text.ts +106 -0
  541. package/src/lib/windows-user-principal.ts +341 -0
  542. package/src/lib/winsw.ts +403 -0
  543. package/src/oauth/account-import/google-antigravity-adapter.ts +74 -0
  544. package/src/oauth/account-import/index.ts +15 -0
  545. package/src/oauth/account-import/parser.ts +83 -0
  546. package/src/oauth/account-import/registry.ts +18 -0
  547. package/src/oauth/account-import/service.ts +75 -0
  548. package/src/oauth/account-import/types.ts +91 -0
  549. package/src/oauth/anthropic-routing.ts +594 -0
  550. package/src/oauth/anthropic.ts +188 -0
  551. package/src/oauth/antigravity-routing.ts +151 -0
  552. package/src/oauth/callback-server.ts +300 -0
  553. package/src/oauth/chatgpt.ts +161 -0
  554. package/src/oauth/command-code.ts +239 -0
  555. package/src/oauth/cursor.ts +252 -0
  556. package/src/oauth/github-copilot.ts +428 -0
  557. package/src/oauth/google-antigravity.ts +262 -0
  558. package/src/oauth/health.ts +407 -0
  559. package/src/oauth/index.ts +1504 -0
  560. package/src/oauth/key-providers.ts +124 -0
  561. package/src/oauth/kimi.ts +227 -0
  562. package/src/oauth/kiro-credentials.ts +726 -0
  563. package/src/oauth/kiro.ts +621 -0
  564. package/src/oauth/local-token-detect.ts +130 -0
  565. package/src/oauth/log.ts +50 -0
  566. package/src/oauth/login-cli.ts +223 -0
  567. package/src/oauth/nous.ts +798 -0
  568. package/src/oauth/pkce.ts +15 -0
  569. package/src/oauth/store.ts +728 -0
  570. package/src/oauth/token-guardian.ts +309 -0
  571. package/src/oauth/types.ts +62 -0
  572. package/src/oauth/xai.ts +241 -0
  573. package/src/providers/alibaba-region-backup.ts +75 -0
  574. package/src/providers/alibaba-region-migration.ts +156 -0
  575. package/src/providers/alibaba-region-startup.ts +36 -0
  576. package/src/providers/antigravity-models.ts +695 -0
  577. package/src/providers/antigravity-quota.ts +216 -0
  578. package/src/providers/api-keys.ts +140 -0
  579. package/src/providers/base-url-choices.ts +74 -0
  580. package/src/providers/codex-capacity.ts +292 -0
  581. package/src/providers/command-code-efforts.ts +144 -0
  582. package/src/providers/context-cap.ts +82 -0
  583. package/src/providers/cursor-pool.ts +72 -0
  584. package/src/providers/derive.ts +586 -0
  585. package/src/providers/fastwire.ts +501 -0
  586. package/src/providers/free-directory.ts +187 -0
  587. package/src/providers/github-copilot-transport.ts +56 -0
  588. package/src/providers/google-vertex-location.ts +14 -0
  589. package/src/providers/key-failover.ts +271 -0
  590. package/src/providers/kiro-models.ts +67 -0
  591. package/src/providers/label.ts +19 -0
  592. package/src/providers/model-discovery-limits.ts +16 -0
  593. package/src/providers/model-discovery.ts +449 -0
  594. package/src/providers/model-rename-migration.ts +255 -0
  595. package/src/providers/model-rename-startup.ts +28 -0
  596. package/src/providers/openai-sidecar.ts +243 -0
  597. package/src/providers/openai-tier-startup.ts +56 -0
  598. package/src/providers/openai-tiers.ts +423 -0
  599. package/src/providers/openai-virtual-models.ts +83 -0
  600. package/src/providers/opencode-zen-rate-limit.ts +102 -0
  601. package/src/providers/openrouter-routing.ts +102 -0
  602. package/src/providers/provider-id-rewrite.ts +185 -0
  603. package/src/providers/quota.ts +2345 -0
  604. package/src/providers/registry.ts +2918 -0
  605. package/src/providers/replit/constants.ts +27 -0
  606. package/src/providers/replit/derive.ts +85 -0
  607. package/src/providers/replit/headers.ts +28 -0
  608. package/src/providers/replit/origin.ts +55 -0
  609. package/src/providers/replit/pair-install-response.ts +72 -0
  610. package/src/providers/replit/probe.ts +199 -0
  611. package/src/providers/replit/setup.ts +350 -0
  612. package/src/providers/request-pacing.ts +310 -0
  613. package/src/providers/service-tier.ts +277 -0
  614. package/src/providers/slug-codec.ts +103 -0
  615. package/src/providers/static-model-discovery.ts +86 -0
  616. package/src/providers/xai-responses-opt-in.ts +15 -0
  617. package/src/providers/xai-transport.ts +148 -0
  618. package/src/reasoning-effort.ts +183 -0
  619. package/src/responses/compaction.ts +142 -0
  620. package/src/responses/custom-tool-compat.ts +266 -0
  621. package/src/responses/hosted-tool-policy.ts +9 -0
  622. package/src/responses/namespace-tool-compat.ts +355 -0
  623. package/src/responses/parser.ts +838 -0
  624. package/src/responses/provider-continuation.ts +98 -0
  625. package/src/responses/provider-opaque-metadata.ts +73 -0
  626. package/src/responses/reasoning-envelope.ts +60 -0
  627. package/src/responses/reasoning-replay-cache.ts +426 -0
  628. package/src/responses/schema.ts +165 -0
  629. package/src/responses/spill-store.ts +459 -0
  630. package/src/responses/state.ts +1433 -0
  631. package/src/responses/thought-signature-replay.ts +347 -0
  632. package/src/responses/tool-groups.ts +19 -0
  633. package/src/responses/tool-search-compat.ts +301 -0
  634. package/src/responses/truncated-stop-reason.ts +60 -0
  635. package/src/router.ts +761 -0
  636. package/src/routing/analytics.ts +378 -0
  637. package/src/routing/capability.ts +244 -0
  638. package/src/routing/compatibility/assemble.ts +73 -0
  639. package/src/routing/compatibility/behavior.ts +278 -0
  640. package/src/routing/compatibility/catalog.ts +99 -0
  641. package/src/routing/compatibility/endpoint.ts +52 -0
  642. package/src/routing/compatibility/lab-evidence-provider.ts +130 -0
  643. package/src/routing/compatibility/policy.ts +181 -0
  644. package/src/routing/compatibility/provider-slot.ts +56 -0
  645. package/src/routing/compatibility/reader.ts +110 -0
  646. package/src/routing/compatibility/subject.ts +191 -0
  647. package/src/routing/compatibility/types.ts +64 -0
  648. package/src/routing/compatibility/version.ts +104 -0
  649. package/src/routing/cost.ts +77 -0
  650. package/src/routing/evaluator.ts +495 -0
  651. package/src/routing/health.ts +412 -0
  652. package/src/routing/history/cursor.ts +43 -0
  653. package/src/routing/history/indexer.ts +605 -0
  654. package/src/routing/history/schema.ts +72 -0
  655. package/src/routing/profile-namespace.ts +15 -0
  656. package/src/routing/profile.ts +547 -0
  657. package/src/routing/quota.ts +145 -0
  658. package/src/routing/request-evidence.ts +45 -0
  659. package/src/routing/trace.ts +776 -0
  660. package/src/server/adapter-resolve.ts +53 -0
  661. package/src/server/auth-cors.ts +751 -0
  662. package/src/server/background-lifecycle.ts +182 -0
  663. package/src/server/chat-completions.ts +442 -0
  664. package/src/server/chat-native-sse.ts +331 -0
  665. package/src/server/chat-native.ts +426 -0
  666. package/src/server/claude-messages.ts +1030 -0
  667. package/src/server/direct-local-http.ts +347 -0
  668. package/src/server/effort-policy.ts +190 -0
  669. package/src/server/github-copilot-responses-repair.ts +338 -0
  670. package/src/server/gui-static.ts +152 -0
  671. package/src/server/image-retry.ts +42 -0
  672. package/src/server/images.ts +568 -0
  673. package/src/server/index.ts +1813 -0
  674. package/src/server/lifecycle.ts +498 -0
  675. package/src/server/live.ts +717 -0
  676. package/src/server/local-management-read-client.ts +90 -0
  677. package/src/server/local-provider-reload-client.ts +137 -0
  678. package/src/server/management/agent-settings-routes.ts +1433 -0
  679. package/src/server/management/api-access.ts +141 -0
  680. package/src/server/management/api-key-usage.ts +193 -0
  681. package/src/server/management/body.ts +41 -0
  682. package/src/server/management/combo-routes.ts +263 -0
  683. package/src/server/management/config-routes.ts +835 -0
  684. package/src/server/management/context.ts +113 -0
  685. package/src/server/management/integration-routes.ts +498 -0
  686. package/src/server/management/lab-automation-routes.ts +206 -0
  687. package/src/server/management/lab-routes.ts +563 -0
  688. package/src/server/management/logs-usage-routes.ts +586 -0
  689. package/src/server/management/model-routes.ts +560 -0
  690. package/src/server/management/model-rows.ts +163 -0
  691. package/src/server/management/native-integration-routes.ts +769 -0
  692. package/src/server/management/oauth-account-routes.ts +637 -0
  693. package/src/server/management/provider-capability-config.ts +48 -0
  694. package/src/server/management/provider-routes.ts +1033 -0
  695. package/src/server/management/replit-provider-routes.ts +86 -0
  696. package/src/server/management/request-history-routes.ts +191 -0
  697. package/src/server/management/routing-analytics-routes.ts +74 -0
  698. package/src/server/management/routing-profile-routes.ts +385 -0
  699. package/src/server/management/shared.ts +286 -0
  700. package/src/server/management/sidebar-routes.ts +106 -0
  701. package/src/server/management/storage-log-guard-routes.ts +186 -0
  702. package/src/server/management/sync-response.ts +69 -0
  703. package/src/server/management/system-restart.ts +435 -0
  704. package/src/server/management/system-routes.ts +194 -0
  705. package/src/server/management/usage-summary-cache.ts +94 -0
  706. package/src/server/management/vision-sidecar-options.ts +167 -0
  707. package/src/server/management/web-search-sidecar-options.ts +120 -0
  708. package/src/server/management-api.ts +314 -0
  709. package/src/server/management-auth.ts +482 -0
  710. package/src/server/memory-watchdog.ts +156 -0
  711. package/src/server/passive-route-linker.ts +66 -0
  712. package/src/server/port-reclaim.ts +307 -0
  713. package/src/server/ports.ts +156 -0
  714. package/src/server/proxy-liveness.ts +328 -0
  715. package/src/server/readiness.ts +99 -0
  716. package/src/server/relay-eager.ts +353 -0
  717. package/src/server/relay.ts +1209 -0
  718. package/src/server/request-decompress.ts +239 -0
  719. package/src/server/request-log-conversation.ts +168 -0
  720. package/src/server/request-log.ts +1259 -0
  721. package/src/server/responses/agent-task-recovery-cache.ts +143 -0
  722. package/src/server/responses/agent-task-recovery.ts +465 -0
  723. package/src/server/responses/collaboration.ts +551 -0
  724. package/src/server/responses/compact.ts +771 -0
  725. package/src/server/responses/core.ts +5389 -0
  726. package/src/server/responses/empty-completion-guard.ts +276 -0
  727. package/src/server/responses/encrypted-payload.ts +331 -0
  728. package/src/server/responses/fetch-helpers.ts +232 -0
  729. package/src/server/responses/input-admission.ts +185 -0
  730. package/src/server/responses/pacing-overload.ts +13 -0
  731. package/src/server/responses/passthrough-error.ts +78 -0
  732. package/src/server/responses/policy-fallback.ts +178 -0
  733. package/src/server/responses/responses-field-backfill.ts +251 -0
  734. package/src/server/responses/terminal-guard.ts +251 -0
  735. package/src/server/responses/upstream-error.ts +53 -0
  736. package/src/server/responses/ws-upstream.ts +308 -0
  737. package/src/server/responses-custom-tool-repair.ts +282 -0
  738. package/src/server/responses-image-gen-repair.ts +132 -0
  739. package/src/server/responses-item-id-repair.ts +272 -0
  740. package/src/server/responses-json-events.ts +90 -0
  741. package/src/server/responses-model-rewrite.ts +29 -0
  742. package/src/server/responses-reasoning-summary-rewrite.ts +178 -0
  743. package/src/server/responses-snapshot-repair.ts +621 -0
  744. package/src/server/responses-terminal-repair.ts +342 -0
  745. package/src/server/responses-tool-search-repair.ts +267 -0
  746. package/src/server/responses-undeclared-tool-guard.ts +153 -0
  747. package/src/server/responses.ts +25 -0
  748. package/src/server/search.ts +201 -0
  749. package/src/server/sse-frame-buffer.ts +292 -0
  750. package/src/server/sse-payload-rewrite.ts +263 -0
  751. package/src/server/startup-action-control.ts +315 -0
  752. package/src/server/startup-health-cache.ts +131 -0
  753. package/src/server/system-env.ts +484 -0
  754. package/src/server/windows-tcp-drop.ts +184 -0
  755. package/src/server/windows-tray-control.ts +41 -0
  756. package/src/server/ws-bridge.ts +472 -0
  757. package/src/service-manager-probe.ts +892 -0
  758. package/src/service.ts +3575 -0
  759. package/src/sidecar/auth.ts +92 -0
  760. package/src/sidecar/candidates.ts +83 -0
  761. package/src/stall-timeout.ts +20 -0
  762. package/src/storage/cleanup-job.ts +57 -0
  763. package/src/storage/cleanup.ts +3085 -0
  764. package/src/storage/policy-job.ts +457 -0
  765. package/src/storage/policy-scheduler.ts +40 -0
  766. package/src/storage/policy-worker.ts +59 -0
  767. package/src/storage/policy.ts +527 -0
  768. package/src/storage/restore-job.ts +299 -0
  769. package/src/storage/restore-worker.ts +58 -0
  770. package/src/storage/scanner.ts +238 -0
  771. package/src/storage/storage-mutation-coordinator.ts +139 -0
  772. package/src/storage/worker-lifecycle.ts +215 -0
  773. package/src/tray/assets/opencodex-tray-offline.ico +0 -0
  774. package/src/tray/assets/opencodex-tray-online.ico +0 -0
  775. package/src/tray/assets/opencodex-tray-warning.ico +0 -0
  776. package/src/tray/assets/opencodex-tray.png +0 -0
  777. package/src/tray/windows-tray.ps1 +364 -0
  778. package/src/tray/windows.ts +757 -0
  779. package/src/types/accounts.ts +37 -0
  780. package/src/types/config.ts +876 -0
  781. package/src/types/provider.ts +545 -0
  782. package/src/types/request.ts +384 -0
  783. package/src/types/tools.ts +131 -0
  784. package/src/types/wire.ts +80 -0
  785. package/src/types.ts +106 -0
  786. package/src/update/badge.ts +72 -0
  787. package/src/update/index.ts +415 -0
  788. package/src/update/job.ts +1887 -0
  789. package/src/update/notify.ts +263 -0
  790. package/src/update/npm-cache-preflight.d.mts +47 -0
  791. package/src/update/npm-cache-preflight.mjs +201 -0
  792. package/src/update/npm-invocation.d.mts +23 -0
  793. package/src/update/npm-invocation.mjs +94 -0
  794. package/src/update/transactional-install.d.mts +22 -0
  795. package/src/update/transactional-install.mjs +259 -0
  796. package/src/update/tray-update-plan.d.mts +18 -0
  797. package/src/update/tray-update-plan.mjs +38 -0
  798. package/src/usage/cost.ts +625 -0
  799. package/src/usage/debug.ts +97 -0
  800. package/src/usage/expected-prices.ts +416 -0
  801. package/src/usage/log.ts +1223 -0
  802. package/src/usage/summary.ts +753 -0
  803. package/src/usage/totals.ts +14 -0
  804. package/src/usage/user-cost-overlay-reconciler.ts +313 -0
  805. package/src/usage/user-cost-overlays.ts +314 -0
  806. package/src/vision/anthropic-describe.ts +189 -0
  807. package/src/vision/backends.ts +97 -0
  808. package/src/vision/describe.ts +131 -0
  809. package/src/vision/eligibility.ts +250 -0
  810. package/src/vision/index.ts +681 -0
  811. package/src/vision/reasoning.ts +55 -0
  812. package/src/vision/routed-describe.ts +175 -0
  813. package/src/vision/timeout-bounds.ts +9 -0
  814. package/src/web-search/anthropic-executor.ts +195 -0
  815. package/src/web-search/backends.ts +108 -0
  816. package/src/web-search/exa-executor.ts +88 -0
  817. package/src/web-search/executor.ts +113 -0
  818. package/src/web-search/format-result.ts +89 -0
  819. package/src/web-search/gemini-executor.ts +141 -0
  820. package/src/web-search/index.ts +331 -0
  821. package/src/web-search/loop.ts +896 -0
  822. package/src/web-search/parse.ts +315 -0
  823. package/src/web-search/progress-stream.ts +342 -0
  824. package/src/web-search/sources.ts +60 -0
  825. package/src/web-search/synthetic-tool.ts +47 -0
  826. package/src/web-search/xai-executor.ts +219 -0
@@ -0,0 +1,664 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import { createHash } from "node:crypto";
3
+ import { copyFileSync, existsSync, mkdirSync, readFileSync, realpathSync } from "node:fs";
4
+ import { delimiter, dirname, join, resolve } from "node:path";
5
+ import { atomicWriteFile, expandUserPath, getConfigDir, websocketsEnabled } from "../../config";
6
+ import { CODEX_CONFIG_PATH, CODEX_MODELS_CACHE_PATH, DEFAULT_CATALOG_PATH, readRootTomlString, resolveCodexConfigPath } from "../paths";
7
+ import { codexAccountNamespaceEntries, isMainCodexAccountTarget } from "../account-namespaces";
8
+ import { clearModelCache, DEFAULT_MODEL_CACHE_TTL_MS, getFreshCached, getStaleCached, isModelsFetchCoolingDown, markModelsFetchFailure, setCached } from "../model-cache";
9
+ import { buildModelsRequest, resolveModelsAuthToken } from "../../oauth";
10
+ import type { OcxConfig, OcxProviderConfig } from "../../types";
11
+ import { modelInList } from "../../types";
12
+ import { CODEX_REASONING_LEVELS, codexEffortRank, configuredReasoningEfforts, modelRecordValue, sanitizeCodexReasoningEfforts } from "../../reasoning-effort";
13
+ import { getModelMetadata, getModelMetadataCaseInsensitive, listModelMetadata, resolveMetadataProvider } from "../../generated/model-metadata";
14
+ import { enrichProviderFromRegistry, shouldCaseFoldMetadataModelId } from "../../providers/derive";
15
+ import { getProviderRegistryEntry, providerCodexAccountMode } from "../../providers/registry";
16
+ import { applyProviderContextCap, providerContextCap } from "../../providers/context-cap";
17
+ import { routedSlug, slugEquals, slugsEquivalent } from "../../providers/slug-codec";
18
+ import { identifyRoutedModel } from "../../adapters/identity";
19
+ import { filterCursorConfiguredModelsByLiveDiscovery } from "../../adapters/cursor/discovery";
20
+ import { fetchCursorUsableModels } from "../../adapters/cursor/live-models";
21
+ import { isCanonicalOpenAiForwardProvider, OPENAI_API_PROVIDER_ID, OPENAI_CODEX_PROVIDER_ID } from "../../providers/openai-tiers";
22
+ import {
23
+ COMBO_NAMESPACE,
24
+ comboModelId,
25
+ getCombo,
26
+ isNativeAliasCombo,
27
+ listComboIds,
28
+ targetKey,
29
+ } from "../../combos";
30
+ import type { NormalizedComboConfig } from "../../combos/types";
31
+ import { providerDestinationResolvedError } from "../../lib/destination-policy";
32
+ import { redactSecretString } from "../../lib/redact";
33
+ import upstreamModelsSnapshot from "../data/upstream-models.json";
34
+
35
+
36
+ import type { RawEntry } from "./parsing";
37
+ import { readCurrentCatalogOrCache, readCurrentCodexCatalog, readCurrentCodexModelsCache, unique } from "./bundled";
38
+ import { trustedAccountBoundNativeCatalogSlug, visibleCodexAccountSelectors } from "./account-models";
39
+ import { CODEX_NATIVE_ALIAS_CATALOG_KIND } from "./kinds";
40
+ import {
41
+ ACCOUNT_GATED_NATIVE_OPENAI_MODELS,
42
+ NATIVE_DAYBREAK_BLUE_MODEL,
43
+ NATIVE_OPENAI_CAPABILITY_ALIAS_MODELS,
44
+ NATIVE_OPENAI_MODELS,
45
+ SUPPORTED_NATIVE_OPENAI_SLUGS,
46
+ isNativeOpenAiCapabilityAliasModel,
47
+ nativeOpenAiCapabilitySourceSlug,
48
+ } from "./native-models";
49
+ import { cachedAvailableAccountGatedNativeModels } from "../model-entitlements";
50
+ import { MAIN_CODEX_ACCOUNT_ID } from "../main-account";
51
+ export { CODEX_NATIVE_ALIAS_CATALOG_KIND } from "./kinds";
52
+ export {
53
+ NATIVE_DAYBREAK_BLUE_MODEL,
54
+ NATIVE_OPENAI_CAPABILITY_ALIAS_MODELS,
55
+ NATIVE_OPENAI_MODELS,
56
+ SUPPORTED_NATIVE_OPENAI_SLUGS,
57
+ isNativeOpenAiCapabilityAliasModel,
58
+ nativeOpenAiCapabilitySourceSlug,
59
+ } from "./native-models";
60
+
61
+ export const DOCUMENTED_NATIVE_OPENAI_ADDITIONS = [
62
+ "gpt-5.3-codex-spark",
63
+ "gpt-5.6-sol", "gpt-5.6-terra", "gpt-5.6-luna",
64
+ ];
65
+
66
+ export function configuredNativeAliasSlugs(
67
+ config: Pick<OcxConfig, "combos">,
68
+ ): Set<string> {
69
+ const aliases = new Set<string>();
70
+ for (const raw of Object.values(config.combos ?? {})) {
71
+ if (!isNativeAliasCombo(raw)) continue;
72
+ const alias = raw.alias!.trim();
73
+ if (SUPPORTED_NATIVE_OPENAI_SLUGS.has(alias)) aliases.add(alias);
74
+ }
75
+ return aliases;
76
+ }
77
+
78
+ /**
79
+ * Bare native rows that must be absent, rather than merely hidden, while Desktop native-alias
80
+ * compatibility is active. Codex Desktop's remote allowlist can ignore `visibility: "hide"`;
81
+ * omitting disabled native rows is therefore part of the explicit native-alias opt-in.
82
+ */
83
+ export function desktopAllowlistSuppressedNativeSlugs(
84
+ config: Pick<OcxConfig, "combos" | "disabledModels">,
85
+ ): Set<string> {
86
+ const suppressed = configuredNativeAliasSlugs(config);
87
+ if (suppressed.size === 0) return suppressed;
88
+ const disabled = disabledNativeSlugs(config);
89
+ for (const slug of NATIVE_OPENAI_MODELS) {
90
+ if (disabled.has(slug)) suppressed.add(slug);
91
+ }
92
+ return suppressed;
93
+ }
94
+
95
+ export function isNativeAliasCatalogEntry(entry: RawEntry): boolean {
96
+ return entry.opencodex_catalog_kind === CODEX_NATIVE_ALIAS_CATALOG_KIND;
97
+ }
98
+
99
+ export function isUnsupportedOpenAiNativeSlug(slug: string): boolean {
100
+ if (slug.includes("/")) return false;
101
+ if (SUPPORTED_NATIVE_OPENAI_SLUGS.has(slug)) return false;
102
+ return /^(?:gpt|codex)-/.test(slug);
103
+ }
104
+
105
+ /**
106
+ * Advertised context for the Codex-login native GPT-5.6 family.
107
+ *
108
+ * This is an OPERATING CAP, not the hard ceiling — the same shape upstream uses. The live
109
+ * catalog reports `context_window: 272000` against a `max_context_window: 872000` for these
110
+ * slugs, and gpt-5.4 runs 272,000 against 1,000,000: the advertised window is always well
111
+ * inside what the model can take.
112
+ *
113
+ * The hard ceiling here was measured on 2026-08-17 against a real Codex-login account:
114
+ * `POST /backend-api/codex/responses` admitted 921,508 input tokens and refused 922,013 with
115
+ * `error.code: context_length_exceeded` on sol, terra and luna alike.
116
+ *
117
+ * Codex spends `context_window * effective_context_window_percent`, which defaults to 95%
118
+ * (codex-rs `openai_models.rs` / `turn_context.rs`). So this value yields a 875,900-token
119
+ * budget and leaves ~46k of headroom under the measured ceiling. An earlier release shipped
120
+ * 1,050,000 here, which spent 997,500 — past what the upstream accepts.
121
+ *
122
+ * Do NOT back-solve this from the ceiling (970,000 would land the budget at 921,500, inside
123
+ * the 1,840-token gap between the last success and the first refusal). The 95% is a safety
124
+ * margin to keep, not a discount to cancel out.
125
+ *
126
+ * Evidence: devlog/_plan/260817_native_gpt56_1m_context/001_measurement_evidence.md
127
+ * and 014_final_922k_with_margin.md.
128
+ */
129
+ export const NATIVE_GPT56_CONTEXT_WINDOW = 272_000;
130
+
131
+ /**
132
+ * Hard ceiling: the largest input the native GPT-5.6 family actually accepts (measured).
133
+ *
134
+ * Equal to the advertised window above rather than below it, because that window is already
135
+ * capped under this ceiling. The clamp stays because routed and API-key rows carry the same
136
+ * family at a 1,050,000 window, where 90% (945,000) WOULD overshoot this limit.
137
+ */
138
+ export const NATIVE_GPT56_MAX_INPUT_TOKENS = 922_000;
139
+
140
+ /** User-facing 1M opt-in: the largest window the native 5.6 family may advertise. */
141
+ export const NATIVE_GPT56_OPT_IN_CONTEXT_WINDOW = NATIVE_GPT56_MAX_INPUT_TOKENS;
142
+
143
+ const NATIVE_GPT56_FAMILY = new Set<string>([
144
+ "gpt-5.6-sol",
145
+ "gpt-5.6-terra",
146
+ "gpt-5.6-luna",
147
+ NATIVE_DAYBREAK_BLUE_MODEL,
148
+ ]);
149
+
150
+ export const NATIVE_OPENAI_CONTEXT_OVERRIDES: Record<string, { contextWindow?: number; maxContextWindow?: number; maxInputTokens?: number }> = {
151
+ "gpt-5.5": { contextWindow: 272_000, maxContextWindow: 272_000 },
152
+ "gpt-5.4": { contextWindow: 1_000_000, maxContextWindow: 1_000_000 },
153
+ "gpt-5.3-codex-spark": { contextWindow: 100_000, maxContextWindow: 100_000 },
154
+ "gpt-5.6-sol": { contextWindow: NATIVE_GPT56_CONTEXT_WINDOW, maxContextWindow: NATIVE_GPT56_MAX_INPUT_TOKENS, maxInputTokens: NATIVE_GPT56_MAX_INPUT_TOKENS },
155
+ "gpt-5.6-terra": { contextWindow: NATIVE_GPT56_CONTEXT_WINDOW, maxContextWindow: NATIVE_GPT56_MAX_INPUT_TOKENS, maxInputTokens: NATIVE_GPT56_MAX_INPUT_TOKENS },
156
+ "gpt-5.6-luna": { contextWindow: NATIVE_GPT56_CONTEXT_WINDOW, maxContextWindow: NATIVE_GPT56_MAX_INPUT_TOKENS, maxInputTokens: NATIVE_GPT56_MAX_INPUT_TOKENS },
157
+ // Daybreak Blue borrows Sol's capability metadata and rides the same family contract.
158
+ // Unlike sol/terra/luna its window was NOT measured here: this account cannot reach it
159
+ // (`400 "The 'gpt-daybreak-blue-latest' model is not supported when using Codex with a
160
+ // ChatGPT account."`), so the promotion rests on a report from an account that has
161
+ // access rather than on a probe. Treat it as the weaker evidence of the four.
162
+ [NATIVE_DAYBREAK_BLUE_MODEL]: { contextWindow: NATIVE_GPT56_CONTEXT_WINDOW, maxContextWindow: NATIVE_GPT56_MAX_INPUT_TOKENS, maxInputTokens: NATIVE_GPT56_MAX_INPUT_TOKENS },
163
+ };
164
+
165
+ const PINNED_UPSTREAM_MODELS: Map<string, RawEntry> = new Map(
166
+ ((upstreamModelsSnapshot as unknown as { models?: RawEntry[] }).models ?? [])
167
+ .flatMap(model => typeof model.slug === "string" ? [[model.slug, model] as const] : []),
168
+ );
169
+
170
+ function pinnedNativeCapabilityEntry(slug: string): RawEntry | undefined {
171
+ return PINNED_UPSTREAM_MODELS.get(nativeOpenAiCapabilitySourceSlug(slug));
172
+ }
173
+
174
+ /**
175
+ * Pinned capability metadata is safe to use as a fallback for every supported native model.
176
+ * Keep it separate from UPSTREAM_NATIVE_ENTRIES: that narrower map also authorizes replacing
177
+ * persisted native rows during sync, which is currently intentional only for the GPT-5.6 family.
178
+ */
179
+ const PINNED_NATIVE_CAPABILITY_ENTRIES: Map<string, RawEntry> = new Map(
180
+ [...NATIVE_OPENAI_MODELS, ...NATIVE_OPENAI_CAPABILITY_ALIAS_MODELS].flatMap(slug => {
181
+ const entry = pinnedNativeCapabilityEntry(slug);
182
+ return entry ? [[slug, entry] as const] : [];
183
+ }),
184
+ );
185
+
186
+ /**
187
+ * The user-owned levers that set a native window, carried together.
188
+ *
189
+ * For the GPT-5.6 family these may raise the Codex 272k default up to the measured
190
+ * 922k ceiling. Other native slugs still only ever lower.
191
+ *
192
+ * This travels as an ARGUMENT rather than module state on purpose. `grok/sync.ts` runs in
193
+ * the `ocx ensure` parent process, outside the server, so an injected global would never
194
+ * reach it — that failure is recorded in
195
+ * devlog/_plan/260817_native_gpt56_1m_context/006_root_cause_replan.md. Every call site
196
+ * already holds a config or a cap, so passing one more field costs nothing.
197
+ *
198
+ * A bare number is still accepted for the many call sites that only know the cap.
199
+ */
200
+ export interface NativeContextLimits {
201
+ /** `providerContextCaps.openai` */
202
+ readonly cap?: number;
203
+ /** `providers.openai.contextWindow` — a floor-wide user override. */
204
+ readonly providerWindow?: number;
205
+ /** `providers.openai.modelContextWindows` — per-model, wins over `providerWindow`. */
206
+ readonly modelWindows?: Readonly<Record<string, number>>;
207
+ }
208
+
209
+ export type NativeContextLimitsInput = NativeContextLimits | number | undefined;
210
+
211
+ function positiveInt(value: unknown): number | undefined {
212
+ return typeof value === "number" && Number.isSafeInteger(value) && value > 0 ? value : undefined;
213
+ }
214
+
215
+ function asLimits(input: NativeContextLimitsInput): NativeContextLimits {
216
+ if (input === undefined) return {};
217
+ return typeof input === "number" ? { cap: input } : input;
218
+ }
219
+
220
+ /** Read both levers out of a config once, for call sites that hold one. */
221
+ export function nativeContextLimits(
222
+ config: Pick<OcxConfig, "providers" | "providerContextCaps">,
223
+ ): NativeContextLimits {
224
+ const provider = config.providers?.[OPENAI_CODEX_PROVIDER_ID];
225
+ const modelWindows: Record<string, number> = {};
226
+ for (const [slug, value] of Object.entries(provider?.modelContextWindows ?? {})) {
227
+ const window = positiveInt(value);
228
+ if (window !== undefined) modelWindows[slug] = window;
229
+ }
230
+ return {
231
+ ...(positiveInt(providerContextCap(config, OPENAI_CODEX_PROVIDER_ID)) !== undefined
232
+ ? { cap: providerContextCap(config, OPENAI_CODEX_PROVIDER_ID) }
233
+ : {}),
234
+ ...(positiveInt(provider?.contextWindow) !== undefined ? { providerWindow: provider!.contextWindow } : {}),
235
+ ...(Object.keys(modelWindows).length > 0 ? { modelWindows } : {}),
236
+ };
237
+ }
238
+
239
+ /** Apply the user levers to an authoritative value. */
240
+ function narrowToLimits(raw: number | undefined, slug: string, input: NativeContextLimitsInput): number | undefined {
241
+ if (raw === undefined) return undefined;
242
+ const limits = asLimits(input);
243
+ const overlay = positiveInt(limits.modelWindows?.[slug]) ?? positiveInt(limits.providerWindow);
244
+ const cap = positiveInt(limits.cap);
245
+ if (NATIVE_GPT56_FAMILY.has(slug)) {
246
+ const ceiling = NATIVE_GPT56_MAX_INPUT_TOKENS;
247
+ const chosen = overlay ?? cap ?? raw;
248
+ const window = Math.min(chosen, ceiling);
249
+ return overlay !== undefined && cap !== undefined ? Math.min(window, cap) : window;
250
+ }
251
+ const narrowed = overlay === undefined ? raw : Math.min(raw, overlay);
252
+ // 922k is the GPT-5.6 1M opt-in, not a request to shrink gpt-5.4's 1M window.
253
+ if (cap === NATIVE_GPT56_MAX_INPUT_TOKENS) return narrowed;
254
+ return applyProviderContextCap(narrowed, cap) ?? narrowed;
255
+ }
256
+
257
+ export function nativeOpenAiContextWindow(slug: string, limits?: NativeContextLimitsInput): number | undefined {
258
+ const raw = NATIVE_OPENAI_CONTEXT_OVERRIDES[slug]?.contextWindow
259
+ ?? (typeof PINNED_NATIVE_CAPABILITY_ENTRIES.get(slug)?.context_window === "number"
260
+ ? PINNED_NATIVE_CAPABILITY_ENTRIES.get(slug)!.context_window as number
261
+ : undefined);
262
+ return narrowToLimits(raw, slug, limits);
263
+ }
264
+
265
+ /**
266
+ * Largest input a native slug accepts, or undefined when no separate limit is known
267
+ * (the caller then falls back to the context window).
268
+ *
269
+ * A provider context cap lowers this too: a capped 272k window must not keep advertising a
270
+ * 922k input ceiling, or the cap would be cosmetic on every input-side surface.
271
+ */
272
+ export function nativeOpenAiMaxInputTokens(slug: string, limits?: NativeContextLimitsInput): number | undefined {
273
+ const raw = NATIVE_OPENAI_CONTEXT_OVERRIDES[slug]?.maxInputTokens;
274
+ if (raw === undefined) return undefined;
275
+ const window = nativeOpenAiContextWindow(slug, limits);
276
+ const narrowed = narrowToLimits(raw, slug, limits) ?? raw;
277
+ return window === undefined ? narrowed : Math.min(narrowed, window);
278
+ }
279
+
280
+ export function nativeInputModalities(slug: string): string[] {
281
+ const upstream = PINNED_NATIVE_CAPABILITY_ENTRIES.get(slug);
282
+ if (Array.isArray(upstream?.input_modalities) && upstream!.input_modalities!.length > 0) {
283
+ return [...upstream!.input_modalities as string[]];
284
+ }
285
+ // gpt-5.3-codex-spark is not in the upstream snapshot; all supported natives are
286
+ // text+image capable, so default to the family baseline rather than text-only.
287
+ return ["text", "image"];
288
+ }
289
+
290
+ export function nativeReasoningEfforts(slug: string): string[] {
291
+ const upstream = PINNED_NATIVE_CAPABILITY_ENTRIES.get(slug);
292
+ const levels = Array.isArray(upstream?.supported_reasoning_levels)
293
+ ? upstream!.supported_reasoning_levels as Array<{ effort?: string }>
294
+ : [];
295
+ if (levels.length > 0) {
296
+ // Preserve the exact pinned per-model ladder. In particular, GPT-5.6 Sol and Terra
297
+ // include ultra while Luna intentionally ends at max.
298
+ return levels.flatMap(l => typeof l.effort === "string" ? [l.effort] : []);
299
+ }
300
+ // gpt-5.3-codex-spark is not in upstream snapshot — use the standard old-ladder default.
301
+ return ["low", "medium", "high", "xhigh"];
302
+ }
303
+
304
+ /** Upstream-pinned default for a native slug, when present and non-empty. */
305
+ export function nativeDefaultReasoningEffort(slug: string): string | undefined {
306
+ const level = PINNED_NATIVE_CAPABILITY_ENTRIES.get(slug)?.default_reasoning_level;
307
+ return typeof level === "string" && level.length > 0 ? level : undefined;
308
+ }
309
+
310
+ /** Upstream-pinned multi-agent surface for a supported native slug, when present. */
311
+ export function nativeMultiAgentVersion(slug: string): string | undefined {
312
+ const version = PINNED_NATIVE_CAPABILITY_ENTRIES.get(slug)?.multi_agent_version;
313
+ return typeof version === "string" && version.length > 0 ? version : undefined;
314
+ }
315
+
316
+ export function nativeParallelToolCalls(slug: string): boolean {
317
+ return PINNED_NATIVE_CAPABILITY_ENTRIES.get(slug)?.supports_parallel_tool_calls === true
318
+ || false;
319
+ }
320
+
321
+ export function hasComboTargets(config: { combos?: Record<string, { targets?: unknown[] }> }): boolean {
322
+ const combos = config.combos;
323
+ if (!combos) return false;
324
+ return Object.values(combos).some(c => Array.isArray(c?.targets) && c!.targets!.length > 0);
325
+ }
326
+
327
+ export function disabledNativeSlugs(config: Pick<OcxConfig, "disabledModels">): Set<string> {
328
+ return new Set((config.disabledModels ?? []).filter(id => !id.includes("/")));
329
+ }
330
+
331
+ export function visibleNativeSlugs(config: Pick<OcxConfig, "disabledModels" | "combos">): string[] {
332
+ const disabled = disabledNativeSlugs(config);
333
+ const shadowed = configuredNativeAliasSlugs(config);
334
+ return nativeOpenAiSlugs().filter(slug => !disabled.has(slug) && !shadowed.has(slug));
335
+ }
336
+
337
+ /** Whether an enabled canonical OpenAI provider can serve exact account-qualified routes. */
338
+ export function shouldIncludeAccountBoundNativeOpenAi(
339
+ config: Pick<OcxConfig, "providers">,
340
+ ): boolean {
341
+ const provider = config.providers[OPENAI_CODEX_PROVIDER_ID];
342
+ if (!provider || provider.disabled === true) return false;
343
+ // Registry routing defaults an omitted authMode on the built-in OpenAI row to forward.
344
+ const canonical = provider.authMode === undefined
345
+ ? { ...provider, authMode: "forward" as const }
346
+ : provider;
347
+ return isCanonicalOpenAiForwardProvider(canonical);
348
+ }
349
+
350
+ /** Whether native ChatGPT/Codex rows belong in this provider configuration. */
351
+ export function shouldIncludeNativeOpenAi(config: Pick<OcxConfig, "providers">): boolean {
352
+ const hasEnabledProvider = Object.values(config.providers)
353
+ .some(provider => provider.disabled !== true);
354
+ // Preserve the existing no-enabled-provider catalog bootstrap, but do not use that bootstrap
355
+ // exception for account-qualified rows: exact-account routing requires a live OpenAI provider.
356
+ return !hasEnabledProvider || shouldIncludeAccountBoundNativeOpenAi(config);
357
+ }
358
+
359
+ type AccountSelectorConfig = Pick<
360
+ OcxConfig,
361
+ "codexAccounts" | "codexAccountNamespaces" | "codexAccountPickerEnabled"
362
+ >;
363
+
364
+ function mainAccountSelectors(config: AccountSelectorConfig): string[] {
365
+ const targets = new Map(codexAccountNamespaceEntries(config));
366
+ return visibleCodexAccountSelectors(config).filter(selector =>
367
+ isMainCodexAccountTarget(targets.get(selector) ?? ""));
368
+ }
369
+
370
+ /** Native slugs exposed to Claude Desktop show/export/apply (opt-out via claudeCode.desktopNativeModels). */
371
+ export function desktopVisibleNativeSlugs(
372
+ config: Pick<OcxConfig, "claudeCode" | "disabledModels" | "combos" | "providers"
373
+ | "codexAccounts" | "codexAccountNamespaces" | "codexAccountPickerEnabled">,
374
+ ): string[] {
375
+ if (config.claudeCode?.desktopNativeModels === false) return [];
376
+ const visible = visibleNativeSlugs(config);
377
+ if (!shouldIncludeAccountBoundNativeOpenAi(config)) return visible;
378
+ const qualified = [...accountBoundNativeOpenAiSlugsBySelector(config).entries()].flatMap(([selector, slugs]) =>
379
+ slugs
380
+ .filter(slug => !SUPPORTED_NATIVE_OPENAI_SLUGS.has(slug))
381
+ .map(slug => `${selector}/${slug}`),
382
+ );
383
+ const disabled = new Set(config.disabledModels ?? []);
384
+ return unique([
385
+ ...visible,
386
+ ...qualified.filter(slug => !disabled.has(slug) && !disabled.has(slug.slice(slug.indexOf("/") + 1))),
387
+ ]);
388
+ }
389
+
390
+ export function nativeModelRows(config: Pick<OcxConfig, "disabledModels" | "combos" | "providerContextCaps" | "providers">): Array<{ slug: string; disabled: boolean; contextWindow?: number; maxInputTokens?: number }> {
391
+ const disabled = disabledNativeSlugs(config);
392
+ const shadowed = configuredNativeAliasSlugs(config);
393
+ // Both user levers, not just the cap: a per-model window set from the dashboard has to show
394
+ // up on the row the dashboard itself renders.
395
+ const limits = nativeContextLimits(config);
396
+ const bareEligibleAccountIds = providerCodexAccountMode(
397
+ OPENAI_CODEX_PROVIDER_ID,
398
+ config.providers?.[OPENAI_CODEX_PROVIDER_ID],
399
+ ) === "direct" ? new Set([MAIN_CODEX_ACCOUNT_ID]) : undefined;
400
+ const availableGated = cachedAvailableAccountGatedNativeModels(Date.now(), bareEligibleAccountIds);
401
+ return NATIVE_OPENAI_MODELS
402
+ .filter(slug => !ACCOUNT_GATED_NATIVE_OPENAI_MODELS.has(slug) || availableGated.has(slug))
403
+ .filter(slug => !shadowed.has(slug)).map(slug => {
404
+ const contextWindow = nativeOpenAiContextWindow(slug, limits);
405
+ const maxInputTokens = nativeOpenAiMaxInputTokens(slug, limits);
406
+ return {
407
+ slug,
408
+ disabled: disabled.has(slug),
409
+ ...(contextWindow !== undefined ? { contextWindow } : {}),
410
+ ...(maxInputTokens !== undefined ? { maxInputTokens } : {}),
411
+ };
412
+ });
413
+ }
414
+
415
+ export function applyNativeVisibility(
416
+ entries: RawEntry[],
417
+ disabledModels: ReadonlySet<string>,
418
+ hideBareNative = false,
419
+ observedNativeSlugs: ReadonlySet<string> = new Set(),
420
+ ): RawEntry[] {
421
+ for (const entry of entries) {
422
+ if (isNativeAliasCatalogEntry(entry)) continue;
423
+ const slug = typeof entry.slug === "string" ? entry.slug : "";
424
+ const accountBoundSlug = trustedAccountBoundNativeCatalogSlug(entry);
425
+ const nativeSlug = accountBoundSlug ?? slug;
426
+ if (!nativeSlug
427
+ || (!accountBoundSlug && slug.includes("/"))
428
+ || (!SUPPORTED_NATIVE_OPENAI_SLUGS.has(nativeSlug) && !observedNativeSlugs.has(nativeSlug))) continue;
429
+ const disabled = disabledModels.has(nativeSlug)
430
+ || (accountBoundSlug !== undefined && disabledModels.has(slug));
431
+ entry.visibility = disabled || (!accountBoundSlug && hideBareNative)
432
+ ? "hide"
433
+ : "list";
434
+ }
435
+ return entries;
436
+ }
437
+
438
+ function upstreamNativeEntryForSlug(slug: string): RawEntry | undefined {
439
+ const sourceSlug = nativeOpenAiCapabilitySourceSlug(slug);
440
+ if (!sourceSlug.startsWith("gpt-5.6-")) return undefined;
441
+ const source = PINNED_UPSTREAM_MODELS.get(sourceSlug);
442
+ if (!source) return undefined;
443
+ if (slug === sourceSlug) return source;
444
+
445
+ const alias = structuredClone(source) as RawEntry;
446
+ alias.slug = slug;
447
+ alias.display_name = "Daybreak Blue";
448
+ alias.description = "Frontier general-purpose model with safeguards for defensive cybersecurity work.";
449
+ if (typeof alias.base_instructions === "string") {
450
+ alias.base_instructions = identifyRoutedModel(alias.base_instructions, slug);
451
+ }
452
+ if (alias.model_messages && typeof alias.model_messages === "object" && !Array.isArray(alias.model_messages)) {
453
+ const modelMessages = alias.model_messages as Record<string, unknown>;
454
+ if (typeof modelMessages.instructions_template === "string") {
455
+ alias.model_messages = {
456
+ ...modelMessages,
457
+ instructions_template: identifyRoutedModel(modelMessages.instructions_template, slug),
458
+ };
459
+ }
460
+ }
461
+ delete alias.availability_nux;
462
+ return alias;
463
+ }
464
+
465
+ export const UPSTREAM_NATIVE_ENTRIES: Map<string, RawEntry> = new Map(
466
+ [...NATIVE_OPENAI_MODELS, ...NATIVE_OPENAI_CAPABILITY_ALIAS_MODELS].flatMap(slug => {
467
+ const entry = upstreamNativeEntryForSlug(slug);
468
+ return entry ? [[slug, entry] as const] : [];
469
+ }),
470
+ );
471
+
472
+ export function upstreamNativeEntry(slug: string): RawEntry | null {
473
+ const entry = UPSTREAM_NATIVE_ENTRIES.get(slug);
474
+ if (!entry) return null;
475
+ const clone = JSON.parse(JSON.stringify(entry)) as RawEntry;
476
+ delete clone.minimal_client_version;
477
+ return clone;
478
+ }
479
+
480
+ export function shouldUpgradeToUpstreamEntry(entry: RawEntry): boolean {
481
+ return typeof entry.slug === "string"
482
+ && UPSTREAM_NATIVE_ENTRIES.has(entry.slug)
483
+ && entry.display_name === entry.slug;
484
+ }
485
+
486
+ export function nativeOpenAiSlugs(): string[] {
487
+ const live = catalogNativeSlugs();
488
+ const availableGated = cachedAvailableAccountGatedNativeModels();
489
+ const candidates = live.length > 0 ? unique([...live, ...DOCUMENTED_NATIVE_OPENAI_ADDITIONS]) : NATIVE_OPENAI_MODELS;
490
+ return candidates.filter(slug => (
491
+ !ACCOUNT_GATED_NATIVE_OPENAI_MODELS.has(slug) || availableGated.has(slug)
492
+ ));
493
+ }
494
+
495
+ const ACCOUNT_BOUND_OPENAI_NATIVE_PREFIX = /^(?:gpt-|o1-|o3-|o4-)/;
496
+ const ACCOUNT_BOUND_OBSERVED_NATIVE_MARKER = "opencodex_account_observed_native";
497
+ const ACCOUNT_BOUND_OBSERVED_SELECTORS_MARKER = "opencodex_account_observed_selectors";
498
+
499
+ function isAccountBoundOpenAiNativeSlug(slug: string): boolean {
500
+ return !slug.includes("/") && ACCOUNT_BOUND_OPENAI_NATIVE_PREFIX.test(slug);
501
+ }
502
+
503
+ /**
504
+ * Shape/plausibility filter for a candidate account-native row. **This is not a trust control.**
505
+ *
506
+ * It checks that a row carries the field shape a real Codex catalog row has, which rejects
507
+ * malformed and minimal hand-written rows. It cannot distinguish a genuine upstream observation
508
+ * from a complete row typed by hand into `$CODEX_HOME/models_cache.json`: there is no signature,
509
+ * source identity, or server attestation to check. A full-shape forged row is accepted, and
510
+ * `observedFullShapeRowIsAccepted` in tests/native-model-toggle.test.ts pins that so nobody
511
+ * later mistakes this predicate for a security boundary.
512
+ *
513
+ * That is acceptable here because the file is user-owned and written by Codex itself: anyone
514
+ * able to rewrite it can already edit `config.json` or run `ocx` directly, and `router.ts`
515
+ * accepts any bare `gpt-*` id under an account namespace regardless of this catalog. What the
516
+ * filter buys is that garbage rows do not get advertised through discovery — not that an
517
+ * advertised row is proven genuine.
518
+ */
519
+ function hasNativeCatalogRowShape(entry: RawEntry): boolean {
520
+ const levels = entry.supported_reasoning_levels;
521
+ const messages = entry.model_messages;
522
+ return typeof entry.base_instructions === "string"
523
+ && entry.base_instructions.length > 0
524
+ && (typeof entry.comp_hash === "string" || entry.comp_hash === null)
525
+ && entry.shell_type === "shell_command"
526
+ && Array.isArray(levels)
527
+ && levels.length > 0
528
+ && levels.every(level => typeof level === "object" && level !== null
529
+ && typeof (level as { effort?: unknown }).effort === "string")
530
+ && typeof messages === "object"
531
+ && messages !== null
532
+ && !Array.isArray(messages);
533
+ }
534
+
535
+ function observedAccountBoundNativeSlug(entry: RawEntry): string | undefined {
536
+ const accountBound = trustedAccountBoundNativeCatalogSlug(entry);
537
+ const slug = accountBound ?? (typeof entry.slug === "string" ? entry.slug : "");
538
+ if (!isAccountBoundOpenAiNativeSlug(slug)
539
+ || entry.supported_in_api !== true
540
+ || !hasNativeCatalogRowShape(entry)
541
+ || (entry.visibility !== "list" && entry[ACCOUNT_BOUND_OBSERVED_NATIVE_MARKER] !== true)) {
542
+ return undefined;
543
+ }
544
+ return slug;
545
+ }
546
+
547
+ /**
548
+ * Return exact, previously observed account-native rows that are not in the static release set.
549
+ * The result is used only to carry a hidden observation across startup cache invalidation.
550
+ */
551
+ export function observedAccountBoundNativeEntries(
552
+ observedEntries: readonly RawEntry[],
553
+ ): RawEntry[] {
554
+ const seen = new Set<string>();
555
+ return observedEntries.flatMap(entry => {
556
+ const slug = observedAccountBoundNativeSlug(entry);
557
+ // Only carry bare upstream observations across cache replacement. Account-qualified rows are
558
+ // already a projection of the current selector map and must not preserve private/stale labels.
559
+ if (!slug
560
+ || typeof entry.slug !== "string"
561
+ || entry.slug.includes("/")
562
+ || SUPPORTED_NATIVE_OPENAI_SLUGS.has(slug)
563
+ || seen.has(slug)) return [];
564
+ seen.add(slug);
565
+ return [structuredClone(entry)];
566
+ });
567
+ }
568
+
569
+ /**
570
+ * Native ids observed in the user's Codex catalog/cache for account-qualified discovery.
571
+ *
572
+ * Unknown ids are deliberately returned only to callers that build selector-qualified rows. The
573
+ * static bare set remains the source of truth for global/API-key discovery, while this preserves
574
+ * exact account-scoped ids such as `gpt-daybreak-blue-latest` until the static set catches up.
575
+ */
576
+ export function accountBoundNativeOpenAiSlugs(
577
+ observedEntries: readonly RawEntry[] = [
578
+ ...(readCurrentCodexModelsCache()?.models ?? []),
579
+ // Existing generated rows are also safe to reuse after a process starts without a cache
580
+ // invalidation pass; bare user-authored catalog rows are intentionally not trusted here.
581
+ ...(readCurrentCodexCatalog()?.models ?? []).filter(entry =>
582
+ trustedAccountBoundNativeCatalogSlug(entry) !== undefined),
583
+ ],
584
+ ): string[] {
585
+ const observed = observedEntries.flatMap(entry => {
586
+ const slug = observedAccountBoundNativeSlug(entry);
587
+ return slug === undefined ? [] : [slug];
588
+ });
589
+ return unique([...NATIVE_OPENAI_MODELS, ...observed]);
590
+ }
591
+
592
+ /**
593
+ * Resolve account-native ids per public selector. Bare observations come from Codex's main
594
+ * catalog/cache, so they are eligible only for selectors that target the main account. A
595
+ * generated qualified row carries its own selector and never gets copied to an unrelated pool
596
+ * account. An explicit observation marker is public selector metadata only; private account ids
597
+ * never enter the catalog or cache.
598
+ */
599
+ export function accountBoundNativeOpenAiSlugsBySelector(
600
+ config: AccountSelectorConfig,
601
+ observedEntries: readonly RawEntry[] = [
602
+ ...(readCurrentCodexModelsCache()?.models ?? []),
603
+ ...(readCurrentCodexCatalog()?.models ?? []).filter(entry =>
604
+ trustedAccountBoundNativeCatalogSlug(entry) !== undefined),
605
+ ],
606
+ ): ReadonlyMap<string, readonly string[]> {
607
+ const selectors = visibleCodexAccountSelectors(config);
608
+ const mainSelectors = new Set(mainAccountSelectors(config));
609
+ const result = new Map<string, Set<string>>(
610
+ selectors.map(selector => [selector, new Set(NATIVE_OPENAI_MODELS)]),
611
+ );
612
+ for (const entry of observedEntries) {
613
+ const slug = observedAccountBoundNativeSlug(entry);
614
+ if (slug === undefined || SUPPORTED_NATIVE_OPENAI_SLUGS.has(slug)) continue;
615
+ const generated = trustedAccountBoundNativeCatalogSlug(entry);
616
+ const generatedSelector = generated === undefined || typeof entry.slug !== "string"
617
+ ? undefined
618
+ : entry.slug.slice(0, entry.slug.indexOf("/"));
619
+ const markedSelectors = Array.isArray(entry[ACCOUNT_BOUND_OBSERVED_SELECTORS_MARKER])
620
+ ? entry[ACCOUNT_BOUND_OBSERVED_SELECTORS_MARKER].filter((value): value is string => typeof value === "string")
621
+ : [];
622
+ const eligible = generatedSelector !== undefined
623
+ ? (mainSelectors.has(generatedSelector) ? [generatedSelector] : [])
624
+ : markedSelectors.length > 0
625
+ ? markedSelectors.filter(selector => mainSelectors.has(selector))
626
+ : [...mainSelectors];
627
+ for (const selector of eligible) {
628
+ const rows = result.get(selector);
629
+ if (rows) rows.add(slug);
630
+ }
631
+ }
632
+ return new Map([...result.entries()].map(([selector, slugs]) => [selector, [...slugs]]));
633
+ }
634
+
635
+ /** Unknown native ids observed from Codex, excluding the static release set. */
636
+ export function observedAccountBoundNativeOpenAiSlugs(
637
+ observedEntries?: readonly RawEntry[],
638
+ ): string[] {
639
+ const all = accountBoundNativeOpenAiSlugs(observedEntries);
640
+ return all.filter(slug => !SUPPORTED_NATIVE_OPENAI_SLUGS.has(slug));
641
+ }
642
+
643
+ function catalogNativeSlugs(): string[] {
644
+ const cat = readCurrentCatalogOrCache();
645
+ const models = cat?.models ?? [];
646
+ const live = models.flatMap(entry => {
647
+ const slug = typeof entry.slug === "string" ? entry.slug : "";
648
+ return !slug.includes("/") && SUPPORTED_NATIVE_OPENAI_SLUGS.has(slug) ? [slug] : [];
649
+ });
650
+ const accountBound = models.flatMap(entry => {
651
+ const slug = trustedAccountBoundNativeCatalogSlug(entry);
652
+ return slug !== undefined && SUPPORTED_NATIVE_OPENAI_SLUGS.has(slug) ? [slug] : [];
653
+ });
654
+ // Deliberately ignore `visibility`: it is a rendered projection of disabledModels and account
655
+ // selectors, so treating it as fresh availability would shrink the supported set between syncs.
656
+ // visibleNativeSlugs applies the current disabledModels source of truth for public consumers.
657
+ return unique([...live, ...accountBound]);
658
+ }
659
+
660
+ export function listCatalogNativeSlugs(): string[] {
661
+ // Ensure documented additions (e.g. gpt-5.3-codex-spark) appear even when the bundled catalog
662
+ // predates the slug — mirrors nativeOpenAiSlugs() which already merges them for /v1/models.
663
+ return unique([...catalogNativeSlugs(), ...DOCUMENTED_NATIVE_OPENAI_ADDITIONS]);
664
+ }