@adhdev/daemon-core 0.9.82-rc.5 → 0.9.82-rc.500

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 (479) hide show
  1. package/dist/boot/daemon-lifecycle.d.ts +11 -0
  2. package/dist/boot/process-hardening.d.ts +50 -0
  3. package/dist/build-info.d.ts +37 -0
  4. package/dist/chat/source-machine.d.ts +166 -0
  5. package/dist/chat/source-resolver.d.ts +104 -0
  6. package/dist/chat/subscription-updates.d.ts +1 -0
  7. package/dist/cli-adapter-types.d.ts +85 -2
  8. package/dist/cli-adapters/cli-script-runner.d.ts +117 -0
  9. package/dist/cli-adapters/cli-state-engine.d.ts +246 -0
  10. package/dist/cli-adapters/provider-cli-adapter.d.ts +139 -64
  11. package/dist/cli-adapters/provider-cli-parse.d.ts +5 -0
  12. package/dist/cli-adapters/provider-cli-runtime.d.ts +34 -0
  13. package/dist/cli-adapters/provider-cli-shared.d.ts +74 -0
  14. package/dist/cli-adapters/pty-write-chunking.d.ts +34 -0
  15. package/dist/cli-adapters/raw-terminal-io.d.ts +37 -0
  16. package/dist/cli-adapters/resolve-executable.d.ts +69 -0
  17. package/dist/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +6 -3
  18. package/dist/cli-adapters/terminal-backends/types.d.ts +10 -2
  19. package/dist/cli-adapters/terminal-screen.d.ts +4 -11
  20. package/dist/commands/chat-commands-debug-bundle.d.ts +14 -0
  21. package/dist/commands/chat-commands-read.d.ts +23 -0
  22. package/dist/commands/chat-commands-scope.d.ts +39 -0
  23. package/dist/commands/chat-commands-shared.d.ts +33 -0
  24. package/dist/commands/chat-commands-write.d.ts +14 -0
  25. package/dist/commands/chat-commands.d.ts +10 -23
  26. package/dist/commands/cli-manager.d.ts +71 -1
  27. package/dist/commands/handler.d.ts +125 -0
  28. package/dist/commands/high-family/index.d.ts +3 -0
  29. package/dist/commands/high-family/mesh-coordinator-launch.d.ts +2 -0
  30. package/dist/commands/high-family/mesh-events.d.ts +2 -0
  31. package/dist/commands/high-family/mesh-status.d.ts +2 -0
  32. package/dist/commands/high-family/types.d.ts +64 -0
  33. package/dist/commands/low-family/coordinator-prompt.d.ts +9 -0
  34. package/dist/commands/low-family/daemon-lifecycle.d.ts +2 -0
  35. package/dist/commands/low-family/diagnostics.d.ts +2 -0
  36. package/dist/commands/low-family/index.d.ts +3 -0
  37. package/dist/commands/low-family/mesh-ledger.d.ts +10 -0
  38. package/dist/commands/low-family/mesh-node-logs.d.ts +2 -0
  39. package/dist/commands/low-family/notification.d.ts +2 -0
  40. package/dist/commands/low-family/refine-config.d.ts +2 -0
  41. package/dist/commands/low-family/session-host.d.ts +2 -0
  42. package/dist/commands/low-family/spec-providerdev.d.ts +11 -0
  43. package/dist/commands/low-family/status-meta.d.ts +2 -0
  44. package/dist/commands/low-family/types.d.ts +33 -0
  45. package/dist/commands/med-family/cli-agent.d.ts +2 -0
  46. package/dist/commands/med-family/fast-forward.d.ts +2 -0
  47. package/dist/commands/med-family/ide.d.ts +10 -0
  48. package/dist/commands/med-family/index.d.ts +3 -0
  49. package/dist/commands/med-family/mesh-crud.d.ts +48 -0
  50. package/dist/commands/med-family/mesh-host-pairing.d.ts +2 -0
  51. package/dist/commands/med-family/mesh-queue.d.ts +2 -0
  52. package/dist/commands/med-family/mesh-restart.d.ts +2 -0
  53. package/dist/commands/med-family/types.d.ts +152 -0
  54. package/dist/commands/mesh-coordinator.d.ts +85 -1
  55. package/dist/commands/router-aggregate-status.d.ts +24 -0
  56. package/dist/commands/router-mesh-session-owner.d.ts +59 -0
  57. package/dist/commands/router-refine.d.ts +151 -0
  58. package/dist/commands/router-worktree-cleanup.d.ts +133 -0
  59. package/dist/commands/router.d.ts +212 -11
  60. package/dist/commands/upgrade-helper.d.ts +41 -1
  61. package/dist/config/chat-history.d.ts +11 -0
  62. package/dist/config/config.d.ts +19 -0
  63. package/dist/config/mesh-config.d.ts +132 -1
  64. package/dist/config/mesh-json-config.d.ts +199 -0
  65. package/dist/config/registry-resolver.d.ts +54 -0
  66. package/dist/config/repo-settings.d.ts +77 -0
  67. package/dist/config/state-store.d.ts +30 -0
  68. package/dist/daemon/dev-server.d.ts +0 -2
  69. package/dist/detection/cli-detector.d.ts +17 -0
  70. package/dist/detection/ide-detector.d.ts +13 -0
  71. package/dist/detection/win32-ide-version.d.ts +37 -0
  72. package/dist/git/change-impact-config.d.ts +159 -0
  73. package/dist/git/git-commands.d.ts +27 -2
  74. package/dist/git/git-diff.d.ts +6 -0
  75. package/dist/git/git-executor.d.ts +11 -0
  76. package/dist/git/git-status.d.ts +85 -0
  77. package/dist/git/git-types.d.ts +5 -43
  78. package/dist/git/git-worktree.d.ts +71 -1
  79. package/dist/git/index.d.ts +3 -1
  80. package/dist/index.d.ts +74 -17
  81. package/dist/index.js +61082 -24164
  82. package/dist/index.js.map +1 -1
  83. package/dist/index.mjs +57034 -20299
  84. package/dist/index.mjs.map +1 -1
  85. package/dist/installer.d.ts +1 -4
  86. package/dist/ipc/local-ipc-server.d.ts +91 -0
  87. package/dist/launch.d.ts +1 -1
  88. package/dist/logging/async-batch-writer.d.ts +10 -0
  89. package/dist/logging/debug-config.d.ts +16 -0
  90. package/dist/logging/log-redactor.d.ts +24 -0
  91. package/dist/logging/log-tail-reader.d.ts +81 -0
  92. package/dist/logging/logger.d.ts +1 -1
  93. package/dist/mesh/contracts.d.ts +256 -0
  94. package/dist/mesh/coordinator-prompt.d.ts +76 -0
  95. package/dist/mesh/coordinator-registry.d.ts +59 -0
  96. package/dist/mesh/mesh-active-work.d.ts +203 -0
  97. package/dist/mesh/mesh-clone-grace.d.ts +8 -0
  98. package/dist/mesh/mesh-completion-synthesis.d.ts +4 -0
  99. package/dist/mesh/mesh-coordinator-config.d.ts +21 -0
  100. package/dist/mesh/mesh-delivery-policy.d.ts +104 -0
  101. package/dist/mesh/mesh-event-classify.d.ts +7 -0
  102. package/dist/mesh/mesh-event-forwarding.d.ts +58 -0
  103. package/dist/mesh/mesh-event-trace.d.ts +21 -0
  104. package/dist/mesh/mesh-events-coordinator.d.ts +4 -0
  105. package/dist/mesh/mesh-events-pending.d.ts +258 -0
  106. package/dist/mesh/mesh-events-stale.d.ts +61 -0
  107. package/dist/mesh/mesh-events-utils.d.ts +75 -0
  108. package/dist/mesh/mesh-events.d.ts +6 -37
  109. package/dist/mesh/mesh-fast-forward.d.ts +81 -0
  110. package/dist/mesh/mesh-host-ownership.d.ts +29 -0
  111. package/dist/mesh/mesh-idle-reminder.d.ts +68 -0
  112. package/dist/mesh/mesh-init.d.ts +128 -0
  113. package/dist/mesh/mesh-ledger-reconciliation.d.ts +23 -4
  114. package/dist/mesh/mesh-ledger.d.ts +139 -1
  115. package/dist/mesh/mesh-magi-status.d.ts +63 -0
  116. package/dist/mesh/mesh-missions.d.ts +281 -0
  117. package/dist/mesh/mesh-node-identity.d.ts +310 -0
  118. package/dist/mesh/mesh-queue-assignment.d.ts +162 -0
  119. package/dist/mesh/mesh-reconcile-acked-hold.d.ts +17 -0
  120. package/dist/mesh/mesh-reconcile-config.d.ts +6 -0
  121. package/dist/mesh/mesh-reconcile-identity.d.ts +6 -0
  122. package/dist/mesh/mesh-reconcile-loop.d.ts +84 -0
  123. package/dist/mesh/mesh-reconcile-v2-backstop.d.ts +16 -0
  124. package/dist/mesh/mesh-refine-batch.d.ts +68 -0
  125. package/dist/mesh/mesh-refine-gates.d.ts +457 -0
  126. package/dist/mesh/mesh-refine-status.d.ts +62 -0
  127. package/dist/mesh/mesh-remote-event-pull.d.ts +15 -0
  128. package/dist/mesh/mesh-review-inbox.d.ts +90 -0
  129. package/dist/mesh/mesh-routing.d.ts +70 -0
  130. package/dist/mesh/mesh-runtime-store.d.ts +584 -0
  131. package/dist/mesh/mesh-scheduling-runtime.d.ts +78 -0
  132. package/dist/mesh/mesh-task-inflight.d.ts +46 -0
  133. package/dist/mesh/mesh-task-stats.d.ts +49 -0
  134. package/dist/mesh/mesh-unresolved-forward-outbox.d.ts +34 -0
  135. package/dist/mesh/mesh-warmup-deadline.d.ts +68 -0
  136. package/dist/mesh/mesh-work-queue.d.ts +403 -6
  137. package/dist/mesh/preview-freshness.d.ts +28 -0
  138. package/dist/mesh/refine-config.d.ts +216 -0
  139. package/dist/mesh/worktree-bootstrap-config.d.ts +219 -0
  140. package/dist/providers/acp-provider-instance.d.ts +5 -0
  141. package/dist/providers/approval-utils.d.ts +46 -0
  142. package/dist/providers/chat-message-normalization.d.ts +58 -0
  143. package/dist/providers/cli-provider-effect-format.d.ts +30 -0
  144. package/dist/providers/cli-provider-history-dedup.d.ts +17 -0
  145. package/dist/providers/cli-provider-input-prompt.d.ts +12 -0
  146. package/dist/providers/cli-provider-instance-types.d.ts +47 -0
  147. package/dist/providers/cli-provider-instance.d.ts +461 -30
  148. package/dist/providers/cli-provider-status-helpers.d.ts +46 -0
  149. package/dist/providers/cli-provider-transcript-merge.d.ts +7 -0
  150. package/dist/providers/contracts.d.ts +196 -6
  151. package/dist/providers/external-sources.d.ts +71 -0
  152. package/dist/providers/manual-attendance.d.ts +79 -0
  153. package/dist/providers/native-history/antigravity-claim-registry.d.ts +39 -0
  154. package/dist/providers/native-history/antigravity-cli-transcript.d.ts +137 -0
  155. package/dist/providers/native-history/claude-cli-transcript.d.ts +70 -0
  156. package/dist/providers/native-history/codex-cli-transcript.d.ts +73 -0
  157. package/dist/providers/native-history/constants.d.ts +12 -0
  158. package/dist/providers/native-history/dispatcher.d.ts +44 -0
  159. package/dist/providers/native-history/hermes-cli-transcript.d.ts +30 -0
  160. package/dist/providers/native-history/index.d.ts +13 -0
  161. package/dist/providers/provider-instance-manager.d.ts +30 -0
  162. package/dist/providers/provider-instance.d.ts +31 -1
  163. package/dist/providers/provider-loader.d.ts +42 -5
  164. package/dist/providers/provider-trust.d.ts +31 -0
  165. package/dist/providers/read-chat-contract.d.ts +29 -0
  166. package/dist/providers/sdk/v1/builders/acp/detect-status.d.ts +68 -0
  167. package/dist/providers/sdk/v1/builders/cli/detect-status.d.ts +86 -0
  168. package/dist/providers/sdk/v1/builders/cli/parse-approval-squash.d.ts +59 -0
  169. package/dist/providers/sdk/v1/builders/cli/parse-approval.d.ts +65 -0
  170. package/dist/providers/sdk/v1/builders/cli/parse-session.d.ts +91 -0
  171. package/dist/providers/sdk/v1/builders/cli/visible-region.d.ts +42 -0
  172. package/dist/providers/sdk/v1/fixture-tooling/format.d.ts +126 -0
  173. package/dist/providers/sdk/v1/fixture-tooling/index.d.ts +8 -0
  174. package/dist/providers/sdk/v1/fixture-tooling/replay.d.ts +38 -0
  175. package/dist/providers/sdk/v1/index.d.ts +30 -0
  176. package/dist/providers/sdk/v1/sandbox/README-design.d.ts +193 -0
  177. package/dist/providers/sdk/v1/sandbox/require-whitelist.d.ts +74 -0
  178. package/dist/providers/sdk/v1/sandbox/script-runner.d.ts +98 -0
  179. package/dist/providers/sdk/v1/types/cli/index.d.ts +277 -0
  180. package/dist/providers/sdk/v1/types/common/index.d.ts +203 -0
  181. package/dist/providers/sdk/v1/validators/index.d.ts +5 -0
  182. package/dist/providers/sdk/v1/validators/manifest.d.ts +40 -0
  183. package/dist/providers/sdk/v1/validators/taint.d.ts +52 -0
  184. package/dist/providers/spec/adapter.d.ts +98 -0
  185. package/dist/providers/spec/background-task-detector.d.ts +29 -0
  186. package/dist/providers/spec/cli-adapter.d.ts +224 -0
  187. package/dist/providers/spec/evaluator.d.ts +45 -0
  188. package/dist/providers/spec/fsm-driver.d.ts +449 -0
  189. package/dist/providers/spec/fsm-evaluator.d.ts +93 -0
  190. package/dist/providers/spec/fsm-loader.d.ts +14 -0
  191. package/dist/providers/spec/fsm-types.d.ts +202 -0
  192. package/dist/providers/spec/native-history-executor.d.ts +50 -0
  193. package/dist/providers/spec/pre-launch-trust.d.ts +16 -0
  194. package/dist/providers/spec/route.d.ts +4 -0
  195. package/dist/providers/spec/types.d.ts +244 -0
  196. package/dist/providers/status-monitor.d.ts +7 -7
  197. package/dist/providers/transcript-v2.d.ts +176 -0
  198. package/dist/providers/types/interactive-prompt.d.ts +84 -0
  199. package/dist/providers/working-dir.d.ts +17 -0
  200. package/dist/repo-mesh-types.d.ts +778 -3
  201. package/dist/runtime-defaults.d.ts +2 -0
  202. package/dist/session-host/managed-host.d.ts +64 -0
  203. package/dist/session-host/runtime-surface.d.ts +10 -16
  204. package/dist/sessions/registry.d.ts +26 -0
  205. package/dist/shared-types-extra.d.ts +2 -4
  206. package/dist/shared-types.d.ts +110 -55
  207. package/dist/status/chat-tail-hot-sessions.d.ts +40 -0
  208. package/dist/status/normalize.d.ts +1 -1
  209. package/dist/status/normalize.js +1 -0
  210. package/dist/status/normalize.js.map +1 -1
  211. package/dist/status/normalize.mjs +1 -0
  212. package/dist/status/normalize.mjs.map +1 -1
  213. package/dist/status/reporter.d.ts +2 -0
  214. package/dist/status/snapshot.d.ts +27 -0
  215. package/dist/system/hash.d.ts +8 -0
  216. package/dist/system/load-better-sqlite3.d.ts +21 -0
  217. package/dist/types.d.ts +20 -6
  218. package/package.json +11 -4
  219. package/src/agent-stream/poller.ts +2 -3
  220. package/src/agent-stream/provider-adapter.ts +1 -1
  221. package/src/boot/daemon-lifecycle.ts +83 -14
  222. package/src/boot/process-hardening.ts +89 -0
  223. package/src/build-info.ts +73 -0
  224. package/src/chat/source-machine.ts +534 -0
  225. package/src/chat/source-resolver.ts +0 -0
  226. package/src/chat/subscription-updates.ts +20 -1
  227. package/src/cli-adapter-types.d.ts +3 -1
  228. package/src/cli-adapter-types.ts +85 -2
  229. package/src/cli-adapters/cli-script-runner.ts +421 -0
  230. package/src/cli-adapters/cli-state-engine.ts +1379 -0
  231. package/src/cli-adapters/provider-cli-adapter.d.ts +1 -1
  232. package/src/cli-adapters/provider-cli-adapter.ts +1059 -1143
  233. package/src/cli-adapters/provider-cli-parse.d.ts +2 -0
  234. package/src/cli-adapters/provider-cli-parse.ts +19 -0
  235. package/src/cli-adapters/provider-cli-runtime.ts +56 -7
  236. package/src/cli-adapters/provider-cli-shared.d.ts +4 -0
  237. package/src/cli-adapters/provider-cli-shared.ts +121 -11
  238. package/src/cli-adapters/pty-transport.ts +2 -1
  239. package/src/cli-adapters/pty-write-chunking.ts +106 -0
  240. package/src/cli-adapters/raw-terminal-io.ts +252 -0
  241. package/src/cli-adapters/resolve-executable.ts +204 -0
  242. package/src/cli-adapters/session-host-transport.ts +2 -1
  243. package/src/cli-adapters/terminal-backends/ghostty-vt-backend.ts +63 -29
  244. package/src/cli-adapters/terminal-backends/types.ts +10 -3
  245. package/src/cli-adapters/terminal-screen.ts +16 -81
  246. package/src/commands/chat-commands-debug-bundle.ts +398 -0
  247. package/src/commands/chat-commands-read.ts +2788 -0
  248. package/src/commands/chat-commands-scope.ts +54 -0
  249. package/src/commands/chat-commands-shared.ts +114 -0
  250. package/src/commands/chat-commands-write.ts +891 -0
  251. package/src/commands/chat-commands.ts +19 -1841
  252. package/src/commands/cli-manager.d.ts +2 -0
  253. package/src/commands/cli-manager.ts +724 -27
  254. package/src/commands/handler.ts +865 -2
  255. package/src/commands/high-family/index.ts +28 -0
  256. package/src/commands/high-family/mesh-coordinator-launch.ts +696 -0
  257. package/src/commands/high-family/mesh-events.ts +102 -0
  258. package/src/commands/high-family/mesh-status.ts +857 -0
  259. package/src/commands/high-family/types.ts +80 -0
  260. package/src/commands/low-family/coordinator-prompt.ts +125 -0
  261. package/src/commands/low-family/daemon-lifecycle.ts +120 -0
  262. package/src/commands/low-family/diagnostics.ts +57 -0
  263. package/src/commands/low-family/index.ts +37 -0
  264. package/src/commands/low-family/mesh-ledger.ts +62 -0
  265. package/src/commands/low-family/mesh-node-logs.ts +87 -0
  266. package/src/commands/low-family/notification.ts +116 -0
  267. package/src/commands/low-family/refine-config.ts +106 -0
  268. package/src/commands/low-family/session-host.ts +282 -0
  269. package/src/commands/low-family/spec-providerdev.ts +217 -0
  270. package/src/commands/low-family/status-meta.ts +112 -0
  271. package/src/commands/low-family/types.ts +39 -0
  272. package/src/commands/med-family/cli-agent.ts +270 -0
  273. package/src/commands/med-family/fast-forward.ts +230 -0
  274. package/src/commands/med-family/ide.ts +163 -0
  275. package/src/commands/med-family/index.ts +37 -0
  276. package/src/commands/med-family/mesh-crud.ts +1309 -0
  277. package/src/commands/med-family/mesh-host-pairing.ts +234 -0
  278. package/src/commands/med-family/mesh-queue.ts +167 -0
  279. package/src/commands/med-family/mesh-restart.ts +92 -0
  280. package/src/commands/med-family/types.ts +153 -0
  281. package/src/commands/mesh-coordinator.ts +334 -124
  282. package/src/commands/router-aggregate-status.ts +209 -0
  283. package/src/commands/router-mesh-session-owner.ts +114 -0
  284. package/src/commands/router-refine.ts +1794 -0
  285. package/src/commands/router-worktree-cleanup.ts +870 -0
  286. package/src/commands/router.ts +657 -2704
  287. package/src/commands/stream-commands.ts +8 -0
  288. package/src/commands/upgrade-helper.ts +310 -45
  289. package/src/config/chat-history.ts +517 -24
  290. package/src/config/config.ts +30 -0
  291. package/src/config/mesh-config.ts +542 -23
  292. package/src/config/mesh-json-config.ts +376 -0
  293. package/src/config/recent-activity.ts +8 -2
  294. package/src/config/registry-resolver.ts +100 -0
  295. package/src/config/repo-settings.ts +111 -0
  296. package/src/config/state-store.ts +55 -0
  297. package/src/daemon/dev-auto-implement.ts +3 -2
  298. package/src/daemon/dev-cli-debug.ts +10 -1
  299. package/src/daemon/dev-server.ts +0 -541
  300. package/src/detection/cli-detector.ts +94 -9
  301. package/src/detection/ide-detector.ts +55 -16
  302. package/src/detection/win32-ide-version.ts +106 -0
  303. package/src/git/change-impact-config.ts +354 -0
  304. package/src/git/git-commands.ts +113 -17
  305. package/src/git/git-diff.ts +81 -11
  306. package/src/git/git-executor.ts +12 -0
  307. package/src/git/git-status.ts +916 -51
  308. package/src/git/git-summary.ts +3 -0
  309. package/src/git/git-types.ts +17 -54
  310. package/src/git/git-worktree.ts +261 -4
  311. package/src/git/index.ts +17 -0
  312. package/src/index.ts +221 -13
  313. package/src/installer.d.ts +1 -1
  314. package/src/installer.ts +8 -6
  315. package/src/ipc/local-ipc-server.ts +278 -0
  316. package/src/launch.d.ts +1 -1
  317. package/src/launch.ts +37 -28
  318. package/src/logging/async-batch-writer.ts +55 -0
  319. package/src/logging/command-log.ts +7 -5
  320. package/src/logging/debug-config.ts +25 -0
  321. package/src/logging/debug-trace.ts +7 -2
  322. package/src/logging/log-redactor.ts +100 -0
  323. package/src/logging/log-tail-reader.ts +341 -0
  324. package/src/logging/logger.ts +14 -7
  325. package/src/mesh/contracts.ts +510 -0
  326. package/src/mesh/coordinator-prompt.ts +626 -34
  327. package/src/mesh/coordinator-registry.ts +121 -0
  328. package/src/mesh/mesh-active-work.ts +706 -0
  329. package/src/mesh/mesh-clone-grace.ts +68 -0
  330. package/src/mesh/mesh-completion-synthesis.ts +416 -0
  331. package/src/mesh/mesh-coordinator-config.ts +97 -0
  332. package/src/mesh/mesh-delivery-policy.ts +284 -0
  333. package/src/mesh/mesh-event-classify.ts +78 -0
  334. package/src/mesh/mesh-event-forwarding.ts +2042 -0
  335. package/src/mesh/mesh-event-trace.ts +67 -0
  336. package/src/mesh/mesh-events-coordinator.ts +32 -0
  337. package/src/mesh/mesh-events-pending.ts +1548 -0
  338. package/src/mesh/mesh-events-stale.ts +452 -0
  339. package/src/mesh/mesh-events-utils.ts +443 -0
  340. package/src/mesh/mesh-events.ts +43 -897
  341. package/src/mesh/mesh-fast-forward.ts +856 -0
  342. package/src/mesh/mesh-host-ownership.ts +111 -0
  343. package/src/mesh/mesh-idle-reminder.ts +153 -0
  344. package/src/mesh/mesh-init.ts +350 -0
  345. package/src/mesh/mesh-ledger-reconciliation.ts +12 -7
  346. package/src/mesh/mesh-ledger.ts +898 -102
  347. package/src/mesh/mesh-magi-status.ts +223 -0
  348. package/src/mesh/mesh-missions.ts +695 -0
  349. package/src/mesh/mesh-node-identity.ts +2065 -0
  350. package/src/mesh/mesh-queue-assignment.ts +2498 -0
  351. package/src/mesh/mesh-reconcile-acked-hold.ts +230 -0
  352. package/src/mesh/mesh-reconcile-config.ts +66 -0
  353. package/src/mesh/mesh-reconcile-identity.ts +103 -0
  354. package/src/mesh/mesh-reconcile-loop.ts +1709 -0
  355. package/src/mesh/mesh-reconcile-v2-backstop.ts +62 -0
  356. package/src/mesh/mesh-refine-batch.ts +205 -0
  357. package/src/mesh/mesh-refine-gates.ts +1792 -0
  358. package/src/mesh/mesh-refine-status.ts +231 -0
  359. package/src/mesh/mesh-remote-event-pull.ts +286 -0
  360. package/src/mesh/mesh-review-inbox.ts +308 -0
  361. package/src/mesh/mesh-routing.ts +291 -0
  362. package/src/mesh/mesh-runtime-store.ts +2318 -0
  363. package/src/mesh/mesh-scheduling-runtime.ts +198 -0
  364. package/src/mesh/mesh-task-inflight.ts +70 -0
  365. package/src/mesh/mesh-task-stats.ts +161 -0
  366. package/src/mesh/mesh-unresolved-forward-outbox.ts +215 -0
  367. package/src/mesh/mesh-warmup-deadline.ts +152 -0
  368. package/src/mesh/mesh-work-queue.ts +1532 -161
  369. package/src/mesh/p2p-relay-failure.ts +2 -2
  370. package/src/mesh/preview-freshness.ts +163 -0
  371. package/src/mesh/refine-config.ts +423 -0
  372. package/src/mesh/worktree-bootstrap-config.ts +599 -0
  373. package/src/providers/acp-provider-instance.ts +43 -10
  374. package/src/providers/approval-utils.d.ts +5 -0
  375. package/src/providers/approval-utils.ts +100 -6
  376. package/src/providers/chat-message-normalization.ts +128 -4
  377. package/src/providers/cli-provider-effect-format.ts +53 -0
  378. package/src/providers/cli-provider-history-dedup.ts +75 -0
  379. package/src/providers/cli-provider-input-prompt.ts +133 -0
  380. package/src/providers/cli-provider-instance-types.ts +150 -0
  381. package/src/providers/cli-provider-instance.ts +2914 -498
  382. package/src/providers/cli-provider-status-helpers.ts +123 -0
  383. package/src/providers/cli-provider-transcript-merge.ts +114 -0
  384. package/src/providers/contracts.d.ts +55 -0
  385. package/src/providers/contracts.ts +207 -6
  386. package/src/providers/extension-provider-instance.ts +12 -7
  387. package/src/providers/external-sources.ts +218 -0
  388. package/src/providers/ide-provider-instance.ts +35 -12
  389. package/src/providers/manual-attendance.ts +105 -0
  390. package/src/providers/native-history/antigravity-claim-registry.ts +138 -0
  391. package/src/providers/native-history/antigravity-cli-transcript.ts +1275 -0
  392. package/src/providers/native-history/claude-cli-transcript.ts +396 -0
  393. package/src/providers/native-history/codex-cli-transcript.ts +479 -0
  394. package/src/providers/native-history/constants.ts +19 -0
  395. package/src/providers/native-history/dispatcher.ts +617 -0
  396. package/src/providers/native-history/hermes-cli-transcript.ts +312 -0
  397. package/src/providers/native-history/index.ts +30 -0
  398. package/src/providers/provider-instance-manager.ts +71 -0
  399. package/src/providers/provider-instance.ts +24 -1
  400. package/src/providers/provider-loader.ts +700 -55
  401. package/src/providers/provider-schema.ts +93 -14
  402. package/src/providers/provider-trust.ts +114 -0
  403. package/src/providers/read-chat-contract.ts +76 -16
  404. package/src/providers/sdk/README.md +49 -0
  405. package/src/providers/sdk/v1/builders/acp/detect-status.ts +144 -0
  406. package/src/providers/sdk/v1/builders/cli/detect-status.ts +313 -0
  407. package/src/providers/sdk/v1/builders/cli/parse-approval-squash.ts +158 -0
  408. package/src/providers/sdk/v1/builders/cli/parse-approval.ts +261 -0
  409. package/src/providers/sdk/v1/builders/cli/parse-session.ts +276 -0
  410. package/src/providers/sdk/v1/builders/cli/visible-region.ts +143 -0
  411. package/src/providers/sdk/v1/fixture-tooling/format.ts +130 -0
  412. package/src/providers/sdk/v1/fixture-tooling/index.ts +22 -0
  413. package/src/providers/sdk/v1/fixture-tooling/replay.ts +352 -0
  414. package/src/providers/sdk/v1/index.ts +152 -0
  415. package/src/providers/sdk/v1/sandbox/README-design.ts +195 -0
  416. package/src/providers/sdk/v1/sandbox/require-whitelist.ts +472 -0
  417. package/src/providers/sdk/v1/sandbox/script-runner.ts +150 -0
  418. package/src/providers/sdk/v1/schemas/cli/provider.schema.json +538 -0
  419. package/src/providers/sdk/v1/schemas/primitives/acp-session-protocol-v1.json +131 -0
  420. package/src/providers/sdk/v1/schemas/primitives/native-history-codex-rollout-v1.json +66 -0
  421. package/src/providers/sdk/v1/schemas/primitives/tui-approval-squash-v1.json +91 -0
  422. package/src/providers/sdk/v1/schemas/primitives/tui-assistant-block-v1.json +91 -0
  423. package/src/providers/sdk/v1/schemas/primitives/tui-cue-ordering-v1.json +47 -0
  424. package/src/providers/sdk/v1/schemas/primitives/tui-dispatch-order-v1.json +32 -0
  425. package/src/providers/sdk/v1/schemas/primitives/tui-footer-chrome-v1.json +42 -0
  426. package/src/providers/sdk/v1/schemas/primitives/tui-index-finder-v1.json +27 -0
  427. package/src/providers/sdk/v1/schemas/primitives/tui-modal-v1.json +125 -0
  428. package/src/providers/sdk/v1/schemas/primitives/tui-prompt-marker-v1.json +45 -0
  429. package/src/providers/sdk/v1/schemas/primitives/tui-session-id-extraction-v1.json +46 -0
  430. package/src/providers/sdk/v1/schemas/primitives/tui-settled-prompt-v1.json +71 -0
  431. package/src/providers/sdk/v1/schemas/primitives/tui-spinner-v1.json +83 -0
  432. package/src/providers/sdk/v1/schemas/primitives/tui-transcript-pty-v1.json +83 -0
  433. package/src/providers/sdk/v1/schemas/primitives/tui-visible-region-v1.json +57 -0
  434. package/src/providers/sdk/v1/schemas/primitives/tui-welcome-screen-v1.json +35 -0
  435. package/src/providers/sdk/v1/types/cli/index.ts +365 -0
  436. package/src/providers/sdk/v1/types/common/index.ts +229 -0
  437. package/src/providers/sdk/v1/validators/index.ts +19 -0
  438. package/src/providers/sdk/v1/validators/manifest.ts +110 -0
  439. package/src/providers/sdk/v1/validators/taint.ts +309 -0
  440. package/src/providers/spec/adapter.ts +246 -0
  441. package/src/providers/spec/background-task-detector.ts +178 -0
  442. package/src/providers/spec/cli-adapter.ts +1090 -0
  443. package/src/providers/spec/evaluator.ts +407 -0
  444. package/src/providers/spec/fsm-driver.ts +1528 -0
  445. package/src/providers/spec/fsm-evaluator.ts +290 -0
  446. package/src/providers/spec/fsm-loader.ts +128 -0
  447. package/src/providers/spec/fsm-types.ts +301 -0
  448. package/src/providers/spec/native-history-executor.ts +1256 -0
  449. package/src/providers/spec/pre-launch-trust.ts +104 -0
  450. package/src/providers/spec/route.ts +51 -0
  451. package/src/providers/spec/types.ts +284 -0
  452. package/src/providers/status-monitor.d.ts +7 -7
  453. package/src/providers/status-monitor.ts +37 -22
  454. package/src/providers/transcript-v2.ts +567 -0
  455. package/src/providers/types/interactive-prompt.ts +536 -0
  456. package/src/providers/version-archive.ts +64 -24
  457. package/src/providers/working-dir.ts +23 -0
  458. package/src/repo-mesh-types.ts +1040 -5
  459. package/src/runtime-defaults.ts +39 -0
  460. package/src/session-host/managed-host.ts +218 -0
  461. package/src/session-host/runtime-surface.ts +20 -80
  462. package/src/sessions/registry.ts +44 -0
  463. package/src/shared-types-extra.ts +2 -4
  464. package/src/shared-types.d.ts +8 -0
  465. package/src/shared-types.ts +148 -55
  466. package/src/status/builders.ts +69 -6
  467. package/src/status/chat-tail-hot-sessions.ts +117 -2
  468. package/src/status/normalize.ts +2 -0
  469. package/src/status/reporter.ts +19 -1
  470. package/src/status/snapshot.ts +100 -27
  471. package/src/system/hash.ts +23 -0
  472. package/src/system/host-memory.ts +29 -12
  473. package/src/system/load-better-sqlite3.ts +68 -0
  474. package/src/types.ts +26 -6
  475. package/dist/cli-adapters/terminal-backends/xterm-backend.d.ts +0 -17
  476. package/dist/mesh/mesh-sync.d.ts +0 -53
  477. package/src/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +0 -16
  478. package/src/cli-adapters/terminal-backends/xterm-backend.ts +0 -97
  479. package/src/mesh/mesh-sync.ts +0 -111
