@iislee/opencodex 2.11.0 → 2.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (675) hide show
  1. package/AGENTS_INSTALL.md +109 -0
  2. package/README.md +114 -19
  3. package/bin/ocx.mjs +164 -36
  4. package/bin/package-main.mjs +1 -1
  5. package/gui/dist/assets/index-BF38heuV.js +104 -0
  6. package/gui/dist/assets/index-DMiI18Kv.css +1 -0
  7. package/gui/dist/index.html +2 -2
  8. package/gui/dist/provider-icons/alibaba-color.svg +1 -1
  9. package/gui/dist/provider-icons/antigravity-color.svg +1 -1
  10. package/gui/dist/provider-icons/claude-color.svg +1 -1
  11. package/gui/dist/provider-icons/cline-color.svg +16 -0
  12. package/gui/dist/provider-icons/cloudflare-ai-gateway-color.svg +1 -1
  13. package/gui/dist/provider-icons/commandcode-color.svg +1 -0
  14. package/gui/dist/provider-icons/copilot-color.svg +1 -1
  15. package/gui/dist/provider-icons/cursor-color.svg +1 -1
  16. package/gui/dist/provider-icons/deepseek-color.svg +1 -1
  17. package/gui/dist/provider-icons/firepass-color.svg +1 -1
  18. package/gui/dist/provider-icons/fireworks-color.svg +1 -1
  19. package/gui/dist/provider-icons/gemini-color.svg +1 -1
  20. package/gui/dist/provider-icons/github-copilot-color.svg +1 -1
  21. package/gui/dist/provider-icons/gitlab-duo-color.svg +1 -1
  22. package/gui/dist/provider-icons/grok.svg +1 -1
  23. package/gui/dist/provider-icons/groq-color.svg +1 -1
  24. package/gui/dist/provider-icons/huggingface-color.svg +1 -1
  25. package/gui/dist/provider-icons/kimi-color.svg +1 -1
  26. package/gui/dist/provider-icons/kiro-color.svg +2 -2
  27. package/gui/dist/provider-icons/lm-studio-color.svg +1 -1
  28. package/gui/dist/provider-icons/mistral-color.svg +1 -1
  29. package/gui/dist/provider-icons/moonshot-color.svg +1 -1
  30. package/gui/dist/provider-icons/nvidia-color.svg +1 -1
  31. package/gui/dist/provider-icons/ollama-color.svg +1 -1
  32. package/gui/dist/provider-icons/openai.svg +1 -1
  33. package/gui/dist/provider-icons/opencode.svg +2 -1
  34. package/gui/dist/provider-icons/openrouter-color.svg +1 -1
  35. package/gui/dist/provider-icons/pi.svg +2 -2
  36. package/gui/dist/provider-icons/qianfan-color.svg +1 -1
  37. package/gui/dist/provider-icons/qwen-portal-color.svg +1 -1
  38. package/gui/dist/provider-icons/vercel-ai-gateway-color.svg +1 -1
  39. package/gui/dist/provider-icons/vllm-color.svg +1 -1
  40. package/gui/dist/provider-icons/xiaomi-color.svg +1 -1
  41. package/package.json +19 -10
  42. package/src/adapters/anthropic-output-schema.ts +137 -0
  43. package/src/adapters/anthropic.ts +376 -52
  44. package/src/adapters/base.ts +54 -7
  45. package/src/adapters/client-fingerprint.ts +18 -12
  46. package/src/adapters/cline-pass-deepseek-v4-tool-replay.ts +69 -0
  47. package/src/adapters/command-code.ts +601 -0
  48. package/src/adapters/cursor/checkpoint-store.ts +303 -0
  49. package/src/adapters/cursor/cursor-errors.ts +129 -6
  50. package/src/adapters/cursor/discovery.ts +61 -4
  51. package/src/adapters/cursor/effort-map.ts +27 -3
  52. package/src/adapters/cursor/framing.ts +39 -0
  53. package/src/adapters/cursor/h2-pool.ts +123 -0
  54. package/src/adapters/cursor/http1-bidi.ts +361 -0
  55. package/src/adapters/cursor/images.ts +704 -0
  56. package/src/adapters/cursor/live-models.ts +174 -58
  57. package/src/adapters/cursor/live-transport.ts +609 -170
  58. package/src/adapters/cursor/native-exec-common.ts +23 -2
  59. package/src/adapters/cursor/native-exec-fs.ts +10 -7
  60. package/src/adapters/cursor/native-exec-network.ts +1 -1
  61. package/src/adapters/cursor/native-exec-shell.ts +0 -1
  62. package/src/adapters/cursor/native-exec.ts +101 -14
  63. package/src/adapters/cursor/protobuf-events.ts +829 -11
  64. package/src/adapters/cursor/protobuf-request.ts +383 -65
  65. package/src/adapters/cursor/request-builder.ts +237 -31
  66. package/src/adapters/cursor/tool-definitions.ts +242 -12
  67. package/src/adapters/cursor/tool-result-normalize.ts +92 -0
  68. package/src/adapters/cursor/transport.ts +22 -0
  69. package/src/adapters/cursor/types.ts +28 -1
  70. package/src/adapters/cursor.ts +133 -7
  71. package/src/adapters/google-antigravity-replay.ts +558 -34
  72. package/src/adapters/google-antigravity-wire.ts +43 -10
  73. package/src/adapters/google-http.ts +38 -10
  74. package/src/adapters/google-tool-schema.ts +80 -15
  75. package/src/adapters/google-truncation.ts +11 -0
  76. package/src/adapters/google.ts +618 -74
  77. package/src/adapters/identity.ts +39 -6
  78. package/src/adapters/kiro-errors.ts +11 -0
  79. package/src/adapters/kiro-events.ts +19 -1
  80. package/src/adapters/kiro-thinking.ts +18 -2
  81. package/src/adapters/kiro-tools.ts +10 -1
  82. package/src/adapters/kiro.ts +92 -54
  83. package/src/adapters/mimo-free.ts +17 -0
  84. package/src/adapters/openai-chat-url.ts +11 -0
  85. package/src/adapters/openai-chat.ts +1311 -336
  86. package/src/adapters/openai-responses-url.ts +16 -0
  87. package/src/adapters/openai-responses.ts +830 -56
  88. package/src/adapters/registry.ts +175 -0
  89. package/src/adapters/responses-tool-schema.ts +67 -0
  90. package/src/adapters/tool-call-id.ts +119 -0
  91. package/src/adapters/tool-catalog-nudge.ts +104 -21
  92. package/src/adapters/xai-web-search.ts +185 -0
  93. package/src/bridge.ts +428 -61
  94. package/src/chat/inbound.ts +43 -19
  95. package/src/chat/outbound.ts +82 -26
  96. package/src/claude/agents-inject.ts +32 -9
  97. package/src/claude/context-windows.ts +21 -5
  98. package/src/claude/desktop-3p.ts +243 -9
  99. package/src/claude/gateway-cache.ts +41 -4
  100. package/src/claude/inbound.ts +72 -3
  101. package/src/claude/model-info.ts +38 -15
  102. package/src/claude/outbound.ts +70 -16
  103. package/src/cli/account-api.ts +35 -1
  104. package/src/cli/account-auth.ts +33 -6
  105. package/src/cli/account-catalog-refresh.ts +14 -0
  106. package/src/cli/account-extended.ts +389 -2
  107. package/src/cli/account-main.ts +317 -0
  108. package/src/cli/account.ts +30 -6
  109. package/src/cli/agent.ts +45 -1
  110. package/src/cli/claude-agent-startup-sync.ts +73 -0
  111. package/src/cli/claude-desktop.ts +29 -4
  112. package/src/cli/claude.ts +103 -34
  113. package/src/cli/codex-log-guard-doctor.ts +103 -0
  114. package/src/cli/codex-shim-autorestore.ts +2 -0
  115. package/src/cli/codex-shim-readiness.ts +76 -0
  116. package/src/cli/combo.ts +8 -0
  117. package/src/cli/config-command.ts +74 -10
  118. package/src/cli/dispatch.ts +593 -0
  119. package/src/cli/doctor.ts +315 -43
  120. package/src/cli/ensure-desired-integrations.ts +152 -0
  121. package/src/cli/export-command.ts +46 -20
  122. package/src/cli/help.ts +20 -271
  123. package/src/cli/index.ts +378 -519
  124. package/src/cli/init.ts +4 -17
  125. package/src/cli/integrations.ts +120 -2
  126. package/src/cli/lab.ts +607 -0
  127. package/src/cli/launcher-context.ts +77 -0
  128. package/src/cli/minimax.ts +497 -0
  129. package/src/cli/models-runtime.ts +35 -2
  130. package/src/cli/models.ts +100 -14
  131. package/src/cli/observe.ts +92 -3
  132. package/src/cli/opencode.ts +4 -2
  133. package/src/cli/provider-runtime.ts +18 -1
  134. package/src/cli/provider.ts +24 -3
  135. package/src/cli/ready.ts +301 -0
  136. package/src/cli/registry.ts +437 -0
  137. package/src/cli/root.ts +86 -0
  138. package/src/cli/route-policy.ts +92 -0
  139. package/src/cli/runtime-api.ts +6 -3
  140. package/src/cli/star-prompt.ts +71 -15
  141. package/src/cli/status.ts +10 -3
  142. package/src/cli/system-restart-client.ts +146 -0
  143. package/src/cli/tray-proxy.ts +153 -6
  144. package/src/cli/v2.ts +105 -10
  145. package/src/cli.ts +1 -1
  146. package/src/clients/config-export.ts +1358 -21
  147. package/src/codex/account-label.ts +14 -1
  148. package/src/codex/account-lifecycle.ts +130 -13
  149. package/src/codex/account-namespaces.ts +49 -3
  150. package/src/codex/account-priority.ts +83 -0
  151. package/src/codex/account-store.ts +29 -2
  152. package/src/codex/account-usability.ts +25 -2
  153. package/src/codex/admission.ts +256 -0
  154. package/src/codex/affinity-debug.ts +162 -0
  155. package/src/codex/app-server-processes.ts +493 -106
  156. package/src/codex/app-server-restart-service.ts +232 -0
  157. package/src/codex/auth-api.ts +849 -242
  158. package/src/codex/auth-collision.ts +5 -3
  159. package/src/codex/auth-context.ts +345 -32
  160. package/src/codex/autostart-health.ts +8 -1
  161. package/src/codex/catalog/account-models.ts +67 -0
  162. package/src/codex/catalog/aggregation.ts +68 -10
  163. package/src/codex/catalog/bundled.ts +331 -33
  164. package/src/codex/catalog/effort.ts +121 -30
  165. package/src/codex/catalog/filesystem-evidence.ts +302 -0
  166. package/src/codex/catalog/kinds.ts +2 -0
  167. package/src/codex/catalog/metadata.ts +529 -45
  168. package/src/codex/catalog/native-models.ts +72 -0
  169. package/src/codex/catalog/parsing.ts +224 -30
  170. package/src/codex/catalog/provider-fetch.ts +1460 -134
  171. package/src/codex/catalog/sync.ts +1449 -186
  172. package/src/codex/catalog-admission.ts +199 -0
  173. package/src/codex/catalog-refresh-status.ts +105 -0
  174. package/src/codex/catalog-write-serialization.ts +242 -0
  175. package/src/codex/catalog.ts +6 -3
  176. package/src/codex/codex-write-lock.ts +384 -0
  177. package/src/codex/convergence-types.ts +614 -0
  178. package/src/codex/convergence.ts +651 -0
  179. package/src/codex/coordinator-doctor.ts +332 -0
  180. package/src/codex/custom-model-catalog-migration.ts +176 -0
  181. package/src/codex/desired-state.ts +230 -0
  182. package/src/codex/features.ts +636 -39
  183. package/src/codex/generation.ts +202 -0
  184. package/src/codex/history-job.ts +407 -0
  185. package/src/codex/history-lock.ts +242 -0
  186. package/src/codex/history-migration-guardian.ts +26 -20
  187. package/src/codex/history-provider.ts +231 -28
  188. package/src/codex/history-transition.ts +105 -0
  189. package/src/codex/history-worker.ts +220 -0
  190. package/src/codex/inject-coordination.ts +290 -0
  191. package/src/codex/inject.ts +1073 -152
  192. package/src/codex/injected-marker.ts +37 -3
  193. package/src/codex/integration-record.ts +266 -0
  194. package/src/codex/internal/catalog-writer.ts +203 -0
  195. package/src/codex/internal/history-writer.ts +80 -0
  196. package/src/codex/journal.ts +66 -4
  197. package/src/codex/log-guard/inspect.ts +506 -0
  198. package/src/codex/log-guard/lock.ts +150 -0
  199. package/src/codex/log-guard/maintenance.ts +403 -0
  200. package/src/codex/log-guard/path-safety.ts +88 -0
  201. package/src/codex/log-guard/policy.ts +44 -0
  202. package/src/codex/log-guard/processes.ts +205 -0
  203. package/src/codex/log-guard/protection.ts +489 -0
  204. package/src/codex/log-guard/sqlite-errors.ts +9 -0
  205. package/src/codex/main-account-cache.ts +24 -0
  206. package/src/codex/main-account.ts +29 -1
  207. package/src/codex/management-convergence.ts +167 -0
  208. package/src/codex/model-cache.ts +56 -10
  209. package/src/codex/model-entitlements.ts +353 -0
  210. package/src/codex/native-main-admission.ts +47 -0
  211. package/src/codex/native-main-auth-temp.ts +187 -0
  212. package/src/codex/native-main-claim.ts +178 -0
  213. package/src/codex/native-main-lock-file.ts +162 -0
  214. package/src/codex/native-main-owner.ts +329 -0
  215. package/src/codex/native-profile-api.ts +247 -0
  216. package/src/codex/native-profile-manager.ts +1531 -0
  217. package/src/codex/native-profile-processes.ts +121 -0
  218. package/src/codex/native-profile-recovery.ts +99 -0
  219. package/src/codex/native-profile-stage-store.ts +387 -0
  220. package/src/codex/native-profile-startup.ts +492 -0
  221. package/src/codex/native-profile-store.ts +855 -0
  222. package/src/codex/native-profile-types.ts +120 -0
  223. package/src/codex/native-residue.ts +682 -0
  224. package/src/codex/paths.ts +80 -1
  225. package/src/codex/plan-from-token.ts +140 -0
  226. package/src/codex/plan.ts +40 -0
  227. package/src/codex/plugins-doctor.ts +1 -1
  228. package/src/codex/pool-rotation.ts +74 -4
  229. package/src/codex/project-config-warnings.ts +20 -6
  230. package/src/codex/prompt-journal.ts +352 -0
  231. package/src/codex/prompt-layers.ts +967 -0
  232. package/src/codex/prompt-lock.ts +143 -0
  233. package/src/codex/quota-rejection.ts +298 -0
  234. package/src/codex/quota.ts +175 -13
  235. package/src/codex/refresh.ts +11 -2
  236. package/src/codex/reset-credit-recovery.ts +1044 -0
  237. package/src/codex/routing.ts +505 -94
  238. package/src/codex/runtime.ts +159 -38
  239. package/src/codex/shim.ts +1009 -28
  240. package/src/codex/subagent-model-fallback.ts +350 -35
  241. package/src/codex/sync.ts +191 -2
  242. package/src/codex/transition-state.ts +612 -0
  243. package/src/codex/upstream-host-health.ts +368 -0
  244. package/src/codex/user-identity.ts +557 -0
  245. package/src/codex/warmup.ts +187 -81
  246. package/src/codex/write-coordination.ts +114 -0
  247. package/src/combos/failover.ts +20 -0
  248. package/src/combos/index.ts +4 -0
  249. package/src/combos/request.ts +32 -0
  250. package/src/combos/types.ts +81 -9
  251. package/src/config/provider-name.ts +24 -0
  252. package/src/config.ts +1762 -140
  253. package/src/generated/compatibility-version.json +3164 -0
  254. package/src/generated/{jawcode-model-metadata.ts → model-metadata.ts} +19 -17
  255. package/src/grok/inject.ts +16 -5
  256. package/src/grok/inspect.ts +45 -0
  257. package/src/grok/sync.ts +2 -2
  258. package/src/images/loop.ts +152 -29
  259. package/src/images/plan.ts +23 -13
  260. package/src/integrations/config-io.ts +269 -0
  261. package/src/integrations/journal.ts +315 -0
  262. package/src/integrations/merge.ts +135 -0
  263. package/src/integrations/mutation-flight.ts +71 -0
  264. package/src/integrations/native/ownership-preflight.ts +202 -0
  265. package/src/integrations/omp-yaml-source.ts +358 -0
  266. package/src/integrations/owned-refresh.ts +74 -0
  267. package/src/integrations/ownership.ts +111 -0
  268. package/src/integrations/registry.ts +159 -0
  269. package/src/integrations/serialize.ts +314 -0
  270. package/src/integrations/state.ts +361 -0
  271. package/src/integrations/store.ts +103 -0
  272. package/src/integrations/writer-lock.ts +98 -0
  273. package/src/integrations/writer.ts +691 -0
  274. package/src/lab/artifacts/sanitize.ts +586 -0
  275. package/src/lab/artifacts/secure-fs.ts +475 -0
  276. package/src/lab/artifacts/store.ts +310 -0
  277. package/src/lab/automation/budgets.ts +78 -0
  278. package/src/lab/automation/config-persistence.ts +256 -0
  279. package/src/lab/automation/constants.ts +39 -0
  280. package/src/lab/automation/cooldown.ts +103 -0
  281. package/src/lab/automation/dispatch.ts +211 -0
  282. package/src/lab/automation/index.ts +13 -0
  283. package/src/lab/automation/orchestrator.ts +499 -0
  284. package/src/lab/automation/persistence.ts +512 -0
  285. package/src/lab/automation/planner.ts +371 -0
  286. package/src/lab/automation/policy.ts +136 -0
  287. package/src/lab/automation/queue.ts +191 -0
  288. package/src/lab/automation/recovery.ts +24 -0
  289. package/src/lab/automation/route-context.ts +21 -0
  290. package/src/lab/automation/run-key.ts +44 -0
  291. package/src/lab/automation/runs-query.ts +34 -0
  292. package/src/lab/automation/types.ts +160 -0
  293. package/src/lab/conformance/assertion.ts +325 -0
  294. package/src/lab/conformance/digest.ts +22 -0
  295. package/src/lab/conformance/executor.ts +741 -0
  296. package/src/lab/conformance/fixture-provider.ts +27 -0
  297. package/src/lab/conformance/fixtures/live-v1-cases.json +175 -0
  298. package/src/lab/conformance/fixtures/protocol-v1-cases.json +461 -0
  299. package/src/lab/conformance/harness-budget.ts +47 -0
  300. package/src/lab/conformance/index.ts +5 -0
  301. package/src/lab/conformance/jcs.ts +64 -0
  302. package/src/lab/conformance/json-pointer.ts +39 -0
  303. package/src/lab/conformance/manifest.ts +180 -0
  304. package/src/lab/conformance/mcp-stub.ts +179 -0
  305. package/src/lab/conformance/negative-controls.ts +164 -0
  306. package/src/lab/conformance/observation.ts +355 -0
  307. package/src/lab/conformance/runner.ts +68 -0
  308. package/src/lab/conformance/sse-normalize.ts +59 -0
  309. package/src/lab/conformance/suite-manifest.ts +78 -0
  310. package/src/lab/conformance/types.ts +214 -0
  311. package/src/lab/constants.ts +126 -0
  312. package/src/lab/digest.ts +64 -0
  313. package/src/lab/events/errors.ts +9 -0
  314. package/src/lab/events/limits.ts +117 -0
  315. package/src/lab/events/types.ts +229 -0
  316. package/src/lab/events/validate.ts +781 -0
  317. package/src/lab/fabric/constants.ts +40 -0
  318. package/src/lab/fabric/executor.ts +492 -0
  319. package/src/lab/fabric/index.ts +80 -0
  320. package/src/lab/fabric/manifest.ts +222 -0
  321. package/src/lab/fabric/observe.ts +489 -0
  322. package/src/lab/fabric/patch.ts +79 -0
  323. package/src/lab/fabric/producer-child.ts +139 -0
  324. package/src/lab/fabric/producer-isolate.ts +276 -0
  325. package/src/lab/fabric/producer-protocol.ts +61 -0
  326. package/src/lab/fabric/scratch.ts +439 -0
  327. package/src/lab/fabric/subject.ts +106 -0
  328. package/src/lab/fabric/types.ts +134 -0
  329. package/src/lab/fabric/verifier.ts +98 -0
  330. package/src/lab/index.ts +54 -0
  331. package/src/lab/ledger/artifact-refs.ts +127 -0
  332. package/src/lab/ledger/invalidation.ts +136 -0
  333. package/src/lab/ledger/purge.ts +310 -0
  334. package/src/lab/ledger/store.ts +532 -0
  335. package/src/lab/live/credential-lease.ts +53 -0
  336. package/src/lab/live/destination.ts +155 -0
  337. package/src/lab/live/executor.ts +336 -0
  338. package/src/lab/live/inert-tools.ts +56 -0
  339. package/src/lab/live/manifest.ts +85 -0
  340. package/src/lab/live/mcp-loopback.ts +57 -0
  341. package/src/lab/live/runner.ts +19 -0
  342. package/src/lab/live/sandbox.ts +61 -0
  343. package/src/lab/live/suite-manifest.ts +41 -0
  344. package/src/lab/live/transport.ts +118 -0
  345. package/src/lab/live/types.ts +197 -0
  346. package/src/lab/observe/from-conformance.ts +301 -0
  347. package/src/lab/observe/from-live.ts +117 -0
  348. package/src/lab/paths.ts +153 -0
  349. package/src/lab/projection/rebuild.ts +495 -0
  350. package/src/lab/projection/schema.ts +135 -0
  351. package/src/lab/projection/verdicts.ts +474 -0
  352. package/src/lab/projection/verification.ts +412 -0
  353. package/src/lab/public/bundle.ts +217 -0
  354. package/src/lab/public/community-authority.ts +175 -0
  355. package/src/lab/public/community-files.ts +29 -0
  356. package/src/lab/public/community.ts +479 -0
  357. package/src/lab/public/file-safety.ts +155 -0
  358. package/src/lab/public/ids.ts +26 -0
  359. package/src/lab/public/index.ts +16 -0
  360. package/src/lab/public/mutation-lock.ts +424 -0
  361. package/src/lab/public/operator.ts +353 -0
  362. package/src/lab/public/origin-purge.ts +79 -0
  363. package/src/lab/public/origin.ts +203 -0
  364. package/src/lab/public/privacy.ts +143 -0
  365. package/src/lab/public/private-file.ts +261 -0
  366. package/src/lab/public/project.ts +124 -0
  367. package/src/lab/public/purge-test-fault.ts +21 -0
  368. package/src/lab/public/purge.ts +223 -0
  369. package/src/lab/public/registry.ts +44 -0
  370. package/src/lab/public/revocation.ts +252 -0
  371. package/src/lab/public/signature.ts +243 -0
  372. package/src/lab/public/storage.ts +105 -0
  373. package/src/lab/public/strict-json.ts +206 -0
  374. package/src/lab/public/time.ts +26 -0
  375. package/src/lab/public/types.ts +172 -0
  376. package/src/lab/public/validate.ts +391 -0
  377. package/src/lab/query/catalog.ts +101 -0
  378. package/src/lab/query/connection.ts +107 -0
  379. package/src/lab/query/constants.ts +4 -0
  380. package/src/lab/query/cursor.ts +132 -0
  381. package/src/lab/query/dto-map.ts +277 -0
  382. package/src/lab/query/errors.ts +22 -0
  383. package/src/lab/query/freshness.ts +53 -0
  384. package/src/lab/query/index.ts +45 -0
  385. package/src/lab/query/latest-observation.ts +59 -0
  386. package/src/lab/query/passive-production.ts +159 -0
  387. package/src/lab/query/queries.ts +444 -0
  388. package/src/lab/query/types.ts +266 -0
  389. package/src/lab/subject/behavior-fingerprint.ts +77 -0
  390. package/src/lab/subject/installation-salt.ts +112 -0
  391. package/src/lab/subject/protocol-subject.ts +80 -0
  392. package/src/lab/subject/route-subject.ts +74 -0
  393. package/src/lib/app-owned-memory-stores.ts +22 -0
  394. package/src/lib/bounded-body.ts +153 -9
  395. package/src/lib/bun-runtime.ts +125 -12
  396. package/src/lib/bun-stream-caps.ts +13 -9
  397. package/src/lib/codex-restart-contract.ts +120 -0
  398. package/src/lib/config-ownership.ts +6 -2
  399. package/src/lib/destination-policy.ts +65 -1
  400. package/src/lib/errors.ts +44 -2
  401. package/src/lib/fabric-task-execution-authority.ts +7 -0
  402. package/src/lib/fabric-task-host.ts +29 -0
  403. package/src/lib/lab-activation.ts +223 -0
  404. package/src/lib/lab-live-execution-authority.ts +13 -0
  405. package/src/lib/lab-live-host.ts +30 -0
  406. package/src/lib/lab-live-pinned-sender.ts +56 -0
  407. package/src/lib/lab-live-route-production.ts +130 -0
  408. package/src/lib/lab-passive-linker-registration.ts +26 -0
  409. package/src/lib/local-management-attestation.ts +51 -0
  410. package/src/lib/local-management-capability.ts +100 -0
  411. package/src/lib/local-provider-reload-contract.ts +100 -0
  412. package/src/lib/optional-shutdown-hooks.ts +57 -0
  413. package/src/lib/pinned-http.ts +145 -26
  414. package/src/lib/process-control.ts +4 -1
  415. package/src/lib/provider-outbound.ts +49 -9
  416. package/src/lib/redact.ts +419 -3
  417. package/src/lib/self-launch-argv.ts +15 -0
  418. package/src/lib/server-resource-ownership.ts +71 -0
  419. package/src/lib/shadow-call.ts +35 -4
  420. package/src/lib/sse-decoder.ts +41 -0
  421. package/src/lib/state-store-registrations.ts +10 -2
  422. package/src/lib/system-restart-contract.ts +73 -0
  423. package/src/lib/token-estimate.ts +19 -2
  424. package/src/lib/tool-argument-integers.ts +202 -0
  425. package/src/lib/translator-budget.ts +44 -0
  426. package/src/lib/upstream-http-version.ts +57 -0
  427. package/src/lib/upstream-reachability.ts +95 -0
  428. package/src/lib/upstream-retry.ts +156 -3
  429. package/src/lib/windows-atomic-replace.ts +155 -0
  430. package/src/lib/windows-elevation.ts +70 -2
  431. package/src/lib/windows-secret-acl.ts +409 -69
  432. package/src/lib/windows-service-wrappers.ts +72 -0
  433. package/src/lib/windows-text.ts +106 -0
  434. package/src/lib/windows-user-principal.ts +341 -0
  435. package/src/lib/winsw.ts +33 -5
  436. package/src/oauth/account-import/google-antigravity-adapter.ts +74 -0
  437. package/src/oauth/account-import/index.ts +15 -0
  438. package/src/oauth/account-import/parser.ts +83 -0
  439. package/src/oauth/account-import/registry.ts +18 -0
  440. package/src/oauth/account-import/service.ts +75 -0
  441. package/src/oauth/account-import/types.ts +91 -0
  442. package/src/oauth/anthropic.ts +12 -1
  443. package/src/oauth/callback-server.ts +8 -2
  444. package/src/oauth/chatgpt.ts +12 -1
  445. package/src/oauth/command-code.ts +239 -0
  446. package/src/oauth/cursor.ts +46 -5
  447. package/src/oauth/google-antigravity.ts +35 -3
  448. package/src/oauth/health.ts +20 -12
  449. package/src/oauth/index.ts +398 -66
  450. package/src/oauth/key-providers.ts +16 -0
  451. package/src/oauth/kimi.ts +16 -2
  452. package/src/oauth/kiro.ts +50 -6
  453. package/src/oauth/local-token-detect.ts +11 -2
  454. package/src/oauth/log.ts +3 -1
  455. package/src/oauth/login-cli.ts +88 -28
  456. package/src/oauth/nous.ts +798 -0
  457. package/src/oauth/store.ts +119 -21
  458. package/src/oauth/token-guardian.ts +9 -3
  459. package/src/pi/models.ts +2 -2
  460. package/src/providers/alibaba-region-migration.ts +1 -1
  461. package/src/providers/antigravity-models.ts +521 -31
  462. package/src/providers/base-url-choices.ts +10 -0
  463. package/src/providers/codex-capacity.ts +292 -0
  464. package/src/providers/command-code-efforts.ts +144 -0
  465. package/src/providers/context-cap.ts +22 -5
  466. package/src/providers/cursor-pool.ts +72 -0
  467. package/src/providers/derive.ts +253 -6
  468. package/src/providers/fastwire.ts +501 -0
  469. package/src/providers/free-directory.ts +10 -7
  470. package/src/providers/google-vertex-location.ts +14 -0
  471. package/src/providers/key-failover.ts +71 -3
  472. package/src/providers/label.ts +1 -1
  473. package/src/providers/model-discovery-limits.ts +16 -0
  474. package/src/providers/model-discovery.ts +115 -22
  475. package/src/providers/model-rename-migration.ts +255 -0
  476. package/src/providers/model-rename-startup.ts +28 -0
  477. package/src/providers/openai-sidecar.ts +72 -4
  478. package/src/providers/openai-tier-startup.ts +31 -2
  479. package/src/providers/openai-tiers.ts +119 -4
  480. package/src/providers/openai-virtual-models.ts +1 -0
  481. package/src/providers/opencode-zen-rate-limit.ts +102 -0
  482. package/src/providers/provider-id-rewrite.ts +29 -0
  483. package/src/providers/quota.ts +1319 -38
  484. package/src/providers/registry.ts +1429 -111
  485. package/src/providers/request-pacing.ts +310 -0
  486. package/src/providers/service-tier.ts +277 -0
  487. package/src/providers/slug-codec.ts +42 -6
  488. package/src/providers/static-model-discovery.ts +86 -0
  489. package/src/providers/xai-responses-opt-in.ts +15 -0
  490. package/src/providers/xai-transport.ts +11 -4
  491. package/src/reasoning-effort.ts +49 -1
  492. package/src/responses/compaction.ts +26 -1
  493. package/src/responses/custom-tool-compat.ts +266 -0
  494. package/src/responses/hosted-tool-policy.ts +9 -0
  495. package/src/responses/namespace-tool-compat.ts +355 -0
  496. package/src/responses/parser.ts +220 -38
  497. package/src/responses/provider-continuation.ts +98 -0
  498. package/src/responses/provider-opaque-metadata.ts +73 -0
  499. package/src/responses/reasoning-envelope.ts +9 -1
  500. package/src/responses/reasoning-replay-cache.ts +426 -0
  501. package/src/responses/schema.ts +7 -1
  502. package/src/responses/spill-store.ts +75 -10
  503. package/src/responses/state.ts +565 -27
  504. package/src/responses/thought-signature-replay.ts +347 -0
  505. package/src/responses/tool-search-compat.ts +301 -0
  506. package/src/responses/truncated-stop-reason.ts +60 -0
  507. package/src/router.ts +366 -30
  508. package/src/routing/analytics.ts +378 -0
  509. package/src/routing/capability.ts +244 -0
  510. package/src/routing/compatibility/assemble.ts +73 -0
  511. package/src/routing/compatibility/behavior.ts +278 -0
  512. package/src/routing/compatibility/catalog.ts +99 -0
  513. package/src/routing/compatibility/endpoint.ts +52 -0
  514. package/src/routing/compatibility/lab-evidence-provider.ts +130 -0
  515. package/src/routing/compatibility/policy.ts +181 -0
  516. package/src/routing/compatibility/provider-slot.ts +56 -0
  517. package/src/routing/compatibility/reader.ts +110 -0
  518. package/src/routing/compatibility/subject.ts +191 -0
  519. package/src/routing/compatibility/types.ts +64 -0
  520. package/src/routing/compatibility/version.ts +104 -0
  521. package/src/routing/cost.ts +77 -0
  522. package/src/routing/evaluator.ts +495 -0
  523. package/src/routing/health.ts +412 -0
  524. package/src/routing/history/cursor.ts +43 -0
  525. package/src/routing/history/indexer.ts +605 -0
  526. package/src/routing/history/schema.ts +72 -0
  527. package/src/routing/profile-namespace.ts +15 -0
  528. package/src/routing/profile.ts +547 -0
  529. package/src/routing/quota.ts +145 -0
  530. package/src/routing/request-evidence.ts +45 -0
  531. package/src/routing/trace.ts +776 -0
  532. package/src/server/adapter-resolve.ts +2 -29
  533. package/src/server/auth-cors.ts +267 -46
  534. package/src/server/background-lifecycle.ts +182 -0
  535. package/src/server/chat-completions.ts +130 -56
  536. package/src/server/chat-native-sse.ts +331 -0
  537. package/src/server/chat-native.ts +426 -0
  538. package/src/server/claude-messages.ts +159 -43
  539. package/src/server/direct-local-http.ts +347 -0
  540. package/src/server/effort-policy.ts +18 -0
  541. package/src/server/github-copilot-responses-repair.ts +338 -0
  542. package/src/server/gui-static.ts +39 -10
  543. package/src/server/images.ts +94 -12
  544. package/src/server/index.ts +865 -181
  545. package/src/server/lifecycle.ts +284 -13
  546. package/src/server/live.ts +136 -17
  547. package/src/server/local-management-read-client.ts +90 -0
  548. package/src/server/local-provider-reload-client.ts +137 -0
  549. package/src/server/management/agent-settings-routes.ts +398 -103
  550. package/src/server/management/api-key-usage.ts +31 -5
  551. package/src/server/management/body.ts +6 -0
  552. package/src/server/management/combo-routes.ts +62 -24
  553. package/src/server/management/config-routes.ts +464 -51
  554. package/src/server/management/context.ts +80 -2
  555. package/src/server/management/integration-routes.ts +498 -0
  556. package/src/server/management/lab-automation-routes.ts +206 -0
  557. package/src/server/management/lab-routes.ts +563 -0
  558. package/src/server/management/logs-usage-routes.ts +101 -32
  559. package/src/server/management/model-routes.ts +189 -131
  560. package/src/server/management/model-rows.ts +163 -0
  561. package/src/server/management/native-integration-routes.ts +769 -0
  562. package/src/server/management/oauth-account-routes.ts +80 -4
  563. package/src/server/management/provider-capability-config.ts +48 -0
  564. package/src/server/management/provider-routes.ts +764 -157
  565. package/src/server/management/request-history-routes.ts +191 -0
  566. package/src/server/management/routing-analytics-routes.ts +74 -0
  567. package/src/server/management/routing-profile-routes.ts +380 -0
  568. package/src/server/management/shared.ts +27 -11
  569. package/src/server/management/sidebar-routes.ts +47 -31
  570. package/src/server/management/storage-log-guard-routes.ts +186 -0
  571. package/src/server/management/sync-response.ts +69 -0
  572. package/src/server/management/system-restart.ts +288 -32
  573. package/src/server/management/system-routes.ts +77 -0
  574. package/src/server/management/usage-summary-cache.ts +9 -1
  575. package/src/server/management/vision-sidecar-options.ts +167 -0
  576. package/src/server/management/web-search-sidecar-options.ts +120 -0
  577. package/src/server/management-api.ts +115 -14
  578. package/src/server/management-auth.ts +220 -5
  579. package/src/server/passive-route-linker.ts +66 -0
  580. package/src/server/ports.ts +41 -1
  581. package/src/server/proxy-liveness.ts +132 -5
  582. package/src/server/readiness.ts +99 -0
  583. package/src/server/relay-eager.ts +82 -42
  584. package/src/server/relay.ts +236 -76
  585. package/src/server/request-decompress.ts +113 -6
  586. package/src/server/request-log.ts +235 -22
  587. package/src/server/responses/agent-task-recovery-cache.ts +143 -0
  588. package/src/server/responses/agent-task-recovery.ts +465 -0
  589. package/src/server/responses/collaboration.ts +204 -35
  590. package/src/server/responses/compact.ts +442 -55
  591. package/src/server/responses/core.ts +2872 -331
  592. package/src/server/responses/empty-completion-guard.ts +276 -0
  593. package/src/server/responses/encrypted-payload.ts +62 -39
  594. package/src/server/responses/fetch-helpers.ts +79 -4
  595. package/src/server/responses/input-admission.ts +185 -0
  596. package/src/server/responses/pacing-overload.ts +13 -0
  597. package/src/server/responses/policy-fallback.ts +178 -0
  598. package/src/server/responses/responses-field-backfill.ts +251 -0
  599. package/src/server/responses/terminal-guard.ts +26 -5
  600. package/src/server/responses/upstream-error.ts +5 -0
  601. package/src/server/responses/ws-upstream.ts +308 -0
  602. package/src/server/responses-custom-tool-repair.ts +282 -0
  603. package/src/server/responses-item-id-repair.ts +54 -6
  604. package/src/server/responses-json-events.ts +90 -0
  605. package/src/server/responses-model-rewrite.ts +29 -0
  606. package/src/server/responses-reasoning-summary-rewrite.ts +178 -0
  607. package/src/server/responses-snapshot-repair.ts +621 -0
  608. package/src/server/responses-terminal-repair.ts +342 -0
  609. package/src/server/responses-tool-search-repair.ts +267 -0
  610. package/src/server/responses-undeclared-tool-guard.ts +153 -0
  611. package/src/server/responses.ts +18 -2
  612. package/src/server/search.ts +78 -13
  613. package/src/server/sse-frame-buffer.ts +292 -0
  614. package/src/server/sse-payload-rewrite.ts +110 -22
  615. package/src/server/startup-action-control.ts +8 -1
  616. package/src/server/startup-health-cache.ts +19 -1
  617. package/src/server/system-env.ts +80 -9
  618. package/src/server/ws-bridge.ts +39 -38
  619. package/src/service-manager-probe.ts +892 -0
  620. package/src/service.ts +1111 -90
  621. package/src/sidecar/auth.ts +92 -0
  622. package/src/sidecar/candidates.ts +83 -0
  623. package/src/storage/cleanup.ts +2 -2
  624. package/src/storage/scanner.ts +1 -1
  625. package/src/storage/worker-lifecycle.ts +14 -14
  626. package/src/tray/windows-tray.ps1 +83 -9
  627. package/src/tray/windows.ts +43 -16
  628. package/src/types/accounts.ts +37 -0
  629. package/src/types/config.ts +845 -0
  630. package/src/types/provider.ts +545 -0
  631. package/src/types/request.ts +384 -0
  632. package/src/types/tools.ts +131 -0
  633. package/src/types/wire.ts +80 -0
  634. package/src/types.ts +104 -1236
  635. package/src/update/index.ts +32 -19
  636. package/src/update/job.ts +442 -67
  637. package/src/update/notify.ts +12 -6
  638. package/src/update/npm-cache-preflight.d.mts +47 -0
  639. package/src/update/npm-cache-preflight.mjs +201 -0
  640. package/src/update/transactional-install.d.mts +22 -0
  641. package/src/update/transactional-install.mjs +259 -0
  642. package/src/usage/cost.ts +0 -0
  643. package/src/usage/expected-prices.ts +268 -16
  644. package/src/usage/log.ts +606 -41
  645. package/src/usage/summary.ts +177 -9
  646. package/src/usage/user-cost-overlay-reconciler.ts +313 -0
  647. package/src/usage/user-cost-overlays.ts +314 -0
  648. package/src/vision/anthropic-describe.ts +10 -6
  649. package/src/vision/backends.ts +97 -0
  650. package/src/vision/describe.ts +9 -3
  651. package/src/vision/eligibility.ts +250 -0
  652. package/src/vision/index.ts +238 -24
  653. package/src/vision/reasoning.ts +55 -0
  654. package/src/vision/routed-describe.ts +175 -0
  655. package/src/vision/timeout-bounds.ts +9 -0
  656. package/src/web-search/anthropic-executor.ts +13 -7
  657. package/src/web-search/backends.ts +108 -0
  658. package/src/web-search/exa-executor.ts +88 -0
  659. package/src/web-search/executor.ts +11 -3
  660. package/src/web-search/gemini-executor.ts +141 -0
  661. package/src/web-search/index.ts +150 -15
  662. package/src/web-search/loop.ts +279 -50
  663. package/src/web-search/parse.ts +125 -30
  664. package/src/web-search/sources.ts +60 -0
  665. package/src/web-search/xai-executor.ts +219 -0
  666. package/gui/dist/assets/index-DTpMHS4F.js +0 -67
  667. package/gui/dist/assets/index-ZNVDE3C7.css +0 -1
  668. package/gui/dist/provider-icons/antigravity.svg +0 -1
  669. package/gui/dist/provider-icons/claude.svg +0 -1
  670. package/gui/dist/provider-icons/copilot.svg +0 -1
  671. package/gui/dist/provider-icons/cursor.svg +0 -2
  672. package/gui/dist/provider-icons/gemini.svg +0 -1
  673. package/gui/dist/provider-icons/grok-color.svg +0 -1
  674. package/gui/dist/provider-icons/kiro.svg +0 -14
  675. package/src/cli/internal-dispatch.ts +0 -20
