@iislee/opencodex 2.11.0 → 2.35.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 (733) hide show
  1. package/AGENTS_INSTALL.md +109 -0
  2. package/README.md +117 -22
  3. package/bin/ocx.mjs +245 -88
  4. package/bin/package-main.mjs +1 -1
  5. package/gui/dist/assets/index-Be1sDpWw.css +1 -0
  6. package/gui/dist/assets/index-D4OKgUV4.js +114 -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 +21 -10
  42. package/src/adapters/anthropic-output-schema.ts +137 -0
  43. package/src/adapters/anthropic.ts +475 -62
  44. package/src/adapters/base.ts +82 -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 +637 -0
  48. package/src/adapters/cursor/call-id.ts +44 -0
  49. package/src/adapters/cursor/catalog.ts +541 -0
  50. package/src/adapters/cursor/checkpoint-store.ts +308 -0
  51. package/src/adapters/cursor/cursor-errors.ts +144 -6
  52. package/src/adapters/cursor/discovery.ts +122 -14
  53. package/src/adapters/cursor/effort-map.ts +106 -4
  54. package/src/adapters/cursor/envelope-echo.ts +290 -0
  55. package/src/adapters/cursor/framing.ts +39 -0
  56. package/src/adapters/cursor/h2-pool.ts +123 -0
  57. package/src/adapters/cursor/http1-bidi.ts +361 -0
  58. package/src/adapters/cursor/images.ts +704 -0
  59. package/src/adapters/cursor/live-models.ts +180 -59
  60. package/src/adapters/cursor/live-transport.ts +623 -170
  61. package/src/adapters/cursor/message-mapper.ts +4 -1
  62. package/src/adapters/cursor/native-exec-common.ts +23 -2
  63. package/src/adapters/cursor/native-exec-desktop.ts +23 -0
  64. package/src/adapters/cursor/native-exec-fs.ts +10 -7
  65. package/src/adapters/cursor/native-exec-network.ts +1 -1
  66. package/src/adapters/cursor/native-exec-shell.ts +5 -3
  67. package/src/adapters/cursor/native-exec.ts +121 -14
  68. package/src/adapters/cursor/protobuf-events.ts +829 -11
  69. package/src/adapters/cursor/protobuf-request.ts +447 -75
  70. package/src/adapters/cursor/request-builder.ts +271 -35
  71. package/src/adapters/cursor/tool-definitions.ts +252 -12
  72. package/src/adapters/cursor/tool-result-normalize.ts +115 -0
  73. package/src/adapters/cursor/transport.ts +22 -0
  74. package/src/adapters/cursor/types.ts +48 -1
  75. package/src/adapters/cursor.ts +336 -39
  76. package/src/adapters/exec-tool-result-normalize.ts +99 -0
  77. package/src/adapters/google-antigravity-replay.ts +713 -41
  78. package/src/adapters/google-antigravity-wire.ts +48 -10
  79. package/src/adapters/google-errors.ts +44 -12
  80. package/src/adapters/google-http.ts +38 -10
  81. package/src/adapters/google-tool-schema.ts +80 -15
  82. package/src/adapters/google-truncation.ts +11 -0
  83. package/src/adapters/google.ts +742 -86
  84. package/src/adapters/identity.ts +39 -6
  85. package/src/adapters/image.ts +1 -1
  86. package/src/adapters/kiro-constants.ts +27 -0
  87. package/src/adapters/kiro-errors.ts +11 -0
  88. package/src/adapters/kiro-events.ts +19 -1
  89. package/src/adapters/kiro-thinking.ts +18 -2
  90. package/src/adapters/kiro-tools.ts +65 -17
  91. package/src/adapters/kiro.ts +270 -73
  92. package/src/adapters/mimo-free.ts +17 -0
  93. package/src/adapters/openai-chat-url.ts +11 -0
  94. package/src/adapters/openai-chat.ts +1377 -344
  95. package/src/adapters/openai-responses-url.ts +16 -0
  96. package/src/adapters/openai-responses.ts +1164 -64
  97. package/src/adapters/registry.ts +175 -0
  98. package/src/adapters/responses-tool-schema.ts +67 -0
  99. package/src/adapters/run-turn-queue.ts +36 -1
  100. package/src/adapters/tool-call-id.ts +119 -0
  101. package/src/adapters/tool-catalog-nudge.ts +105 -21
  102. package/src/adapters/xai-tool-schema.ts +436 -0
  103. package/src/adapters/xai-web-search.ts +186 -0
  104. package/src/bridge.ts +512 -92
  105. package/src/chat/inbound.ts +57 -20
  106. package/src/chat/outbound.ts +97 -33
  107. package/src/claude/agents-inject.ts +40 -10
  108. package/src/claude/context-windows.ts +37 -14
  109. package/src/claude/desktop-3p.ts +243 -9
  110. package/src/claude/gateway-cache.ts +41 -4
  111. package/src/claude/inbound.ts +72 -3
  112. package/src/claude/model-info.ts +38 -15
  113. package/src/claude/outbound.ts +88 -21
  114. package/src/cli/access.ts +46 -3
  115. package/src/cli/account-api.ts +150 -19
  116. package/src/cli/account-auth.ts +33 -6
  117. package/src/cli/account-catalog-refresh.ts +14 -0
  118. package/src/cli/account-extended.ts +648 -28
  119. package/src/cli/account-main.ts +317 -0
  120. package/src/cli/account.ts +97 -19
  121. package/src/cli/agent.ts +53 -2
  122. package/src/cli/alias.ts +66 -0
  123. package/src/cli/capabilities-command.ts +94 -0
  124. package/src/cli/capabilities.ts +496 -0
  125. package/src/cli/claude-agent-startup-sync.ts +73 -0
  126. package/src/cli/claude-desktop.ts +60 -15
  127. package/src/cli/claude.ts +129 -35
  128. package/src/cli/codex-log-guard-doctor.ts +103 -0
  129. package/src/cli/codex-shim-autorestore.ts +2 -0
  130. package/src/cli/codex-shim-readiness.ts +76 -0
  131. package/src/cli/combo.ts +8 -0
  132. package/src/cli/config-command.ts +74 -10
  133. package/src/cli/dispatch.ts +821 -0
  134. package/src/cli/doctor.ts +440 -56
  135. package/src/cli/ensure-desired-integrations.ts +152 -0
  136. package/src/cli/export-command.ts +46 -20
  137. package/src/cli/help.ts +34 -274
  138. package/src/cli/index.ts +417 -528
  139. package/src/cli/init.ts +5 -17
  140. package/src/cli/inspect.ts +230 -0
  141. package/src/cli/integrations.ts +120 -2
  142. package/src/cli/lab.ts +607 -0
  143. package/src/cli/launcher-context.ts +77 -0
  144. package/src/cli/minimax.ts +497 -0
  145. package/src/cli/models-runtime.ts +130 -2
  146. package/src/cli/models.ts +118 -16
  147. package/src/cli/observe.ts +123 -11
  148. package/src/cli/opencode.ts +4 -2
  149. package/src/cli/provider-runtime.ts +34 -3
  150. package/src/cli/provider.ts +25 -3
  151. package/src/cli/ready.ts +301 -0
  152. package/src/cli/registry.ts +476 -0
  153. package/src/cli/root.ts +86 -0
  154. package/src/cli/route-policy.ts +92 -0
  155. package/src/cli/runtime-api.ts +57 -10
  156. package/src/cli/star-prompt.ts +71 -15
  157. package/src/cli/status.ts +51 -4
  158. package/src/cli/storage.ts +234 -0
  159. package/src/cli/system-command.ts +16 -0
  160. package/src/cli/system-restart-client.ts +146 -0
  161. package/src/cli/tray-proxy.ts +153 -6
  162. package/src/cli/usage-report.ts +184 -0
  163. package/src/cli/v2.ts +137 -18
  164. package/src/cli/version-skew.ts +46 -0
  165. package/src/cli.ts +1 -1
  166. package/src/clients/config-export.ts +1442 -23
  167. package/src/clients/effective-status.ts +30 -2
  168. package/src/clients/probes/cline.ts +81 -0
  169. package/src/codex/account-label.ts +35 -1
  170. package/src/codex/account-lifecycle.ts +130 -13
  171. package/src/codex/account-namespaces.ts +49 -3
  172. package/src/codex/account-pause.ts +2 -1
  173. package/src/codex/account-priority.ts +84 -0
  174. package/src/codex/account-store.ts +29 -2
  175. package/src/codex/account-usability.ts +25 -2
  176. package/src/codex/admission.ts +256 -0
  177. package/src/codex/affinity-debug.ts +162 -0
  178. package/src/codex/app-server-processes.ts +570 -107
  179. package/src/codex/app-server-restart-service.ts +232 -0
  180. package/src/codex/auth-api.ts +893 -246
  181. package/src/codex/auth-collision.ts +5 -3
  182. package/src/codex/auth-context.ts +348 -32
  183. package/src/codex/autostart-health.ts +24 -1
  184. package/src/codex/catalog/account-models.ts +67 -0
  185. package/src/codex/catalog/aggregation.ts +86 -10
  186. package/src/codex/catalog/bundled.ts +331 -33
  187. package/src/codex/catalog/effort.ts +138 -32
  188. package/src/codex/catalog/filesystem-evidence.ts +302 -0
  189. package/src/codex/catalog/kinds.ts +2 -0
  190. package/src/codex/catalog/metadata.ts +555 -45
  191. package/src/codex/catalog/native-models.ts +75 -0
  192. package/src/codex/catalog/parsing.ts +269 -30
  193. package/src/codex/catalog/provider-fetch.ts +1626 -144
  194. package/src/codex/catalog/sync.ts +1576 -187
  195. package/src/codex/catalog-admission.ts +199 -0
  196. package/src/codex/catalog-refresh-status.ts +105 -0
  197. package/src/codex/catalog-write-serialization.ts +242 -0
  198. package/src/codex/catalog.ts +6 -3
  199. package/src/codex/codex-write-lock.ts +386 -0
  200. package/src/codex/convergence-types.ts +614 -0
  201. package/src/codex/convergence.ts +676 -0
  202. package/src/codex/coordinator-doctor.ts +332 -0
  203. package/src/codex/custom-model-catalog-migration.ts +176 -0
  204. package/src/codex/desired-state.ts +230 -0
  205. package/src/codex/desktop-app-restart.ts +355 -0
  206. package/src/codex/features.ts +636 -39
  207. package/src/codex/generation.ts +202 -0
  208. package/src/codex/history-job.ts +436 -0
  209. package/src/codex/history-lock.ts +242 -0
  210. package/src/codex/history-manifest.ts +112 -0
  211. package/src/codex/history-migration-guardian.ts +30 -24
  212. package/src/codex/history-provider.ts +1016 -235
  213. package/src/codex/history-transition.ts +105 -0
  214. package/src/codex/history-worker.ts +223 -0
  215. package/src/codex/inject-coordination.ts +373 -0
  216. package/src/codex/inject.ts +1114 -152
  217. package/src/codex/injected-marker.ts +37 -3
  218. package/src/codex/integration-record.ts +266 -0
  219. package/src/codex/internal/catalog-writer.ts +203 -0
  220. package/src/codex/internal/history-writer.ts +81 -0
  221. package/src/codex/journal.ts +66 -4
  222. package/src/codex/log-guard/inspect.ts +524 -0
  223. package/src/codex/log-guard/lock.ts +150 -0
  224. package/src/codex/log-guard/maintenance.ts +403 -0
  225. package/src/codex/log-guard/path-safety.ts +88 -0
  226. package/src/codex/log-guard/policy.ts +44 -0
  227. package/src/codex/log-guard/processes.ts +205 -0
  228. package/src/codex/log-guard/protection.ts +489 -0
  229. package/src/codex/log-guard/sqlite-errors.ts +9 -0
  230. package/src/codex/main-account-cache.ts +24 -0
  231. package/src/codex/main-account.ts +29 -1
  232. package/src/codex/management-convergence.ts +167 -0
  233. package/src/codex/model-cache.ts +56 -10
  234. package/src/codex/model-entitlements.ts +360 -0
  235. package/src/codex/native-main-admission.ts +47 -0
  236. package/src/codex/native-main-auth-temp.ts +187 -0
  237. package/src/codex/native-main-claim.ts +178 -0
  238. package/src/codex/native-main-lock-file.ts +162 -0
  239. package/src/codex/native-main-owner.ts +329 -0
  240. package/src/codex/native-profile-api.ts +247 -0
  241. package/src/codex/native-profile-manager.ts +1531 -0
  242. package/src/codex/native-profile-processes.ts +121 -0
  243. package/src/codex/native-profile-recovery.ts +99 -0
  244. package/src/codex/native-profile-stage-store.ts +387 -0
  245. package/src/codex/native-profile-startup.ts +622 -0
  246. package/src/codex/native-profile-store.ts +855 -0
  247. package/src/codex/native-profile-types.ts +120 -0
  248. package/src/codex/native-residue.ts +675 -0
  249. package/src/codex/paths.ts +80 -1
  250. package/src/codex/plan-from-token.ts +140 -0
  251. package/src/codex/plan.ts +40 -0
  252. package/src/codex/plugins-doctor.ts +1 -1
  253. package/src/codex/pool-rotation.ts +74 -4
  254. package/src/codex/project-config-warnings.ts +20 -6
  255. package/src/codex/prompt-journal.ts +352 -0
  256. package/src/codex/prompt-layers.ts +1313 -0
  257. package/src/codex/prompt-lock.ts +143 -0
  258. package/src/codex/prompt-text-probe.ts +238 -0
  259. package/src/codex/quota-rejection.ts +298 -0
  260. package/src/codex/quota.ts +264 -21
  261. package/src/codex/refresh.ts +11 -2
  262. package/src/codex/reset-credit-recovery.ts +1044 -0
  263. package/src/codex/routing.ts +514 -94
  264. package/src/codex/runtime.ts +159 -38
  265. package/src/codex/shim.ts +1065 -31
  266. package/src/codex/subagent-model-fallback.ts +437 -43
  267. package/src/codex/sync.ts +191 -2
  268. package/src/codex/transition-state.ts +720 -0
  269. package/src/codex/upstream-host-health.ts +368 -0
  270. package/src/codex/user-identity.ts +557 -0
  271. package/src/codex/warmup.ts +187 -81
  272. package/src/codex/write-coordination.ts +114 -0
  273. package/src/combos/failover.ts +47 -0
  274. package/src/combos/index.ts +4 -0
  275. package/src/combos/request.ts +32 -0
  276. package/src/combos/types.ts +91 -9
  277. package/src/compatibility/index.ts +26 -0
  278. package/src/compatibility/manifest.ts +253 -0
  279. package/src/compatibility/openai-responses.ts +121 -0
  280. package/src/config/atomic-write.ts +219 -0
  281. package/src/config/paths.ts +40 -0
  282. package/src/config/process-state.ts +309 -0
  283. package/src/config/provider-name.ts +24 -0
  284. package/src/config/provider-validation.ts +177 -0
  285. package/src/config/rebase-provenance.ts +68 -0
  286. package/src/config.ts +1713 -709
  287. package/src/generated/compatibility-version.json +3324 -0
  288. package/src/generated/{jawcode-model-metadata.ts → model-metadata.ts} +19 -17
  289. package/src/grok/inject.ts +16 -5
  290. package/src/grok/inspect.ts +45 -0
  291. package/src/grok/sync.ts +2 -2
  292. package/src/images/loop.ts +157 -33
  293. package/src/images/plan.ts +24 -13
  294. package/src/integrations/config-io.ts +269 -0
  295. package/src/integrations/journal.ts +315 -0
  296. package/src/integrations/merge.ts +135 -0
  297. package/src/integrations/mutation-flight.ts +71 -0
  298. package/src/integrations/native/ownership-preflight.ts +202 -0
  299. package/src/integrations/omp-yaml-source.ts +358 -0
  300. package/src/integrations/owned-refresh.ts +74 -0
  301. package/src/integrations/ownership-policy.ts +160 -0
  302. package/src/integrations/ownership.ts +155 -0
  303. package/src/integrations/registry.ts +166 -0
  304. package/src/integrations/serialize.ts +314 -0
  305. package/src/integrations/state.ts +433 -0
  306. package/src/integrations/store.ts +103 -0
  307. package/src/integrations/writer-lock.ts +98 -0
  308. package/src/integrations/writer.ts +715 -0
  309. package/src/lab/artifacts/sanitize.ts +586 -0
  310. package/src/lab/artifacts/secure-fs.ts +475 -0
  311. package/src/lab/artifacts/store.ts +310 -0
  312. package/src/lab/automation/budgets.ts +78 -0
  313. package/src/lab/automation/config-persistence.ts +256 -0
  314. package/src/lab/automation/constants.ts +39 -0
  315. package/src/lab/automation/cooldown.ts +103 -0
  316. package/src/lab/automation/dispatch.ts +211 -0
  317. package/src/lab/automation/index.ts +13 -0
  318. package/src/lab/automation/orchestrator.ts +499 -0
  319. package/src/lab/automation/persistence.ts +512 -0
  320. package/src/lab/automation/planner.ts +371 -0
  321. package/src/lab/automation/policy.ts +136 -0
  322. package/src/lab/automation/queue.ts +191 -0
  323. package/src/lab/automation/recovery.ts +24 -0
  324. package/src/lab/automation/route-context.ts +21 -0
  325. package/src/lab/automation/run-key.ts +44 -0
  326. package/src/lab/automation/runs-query.ts +34 -0
  327. package/src/lab/automation/types.ts +160 -0
  328. package/src/lab/conformance/assertion.ts +325 -0
  329. package/src/lab/conformance/digest.ts +22 -0
  330. package/src/lab/conformance/executor.ts +741 -0
  331. package/src/lab/conformance/fixture-provider.ts +27 -0
  332. package/src/lab/conformance/fixtures/live-v1-cases.json +175 -0
  333. package/src/lab/conformance/fixtures/protocol-v1-cases.json +461 -0
  334. package/src/lab/conformance/harness-budget.ts +47 -0
  335. package/src/lab/conformance/index.ts +5 -0
  336. package/src/lab/conformance/jcs.ts +64 -0
  337. package/src/lab/conformance/json-pointer.ts +39 -0
  338. package/src/lab/conformance/manifest.ts +180 -0
  339. package/src/lab/conformance/mcp-stub.ts +179 -0
  340. package/src/lab/conformance/negative-controls.ts +164 -0
  341. package/src/lab/conformance/observation.ts +355 -0
  342. package/src/lab/conformance/runner.ts +68 -0
  343. package/src/lab/conformance/sse-normalize.ts +59 -0
  344. package/src/lab/conformance/suite-manifest.ts +78 -0
  345. package/src/lab/conformance/types.ts +214 -0
  346. package/src/lab/constants.ts +126 -0
  347. package/src/lab/digest.ts +64 -0
  348. package/src/lab/events/errors.ts +9 -0
  349. package/src/lab/events/limits.ts +117 -0
  350. package/src/lab/events/types.ts +229 -0
  351. package/src/lab/events/validate.ts +781 -0
  352. package/src/lab/fabric/constants.ts +40 -0
  353. package/src/lab/fabric/executor.ts +492 -0
  354. package/src/lab/fabric/index.ts +80 -0
  355. package/src/lab/fabric/manifest.ts +222 -0
  356. package/src/lab/fabric/observe.ts +489 -0
  357. package/src/lab/fabric/patch.ts +79 -0
  358. package/src/lab/fabric/producer-child.ts +139 -0
  359. package/src/lab/fabric/producer-isolate.ts +276 -0
  360. package/src/lab/fabric/producer-protocol.ts +61 -0
  361. package/src/lab/fabric/scratch.ts +439 -0
  362. package/src/lab/fabric/subject.ts +106 -0
  363. package/src/lab/fabric/types.ts +134 -0
  364. package/src/lab/fabric/verifier.ts +98 -0
  365. package/src/lab/index.ts +54 -0
  366. package/src/lab/ledger/artifact-refs.ts +127 -0
  367. package/src/lab/ledger/invalidation.ts +136 -0
  368. package/src/lab/ledger/purge.ts +310 -0
  369. package/src/lab/ledger/store.ts +532 -0
  370. package/src/lab/live/credential-lease.ts +53 -0
  371. package/src/lab/live/destination.ts +155 -0
  372. package/src/lab/live/executor.ts +336 -0
  373. package/src/lab/live/inert-tools.ts +56 -0
  374. package/src/lab/live/manifest.ts +85 -0
  375. package/src/lab/live/mcp-loopback.ts +57 -0
  376. package/src/lab/live/runner.ts +19 -0
  377. package/src/lab/live/sandbox.ts +61 -0
  378. package/src/lab/live/suite-manifest.ts +41 -0
  379. package/src/lab/live/transport.ts +118 -0
  380. package/src/lab/live/types.ts +197 -0
  381. package/src/lab/observe/from-conformance.ts +301 -0
  382. package/src/lab/observe/from-live.ts +117 -0
  383. package/src/lab/paths.ts +153 -0
  384. package/src/lab/projection/rebuild.ts +495 -0
  385. package/src/lab/projection/schema.ts +135 -0
  386. package/src/lab/projection/verdicts.ts +474 -0
  387. package/src/lab/projection/verification.ts +412 -0
  388. package/src/lab/public/bundle.ts +217 -0
  389. package/src/lab/public/community-authority.ts +175 -0
  390. package/src/lab/public/community-files.ts +29 -0
  391. package/src/lab/public/community.ts +479 -0
  392. package/src/lab/public/file-safety.ts +155 -0
  393. package/src/lab/public/ids.ts +26 -0
  394. package/src/lab/public/index.ts +16 -0
  395. package/src/lab/public/mutation-lock.ts +424 -0
  396. package/src/lab/public/operator.ts +353 -0
  397. package/src/lab/public/origin-purge.ts +79 -0
  398. package/src/lab/public/origin.ts +203 -0
  399. package/src/lab/public/privacy.ts +143 -0
  400. package/src/lab/public/private-file.ts +261 -0
  401. package/src/lab/public/project.ts +124 -0
  402. package/src/lab/public/purge-test-fault.ts +21 -0
  403. package/src/lab/public/purge.ts +223 -0
  404. package/src/lab/public/registry.ts +44 -0
  405. package/src/lab/public/revocation.ts +252 -0
  406. package/src/lab/public/signature.ts +243 -0
  407. package/src/lab/public/storage.ts +105 -0
  408. package/src/lab/public/strict-json.ts +206 -0
  409. package/src/lab/public/time.ts +26 -0
  410. package/src/lab/public/types.ts +172 -0
  411. package/src/lab/public/validate.ts +391 -0
  412. package/src/lab/query/catalog.ts +101 -0
  413. package/src/lab/query/connection.ts +107 -0
  414. package/src/lab/query/constants.ts +4 -0
  415. package/src/lab/query/cursor.ts +132 -0
  416. package/src/lab/query/dto-map.ts +277 -0
  417. package/src/lab/query/errors.ts +22 -0
  418. package/src/lab/query/freshness.ts +53 -0
  419. package/src/lab/query/index.ts +45 -0
  420. package/src/lab/query/latest-observation.ts +59 -0
  421. package/src/lab/query/passive-production.ts +159 -0
  422. package/src/lab/query/queries.ts +444 -0
  423. package/src/lab/query/types.ts +266 -0
  424. package/src/lab/subject/behavior-fingerprint.ts +77 -0
  425. package/src/lab/subject/installation-salt.ts +112 -0
  426. package/src/lab/subject/protocol-subject.ts +80 -0
  427. package/src/lab/subject/route-subject.ts +74 -0
  428. package/src/lib/admin-secrets.ts +24 -0
  429. package/src/lib/app-owned-memory-stores.ts +22 -0
  430. package/src/lib/bounded-body.ts +167 -11
  431. package/src/lib/bun-runtime.ts +125 -12
  432. package/src/lib/bun-stream-caps.ts +13 -9
  433. package/src/lib/codex-restart-contract.ts +120 -0
  434. package/src/lib/config-ownership.ts +26 -2
  435. package/src/lib/destination-policy.ts +65 -1
  436. package/src/lib/errors.ts +80 -5
  437. package/src/lib/fabric-task-execution-authority.ts +7 -0
  438. package/src/lib/fabric-task-host.ts +29 -0
  439. package/src/lib/lab-activation.ts +223 -0
  440. package/src/lib/lab-live-execution-authority.ts +13 -0
  441. package/src/lib/lab-live-host.ts +30 -0
  442. package/src/lib/lab-live-pinned-sender.ts +56 -0
  443. package/src/lib/lab-live-route-production.ts +130 -0
  444. package/src/lib/lab-passive-linker-registration.ts +26 -0
  445. package/src/lib/local-management-attestation.ts +51 -0
  446. package/src/lib/local-management-capability.ts +100 -0
  447. package/src/lib/local-provider-reload-contract.ts +100 -0
  448. package/src/lib/optional-shutdown-hooks.ts +57 -0
  449. package/src/lib/package-tree-integrity.ts +101 -0
  450. package/src/lib/pinned-http.ts +145 -26
  451. package/src/lib/process-control.ts +6 -2
  452. package/src/lib/provider-outbound.ts +49 -9
  453. package/src/lib/redact.ts +419 -3
  454. package/src/lib/self-launch-argv.ts +15 -0
  455. package/src/lib/server-resource-ownership.ts +71 -0
  456. package/src/lib/service-secrets.ts +15 -0
  457. package/src/lib/shadow-call.ts +35 -4
  458. package/src/lib/sse-decoder.ts +41 -0
  459. package/src/lib/state-store-registrations.ts +10 -2
  460. package/src/lib/system-restart-contract.ts +73 -0
  461. package/src/lib/token-estimate.ts +19 -2
  462. package/src/lib/tool-argument-integers.ts +253 -0
  463. package/src/lib/translator-budget.ts +44 -0
  464. package/src/lib/upstream-http-version.ts +57 -0
  465. package/src/lib/upstream-reachability.ts +95 -0
  466. package/src/lib/upstream-retry.ts +156 -3
  467. package/src/lib/windows-atomic-replace.ts +155 -0
  468. package/src/lib/windows-elevation.ts +70 -2
  469. package/src/lib/windows-secret-acl.ts +409 -69
  470. package/src/lib/windows-service-wrappers.ts +72 -0
  471. package/src/lib/windows-text.ts +106 -0
  472. package/src/lib/windows-user-principal.ts +341 -0
  473. package/src/lib/winsw.ts +33 -5
  474. package/src/oauth/account-import/google-antigravity-adapter.ts +74 -0
  475. package/src/oauth/account-import/index.ts +15 -0
  476. package/src/oauth/account-import/parser.ts +83 -0
  477. package/src/oauth/account-import/registry.ts +18 -0
  478. package/src/oauth/account-import/service.ts +75 -0
  479. package/src/oauth/account-import/types.ts +91 -0
  480. package/src/oauth/anthropic.ts +12 -1
  481. package/src/oauth/callback-server.ts +30 -4
  482. package/src/oauth/chatgpt.ts +12 -1
  483. package/src/oauth/cline.ts +203 -0
  484. package/src/oauth/command-code.ts +239 -0
  485. package/src/oauth/cursor.ts +46 -5
  486. package/src/oauth/generic-account-failover.ts +231 -0
  487. package/src/oauth/google-antigravity.ts +35 -3
  488. package/src/oauth/health.ts +20 -12
  489. package/src/oauth/index.ts +462 -71
  490. package/src/oauth/key-providers.ts +25 -0
  491. package/src/oauth/kimi.ts +25 -3
  492. package/src/oauth/kiro.ts +95 -6
  493. package/src/oauth/local-token-detect.ts +13 -2
  494. package/src/oauth/log.ts +3 -1
  495. package/src/oauth/login-cli.ts +88 -28
  496. package/src/oauth/nous.ts +798 -0
  497. package/src/oauth/open-browser-choice.ts +26 -0
  498. package/src/oauth/store.ts +133 -26
  499. package/src/oauth/token-guardian.ts +9 -3
  500. package/src/oauth/types.ts +15 -0
  501. package/src/pi/models.ts +2 -2
  502. package/src/providers/alibaba-region-migration.ts +1 -1
  503. package/src/providers/antigravity-models.ts +521 -31
  504. package/src/providers/auto-compact-budget.ts +65 -0
  505. package/src/providers/base-url-choices.ts +10 -0
  506. package/src/providers/codex-capacity.ts +292 -0
  507. package/src/providers/command-code-efforts.ts +176 -0
  508. package/src/providers/context-cap.ts +26 -8
  509. package/src/providers/cursor-pool.ts +72 -0
  510. package/src/providers/default-aliases.ts +65 -0
  511. package/src/providers/derive.ts +281 -6
  512. package/src/providers/fastwire.ts +507 -0
  513. package/src/providers/free-directory.ts +10 -7
  514. package/src/providers/google-vertex-location.ts +14 -0
  515. package/src/providers/key-failover.ts +71 -3
  516. package/src/providers/label.ts +35 -2
  517. package/src/providers/model-discovery-limits.ts +16 -0
  518. package/src/providers/model-discovery.ts +115 -22
  519. package/src/providers/model-presets.ts +119 -0
  520. package/src/providers/model-rename-migration.ts +255 -0
  521. package/src/providers/model-rename-startup.ts +28 -0
  522. package/src/providers/new-model-policy.ts +146 -0
  523. package/src/providers/openai-sidecar.ts +72 -4
  524. package/src/providers/openai-tier-startup.ts +31 -2
  525. package/src/providers/openai-tiers.ts +119 -4
  526. package/src/providers/openai-virtual-models.ts +1 -0
  527. package/src/providers/opencode-zen-rate-limit.ts +102 -0
  528. package/src/providers/provider-id-rewrite.ts +30 -0
  529. package/src/providers/quota.ts +1379 -40
  530. package/src/providers/registry.ts +1545 -112
  531. package/src/providers/request-pacing.ts +310 -0
  532. package/src/providers/service-tier.ts +277 -0
  533. package/src/providers/slug-codec.ts +94 -6
  534. package/src/providers/static-model-discovery.ts +86 -0
  535. package/src/providers/xai-responses-opt-in.ts +15 -0
  536. package/src/providers/xai-transport.ts +32 -4
  537. package/src/reasoning-effort.ts +68 -3
  538. package/src/responses/apply-patch-envelope.ts +63 -0
  539. package/src/responses/code-mode-helper-compat.ts +50 -0
  540. package/src/responses/compaction.ts +26 -1
  541. package/src/responses/custom-tool-compat.ts +384 -0
  542. package/src/responses/hosted-tool-policy.ts +9 -0
  543. package/src/responses/namespace-tool-compat.ts +435 -0
  544. package/src/responses/parser.ts +225 -38
  545. package/src/responses/provider-continuation.ts +98 -0
  546. package/src/responses/provider-opaque-metadata.ts +73 -0
  547. package/src/responses/reasoning-envelope.ts +9 -1
  548. package/src/responses/reasoning-replay-cache.ts +504 -0
  549. package/src/responses/schema.ts +12 -2
  550. package/src/responses/spill-store.ts +75 -10
  551. package/src/responses/state.ts +659 -31
  552. package/src/responses/thought-signature-replay.ts +364 -0
  553. package/src/responses/tool-search-compat.ts +301 -0
  554. package/src/responses/truncated-stop-reason.ts +60 -0
  555. package/src/responses/turn-termination.ts +107 -0
  556. package/src/router.ts +405 -31
  557. package/src/routing/analytics.ts +379 -0
  558. package/src/routing/capability.ts +244 -0
  559. package/src/routing/compatibility/assemble.ts +73 -0
  560. package/src/routing/compatibility/behavior.ts +278 -0
  561. package/src/routing/compatibility/catalog.ts +99 -0
  562. package/src/routing/compatibility/endpoint.ts +52 -0
  563. package/src/routing/compatibility/lab-evidence-provider.ts +130 -0
  564. package/src/routing/compatibility/policy.ts +181 -0
  565. package/src/routing/compatibility/provider-slot.ts +56 -0
  566. package/src/routing/compatibility/reader.ts +110 -0
  567. package/src/routing/compatibility/subject.ts +191 -0
  568. package/src/routing/compatibility/types.ts +64 -0
  569. package/src/routing/compatibility/version.ts +104 -0
  570. package/src/routing/cost.ts +77 -0
  571. package/src/routing/evaluator.ts +495 -0
  572. package/src/routing/health.ts +412 -0
  573. package/src/routing/history/cursor.ts +43 -0
  574. package/src/routing/history/indexer.ts +605 -0
  575. package/src/routing/history/schema.ts +72 -0
  576. package/src/routing/profile-namespace.ts +15 -0
  577. package/src/routing/profile.ts +547 -0
  578. package/src/routing/quota.ts +155 -0
  579. package/src/routing/request-evidence.ts +45 -0
  580. package/src/routing/trace.ts +776 -0
  581. package/src/server/adapter-resolve.ts +2 -29
  582. package/src/server/auth-cors.ts +289 -48
  583. package/src/server/background-lifecycle.ts +182 -0
  584. package/src/server/chat-completions.ts +154 -72
  585. package/src/server/chat-native-sse.ts +331 -0
  586. package/src/server/chat-native.ts +445 -0
  587. package/src/server/claude-messages.ts +160 -44
  588. package/src/server/direct-local-http.ts +347 -0
  589. package/src/server/effort-policy.ts +18 -0
  590. package/src/server/github-copilot-responses-repair.ts +338 -0
  591. package/src/server/gui-static.ts +39 -10
  592. package/src/server/images.ts +94 -12
  593. package/src/server/index.ts +1021 -190
  594. package/src/server/lifecycle.ts +336 -14
  595. package/src/server/live.ts +136 -17
  596. package/src/server/local-management-read-client.ts +90 -0
  597. package/src/server/local-provider-reload-client.ts +137 -0
  598. package/src/server/management/agent-settings-routes.ts +433 -116
  599. package/src/server/management/api-key-usage.ts +31 -5
  600. package/src/server/management/body.ts +6 -0
  601. package/src/server/management/codex-prompt-routes.ts +570 -0
  602. package/src/server/management/combo-routes.ts +64 -25
  603. package/src/server/management/config-routes.ts +511 -51
  604. package/src/server/management/context.ts +89 -2
  605. package/src/server/management/integration-routes.ts +498 -0
  606. package/src/server/management/lab-automation-routes.ts +206 -0
  607. package/src/server/management/lab-routes.ts +563 -0
  608. package/src/server/management/logs-usage-routes.ts +127 -52
  609. package/src/server/management/model-routes.ts +461 -133
  610. package/src/server/management/model-rows.ts +167 -0
  611. package/src/server/management/native-integration-routes.ts +770 -0
  612. package/src/server/management/oauth-account-routes.ts +90 -8
  613. package/src/server/management/provider-capability-config.ts +48 -0
  614. package/src/server/management/provider-routes.ts +836 -159
  615. package/src/server/management/request-history-routes.ts +191 -0
  616. package/src/server/management/route-registry.ts +332 -0
  617. package/src/server/management/routing-analytics-routes.ts +74 -0
  618. package/src/server/management/routing-profile-routes.ts +380 -0
  619. package/src/server/management/shared.ts +27 -11
  620. package/src/server/management/sidebar-routes.ts +47 -31
  621. package/src/server/management/storage-log-guard-routes.ts +186 -0
  622. package/src/server/management/sync-response.ts +69 -0
  623. package/src/server/management/system-restart.ts +289 -33
  624. package/src/server/management/system-routes.ts +77 -0
  625. package/src/server/management/usage-summary-cache.ts +9 -1
  626. package/src/server/management/vision-sidecar-options.ts +167 -0
  627. package/src/server/management/web-search-sidecar-options.ts +120 -0
  628. package/src/server/management-api.ts +126 -23
  629. package/src/server/management-auth.ts +220 -5
  630. package/src/server/passive-route-linker.ts +66 -0
  631. package/src/server/port-reclaim.ts +1 -1
  632. package/src/server/ports.ts +41 -1
  633. package/src/server/proxy-liveness.ts +161 -10
  634. package/src/server/readiness.ts +99 -0
  635. package/src/server/relay-eager.ts +221 -54
  636. package/src/server/relay.ts +479 -87
  637. package/src/server/request-decompress.ts +113 -6
  638. package/src/server/request-log-conversation.ts +51 -0
  639. package/src/server/request-log.ts +298 -31
  640. package/src/server/responses/agent-task-recovery-cache.ts +143 -0
  641. package/src/server/responses/agent-task-recovery.ts +465 -0
  642. package/src/server/responses/codex-auth-error.ts +55 -0
  643. package/src/server/responses/collaboration.ts +239 -36
  644. package/src/server/responses/combo-stream-preflight.ts +178 -0
  645. package/src/server/responses/compact.ts +444 -72
  646. package/src/server/responses/core.ts +3579 -436
  647. package/src/server/responses/empty-completion-guard.ts +333 -0
  648. package/src/server/responses/encrypted-payload.ts +62 -39
  649. package/src/server/responses/fetch-helpers.ts +89 -99
  650. package/src/server/responses/input-admission.ts +187 -0
  651. package/src/server/responses/pacing-overload.ts +13 -0
  652. package/src/server/responses/passthrough-error.ts +33 -9
  653. package/src/server/responses/policy-fallback.ts +178 -0
  654. package/src/server/responses/responses-field-backfill.ts +343 -0
  655. package/src/server/responses/terminal-guard.ts +26 -5
  656. package/src/server/responses/upstream-error.ts +5 -0
  657. package/src/server/responses/ws-upstream.ts +381 -0
  658. package/src/server/responses-custom-tool-repair.ts +363 -0
  659. package/src/server/responses-item-id-repair.ts +54 -6
  660. package/src/server/responses-json-events.ts +90 -0
  661. package/src/server/responses-model-rewrite.ts +29 -0
  662. package/src/server/responses-reasoning-summary-rewrite.ts +178 -0
  663. package/src/server/responses-snapshot-repair.ts +621 -0
  664. package/src/server/responses-terminal-repair.ts +363 -0
  665. package/src/server/responses-tool-search-repair.ts +267 -0
  666. package/src/server/responses-undeclared-tool-guard.ts +376 -0
  667. package/src/server/responses.ts +18 -2
  668. package/src/server/search.ts +78 -13
  669. package/src/server/sse-frame-buffer.ts +319 -0
  670. package/src/server/sse-payload-rewrite.ts +110 -22
  671. package/src/server/startup-action-control.ts +8 -1
  672. package/src/server/startup-health-cache.ts +19 -1
  673. package/src/server/system-env.ts +80 -9
  674. package/src/server/ws-bridge.ts +53 -40
  675. package/src/service-manager-probe.ts +892 -0
  676. package/src/service.ts +1153 -94
  677. package/src/sidecar/auth.ts +92 -0
  678. package/src/sidecar/candidates.ts +83 -0
  679. package/src/storage/cleanup.ts +2 -2
  680. package/src/storage/policy-job.ts +14 -4
  681. package/src/storage/policy.ts +88 -23
  682. package/src/storage/scanner.ts +1 -1
  683. package/src/storage/worker-lifecycle.ts +14 -14
  684. package/src/tray/windows-tray.ps1 +83 -9
  685. package/src/tray/windows.ts +43 -16
  686. package/src/types/accounts.ts +37 -0
  687. package/src/types/config.ts +911 -0
  688. package/src/types/provider.ts +614 -0
  689. package/src/types/request.ts +397 -0
  690. package/src/types/tools.ts +236 -0
  691. package/src/types/wire.ts +80 -0
  692. package/src/types.ts +107 -1237
  693. package/src/update/index.ts +37 -23
  694. package/src/update/job.ts +445 -68
  695. package/src/update/notify.ts +12 -6
  696. package/src/update/npm-cache-preflight.d.mts +47 -0
  697. package/src/update/npm-cache-preflight.mjs +201 -0
  698. package/src/update/transactional-install.d.mts +22 -0
  699. package/src/update/transactional-install.mjs +266 -0
  700. package/src/usage/cost.ts +0 -0
  701. package/src/usage/expected-prices.ts +287 -16
  702. package/src/usage/log.ts +666 -50
  703. package/src/usage/summary.ts +388 -17
  704. package/src/usage/user-cost-overlay-reconciler.ts +313 -0
  705. package/src/usage/user-cost-overlays.ts +314 -0
  706. package/src/vision/anthropic-describe.ts +10 -6
  707. package/src/vision/backends.ts +97 -0
  708. package/src/vision/describe.ts +27 -16
  709. package/src/vision/eligibility.ts +250 -0
  710. package/src/vision/index.ts +238 -24
  711. package/src/vision/reasoning.ts +55 -0
  712. package/src/vision/routed-describe.ts +175 -0
  713. package/src/vision/timeout-bounds.ts +9 -0
  714. package/src/web-search/anthropic-executor.ts +13 -7
  715. package/src/web-search/backends.ts +108 -0
  716. package/src/web-search/exa-executor.ts +119 -0
  717. package/src/web-search/executor.ts +21 -6
  718. package/src/web-search/gemini-executor.ts +141 -0
  719. package/src/web-search/index.ts +150 -15
  720. package/src/web-search/loop.ts +284 -54
  721. package/src/web-search/parse.ts +125 -30
  722. package/src/web-search/sources.ts +60 -0
  723. package/src/web-search/xai-executor.ts +219 -0
  724. package/gui/dist/assets/index-DTpMHS4F.js +0 -67
  725. package/gui/dist/assets/index-ZNVDE3C7.css +0 -1
  726. package/gui/dist/provider-icons/antigravity.svg +0 -1
  727. package/gui/dist/provider-icons/claude.svg +0 -1
  728. package/gui/dist/provider-icons/copilot.svg +0 -1
  729. package/gui/dist/provider-icons/cursor.svg +0 -2
  730. package/gui/dist/provider-icons/gemini.svg +0 -1
  731. package/gui/dist/provider-icons/grok-color.svg +0 -1
  732. package/gui/dist/provider-icons/kiro.svg +0 -14
  733. package/src/cli/internal-dispatch.ts +0 -20
