@yansigit/opencodex 2.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (826) hide show
  1. package/AGENTS_INSTALL.md +109 -0
  2. package/LICENSE +21 -0
  3. package/README.md +303 -0
  4. package/assets/architecture.png +0 -0
  5. package/assets/banner.png +0 -0
  6. package/assets/claude-code-models.gif +0 -0
  7. package/assets/codex-app-picker.png +0 -0
  8. package/bin/ocx.mjs +587 -0
  9. package/bin/package-main.mjs +9 -0
  10. package/gui/dist/assets/index-BNJ7r4Gd.js +102 -0
  11. package/gui/dist/assets/index-CGoDO3uO.css +1 -0
  12. package/gui/dist/favicon.png +0 -0
  13. package/gui/dist/icons.svg +24 -0
  14. package/gui/dist/index.html +25 -0
  15. package/gui/dist/logo.png +0 -0
  16. package/gui/dist/provider-icons/alibaba-color.svg +1 -0
  17. package/gui/dist/provider-icons/antigravity-color.svg +1 -0
  18. package/gui/dist/provider-icons/claude-color.svg +1 -0
  19. package/gui/dist/provider-icons/cline-color.svg +16 -0
  20. package/gui/dist/provider-icons/cloudflare-ai-gateway-color.svg +1 -0
  21. package/gui/dist/provider-icons/commandcode-color.svg +1 -0
  22. package/gui/dist/provider-icons/copilot-color.svg +1 -0
  23. package/gui/dist/provider-icons/cursor-color.svg +2 -0
  24. package/gui/dist/provider-icons/deepseek-color.svg +1 -0
  25. package/gui/dist/provider-icons/discord.svg +1 -0
  26. package/gui/dist/provider-icons/firepass-color.svg +1 -0
  27. package/gui/dist/provider-icons/fireworks-color.svg +1 -0
  28. package/gui/dist/provider-icons/gemini-color.svg +1 -0
  29. package/gui/dist/provider-icons/github-copilot-color.svg +1 -0
  30. package/gui/dist/provider-icons/gitlab-duo-color.svg +1 -0
  31. package/gui/dist/provider-icons/grok.svg +1 -0
  32. package/gui/dist/provider-icons/groq-color.svg +1 -0
  33. package/gui/dist/provider-icons/huggingface-color.svg +1 -0
  34. package/gui/dist/provider-icons/kimi-color.svg +1 -0
  35. package/gui/dist/provider-icons/kiro-color.svg +15 -0
  36. package/gui/dist/provider-icons/lm-studio-color.svg +1 -0
  37. package/gui/dist/provider-icons/mistral-color.svg +1 -0
  38. package/gui/dist/provider-icons/moonshot-color.svg +1 -0
  39. package/gui/dist/provider-icons/nvidia-color.svg +1 -0
  40. package/gui/dist/provider-icons/ollama-color.svg +1 -0
  41. package/gui/dist/provider-icons/openai.svg +1 -0
  42. package/gui/dist/provider-icons/opencode.svg +2 -0
  43. package/gui/dist/provider-icons/openrouter-color.svg +1 -0
  44. package/gui/dist/provider-icons/pi.svg +21 -0
  45. package/gui/dist/provider-icons/qianfan-color.svg +1 -0
  46. package/gui/dist/provider-icons/qwen-portal-color.svg +1 -0
  47. package/gui/dist/provider-icons/telegram.svg +1 -0
  48. package/gui/dist/provider-icons/vercel-ai-gateway-color.svg +1 -0
  49. package/gui/dist/provider-icons/vllm-color.svg +1 -0
  50. package/gui/dist/provider-icons/xiaomi-color.svg +1 -0
  51. package/package.json +108 -0
  52. package/src/AGENTS.md +28 -0
  53. package/src/adapters/anthropic-image-guard.ts +251 -0
  54. package/src/adapters/anthropic-image-normalize.ts +518 -0
  55. package/src/adapters/anthropic-output-schema.ts +137 -0
  56. package/src/adapters/anthropic.ts +1327 -0
  57. package/src/adapters/azure.ts +36 -0
  58. package/src/adapters/base.ts +121 -0
  59. package/src/adapters/client-fingerprint.ts +65 -0
  60. package/src/adapters/cline-pass-deepseek-v4-tool-replay.ts +69 -0
  61. package/src/adapters/command-code.ts +601 -0
  62. package/src/adapters/cursor/arg-codec.ts +38 -0
  63. package/src/adapters/cursor/arg-normalize.ts +104 -0
  64. package/src/adapters/cursor/checkpoint-store.ts +303 -0
  65. package/src/adapters/cursor/cursor-errors.ts +288 -0
  66. package/src/adapters/cursor/discovery.ts +333 -0
  67. package/src/adapters/cursor/effort-map.ts +151 -0
  68. package/src/adapters/cursor/exec-policy.ts +88 -0
  69. package/src/adapters/cursor/framing.ts +250 -0
  70. package/src/adapters/cursor/gen/agent_pb.ts +15274 -0
  71. package/src/adapters/cursor/h2-pool.ts +123 -0
  72. package/src/adapters/cursor/http1-bidi.ts +361 -0
  73. package/src/adapters/cursor/images.ts +704 -0
  74. package/src/adapters/cursor/kv-store.ts +52 -0
  75. package/src/adapters/cursor/live-models.ts +269 -0
  76. package/src/adapters/cursor/live-smoke-gate.ts +41 -0
  77. package/src/adapters/cursor/live-transport.ts +1653 -0
  78. package/src/adapters/cursor/mcp-config.ts +42 -0
  79. package/src/adapters/cursor/mcp-manager.ts +333 -0
  80. package/src/adapters/cursor/message-mapper.ts +49 -0
  81. package/src/adapters/cursor/native-exec-common.ts +76 -0
  82. package/src/adapters/cursor/native-exec-desktop.ts +184 -0
  83. package/src/adapters/cursor/native-exec-fs.ts +332 -0
  84. package/src/adapters/cursor/native-exec-mcp.ts +153 -0
  85. package/src/adapters/cursor/native-exec-network.ts +43 -0
  86. package/src/adapters/cursor/native-exec-shell.ts +547 -0
  87. package/src/adapters/cursor/native-exec-tools.ts +118 -0
  88. package/src/adapters/cursor/native-exec.ts +663 -0
  89. package/src/adapters/cursor/protobuf-events.ts +1381 -0
  90. package/src/adapters/cursor/protobuf-request.ts +1032 -0
  91. package/src/adapters/cursor/request-builder.ts +461 -0
  92. package/src/adapters/cursor/thread-continuity.ts +67 -0
  93. package/src/adapters/cursor/tool-definitions.ts +735 -0
  94. package/src/adapters/cursor/tool-result-normalize.ts +92 -0
  95. package/src/adapters/cursor/transport-retry.ts +132 -0
  96. package/src/adapters/cursor/transport.ts +79 -0
  97. package/src/adapters/cursor/types.ts +79 -0
  98. package/src/adapters/cursor.ts +322 -0
  99. package/src/adapters/google-antigravity-hosts.ts +48 -0
  100. package/src/adapters/google-antigravity-replay.ts +827 -0
  101. package/src/adapters/google-antigravity-tools.ts +105 -0
  102. package/src/adapters/google-antigravity-wire.ts +141 -0
  103. package/src/adapters/google-errors.ts +92 -0
  104. package/src/adapters/google-http.ts +460 -0
  105. package/src/adapters/google-tool-schema.ts +238 -0
  106. package/src/adapters/google-truncation.ts +24 -0
  107. package/src/adapters/google-wire-compiler.ts +232 -0
  108. package/src/adapters/google.ts +1377 -0
  109. package/src/adapters/identity.ts +77 -0
  110. package/src/adapters/image.ts +23 -0
  111. package/src/adapters/kiro-constants.ts +16 -0
  112. package/src/adapters/kiro-errors.ts +208 -0
  113. package/src/adapters/kiro-events.ts +197 -0
  114. package/src/adapters/kiro-images.ts +129 -0
  115. package/src/adapters/kiro-retry.ts +312 -0
  116. package/src/adapters/kiro-thinking.ts +112 -0
  117. package/src/adapters/kiro-tool-fallback.ts +36 -0
  118. package/src/adapters/kiro-tools.ts +224 -0
  119. package/src/adapters/kiro-truncation.ts +33 -0
  120. package/src/adapters/kiro-wire.ts +129 -0
  121. package/src/adapters/kiro.ts +1936 -0
  122. package/src/adapters/mimo-free.ts +280 -0
  123. package/src/adapters/openai-chat-url.ts +11 -0
  124. package/src/adapters/openai-chat.ts +1980 -0
  125. package/src/adapters/openai-responses-url.ts +16 -0
  126. package/src/adapters/openai-responses.ts +1911 -0
  127. package/src/adapters/registry.ts +175 -0
  128. package/src/adapters/responses-tool-schema.ts +67 -0
  129. package/src/adapters/run-turn-queue.ts +114 -0
  130. package/src/adapters/tool-call-id.ts +119 -0
  131. package/src/adapters/tool-catalog-nudge.ts +154 -0
  132. package/src/adapters/upstream-http-error.ts +48 -0
  133. package/src/adapters/xai-web-search.ts +185 -0
  134. package/src/bridge.ts +1986 -0
  135. package/src/chat/inbound.ts +319 -0
  136. package/src/chat/outbound.ts +821 -0
  137. package/src/claude/agents-inject.ts +266 -0
  138. package/src/claude/alias.ts +149 -0
  139. package/src/claude/auth-detect.ts +229 -0
  140. package/src/claude/auth-mode-migration.ts +32 -0
  141. package/src/claude/auth-mode.ts +62 -0
  142. package/src/claude/context-windows.ts +205 -0
  143. package/src/claude/desktop-3p-guard.ts +35 -0
  144. package/src/claude/desktop-3p-paths.ts +84 -0
  145. package/src/claude/desktop-3p.ts +615 -0
  146. package/src/claude/desktop-health.ts +26 -0
  147. package/src/claude/desktop-profile.ts +263 -0
  148. package/src/claude/gateway-cache.ts +107 -0
  149. package/src/claude/inbound-debug.ts +163 -0
  150. package/src/claude/inbound.ts +578 -0
  151. package/src/claude/model-info.ts +174 -0
  152. package/src/claude/outbound.ts +926 -0
  153. package/src/cli/access.ts +108 -0
  154. package/src/cli/account-api.ts +302 -0
  155. package/src/cli/account-auth.ts +250 -0
  156. package/src/cli/account-catalog-refresh.ts +14 -0
  157. package/src/cli/account-extended.ts +737 -0
  158. package/src/cli/account-main.ts +317 -0
  159. package/src/cli/account.ts +299 -0
  160. package/src/cli/agent-driven.ts +70 -0
  161. package/src/cli/agent.ts +290 -0
  162. package/src/cli/catalog-prewarm.ts +27 -0
  163. package/src/cli/claude-agent-startup-sync.ts +73 -0
  164. package/src/cli/claude-desktop.ts +213 -0
  165. package/src/cli/claude.ts +355 -0
  166. package/src/cli/codex-log-guard-doctor.ts +103 -0
  167. package/src/cli/codex-shim-autorestore.ts +47 -0
  168. package/src/cli/codex-shim-readiness.ts +76 -0
  169. package/src/cli/combo.ts +127 -0
  170. package/src/cli/config-command.ts +209 -0
  171. package/src/cli/debug.ts +228 -0
  172. package/src/cli/dispatch.ts +585 -0
  173. package/src/cli/doctor.ts +1202 -0
  174. package/src/cli/ensure-desired-integrations.ts +152 -0
  175. package/src/cli/export-command.ts +213 -0
  176. package/src/cli/help.ts +101 -0
  177. package/src/cli/index.ts +973 -0
  178. package/src/cli/init.ts +211 -0
  179. package/src/cli/integrations.ts +260 -0
  180. package/src/cli/interactive-confirm.ts +133 -0
  181. package/src/cli/lab.ts +607 -0
  182. package/src/cli/launcher-context.ts +77 -0
  183. package/src/cli/minimax.ts +497 -0
  184. package/src/cli/models-runtime.ts +245 -0
  185. package/src/cli/models.ts +422 -0
  186. package/src/cli/observe.ts +206 -0
  187. package/src/cli/opencode.ts +588 -0
  188. package/src/cli/provider-replit.ts +232 -0
  189. package/src/cli/provider-runtime.ts +179 -0
  190. package/src/cli/provider.ts +492 -0
  191. package/src/cli/ready.ts +301 -0
  192. package/src/cli/registry.ts +422 -0
  193. package/src/cli/replit-gateway-key-input.ts +138 -0
  194. package/src/cli/root.ts +86 -0
  195. package/src/cli/route-policy.ts +92 -0
  196. package/src/cli/runtime-api.ts +328 -0
  197. package/src/cli/star-prompt.ts +211 -0
  198. package/src/cli/status-oauth.ts +78 -0
  199. package/src/cli/status.ts +328 -0
  200. package/src/cli/system-command.ts +112 -0
  201. package/src/cli/system-restart-client.ts +146 -0
  202. package/src/cli/tray-proxy.ts +199 -0
  203. package/src/cli/v2.ts +268 -0
  204. package/src/cli.ts +10 -0
  205. package/src/clients/config-export.ts +1704 -0
  206. package/src/codex/account-id.ts +34 -0
  207. package/src/codex/account-label.ts +47 -0
  208. package/src/codex/account-lifecycle.ts +172 -0
  209. package/src/codex/account-namespace-match.ts +63 -0
  210. package/src/codex/account-namespaces.ts +195 -0
  211. package/src/codex/account-pause.ts +20 -0
  212. package/src/codex/account-priority.ts +83 -0
  213. package/src/codex/account-runtime-state.ts +31 -0
  214. package/src/codex/account-store.ts +544 -0
  215. package/src/codex/account-usability.ts +43 -0
  216. package/src/codex/admission.ts +256 -0
  217. package/src/codex/affinity-debug.ts +162 -0
  218. package/src/codex/agent-roles-sync.ts +225 -0
  219. package/src/codex/agent-roles.ts +238 -0
  220. package/src/codex/app-server-processes.ts +1143 -0
  221. package/src/codex/app-server-restart-service.ts +232 -0
  222. package/src/codex/auth-api.ts +2147 -0
  223. package/src/codex/auth-collision.ts +109 -0
  224. package/src/codex/auth-context.ts +665 -0
  225. package/src/codex/autostart-health.ts +156 -0
  226. package/src/codex/catalog/account-models.ts +67 -0
  227. package/src/codex/catalog/aggregation.ts +436 -0
  228. package/src/codex/catalog/bundled.ts +549 -0
  229. package/src/codex/catalog/effort.ts +446 -0
  230. package/src/codex/catalog/filesystem-evidence.ts +302 -0
  231. package/src/codex/catalog/kinds.ts +2 -0
  232. package/src/codex/catalog/metadata.ts +664 -0
  233. package/src/codex/catalog/native-models.ts +72 -0
  234. package/src/codex/catalog/parsing.ts +650 -0
  235. package/src/codex/catalog/provider-fetch.ts +2064 -0
  236. package/src/codex/catalog/sync.ts +1883 -0
  237. package/src/codex/catalog-admission.ts +199 -0
  238. package/src/codex/catalog-refresh-status.ts +105 -0
  239. package/src/codex/catalog-write-serialization.ts +242 -0
  240. package/src/codex/catalog.ts +14 -0
  241. package/src/codex/codex-write-lock.ts +384 -0
  242. package/src/codex/convergence-types.ts +614 -0
  243. package/src/codex/convergence.ts +651 -0
  244. package/src/codex/coordinator-doctor.ts +332 -0
  245. package/src/codex/custom-model-catalog-migration.ts +176 -0
  246. package/src/codex/data/upstream-models.json +830 -0
  247. package/src/codex/desired-state.ts +230 -0
  248. package/src/codex/exec-invocation.ts +22 -0
  249. package/src/codex/features.ts +1566 -0
  250. package/src/codex/generation.ts +202 -0
  251. package/src/codex/history-job.ts +407 -0
  252. package/src/codex/history-lock.ts +242 -0
  253. package/src/codex/history-migration-guardian.ts +108 -0
  254. package/src/codex/history-provider.ts +979 -0
  255. package/src/codex/history-transition.ts +105 -0
  256. package/src/codex/history-worker.ts +220 -0
  257. package/src/codex/home.ts +206 -0
  258. package/src/codex/inject-coordination.ts +290 -0
  259. package/src/codex/inject.ts +1733 -0
  260. package/src/codex/injected-marker.ts +106 -0
  261. package/src/codex/integration-record.ts +266 -0
  262. package/src/codex/internal/catalog-writer.ts +203 -0
  263. package/src/codex/internal/history-writer.ts +80 -0
  264. package/src/codex/journal.ts +225 -0
  265. package/src/codex/log-guard/inspect.ts +506 -0
  266. package/src/codex/log-guard/lock.ts +150 -0
  267. package/src/codex/log-guard/maintenance.ts +403 -0
  268. package/src/codex/log-guard/path-safety.ts +88 -0
  269. package/src/codex/log-guard/policy.ts +44 -0
  270. package/src/codex/log-guard/processes.ts +205 -0
  271. package/src/codex/log-guard/protection.ts +489 -0
  272. package/src/codex/log-guard/sqlite-errors.ts +9 -0
  273. package/src/codex/main-account-cache.ts +56 -0
  274. package/src/codex/main-account.ts +68 -0
  275. package/src/codex/management-convergence.ts +167 -0
  276. package/src/codex/model-cache.ts +273 -0
  277. package/src/codex/model-entitlements.ts +353 -0
  278. package/src/codex/native-main-admission.ts +47 -0
  279. package/src/codex/native-main-auth-temp.ts +187 -0
  280. package/src/codex/native-main-claim.ts +178 -0
  281. package/src/codex/native-main-lock-file.ts +162 -0
  282. package/src/codex/native-main-owner.ts +329 -0
  283. package/src/codex/native-profile-api.ts +247 -0
  284. package/src/codex/native-profile-manager.ts +1531 -0
  285. package/src/codex/native-profile-processes.ts +121 -0
  286. package/src/codex/native-profile-recovery.ts +99 -0
  287. package/src/codex/native-profile-stage-store.ts +387 -0
  288. package/src/codex/native-profile-startup.ts +492 -0
  289. package/src/codex/native-profile-store.ts +855 -0
  290. package/src/codex/native-profile-types.ts +120 -0
  291. package/src/codex/native-residue.ts +682 -0
  292. package/src/codex/paths.ts +144 -0
  293. package/src/codex/plan-from-token.ts +140 -0
  294. package/src/codex/plan.ts +40 -0
  295. package/src/codex/plugins-doctor.ts +242 -0
  296. package/src/codex/pool-rotation.ts +295 -0
  297. package/src/codex/project-config-warnings.ts +425 -0
  298. package/src/codex/prompt-journal.ts +352 -0
  299. package/src/codex/prompt-layers.ts +967 -0
  300. package/src/codex/prompt-lock.ts +143 -0
  301. package/src/codex/quota-rejection.ts +298 -0
  302. package/src/codex/quota.ts +573 -0
  303. package/src/codex/refresh.ts +62 -0
  304. package/src/codex/reset-credit-recovery.ts +1044 -0
  305. package/src/codex/routing.ts +1888 -0
  306. package/src/codex/runtime.ts +659 -0
  307. package/src/codex/shim.ts +2170 -0
  308. package/src/codex/subagent-defaults.ts +550 -0
  309. package/src/codex/subagent-model-fallback.ts +784 -0
  310. package/src/codex/sync.ts +319 -0
  311. package/src/codex/transition-state.ts +612 -0
  312. package/src/codex/upstream-host-health.ts +368 -0
  313. package/src/codex/user-identity.ts +557 -0
  314. package/src/codex/warmup.ts +298 -0
  315. package/src/codex/websocket-registry.ts +100 -0
  316. package/src/codex/write-coordination.ts +114 -0
  317. package/src/combos/failover.ts +160 -0
  318. package/src/combos/index.ts +45 -0
  319. package/src/combos/request.ts +94 -0
  320. package/src/combos/resolve.ts +232 -0
  321. package/src/combos/types.ts +398 -0
  322. package/src/config/provider-name.ts +24 -0
  323. package/src/config.ts +4041 -0
  324. package/src/fork/register.ts +3 -0
  325. package/src/generated/compatibility-version.json +3116 -0
  326. package/src/generated/model-metadata.ts +106 -0
  327. package/src/github/star-state.ts +203 -0
  328. package/src/grok/inject.ts +530 -0
  329. package/src/grok/inspect.ts +45 -0
  330. package/src/grok/status.ts +121 -0
  331. package/src/grok/sync.ts +66 -0
  332. package/src/images/artifacts.ts +516 -0
  333. package/src/images/fulfill-video.ts +163 -0
  334. package/src/images/fulfill.ts +149 -0
  335. package/src/images/index.ts +4 -0
  336. package/src/images/loop.ts +955 -0
  337. package/src/images/plan.ts +143 -0
  338. package/src/images/synthetic-tool.ts +133 -0
  339. package/src/images/types.ts +41 -0
  340. package/src/images/xai-client.ts +141 -0
  341. package/src/images/xai-video-client.ts +163 -0
  342. package/src/index.ts +22 -0
  343. package/src/integrations/config-io.ts +269 -0
  344. package/src/integrations/journal.ts +315 -0
  345. package/src/integrations/merge.ts +135 -0
  346. package/src/integrations/mutation-flight.ts +71 -0
  347. package/src/integrations/native/ownership-preflight.ts +202 -0
  348. package/src/integrations/omp-yaml-source.ts +358 -0
  349. package/src/integrations/owned-refresh.ts +74 -0
  350. package/src/integrations/ownership.ts +111 -0
  351. package/src/integrations/registry.ts +159 -0
  352. package/src/integrations/serialize.ts +314 -0
  353. package/src/integrations/state.ts +361 -0
  354. package/src/integrations/store.ts +103 -0
  355. package/src/integrations/writer-lock.ts +98 -0
  356. package/src/integrations/writer.ts +691 -0
  357. package/src/lab/artifacts/sanitize.ts +586 -0
  358. package/src/lab/artifacts/secure-fs.ts +475 -0
  359. package/src/lab/artifacts/store.ts +310 -0
  360. package/src/lab/automation/budgets.ts +78 -0
  361. package/src/lab/automation/config-persistence.ts +256 -0
  362. package/src/lab/automation/constants.ts +39 -0
  363. package/src/lab/automation/cooldown.ts +103 -0
  364. package/src/lab/automation/dispatch.ts +211 -0
  365. package/src/lab/automation/index.ts +13 -0
  366. package/src/lab/automation/orchestrator.ts +499 -0
  367. package/src/lab/automation/persistence.ts +512 -0
  368. package/src/lab/automation/planner.ts +371 -0
  369. package/src/lab/automation/policy.ts +136 -0
  370. package/src/lab/automation/queue.ts +191 -0
  371. package/src/lab/automation/recovery.ts +24 -0
  372. package/src/lab/automation/route-context.ts +21 -0
  373. package/src/lab/automation/run-key.ts +44 -0
  374. package/src/lab/automation/runs-query.ts +34 -0
  375. package/src/lab/automation/types.ts +160 -0
  376. package/src/lab/conformance/assertion.ts +325 -0
  377. package/src/lab/conformance/digest.ts +22 -0
  378. package/src/lab/conformance/executor.ts +741 -0
  379. package/src/lab/conformance/fixture-provider.ts +27 -0
  380. package/src/lab/conformance/fixtures/live-v1-cases.json +175 -0
  381. package/src/lab/conformance/fixtures/protocol-v1-cases.json +461 -0
  382. package/src/lab/conformance/harness-budget.ts +47 -0
  383. package/src/lab/conformance/index.ts +5 -0
  384. package/src/lab/conformance/jcs.ts +64 -0
  385. package/src/lab/conformance/json-pointer.ts +39 -0
  386. package/src/lab/conformance/manifest.ts +180 -0
  387. package/src/lab/conformance/mcp-stub.ts +179 -0
  388. package/src/lab/conformance/negative-controls.ts +164 -0
  389. package/src/lab/conformance/observation.ts +355 -0
  390. package/src/lab/conformance/runner.ts +68 -0
  391. package/src/lab/conformance/sse-normalize.ts +59 -0
  392. package/src/lab/conformance/suite-manifest.ts +78 -0
  393. package/src/lab/conformance/types.ts +214 -0
  394. package/src/lab/constants.ts +126 -0
  395. package/src/lab/digest.ts +64 -0
  396. package/src/lab/events/errors.ts +9 -0
  397. package/src/lab/events/limits.ts +117 -0
  398. package/src/lab/events/types.ts +229 -0
  399. package/src/lab/events/validate.ts +781 -0
  400. package/src/lab/fabric/constants.ts +40 -0
  401. package/src/lab/fabric/executor.ts +492 -0
  402. package/src/lab/fabric/index.ts +80 -0
  403. package/src/lab/fabric/manifest.ts +222 -0
  404. package/src/lab/fabric/observe.ts +489 -0
  405. package/src/lab/fabric/patch.ts +79 -0
  406. package/src/lab/fabric/producer-child.ts +139 -0
  407. package/src/lab/fabric/producer-isolate.ts +276 -0
  408. package/src/lab/fabric/producer-protocol.ts +61 -0
  409. package/src/lab/fabric/scratch.ts +439 -0
  410. package/src/lab/fabric/subject.ts +106 -0
  411. package/src/lab/fabric/types.ts +134 -0
  412. package/src/lab/fabric/verifier.ts +98 -0
  413. package/src/lab/index.ts +54 -0
  414. package/src/lab/ledger/artifact-refs.ts +127 -0
  415. package/src/lab/ledger/invalidation.ts +136 -0
  416. package/src/lab/ledger/purge.ts +310 -0
  417. package/src/lab/ledger/store.ts +532 -0
  418. package/src/lab/live/credential-lease.ts +53 -0
  419. package/src/lab/live/destination.ts +155 -0
  420. package/src/lab/live/executor.ts +336 -0
  421. package/src/lab/live/inert-tools.ts +56 -0
  422. package/src/lab/live/manifest.ts +85 -0
  423. package/src/lab/live/mcp-loopback.ts +57 -0
  424. package/src/lab/live/runner.ts +19 -0
  425. package/src/lab/live/sandbox.ts +61 -0
  426. package/src/lab/live/suite-manifest.ts +41 -0
  427. package/src/lab/live/transport.ts +118 -0
  428. package/src/lab/live/types.ts +197 -0
  429. package/src/lab/observe/from-conformance.ts +301 -0
  430. package/src/lab/observe/from-live.ts +117 -0
  431. package/src/lab/paths.ts +153 -0
  432. package/src/lab/projection/rebuild.ts +495 -0
  433. package/src/lab/projection/schema.ts +135 -0
  434. package/src/lab/projection/verdicts.ts +474 -0
  435. package/src/lab/projection/verification.ts +412 -0
  436. package/src/lab/public/bundle.ts +217 -0
  437. package/src/lab/public/community-authority.ts +175 -0
  438. package/src/lab/public/community-files.ts +29 -0
  439. package/src/lab/public/community.ts +479 -0
  440. package/src/lab/public/file-safety.ts +155 -0
  441. package/src/lab/public/ids.ts +26 -0
  442. package/src/lab/public/index.ts +16 -0
  443. package/src/lab/public/mutation-lock.ts +424 -0
  444. package/src/lab/public/operator.ts +353 -0
  445. package/src/lab/public/origin-purge.ts +79 -0
  446. package/src/lab/public/origin.ts +203 -0
  447. package/src/lab/public/privacy.ts +143 -0
  448. package/src/lab/public/private-file.ts +261 -0
  449. package/src/lab/public/project.ts +124 -0
  450. package/src/lab/public/purge-test-fault.ts +21 -0
  451. package/src/lab/public/purge.ts +223 -0
  452. package/src/lab/public/registry.ts +44 -0
  453. package/src/lab/public/revocation.ts +252 -0
  454. package/src/lab/public/signature.ts +243 -0
  455. package/src/lab/public/storage.ts +105 -0
  456. package/src/lab/public/strict-json.ts +206 -0
  457. package/src/lab/public/time.ts +26 -0
  458. package/src/lab/public/types.ts +172 -0
  459. package/src/lab/public/validate.ts +391 -0
  460. package/src/lab/query/catalog.ts +101 -0
  461. package/src/lab/query/connection.ts +107 -0
  462. package/src/lab/query/constants.ts +4 -0
  463. package/src/lab/query/cursor.ts +132 -0
  464. package/src/lab/query/dto-map.ts +277 -0
  465. package/src/lab/query/errors.ts +22 -0
  466. package/src/lab/query/freshness.ts +53 -0
  467. package/src/lab/query/index.ts +45 -0
  468. package/src/lab/query/latest-observation.ts +59 -0
  469. package/src/lab/query/passive-production.ts +159 -0
  470. package/src/lab/query/queries.ts +444 -0
  471. package/src/lab/query/types.ts +266 -0
  472. package/src/lab/subject/behavior-fingerprint.ts +77 -0
  473. package/src/lab/subject/installation-salt.ts +112 -0
  474. package/src/lab/subject/protocol-subject.ts +80 -0
  475. package/src/lab/subject/route-subject.ts +74 -0
  476. package/src/lib/abort.ts +146 -0
  477. package/src/lib/admin-secrets.ts +25 -0
  478. package/src/lib/admission.ts +83 -0
  479. package/src/lib/app-owned-memory-stores.ts +195 -0
  480. package/src/lib/app-owned-memory.ts +265 -0
  481. package/src/lib/bounded-body.ts +346 -0
  482. package/src/lib/bun-binary-validator.d.mts +3 -0
  483. package/src/lib/bun-binary-validator.mjs +18 -0
  484. package/src/lib/bun-runtime.ts +184 -0
  485. package/src/lib/bun-stream-caps.ts +130 -0
  486. package/src/lib/codex-restart-contract.ts +120 -0
  487. package/src/lib/config-ownership.ts +364 -0
  488. package/src/lib/crash-guard.ts +344 -0
  489. package/src/lib/debug-log-buffer.ts +83 -0
  490. package/src/lib/debug-settings.ts +108 -0
  491. package/src/lib/debug.ts +31 -0
  492. package/src/lib/destination-policy.ts +380 -0
  493. package/src/lib/errors.ts +406 -0
  494. package/src/lib/eventstream-decoder.ts +253 -0
  495. package/src/lib/fabric-task-execution-authority.ts +7 -0
  496. package/src/lib/fabric-task-host.ts +29 -0
  497. package/src/lib/gcp-adc.ts +341 -0
  498. package/src/lib/injection-debug-log.ts +58 -0
  499. package/src/lib/lab-activation.ts +223 -0
  500. package/src/lib/lab-live-execution-authority.ts +13 -0
  501. package/src/lib/lab-live-host.ts +30 -0
  502. package/src/lib/lab-live-pinned-sender.ts +56 -0
  503. package/src/lib/lab-live-route-production.ts +130 -0
  504. package/src/lib/lab-passive-linker-registration.ts +26 -0
  505. package/src/lib/local-management-attestation.ts +51 -0
  506. package/src/lib/local-management-capability.ts +100 -0
  507. package/src/lib/local-provider-reload-contract.ts +100 -0
  508. package/src/lib/open-url.ts +25 -0
  509. package/src/lib/optional-shutdown-hooks.ts +57 -0
  510. package/src/lib/pinned-http.ts +270 -0
  511. package/src/lib/privacy.ts +20 -0
  512. package/src/lib/process-control.ts +168 -0
  513. package/src/lib/provider-outbound.ts +210 -0
  514. package/src/lib/provider-url.ts +14 -0
  515. package/src/lib/proxy-env.ts +18 -0
  516. package/src/lib/redact.ts +521 -0
  517. package/src/lib/retry-after.ts +55 -0
  518. package/src/lib/self-launch-argv.ts +15 -0
  519. package/src/lib/server-resource-ownership.ts +71 -0
  520. package/src/lib/service-secrets.ts +25 -0
  521. package/src/lib/shadow-call.ts +61 -0
  522. package/src/lib/sidecar-tracker.ts +52 -0
  523. package/src/lib/sse-decoder.ts +364 -0
  524. package/src/lib/state-store-registrations.ts +119 -0
  525. package/src/lib/state-store-sweeper.ts +184 -0
  526. package/src/lib/system-restart-contract.ts +73 -0
  527. package/src/lib/test-home-guard.ts +90 -0
  528. package/src/lib/token-estimate.ts +86 -0
  529. package/src/lib/tool-argument-integers.ts +202 -0
  530. package/src/lib/translator-budget.ts +400 -0
  531. package/src/lib/upstream-http-version.ts +57 -0
  532. package/src/lib/upstream-reachability.ts +95 -0
  533. package/src/lib/upstream-retry.ts +392 -0
  534. package/src/lib/win-exec.ts +115 -0
  535. package/src/lib/win-paths.ts +68 -0
  536. package/src/lib/windows-atomic-replace.ts +156 -0
  537. package/src/lib/windows-elevation.ts +773 -0
  538. package/src/lib/windows-secret-acl.ts +854 -0
  539. package/src/lib/windows-service-wrappers.ts +72 -0
  540. package/src/lib/windows-text.ts +106 -0
  541. package/src/lib/windows-user-principal.ts +341 -0
  542. package/src/lib/winsw.ts +403 -0
  543. package/src/oauth/account-import/google-antigravity-adapter.ts +74 -0
  544. package/src/oauth/account-import/index.ts +15 -0
  545. package/src/oauth/account-import/parser.ts +83 -0
  546. package/src/oauth/account-import/registry.ts +18 -0
  547. package/src/oauth/account-import/service.ts +75 -0
  548. package/src/oauth/account-import/types.ts +91 -0
  549. package/src/oauth/anthropic-routing.ts +594 -0
  550. package/src/oauth/anthropic.ts +188 -0
  551. package/src/oauth/antigravity-routing.ts +151 -0
  552. package/src/oauth/callback-server.ts +300 -0
  553. package/src/oauth/chatgpt.ts +161 -0
  554. package/src/oauth/command-code.ts +239 -0
  555. package/src/oauth/cursor.ts +252 -0
  556. package/src/oauth/github-copilot.ts +428 -0
  557. package/src/oauth/google-antigravity.ts +262 -0
  558. package/src/oauth/health.ts +407 -0
  559. package/src/oauth/index.ts +1504 -0
  560. package/src/oauth/key-providers.ts +124 -0
  561. package/src/oauth/kimi.ts +227 -0
  562. package/src/oauth/kiro-credentials.ts +726 -0
  563. package/src/oauth/kiro.ts +621 -0
  564. package/src/oauth/local-token-detect.ts +130 -0
  565. package/src/oauth/log.ts +50 -0
  566. package/src/oauth/login-cli.ts +223 -0
  567. package/src/oauth/nous.ts +798 -0
  568. package/src/oauth/pkce.ts +15 -0
  569. package/src/oauth/store.ts +728 -0
  570. package/src/oauth/token-guardian.ts +309 -0
  571. package/src/oauth/types.ts +62 -0
  572. package/src/oauth/xai.ts +241 -0
  573. package/src/providers/alibaba-region-backup.ts +75 -0
  574. package/src/providers/alibaba-region-migration.ts +156 -0
  575. package/src/providers/alibaba-region-startup.ts +36 -0
  576. package/src/providers/antigravity-models.ts +695 -0
  577. package/src/providers/antigravity-quota.ts +216 -0
  578. package/src/providers/api-keys.ts +140 -0
  579. package/src/providers/base-url-choices.ts +74 -0
  580. package/src/providers/codex-capacity.ts +292 -0
  581. package/src/providers/command-code-efforts.ts +144 -0
  582. package/src/providers/context-cap.ts +82 -0
  583. package/src/providers/cursor-pool.ts +72 -0
  584. package/src/providers/derive.ts +586 -0
  585. package/src/providers/fastwire.ts +501 -0
  586. package/src/providers/free-directory.ts +187 -0
  587. package/src/providers/github-copilot-transport.ts +56 -0
  588. package/src/providers/google-vertex-location.ts +14 -0
  589. package/src/providers/key-failover.ts +271 -0
  590. package/src/providers/kiro-models.ts +67 -0
  591. package/src/providers/label.ts +19 -0
  592. package/src/providers/model-discovery-limits.ts +16 -0
  593. package/src/providers/model-discovery.ts +449 -0
  594. package/src/providers/model-rename-migration.ts +255 -0
  595. package/src/providers/model-rename-startup.ts +28 -0
  596. package/src/providers/openai-sidecar.ts +243 -0
  597. package/src/providers/openai-tier-startup.ts +56 -0
  598. package/src/providers/openai-tiers.ts +423 -0
  599. package/src/providers/openai-virtual-models.ts +83 -0
  600. package/src/providers/opencode-zen-rate-limit.ts +102 -0
  601. package/src/providers/openrouter-routing.ts +102 -0
  602. package/src/providers/provider-id-rewrite.ts +185 -0
  603. package/src/providers/quota.ts +2345 -0
  604. package/src/providers/registry.ts +2918 -0
  605. package/src/providers/replit/constants.ts +27 -0
  606. package/src/providers/replit/derive.ts +85 -0
  607. package/src/providers/replit/headers.ts +28 -0
  608. package/src/providers/replit/origin.ts +55 -0
  609. package/src/providers/replit/pair-install-response.ts +72 -0
  610. package/src/providers/replit/probe.ts +199 -0
  611. package/src/providers/replit/setup.ts +350 -0
  612. package/src/providers/request-pacing.ts +310 -0
  613. package/src/providers/service-tier.ts +277 -0
  614. package/src/providers/slug-codec.ts +103 -0
  615. package/src/providers/static-model-discovery.ts +86 -0
  616. package/src/providers/xai-responses-opt-in.ts +15 -0
  617. package/src/providers/xai-transport.ts +148 -0
  618. package/src/reasoning-effort.ts +183 -0
  619. package/src/responses/compaction.ts +142 -0
  620. package/src/responses/custom-tool-compat.ts +266 -0
  621. package/src/responses/hosted-tool-policy.ts +9 -0
  622. package/src/responses/namespace-tool-compat.ts +355 -0
  623. package/src/responses/parser.ts +838 -0
  624. package/src/responses/provider-continuation.ts +98 -0
  625. package/src/responses/provider-opaque-metadata.ts +73 -0
  626. package/src/responses/reasoning-envelope.ts +60 -0
  627. package/src/responses/reasoning-replay-cache.ts +426 -0
  628. package/src/responses/schema.ts +165 -0
  629. package/src/responses/spill-store.ts +459 -0
  630. package/src/responses/state.ts +1433 -0
  631. package/src/responses/thought-signature-replay.ts +347 -0
  632. package/src/responses/tool-groups.ts +19 -0
  633. package/src/responses/tool-search-compat.ts +301 -0
  634. package/src/responses/truncated-stop-reason.ts +60 -0
  635. package/src/router.ts +761 -0
  636. package/src/routing/analytics.ts +378 -0
  637. package/src/routing/capability.ts +244 -0
  638. package/src/routing/compatibility/assemble.ts +73 -0
  639. package/src/routing/compatibility/behavior.ts +278 -0
  640. package/src/routing/compatibility/catalog.ts +99 -0
  641. package/src/routing/compatibility/endpoint.ts +52 -0
  642. package/src/routing/compatibility/lab-evidence-provider.ts +130 -0
  643. package/src/routing/compatibility/policy.ts +181 -0
  644. package/src/routing/compatibility/provider-slot.ts +56 -0
  645. package/src/routing/compatibility/reader.ts +110 -0
  646. package/src/routing/compatibility/subject.ts +191 -0
  647. package/src/routing/compatibility/types.ts +64 -0
  648. package/src/routing/compatibility/version.ts +104 -0
  649. package/src/routing/cost.ts +77 -0
  650. package/src/routing/evaluator.ts +495 -0
  651. package/src/routing/health.ts +412 -0
  652. package/src/routing/history/cursor.ts +43 -0
  653. package/src/routing/history/indexer.ts +605 -0
  654. package/src/routing/history/schema.ts +72 -0
  655. package/src/routing/profile-namespace.ts +15 -0
  656. package/src/routing/profile.ts +547 -0
  657. package/src/routing/quota.ts +145 -0
  658. package/src/routing/request-evidence.ts +45 -0
  659. package/src/routing/trace.ts +776 -0
  660. package/src/server/adapter-resolve.ts +53 -0
  661. package/src/server/auth-cors.ts +751 -0
  662. package/src/server/background-lifecycle.ts +182 -0
  663. package/src/server/chat-completions.ts +442 -0
  664. package/src/server/chat-native-sse.ts +331 -0
  665. package/src/server/chat-native.ts +426 -0
  666. package/src/server/claude-messages.ts +1030 -0
  667. package/src/server/direct-local-http.ts +347 -0
  668. package/src/server/effort-policy.ts +190 -0
  669. package/src/server/github-copilot-responses-repair.ts +338 -0
  670. package/src/server/gui-static.ts +152 -0
  671. package/src/server/image-retry.ts +42 -0
  672. package/src/server/images.ts +568 -0
  673. package/src/server/index.ts +1813 -0
  674. package/src/server/lifecycle.ts +498 -0
  675. package/src/server/live.ts +717 -0
  676. package/src/server/local-management-read-client.ts +90 -0
  677. package/src/server/local-provider-reload-client.ts +137 -0
  678. package/src/server/management/agent-settings-routes.ts +1433 -0
  679. package/src/server/management/api-access.ts +141 -0
  680. package/src/server/management/api-key-usage.ts +193 -0
  681. package/src/server/management/body.ts +41 -0
  682. package/src/server/management/combo-routes.ts +263 -0
  683. package/src/server/management/config-routes.ts +835 -0
  684. package/src/server/management/context.ts +113 -0
  685. package/src/server/management/integration-routes.ts +498 -0
  686. package/src/server/management/lab-automation-routes.ts +206 -0
  687. package/src/server/management/lab-routes.ts +563 -0
  688. package/src/server/management/logs-usage-routes.ts +586 -0
  689. package/src/server/management/model-routes.ts +560 -0
  690. package/src/server/management/model-rows.ts +163 -0
  691. package/src/server/management/native-integration-routes.ts +769 -0
  692. package/src/server/management/oauth-account-routes.ts +637 -0
  693. package/src/server/management/provider-capability-config.ts +48 -0
  694. package/src/server/management/provider-routes.ts +1033 -0
  695. package/src/server/management/replit-provider-routes.ts +86 -0
  696. package/src/server/management/request-history-routes.ts +191 -0
  697. package/src/server/management/routing-analytics-routes.ts +74 -0
  698. package/src/server/management/routing-profile-routes.ts +385 -0
  699. package/src/server/management/shared.ts +286 -0
  700. package/src/server/management/sidebar-routes.ts +106 -0
  701. package/src/server/management/storage-log-guard-routes.ts +186 -0
  702. package/src/server/management/sync-response.ts +69 -0
  703. package/src/server/management/system-restart.ts +435 -0
  704. package/src/server/management/system-routes.ts +194 -0
  705. package/src/server/management/usage-summary-cache.ts +94 -0
  706. package/src/server/management/vision-sidecar-options.ts +167 -0
  707. package/src/server/management/web-search-sidecar-options.ts +120 -0
  708. package/src/server/management-api.ts +314 -0
  709. package/src/server/management-auth.ts +482 -0
  710. package/src/server/memory-watchdog.ts +156 -0
  711. package/src/server/passive-route-linker.ts +66 -0
  712. package/src/server/port-reclaim.ts +307 -0
  713. package/src/server/ports.ts +156 -0
  714. package/src/server/proxy-liveness.ts +328 -0
  715. package/src/server/readiness.ts +99 -0
  716. package/src/server/relay-eager.ts +353 -0
  717. package/src/server/relay.ts +1209 -0
  718. package/src/server/request-decompress.ts +239 -0
  719. package/src/server/request-log-conversation.ts +168 -0
  720. package/src/server/request-log.ts +1259 -0
  721. package/src/server/responses/agent-task-recovery-cache.ts +143 -0
  722. package/src/server/responses/agent-task-recovery.ts +465 -0
  723. package/src/server/responses/collaboration.ts +551 -0
  724. package/src/server/responses/compact.ts +771 -0
  725. package/src/server/responses/core.ts +5389 -0
  726. package/src/server/responses/empty-completion-guard.ts +276 -0
  727. package/src/server/responses/encrypted-payload.ts +331 -0
  728. package/src/server/responses/fetch-helpers.ts +232 -0
  729. package/src/server/responses/input-admission.ts +185 -0
  730. package/src/server/responses/pacing-overload.ts +13 -0
  731. package/src/server/responses/passthrough-error.ts +78 -0
  732. package/src/server/responses/policy-fallback.ts +178 -0
  733. package/src/server/responses/responses-field-backfill.ts +251 -0
  734. package/src/server/responses/terminal-guard.ts +251 -0
  735. package/src/server/responses/upstream-error.ts +53 -0
  736. package/src/server/responses/ws-upstream.ts +308 -0
  737. package/src/server/responses-custom-tool-repair.ts +282 -0
  738. package/src/server/responses-image-gen-repair.ts +132 -0
  739. package/src/server/responses-item-id-repair.ts +272 -0
  740. package/src/server/responses-json-events.ts +90 -0
  741. package/src/server/responses-model-rewrite.ts +29 -0
  742. package/src/server/responses-reasoning-summary-rewrite.ts +178 -0
  743. package/src/server/responses-snapshot-repair.ts +621 -0
  744. package/src/server/responses-terminal-repair.ts +342 -0
  745. package/src/server/responses-tool-search-repair.ts +267 -0
  746. package/src/server/responses-undeclared-tool-guard.ts +153 -0
  747. package/src/server/responses.ts +25 -0
  748. package/src/server/search.ts +201 -0
  749. package/src/server/sse-frame-buffer.ts +292 -0
  750. package/src/server/sse-payload-rewrite.ts +263 -0
  751. package/src/server/startup-action-control.ts +315 -0
  752. package/src/server/startup-health-cache.ts +131 -0
  753. package/src/server/system-env.ts +484 -0
  754. package/src/server/windows-tcp-drop.ts +184 -0
  755. package/src/server/windows-tray-control.ts +41 -0
  756. package/src/server/ws-bridge.ts +472 -0
  757. package/src/service-manager-probe.ts +892 -0
  758. package/src/service.ts +3575 -0
  759. package/src/sidecar/auth.ts +92 -0
  760. package/src/sidecar/candidates.ts +83 -0
  761. package/src/stall-timeout.ts +20 -0
  762. package/src/storage/cleanup-job.ts +57 -0
  763. package/src/storage/cleanup.ts +3085 -0
  764. package/src/storage/policy-job.ts +457 -0
  765. package/src/storage/policy-scheduler.ts +40 -0
  766. package/src/storage/policy-worker.ts +59 -0
  767. package/src/storage/policy.ts +527 -0
  768. package/src/storage/restore-job.ts +299 -0
  769. package/src/storage/restore-worker.ts +58 -0
  770. package/src/storage/scanner.ts +238 -0
  771. package/src/storage/storage-mutation-coordinator.ts +139 -0
  772. package/src/storage/worker-lifecycle.ts +215 -0
  773. package/src/tray/assets/opencodex-tray-offline.ico +0 -0
  774. package/src/tray/assets/opencodex-tray-online.ico +0 -0
  775. package/src/tray/assets/opencodex-tray-warning.ico +0 -0
  776. package/src/tray/assets/opencodex-tray.png +0 -0
  777. package/src/tray/windows-tray.ps1 +364 -0
  778. package/src/tray/windows.ts +757 -0
  779. package/src/types/accounts.ts +37 -0
  780. package/src/types/config.ts +876 -0
  781. package/src/types/provider.ts +545 -0
  782. package/src/types/request.ts +384 -0
  783. package/src/types/tools.ts +131 -0
  784. package/src/types/wire.ts +80 -0
  785. package/src/types.ts +106 -0
  786. package/src/update/badge.ts +72 -0
  787. package/src/update/index.ts +415 -0
  788. package/src/update/job.ts +1887 -0
  789. package/src/update/notify.ts +263 -0
  790. package/src/update/npm-cache-preflight.d.mts +47 -0
  791. package/src/update/npm-cache-preflight.mjs +201 -0
  792. package/src/update/npm-invocation.d.mts +23 -0
  793. package/src/update/npm-invocation.mjs +94 -0
  794. package/src/update/transactional-install.d.mts +22 -0
  795. package/src/update/transactional-install.mjs +259 -0
  796. package/src/update/tray-update-plan.d.mts +18 -0
  797. package/src/update/tray-update-plan.mjs +38 -0
  798. package/src/usage/cost.ts +625 -0
  799. package/src/usage/debug.ts +97 -0
  800. package/src/usage/expected-prices.ts +416 -0
  801. package/src/usage/log.ts +1223 -0
  802. package/src/usage/summary.ts +753 -0
  803. package/src/usage/totals.ts +14 -0
  804. package/src/usage/user-cost-overlay-reconciler.ts +313 -0
  805. package/src/usage/user-cost-overlays.ts +314 -0
  806. package/src/vision/anthropic-describe.ts +189 -0
  807. package/src/vision/backends.ts +97 -0
  808. package/src/vision/describe.ts +131 -0
  809. package/src/vision/eligibility.ts +250 -0
  810. package/src/vision/index.ts +681 -0
  811. package/src/vision/reasoning.ts +55 -0
  812. package/src/vision/routed-describe.ts +175 -0
  813. package/src/vision/timeout-bounds.ts +9 -0
  814. package/src/web-search/anthropic-executor.ts +195 -0
  815. package/src/web-search/backends.ts +108 -0
  816. package/src/web-search/exa-executor.ts +88 -0
  817. package/src/web-search/executor.ts +113 -0
  818. package/src/web-search/format-result.ts +89 -0
  819. package/src/web-search/gemini-executor.ts +141 -0
  820. package/src/web-search/index.ts +331 -0
  821. package/src/web-search/loop.ts +896 -0
  822. package/src/web-search/parse.ts +315 -0
  823. package/src/web-search/progress-stream.ts +342 -0
  824. package/src/web-search/sources.ts +60 -0
  825. package/src/web-search/synthetic-tool.ts +47 -0
  826. package/src/web-search/xai-executor.ts +219 -0