@@ -0,0 +1,111 @@
1
+ import { daemonIdsEquivalent } from '@adhdev/mesh-shared';
2
+ import type { RepoMeshDaemonRole, RepoMeshHostMetadata, RepoMeshHostStatus } from '../repo-mesh-types.js';
3
+
4
+ function readObject(value: unknown): Record<string, unknown> | null {
5
+ return value && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : null;
6
+ }
7
+
8
+ function readString(value: unknown): string | undefined {
9
+ return typeof value === 'string' && value.trim() ? value.trim() : undefined;
10
+ }
11
+
12
+ export function normalizeMeshDaemonRole(value: unknown): RepoMeshDaemonRole | undefined {
13
+ return value === 'host' || value === 'member' ? value : undefined;
14
+ }
15
+
16
+ /**
17
+ * Options for resolveMeshHostStatus's read-side host-pin default.
18
+ *
19
+ * `localDaemonId` is the id of the daemon evaluating the mesh (typically
20
+ * `deps.statusInstanceId`). When the persisted `meshHost` declares `role:'host'`
21
+ * but carries NO `hostDaemonId` (the first-setup miss — a host mesh whose pin was
22
+ * never written to config), the host daemon IS this local daemon by definition, so
23
+ * we synthesize `hostDaemonId = localDaemonId` (and, when the mesh has a node
24
+ * representing this daemon, `hostNodeId`). This is the read-side default — the SSOT
25
+ * is computed from the role + the evaluating daemon's identity rather than requiring
26
+ * a config migration to backfill every already-created mesh.
27
+ *
28
+ * HARD guard: the synthesis fires ONLY for `role:'host'`. A `role:'member'` daemon
29
+ * must NEVER fill itself in as host — that would make a member falsely claim
30
+ * coordinator/queue ownership.
31
+ */
32
+ export interface ResolveMeshHostOptions {
33
+ /** Id of the daemon evaluating this mesh (e.g. deps.statusInstanceId). */
34
+ localDaemonId?: string;
35
+ }
36
+
37
+ export function resolveMeshHostStatus(mesh: unknown, opts?: ResolveMeshHostOptions): RepoMeshHostStatus {
38
+ const meshRecord = readObject(mesh);
39
+ const raw = readObject(meshRecord?.meshHost);
40
+ const role = normalizeMeshDaemonRole(raw?.role) ?? 'host';
41
+ const pairing = readObject(raw?.pairing);
42
+ const normalized: RepoMeshHostStatus = {
43
+ role,
44
+ canOwnCoordinator: role === 'host',
45
+ canOwnQueue: role === 'host',
46
+ defaulted: !raw,
47
+ };
48
+ let hostDaemonId = readString(raw?.hostDaemonId);
49
+ let hostNodeId = readString(raw?.hostNodeId);
50
+ const hostAddress = readString(raw?.hostAddress);
51
+ // HOST-MISSEED-FIRSTSETUP read-side default: a host mesh with no persisted
52
+ // hostDaemonId is hosted by THIS daemon (role:'host' is local-relative), so
53
+ // fill the pin from the evaluating daemon. Member daemons are never synthesized.
54
+ const localDaemonId = readString(opts?.localDaemonId);
55
+ if (role === 'host' && !hostDaemonId && localDaemonId) {
56
+ hostDaemonId = localDaemonId;
57
+ // Anchor hostNodeId to the node representing this local daemon, when present.
58
+ if (!hostNodeId && Array.isArray(meshRecord?.nodes)) {
59
+ const selfNode = (meshRecord!.nodes as unknown[]).find(n => {
60
+ const nodeDaemonId = readString(readObject(n)?.daemonId);
61
+ return nodeDaemonId ? daemonIdsEquivalent(nodeDaemonId, localDaemonId) : false;
62
+ });
63
+ const selfNodeId = readString(readObject(selfNode)?.id);
64
+ if (selfNodeId) hostNodeId = selfNodeId;
65
+ }
66
+ }
67
+ if (hostDaemonId) normalized.hostDaemonId = hostDaemonId;
68
+ if (hostNodeId) normalized.hostNodeId = hostNodeId;
69
+ if (hostAddress) normalized.hostAddress = hostAddress;
70
+ if (pairing) {
71
+ const status = pairing.status === 'pairing' || pairing.status === 'paired' || pairing.status === 'rejected' || pairing.status === 'revoked'
72
+ ? pairing.status
73
+ : 'not_configured';
74
+ normalized.pairing = {
75
+ status,
76
+ ...(readString(pairing.tokenId) ? { tokenId: readString(pairing.tokenId) } : {}),
77
+ ...(readString(pairing.joinedAt) ? { joinedAt: readString(pairing.joinedAt) } : {}),
78
+ ...(readString(pairing.lastPairedAt) ? { lastPairedAt: readString(pairing.lastPairedAt) } : {}),
79
+ ...(readString(pairing.lastRejectedAt) ? { lastRejectedAt: readString(pairing.lastRejectedAt) } : {}),
80
+ ...(readString(pairing.expiresAt) ? { expiresAt: readString(pairing.expiresAt) } : {}),
81
+ };
82
+ }
83
+ return normalized;
84
+ }
85
+
86
+ export function isMeshHostOwner(mesh: unknown): boolean {
87
+ return resolveMeshHostStatus(mesh).role === 'host';
88
+ }
89
+
90
+ export function buildMeshHostRequiredFailure(mesh: unknown, operation: string): Record<string, unknown> {
91
+ const meshHost = resolveMeshHostStatus(mesh);
92
+ return {
93
+ success: false,
94
+ code: 'mesh_host_required',
95
+ error: `Mesh Host daemon required for ${operation}; member daemons must pair with the host and cannot own coordinator/queue mutations.`,
96
+ meshHost,
97
+ };
98
+ }
99
+
100
+ export function requireMeshHostQueueOwner(opts?: { ownerRole?: RepoMeshDaemonRole }): void {
101
+ if (opts?.ownerRole === 'member') {
102
+ throw new Error('Mesh Host daemon required to mutate mesh queue; member daemons must use the host-owned queue.');
103
+ }
104
+ }
105
+
106
+ export function createDefaultMeshHostMetadata(): RepoMeshHostMetadata {
107
+ return {
108
+ role: 'host',
109
+ pairing: { status: 'not_configured' },
110
+ };
111
+ }
@@ -0,0 +1,153 @@
1
+ /**
2
+ * Idle-active-mission reminder.
3
+ *
4
+ * When a coordinator session becomes fully idle — no queue/direct work in flight,
5
+ * no pending coordinator events to drain — yet the mesh still carries `active`
6
+ * missions, inject a one-shot "[System] Coordinator idle with N active mission(s)"
7
+ * reminder into that coordinator session. This nudges the coordinator to decide a
8
+ * lingering mission's real outcome (close it, or continue it) rather than leaving it
9
+ * drifting in `active` after its work is actually done.
10
+ *
11
+ * Precedent: mesh-missions.ts `maybeEmitMissionCloseCandidate` — a terminal-edge,
12
+ * once-per-edge coordinator nudge with an idempotency marker. This mirrors that
13
+ * shape, but the "edge" is the coordinator's idle transition (fired by the fast-path
14
+ * in mesh-event-forwarding and the slow-path idle tick in mesh-reconcile-loop) and
15
+ * the idempotency marker is a time+mission-set debounce held in MeshRuntimeStore
16
+ * (getIdleReminderState / setIdleReminderState). Fully best-effort: a throw here must
17
+ * never break the drain/injection path that called it.
18
+ *
19
+ * Design invariants:
20
+ * - Only fires when the mesh has ≥1 `active` mission AND is fully idle. Fully idle =
21
+ * buildMeshActiveWork over queue + direct dispatches reports totalActiveCount === 0
22
+ * && generatingCount === 0. We intentionally do NOT probe remote node sessions here
23
+ * (expensive per-tick RPC): any non-terminal queue/direct work already makes
24
+ * totalActiveCount > 0, so the idle check is conservative — it suppresses the
25
+ * reminder whenever any work is outstanding, which is the safe direction.
26
+ * - NEVER transitions a mission's status. It only surfaces a hint; the coordinator
27
+ * decides via mesh_mission_upsert.
28
+ * - Debounced per mission-set. Re-fires only when the debounce window has elapsed OR
29
+ * the set of active mission ids changed (a mission was closed/added), so a mesh that
30
+ * stays idle with the same active missions is nudged at most once per window.
31
+ * - Opt-out via policy.idleActiveMissionReminder === false.
32
+ */
33
+
34
+ import { LOG } from '../logging/logger.js';
35
+ import type { DaemonComponents } from '../boot/daemon-lifecycle.js';
36
+ import type { RepoMeshPolicy } from '../repo-mesh-types.js';
37
+ import { MeshRuntimeStore } from './mesh-runtime-store.js';
38
+ import { getMeshMissions, type MeshMissionRecord } from './mesh-missions.js';
39
+ import { getQueue, getActiveDirectDispatches } from './mesh-work-queue.js';
40
+ import { readLedgerEntries } from './mesh-ledger.js';
41
+ import { buildMeshActiveWork } from './mesh-active-work.js';
42
+
43
+ /** Coordinator instance the reminder is injected into (the idle CLI session). */
44
+ type CoordinatorInstance = ReturnType<DaemonComponents['instanceManager']['getInstance']>;
45
+
46
+ /**
47
+ * Debounce window: while the mesh stays idle with the SAME active-mission set, re-fire
48
+ * the reminder at most once per this interval. A changed mission set bypasses the window.
49
+ */
50
+ export const IDLE_REMINDER_DEBOUNCE_MS = 300_000; // 5 minutes
51
+
52
+ /** How many missions to name individually before folding the rest into "and M more". */
53
+ const MISSION_LIST_CAP = 10;
54
+
55
+ /** Stable hash of the active-mission id set (sorted, joined) for debounce comparison. */
56
+ export function missionSetHash(missions: MeshMissionRecord[]): string {
57
+ return missions.map(m => m.id).sort().join(',');
58
+ }
59
+
60
+ /**
61
+ * Decide whether a reminder should fire this call, given the debounce marker. Pure so it
62
+ * is independently testable. Re-fires when there is no prior marker, the debounce window
63
+ * has elapsed, or the active-mission set changed since the last reminder.
64
+ */
65
+ export function shouldFireIdleReminder(
66
+ last: { emittedAt: number; missionSetHash: string } | null,
67
+ hash: string,
68
+ now: number,
69
+ debounceMs: number = IDLE_REMINDER_DEBOUNCE_MS,
70
+ ): boolean {
71
+ if (!last) return true;
72
+ if (now - last.emittedAt > debounceMs) return true;
73
+ return hash !== last.missionSetHash;
74
+ }
75
+
76
+ /**
77
+ * Build the coordinator-facing reminder text. Deliberately terse — one line per mission
78
+ * (`title (id)`), NEVER the full goal (goals can be thousands of chars). When there are
79
+ * more than MISSION_LIST_CAP missions, name the first N and fold the remainder.
80
+ */
81
+ export function buildIdleReminderMessage(missions: MeshMissionRecord[]): string {
82
+ const shown = missions.slice(0, MISSION_LIST_CAP);
83
+ const lines = shown.map(m => `- ${m.title} (${m.id})`);
84
+ const overflow = missions.length - shown.length;
85
+ if (overflow > 0) lines.push(`- …and ${overflow} more`);
86
+ return (
87
+ `[System] Coordinator idle with ${missions.length} active mission(s):\n`
88
+ + `${lines.join('\n')}\n`
89
+ + `The mesh has no work in flight. For each mission, decide its outcome: continue it `
90
+ + `(enqueue/dispatch the remaining work) or close it with `
91
+ + `mesh_mission_upsert(mission_id, status: "completed" | "abandoned"). `
92
+ + `Do not leave a finished mission in 'active'. This is a one-time reminder.`
93
+ );
94
+ }
95
+
96
+ /**
97
+ * Fire-and-forget idle-active-mission reminder. Call this at a coordinator idle edge
98
+ * once the pending-event queue is empty (nothing else to inject). `coordinator` is the
99
+ * idle CLI session to inject into; `policy` is the mesh's policy (for the opt-out flag).
100
+ *
101
+ * Returns true iff a reminder was injected on this call.
102
+ */
103
+ export function maybeInjectIdleActiveMissionReminder(
104
+ meshId: string,
105
+ coordinator: CoordinatorInstance,
106
+ policy: RepoMeshPolicy | undefined,
107
+ now: number = Date.now(),
108
+ ): boolean {
109
+ try {
110
+ if (!coordinator) return false;
111
+ // Opt-out: default is ON; only an explicit false disables it.
112
+ if (policy?.idleActiveMissionReminder === false) return false;
113
+
114
+ // Active missions gate — no active mission, nothing to remind about.
115
+ const activeMissions = getMeshMissions(meshId, ['active']);
116
+ if (activeMissions.length === 0) return false;
117
+
118
+ // Fully-idle gate — any non-terminal queue/direct work suppresses the reminder.
119
+ // We pass no `nodes`: totalActiveCount already counts pending/assigned queue tasks
120
+ // and un-acknowledged direct dispatches from the store alone, so the check stays
121
+ // cheap (no per-node status RPC) and conservative.
122
+ const summary = buildMeshActiveWork({
123
+ meshId,
124
+ queue: getQueue(meshId),
125
+ directDispatches: getActiveDirectDispatches(meshId),
126
+ ledgerEntries: readLedgerEntries(meshId, { tail: 200 }),
127
+ now,
128
+ }).summary;
129
+ if (summary.totalActiveCount !== 0 || summary.generatingCount !== 0) return false;
130
+
131
+ // Debounce — same mission set within the window is nudged at most once.
132
+ const store = MeshRuntimeStore.getInstance();
133
+ const hash = missionSetHash(activeMissions);
134
+ const last = store.getIdleReminderState(meshId);
135
+ if (!shouldFireIdleReminder(last, hash, now)) return false;
136
+
137
+ const message = buildIdleReminderMessage(activeMissions);
138
+ coordinator.onEvent('send_message', {
139
+ input: { text: message, textFallback: message },
140
+ });
141
+ // Mark AFTER a successful inject so a mid-inject throw retries next edge rather
142
+ // than silently swallowing the only reminder.
143
+ store.setIdleReminderState(meshId, { emittedAt: now, missionSetHash: hash });
144
+ LOG.info(
145
+ 'MeshIdleReminder',
146
+ `Injected idle reminder for mesh ${meshId} (${activeMissions.length} active mission(s), fully idle)`,
147
+ );
148
+ return true;
149
+ } catch (e: any) {
150
+ LOG.warn('MeshIdleReminder', `maybeInjectIdleActiveMissionReminder failed for mesh ${meshId}: ${e?.message || e}`);
151
+ return false;
152
+ }
153
+ }
@@ -0,0 +1,350 @@
1
+ /**
2
+ * Mesh init / onboarding helper.
3
+ *
4
+ * One-shot helper that onboards an existing git project into Repo Mesh:
5
+ * 1. suggest + write `.adhdev/refine.json` (Refinery validation config)
6
+ * 2. suggest + write `.adhdev/worktree_bootstrap.json` (worktree bootstrap config)
7
+ * 3. suggest + write `.adhdev/change-impact.json` (change-impact classification)
8
+ * 4. recommend a node providerPriority from the installed CLI providers
9
+ *
10
+ * mesh_init now covers all THREE repo-committed `.adhdev/*` config families that
11
+ * carry a suggest→validate→write engine (refine + worktree_bootstrap +
12
+ * change-impact). `.adhdev/mesh.json` (coordinator prompt + operating notes) has
13
+ * its own dedicated export/write path (export_mesh_json_config / write_mesh_json_config).
14
+ *
15
+ * Design contract (matches the rest of the mesh tooling):
16
+ * - Heuristics are suggestion/scaffold only. The written files are the
17
+ * execution source of truth; Refinery/bootstrap only ever read the saved
18
+ * config. The suggestion functions never become the execution path.
19
+ * - Writing is opt-in (`write: true`) and never clobbers an existing config
20
+ * unless `overwrite: true` is set, so re-running init on an already-onboarded
21
+ * repo is safe.
22
+ * - The providerPriority recommendation is returned, not auto-applied to the
23
+ * node policy — applying it mutates mesh policy, which is the coordinator's
24
+ * decision.
25
+ */
26
+
27
+ import { existsSync, mkdirSync, writeFileSync } from 'fs';
28
+ import { dirname, join } from 'path';
29
+ import {
30
+ MESH_REFINE_CONFIG_LOCATIONS,
31
+ loadMeshRefineConfig,
32
+ suggestMeshRefineConfig,
33
+ validateMeshRefineConfig,
34
+ type RepoMeshRefineConfig,
35
+ type RepoMeshRefineValidationCommandConfig,
36
+ } from './refine-config.js';
37
+ import {
38
+ MESH_WORKTREE_BOOTSTRAP_CONFIG_LOCATIONS,
39
+ loadMeshWorktreeBootstrapConfig,
40
+ validateMeshWorktreeBootstrapConfig,
41
+ type RepoMeshWorktreeBootstrapConfig,
42
+ } from './worktree-bootstrap-config.js';
43
+ import {
44
+ CHANGE_IMPACT_CONFIG_LOCATIONS,
45
+ loadChangeImpactConfig,
46
+ suggestChangeImpactConfig,
47
+ validateChangeImpactConfig,
48
+ type ChangeImpactConfig,
49
+ } from '../git/change-impact-config.js';
50
+ import { listMagiKindPanels } from '../config/mesh-config.js';
51
+ import type { MagiKindPanelMap } from '@adhdev/mesh-shared';
52
+ import type { CLIInfo } from '../detection/cli-detector.js';
53
+
54
+ /** Canonical write targets — the first/preferred location for each config family. */
55
+ export const MESH_INIT_REFINE_CONFIG_PATH = MESH_REFINE_CONFIG_LOCATIONS[0];
56
+ export const MESH_INIT_WORKTREE_BOOTSTRAP_CONFIG_PATH = MESH_WORKTREE_BOOTSTRAP_CONFIG_LOCATIONS[0];
57
+ export const MESH_INIT_CHANGE_IMPACT_CONFIG_PATH = CHANGE_IMPACT_CONFIG_LOCATIONS[0];
58
+
59
+ /**
60
+ * Default lockfiles whose change should invalidate a 'ready' bootstrap.
61
+ * Only paths that actually exist in the workspace are recorded as staleInputs.
62
+ */
63
+ const CANDIDATE_STALE_INPUTS = [
64
+ 'package-lock.json',
65
+ 'pnpm-lock.yaml',
66
+ 'yarn.lock',
67
+ 'bun.lockb',
68
+ 'Cargo.lock',
69
+ 'go.sum',
70
+ 'poetry.lock',
71
+ 'requirements.txt',
72
+ ];
73
+
74
+ export interface MeshInitConfigFileResult {
75
+ path: string;
76
+ relativePath: string;
77
+ written: boolean;
78
+ /** Why it was not written (already_exists / not_suggested / no change). */
79
+ skippedReason?: 'already_exists' | 'no_suggestion';
80
+ config?: RepoMeshRefineConfig | RepoMeshWorktreeBootstrapConfig | ChangeImpactConfig;
81
+ }
82
+
83
+ /**
84
+ * Serialize a validated config to disk as pretty JSON, creating `.adhdev/` as
85
+ * needed. Returns the absolute path written. Never invoked unless the caller
86
+ * opted into writing.
87
+ */
88
+ function writeConfigFile(workspace: string, relativePath: string, config: unknown): string {
89
+ const target = join(workspace, relativePath);
90
+ mkdirSync(dirname(target), { recursive: true });
91
+ writeFileSync(target, `${JSON.stringify(config, null, 2)}\n`, 'utf-8');
92
+ return target;
93
+ }
94
+
95
+ /**
96
+ * Build a worktree_bootstrap scaffold from package scripts. Mirrors
97
+ * suggestMeshRefineConfig's "scaffold only" posture: prefers an `install`/`ci`
98
+ * style script, else falls back to `npm install`, and records existing
99
+ * lockfiles as staleInputs so a base merge that changes them re-runs bootstrap.
100
+ *
101
+ * Returns undefined when there is nothing meaningful to scaffold.
102
+ */
103
+ export function suggestMeshWorktreeBootstrapConfig(
104
+ workspace: string,
105
+ ): { commands: RepoMeshRefineValidationCommandConfig[]; staleInputs: string[]; suggestedConfig?: RepoMeshWorktreeBootstrapConfig } {
106
+ const commands: RepoMeshRefineValidationCommandConfig[] = [];
107
+ const hasPackageJson = existsSync(join(workspace, 'package.json'));
108
+ const hasNpmLock = existsSync(join(workspace, 'package-lock.json'));
109
+
110
+ if (hasPackageJson) {
111
+ // `npm ci` requires a lockfile; otherwise fall back to `npm install`.
112
+ commands.push(
113
+ hasNpmLock
114
+ ? { command: 'npm', args: ['ci'] }
115
+ : { command: 'npm', args: ['install'] },
116
+ );
117
+ }
118
+
119
+ const staleInputs = CANDIDATE_STALE_INPUTS.filter((relative) => existsSync(join(workspace, relative)));
120
+
121
+ if (!commands.length) {
122
+ return { commands, staleInputs };
123
+ }
124
+
125
+ return {
126
+ commands,
127
+ staleInputs,
128
+ suggestedConfig: {
129
+ version: 1,
130
+ enabled: true,
131
+ runOnClone: true,
132
+ required: false,
133
+ commands,
134
+ ...(staleInputs.length ? { staleInputs } : {}),
135
+ },
136
+ };
137
+ }
138
+
139
+ /**
140
+ * Map detected CLI providers → an ordered node providerPriority list.
141
+ * Suggestion only: returned for the coordinator to apply to node policy, never
142
+ * written into mesh policy here.
143
+ *
144
+ * Ordering preference (most → least preferred) when installed:
145
+ * claude-cli → codex-cli → gemini-cli → everything else (stable input order).
146
+ */
147
+ const PROVIDER_PRIORITY_PREFERENCE = ['claude-cli', 'codex-cli', 'gemini-cli'];
148
+
149
+ export function suggestNodeProviderPriority(detected: CLIInfo[]): {
150
+ providerPriority: string[];
151
+ installedProviders: Array<{ id: string; displayName: string; version?: string }>;
152
+ } {
153
+ const installed = detected.filter((cli) => cli.installed);
154
+ const installedIds = installed.map((cli) => cli.id);
155
+
156
+ const preferred = PROVIDER_PRIORITY_PREFERENCE.filter((id) => installedIds.includes(id));
157
+ const rest = installedIds.filter((id) => !preferred.includes(id));
158
+ const providerPriority = [...preferred, ...rest];
159
+
160
+ return {
161
+ providerPriority,
162
+ installedProviders: installed.map((cli) => ({
163
+ id: cli.id,
164
+ displayName: cli.displayName,
165
+ ...(cli.version ? { version: cli.version } : {}),
166
+ })),
167
+ };
168
+ }
169
+
170
+ export interface RunMeshInitOptions {
171
+ /** When true, persist suggested configs to disk. Defaults to dry-run (false). */
172
+ write?: boolean;
173
+ /** When true, overwrite an existing config file. Defaults to false (never clobber). */
174
+ overwrite?: boolean;
175
+ }
176
+
177
+ /**
178
+ * A snapshot of the currently-saved config for each domain, so the coordinator can
179
+ * render a current-vs-suggested diff to the user before an init/reinit overwrite.
180
+ * This is READ-ONLY echo — every field is what is on disk / machine-local right now,
181
+ * never a suggestion. Absent domains are reported as `undefined` config.
182
+ */
183
+ export interface MeshInitCurrentConfigEcho {
184
+ /** Currently-saved `.adhdev/refine.json` (repo-committed) — undefined when absent/invalid. */
185
+ refine?: RepoMeshRefineConfig;
186
+ /** Currently-saved `.adhdev/worktree_bootstrap.json` (repo-committed). */
187
+ worktreeBootstrap?: RepoMeshWorktreeBootstrapConfig;
188
+ /** Currently-saved `.adhdev/change-impact.json` (repo-committed). */
189
+ changeImpact?: ChangeImpactConfig;
190
+ /** Per-domain source type so the coordinator can tell "absent" from "invalid". */
191
+ sourceTypes: {
192
+ refine: string;
193
+ worktreeBootstrap: string;
194
+ changeImpact: string;
195
+ };
196
+ /**
197
+ * Currently-configured MAGI kind→panel slot bindings (machine-local
198
+ * ~/.adhdev/meshes.json). Empty object when none configured. This is a
199
+ * machine-local echo — the coordinator labels it as such vs. the repo files.
200
+ */
201
+ magiKindPanels: MagiKindPanelMap;
202
+ }
203
+
204
+ export interface RunMeshInitResult {
205
+ success: true;
206
+ workspace: string;
207
+ dryRun: boolean;
208
+ refine: MeshInitConfigFileResult;
209
+ worktreeBootstrap: MeshInitConfigFileResult;
210
+ changeImpact: MeshInitConfigFileResult;
211
+ providers: {
212
+ providerPriority: string[];
213
+ installedProviders: Array<{ id: string; displayName: string; version?: string }>;
214
+ };
215
+ /**
216
+ * Read-only snapshot of the currently-saved config per domain (repo files +
217
+ * machine-local kind panels). Lets the coordinator present a current-vs-suggested
218
+ * diff to the user before any overwrite. Always populated (dry-run and write).
219
+ */
220
+ currentConfig: MeshInitCurrentConfigEcho;
221
+ note: string;
222
+ }
223
+
224
+ /**
225
+ * Orchestrate the full onboarding flow for one workspace:
226
+ * detect installed CLIs → suggest refine + bootstrap configs → (optionally)
227
+ * write them → recommend a node providerPriority.
228
+ *
229
+ * `detected` is injected (the caller resolves it via detectCLIs with its
230
+ * ProviderLoader) so this module stays free of provider-loader wiring and is
231
+ * trivially unit-testable.
232
+ */
233
+ export function runMeshInit(
234
+ mesh: any,
235
+ workspace: string,
236
+ detected: CLIInfo[],
237
+ options: RunMeshInitOptions = {},
238
+ ): RunMeshInitResult {
239
+ const write = options.write === true;
240
+ const overwrite = options.overwrite === true;
241
+
242
+ const refine = applyConfigSuggestion({
243
+ workspace,
244
+ relativePath: MESH_INIT_REFINE_CONFIG_PATH,
245
+ existing: loadMeshRefineConfig(mesh, workspace).config,
246
+ suggestedConfig: suggestMeshRefineConfig(mesh, workspace).suggestedConfig,
247
+ validate: (config) => validateMeshRefineConfig(config, MESH_INIT_REFINE_CONFIG_PATH).valid,
248
+ write,
249
+ overwrite,
250
+ });
251
+
252
+ const bootstrapSuggestion = suggestMeshWorktreeBootstrapConfig(workspace);
253
+ const worktreeBootstrap = applyConfigSuggestion({
254
+ workspace,
255
+ relativePath: MESH_INIT_WORKTREE_BOOTSTRAP_CONFIG_PATH,
256
+ existing: loadMeshWorktreeBootstrapConfig(mesh, workspace).config,
257
+ suggestedConfig: bootstrapSuggestion.suggestedConfig,
258
+ validate: (config) => validateMeshWorktreeBootstrapConfig(config, MESH_INIT_WORKTREE_BOOTSTRAP_CONFIG_PATH).valid,
259
+ write,
260
+ overwrite,
261
+ });
262
+
263
+ // change-impact classification (.adhdev/change-impact.json). suggest/validate/save
264
+ // mirror refine's engine exactly, so it drops into the same applyConfigSuggestion
265
+ // gate: existing-wins unless overwrite, dry-run by default, validated before write.
266
+ const changeImpactLoaded = loadChangeImpactConfig(workspace);
267
+ const changeImpact = applyConfigSuggestion({
268
+ workspace,
269
+ relativePath: MESH_INIT_CHANGE_IMPACT_CONFIG_PATH,
270
+ existing: changeImpactLoaded.sourceType === 'repo_file' ? changeImpactLoaded.config : undefined,
271
+ suggestedConfig: suggestChangeImpactConfig(workspace).suggestedConfig,
272
+ validate: (config) => validateChangeImpactConfig(config, MESH_INIT_CHANGE_IMPACT_CONFIG_PATH).valid,
273
+ write,
274
+ overwrite,
275
+ });
276
+
277
+ const providers = suggestNodeProviderPriority(detected);
278
+
279
+ // Read-only echo of the currently-saved config per domain so the coordinator can
280
+ // present a current-vs-suggested diff before any overwrite (init vs reinit). This
281
+ // never suggests — it reports what is on disk / machine-local right now.
282
+ const refineLoaded = loadMeshRefineConfig(mesh, workspace);
283
+ const bootstrapLoaded = loadMeshWorktreeBootstrapConfig(mesh, workspace);
284
+ let magiKindPanels: MagiKindPanelMap = {};
285
+ try {
286
+ magiKindPanels = listMagiKindPanels();
287
+ } catch {
288
+ // Machine-local config unreadable — echo an empty binding rather than failing init.
289
+ magiKindPanels = {};
290
+ }
291
+ const currentConfig: MeshInitCurrentConfigEcho = {
292
+ refine: refineLoaded.config,
293
+ worktreeBootstrap: bootstrapLoaded.config,
294
+ changeImpact: changeImpactLoaded.sourceType === 'repo_file' ? changeImpactLoaded.config : undefined,
295
+ sourceTypes: {
296
+ refine: refineLoaded.sourceType,
297
+ worktreeBootstrap: bootstrapLoaded.sourceType,
298
+ changeImpact: changeImpactLoaded.sourceType,
299
+ },
300
+ magiKindPanels,
301
+ };
302
+
303
+ return {
304
+ success: true,
305
+ workspace,
306
+ dryRun: !write,
307
+ refine,
308
+ worktreeBootstrap,
309
+ changeImpact,
310
+ providers,
311
+ currentConfig,
312
+ note: write
313
+ ? 'Configs written to disk are the execution source of truth; suggestions are scaffold and only take effect once saved. providerPriority is a recommendation — apply it to node policy via clone/policy update. currentConfig echoes what was on disk before this run.'
314
+ : 'Dry-run: no files written. Re-run with write=true to persist the suggested configs. Heuristic suggestions never execute until saved as repo config. Use currentConfig to diff current-vs-suggested before overwriting.',
315
+ };
316
+ }
317
+
318
+ /**
319
+ * Shared decision logic for a single config file: keep an existing config,
320
+ * skip when nothing was suggested, or (when allowed) write the validated
321
+ * suggestion to disk.
322
+ */
323
+ function applyConfigSuggestion(input: {
324
+ workspace: string;
325
+ relativePath: string;
326
+ existing?: unknown;
327
+ suggestedConfig?: RepoMeshRefineConfig | RepoMeshWorktreeBootstrapConfig | ChangeImpactConfig;
328
+ validate: (config: unknown) => boolean;
329
+ write: boolean;
330
+ overwrite: boolean;
331
+ }): MeshInitConfigFileResult {
332
+ const { workspace, relativePath, existing, suggestedConfig, validate, write, overwrite } = input;
333
+ const absolute = join(workspace, relativePath);
334
+
335
+ // An existing, valid config wins unless the caller explicitly opts into overwrite.
336
+ if (existing !== undefined && !overwrite) {
337
+ return { path: absolute, relativePath, written: false, skippedReason: 'already_exists', config: existing as any };
338
+ }
339
+
340
+ if (!suggestedConfig || !validate(suggestedConfig)) {
341
+ return { path: absolute, relativePath, written: false, skippedReason: 'no_suggestion' };
342
+ }
343
+
344
+ if (!write) {
345
+ return { path: absolute, relativePath, written: false, config: suggestedConfig };
346
+ }
347
+
348
+ const writtenPath = writeConfigFile(workspace, relativePath, suggestedConfig);
349
+ return { path: writtenPath, relativePath, written: true, config: suggestedConfig };
350
+ }
@@ -1,5 +1,12 @@
1
1
  import type { AppendRemoteLedgerResult, MeshLedgerSlice, MeshLedgerSummary } from './mesh-ledger.js';