@@ -0,0 +1,66 @@
1
+ import { CliUsageError, printData, rejectArgs, runtimeRequest, takeFlag, takeOption, type RuntimeApiDeps } from "./runtime-api";
2
+
3
+ const USAGE = `Usage:
4
+ ocx alias list [--json]
5
+ ocx alias set <provider> <alias>
6
+ ocx alias set <provider>/<native-model-id> <alias>
7
+ ocx alias rm <provider>[/<native-model-id>]
8
+ ocx alias defaults <on|off> [--provider <name>]`;
9
+
10
+ function selector(value: string): { provider: string; model?: string } {
11
+ const slash = value.indexOf("/");
12
+ return slash < 0 ? { provider: value } : { provider: value.slice(0, slash), model: value.slice(slash + 1) };
13
+ }
14
+
15
+ export async function handleAliasCommand(argv: string[], deps: RuntimeApiDeps = {}): Promise<number> {
16
+ const args = [...argv];
17
+ const action = (args.shift() ?? "list").toLowerCase();
18
+ const wantsJson = takeFlag(args, "--json");
19
+ if (action === "list") {
20
+ rejectArgs(args, USAGE);
21
+ const result = await runtimeRequest<Record<string, unknown>>("/api/aliases", {}, deps);
22
+ const lines: string[] = [];
23
+ for (const [target, alias] of Object.entries((result.providers ?? {}) as Record<string, string>)) lines.push(`provider ${target} ${alias} user`);
24
+ for (const [provider, rows] of Object.entries((result.models ?? {}) as Record<string, Record<string, { alias: string; source: string }>>)) {
25
+ for (const [model, value] of Object.entries(rows)) lines.push(`model ${provider}/${model} ${value.alias} ${value.source}`);
26
+ }
27
+ printData(result, wantsJson, lines.length ? lines : ["No aliases configured."]);
28
+ return 0;
29
+ }
30
+ if (action === "defaults") {
31
+ const state = args.shift()?.toLowerCase();
32
+ const provider = takeOption(args, "--provider");
33
+ rejectArgs(args, USAGE);
34
+ if (state !== "on" && state !== "off") throw new CliUsageError("defaults requires on or off", USAGE);
35
+ const result = await runtimeRequest("/api/default-aliases", { method: "PUT", body: JSON.stringify({ enabled: state === "on", ...(provider ? { provider } : {}) }) }, deps);
36
+ printData(result, wantsJson, [`Default aliases ${state}${provider ? ` for ${provider}` : " globally"}.`]);
37
+ return 0;
38
+ }
39
+ const target = args.shift()?.trim();
40
+ if (!target) throw new CliUsageError("alias target is required", USAGE);
41
+ const parsed = selector(target);
42
+ if (!parsed.provider || parsed.model === "") throw new CliUsageError("target must be provider or provider/native-model-id", USAGE);
43
+ if (action === "set") {
44
+ const alias = args.shift()?.trim();
45
+ rejectArgs(args, USAGE);
46
+ if (!alias) throw new CliUsageError("alias value is required", USAGE);
47
+ const path = parsed.model === undefined
48
+ ? `/api/providers/${encodeURIComponent(parsed.provider)}/alias`
49
+ : `/api/providers/${encodeURIComponent(parsed.provider)}/model-aliases`;
50
+ const body = parsed.model === undefined ? { alias } : { set: { [parsed.model]: alias } };
51
+ const result = await runtimeRequest(path, { method: "PUT", body: JSON.stringify(body) }, deps);
52
+ printData(result, wantsJson, [`${target} → ${alias}`]);
53
+ return 0;
54
+ }
55
+ if (action === "rm") {
56
+ rejectArgs(args, USAGE);
57
+ const path = parsed.model === undefined
58
+ ? `/api/providers/${encodeURIComponent(parsed.provider)}/alias`
59
+ : `/api/providers/${encodeURIComponent(parsed.provider)}/model-aliases`;
60
+ const body = parsed.model === undefined ? { alias: null } : { remove: [parsed.model] };
61
+ const result = await runtimeRequest(path, { method: "PUT", body: JSON.stringify(body) }, deps);
62
+ printData(result, wantsJson, [`Removed alias for ${target}.`]);
63
+ return 0;
64
+ }
65
+ throw new CliUsageError(`unknown alias action '${action}'`, USAGE);
66
+ }
@@ -0,0 +1,94 @@
1
+ /**
2
+ * `ocx capabilities` -- the surface index an agent reads first.
3
+ *
4
+ * The point of this verb is that driving `ocx` programmatically should not require
5
+ * parsing help text. `--json` emits the capability table with the management routes each
6
+ * capability drives; `--route` answers the inverse question.
7
+ */
8
+ import {
9
+ CAPABILITIES,
10
+ HEAD_CAPABILITIES,
11
+ capabilitiesForRoute,
12
+ capabilityInvocation,
13
+ type Capability,
14
+ } from "./capabilities";
15
+ import { takeFlag } from "./runtime-api";
16
+
17
+ function takeValueFlag(args: string[], flag: string): string | undefined {
18
+ // Order-independent by construction: scan for the flag anywhere in argv rather than
19
+ // reading a fixed position. Positional flag handling is exactly why
20
+ // `ocx restore back --json` ignored its flag.
21
+ const idx = args.indexOf(flag);
22
+ if (idx === -1) return undefined;
23
+ const value = args[idx + 1];
24
+ args.splice(idx, value === undefined || value.startsWith("-") ? 1 : 2);
25
+ if (value === undefined || value.startsWith("-")) return "";
26
+ return value;
27
+ }
28
+
29
+ function renderHuman(caps: readonly Capability[], includeHead: boolean): void {
30
+ for (const cap of caps) {
31
+ const marker = cap.mutates ? "!" : " ";
32
+ console.log(`${marker} ${capabilityInvocation(cap)}`);
33
+ console.log(` ${cap.summary}`);
34
+ if (cap.routes.length > 0) {
35
+ console.log(` routes: ${cap.routes.map(r => `${r.method} ${r.path}`).join(", ")}`);
36
+ }
37
+ if (cap.flags.length > 0) {
38
+ console.log(` flags: ${cap.flags.map(f => f.name).join(" ")}`);
39
+ }
40
+ }
41
+ if (!includeHead) return;
42
+ for (const head of HEAD_CAPABILITIES) {
43
+ console.log(` ocx ${head.invocations[0]}`);
44
+ console.log(` ${head.summary}`);
45
+ }
46
+ }
47
+
48
+ export async function runCapabilities(argv: string[]): Promise<number> {
49
+ const args = [...argv];
50
+ const json = takeFlag(args, "--json");
51
+ const mutatingOnly = takeFlag(args, "--mutating-only");
52
+ const route = takeValueFlag(args, "--route");
53
+
54
+ if (route !== undefined && route.length === 0) {
55
+ console.error("Usage: ocx capabilities --route <path>");
56
+ return 64;
57
+ }
58
+
59
+ let selected: readonly Capability[] = route === undefined ? CAPABILITIES : capabilitiesForRoute(route);
60
+ if (mutatingOnly) selected = selected.filter(cap => cap.mutates);
61
+
62
+ if (route !== undefined && selected.length === 0) {
63
+ // An unmatched route is a real answer, not an error: the route may be exempt or may
64
+ // not exist. Say which, rather than exiting 0 with silence.
65
+ if (json) {
66
+ console.log(JSON.stringify({ schemaVersion: 1, route, capabilities: [] }, null, 2));
67
+ } else {
68
+ console.error(`No CLI capability drives ${route}.`);
69
+ }
70
+ return 4;
71
+ }
72
+
73
+ if (json) {
74
+ console.log(JSON.stringify({
75
+ schemaVersion: 1,
76
+ ...(route === undefined ? {} : { route }),
77
+ capabilities: selected.map(cap => ({
78
+ command: cap.command,
79
+ invocation: capabilityInvocation(cap),
80
+ summary: cap.summary,
81
+ routes: cap.routes,
82
+ flags: cap.flags,
83
+ mutates: cap.mutates,
84
+ json: cap.json,
85
+ ...(cap.details ? { details: cap.details } : {}),
86
+ })),
87
+ ...(route === undefined && !mutatingOnly ? { headCapabilities: HEAD_CAPABILITIES } : {}),
88
+ }, null, 2));
89
+ return 0;
90
+ }
91
+
92
+ renderHuman(selected, route === undefined && !mutatingOnly);
93
+ return 0;
94
+ }
@@ -0,0 +1,496 @@
1
+ /**
2
+ * What `ocx` can do, as data an agent can read without parsing help text.
3
+ *
4
+ * This is the machine-readable index behind `ocx capabilities`. It relates each CLI
5
+ * capability to the management route(s) it drives, which nothing in this repository did
6
+ * before: help lived in twenty per-module `USAGE` constants and a hand-written banner
7
+ * that a test explicitly licensed to drift from the command registry.
8
+ *
9
+ * LEAF MODULE. It imports nothing from `src/cli/`, and nothing here may import a command
10
+ * module. That is not tidiness. Each command module declares its usage text as a
11
+ * top-level `const USAGE`, evaluated at import time, so a cycle back into this table
12
+ * would resolve to `undefined` under ESM rather than throwing -- silently emptying the
13
+ * usage text that `rejectArgs` hands to `CliUsageError`, in the exact error-reporting
14
+ * surface the CLI-operability issues are about. `tests/cli-capabilities.test.ts` asserts
15
+ * the absence of those imports and that every rendered usage string is non-empty, so the
16
+ * failure mode is loud instead of degraded.
17
+ *
18
+ * Head-handled surfaces (`--version`, `help`) are declared separately in
19
+ * `HEAD_CAPABILITIES`. They exit in the CLI head (`root.ts`) before dispatch and have no
20
+ * runner key, so listing them as ordinary capabilities would break the registry parity
21
+ * assertion that every canonical entry is a direct runner. `help` is excluded from
22
+ * `CLI_COMMANDS` deliberately -- `tests/cli-registry.test.ts` documents it as a
23
+ * head-handled pseudo-case -- and that decision is preserved here rather than reversed.
24
+ */
25
+
26
+ /** A management route a capability drives. Path text only; never a handler reference. */
27
+ export interface CapabilityRoute {
28
+ readonly method: "GET" | "POST" | "PUT" | "PATCH" | "DELETE";
29
+ readonly path: string;
30
+ }
31
+
32
+ export interface CapabilityFlag {
33
+ readonly name: string;
34
+ readonly value?: "string" | "number" | "boolean";
35
+ readonly required?: boolean;
36
+ readonly summary: string;
37
+ }
38
+
39
+ /**
40
+ * How a capability emits JSON.
41
+ *
42
+ * - `payload`: the API payload, largely unwrapped.
43
+ * - `envelope`: a CLI-shaped object with its own schema.
44
+ * - `none`: no `--json` mode.
45
+ */
46
+ export type CapabilityJsonMode = "payload" | "envelope" | "none";
47
+
48
+ export interface Capability {
49
+ /** Command path, e.g. `["account", "pause"]`. */
50
+ readonly command: readonly string[];
51
+ readonly summary: string;
52
+ readonly routes: readonly CapabilityRoute[];
53
+ readonly flags: readonly CapabilityFlag[];
54
+ readonly mutates: boolean;
55
+ readonly json: CapabilityJsonMode;
56
+ readonly details?: readonly string[];
57
+ /**
58
+ * Extra banner rows this capability owns, for surfaces the banner shows separately
59
+ * from the bare command (`ocx restore back`, `ocx doctor --reclaim-response-temps`).
60
+ * Without this the banner cannot equal the capability set: it legitimately carries more
61
+ * rows than there are commands.
62
+ */
63
+ readonly bannerLines?: readonly string[];
64
+ }
65
+
66
+ /**
67
+ * Surfaces resolved in the CLI head, before dispatch.
68
+ *
69
+ * They belong in `ocx capabilities` output and in the banner, but not in `CLI_COMMANDS`:
70
+ * `--version`, `-v`, and `version` are answered at `root.ts` and exit, so none of them is
71
+ * a runner key to parity-check against.
72
+ */
73
+ export interface HeadCapability {
74
+ readonly invocations: readonly string[];
75
+ readonly summary: string;
76
+ readonly bannerLine: string;
77
+ }
78
+
79
+ export const HEAD_CAPABILITIES: readonly HeadCapability[] = [
80
+ {
81
+ invocations: ["--version", "-v", "version"],
82
+ summary: "Print the CLI version and exit.",
83
+ bannerLine: "ocx --version | -v Print version",
84
+ },
85
+ {
86
+ invocations: ["help", "--help", "-h"],
87
+ summary: "Print the command list, or one command's usage with `ocx help <command>`.",
88
+ bannerLine: "ocx help [command] Show help for a command",
89
+ },
90
+ ];
91
+
92
+ /**
93
+ * Capabilities declared so far. Incomplete by design: later phases add verbs.
94
+ * `ocx capabilities` is the index of what is listed here, not of every CLI command.
95
+ * A capability must not name a route the command does not actually fetch.
96
+ */
97
+ export const CAPABILITIES: readonly Capability[] = [
98
+ {
99
+ command: ["status"],
100
+ summary: "Proxy status, injection state, and version skew between this CLI and the running proxy.",
101
+ // No management route: `collectStatus` identity-probes `/healthz` through
102
+ // `findLiveProxy` and reads local config. Declaring `GET /api/status` here was wrong
103
+ // -- that route does not exist, and the registry cross-check caught it.
104
+ routes: [],
105
+ flags: [{ name: "--json", value: "boolean", summary: "Emit the status envelope as JSON." }],
106
+ mutates: false,
107
+ json: "envelope",
108
+ details: ["Reads /healthz plus local config; drives no management API route."],
109
+ },
110
+ {
111
+ command: ["capabilities"],
112
+ summary: "List the declared CLI capabilities and the management routes they drive.",
113
+ routes: [],
114
+ flags: [
115
+ { name: "--json", value: "boolean", summary: "Emit the full capability table as JSON." },
116
+ { name: "--mutating-only", value: "boolean", summary: "Restrict output to capabilities that mutate state." },
117
+ { name: "--route", value: "string", summary: "Show which capabilities drive a management route." },
118
+ ],
119
+ mutates: false,
120
+ json: "envelope",
121
+ details: ["Start here when driving ocx programmatically: it is the declared surface index, not a complete verb list."],
122
+ },
123
+ {
124
+ command: ["provider", "list"],
125
+ summary: "Configured providers with connectivity and selected models.",
126
+ // Local config + PROVIDER_REGISTRY. Does not call GET /api/providers.
127
+ routes: [],
128
+ flags: [{ name: "--json", value: "boolean", summary: "Emit the provider list as JSON." }],
129
+ mutates: false,
130
+ json: "envelope",
131
+ details: ["Reads local config; drives no management API route."],
132
+ },
133
+ {
134
+ command: ["account", "list"],
135
+ summary: "Codex OAuth accounts with pool priority and pause state.",
136
+ routes: [{ method: "GET", path: "/api/codex-auth/accounts" }],
137
+ flags: [{ name: "--json", value: "boolean", summary: "Emit the account list as JSON." }],
138
+ mutates: false,
139
+ json: "payload",
140
+ details: [
141
+ "STATUS names `paused` alongside `selected`: a paused-but-selected account still receives requests.",
142
+ "`--quota` shows cached Codex windows (including 5h); `--refresh` bypasses the server TTL.",
143
+ ],
144
+ },
145
+ {
146
+ command: ["usage"],
147
+ summary: "Token and estimated-cost report over a time range.",
148
+ routes: [{ method: "GET", path: "/api/usage" }],
149
+ flags: [
150
+ { name: "--range", value: "string", summary: "today | 1d | 7d | 30d | all" },
151
+ { name: "--provider", value: "string", summary: "Restrict to one provider." },
152
+ { name: "--model", value: "string", summary: "Restrict to one model id." },
153
+ { name: "--json", value: "boolean", summary: "Emit the usage report as JSON." },
154
+ ],
155
+ mutates: false,
156
+ json: "payload",
157
+ details: [
158
+ "Per-account totals are withheld under `--provider` or `--model`: account rows cannot be honestly re-partitioned by provider, so the report says so rather than printing an empty table.",
159
+ "An `(ambiguous)` account row aggregates several accounts; do not read it as one identity.",
160
+ ],
161
+ },
162
+ {
163
+ command: ["account", "pause"],
164
+ summary: "Stop routing new requests to one account in the Codex pool.",
165
+ // One route, both directions: `resume` is the same PUT with `paused: false`.
166
+ routes: [{ method: "PUT", path: "/api/codex-auth/accounts/pause" }],
167
+ flags: [{ name: "--json", value: "boolean", summary: "Emit the pause result as JSON." }],
168
+ mutates: true,
169
+ json: "envelope",
170
+ details: [
171
+ "Pausing also unbinds threads pinned to the account and selects a fallback if it was active -- side effects of the route, not of the word `pause`.",
172
+ "The issue that requested this reported the route as POST; it is PUT.",
173
+ ],
174
+ },
175
+ {
176
+ command: ["account", "resume"],
177
+ summary: "Return a paused account to the Codex pool.",
178
+ routes: [{ method: "PUT", path: "/api/codex-auth/accounts/pause" }],
179
+ flags: [{ name: "--json", value: "boolean", summary: "Emit the resume result as JSON." }],
180
+ mutates: true,
181
+ json: "envelope",
182
+ },
183
+ {
184
+ command: ["account", "pause-exhausted"],
185
+ summary: "Pause every Codex account whose quota is spent.",
186
+ routes: [{ method: "PUT", path: "/api/codex-auth/accounts/pause-exhausted" }],
187
+ flags: [{ name: "--json", value: "boolean", summary: "Emit paused ids and the checked/failed counts as JSON." }],
188
+ mutates: true,
189
+ json: "envelope",
190
+ details: [
191
+ "The route refreshes quota per account and can partially fail; a non-zero failed count exits 1 and sets ok:false, because silence would read as `none were exhausted`.",
192
+ ],
193
+ },
194
+ {
195
+ command: ["account", "strategy"],
196
+ summary: "Show or set how an account pool picks the next account.",
197
+ // Both pools, because both have the setting. The Codex pool reads its applied values
198
+ // from the active payload; the Anthropic pool has its own GET.
199
+ routes: [
200
+ { method: "GET", path: "/api/codex-auth/active" },
201
+ { method: "PUT", path: "/api/codex-auth/pool-strategy" },
202
+ { method: "GET", path: "/api/oauth/accounts/pool" },
203
+ { method: "PUT", path: "/api/oauth/accounts/pool" },
204
+ ],
205
+ flags: [{ name: "--json", value: "boolean", summary: "Emit the applied strategy and sticky limit as JSON." }],
206
+ mutates: true,
207
+ json: "envelope",
208
+ details: [
209
+ "A bare invocation reads and never writes.",
210
+ "The APPLIED value is echoed, not the requested one, so a server-side normalization stays visible.",
211
+ "Values are not re-validated in the CLI: the server owns the strategy names and the 1-100 sticky bound.",
212
+ "`anthropic` is the only OAuth pool with this setting; other OAuth providers are refused without a round-trip.",
213
+ ],
214
+ },
215
+ {
216
+ command: ["account", "sticky"],
217
+ summary: "Show or set how many consecutive requests stay on one account.",
218
+ routes: [
219
+ { method: "GET", path: "/api/codex-auth/active" },
220
+ { method: "PUT", path: "/api/codex-auth/pool-strategy" },
221
+ { method: "GET", path: "/api/oauth/accounts/pool" },
222
+ { method: "PUT", path: "/api/oauth/accounts/pool" },
223
+ ],
224
+ flags: [{ name: "--json", value: "boolean", summary: "Emit the applied strategy and sticky limit as JSON." }],
225
+ mutates: true,
226
+ json: "envelope",
227
+ details: ["Only meaningful under the sticky-capable strategies; the pool strategy is the other half of this setting."],
228
+ },
229
+ {
230
+ command: ["logs"],
231
+ summary: "Recent request log rows, filterable by provider, model, conversation, and status.",
232
+ routes: [{ method: "GET", path: "/api/logs" }],
233
+ flags: [
234
+ { name: "--provider", value: "string", summary: "Restrict to one provider, matching failover attempts too." },
235
+ { name: "--model", value: "string", summary: "Restrict to one model id, matching failover attempts too." },
236
+ { name: "--conversation", value: "string", summary: "Restrict to one conversation id (`--conversationId` is accepted too)." },
237
+ { name: "--status", value: "string", summary: "An exact code (429) or a class (5xx)." },
238
+ { name: "--limit", value: "number", summary: "Row cap; defaults to 200." },
239
+ { name: "--follow", value: "boolean", summary: "Stream new rows as JSONL; implies --jsonl." },
240
+ { name: "--json", value: "boolean", summary: "Emit the server payload as JSON." },
241
+ { name: "--jsonl", value: "boolean", summary: "Emit one row per line." },
242
+ ],
243
+ mutates: false,
244
+ json: "payload",
245
+ details: [
246
+ "`--provider` and `--model` both match a failover attempt, so a request is findable by what actually served it, not only by what was asked for.",
247
+ "Rows print `conv=<id>` when the entry carries one, so a conversation filter can be told apart from an empty result.",
248
+ "`--follow` deduplicates by row id and cannot be combined with `--json`.",
249
+ ],
250
+ },
251
+ {
252
+ command: ["storage", "report"],
253
+ summary: "Disk usage under CODEX_HOME, with the log-guard protection report.",
254
+ routes: [{ method: "GET", path: "/api/storage" }],
255
+ flags: [{ name: "--json", value: "boolean", summary: "Emit the storage report as JSON." }],
256
+ mutates: false,
257
+ json: "payload",
258
+ bannerLines: ["ocx storage Storage report (default subcommand)"],
259
+ },
260
+ {
261
+ command: ["storage", "cleanup"],
262
+ summary: "Preview or delete the oldest archived sessions by percentage.",
263
+ // Both routes, because the verb always previews: the mutating route requires the digest the
264
+ // preview returns and rejects a stale one, so the two are one operation.
265
+ routes: [
266
+ { method: "POST", path: "/api/storage/cleanup/preview" },
267
+ { method: "POST", path: "/api/storage/cleanup" },
268
+ ],
269
+ flags: [
270
+ { name: "--percent", value: "number", summary: "Portion of the oldest archived sessions to target (0-100)." },
271
+ { name: "--mode", value: "string", summary: "quarantine (recoverable from trash) or permanent." },
272
+ { name: "--yes", value: "boolean", summary: "Required to actually delete; without it this is a preview." },
273
+ { name: "--json", value: "boolean", summary: "Emit the preview or result as JSON." },
274
+ ],
275
+ mutates: true,
276
+ json: "payload",
277
+ details: [
278
+ "Without `--yes` it prints what WOULD be freed and exits 0 having changed nothing.",
279
+ "There is no interactive confirmation: a prompt an agent can answer is not a safety boundary.",
280
+ "`--mode quarantine` moves files to trash, so `storage trash restore` can undo it; `permanent` cannot be undone.",
281
+ ],
282
+ },
283
+ {
284
+ command: ["storage", "trash"],
285
+ summary: "List quarantined cleanup batches, or restore one.",
286
+ routes: [
287
+ { method: "GET", path: "/api/storage/trash" },
288
+ { method: "POST", path: "/api/storage/trash/restore" },
289
+ ],
290
+ flags: [
291
+ { name: "--yes", value: "boolean", summary: "Required for restore, which moves files and reconciles database rows." },
292
+ { name: "--json", value: "boolean", summary: "Emit the trash list or restore result as JSON." },
293
+ ],
294
+ mutates: true,
295
+ json: "payload",
296
+ details: ["Restore fails with a named 409 when the destination already exists, rather than overwriting it."],
297
+ },
298
+ {
299
+ command: ["storage", "policy"],
300
+ summary: "Show, change, or run the automatic archived-session cleanup policy.",
301
+ routes: [
302
+ { method: "GET", path: "/api/storage/cleanup-policy" },
303
+ { method: "PUT", path: "/api/storage/cleanup-policy" },
304
+ { method: "POST", path: "/api/storage/cleanup-policy/run" },
305
+ ],
306
+ flags: [
307
+ { name: "--enabled", value: "string", summary: "true or false." },
308
+ { name: "--percent", value: "number", summary: "Portion of oldest archived sessions each run targets." },
309
+ { name: "--mode", value: "string", summary: "quarantine or permanent." },
310
+ { name: "--schedule", value: "string", summary: "startup, daily, weekly, or manual." },
311
+ { name: "--yes", value: "boolean", summary: "Required for `policy run`, which deletes immediately." },
312
+ { name: "--json", value: "boolean", summary: "Emit the policy or run state as JSON." },
313
+ ],
314
+ mutates: true,
315
+ json: "payload",
316
+ details: [
317
+ "`policy set` never enables implicitly: omitting `--enabled` keeps the stored value.",
318
+ "`policy run` forces a run regardless of schedule, so it needs `--yes`.",
319
+ ],
320
+ },
321
+ {
322
+ command: ["inspect", "config"],
323
+ summary: "The effective merged configuration the proxy is running.",
324
+ routes: [{ method: "GET", path: "/api/config" }],
325
+ flags: [{ name: "--json", value: "boolean", summary: "Emit the config as JSON." }],
326
+ mutates: false,
327
+ json: "payload",
328
+ },
329
+ {
330
+ command: ["inspect", "catalog"],
331
+ summary: "The generated model catalog served to clients.",
332
+ routes: [{ method: "GET", path: "/api/catalog" }],
333
+ flags: [{ name: "--json", value: "boolean", summary: "Emit the catalog as JSON." }],
334
+ mutates: false,
335
+ json: "payload",
336
+ },
337
+ {
338
+ command: ["inspect", "routing-analytics"],
339
+ summary: "Aggregate routing outcomes per provider and model.",
340
+ routes: [{ method: "GET", path: "/api/routing-analytics" }],
341
+ flags: [{ name: "--json", value: "boolean", summary: "Emit the analytics payload as JSON." }],
342
+ mutates: false,
343
+ json: "payload",
344
+ },
345
+ {
346
+ command: ["inspect", "pacing"],
347
+ summary: "Request-pacing state for one provider or all of them.",
348
+ routes: [{ method: "GET", path: "/api/provider-request-pacing" }],
349
+ flags: [
350
+ { name: "--name", value: "string", summary: "Restrict to one provider; omitted means every provider." },
351
+ { name: "--json", value: "boolean", summary: "Emit the pacing state as JSON." },
352
+ ],
353
+ mutates: false,
354
+ json: "payload",
355
+ details: ["An unknown provider name is a 404 rather than an empty result."],
356
+ },
357
+ {
358
+ command: ["inspect", "key-providers"],
359
+ summary: "Providers that authenticate with an API key rather than OAuth.",
360
+ routes: [{ method: "GET", path: "/api/key-providers" }],
361
+ flags: [{ name: "--json", value: "boolean", summary: "Emit the provider list as JSON." }],
362
+ mutates: false,
363
+ json: "payload",
364
+ },
365
+ {
366
+ command: ["inspect", "codex-prompt"],
367
+ summary: "The Codex system prompt state, or the prompt text itself.",
368
+ routes: [
369
+ { method: "GET", path: "/api/codex-prompt" },
370
+ { method: "GET", path: "/api/codex-prompt/text" },
371
+ ],
372
+ flags: [
373
+ { name: "--text", value: "boolean", summary: "Print the prompt body verbatim instead of its metadata." },
374
+ { name: "--json", value: "boolean", summary: "Emit the prompt metadata as JSON." },
375
+ ],
376
+ mutates: false,
377
+ json: "payload",
378
+ details: ["Read-only by design: the six mutating prompt routes require a dashboard session."],
379
+ },
380
+ {
381
+ command: ["inspect", "client-config"],
382
+ summary: "The generated configuration snippet for a supported client.",
383
+ routes: [{ method: "GET", path: "/api/client-config" }],
384
+ flags: [
385
+ { name: "--client", value: "string", summary: "Required client id; the route names every accepted value on error." },
386
+ { name: "--json", value: "boolean", summary: "Emit the snippet payload as JSON." },
387
+ ],
388
+ mutates: false,
389
+ json: "payload",
390
+ },
391
+ {
392
+ command: ["inspect", "star"],
393
+ summary: "Whether this repository is starred by the signed-in GitHub account.",
394
+ // GET only, permanently. The POST spends the operator identity and requires a dashboard
395
+ // session precisely so an agent cannot answer that question for them.
396
+ routes: [{ method: "GET", path: "/api/github/star" }],
397
+ flags: [{ name: "--json", value: "boolean", summary: "Emit the star status as JSON." }],
398
+ mutates: false,
399
+ json: "payload",
400
+ details: ["Starring is never available from the CLI; the verb says so rather than offering a flag that cannot work."],
401
+ },
402
+ {
403
+ command: ["inspect", "windows-tray"],
404
+ summary: "Windows tray helper state.",
405
+ routes: [{ method: "GET", path: "/api/windows-tray" }],
406
+ flags: [{ name: "--json", value: "boolean", summary: "Emit the tray state as JSON." }],
407
+ mutates: false,
408
+ json: "payload",
409
+ },
410
+ {
411
+ command: ["system", "codex-app-server"],
412
+ summary: "Codex app-server reachability and process state, as the dashboard sees it.",
413
+ routes: [{ method: "GET", path: "/api/system/codex-app-server" }],
414
+ flags: [{ name: "--json", value: "boolean", summary: "Emit the app-server state as JSON." }],
415
+ mutates: false,
416
+ json: "payload",
417
+ details: [
418
+ "The GUI reads this state directly; without a verb an agent could not tell whether the Codex app-server was reachable at all.",
419
+ ],
420
+ },
421
+ {
422
+ command: ["system", "codex-restart"],
423
+ summary: "Restart the Codex app-server.",
424
+ routes: [{ method: "POST", path: "/api/system/codex-restart" }],
425
+ flags: [
426
+ { name: "--yes", value: "boolean", summary: "Required: restarts the operator's running Codex app-server." },
427
+ { name: "--json", value: "boolean", summary: "Emit the restart result as JSON." },
428
+ ],
429
+ mutates: true,
430
+ json: "payload",
431
+ details: [
432
+ "`sync --restart-codex` is not a substitute: it restarts only as a side effect after a catalog or cache write, so it cannot restart a healthy install on request.",
433
+ "--yes is mandatory because this interrupts a running editor session, which must never happen because an agent guessed a subcommand.",
434
+ ],
435
+ },
436
+ {
437
+ command: ["claude", "desktop", "status"],
438
+ summary: "Applied-vs-desired Claude Desktop state, including staleness, drift, and health.",
439
+ routes: [{ method: "GET", path: "/api/claude-desktop/status" }],
440
+ flags: [{ name: "--json", value: "boolean", summary: "Emit the live status as JSON." }],
441
+ mutates: false,
442
+ json: "payload",
443
+ details: [
444
+ "Distinct from `claude desktop show`, which reports what this machine WOULD write; this reports what is actually in effect, which only the running proxy knows.",
445
+ ],
446
+ },
447
+ {
448
+ command: ["integration", "native"],
449
+ summary: "Show or toggle the native Claude, Claude Desktop, Codex, and Grok integrations.",
450
+ routes: [
451
+ { method: "GET", path: "/api/native-integrations" },
452
+ { method: "PUT", path: "/api/native-integrations/claude" },
453
+ { method: "PUT", path: "/api/native-integrations/claude-desktop" },
454
+ { method: "PUT", path: "/api/native-integrations/codex" },
455
+ { method: "PUT", path: "/api/native-integrations/grok" },
456
+ ],
457
+ flags: [{ name: "--json", value: "boolean", summary: "Emit the client rows or toggle result as JSON." }],
458
+ mutates: true,
459
+ json: "payload",
460
+ details: [
461
+ "The list renders per-client state, installed, and desired columns; a blocked disable is named rather than left silent.",
462
+ "Each client has its own route because a toggle rewrites that client's own config file.",
463
+ ],
464
+ },
465
+ {
466
+ command: ["agent", "request-user-input"],
467
+ summary: "Show or set whether default mode may ask the operator a question mid-task.",
468
+ routes: [
469
+ { method: "GET", path: "/api/codex-auth/features/default-mode-request-user-input" },
470
+ { method: "PUT", path: "/api/codex-auth/features/default-mode-request-user-input" },
471
+ ],
472
+ flags: [{ name: "--json", value: "boolean", summary: "Emit the feature state as JSON." }],
473
+ mutates: true,
474
+ json: "payload",
475
+ details: ["A bare invocation reads and never writes."],
476
+ },
477
+ ];
478
+
479
+ /** Capabilities that drive `route`, for `ocx capabilities --route`. */
480
+ export function capabilitiesForRoute(path: string): Capability[] {
481
+ return CAPABILITIES.filter(cap => cap.routes.some(r => r.path === path));
482
+ }
483
+
484
+ /** Every `(method, path)` pair any capability drives. */
485
+ export function capabilityRouteKeys(): Set<string> {
486
+ const keys = new Set<string>();
487
+ for (const cap of CAPABILITIES) {
488
+ for (const route of cap.routes) keys.add(`${route.method} ${route.path}`);
489
+ }
490
+ return keys;
491
+ }
492
+
493
+ /** Rendered command path, e.g. `ocx account pause`. */
494
+ export function capabilityInvocation(cap: Capability): string {
495
+ return `ocx ${cap.command.join(" ")}`;
496
+ }