@@ -0,0 +1,127 @@
1
+ import {
2
+ CliUsageError,
3
+ printData,
4
+ rejectArgs,
5
+ runCliAction,
6
+ runtimeRequest,
7
+ takeFlag,
8
+ takeIntegerOption,
9
+ takeOption,
10
+ type RuntimeApiDeps,
11
+ } from "./runtime-api";
12
+
13
+ const USAGE = `Usage:
14
+ ocx combo [list] [--json]
15
+ ocx combo show <id> [--json]
16
+ ocx combo set <id> --targets <provider/model[:weight],...>
17
+ [--strategy <failover|round-robin>] [--sticky <1-100>]
18
+ [--effort <low|medium|high|xhigh|max|ultra|->] [--alias <name|->]
19
+ [--native-alias] [--display-name <label|->]
20
+ [--rename-from <id>] [--json]
21
+ ocx combo remove <id> --yes [--json]`;
22
+
23
+ type ComboRow = Record<string, unknown> & { id?: string; model?: string };
24
+
25
+ function parseTargets(value: string): Array<{ provider: string; model: string; weight?: number }> {
26
+ const targets = value.split(",").map(part => part.trim()).filter(Boolean).map(part => {
27
+ const colon = part.lastIndexOf(":");
28
+ let selector = part;
29
+ let weight: number | undefined;
30
+ if (colon > part.indexOf("/")) {
31
+ const maybeWeight = Number(part.slice(colon + 1));
32
+ if (Number.isInteger(maybeWeight)) {
33
+ selector = part.slice(0, colon);
34
+ weight = maybeWeight;
35
+ }
36
+ }
37
+ const slash = selector.indexOf("/");
38
+ if (slash <= 0 || slash === selector.length - 1) throw new CliUsageError(`invalid target "${part}"; use provider/model[:weight]`, USAGE);
39
+ const target = { provider: selector.slice(0, slash), model: selector.slice(slash + 1), ...(weight !== undefined ? { weight } : {}) };
40
+ if (weight !== undefined && (weight < 1 || weight > 10_000)) throw new CliUsageError(`target weight must be 1-10000: ${part}`, USAGE);
41
+ return target;
42
+ });
43
+ if (targets.length === 0) throw new CliUsageError("--targets requires at least one provider/model", USAGE);
44
+ return targets;
45
+ }
46
+
47
+ async function list(argv: string[], deps: RuntimeApiDeps): Promise<void> {
48
+ const args = [...argv];
49
+ const wantsJson = takeFlag(args, "--json");
50
+ rejectArgs(args, USAGE);
51
+ const result = await runtimeRequest<{ combos?: ComboRow[] }>("/api/combos", {}, deps);
52
+ const rows = result.combos ?? [];
53
+ printData(result, wantsJson, rows.length ? rows.map(row => `${String(row.id)} ${String(row.model ?? `combo/${row.id}`)}`) : ["No combos configured."]);
54
+ }
55
+
56
+ async function show(argv: string[], deps: RuntimeApiDeps): Promise<void> {
57
+ const args = [...argv];
58
+ const id = args.shift();
59
+ const wantsJson = takeFlag(args, "--json");
60
+ if (!id) throw new CliUsageError("combo id is required", USAGE);
61
+ rejectArgs(args, USAGE);
62
+ const result = await runtimeRequest<{ combos?: ComboRow[] }>("/api/combos", {}, deps);
63
+ const combo = (result.combos ?? []).find(row => row.id === id);
64
+ if (!combo) throw new CliUsageError(`unknown combo ${id}`);
65
+ printData(combo, wantsJson);
66
+ }
67
+
68
+ async function set(argv: string[], deps: RuntimeApiDeps): Promise<void> {
69
+ const args = [...argv];
70
+ const id = args.shift()?.trim();
71
+ const wantsJson = takeFlag(args, "--json");
72
+ if (!id) throw new CliUsageError("combo id is required", USAGE);
73
+ const targetsRaw = takeOption(args, "--targets");
74
+ if (!targetsRaw) throw new CliUsageError("--targets is required", USAGE);
75
+ const strategy = takeOption(args, "--strategy") ?? "failover";
76
+ if (strategy !== "failover" && strategy !== "round-robin") throw new CliUsageError("--strategy must be failover or round-robin", USAGE);
77
+ const stickyLimit = takeIntegerOption(args, "--sticky", { min: 1 }) ?? 1;
78
+ if (stickyLimit > 100) throw new CliUsageError("--sticky must be <= 100", USAGE);
79
+ const effort = takeOption(args, "--effort");
80
+ const alias = takeOption(args, "--alias");
81
+ const nativeAlias = takeFlag(args, "--native-alias");
82
+ const displayName = takeOption(args, "--display-name");
83
+ const renameFrom = takeOption(args, "--rename-from");
84
+ rejectArgs(args, USAGE);
85
+ const combo: Record<string, unknown> = {
86
+ strategy,
87
+ stickyLimit,
88
+ targets: parseTargets(targetsRaw),
89
+ };
90
+ if (effort !== undefined) combo.defaultEffort = effort === "-" ? null : effort;
91
+ if (alias !== undefined) combo.alias = alias === "-" ? "" : alias;
92
+ if (nativeAlias) combo.nativeAlias = true;
93
+ if (displayName !== undefined) combo.displayName = displayName === "-" ? "" : displayName;
94
+ const current = await runtimeRequest<{ combos?: ComboRow[] }>("/api/combos", {}, deps);
95
+ const existing = (current.combos ?? []).find(row => row.id === (renameFrom ?? id));
96
+ if (existing?.imageInput === "disabled") combo.imageInput = "disabled";
97
+ const result = await runtimeRequest("/api/combos", {
98
+ method: "PUT",
99
+ body: JSON.stringify({ id, combo, ...(renameFrom ? { renameFrom } : {}) }),
100
+ }, deps);
101
+ printData(result, wantsJson, [`Saved combo ${id}.`]);
102
+ }
103
+
104
+ async function remove(argv: string[], deps: RuntimeApiDeps): Promise<void> {
105
+ const args = [...argv];
106
+ const id = args.shift()?.trim();
107
+ const wantsJson = takeFlag(args, "--json");
108
+ const yes = takeFlag(args, "--yes");
109
+ if (!id) throw new CliUsageError("combo id is required", USAGE);
110
+ if (!yes) throw new CliUsageError("remove requires --yes", USAGE);
111
+ rejectArgs(args, USAGE);
112
+ const result = await runtimeRequest(`/api/combos?id=${encodeURIComponent(id)}`, { method: "DELETE" }, deps);
113
+ printData(result, wantsJson, [`Removed combo ${id}.`]);
114
+ }
115
+
116
+ export async function handleComboCommand(argv: string[], deps: RuntimeApiDeps = {}): Promise<number> {
117
+ return runCliAction(async () => {
118
+ const [sub = "list", ...rest] = argv;
119
+ if (sub === "list") await list(rest, deps);
120
+ else if (sub === "show") await show(rest, deps);
121
+ else if (sub === "set" || sub === "create" || sub === "update") await set(rest, deps);
122
+ else if (sub === "remove" || sub === "delete") await remove(rest, deps);
123
+ else throw new CliUsageError(`unknown combo command ${sub}`, USAGE);
124
+ });
125
+ }
126
+
127
+ export const COMBO_USAGE = USAGE;
@@ -0,0 +1,209 @@
1
+ import { readFileSync, writeFileSync } from "node:fs";
2
+ import { clearCodexAccountPin } from "../codex/account-priority";
3
+ import { getConfigPath, mutatePersistedConfig, readConfigDiagnostics, sanitizeModelCostsForDisplay, saveConfig, validateConfigCandidate } from "../config";
4
+ import { VISION_REASONING_EFFORTS, isVisionReasoningEffort } from "../reasoning-effort";
5
+ import type { OcxConfig } from "../types";
6
+ import { normalizeVisionReasoningForModel } from "../vision/reasoning";
7
+ import { CliUsageError, printData, rejectArgs, runCliAction, takeFlag } from "./runtime-api";
8
+
9
+ const USAGE = `Usage:
10
+ ocx config [show] [--json] [--source]
11
+ ocx config get <dot.path> [--json]
12
+ ocx config set <dot.path> <json-or-string> [--json]
13
+ ocx config unset <dot.path> [--json]
14
+ ocx config validate [path|-] [--json]
15
+ ocx config export <path|->
16
+ ocx config import <path|-> --yes [--json]`;
17
+
18
+ const SECRET_KEYS = /^(apiKey|key|accessToken|refreshToken|idToken|token|password|clientSecret)$/i;
19
+ const BLOCKED_SEGMENTS = new Set(["__proto__", "prototype", "constructor"]);
20
+
21
+ function redact(value: unknown, key = ""): unknown {
22
+ if (SECRET_KEYS.test(key) && typeof value === "string") return value ? "********" : value;
23
+ // modelCosts rows are keyed by model id; a pasted API key in a key position
24
+ // must not be echoed back by config show/get (values are already redacted).
25
+ if (key === "modelCosts") return sanitizeModelCostsForDisplay(value);
26
+ if (Array.isArray(value)) return value.map(item => redact(item));
27
+ if (value && typeof value === "object") {
28
+ return Object.fromEntries(Object.entries(value as Record<string, unknown>).map(([childKey, child]) => [childKey, redact(child, childKey)]));
29
+ }
30
+ return value;
31
+ }
32
+
33
+ function pathSegments(path: string): string[] {
34
+ const segments = path.split(".").map(part => part.trim()).filter(Boolean);
35
+ if (segments.length === 0 || segments.some(part => BLOCKED_SEGMENTS.has(part))) throw new CliUsageError("invalid config path", USAGE);
36
+ return segments;
37
+ }
38
+
39
+ function getPath(root: unknown, path: string): unknown {
40
+ let current = root;
41
+ for (const segment of pathSegments(path)) {
42
+ if (!current || typeof current !== "object" || !Object.hasOwn(current, segment)) throw new CliUsageError(`config path not found: ${path}`);
43
+ current = (current as Record<string, unknown>)[segment];
44
+ }
45
+ return current;
46
+ }
47
+
48
+ function setPath(root: Record<string, unknown>, path: string, value: unknown, remove = false): void {
49
+ const segments = pathSegments(path);
50
+ let current = root;
51
+ for (const segment of segments.slice(0, -1)) {
52
+ const next = current[segment];
53
+ if (!next || typeof next !== "object" || Array.isArray(next)) throw new CliUsageError(`config parent path not found: ${segment}`, USAGE);
54
+ current = next as Record<string, unknown>;
55
+ }
56
+ const leaf = segments.at(-1)!;
57
+ if (remove && !Object.hasOwn(current, leaf)) throw new CliUsageError(`config path not found: ${path}`);
58
+ if (remove) delete current[leaf];
59
+ else current[leaf] = value;
60
+ }
61
+
62
+ function parseValue(raw: string): unknown {
63
+ try { return JSON.parse(raw); }
64
+ catch { return raw; }
65
+ }
66
+
67
+ function loadInput(path: string): unknown {
68
+ const raw = path === "-" ? readFileSync(0, "utf8") : readFileSync(path, "utf8");
69
+ try { return JSON.parse(raw); }
70
+ catch { throw new CliUsageError(`invalid JSON in ${path}`); }
71
+ }
72
+
73
+ function visionReasoningError(value: unknown): string | null {
74
+ if (!value || typeof value !== "object" || Array.isArray(value)) return null;
75
+ const vision = (value as Record<string, unknown>).visionSidecar;
76
+ if (!vision || typeof vision !== "object" || Array.isArray(vision)) return null;
77
+ const reasoning = (vision as Record<string, unknown>).reasoning;
78
+ if (reasoning === undefined || isVisionReasoningEffort(reasoning)) return null;
79
+ return `schema_invalid: visionSidecar.reasoning: must be one of ${VISION_REASONING_EFFORTS.join(", ")}`;
80
+ }
81
+
82
+ function validateCandidate(value: unknown): ReturnType<typeof validateConfigCandidate> {
83
+ const error = visionReasoningError(value);
84
+ return error ? { ok: false, error } : validateConfigCandidate(value);
85
+ }
86
+
87
+ function normalizeVisionConfig(config: OcxConfig): OcxConfig {
88
+ const vision = config.visionSidecar;
89
+ if (!vision || vision.reasoning === undefined) return config;
90
+ // Keep CLI import/set semantics aligned with the execution path: an omitted or blank model means
91
+ // the bounded OpenAI vision default, gpt-5.4-mini, not the Dashboard's web-search default.
92
+ const model = vision.model || "gpt-5.4-mini";
93
+ const normalized = normalizeVisionReasoningForModel(model, vision.reasoning);
94
+ if (normalized === undefined) delete vision.reasoning;
95
+ else vision.reasoning = normalized;
96
+ return config;
97
+ }
98
+
99
+ function validate(value: unknown): OcxConfig {
100
+ const result = validateCandidate(value);
101
+ if (!result.ok) throw new CliUsageError(result.error);
102
+ return normalizeVisionConfig(result.config);
103
+ }
104
+
105
+ export async function handleConfigCommand(argv: string[]): Promise<number> {
106
+ return runCliAction(async () => {
107
+ const args = [...argv];
108
+ const action = (args.shift() ?? "show").toLowerCase();
109
+ const wantsJson = takeFlag(args, "--json");
110
+ if (action === "show") {
111
+ const source = takeFlag(args, "--source");
112
+ rejectArgs(args, USAGE);
113
+ const diagnostics = readConfigDiagnostics();
114
+ const config = redact(diagnostics.config);
115
+ const result = source ? { config, source: diagnostics.source, error: diagnostics.error, warnings: diagnostics.warnings ?? [] } : config;
116
+ printData(result, true);
117
+ return;
118
+ }
119
+ if (action === "get") {
120
+ const path = args.shift();
121
+ if (!path) throw new CliUsageError("config path is required", USAGE);
122
+ rejectArgs(args, USAGE);
123
+ const value = redact(getPath(readConfigDiagnostics().config, path), path.split(".").at(-1));
124
+ if (wantsJson || typeof value === "object") console.log(JSON.stringify(value, null, 2));
125
+ else console.log(String(value));
126
+ return;
127
+ }
128
+ if (action === "set" || action === "unset") {
129
+ const path = args.shift();
130
+ const raw = action === "set" ? args.shift() : undefined;
131
+ if (!path || (action === "set" && raw === undefined)) throw new CliUsageError("config path and value are required", USAGE);
132
+ rejectArgs(args, USAGE);
133
+ // #1835/#1838: the read used to happen OUTSIDE the mutation lock, so a concurrent
134
+ // edit landing between it and the save was reverted by this whole-snapshot write.
135
+ // `mutatePersistedConfig` reruns this callback against the latest validated disk
136
+ // state, so the operation is applied to what is actually there at commit time.
137
+ let savedValue: unknown = null;
138
+ const outcome = mutatePersistedConfig(fresh => {
139
+ // Snapshot BEFORE mutating: comparing after the write compares a value with
140
+ // itself and would report every no-op as a change, bumping the generation.
141
+ const before = JSON.stringify(fresh);
142
+ const candidate = structuredClone(fresh) as unknown as Record<string, unknown>;
143
+ setPath(candidate, path, raw === undefined ? undefined : parseValue(raw), action === "unset");
144
+ const config = validate(candidate);
145
+ savedValue = action === "unset" ? null : getPath(config, path);
146
+ // Setting the order here is the operator restating it, exactly as through
147
+ // `ocx account priority` or the management route, so it releases the manual pin
148
+ // for the same reason those do: a pin made before any order existed would
149
+ // otherwise outrank every order set afterwards, capping the pool at the pinned
150
+ // account's tier with nothing on any surface explaining why. `import` is
151
+ // deliberately not covered — that file supplies its own pin, so there is no
152
+ // stale one to release.
153
+ if (pathSegments(path)[0] === "codexAccountPriorities") clearCodexAccountPin(config);
154
+ // REPLACE rather than merge: `Object.assign` alone cannot remove a key that
155
+ // `unset` deleted, which would make unset silently succeed while changing nothing.
156
+ for (const key of Object.keys(fresh)) {
157
+ if (!(key in (config as unknown as Record<string, unknown>))) {
158
+ delete (fresh as unknown as Record<string, unknown>)[key];
159
+ }
160
+ }
161
+ Object.assign(fresh, config);
162
+ return { changed: JSON.stringify(fresh) !== before, value: undefined };
163
+ });
164
+ if (outcome.status === "unavailable") {
165
+ throw new Error(outcome.reason === "conflict"
166
+ ? "config changed while applying this update; retry"
167
+ : `config is ${outcome.reason}`);
168
+ }
169
+ printData({ ok: true, path, value: redact(savedValue, path.split(".").at(-1)) }, wantsJson,
170
+ [`${action === "unset" ? "Unset" : "Set"} ${path}.`]);
171
+ return;
172
+ }
173
+ if (action === "validate") {
174
+ const path = args.shift();
175
+ rejectArgs(args, USAGE);
176
+ const result = path ? validateCandidate(loadInput(path)) : (() => {
177
+ const diagnostics = readConfigDiagnostics();
178
+ if (diagnostics.error) return { ok: false as const, error: diagnostics.error };
179
+ return validateCandidate(diagnostics.config);
180
+ })();
181
+ printData(result.ok ? { ok: true, source: path ?? getConfigPath() } : result, wantsJson,
182
+ [result.ok ? "Config is valid." : `Config is invalid: ${result.error}`]);
183
+ if (!result.ok) process.exitCode = 1;
184
+ return;
185
+ }
186
+ if (action === "export") {
187
+ const path = args.shift();
188
+ if (!path) throw new CliUsageError("export path is required", USAGE);
189
+ rejectArgs(args, USAGE);
190
+ const content = `${JSON.stringify(readConfigDiagnostics().config, null, 2)}\n`;
191
+ if (path === "-") process.stdout.write(content);
192
+ else { writeFileSync(path, content, { encoding: "utf8", mode: 0o600 }); console.log(`Exported config to ${path}.`); }
193
+ return;
194
+ }
195
+ if (action === "import") {
196
+ const path = args.shift();
197
+ const yes = takeFlag(args, "--yes");
198
+ if (!path) throw new CliUsageError("import path is required", USAGE);
199
+ if (!yes) throw new CliUsageError("import requires --yes", USAGE);
200
+ rejectArgs(args, USAGE);
201
+ saveConfig(validate(loadInput(path)));
202
+ printData({ ok: true, source: path }, wantsJson, [`Imported config from ${path}. Restart or run ocx sync if needed.`]);
203
+ return;
204
+ }
205
+ throw new CliUsageError(`unknown config command ${action}`, USAGE);
206
+ });
207
+ }
208
+
209
+ export const CONFIG_USAGE = USAGE;
@@ -0,0 +1,228 @@
1
+ import { findLiveProxy, probeHostname } from "../server/proxy-liveness";
2
+ import { DEBUG_ENV, type DebugSettingsView } from "../lib/debug-settings";
3
+ import { runningProxyUpdateHeaders } from "../oauth/login-cli";
4
+
5
+ type DebugScope = "provider" | "usage" | "injection" | "claude";
6
+
7
+ async function requireLiveProxy() {
8
+ const live = await findLiveProxy();
9
+ if (!live) {
10
+ console.error("Proxy is not running. Start it with: ocx start");
11
+ process.exit(1);
12
+ }
13
+ return live;
14
+ }
15
+
16
+ async function fetchDebugSettings(): Promise<DebugSettingsView> {
17
+ const live = await requireLiveProxy();
18
+ try {
19
+ const res = await fetch(`http://${probeHostname(live.hostname)}:${live.port}/api/debug`, {
20
+ headers: runningProxyUpdateHeaders(),
21
+ });
22
+ if (!res.ok) {
23
+ console.error(`Failed to read debug settings (${res.status})`);
24
+ process.exit(1);
25
+ }
26
+ return await res.json() as DebugSettingsView;
27
+ } catch (err) {
28
+ console.error(`Proxy is running but /api/debug is unreachable: ${err instanceof Error ? err.message : String(err)}`);
29
+ process.exit(1);
30
+ }
31
+ }
32
+
33
+ async function putDebugSettings(body: Record<string, unknown>): Promise<DebugSettingsView> {
34
+ const live = await requireLiveProxy();
35
+ const res = await fetch(`http://${probeHostname(live.hostname)}:${live.port}/api/debug`, {
36
+ method: "PUT",
37
+ headers: runningProxyUpdateHeaders(),
38
+ body: JSON.stringify(body),
39
+ });
40
+ if (!res.ok) {
41
+ const text = await res.text().catch(() => "");
42
+ console.error(`Failed to update debug settings (${res.status})${text ? `: ${text.slice(0, 200)}` : ""}`);
43
+ process.exit(1);
44
+ }
45
+ return await res.json() as DebugSettingsView;
46
+ }
47
+
48
+ function printScopeStatus(scope: DebugScope, view: DebugSettingsView): void {
49
+ if (scope === "provider") {
50
+ console.log(`Provider debug: ${view.enabled ? "ON" : "off"}`);
51
+ console.log(` env=${view.env.debug ? "on" : "off"}, runtime=${view.runtimeOverride.debug === undefined ? "env/default" : view.runtimeOverride.debug ? "on" : "off"}`);
52
+ console.log(" Tail: ocx debug provider logs [-f]");
53
+ } else if (scope === "usage") {
54
+ console.log(`Usage debug: ${view.usage ? "ON" : "off"}`);
55
+ console.log(` env=${view.env.usage ? "on" : "off"}, runtime=${view.runtimeOverride.usage === undefined ? "env/default" : view.runtimeOverride.usage ? "on" : "off"}`);
56
+ console.log(" Tail: ocx debug usage logs [-f] (via running proxy API)");
57
+ } else if (scope === "injection") {
58
+ console.log(`Injection debug: ${view.injection ? "ON" : "off"}`);
59
+ console.log(` env=${view.env.injection ? "on" : "off"}, runtime=${view.runtimeOverride.injection === undefined ? "env/default" : view.runtimeOverride.injection ? "on" : "off"}`);
60
+ console.log(" Lines appear on the proxy console when multi-agent guidance is injected.");
61
+ } else {
62
+ console.log(`Claude inbound debug: ${view.claude ? "ON" : "off"}`);
63
+ console.log(` env=${view.env.claude ? "on" : "off"}, runtime=${view.runtimeOverride.claude === undefined ? "env/default" : view.runtimeOverride.claude ? "on" : "off"}`);
64
+ console.log(" View: ocx observe claude-inbound");
65
+ }
66
+ }
67
+
68
+ function envDebugEnabled(): boolean {
69
+ return process.env.OCX_DEBUG === "1"
70
+ || process.env.OCX_DEBUG_FRAMES === "1";
71
+ }
72
+
73
+ async function printProviderLogs(follow: boolean): Promise<void> {
74
+ const live = await requireLiveProxy();
75
+ const base = `http://${probeHostname(live.hostname)}:${live.port}/api/debug/logs`;
76
+
77
+ let after = 0;
78
+ try {
79
+ const res = await fetch(`${base}?limit=500`, { headers: runningProxyUpdateHeaders() });
80
+ if (!res.ok) {
81
+ console.error(`Failed to read debug logs (${res.status})`);
82
+ process.exit(1);
83
+ }
84
+ const entries = await res.json() as { seq: number; line: string }[];
85
+ for (const entry of entries) console.log(entry.line);
86
+ if (entries.length > 0) after = entries[entries.length - 1]!.seq;
87
+ } catch (err) {
88
+ console.error(`Failed to read debug logs: ${err instanceof Error ? err.message : String(err)}`);
89
+ process.exit(1);
90
+ }
91
+
92
+ if (!follow) return;
93
+
94
+ while (true) {
95
+ await new Promise(resolve => setTimeout(resolve, 1000));
96
+ try {
97
+ const res = await fetch(`${base}?after=${after}&limit=500`, { headers: runningProxyUpdateHeaders() });
98
+ if (!res.ok) continue;
99
+ const entries = await res.json() as { seq: number; line: string }[];
100
+ for (const entry of entries) console.log(entry.line);
101
+ if (entries.length > 0) after = entries[entries.length - 1]!.seq;
102
+ } catch {
103
+ /* keep following */
104
+ }
105
+ }
106
+ }
107
+
108
+ async function printUsageLogs(follow: boolean): Promise<void> {
109
+ const live = await requireLiveProxy();
110
+ const base = `http://${probeHostname(live.hostname)}:${live.port}/api/debug/usage-logs`;
111
+
112
+ let after = 0;
113
+ try {
114
+ const res = await fetch(`${base}?limit=500`, { headers: runningProxyUpdateHeaders() });
115
+ if (!res.ok) {
116
+ console.error(`Failed to read usage debug logs (${res.status})`);
117
+ process.exit(1);
118
+ }
119
+ const entries = await res.json() as { seq: number; line: string }[];
120
+ for (const entry of entries) console.log(entry.line);
121
+ if (entries.length === 0) console.log("(empty — enable with: ocx debug usage on)");
122
+ if (entries.length > 0) after = entries[entries.length - 1]!.seq;
123
+ } catch (err) {
124
+ console.error(`Failed to read usage debug logs: ${err instanceof Error ? err.message : String(err)}`);
125
+ process.exit(1);
126
+ }
127
+
128
+ if (!follow) return;
129
+
130
+ while (true) {
131
+ await new Promise(resolve => setTimeout(resolve, 1000));
132
+ try {
133
+ const res = await fetch(`${base}?after=${after}&limit=500`, { headers: runningProxyUpdateHeaders() });
134
+ if (!res.ok) continue;
135
+ const entries = await res.json() as { seq: number; line: string }[];
136
+ for (const entry of entries) console.log(entry.line);
137
+ if (entries.length > 0) after = entries[entries.length - 1]!.seq;
138
+ } catch {
139
+ /* keep following */
140
+ }
141
+ }
142
+ }
143
+
144
+ async function handleScopeCommand(scope: DebugScope, actionArgv: string[]): Promise<void> {
145
+ const action = (actionArgv[0] ?? "status").trim().toLowerCase();
146
+
147
+ if (action === "on" || action === "off") {
148
+ const enabled = action === "on";
149
+ const body = scope === "provider" ? { debug: enabled }
150
+ : scope === "usage" ? { usage: enabled }
151
+ : scope === "injection" ? { injection: enabled }
152
+ : { claude: enabled };
153
+ printScopeStatus(scope, await putDebugSettings(body));
154
+ console.log(`\n${scope} debug is now ${enabled ? "enabled" : "disabled"}.`);
155
+ return;
156
+ }
157
+
158
+ if (action === "status") {
159
+ printScopeStatus(scope, await fetchDebugSettings());
160
+ return;
161
+ }
162
+
163
+ if (action === "reset") {
164
+ const resetKey = scope === "provider" ? "provider" : scope;
165
+ printScopeStatus(scope, await putDebugSettings({ reset: resetKey }));
166
+ console.log(`\nRuntime override cleared for ${scope}; effective value follows env again.`);
167
+ return;
168
+ }
169
+
170
+ if (action === "logs") {
171
+ if (scope === "injection" || scope === "claude") {
172
+ console.error(scope === "claude"
173
+ ? "Use: ocx observe claude-inbound"
174
+ : "Injection debug has no buffered log stream; use: ocx observe injection");
175
+ process.exit(1);
176
+ }
177
+ const follow = actionArgv.slice(1).some(arg => arg === "-f" || arg === "--follow");
178
+ if (scope === "provider") await printProviderLogs(follow);
179
+ else await printUsageLogs(follow);
180
+ return;
181
+ }
182
+
183
+ console.error(scope === "injection" || scope === "claude"
184
+ ? `Usage: ocx debug ${scope} on|off|status|reset`
185
+ : `Usage: ocx debug ${scope} on|off|status|reset|logs [-f]`);
186
+ process.exit(1);
187
+ }
188
+
189
+ function printTopLevelHelp(): void {
190
+ console.log("Debug commands (proxy must be running):");
191
+ console.log("");
192
+ console.log(" ocx debug provider on|off|status|reset|logs [-f]");
193
+ console.log(" ocx debug usage on|off|status|reset|logs [-f]");
194
+ console.log(" ocx debug injection on|off|status|reset");
195
+ console.log(" ocx debug claude on|off|status|reset");
196
+ console.log("");
197
+ console.log("Env defaults on start:");
198
+ console.log(" provider → OCX_DEBUG=1 (legacy OCX_DEBUG_FRAMES still works)");
199
+ console.log(` usage → ${DEBUG_ENV.usage}=1`);
200
+ console.log(` injection→ ${DEBUG_ENV.injection}=1`);
201
+ console.log(` claude → ${DEBUG_ENV.claude}=1`);
202
+ }
203
+
204
+ export async function handleDebugCommand(argv: string[]): Promise<void> {
205
+ const sub = (argv[0] ?? "").trim().toLowerCase();
206
+
207
+ if (sub === "provider" || sub === "usage" || sub === "injection" || sub === "claude") {
208
+ await handleScopeCommand(sub, argv.slice(1));
209
+ return;
210
+ }
211
+
212
+ if (sub === "" || sub === "help" || sub === "--help" || sub === "-h") {
213
+ const live = await findLiveProxy();
214
+ if (!live) {
215
+ console.log("Proxy is not running — env defaults for the next start:");
216
+ console.log(` provider → OCX_DEBUG = ${envDebugEnabled() ? "on" : "off"}`);
217
+ console.log(` usage → ${DEBUG_ENV.usage} = ${process.env[DEBUG_ENV.usage] === "1" ? "on" : "off"}`);
218
+ console.log(` injection→ ${DEBUG_ENV.injection} = ${process.env[DEBUG_ENV.injection] === "1" ? "on" : "off"}`);
219
+ console.log(` claude → ${DEBUG_ENV.claude} = ${process.env[DEBUG_ENV.claude] === "1" ? "on" : "off"}`);
220
+ console.log("");
221
+ }
222
+ printTopLevelHelp();
223
+ return;
224
+ }
225
+
226
+ printTopLevelHelp();
227
+ process.exit(1);
228
+ }