@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,435 @@
1
+ /**
2
+ * Dashboard memory-card drain-and-restart (#563).
3
+ *
4
+ * Longer than POST /api/stop's short drain: waits up to 60s for active turns,
5
+ * then respawns. Never runs restoreNativeCodex / stripGrokConfig — this is a
6
+ * recycle to reclaim RSS, not a teardown.
7
+ *
8
+ * Respawn policy (matches real supervisor configs in src/service.ts):
9
+ * - Supervised child (`OCX_SERVICE=1` + viable service): exit(1) so
10
+ * failure-only supervisors (systemd Restart=on-failure, WinSW onfailure,
11
+ * Task Scheduler ERRORLEVEL loop) bring the proxy back.
12
+ * - Otherwise: detached `ocx start --port <live>` (bypasses ensure's
13
+ * codexAutoStart gate), mark recycle so exit cleanup keeps injection, exit(0).
14
+ * Installed-but-stale/missing service assets are NOT treated as supervised —
15
+ * exit(1) would leave the proxy dead with `Service: installed, stale or missing
16
+ * service assets` and a /healthz timeout.
17
+ * - If detached spawn fails (sync throw or pre-start `error`): exit(1) without
18
+ * markRecycling — after drain the listen socket is already closed, so a latch
19
+ * reset cannot recover serving. Clear inherited `OCX_SERVICE` so exit cleanup
20
+ * can restore Codex/Grok fences when a stale service marker has no viable
21
+ * supervisor. Log only a stable errno code — never the raw message
22
+ * (paths in ENOENT often include the OS username).
23
+ */
24
+ import { spawn } from "node:child_process";
25
+ import {
26
+ beginShutdownDrain,
27
+ drainAndShutdown,
28
+ getActiveTurnCount,
29
+ getServerListenPort,
30
+ isDraining,
31
+ isShutdownDraining,
32
+ markRecyclingForExit,
33
+ stopServerListener,
34
+ } from "../lifecycle";
35
+ import { isServiceViable } from "../../service";
36
+ import { readRuntimePort } from "../../config";
37
+ import { withProcessRuntimeProvenance } from "../../lib/bun-runtime";
38
+ import { selfLaunchArgv } from "../../lib/self-launch-argv";
39
+ import {
40
+ MEMORY_DRAIN_RESTART_MS,
41
+ REPLACEMENT_READY_TIMEOUT_MS,
42
+ } from "../../lib/system-restart-contract";
43
+ import { findLiveProxy } from "../proxy-liveness";
44
+
45
+ export { MEMORY_DRAIN_RESTART_MS, REPLACEMENT_READY_TIMEOUT_MS } from "../../lib/system-restart-contract";
46
+ export const DEADLINE_LISTENER_STOP_TIMEOUT_MS = 5_000;
47
+ const REPLACEMENT_READY_POLL_MS = 150;
48
+
49
+ export interface ReplacementReadinessIo {
50
+ findLive?: typeof findLiveProxy;
51
+ now?: () => number;
52
+ sleep?: (ms: number) => Promise<void>;
53
+ }
54
+
55
+ export interface SystemRestartIo {
56
+ drainAndShutdown?: typeof drainAndShutdown;
57
+ /** True when a background service can actually respawn this process after exit(1). */
58
+ isServiceViable?: () => boolean;
59
+ isSupervisedServiceChild?: () => boolean;
60
+ /** Ordinary start; deadline handoff may defer health until parent exit releases OS locks. */
61
+ spawnStart?: (port?: number, waitForHealthBeforeParentExit?: boolean) => void | Promise<void>;
62
+ /** Idempotent listener close; must settle before an ordinary start is spawned. */
63
+ stopListener?: () => void | Promise<void>;
64
+ markRecycling?: () => void;
65
+ exitProcess?: (code: number) => void;
66
+ schedule?: (fn: () => void | Promise<void>, ms: number) => void;
67
+ scheduleDeadline?: (fn: () => void, ms: number) => () => void;
68
+ isDraining?: () => boolean;
69
+ isShutdownDraining?: () => boolean;
70
+ beginShutdownDrain?: () => boolean;
71
+ setDraining?: (value: boolean) => void;
72
+ getActiveTurnCount?: () => number;
73
+ listenPort?: () => number | undefined;
74
+ now?: () => number;
75
+ }
76
+
77
+ let restartIo: SystemRestartIo = {};
78
+ /** Prevents double-scheduling in the 200ms window before drainAndShutdown sets draining. */
79
+ let restartAccepted = false;
80
+
81
+ type RestartDrainOutcome = "completed" | "rejected" | "deadline";
82
+ type BoundedSettlementOutcome = "completed" | "rejected" | "deadline";
83
+
84
+ function waitForRestartDrain(
85
+ drainPromise: Promise<void>,
86
+ deadlineMs: number,
87
+ now: () => number,
88
+ scheduleDeadline: NonNullable<SystemRestartIo["scheduleDeadline"]>,
89
+ ): Promise<RestartDrainOutcome> {
90
+ const remainingMs = Math.max(0, deadlineMs - now());
91
+ if (remainingMs === 0) {
92
+ // Observe any late rejection even though orchestration is already terminal.
93
+ void drainPromise.catch(() => {});
94
+ return Promise.resolve("deadline");
95
+ }
96
+ return new Promise<RestartDrainOutcome>((resolve) => {
97
+ let settled = false;
98
+ let cancelDeadline: (() => void) | undefined;
99
+ const finish = (outcome: RestartDrainOutcome) => {
100
+ if (settled) return;
101
+ settled = true;
102
+ cancelDeadline?.();
103
+ resolve(outcome);
104
+ };
105
+ cancelDeadline = scheduleDeadline(() => finish("deadline"), remainingMs);
106
+ if (settled) cancelDeadline();
107
+ void drainPromise.then(
108
+ () => finish("completed"),
109
+ () => finish("rejected"),
110
+ );
111
+ });
112
+ }
113
+
114
+ function waitForBoundedSettlement(
115
+ promise: Promise<void>,
116
+ timeoutMs: number,
117
+ scheduleDeadline: NonNullable<SystemRestartIo["scheduleDeadline"]>,
118
+ ): Promise<BoundedSettlementOutcome> {
119
+ return new Promise<BoundedSettlementOutcome>((resolve) => {
120
+ let settled = false;
121
+ let cancelDeadline: (() => void) | undefined;
122
+ const finish = (outcome: BoundedSettlementOutcome) => {
123
+ if (settled) return;
124
+ settled = true;
125
+ cancelDeadline?.();
126
+ resolve(outcome);
127
+ };
128
+ cancelDeadline = scheduleDeadline(() => finish("deadline"), timeoutMs);
129
+ if (settled) cancelDeadline();
130
+ void promise.then(
131
+ () => finish("completed"),
132
+ () => finish("rejected"),
133
+ );
134
+ });
135
+ }
136
+
137
+ /** Test seam — reset between tests. */
138
+ export function setSystemRestartIoForTests(io: SystemRestartIo = {}): void {
139
+ restartIo = io;
140
+ restartAccepted = false;
141
+ }
142
+
143
+ function resolveListenPort(): number | undefined {
144
+ const live = getServerListenPort();
145
+ if (live) return live;
146
+ const runtime = readRuntimePort(process.pid);
147
+ if (runtime && runtime.port > 0) return runtime.port;
148
+ return undefined;
149
+ }
150
+
151
+ function isSupervisedServiceChild(io: SystemRestartIo = {}): boolean {
152
+ if (process.env.OCX_SERVICE !== "1") return false;
153
+ // Presence is not enough: stale/missing service assets report installed but will not
154
+ // respawn after exit(1). Dashboard status/recovery must fall through to detached start.
155
+ return (io.isServiceViable ?? isServiceViable)();
156
+ }
157
+
158
+ /** Stable, path-free spawn failure label for logs (never interpolate err.message). */
159
+ function spawnFailureCode(err: unknown): string {
160
+ if (err && typeof err === "object" && "code" in err) {
161
+ const code = (err as NodeJS.ErrnoException).code;
162
+ if (typeof code === "string" && code.length > 0 && code.length <= 64) return code;
163
+ }
164
+ return "spawn_failed";
165
+ }
166
+
167
+ function handoffError(code: string): NodeJS.ErrnoException {
168
+ const error = new Error(code) as NodeJS.ErrnoException;
169
+ error.code = code;
170
+ return error;
171
+ }
172
+
173
+ export async function waitForReplacementReady(
174
+ expectedPid: number | undefined,
175
+ parentPid: number,
176
+ expectedPort: number | undefined,
177
+ io: ReplacementReadinessIo = {},
178
+ ): Promise<boolean> {
179
+ const findLive = io.findLive ?? findLiveProxy;
180
+ const now = io.now ?? Date.now;
181
+ const sleep = io.sleep ?? Bun.sleep;
182
+ const deadline = now() + REPLACEMENT_READY_TIMEOUT_MS;
183
+ while (now() < deadline) {
184
+ try {
185
+ const live = await findLive({
186
+ deadlineAt: deadline,
187
+ nowFn: now,
188
+ sleepFn: sleep,
189
+ });
190
+ // A probe that began within budget can still return after it. Never accept
191
+ // delayed health as proof once the shared absolute handoff budget expired.
192
+ if (now() >= deadline) return false;
193
+ if (
194
+ live
195
+ && live.pid !== null
196
+ && live.pid !== parentPid
197
+ && (expectedPid === undefined || live.pid === expectedPid)
198
+ && (expectedPort === undefined || live.port === expectedPort)
199
+ ) {
200
+ return true;
201
+ }
202
+ } catch {
203
+ // A not-yet-bound replacement is indistinguishable from a transient
204
+ // liveness failure here; keep polling inside the one bounded window.
205
+ }
206
+ const remainingMs = deadline - now();
207
+ if (remainingMs <= 0) break;
208
+ await sleep(Math.min(REPLACEMENT_READY_POLL_MS, remainingMs));
209
+ }
210
+ return false;
211
+ }
212
+
213
+ function spawnDetachedStart(
214
+ port?: number,
215
+ waitForHealthBeforeParentExit = true,
216
+ ): Promise<void> {
217
+ const args = ["start"];
218
+ const expectedPort = typeof port === "number" && Number.isFinite(port) && port > 0 && port <= 65535
219
+ ? Math.trunc(port)
220
+ : undefined;
221
+ if (expectedPort !== undefined) {
222
+ args.push("--port", String(expectedPort));
223
+ }
224
+ const launchArgs = selfLaunchArgv(args);
225
+ return new Promise<void>((resolve, reject) => {
226
+ let child: ReturnType<typeof spawn>;
227
+ try {
228
+ const env: NodeJS.ProcessEnv = { ...process.env };
229
+ delete env.OCX_SERVICE;
230
+ child = spawn(process.execPath, launchArgs, {
231
+ detached: true,
232
+ stdio: "ignore",
233
+ windowsHide: true,
234
+ env: withProcessRuntimeProvenance(env),
235
+ });
236
+ } catch (err) {
237
+ reject(err);
238
+ return;
239
+ }
240
+ let settled = false;
241
+ const cleanup = () => {
242
+ child.off("error", onError);
243
+ child.off("exit", onExit);
244
+ child.off("spawn", onSpawn);
245
+ };
246
+ const finish = (error?: unknown) => {
247
+ if (settled) return;
248
+ settled = true;
249
+ cleanup();
250
+ if (error !== undefined) {
251
+ if (child.exitCode === null && child.signalCode === null) {
252
+ try { child.kill(); } catch { /* best-effort failed-start cleanup */ }
253
+ }
254
+ try { child.unref(); } catch { /* best-effort */ }
255
+ reject(error);
256
+ return;
257
+ }
258
+ child.unref();
259
+ resolve();
260
+ };
261
+ const onError = (err: Error) => { finish(err); };
262
+ const onExit = () => { finish(handoffError("child_exit")); };
263
+ const onSpawn = () => {
264
+ if (!waitForHealthBeforeParentExit) {
265
+ // A deadline may have been caused by native-main ownership cleanup.
266
+ // Let the ordinary child survive parent exit, which releases those OS locks.
267
+ finish();
268
+ return;
269
+ }
270
+ void waitForReplacementReady(child.pid, process.pid, expectedPort).then(
271
+ ready => {
272
+ if (!ready) {
273
+ console.warn(
274
+ "Drain-and-restart replacement is still alive after the readiness window; allowing it to continue after parent exit",
275
+ );
276
+ }
277
+ // Never kill a live ordinary start at its valid reclaim boundary. Parent
278
+ // exit is the final resource release the child may still be waiting for.
279
+ finish();
280
+ },
281
+ err => finish(err),
282
+ );
283
+ };
284
+ child.once("error", onError);
285
+ child.once("exit", onExit);
286
+ child.once("spawn", onSpawn);
287
+ });
288
+ }
289
+
290
+ async function completeDeferredParentExitHandoff(
291
+ io: SystemRestartIo,
292
+ exitProcess: (code: number) => void,
293
+ port: number | undefined,
294
+ phase: "deadline" | "listener-stop fallback",
295
+ ): Promise<void> {
296
+ try {
297
+ await (io.spawnStart ?? spawnDetachedStart)(port, false);
298
+ } catch (err) {
299
+ console.warn(
300
+ `Drain-and-restart ${phase} spawn failed (${spawnFailureCode(err)}); exiting without replacement`,
301
+ );
302
+ delete process.env.OCX_SERVICE;
303
+ exitProcess(1);
304
+ return;
305
+ }
306
+ (io.markRecycling ?? markRecyclingForExit)();
307
+ exitProcess(0);
308
+ }
309
+
310
+ async function completeDeadlineRestartHandoff(
311
+ io: SystemRestartIo,
312
+ exitProcess: (code: number) => void,
313
+ port: number | undefined,
314
+ scheduleDeadline: NonNullable<SystemRestartIo["scheduleDeadline"]>,
315
+ ): Promise<void> {
316
+ const supervised = (io.isSupervisedServiceChild ?? (() => isSupervisedServiceChild(io)))();
317
+ if (supervised) {
318
+ // Failure-only supervisors ignore exit(0); intentional non-zero triggers respawn.
319
+ exitProcess(1);
320
+ return;
321
+ }
322
+
323
+ const stopPromise = Promise.resolve().then(
324
+ () => (io.stopListener ?? (() => stopServerListener()))(),
325
+ );
326
+ const stopOutcome = await waitForBoundedSettlement(
327
+ stopPromise,
328
+ DEADLINE_LISTENER_STOP_TIMEOUT_MS,
329
+ scheduleDeadline,
330
+ );
331
+ if (stopOutcome === "rejected") {
332
+ console.warn("Drain-and-restart deadline listener stop failed; continuing parent-exit handoff");
333
+ } else if (stopOutcome === "deadline") {
334
+ console.warn("Drain-and-restart deadline listener stop timed out; continuing parent-exit handoff");
335
+ }
336
+ // The ordinary child must survive parent exit: a failed/pending socket close
337
+ // or overdue cleanup is completed by process teardown, without a hidden mode.
338
+ await completeDeferredParentExitHandoff(io, exitProcess, port, "deadline");
339
+ }
340
+
341
+ /**
342
+ * Accept a drain-and-restart request. Returns immediately; the drain +
343
+ * respawn runs on a short timer so the HTTP response can flush first.
344
+ * Idempotent while already draining: returns the accepted shape again.
345
+ */
346
+ export function acceptSystemRestart(io: SystemRestartIo = restartIo): {
347
+ accepted: true;
348
+ alreadyDraining: boolean;
349
+ activeTurnCount: number;
350
+ drainTimeoutMs: number;
351
+ } {
352
+ const shutdownActive = io.isShutdownDraining
353
+ ?? io.isDraining
354
+ ?? isShutdownDraining;
355
+ const alreadyDraining = restartAccepted || shutdownActive();
356
+ const activeTurnCount = (io.getActiveTurnCount ?? getActiveTurnCount)();
357
+ const schedule = io.schedule ?? ((fn, ms) => { setTimeout(() => { void fn(); }, ms); });
358
+
359
+ if (!alreadyDraining) {
360
+ restartAccepted = true;
361
+ const now = io.now ?? Date.now;
362
+ const restartDeadlineMs = now() + MEMORY_DRAIN_RESTART_MS;
363
+ // Reject new data-plane traffic immediately (503), before the 200ms response-flush delay.
364
+ if (io.beginShutdownDrain) io.beginShutdownDrain();
365
+ else if (io.setDraining) io.setDraining(true);
366
+ else beginShutdownDrain();
367
+ schedule(async () => {
368
+ // Preserve the live binding before drainAndShutdown (or its deadline race)
369
+ // closes the listener and makes both the server ref and runtime metadata stale.
370
+ const restartPort = (io.listenPort ?? resolveListenPort)();
371
+ const drain = io.drainAndShutdown ?? drainAndShutdown;
372
+ const remainingMs = Math.max(0, restartDeadlineMs - now());
373
+ const drainPromise = Promise.resolve().then(() => drain(undefined, remainingMs));
374
+ const scheduleDeadline = io.scheduleDeadline ?? ((fn, ms) => {
375
+ const timer = setTimeout(fn, ms);
376
+ return () => clearTimeout(timer);
377
+ });
378
+ const drainOutcome = await waitForRestartDrain(drainPromise, restartDeadlineMs, now, scheduleDeadline);
379
+ const exitProcess = io.exitProcess ?? ((code: number) => { process.exit(code); });
380
+ if (drainOutcome === "deadline") {
381
+ console.warn("Drain-and-restart deadline expired; forcing terminal restart handoff");
382
+ await completeDeadlineRestartHandoff(io, exitProcess, restartPort, scheduleDeadline);
383
+ return;
384
+ }
385
+ if (drainOutcome === "rejected") {
386
+ // drainAndShutdown stops the listener in finally. Even if ancillary cleanup
387
+ // rejects, an accepted restart must still reach replacement or terminal exit.
388
+ console.warn("Drain-and-restart cleanup failed; continuing terminal restart handoff");
389
+ }
390
+ const supervised = (io.isSupervisedServiceChild ?? (() => isSupervisedServiceChild(io)))();
391
+ if (supervised) {
392
+ // Failure-only supervisors ignore exit(0); intentional non-zero triggers respawn.
393
+ (io.exitProcess ?? ((code: number) => { process.exit(code); }))(1);
394
+ return;
395
+ }
396
+ try {
397
+ await (io.stopListener ?? (() => stopServerListener()))();
398
+ } catch {
399
+ console.warn("Drain-and-restart listener stop failed; continuing parent-exit handoff");
400
+ await completeDeferredParentExitHandoff(
401
+ io,
402
+ exitProcess,
403
+ restartPort,
404
+ "listener-stop fallback",
405
+ );
406
+ return;
407
+ }
408
+ try {
409
+ // A rejected drain has uncertain cleanup ownership, so it uses the same
410
+ // parent-exit handoff as a deadline. Only a fully completed drain waits
411
+ // for replacement health in the old process.
412
+ await (io.spawnStart ?? spawnDetachedStart)(restartPort, drainOutcome === "completed");
413
+ } catch (err) {
414
+ console.warn(
415
+ `⚠️ Drain-and-restart spawn failed (${spawnFailureCode(err)}); exiting without replacement`,
416
+ );
417
+ // Listen socket is already stopped; do not markRecycling — no child to inherit fences.
418
+ // No replacement inherited the routing. Clear a stale service marker so
419
+ // this unsupervised parent restores clients after the failed handoff.
420
+ delete process.env.OCX_SERVICE;
421
+ exitProcess(1);
422
+ return;
423
+ }
424
+ (io.markRecycling ?? markRecyclingForExit)();
425
+ exitProcess(0);
426
+ }, 200);
427
+ }
428
+
429
+ return {
430
+ accepted: true,
431
+ alreadyDraining,
432
+ activeTurnCount,
433
+ drainTimeoutMs: MEMORY_DRAIN_RESTART_MS,
434
+ };
435
+ }
@@ -0,0 +1,194 @@
1
+ /**
2
+ * /api/system/* — service-process runtime/memory introspection (#314 WP3)
3
+ * and the memory-card drain-and-restart action (#563).
4
+ *
5
+ * Rides the standard management gate: every /api/* request already passed
6
+ * the independent management-auth gate + the origin check before dispatch, so these
7
+ * routes add no auth of their own. NEVER expose this data on the
8
+ * unauthenticated /healthz surface.
9
+ *
10
+ * The payload is scalar-only (numbers, enum strings, booleans): no paths, no
11
+ * tokens, no account identifiers. `external` and `arrayBuffers` keep Windows
12
+ * diagnostics honest when RSS/working-set counters under-report committed
13
+ * retention. `jscHeap` (bun:jsc heapStats) is useful context, but on Bun 1.3.14
14
+ * it is not a standalone leak discriminator. `responseState` attributes growth
15
+ * further: it is the proxy's previous_response_id continuation store, so a
16
+ * growing responseState.totalBytes under rising observed memory points at
17
+ * conversation retention rather than the runtime allocator. Spill counts,
18
+ * payload-byte totals, tombstones, and failure counters remain finite scalars;
19
+ * response ids, filenames, digests, paths, and payload content never leave the owner.
20
+ *
21
+ * `activeTurnCount` / `isDraining` are scalar lifecycle counters for the
22
+ * dashboard drain-and-restart confirm UX — never request bodies or IDs.
23
+ */
24
+ import { selectEagerPath } from "../../lib/bun-stream-caps";
25
+ import { reportedBunRuntimeSource } from "../../lib/bun-runtime";
26
+ import { getActiveTurnCount, isDraining } from "../lifecycle";
27
+ import { getActiveMemoryWatchdog, observedMemoryCounter } from "../memory-watchdog";
28
+ import { responseStateMetrics } from "../../responses/state";
29
+ import { appOwnedBytesSnapshot } from "../../lib/app-owned-memory";
30
+ import { readWindowsReplaceRetryCounters } from "../../lib/windows-atomic-replace";
31
+ import {
32
+ SYSTEM_RESTART_EXPECTED_PID_HEADER,
33
+ parseExpectedSystemRestartPid,
34
+ } from "../../lib/system-restart-contract";
35
+ import {
36
+ CODEX_APP_SERVER_STATE_PATH,
37
+ CODEX_RESTART_PATH,
38
+ } from "../../lib/codex-restart-contract";
39
+ import { jsonResponse } from "../auth-cors";
40
+ import { getInspectionCounters } from "../relay";
41
+ import type {
42
+ performCodexRestart,
43
+ readCodexAppServerState,
44
+ } from "../../codex/app-server-restart-service";
45
+ import type { ManagementContext } from "./context";
46
+ import { acceptSystemRestart } from "./system-restart";
47
+
48
+ const ENDPOINT_SAMPLE_LIMIT = 60;
49
+
50
+ export async function handleSystemRoutes(ctx: ManagementContext): Promise<Response | null> {
51
+ const { req, url, config } = ctx;
52
+ if (url.pathname === "/api/system/memory" && req.method === "GET") {
53
+ const usage = process.memoryUsage();
54
+ let jscHeap: { heapSize: number; heapCapacity: number; objectCount: number } | null = null;
55
+ try {
56
+ const { heapStats } = await import("bun:jsc");
57
+ const stats = heapStats();
58
+ jscHeap = {
59
+ heapSize: stats.heapSize,
60
+ heapCapacity: stats.heapCapacity,
61
+ objectCount: stats.objectCount,
62
+ };
63
+ } catch {
64
+ /* non-Bun tooling or unavailable introspection — omit the discriminator */
65
+ }
66
+ const watchdogInstance = getActiveMemoryWatchdog();
67
+ const observed = observedMemoryCounter({
68
+ rss: usage.rss,
69
+ external: usage.external,
70
+ arrayBuffers: usage.arrayBuffers,
71
+ });
72
+ const watchdog = watchdogInstance
73
+ ? (() => {
74
+ const snap = watchdogInstance.snapshot();
75
+ return {
76
+ warnThresholdBytes: snap.warnThresholdBytes,
77
+ lastWarnAt: snap.lastWarnAt,
78
+ observedBytes: snap.observedBytes,
79
+ observedMetric: snap.observedMetric,
80
+ samples: snap.samples.slice(-ENDPOINT_SAMPLE_LIMIT),
81
+ };
82
+ })()
83
+ : null;
84
+ const streamMode = config.streamMode ?? "auto";
85
+ /**
86
+ * No request-specific rewrite context exists on this route, so report the
87
+ * effective no-client-rewrite baseline. Individual rewrite requests still
88
+ * stay on tee even when this baseline says eager.
89
+ */
90
+ const eagerRelay = selectEagerPath(process.platform, false, streamMode);
91
+ return jsonResponse({
92
+ pid: process.pid,
93
+ bunVersion: Bun.version,
94
+ bunRevision: Bun.revision,
95
+ // Recorded at launch, not resolved now: absent means "this service predates the
96
+ // marker", which callers must report as unknown rather than guess.
97
+ bunRuntimeSource: reportedBunRuntimeSource(),
98
+ platform: process.platform,
99
+ uptimeSeconds: process.uptime(),
100
+ rss: usage.rss,
101
+ heapUsed: usage.heapUsed,
102
+ heapTotal: usage.heapTotal,
103
+ external: usage.external,
104
+ arrayBuffers: usage.arrayBuffers,
105
+ observedBytes: observed.observedBytes,
106
+ observedMetric: observed.observedMetric,
107
+ jscHeap,
108
+ responseState: responseStateMetrics(),
109
+ appOwnedBytes: appOwnedBytesSnapshot(),
110
+ inspectionCounters: getInspectionCounters(),
111
+ streamMode,
112
+ eagerRelay,
113
+ watchdog,
114
+ activeTurnCount: getActiveTurnCount(),
115
+ isDraining: isDraining(),
116
+ });
117
+ }
118
+
119
+ /**
120
+ * Windows atomic-replace retry counters.
121
+ *
122
+ * A sibling route rather than a field on /api/system/memory: that payload is
123
+ * memory-shaped, and appending unrelated filesystem counters to it makes both
124
+ * harder to consume.
125
+ *
126
+ * Keys are `publisher:CODE` where publisher is a closed union
127
+ * (ReplacePublisher) and never a path — a path could carry a username. The
128
+ * type is what enforces that; a text scan cannot see a runtime value.
129
+ */
130
+ if (url.pathname === "/api/system/windows-replace-retries" && req.method === "GET") {
131
+ return jsonResponse({ counters: readWindowsReplaceRetryCounters() });
132
+ }
133
+ if (url.pathname === "/api/system/restart" && req.method === "POST") {
134
+ const expectedPid = parseExpectedSystemRestartPid(
135
+ req.headers.get(SYSTEM_RESTART_EXPECTED_PID_HEADER),
136
+ );
137
+ if (expectedPid.kind === "invalid") {
138
+ return jsonResponse({
139
+ success: false,
140
+ error: "Invalid restart target identity.",
141
+ }, 400, req, config);
142
+ }
143
+ if (expectedPid.kind === "present" && expectedPid.pid !== process.pid) {
144
+ return jsonResponse({
145
+ success: false,
146
+ error: "Restart target identity changed.",
147
+ }, 409, req, config);
148
+ }
149
+
150
+ // Longer informed drain than /api/stop; does not tear down Codex/Grok injection.
151
+ const result = acceptSystemRestart();
152
+ return jsonResponse({
153
+ success: true,
154
+ message: result.alreadyDraining
155
+ ? "Drain already in progress."
156
+ : "Draining in-flight requests, then restarting.",
157
+ activeTurnCount: result.activeTurnCount,
158
+ drainTimeoutMs: result.drainTimeoutMs,
159
+ alreadyDraining: result.alreadyDraining,
160
+ }, 202, req, config);
161
+ }
162
+
163
+ if (
164
+ (url.pathname === CODEX_APP_SERVER_STATE_PATH && req.method === "GET")
165
+ || (url.pathname === CODEX_RESTART_PATH && req.method === "POST")
166
+ ) {
167
+ // Resolved inside the path check, not at the top of this function: every
168
+ // /api/system/* request runs through here, and an unconditional import would
169
+ // pull the platform process-enumeration helpers into requests that never
170
+ // touch them.
171
+ // An explicit branch rather than `??`: the seam is an optional property, and
172
+ // narrowing through a nullish default keeps its `undefined` in the union.
173
+ let service: {
174
+ readState: typeof readCodexAppServerState;
175
+ performRestart: typeof performCodexRestart;
176
+ };
177
+ const injected = ctx.deps.codexRestartService;
178
+ if (injected) {
179
+ service = injected;
180
+ } else {
181
+ const module = await import("../../codex/app-server-restart-service");
182
+ service = {
183
+ readState: module.readCodexAppServerState,
184
+ performRestart: module.performCodexRestart,
185
+ };
186
+ }
187
+ if (req.method === "GET") {
188
+ return jsonResponse(service.readState(), 200, req, config);
189
+ }
190
+ return jsonResponse(await service.performRestart(), 200, req, config);
191
+ }
192
+
193
+ return null;
194
+ }