2
2
 
3
+ /** Minimal ledger slice shape accepted by buildMeshLedgerReplicaEvidence. Covers both JSONL and SQLite slices. */
4
+ export interface AnyLedgerSlice {
5
+ entries: Array<{ id: string; meshId: string; timestamp: string; kind: string; nodeId?: string | null; sessionId?: string | null; providerType?: string | null; payload: unknown }>;
6
+ cursor: { afterId: string | null; nextAfterId: string | null; limit: number; hasMore: boolean };
7
+ summary?: MeshLedgerSummary;
8
+ }
9
+
3
10
  export type MeshLedgerReplicaStatus = 'local' | 'queried' | 'imported' | 'failed';
4
11
 
5
12
  export interface MeshLedgerReplicaEvidence {
@@ -25,9 +32,8 @@ export interface MeshLedgerReconciliationEvidence {
25
32
  meshId: string;
26
33
  generatedAt: string;
27
34
  sourceOfTruth: {
28
- kind: 'coordinator_local_jsonl';
35
+ kind: 'coordinator_local_sqlite';
29
36
  p2pOnly: true;
30
- cloudD1LedgerSync: false;
31
37
  notes: string;
32
38
  };
33
39
  replicas: MeshLedgerReplicaEvidence[];
@@ -47,7 +53,7 @@ export interface MeshLedgerReconciliationEvidence {
47
53
  };
48
54
  }
49
55
 
50
- function lastTimestamp(slice?: MeshLedgerSlice): string | null {
56
+ function lastTimestamp(slice?: AnyLedgerSlice): string | null {
51
57
  const entries = Array.isArray(slice?.entries) ? slice!.entries : [];
52
58
  return entries.length ? entries[entries.length - 1].timestamp : null;
53
59
  }
@@ -56,7 +62,7 @@ export function buildMeshLedgerReplicaEvidence(args: {
56
62
  nodeId: string;
57
63
  daemonId?: string;
58
64
  transport: 'local' | 'p2p_datachannel';
59
- slice?: MeshLedgerSlice;
65
+ slice?: AnyLedgerSlice;
60
66
  importResult?: AppendRemoteLedgerResult;
61
67
  status?: MeshLedgerReplicaStatus;
62
68
  error?: string;
@@ -91,10 +97,9 @@ export function buildMeshLedgerReconciliationEvidence(meshId: string, replicas:
91
97
  meshId,
92
98
  generatedAt: new Date().toISOString(),
93
99
  sourceOfTruth: {
94
- kind: 'coordinator_local_jsonl',
100
+ kind: 'coordinator_local_sqlite',
95
101
  p2pOnly: true,
96
- cloudD1LedgerSync: false,
97
- notes: 'Coordinator reconciles bounded slices from daemon-local JSONL ledgers over P2P DataChannel; Cloud/D1 is not a ledger source of truth.',
102
+ notes: 'Coordinator reconciles bounded slices from daemon-local SQLite event ledgers (mesh_event_ledger table) over P2P DataChannel; Cloud/D1 is not a ledger source of truth.',
98
103
  },
99
104
  replicas,
100
105
  totals: {