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,16 @@
1
+ ---
2
+ description: Open the mixdog settings UI (Providers + Presets)
3
+ allowed-tools: Bash(bun:*)
4
+ ---
5
+
6
+ ## Launch (already executed)
7
+
8
+ - Launcher output: !`bun "${CLAUDE_PLUGIN_ROOT}/setup/launch.mjs"`
9
+
10
+ The config UI launcher above has ALREADY run at command invocation — the
11
+ settings window is opening (or open) at http://localhost:3458. Do NOT call
12
+ `open_config` or re-run the launcher when the output above shows a
13
+ "Config UI:" URL; just report that URL to the user.
14
+
15
+ Only if the launcher output above shows an error instead of a URL, fall back
16
+ to calling the `open_config` tool, then report the resulting URL.
@@ -0,0 +1,13 @@
1
+ ---
2
+ description: Run mixdog health diagnostics
3
+ allowed-tools: Bash(bun:*)
4
+ ---
5
+
6
+ <!--
7
+ Checks version sync, Bun version/source, shell runtime, supervisor,
8
+ hook-pipe reachability, config/data files, cache layout & storage sizes,
9
+ voice runtime, required npm deps, and log sizes. Prints an OK/WARN/FAIL
10
+ report; exits 1 on any FAIL.
11
+ -->
12
+
13
+ !`bun "${CLAUDE_PLUGIN_ROOT}/scripts/doctor.mjs"`
@@ -0,0 +1,17 @@
1
+ ---
2
+ description: Open the mixdog initial setup UI
3
+ allowed-tools: Bash(bun:*)
4
+ disable-model-invocation: true
5
+ ---
6
+
7
+ ## Launch (already executed)
8
+
9
+ - Launcher output: !`bun "${CLAUDE_PLUGIN_ROOT}/setup/launch.mjs"`
10
+
11
+ The setup UI launcher above has ALREADY run at command invocation — the
12
+ setup window is opening (or open) at http://localhost:3458. Do NOT call
13
+ `open_config` or re-run the launcher when the output above shows a
14
+ "Config UI:" URL; just report that URL to the user.
15
+
16
+ Only if the launcher output above shows an error instead of a URL, fall back
17
+ to calling the `open_config` tool, then report the resulting URL.
@@ -0,0 +1,90 @@
1
+ # Task
2
+
3
+ You review user-curated CORE memory against the current project memory. Each
4
+ entry is shown with its most-related current memory. Emit ONE verdict line per
5
+ entry id. The system may conservatively apply safe compression updates and
6
+ strict duplicate merges automatically; deletes and broad rewrites require
7
+ explicit user confirmation. Extracting a lesson from a narrative is a BROAD
8
+ rewrite — emit it only as a proposal (proposal mode), never as an auto-applied
9
+ conservative "safe compression" update; conservative mode must not lossy-rewrite
10
+ user-curated core. The first character of your response is a digit.
11
+ Plain text — no preamble, JSON, or fences. NEVER attempt a tool call.
12
+
13
+ ## What CORE is
14
+
15
+ CORE is durable standing knowledge that lands in one of three layers:
16
+
17
+ - **L1 — Relationship / communication:** user identity, address form,
18
+ reply-style preferences, patterns the user dislikes.
19
+ - **L2 — Behavior rules:** principles the user corrected or insisted on, hard
20
+ safety boundaries, quality bars.
21
+ - **L3 — Current map:** one-line project-landscape summaries, live long-running
22
+ goals, environment anchors documented nowhere else.
23
+
24
+ Every entry should be ONE short clause (≤120 chars). CORE is not a log.
25
+
26
+ ## The distinction that decides every verdict
27
+
28
+ - An entry that DESCRIBES how something currently is — an L1/L2/L3 rule,
29
+ preference, goal, or live map entry — is DURABLE.
30
+ - An entry that RECORDS a past event that already happened — a version shipped,
31
+ a value measured, a fix made — is NOT durable. For a past decision/failure,
32
+ keep only the one-line lesson that still constrains behavior (as L2); archive
33
+ the narrative. Extracting that lesson is a BROAD rewrite, so it belongs in a
34
+ proposal, not an auto-applied conservative update — conservative mode must not
35
+ lossy-rewrite user-curated core.
36
+ - Anything whose source of truth is code, rules files, or skill docs — plus
37
+ implementation specs, code-internal constants, measurements, resolved-bug
38
+ stories, status snapshots — is NOT durable.
39
+
40
+ When unsure which it is → keep.
41
+
42
+ Related memory is evidence, not authority. Archived related rows may contain
43
+ historical context or old work logs; use them only when they clearly prove a
44
+ CORE entry is a past-event log, duplicate, or stale. If related memory is empty
45
+ or inconclusive, keep the CORE entry.
46
+
47
+ ## Verdicts
48
+
49
+ - `keep` — durable and already one short clause.
50
+ - `update` — durable but verbose or multi-sentence → rewrite as one ≤120-char clause.
51
+ - `merge` — duplicates another entry → fold into the survivor (same project pool).
52
+ - `delete` — records a past event, not a current rule or structure; OR merely
53
+ restates a rule already in **Current rules** below (rules load every session,
54
+ so a CORE copy is redundant); OR is sourced from code, rules files, or skill
55
+ docs, or is an implementation spec, constant, measurement, resolved-bug
56
+ story, or status snapshot that fits no L1/L2/L3 layer. Do not delete an entry
57
+ that adds durable specifics the rule itself does not state.
58
+
59
+ A verbose durable entry is always `update`, never `keep`.
60
+ Delete is the rarest verdict. Prefer `keep` for durable rules/preferences and
61
+ `update` for compression when the current behavior is still valid.
62
+
63
+ ## Current rules (Source Of Truth — loaded into the session every turn)
64
+
65
+ These rules are always present, so a CORE entry that merely restates one is
66
+ redundant → `delete`. Treat them as authority for the delete-on-restatement
67
+ verdict only; an entry that is merely related but adds durable specifics the
68
+ rule does not state stays `keep`/`update`.
69
+
70
+ {{CURRENT_RULES}}
71
+
72
+ ## Entries to review
73
+
74
+ Each block is one CORE entry followed by its most-related current memory.
75
+
76
+ {{CORE_REVIEW}}
77
+
78
+ ## Output
79
+
80
+ One line per entry id, any order:
81
+
82
+ ```
83
+ <id>|keep
84
+ <id>|update|<element>|<summary>
85
+ <id>|merge|<target_id>|<source_ids_csv>
86
+ <id>|delete
87
+ ```
88
+
89
+ `summary` ≤120 chars, one clause. No literal `|` or newline inside a field
90
+ (replace `|` with `/`). No prose, no fences. First character is a digit.
@@ -0,0 +1,65 @@
1
+ {
2
+ "roles": [
3
+ {
4
+ "name": "explorer",
5
+ "slot": "explore",
6
+ "systemFile": "rules/bridge/30-explorer.md",
7
+ "description": "Filesystem navigation agent invoked by the `explore` MCP tool",
8
+ "invokedBy": "explore",
9
+ "toolSchemaProfile": "unified",
10
+ "kind": "retrieval",
11
+ "permission": "read",
12
+ "stallCap": { "idleSeconds": 240, "toolRunningSeconds": 180 }
13
+ },
14
+ {
15
+ "name": "cycle1-agent",
16
+ "slot": "cycle1",
17
+ "systemFile": "rules/bridge/40-cycle1-agent.md",
18
+ "description": "Chunker/classifier invoked by memory-cycle runCycle1",
19
+ "invokedBy": "cycle1",
20
+ "toolSchemaProfile": "llm-only", "kind": "maintenance",
21
+ "permission": "read",
22
+ "stallCap": { "idleSeconds": 300, "toolRunningSeconds": 300 }
23
+ },
24
+ {
25
+ "name": "cycle2-agent",
26
+ "slot": "cycle2",
27
+ "systemFile": "rules/bridge/41-cycle2-agent.md",
28
+ "description": "Root re-scorer invoked by memory-cycle runCycle2",
29
+ "invokedBy": "cycle2",
30
+ "toolSchemaProfile": "llm-only", "kind": "maintenance",
31
+ "permission": "read",
32
+ "stallCap": { "idleSeconds": 300, "toolRunningSeconds": 300 }
33
+ },
34
+ {
35
+ "name": "cycle3-agent",
36
+ "slot": "cycle3",
37
+ "systemFile": "rules/bridge/42-cycle3-agent.md",
38
+ "description": "Core memory reviewer invoked by memory-cycle runCycle3",
39
+ "invokedBy": "cycle3",
40
+ "toolSchemaProfile": "llm-only", "kind": "maintenance",
41
+ "permission": "read",
42
+ "stallCap": { "idleSeconds": 300, "toolRunningSeconds": 300 }
43
+ },
44
+ {
45
+ "name": "scheduler-task",
46
+ "slot": "scheduler",
47
+ "systemFile": "agents/scheduler-task.md",
48
+ "description": "Scheduled-task executor invoked by scheduler tick",
49
+ "invokedBy": "scheduler",
50
+ "toolSchemaProfile": "unified", "kind": "maintenance",
51
+ "permission": "read-write",
52
+ "stallCap": { "idleSeconds": 600, "toolRunningSeconds": 600 }
53
+ },
54
+ {
55
+ "name": "webhook-handler",
56
+ "slot": "webhook",
57
+ "systemFile": "agents/webhook-handler.md",
58
+ "description": "Webhook payload handler invoked by inbound webhook events",
59
+ "invokedBy": "webhook",
60
+ "toolSchemaProfile": "unified", "kind": "maintenance",
61
+ "permission": "read-write",
62
+ "stallCap": { "idleSeconds": 600, "toolRunningSeconds": 600 }
63
+ }
64
+ ]
65
+ }
@@ -0,0 +1,63 @@
1
+ You are a strict memory chunker and classifier.
2
+
3
+ Read the entries below, group contiguous related entries into memory chunks,
4
+ and output pipe-separated lines only. No JSON, no prose, no fences, no preamble.
5
+ The first character of your response must be a digit.
6
+
7
+ ## Output
8
+
9
+ One line per chunk:
10
+
11
+ ```
12
+ idx_csv|element|category|summary
13
+ ```
14
+
15
+ - `idx_csv`: comma-separated 1-based input indexes. Use bare numbers.
16
+ - `element`: short recall key, 5-10 words, with the subject and any distinctive
17
+ identifier.
18
+ - `category`: exactly one of `rule`, `constraint`, `decision`, `fact`, `goal`,
19
+ `preference`, `task`, `issue`.
20
+ - `summary`: compact declarative memory. Preserve decisive identifiers,
21
+ numbers, paths, versions, causes, outcomes, and constraints when present.
22
+ - Fields must not contain literal `|` or newlines.
23
+
24
+ ## Chunking
25
+
26
+ - Every substantive input should appear in exactly one chunk.
27
+ - Omit entries whose only function is acknowledgement, courtesy, reaction, or
28
+ handoff and which add no fact, decision, constraint, result, preference, or
29
+ task.
30
+ - Do not include non-substantive rows in a chunk merely because they are
31
+ adjacent to useful content.
32
+ - Never merge across `[sess:...]` markers.
33
+ - Split unrelated topics even when they are adjacent.
34
+ - Keep question/context and answer/resolution together when they form one
35
+ cause-outcome memory.
36
+ - If later entries supersede earlier ones, summarize the latest state while
37
+ keeping the relevant member ids together.
38
+
39
+ ## Categories
40
+
41
+ - `rule`: standing operating rule or durable identity/system policy.
42
+ - `constraint`: hard limit, prohibition, or approval boundary.
43
+ - `decision`: explicit choice with a clear resolution moment.
44
+ - `fact`: verified current state or observed technical detail.
45
+ - `goal`: long-running target still in flight.
46
+ - `preference`: user style or taste that may guide future behavior.
47
+ - `task`: concrete work item with a done state or next step.
48
+ - `issue`: bug, incident, broken state, or risk needing attention.
49
+
50
+ Choose the category that best preserves future recall intent. Do not use
51
+ `decision` unless a choice was actually made.
52
+
53
+ ## Quality
54
+
55
+ - Use the same language as the input content.
56
+ - Prefer one dense sentence; use two only when ambiguity would otherwise remain.
57
+ - Do not pad thin content or speculate beyond the source.
58
+ - Do not name speakers or describe the conversation mechanics.
59
+ - Keep technical identifiers verbatim.
60
+
61
+ ## Entries
62
+
63
+ {{ENTRIES}}
@@ -0,0 +1,135 @@
1
+ # Task
2
+
3
+ Judge generated memory candidates. Output pipe-separated lines only: no JSON,
4
+ no prose, no fences, no tool calls. The first character of your response must
5
+ be a digit.
6
+
7
+ Example:
8
+
9
+ For Entries numbered `1. id:... 2. id:... 3. id:... 4. id:...`:
10
+
11
+ ```
12
+ 1|archived
13
+ 2|active
14
+ 2|why|A|Durable reply-style preference; forgetting it changes future responses.
15
+ 2|core|user prefers terse one-line replies
16
+ 3|update|compact element|one-sentence durable summary
17
+ 3|why|B|Live project-map anchor documented nowhere else.
18
+ 3|core|current project layout summary
19
+ 4|merge|2|2,4|merged element|merged durable summary
20
+ 2|why|A|Same durable preference as the survivor.
21
+ 2|core|merged core line
22
+ ```
23
+
24
+ ## Required Lines
25
+
26
+ Emit exactly one primary verdict for every Entry:
27
+
28
+ The first field of every line MUST be the ROW NUMBER printed before the entry
29
+ in Entries (the `<n>.` prefix, 1-based). One verdict per row; do not skip a row
30
+ or invent a row number that is not listed.
31
+
32
+ ```
33
+ <row>|active
34
+ <row>|archived
35
+ <row>|update|<element>|<summary>
36
+ <row>|merge|<target_row>|<source_rows_csv>|<element>|<summary>
37
+ ```
38
+
39
+ For every non-archived primary verdict (`active`, `update`, `merge`), also emit:
40
+
41
+ ```
42
+ <row>|why|A|<short reason>
43
+ <row>|core|<core_summary>
44
+ ```
45
+
46
+ Use `why|A` for durable cross-session invariants (L1/L2). Use `why|B` for L3
47
+ current-map entries: one-line project-landscape summaries, live long-running
48
+ goals, and environment anchors documented nowhere else. `why` is validation
49
+ evidence only; it is
50
+ not stored. `core_summary` is injected into Core Memory, so keep it one
51
+ self-contained clause, <=120 chars. For `merge`, `why` and `core` may use the
52
+ survivor `target_row`.
53
+
54
+ Allowed primary verbs:
55
+
56
+ | Current status | Verbs |
57
+ |---|---|
58
+ | `pending` | `active`, `archived` |
59
+ | `active` | `active`, `archived`, `update`, `merge` |
60
+
61
+ ## Source Of Truth
62
+
63
+ Current rules load every session. User-curated core is canonical. If a
64
+ candidate restates either source, archive it; do not promote duplicates.
65
+
66
+ ### Current Rules
67
+
68
+ {{CURRENT_RULES}}
69
+
70
+ ### User-Curated Core
71
+
72
+ {{USER_CORE}}
73
+
74
+ ### Active Generated Core
75
+
76
+ {{CORE_MEMORY}}
77
+
78
+ ## Entries
79
+
80
+ {{ITEMS}}
81
+
82
+ Active: {{ACTIVE_COUNT}} / cap: {{ACTIVE_CAP}}
83
+
84
+ ## Decision Rule
85
+
86
+ Long-term memory is exceptional. Keep ONLY content that lands in one of three
87
+ layers:
88
+
89
+ - **L1 — Relationship / communication:** user identity, address form,
90
+ reply-style preferences, and patterns the user dislikes. (`why|A`)
91
+ - **L2 — Behavior rules:** principles the user corrected or insisted on during
92
+ work, hard safety boundaries, and quality bars. (`why|A`)
93
+ - **L3 — Current map:** one-line project-landscape summaries, live
94
+ long-running goals, and environment anchors documented nowhere else. (`why|B`)
95
+
96
+ **Transform rule.** For a past decision or failure, ask: *does a lesson from it
97
+ still constrain today's behavior?* If yes → keep the one-line L2 lesson and
98
+ archive the narrative. For an ACTIVE row, use `update` to rewrite it into the
99
+ lesson. For a PENDING row (which allows only `active`/`archived`), promote with
100
+ `active` and put the one-line lesson in its `core` line — pending rows cannot
101
+ emit `update`. If no → archive. Anything whose source of truth is code, rules
102
+ files, or skill docs → archive.
103
+
104
+ Archive everything else: implementation specs, code-internal constants,
105
+ measurements, resolved-bug stories, and status snapshots.
106
+
107
+ The cap is an upper bound, not a target. When `Active < cap`, seed and grow the
108
+ active set: a pending row with a concrete A/B reason that is NOT a
109
+ Source-Of-Truth duplicate MUST be promoted with `active` — promotion is NOT
110
+ reserved for already-active rows, and an empty active set must be bootstrapped
111
+ from clear, non-duplicate A/B pending rows. When `Active > cap`, contract
112
+ strictly: any active entry without a concrete A/B reason must archive.
113
+
114
+ If useful content is buried inside work narrative, keep only the durable L2
115
+ behavior lesson (via `update` on an active row, or `active` for a pending row);
116
+ archive the surrounding story.
117
+
118
+ ## Merge / Update
119
+
120
+ - `update` rewrites verbose durable entries into one short element and one
121
+ one-sentence summary.
122
+ - `merge` only within the same project pool. The survivor is `target_row`.
123
+ - Never merge across project_id boundaries.
124
+ - `element` <=100 chars. `summary` <=200 chars. No literal `|` or newlines.
125
+ - When a row genuinely fails the A/B bar or you are unsure it qualifies, prefer
126
+ `archived`. But never withhold `active` from a pending row that clearly meets
127
+ A/B merely because it is currently pending — clear, non-duplicate A/B pending
128
+ rows are promoted, not archived (rows that restate current rules or
129
+ user-curated core still archive per Source Of Truth).
130
+
131
+ ## Output
132
+
133
+ Pipe lines only. No prose. First character must be a digit. Each line's first
134
+ field MUST be the ROW NUMBER (`<n>.` prefix) shown before that entry in
135
+ Entries. Emit one verdict per listed row; do not skip rows or invent numbers.
@@ -0,0 +1,27 @@
1
+ {
2
+ "channels": {
3
+ "promptInjection": {
4
+ "mode": "claude_md",
5
+ "targetPath": "~/.claude/CLAUDE.md"
6
+ }
7
+ },
8
+ "memory": {
9
+ "enabled": true,
10
+ "user": { "title": "" },
11
+ "cycle1": { "interval": "10m" },
12
+ "cycle2": { "interval": "1h" }
13
+ },
14
+ "search": {
15
+ "enabled": true,
16
+ "rawSearch": {
17
+ "maxResults": 10,
18
+ "credentials": {
19
+ "firecrawl": { "apiKey": "" },
20
+ "tavily": { "apiKey": "" },
21
+ "exa": { "apiKey": "" }
22
+ }
23
+ },
24
+ "requestTimeoutMs": 120000,
25
+ "crawl": { "maxPages": 10, "maxDepth": 2, "sameDomainOnly": true }
26
+ }
27
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "roles": [
3
+ { "name": "worker", "preset": "sonnet-high", "permission": "full" },
4
+ { "name": "reviewer", "preset": "opus-high", "permission": "full" },
5
+ { "name": "debugger", "preset": "opus-high", "permission": "full" },
6
+ { "name": "tester", "preset": "sonnet-high", "permission": "full" }
7
+ ]
8
+ }
@@ -0,0 +1,12 @@
1
+ Default role assignment:
2
+ - Implementation → worker
3
+ - Verification → reviewer
4
+ - Debugging → debugger
5
+ - Testing → tester
6
+
7
+ Cross-verification loop (1:1 worker↔reviewer pairing is the DEFAULT):
8
+ - Pair every implementation worker 1:1 with its own reviewer: the moment a worker completes, immediately dispatch a dedicated reviewer scoped to that worker's files. Parallel fix workers get parallel paired reviewers — reviews never serialize behind one combined pass. Start the Lead self-check (syntax check, diff inspection, invariant verification) in parallel too.
9
+ - When several workers touched interacting files, the LEAD performs ONE thin integration pass DIRECTLY (Lead self-check — NOT a dispatched reviewer; spawning another reviewer adds latency) to catch cross-file effects. Never replace the 1:1 paired reviewers with a single combined reviewer.
10
+ - If a reviewer returns issues, dispatch a fix worker → re-pair it 1:1 with a reviewer. Repeat until every reviewer issues a clean verdict ("all issues resolved" / "ship-ready").
11
+ - If issues require changing the original plan/spec (not just fixable bugs), halt the loop and report to the user. Resume only after the user updates the plan.
12
+ - Do not report completion to the user before every reviewer's clean verdict. Mid-loop status updates may share round count and issue count but must not claim done.
@@ -0,0 +1,73 @@
1
+ {
2
+ "description": "mixdog unified hooks",
3
+ "hooks": {
4
+ "SessionStart": [
5
+ {
6
+ "matcher": "startup|clear",
7
+ "hooks": [
8
+ {
9
+ "type": "command",
10
+ "command": "\"${CLAUDE_PLUGIN_ROOT}/native/mixdog-shim/target/release/mixdog-shim.exe\" --part=rules",
11
+ "timeout": 30
12
+ },
13
+ {
14
+ "type": "command",
15
+ "command": "\"${CLAUDE_PLUGIN_ROOT}/native/mixdog-shim/target/release/mixdog-shim.exe\" --part=core",
16
+ "timeout": 130
17
+ },
18
+ {
19
+ "type": "command",
20
+ "command": "\"${CLAUDE_PLUGIN_ROOT}/native/mixdog-shim/target/release/mixdog-shim.exe\" --part=recap",
21
+ "timeout": 130
22
+ }
23
+ ]
24
+ }
25
+ ],
26
+ "PreToolUse": [
27
+ {
28
+ "matcher": "^mcp__plugin_mixdog_(?:mixdog|trib-plugin)__(?!(?:read|list|glob|grep|code_graph|find_symbol|find_references|find_callers|explore|recall|search|fetch|web_fetch|schedule_status|list_models|job_wait|download_attachment)$)",
29
+ "hooks": [
30
+ {
31
+ "type": "command",
32
+ "command": "\"${CLAUDE_PLUGIN_ROOT}/native/mixdog-shim/target/release/mixdog-shim.exe\"",
33
+ "timeout": 10
34
+ }
35
+ ]
36
+ }
37
+ ],
38
+ "PostToolUse": [
39
+ {
40
+ "matcher": "Edit|Write|MultiEdit|Bash|NotebookEdit",
41
+ "hooks": [
42
+ {
43
+ "type": "command",
44
+ "command": "\"${CLAUDE_PLUGIN_ROOT}/native/mixdog-shim/target/release/mixdog-shim.exe\" --kind=post-tool",
45
+ "timeout": 5
46
+ }
47
+ ]
48
+ }
49
+ ],
50
+ "UserPromptSubmit": [
51
+ {
52
+ "hooks": [
53
+ {
54
+ "type": "command",
55
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/turn-timer.cjs\" start",
56
+ "timeout": 10
57
+ }
58
+ ]
59
+ }
60
+ ],
61
+ "Stop": [
62
+ {
63
+ "hooks": [
64
+ {
65
+ "type": "command",
66
+ "command": "node \"${CLAUDE_PLUGIN_ROOT}/hooks/turn-timer.cjs\" stop",
67
+ "timeout": 10
68
+ }
69
+ ]
70
+ }
71
+ ]
72
+ }
73
+ }
@@ -0,0 +1,77 @@
1
+ 'use strict';
2
+
3
+ const fs = require('fs');
4
+ const path = require('path');
5
+ const os = require('os');
6
+
7
+ const RUNTIME_ROOT = path.join(os.tmpdir(), 'mixdog');
8
+ const ACTIVE_INSTANCE_FILE = path.join(RUNTIME_ROOT, 'active-instance.json');
9
+
10
+ function parsePositivePid(value) {
11
+ const pid = Number(value);
12
+ return Number.isFinite(pid) && pid > 0 ? pid : null;
13
+ }
14
+
15
+ function readActiveInstance() {
16
+ try {
17
+ const active = JSON.parse(fs.readFileSync(ACTIVE_INSTANCE_FILE, 'utf8'));
18
+ return activeInstanceStaleReason(active) ? null : active;
19
+ } catch {
20
+ return null;
21
+ }
22
+ }
23
+
24
+ function getActiveOwnerPid(active) {
25
+ return parsePositivePid(active && active.ownerLeadPid)
26
+ || parsePositivePid(active && active.terminalLeadPid)
27
+ || parsePositivePid(active && active.supervisor_pid)
28
+ || parsePositivePid(active && active.instanceId);
29
+ }
30
+
31
+ function isPidAlive(pid) {
32
+ const n = parsePositivePid(pid);
33
+ if (!n) return false;
34
+ try {
35
+ process.kill(n, 0);
36
+ return true;
37
+ } catch (err) {
38
+ return err && err.code === 'EPERM';
39
+ }
40
+ }
41
+
42
+ function activeInstanceStaleReason(active) {
43
+ const ownerPid = getActiveOwnerPid(active);
44
+ if (!isPidAlive(ownerPid)) return `owner PID ${ownerPid || 'unknown'} is dead`;
45
+ const channelsPid = parsePositivePid(active && active.channels_pid);
46
+ if (channelsPid && !isPidAlive(channelsPid)) return `channels PID ${channelsPid} is dead`;
47
+ const workerPid = parsePositivePid(active && active.worker_pid);
48
+ if (workerPid && !isPidAlive(workerPid)) return `worker PID ${workerPid} is dead`;
49
+ const serverPid = parsePositivePid(active && active.server_pid);
50
+ if (serverPid && !isPidAlive(serverPid)) return `server PID ${serverPid} is dead`;
51
+ return '';
52
+ }
53
+
54
+ function getPermissionInstanceId(active) {
55
+ return getPermissionInstanceIds(active)[0] || '';
56
+ }
57
+
58
+ function getPermissionInstanceIds(active) {
59
+ const ids = [];
60
+ const ownerPid = parsePositivePid(active && active.ownerLeadPid)
61
+ || parsePositivePid(active && active.terminalLeadPid);
62
+ if (ownerPid) ids.push(String(ownerPid));
63
+ if (active && active.instanceId) ids.push(String(active.instanceId));
64
+ return [...new Set(ids.filter(Boolean))];
65
+ }
66
+
67
+ module.exports = {
68
+ ACTIVE_INSTANCE_FILE,
69
+ RUNTIME_ROOT,
70
+ activeInstanceStaleReason,
71
+ getActiveOwnerPid,
72
+ getPermissionInstanceId,
73
+ getPermissionInstanceIds,
74
+ isPidAlive,
75
+ parsePositivePid,
76
+ readActiveInstance,
77
+ };