mixdog 0.7.1

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 (404) hide show
  1. package/.claude-plugin/marketplace.json +31 -0
  2. package/.claude-plugin/plugin.json +20 -0
  3. package/.gitattributes +34 -0
  4. package/.mcp.json +14 -0
  5. package/ARCHITECTURE.md +77 -0
  6. package/CHANGELOG.md +7 -0
  7. package/CONTRIBUTING.md +45 -0
  8. package/DATA-FLOW.md +79 -0
  9. package/LICENSE +21 -0
  10. package/README.md +389 -0
  11. package/SECURITY.md +138 -0
  12. package/UNINSTALL.md +112 -0
  13. package/agents/maintenance.md +5 -0
  14. package/agents/memory-classification.md +30 -0
  15. package/agents/scheduler-task.md +18 -0
  16. package/agents/webhook-handler.md +27 -0
  17. package/agents/worker.md +24 -0
  18. package/bin/bridge +133 -0
  19. package/bin/statusline-launcher.mjs +78 -0
  20. package/bin/statusline-lib.mjs +550 -0
  21. package/bin/statusline.mjs +607 -0
  22. package/bun.lock +802 -0
  23. package/commands/config.md +16 -0
  24. package/commands/doctor.md +13 -0
  25. package/commands/setup.md +17 -0
  26. package/defaults/cycle3-review-prompt.md +90 -0
  27. package/defaults/hidden-roles.json +65 -0
  28. package/defaults/memory-chunk-prompt.md +63 -0
  29. package/defaults/memory-promote-prompt.md +135 -0
  30. package/defaults/mixdog-config.template.json +27 -0
  31. package/defaults/user-workflow.json +8 -0
  32. package/defaults/user-workflow.md +12 -0
  33. package/hooks/hooks.json +73 -0
  34. package/hooks/lib/active-instance.cjs +77 -0
  35. package/hooks/lib/permission-evaluator.cjs +411 -0
  36. package/hooks/lib/permission-route.cjs +63 -0
  37. package/hooks/lib/permission-rules.cjs +170 -0
  38. package/hooks/lib/settings-loader.cjs +116 -0
  39. package/hooks/post-tool-use.cjs +84 -0
  40. package/hooks/pre-mcp-sandbox.cjs +158 -0
  41. package/hooks/pre-tool-subagent.cjs +253 -0
  42. package/hooks/session-start.cjs +1372 -0
  43. package/hooks/turn-timer.cjs +82 -0
  44. package/lib/claude-md-writer.cjs +386 -0
  45. package/lib/config-cjs.cjs +61 -0
  46. package/lib/hook-pipe-path.cjs +10 -0
  47. package/lib/keychain-cjs.cjs +263 -0
  48. package/lib/plugin-paths.cjs +61 -0
  49. package/lib/rules-builder.cjs +241 -0
  50. package/lib/text-utils.cjs +61 -0
  51. package/native/README.md +117 -0
  52. package/native/prebuilt/linux-aarch64/mixdog-shim +0 -0
  53. package/native/prebuilt/linux-x86_64/mixdog-shim +0 -0
  54. package/native/prebuilt/macos-aarch64/mixdog-shim +0 -0
  55. package/native/prebuilt/macos-x86_64/mixdog-shim +0 -0
  56. package/native/prebuilt/windows-x86_64/mixdog-shim.exe +0 -0
  57. package/package.json +107 -0
  58. package/prompts/code-review.txt +16 -0
  59. package/prompts/security-audit.txt +17 -0
  60. package/rules/bridge/00-common.md +39 -0
  61. package/rules/bridge/20-skip-protocol.md +18 -0
  62. package/rules/bridge/30-explorer.md +33 -0
  63. package/rules/bridge/40-cycle1-agent.md +52 -0
  64. package/rules/bridge/41-cycle2-agent.md +62 -0
  65. package/rules/bridge/42-cycle3-agent.md +44 -0
  66. package/rules/lead/00-tool-lead.md +61 -0
  67. package/rules/lead/01-general.md +23 -0
  68. package/rules/lead/02-channels.md +49 -0
  69. package/rules/lead/03-team.md +27 -0
  70. package/rules/lead/04-workflow.md +20 -0
  71. package/rules/shared/00-language.md +14 -0
  72. package/rules/shared/01-tool.md +138 -0
  73. package/scripts/bootstrap.mjs +184 -0
  74. package/scripts/bridge-unify-smoke.mjs +308 -0
  75. package/scripts/build-runtime-linux.sh +348 -0
  76. package/scripts/build-runtime-macos.sh +217 -0
  77. package/scripts/build-runtime-windows.ps1 +242 -0
  78. package/scripts/builtin-utils-smoke.mjs +392 -0
  79. package/scripts/check-json.mjs +45 -0
  80. package/scripts/check-syntax-changed.mjs +102 -0
  81. package/scripts/check-syntax.mjs +58 -0
  82. package/scripts/code-graph-batch.test.mjs +33 -0
  83. package/scripts/config-preserve-smoke.mjs +180 -0
  84. package/scripts/doctor.mjs +484 -0
  85. package/scripts/edit-normalize-fuzz.mjs +130 -0
  86. package/scripts/edit-normalize-smoke.mjs +401 -0
  87. package/scripts/edit-operation-smoke.mjs +369 -0
  88. package/scripts/edit2-smoke.mjs +63 -0
  89. package/scripts/fuzzy-e2e.mjs +28 -0
  90. package/scripts/fuzzy-smoke.mjs +26 -0
  91. package/scripts/generate-runtime-manifest.mjs +166 -0
  92. package/scripts/guard-smoke.mjs +66 -0
  93. package/scripts/hidden-role-schema-smoke.mjs +162 -0
  94. package/scripts/hook-routing-smoke.mjs +29 -0
  95. package/scripts/inject-input.ps1 +204 -0
  96. package/scripts/io-complex-smoke.mjs +667 -0
  97. package/scripts/io-explore-bench.mjs +424 -0
  98. package/scripts/io-guardrails-smoke.mjs +205 -0
  99. package/scripts/io-mini-bench-baseline.json +11 -0
  100. package/scripts/io-mini-bench.mjs +216 -0
  101. package/scripts/io-route-harness.mjs +933 -0
  102. package/scripts/io-telemetry-report.mjs +691 -0
  103. package/scripts/mutation-bench.mjs +564 -0
  104. package/scripts/mutation-io-smoke.mjs +1081 -0
  105. package/scripts/native-patch-bridge-smoke.mjs +288 -0
  106. package/scripts/native-patch-smoke.mjs +304 -0
  107. package/scripts/patch-interior-context-smoke.mjs +49 -0
  108. package/scripts/patch-newline-utf8-smoke.mjs +157 -0
  109. package/scripts/perf-hook-smoke.mjs +71 -0
  110. package/scripts/permission-eval-smoke.mjs +426 -0
  111. package/scripts/prep-patch.mjs +53 -0
  112. package/scripts/prep-shim.mjs +96 -0
  113. package/scripts/provider-cache-smoke.mjs +687 -0
  114. package/scripts/report-runtime-health.mjs +132 -0
  115. package/scripts/run-mcp.mjs +1547 -0
  116. package/scripts/salvage-v4a-shatter.test.mjs +58 -0
  117. package/scripts/scoped-cache-io-smoke.mjs +103 -0
  118. package/scripts/shell-policy-round3-smoke.mjs +46 -0
  119. package/scripts/smoke-runtime-negative.ps1 +100 -0
  120. package/scripts/smoke-runtime-negative.sh +95 -0
  121. package/scripts/stall-policy-smoke.mjs +50 -0
  122. package/scripts/start-memory-worker.mjs +23 -0
  123. package/scripts/statusline-launcher-smoke.mjs +82 -0
  124. package/scripts/stress-atomic-write.mjs +1028 -0
  125. package/scripts/test-config-rmw-restore.mjs +122 -0
  126. package/scripts/test-fault-inject.mjs +164 -0
  127. package/scripts/test-large-file.mjs +174 -0
  128. package/scripts/tool-edge-smoke.mjs +209 -0
  129. package/scripts/uninstall.mjs +201 -0
  130. package/scripts/webhook-selfheal-smoke.mjs +29 -0
  131. package/scripts/write-overwrite-guard-smoke.mjs +56 -0
  132. package/server-main.mjs +3055 -0
  133. package/server.mjs +468 -0
  134. package/setup/config-merge.mjs +254 -0
  135. package/setup/install.mjs +120 -0
  136. package/setup/launch-core.mjs +507 -0
  137. package/setup/launch.mjs +101 -0
  138. package/setup/setup-server.mjs +3206 -0
  139. package/setup/setup.html +3693 -0
  140. package/skills/retro-skill-proposer/SKILL.md +92 -0
  141. package/skills/schedule-add/SKILL.md +77 -0
  142. package/skills/setup/SKILL.md +346 -0
  143. package/skills/webhook-add/SKILL.md +81 -0
  144. package/src/agent/bridge-stall-watchdog.mjs +337 -0
  145. package/src/agent/index.mjs +2138 -0
  146. package/src/agent/orchestrator/activity-bus.mjs +38 -0
  147. package/src/agent/orchestrator/ai-wrapped-dispatch.mjs +1010 -0
  148. package/src/agent/orchestrator/bridge-retry.mjs +220 -0
  149. package/src/agent/orchestrator/bridge-trace.mjs +583 -0
  150. package/src/agent/orchestrator/cache-mtime.mjs +58 -0
  151. package/src/agent/orchestrator/config.mjs +358 -0
  152. package/src/agent/orchestrator/context/collect.mjs +651 -0
  153. package/src/agent/orchestrator/dispatch-persist.mjs +549 -0
  154. package/src/agent/orchestrator/drain-registry.mjs +50 -0
  155. package/src/agent/orchestrator/explore-validator.mjs +8 -0
  156. package/src/agent/orchestrator/internal-roles.mjs +118 -0
  157. package/src/agent/orchestrator/internal-tools.mjs +88 -0
  158. package/src/agent/orchestrator/jobs.mjs +116 -0
  159. package/src/agent/orchestrator/mcp/client.mjs +364 -0
  160. package/src/agent/orchestrator/providers/anthropic-betas.mjs +21 -0
  161. package/src/agent/orchestrator/providers/anthropic-oauth.mjs +1745 -0
  162. package/src/agent/orchestrator/providers/anthropic.mjs +437 -0
  163. package/src/agent/orchestrator/providers/gemini.mjs +1175 -0
  164. package/src/agent/orchestrator/providers/grok-oauth.mjs +782 -0
  165. package/src/agent/orchestrator/providers/model-catalog.mjs +241 -0
  166. package/src/agent/orchestrator/providers/openai-compat.mjs +1467 -0
  167. package/src/agent/orchestrator/providers/openai-oauth-ws.mjs +1890 -0
  168. package/src/agent/orchestrator/providers/openai-oauth.mjs +1307 -0
  169. package/src/agent/orchestrator/providers/openai-ws.mjs +104 -0
  170. package/src/agent/orchestrator/providers/registry.mjs +192 -0
  171. package/src/agent/orchestrator/providers/retry-classifier.mjs +325 -0
  172. package/src/agent/orchestrator/session/abort-lookup.mjs +13 -0
  173. package/src/agent/orchestrator/session/cache/post-edit-marks.mjs +42 -0
  174. package/src/agent/orchestrator/session/cache/prefetch-cache.mjs +142 -0
  175. package/src/agent/orchestrator/session/cache/read-cache.mjs +319 -0
  176. package/src/agent/orchestrator/session/cache/scoped-cache-outcome.mjs +11 -0
  177. package/src/agent/orchestrator/session/cache/scoped-cache.mjs +361 -0
  178. package/src/agent/orchestrator/session/cache/util.mjs +49 -0
  179. package/src/agent/orchestrator/session/loop.mjs +1478 -0
  180. package/src/agent/orchestrator/session/manager.mjs +1975 -0
  181. package/src/agent/orchestrator/session/read-dedup.mjs +6 -0
  182. package/src/agent/orchestrator/session/result-classification.mjs +65 -0
  183. package/src/agent/orchestrator/session/save-session-worker.mjs +18 -0
  184. package/src/agent/orchestrator/session/store.mjs +624 -0
  185. package/src/agent/orchestrator/session/stream-watchdog.mjs +130 -0
  186. package/src/agent/orchestrator/session/tool-result-offload.mjs +166 -0
  187. package/src/agent/orchestrator/session/trim.mjs +491 -0
  188. package/src/agent/orchestrator/smart-bridge/CACHE-SHARD.md +115 -0
  189. package/src/agent/orchestrator/smart-bridge/bridge-llm.mjs +327 -0
  190. package/src/agent/orchestrator/smart-bridge/cache-obs.mjs +150 -0
  191. package/src/agent/orchestrator/smart-bridge/cache-strategy.mjs +228 -0
  192. package/src/agent/orchestrator/smart-bridge/index.mjs +215 -0
  193. package/src/agent/orchestrator/smart-bridge/profiles.mjs +37 -0
  194. package/src/agent/orchestrator/smart-bridge/registry.mjs +348 -0
  195. package/src/agent/orchestrator/smart-bridge/session-builder.mjs +116 -0
  196. package/src/agent/orchestrator/stall-policy.mjs +195 -0
  197. package/src/agent/orchestrator/tool-loop-guard.mjs +75 -0
  198. package/src/agent/orchestrator/tools/bash-policy-scan.mjs +77 -0
  199. package/src/agent/orchestrator/tools/bash-session.mjs +721 -0
  200. package/src/agent/orchestrator/tools/builtin/advisory-lock.mjs +171 -0
  201. package/src/agent/orchestrator/tools/builtin/arg-guard.mjs +455 -0
  202. package/src/agent/orchestrator/tools/builtin/atomic-write.mjs +236 -0
  203. package/src/agent/orchestrator/tools/builtin/bash-tool.mjs +480 -0
  204. package/src/agent/orchestrator/tools/builtin/binary-file.mjs +76 -0
  205. package/src/agent/orchestrator/tools/builtin/builtin-tools.mjs +256 -0
  206. package/src/agent/orchestrator/tools/builtin/cache-layers.mjs +386 -0
  207. package/src/agent/orchestrator/tools/builtin/cwd-utils.mjs +37 -0
  208. package/src/agent/orchestrator/tools/builtin/device-paths.mjs +154 -0
  209. package/src/agent/orchestrator/tools/builtin/diagnostics-tool.mjs +292 -0
  210. package/src/agent/orchestrator/tools/builtin/diff-utils.mjs +109 -0
  211. package/src/agent/orchestrator/tools/builtin/edit-base-guard.mjs +58 -0
  212. package/src/agent/orchestrator/tools/builtin/edit-byte-plan.mjs +240 -0
  213. package/src/agent/orchestrator/tools/builtin/edit-byte-utils.mjs +113 -0
  214. package/src/agent/orchestrator/tools/builtin/edit-commit.mjs +74 -0
  215. package/src/agent/orchestrator/tools/builtin/edit-context-utils.mjs +242 -0
  216. package/src/agent/orchestrator/tools/builtin/edit-diagnostics.mjs +211 -0
  217. package/src/agent/orchestrator/tools/builtin/edit-engine.mjs +1364 -0
  218. package/src/agent/orchestrator/tools/builtin/edit-failure-context.mjs +126 -0
  219. package/src/agent/orchestrator/tools/builtin/edit-hint.mjs +141 -0
  220. package/src/agent/orchestrator/tools/builtin/edit-match-utils.mjs +194 -0
  221. package/src/agent/orchestrator/tools/builtin/edit-partial-write.mjs +60 -0
  222. package/src/agent/orchestrator/tools/builtin/edit-stale-refresh.mjs +168 -0
  223. package/src/agent/orchestrator/tools/builtin/edit-tool.mjs +173 -0
  224. package/src/agent/orchestrator/tools/builtin/edit-utf8-guard.mjs +48 -0
  225. package/src/agent/orchestrator/tools/builtin/fs-reachability.mjs +48 -0
  226. package/src/agent/orchestrator/tools/builtin/fuzzy-match.mjs +99 -0
  227. package/src/agent/orchestrator/tools/builtin/glob-walk.mjs +170 -0
  228. package/src/agent/orchestrator/tools/builtin/grep-formatting.mjs +113 -0
  229. package/src/agent/orchestrator/tools/builtin/hash-utils.mjs +6 -0
  230. package/src/agent/orchestrator/tools/builtin/list-formatting.mjs +7 -0
  231. package/src/agent/orchestrator/tools/builtin/list-tool.mjs +593 -0
  232. package/src/agent/orchestrator/tools/builtin/native-edit-runner.mjs +89 -0
  233. package/src/agent/orchestrator/tools/builtin/notebook-edit-tool.mjs +300 -0
  234. package/src/agent/orchestrator/tools/builtin/open-config-tool.mjs +26 -0
  235. package/src/agent/orchestrator/tools/builtin/path-diagnostics.mjs +152 -0
  236. package/src/agent/orchestrator/tools/builtin/path-locks.mjs +35 -0
  237. package/src/agent/orchestrator/tools/builtin/path-utils.mjs +201 -0
  238. package/src/agent/orchestrator/tools/builtin/read-args.mjs +103 -0
  239. package/src/agent/orchestrator/tools/builtin/read-batch.mjs +172 -0
  240. package/src/agent/orchestrator/tools/builtin/read-constants.mjs +40 -0
  241. package/src/agent/orchestrator/tools/builtin/read-formatting.mjs +118 -0
  242. package/src/agent/orchestrator/tools/builtin/read-image-resize.mjs +189 -0
  243. package/src/agent/orchestrator/tools/builtin/read-image.mjs +88 -0
  244. package/src/agent/orchestrator/tools/builtin/read-lines.mjs +12 -0
  245. package/src/agent/orchestrator/tools/builtin/read-mode-tool.mjs +455 -0
  246. package/src/agent/orchestrator/tools/builtin/read-open.mjs +190 -0
  247. package/src/agent/orchestrator/tools/builtin/read-range-index.mjs +271 -0
  248. package/src/agent/orchestrator/tools/builtin/read-ranges.mjs +26 -0
  249. package/src/agent/orchestrator/tools/builtin/read-single-tool.mjs +728 -0
  250. package/src/agent/orchestrator/tools/builtin/read-snapshot-runtime.mjs +173 -0
  251. package/src/agent/orchestrator/tools/builtin/read-special-files.mjs +268 -0
  252. package/src/agent/orchestrator/tools/builtin/read-streaming.mjs +602 -0
  253. package/src/agent/orchestrator/tools/builtin/read-tool.mjs +530 -0
  254. package/src/agent/orchestrator/tools/builtin/read-windows.mjs +107 -0
  255. package/src/agent/orchestrator/tools/builtin/rename-tool.mjs +196 -0
  256. package/src/agent/orchestrator/tools/builtin/rg-runner.mjs +422 -0
  257. package/src/agent/orchestrator/tools/builtin/search-builders.mjs +158 -0
  258. package/src/agent/orchestrator/tools/builtin/search-tool.mjs +869 -0
  259. package/src/agent/orchestrator/tools/builtin/shell-analysis.mjs +653 -0
  260. package/src/agent/orchestrator/tools/builtin/shell-jobs.mjs +936 -0
  261. package/src/agent/orchestrator/tools/builtin/shell-output.mjs +36 -0
  262. package/src/agent/orchestrator/tools/builtin/shell-runtime.mjs +214 -0
  263. package/src/agent/orchestrator/tools/builtin/snapshot-helpers.mjs +143 -0
  264. package/src/agent/orchestrator/tools/builtin/snapshot-store.mjs +206 -0
  265. package/src/agent/orchestrator/tools/builtin/snapshot-validation.mjs +98 -0
  266. package/src/agent/orchestrator/tools/builtin/text-stats.mjs +69 -0
  267. package/src/agent/orchestrator/tools/builtin/windows-roots.mjs +23 -0
  268. package/src/agent/orchestrator/tools/builtin/write-tool.mjs +401 -0
  269. package/src/agent/orchestrator/tools/builtin.mjs +500 -0
  270. package/src/agent/orchestrator/tools/code-graph-prewarm-worker.mjs +39 -0
  271. package/src/agent/orchestrator/tools/code-graph-tool-defs.mjs +24 -0
  272. package/src/agent/orchestrator/tools/code-graph.mjs +4095 -0
  273. package/src/agent/orchestrator/tools/cwd-tool.mjs +298 -0
  274. package/src/agent/orchestrator/tools/destructive-warning.mjs +323 -0
  275. package/src/agent/orchestrator/tools/edit-normalize.mjs +603 -0
  276. package/src/agent/orchestrator/tools/env-scrub.mjs +100 -0
  277. package/src/agent/orchestrator/tools/graph-binary-fetcher.mjs +144 -0
  278. package/src/agent/orchestrator/tools/graph-manifest.json +26 -0
  279. package/src/agent/orchestrator/tools/host-input.mjs +204 -0
  280. package/src/agent/orchestrator/tools/mutation-content-cache.mjs +67 -0
  281. package/src/agent/orchestrator/tools/mutation-planner.mjs +75 -0
  282. package/src/agent/orchestrator/tools/next-call-utils.mjs +48 -0
  283. package/src/agent/orchestrator/tools/patch-binary-fetcher.mjs +133 -0
  284. package/src/agent/orchestrator/tools/patch-manifest.json +26 -0
  285. package/src/agent/orchestrator/tools/patch-tool-defs.mjs +20 -0
  286. package/src/agent/orchestrator/tools/patch.mjs +2754 -0
  287. package/src/agent/orchestrator/tools/progress-message.mjs +118 -0
  288. package/src/agent/orchestrator/tools/result-compression.mjs +279 -0
  289. package/src/agent/orchestrator/tools/shell-command.mjs +865 -0
  290. package/src/agent/orchestrator/tools/shell-exec-policy.mjs +89 -0
  291. package/src/agent/orchestrator/tools/shell-policy-danger-target.mjs +27 -0
  292. package/src/agent/orchestrator/tools/shell-policy-imports.mjs +7 -0
  293. package/src/agent/orchestrator/tools/shell-policy.mjs +345 -0
  294. package/src/agent/orchestrator/tools/shell-snapshot.mjs +313 -0
  295. package/src/agent/orchestrator/workflow-store.mjs +93 -0
  296. package/src/agent/tool-defs.mjs +103 -0
  297. package/src/channels/backends/discord.mjs +784 -0
  298. package/src/channels/data/voice-runtime-manifest.json +138 -0
  299. package/src/channels/index.mjs +3229 -0
  300. package/src/channels/lib/cli-worker-host.mjs +12 -0
  301. package/src/channels/lib/config-lock.mjs +13 -0
  302. package/src/channels/lib/config.mjs +292 -0
  303. package/src/channels/lib/drop-trace.mjs +71 -0
  304. package/src/channels/lib/event-pipeline.mjs +81 -0
  305. package/src/channels/lib/event-queue.mjs +345 -0
  306. package/src/channels/lib/executor.mjs +168 -0
  307. package/src/channels/lib/format.mjs +188 -0
  308. package/src/channels/lib/holidays.mjs +138 -0
  309. package/src/channels/lib/hook-pipe-server.mjs +802 -0
  310. package/src/channels/lib/interaction-workflows.mjs +184 -0
  311. package/src/channels/lib/memory-client.mjs +149 -0
  312. package/src/channels/lib/output-forwarder.mjs +765 -0
  313. package/src/channels/lib/runtime-paths.mjs +479 -0
  314. package/src/channels/lib/scheduler.mjs +723 -0
  315. package/src/channels/lib/session-control.mjs +36 -0
  316. package/src/channels/lib/session-discovery.mjs +103 -0
  317. package/src/channels/lib/settings.mjs +11 -0
  318. package/src/channels/lib/state-file.mjs +68 -0
  319. package/src/channels/lib/status-snapshot.mjs +219 -0
  320. package/src/channels/lib/tool-format.mjs +140 -0
  321. package/src/channels/lib/transcript-discovery.mjs +195 -0
  322. package/src/channels/lib/voice-runtime-fetcher.mjs +734 -0
  323. package/src/channels/lib/webhook.mjs +1179 -0
  324. package/src/channels/lib/whisper-server.mjs +477 -0
  325. package/src/channels/tool-defs.mjs +170 -0
  326. package/src/daemon/host.mjs +118 -0
  327. package/src/daemon/mcp-transport.mjs +47 -0
  328. package/src/daemon/session.mjs +100 -0
  329. package/src/daemon/thin-client.mjs +71 -0
  330. package/src/daemon/transport.mjs +163 -0
  331. package/src/memory/data/runtime-manifest.json +40 -0
  332. package/src/memory/index.mjs +3305 -0
  333. package/src/memory/lib/agent-ipc.mjs +93 -0
  334. package/src/memory/lib/bridge-trace-queries.mjs +120 -0
  335. package/src/memory/lib/core-memory-store.mjs +330 -0
  336. package/src/memory/lib/embedding-provider.mjs +269 -0
  337. package/src/memory/lib/embedding-worker.mjs +323 -0
  338. package/src/memory/lib/llm-worker-host.mjs +17 -0
  339. package/src/memory/lib/memory-cycle.mjs +11 -0
  340. package/src/memory/lib/memory-cycle1.mjs +641 -0
  341. package/src/memory/lib/memory-cycle2.mjs +1284 -0
  342. package/src/memory/lib/memory-cycle3.mjs +540 -0
  343. package/src/memory/lib/memory-embed.mjs +299 -0
  344. package/src/memory/lib/memory-extraction.mjs +5 -0
  345. package/src/memory/lib/memory-maintenance-store.mjs +32 -0
  346. package/src/memory/lib/memory-ops-policy.mjs +190 -0
  347. package/src/memory/lib/memory-recall-id-patch.mjs +15 -0
  348. package/src/memory/lib/memory-recall-read-query.mjs +7 -0
  349. package/src/memory/lib/memory-recall-scope-filter.mjs +63 -0
  350. package/src/memory/lib/memory-recall-store.mjs +621 -0
  351. package/src/memory/lib/memory-retrievers.mjs +112 -0
  352. package/src/memory/lib/memory-score.mjs +71 -0
  353. package/src/memory/lib/memory-text-utils.mjs +58 -0
  354. package/src/memory/lib/memory.mjs +412 -0
  355. package/src/memory/lib/model-profile.mjs +85 -0
  356. package/src/memory/lib/pg/adapter.mjs +308 -0
  357. package/src/memory/lib/pg/process.mjs +360 -0
  358. package/src/memory/lib/pg/supervisor.mjs +396 -0
  359. package/src/memory/lib/project-id-resolver.mjs +86 -0
  360. package/src/memory/lib/runtime-fetcher.mjs +442 -0
  361. package/src/memory/lib/trace-store.mjs +728 -0
  362. package/src/memory/tool-defs.mjs +79 -0
  363. package/src/search/index.mjs +1173 -0
  364. package/src/search/lib/backends/anthropic-oauth.mjs +98 -0
  365. package/src/search/lib/backends/exa.mjs +50 -0
  366. package/src/search/lib/backends/firecrawl.mjs +61 -0
  367. package/src/search/lib/backends/gemini-api.mjs +83 -0
  368. package/src/search/lib/backends/grok-oauth.mjs +86 -0
  369. package/src/search/lib/backends/index.mjs +150 -0
  370. package/src/search/lib/backends/openai-api.mjs +144 -0
  371. package/src/search/lib/backends/openai-oauth.mjs +98 -0
  372. package/src/search/lib/backends/openai-web-search.mjs +76 -0
  373. package/src/search/lib/backends/tavily.mjs +55 -0
  374. package/src/search/lib/backends/xai-api.mjs +113 -0
  375. package/src/search/lib/cache.mjs +131 -0
  376. package/src/search/lib/config.mjs +192 -0
  377. package/src/search/lib/formatter.mjs +115 -0
  378. package/src/search/lib/provider-usage.mjs +67 -0
  379. package/src/search/lib/providers.mjs +47 -0
  380. package/src/search/lib/search-intent.mjs +109 -0
  381. package/src/search/lib/setup-handler.mjs +261 -0
  382. package/src/search/lib/state.mjs +201 -0
  383. package/src/search/lib/web-tools.mjs +1207 -0
  384. package/src/search/tool-defs.mjs +83 -0
  385. package/src/setup/defender-exclusion.mjs +183 -0
  386. package/src/shared/abort-controller.mjs +15 -0
  387. package/src/shared/atomic-file.mjs +420 -0
  388. package/src/shared/config.mjs +350 -0
  389. package/src/shared/daemon-recycle.mjs +108 -0
  390. package/src/shared/disable-claude-builtins.mjs +88 -0
  391. package/src/shared/err-text.mjs +12 -0
  392. package/src/shared/llm/cost.mjs +66 -0
  393. package/src/shared/llm/http-agent.mjs +123 -0
  394. package/src/shared/llm/index.mjs +41 -0
  395. package/src/shared/llm/pid-cleanup.mjs +27 -0
  396. package/src/shared/llm/usage-log.mjs +47 -0
  397. package/src/shared/plugin-paths.mjs +58 -0
  398. package/src/shared/schedules-store.mjs +70 -0
  399. package/src/shared/seed.mjs +119 -0
  400. package/src/shared/user-cwd.mjs +213 -0
  401. package/src/shared/user-data-guard.mjs +238 -0
  402. package/src/status/aggregator.mjs +584 -0
  403. package/src/status/server.mjs +413 -0
  404. package/tools.json +1653 -0
