@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,34 @@
1
+ /** Canonical persisted Codex pool-account id format. */
2
+ export const CODEX_ACCOUNT_ID_RE = /^[A-Za-z0-9._-]{1,64}$/;
3
+
4
+ // Account credentials are persisted in JSON object maps. These names have
5
+ // special meaning on ordinary JavaScript objects and must never be admitted as
6
+ // user-controlled keys.
7
+ const RESERVED_CODEX_ACCOUNT_IDS = new Set(["__proto__", "prototype", "constructor"]);
8
+
9
+ /**
10
+ * Stable internal id under which the Codex Desktop login participates in account rotation.
11
+ * It is reserved and must never be used as a public namespace target or pool-account id.
12
+ */
13
+ export const MAIN_CODEX_ACCOUNT_ID = "__main__";
14
+
15
+ export function isValidCodexAccountId(accountId: unknown): accountId is string {
16
+ return typeof accountId === "string"
17
+ && accountId !== MAIN_CODEX_ACCOUNT_ID
18
+ && CODEX_ACCOUNT_ID_RE.test(accountId)
19
+ && !RESERVED_CODEX_ACCOUNT_IDS.has(accountId.toLowerCase());
20
+ }
21
+
22
+ type CodexAccountIdentityRow = { id: string; isMain: boolean };
23
+
24
+ /** Legacy invalid rows remain loadable for cleanup, but never participate in routing. */
25
+ export function isSelectableCodexPoolAccount(account: CodexAccountIdentityRow): boolean {
26
+ return !account.isMain && isValidCodexAccountId(account.id);
27
+ }
28
+
29
+ /** A pre-validation pool row that collides with the internal Desktop-account sentinel. */
30
+ export function hasLegacyMainCodexPoolAccount(
31
+ accounts: readonly CodexAccountIdentityRow[] | undefined,
32
+ ): boolean {
33
+ return accounts?.some(account => !account.isMain && account.id === MAIN_CODEX_ACCOUNT_ID) ?? false;
34
+ }
@@ -0,0 +1,47 @@
1
+ import { createHash, randomBytes } from "node:crypto";
2
+ import type { CodexAccount, OcxConfig } from "../types";
3
+ import type { CodexAuthContext } from "./auth-context";
4
+ import { MAIN_CODEX_ACCOUNT_ID } from "./main-account";
5
+
6
+ export const CODEX_ACCOUNT_LOG_LABEL_RE = /^p[a-f0-9]{6}$/;
7
+
8
+ export function createCodexAccountLogLabel(existingLabels: Iterable<string | undefined | null> = []): string {
9
+ const used = new Set([...existingLabels].filter((value): value is string => !!value));
10
+ for (let i = 0; i < 16; i++) {
11
+ const label = `p${randomBytes(3).toString("hex")}`;
12
+ if (!used.has(label)) return label;
13
+ }
14
+ return `p${randomBytes(6).toString("hex").slice(0, 6)}`;
15
+ }
16
+
17
+ export function fallbackCodexAccountLogLabel(accountId: string): string {
18
+ return `p${createHash("sha256").update(accountId).digest("hex").slice(0, 6)}`;
19
+ }
20
+
21
+ export function codexAccountLogLabel(account: CodexAccount): string {
22
+ return CODEX_ACCOUNT_LOG_LABEL_RE.test(account.logLabel ?? "")
23
+ ? account.logLabel!
24
+ : fallbackCodexAccountLogLabel(account.id);
25
+ }
26
+
27
+ /** Effective durable label for a resolved Codex Pool account. */
28
+ export function codexAuthContextLogLabel(
29
+ authCtx: CodexAuthContext,
30
+ config: Pick<OcxConfig, "codexAccounts">,
31
+ ): "main" | `p${string}` | undefined {
32
+ if (authCtx.kind !== "pool" && authCtx.kind !== "main-pool") return undefined;
33
+ if (authCtx.accountId === MAIN_CODEX_ACCOUNT_ID) return "main";
34
+ const account = (config.codexAccounts ?? []).find(candidate => candidate.id === authCtx.accountId);
35
+ return account ? codexAccountLogLabel(account) as `p${string}` : undefined;
36
+ }
37
+
38
+ export function withCodexAccountLogLabel(
39
+ account: Omit<CodexAccount, "logLabel"> & Partial<Pick<CodexAccount, "logLabel">>,
40
+ existingAccounts: readonly CodexAccount[],
41
+ ): CodexAccount {
42
+ if (account.logLabel && CODEX_ACCOUNT_LOG_LABEL_RE.test(account.logLabel)) return account as CodexAccount;
43
+ return {
44
+ ...account,
45
+ logLabel: createCodexAccountLogLabel(existingAccounts.map(existing => existing.logLabel)),
46
+ };
47
+ }
@@ -0,0 +1,172 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import {
3
+ atomicWriteFile,
4
+ getConfigPath,
5
+ saveConfigPreservingClaudeCode,
6
+ withConfigMutationLockSync,
7
+ } from "../config";
8
+ import { removeCodexAccountCredential } from "./account-store";
9
+ import { clearAccountNeedsReauth } from "./account-runtime-state";
10
+ import { getMainChatgptAccountId } from "./auth-collision";
11
+ import { MAIN_CODEX_ACCOUNT_ID, setMainAccountPlan } from "./main-account";
12
+ import { clearAccountQuota } from "./quota";
13
+ import { clearCodexUpstreamHealthForAccount, clearThreadAccountMapForAccount } from "./routing";
14
+ import { invalidateCodexWebSocketsForAccount } from "./websocket-registry";
15
+ import { clearMainAccountCredentialPresence, clearMainAccountInfoCache } from "./main-account-cache";
16
+ import { forgetCodexAccountPause } from "./account-pause";
17
+ import { clearCodexAccountPin, forgetCodexAccountPriority } from "./account-priority";
18
+ import { codexAccountNamespaceEntries, codexAccountPickerEnabled } from "./account-namespaces";
19
+ import type { OcxConfig } from "../types";
20
+
21
+ let observedMainChatgptAccountId: string | undefined;
22
+
23
+ export class CodexAccountDeleteCleanupError extends Error {
24
+ constructor() {
25
+ super("Account deletion was saved, but local credential cleanup did not complete. Retry removal.");
26
+ this.name = "CodexAccountDeleteCleanupError";
27
+ }
28
+ }
29
+
30
+ export class CodexAccountDeleteRollbackError extends Error {
31
+ constructor() {
32
+ super("Account deletion failed and the previous config could not be restored. Restart before retrying.");
33
+ this.name = "CodexAccountDeleteRollbackError";
34
+ }
35
+ }
36
+
37
+ export function purgeCodexAccountRuntimeState(accountId: string): void {
38
+ clearAccountNeedsReauth(accountId);
39
+ clearAccountQuota(accountId);
40
+ clearThreadAccountMapForAccount(accountId);
41
+ clearCodexUpstreamHealthForAccount(accountId);
42
+ if (accountId === MAIN_CODEX_ACCOUNT_ID) {
43
+ clearMainAccountInfoCache();
44
+ clearMainAccountCredentialPresence();
45
+ }
46
+ }
47
+
48
+ function purgeMainCodexAccountRuntimeState(): void {
49
+ purgeCodexAccountRuntimeState(MAIN_CODEX_ACCOUNT_ID);
50
+ setMainAccountPlan(null);
51
+ invalidateCodexWebSocketsForAccount(MAIN_CODEX_ACCOUNT_ID);
52
+ }
53
+
54
+ /**
55
+ * The main Codex login is stored under the stable `__main__` alias, while
56
+ * `~/.codex/auth.json` can be replaced with credentials for another physical
57
+ * ChatGPT account. Drop alias-keyed runtime state when that identity changes so
58
+ * cooldown, quota, reauth, and thread affinity do not leak across accounts.
59
+ */
60
+ export function reconcileMainCodexAccountRuntimeState(): boolean {
61
+ const currentAccountId = getMainChatgptAccountId();
62
+ // A missing/malformed auth.json is an unknown identity, not a confirmed account switch. Keep the
63
+ // prior observation and its safety state until a real account id can be read again.
64
+ if (currentAccountId === null) return false;
65
+ const previousAccountId = observedMainChatgptAccountId;
66
+ observedMainChatgptAccountId = currentAccountId;
67
+ if (previousAccountId === undefined || previousAccountId === currentAccountId) return false;
68
+
69
+ purgeMainCodexAccountRuntimeState();
70
+ return true;
71
+ }
72
+
73
+ /**
74
+ * Apply a transaction-confirmed physical native-login change without waiting for
75
+ * a later auth.json observation. The caller owns credential commit/rollback.
76
+ */
77
+ export function applyConfirmedMainCodexAccountTransition(
78
+ fromAccountId: string,
79
+ toAccountId: string,
80
+ ): boolean {
81
+ if (!fromAccountId || !toAccountId || fromAccountId === toAccountId) {
82
+ if (toAccountId) observedMainChatgptAccountId = toAccountId;
83
+ return false;
84
+ }
85
+ observedMainChatgptAccountId = toAccountId;
86
+ purgeMainCodexAccountRuntimeState();
87
+ return true;
88
+ }
89
+
90
+ export function resetMainCodexAccountIdentityTrackingForTests(): void {
91
+ observedMainChatgptAccountId = undefined;
92
+ clearMainAccountCredentialPresence();
93
+ }
94
+
95
+ function restoreRuntimeConfig(target: OcxConfig, snapshot: OcxConfig): void {
96
+ for (const key of Object.keys(target) as Array<keyof OcxConfig>) delete target[key];
97
+ Object.assign(target, snapshot);
98
+ }
99
+
100
+ function restorePersistedConfig(configPath: string, previousBytes: string): void {
101
+ try {
102
+ if (readFileSync(configPath, "utf8") === previousBytes) return;
103
+ } catch (error) {
104
+ if ((error as NodeJS.ErrnoException).code !== "ENOENT") throw error;
105
+ }
106
+ atomicWriteFile(configPath, previousBytes);
107
+ }
108
+
109
+ /**
110
+ * Delete a stored account while retaining its selector binding.
111
+ *
112
+ * When the runtime config is backed by an existing config.json, commit the config deletion before
113
+ * credentials or runtime state are destroyed. Transient callers intentionally skip durable config
114
+ * persistence because they have no durable account row to protect. The whole sequence shares the
115
+ * config mutation coordinator so a cooperating writer cannot re-add a persisted account between
116
+ * the durable config commit and credential cleanup.
117
+ *
118
+ * Returns true when a picker-visible row disappeared and the catalog must converge.
119
+ */
120
+ export function deleteCodexAccount(runtimeConfig: OcxConfig, accountId: string): boolean {
121
+ let cleanupFailed = false;
122
+ const pickerVisibilityChanged = withConfigMutationLockSync(() => {
123
+ const previousConfig = structuredClone(runtimeConfig);
124
+ const configPath = getConfigPath();
125
+ const hasPersistedConfig = existsSync(configPath);
126
+ const previousPersistedConfig = hasPersistedConfig ? readFileSync(configPath, "utf8") : undefined;
127
+ const hadStoredAccount = (runtimeConfig.codexAccounts ?? [])
128
+ .some(account => !account.isMain && account.id === accountId);
129
+ const hadVisiblePickerBinding = hadStoredAccount
130
+ && codexAccountPickerEnabled(runtimeConfig)
131
+ && codexAccountNamespaceEntries(runtimeConfig)
132
+ .some(([, boundAccountId]) => boundAccountId === accountId);
133
+
134
+ runtimeConfig.codexAccounts = (runtimeConfig.codexAccounts ?? [])
135
+ .filter(account => account.isMain || account.id !== accountId);
136
+ forgetCodexAccountPause(runtimeConfig, accountId);
137
+ forgetCodexAccountPriority(runtimeConfig, accountId);
138
+ clearCodexAccountPin(runtimeConfig, accountId);
139
+ if (runtimeConfig.activeCodexAccountId === accountId) runtimeConfig.activeCodexAccountId = undefined;
140
+
141
+ if (previousPersistedConfig !== undefined) {
142
+ try {
143
+ // Persist first for durable configs. Destructive cleanup below must never run for a
144
+ // deletion that failed to commit. Transient configs intentionally skip this write.
145
+ saveConfigPreservingClaudeCode(runtimeConfig);
146
+ } catch (error) {
147
+ restoreRuntimeConfig(runtimeConfig, previousConfig);
148
+ try {
149
+ restorePersistedConfig(configPath, previousPersistedConfig);
150
+ } catch {
151
+ throw new CodexAccountDeleteRollbackError();
152
+ }
153
+ throw error;
154
+ }
155
+ }
156
+
157
+ try {
158
+ removeCodexAccountCredential(accountId);
159
+ purgeCodexAccountRuntimeState(accountId);
160
+ invalidateCodexWebSocketsForAccount(accountId);
161
+ } catch {
162
+ // Do not throw through the mutation coordinator after config.json committed: that would roll
163
+ // back only the SQLite generation transaction, not the already-atomic file replacement.
164
+ cleanupFailed = true;
165
+ }
166
+
167
+ return hadVisiblePickerBinding;
168
+ });
169
+
170
+ if (cleanupFailed) throw new CodexAccountDeleteCleanupError();
171
+ return pickerVisibilityChanged;
172
+ }
@@ -0,0 +1,63 @@
1
+ import { isValidCodexAccountId } from "./account-id";
2
+
3
+ /** Config-only sentinel for the Codex Desktop account; outside the pool-account id grammar. */
4
+ export const MAIN_CODEX_ACCOUNT_NAMESPACE_TARGET = "@main";
5
+
6
+ export const CODEX_ACCOUNT_NAMESPACE_COMBO_ALIAS_COLLISION_ERROR =
7
+ "combo alias must not use a configured Codex account namespace";
8
+
9
+ const CODEX_ACCOUNT_ID_NAMESPACE_COLLISION_ERROR =
10
+ "account id must not collide with a configured Codex account namespace";
11
+
12
+ /** Provider ids are compared case-insensitively at namespace admission boundaries. */
13
+ export function codexProviderNamespaceKey(value: string): string {
14
+ return value.toLowerCase();
15
+ }
16
+
17
+ export function hasCodexAccountNamespace(
18
+ namespaces: unknown,
19
+ namespace: string,
20
+ ): boolean {
21
+ return !!namespaces
22
+ && typeof namespaces === "object"
23
+ && !Array.isArray(namespaces)
24
+ && Object.hasOwn(namespaces, namespace);
25
+ }
26
+
27
+ export function codexAccountNamespaceProviderCollisionError(
28
+ namespaces: unknown,
29
+ providerName: string,
30
+ ): string | undefined {
31
+ const normalizedProvider = codexProviderNamespaceKey(providerName);
32
+ const collides = !!namespaces
33
+ && typeof namespaces === "object"
34
+ && !Array.isArray(namespaces)
35
+ && Object.keys(namespaces)
36
+ .some(namespace => codexProviderNamespaceKey(namespace) === normalizedProvider);
37
+ return collides
38
+ ? "provider name must not collide with a configured Codex account namespace"
39
+ : undefined;
40
+ }
41
+
42
+ export function codexAccountIdNamespaceCollisionError(
43
+ namespaces: unknown,
44
+ accountId: string,
45
+ ): string | undefined {
46
+ return hasCodexAccountNamespace(namespaces, accountId)
47
+ ? CODEX_ACCOUNT_ID_NAMESPACE_COLLISION_ERROR
48
+ : undefined;
49
+ }
50
+
51
+ export function codexAccountNamespaceForModel(
52
+ namespaces: unknown,
53
+ modelId: string,
54
+ ): string | undefined {
55
+ const slash = modelId.indexOf("/");
56
+ if (slash <= 0) return undefined;
57
+ const namespace = modelId.slice(0, slash);
58
+ return hasCodexAccountNamespace(namespaces, namespace) ? namespace : undefined;
59
+ }
60
+
61
+ export function isValidCodexAccountNamespaceTarget(accountId: unknown): accountId is string {
62
+ return accountId === MAIN_CODEX_ACCOUNT_NAMESPACE_TARGET || isValidCodexAccountId(accountId);
63
+ }
@@ -0,0 +1,195 @@
1
+ import type { CodexAccount, OcxConfig } from "../types";
2
+ import { COMBO_NAMESPACE } from "../combos/types";
3
+ import { OPENAI_CODEX_PROVIDER_ID } from "../providers/openai-tiers";
4
+ import {
5
+ POLICY_NAMESPACE,
6
+ routingProfileAliasNamespacePrefixes,
7
+ } from "../routing/profile-namespace";
8
+ import {
9
+ CODEX_ACCOUNT_LOG_LABEL_RE,
10
+ createCodexAccountLogLabel,
11
+ fallbackCodexAccountLogLabel,
12
+ } from "./account-label";
13
+ import { isValidCodexAccountId, MAIN_CODEX_ACCOUNT_ID } from "./account-id";
14
+ import {
15
+ codexAccountIdNamespaceCollisionError,
16
+ codexProviderNamespaceKey,
17
+ MAIN_CODEX_ACCOUNT_NAMESPACE_TARGET,
18
+ } from "./account-namespace-match";
19
+
20
+ export { isValidCodexAccountNamespaceTarget } from "./account-namespace-match";
21
+
22
+ const RESERVED_NAMESPACE_KEYS = new Set([
23
+ "__proto__",
24
+ "prototype",
25
+ "constructor",
26
+ COMBO_NAMESPACE,
27
+ OPENAI_CODEX_PROVIDER_ID,
28
+ POLICY_NAMESPACE,
29
+ ].map(codexProviderNamespaceKey));
30
+ const PUBLIC_ACCOUNT_SELECTOR_MAX_ATTEMPTS = 16;
31
+
32
+ function comboAliasNamespaces(config: Pick<OcxConfig, "combos">): string[] {
33
+ return Object.values(config.combos ?? {}).flatMap((combo) => {
34
+ const alias = typeof combo?.alias === "string" ? combo.alias.trim() : "";
35
+ const slash = alias.indexOf("/");
36
+ return slash > 0 ? [alias.slice(0, slash)] : [];
37
+ });
38
+ }
39
+
40
+ function privateAccountSelectorCandidates(accountIds: Iterable<string>): Set<string> {
41
+ const candidates = new Set<string>();
42
+ for (const accountId of accountIds) {
43
+ candidates.add(accountId);
44
+ candidates.add(fallbackCodexAccountLogLabel(accountId));
45
+ }
46
+ return candidates;
47
+ }
48
+
49
+ function defaultPublicAccountSelector(
50
+ account: Pick<CodexAccount, "id" | "logLabel">,
51
+ allPrivateCandidates: ReadonlySet<string>,
52
+ ): string {
53
+ const privateCandidates = new Set(allPrivateCandidates);
54
+ privateCandidates.add(account.id);
55
+ privateCandidates.add(fallbackCodexAccountLogLabel(account.id));
56
+ if (CODEX_ACCOUNT_LOG_LABEL_RE.test(account.logLabel ?? "")
57
+ && !privateCandidates.has(account.logLabel!)) return account.logLabel!;
58
+
59
+ // Legacy or hand-edited rows may predate persisted random log labels. Allocate a fresh public
60
+ // selector rather than exposing the stable, id-derived fallback used only to redact old logs.
61
+ for (let attempt = 0; attempt < PUBLIC_ACCOUNT_SELECTOR_MAX_ATTEMPTS; attempt += 1) {
62
+ const selector = createCodexAccountLogLabel(privateCandidates);
63
+ if (!privateCandidates.has(selector)) return selector;
64
+ }
65
+ throw new Error("Unable to allocate a unique Codex account selector");
66
+ }
67
+
68
+ function claimNamespace(requested: string, used: Set<string>): string {
69
+ let namespace = requested;
70
+ let suffix = 2;
71
+ while (used.has(namespace)) namespace = `${requested}-${suffix++}`;
72
+ used.add(namespace);
73
+ return namespace;
74
+ }
75
+
76
+ /** Collect every public namespace that a generated account selector must not claim. */
77
+ function occupiedNamespaces(
78
+ config: Pick<OcxConfig, "combos" | "providers" | "routingProfiles">,
79
+ ): Set<string> {
80
+ return new Set([
81
+ ...Object.keys(config.providers).map(codexProviderNamespaceKey),
82
+ ...comboAliasNamespaces(config),
83
+ ...routingProfileAliasNamespacePrefixes(config),
84
+ ...RESERVED_NAMESPACE_KEYS,
85
+ ]);
86
+ }
87
+
88
+ /** Build an initial account-selector map without deriving public selectors from aliases or ids. */
89
+ export function defaultCodexAccountNamespaces(
90
+ config: Pick<OcxConfig, "codexAccounts" | "combos" | "providers" | "routingProfiles">,
91
+ ): Record<string, string> {
92
+ const namespaces: Record<string, string> = {};
93
+ const used = occupiedNamespaces(config);
94
+ const accounts = config.codexAccounts ?? [];
95
+ const privateCandidates = privateAccountSelectorCandidates(
96
+ accounts
97
+ .filter(account => account.id !== MAIN_CODEX_ACCOUNT_ID)
98
+ .map(account => account.id),
99
+ );
100
+ for (const candidate of privateCandidates) used.add(candidate);
101
+
102
+ namespaces[claimNamespace("main", used)] = MAIN_CODEX_ACCOUNT_NAMESPACE_TARGET;
103
+ for (const account of accounts) {
104
+ if (account.isMain || !isValidCodexAccountId(account.id)) continue;
105
+ const namespace = claimNamespace(defaultPublicAccountSelector(account, privateCandidates), used);
106
+ namespaces[namespace] = account.id;
107
+ }
108
+ return namespaces;
109
+ }
110
+
111
+ /**
112
+ * Initialize generated selectors only for an explicit opt-in with no existing bindings.
113
+ * A true result means the map was replaced and the caller must persist the updated config.
114
+ */
115
+ export function initializeDefaultCodexAccountNamespaces(
116
+ config: Pick<
117
+ OcxConfig,
118
+ | "codexAccountPickerEnabled"
119
+ | "codexAccountNamespaces"
120
+ | "codexAccounts"
121
+ | "combos"
122
+ | "providers"
123
+ | "routingProfiles"
124
+ >,
125
+ ): boolean {
126
+ if (config.codexAccountPickerEnabled !== true
127
+ || Object.keys(config.codexAccountNamespaces ?? {}).length > 0) return false;
128
+
129
+ const namespaces = defaultCodexAccountNamespaces(config);
130
+ config.codexAccountNamespaces = namespaces;
131
+ return true;
132
+ }
133
+
134
+ /**
135
+ * Add one account to a generated map without renaming or replacing explicit existing entries.
136
+ * The account-creation layer must reject a new id that already equals an existing selector key.
137
+ * A true result means the map was mutated in place; callers must persist the updated config.
138
+ */
139
+ export function appendDefaultCodexAccountNamespace(
140
+ config: Pick<
141
+ OcxConfig,
142
+ "codexAccountNamespaces" | "codexAccounts" | "combos" | "providers" | "routingProfiles"
143
+ >,
144
+ account: Pick<CodexAccount, "id" | "isMain" | "logLabel">,
145
+ ): boolean {
146
+ const namespaces = config.codexAccountNamespaces;
147
+ if (account.isMain
148
+ || !isValidCodexAccountId(account.id)
149
+ || !namespaces
150
+ || Object.keys(namespaces).length === 0
151
+ || codexAccountIdNamespaceCollisionError(namespaces, account.id)
152
+ || Object.values(namespaces).includes(account.id)) return false;
153
+
154
+ const used = occupiedNamespaces(config);
155
+ for (const namespace of Object.keys(namespaces)) used.add(namespace);
156
+ const privateCandidates = privateAccountSelectorCandidates([
157
+ ...(config.codexAccounts ?? [])
158
+ .filter(existing => existing.id !== MAIN_CODEX_ACCOUNT_ID)
159
+ .map(existing => existing.id),
160
+ ...Object.values(namespaces),
161
+ account.id,
162
+ ]);
163
+ for (const candidate of privateCandidates) used.add(candidate);
164
+ const namespace = claimNamespace(defaultPublicAccountSelector(account, privateCandidates), used);
165
+ namespaces[namespace] = account.id;
166
+ return true;
167
+ }
168
+
169
+ export function isMainCodexAccountTarget(accountId: string): boolean {
170
+ return accountId === MAIN_CODEX_ACCOUNT_NAMESPACE_TARGET || accountId === MAIN_CODEX_ACCOUNT_ID;
171
+ }
172
+
173
+ function normalizeCodexAccountNamespaceTarget(accountId: string): string {
174
+ return isMainCodexAccountTarget(accountId)
175
+ ? MAIN_CODEX_ACCOUNT_ID
176
+ : accountId;
177
+ }
178
+
179
+ export function codexAccountNamespaceEntries(
180
+ config: Pick<OcxConfig, "codexAccountNamespaces">,
181
+ ): Array<[string, string]> {
182
+ return Object.entries(config.codexAccountNamespaces ?? {})
183
+ .map(([namespace, accountId]) => [namespace, normalizeCodexAccountNamespaceTarget(accountId)]);
184
+ }
185
+
186
+ /**
187
+ * Whether generated account-qualified rows are enabled for catalog discovery.
188
+ * A non-empty hand-written map predating the explicit override remains enabled.
189
+ */
190
+ export function codexAccountPickerEnabled(
191
+ config: Pick<OcxConfig, "codexAccountNamespaces" | "codexAccountPickerEnabled">,
192
+ ): boolean {
193
+ return (config.codexAccountPickerEnabled === undefined || config.codexAccountPickerEnabled === true)
194
+ && Object.keys(config.codexAccountNamespaces ?? {}).length > 0;
195
+ }
@@ -0,0 +1,20 @@
1
+ import type { OcxConfig } from "../types";
2
+
3
+ /** Whether an account is administratively excluded from future pool selection. */
4
+ export function isCodexAccountPaused(config: OcxConfig, accountId: string): boolean {
5
+ return config.pausedCodexAccountIds?.includes(accountId) ?? false;
6
+ }
7
+
8
+ /** Persist the account's pool eligibility without changing credentials or runtime health. */
9
+ export function setCodexAccountPaused(config: OcxConfig, accountId: string, paused: boolean): void {
10
+ const pausedIds = new Set(config.pausedCodexAccountIds ?? []);
11
+ if (paused) pausedIds.add(accountId);
12
+ else pausedIds.delete(accountId);
13
+
14
+ if (pausedIds.size > 0) config.pausedCodexAccountIds = [...pausedIds];
15
+ else delete config.pausedCodexAccountIds;
16
+ }
17
+
18
+ export function forgetCodexAccountPause(config: OcxConfig, accountId: string): void {
19
+ setCodexAccountPaused(config, accountId, false);
20
+ }
@@ -0,0 +1,83 @@
1
+ import { isValidCodexAccountId, MAIN_CODEX_ACCOUNT_ID } from "./account-id";
2
+ import { DEFAULT_ACCOUNT_PRIORITY, normalizeAccountPriority } from "./pool-rotation";
3
+ import type { OcxConfig } from "../types";
4
+
5
+ /**
6
+ * Which ids may carry a selection order: any pool account, plus the synthetic
7
+ * `__main__` Desktop login. Owned here rather than by the config schema because
8
+ * every writer needs it — the schema rejects a bad key on load, but the management
9
+ * API has to reject one before `setCodexAccountPriority` persists it as an own
10
+ * property that the schema would then reject, degrading the whole map.
11
+ */
12
+ export function isCodexAccountPriorityKey(key: unknown): key is string {
13
+ return key === MAIN_CODEX_ACCOUNT_ID || isValidCodexAccountId(key);
14
+ }
15
+
16
+ /**
17
+ * Persisted selection order for one account: higher numbers are used earlier.
18
+ * Stored as a config sidecar rather than a `codexAccounts` row field because the
19
+ * Codex Desktop login (`__main__`) has no row and must be orderable too.
20
+ */
21
+ export function getCodexAccountPriority(config: OcxConfig, accountId: string): number {
22
+ return codexAccountPriorityLookup(config)(accountId);
23
+ }
24
+
25
+ /**
26
+ * Write one account's selection order. The default is stored as absence, so a
27
+ * pool that was never ordered keeps no map at all and routing takes its fast path.
28
+ * Entries are rebuilt through `Object.fromEntries` so a reserved key such as
29
+ * `__proto__` becomes an own data property instead of invoking a prototype setter.
30
+ */
31
+ export function setCodexAccountPriority(config: OcxConfig, accountId: string, priority: number): void {
32
+ const entries = new Map(Object.entries(config.codexAccountPriorities ?? {}));
33
+ if (priority === DEFAULT_ACCOUNT_PRIORITY) entries.delete(accountId);
34
+ else entries.set(accountId, priority);
35
+
36
+ if (entries.size > 0) config.codexAccountPriorities = Object.fromEntries(entries);
37
+ else delete config.codexAccountPriorities;
38
+ }
39
+
40
+ export function forgetCodexAccountPriority(config: OcxConfig, accountId: string): void {
41
+ setCodexAccountPriority(config, accountId, DEFAULT_ACCOUNT_PRIORITY);
42
+ }
43
+
44
+ /**
45
+ * Stable lookup for one selection pass. Routing calls this once per pick and
46
+ * hands the closure to `selectPriorityTier`, so a pool without stored order pays
47
+ * a single map read rather than one per candidate.
48
+ */
49
+ export function codexAccountPriorityLookup(config: OcxConfig): (accountId: string) => number {
50
+ const priorities = config.codexAccountPriorities;
51
+ if (!priorities) return () => DEFAULT_ACCOUNT_PRIORITY;
52
+ return accountId => (
53
+ Object.hasOwn(priorities, accountId)
54
+ ? normalizeAccountPriority(priorities[accountId])
55
+ : DEFAULT_ACCOUNT_PRIORITY
56
+ );
57
+ }
58
+
59
+ /**
60
+ * The account an operator most recently selected by hand. While pinned, priority
61
+ * never preempts upward: the pin is a tier *ceiling* for round-robin/fill-first --
62
+ * `selectPriorityTier` skips every tier above the pinned account's, so higher-ordered
63
+ * accounts are suppressed rather than the pinned one being guaranteed -- and a veto in
64
+ * the quota path, until the account crosses the auto-switch threshold.
65
+ */
66
+ export function pinnedCodexAccountId(config: OcxConfig): string | undefined {
67
+ return config.activeCodexAccountPinned;
68
+ }
69
+
70
+ export function isCodexAccountPinned(config: OcxConfig, accountId: string): boolean {
71
+ return config.activeCodexAccountPinned === accountId;
72
+ }
73
+
74
+ export function setCodexAccountPin(config: OcxConfig, accountId: string): void {
75
+ config.activeCodexAccountPinned = accountId;
76
+ }
77
+
78
+ /** Release the pin. With `accountId` given, only when it is the pinned account. */
79
+ export function clearCodexAccountPin(config: OcxConfig, accountId?: string): void {
80
+ if (accountId === undefined || config.activeCodexAccountPinned === accountId) {
81
+ delete config.activeCodexAccountPinned;
82
+ }
83
+ }
@@ -0,0 +1,31 @@
1
+ import { captureConfigGeneration, type GenerationContext } from "../lib/state-store-sweeper";
2
+
3
+ const reauthAccounts = new Set<string>();
4
+ let lastReconciledGeneration = 0;
5
+ let liveAccountIds = new Set<string>();
6
+
7
+ export function markAccountNeedsReauth(id: string, writerGeneration = captureConfigGeneration()): void {
8
+ if (writerGeneration < lastReconciledGeneration && !liveAccountIds.has(id)) return;
9
+ reauthAccounts.add(id);
10
+ }
11
+
12
+ export function reconcileCodexReauthState(context: GenerationContext): number {
13
+ if (context.generation <= lastReconciledGeneration) return 0;
14
+ let removed = 0;
15
+ for (const id of reauthAccounts) {
16
+ if (context.codexAccountIds.has(id)) continue;
17
+ reauthAccounts.delete(id);
18
+ removed += 1;
19
+ }
20
+ liveAccountIds = new Set(context.codexAccountIds);
21
+ lastReconciledGeneration = context.generation;
22
+ return removed;
23
+ }
24
+
25
+ export function isAccountNeedsReauth(id: string): boolean {
26
+ return reauthAccounts.has(id);
27
+ }
28
+
29
+ export function clearAccountNeedsReauth(id: string): void {
30
+ reauthAccounts.delete(id);
31
+ }