mixdog 0.7.18 → 0.8.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 (844) hide show
  1. package/README.md +37 -331
  2. package/package.json +67 -99
  3. package/scripts/boot-smoke.mjs +94 -0
  4. package/scripts/build-tui.mjs +52 -0
  5. package/scripts/compact-smoke.mjs +199 -0
  6. package/scripts/lead-workflow-smoke.mjs +598 -0
  7. package/scripts/live-worker-smoke.mjs +239 -0
  8. package/scripts/output-style-smoke.mjs +101 -0
  9. package/scripts/smoke-loop-report.mjs +221 -0
  10. package/scripts/smoke-loop.mjs +201 -0
  11. package/scripts/smoke.mjs +113 -0
  12. package/scripts/tool-failures.mjs +143 -0
  13. package/scripts/tool-smoke.mjs +456 -0
  14. package/src/agents/debugger/AGENT.md +3 -0
  15. package/src/agents/debugger/agent.json +6 -0
  16. package/src/agents/explore/AGENT.md +4 -0
  17. package/src/agents/explore/agent.json +6 -0
  18. package/src/agents/heavy-worker/AGENT.md +3 -0
  19. package/src/agents/heavy-worker/agent.json +6 -0
  20. package/src/agents/maintainer/AGENT.md +3 -0
  21. package/src/agents/maintainer/agent.json +6 -0
  22. package/src/agents/reviewer/AGENT.md +3 -0
  23. package/src/agents/reviewer/agent.json +6 -0
  24. package/src/agents/scheduler-task.md +3 -0
  25. package/src/agents/web-researcher/AGENT.md +3 -0
  26. package/src/agents/web-researcher/agent.json +6 -0
  27. package/src/agents/webhook-handler.md +3 -0
  28. package/src/agents/worker/AGENT.md +3 -0
  29. package/src/agents/worker/agent.json +6 -0
  30. package/src/app.mjs +90 -0
  31. package/src/cli.mjs +11 -0
  32. package/src/defaults/hidden-roles.json +72 -0
  33. package/src/defaults/mixdog-config.template.json +15 -0
  34. package/src/hooks/lib/permission-evaluator.cjs +488 -0
  35. package/src/hooks/lib/settings-loader.cjs +112 -0
  36. package/src/lib/keychain-cjs.cjs +332 -0
  37. package/src/lib/plugin-paths.cjs +28 -0
  38. package/src/lib/rules-builder.cjs +315 -0
  39. package/src/mixdog-session-runtime.mjs +3704 -0
  40. package/src/output-styles/default.md +38 -0
  41. package/src/output-styles/extreme-simple.md +17 -0
  42. package/src/output-styles/simple.md +17 -0
  43. package/src/repl.mjs +322 -0
  44. package/src/rules/bridge/00-common.md +5 -0
  45. package/src/rules/bridge/20-skip-protocol.md +11 -0
  46. package/src/rules/bridge/30-explorer.md +4 -0
  47. package/src/rules/bridge/40-cycle1-agent.md +28 -0
  48. package/src/rules/bridge/41-cycle2-agent.md +59 -0
  49. package/src/rules/lead/00-tool-lead.md +5 -0
  50. package/src/rules/lead/01-general.md +5 -0
  51. package/src/rules/lead/02-channels.md +3 -0
  52. package/src/rules/lead/04-workflow.md +12 -0
  53. package/src/rules/shared/00-language.md +3 -0
  54. package/src/rules/shared/01-tool.md +3 -0
  55. package/src/runtime/agent/orchestrator/bridge-trace.mjs +814 -0
  56. package/src/runtime/agent/orchestrator/cache-mtime.mjs +60 -0
  57. package/src/runtime/agent/orchestrator/config.mjs +446 -0
  58. package/src/runtime/agent/orchestrator/context/collect.mjs +796 -0
  59. package/src/runtime/agent/orchestrator/dispatch-persist.mjs +417 -0
  60. package/src/runtime/agent/orchestrator/internal-roles.mjs +188 -0
  61. package/src/runtime/agent/orchestrator/internal-tools.mjs +88 -0
  62. package/src/runtime/agent/orchestrator/mcp/client.mjs +345 -0
  63. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +2104 -0
  64. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +784 -0
  65. package/src/runtime/agent/orchestrator/providers/api-usage.mjs +341 -0
  66. package/src/runtime/agent/orchestrator/providers/gemini.mjs +1679 -0
  67. package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +959 -0
  68. package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +213 -0
  69. package/src/runtime/agent/orchestrator/providers/model-cache.mjs +38 -0
  70. package/src/runtime/agent/orchestrator/providers/model-catalog.mjs +471 -0
  71. package/src/runtime/agent/orchestrator/providers/oauth-usage.mjs +615 -0
  72. package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +808 -0
  73. package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +1719 -0
  74. package/src/runtime/agent/orchestrator/providers/openai-oauth-ws.mjs +2587 -0
  75. package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +1953 -0
  76. package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +136 -0
  77. package/src/runtime/agent/orchestrator/providers/opencode-go-usage.mjs +317 -0
  78. package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +109 -0
  79. package/src/runtime/agent/orchestrator/providers/registry.mjs +247 -0
  80. package/src/runtime/agent/orchestrator/providers/retry-classifier.mjs +332 -0
  81. package/src/runtime/agent/orchestrator/providers/statusline-route-meta.mjs +11 -0
  82. package/src/runtime/agent/orchestrator/providers/trace-utils.mjs +50 -0
  83. package/src/runtime/agent/orchestrator/session/cache/prefetch-cache.mjs +142 -0
  84. package/src/runtime/agent/orchestrator/session/cache/read-cache.mjs +318 -0
  85. package/src/runtime/agent/orchestrator/session/cache/scoped-cache.mjs +367 -0
  86. package/src/runtime/agent/orchestrator/session/compact.mjs +882 -0
  87. package/src/runtime/agent/orchestrator/session/context-utils.mjs +233 -0
  88. package/src/runtime/agent/orchestrator/session/loop.mjs +2320 -0
  89. package/src/runtime/agent/orchestrator/session/manager.mjs +2960 -0
  90. package/src/runtime/agent/orchestrator/session/result-classification.mjs +65 -0
  91. package/src/runtime/agent/orchestrator/session/store.mjs +663 -0
  92. package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +166 -0
  93. package/src/runtime/agent/orchestrator/smart-bridge/bridge-llm.mjs +339 -0
  94. package/src/runtime/agent/orchestrator/smart-bridge/cache-strategy.mjs +419 -0
  95. package/src/runtime/agent/orchestrator/stall-policy.mjs +227 -0
  96. package/src/runtime/agent/orchestrator/tool-loop-guard.mjs +235 -0
  97. package/src/runtime/agent/orchestrator/tools/bash-session.mjs +723 -0
  98. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +389 -0
  99. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +637 -0
  100. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +165 -0
  101. package/src/runtime/agent/orchestrator/tools/builtin/fuzzy-match.mjs +104 -0
  102. package/src/runtime/agent/orchestrator/tools/builtin/glob-walk.mjs +194 -0
  103. package/src/runtime/agent/orchestrator/tools/builtin/list-tool.mjs +596 -0
  104. package/src/runtime/agent/orchestrator/tools/builtin/native-edit-runner.mjs +110 -0
  105. package/src/runtime/agent/orchestrator/tools/builtin/path-diagnostics.mjs +153 -0
  106. package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +118 -0
  107. package/src/runtime/agent/orchestrator/tools/builtin/read-open.mjs +189 -0
  108. package/src/runtime/agent/orchestrator/tools/builtin/read-single-tool.mjs +731 -0
  109. package/src/runtime/agent/orchestrator/tools/builtin/read-snapshot-runtime.mjs +168 -0
  110. package/src/runtime/agent/orchestrator/tools/builtin/read-streaming.mjs +602 -0
  111. package/src/runtime/agent/orchestrator/tools/builtin/rg-runner.mjs +465 -0
  112. package/src/runtime/agent/orchestrator/tools/builtin/search-builders.mjs +160 -0
  113. package/src/runtime/agent/orchestrator/tools/builtin/search-tool.mjs +982 -0
  114. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +1087 -0
  115. package/src/runtime/agent/orchestrator/tools/builtin/shell-runtime.mjs +231 -0
  116. package/src/runtime/agent/orchestrator/tools/builtin/snapshot-store.mjs +223 -0
  117. package/src/runtime/agent/orchestrator/tools/builtin.mjs +478 -0
  118. package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +24 -0
  119. package/src/runtime/agent/orchestrator/tools/code-graph.mjs +4102 -0
  120. package/src/runtime/agent/orchestrator/tools/destructive-warning.mjs +323 -0
  121. package/src/runtime/agent/orchestrator/tools/graph-binary-fetcher.mjs +154 -0
  122. package/src/runtime/agent/orchestrator/tools/graph-manifest.json +26 -0
  123. package/src/runtime/agent/orchestrator/tools/patch-binary-fetcher.mjs +143 -0
  124. package/src/runtime/agent/orchestrator/tools/patch-tool-defs.mjs +18 -0
  125. package/src/runtime/agent/orchestrator/tools/patch.mjs +2772 -0
  126. package/src/runtime/agent/orchestrator/tools/progress-message.mjs +114 -0
  127. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +880 -0
  128. package/src/runtime/agent/orchestrator/tools/shell-snapshot.mjs +312 -0
  129. package/src/runtime/channels/backends/discord.mjs +781 -0
  130. package/src/runtime/channels/data/voice-runtime-manifest.json +138 -0
  131. package/src/runtime/channels/index.mjs +3309 -0
  132. package/src/runtime/channels/lib/config.mjs +285 -0
  133. package/src/runtime/channels/lib/drop-trace.mjs +71 -0
  134. package/src/runtime/channels/lib/event-pipeline.mjs +81 -0
  135. package/src/runtime/channels/lib/holidays.mjs +138 -0
  136. package/src/runtime/channels/lib/hook-pipe-server.mjs +671 -0
  137. package/src/runtime/channels/lib/output-forwarder.mjs +765 -0
  138. package/src/runtime/channels/lib/runtime-paths.mjs +497 -0
  139. package/src/runtime/channels/lib/scheduler.mjs +710 -0
  140. package/src/runtime/channels/lib/session-discovery.mjs +102 -0
  141. package/src/runtime/channels/lib/state-file.mjs +68 -0
  142. package/src/runtime/channels/lib/status-snapshot.mjs +224 -0
  143. package/src/runtime/channels/lib/tool-format.mjs +124 -0
  144. package/src/runtime/channels/lib/transcript-discovery.mjs +195 -0
  145. package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +734 -0
  146. package/src/runtime/channels/lib/webhook.mjs +1288 -0
  147. package/src/runtime/channels/tool-defs.mjs +177 -0
  148. package/src/runtime/lib/keychain-cjs.cjs +289 -0
  149. package/src/runtime/memory/data/runtime-manifest.json +40 -0
  150. package/src/runtime/memory/index.mjs +3600 -0
  151. package/src/runtime/memory/lib/core-memory-store.mjs +336 -0
  152. package/src/runtime/memory/lib/embedding-provider.mjs +275 -0
  153. package/src/runtime/memory/lib/embedding-worker.mjs +331 -0
  154. package/src/runtime/memory/lib/memory-cycle-requests.mjs +276 -0
  155. package/src/runtime/memory/lib/memory-cycle1.mjs +783 -0
  156. package/src/runtime/memory/lib/memory-cycle2.mjs +1389 -0
  157. package/src/runtime/memory/lib/memory-cycle3.mjs +646 -0
  158. package/src/runtime/memory/lib/memory-embed.mjs +300 -0
  159. package/src/runtime/memory/lib/memory-ops-policy.mjs +149 -0
  160. package/src/runtime/memory/lib/memory-recall-store.mjs +644 -0
  161. package/src/runtime/memory/lib/memory.mjs +418 -0
  162. package/src/runtime/memory/lib/pg/adapter.mjs +314 -0
  163. package/src/runtime/memory/lib/pg/process.mjs +366 -0
  164. package/src/runtime/memory/lib/pg/supervisor.mjs +495 -0
  165. package/src/runtime/memory/lib/runtime-fetcher.mjs +464 -0
  166. package/src/runtime/memory/lib/trace-store.mjs +734 -0
  167. package/src/runtime/memory/tool-defs.mjs +79 -0
  168. package/src/runtime/search/index.mjs +925 -0
  169. package/src/runtime/search/lib/config.mjs +61 -0
  170. package/src/runtime/search/lib/web-tools.mjs +1278 -0
  171. package/src/runtime/search/tool-defs.mjs +64 -0
  172. package/src/runtime/shared/atomic-file.mjs +435 -0
  173. package/src/runtime/shared/background-tasks.mjs +376 -0
  174. package/src/runtime/shared/child-guardian.mjs +98 -0
  175. package/src/runtime/shared/config.mjs +393 -0
  176. package/src/runtime/shared/err-text.mjs +121 -0
  177. package/src/runtime/shared/launcher-control.mjs +259 -0
  178. package/src/runtime/shared/llm/http-agent.mjs +129 -0
  179. package/src/runtime/shared/open-url.mjs +37 -0
  180. package/src/runtime/shared/plugin-paths.mjs +25 -0
  181. package/src/runtime/shared/process-shutdown.mjs +147 -0
  182. package/src/runtime/shared/schedules-store.mjs +70 -0
  183. package/src/runtime/shared/tool-execution-contract.mjs +104 -0
  184. package/src/runtime/shared/tool-surface.mjs +950 -0
  185. package/src/runtime/shared/user-cwd.mjs +221 -0
  186. package/src/runtime/shared/user-data-guard.mjs +232 -0
  187. package/src/runtime/shared/workspace-router.mjs +259 -0
  188. package/src/standalone/bridge-tool.mjs +1414 -0
  189. package/src/standalone/channel-admin.mjs +366 -0
  190. package/src/standalone/channel-worker-preload.cjs +3 -0
  191. package/src/standalone/channel-worker.mjs +353 -0
  192. package/src/standalone/explore-tool.mjs +233 -0
  193. package/src/standalone/hook-bus.mjs +246 -0
  194. package/src/standalone/plugin-admin.mjs +247 -0
  195. package/src/standalone/provider-admin.mjs +338 -0
  196. package/src/standalone/seeds.mjs +94 -0
  197. package/src/standalone/usage-dashboard.mjs +510 -0
  198. package/src/tui/App.jsx +5438 -0
  199. package/src/tui/components/AnsiText.jsx +199 -0
  200. package/src/tui/components/ContextPanel.jsx +217 -0
  201. package/src/tui/components/Markdown.jsx +205 -0
  202. package/src/tui/components/MarkdownTable.jsx +204 -0
  203. package/src/tui/components/Message.jsx +103 -0
  204. package/src/tui/components/Picker.jsx +317 -0
  205. package/src/tui/components/PromptInput.jsx +584 -0
  206. package/src/tui/components/QueuedCommands.jsx +47 -0
  207. package/src/tui/components/SlashCommandPalette.jsx +114 -0
  208. package/src/tui/components/Spinner.jsx +317 -0
  209. package/src/tui/components/StatusLine.jsx +87 -0
  210. package/src/tui/components/TextEntryPanel.jsx +323 -0
  211. package/src/tui/components/ToolExecution.jsx +772 -0
  212. package/src/tui/components/TurnDone.jsx +78 -0
  213. package/src/tui/components/UsagePanel.jsx +331 -0
  214. package/src/tui/dist/index.mjs +12359 -0
  215. package/src/tui/engine.mjs +2410 -0
  216. package/src/tui/figures.mjs +50 -0
  217. package/src/tui/hooks/useEngine.mjs +16 -0
  218. package/src/tui/index.jsx +254 -0
  219. package/src/tui/input-editing.mjs +242 -0
  220. package/src/tui/markdown/format-token.mjs +194 -0
  221. package/src/tui/paste-attachments.mjs +198 -0
  222. package/src/tui/runtime/shared/process-shutdown.mjs +1 -0
  223. package/src/tui/spinner-verbs.mjs +45 -0
  224. package/src/tui/theme.mjs +67 -0
  225. package/src/tui/time-format.mjs +53 -0
  226. package/src/ui/ansi.mjs +115 -0
  227. package/src/ui/markdown.mjs +195 -0
  228. package/src/ui/statusline.mjs +730 -0
  229. package/src/ui/tool-card.mjs +101 -0
  230. package/src/vendor/statusline/bin/statusline-lib.mjs +805 -0
  231. package/src/vendor/statusline/bin/statusline-route.mjs +596 -0
  232. package/src/vendor/statusline/scripts/lib/gateway-settings.mjs +285 -0
  233. package/src/vendor/statusline/src/gateway/claude-current.mjs +320 -0
  234. package/src/vendor/statusline/src/gateway/route-meta.mjs +753 -0
  235. package/src/vendor/statusline/src/gateway/session-routes.mjs +244 -0
  236. package/src/workflows/default/WORKFLOW.md +7 -0
  237. package/src/workflows/default/workflow.json +14 -0
  238. package/vendor/ink/build/ansi-tokenizer.d.ts +38 -0
  239. package/vendor/ink/build/ansi-tokenizer.js +316 -0
  240. package/vendor/ink/build/ansi-tokenizer.js.map +1 -0
  241. package/vendor/ink/build/colorize.d.ts +3 -0
  242. package/vendor/ink/build/colorize.js +48 -0
  243. package/vendor/ink/build/colorize.js.map +1 -0
  244. package/vendor/ink/build/components/AccessibilityContext.d.ts +3 -0
  245. package/vendor/ink/build/components/AccessibilityContext.js +5 -0
  246. package/vendor/ink/build/components/AccessibilityContext.js.map +1 -0
  247. package/vendor/ink/build/components/AnimationContext.d.ts +9 -0
  248. package/vendor/ink/build/components/AnimationContext.js +13 -0
  249. package/vendor/ink/build/components/AnimationContext.js.map +1 -0
  250. package/vendor/ink/build/components/App.d.ts +24 -0
  251. package/vendor/ink/build/components/App.js +554 -0
  252. package/vendor/ink/build/components/App.js.map +1 -0
  253. package/vendor/ink/build/components/AppContext.d.ts +80 -0
  254. package/vendor/ink/build/components/AppContext.js +25 -0
  255. package/vendor/ink/build/components/AppContext.js.map +1 -0
  256. package/vendor/ink/build/components/BackgroundContext.d.ts +4 -0
  257. package/vendor/ink/build/components/BackgroundContext.js +3 -0
  258. package/vendor/ink/build/components/BackgroundContext.js.map +1 -0
  259. package/vendor/ink/build/components/Box.d.ts +130 -0
  260. package/vendor/ink/build/components/Box.js +34 -0
  261. package/vendor/ink/build/components/Box.js.map +1 -0
  262. package/vendor/ink/build/components/CursorContext.d.ts +11 -0
  263. package/vendor/ink/build/components/CursorContext.js +8 -0
  264. package/vendor/ink/build/components/CursorContext.js.map +1 -0
  265. package/vendor/ink/build/components/ErrorBoundary.d.ts +18 -0
  266. package/vendor/ink/build/components/ErrorBoundary.js +23 -0
  267. package/vendor/ink/build/components/ErrorBoundary.js.map +1 -0
  268. package/vendor/ink/build/components/ErrorOverview.d.ts +6 -0
  269. package/vendor/ink/build/components/ErrorOverview.js +90 -0
  270. package/vendor/ink/build/components/ErrorOverview.js.map +1 -0
  271. package/vendor/ink/build/components/FocusContext.d.ts +16 -0
  272. package/vendor/ink/build/components/FocusContext.js +17 -0
  273. package/vendor/ink/build/components/FocusContext.js.map +1 -0
  274. package/vendor/ink/build/components/Newline.d.ts +13 -0
  275. package/vendor/ink/build/components/Newline.js +8 -0
  276. package/vendor/ink/build/components/Newline.js.map +1 -0
  277. package/vendor/ink/build/components/Spacer.d.ts +7 -0
  278. package/vendor/ink/build/components/Spacer.js +11 -0
  279. package/vendor/ink/build/components/Spacer.js.map +1 -0
  280. package/vendor/ink/build/components/Static.d.ts +24 -0
  281. package/vendor/ink/build/components/Static.js +28 -0
  282. package/vendor/ink/build/components/Static.js.map +1 -0
  283. package/vendor/ink/build/components/StderrContext.d.ts +15 -0
  284. package/vendor/ink/build/components/StderrContext.js +13 -0
  285. package/vendor/ink/build/components/StderrContext.js.map +1 -0
  286. package/vendor/ink/build/components/StdinContext.d.ts +28 -0
  287. package/vendor/ink/build/components/StdinContext.js +20 -0
  288. package/vendor/ink/build/components/StdinContext.js.map +1 -0
  289. package/vendor/ink/build/components/StdoutContext.d.ts +15 -0
  290. package/vendor/ink/build/components/StdoutContext.js +13 -0
  291. package/vendor/ink/build/components/StdoutContext.js.map +1 -0
  292. package/vendor/ink/build/components/Text.d.ts +55 -0
  293. package/vendor/ink/build/components/Text.js +50 -0
  294. package/vendor/ink/build/components/Text.js.map +1 -0
  295. package/vendor/ink/build/components/Transform.d.ts +16 -0
  296. package/vendor/ink/build/components/Transform.js +15 -0
  297. package/vendor/ink/build/components/Transform.js.map +1 -0
  298. package/vendor/ink/build/cursor-helpers.d.ts +39 -0
  299. package/vendor/ink/build/cursor-helpers.js +62 -0
  300. package/vendor/ink/build/cursor-helpers.js.map +1 -0
  301. package/vendor/ink/build/devtools-window-polyfill.d.ts +1 -0
  302. package/vendor/ink/build/devtools-window-polyfill.js +68 -0
  303. package/vendor/ink/build/devtools-window-polyfill.js.map +1 -0
  304. package/vendor/ink/build/devtools.d.ts +1 -0
  305. package/vendor/ink/build/devtools.js +36 -0
  306. package/vendor/ink/build/devtools.js.map +1 -0
  307. package/vendor/ink/build/dom.d.ts +62 -0
  308. package/vendor/ink/build/dom.js +143 -0
  309. package/vendor/ink/build/dom.js.map +1 -0
  310. package/vendor/ink/build/get-max-width.d.ts +3 -0
  311. package/vendor/ink/build/get-max-width.js +10 -0
  312. package/vendor/ink/build/get-max-width.js.map +1 -0
  313. package/vendor/ink/build/hooks/use-animation.d.ts +49 -0
  314. package/vendor/ink/build/hooks/use-animation.js +87 -0
  315. package/vendor/ink/build/hooks/use-animation.js.map +1 -0
  316. package/vendor/ink/build/hooks/use-app.d.ts +5 -0
  317. package/vendor/ink/build/hooks/use-app.js +8 -0
  318. package/vendor/ink/build/hooks/use-app.js.map +1 -0
  319. package/vendor/ink/build/hooks/use-box-metrics.d.ts +59 -0
  320. package/vendor/ink/build/hooks/use-box-metrics.js +81 -0
  321. package/vendor/ink/build/hooks/use-box-metrics.js.map +1 -0
  322. package/vendor/ink/build/hooks/use-cursor.d.ts +12 -0
  323. package/vendor/ink/build/hooks/use-cursor.js +29 -0
  324. package/vendor/ink/build/hooks/use-cursor.js.map +1 -0
  325. package/vendor/ink/build/hooks/use-focus-manager.d.ts +43 -0
  326. package/vendor/ink/build/hooks/use-focus-manager.js +18 -0
  327. package/vendor/ink/build/hooks/use-focus-manager.js.map +1 -0
  328. package/vendor/ink/build/hooks/use-focus.d.ts +30 -0
  329. package/vendor/ink/build/hooks/use-focus.js +43 -0
  330. package/vendor/ink/build/hooks/use-focus.js.map +1 -0
  331. package/vendor/ink/build/hooks/use-input.d.ts +132 -0
  332. package/vendor/ink/build/hooks/use-input.js +126 -0
  333. package/vendor/ink/build/hooks/use-input.js.map +1 -0
  334. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.d.ts +6 -0
  335. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js +12 -0
  336. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js.map +1 -0
  337. package/vendor/ink/build/hooks/use-paste.d.ts +35 -0
  338. package/vendor/ink/build/hooks/use-paste.js +62 -0
  339. package/vendor/ink/build/hooks/use-paste.js.map +1 -0
  340. package/vendor/ink/build/hooks/use-stderr.d.ts +5 -0
  341. package/vendor/ink/build/hooks/use-stderr.js +8 -0
  342. package/vendor/ink/build/hooks/use-stderr.js.map +1 -0
  343. package/vendor/ink/build/hooks/use-stdin.d.ts +7 -0
  344. package/vendor/ink/build/hooks/use-stdin.js +9 -0
  345. package/vendor/ink/build/hooks/use-stdin.js.map +1 -0
  346. package/vendor/ink/build/hooks/use-stdout.d.ts +5 -0
  347. package/vendor/ink/build/hooks/use-stdout.js +8 -0
  348. package/vendor/ink/build/hooks/use-stdout.js.map +1 -0
  349. package/vendor/ink/build/hooks/use-window-size.d.ts +18 -0
  350. package/vendor/ink/build/hooks/use-window-size.js +22 -0
  351. package/vendor/ink/build/hooks/use-window-size.js.map +1 -0
  352. package/vendor/ink/build/index.d.ts +42 -0
  353. package/vendor/ink/build/index.js +24 -0
  354. package/vendor/ink/build/index.js.map +1 -0
  355. package/vendor/ink/build/ink.d.ts +146 -0
  356. package/vendor/ink/build/ink.js +1022 -0
  357. package/vendor/ink/build/ink.js.map +1 -0
  358. package/vendor/ink/build/input-parser.d.ts +10 -0
  359. package/vendor/ink/build/input-parser.js +194 -0
  360. package/vendor/ink/build/input-parser.js.map +1 -0
  361. package/vendor/ink/build/instances.d.ts +3 -0
  362. package/vendor/ink/build/instances.js +8 -0
  363. package/vendor/ink/build/instances.js.map +1 -0
  364. package/vendor/ink/build/kitty-keyboard.d.ts +23 -0
  365. package/vendor/ink/build/kitty-keyboard.js +32 -0
  366. package/vendor/ink/build/kitty-keyboard.js.map +1 -0
  367. package/vendor/ink/build/log-update.d.ts +20 -0
  368. package/vendor/ink/build/log-update.js +261 -0
  369. package/vendor/ink/build/log-update.js.map +1 -0
  370. package/vendor/ink/build/measure-element.d.ts +20 -0
  371. package/vendor/ink/build/measure-element.js +13 -0
  372. package/vendor/ink/build/measure-element.js.map +1 -0
  373. package/vendor/ink/build/measure-text.d.ts +6 -0
  374. package/vendor/ink/build/measure-text.js +21 -0
  375. package/vendor/ink/build/measure-text.js.map +1 -0
  376. package/vendor/ink/build/output.d.ts +35 -0
  377. package/vendor/ink/build/output.js +328 -0
  378. package/vendor/ink/build/output.js.map +1 -0
  379. package/vendor/ink/build/parse-keypress.d.ts +20 -0
  380. package/vendor/ink/build/parse-keypress.js +495 -0
  381. package/vendor/ink/build/parse-keypress.js.map +1 -0
  382. package/vendor/ink/build/reconciler.d.ts +4 -0
  383. package/vendor/ink/build/reconciler.js +306 -0
  384. package/vendor/ink/build/reconciler.js.map +1 -0
  385. package/vendor/ink/build/render-background.d.ts +4 -0
  386. package/vendor/ink/build/render-background.js +25 -0
  387. package/vendor/ink/build/render-background.js.map +1 -0
  388. package/vendor/ink/build/render-border.d.ts +4 -0
  389. package/vendor/ink/build/render-border.js +84 -0
  390. package/vendor/ink/build/render-border.js.map +1 -0
  391. package/vendor/ink/build/render-node-to-output.d.ts +14 -0
  392. package/vendor/ink/build/render-node-to-output.js +162 -0
  393. package/vendor/ink/build/render-node-to-output.js.map +1 -0
  394. package/vendor/ink/build/render-to-string.d.ts +38 -0
  395. package/vendor/ink/build/render-to-string.js +116 -0
  396. package/vendor/ink/build/render-to-string.js.map +1 -0
  397. package/vendor/ink/build/render.d.ts +176 -0
  398. package/vendor/ink/build/render.js +71 -0
  399. package/vendor/ink/build/render.js.map +1 -0
  400. package/vendor/ink/build/renderer.d.ts +8 -0
  401. package/vendor/ink/build/renderer.js +64 -0
  402. package/vendor/ink/build/renderer.js.map +1 -0
  403. package/vendor/ink/build/sanitize-ansi.d.ts +2 -0
  404. package/vendor/ink/build/sanitize-ansi.js +27 -0
  405. package/vendor/ink/build/sanitize-ansi.js.map +1 -0
  406. package/vendor/ink/build/squash-text-nodes.d.ts +3 -0
  407. package/vendor/ink/build/squash-text-nodes.js +36 -0
  408. package/vendor/ink/build/squash-text-nodes.js.map +1 -0
  409. package/vendor/ink/build/styles.d.ts +302 -0
  410. package/vendor/ink/build/styles.js +303 -0
  411. package/vendor/ink/build/styles.js.map +1 -0
  412. package/vendor/ink/build/utils.d.ts +9 -0
  413. package/vendor/ink/build/utils.js +19 -0
  414. package/vendor/ink/build/utils.js.map +1 -0
  415. package/vendor/ink/build/wrap-text.d.ts +3 -0
  416. package/vendor/ink/build/wrap-text.js +38 -0
  417. package/vendor/ink/build/wrap-text.js.map +1 -0
  418. package/vendor/ink/build/write-synchronized.d.ts +4 -0
  419. package/vendor/ink/build/write-synchronized.js +9 -0
  420. package/vendor/ink/build/write-synchronized.js.map +1 -0
  421. package/vendor/ink/license +10 -0
  422. package/vendor/ink/package.json +137 -0
  423. package/.claude-plugin/marketplace.json +0 -34
  424. package/.claude-plugin/plugin.json +0 -20
  425. package/.gitattributes +0 -34
  426. package/.mcp.json +0 -14
  427. package/ARCHITECTURE.md +0 -77
  428. package/CHANGELOG.md +0 -30
  429. package/CONTRIBUTING.md +0 -45
  430. package/DATA-FLOW.md +0 -79
  431. package/LICENSE +0 -21
  432. package/SECURITY.md +0 -138
  433. package/UNINSTALL.md +0 -115
  434. package/agents/maintenance.md +0 -5
  435. package/agents/memory-classification.md +0 -30
  436. package/agents/scheduler-task.md +0 -18
  437. package/agents/webhook-handler.md +0 -27
  438. package/agents/worker.md +0 -24
  439. package/bin/bridge +0 -133
  440. package/bin/statusline-launcher.mjs +0 -82
  441. package/bin/statusline-lib.mjs +0 -581
  442. package/bin/statusline-route.mjs +0 -273
  443. package/bin/statusline.mjs +0 -638
  444. package/bun.lock +0 -927
  445. package/commands/config.md +0 -16
  446. package/commands/doctor.md +0 -13
  447. package/commands/model.md +0 -61
  448. package/commands/setup.md +0 -17
  449. package/defaults/hidden-roles.json +0 -68
  450. package/defaults/memory-chunk-prompt.md +0 -63
  451. package/defaults/mixdog-config.template.json +0 -27
  452. package/defaults/user-workflow.json +0 -8
  453. package/defaults/user-workflow.md +0 -17
  454. package/hooks/hooks.json +0 -73
  455. package/hooks/lib/active-instance.cjs +0 -77
  456. package/hooks/lib/permission-evaluator.cjs +0 -411
  457. package/hooks/lib/permission-route.cjs +0 -63
  458. package/hooks/lib/settings-loader.cjs +0 -117
  459. package/hooks/post-tool-use.cjs +0 -84
  460. package/hooks/pre-mcp-sandbox.cjs +0 -158
  461. package/hooks/pre-tool-subagent.cjs +0 -258
  462. package/hooks/session-start.cjs +0 -1493
  463. package/hooks/shim-launcher.cjs +0 -65
  464. package/hooks/turn-timer.cjs +0 -82
  465. package/lib/claude-md-writer.cjs +0 -386
  466. package/lib/keychain-cjs.cjs +0 -290
  467. package/lib/plugin-paths.cjs +0 -69
  468. package/lib/rules-builder.cjs +0 -241
  469. package/native/README.md +0 -117
  470. package/native/prebuilt/linux-aarch64/mixdog-shim +0 -0
  471. package/native/prebuilt/linux-x86_64/mixdog-shim +0 -0
  472. package/native/prebuilt/macos-aarch64/mixdog-shim +0 -0
  473. package/native/prebuilt/macos-x86_64/mixdog-shim +0 -0
  474. package/native/prebuilt/windows-x86_64/mixdog-shim.exe +0 -0
  475. package/prompts/code-review.txt +0 -16
  476. package/prompts/security-audit.txt +0 -17
  477. package/rules/bridge/00-common.md +0 -39
  478. package/rules/bridge/20-skip-protocol.md +0 -18
  479. package/rules/bridge/30-explorer.md +0 -33
  480. package/rules/bridge/40-cycle1-agent.md +0 -52
  481. package/rules/bridge/41-cycle2-agent.md +0 -62
  482. package/rules/lead/00-tool-lead.md +0 -61
  483. package/rules/lead/01-general.md +0 -26
  484. package/rules/lead/02-channels.md +0 -49
  485. package/rules/lead/03-team.md +0 -27
  486. package/rules/lead/04-workflow.md +0 -20
  487. package/rules/shared/00-language.md +0 -14
  488. package/rules/shared/01-tool.md +0 -138
  489. package/scripts/bootstrap.mjs +0 -130
  490. package/scripts/bridge-unify-smoke.mjs +0 -308
  491. package/scripts/build-runtime-linux.sh +0 -348
  492. package/scripts/build-runtime-macos.sh +0 -217
  493. package/scripts/build-runtime-windows.ps1 +0 -242
  494. package/scripts/builtin-utils-smoke.mjs +0 -398
  495. package/scripts/bump.mjs +0 -80
  496. package/scripts/check-json.mjs +0 -45
  497. package/scripts/check-syntax-changed.mjs +0 -102
  498. package/scripts/check-syntax.mjs +0 -58
  499. package/scripts/code-graph-batch.test.mjs +0 -33
  500. package/scripts/config-preserve-smoke.mjs +0 -180
  501. package/scripts/doctor.mjs +0 -489
  502. package/scripts/edit-normalize-fuzz.mjs +0 -130
  503. package/scripts/edit-normalize-smoke.mjs +0 -401
  504. package/scripts/edit-operation-smoke.mjs +0 -369
  505. package/scripts/edit2-smoke.mjs +0 -63
  506. package/scripts/ensure-deps.mjs +0 -259
  507. package/scripts/fuzzy-e2e.mjs +0 -28
  508. package/scripts/fuzzy-smoke.mjs +0 -26
  509. package/scripts/gateway-model.mjs +0 -596
  510. package/scripts/generate-runtime-manifest.mjs +0 -166
  511. package/scripts/guard-smoke.mjs +0 -66
  512. package/scripts/hidden-role-schema-smoke.mjs +0 -162
  513. package/scripts/hook-routing-smoke.mjs +0 -29
  514. package/scripts/inject-input.ps1 +0 -204
  515. package/scripts/io-complex-smoke.mjs +0 -667
  516. package/scripts/io-explore-bench.mjs +0 -424
  517. package/scripts/io-guardrails-smoke.mjs +0 -205
  518. package/scripts/io-mini-bench-baseline.json +0 -11
  519. package/scripts/io-mini-bench.mjs +0 -216
  520. package/scripts/io-route-harness.mjs +0 -933
  521. package/scripts/io-telemetry-report.mjs +0 -691
  522. package/scripts/lib/gateway-inventory.mjs +0 -178
  523. package/scripts/lib/gateway-settings.mjs +0 -78
  524. package/scripts/mutation-bench.mjs +0 -564
  525. package/scripts/mutation-io-smoke.mjs +0 -1097
  526. package/scripts/native-patch-bridge-smoke.mjs +0 -288
  527. package/scripts/native-patch-smoke.mjs +0 -304
  528. package/scripts/openai-oauth-catalog-smoke.mjs +0 -53
  529. package/scripts/patch-interior-context-smoke.mjs +0 -49
  530. package/scripts/patch-newline-utf8-smoke.mjs +0 -157
  531. package/scripts/perf-hook-smoke.mjs +0 -71
  532. package/scripts/permission-eval-smoke.mjs +0 -443
  533. package/scripts/prep-patch.mjs +0 -53
  534. package/scripts/prep-shim.mjs +0 -96
  535. package/scripts/provider-cache-smoke.mjs +0 -687
  536. package/scripts/report-runtime-health.mjs +0 -132
  537. package/scripts/resolve-bun.mjs +0 -60
  538. package/scripts/run-mcp.mjs +0 -1473
  539. package/scripts/salvage-v4a-shatter.test.mjs +0 -58
  540. package/scripts/scoped-cache-io-smoke.mjs +0 -103
  541. package/scripts/shell-policy-round3-smoke.mjs +0 -46
  542. package/scripts/smoke-runtime-negative.ps1 +0 -100
  543. package/scripts/smoke-runtime-negative.sh +0 -95
  544. package/scripts/stall-policy-smoke.mjs +0 -50
  545. package/scripts/start-memory-worker.mjs +0 -23
  546. package/scripts/statusline-launcher-smoke.mjs +0 -235
  547. package/scripts/stress-atomic-write.mjs +0 -1028
  548. package/scripts/test-fault-inject.mjs +0 -164
  549. package/scripts/test-large-file.mjs +0 -174
  550. package/scripts/tool-edge-smoke.mjs +0 -209
  551. package/scripts/uninstall.mjs +0 -238
  552. package/scripts/webhook-selfheal-smoke.mjs +0 -27
  553. package/scripts/write-overwrite-guard-smoke.mjs +0 -56
  554. package/server-main.mjs +0 -3350
  555. package/server.mjs +0 -468
  556. package/setup/config-merge.mjs +0 -246
  557. package/setup/install.mjs +0 -574
  558. package/setup/launch-core.mjs +0 -617
  559. package/setup/launch.mjs +0 -101
  560. package/setup/locate-claude.mjs +0 -56
  561. package/setup/mixdog-cli.mjs +0 -122
  562. package/setup/setup-server.mjs +0 -3305
  563. package/setup/setup.html +0 -3740
  564. package/setup/tui.mjs +0 -325
  565. package/skills/retro-skill-proposer/SKILL.md +0 -92
  566. package/skills/schedule-add/SKILL.md +0 -77
  567. package/skills/setup/SKILL.md +0 -356
  568. package/skills/webhook-add/SKILL.md +0 -81
  569. package/src/agent/bridge-stall-watchdog.mjs +0 -337
  570. package/src/agent/index.mjs +0 -2229
  571. package/src/agent/orchestrator/ai-wrapped-dispatch.mjs +0 -1010
  572. package/src/agent/orchestrator/bridge-retry.mjs +0 -220
  573. package/src/agent/orchestrator/bridge-trace.mjs +0 -601
  574. package/src/agent/orchestrator/cache-mtime.mjs +0 -58
  575. package/src/agent/orchestrator/config.mjs +0 -405
  576. package/src/agent/orchestrator/context/collect.mjs +0 -651
  577. package/src/agent/orchestrator/dispatch-persist.mjs +0 -549
  578. package/src/agent/orchestrator/drain-registry.mjs +0 -50
  579. package/src/agent/orchestrator/explore-validator.mjs +0 -8
  580. package/src/agent/orchestrator/internal-roles.mjs +0 -118
  581. package/src/agent/orchestrator/internal-tools.mjs +0 -88
  582. package/src/agent/orchestrator/jobs.mjs +0 -116
  583. package/src/agent/orchestrator/mcp/client.mjs +0 -364
  584. package/src/agent/orchestrator/providers/anthropic-oauth.mjs +0 -1884
  585. package/src/agent/orchestrator/providers/anthropic.mjs +0 -598
  586. package/src/agent/orchestrator/providers/gemini.mjs +0 -1530
  587. package/src/agent/orchestrator/providers/grok-oauth.mjs +0 -779
  588. package/src/agent/orchestrator/providers/model-catalog.mjs +0 -374
  589. package/src/agent/orchestrator/providers/openai-compat-stream.mjs +0 -366
  590. package/src/agent/orchestrator/providers/openai-compat.mjs +0 -1511
  591. package/src/agent/orchestrator/providers/openai-oauth-ws.mjs +0 -1891
  592. package/src/agent/orchestrator/providers/openai-oauth.mjs +0 -1456
  593. package/src/agent/orchestrator/providers/openai-ws.mjs +0 -127
  594. package/src/agent/orchestrator/providers/registry.mjs +0 -192
  595. package/src/agent/orchestrator/providers/retry-classifier.mjs +0 -325
  596. package/src/agent/orchestrator/session/cache/prefetch-cache.mjs +0 -142
  597. package/src/agent/orchestrator/session/cache/read-cache.mjs +0 -319
  598. package/src/agent/orchestrator/session/cache/scoped-cache.mjs +0 -361
  599. package/src/agent/orchestrator/session/loop.mjs +0 -1619
  600. package/src/agent/orchestrator/session/manager.mjs +0 -1991
  601. package/src/agent/orchestrator/session/result-classification.mjs +0 -65
  602. package/src/agent/orchestrator/session/store.mjs +0 -632
  603. package/src/agent/orchestrator/session/stream-watchdog.mjs +0 -130
  604. package/src/agent/orchestrator/session/tool-result-offload.mjs +0 -166
  605. package/src/agent/orchestrator/session/trim.mjs +0 -491
  606. package/src/agent/orchestrator/smart-bridge/CACHE-SHARD.md +0 -115
  607. package/src/agent/orchestrator/smart-bridge/bridge-llm.mjs +0 -331
  608. package/src/agent/orchestrator/smart-bridge/cache-obs.mjs +0 -150
  609. package/src/agent/orchestrator/smart-bridge/cache-strategy.mjs +0 -228
  610. package/src/agent/orchestrator/smart-bridge/index.mjs +0 -215
  611. package/src/agent/orchestrator/smart-bridge/profiles.mjs +0 -37
  612. package/src/agent/orchestrator/smart-bridge/registry.mjs +0 -348
  613. package/src/agent/orchestrator/stall-policy.mjs +0 -201
  614. package/src/agent/orchestrator/tool-loop-guard.mjs +0 -75
  615. package/src/agent/orchestrator/tools/bash-session.mjs +0 -722
  616. package/src/agent/orchestrator/tools/builtin/arg-guard.mjs +0 -511
  617. package/src/agent/orchestrator/tools/builtin/bash-tool.mjs +0 -480
  618. package/src/agent/orchestrator/tools/builtin/builtin-tools.mjs +0 -256
  619. package/src/agent/orchestrator/tools/builtin/edit-base-guard.mjs +0 -58
  620. package/src/agent/orchestrator/tools/builtin/edit-byte-plan.mjs +0 -240
  621. package/src/agent/orchestrator/tools/builtin/edit-byte-utils.mjs +0 -113
  622. package/src/agent/orchestrator/tools/builtin/edit-commit.mjs +0 -74
  623. package/src/agent/orchestrator/tools/builtin/edit-context-utils.mjs +0 -242
  624. package/src/agent/orchestrator/tools/builtin/edit-diagnostics.mjs +0 -211
  625. package/src/agent/orchestrator/tools/builtin/edit-engine.mjs +0 -1364
  626. package/src/agent/orchestrator/tools/builtin/edit-failure-context.mjs +0 -126
  627. package/src/agent/orchestrator/tools/builtin/edit-hint.mjs +0 -141
  628. package/src/agent/orchestrator/tools/builtin/edit-match-utils.mjs +0 -194
  629. package/src/agent/orchestrator/tools/builtin/edit-partial-write.mjs +0 -60
  630. package/src/agent/orchestrator/tools/builtin/edit-stale-refresh.mjs +0 -168
  631. package/src/agent/orchestrator/tools/builtin/edit-tool.mjs +0 -173
  632. package/src/agent/orchestrator/tools/builtin/edit-utf8-guard.mjs +0 -48
  633. package/src/agent/orchestrator/tools/builtin/fuzzy-match.mjs +0 -99
  634. package/src/agent/orchestrator/tools/builtin/glob-walk.mjs +0 -193
  635. package/src/agent/orchestrator/tools/builtin/list-tool.mjs +0 -597
  636. package/src/agent/orchestrator/tools/builtin/native-edit-runner.mjs +0 -110
  637. package/src/agent/orchestrator/tools/builtin/notebook-edit-tool.mjs +0 -300
  638. package/src/agent/orchestrator/tools/builtin/path-diagnostics.mjs +0 -152
  639. package/src/agent/orchestrator/tools/builtin/read-formatting.mjs +0 -118
  640. package/src/agent/orchestrator/tools/builtin/read-open.mjs +0 -190
  641. package/src/agent/orchestrator/tools/builtin/read-single-tool.mjs +0 -728
  642. package/src/agent/orchestrator/tools/builtin/read-snapshot-runtime.mjs +0 -173
  643. package/src/agent/orchestrator/tools/builtin/read-streaming.mjs +0 -602
  644. package/src/agent/orchestrator/tools/builtin/rename-tool.mjs +0 -196
  645. package/src/agent/orchestrator/tools/builtin/rg-runner.mjs +0 -422
  646. package/src/agent/orchestrator/tools/builtin/search-builders.mjs +0 -158
  647. package/src/agent/orchestrator/tools/builtin/search-tool.mjs +0 -869
  648. package/src/agent/orchestrator/tools/builtin/shell-jobs.mjs +0 -962
  649. package/src/agent/orchestrator/tools/builtin/shell-runtime.mjs +0 -223
  650. package/src/agent/orchestrator/tools/builtin/snapshot-store.mjs +0 -206
  651. package/src/agent/orchestrator/tools/builtin/write-tool.mjs +0 -401
  652. package/src/agent/orchestrator/tools/builtin.mjs +0 -503
  653. package/src/agent/orchestrator/tools/code-graph-tool-defs.mjs +0 -24
  654. package/src/agent/orchestrator/tools/code-graph.mjs +0 -4095
  655. package/src/agent/orchestrator/tools/cwd-tool.mjs +0 -298
  656. package/src/agent/orchestrator/tools/destructive-warning.mjs +0 -323
  657. package/src/agent/orchestrator/tools/edit-normalize.mjs +0 -603
  658. package/src/agent/orchestrator/tools/graph-binary-fetcher.mjs +0 -154
  659. package/src/agent/orchestrator/tools/graph-manifest.json +0 -26
  660. package/src/agent/orchestrator/tools/host-input.mjs +0 -204
  661. package/src/agent/orchestrator/tools/patch-binary-fetcher.mjs +0 -143
  662. package/src/agent/orchestrator/tools/patch-manifest.json +0 -26
  663. package/src/agent/orchestrator/tools/patch-tool-defs.mjs +0 -20
  664. package/src/agent/orchestrator/tools/patch.mjs +0 -2754
  665. package/src/agent/orchestrator/tools/progress-message.mjs +0 -118
  666. package/src/agent/orchestrator/tools/shell-command.mjs +0 -865
  667. package/src/agent/orchestrator/tools/shell-policy-imports.mjs +0 -7
  668. package/src/agent/orchestrator/tools/shell-snapshot.mjs +0 -313
  669. package/src/agent/orchestrator/workflow-store.mjs +0 -93
  670. package/src/agent/tool-defs.mjs +0 -110
  671. package/src/channels/backends/discord.mjs +0 -784
  672. package/src/channels/data/voice-runtime-manifest.json +0 -138
  673. package/src/channels/index.mjs +0 -3268
  674. package/src/channels/lib/config.mjs +0 -292
  675. package/src/channels/lib/drop-trace.mjs +0 -71
  676. package/src/channels/lib/event-pipeline.mjs +0 -81
  677. package/src/channels/lib/holidays.mjs +0 -138
  678. package/src/channels/lib/hook-pipe-server.mjs +0 -822
  679. package/src/channels/lib/output-forwarder.mjs +0 -765
  680. package/src/channels/lib/runtime-paths.mjs +0 -552
  681. package/src/channels/lib/scheduler.mjs +0 -723
  682. package/src/channels/lib/session-discovery.mjs +0 -103
  683. package/src/channels/lib/state-file.mjs +0 -68
  684. package/src/channels/lib/status-snapshot.mjs +0 -219
  685. package/src/channels/lib/tool-format.mjs +0 -140
  686. package/src/channels/lib/transcript-discovery.mjs +0 -195
  687. package/src/channels/lib/voice-runtime-fetcher.mjs +0 -734
  688. package/src/channels/lib/webhook.mjs +0 -1318
  689. package/src/channels/tool-defs.mjs +0 -170
  690. package/src/daemon/host.mjs +0 -118
  691. package/src/daemon/mcp-transport.mjs +0 -47
  692. package/src/daemon/session.mjs +0 -100
  693. package/src/daemon/thin-client.mjs +0 -71
  694. package/src/daemon/transport.mjs +0 -163
  695. package/src/gateway/claude-current.mjs +0 -255
  696. package/src/gateway/oauth-usage.mjs +0 -598
  697. package/src/gateway/route-meta.mjs +0 -629
  698. package/src/gateway/server.mjs +0 -713
  699. package/src/memory/data/runtime-manifest.json +0 -40
  700. package/src/memory/index.mjs +0 -3332
  701. package/src/memory/lib/core-memory-store.mjs +0 -330
  702. package/src/memory/lib/embedding-provider.mjs +0 -269
  703. package/src/memory/lib/embedding-worker.mjs +0 -323
  704. package/src/memory/lib/memory-cycle1.mjs +0 -645
  705. package/src/memory/lib/memory-cycle2.mjs +0 -1284
  706. package/src/memory/lib/memory-cycle3.mjs +0 -540
  707. package/src/memory/lib/memory-embed.mjs +0 -299
  708. package/src/memory/lib/memory-ops-policy.mjs +0 -190
  709. package/src/memory/lib/memory-recall-store.mjs +0 -638
  710. package/src/memory/lib/memory.mjs +0 -412
  711. package/src/memory/lib/pg/adapter.mjs +0 -308
  712. package/src/memory/lib/pg/process.mjs +0 -360
  713. package/src/memory/lib/pg/supervisor.mjs +0 -396
  714. package/src/memory/lib/runtime-fetcher.mjs +0 -458
  715. package/src/memory/lib/trace-store.mjs +0 -728
  716. package/src/memory/tool-defs.mjs +0 -79
  717. package/src/search/index.mjs +0 -1173
  718. package/src/search/lib/backends/anthropic-oauth.mjs +0 -98
  719. package/src/search/lib/backends/exa.mjs +0 -50
  720. package/src/search/lib/backends/firecrawl.mjs +0 -61
  721. package/src/search/lib/backends/gemini-api.mjs +0 -83
  722. package/src/search/lib/backends/grok-oauth.mjs +0 -86
  723. package/src/search/lib/backends/index.mjs +0 -150
  724. package/src/search/lib/backends/openai-api.mjs +0 -144
  725. package/src/search/lib/backends/openai-oauth.mjs +0 -102
  726. package/src/search/lib/backends/openai-web-search.mjs +0 -76
  727. package/src/search/lib/backends/tavily.mjs +0 -55
  728. package/src/search/lib/backends/xai-api.mjs +0 -113
  729. package/src/search/lib/config.mjs +0 -192
  730. package/src/search/lib/provider-usage.mjs +0 -67
  731. package/src/search/lib/providers.mjs +0 -47
  732. package/src/search/lib/search-intent.mjs +0 -109
  733. package/src/search/lib/setup-handler.mjs +0 -261
  734. package/src/search/lib/web-tools.mjs +0 -1219
  735. package/src/search/tool-defs.mjs +0 -83
  736. package/src/setup/defender-exclusion.mjs +0 -183
  737. package/src/shared/atomic-file.mjs +0 -436
  738. package/src/shared/config.mjs +0 -372
  739. package/src/shared/daemon-recycle.mjs +0 -108
  740. package/src/shared/disable-claude-builtins.mjs +0 -91
  741. package/src/shared/err-text.mjs +0 -12
  742. package/src/shared/llm/http-agent.mjs +0 -123
  743. package/src/shared/open-url.mjs +0 -62
  744. package/src/shared/plugin-paths.mjs +0 -58
  745. package/src/shared/schedules-store.mjs +0 -70
  746. package/src/shared/seed.mjs +0 -161
  747. package/src/shared/user-cwd.mjs +0 -225
  748. package/src/shared/user-data-guard.mjs +0 -244
  749. package/src/status/aggregator.mjs +0 -584
  750. package/src/status/server.mjs +0 -413
  751. package/tools.json +0 -1671
  752. /package/{defaults → src/defaults}/cycle3-review-prompt.md +0 -0
  753. /package/{defaults → src/defaults}/memory-promote-prompt.md +0 -0
  754. /package/{hooks → src/hooks}/lib/permission-rules.cjs +0 -0
  755. /package/{lib → src/lib}/config-cjs.cjs +0 -0
  756. /package/{lib → src/lib}/hook-pipe-path.cjs +0 -0
  757. /package/{lib → src/lib}/mixdog-debug.cjs +0 -0
  758. /package/{lib → src/lib}/text-utils.cjs +0 -0
  759. /package/{rules → src/rules}/bridge/42-cycle3-agent.md +0 -0
  760. /package/src/{agent → runtime/agent}/orchestrator/activity-bus.mjs +0 -0
  761. /package/src/{agent → runtime/agent}/orchestrator/providers/anthropic-betas.mjs +0 -0
  762. /package/src/{agent → runtime/agent}/orchestrator/session/abort-lookup.mjs +0 -0
  763. /package/src/{agent → runtime/agent}/orchestrator/session/cache/post-edit-marks.mjs +0 -0
  764. /package/src/{agent → runtime/agent}/orchestrator/session/cache/scoped-cache-outcome.mjs +0 -0
  765. /package/src/{agent → runtime/agent}/orchestrator/session/cache/util.mjs +0 -0
  766. /package/src/{agent → runtime/agent}/orchestrator/session/read-dedup.mjs +0 -0
  767. /package/src/{agent → runtime/agent}/orchestrator/session/save-session-worker.mjs +0 -0
  768. /package/src/{agent → runtime/agent}/orchestrator/smart-bridge/session-builder.mjs +0 -0
  769. /package/src/{agent → runtime/agent}/orchestrator/tools/bash-policy-scan.mjs +0 -0
  770. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/advisory-lock.mjs +0 -0
  771. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/atomic-write.mjs +0 -0
  772. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/binary-file.mjs +0 -0
  773. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/cache-layers.mjs +0 -0
  774. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/cwd-utils.mjs +0 -0
  775. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/device-paths.mjs +0 -0
  776. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/diagnostics-tool.mjs +0 -0
  777. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/diff-utils.mjs +0 -0
  778. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/fs-reachability.mjs +0 -0
  779. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/grep-formatting.mjs +0 -0
  780. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/hash-utils.mjs +0 -0
  781. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/list-formatting.mjs +0 -0
  782. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/open-config-tool.mjs +0 -0
  783. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/path-locks.mjs +0 -0
  784. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/path-utils.mjs +0 -0
  785. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-args.mjs +0 -0
  786. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-batch.mjs +0 -0
  787. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-constants.mjs +0 -0
  788. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-image-resize.mjs +0 -0
  789. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-image.mjs +0 -0
  790. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-lines.mjs +0 -0
  791. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-mode-tool.mjs +0 -0
  792. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-range-index.mjs +0 -0
  793. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-ranges.mjs +0 -0
  794. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-special-files.mjs +0 -0
  795. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-tool.mjs +0 -0
  796. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-windows.mjs +0 -0
  797. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/shell-analysis.mjs +0 -0
  798. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/shell-output.mjs +0 -0
  799. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/snapshot-helpers.mjs +0 -0
  800. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/snapshot-validation.mjs +0 -0
  801. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/text-stats.mjs +0 -0
  802. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/windows-roots.mjs +0 -0
  803. /package/src/{agent → runtime/agent}/orchestrator/tools/code-graph-prewarm-worker.mjs +0 -0
  804. /package/src/{agent → runtime/agent}/orchestrator/tools/env-scrub.mjs +0 -0
  805. /package/src/{agent → runtime/agent}/orchestrator/tools/mutation-content-cache.mjs +0 -0
  806. /package/src/{agent → runtime/agent}/orchestrator/tools/mutation-planner.mjs +0 -0
  807. /package/src/{agent → runtime/agent}/orchestrator/tools/next-call-utils.mjs +0 -0
  808. /package/src/{agent → runtime/agent}/orchestrator/tools/result-compression.mjs +0 -0
  809. /package/src/{agent → runtime/agent}/orchestrator/tools/shell-exec-policy.mjs +0 -0
  810. /package/src/{agent → runtime/agent}/orchestrator/tools/shell-policy-danger-target.mjs +0 -0
  811. /package/src/{agent → runtime/agent}/orchestrator/tools/shell-policy.mjs +0 -0
  812. /package/src/{channels → runtime/channels}/lib/cli-worker-host.mjs +0 -0
  813. /package/src/{channels → runtime/channels}/lib/config-lock.mjs +0 -0
  814. /package/src/{channels → runtime/channels}/lib/event-queue.mjs +0 -0
  815. /package/src/{channels → runtime/channels}/lib/executor.mjs +0 -0
  816. /package/src/{channels → runtime/channels}/lib/format.mjs +0 -0
  817. /package/src/{channels → runtime/channels}/lib/interaction-workflows.mjs +0 -0
  818. /package/src/{channels → runtime/channels}/lib/memory-client.mjs +0 -0
  819. /package/src/{channels → runtime/channels}/lib/session-control.mjs +0 -0
  820. /package/src/{channels → runtime/channels}/lib/settings.mjs +0 -0
  821. /package/src/{channels → runtime/channels}/lib/whisper-server.mjs +0 -0
  822. /package/src/{memory → runtime/memory}/lib/agent-ipc.mjs +0 -0
  823. /package/src/{memory → runtime/memory}/lib/bridge-trace-queries.mjs +0 -0
  824. /package/src/{memory → runtime/memory}/lib/llm-worker-host.mjs +0 -0
  825. /package/src/{memory → runtime/memory}/lib/memory-cycle.mjs +0 -0
  826. /package/src/{memory → runtime/memory}/lib/memory-extraction.mjs +0 -0
  827. /package/src/{memory → runtime/memory}/lib/memory-maintenance-store.mjs +0 -0
  828. /package/src/{memory → runtime/memory}/lib/memory-recall-id-patch.mjs +0 -0
  829. /package/src/{memory → runtime/memory}/lib/memory-recall-read-query.mjs +0 -0
  830. /package/src/{memory → runtime/memory}/lib/memory-recall-scope-filter.mjs +0 -0
  831. /package/src/{memory → runtime/memory}/lib/memory-retrievers.mjs +0 -0
  832. /package/src/{memory → runtime/memory}/lib/memory-score.mjs +0 -0
  833. /package/src/{memory → runtime/memory}/lib/memory-text-utils.mjs +0 -0
  834. /package/src/{memory → runtime/memory}/lib/model-profile.mjs +0 -0
  835. /package/src/{memory → runtime/memory}/lib/project-id-resolver.mjs +0 -0
  836. /package/src/{search → runtime/search}/lib/cache.mjs +0 -0
  837. /package/src/{search → runtime/search}/lib/formatter.mjs +0 -0
  838. /package/src/{search → runtime/search}/lib/state.mjs +0 -0
  839. /package/src/{shared → runtime/shared}/abort-controller.mjs +0 -0
  840. /package/src/{shared → runtime/shared}/llm/cost.mjs +0 -0
  841. /package/src/{shared → runtime/shared}/llm/index.mjs +0 -0
  842. /package/src/{shared → runtime/shared}/llm/pid-cleanup.mjs +0 -0
  843. /package/src/{shared → runtime/shared}/llm/usage-log.mjs +0 -0
  844. /package/src/{shared → runtime/shared}/wsl.mjs +0 -0