@@ -0,0 +1,292 @@
1
+ import { codexPlanKey, codexPlanValue } from "../codex/plan";
2
+
3
+ export const CODEX_CONFIGURED_CAPACITY_WEIGHTS = {
4
+ plus: 1,
5
+ team: 1,
6
+ business: 1,
7
+ prolite: 5,
8
+ pro: 20,
9
+ } as const;
10
+
11
+ /** Match the provider-report last-good freshness bound. */
12
+ export const CODEX_CAPACITY_MAX_QUOTA_AGE_MS = 30 * 60_000;
13
+
14
+ export type CodexCapacityQuota = {
15
+ fiveHourPercent?: number;
16
+ fiveHourResetAt?: number;
17
+ weeklyPercent?: number;
18
+ weeklyResetAt?: number;
19
+ monthlyPercent?: number;
20
+ monthlyResetAt?: number;
21
+ customWindows?: Array<{ label: string; percent: number; resetAt?: number }>;
22
+ updatedAt: number;
23
+ };
24
+
25
+ export interface CodexCapacityAccount {
26
+ isMain: boolean;
27
+ active?: boolean;
28
+ plan?: unknown;
29
+ paused: boolean;
30
+ needsReauth?: boolean;
31
+ quota: CodexCapacityQuota | null;
32
+ }
33
+
34
+ export interface CodexCapacityWindowAggregation {
35
+ usedPercent: number;
36
+ includedAccounts: number;
37
+ excludedAccounts: number;
38
+ incomplete: boolean;
39
+ /** Internal calculation evidence; stripped from the management API response. */
40
+ totalWeight?: number;
41
+ /** Internal calculation evidence; stripped from the management API response. */
42
+ consumedWeight?: number;
43
+ /** Internal calculation evidence; stripped from the management API response. */
44
+ remainingWeight?: number;
45
+ updatedAt: number;
46
+ nextRecoveryAt?: number;
47
+ nextRecoveryPercent?: number;
48
+ }
49
+
50
+ export interface CodexCapacityAggregation {
51
+ kind: "capacity-weighted-v1";
52
+ scope: "routable-known";
53
+ includedAccounts: number;
54
+ excludedAccounts: number;
55
+ unknownPlanAccounts: number;
56
+ missingQuotaAccounts: number;
57
+ pausedAccounts: number;
58
+ reauthAccounts: number;
59
+ staleQuotaAccounts: number;
60
+ partialWindowAccounts: number;
61
+ incomplete: boolean;
62
+ presentation?: "aggregate" | "effective-account-fallback" | "coverage-only";
63
+ fiveHour?: CodexCapacityWindowAggregation;
64
+ weekly?: CodexCapacityWindowAggregation;
65
+ monthly?: CodexCapacityWindowAggregation;
66
+ customWindows?: Array<CodexCapacityWindowAggregation & { label: string }>;
67
+ currentAccount?: {
68
+ isMain: boolean;
69
+ plan?: string | null;
70
+ quota: CodexCapacityQuota | null;
71
+ };
72
+ }
73
+
74
+ export interface CodexCapacityResult {
75
+ quota: CodexCapacityQuota | null;
76
+ aggregation: CodexCapacityAggregation | null;
77
+ currentAccount?: CodexCapacityAggregation["currentAccount"];
78
+ }
79
+
80
+ type MutableWindow = {
81
+ totalWeight: number;
82
+ consumedWeight: number;
83
+ includedAccounts: number;
84
+ recoveries: Map<number, number>;
85
+ oldestUpdatedAt: number;
86
+ };
87
+
88
+ function configuredWeight(plan: unknown): number | undefined {
89
+ const normalized = codexPlanKey(plan);
90
+ return normalized && Object.hasOwn(CODEX_CONFIGURED_CAPACITY_WEIGHTS, normalized)
91
+ ? CODEX_CONFIGURED_CAPACITY_WEIGHTS[normalized as keyof typeof CODEX_CONFIGURED_CAPACITY_WEIGHTS]
92
+ : undefined;
93
+ }
94
+
95
+ function normalizedPercent(value: unknown): number | undefined {
96
+ return typeof value === "number" && Number.isFinite(value)
97
+ ? Math.max(0, Math.min(100, value))
98
+ : undefined;
99
+ }
100
+
101
+ function futureResetMs(value: unknown, now: number): number | undefined {
102
+ if (typeof value !== "number" || !Number.isFinite(value)) return undefined;
103
+ const milliseconds = value > 10_000_000_000 ? value : value * 1000;
104
+ return milliseconds > now ? milliseconds : undefined;
105
+ }
106
+
107
+ function hasKnownQuotaWindow(quota: CodexCapacityQuota | null): quota is CodexCapacityQuota {
108
+ if (!quota) return false;
109
+ return normalizedPercent(quota.fiveHourPercent) !== undefined
110
+ || normalizedPercent(quota.weeklyPercent) !== undefined
111
+ || normalizedPercent(quota.monthlyPercent) !== undefined
112
+ || !!quota.customWindows?.some(window => normalizedPercent(window.percent) !== undefined);
113
+ }
114
+
115
+ function currentQuotaForDisplay(account: CodexCapacityAccount, now: number): CodexCapacityQuota | null {
116
+ const quota = account.quota;
117
+ const fresh = !!quota
118
+ && Number.isFinite(quota.updatedAt)
119
+ && now - quota.updatedAt <= CODEX_CAPACITY_MAX_QUOTA_AGE_MS;
120
+ return !account.paused && !account.needsReauth && fresh && hasKnownQuotaWindow(quota) ? quota : null;
121
+ }
122
+
123
+ function addWindow(
124
+ windows: Map<string, MutableWindow>,
125
+ key: string,
126
+ weight: number,
127
+ percent: number,
128
+ resetAt: number | undefined,
129
+ updatedAt: number,
130
+ ): void {
131
+ const window = windows.get(key) ?? {
132
+ totalWeight: 0,
133
+ consumedWeight: 0,
134
+ includedAccounts: 0,
135
+ recoveries: new Map<number, number>(),
136
+ oldestUpdatedAt: updatedAt,
137
+ };
138
+ const consumed = weight * percent / 100;
139
+ window.totalWeight += weight;
140
+ window.consumedWeight += consumed;
141
+ window.includedAccounts += 1;
142
+ window.oldestUpdatedAt = Math.min(window.oldestUpdatedAt, updatedAt);
143
+ if (resetAt !== undefined && consumed > 0) {
144
+ window.recoveries.set(resetAt, (window.recoveries.get(resetAt) ?? 0) + consumed);
145
+ }
146
+ windows.set(key, window);
147
+ }
148
+
149
+ function finalizeWindow(window: MutableWindow, totalAccounts: number): CodexCapacityWindowAggregation {
150
+ const nextRecoveryAt = [...window.recoveries.keys()].sort((a, b) => a - b)[0];
151
+ const recovered = nextRecoveryAt === undefined ? undefined : window.recoveries.get(nextRecoveryAt);
152
+ return {
153
+ usedPercent: window.consumedWeight / window.totalWeight * 100,
154
+ includedAccounts: window.includedAccounts,
155
+ excludedAccounts: totalAccounts - window.includedAccounts,
156
+ incomplete: window.includedAccounts < totalAccounts,
157
+ totalWeight: window.totalWeight,
158
+ consumedWeight: window.consumedWeight,
159
+ remainingWeight: window.totalWeight - window.consumedWeight,
160
+ updatedAt: window.oldestUpdatedAt,
161
+ ...(nextRecoveryAt !== undefined ? { nextRecoveryAt } : {}),
162
+ ...(recovered !== undefined ? { nextRecoveryPercent: recovered / window.totalWeight * 100 } : {}),
163
+ };
164
+ }
165
+
166
+ /** Display-only configured-weight estimate. It never participates in account selection or routing. */
167
+ export function aggregateCodexPoolCapacity(
168
+ accounts: readonly CodexCapacityAccount[],
169
+ now = Date.now(),
170
+ ): CodexCapacityResult {
171
+ const current = accounts.find(account => account.active)
172
+ ?? accounts.find(account => account.isMain)
173
+ ?? accounts[0];
174
+ const currentPlan = codexPlanValue(current?.plan);
175
+ const currentAccount = current ? {
176
+ isMain: current.isMain,
177
+ ...(currentPlan !== undefined ? { plan: currentPlan } : {}),
178
+ quota: currentQuotaForDisplay(current, now),
179
+ } : undefined;
180
+ const windows = new Map<string, MutableWindow>();
181
+ const included = new Set<CodexCapacityAccount>();
182
+ const contributions = new Map<CodexCapacityAccount, Set<string>>();
183
+ let unknownPlanAccounts = 0;
184
+ let missingQuotaAccounts = 0;
185
+ let pausedAccounts = 0;
186
+ let reauthAccounts = 0;
187
+ let staleQuotaAccounts = 0;
188
+
189
+ for (const account of accounts) {
190
+ const weight = configuredWeight(account.plan);
191
+ if (weight === undefined) unknownPlanAccounts += 1;
192
+ if (account.paused) pausedAccounts += 1;
193
+ if (account.needsReauth) reauthAccounts += 1;
194
+ const quota = account.quota;
195
+ const quotaFresh = !!quota
196
+ && Number.isFinite(quota.updatedAt)
197
+ && now - quota.updatedAt <= CODEX_CAPACITY_MAX_QUOTA_AGE_MS;
198
+ if (quota && !quotaFresh) staleQuotaAccounts += 1;
199
+ const standard = quota ? [
200
+ ["fiveHour", quota.fiveHourPercent, quota.fiveHourResetAt],
201
+ ["weekly", quota.weeklyPercent, quota.weeklyResetAt],
202
+ ["monthly", quota.monthlyPercent, quota.monthlyResetAt],
203
+ ] as const : [];
204
+ const custom = quota?.customWindows ?? [];
205
+ const hasQuota = hasKnownQuotaWindow(quota);
206
+ if (!hasQuota) missingQuotaAccounts += 1;
207
+ if (account.paused || account.needsReauth || weight === undefined || !quota || !hasQuota || !quotaFresh) continue;
208
+
209
+ let contributed = false;
210
+ const contributionKeys = new Set<string>();
211
+ for (const [key, rawPercent, rawReset] of standard) {
212
+ const percent = normalizedPercent(rawPercent);
213
+ if (percent === undefined) continue;
214
+ addWindow(windows, key, weight, percent, futureResetMs(rawReset, now), quota.updatedAt);
215
+ contributionKeys.add(key);
216
+ contributed = true;
217
+ }
218
+ for (const customWindow of custom) {
219
+ const percent = normalizedPercent(customWindow.percent);
220
+ if (percent === undefined) continue;
221
+ addWindow(windows, `custom:${customWindow.label}`, weight, percent, futureResetMs(customWindow.resetAt, now), quota.updatedAt);
222
+ contributionKeys.add(`custom:${customWindow.label}`);
223
+ contributed = true;
224
+ }
225
+ if (contributed) {
226
+ included.add(account);
227
+ contributions.set(account, contributionKeys);
228
+ }
229
+ }
230
+
231
+ if (windows.size === 0) {
232
+ if (accounts.length === 0) return { quota: null, aggregation: null, ...(currentAccount ? { currentAccount } : {}) };
233
+ const aggregation: CodexCapacityAggregation = {
234
+ kind: "capacity-weighted-v1",
235
+ scope: "routable-known",
236
+ includedAccounts: 0,
237
+ excludedAccounts: accounts.length,
238
+ unknownPlanAccounts,
239
+ missingQuotaAccounts,
240
+ pausedAccounts,
241
+ reauthAccounts,
242
+ staleQuotaAccounts,
243
+ partialWindowAccounts: 0,
244
+ incomplete: true,
245
+ ...(currentAccount ? { currentAccount } : {}),
246
+ };
247
+ return { quota: null, aggregation, ...(currentAccount ? { currentAccount } : {}) };
248
+ }
249
+ const fiveHour = windows.get("fiveHour") ? finalizeWindow(windows.get("fiveHour")!, accounts.length) : undefined;
250
+ const weekly = windows.get("weekly") ? finalizeWindow(windows.get("weekly")!, accounts.length) : undefined;
251
+ const monthly = windows.get("monthly") ? finalizeWindow(windows.get("monthly")!, accounts.length) : undefined;
252
+ const customWindows = [...windows.entries()].flatMap(([key, window]) => key.startsWith("custom:")
253
+ ? [{ label: key.slice("custom:".length), ...finalizeWindow(window, accounts.length) }]
254
+ : []);
255
+ const quota: CodexCapacityQuota = {
256
+ ...(fiveHour ? { fiveHourPercent: fiveHour.usedPercent } : {}),
257
+ ...(weekly ? { weeklyPercent: weekly.usedPercent } : {}),
258
+ ...(monthly ? { monthlyPercent: monthly.usedPercent } : {}),
259
+ ...(customWindows.length > 0 ? {
260
+ customWindows: customWindows.map(window => ({ label: window.label, percent: window.usedPercent })),
261
+ } : {}),
262
+ updatedAt: Math.min(
263
+ ...[fiveHour, weekly, monthly, ...customWindows]
264
+ .flatMap(window => window ? [window.updatedAt] : []),
265
+ ),
266
+ };
267
+ const visibleWindowKeys = [...windows.keys()];
268
+ const partialWindowAccounts = accounts.filter(account => {
269
+ const keys = contributions.get(account);
270
+ return !!keys && visibleWindowKeys.some(key => !keys.has(key));
271
+ }).length;
272
+ const excludedAccounts = accounts.length - included.size;
273
+ const aggregation: CodexCapacityAggregation = {
274
+ kind: "capacity-weighted-v1",
275
+ scope: "routable-known",
276
+ includedAccounts: included.size,
277
+ excludedAccounts,
278
+ unknownPlanAccounts,
279
+ missingQuotaAccounts,
280
+ pausedAccounts,
281
+ reauthAccounts,
282
+ staleQuotaAccounts,
283
+ partialWindowAccounts,
284
+ incomplete: excludedAccounts > 0 || partialWindowAccounts > 0,
285
+ ...(fiveHour ? { fiveHour } : {}),
286
+ ...(weekly ? { weekly } : {}),
287
+ ...(monthly ? { monthly } : {}),
288
+ ...(customWindows.length > 0 ? { customWindows } : {}),
289
+ ...(currentAccount ? { currentAccount } : {}),
290
+ };
291
+ return { quota, aggregation, ...(currentAccount ? { currentAccount } : {}) };
292
+ }
@@ -0,0 +1,144 @@
1
+ import { readBoundedResponseBody } from "../lib/bounded-body";
2
+
3
+ const COMMAND_CODE_MODEL_EFFORTS = {
4
+ "deepseek/deepseek-v4-pro": {
5
+ efforts: ["high", "max"],
6
+ profileUrl: "https://commandcode.ai/models/deepseek-v4-pro",
7
+ },
8
+ "deepseek/deepseek-v4-flash": {
9
+ efforts: ["high", "max"],
10
+ profileUrl: "https://commandcode.ai/models/deepseek-v4-flash",
11
+ },
12
+ // Ox Alpha (stealth preview, added in Command Code v1.31.0): free 1M-context
13
+ // reasoning model on every plan. The profile does not publish an effort ladder,
14
+ // so mirror the OpenRouter contract (reasoning mandatory; max/high/low).
15
+ "stealth/ox-alpha": {
16
+ efforts: ["low", "high", "max"],
17
+ profileUrl: "https://commandcode.ai/models/ox-alpha",
18
+ },
19
+ // Keys must match the EXACT upstream /provider/v1/models ids (GLM ships as
20
+ // `zai-org/GLM-5.3`, not `zai-org/glm-5.3`). The table doubles as the router's
21
+ // known-ids decode source (via `knownModelIdsForProvider`), so a case mismatch
22
+ // makes the Codex-facing slug `commandcode/zai-org-GLM-5.3` pass through
23
+ // undecoded and upstream rejects it with `unsupported_model`.
24
+ "zai-org/GLM-5": {
25
+ efforts: ["high", "max"],
26
+ profileUrl: "https://commandcode.ai/models/glm-5",
27
+ },
28
+ "zai-org/GLM-5.1": {
29
+ efforts: ["high", "max"],
30
+ profileUrl: "https://commandcode.ai/models/glm-5-1",
31
+ },
32
+ "zai-org/GLM-5.2": {
33
+ efforts: ["high", "max"],
34
+ profileUrl: "https://commandcode.ai/models/glm-5-2",
35
+ },
36
+ "zai-org/GLM-5.2-Fast": {
37
+ efforts: ["high", "max"],
38
+ profileUrl: "https://commandcode.ai/models/glm-5-2-fast",
39
+ },
40
+ "zai-org/GLM-5.3": {
41
+ efforts: ["low", "high", "max"],
42
+ profileUrl: "https://commandcode.ai/models/glm-5-3",
43
+ },
44
+ // Muse Spark: CLI currently prints "has no adjustable reasoning effort" and
45
+ // blocks --effort locally, but the upstream /alpha/generate endpoint accepts
46
+ // reasoning_effort low..max for meta/muse-spark-1.2-contributor (verified
47
+ // 2026-08-13: direct upstream POST with low/medium/high/xhigh/max all 200,
48
+ // ultra 400; reasoningTokens differentiated 114..253; proxy previously stripped
49
+ // the field so effort changes had no effect).
50
+ "meta/muse-spark-1.2": {
51
+ efforts: ["low", "medium", "high", "xhigh", "max"],
52
+ profileUrl: "https://commandcode.ai/models/meta-muse-spark-1.2",
53
+ },
54
+ "meta/muse-spark-1.2-contributor": {
55
+ efforts: ["low", "medium", "high", "xhigh", "max"],
56
+ profileUrl: "https://commandcode.ai/models/meta-muse-spark-1.2-contributor",
57
+ },
58
+ "meta/muse-spark-1.1": {
59
+ efforts: ["low", "medium", "high", "xhigh", "max"],
60
+ profileUrl: "https://commandcode.ai/models/meta-muse-spark-1.1",
61
+ },
62
+ } as const;
63
+
64
+ /**
65
+ * Official Command Code model-profile facts, not a model catalog. Models remain
66
+ * account-scoped and come exclusively from the authenticated /provider/v1/models endpoint.
67
+ */
68
+ export const COMMAND_CODE_MODEL_REASONING_EFFORTS: Record<string, string[]> = Object.fromEntries(
69
+ Object.entries(COMMAND_CODE_MODEL_EFFORTS).map(([id, row]) => [id, [...row.efforts]]),
70
+ );
71
+
72
+ const refreshedEfforts = new Map<string, string[]>();
73
+
74
+ function keyFor(modelId: string): string {
75
+ return modelId.trim().toLowerCase();
76
+ }
77
+
78
+ export function commandCodeReasoningEfforts(modelId: string): readonly string[] | undefined {
79
+ const key = keyFor(modelId);
80
+ const refreshed = refreshedEfforts.get(key);
81
+ if (refreshed !== undefined) return refreshed;
82
+ // Case-insensitive: the table keys match the EXACT upstream ids (e.g. `zai-org/GLM-5.3`),
83
+ // but callers may pass either case.
84
+ for (const [id, efforts] of Object.entries(COMMAND_CODE_MODEL_REASONING_EFFORTS)) {
85
+ if (keyFor(id) === key) return efforts;
86
+ }
87
+ return undefined;
88
+ }
89
+
90
+ function parsedProfileEfforts(page: string): string[] | undefined {
91
+ const match = page.match(/Reasoning efforts\s+([^.;]+?)\s+are supported;\s*([^.]*)/i);
92
+ if (!match) return undefined;
93
+ const listed = match[1]!.toLowerCase().match(/\b(?:low|medium|high|xhigh|max)\b/g) ?? [];
94
+ const mapped = match[2]!.toLowerCase().match(/\b(?:low|medium|high|xhigh|max)\s+maps to\s+(?:low|medium|high|xhigh|max)\b/g) ?? [];
95
+ const normalized = new Set(listed);
96
+ for (const mapping of mapped) {
97
+ const [, source, target] = mapping.match(/(low|medium|high|xhigh|max)\s+maps to\s+(low|medium|high|xhigh|max)/) ?? [];
98
+ if (source && target) {
99
+ normalized.delete(source);
100
+ normalized.add(target);
101
+ }
102
+ }
103
+ return normalized.size > 0 ? [...normalized] : [];
104
+ }
105
+
106
+ /**
107
+ * Refresh one stale effort record only after the upstream rejects an effort request.
108
+ * A failed or unparseable public profile deliberately leaves the known table unchanged.
109
+ */
110
+ export async function refreshCommandCodeReasoningEfforts(
111
+ modelId: string,
112
+ fetchFn: typeof globalThis.fetch = globalThis.fetch,
113
+ ): Promise<readonly string[] | undefined> {
114
+ const key = keyFor(modelId);
115
+ let profile: { efforts: readonly string[]; profileUrl: string } | undefined;
116
+ for (const [id, row] of Object.entries(COMMAND_CODE_MODEL_EFFORTS)) {
117
+ if (keyFor(id) === key) {
118
+ profile = row;
119
+ break;
120
+ }
121
+ }
122
+ if (!profile) return undefined;
123
+ try {
124
+ const response = await fetchFn(profile.profileUrl, {
125
+ headers: { Accept: "text/html" },
126
+ signal: AbortSignal.timeout(10_000),
127
+ });
128
+ if (!response.ok) return undefined;
129
+ // Bound the profile page before parsing: a large or malformed page must not
130
+ // allocate unbounded memory on the request path.
131
+ const observed = await readBoundedResponseBody(response, { maxBytes: 256 * 1024 });
132
+ if (!observed.displaySafe) return undefined;
133
+ const efforts = parsedProfileEfforts(observed.text);
134
+ if (efforts === undefined) return undefined;
135
+ refreshedEfforts.set(key, efforts);
136
+ return efforts;
137
+ } catch {
138
+ return undefined;
139
+ }
140
+ }
141
+
142
+ export function resetCommandCodeReasoningEffortsForTest(): void {
143
+ refreshedEfforts.clear();
144
+ }
@@ -27,25 +27,42 @@ export function applyProviderContextCap(contextWindow: number | undefined, cap:
27
27
  return contextWindow > cap ? cap : contextWindow;
28
28
  }
