@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,355 @@
1
+ /**
2
+ * `ocx claude [claude args...]` — launch Claude Code wired to the local proxy.
3
+ *
4
+ * Mirrors `ccr code` UX (devlog/260711_claude_inbound/020, 003 E1/E2/E5/G1):
5
+ * ensures the proxy is running, injects the Anthropic env slots, then execs the
6
+ * `claude` CLI with stdio inherited. User-exported env wins except when a stale
7
+ * loopback opencodex base URL points at a different proxy port.
8
+ */
9
+ import { spawn } from "node:child_process";
10
+ import { loadConfig } from "../config";
11
+ import { injectClaudeAgentDefs } from "../claude/agents-inject";
12
+ import { effectiveModelEnv, resolveAutoContext } from "../claude/context-windows";
13
+ import { refreshGatewayModelCacheFromProxy } from "../claude/gateway-cache";
14
+ import { commandInvocation } from "../lib/win-exec";
15
+ import { isProxyAdmissionSecret } from "../server/auth-cors";
16
+ import { findLiveProxy } from "../server/proxy-liveness";
17
+ import type { OcxConfig } from "../types";
18
+ import { configuredAdminToken } from "../lib/admin-secrets";
19
+ import { PROXY_MARKER, ownAdmissionTokens, defaultAuthDetectDeps, detectClaudeAuth, type AuthDetectDeps } from "../claude/auth-detect";
20
+ import { resolveClaudeAuthMode } from "../claude/auth-mode";
21
+ import { withProcessRuntimeProvenance } from "../lib/bun-runtime";
22
+ import { selfLaunchArgv } from "../lib/self-launch-argv";
23
+ import { ANTHROPIC_PARENT_ENV_SLOTS, trustedNodeLauncherContext, type AnthropicParentEnvSlot } from "./launcher-context";
24
+
25
+ export interface ClaudeLaunchEnv {
26
+ [key: string]: string | undefined;
27
+ }
28
+
29
+ /**
30
+ * Injectable IO for tests. `env` is deliberately NOT injectable: it is bound to the
31
+ * launch base so detection and the spawned process can never disagree (audit R3-3).
32
+ */
33
+ export type ClaudeEnvDeps = {
34
+ authDetect?: Omit<Partial<AuthDetectDeps>, "env" | "ownTokens">;
35
+ /** Test seam; production uses the authenticated Node-launcher context. */
36
+ preBunAnthropicSlots?: readonly AnthropicParentEnvSlot[] | null;
37
+ };
38
+
39
+ function isClaudeLoopbackHostname(hostname: string): boolean {
40
+ const normalized = hostname.toLowerCase().replace(/\.$/, "");
41
+ return normalized === "localhost"
42
+ || normalized === "127.0.0.1"
43
+ || normalized === "::1"
44
+ || normalized === "[::1]";
45
+ }
46
+
47
+ function targetsLocalClaudeProxy(value: string | undefined, port: number): boolean {
48
+ if (!value) return false;
49
+ try {
50
+ const parsed = new URL(value);
51
+ const effectivePort = parsed.port === "" ? 80 : Number(parsed.port);
52
+ return parsed.protocol === "http:"
53
+ && isClaudeLoopbackHostname(parsed.hostname)
54
+ && effectivePort === port
55
+ && parsed.username === ""
56
+ && parsed.password === "";
57
+ } catch {
58
+ return false;
59
+ }
60
+ }
61
+
62
+ /**
63
+ * Pure env assembly (unit-tested): never sets ANTHROPIC_API_KEY (setting both
64
+ * token vars triggers Claude Code's auth-conflict warning, 003 E1), and never
65
+ * preserves Anthropic variables proven to exist in the parent Node launcher,
66
+ * apart from stale loopback ANTHROPIC_BASE_URL values owned by a previous
67
+ * opencodex launch. Unproven ambient values fail closed as project dotenv.
68
+ */
69
+ export function buildClaudeEnv(
70
+ config: OcxConfig,
71
+ port: number,
72
+ base: ClaudeLaunchEnv,
73
+ contextWindows: Record<string, number> = {},
74
+ deps: ClaudeEnvDeps = {},
75
+ ): ClaudeLaunchEnv {
76
+ const env: ClaudeLaunchEnv = { ...base };
77
+ // Step 1 — strip OUR OWN dummy from the inherited environment before anything reads
78
+ // or writes the token slot. setDefault below preserves any non-empty value, so a
79
+ // stale marker left in place would suppress the admission key and then be removed,
80
+ // leaving the child with no token at all (audit R2-1). It is opencodex state, never
81
+ // user auth, so dropping it unconditionally is safe.
82
+ if (env.ANTHROPIC_AUTH_TOKEN?.trim() === PROXY_MARKER) delete env.ANTHROPIC_AUTH_TOKEN;
83
+ // Step 1b — drop Anthropic credentials AND destinations that Bun may have synthesized
84
+ // from a project `.env`/`.env.local`. The plain-Node launcher records genuine parent
85
+ // exports before Bun starts and pairs that context with an argv proof, so with a
86
+ // trusted context we know exactly which slots the user really exported.
87
+ //
88
+ // Without a trusted context all three slots are treated as project-controlled. An
89
+ // earlier revision of this branch preserved credentials here, reasoning that the
90
+ // destination is pinned below so a dotenv key would only ever reach the local proxy.
91
+ // That reasoning is wrong, and review caught it: `CLAUDE_CODE_PROVIDER_MANAGED_BY_HOST`
92
+ // is only set when we own an auth token (see below, and #253 for why asserting it
93
+ // otherwise logs a subscriber out), so on a subscription launch Claude Code's
94
+ // settings.env merge can still replace `ANTHROPIC_BASE_URL` after we return. A
95
+ // preserved key then travels to that host. The repository documents that residual for
96
+ // subscription mode; it must not be widened into a credential leak.
97
+ //
98
+ // Direct `bun src/cli/index.ts` therefore loses ambient Anthropic values. That is a
99
+ // real cost to a documented entry point, and the escape hatch is the launcher: run
100
+ // through `ocx` (the published bin) and genuine shell exports are preserved by proof.
101
+ const explicitSlots = deps.preBunAnthropicSlots;
102
+ const trustedSlots = explicitSlots === undefined
103
+ ? trustedNodeLauncherContext()?.anthropicEnvSlots ?? []
104
+ : explicitSlots ?? [];
105
+ const exported = new Set<AnthropicParentEnvSlot>(trustedSlots);
106
+ for (const name of ANTHROPIC_PARENT_ENV_SLOTS) {
107
+ const value = env[name];
108
+ if (value !== undefined && value !== "" && !exported.has(name)) delete env[name];
109
+ }
110
+ // Never forward old or current provenance seams to Claude Code.
111
+ delete env.OCX_PRE_BUN_ANTHROPIC_ENV;
112
+ delete env.OCX_NODE_LAUNCH_CONTEXT;
113
+ const setDefault = (name: string, value: string | undefined) => {
114
+ if (value === undefined || value.length === 0) return;
115
+ if (env[name] !== undefined && env[name] !== "") return; // user wins
116
+ env[name] = value;
117
+ };
118
+ setDefault("ANTHROPIC_BASE_URL", `http://127.0.0.1:${port}`);
119
+ const existingBaseUrl = env.ANTHROPIC_BASE_URL;
120
+ if (existingBaseUrl) {
121
+ try {
122
+ const parsed = new URL(existingBaseUrl);
123
+ const effectivePort = parsed.port === "" ? 80 : Number(parsed.port);
124
+ if (parsed.protocol === "http:"
125
+ && isClaudeLoopbackHostname(parsed.hostname)
126
+ && effectivePort !== port) {
127
+ const replacement = `http://127.0.0.1:${port}`;
128
+ console.error(`⚠ Replacing stale opencodex ANTHROPIC_BASE_URL ${parsed.origin} with ${replacement}.`);
129
+ env.ANTHROPIC_BASE_URL = replacement;
130
+ }
131
+ } catch {
132
+ // Preserve user-provided values that are not parseable URLs.
133
+ }
134
+ }
135
+ // Subscription-preserving default (teamclaude --no-mitm / Vercel gateway pattern):
136
+ // setting ANTHROPIC_AUTH_TOKEN/API_KEY disables claude.ai connectors and overrides
137
+ // the user's Claude login. Only inject a token when the proxy actually requires an
138
+ // admission key; otherwise Claude Code keeps its own OAuth and sends it to us —
139
+ // native claude models then pass through verbatim (see server/claude-messages.ts).
140
+ const ownTokens = ownAdmissionTokens(config);
141
+ const targetsLocalProxy = targetsLocalClaudeProxy(env.ANTHROPIC_BASE_URL, port);
142
+ const inheritedApiKey = env.ANTHROPIC_API_KEY;
143
+ if (typeof inheritedApiKey === "string" && isProxyAdmissionSecret(inheritedApiKey, config)) {
144
+ delete env.ANTHROPIC_API_KEY;
145
+ }
146
+ const hasUserApiKey = Boolean(env.ANTHROPIC_API_KEY?.trim());
147
+ const inheritedAuthToken = env.ANTHROPIC_AUTH_TOKEN;
148
+ const inheritedTokenIsOurs = typeof inheritedAuthToken === "string"
149
+ && isProxyAdmissionSecret(inheritedAuthToken, config);
150
+ // system-env may have injected the proxy's admission key into the parent. A
151
+ // proof-bound external BASE_URL is still user-owned, so never let our inherited
152
+ // key follow it. A user API key also wins on a local launch; remove only the token
153
+ // values recognized by the shared proxy-admission contract and preserve every
154
+ // other token.
155
+ if (inheritedTokenIsOurs && (!targetsLocalProxy || hasUserApiKey)) {
156
+ delete env.ANTHROPIC_AUTH_TOKEN;
157
+ }
158
+ if (targetsLocalProxy && !hasUserApiKey && ownTokens.length > 0) {
159
+ setDefault("ANTHROPIC_AUTH_TOKEN", ownTokens[0]);
160
+ }
161
+ // Detection reads the SANITIZED launch env — the exact object spawned below — so the
162
+ // resolver and the spawned process cannot disagree. It deliberately does NOT read the
163
+ // raw base: the provenance strip above already removed dotenv-only credentials, and
164
+ // letting a value the child never receives decide the marker left an auto-mode user
165
+ // with neither the credential NOR the proxy marker (#701 audit round 2). Injected deps
166
+ // are spread FIRST and `env` bound LAST, and the injection type excludes `env`, so a
167
+ // test fake cannot break that. `ownTokens` is bound last for the same reason: it is
168
+ // config-derived, and a fake that replaced it could make our own admission key look
169
+ // like user auth.
170
+ const resolved = resolveClaudeAuthMode(config, detectClaudeAuth({
171
+ ...defaultAuthDetectDeps(env as NodeJS.ProcessEnv),
172
+ ...(deps.authDetect ?? {}),
173
+ env: () => env as NodeJS.ProcessEnv,
174
+ ownTokens,
175
+ }));
176
+ if (!env.ANTHROPIC_AUTH_TOKEN && !hasUserApiKey && targetsLocalProxy && resolved.markerMode === "proxy") {
177
+ env.ANTHROPIC_AUTH_TOKEN = PROXY_MARKER;
178
+ }
179
+ const finalAuthToken = env.ANTHROPIC_AUTH_TOKEN;
180
+ const hostOwnsAuthentication = targetsLocalProxy
181
+ && !hasUserApiKey
182
+ && typeof finalAuthToken === "string"
183
+ && (
184
+ finalAuthToken.trim() === PROXY_MARKER
185
+ || isProxyAdmissionSecret(finalAuthToken, config)
186
+ );
187
+ if (resolved.origin === "auto-unknown") {
188
+ console.error("⚠ Claude 인증을 확인하지 못했습니다 — 구독 방식으로 진행합니다. GUI에서 인증 모드를 직접 지정하면 이 판단을 덮어쓸 수 있습니다.");
189
+ }
190
+ // NOTE: do NOT set _CLAUDE_CODE_ASSUME_FIRST_PARTY_BASE_URL here. While it enables
191
+ // Design/Remote Control, it DISABLES gateway model discovery (Claude Code's eligibility
192
+ // check returns false when isFirstPartyBaseUrl() is true). Model routing through the
193
+ // proxy is essential; Design/Remote Control are secondary features.
194
+ // Connectors still work because they check OAuth state ($o()), not base URL (Gd()).
195
+ // Native /model picker discovery ("From gateway", Claude Code >= 2.1.129).
196
+ setDefault("CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY", "1");
197
+ // Host-managed routing guard (devlog 260720_claude_authmode_persist/020): with
198
+ // this flag in the spawn env, Claude Code strips provider-managed vars
199
+ // (ANTHROPIC_BASE_URL/AUTH_TOKEN/API_KEY, model slots) from settings-sourced
200
+ // env (managedEnv.ts), so a leftover cc-switch/CCR ~/.claude/settings.json
201
+ // env block cannot silently hijack proxy routing away from opencodex.
202
+ // setDefault: an explicit user export (e.g. =0, isEnvTruthy-false) still wins.
203
+ // Intentional contract change: settings.env model slots are also stripped in
204
+ // ocx claude runs — use the top-level settings "model" field or opt out.
205
+ // Claude Code 2.1.206+ also treats this as a host-auth assertion. Injecting it
206
+ // without a host token makes a valid claude.ai subscription look logged out,
207
+ // so the guard is only safe when opencodex actually owns authentication.
208
+ if (hostOwnsAuthentication) {
209
+ setDefault("CLAUDE_CODE_PROVIDER_MANAGED_BY_HOST", "1");
210
+ }
211
+ // Opt-in effort forcing (devlog 136 B6): opus-shaped aliases already carry
212
+ // output_config.effort, so this is OFF unless the user enables it in config.
213
+ if (config.claudeCode?.alwaysEnableEffort === true) {
214
+ setDefault("CLAUDE_CODE_ALWAYS_ENABLE_EFFORT", "1");
215
+ }
216
+ // Context-window override: the official pair — MAX_CONTEXT_TOKENS alone is ignored
217
+ // for recognized claude-shaped ids unless DISABLE_COMPACT=1 rides along (devlog 135).
218
+ const maxCtx = config.claudeCode?.maxContextTokens;
219
+ if (typeof maxCtx === "number" && Number.isFinite(maxCtx) && maxCtx > 0) {
220
+ setDefault("CLAUDE_CODE_MAX_CONTEXT_TOKENS", String(Math.floor(maxCtx)));
221
+ setDefault("DISABLE_COMPACT", "1");
222
+ }
223
+ // Auto-context (devlog 260712 020): min(believed window, env) inside the CLI means
224
+ // one global env acts as a per-model floor — [1m]-marked models compact here while
225
+ // unmarked (200k-accounted) models keep their default behavior. Inert when the
226
+ // legacy maxContextTokens pair above is set (resolveAutoContext handles that).
227
+ // A user-exported value drives the marking predicate too (audit 021 #2) so the
228
+ // [1m] marker and the compaction threshold can never separate.
229
+ const userAutoCompact = typeof base.CLAUDE_CODE_AUTO_COMPACT_WINDOW === "string" && base.CLAUDE_CODE_AUTO_COMPACT_WINDOW !== ""
230
+ ? base.CLAUDE_CODE_AUTO_COMPACT_WINDOW
231
+ : undefined;
232
+ const auto = resolveAutoContext(config.claudeCode, userAutoCompact);
233
+ if (auto.enabled) {
234
+ setDefault("CLAUDE_CODE_AUTO_COMPACT_WINDOW", String(auto.compactWindow));
235
+ }
236
+ // Model slots (devlog 260712 B2): default + four tier defaults + legacy small-fast,
237
+ // with automatic [1m] context-variant marking when the slot's target model has an
238
+ // authoritative >=1M window (Claude Code then accounts 1M, compaction preserved).
239
+ for (const [name, value] of Object.entries(effectiveModelEnv(config.claudeCode, contextWindows, auto))) {
240
+ setDefault(name, value);
241
+ }
242
+ return env;
243
+ }
244
+
245
+ /**
246
+ * Context-window map from the RUNNING proxy's management API (warm TTL cache; the
247
+ * daemon registers every selector form — audit R3#1). 3s bound + management auth header.
248
+ * (no [1m] marking, conservative).
249
+ */
250
+ export async function fetchClaudeContextWindows(config: OcxConfig, port: number, timeoutMs = 3_000): Promise<Record<string, number>> {
251
+ try {
252
+ const headers = new Headers();
253
+ const token = configuredAdminToken();
254
+ if (token) headers.set("x-opencodex-api-key", token);
255
+ const res = await fetch(`http://127.0.0.1:${port}/api/claude-code`, {
256
+ headers,
257
+ signal: AbortSignal.timeout(timeoutMs),
258
+ });
259
+ if (!res.ok) return {};
260
+ const body = await res.json() as { contextWindows?: Record<string, number> };
261
+ return body.contextWindows && typeof body.contextWindows === "object" ? body.contextWindows : {};
262
+ } catch {
263
+ console.error("⚠ 모델 컨텍스트 정보를 불러오지 못했습니다 — 1M 자동 표시는 이번 실행에서 생략됩니다.");
264
+ return {};
265
+ }
266
+ }
267
+
268
+ async function ensureProxyForClaude(): Promise<number | null> {
269
+ const live = await findLiveProxy();
270
+ if (live) return live.port;
271
+ const cfgPort = loadConfig().port;
272
+ const pinPort = typeof cfgPort === "number" && cfgPort > 0 ? cfgPort : 10100;
273
+ const child = spawn(process.execPath, selfLaunchArgv(["start", "--port", String(pinPort)]), {
274
+ detached: true,
275
+ stdio: "ignore",
276
+ windowsHide: true,
277
+ env: withProcessRuntimeProvenance({ ...process.env, OCX_SERVICE: "1" }),
278
+ });
279
+ child.unref();
280
+ const deadline = Date.now() + 8_000;
281
+ while (Date.now() < deadline) {
282
+ const started = await findLiveProxy();
283
+ if (started) return started.port;
284
+ await new Promise(resolve => setTimeout(resolve, 250));
285
+ }
286
+ return null;
287
+ }
288
+
289
+ const CLAUDE_INSTALL_HINT = "❌ `claude` CLI not found. Install it first: npm install -g @anthropic-ai/claude-code";
290
+
291
+ /**
292
+ * cmd.exe reports command-not-found as exit 9009 (the win32 launcher routes `.cmd`
293
+ * shims through cmd.exe, so ENOENT never fires there). Signal exits are not hints.
294
+ * Devlog 260715_cross_platform_audit/020.
295
+ */
296
+ export function claudeNotFoundHint(
297
+ code: number | null,
298
+ signal: NodeJS.Signals | null,
299
+ platform: NodeJS.Platform = process.platform,
300
+ ): string | null {
301
+ return platform === "win32" && code === 9009 && !signal ? CLAUDE_INSTALL_HINT : null;
302
+ }
303
+
304
+ export async function cmdClaude(args: string[]): Promise<number> {
305
+ const config = loadConfig();
306
+ if (config.claudeCode?.enabled === false) {
307
+ console.error("Claude inbound is disabled (config.claudeCode.enabled=false — flip the Claude ON toggle in the GUI or edit config).");
308
+ return 1;
309
+ }
310
+ const port = await ensureProxyForClaude();
311
+ if (!port) {
312
+ console.error("❌ Proxy did not become healthy after starting.");
313
+ return 1;
314
+ }
315
+ const contextWindows = await fetchClaudeContextWindows(config, port);
316
+ const env = buildClaudeEnv(config, port, process.env, contextWindows);
317
+ // Pre-write the CLI's gateway-model cache (devlog 030): without a token the CLI
318
+ // never refreshes it, so the picker would keep showing yesterday's aliases.
319
+ try {
320
+ const cachePath = await refreshGatewayModelCacheFromProxy(port, { admissionConfig: config });
321
+ if (cachePath === null) {
322
+ console.error("⚠ Gateway model cache could not be refreshed; the model picker may be stale.");
323
+ }
324
+ } catch (error) {
325
+ const message = error instanceof Error ? error.message : String(error);
326
+ console.error(`⚠ Gateway model cache could not be refreshed: ${message}`);
327
+ }
328
+ // Sync roster agents (devlog 070): subagentModels + self -> ~/.claude/agents/ocx-*.md.
329
+ try {
330
+ const written = injectClaudeAgentDefs(config, contextWindows);
331
+ if (written === null) {
332
+ console.error("⚠ Claude agent definitions could not be synced; check ~/.claude/agents permissions.");
333
+ }
334
+ } catch (error) {
335
+ const message = error instanceof Error ? error.message : String(error);
336
+ console.error(`⚠ Claude agent definitions could not be synced: ${message}`);
337
+ }
338
+ return await new Promise<number>(resolve => {
339
+ const inv = commandInvocation("claude", args);
340
+ const child = spawn(inv.file, inv.args, { stdio: "inherit", env: env as NodeJS.ProcessEnv, ...inv.options });
341
+ child.on("error", (err: NodeJS.ErrnoException) => {
342
+ if (err.code === "ENOENT") {
343
+ console.error(CLAUDE_INSTALL_HINT);
344
+ } else {
345
+ console.error(`❌ Failed to launch claude: ${err.message}`);
346
+ }
347
+ resolve(1);
348
+ });
349
+ child.on("exit", (code, signal) => {
350
+ const hint = claudeNotFoundHint(code, signal);
351
+ if (hint) console.error(hint);
352
+ resolve(signal ? 1 : code ?? 0);
353
+ });
354
+ });
355
+ }
@@ -0,0 +1,103 @@
1
+ import { inspectCodexLogs, type CodexLogGuardInspection } from "../codex/log-guard/inspect";
2
+ import {
3
+ getCodexLogGuardProtectionStatus,
4
+ type CodexLogGuardStatus,
5
+ } from "../codex/log-guard/protection";
6
+
7
+ function kib(bytes: number): string {
8
+ return `${(bytes / 1024).toFixed(1)} KiB`;
9
+ }
10
+
11
+ function fileMetadataLines(report: CodexLogGuardInspection): string[] {
12
+ if (report.externalSqliteHome === null) return [];
13
+ const location = report.externalSqliteHome ? "external sqlite_home" : "CODEX_HOME sqlite_home";
14
+ return [
15
+ ` ${location}; DB ${kib(report.files.databaseBytes)}, WAL ${kib(report.files.walBytes)}, SHM ${kib(report.files.shmBytes)}`,
16
+ ];
17
+ }
18
+
19
+ type DoctorReport = CodexLogGuardInspection | CodexLogGuardStatus;
20
+
21
+ function protectionLines(report: DoctorReport): string[] {
22
+ if (!("protection" in report)) return [];
23
+ const protection = report.protection;
24
+ switch (protection.state) {
25
+ case "active":
26
+ return [` ok protection active (${protection.desiredMode})`];
27
+ case "off":
28
+ return [" -- protection off"];
29
+ case "drifted":
30
+ return [
31
+ ` WARN protection drifted (desired ${protection.desiredMode}; observed ${protection.observedMode})`,
32
+ " Action: ocx storage codex-logs repair",
33
+ ];
34
+ case "unsupported":
35
+ return [" -- protection unavailable for this schema"];
36
+ case "unknown":
37
+ return [" WARN protection state unknown; inspect reserved Log Guard triggers before changing mode"];
38
+ }
39
+ }
40
+
41
+ export function formatCodexLogGuardDoctor(report: DoctorReport): string[] {
42
+ const lines = ["Codex diagnostic logs"];
43
+ lines.push(...protectionLines(report));
44
+
45
+ if (report.schema.state === "unavailable") {
46
+ lines.push(" -- inspection unavailable");
47
+ return lines;
48
+ }
49
+ if (report.schema.state === "missing") {
50
+ lines.push(" -- logs_2.sqlite is not present");
51
+ return lines;
52
+ }
53
+ if (report.schema.state === "unreadable") {
54
+ lines.push(" -- logs_2.sqlite is unreadable; inspection metadata only");
55
+ lines.push(...fileMetadataLines(report));
56
+ lines.push(" checkpointed read-only snapshot; activity rate not measured");
57
+ return lines;
58
+ }
59
+ if (report.schema.state === "unsupported") {
60
+ lines.push(" -- unknown schema; inspection only");
61
+ } else {
62
+ lines.push(" ok schema compatible");
63
+ }
64
+
65
+ lines.push(...fileMetadataLines(report));
66
+
67
+ if (report.metrics) {
68
+ lines.push(
69
+ ` ${report.metrics.totalRows} rows; TRACE ${(report.metrics.traceShare * 100).toFixed(1)}%; reclaimable ${kib(report.metrics.reclaimableBytes)}`,
70
+ );
71
+ const top = report.metrics.topTargets[0];
72
+ if (top) lines.push(` top target ${top.target} (${top.rows} rows)`);
73
+ }
74
+
75
+ lines.push(" checkpointed read-only snapshot; activity rate not measured");
76
+ return lines;
77
+ }
78
+
79
+ export interface CodexLogGuardDoctorDeps {
80
+ inspect?: () => DoctorReport;
81
+ log?: (line: string) => void;
82
+ }
83
+
84
+ /** Observe-only doctor section. Inspection failures are reported without mutating or failing doctor. */
85
+ export function printCodexLogGuardDoctor(deps: CodexLogGuardDoctorDeps = {}): void {
86
+ const inspect = deps.inspect ?? getCodexLogGuardProtectionStatus;
87
+ const log = deps.log ?? console.log;
88
+ try {
89
+ for (const line of formatCodexLogGuardDoctor(inspect())) log(line);
90
+ } catch (error) {
91
+ // Production can still fall back to PR 1's simpler inspector if the enriched
92
+ // protection lookup fails. An injected inspector is a test/caller boundary:
93
+ // never escape that boundary and touch the real Codex home behind its back.
94
+ if (!deps.inspect) {
95
+ try {
96
+ for (const line of formatCodexLogGuardDoctor(inspectCodexLogs())) log(line);
97
+ return;
98
+ } catch { /* report the original failure below */ }
99
+ }
100
+ log("Codex diagnostic logs");
101
+ log(" -- inspection unavailable");
102
+ }
103
+ }
@@ -0,0 +1,47 @@
1
+ import { autoRestoreCodexShim } from "../codex/shim";
2
+ import { codexShimAutoRestoreEnabled, readConfigDiagnostics } from "../config";
3
+
4
+ export interface CodexShimAutoRestoreCliDeps {
5
+ env: NodeJS.ProcessEnv;
6
+ warn: (message: string) => void;
7
+ restore: typeof autoRestoreCodexShim;
8
+ readConfig: typeof readConfigDiagnostics;
9
+ }
10
+
11
+ const DEFAULT_DEPS: CodexShimAutoRestoreCliDeps = {
12
+ env: process.env,
13
+ warn: message => console.warn(message),
14
+ restore: autoRestoreCodexShim,
15
+ readConfig: readConfigDiagnostics,
16
+ };
17
+
18
+ export function skipsCodexShimAutoRestore(command: string | undefined, args: string[]): boolean {
19
+ if (command === "uninstall" || command === "remove") return true;
20
+ // `lab` is read-only inspection; it must not trigger shim side effects.
21
+ if (command === "lab") return true;
22
+ return command === "codex-shim" && ["install", "uninstall", "remove"].includes(args[1] ?? "");
23
+ }
24
+
25
+ export function maybeAutoRestoreCodexShim(
26
+ command: string | undefined,
27
+ args: string[],
28
+ deps: CodexShimAutoRestoreCliDeps = DEFAULT_DEPS,
29
+ ): void {
30
+ if (skipsCodexShimAutoRestore(command, args)) return;
31
+ try {
32
+ const result = deps.restore({
33
+ enabled: () => codexShimAutoRestoreEnabled(deps.readConfig().config, deps.env),
34
+ });
35
+ if (result.status === "restored") {
36
+ deps.warn(`⚠️ ${result.message} (automatic repair after Codex update)`);
37
+ } else if ((result.status === "deferred" || result.status === "ineligible") && result.message) {
38
+ deps.warn(`⚠️ ${result.message}`);
39
+ }
40
+ } catch (error) {
41
+ deps.warn(
42
+ `⚠️ Codex shim auto-restore failed; continuing without it: ${
43
+ error instanceof Error ? error.message : String(error)
44
+ }. Run 'ocx codex-shim install' after the Codex update finishes.`,
45
+ );
46
+ }
47
+ }
@@ -0,0 +1,76 @@
1
+ import {
2
+ currentExternalCodexModelProvider,
3
+ getCodexRoutingKind,
4
+ type CodexRoutingKind,
5
+ } from "../codex/inject";
6
+ import { loadConfig, resolveEnvValue } from "../config";
7
+
8
+ const PROXY_ENV_KEYS = [
9
+ "HTTP_PROXY",
10
+ "HTTPS_PROXY",
11
+ "ALL_PROXY",
12
+ "http_proxy",
13
+ "https_proxy",
14
+ "all_proxy",
15
+ ] as const;
16
+
17
+ export interface CodexShimReadinessInputs {
18
+ routingKind: CodexRoutingKind;
19
+ externalProvider: string | null;
20
+ processProxyEnvPresent: boolean;
21
+ configuredProxyResolved: boolean;
22
+ }
23
+
24
+ function externalProviderLabel(provider: string | null): string {
25
+ return provider
26
+ ? `external model_provider ${JSON.stringify(provider)}`
27
+ : "the active Codex route";
28
+ }
29
+
30
+ export function codexShimReadinessWarnings(
31
+ inputs: CodexShimReadinessInputs,
32
+ ): string[] {
33
+ const warnings: string[] = [];
34
+ const provider = externalProviderLabel(inputs.externalProvider);
35
+
36
+ if (inputs.routingKind === "unknown") {
37
+ warnings.push(
38
+ inputs.externalProvider
39
+ ? `Codex still selects ${provider}. The shim can start OpenCodex, but it does not redirect that provider; point it at the live OpenCodex /v1 endpoint with wire_api = "responses", or switch to the built-in openai provider and run 'ocx sync'.`
40
+ : "Codex routing could not be verified. The shim can start OpenCodex, but it may not redirect Codex; run 'ocx doctor' before relying on autostart.",
41
+ );
42
+ } else if (inputs.routingKind === "custom-local") {
43
+ warnings.push(
44
+ `Codex uses ${provider} through a user-owned local gateway. The shim can start OpenCodex, but OpenCodex does not own that route; run 'ocx doctor' to verify its lifecycle.`,
45
+ );
46
+ } else if (inputs.routingKind === "custom-remote") {
47
+ warnings.push(
48
+ `Codex uses ${provider} through a remote gateway. The shim only starts a local OpenCodex proxy and will not affect those requests.`,
49
+ );
50
+ }
51
+
52
+ if (inputs.processProxyEnvPresent && !inputs.configuredProxyResolved) {
53
+ warnings.push(
54
+ "Proxy environment variables are present only in this process while config.proxy is unset or unresolved. Codex launchers and background services may not inherit them; persist config.proxy before relying on autostart.",
55
+ );
56
+ }
57
+
58
+ return warnings;
59
+ }
60
+
61
+ export function collectCodexShimReadinessWarnings(): string[] {
62
+ const config = loadConfig();
63
+ let externalProvider: string | null = null;
64
+ try {
65
+ externalProvider = currentExternalCodexModelProvider();
66
+ } catch {
67
+ // Routing readiness is advisory; getCodexRoutingKind() already reports an
68
+ // unreadable config as unknown, so preserve that warning instead of failing.
69
+ }
70
+ return codexShimReadinessWarnings({
71
+ routingKind: getCodexRoutingKind(),
72
+ externalProvider,
73
+ processProxyEnvPresent: PROXY_ENV_KEYS.some(key => Boolean(process.env[key]?.trim())),
74
+ configuredProxyResolved: Boolean(resolveEnvValue(config.proxy)?.trim()),
75
+ });
76
+ }