@@ -0,0 +1,27 @@
1
+ # Team
2
+
3
+ ## Terms
4
+
5
+ - **Lead**: main Claude Code session.
6
+ - **bridge tool**: MCP dispatcher for one scoped task.
7
+ - **role**: name from `user-workflow.json` or `hidden-roles.json`.
8
+ - **bridge worker**: public role invoked through `bridge`.
9
+ - **hidden role**: internal role (`explorer`, `cycle1-agent`, etc.).
10
+ - **session/job**: runtime state; mention to users only for diagnostics.
11
+
12
+ ## Lead
13
+
14
+ - Coordinates collaboration, approvals, bridge workers, verification,
15
+ Ship/git.
16
+ - Handles small, Lead-owned, and critical config work directly.
17
+ - Uses `# User Workflow` for role mapping; never hard-code public role
18
+ names.
19
+ - Delegates implementation/state-changing work via `bridge`; retrieval
20
+ via Tool Routing (`recall`/`search`/`explore`). Lead keeps
21
+ config/git/small direct work.
22
+
23
+ ## Bridge Workers
24
+
25
+ - `bridge.role` must match active `# User Workflow` / `# Roles`.
26
+ - Workers cannot use `Agent`, `TaskCreate`, `TeamCreate`, or `bridge`.
27
+ - Exception: `claude-code-guide` via `Agent` for Claude Code docs only.
@@ -0,0 +1,20 @@
1
+ # Workflow
2
+
3
+ Plan -> Execute -> Verify -> Ship -> Retro.
4
+
5
+ - Plan: discuss/refine. Retrieval (`recall`/`search`/`explore`) may
6
+ clarify; check `recall` before re-deriving or re-proposing a decision
7
+ the user may already have made. Wait for explicit Execute approval.
8
+ - Execute: use bridge workers per `# User Workflow`, or handle
9
+ Lead-owned work.
10
+ - Verify: confirm via mapped role; Lead cross-checks high-risk results.
11
+ - Ship: share results and wait. For deploy/git: status -> propose
12
+ commit msg -> commit on approval -> push on approval.
13
+ - Retro: suggest reusable Skill-rule fixes surfaced by the work. Never
14
+ auto-edit Skills. Core memory: see `# General`. Skip when
15
+ nothing reusable appeared.
16
+
17
+ Plan -> Execute needs explicit approval. Execute -> Verify and Ship ->
18
+ Retro may auto-flow. Approved phases do not need repeated approval for
19
+ ordinary actions. Still require explicit approval for code edits and
20
+ state-changing shell execution. High-risk/deploy/push: see `# General`.
@@ -0,0 +1,14 @@
1
+ # Language
2
+
3
+ Plugin defaults stay language-neutral for marketplace installs.
4
+
5
+ - Lead user-facing replies use the user's configured/explicit language.
6
+ - Tool I/O, bridge briefs/responses, hidden roles, tasks, logs, stderr,
7
+ and retrieval queries ALWAYS use English, regardless of the input
8
+ brief's language. A Korean/CJK brief is an input artifact, not a
9
+ signal to switch response language — translate it and respond in
10
+ English. Identifiers, paths, and source content stay verbatim.
11
+ - Prompts, rules, regexes, errors, and examples must not assume one
12
+ human language; use Unicode or locale-pluggable logic.
13
+ - Preserve original language for user memory, chat logs, same-language
14
+ recall, and source data.
@@ -0,0 +1,138 @@
1
+ # Tool Routing
2
+
3
+ Native tools and shell are NEVER used for IO — search, inspect, read, mutate
4
+ files, or web access. Use the Mixdog equivalent. `bash` is the single shell
5
+ entry point (PowerShell on Windows); native `Bash`/`PowerShell` are not used.
6
+
7
+ | Native (forbidden for IO) | → Mixdog |
8
+ |---|---|
9
+ | `Read` | `read` |
10
+ | `Grep` | `grep` |
11
+ | `Glob` | `glob` |
12
+ | `LS` / dir listing | `list` |
13
+ | `Edit` / `NotebookEdit` | `apply_patch` (default editor) or `edit` (small exact substitution) |
14
+ | `Write` | `write` (or `apply_patch`) |
15
+ | Delete / remove a file | `apply_patch` (`*** Delete File: <path>`) — no native `rm`/unlink |
16
+ | `WebSearch` | `search` |
17
+ | `WebFetch` | `web_fetch` |
18
+ | `Bash`/`PowerShell` (file IO) | ✗ — use the rows above; never `bash mkdir` to prep a path (`write`/`apply_patch` auto-create parent dirs), nor `touch`/`cat` (use `write`/`read`) |
19
+ | `Bash`/`PowerShell` (git/build/test/run) | `bash` |
20
+ | native `Agent` sub-agent to search / inspect / fetch | ✗ — call Mixdog tools directly; real sub-work goes through `bridge` |
21
+
22
+ No native equivalent (use as-is): `code_graph`
23
+ (`find_symbol`/`search`/`references`/`callers`/`imports`/`dependents`),
24
+ `ToolSearch`. Lead progress tracking via `TaskCreate`/`TaskUpdate`/
25
+ `TaskList` is allowed.
26
+
27
+ ## Decision order — pick the FIRST that matches the task
28
+
29
+ 1. **External / web / current docs** → `search` → `web_fetch` for bodies.
30
+ 2. **Past memory / prior decisions / session history** → `recall`.
31
+ Reach for it BEFORE re-deriving or re-asking — the trigger list (user
32
+ references earlier work, resuming a paused task, proposing a decision
33
+ that may already exist) is on the tool description. The SessionStart
34
+ inject is a thin excerpt, not the store — anything not visible there is
35
+ one read-only, cheap recall away.
36
+ 3. **Read the code, scope unknown / open-ended / tree-wide** → `explore`.
37
+ The entry point for "read the code and tell me X" and any sweep that would
38
+ otherwise be a long `grep`/`code_graph` storm — ONE call offloads it to a
39
+ sub-agent and keeps your context clean. Never a `worker`/`bridge` for
40
+ read-only exploration; never grep-loop it yourself.
41
+ explore LOCATES and DESCRIBES code — NOT an audit/review tool: its
42
+ bug/quality/risk claims are unverified leads; verify them (reviewer role
43
+ or direct reads) before acting on or reporting them. Shape every query as
44
+ a LOCATION/INVENTORY question ("where/which/what implements X"), never a
45
+ verdict question ("is X correct/missing", "are there gaps/bugs") —
46
+ judgment stays with the Lead or a reviewer, applied to the coordinates
47
+ explore returns.
48
+ 4. **Known symbol / identifier** → `code_graph` (`find_symbol` when exact;
49
+ `mode:search` with a keyword when you don't know the exact name — file-less,
50
+ lists matching symbols + locations, use INSTEAD of grepping for a symbol).
51
+ 5. **Find files by name / type / size / date** → `glob` (glob pattern, exact)
52
+ or `list mode:find` (name-substring / type / size / date filter).
53
+ 6. **Free-text / non-symbol content** (string literals, log lines, config keys,
54
+ comments) → `grep`.
55
+ 7. **Read a specific known region** → `read` (`offset`/`limit` or
56
+ `line`/`context`; `symbol=NAME` for a whole definition; `max_lines`/`budget`/
57
+ `mode` for a whole-file glance).
58
+ 8. **Edit** → `apply_patch` (default editor; large/structural, multi-hunk, or
59
+ multi-file) · `edit` (small exact substitution in a known spot; batch several) ·
60
+ `write` (new file or a full rewrite of one already read — never `write` over an
61
+ unread file). Batch dependent edits into ONE multi-hunk apply_patch; by default
62
+ keep each hunk's context minimal — the target line(s) plus only enough for a
63
+ unique match — so nothing surrounding is left to go stale.
64
+ `write`/`apply_patch` auto-create missing parent directories — never
65
+ `bash mkdir` to prepare an output path.
66
+ To delete a file, use `apply_patch` with `*** Delete File: <path>` — there is
67
+ no `rm` tool and `bash rm` is forbidden.
68
+ 9. **Shell** (git/build/test/run only) → `bash`.
69
+
70
+ Retrieval (1–3) picks the SOURCE family first; never default to a `bridge`
71
+ worker for a read-only lookup. Retrieval is ONE-SHOT (never reused) but fans
72
+ out: `recall`/`search` take a query array (built-in parallelism); `explore`
73
+ spawns one per independent area in a single batch. All read-only, so concurrent
74
+ is safe (no worktree conflict). How to shape `explore.query` — one-line
75
+ per-topic sub-questions, never one broad brief, no anchors/context dump — is the
76
+ SSOT in the `explore` tool's `query` parameter description; follow it.
77
+
78
+ ## Broad to narrow — once scope is known
79
+
80
+ `explore` (unknown scope) → `code_graph` (known identifier) → `glob`/`list` →
81
+ `grep` (free-text / non-symbol only) → `read`. Anchor to the named file/symbol.
82
+ A bounded / known-anchor lookup skips straight to `code_graph`/`grep` — but
83
+ "the brief names a repo path" is NOT an anchor; anchor = a named file or symbol
84
+ to start from. A tree-wide enumeration with no such anchor is step 3, not grep.
85
+
86
+ Read what you need in ONE turn — batch a file's windows/`symbol=`s in the same
87
+ turn, don't re-open it across later turns.
88
+
89
+ ## Shortest route — collapse a multi-hop search into ONE call
90
+
91
+ When the shape is known, do not chain `grep` → `read`:
92
+ - keyword / partial-or-unknown symbol name → `code_graph mode:search` (one call,
93
+ file-less) instead of grepping for it.
94
+ Seed it with a SINGLE token, not a prose phrase — multi-word phrases miss and
95
+ waste a call.
96
+ - a named symbol → `code_graph find_symbol` with `body:true` (location + body +
97
+ callees in one call).
98
+ - several symbols' bodies / a call chain → ONE `code_graph find_symbol
99
+ symbols:[...]` instead of N reads.
100
+ - all call sites of a symbol → `callers`/`references` UNSCOPED (omit `file:`; add
101
+ `file:` only to narrow a too-large result).
102
+ - an upstream/downstream call chain across several symbols → ONE
103
+ `callers`/`references` `symbols:[...]` (batches per chain LEVEL, not per symbol).
104
+ - a whole function/definition → `read symbol=NAME`.
105
+ - the lines around a hit → `grep -C`.
106
+ - several free-text patterns at once → ONE `grep` with an array `pattern:[...]`
107
+ (OR-matched ripgrep regexes, ≤20; ≤5 with `multiline`) instead of repeated
108
+ single-pattern greps (`glob` takes an array too; for named/partial symbols use
109
+ `code_graph`, not `grep`).
110
+
111
+ Reach for the one-shot form before adding a follow-up `read`.
112
+
113
+ ## Modifiers — rules that ride on top of the ladder
114
+
115
+ - **Exploration budget.** Stop as soon as you can answer the task correctly —
116
+ don't keep searching to confirm a found answer, gather extra examples, or
117
+ polish phrasing. Match depth to the brief's stated thoroughness, not a default
118
+ of exhaustive.
119
+ - **Concurrency.** Any calls that don't depend on each other's output go in ONE
120
+ message = one round-trip — read-only probes (`read`/`grep`/`glob`/`code_graph`)
121
+ and non-overlapping `apply_patch` edits alike. Only a true dependency chain
122
+ (grep → read the hit) stays serial; never run independent calls one-at-a-time.
123
+ - **Lead-only async.** `explore` defaults to `background:true` (handle returns
124
+ now; the merged answer arrives via `dispatch_result`) — LEAD ONLY. Bridge
125
+ workers run `explore` sync (no channel for the async push) but still use it
126
+ over a grep storm. `explore` fans out to read-only hidden `explorer` sub-agents
127
+ (full worker tool schema + worker BP2 for cache parity); `recall`/`search` are
128
+ plain MCP tools.
129
+ - **No waiting calls.** Never issue shell calls whose only purpose is waiting,
130
+ spacing, or liveness probing; report delayed/cancelled output instead.
131
+ - **Failure circuit-breaker.** The same call failing TWICE with the same error
132
+ ends variant-retrying: stop, diagnose the root cause (read the error's
133
+ expected-vs-actual detail, inspect the target), then switch tool or
134
+ strategy. Blind third attempts with tweaked arguments are wasted calls —
135
+ the success path is one-shot; keep the failure path bounded too.
136
+ - **No self-verification of output.** When the deliverable is code/text returned
137
+ in your answer, emit it directly; never `write` a scratch file or `bash` it to
138
+ compile/run/test your own output.
@@ -0,0 +1,184 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * bootstrap.mjs — node-only bun bootstrap for mixdog.
4
+ *
5
+ * Ensures bun is available (system PATH or plugin-local node_modules/.bin/bun),
6
+ * installs it via npm if missing, then exec-proxies into scripts/run-mcp.mjs.
7
+ *
8
+ * Deps: node built-ins only (node:child_process, node:fs, node:path, node:url, node:os).
9
+ */
10
+ import { spawnSync, spawn } from 'node:child_process';
11
+ import { existsSync, readFileSync, writeFileSync, renameSync } from 'node:fs';
12
+ import { homedir } from 'node:os';
13
+ import { join, dirname } from 'node:path';
14
+ import { fileURLToPath } from 'node:url';
15
+ import { prepShim } from './prep-shim.mjs';
16
+ import { prepPatch } from './prep-patch.mjs';
17
+
18
+ const scriptDir = dirname(fileURLToPath(import.meta.url));
19
+ const pluginRoot = dirname(scriptDir);
20
+ const isWin = process.platform === 'win32';
21
+
22
+ // ---------------------------------------------------------------------------
23
+ // Locate bun — returns absolute path or null.
24
+ // ---------------------------------------------------------------------------
25
+ function findSystemBun() {
26
+ const cmd = isWin ? 'where.exe' : 'which';
27
+ const r = spawnSync(cmd, ['bun'], { encoding: 'utf8', windowsHide: true });
28
+ if (r.status !== 0 || !r.stdout) return null;
29
+ const lines = r.stdout.split(/\r?\n/).map(l => l.trim()).filter(Boolean);
30
+ // On Windows `where bun` can list a .cmd/.ps1 shim before the real .exe;
31
+ // the downstream spawn is no-shell, so prefer an actual .exe when present.
32
+ const pick = isWin ? (lines.find(l => l.toLowerCase().endsWith('.exe')) ?? lines[0]) : lines[0];
33
+ if (!pick) return null;
34
+ return existsSync(pick) ? pick : null;
35
+ }
36
+
37
+ function findLocalBun() {
38
+ // After `npm install bun`, the .bin entry on Windows is a .cmd/.sh shim
39
+ // (not bun.exe), while the real binary lands in node_modules/bun/bin/. Check
40
+ // the package's own bin dir too — otherwise a clean-machine npm fallback can
41
+ // succeed yet resolveBun() still returns null and we exit "still not found".
42
+ const candidates = [
43
+ join(pluginRoot, 'node_modules', '.bin', isWin ? 'bun.exe' : 'bun'),
44
+ join(pluginRoot, 'node_modules', 'bun', 'bin', isWin ? 'bun.exe' : 'bun'),
45
+ ];
46
+ for (const p of candidates) if (existsSync(p)) return p;
47
+ return null;
48
+ }
49
+
50
+ function resolveBun() {
51
+ return findSystemBun() ?? findLocalBun();
52
+ }
53
+
54
+ // ---------------------------------------------------------------------------
55
+ // npm-install bun locally if nothing found.
56
+ // ---------------------------------------------------------------------------
57
+ function installBunViaNpm() {
58
+ process.stderr.write(
59
+ '[bootstrap] bun not found on PATH — installing via npm (npm install --no-save --silent bun)...\n'
60
+ );
61
+ const r = spawnSync('npm', ['install', '--no-save', '--silent', 'bun'], {
62
+ cwd: pluginRoot,
63
+ stdio: 'inherit',
64
+ shell: false,
65
+ windowsHide: true,
66
+ });
67
+ if (r.status !== 0 || r.error) {
68
+ const hint = r.error ? ` (${r.error.message})` : '';
69
+ process.stderr.write(
70
+ `[bootstrap] npm install failed${hint}.\n` +
71
+ '[bootstrap] Please install bun manually: https://bun.sh\n'
72
+ );
73
+ process.exit(1);
74
+ }
75
+ }
76
+
77
+ // ---------------------------------------------------------------------------
78
+ // Main
79
+ // ---------------------------------------------------------------------------
80
+ let bunPath = resolveBun();
81
+
82
+ if (!bunPath) {
83
+ installBunViaNpm();
84
+ bunPath = resolveBun();
85
+ if (!bunPath) {
86
+ process.stderr.write(
87
+ '[bootstrap] bun still not found after npm install.\n' +
88
+ '[bootstrap] Please install bun manually: https://bun.sh\n'
89
+ );
90
+ process.exit(1);
91
+ }
92
+ }
93
+
94
+ // ---------------------------------------------------------------------------
95
+ // Stage the prebuilt shim into target/release and normalize hooks.json for
96
+ // the current OS. Best-effort: failure leaves shim absent and hooks fail-open.
97
+ // ---------------------------------------------------------------------------
98
+ try { prepShim(pluginRoot); } catch (err) {
99
+ process.stderr.write(`[bootstrap] prep-shim skipped: ${err?.message || err}\n`);
100
+ }
101
+ // Fire-and-forget: warms the patch binary cache so the first apply_patch
102
+ // dispatch hits a ready file instead of paying the 2-10s download latency
103
+ // (sync fast-path in patch.mjs would otherwise throw before the dispatch
104
+ // async path's fetch runs).
105
+ try { prepPatch(pluginRoot); } catch (err) {
106
+ process.stderr.write(`[bootstrap] prep-patch skipped: ${err?.message || err}\n`);
107
+ }
108
+
109
+ function positivePid(value) {
110
+ const pid = Number(value);
111
+ return Number.isFinite(pid) && pid > 0 ? pid : null;
112
+ }
113
+
114
+ function detectOwnerHostPid() {
115
+ if (isWin) {
116
+ try {
117
+ const ps = [
118
+ '$procs = Get-CimInstance Win32_Process | Select-Object ProcessId,ParentProcessId,Name;',
119
+ '$map = @{};',
120
+ 'foreach ($p in $procs) { $map[[int]$p.ProcessId] = $p }',
121
+ `$cur = ${Number(process.pid)};`,
122
+ 'for ($i = 0; $i -lt 16; $i++) {',
123
+ ' $p = $map[$cur]; if ($null -eq $p) { break }',
124
+ " if ($p.Name -ieq 'claude.exe' -or $p.Name -ieq 'claude') { [Console]::Write($p.ProcessId); exit 0 }",
125
+ ' $cur = [int]$p.ParentProcessId',
126
+ '}',
127
+ ].join(' ');
128
+ const r = spawnSync('powershell.exe', ['-NoProfile', '-Command', ps], {
129
+ encoding: 'utf8',
130
+ timeout: 1500,
131
+ windowsHide: true,
132
+ });
133
+ const pid = positivePid(String(r.stdout || '').trim());
134
+ if (pid) return String(pid);
135
+ } catch {}
136
+ }
137
+ return String(positivePid(process.ppid) || positivePid(process.env.MIXDOG_OWNER_HOST_PID) || '');
138
+ }
139
+
140
+ const ownerHostPid = detectOwnerHostPid();
141
+
142
+ // ---------------------------------------------------------------------------
143
+ // Proxy into run-mcp.mjs via the resolved bun binary.
144
+ // ---------------------------------------------------------------------------
145
+ const child = spawn(bunPath, [join(pluginRoot, 'scripts', 'run-mcp.mjs')], {
146
+ stdio: 'inherit',
147
+ windowsHide: true,
148
+ env: {
149
+ ...process.env,
150
+ BUN_EXEC_PATH: bunPath,
151
+ MIXDOG_OWNER_HOST_PID: ownerHostPid,
152
+ },
153
+ });
154
+
155
+ child.on('error', (err) => {
156
+ process.stderr.write(`[bootstrap] failed to start run-mcp.mjs: ${err.message}\n`);
157
+ process.exit(1);
158
+ });
159
+
160
+ child.on('exit', (code) => {
161
+ process.exit(code ?? 0);
162
+ });
163
+
164
+ function forward(sig) {
165
+ try { child.kill(sig); } catch { /* child already gone */ }
166
+ }
167
+ process.on('SIGTERM', () => forward('SIGTERM'));
168
+ process.on('SIGINT', () => forward('SIGINT'));
169
+
170
+ // stdin EOF / close = Claude Code (parent) disconnected its end of stdio.
171
+ // run-mcp.mjs handles this in its own layer, but if a race leaves the bun
172
+ // child unable to fire `exit` (sudden stdio break, abnormal bun termination),
173
+ // bootstrap.mjs would otherwise wait forever, accumulating wrapper-layer
174
+ // zombies across reconnects. Force teardown: SIGTERM child, give it 2s,
175
+ // then SIGKILL + self-exit. Mirrors run-mcp.mjs stdin EOF invariant
176
+ // (commit 754ab7d) at the bootstrap layer.
177
+ process.stdin.on('close', () => {
178
+ try { child.kill('SIGTERM'); } catch {}
179
+ setTimeout(() => {
180
+ try { child.kill('SIGKILL'); } catch {}
181
+ process.exit(0);
182
+ }, 2000).unref();
183
+ });
184
+ process.stdin.on('error', () => process.exit(0));