@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,384 @@
1
+ import type { KiroOAuthMetadata } from "../oauth/types";
2
+ import type { OcxTool, OcxToolChoice } from "./tools";
3
+ import type { TierDecision, TierObservationContext } from "./provider";
4
+
5
+ /** Exact provider/credential namespace for process-local reasoning replay. */
6
+ export interface OcxReasoningReplayIdentity {
7
+ providerName: string;
8
+ /** Opaque process-local digest of the exact upstream destination. */
9
+ providerDestinationIdentity: string;
10
+ /**
11
+ * The same destination, digested WITHOUT the process-local random key, so it can key a
12
+ * durable store. Absent when no base URL was resolvable.
13
+ */
14
+ providerDestinationDurableIdentity?: string;
15
+ adapterName: string;
16
+ modelId: string;
17
+ /** Opaque process-local credential identity; never a raw token or API key. */
18
+ credentialIdentity: string;
19
+ /**
20
+ * Salted-HMAC credential identity that survives restarts, for the durable
21
+ * thought-signature store (#1926). Absent when no durable identity could be
22
+ * derived — the durable store then refuses to key the entry (fail closed).
23
+ */
24
+ credentialDurableIdentity?: string;
25
+ }
26
+
27
+ /**
28
+ * Stable holder shared by parsed-request copies and already-created bridges.
29
+ * Credential/provider rotation replaces `current` atomically without replacing
30
+ * the holder, so late tool-call cache writes see the active physical identity.
31
+ */
32
+ export interface OcxReasoningReplayScopeRef {
33
+ readonly clientThreadId: string;
34
+ current?: Readonly<OcxReasoningReplayIdentity>;
35
+ }
36
+
37
+ export interface OcxParsedRequest {
38
+ modelId: string;
39
+ /** Client-facing model selector retained for Anthropic routes after wire-model normalization. */
40
+ _responseModelId?: string;
41
+ /** Selected OpenAI API virtual-model id retained after it rewrites the upstream wire model. */
42
+ _openAiVirtualSelectedModelId?: string;
43
+ previousResponseId?: string;
44
+ context: OcxContext;
45
+ stream: boolean;
46
+ options: OcxRequestOptions;
47
+ _rawBody?: unknown;
48
+ /**
49
+ * Boundary between replayed history and this turn's newly appended input. Usually the
50
+ * items the proxy restored from local previous_response_id state; also set when the
51
+ * CLIENT already carried that history verbatim and the proxy skipped the prepend.
52
+ */
53
+ _replayPrefixLen?: number;
54
+ /** Parsed-message index before the first conversational item in a continuation's current delta. */
55
+ _continuationConversationMessageIndex?: number;
56
+ /**
57
+ * True when the full history for a previous_response_id request is present in the input —
58
+ * whether the proxy expanded it or the client already sent it. Consumers read this as
59
+ * "this request is self-contained", never as "the proxy mutated it".
60
+ */
61
+ _previousResponseInputExpanded?: boolean;
62
+ /** Provider-private stable Cursor conversation id resolved from the Responses previous_response_id chain. */
63
+ _cursorConversationId?: string;
64
+ /** Stable upstream client thread identity, used only to derive provider-scoped continuation ids. */
65
+ _clientThreadId?: string;
66
+ /** Provider/account/model-bound namespace for process-local raw-reasoning replay. */
67
+ _reasoningReplayScope?: OcxReasoningReplayScopeRef;
68
+ /**
69
+ * Set by bindRouteReasoningReplayScope after a proven serving-identity change, or by
70
+ * prepareOpaqueBlobRecovery after an authoritative rejection; consumers strip replayed blobs.
71
+ */
72
+ _stripReasoningEncryptedContent?: boolean;
73
+ /**
74
+ * Optional authenticated tenant/operator namespace for Cursor thread→conversation derivation.
75
+ * When absent (single-operator local proxy), derivation stays local-scoped.
76
+ */
77
+ _cursorIdentityScope?: string;
78
+ /**
79
+ * True for helper/shadow/compaction turns that must not append into the main Cursor conversation
80
+ * derived from the parent thread id.
81
+ */
82
+ _cursorIsolateConversation?: boolean;
83
+ /** Account-scoped, non-secret Kiro request metadata selected with the OAuth access token. */
84
+ _kiroAuthContext?: Pick<KiroOAuthMetadata, "profileArn" | "apiRegion" | "ssoRegion">;
85
+ /** Provider-private continuation metadata resolved from the Responses previous_response_id chain. */
86
+ _providerContinuation?: OcxProviderContinuationState;
87
+ /** Persisted continuation considered only after the final physical route is known. */
88
+ _providerContinuationCandidate?: OcxProviderContinuationState;
89
+ /** Exact process-local route owner attached to newly persisted provider state. */
90
+ _providerContinuationOwner?: OcxProviderContinuationOwner;
91
+ /**
92
+ * The hosted `{type:"web_search", ...}` tool config, stashed when Codex enables web search. Routed
93
+ * (non-OpenAI) providers can't run it server-side, so the proxy re-exposes it as a function tool and
94
+ * executes searches via the gpt-5.4-mini sidecar (see src/web-search). Absent when not requested.
95
+ */
96
+ _webSearch?: Record<string, unknown>;
97
+ /** Hosted image_generation tool config stashed for the image bridge sidecar (see src/images). */
98
+ _imageGeneration?: { toolNames: Set<string>; originalTool?: Record<string, unknown> };
99
+ /**
100
+ * True when Codex requested structured output (`text.format` = json_schema/json_object). The
101
+ * web-search tool_result is then rendered as compact JSON instead of markdown prose, so its
102
+ * answer/"Sources:" text can't bleed into and corrupt the model's schema-constrained output.
103
+ */
104
+ _structuredOutput?: boolean;
105
+ /**
106
+ * True when the input carried `{type:"compaction_trigger"}` — Codex remote compaction v2 asking
107
+ * this turn to produce a `{type:"compaction"}` output item. Routed adapters can't natively;
108
+ * the server runs the model as a summarizer and the bridge emits a synthetic compaction item
109
+ * (see src/responses/compaction.ts).
110
+ */
111
+ _compactionRequest?: boolean;
112
+ /**
113
+ * True when the current request newly introduced a stored compaction summary/marker. Historical
114
+ * markers restored by previous_response_id expansion were already acknowledged and do not reset
115
+ * provider-private continuation caches again on every later turn.
116
+ */
117
+ _contextCompactionBoundary?: boolean;
118
+ }
119
+
120
+ export interface OcxContext {
121
+ systemPrompt?: string[];
122
+ messages: OcxMessage[];
123
+ tools?: OcxTool[];
124
+ }
125
+
126
+ export type OcxMessage =
127
+ | OcxUserMessage
128
+ | OcxAssistantMessage
129
+ | OcxDeveloperMessage
130
+ | OcxToolResultMessage;
131
+
132
+ export interface OcxUserMessage {
133
+ role: "user";
134
+ content: string | OcxContentPart[];
135
+ timestamp: number;
136
+ }
137
+
138
+ export interface OcxAssistantMessage {
139
+ role: "assistant";
140
+ content: OcxAssistantContentPart[];
141
+ /** Responses message phase, preserved when replaying translated provider output. */
142
+ phase?: OcxMessagePhase;
143
+ model?: string;
144
+ timestamp: number;
145
+ /**
146
+ * Kiro `reasoningContent.redactedContent` for THIS assistant turn — an opaque encrypted blob
147
+ * Kiro replays to preserve model reasoning across turns. Provider-specific and unrenderable, so
148
+ * it rides the message rather than a content part: any other adapter simply ignores it.
149
+ */
150
+ kiroRedactedReasoning?: string;
151
+ }
152
+
153
+ export interface OcxDeveloperMessage {
154
+ role: "developer";
155
+ content: string | OcxContentPart[];
156
+ timestamp: number;
157
+ }
158
+
159
+ export interface OcxToolResultMessage {
160
+ role: "toolResult";
161
+ toolCallId: string;
162
+ toolName: string;
163
+ /** MCP namespace from the originating tool call, if any. */
164
+ toolNamespace?: string;
165
+ /** Text, or content parts when a tool (e.g. Codex view_image) returns an image in its output. */
166
+ content: string | OcxContentPart[];
167
+ /** True when the Responses result contained opaque encrypted output Kiro cannot translate. */
168
+ containsEncryptedContent?: boolean;
169
+ isError: boolean;
170
+ timestamp: number;
171
+ }
172
+
173
+ export interface OcxTextContent {
174
+ type: "text";
175
+ text: string;
176
+ }
177
+
178
+ export interface OcxImageContent {
179
+ type: "image";
180
+ /** A `data:` URL (base64) or a remote https URL — passed through from Codex verbatim, NEVER inlined as text. */
181
+ imageUrl: string;
182
+ /** Fidelity hint from Codex: "low" | "high" | "auto". */
183
+ detail?: string;
184
+ }
185
+
186
+ /** A user/developer message content part: text or an image (vision). */
187
+ export type OcxContentPart = OcxTextContent | OcxImageContent;
188
+
189
+ export interface OcxThinkingContent {
190
+ type: "thinking";
191
+ thinking: string;
192
+ signature?: string;
193
+ itemId?: string;
194
+ /** Raw Anthropic redacted_thinking block payloads to replay verbatim (order preserved). */
195
+ redacted?: string[];
196
+ }
197
+
198
+ export interface OcxToolCall {
199
+ type: "toolCall";
200
+ id: string;
201
+ name: string;
202
+ arguments: Record<string, unknown>;
203
+ customWireName?: string;
204
+ thoughtSignature?: string;
205
+ /**
206
+ * Provider-issued opaque metadata that must survive the whole round trip unchanged
207
+ * (issue #1735). A signed Gemini part is only valid when its signature comes back on the
208
+ * SAME part it was issued for, so this travels with the individual tool call rather than
209
+ * being matched by name/arguments after the fact.
210
+ */
211
+ providerMetadata?: OcxProviderOpaqueToolCallMetadata;
212
+ /** MCP namespace (e.g. "mcp__context7") when this call targets a namespaced tool. */
213
+ namespace?: string;
214
+ }
215
+
216
+ /**
217
+ * Opaque, provider-scoped tool-call metadata. Values are never parsed, merged, re-encoded, or
218
+ * synthesized — they are carried verbatim or not at all.
219
+ */
220
+ export interface OcxProviderOpaqueToolCallMetadata {
221
+ google?: {
222
+ thoughtSignature?: string;
223
+ };
224
+ }
225
+
226
+ export type OcxAssistantContentPart = OcxTextContent | OcxThinkingContent | OcxToolCall;
227
+ export interface OcxRequestOptions {
228
+ maxOutputTokens?: number;
229
+ temperature?: number;
230
+ topP?: number;
231
+ stopSequences?: string[];
232
+ toolChoice?: OcxToolChoice;
233
+ parallelToolCalls?: boolean;
234
+ reasoning?: string;
235
+ hideThinkingSummary?: boolean;
236
+ serviceTier?: string;
237
+ /** Final outbound tier action, resolved after the provider/model wire is settled. */
238
+ tierDecision?: TierDecision;
239
+ /** Internal B0 observation inputs; adapters combine these with the wire they actually serialize. */
240
+ tierObservation?: TierObservationContext;
241
+ presencePenalty?: number;
242
+ frequencyPenalty?: number;
243
+ /** Responses prompt-cache affinity key. Passthrough preserves it via _rawBody; routed adapters do not consume it unless their upstream wire supports it. */
244
+ promptCacheKey?: string;
245
+ /**
246
+ * Responses `text.format` (json_schema / json_object), preserved for adapters whose
247
+ * upstream wire has an equivalent. The openai-chat adapter re-nests it as chat
248
+ * `response_format`, the exact inverse of responseFormatToText in src/chat/inbound.ts.
249
+ * The native passthrough ignores it (it forwards `_rawBody.text` verbatim) and Kiro
250
+ * keeps rejecting structured output via `_structuredOutput`.
251
+ */
252
+ textFormat?: {
253
+ type: "json_schema" | "json_object";
254
+ name?: string;
255
+ description?: string;
256
+ schema?: Record<string, unknown>;
257
+ strict?: boolean;
258
+ };
259
+ }
260
+
261
+ export type OcxMessagePhase = "commentary" | "final_answer";
262
+
263
+ /** Non-secret, process-local owner fence for provider-private continuation state. */
264
+ export interface OcxProviderContinuationOwner {
265
+ [field: string]: string | number;
266
+ version: 1;
267
+ providerName: string;
268
+ providerDestinationIdentity: string;
269
+ adapterName: string;
270
+ modelId: string;
271
+ credentialIdentity: string;
272
+ }
273
+
274
+ /**
275
+ * Provider-private state that must follow a locally expanded `previous_response_id` chain.
276
+ * Kept out of public Responses output and persisted only in the bounded local continuation cache.
277
+ */
278
+ export interface OcxProviderContinuationState {
279
+ /** Proxy-authored owner metadata; stripped before provider adapters receive the state. */
280
+ __ocxOwner?: OcxProviderContinuationOwner;
281
+ cursor?: {
282
+ [field: string]: unknown;
283
+ conversationId?: string;
284
+ checkpointUsable?: boolean;
285
+ /** Opaque process-local Cursor ConversationStateStructure snapshot ref. Never raw protobuf. */
286
+ checkpointRef?: string;
287
+ };
288
+ kiro?: {
289
+ [field: string]: unknown;
290
+ conversationId?: string;
291
+ };
292
+ [provider: string]: Record<string, unknown> | undefined;
293
+ }
294
+
295
+ export type AdapterEvent =
296
+ | { type: "heartbeat" }
297
+ | { type: "text_delta"; text: string; phase?: OcxMessagePhase }
298
+ | { type: "thinking_delta"; thinking: string }
299
+ // Anthropic extended-thinking round-trip: signature_delta for the current thinking block, and
300
+ // opaque redacted_thinking blocks. Both must be replayed verbatim or tool-use turns 400.
301
+ | { type: "thinking_signature"; signature: string }
302
+ | { type: "redacted_thinking"; data: string }
303
+ // Kiro reasoning round-trip: the encrypted `redactedContent` blob for the CURRENT assistant turn.
304
+ // Never rendered — it only rides the reasoning item's envelope so the next request can replay it.
305
+ | { type: "kiro_redacted_reasoning"; data: string }
306
+ | { type: "reasoning_raw_delta"; text: string }
307
+ | { type: "tool_call_start"; id: string; name: string; providerMetadata?: OcxProviderOpaqueToolCallMetadata }
308
+ | { type: "tool_call_delta"; arguments: string }
309
+ | { type: "tool_call_end" }
310
+ /** Internal boundary between a guarded first pass and its one-shot continuation. */
311
+ | { type: "assistant_boundary" }
312
+ // Native web-search activity surfaced by the web-search sidecar so Codex renders a "Searched the
313
+ // web" cell. Emitted as a lifecycle PAIR at real wall-clock moments by src/web-search/loop.ts
314
+ // (routed adapters never emit these): `begin` right before the sidecar runs so Codex shows the
315
+ // "Searching the web" spinner, then `end` once it resolves. The bridge maps begin → an
316
+ // output_item.added(in_progress) and end → the matching output_item.done(completed|failed) under
317
+ // the SAME output index, so the activity animates instead of flashing completed instantly.
318
+ | { type: "web_search_call_begin"; id: string }
319
+ | { type: "web_search_call_end"; id: string; queries: string[]; status?: "completed" | "failed"; sources?: OcxUrlCitation[] }
320
+ | {
321
+ type: "done";
322
+ usage?: OcxUsage;
323
+ stopReason?: string;
324
+ endTurn?: boolean;
325
+ providerState?: OcxProviderContinuationState;
326
+ }
327
+ | {
328
+ type: "incomplete";
329
+ reason: string;
330
+ message?: string;
331
+ usage?: OcxUsage;
332
+ retryable?: boolean;
333
+ endTurn?: boolean;
334
+ providerState?: OcxProviderContinuationState;
335
+ }
336
+ // `usage` carries best-effort partial consumption when a turn dies before a clean done
337
+ // (e.g. cursor upstream 502 mid-stream), so failed requests can log real token counts.
338
+ | {
339
+ type: "error";
340
+ message: string;
341
+ usage?: OcxUsage;
342
+ /** Authoritative upstream/proxy status when known; avoids message-based classification. */
343
+ status?: number;
344
+ /** Responses error type and code when the adapter has a structured provider failure. */
345
+ errorType?: string;
346
+ code?: string;
347
+ retryable?: boolean;
348
+ };
349
+
350
+ /**
351
+ * A web source backing a search answer. Surfaced on the search-end event and rendered by the bridge
352
+ * as a `url_citation` annotation on the following assistant message (the desktop app's Sources chip
353
+ * reads these; the TUI ignores annotations, so this is additive).
354
+ */
355
+ export interface OcxUrlCitation {
356
+ url: string;
357
+ title?: string;
358
+ }
359
+
360
+ /**
361
+ * Canonical usage convention (devlog/260711_claude_inbound/070):
362
+ * - `inputTokens` is the TOTAL prompt size, INCLUDING cache reads and cache writes
363
+ * (OpenAI Responses convention). Anthropic parse sites normalize into this shape.
364
+ * - `cachedInputTokens` is cache READ tokens only (a subset of `inputTokens`).
365
+ * - `cacheReadInputTokens`/`cacheCreationInputTokens` carry the read/write split when
366
+ * the provider reports both; reads mirror `cachedInputTokens`.
367
+ * - `totalTokens` = inputTokens + outputTokens. Never re-add cache detail on top.
368
+ */
369
+ export interface OcxUsage {
370
+ inputTokens: number;
371
+ outputTokens: number;
372
+ /**
373
+ * Absolute active-context size after the response. Stateful providers can expose this separately
374
+ * from their per-attempt usage. Responses serialization derives the input side from
375
+ * `contextTotalTokens - outputTokens` so output is never added to an absolute checkpoint twice.
376
+ */
377
+ contextTotalTokens?: number;
378
+ totalTokens?: number;
379
+ cachedInputTokens?: number;
380
+ cacheReadInputTokens?: number;
381
+ cacheCreationInputTokens?: number;
382
+ reasoningOutputTokens?: number;
383
+ estimated?: boolean;
384
+ }
@@ -0,0 +1,131 @@
1
+ export interface OcxTool {
2
+ name: string;
3
+ description: string;
4
+ parameters: Record<string, unknown>;
5
+ strict?: boolean;
6
+ /** MCP namespace (e.g. "mcp__context7") for tools flattened out of a Responses "namespace" tool. */
7
+ namespace?: string;
8
+ /** Freeform/custom tool (e.g. apply_patch): the model's call must be relayed as a custom_tool_call. */
9
+ freeform?: boolean;
10
+ /** Client-executed tool discovery (tool_search): the model's call must be relayed as a tool_search_call. */
11
+ toolSearch?: boolean;
12
+ /** Tool definition restored from a prior tool_search output; transports may prioritize it when catalogs are bounded. */
13
+ loadedFromToolSearch?: boolean;
14
+ /** Cursor-only synthetic exact-match edit tool; never inferred from the wire name. */
15
+ cursorStructuredEdit?: true;
16
+ /** Synthetic web_search tool: the model's call is executed by the gpt-5.4-mini sidecar, not relayed to Codex. */
17
+ webSearch?: boolean;
18
+ /** Synthetic image_gen tool: the model's call is executed by the xAI image bridge sidecar, not relayed to Codex. */
19
+ imageGeneration?: boolean;
20
+ /** Synthetic video_gen tool: executed by the xAI video bridge sidecar. */
21
+ videoGeneration?: boolean;
22
+ }
23
+
24
+ /**
25
+ * Wire name a chat model sees for a tool. Namespaced (MCP) tools are flattened to
26
+ * "<namespace>__<name>" so they survive the chat-completions function-tool format;
27
+ * the proxy maps this back to {namespace, name} on the return trip (Codex routes MCP
28
+ * calls by an explicit `namespace` field, not by parsing the name).
29
+ */
30
+ export function namespacedToolName(namespace: string | undefined, name: string): string {
31
+ return namespace ? `${namespace}__${name}` : name;
32
+ }
33
+
34
+ export function toolChoiceAliases(tool: Pick<OcxTool, "namespace" | "name">): string[] {
35
+ const wireName = namespacedToolName(tool.namespace, tool.name);
36
+ return tool.namespace ? [wireName, `${tool.namespace}.${tool.name}`] : [wireName];
37
+ }
38
+
39
+ function sameToolIdentity(
40
+ left: Pick<OcxTool, "namespace" | "name">,
41
+ right: Pick<OcxTool, "namespace" | "name">,
42
+ ): boolean {
43
+ return left.namespace === right.namespace && left.name === right.name;
44
+ }
45
+
46
+ /**
47
+ * All tools that could be selected by one client-facing name. Bare logical names are included
48
+ * here because they are a compatibility selector for namespaced tools, while wire and dotted
49
+ * aliases come from `toolChoiceAliases`. A selector with more than one candidate is invalid.
50
+ */
51
+ export function toolChoiceCandidates(
52
+ tools: readonly Pick<OcxTool, "namespace" | "name">[] | undefined,
53
+ name: string,
54
+ ): Pick<OcxTool, "namespace" | "name">[] {
55
+ if (!tools) return [];
56
+ const candidates: Pick<OcxTool, "namespace" | "name">[] = [];
57
+ for (const tool of tools) {
58
+ if (tool.name !== name && !toolChoiceAliases(tool).includes(name)) continue;
59
+ if (!candidates.some(candidate => sameToolIdentity(candidate, tool))) candidates.push(tool);
60
+ }
61
+ return candidates;
62
+ }
63
+
64
+ /**
65
+ * Newer Codex clients can select a tool nested in a namespace by its bare name. Resolve that
66
+ * shorthand only when the request contains one tool with the logical name, so an ambiguous name
67
+ * cannot authorize a tool from an unintended namespace.
68
+ */
69
+ export function toolAllowedByChoice(
70
+ tool: Pick<OcxTool, "namespace" | "name">,
71
+ allowedTools: ReadonlySet<string>,
72
+ tools?: readonly Pick<OcxTool, "namespace" | "name">[],
73
+ ): boolean {
74
+ if (!tools) return toolChoiceAliases(tool).some(name => allowedTools.has(name));
75
+ for (const name of [...toolChoiceAliases(tool), tool.name]) {
76
+ if (!allowedTools.has(name)) continue;
77
+ const candidates = toolChoiceCandidates(tools, name);
78
+ if (candidates.length === 1 && sameToolIdentity(candidates[0], tool)) return true;
79
+ }
80
+ return false;
81
+ }
82
+
83
+ export function resolveToolChoiceWireName(tools: readonly Pick<OcxTool, "namespace" | "name">[] | undefined, name: string): string {
84
+ const candidates = toolChoiceCandidates(tools, name);
85
+ if (candidates.length === 1) {
86
+ const match = candidates[0];
87
+ return namespacedToolName(match.namespace, match.name);
88
+ }
89
+ // Keep unknown/ambiguous names unchanged for callers that only serialize a selector. The
90
+ // catalog-aware predicate rejects them, and parseRequest rejects ambiguous request selectors.
91
+ return name;
92
+ }
93
+
94
+ /**
95
+ * Whether `modelId` is in a per-provider classification list (e.g. `noVisionModels`). Matches the full
96
+ * id, OR — for Ollama-style ids — the family before the ":size" tag, so a `gpt-oss` entry covers
97
+ * `gpt-oss:120b`/`gpt-oss:20b`. Colon-less ids (e.g. `grok-build-0.1`) still match exactly only.
98
+ */
99
+ export function modelInList(list: string[] | undefined, modelId: string): boolean {
100
+ if (!list || list.length === 0) return false;
101
+ if (list.includes(modelId)) return true;
102
+ const colon = modelId.indexOf(":");
103
+ return colon > 0 && list.includes(modelId.slice(0, colon));
104
+ }
105
+
106
+ export type OcxToolChoice =
107
+ | "auto"
108
+ | "none"
109
+ | "required"
110
+ | { name: string }
111
+ | { allowedTools: string[]; mode: "auto" | "required" };
112
+
113
+ export function isAllowedToolChoice(value: OcxToolChoice | undefined): value is { allowedTools: string[]; mode: "auto" | "required" } {
114
+ return typeof value === "object" && value !== null && "allowedTools" in value;
115
+ }
116
+
117
+ /** Compile the request's tool-choice policy into a reusable advertisement/restoration predicate. */
118
+ export function toolChoiceToolPredicate(
119
+ choice: OcxToolChoice | undefined,
120
+ tools?: readonly Pick<OcxTool, "namespace" | "name">[],
121
+ ): (tool: Pick<OcxTool, "namespace" | "name">) => boolean {
122
+ if (!choice || choice === "auto" || choice === "required") return () => true;
123
+ if (choice === "none") return () => false;
124
+ if (isAllowedToolChoice(choice)) {
125
+ const allowed = new Set(choice.allowedTools);
126
+ return tool => toolAllowedByChoice(tool, allowed, tools);
127
+ }
128
+ if (!tools) return tool => toolChoiceAliases(tool).includes(choice.name);
129
+ const candidates = toolChoiceCandidates(tools, choice.name);
130
+ return tool => candidates.length === 1 && sameToolIdentity(candidates[0], tool);
131
+ }
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Accepted values for the per-provider upstream HTTP-version pin (#1668). Shared by the
3
+ * zod load schema, the management write boundary (POST/PATCH), and the fetch runtime, so
4
+ * a value that one boundary accepts can never be rejected by another.
5
+ */
6
+ export const UPSTREAM_HTTP_VERSION_VALUES = [
7
+ "auto",
8
+ "http1.1",
9
+ "h1",
10
+ "http2",
11
+ "h2",
12
+ ] as const;
13
+
14
+ export type UpstreamHttpVersion = (typeof UPSTREAM_HTTP_VERSION_VALUES)[number];
15
+
16
+ export const REASONING_SUMMARY_DELIVERY_VALUES = [
17
+ "sequential",
18
+ "sequential_cutoff",
19
+ "concurrent",
20
+ "concurrent_cutoff",
21
+ ] as const;
22
+
23
+ export type ReasoningSummaryDelivery = typeof REASONING_SUMMARY_DELIVERY_VALUES[number];
24
+
25
+ /** Trusted runtime ownership for Codex-account credentials. Never persisted per provider. */
26
+ export type CodexAccountMode = "direct" | "pool";
27
+
28
+ export const OPENAI_PROVIDER_TIER_VERSION = 2 as const;
29
+
30
+ /**
31
+ * Wires that a per-model `modelAdapters` override may select.
32
+ *
33
+ * Deliberately narrow: provider-specific adapters (cursor, kiro, google, ...) carry
34
+ * their own credential and base-URL semantics, so exposing them here would widen the
35
+ * auth boundary rather than pick a wire. Widening this set needs a per-adapter
36
+ * credential threat model first (#404).
37
+ */
38
+ export const MODEL_ADAPTER_OVERRIDE_ALLOWED: ReadonlySet<string> = new Set([
39
+ "openai-chat",
40
+ "openai-responses",
41
+ ]);
42
+
43
+ /**
44
+ * Providers whose listed model ids must be driven over the Anthropic wire even when
45
+ * the provider's configured adapter says otherwise — the upstream only speaks
46
+ * Anthropic for these models.
47
+ */
48
+ const ANTHROPIC_WIRE_MODELS: Record<string, ReadonlySet<string>> = {
49
+ "opencode-go": new Set(["minimax-m2.5", "minimax-m2.7", "minimax-m3"]),
50
+ };
51
+
52
+ function anthropicWireModelsForProvider(providerName: string): ReadonlySet<string> | undefined {
53
+ return Object.hasOwn(ANTHROPIC_WIRE_MODELS, providerName)
54
+ ? ANTHROPIC_WIRE_MODELS[providerName]
55
+ : undefined;
56
+ }
57
+
58
+ /** Detached provider-local hard-pin table for pure wire-policy resolution. */
59
+ export function captureWireAdapterHardPins(providerName: string): Readonly<Record<string, string>> {
60
+ const models = anthropicWireModelsForProvider(providerName);
61
+ if (!models) return Object.freeze({});
62
+ return Object.freeze(Object.fromEntries([...models].map(modelId => [modelId, "anthropic"])));
63
+ }
64
+
65
+ /**
66
+ * True when the upstream speaks exactly one wire for this model, so a configured
67
+ * override must not apply.
68
+ *
69
+ * Deliberately independent of the provider's current adapter: the wire resolver runs
70
+ * more than once per request, and a check phrased as "pin differs from the current
71
+ * adapter" would pass on the first pass and then let the override win on the second.
72
+ */
73
+ export function isWirePinnedModel(providerName: string, modelId: string): boolean {
74
+ return anthropicWireModelsForProvider(providerName)?.has(modelId) ?? false;
75
+ }
76
+
77
+ /** The wire a pinned model must use, or undefined when the model is not pinned. */
78
+ export function pinnedWireAdapter(providerName: string, modelId: string): string | undefined {
79
+ return isWirePinnedModel(providerName, modelId) ? "anthropic" : undefined;
80
+ }