@remodex/rmx 1.0.2

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 (588) hide show
  1. package/AGENTS_INSTALL.md +91 -0
  2. package/LICENSE +21 -0
  3. package/README.md +242 -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 +584 -0
  9. package/bin/package-main.mjs +9 -0
  10. package/gui/dist/assets/index-CZqebSPQ.css +1 -0
  11. package/gui/dist/assets/index-CkETtt7P.js +71 -0
  12. package/gui/dist/favicon.png +0 -0
  13. package/gui/dist/fonts/google-sans-cyrillic.woff2 +0 -0
  14. package/gui/dist/fonts/google-sans-latin.woff2 +0 -0
  15. package/gui/dist/icons.svg +24 -0
  16. package/gui/dist/index.html +25 -0
  17. package/gui/dist/logo.png +0 -0
  18. package/gui/dist/provider-icons/alibaba-color.svg +1 -0
  19. package/gui/dist/provider-icons/antigravity-color.svg +1 -0
  20. package/gui/dist/provider-icons/claude-color.svg +1 -0
  21. package/gui/dist/provider-icons/cline-color.svg +16 -0
  22. package/gui/dist/provider-icons/cloudflare-ai-gateway-color.svg +1 -0
  23. package/gui/dist/provider-icons/commandcode-color.svg +1 -0
  24. package/gui/dist/provider-icons/copilot-color.svg +1 -0
  25. package/gui/dist/provider-icons/cursor-color.svg +2 -0
  26. package/gui/dist/provider-icons/deepseek-color.svg +1 -0
  27. package/gui/dist/provider-icons/discord.svg +1 -0
  28. package/gui/dist/provider-icons/firepass-color.svg +1 -0
  29. package/gui/dist/provider-icons/fireworks-color.svg +1 -0
  30. package/gui/dist/provider-icons/gemini-color.svg +1 -0
  31. package/gui/dist/provider-icons/github-copilot-color.svg +1 -0
  32. package/gui/dist/provider-icons/gitlab-duo-color.svg +1 -0
  33. package/gui/dist/provider-icons/grok.svg +1 -0
  34. package/gui/dist/provider-icons/groq-color.svg +1 -0
  35. package/gui/dist/provider-icons/huggingface-color.svg +1 -0
  36. package/gui/dist/provider-icons/kimi-color.svg +1 -0
  37. package/gui/dist/provider-icons/kiro-color.svg +15 -0
  38. package/gui/dist/provider-icons/lm-studio-color.svg +1 -0
  39. package/gui/dist/provider-icons/mistral-color.svg +1 -0
  40. package/gui/dist/provider-icons/moonshot-color.svg +1 -0
  41. package/gui/dist/provider-icons/nvidia-color.svg +1 -0
  42. package/gui/dist/provider-icons/ollama-color.svg +1 -0
  43. package/gui/dist/provider-icons/openai.svg +1 -0
  44. package/gui/dist/provider-icons/opencode.svg +2 -0
  45. package/gui/dist/provider-icons/openrouter-color.svg +1 -0
  46. package/gui/dist/provider-icons/pi.svg +21 -0
  47. package/gui/dist/provider-icons/qianfan-color.svg +1 -0
  48. package/gui/dist/provider-icons/qwen-portal-color.svg +1 -0
  49. package/gui/dist/provider-icons/telegram.svg +1 -0
  50. package/gui/dist/provider-icons/vercel-ai-gateway-color.svg +1 -0
  51. package/gui/dist/provider-icons/vllm-color.svg +1 -0
  52. package/gui/dist/provider-icons/xiaomi-color.svg +1 -0
  53. package/package.json +118 -0
  54. package/src/AGENTS.md +28 -0
  55. package/src/adapters/anthropic-image-guard.ts +251 -0
  56. package/src/adapters/anthropic-image-normalize.ts +518 -0
  57. package/src/adapters/anthropic.ts +1205 -0
  58. package/src/adapters/azure.ts +36 -0
  59. package/src/adapters/base.ts +83 -0
  60. package/src/adapters/client-fingerprint.ts +59 -0
  61. package/src/adapters/command-code.ts +453 -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/cursor-errors.ts +165 -0
  65. package/src/adapters/cursor/discovery.ts +276 -0
  66. package/src/adapters/cursor/effort-map.ts +139 -0
  67. package/src/adapters/cursor/exec-policy.ts +88 -0
  68. package/src/adapters/cursor/framing.ts +250 -0
  69. package/src/adapters/cursor/gen/agent_pb.ts +15274 -0
  70. package/src/adapters/cursor/kv-store.ts +52 -0
  71. package/src/adapters/cursor/live-models.ts +153 -0
  72. package/src/adapters/cursor/live-smoke-gate.ts +41 -0
  73. package/src/adapters/cursor/live-transport.ts +1235 -0
  74. package/src/adapters/cursor/mcp-config.ts +42 -0
  75. package/src/adapters/cursor/mcp-manager.ts +333 -0
  76. package/src/adapters/cursor/message-mapper.ts +49 -0
  77. package/src/adapters/cursor/native-exec-common.ts +59 -0
  78. package/src/adapters/cursor/native-exec-desktop.ts +184 -0
  79. package/src/adapters/cursor/native-exec-fs.ts +332 -0
  80. package/src/adapters/cursor/native-exec-mcp.ts +153 -0
  81. package/src/adapters/cursor/native-exec-network.ts +43 -0
  82. package/src/adapters/cursor/native-exec-shell.ts +548 -0
  83. package/src/adapters/cursor/native-exec-tools.ts +118 -0
  84. package/src/adapters/cursor/native-exec.ts +604 -0
  85. package/src/adapters/cursor/protobuf-events.ts +735 -0
  86. package/src/adapters/cursor/protobuf-request.ts +719 -0
  87. package/src/adapters/cursor/request-builder.ts +280 -0
  88. package/src/adapters/cursor/thread-continuity.ts +67 -0
  89. package/src/adapters/cursor/tool-definitions.ts +621 -0
  90. package/src/adapters/cursor/transport-retry.ts +132 -0
  91. package/src/adapters/cursor/transport.ts +57 -0
  92. package/src/adapters/cursor/types.ts +59 -0
  93. package/src/adapters/cursor.ts +196 -0
  94. package/src/adapters/google-antigravity-replay.ts +520 -0
  95. package/src/adapters/google-antigravity-wire.ts +140 -0
  96. package/src/adapters/google-errors.ts +85 -0
  97. package/src/adapters/google-http.ts +100 -0
  98. package/src/adapters/google-tool-schema.ts +173 -0
  99. package/src/adapters/google-truncation.ts +24 -0
  100. package/src/adapters/google-wire-compiler.ts +232 -0
  101. package/src/adapters/google.ts +859 -0
  102. package/src/adapters/identity.ts +77 -0
  103. package/src/adapters/image.ts +23 -0
  104. package/src/adapters/kiro-constants.ts +16 -0
  105. package/src/adapters/kiro-errors.ts +208 -0
  106. package/src/adapters/kiro-events.ts +197 -0
  107. package/src/adapters/kiro-images.ts +129 -0
  108. package/src/adapters/kiro-retry.ts +312 -0
  109. package/src/adapters/kiro-thinking.ts +104 -0
  110. package/src/adapters/kiro-tool-fallback.ts +36 -0
  111. package/src/adapters/kiro-tools.ts +224 -0
  112. package/src/adapters/kiro-truncation.ts +33 -0
  113. package/src/adapters/kiro-wire.ts +129 -0
  114. package/src/adapters/kiro.ts +1924 -0
  115. package/src/adapters/mimo-free.ts +263 -0
  116. package/src/adapters/openai-chat.ts +1265 -0
  117. package/src/adapters/openai-responses.ts +1309 -0
  118. package/src/adapters/run-turn-queue.ts +114 -0
  119. package/src/adapters/tool-catalog-nudge.ts +71 -0
  120. package/src/adapters/upstream-http-error.ts +48 -0
  121. package/src/android-remote/assets.ts +218 -0
  122. package/src/android-remote/attachments.ts +168 -0
  123. package/src/android-remote/auth.ts +237 -0
  124. package/src/android-remote/cloudflare-provisioning.ts +409 -0
  125. package/src/android-remote/cloudflare-secret.ts +106 -0
  126. package/src/android-remote/cloudflare-tunnel.ts +488 -0
  127. package/src/android-remote/cloudflared.ts +286 -0
  128. package/src/android-remote/codex-app-server.ts +565 -0
  129. package/src/android-remote/desktop-history-page.ts +936 -0
  130. package/src/android-remote/desktop-ipc.ts +3643 -0
  131. package/src/android-remote/desktop-ownership-store.ts +98 -0
  132. package/src/android-remote/desktop-project-registration.ts +129 -0
  133. package/src/android-remote/desktop-session-stream.ts +1110 -0
  134. package/src/android-remote/desktop-workspace-state.ts +443 -0
  135. package/src/android-remote/file-change-parser.ts +112 -0
  136. package/src/android-remote/gateway.ts +9108 -0
  137. package/src/android-remote/mutation-store.ts +299 -0
  138. package/src/android-remote/projection.ts +1780 -0
  139. package/src/android-remote/queued-turn-store.ts +248 -0
  140. package/src/android-remote/session-command-recovery.ts +1384 -0
  141. package/src/android-remote/store.ts +466 -0
  142. package/src/android-remote/thread-reconciliation.ts +133 -0
  143. package/src/android-remote/thread-source-paths.ts +307 -0
  144. package/src/android-remote/thread-stream.ts +546 -0
  145. package/src/android-remote/turn-activity.ts +235 -0
  146. package/src/android-remote/user-message-identity.ts +94 -0
  147. package/src/bridge.ts +1793 -0
  148. package/src/chat/inbound.ts +295 -0
  149. package/src/chat/outbound.ts +821 -0
  150. package/src/claude/agents-inject.ts +267 -0
  151. package/src/claude/alias.ts +149 -0
  152. package/src/claude/auth-detect.ts +229 -0
  153. package/src/claude/auth-mode-migration.ts +32 -0
  154. package/src/claude/auth-mode.ts +62 -0
  155. package/src/claude/context-windows.ts +189 -0
  156. package/src/claude/desktop-3p-guard.ts +35 -0
  157. package/src/claude/desktop-3p-paths.ts +84 -0
  158. package/src/claude/desktop-3p.ts +601 -0
  159. package/src/claude/desktop-health.ts +26 -0
  160. package/src/claude/desktop-profile.ts +263 -0
  161. package/src/claude/gateway-cache.ts +70 -0
  162. package/src/claude/inbound-debug.ts +163 -0
  163. package/src/claude/inbound.ts +519 -0
  164. package/src/claude/model-info.ts +154 -0
  165. package/src/claude/outbound.ts +898 -0
  166. package/src/cli/access.ts +108 -0
  167. package/src/cli/account-api.ts +296 -0
  168. package/src/cli/account-auth.ts +250 -0
  169. package/src/cli/account-catalog-refresh.ts +14 -0
  170. package/src/cli/account-extended.ts +476 -0
  171. package/src/cli/account-main.ts +317 -0
  172. package/src/cli/account.ts +297 -0
  173. package/src/cli/agent-driven.ts +70 -0
  174. package/src/cli/agent.ts +184 -0
  175. package/src/cli/catalog-prewarm.ts +27 -0
  176. package/src/cli/claude-desktop.ts +211 -0
  177. package/src/cli/claude.ts +302 -0
  178. package/src/cli/codex-shim-autorestore.ts +45 -0
  179. package/src/cli/codex-shim-readiness.ts +69 -0
  180. package/src/cli/combo.ts +124 -0
  181. package/src/cli/config-command.ts +183 -0
  182. package/src/cli/debug.ts +228 -0
  183. package/src/cli/desktop-first-run.ts +25 -0
  184. package/src/cli/doctor.ts +1022 -0
  185. package/src/cli/export-command.ts +201 -0
  186. package/src/cli/help.ts +370 -0
  187. package/src/cli/index.ts +1565 -0
  188. package/src/cli/init.ts +224 -0
  189. package/src/cli/integrations.ts +225 -0
  190. package/src/cli/interactive-confirm.ts +133 -0
  191. package/src/cli/internal-dispatch.ts +35 -0
  192. package/src/cli/launcher-context.ts +77 -0
  193. package/src/cli/models-runtime.ts +224 -0
  194. package/src/cli/models.ts +340 -0
  195. package/src/cli/observe.ts +170 -0
  196. package/src/cli/opencode.ts +587 -0
  197. package/src/cli/provider-runtime.ts +179 -0
  198. package/src/cli/provider.ts +476 -0
  199. package/src/cli/ready.ts +301 -0
  200. package/src/cli/route-policy.ts +92 -0
  201. package/src/cli/runtime-api.ts +328 -0
  202. package/src/cli/star-prompt.ts +211 -0
  203. package/src/cli/status-oauth.ts +78 -0
  204. package/src/cli/status.ts +321 -0
  205. package/src/cli/system-command.ts +196 -0
  206. package/src/cli/system-restart-client.ts +146 -0
  207. package/src/cli/tray-proxy.ts +205 -0
  208. package/src/cli/v2.ts +200 -0
  209. package/src/cli.ts +10 -0
  210. package/src/clients/config-export.ts +1109 -0
  211. package/src/codex/account-id.ts +34 -0
  212. package/src/codex/account-label.ts +34 -0
  213. package/src/codex/account-lifecycle.ts +172 -0
  214. package/src/codex/account-namespace-match.ts +63 -0
  215. package/src/codex/account-namespaces.ts +195 -0
  216. package/src/codex/account-pause.ts +20 -0
  217. package/src/codex/account-priority.ts +83 -0
  218. package/src/codex/account-runtime-state.ts +31 -0
  219. package/src/codex/account-store.ts +517 -0
  220. package/src/codex/account-usability.ts +40 -0
  221. package/src/codex/admission.ts +263 -0
  222. package/src/codex/app-server-processes.ts +799 -0
  223. package/src/codex/auth-api.ts +2098 -0
  224. package/src/codex/auth-collision.ts +107 -0
  225. package/src/codex/auth-context.ts +480 -0
  226. package/src/codex/autostart-health.ts +156 -0
  227. package/src/codex/catalog/account-models.ts +67 -0
  228. package/src/codex/catalog/aggregation.ts +471 -0
  229. package/src/codex/catalog/bundled.ts +533 -0
  230. package/src/codex/catalog/effort.ts +432 -0
  231. package/src/codex/catalog/filesystem-evidence.ts +302 -0
  232. package/src/codex/catalog/kinds.ts +2 -0
  233. package/src/codex/catalog/metadata.ts +287 -0
  234. package/src/codex/catalog/native-models.ts +7 -0
  235. package/src/codex/catalog/parsing.ts +503 -0
  236. package/src/codex/catalog/provider-fetch.ts +2267 -0
  237. package/src/codex/catalog/sync.ts +1606 -0
  238. package/src/codex/catalog-admission.ts +197 -0
  239. package/src/codex/catalog-refresh-status.ts +87 -0
  240. package/src/codex/catalog-write-serialization.ts +242 -0
  241. package/src/codex/catalog.ts +15 -0
  242. package/src/codex/codex-write-lock.ts +384 -0
  243. package/src/codex/convergence-types.ts +593 -0
  244. package/src/codex/convergence.ts +580 -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/desktop-client-processes.ts +521 -0
  249. package/src/codex/exec-invocation.ts +22 -0
  250. package/src/codex/features.ts +1091 -0
  251. package/src/codex/generation.ts +202 -0
  252. package/src/codex/history-job.ts +347 -0
  253. package/src/codex/history-lock.ts +242 -0
  254. package/src/codex/history-migration-guardian.ts +115 -0
  255. package/src/codex/history-provider.ts +1075 -0
  256. package/src/codex/history-transition.ts +105 -0
  257. package/src/codex/history-worker.ts +204 -0
  258. package/src/codex/home.ts +206 -0
  259. package/src/codex/inject-coordination.ts +257 -0
  260. package/src/codex/inject.ts +1857 -0
  261. package/src/codex/injected-marker.ts +79 -0
  262. package/src/codex/integration-record.ts +266 -0
  263. package/src/codex/internal/catalog-writer.ts +203 -0
  264. package/src/codex/internal/history-writer.ts +105 -0
  265. package/src/codex/journal.ts +172 -0
  266. package/src/codex/main-account-cache.ts +56 -0
  267. package/src/codex/main-account.ts +40 -0
  268. package/src/codex/management-convergence.ts +114 -0
  269. package/src/codex/model-cache.ts +267 -0
  270. package/src/codex/native-main-admission.ts +47 -0
  271. package/src/codex/native-main-auth-temp.ts +187 -0
  272. package/src/codex/native-main-claim.ts +167 -0
  273. package/src/codex/native-main-lock-file.ts +162 -0
  274. package/src/codex/native-main-owner.ts +329 -0
  275. package/src/codex/native-profile-api.ts +247 -0
  276. package/src/codex/native-profile-manager.ts +1531 -0
  277. package/src/codex/native-profile-processes.ts +121 -0
  278. package/src/codex/native-profile-recovery.ts +99 -0
  279. package/src/codex/native-profile-stage-store.ts +387 -0
  280. package/src/codex/native-profile-startup.ts +348 -0
  281. package/src/codex/native-profile-store.ts +855 -0
  282. package/src/codex/native-profile-types.ts +120 -0
  283. package/src/codex/native-residue.ts +691 -0
  284. package/src/codex/paths.ts +78 -0
  285. package/src/codex/plugins-doctor.ts +242 -0
  286. package/src/codex/pool-rotation.ts +295 -0
  287. package/src/codex/project-config-warnings.ts +426 -0
  288. package/src/codex/prompt-journal.ts +311 -0
  289. package/src/codex/prompt-layers.ts +967 -0
  290. package/src/codex/prompt-lock.ts +143 -0
  291. package/src/codex/provider-adoption.ts +242 -0
  292. package/src/codex/quota-rejection.ts +224 -0
  293. package/src/codex/quota.ts +494 -0
  294. package/src/codex/refresh.ts +60 -0
  295. package/src/codex/routing.ts +1855 -0
  296. package/src/codex/runtime.ts +659 -0
  297. package/src/codex/shim.ts +1215 -0
  298. package/src/codex/subagent-defaults.ts +557 -0
  299. package/src/codex/subagent-model-fallback.ts +560 -0
  300. package/src/codex/sync.ts +238 -0
  301. package/src/codex/transition-state.ts +612 -0
  302. package/src/codex/upstream-host-health.ts +368 -0
  303. package/src/codex/user-identity.ts +374 -0
  304. package/src/codex/warmup.ts +192 -0
  305. package/src/codex/websocket-registry.ts +100 -0
  306. package/src/codex/write-coordination.ts +114 -0
  307. package/src/combos/failover.ts +140 -0
  308. package/src/combos/index.ts +44 -0
  309. package/src/combos/request.ts +64 -0
  310. package/src/combos/resolve.ts +232 -0
  311. package/src/combos/types.ts +392 -0
  312. package/src/config.ts +3270 -0
  313. package/src/generated/model-metadata.ts +144 -0
  314. package/src/github/star-state.ts +203 -0
  315. package/src/grok/inject.ts +540 -0
  316. package/src/grok/inspect.ts +45 -0
  317. package/src/grok/status.ts +127 -0
  318. package/src/grok/sync.ts +66 -0
  319. package/src/images/artifacts.ts +516 -0
  320. package/src/images/fulfill-video.ts +163 -0
  321. package/src/images/fulfill.ts +149 -0
  322. package/src/images/index.ts +4 -0
  323. package/src/images/loop.ts +922 -0
  324. package/src/images/plan.ts +133 -0
  325. package/src/images/synthetic-tool.ts +133 -0
  326. package/src/images/types.ts +41 -0
  327. package/src/images/xai-client.ts +141 -0
  328. package/src/images/xai-video-client.ts +163 -0
  329. package/src/index.ts +22 -0
  330. package/src/integrations/config-io.ts +151 -0
  331. package/src/integrations/journal.ts +315 -0
  332. package/src/integrations/merge.ts +135 -0
  333. package/src/integrations/native/ownership-preflight.ts +202 -0
  334. package/src/integrations/ownership.ts +111 -0
  335. package/src/integrations/registry.ts +108 -0
  336. package/src/integrations/serialize.ts +235 -0
  337. package/src/integrations/state.ts +290 -0
  338. package/src/integrations/store.ts +103 -0
  339. package/src/integrations/writer.ts +492 -0
  340. package/src/lib/abort.ts +146 -0
  341. package/src/lib/admin-secrets.ts +25 -0
  342. package/src/lib/admission.ts +83 -0
  343. package/src/lib/app-owned-memory-stores.ts +173 -0
  344. package/src/lib/app-owned-memory.ts +265 -0
  345. package/src/lib/bounded-body.ts +242 -0
  346. package/src/lib/bun-binary-validator.d.mts +3 -0
  347. package/src/lib/bun-binary-validator.mjs +18 -0
  348. package/src/lib/bun-runtime.ts +184 -0
  349. package/src/lib/bun-stream-caps.ts +127 -0
  350. package/src/lib/config-ownership.ts +438 -0
  351. package/src/lib/crash-guard.ts +344 -0
  352. package/src/lib/debug-log-buffer.ts +83 -0
  353. package/src/lib/debug-settings.ts +108 -0
  354. package/src/lib/debug.ts +31 -0
  355. package/src/lib/destination-policy.ts +316 -0
  356. package/src/lib/errors.ts +364 -0
  357. package/src/lib/eventstream-decoder.ts +253 -0
  358. package/src/lib/gcp-adc.ts +341 -0
  359. package/src/lib/injection-debug-log.ts +58 -0
  360. package/src/lib/local-management-attestation.ts +51 -0
  361. package/src/lib/open-url.ts +25 -0
  362. package/src/lib/pinned-http.ts +182 -0
  363. package/src/lib/privacy.ts +20 -0
  364. package/src/lib/process-control.ts +168 -0
  365. package/src/lib/provider-environment.ts +470 -0
  366. package/src/lib/provider-outbound.ts +203 -0
  367. package/src/lib/provider-url.ts +14 -0
  368. package/src/lib/proxy-env.ts +18 -0
  369. package/src/lib/redact.ts +510 -0
  370. package/src/lib/remodex-home.ts +616 -0
  371. package/src/lib/retry-after.ts +55 -0
  372. package/src/lib/service-secrets.ts +178 -0
  373. package/src/lib/shadow-call.ts +54 -0
  374. package/src/lib/sidecar-tracker.ts +52 -0
  375. package/src/lib/sse-decoder.ts +364 -0
  376. package/src/lib/state-store-registrations.ts +109 -0
  377. package/src/lib/state-store-sweeper.ts +184 -0
  378. package/src/lib/system-restart-contract.ts +73 -0
  379. package/src/lib/test-home-guard.ts +98 -0
  380. package/src/lib/token-estimate.ts +69 -0
  381. package/src/lib/translator-budget.ts +366 -0
  382. package/src/lib/upstream-reachability.ts +91 -0
  383. package/src/lib/upstream-retry.ts +508 -0
  384. package/src/lib/win-exec.ts +115 -0
  385. package/src/lib/win-paths.ts +68 -0
  386. package/src/lib/windows-elevation.ts +705 -0
  387. package/src/lib/windows-secret-acl.ts +817 -0
  388. package/src/lib/windows-user-principal.ts +283 -0
  389. package/src/lib/winsw.ts +402 -0
  390. package/src/model-sources.ts +73 -0
  391. package/src/oauth/anthropic-routing.ts +594 -0
  392. package/src/oauth/anthropic.ts +177 -0
  393. package/src/oauth/callback-server.ts +294 -0
  394. package/src/oauth/chatgpt.ts +150 -0
  395. package/src/oauth/command-code.ts +239 -0
  396. package/src/oauth/cursor.ts +231 -0
  397. package/src/oauth/github-copilot.ts +428 -0
  398. package/src/oauth/google-antigravity.ts +230 -0
  399. package/src/oauth/health.ts +443 -0
  400. package/src/oauth/index.ts +1280 -0
  401. package/src/oauth/key-providers.ts +128 -0
  402. package/src/oauth/kimi.ts +213 -0
  403. package/src/oauth/kiro-credentials.ts +726 -0
  404. package/src/oauth/kiro.ts +621 -0
  405. package/src/oauth/local-token-detect.ts +121 -0
  406. package/src/oauth/log.ts +48 -0
  407. package/src/oauth/login-cli.ts +163 -0
  408. package/src/oauth/pkce.ts +15 -0
  409. package/src/oauth/store.ts +655 -0
  410. package/src/oauth/token-guardian.ts +309 -0
  411. package/src/oauth/types.ts +62 -0
  412. package/src/oauth/xai.ts +241 -0
  413. package/src/providers/alibaba-region-backup.ts +75 -0
  414. package/src/providers/alibaba-region-migration.ts +156 -0
  415. package/src/providers/alibaba-region-startup.ts +36 -0
  416. package/src/providers/antigravity-models.ts +317 -0
  417. package/src/providers/api-keys.ts +140 -0
  418. package/src/providers/base-url-choices.ts +64 -0
  419. package/src/providers/codex-capacity.ts +288 -0
  420. package/src/providers/command-code-efforts.ts +85 -0
  421. package/src/providers/context-cap.ts +73 -0
  422. package/src/providers/derive.ts +451 -0
  423. package/src/providers/free-directory.ts +187 -0
  424. package/src/providers/github-copilot-transport.ts +56 -0
  425. package/src/providers/google-vertex-location.ts +14 -0
  426. package/src/providers/key-failover.ts +271 -0
  427. package/src/providers/kiro-models.ts +67 -0
  428. package/src/providers/label.ts +19 -0
  429. package/src/providers/model-discovery-limits.ts +16 -0
  430. package/src/providers/model-discovery.ts +361 -0
  431. package/src/providers/openai-sidecar.ts +235 -0
  432. package/src/providers/openai-tier-startup.ts +27 -0
  433. package/src/providers/openai-tiers.ts +301 -0
  434. package/src/providers/openai-virtual-models.ts +83 -0
  435. package/src/providers/openrouter-routing.ts +102 -0
  436. package/src/providers/provider-id-rewrite.ts +179 -0
  437. package/src/providers/quota.ts +1942 -0
  438. package/src/providers/reasoning-capabilities.ts +336 -0
  439. package/src/providers/registry.ts +2375 -0
  440. package/src/providers/slug-codec.ts +74 -0
  441. package/src/providers/xai-transport.ts +149 -0
  442. package/src/reasoning-effort.ts +243 -0
  443. package/src/responses/compaction.ts +124 -0
  444. package/src/responses/hosted-tool-policy.ts +9 -0
  445. package/src/responses/parser.ts +714 -0
  446. package/src/responses/reasoning-envelope.ts +60 -0
  447. package/src/responses/reasoning-replay-cache.ts +106 -0
  448. package/src/responses/schema.ts +159 -0
  449. package/src/responses/spill-store.ts +431 -0
  450. package/src/responses/state.ts +1039 -0
  451. package/src/responses/tool-groups.ts +19 -0
  452. package/src/router.ts +802 -0
  453. package/src/routing/analytics.ts +377 -0
  454. package/src/routing/capability.ts +205 -0
  455. package/src/routing/cost.ts +77 -0
  456. package/src/routing/evaluator.ts +444 -0
  457. package/src/routing/health.ts +401 -0
  458. package/src/routing/history/cursor.ts +43 -0
  459. package/src/routing/history/indexer.ts +605 -0
  460. package/src/routing/history/schema.ts +72 -0
  461. package/src/routing/profile-namespace.ts +15 -0
  462. package/src/routing/profile.ts +424 -0
  463. package/src/routing/quota.ts +145 -0
  464. package/src/routing/request-evidence.ts +45 -0
  465. package/src/routing/trace.ts +686 -0
  466. package/src/server/adapter-resolve.ts +83 -0
  467. package/src/server/auth-cors.ts +606 -0
  468. package/src/server/chat-completions.ts +379 -0
  469. package/src/server/claude-messages.ts +980 -0
  470. package/src/server/effort-policy.ts +251 -0
  471. package/src/server/github-copilot-responses-repair.ts +338 -0
  472. package/src/server/gui-static.ts +152 -0
  473. package/src/server/image-retry.ts +42 -0
  474. package/src/server/images.ts +485 -0
  475. package/src/server/index.ts +1633 -0
  476. package/src/server/lifecycle.ts +482 -0
  477. package/src/server/live.ts +609 -0
  478. package/src/server/management/agent-settings-routes.ts +1180 -0
  479. package/src/server/management/android-remote-routes.ts +390 -0
  480. package/src/server/management/api-access.ts +141 -0
  481. package/src/server/management/api-key-usage.ts +167 -0
  482. package/src/server/management/body.ts +35 -0
  483. package/src/server/management/combo-routes.ts +244 -0
  484. package/src/server/management/config-routes.ts +602 -0
  485. package/src/server/management/context.ts +88 -0
  486. package/src/server/management/integration-routes.ts +538 -0
  487. package/src/server/management/logs-usage-routes.ts +516 -0
  488. package/src/server/management/model-routes.ts +519 -0
  489. package/src/server/management/model-rows.ts +143 -0
  490. package/src/server/management/native-integration-routes.ts +781 -0
  491. package/src/server/management/oauth-account-routes.ts +573 -0
  492. package/src/server/management/provider-routes.ts +781 -0
  493. package/src/server/management/request-history-routes.ts +191 -0
  494. package/src/server/management/routing-analytics-routes.ts +74 -0
  495. package/src/server/management/routing-profile-routes.ts +384 -0
  496. package/src/server/management/shared.ts +277 -0
  497. package/src/server/management/sidebar-routes.ts +106 -0
  498. package/src/server/management/sync-response.ts +69 -0
  499. package/src/server/management/system-restart.ts +433 -0
  500. package/src/server/management/system-routes.ts +141 -0
  501. package/src/server/management/usage-summary-cache.ts +86 -0
  502. package/src/server/management-api.ts +269 -0
  503. package/src/server/management-auth.ts +353 -0
  504. package/src/server/memory-watchdog.ts +156 -0
  505. package/src/server/port-reclaim.ts +307 -0
  506. package/src/server/ports.ts +156 -0
  507. package/src/server/proxy-liveness.ts +326 -0
  508. package/src/server/proxy-stop.ts +92 -0
  509. package/src/server/readiness.ts +99 -0
  510. package/src/server/relay-eager.ts +353 -0
  511. package/src/server/relay.ts +1179 -0
  512. package/src/server/request-decompress.ts +132 -0
  513. package/src/server/request-log-conversation.ts +168 -0
  514. package/src/server/request-log.ts +1072 -0
  515. package/src/server/responses/collaboration.ts +409 -0
  516. package/src/server/responses/compact.ts +710 -0
  517. package/src/server/responses/core.ts +3561 -0
  518. package/src/server/responses/encrypted-payload.ts +308 -0
  519. package/src/server/responses/fetch-helpers.ts +171 -0
  520. package/src/server/responses/passthrough-error.ts +78 -0
  521. package/src/server/responses/policy-fallback.ts +152 -0
  522. package/src/server/responses/terminal-guard.ts +230 -0
  523. package/src/server/responses/upstream-error.ts +48 -0
  524. package/src/server/responses-image-gen-repair.ts +132 -0
  525. package/src/server/responses-item-id-repair.ts +272 -0
  526. package/src/server/responses-json-events.ts +52 -0
  527. package/src/server/responses-model-rewrite.ts +29 -0
  528. package/src/server/responses-snapshot-repair.ts +621 -0
  529. package/src/server/responses.ts +10 -0
  530. package/src/server/search.ts +181 -0
  531. package/src/server/sse-frame-buffer.ts +292 -0
  532. package/src/server/sse-payload-rewrite.ts +263 -0
  533. package/src/server/startup-action-control.ts +308 -0
  534. package/src/server/startup-health-cache.ts +119 -0
  535. package/src/server/system-env.ts +418 -0
  536. package/src/server/windows-tcp-drop.ts +184 -0
  537. package/src/server/windows-tray-control.ts +41 -0
  538. package/src/server/ws-bridge.ts +470 -0
  539. package/src/service-manager-probe.ts +824 -0
  540. package/src/service.ts +3011 -0
  541. package/src/stall-timeout.ts +20 -0
  542. package/src/storage/cleanup-job.ts +57 -0
  543. package/src/storage/cleanup.ts +3085 -0
  544. package/src/storage/policy-job.ts +457 -0
  545. package/src/storage/policy-scheduler.ts +40 -0
  546. package/src/storage/policy-worker.ts +59 -0
  547. package/src/storage/policy.ts +527 -0
  548. package/src/storage/restore-job.ts +299 -0
  549. package/src/storage/restore-worker.ts +58 -0
  550. package/src/storage/scanner.ts +238 -0
  551. package/src/storage/storage-mutation-coordinator.ts +139 -0
  552. package/src/storage/worker-lifecycle.ts +215 -0
  553. package/src/tray/assets/opencodex-tray-offline.ico +0 -0
  554. package/src/tray/assets/opencodex-tray-online.ico +0 -0
  555. package/src/tray/assets/opencodex-tray-warning.ico +0 -0
  556. package/src/tray/assets/opencodex-tray.png +0 -0
  557. package/src/tray/windows-tray.ps1 +364 -0
  558. package/src/tray/windows.ts +738 -0
  559. package/src/types.ts +1531 -0
  560. package/src/update/badge.ts +72 -0
  561. package/src/update/desktop-release.ts +1620 -0
  562. package/src/update/index.ts +402 -0
  563. package/src/update/job.ts +1906 -0
  564. package/src/update/notify.ts +261 -0
  565. package/src/update/npm-cache-preflight.d.mts +47 -0
  566. package/src/update/npm-cache-preflight.mjs +201 -0
  567. package/src/update/npm-invocation.d.mts +23 -0
  568. package/src/update/npm-invocation.mjs +94 -0
  569. package/src/update/tray-update-plan.d.mts +18 -0
  570. package/src/update/tray-update-plan.mjs +38 -0
  571. package/src/usage/cost.ts +0 -0
  572. package/src/usage/debug.ts +97 -0
  573. package/src/usage/expected-prices.ts +283 -0
  574. package/src/usage/log.ts +695 -0
  575. package/src/usage/summary.ts +585 -0
  576. package/src/usage/totals.ts +14 -0
  577. package/src/vision/anthropic-describe.ts +185 -0
  578. package/src/vision/describe.ts +127 -0
  579. package/src/vision/index.ts +558 -0
  580. package/src/vision/reasoning.ts +55 -0
  581. package/src/web-search/anthropic-executor.ts +189 -0
  582. package/src/web-search/executor.ts +105 -0
  583. package/src/web-search/format-result.ts +89 -0
  584. package/src/web-search/index.ts +196 -0
  585. package/src/web-search/loop.ts +791 -0
  586. package/src/web-search/parse.ts +235 -0
  587. package/src/web-search/progress-stream.ts +342 -0
  588. package/src/web-search/synthetic-tool.ts +47 -0
