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,822 +0,0 @@
1
- // Hook IPC daemon — Windows named-pipe server consumed by mixdog-shim.exe.
2
- //
3
- // Replaces the per-spawn cold-start cost of `bun hooks/*.cjs` (≈86ms) with a
4
- // single long-lived listener inside the channels worker. The shim is a tiny
5
- // Rust .exe (~111KB, ~5-10ms cold) that connects, writes one JSON line, reads
6
- // one JSON line back, and exits.
7
- //
8
- // Protocol (line-delimited JSON):
9
- // client → server : <Claude-Code hook payload>\n
10
- // server → client : <decision-json or "null">\n
11
- //
12
- // Each connection is handled independently. Long-running handlers (Discord
13
- // permission polling, up to 2 minutes) do not block other connections.
14
- //
15
- // Failure model: dispatch errors emit "null" (fail-open). The shim itself
16
- // also fails open when the pipe is unreachable.
17
-
18
- import { createServer, createConnection } from 'node:net'
19
- import { appendFileSync, existsSync, mkdirSync, readdirSync, statSync, unlinkSync, writeFileSync, readFileSync } from 'node:fs'
20
- import { join, resolve as pathResolve } from 'node:path'
21
- import { homedir, tmpdir } from 'node:os'
22
- import { randomBytes } from 'node:crypto'
23
- import { request as httpsRequest } from 'node:https'
24
- import { createRequire } from 'node:module'
25
-
26
- const moduleRequire = createRequire(import.meta.url)
27
- const {
28
- isMixdogDebugEnabled,
29
- pruneStalePluginDataLogSiblings,
30
- DEFAULT_STALE_LOG_SIBLING_MAX,
31
- } = moduleRequire('../../../lib/mixdog-debug.cjs')
32
-
33
- // IPC transport path. Windows uses a named pipe (`\\.\pipe\…`); Unix uses a
34
- // Unix domain socket under XDG_RUNTIME_DIR (or /tmp as fallback). Node's
35
- // net.createServer().listen() accepts both transparently.
36
- const PIPE_PATH = moduleRequire('../../../lib/hook-pipe-path.cjs')()
37
-
38
- // Honor MIXDOG_RUNTIME_ROOT consistently with runtime-paths.mjs (the consumer
39
- // of these tool-exec signals): when the override is set, the signal PRODUCER
40
- // here must write into the same root the channels worker watches, or signals
41
- // are silently dropped. Default stays tmpdir()/mixdog so non-override installs
42
- // are unchanged.
43
- const RUNTIME_ROOT = process.env.MIXDOG_RUNTIME_ROOT
44
- ? pathResolve(process.env.MIXDOG_RUNTIME_ROOT)
45
- : join(tmpdir(), 'mixdog')
46
- const SIGNAL_CONSUMER_MARKER = join(RUNTIME_ROOT, '.tool-exec-consumer')
47
- const SUBAGENT_SIGNAL_CONSUMER_MARKER = join(RUNTIME_ROOT, '.tool-exec-subagent-consumer')
48
- const SIGNAL_RE_GENERIC = /^tool-exec-\d+-[0-9a-f]+\.signal$/
49
- const SIGNAL_RE_CAPTURE = /^tool-exec-(\d+)-[0-9a-f]+\.signal$/
50
- const SWEEP_MARKER = join(RUNTIME_ROOT, '.tool-exec-sweep')
51
- const SWEEP_INTERVAL_MS = 30_000
52
- const SIGNAL_TTL_MS = 60_000
53
- // Marketplace installs use two naming shapes for the MCP server name —
54
- // `plugin_mixdog_mixdog__` (legacy / mixdog marketplace) and
55
- // `plugin_mixdog_trib-plugin__` (trib-plugin marketplace). PreToolUse
56
- // sandbox checks must recognise both or sandbox evaluation silently
57
- // misses MCP tool names from the other install layout.
58
- const MCP_PREFIXES = [
59
- 'mcp__plugin_mixdog_mixdog__',
60
- 'mcp__plugin_mixdog_trib-plugin__',
61
- ]
62
- const NATIVE_FILE_LOOKUP_TOOLS = new Set(['Read', 'Grep', 'Glob', 'Search', 'LS'])
63
- function isMcpToolName(name) {
64
- if (!name) return false
65
- return MCP_PREFIXES.some(p => name.startsWith(p))
66
- }
67
-
68
- const POLL_INTERVAL_MS = 2000
69
- const SUBAGENT_TIMEOUT_MS = 120_000
70
- const DEFAULT_DISPATCH_TIMEOUT_MS = 15_000
71
- const SESSION_START_MEMORY_DISPATCH_TIMEOUT_MS = 125_000
72
- const MIXDOG_DEBUG_ENABLED = isMixdogDebugEnabled()
73
- let _hookPipeLogsPruned = false
74
-
75
- function hookPipeDebugStderr(line) {
76
- if (!MIXDOG_DEBUG_ENABLED) return
77
- try { process.stderr.write(line) } catch {}
78
- }
79
-
80
- let _started = false
81
- let _server = null
82
- let _subagentSignalConsumers = 0
83
-
84
- function refreshSubagentSignalConsumerMarker() {
85
- try {
86
- if (_subagentSignalConsumers > 0) {
87
- try { mkdirSync(RUNTIME_ROOT, { recursive: true }) } catch {}
88
- writeFileSync(SUBAGENT_SIGNAL_CONSUMER_MARKER, String(Date.now()))
89
- } else {
90
- try { unlinkSync(SUBAGENT_SIGNAL_CONSUMER_MARKER) } catch {}
91
- }
92
- } catch {}
93
- }
94
-
95
- function formatError(err) {
96
- const msg = (err && (err.stack || err.message)) || err
97
- return String(msg || 'unknown').replace(/\s+/g, ' ').slice(0, 2000)
98
- }
99
-
100
- function traceSessionStart(message) {
101
- if (!MIXDOG_DEBUG_ENABLED) return
102
- const line = `[${new Date().toISOString()}] [hook-pipe][session-start] ${message}\n`
103
- try { process.stderr.write(line) } catch {}
104
- try {
105
- const dataDir = process.env.CLAUDE_PLUGIN_DATA ||
106
- join(homedir(), '.claude', 'plugins', 'data', 'mixdog-trib-plugin')
107
- mkdirSync(dataDir, { recursive: true })
108
- if (!_hookPipeLogsPruned) {
109
- _hookPipeLogsPruned = true
110
- pruneStalePluginDataLogSiblings(dataDir, DEFAULT_STALE_LOG_SIBLING_MAX)
111
- }
112
- appendFileSync(join(dataDir, 'session-start.log'), line)
113
- } catch {}
114
- }
115
-
116
- function dispatchTimeoutMsForPayload(payload) {
117
- const event = payload?.hook_event_name || payload?.hookEventName || ''
118
- if (event !== 'SessionStart') return DEFAULT_DISPATCH_TIMEOUT_MS
119
- const argsArr = payload?._args || []
120
- const partArg = argsArr.find(a => a.startsWith('--part='))
121
- const part = partArg ? partArg.slice('--part='.length) : ''
122
- return (part === 'core' || part === 'recap')
123
- ? SESSION_START_MEMORY_DISPATCH_TIMEOUT_MS
124
- : DEFAULT_DISPATCH_TIMEOUT_MS
125
- }
126
-
127
- // ── post-tool-use handler ────────────────────────────────────────────────────
128
-
129
- function sweepStaleSignalsThrottled(now = Date.now()) {
130
- try {
131
- let lastSweep = 0
132
- try { lastSweep = statSync(SWEEP_MARKER).mtimeMs } catch {}
133
- if (now - lastSweep < SWEEP_INTERVAL_MS) return
134
- try { writeFileSync(SWEEP_MARKER, String(now)) } catch {}
135
- const entries = readdirSync(RUNTIME_ROOT)
136
- for (const name of entries) {
137
- if (!SIGNAL_RE_GENERIC.test(name)) continue
138
- const p = join(RUNTIME_ROOT, name)
139
- try {
140
- const st = statSync(p)
141
- if (now - st.mtimeMs > SIGNAL_TTL_MS) unlinkSync(p)
142
- } catch {}
143
- }
144
- } catch {}
145
- }
146
-
147
- function handlePostToolUse(payload) {
148
- const toolName = payload?.tool_name || payload?.toolName || ''
149
- if (!toolName) return null
150
- if (_subagentSignalConsumers <= 0 &&
151
- !existsSync(SIGNAL_CONSUMER_MARKER) &&
152
- !existsSync(SUBAGENT_SIGNAL_CONSUMER_MARKER)) {
153
- return null
154
- }
155
- const filePath = payload?.tool_input?.file_path || payload?.toolInput?.file_path || ''
156
- const toolUseId = payload?.tool_use_id || payload?.toolUseId || ''
157
-
158
- try { if (!existsSync(RUNTIME_ROOT)) mkdirSync(RUNTIME_ROOT, { recursive: true }) } catch {}
159
- sweepStaleSignalsThrottled()
160
-
161
- try {
162
- const rand = randomBytes(4).toString('hex')
163
- const signalFile = join(RUNTIME_ROOT, `tool-exec-${Date.now()}-${rand}.signal`)
164
- writeFileSync(signalFile, JSON.stringify({ toolName, filePath, toolUseId, ts: Date.now() }))
165
- } catch (err) {
166
- process.stderr.write(`[hook-pipe] post-tool-use signal write failed: ${err?.message || err}\n`)
167
- }
168
- return null
169
- }
170
-
171
- // ── pre-mcp-sandbox handler ──────────────────────────────────────────────────
172
-
173
- function handlePreMcpSandbox(payload) {
174
- const toolName = payload?.tool_name || payload?.toolName || ''
175
- if (!isMcpToolName(toolName)) return null
176
-
177
- const toolInput = payload?.tool_input ?? payload?.toolInput ?? {}
178
-
179
- let userCwdRaw = payload?.cwd || ''
180
- if (!userCwdRaw) {
181
- const dataDir = process.env.CLAUDE_PLUGIN_DATA || ''
182
- if (dataDir) {
183
- try { userCwdRaw = readFileSync(join(dataDir, 'user-cwd.txt'), 'utf8').trim() } catch {}
184
- }
185
- }
186
- if (!userCwdRaw) userCwdRaw = process.cwd()
187
-
188
- const userCwd = pathResolve(userCwdRaw)
189
- const projectDir = payload?.projectDir || payload?.project_dir ||
190
- process.env.CLAUDE_PROJECT_DIR || userCwd
191
- const permissionMode = payload?.permissionMode || payload?.permission_mode || undefined
192
-
193
- let settingsPerms, evaluatePermission
194
- try {
195
- const settingsLoader = moduleRequire('../../../hooks/lib/settings-loader.cjs')
196
- settingsPerms = settingsLoader.loadPermissions(projectDir)
197
- } catch (err) {
198
- process.stderr.write(`[hook-pipe] pre-mcp-sandbox settings-loader unavailable: ${err?.message || err}\n`)
199
- return null
200
- }
201
- const effectiveMode = permissionMode || settingsPerms.defaultMode
202
-
203
- // Bypass fast-path: bypassPermissions/auto are full-allow by design; when no
204
- // user deny rules are set, skip the evaluator (the owner opted into bypass).
205
- if ((effectiveMode === 'bypassPermissions' || effectiveMode === 'auto') &&
206
- (!settingsPerms.deny || settingsPerms.deny.length === 0)) {
207
- return null
208
- }
209
-
210
- try {
211
- const ev = moduleRequire('../../../hooks/lib/permission-evaluator.cjs')
212
- evaluatePermission = ev.evaluatePermission
213
- } catch (err) {
214
- process.stderr.write(`[hook-pipe] pre-mcp-sandbox evaluator unavailable: ${err?.message || err}\n`)
215
- return null
216
- }
217
-
218
- const evalResult = evaluatePermission({ toolName, toolInput, permissionMode, projectDir, userCwd, permissions: settingsPerms })
219
- const { decision, reason, updatedInput } = evalResult
220
-
221
- if (effectiveMode === 'bypassPermissions' || effectiveMode === 'auto') {
222
- if (decision === 'deny') return makeDecision('deny', reason)
223
- return null
224
- }
225
- if (decision === 'allow') return null
226
- if (decision === 'ask') return makeDecision('ask', reason, updatedInput)
227
- return makeDecision('deny', reason)
228
- }
229
-
230
- function handleNativeFileLookup(payload) {
231
- const toolName = payload?.tool_name || payload?.toolName || ''
232
- if (!NATIVE_FILE_LOOKUP_TOOLS.has(toolName)) return null
233
- return makeDecision(
234
- 'deny',
235
- `Native ${toolName} is disabled by Mixdog. Use the Mixdog MCP read/grep/glob/list tools instead.`
236
- )
237
- }
238
-
239
- function makeDecision(decision, reason, updatedInput) {
240
- const out = {
241
- hookSpecificOutput: {
242
- hookEventName: 'PreToolUse',
243
- permissionDecision: decision,
244
- permissionDecisionReason: reason,
245
- },
246
- }
247
- if (updatedInput !== undefined) out.hookSpecificOutput.updatedInput = updatedInput
248
- return out
249
- }
250
-
251
- // ── pre-tool-subagent handler (Discord permission flow, async) ───────────────
252
-
253
- function sanitize(value) {
254
- return String(value).replace(/[^a-zA-Z0-9._-]/g, '_')
255
- }
256
-
257
- function readDiscordConfig() {
258
- try {
259
- const { readSection } = moduleRequire('../../../lib/config-cjs.cjs')
260
- return readSection('channels')
261
- } catch { return {} }
262
- }
263
-
264
- function isProtectedPath(filePath, cwd) {
265
- if (!filePath) return false
266
- const norm = pathResolve(filePath).replace(/\\/g, '/').toLowerCase()
267
- const cwdNorm = (cwd || process.cwd()).replace(/\\/g, '/').toLowerCase()
268
- const insideCwd = cwdNorm && (norm === cwdNorm || norm.startsWith(cwdNorm.endsWith('/') ? cwdNorm : cwdNorm + '/'))
269
- return !insideCwd
270
- }
271
-
272
- function findAndClaimSignal(toolName, filePath, toolUseId, hookStartedAt) {
273
- let entries
274
- try { entries = readdirSync(RUNTIME_ROOT) } catch { return null }
275
- for (const name of entries) {
276
- const m = SIGNAL_RE_CAPTURE.exec(name)
277
- if (!m) continue
278
- const ts = Number(m[1])
279
- if (!Number.isFinite(ts) || ts < hookStartedAt) continue
280
- const p = join(RUNTIME_ROOT, name)
281
- let raw
282
- try { raw = readFileSync(p, 'utf8') } catch { continue }
283
- let parsed
284
- try { parsed = JSON.parse(raw) } catch { continue }
285
- if (parsed?.toolName !== toolName) continue
286
- if (parsed?.filePath !== filePath) continue
287
- if (toolUseId && parsed?.toolUseId !== toolUseId) continue
288
- try { unlinkSync(p) } catch {}
289
- return p
290
- }
291
- return null
292
- }
293
-
294
- function discordApi(method, apiPath, token, body) {
295
- return new Promise((resolve, reject) => {
296
- const data = body ? JSON.stringify(body) : ''
297
- const headers = { 'Authorization': 'Bot ' + token, 'Content-Type': 'application/json' }
298
- if (data) headers['Content-Length'] = Buffer.byteLength(data)
299
- const req = httpsRequest({ hostname: 'discord.com', path: apiPath, method, headers },
300
- res => { let out = ''; res.on('data', d => { out += d }); res.on('end', () => { try { resolve(JSON.parse(out)) } catch { resolve({}) } }) })
301
- req.setTimeout(10_000, () => req.destroy())
302
- req.on('error', reject)
303
- if (data) req.write(data)
304
- req.end()
305
- })
306
- }
307
-
308
- const sleep = (ms) => new Promise(r => setTimeout(r, ms))
309
-
310
- async function handlePreToolSubagent(payload) {
311
- if (process.env.MIXDOG_CHANNELS_NO_CONNECT) return null
312
-
313
- const isSidechain = payload.isSidechain ?? payload.is_sidechain
314
- const agentIdRaw = payload.agentId ?? payload.agent_id
315
- const toolInput = payload.tool_input ?? payload.toolInput ?? {}
316
-
317
- const isSubagent = isSidechain === true || Boolean(agentIdRaw)
318
- if (!isSubagent) return null
319
-
320
- const toolName = payload.tool_name || payload.toolName || ''
321
- if (toolName !== 'Edit' && toolName !== 'Write' && toolName !== 'MultiEdit') return null
322
-
323
- const mode = payload.permissionMode || payload.permission_mode || payload.mode
324
- if (mode === 'bypassPermissions' || mode === 'acceptEdits' || mode === 'auto') return null
325
-
326
- const hookCwd = payload.cwd || toolInput.cwd || process.cwd()
327
- const filePath = toolInput.file_path || ''
328
- const resolvedPath = filePath ? pathResolve(hookCwd, filePath) : ''
329
- if (!isProtectedPath(resolvedPath, hookCwd)) return null
330
-
331
- try { mkdirSync(RUNTIME_ROOT, { recursive: true }) } catch {}
332
- const toolUseId = payload.tool_use_id ?? payload.toolUseId ?? ''
333
-
334
- let routeMod
335
- try {
336
- routeMod = moduleRequire('../../../hooks/lib/permission-route.cjs')
337
- } catch (err) {
338
- process.stderr.write(`[hook-pipe] pre-tool-subagent permission-route unavailable: ${err?.message || err}\n`)
339
- return null
340
- }
341
- const route = routeMod.shouldRoutePermissionToDiscord()
342
- if (route.route !== 'discord') {
343
- hookPipeDebugStderr(`[hook-pipe] pre-tool-subagent discord-route=off agent=${agentIdRaw || 'unknown'} tool=${toolName} reason=${route.reason || 'inactive'}\n`)
344
- return null
345
- }
346
- hookPipeDebugStderr(`[hook-pipe] pre-tool-subagent discord-route=on agent=${agentIdRaw || 'unknown'} tool=${toolName}\n`)
347
-
348
- let getDiscordToken
349
- try {
350
- ({ getDiscordToken } = moduleRequire('../../../lib/config-cjs.cjs'))
351
- } catch (err) {
352
- process.stderr.write(`[hook-pipe] pre-tool-subagent config-cjs unavailable: ${err?.message || err}\n`)
353
- return null
354
- }
355
- const cfg = readDiscordConfig()
356
- const token = getDiscordToken()
357
- if (!token) return null
358
- const agentId = agentIdRaw || 'unknown'
359
- const mainCh = cfg && cfg.channelsConfig && cfg.channelsConfig.main
360
- const channelId = mainCh && (typeof mainCh === 'string' ? null : mainCh.channelId)
361
- if (!channelId) return null
362
-
363
- const uuid = randomBytes(16).toString('hex')
364
- const permissionInstanceIds = route.permissionInstanceIds || [route.permissionInstanceId].filter(Boolean)
365
- if (!permissionInstanceIds.length) return null
366
- const resultFiles = permissionInstanceIds.map((id) => join(RUNTIME_ROOT, `perm-${sanitize(id)}-${uuid}.result`))
367
- _subagentSignalConsumers += 1
368
- refreshSubagentSignalConsumerMarker()
369
-
370
- const releaseSubagentConsumer = () => {
371
- _subagentSignalConsumers = Math.max(0, _subagentSignalConsumers - 1)
372
- refreshSubagentSignalConsumerMarker()
373
- }
374
-
375
- let detail = ''
376
- if (toolName === 'Edit') {
377
- detail = filePath + '\n' + (toolInput.old_string || '').substring(0, 200)
378
- } else {
379
- detail = filePath
380
- }
381
- const content = `🔐 **Sub-agent Permission**\nAgent: \`${agentId}\`\nTool: \`${toolName}\`\n\`\`\`\n${detail}\n\`\`\``
382
-
383
- const body = {
384
- content,
385
- components: [{
386
- type: 1,
387
- components: [
388
- { type: 2, style: 3, label: 'Allow', custom_id: 'perm-' + uuid + '-allow' },
389
- { type: 2, style: 1, label: 'Session Allow', custom_id: 'perm-' + uuid + '-session' },
390
- { type: 2, style: 4, label: 'Deny', custom_id: 'perm-' + uuid + '-deny' },
391
- ]
392
- }]
393
- }
394
-
395
- let msgResult
396
- try {
397
- msgResult = await discordApi('POST', '/api/v10/channels/' + channelId + '/messages', token, body)
398
- } catch (err) {
399
- process.stderr.write(`[hook-pipe] discord POST failed: ${err?.message || err}\n`)
400
- releaseSubagentConsumer()
401
- return null
402
- }
403
- const messageId = msgResult?.id
404
- if (!messageId) {
405
- releaseSubagentConsumer()
406
- return null
407
- }
408
-
409
- const hookStartedAt = Date.now()
410
-
411
- const patchAndFinish = async (suffix, decisionJson) => {
412
- try {
413
- await discordApi('PATCH', '/api/v10/channels/' + channelId + '/messages/' + messageId, token, {
414
- content: content + suffix,
415
- components: []
416
- })
417
- } catch {}
418
- for (const resultFile of resultFiles) {
419
- try { unlinkSync(resultFile) } catch {}
420
- }
421
- releaseSubagentConsumer()
422
- return decisionJson || null
423
- }
424
-
425
- const startTime = Date.now()
426
- while (Date.now() - startTime < SUBAGENT_TIMEOUT_MS) {
427
- await sleep(POLL_INTERVAL_MS)
428
-
429
- const resultFile = resultFiles.find((file) => existsSync(file))
430
- if (resultFile) {
431
- let decision
432
- try {
433
- const result = readFileSync(resultFile, 'utf8').trim()
434
- if (result === 'allow' || result === 'session') {
435
- decision = makeDecision('allow')
436
- } else {
437
- decision = makeDecision('deny', 'Denied from Discord')
438
- }
439
- } catch {
440
- decision = makeDecision('deny', 'Failed to read result')
441
- }
442
- return patchAndFinish('', decision)
443
- }
444
-
445
- const claimed = findAndClaimSignal(toolName, filePath, toolUseId, hookStartedAt)
446
- if (claimed) {
447
- return patchAndFinish('\n\n↩️ Resolved from terminal.', null)
448
- }
449
- }
450
-
451
- return patchAndFinish(
452
- '\n\n⚠️ Auto-denied due to timeout.',
453
- makeDecision('deny', 'Timeout')
454
- )
455
- }
456
-
457
- // ── statusline handler (via dynamic ESM import) ──────────────────────────────
458
-
459
- let _statusLineMod = null
460
- let _statusLineLoadPromise = null
461
-
462
- async function ensureStatusLineMod() {
463
- if (_statusLineMod) return _statusLineMod
464
- if (_statusLineLoadPromise) return _statusLineLoadPromise
465
- _statusLineLoadPromise = import('../../../bin/statusline-lib.mjs')
466
- .then(mod => { _statusLineMod = mod; return mod })
467
- .catch(err => {
468
- process.stderr.write(`[hook-pipe] statusline-lib import failed: ${err?.message || err}\n`)
469
- _statusLineLoadPromise = null
470
- return null
471
- })
472
- return _statusLineLoadPromise
473
- }
474
-
475
- async function handleStatusLine(payload) {
476
- const mod = await ensureStatusLineMod()
477
- if (!mod || typeof mod.renderStatusLine !== 'function') return null
478
- try {
479
- return await mod.renderStatusLine(JSON.stringify(payload || {}))
480
- } catch (err) {
481
- process.stderr.write(`[hook-pipe] statusline render failed: ${err?.message || err}\n`)
482
- return null
483
- }
484
- }
485
-
486
- // ── SessionStart: rules/core/recap handlers (via require'd cjs) ──────────────
487
- //
488
- // session-start.cjs accesses fd 0 at the top level — we gate that behind
489
- // MIXDOG_SKIP_TOP_STDIN so it doesn't consume the daemon's MCP stdio pipe.
490
- // Each SessionStart slot gets a fresh CJS module instance. That keeps the
491
- // module-globals (_event, PART, _emitSink) isolated, so rules/core/recap can
492
- // run concurrently without a daemon-wide lock.
493
- function loadSessionStartMod() {
494
- const prev = process.env.MIXDOG_SKIP_TOP_STDIN
495
- process.env.MIXDOG_SKIP_TOP_STDIN = '1'
496
- const moduleId = moduleRequire.resolve('../../../hooks/session-start.cjs')
497
- delete moduleRequire.cache[moduleId]
498
- traceSessionStart('fresh require start path=../../../hooks/session-start.cjs')
499
- try {
500
- const mod = moduleRequire(moduleId)
501
- delete moduleRequire.cache[moduleId]
502
- traceSessionStart(`fresh require ok exports=${Object.keys(mod || {}).join(',')}`)
503
- return mod
504
- } catch (err) {
505
- process.stderr.write(`[hook-pipe] session-start.cjs require failed: ${err?.message || err}\n`)
506
- traceSessionStart(`require failed err=${formatError(err)}`)
507
- return null
508
- } finally {
509
- if (prev === undefined) delete process.env.MIXDOG_SKIP_TOP_STDIN
510
- else process.env.MIXDOG_SKIP_TOP_STDIN = prev
511
- }
512
- }
513
-
514
- async function handleSessionStartPart(args, payload) {
515
- if (payload?.isSidechain || payload?.is_sidechain) {
516
- traceSessionStart(`skip reason=sidechain source=${payload?.source || ''}`)
517
- return null
518
- }
519
- if (payload?.agentId || payload?.agent_id) {
520
- traceSessionStart(`skip reason=agent source=${payload?.source || ''} agent=${payload?.agentId || payload?.agent_id || ''}`)
521
- return null
522
- }
523
- if (payload?.kind && payload.kind !== 'interactive') {
524
- traceSessionStart(`skip reason=kind source=${payload?.source || ''} kind=${payload.kind}`)
525
- return null
526
- }
527
-
528
- const partArg = (args || []).find(a => a.startsWith('--part='))
529
- const part = partArg ? partArg.slice('--part='.length) : null
530
- if (!part || (part !== 'rules' && part !== 'core' && part !== 'recap')) {
531
- traceSessionStart(`skip reason=invalid-part source=${payload?.source || ''} args=${JSON.stringify(args || [])}`)
532
- return null
533
- }
534
-
535
- const mod = loadSessionStartMod()
536
- if (!mod) {
537
- traceSessionStart(`skip reason=require-null part=${part} source=${payload?.source || ''}`)
538
- return null
539
- }
540
-
541
- let buf = ''
542
- let failed = false
543
- const t0 = Date.now()
544
- try {
545
- traceSessionStart(
546
- `run start part=${part} source=${payload?.source || ''} cwd=${payload?.cwd || ''} ` +
547
- `sessionId=${payload?.session_id || payload?.sessionId || ''}`
548
- )
549
- try { mod.setEvent(payload || {}) } catch (err) {
550
- failed = true
551
- traceSessionStart(`setEvent failed part=${part} err=${formatError(err)}`)
552
- }
553
- try {
554
- if (typeof mod.setPart === 'function') mod.setPart(part)
555
- else traceSessionStart(`setPart unavailable part=${part}`)
556
- } catch (err) {
557
- failed = true
558
- traceSessionStart(`setPart failed part=${part} err=${formatError(err)}`)
559
- }
560
- try { mod.setEmitSink(s => { buf += String(s) }) } catch (err) {
561
- failed = true
562
- traceSessionStart(`setEmitSink failed part=${part} err=${formatError(err)}`)
563
- }
564
- if (part === 'rules') await mod.runRulesPart()
565
- else if (part === 'core') await mod.runCorePart()
566
- else if (part === 'recap') await mod.runRecapPart()
567
- } catch (err) {
568
- failed = true
569
- process.stderr.write(`[hook-pipe] session-start ${part} failed: ${err?.message || err}\n`)
570
- traceSessionStart(`run failed part=${part} err=${formatError(err)}`)
571
- } finally {
572
- try { mod.setEmitSink(null) } catch (err) {
573
- failed = true
574
- traceSessionStart(`clearEmitSink failed part=${part} err=${formatError(err)}`)
575
- }
576
- traceSessionStart(
577
- `run done part=${part} source=${payload?.source || ''} ` +
578
- `bytes=${Buffer.byteLength(buf, 'utf8')} elapsed=${Date.now() - t0}ms failed=${failed}`
579
- )
580
- }
581
- return buf || null
582
- }
583
-
584
- // ── SessionStart: clear-active-session handler ───────────────────────────────
585
-
586
- function handleSessionStartClear() {
587
- // Clear the active orchestrator session pointer so each Claude Code session
588
- // starts fresh. Stored sessions on disk are NOT deleted — only the pointer.
589
- try {
590
- const dataDir = process.env.CLAUDE_PLUGIN_DATA || ''
591
- if (!dataDir) return null
592
- const target = join(dataDir, 'active-session.txt')
593
- try { unlinkSync(target) } catch {}
594
- } catch (err) {
595
- process.stderr.write(`[hook-pipe] session-start clear failed: ${err?.message || err}\n`)
596
- }
597
- return null
598
- }
599
-
600
- // ── dispatch ─────────────────────────────────────────────────────────────────
601
-
602
- async function dispatch(payload) {
603
- const event = payload?.hook_event_name || payload?.hookEventName || ''
604
- const tool = payload?.tool_name || payload?.toolName || ''
605
- const argsArr = payload?._args || []
606
-
607
- // CLI-arg-driven routing (statusline + future entry points without a
608
- // hook_event_name field).
609
- const kindArg = argsArr.find(a => a.startsWith('--kind='))
610
- if (kindArg) {
611
- const kind = kindArg.slice('--kind='.length)
612
- if (kind === 'statusline') return await handleStatusLine(payload)
613
- }
614
-
615
- try {
616
- if (event === 'PreToolUse') {
617
- if (NATIVE_FILE_LOOKUP_TOOLS.has(tool)) {
618
- return handleNativeFileLookup(payload)
619
- }
620
- if (tool === 'Edit' || tool === 'Write' || tool === 'MultiEdit') {
621
- return await handlePreToolSubagent(payload)
622
- }
623
- if (isMcpToolName(tool)) {
624
- return handlePreMcpSandbox(payload)
625
- }
626
- } else if (event === 'PostToolUse') {
627
- return handlePostToolUse(payload)
628
- } else if (event === 'SessionStart') {
629
- const argsArr = payload?._args || []
630
- const hasPart = argsArr.some(a => a.startsWith('--part='))
631
- if (hasPart) {
632
- return await handleSessionStartPart(argsArr, payload)
633
- }
634
- // No --part: clear-active-session entry.
635
- return handleSessionStartClear()
636
- }
637
- } catch (err) {
638
- process.stderr.write(`[hook-pipe] dispatch error: ${err?.message || err}\n`)
639
- }
640
- return null
641
- }
642
-
643
- // ── server ───────────────────────────────────────────────────────────────────
644
-
645
- export function startHookPipeServer() {
646
- if (_server) return _server
647
-
648
- _server = createServer((socket) => {
649
- let buf = ''
650
- let handled = false
651
- // Resource guards: a connection that never sends a newline-terminated
652
- // payload would otherwise grow buf unbounded and hold the socket open
653
- // forever. Cap the buffered bytes and idle-close a stalled connection.
654
- const MAX_BUF_BYTES = 1 << 20 // 1 MiB
655
- const IDLE_TIMEOUT_MS = 30_000
656
- socket.setTimeout(IDLE_TIMEOUT_MS, () => {
657
- if (!handled) { try { socket.destroy() } catch {} }
658
- })
659
- socket.on('data', async (chunk) => {
660
- if (handled) return
661
- buf += chunk.toString('utf8')
662
- if (Buffer.byteLength(buf, 'utf8') > MAX_BUF_BYTES) {
663
- handled = true
664
- process.stderr.write(`[hook-pipe] payload exceeded ${MAX_BUF_BYTES} bytes without newline; dropping connection\n`)
665
- try { socket.destroy() } catch {}
666
- return
667
- }
668
- const firstNl = buf.indexOf('\n')
669
- if (firstNl < 0) return
670
- const firstLine = buf.slice(0, firstNl)
671
-
672
- // Optional `args=` prefix line. When present, the actual payload is the
673
- // second line; otherwise the first line IS the payload.
674
- let args = []
675
- let payloadLine
676
- if (firstLine.startsWith('args=')) {
677
- const secondNl = buf.indexOf('\n', firstNl + 1)
678
- if (secondNl < 0) return // wait for more
679
- args = firstLine.slice(5).split(' ').filter(Boolean)
680
- payloadLine = buf.slice(firstNl + 1, secondNl)
681
- } else {
682
- payloadLine = firstLine
683
- }
684
-
685
- handled = true
686
- let payload = null
687
- try { payload = payloadLine ? JSON.parse(payloadLine) : null } catch {}
688
- if (payload && args.length > 0) payload._args = args
689
-
690
- // Per-request deadline: a hung handler would otherwise hold the hook
691
- // client waiting for EOF forever, stalling Claude Code's hook step. Race
692
- // dispatch against a real timer; on timeout, write the no-op fallback and
693
- // end the socket so the client unblocks.
694
- const dispatchTimeoutMs = payload ? dispatchTimeoutMsForPayload(payload) : DEFAULT_DISPATCH_TIMEOUT_MS
695
- let timedOut = false
696
- let deadlineTimer = null
697
- let reply = null
698
- try {
699
- if (payload) {
700
- reply = await new Promise((resolve, reject) => {
701
- deadlineTimer = setTimeout(() => {
702
- timedOut = true
703
- reject(new Error(`dispatch exceeded ${dispatchTimeoutMs}ms`))
704
- }, dispatchTimeoutMs)
705
- dispatch(payload).then(resolve, reject)
706
- })
707
- }
708
- } catch (err) {
709
- if (timedOut) {
710
- process.stderr.write(`[hook-pipe] dispatch timed out after ${dispatchTimeoutMs}ms; writing no-op fallback\n`)
711
- try { socket.write('null\n') } catch {}
712
- try { socket.end() } catch {}
713
- return
714
- }
715
- process.stderr.write(`[hook-pipe] handler threw: ${err?.message || err}\n`)
716
- } finally {
717
- if (deadlineTimer) { clearTimeout(deadlineTimer); deadlineTimer = null }
718
- }
719
-
720
- // Response shape:
721
- // • object → JSON-stringified single line (legacy decision protocol)
722
- // • string → raw text (multi-line session-start / statusline output)
723
- // • null/undefined → "null" (no-op marker)
724
- let out
725
- if (reply == null) out = 'null'
726
- else if (typeof reply === 'string') out = reply
727
- else out = JSON.stringify(reply)
728
-
729
- try { socket.write(out) } catch {}
730
- if (!out.endsWith('\n')) { try { socket.write('\n') } catch {} }
731
- try { socket.end() } catch {}
732
- })
733
- socket.on('error', () => {})
734
- })
735
- _server.on('error', (err) => {
736
- const msg = String(err?.message || err || '')
737
- if (err?.code === 'EADDRINUSE' || msg.includes('EADDRINUSE') || msg.includes('Failed to listen')) {
738
- hookPipeDebugStderr(`[hook-pipe] ${PIPE_PATH} already owned by a peer daemon; standby for hook IPC\n`)
739
- _server = null
740
- _started = false
741
- return
742
- }
743
- process.stderr.write(`[hook-pipe] server error: ${err?.message || err}\n`)
744
- })
745
-
746
- const beginListen = () => {
747
- try {
748
- _server.listen(PIPE_PATH, () => {
749
- _started = true
750
- hookPipeDebugStderr(`[hook-pipe] listening on ${PIPE_PATH}\n`)
751
- })
752
- } catch (err) {
753
- process.stderr.write(`[hook-pipe] listen failed: ${err?.message || err}\n`)
754
- _server = null
755
- }
756
- }
757
-
758
- if (process.platform === 'win32') {
759
- // Windows named pipes refuse a second listener with EADDRINUSE on their
760
- // own, so no pre-listen probe is needed.
761
- beginListen()
762
- } else {
763
- // Unix: a leftover socket file from a crashed prior daemon would make
764
- // listen() fail with EADDRINUSE. But blindly unlinking would also steal
765
- // the socket from a live sibling daemon, leaving it orphaned. Probe the
766
- // path first — only unlink when nothing answers.
767
- probeUnixSocketAlive(PIPE_PATH).then((alive) => {
768
- if (alive) {
769
- process.stderr.write(
770
- `[hook-pipe] another mixdog daemon is already listening on ${PIPE_PATH}; refusing to start a second instance\n`
771
- )
772
- _server = null
773
- return
774
- }
775
- try { unlinkSync(PIPE_PATH) } catch {}
776
- beginListen()
777
- })
778
- }
779
- return _server
780
- }
781
-
782
- // Best-effort liveness check for a Unix socket path. Resolves true when
783
- // something is listening (connect succeeds), false when the path is dead
784
- // (ECONNREFUSED) or absent (ENOENT). Other errors / timeout resolve true so
785
- // we err on the side of NOT stealing a possibly-live peer's socket.
786
- function probeUnixSocketAlive(socketPath) {
787
- return new Promise((resolve) => {
788
- let done = false
789
- const finish = (alive) => {
790
- if (done) return
791
- done = true
792
- try { client.destroy() } catch {}
793
- clearTimeout(timer)
794
- resolve(alive)
795
- }
796
- let client
797
- try {
798
- client = createConnection(socketPath)
799
- } catch {
800
- resolve(false)
801
- return
802
- }
803
- const timer = setTimeout(() => finish(true), 300)
804
- client.once('connect', () => finish(true))
805
- client.once('error', (err) => {
806
- const code = err && err.code
807
- finish(!(code === 'ECONNREFUSED' || code === 'ENOENT'))
808
- })
809
- })
810
- }
811
-
812
- export function stopHookPipeServer() {
813
- if (_server) {
814
- try { _server.close() } catch {}
815
- _server = null
816
- _started = false
817
- }
818
- }
819
-
820
- export function isHookPipeServerStarted() {
821
- return _started
822
- }