29
29
 
30
+ /**
31
+ * 上游没报窗口时,已开启的 Context cap 就是实际窗口。
32
+ * 128k 只是 Codex 解析器的兼容底线,不能当成“已发现窗口”再拿去和 cap 做 min。
33
+ */
34
+ export function resolveUnknownRoutedContextWindow(cap: number | undefined): number {
35
+ const window = isValidContextCap(cap) ? Math.floor(cap) : 0;
36
+ return window > 0 ? window : 128_000;
37
+ }
38
+
30
39
  /** Effective global cap value: explicit config value, else the built-in default. */
31
40
  export function globalContextCapValue(config: Pick<OcxConfig, "contextCapValue">): number {
32
41
  const value = config.contextCapValue;
33
42
  return isValidContextCap(value) ? Math.floor(value) : DEFAULT_PROVIDER_CONTEXT_CAP;
34
43
  }
35
44
 
36
- export function setProviderContextCap(config: OcxConfig, provider: string, enabled: boolean): void {
45
+ export function setProviderContextCap(config: OcxConfig, provider: string, enabled: boolean, value?: number): void {
37
46
  const next = providerContextCaps(config);
38
- if (enabled) next[provider] = globalContextCapValue(config);
39
- else delete next[provider];
47
+ if (enabled) {
48
+ next[provider] = isValidContextCap(value) ? Math.floor(value) : globalContextCapValue(config);
49
+ } else {
50
+ delete next[provider];
51
+ }
40
52
  if (Object.keys(next).length > 0) config.providerContextCaps = next;
41
53
  else delete config.providerContextCaps;
42
54
  }
43
55
 
44
- /** Set the global cap value and re-point every already-enabled provider to it. */
45
- export function setGlobalContextCapValue(config: OcxConfig, value: number): void {
56
+ /**
57
+ * Set the global cap value (the default used by per-provider toggles and "set all").
58
+ * Re-points every already-enabled provider only when `applyToAll` is true (the dashboard's
59
+ * "apply to every routed provider" toggle); otherwise each provider keeps its own cap value.
60
+ */
61
+ export function setGlobalContextCapValue(config: OcxConfig, value: number, applyToAll: boolean): void {
46
62
  if (!isValidContextCap(value)) return;
47
63
  const next = Math.floor(value);
48
64
  config.contextCapValue = next;
65
+ if (!applyToAll) return;
49
66
  const caps = providerContextCaps(config);
50
67
  for (const provider of Object.keys(caps)) caps[provider] = next;
51
68
  if (Object.keys(caps).length > 0) config.providerContextCaps = caps;
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Weighted credential routing for Cursor accounts.
3
+ *
4
+ * Transfer from yelixir-dev/cursor-ai-proxy-bridge credentials.ts:
5
+ * weighted round-robin selection with per-credential auth-failure cooldown
6
+ * and one-retry failover on a different account before surfacing the error.
7
+ *
8
+ * OpenCodex already has JWT-based multi-account identification (src/oauth/cursor.ts)
9
+ * and Anthropic-specific 429 rotation; this module adds Cursor-aware weighted
10
+ * routing on top of those primitives.
11
+ */
12
+
13
+ export interface CursorCredential {
14
+ readonly id: string;
15
+ weight: number;
16
+ }
17
+
18
+ interface CredentialState {
19
+ readonly credential: CursorCredential;
20
+ currentWeight: number;
21
+ disabledUntil: number;
22
+ }
23
+
24
+ export class NoAvailableCursorCredentialError extends Error {
25
+ constructor(message = "No available Cursor credentials") { super(message); }
26
+ }
27
+
28
+ export class CursorCredentialRouter {
29
+ private states: CredentialState[] = [];
30
+ private readonly cooldownMs: number;
31
+
32
+ constructor(credentials: ReadonlyArray<CursorCredential>, cooldownMs = 300_000) {
33
+ this.cooldownMs = cooldownMs;
34
+ this.replace(credentials);
35
+ }
36
+
37
+ replace(credentials: ReadonlyArray<CursorCredential>): void {
38
+ this.states = credentials.map(c => ({
39
+ credential: { ...c, weight: Math.max(1, c.weight || 1) },
40
+ currentWeight: 0,
41
+ disabledUntil: 0,
42
+ }));
43
+ }
44
+
45
+ pick(excludeIds: ReadonlySet<string> = new Set()): CursorCredential {
46
+ const now = Date.now();
47
+ const candidates = this.states.filter(s =>
48
+ !excludeIds.has(s.credential.id) && s.disabledUntil <= now,
49
+ );
50
+ if (candidates.length === 0) throw new NoAvailableCursorCredentialError();
51
+ let selected: CredentialState | undefined;
52
+ let totalWeight = 0;
53
+ for (const state of candidates) {
54
+ state.currentWeight += state.credential.weight;
55
+ totalWeight += state.credential.weight;
56
+ if (!selected || state.currentWeight > selected.currentWeight) selected = state;
57
+ }
58
+ if (!selected) throw new NoAvailableCursorCredentialError();
59
+ selected.currentWeight -= totalWeight;
60
+ return { ...selected.credential };
61
+ }
62
+
63
+ disable(id: string): void {
64
+ const state = this.states.find(s => s.credential.id === id);
65
+ if (state) state.disabledUntil = Date.now() + this.cooldownMs;
66
+ }
67
+
68
+ get snapshot(): ReadonlyArray<{ id: string; disabled: boolean }> {
69
+ const now = Date.now();
70
+ return this.states.map(s => ({ id: s.credential.id, disabled: s.disabledUntil > now }));
71
+ }
72
+ }