@@ -0,0 +1,344 @@
1
+ import { appendFileSync, mkdirSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { getConfigDir } from "../config";
4
+ import { recordOwnedConfigPath } from "./config-ownership";
5
+ import { redactSecretString, redactUrlForLog } from "./redact";
6
+ import { sidecarBreadcrumb, activityBreadcrumb } from "./sidecar-tracker";
7
+ import { retainedUtf8Bytes, truncateRetainedUtf8 } from "./admission";
8
+ import { enforceAppOwnedMemoryBudget } from "./app-owned-memory";
9
+
10
+ /**
11
+ * Process-level safety net for the long-running proxy daemon.
12
+ *
13
+ * A single request can trigger an async error inside a Bun.serve streaming
14
+ * handler (e.g. a ReadableStream `start(controller)` callback hitting an
15
+ * unexpected upstream response shape). Without a handler, Bun's default
16
+ * behaviour prints the raw error — shown as `(function (controller, error)
17
+ * {"use strict"; ... TypeError: null is not an object` — and can tear down
18
+ * the whole proxy, killing every other in-flight Codex session.
19
+ *
20
+ * We must NOT let one bad stream crash the daemon. These handlers:
21
+ * 1. Append the full error + stack to `<configDir>/crash.log` so the exact
22
+ * fault (with the JSC `(evaluating 'x.y')` clause and file:line) is
23
+ * captured for a precise root-cause fix.
24
+ * 2. Keep the process alive — the failed request is already isolated by
25
+ * Bun.serve; surviving is strictly better than terminating.
26
+ */
27
+
28
+ let installed = false;
29
+
30
+ function crashLogPath(): string {
31
+ const dir = getConfigDir();
32
+ try {
33
+ recordOwnedConfigPath(dir, join(dir, "crash.log"));
34
+ mkdirSync(dir, { recursive: true });
35
+ } catch {
36
+ /* best-effort: directory usually already exists */
37
+ }
38
+ return join(dir, "crash.log");
39
+ }
40
+
41
+ export function formatCrashEntry(kind: string, err: unknown, promise?: unknown): string {
42
+ const ts = new Date().toISOString();
43
+ const detail =
44
+ err instanceof Error
45
+ ? `${err.name}: ${redactDiagnosticText(err.message)}\n${redactDiagnosticText(err.stack ?? "(no stack)")}`
46
+ : typeof err === "object"
47
+ ? redactDiagnosticText(safeStringify(err))
48
+ : redactDiagnosticText(String(err));
49
+ return `\n[${ts}] ${kind}\n${detail}${diagnose(err)}${diagnosePromise(promise)}${breadcrumb()}\n`;
50
+ }
51
+
52
+ /**
53
+ * Bun surfaces some request-time stream/abort errors with only native frames
54
+ * (`at <anonymous> (native:1:11)`), so `err.stack` alone cannot locate the
55
+ * fault. JSC still records the true throw site on hidden own properties
56
+ * (`sourceURL` / `originalLine` / `originalColumn`) and `Bun.inspect` renders a
57
+ * code snippet from them — capture both so the next occurrence is pinpointable.
58
+ */
59
+ function diagnose(err: unknown): string {
60
+ const lines: string[] = [];
61
+ try {
62
+ const ctor = (err as { constructor?: { name?: string } } | null)?.constructor?.name;
63
+ if (ctor && ctor !== "Error" && ctor !== "Object") lines.push(` ctor: ${ctor}`);
64
+ if (err && typeof err === "object") {
65
+ const e = err as Record<string, unknown>;
66
+ const cause = e.cause;
67
+ if (cause !== undefined) {
68
+ lines.push(` cause: ${redactDiagnosticText(cause instanceof Error ? `${cause.name}: ${cause.message}` : String(cause))}`);
69
+ }
70
+ if (e.code !== undefined) lines.push(` code: ${redactDiagnosticText(String(e.code))}`);
71
+ // JSC hidden throw-site fields survive even when the stack is native-only.
72
+ const sourceURL = e.sourceURL;
73
+ const line = e.line ?? e.originalLine;
74
+ const column = e.column ?? e.originalColumn;
75
+ if (typeof sourceURL === "string" && sourceURL) {
76
+ lines.push(` origin: ${redactUrlForLog(sourceURL)}${line !== undefined ? `:${String(line)}` : ""}${column !== undefined ? `:${String(column)}` : ""}`);
77
+ }
78
+ }
79
+ const stack = err instanceof Error ? err.stack ?? "" : "";
80
+ const hasUsableStack = /\((?!native:)[^)]*:\d+:\d+\)/.test(stack);
81
+ if (!hasUsableStack) {
82
+ const snippet = inspectErr(err);
83
+ if (snippet) lines.push(` inspect:\n${snippet.split("\n").map(l => ` ${l}`).join("\n")}`);
84
+ }
85
+ } catch {
86
+ /* diagnosis must never throw */
87
+ }
88
+ return lines.length ? `\n${lines.join("\n")}` : "";
89
+ }
90
+
91
+ /**
92
+ * Bun.inspect renders the JSC source snippet (with the offending line + caret)
93
+ * for errors whose throw site is otherwise lost to native frames.
94
+ */
95
+ function inspectErr(err: unknown): string {
96
+ try {
97
+ const bun = (globalThis as { Bun?: { inspect?: (v: unknown, o?: unknown) => string } }).Bun;
98
+ if (!bun?.inspect) return "";
99
+ return redactDiagnosticText(bun.inspect(err, { depth: 2 }).trim());
100
+ } catch {
101
+ return "";
102
+ }
103
+ }
104
+
105
+ /**
106
+ * Inspect the rejected promise itself. Bun sometimes attaches richer context to the promise object
107
+ * than to the reason, and the rendered form helps distinguish a fetch/stream teardown from app code.
108
+ */
109
+ function diagnosePromise(promise: unknown): string {
110
+ if (promise === undefined) return "";
111
+ try {
112
+ const bun = (globalThis as { Bun?: { inspect?: (v: unknown, o?: unknown) => string } }).Bun;
113
+ const rendered = bun?.inspect ? bun.inspect(promise, { depth: 1 }).trim() : String(promise);
114
+ if (!rendered || rendered === "Promise { <rejected> }") return "";
115
+ return `\n promise: ${redactDiagnosticText(rendered.split("\n").join(" "))}`;
116
+ } catch {
117
+ return "";
118
+ }
119
+ }
120
+
121
+ /**
122
+ * Record whether a sidecar (web-search / vision) was in flight when the fault fired. A native-only
123
+ * rejection coinciding with sidecar work is the prime suspect; this turns the correlation into a
124
+ * logged fact instead of an inference.
125
+ */
126
+ function breadcrumb(): string {
127
+ try {
128
+ const lines: string[] = [];
129
+ const b = sidecarBreadcrumb();
130
+ if (b.inFlight > 0 || b.lastLabel) {
131
+ lines.push(` sidecar: inFlight=${b.inFlight} last=${b.lastLabel || "-"} sinceMs=${b.sinceMs}`);
132
+ }
133
+ const a = activityBreadcrumb();
134
+ if (a.note) lines.push(` activity: ${a.note} sinceMs=${a.sinceMs}`);
135
+ const fetches = recentFetches();
136
+ if (fetches) lines.push(fetches);
137
+ return lines.length ? `\n${lines.join("\n")}` : "";
138
+ } catch {
139
+ return "";
140
+ }
141
+ }
142
+
143
+ function safeStringify(value: unknown): string {
144
+ try {
145
+ return JSON.stringify(value, null, 2) ?? String(value);
146
+ } catch {
147
+ return String(value);
148
+ }
149
+ }
150
+
151
+ let benignSuppressed = 0;
152
+ let benignLastLoggedAt = 0;
153
+ const BENIGN_LOG_INTERVAL_MS = 5 * 60_000;
154
+
155
+ /**
156
+ * Bun raises an off-path `unhandledRejection: TypeError: null is not an object` (native-only stack)
157
+ * whenever a streaming `fetch(..., { signal })` response body is torn down by an abort before/while
158
+ * we read it — turn supersede, client disconnect, upstream RST. The daemon is never at risk (the
159
+ * failed request is already isolated), the throw has no JS source location, and call-site body
160
+ * cancellation cannot fully close the runtime-internal window. Treat this exact shape as benign:
161
+ * keep the process alive, drop the alarmist banner, and fold repeats into a rate-limited summary so
162
+ * crash.log stays readable for genuinely novel faults.
163
+ *
164
+ * Second known shape (260712): `TypeError: Invalid state: ReadableStream is locked`
165
+ * (code ERR_INVALID_STATE, native-only stack ending in onSinkClose*). When a client
166
+ * disconnects mid-SSE on the tee()'d passthrough path (responses.ts Bun#32111
167
+ * workaround), Bun's sink-close teardown tries to cancel the tee-locked source body
168
+ * and rejects off-path. Request lifecycle is already settled at that point; same
169
+ * benign handling applies. The tee path remains the DEFAULT passthrough shape;
170
+ * the gated eager relay (relay-eager.ts, #314) does not tee and may not produce
171
+ * this shape — detection stays unchanged either way.
172
+ */
173
+ export function isBenignAbortTeardown(err: unknown): boolean {
174
+ if (!(err instanceof TypeError)) return false;
175
+ const bareNullTeardown = err.message === "null is not an object"; // bare form only (no `(evaluating …)`)
176
+ const lockedStreamTeardown = err.message === "Invalid state: ReadableStream is locked"
177
+ && (err as { code?: unknown }).code === "ERR_INVALID_STATE";
178
+ if (!bareNullTeardown && !lockedStreamTeardown) return false;
179
+ const stack = err.stack ?? "";
180
+ // Native-only: no JS source frame. A real app TypeError would carry a `(file:line:col)` frame.
181
+ return !/\((?!native:)[^)]*:\d+:\d+\)/.test(stack);
182
+ }
183
+
184
+ function record(kind: string, err: unknown, promise?: unknown): void {
185
+ if (kind === "unhandledRejection" && isBenignAbortTeardown(err)) {
186
+ benignSuppressed++;
187
+ const now = Date.now();
188
+ if (now - benignLastLoggedAt < BENIGN_LOG_INTERVAL_MS) return; // fold repeats silently
189
+ benignLastLoggedAt = now;
190
+ const summary = `\n[${new Date(now).toISOString()}] benign-abort-teardown x${benignSuppressed}`
191
+ + ` (Bun fetch-body abort; proxy unaffected)${diagnose(err)}${diagnosePromise(promise)}${breadcrumb()}\n`;
192
+ benignSuppressed = 0;
193
+ try { appendFileSync(crashLogPath(), summary); } catch { /* logging must never throw */ }
194
+ return; // no stderr banner — this is expected noise, not a crash
195
+ }
196
+ const line = formatCrashEntry(kind, err, promise);
197
+ // Always surface to stderr so foreground `rmx start` users still see it,
198
+ // then persist for later diagnosis.
199
+ console.error(`⚠️ ${kind} (proxy stayed up; logged to crash.log)`);
200
+ console.error(line.trimStart());
201
+ try {
202
+ appendFileSync(crashLogPath(), line);
203
+ } catch {
204
+ /* logging must never throw */
205
+ }
206
+ }
207
+
208
+ interface FetchTrace { url: string; at: number; origin: string; settled: boolean; rejected?: string }
209
+ const FETCH_RING_MAX = 12;
210
+ const MAX_DIAGNOSTIC_VALUE_BYTES = 8 * 1024;
211
+ const fetchRing: FetchTrace[] = [];
212
+ let fetchInstrumented = false;
213
+ let fetchRingBytes = 0;
214
+
215
+ function fetchTraceBytes(trace: FetchTrace): number {
216
+ return retainedUtf8Bytes(trace.url) + retainedUtf8Bytes(trace.origin) + retainedUtf8Bytes(trace.rejected ?? "");
217
+ }
218
+
219
+ function removeOldestFetchTrace(): number {
220
+ const trace = fetchRing.shift();
221
+ if (!trace) return 0;
222
+ const bytes = fetchTraceBytes(trace);
223
+ fetchRingBytes -= bytes;
224
+ return bytes;
225
+ }
226
+
227
+ function setFetchTraceRejected(trace: FetchTrace, value: string): void {
228
+ const retained = fetchRing.includes(trace);
229
+ if (retained) fetchRingBytes -= retainedUtf8Bytes(trace.rejected ?? "");
230
+ trace.rejected = truncateRetainedUtf8(value, MAX_DIAGNOSTIC_VALUE_BYTES);
231
+ if (retained) fetchRingBytes += retainedUtf8Bytes(trace.rejected);
232
+ }
233
+
234
+ function appendFetchTrace(url: string, origin: string): FetchTrace {
235
+ const trace: FetchTrace = {
236
+ url: truncateRetainedUtf8(redactUrlForLog(url), MAX_DIAGNOSTIC_VALUE_BYTES),
237
+ at: Date.now(),
238
+ origin: truncateRetainedUtf8(origin, MAX_DIAGNOSTIC_VALUE_BYTES),
239
+ settled: false,
240
+ };
241
+ fetchRing.push(trace);
242
+ fetchRingBytes += fetchTraceBytes(trace);
243
+ while (fetchRing.length > FETCH_RING_MAX) removeOldestFetchTrace();
244
+ return trace;
245
+ }
246
+
247
+ /**
248
+ * The recurring native-only rejection carries no source location, and every JS `await fetch(...)`
249
+ * is already try/caught — so the offending promise is created INSIDE Bun's fetch and rejects off the
250
+ * awaited path. Wrap global fetch to record each call's origin (a JS stack captured at call time) and
251
+ * whether it later rejected. crash-guard then dumps the still-pending / recently-rejected fetches so
252
+ * the next fault names the exact call site Bun lost.
253
+ */
254
+ function instrumentFetch(): void {
255
+ if (fetchInstrumented) return;
256
+ const g = globalThis as { fetch?: typeof fetch };
257
+ const original = g.fetch;
258
+ if (typeof original !== "function") return;
259
+ fetchInstrumented = true;
260
+ g.fetch = function instrumentedFetch(this: unknown, ...args: Parameters<typeof fetch>): ReturnType<typeof fetch> {
261
+ let url = "";
262
+ try {
263
+ const input = args[0];
264
+ url = typeof input === "string" ? input : input instanceof URL ? input.href : (input as Request)?.url ?? "";
265
+ } catch { /* best-effort */ }
266
+ const origin = (new Error().stack ?? "").split("\n").slice(2, 5).map(l => l.trim()).join(" <- ");
267
+ const trace = appendFetchTrace(url, origin);
268
+ enforceAppOwnedMemoryBudget();
269
+ let p: ReturnType<typeof fetch>;
270
+ try {
271
+ p = original.apply(this, args);
272
+ } catch (e) {
273
+ trace.settled = true;
274
+ setFetchTraceRejected(trace, redactDiagnosticText(e instanceof Error ? `${e.name}: ${e.message}` : String(e)));
275
+ throw e;
276
+ }
277
+ return p.then(
278
+ r => { trace.settled = true; return r; },
279
+ e => { trace.settled = true; setFetchTraceRejected(trace, redactDiagnosticText(e instanceof Error ? `${e.name}: ${e.message}` : String(e))); throw e; },
280
+ );
281
+ } as typeof fetch;
282
+ }
283
+
284
+ export function crashRingMetrics(): { entries: number; bytes: number; oldestAt: number | null } {
285
+ return { entries: fetchRing.length, bytes: fetchRingBytes, oldestAt: fetchRing[0]?.at ?? null };
286
+ }
287
+
288
+ export function evictOldestCrashTraceForBudget(): number {
289
+ return removeOldestFetchTrace();
290
+ }
291
+
292
+ export function appendCrashTraceForTests(url: string, origin: string, rejected?: string): void {
293
+ const trace = appendFetchTrace(url, origin);
294
+ if (rejected !== undefined) {
295
+ trace.settled = true;
296
+ setFetchTraceRejected(trace, rejected);
297
+ }
298
+ }
299
+
300
+ export function crashRingEntriesForTests(): readonly Readonly<FetchTrace>[] {
301
+ return fetchRing.map(trace => ({ ...trace }));
302
+ }
303
+
304
+ export function resetCrashRingForTests(): void {
305
+ fetchRing.length = 0;
306
+ fetchRingBytes = 0;
307
+ }
308
+
309
+ /** Render the recent fetch ring (pending first) for the crash breadcrumb. */
310
+ function recentFetches(): string {
311
+ try {
312
+ if (fetchRing.length === 0) return "";
313
+ const now = Date.now();
314
+ const rows = fetchRing.slice(-6).map(f => {
315
+ const state = !f.settled ? "PENDING" : f.rejected ? `REJECTED(${f.rejected})` : "ok";
316
+ return ` [${state}] ${f.url} ageMs=${now - f.at}${!f.settled ? ` origin=${f.origin}` : ""}`;
317
+ });
318
+ return ` fetches:\n${rows.join("\n")}`;
319
+ } catch {
320
+ return "";
321
+ }
322
+ }
323
+
324
+ function redactDiagnosticText(value: string): string {
325
+ return redactSecretString(value);
326
+ }
327
+
328
+ /**
329
+ * Register global handlers that keep the proxy alive and capture full stacks.
330
+ * Idempotent: safe to call more than once.
331
+ */
332
+ export function installCrashGuards(): void {
333
+ if (installed) return;
334
+ installed = true;
335
+ instrumentFetch();
336
+
337
+ process.on("unhandledRejection", (reason, promise) => {
338
+ record("unhandledRejection", reason, promise);
339
+ });
340
+
341
+ process.on("uncaughtException", err => {
342
+ record("uncaughtException", err);
343
+ });
344
+ }
@@ -0,0 +1,83 @@
1
+ /** In-memory ring buffer of debug log lines for `rmx debug logs` / GUI tailing. */
2
+
3
+ export interface DebugLogEntry {
4
+ /** Monotonic cursor for pagination; survives same-millisecond bursts. */
5
+ seq: number;
6
+ at: number;
7
+ line: string;
8
+ }
9
+
10
+ const MAX_LINES = 2_000;
11
+ const MAX_DEBUG_SUBSCRIBERS = 64;
12
+ const MAX_DEBUG_LINE_BYTES = 16 * 1024;
13
+ const buffer: DebugLogEntry[] = [];
14
+ interface DebugSubscriberRegistration { lease: AdmissionLease }
15
+ const listeners = new Map<(entry: DebugLogEntry) => void, DebugSubscriberRegistration>();
16
+ const subscriberGate = createAdmissionGate("debug_subscribers", MAX_DEBUG_SUBSCRIBERS);
17
+ let nextSeq = 1;
18
+ let bufferBytes = 0;
19
+
20
+ function removeOldestEntry(): number {
21
+ const entry = buffer.shift();
22
+ if (!entry) return 0;
23
+ const bytes = retainedUtf8Bytes(entry.line);
24
+ bufferBytes -= bytes;
25
+ return bytes;
26
+ }
27
+
28
+ export function appendDebugLogLine(line: string): void {
29
+ const retainedLine = truncateRetainedUtf8(line, MAX_DEBUG_LINE_BYTES);
30
+ const entry: DebugLogEntry = { seq: nextSeq++, at: Date.now(), line: retainedLine };
31
+ buffer.push(entry);
32
+ bufferBytes += retainedUtf8Bytes(retainedLine);
33
+ while (buffer.length > MAX_LINES) removeOldestEntry();
34
+ enforceAppOwnedMemoryBudget();
35
+ for (const listener of listeners.keys()) {
36
+ try { listener(entry); } catch { /* listeners must not break logging */ }
37
+ }
38
+ }
39
+
40
+ export function getDebugLogEntries(options?: { after?: number; limit?: number }): DebugLogEntry[] {
41
+ const after = options?.after ?? 0;
42
+ const limit = options?.limit ?? 500;
43
+ const filtered = after > 0 ? buffer.filter(entry => entry.seq > after) : buffer;
44
+ if (filtered.length <= limit) return filtered;
45
+ return filtered.slice(-limit);
46
+ }
47
+
48
+ export function subscribeDebugLogEntries(listener: (entry: DebugLogEntry) => void): () => void {
49
+ let registration = listeners.get(listener);
50
+ if (!registration) {
51
+ const lease = subscriberGate.tryAcquire();
52
+ if (!lease) throw new ResourceAdmissionError("debug_subscribers", MAX_DEBUG_SUBSCRIBERS);
53
+ registration = { lease };
54
+ listeners.set(listener, registration);
55
+ }
56
+ let disposed = false;
57
+ return () => {
58
+ if (disposed) return;
59
+ disposed = true;
60
+ if (listeners.get(listener) !== registration) return;
61
+ listeners.delete(listener);
62
+ registration.lease.release();
63
+ };
64
+ }
65
+
66
+ export function debugBufferMetrics(): { entries: number; bytes: number; subscribers: AdmissionMetrics; oldestAt: number | null } {
67
+ return { entries: buffer.length, bytes: bufferBytes, subscribers: subscriberGate.metrics(), oldestAt: buffer[0]?.at ?? null };
68
+ }
69
+
70
+ export function evictOldestDebugEntryForBudget(): number {
71
+ return removeOldestEntry();
72
+ }
73
+
74
+ /** Test isolation. */
75
+ export function resetDebugLogBufferForTests(): void {
76
+ buffer.length = 0;
77
+ bufferBytes = 0;
78
+ for (const registration of listeners.values()) registration.lease.release();
79
+ listeners.clear();
80
+ nextSeq = 1;
81
+ }
82
+ import { createAdmissionGate, ResourceAdmissionError, retainedUtf8Bytes, truncateRetainedUtf8, type AdmissionLease, type AdmissionMetrics } from "./admission";
83
+ import { enforceAppOwnedMemoryBudget } from "./app-owned-memory";
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Runtime-controllable debug flags.
3
+ * Provider debug: `rmx debug provider on|off|status|reset|logs [-f]` (or OCX_DEBUG=1 on start).
4
+ * Usage capture: `rmx debug usage on|off|status|reset|logs [-f]` (or OPENCODEX_USAGE_DEBUG=1).
5
+ * Injection log: `rmx debug injection on|off|status|reset` (or OCX_INJECTION_DEBUG=1) —
6
+ * multi-agent guidance-injection console lines, default OFF.
7
+ * Claude inbound capture: `rmx debug claude on|off|status|reset` (or OCX_CLAUDE_DEBUG=1) —
8
+ * allowlist-scalar ring of inbound Anthropic request metadata, default OFF.
9
+ * `/api/debug` and `rmx debug` override env defaults without restart.
10
+ */
11
+
12
+ export const DEBUG_ENV = {
13
+ debug: "OCX_DEBUG",
14
+ usage: "OPENCODEX_USAGE_DEBUG",
15
+ injection: "OCX_INJECTION_DEBUG",
16
+ claude: "OCX_CLAUDE_DEBUG",
17
+ } as const;
18
+
19
+ /** Legacy env var that still enables provider debug logging. */
20
+ const LEGACY_DEBUG_ENV = ["OCX_DEBUG_FRAMES"] as const;
21
+
22
+ export type DebugFlag = keyof typeof DEBUG_ENV;
23
+
24
+ export interface DebugSettingsView {
25
+ enabled: boolean;
26
+ usage: boolean;
27
+ injection: boolean;
28
+ claude: boolean;
29
+ runtimeOverride: Partial<Record<DebugFlag, boolean>>;
30
+ env: Record<DebugFlag, boolean>;
31
+ }
32
+
33
+ const runtimeOverride: Partial<Record<DebugFlag, boolean>> = {};
34
+
35
+ function envFlag(name: string): boolean {
36
+ return process.env[name] === "1";
37
+ }
38
+
39
+ function legacyDebugEnvEnabled(): boolean {
40
+ return LEGACY_DEBUG_ENV.some(name => envFlag(name));
41
+ }
42
+
43
+ export function isDebugEnabled(): boolean {
44
+ if (runtimeOverride.debug !== undefined) return runtimeOverride.debug;
45
+ return envFlag(DEBUG_ENV.debug) || legacyDebugEnvEnabled();
46
+ }
47
+
48
+ /** @deprecated Use isDebugEnabled(). */
49
+ export function isFramesDebugEnabled(): boolean {
50
+ return isDebugEnabled();
51
+ }
52
+
53
+ export function isUsageDebugEnabled(): boolean {
54
+ if (runtimeOverride.usage !== undefined) return runtimeOverride.usage;
55
+ return envFlag(DEBUG_ENV.usage);
56
+ }
57
+
58
+ /** Multi-agent guidance-injection log lines (default OFF; GUI checkbox / API / CLI). */
59
+ export function isInjectionDebugEnabled(): boolean {
60
+ if (runtimeOverride.injection !== undefined) return runtimeOverride.injection;
61
+ return envFlag(DEBUG_ENV.injection);
62
+ }
63
+
64
+ /** Claude inbound request capture (default OFF; GUI toggle / API / CLI). */
65
+ export function isClaudeDebugEnabled(): boolean {
66
+ if (runtimeOverride.claude !== undefined) return runtimeOverride.claude;
67
+ return envFlag(DEBUG_ENV.claude);
68
+ }
69
+
70
+ export function getDebugSettings(): DebugSettingsView {
71
+ return {
72
+ enabled: isDebugEnabled(),
73
+ usage: isUsageDebugEnabled(),
74
+ injection: isInjectionDebugEnabled(),
75
+ claude: isClaudeDebugEnabled(),
76
+ runtimeOverride: { ...runtimeOverride },
77
+ env: {
78
+ debug: envFlag(DEBUG_ENV.debug) || legacyDebugEnvEnabled(),
79
+ usage: envFlag(DEBUG_ENV.usage),
80
+ injection: envFlag(DEBUG_ENV.injection),
81
+ claude: envFlag(DEBUG_ENV.claude),
82
+ },
83
+ };
84
+ }
85
+
86
+ export function setDebugSettings(partial: Partial<Record<DebugFlag, boolean>>): DebugSettingsView {
87
+ for (const key of ["debug", "usage", "injection", "claude"] as const) {
88
+ if (partial[key] !== undefined) runtimeOverride[key] = partial[key];
89
+ }
90
+ return getDebugSettings();
91
+ }
92
+
93
+ export function clearDebugSetting(flag: DebugFlag): DebugSettingsView {
94
+ delete runtimeOverride[flag];
95
+ return getDebugSettings();
96
+ }
97
+
98
+ export function clearDebugSettings(): DebugSettingsView {
99
+ for (const key of ["debug", "usage", "injection", "claude"] as const) {
100
+ delete runtimeOverride[key];
101
+ }
102
+ return getDebugSettings();
103
+ }
104
+
105
+ /** Test isolation: drop runtime overrides only (env vars untouched). */
106
+ export function resetDebugSettingsForTests(): void {
107
+ clearDebugSettings();
108
+ }
@@ -0,0 +1,31 @@
1
+ import { appendDebugLogLine } from "./debug-log-buffer";
2
+ import { isDebugEnabled } from "./debug-settings";
3
+ import { redactSecrets } from "./redact";
4
+
5
+ function emitDebugLine(line: string): void {
6
+ if (!isDebugEnabled()) return;
7
+ try {
8
+ appendDebugLogLine(line);
9
+ console.error(line);
10
+ } catch {
11
+ /* diagnostics must never affect request handling */
12
+ }
13
+ }
14
+
15
+ // Opt-in provider diagnostics. Streaming adapters stay quiet unless provider debug is on
16
+ // (`rmx debug provider on`, GUI Logs toggle, or OCX_DEBUG=1). Tail with `rmx debug provider logs -f`.
17
+
18
+ export function debugDroppedFrame(adapter: string, payload: string): void {
19
+ if (!isDebugEnabled()) return;
20
+ emitDebugLine(`[ocx:frame-drop] ${adapter}: dropped malformed upstream frame (payload redacted, bytes=${payload.length})`);
21
+ }
22
+
23
+ /** Provider-agnostic diagnostic logging: `[ocx:<adapter>:<event>] {...}`. */
24
+ export function debugProviderDiagnostic(adapter: string, event: string, details: Record<string, unknown>): void {
25
+ if (!isDebugEnabled()) return;
26
+ try {
27
+ emitDebugLine(`[ocx:${adapter}:${event}] ${JSON.stringify(redactSecrets(details))}`);
28
+ } catch {
29
+ /* diagnostics must never affect request handling */
30
+ }
31
+ }