@@ -1,713 +0,0 @@
1
- /**
2
- * mixdog — Anthropic-compatible local gateway.
3
- *
4
- * A loopback-only HTTP server that speaks the Anthropic Messages API
5
- * (`POST /v1/messages`) so an external Claude Code can point
6
- * ANTHROPIC_BASE_URL at it and have its MAIN model routed to ANY mixdog
7
- * provider via the unified provider registry:
8
- *
9
- * Anthropic /v1/messages request
10
- * → toCommon() messages
11
- * → getProvider(name).send(messages, model, tools, opts)
12
- * → Anthropic JSON (non-stream) OR Anthropic SSE (stream)
13
- *
14
- * The SSE sequence (message_start → content_block_start →
15
- * content_block_delta{text_delta} → content_block_stop → message_delta →
16
- * message_stop) is the exact shape parseSSEStream() in
17
- * src/agent/orchestrator/providers/anthropic-oauth.mjs consumes.
18
- *
19
- * send() returns { content, toolCalls, stopReason, usage }; onStreamDelta
20
- * is heartbeat-only (no token text) today, so streaming is a PSEUDO-stream:
21
- * the full reply is assembled, then chunked back out as SSE. tool_use is
22
- * fully mapped (request tools → send(); toolCalls → tool_use blocks /
23
- * input_json_delta SSE). Real token-level streaming is a LATER step.
24
- *
25
- * Two ways to run:
26
- * 1. Imported: `startGatewayServer({ provider, model, port, log })` —
27
- * kept as a named export for tests / ad-hoc in-process hosting.
28
- * 2. Forked directly via `fork('src/gateway/server.mjs')` — config is
29
- * read from the agent config + MIXDOG_GATEWAY_* env. The parent kills
30
- * this process at shutdown.
31
- *
32
- * Module is OFF by default (modules.gateway.enabled !== true) so existing
33
- * installs are unaffected.
34
- */
35
-
36
- import http from 'http';
37
- import os from 'os';
38
- import path from 'path';
39
- import { pathToFileURL } from 'url';
40
- import { readSection } from '../shared/config.mjs';
41
- import { updateJsonAtomicSync } from '../shared/atomic-file.mjs';
42
- import { isInclusiveProvider } from '../shared/llm/cost.mjs';
43
- import {
44
- buildGatewayLimits,
45
- gatewayAdvertFields,
46
- gatewaySendOptions,
47
- prepareGatewayMessages,
48
- readGatewayRouteInfo,
49
- recordGatewayUsageEvent,
50
- summarizeGatewayUsage,
51
- } from './route-meta.mjs';
52
- import {
53
- fetchOAuthUsageSnapshot,
54
- readCachedOAuthUsageSnapshot,
55
- } from './oauth-usage.mjs';
56
- import {
57
- CLAUDE_CURRENT_MODE,
58
- readClaudeCodeCurrentRoute,
59
- } from './claude-current.mjs';
60
-
61
- // Fixed default port so an external Claude Code's ANTHROPIC_BASE_URL can be
62
- // a stable URL. Overridable via env (MIXDOG_GATEWAY_PORT) or config
63
- // (gateway.port). Kept off the ephemeral-port path the status server uses —
64
- // that server is discovered via an advert file, whereas this one is typed
65
- // into a client env var. 3468 sits just ABOVE the channels proxy range
66
- // (PROXY_PORT_MIN=3460 / PROXY_PORT_MAX=3467 in src/channels/index.mjs) and
67
- // clear of setup's 3458, so the default never collides.
68
- export const DEFAULT_GATEWAY_PORT = 3468;
69
- const GATEWAY_HOST = '127.0.0.1';
70
-
71
- const RUNTIME_ROOT = process.env.MIXDOG_RUNTIME_ROOT
72
- ? path.resolve(process.env.MIXDOG_RUNTIME_ROOT)
73
- : path.join(os.tmpdir(), 'mixdog');
74
- const ACTIVE_INSTANCE_FILE = path.join(RUNTIME_ROOT, 'active-instance.json');
75
-
76
- function parsePositivePid(value) {
77
- const pid = Number(value);
78
- return Number.isFinite(pid) && pid > 0 ? pid : null;
79
- }
80
-
81
- // process.kill(pid, 0) probes existence without delivering a signal: it
82
- // throws ESRCH for a dead pid and EPERM for a live one we can't signal
83
- // (so EPERM counts as alive). Mirrors _isPidAliveLocal in src/memory/index.mjs.
84
- function isPidAlive(pid) {
85
- const n = parsePositivePid(pid);
86
- if (!n) return false;
87
- try { process.kill(n, 0); return true; }
88
- catch (err) { return err && err.code === 'EPERM'; }
89
- }
90
-
91
- const GATEWAY_SERVER_PID = parsePositivePid(process.pid);
92
-
93
- // ── Config ───────────────────────────────────────────────────────────
94
- // Mirrors how src/agent/orchestrator/config.mjs reads provider config:
95
- // read a top-level section from mixdog-config.json (readSection returns {}
96
- // when absent / malformed) and overlay env. Every field is optional and
97
- // resolves to a safe, disabled-friendly default so an enabled-but-unconfigured
98
- // module is a no-op (refuses to route) rather than a crash.
99
- //
100
- // gateway.defaultProvider → routing target provider name (registry key)
101
- // gateway.defaultModel → model id passed to provider.send()
102
- // gateway.port → listen port (default 3468)
103
- //
104
- // Env overrides take precedence so a launch script / step-4 setup can pin
105
- // values without touching config:
106
- // MIXDOG_GATEWAY_PROVIDER, MIXDOG_GATEWAY_MODEL, MIXDOG_GATEWAY_PORT
107
- export function readGatewayConfig() {
108
- let section = {};
109
- try { section = readSection('gateway') || {}; } catch { section = {}; }
110
- const mode = (typeof section.mode === 'string' ? section.mode.trim() : '') || null;
111
- const inherited = mode === CLAUDE_CURRENT_MODE ? readClaudeCodeCurrentRoute() : null;
112
- const provider = process.env.MIXDOG_GATEWAY_PROVIDER
113
- || (inherited?.provider || '')
114
- || (typeof section.defaultProvider === 'string' ? section.defaultProvider : '')
115
- || null;
116
- const model = process.env.MIXDOG_GATEWAY_MODEL
117
- || (inherited?.model || '')
118
- || (typeof section.defaultModel === 'string' ? section.defaultModel : '')
119
- || null;
120
- const portRaw = process.env.MIXDOG_GATEWAY_PORT || section.port;
121
- const portNum = Number(portRaw);
122
- const port = Number.isFinite(portNum) && portNum > 0 ? portNum : DEFAULT_GATEWAY_PORT;
123
- return { provider, model, port, mode };
124
- }
125
-
126
- // ── Anthropic <-> common message conversion ──────────────────────────
127
- // The common shape consumed by provider.send() (see toOpenAIMessages in
128
- // providers/openai-compat.mjs and toAnthropicMessages in anthropic.mjs /
129
- // anthropic-oauth.mjs):
130
- // • plain turn → { role, content } (content is a string)
131
- // • assistant w/ tools → { role:'assistant', content, toolCalls:[{id,name,arguments}] }
132
- // • tool result → { role:'tool', toolCallId, content }
133
- // Anthropic packs tool_result blocks inside a USER message and tool_use blocks
134
- // inside an ASSISTANT message; we unpack both into the per-turn common shape.
135
-
136
- // Anthropic tool_result.content is either a string or an array of content
137
- // blocks ({type:'text',text}, images, …). Collapse to text — the common
138
- // `tool` message carries a string body.
139
- function toolResultText(content) {
140
- if (typeof content === 'string') return content;
141
- if (Array.isArray(content)) {
142
- return content.map(b => (b && b.type === 'text' ? (b.text || '') : '')).join('');
143
- }
144
- return '';
145
- }
146
-
147
- // Join the text blocks of an Anthropic content array into a single string.
148
- function textBlocksToString(blocks) {
149
- return blocks.map(b => (b && b.type === 'text' ? (b.text || '') : '')).join('');
150
- }
151
-
152
- function toCommon(body) {
153
- const out = [];
154
- if (body.system) {
155
- out.push({
156
- role: 'system',
157
- content: typeof body.system === 'string'
158
- ? body.system
159
- : (body.system || []).map(b => b.text || '').join('\n'),
160
- });
161
- }
162
- for (const m of body.messages || []) {
163
- // String content: pass straight through as a plain turn.
164
- if (typeof m.content === 'string') {
165
- out.push({ role: m.role, content: m.content });
166
- continue;
167
- }
168
- if (!Array.isArray(m.content)) {
169
- out.push({ role: m.role, content: '' });
170
- continue;
171
- }
172
- if (m.role === 'assistant') {
173
- // Collapse text blocks; lift tool_use blocks into toolCalls. send()
174
- // expects toolCalls[].arguments as a PARSED object (block.input already is).
175
- const text = textBlocksToString(m.content);
176
- const toolCalls = m.content
177
- .filter(b => b && b.type === 'tool_use')
178
- .map(b => ({ id: b.id || '', name: b.name || '', arguments: b.input ?? {} }));
179
- out.push({
180
- role: 'assistant',
181
- content: text,
182
- ...(toolCalls.length ? { toolCalls } : {}),
183
- });
184
- continue;
185
- }
186
- // role === 'user' (or anything else with array content): emit each
187
- // tool_result block as its own common `tool` message (provider formats
188
- // demand a distinct role:'tool'/tool_result entry per result), then a
189
- // user text message for any remaining text blocks.
190
- const toolResults = m.content.filter(b => b && b.type === 'tool_result');
191
- for (const b of toolResults) {
192
- out.push({ role: 'tool', toolCallId: b.tool_use_id || '', content: toolResultText(b.content) });
193
- }
194
- const text = textBlocksToString(m.content);
195
- if (text || toolResults.length === 0) {
196
- out.push({ role: m.role, content: text });
197
- }
198
- }
199
- return out;
200
- }
201
-
202
- // Anthropic tool DEFINITIONS ({name, description, input_schema}) → the common
203
- // tools shape send() expects ({name, description, inputSchema}); the provider
204
- // then re-maps via toOpenAITools / toAnthropicTools. Skips client-side tools
205
- // without a name. Returns undefined when there are no usable tools so send()
206
- // gets `undefined` (its no-tools sentinel), unchanged from step 1.
207
- function toCommonTools(tools) {
208
- if (!Array.isArray(tools) || tools.length === 0) return undefined;
209
- const mapped = tools
210
- .filter(t => t && typeof t.name === 'string' && t.name)
211
- .map(t => ({
212
- name: t.name,
213
- description: typeof t.description === 'string' ? t.description : '',
214
- inputSchema: t.input_schema ?? t.inputSchema ?? { type: 'object', properties: {} },
215
- }));
216
- return mapped.length ? mapped : undefined;
217
- }
218
-
219
- // mixdog stopReason → Anthropic stop_reason.
220
- const STOP = { stop: 'end_turn', length: 'max_tokens', tool_calls: 'tool_use' };
221
-
222
- const sse = (res, ev, data) => res.write(`event: ${ev}\ndata: ${JSON.stringify(data)}\n\n`);
223
-
224
- function anthropicUsageFromProviderUsage(provider, usage = {}, outputOverride = null) {
225
- const input = Number(usage?.inputTokens || 0) || 0;
226
- const output = Number(outputOverride ?? usage?.outputTokens ?? 0) || 0;
227
- const cacheRead = Number(usage?.cachedTokens ?? usage?.cacheReadTokens ?? 0) || 0;
228
- const cacheWrite = Number(usage?.cacheWriteTokens || 0) || 0;
229
- // Gateway responses speak Anthropic usage semantics. OpenAI/Codex/Gemini
230
- // report input as an inclusive prompt total, so subtract cache slots before
231
- // exposing cache_read/cache_creation; otherwise Claude-side context math
232
- // would double-count cached tokens.
233
- const inputTokens = isInclusiveProvider(provider)
234
- ? Math.max(input - cacheRead - cacheWrite, 0)
235
- : input;
236
- return {
237
- input_tokens: inputTokens,
238
- output_tokens: output,
239
- cache_read_input_tokens: cacheRead,
240
- cache_creation_input_tokens: cacheWrite,
241
- };
242
- }
243
-
244
- function readBody(req) {
245
- return new Promise((resolve, reject) => {
246
- let b = '';
247
- let overflow = false;
248
- // Cap request body. Claude Code conversation payloads can be large
249
- // (full context window), so allow a generous 32 MiB before aborting.
250
- const MAX_BODY_BYTES = 32 * 1024 * 1024;
251
- req.on('data', (c) => {
252
- if (overflow) return;
253
- b += c;
254
- if (b.length > MAX_BODY_BYTES) { overflow = true; reject(new Error('request body too large')); req.destroy(); }
255
- });
256
- req.on('end', () => { if (!overflow) resolve(b); });
257
- req.on('error', reject);
258
- });
259
- }
260
-
261
- // ── Per-request routing resolution (runtime model switching) ─────────
262
- // The routing target (provider + model) is re-read from config on each
263
- // /v1/messages request so editing gateway.defaultProvider / defaultModel
264
- // takes effect on the NEXT request WITHOUT restarting the gateway. A short
265
- // in-process TTL cache avoids hitting disk on every request under load.
266
- // MIXDOG_GATEWAY_PROVIDER / MIXDOG_GATEWAY_MODEL env still win (the pin is
267
- // applied inside readGatewayConfig). `seed` is the start-time routing, used
268
- // only as a fallback when a live re-read throws (transient FS error).
269
- const ROUTING_CACHE_TTL_MS = 1500;
270
- let _routingCache = null;
271
- let _routingCacheAt = 0;
272
- function getRoutingCached(seed, log = () => {}) {
273
- const now = Date.now();
274
- if (_routingCache && (now - _routingCacheAt) < ROUTING_CACHE_TTL_MS) return _routingCache;
275
- let routing;
276
- try {
277
- const { provider, model, mode } = readGatewayConfig();
278
- routing = { provider, model, mode };
279
- } catch (e) {
280
- log(`routing re-read failed, keeping previous: ${e?.message || e}`);
281
- routing = _routingCache || { provider: seed?.provider ?? null, model: seed?.model ?? null, mode: seed?.mode ?? null };
282
- }
283
- _routingCache = routing;
284
- _routingCacheAt = now;
285
- return routing;
286
- }
287
-
288
- // Lazy provider init: if the routing target isn't registered in THIS process
289
- // yet (e.g. the user just switched to a provider that wasn't enabled at start),
290
- // re-run initProviders from the current agent config — which overlays keychain
291
- // keys and registers every enabled provider — then resolve again. A per-name
292
- // cooldown bounds repeated initProviders calls for a genuinely missing /
293
- // misconfigured provider so an invalid target can't thrash disk every request.
294
- const INIT_RETRY_COOLDOWN_MS = 2000;
295
- let _lastInitMissKey = null;
296
- let _lastInitMissAt = 0;
297
- async function ensureProviderInited(name, { getProviderFn, initProvidersFn, loadConfigFn, log = () => {} }) {
298
- if (!name) return null;
299
- let p = getProviderFn(name);
300
- if (p) return p;
301
- // Cooldown: don't re-init for the same missing provider within the window.
302
- const now = Date.now();
303
- if (_lastInitMissKey === name && (now - _lastInitMissAt) < INIT_RETRY_COOLDOWN_MS) {
304
- return null;
305
- }
306
- try {
307
- const config = loadConfigFn();
308
- await initProvidersFn(config.providers);
309
- p = getProviderFn(name);
310
- } catch (e) {
311
- log(`lazy provider init failed for "${name}": ${e?.message || e}`);
312
- p = null;
313
- }
314
- if (!p) { _lastInitMissKey = name; _lastInitMissAt = now; }
315
- return p;
316
- }
317
-
318
- // ── Server ───────────────────────────────────────────────────────────
319
- // `resolveRouting` (per-request { provider, model }) and `ensureProvider`
320
- // (lazy registry resolver) are injected so this handler stays testable
321
- // without the registry.
322
- function makeRequestHandler({ resolveRouting, ensureProvider, log }) {
323
- return async (req, res) => {
324
- // Loopback-only — belt-and-braces on top of binding to 127.0.0.1.
325
- const remote = req.socket?.remoteAddress || '';
326
- const isLoopback = remote === '127.0.0.1' || remote === '::1' || remote === '::ffff:127.0.0.1';
327
- if (!isLoopback) {
328
- res.writeHead(403, { 'Content-Type': 'application/json' });
329
- res.end(JSON.stringify({ type: 'error', error: { type: 'permission_error', message: 'forbidden' } }));
330
- return;
331
- }
332
- try {
333
- // count_tokens: cheap char/4 estimate (no model round-trip). Must be
334
- // matched BEFORE the bare /v1/messages prefix.
335
- if (req.method === 'POST' && req.url.startsWith('/v1/messages/count_tokens')) {
336
- const parsed = JSON.parse((await readBody(req)) || '{}');
337
- const text = JSON.stringify(parsed.messages || [])
338
- + (typeof parsed.system === 'string' ? parsed.system : '');
339
- res.writeHead(200, { 'Content-Type': 'application/json' });
340
- res.end(JSON.stringify({ input_tokens: Math.ceil(text.length / 4) }));
341
- return;
342
- }
343
- if (req.method === 'POST' && req.url.startsWith('/v1/messages')) {
344
- // Re-read routing per request (runtime model switching) and lazily
345
- // init the selected provider if it wasn't registered at start.
346
- const routing = resolveRouting();
347
- if (!routing.provider) {
348
- res.writeHead(503, { 'Content-Type': 'application/json' });
349
- res.end(JSON.stringify({ type: 'error', error: { type: 'api_error', message: `gateway not configured (provider=${routing.provider || 'none'} model=${routing.model || 'none'})` } }));
350
- return;
351
- }
352
- const provider = await ensureProvider(routing.provider);
353
- if (!provider) {
354
- res.writeHead(503, { 'Content-Type': 'application/json' });
355
- res.end(JSON.stringify({ type: 'error', error: { type: 'api_error', message: `gateway provider "${routing.provider}" not found or not enabled` } }));
356
- return;
357
- }
358
- const parsed = JSON.parse((await readBody(req)) || '{}');
359
- const requestRouting = routing.mode === CLAUDE_CURRENT_MODE
360
- ? { ...routing, ...readClaudeCodeCurrentRoute({ request: parsed }) }
361
- : routing;
362
- if (!requestRouting.provider || !requestRouting.model) {
363
- res.writeHead(503, { 'Content-Type': 'application/json' });
364
- res.end(JSON.stringify({ type: 'error', error: { type: 'api_error', message: `gateway not configured (provider=${requestRouting.provider || 'none'} model=${requestRouting.model || 'none'})` } }));
365
- return;
366
- }
367
- const routeInfo = readGatewayRouteInfo(requestRouting, provider);
368
- const messages = toCommon(parsed);
369
- const sendTools = toCommonTools(parsed.tools);
370
- const prepared = prepareGatewayMessages(messages, sendTools, routeInfo, log);
371
- const usageSnapshotP = fetchOAuthUsageSnapshot(routeInfo, provider, log).catch(() => null);
372
- if (prepared.trim?.overflow === true) {
373
- updateGatewayAdvert(
374
- routeInfo,
375
- {
376
- at: Date.now(),
377
- provider: routeInfo.provider,
378
- model: routeInfo.model,
379
- responseModel: routeInfo.model,
380
- inputTokens: 0,
381
- outputTokens: 0,
382
- cacheReadTokens: 0,
383
- cacheWriteTokens: 0,
384
- promptTokens: prepared.trim.beforeTokens || 0,
385
- costUsd: 0,
386
- costSource: 'none',
387
- contextUsedPct: routeInfo.contextWindow ? Math.round((prepared.trim.beforeTokens || 0) * 10000 / routeInfo.contextWindow) / 100 : null,
388
- trim: prepared.trim,
389
- durationMs: 0,
390
- rawUsageKeys: [],
391
- },
392
- null,
393
- log,
394
- );
395
- res.writeHead(413, { 'Content-Type': 'application/json' });
396
- res.end(JSON.stringify({
397
- type: 'error',
398
- error: {
399
- type: 'invalid_request_error',
400
- message: `gateway target context overflow for ${routeInfo.provider}/${routeInfo.model}: estimated ${prepared.trim.beforeTokens} tokens exceeds safe budget ${prepared.trim.budgetTokens}`,
401
- },
402
- }));
403
- return;
404
- }
405
- const wantStream = parsed.stream === true;
406
- const id = 'msg_' + Date.now().toString(36);
407
- const startedAt = Date.now();
408
- const out = await provider.send(prepared.messages, routeInfo.model || routing.model, sendTools, gatewaySendOptions(routeInfo));
409
- const responseModel = out.model || routeInfo.model || routing.model;
410
- const textOut = out.content || '';
411
- // send() returns toolCalls as [{ id, name, arguments }] (arguments is
412
- // a PARSED object — see parseToolCalls in openai-compat.mjs and the
413
- // tool_use assembly in anthropic-oauth.mjs parseSSEStream). Map each
414
- // into an Anthropic tool_use block ({ type, id, name, input }).
415
- const toolCalls = Array.isArray(out.toolCalls) ? out.toolCalls : [];
416
- // If the model emitted tool calls but the provider didn't flag the
417
- // stop reason as tool_calls, force tool_use so the client knows to run
418
- // them and continue the turn.
419
- const stop = toolCalls.length ? 'tool_use' : (STOP[out.stopReason] || 'end_turn');
420
- const usage = anthropicUsageFromProviderUsage(routeInfo.provider, out.usage);
421
- const usageSummary = summarizeGatewayUsage(routeInfo, out, prepared.trim, Date.now() - startedAt);
422
- recordGatewayUsageEvent(usageSummary);
423
- const usageSnapshot = await usageSnapshotP;
424
- const limits = buildGatewayLimits(routeInfo, out, usageSnapshot);
425
- updateGatewayAdvert(routeInfo, usageSummary, limits, log);
426
- log(`route -> ${routeInfo.provider}/${routeInfo.model} ${textOut.length}chars tools=${sendTools ? sendTools.length : 0} toolCalls=${toolCalls.length} stream=${wantStream} model=${responseModel}`);
427
- const routeHeaders = {
428
- 'x-mixdog-provider': routeInfo.provider || '',
429
- 'x-mixdog-model': routeInfo.model || '',
430
- };
431
- if (!wantStream) {
432
- // content = optional leading text block, then one tool_use block per call.
433
- const content = [];
434
- if (textOut) content.push({ type: 'text', text: textOut });
435
- for (const tc of toolCalls) {
436
- content.push({ type: 'tool_use', id: tc.id, name: tc.name, input: tc.arguments ?? {} });
437
- }
438
- if (content.length === 0) content.push({ type: 'text', text: '' });
439
- res.writeHead(200, { 'Content-Type': 'application/json', ...routeHeaders });
440
- res.end(JSON.stringify({
441
- id, type: 'message', role: 'assistant',
442
- model: responseModel,
443
- content,
444
- stop_reason: stop, stop_sequence: null, usage,
445
- }));
446
- return;
447
- }
448
- // Pseudo-stream: assembled reply chunked back as Anthropic SSE.
449
- res.writeHead(200, { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive', ...routeHeaders });
450
- sse(res, 'message_start', { type: 'message_start', message: { id, type: 'message', role: 'assistant', model: responseModel, content: [], stop_reason: null, stop_sequence: null, usage: anthropicUsageFromProviderUsage(routeInfo.provider, out.usage, 0) } });
451
- // Block 0: text (always emitted, even when empty, so the index space
452
- // is stable). Chunk the assembled text as text_delta — pseudo-stream.
453
- let blockIndex = 0;
454
- sse(res, 'content_block_start', { type: 'content_block_start', index: blockIndex, content_block: { type: 'text', text: '' } });
455
- const ch = Math.max(1, Math.ceil(textOut.length / 6));
456
- for (let i = 0; i < textOut.length; i += ch) {
457
- sse(res, 'content_block_delta', { type: 'content_block_delta', index: blockIndex, delta: { type: 'text_delta', text: textOut.slice(i, i + ch) } });
458
- }
459
- sse(res, 'content_block_stop', { type: 'content_block_stop', index: blockIndex });
460
- // One tool_use block per call: content_block_start{tool_use} →
461
- // input_json_delta{partial_json:<full json at once>} → content_block_stop.
462
- // This is the reverse of anthropic-oauth.mjs parseSSEStream's tool_use
463
- // assembly (which concatenates input_json_delta into inputJson then
464
- // JSON.parses at content_block_stop).
465
- for (const tc of toolCalls) {
466
- blockIndex += 1;
467
- sse(res, 'content_block_start', { type: 'content_block_start', index: blockIndex, content_block: { type: 'tool_use', id: tc.id, name: tc.name, input: {} } });
468
- sse(res, 'content_block_delta', { type: 'content_block_delta', index: blockIndex, delta: { type: 'input_json_delta', partial_json: JSON.stringify(tc.arguments ?? {}) } });
469
- sse(res, 'content_block_stop', { type: 'content_block_stop', index: blockIndex });
470
- }
471
- sse(res, 'message_delta', { type: 'message_delta', delta: { stop_reason: stop, stop_sequence: null }, usage: { output_tokens: usage.output_tokens } });
472
- sse(res, 'message_stop', { type: 'message_stop' });
473
- res.end();
474
- return;
475
- }
476
- // HEAD / and any other path: best-effort empty JSON so client
477
- // bootstrap probes (models, capabilities, …) don't error out.
478
- await readBody(req).catch(() => {});
479
- res.writeHead(200, { 'Content-Type': 'application/json' });
480
- res.end('{}');
481
- } catch (e) {
482
- log(`ERROR ${e?.message || e}`);
483
- if (!res.headersSent) {
484
- res.writeHead(500, { 'Content-Type': 'application/json' });
485
- res.end(JSON.stringify({ type: 'error', error: { type: 'api_error', message: String(e?.message || e) } }));
486
- } else {
487
- try { res.end(); } catch {}
488
- }
489
- }
490
- };
491
- }
492
-
493
- /**
494
- * Start the gateway HTTP server.
495
- *
496
- * @param {object} opts
497
- * @param {string} opts.provider routing target provider (registry key)
498
- * @param {string} opts.model model id passed to provider.send()
499
- * @param {number} [opts.port] listen port (default 3468)
500
- * @param {string} [opts.host] bind host (default 127.0.0.1)
501
- * @param {function} [opts.getProviderFn] provider resolver (defaults to registry.getProvider)
502
- * @param {function} [opts.initProvidersFn] (re)init registry for lazy provider load (defaults to registry.initProviders)
503
- * @param {function} [opts.loadConfigFn] agent config loader for lazy init (defaults to config.loadConfig)
504
- * @param {function} [opts.log] line logger
505
- * @returns {Promise<{ port:number, close:()=>Promise<void> }>}
506
- */
507
- export async function startGatewayServer({ provider, model, mode = null, port = DEFAULT_GATEWAY_PORT, host = GATEWAY_HOST, getProviderFn, initProvidersFn, loadConfigFn, log = () => {} } = {}) {
508
- // Lazily import the registry/config so import-only consumers (tests) that
509
- // inject their own fns never pull the provider tree in.
510
- if (!getProviderFn || !initProvidersFn || !loadConfigFn) {
511
- const reg = await import('../agent/orchestrator/providers/registry.mjs');
512
- const cfg = await import('../agent/orchestrator/config.mjs');
513
- getProviderFn = getProviderFn || reg.getProvider;
514
- initProvidersFn = initProvidersFn || reg.initProviders;
515
- loadConfigFn = loadConfigFn || cfg.loadConfig;
516
- }
517
- // Seed routing from the start-time args; the handler re-reads config per
518
- // request via getRoutingCached (runtime model switching) and falls back to
519
- // this seed only when a live re-read throws.
520
- const seed = { provider, model, mode };
521
- const resolveRouting = () => getRoutingCached(seed, log);
522
- const ensureProvider = (name) => ensureProviderInited(name, { getProviderFn, initProvidersFn, loadConfigFn, log });
523
- const server = http.createServer(makeRequestHandler({ resolveRouting, ensureProvider, log }));
524
- await new Promise((resolve, reject) => {
525
- server.once('error', reject);
526
- server.listen(port, host, () => { server.removeListener('error', reject); resolve(); });
527
- });
528
- const address = server.address();
529
- const boundPort = typeof address === 'object' && address ? address.port : port;
530
- log(`listening on ${host}:${boundPort} provider=${provider} model=${model}`);
531
- return {
532
- port: boundPort,
533
- close: () => new Promise((resolve) => server.close(() => resolve())),
534
- };
535
- }
536
-
537
- // ── active-instance.json advertisement ───────────────────────────────
538
- // Mirrors advertiseMemoryPort() in src/memory/index.mjs: atomically merge
539
- // gateway_port + gateway_server_pid into the shared active-instance.json so
540
- // hooks / setup / status discovery can find the gateway without a hard-coded
541
- // port. A periodic re-advertise (every 30s) recovers from external file
542
- // truncation, matching the memory worker's behavior.
543
- let _periodicAdvertiseInstalled = false;
544
- let _currentAdvertisedPort = null;
545
- function cleanGatewayFields(cur) {
546
- return Object.fromEntries(
547
- Object.entries(cur || {}).filter(([key]) => !key.startsWith('gateway_'))
548
- );
549
- }
550
-
551
- function currentRouteAdvertFields(boundPort, log = () => {}) {
552
- try {
553
- const routeInfo = readGatewayRouteInfo(readGatewayConfig());
554
- const usageSnapshot = readCachedOAuthUsageSnapshot(routeInfo);
555
- return gatewayAdvertFields(routeInfo, null, buildGatewayLimits(routeInfo, null, usageSnapshot));
556
- } catch (e) {
557
- log(`gateway metadata read failed: ${e?.message || e}`);
558
- return {};
559
- }
560
- }
561
-
562
- function updateGatewayAdvert(routeInfo, usageSummary = null, limits = null, log = () => {}) {
563
- if (!Number.isFinite(_currentAdvertisedPort) || _currentAdvertisedPort <= 0) return;
564
- try {
565
- const fields = gatewayAdvertFields(routeInfo, usageSummary, limits);
566
- updateJsonAtomicSync(ACTIVE_INSTANCE_FILE, (curRaw) => {
567
- const cur = curRaw ?? {};
568
- const curGwPid = parsePositivePid(cur?.gateway_server_pid);
569
- if (curGwPid != null && curGwPid !== GATEWAY_SERVER_PID && isPidAlive(curGwPid)) {
570
- return undefined;
571
- }
572
- return {
573
- ...cur,
574
- gateway_port: _currentAdvertisedPort,
575
- ...(GATEWAY_SERVER_PID ? { gateway_server_pid: GATEWAY_SERVER_PID } : {}),
576
- ...fields,
577
- updatedAt: Date.now(),
578
- };
579
- }, { compact: true, fsyncDir: true });
580
- } catch (e) {
581
- log(`active-instance gateway metadata update failed: ${e?.message || e}`);
582
- }
583
- }
584
-
585
- function advertiseGatewayPort(boundPort, attempt = 0, log = () => {}) {
586
- if (!Number.isFinite(boundPort) || boundPort <= 0) return;
587
- _currentAdvertisedPort = boundPort;
588
- try {
589
- const routeFields = currentRouteAdvertFields(boundPort, log);
590
- updateJsonAtomicSync(ACTIVE_INSTANCE_FILE, (curRaw) => {
591
- const cur = curRaw ?? {};
592
- // Owner guard (symmetric with unadvertiseGatewayPort): if a DIFFERENT
593
- // gateway_server_pid is already advertised AND that process is still
594
- // alive, yield to the live owner rather than clobbering its entry.
595
- // Mirrors the memory_port conflict check in server-main.mjs.
596
- const curGwPort = Number(cur?.gateway_port);
597
- const curGwPid = parsePositivePid(cur?.gateway_server_pid);
598
- const portConflict = Number.isFinite(curGwPort) && curGwPort > 0 && curGwPort !== boundPort;
599
- const otherOwnerAlive = curGwPid != null && curGwPid !== GATEWAY_SERVER_PID && isPidAlive(curGwPid);
600
- if (portConflict && otherOwnerAlive) {
601
- log(`skip gateway_port advertise port=${boundPort} curGwPort=${curGwPort} curGwPid=${curGwPid} gatewayServerPid=${GATEWAY_SERVER_PID || 'none'}`);
602
- return undefined;
603
- }
604
- return {
605
- ...cur,
606
- gateway_port: boundPort,
607
- ...(GATEWAY_SERVER_PID ? { gateway_server_pid: GATEWAY_SERVER_PID } : {}),
608
- ...routeFields,
609
- updatedAt: Date.now(),
610
- };
611
- }, { compact: true, fsyncDir: true });
612
- if (!_periodicAdvertiseInstalled) {
613
- _periodicAdvertiseInstalled = true;
614
- setInterval(() => {
615
- try { if (_currentAdvertisedPort != null) advertiseGatewayPort(_currentAdvertisedPort, 0, log); } catch {}
616
- }, 30_000).unref?.();
617
- }
618
- } catch (e) {
619
- const transient = e?.code === 'EPERM' || e?.code === 'EBUSY' || e?.code === 'EACCES';
620
- if (transient && attempt < 3) {
621
- setTimeout(() => advertiseGatewayPort(boundPort, attempt + 1, log), 50 * (attempt + 1));
622
- return;
623
- }
624
- log(`active-instance gateway_port advertise failed: ${e?.message || e}`);
625
- }
626
- }
627
-
628
- function unadvertiseGatewayPort(log = () => {}) {
629
- try {
630
- updateJsonAtomicSync(ACTIVE_INSTANCE_FILE, (curRaw) => {
631
- const cur = curRaw ?? {};
632
- // Only retract OUR advertisement. A different live gateway owner that
633
- // raced in between must not have its port clobbered to null.
634
- if (parsePositivePid(cur.gateway_server_pid) && parsePositivePid(cur.gateway_server_pid) !== GATEWAY_SERVER_PID) {
635
- return undefined;
636
- }
637
- const rest = cleanGatewayFields(cur);
638
- return { ...rest, updatedAt: Date.now() };
639
- }, { compact: true, fsyncDir: true });
640
- } catch (e) {
641
- log(`active-instance gateway_port retract failed: ${e?.message || e}`);
642
- }
643
- }
644
-
645
- // ── Child-process entry point ─────────────────────────────────────────
646
- // When forked directly (`node src/gateway/server.mjs`), read config from
647
- // the agent config + MIXDOG_GATEWAY_* env, init the provider registry, bind
648
- // the fixed port, and advertise it. Parent signals shutdown via IPC
649
- // disconnect or SIGTERM.
650
- const isMain = import.meta.url === pathToFileURL(process.argv[1] || '').href;
651
- if (isMain) {
652
- const log = (m) => process.stdout.write(`[gateway] ${m}\n`);
653
- const { provider, model, port, mode } = readGatewayConfig();
654
- if (!provider || !model) {
655
- // Enabled-but-unconfigured: no-op. Exit cleanly so the parent does not
656
- // treat it as a crash to respawn forever.
657
- log(`no defaultProvider/defaultModel configured (provider=${provider || 'none'} model=${model || 'none'}) — gateway idle, exiting`);
658
- process.exit(0);
659
- }
660
-
661
- let handle = null;
662
- let shuttingDown = false;
663
- const shutdown = async (reason) => {
664
- if (shuttingDown) return;
665
- shuttingDown = true;
666
- log(`shutdown (${reason})`);
667
- try { unadvertiseGatewayPort(log); } catch {}
668
- try { if (handle) await handle.close(); } catch {}
669
- process.exit(0);
670
- };
671
- process.on('SIGTERM', () => shutdown('SIGTERM'));
672
- process.on('SIGINT', () => shutdown('SIGINT'));
673
- process.on('disconnect', () => shutdown('parent-disconnect'));
674
- process.on('message', (msg) => { if (msg?.type === 'shutdown') shutdown('ipc-shutdown'); });
675
-
676
- try {
677
- // Init the provider registry IN THIS PROCESS — the gateway child is
678
- // separate from the MCP parent where the agent module runs. loadConfig()
679
- // overlays keychain API keys onto the provider config, exactly like the
680
- // agent module's reloadAgentConfig() path.
681
- const { loadConfig } = await import('../agent/orchestrator/config.mjs');
682
- const { initProviders, getProvider } = await import('../agent/orchestrator/providers/registry.mjs');
683
- const config = loadConfig();
684
- await initProviders(config.providers);
685
- if (!getProvider(provider)) {
686
- log(`provider "${provider}" not enabled in agent config — gateway idle, exiting`);
687
- process.exit(0);
688
- }
689
- // Pass the registry/config fns so the handler's per-request routing
690
- // re-read + lazy provider init (runtime model switching) reuse the same
691
- // already-imported singletons rather than re-importing per request.
692
- handle = await startGatewayServer({
693
- provider, model, port, mode,
694
- getProviderFn: getProvider,
695
- initProvidersFn: initProviders,
696
- loadConfigFn: loadConfig,
697
- log,
698
- });
699
- advertiseGatewayPort(handle.port, 0, log);
700
- try { process.send?.({ type: 'gateway_ready', port: handle.port }); } catch {}
701
- } catch (e) {
702
- // First-binder-wins: EADDRINUSE means another server-main already hosts
703
- // the gateway on this port (multi-instance). Yield as idle (exit 0) so the
704
- // parent's exit handler does NOT crash-restart loop. Other listen/init
705
- // errors are real failures → exit 1 (parent restarts with backoff).
706
- if (e && e.code === 'EADDRINUSE') {
707
- log(`port ${port} already in use — another gateway owner is active; idle, exiting`);
708
- process.exit(0);
709
- }
710
- log(`failed to start: ${e && (e.stack || e.message) || e}`);
711
- process.exit(1);
712
- }
713
- }