@adhdev/daemon-core 0.9.82-rc.49 → 0.9.82-rc.490

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 (473) hide show
  1. package/dist/boot/daemon-lifecycle.d.ts +9 -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 +68 -2
  8. package/dist/cli-adapters/cli-script-runner.d.ts +117 -0
  9. package/dist/cli-adapters/cli-state-engine.d.ts +220 -0
  10. package/dist/cli-adapters/provider-cli-adapter.d.ts +137 -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 +203 -15
  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 +65 -0
  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 +26 -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 +80 -0
  77. package/dist/git/git-types.d.ts +2 -50
  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 +70 -17
  81. package/dist/index.js +53532 -19073
  82. package/dist/index.js.map +1 -1
  83. package/dist/index.mjs +53283 -18989
  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 -49
  109. package/dist/mesh/mesh-fast-forward.d.ts +81 -0
  110. package/dist/mesh/mesh-host-ownership.d.ts +21 -1
  111. package/dist/mesh/mesh-init.d.ts +128 -0
  112. package/dist/mesh/mesh-ledger-reconciliation.d.ts +23 -4
  113. package/dist/mesh/mesh-ledger.d.ts +139 -1
  114. package/dist/mesh/mesh-magi-status.d.ts +63 -0
  115. package/dist/mesh/mesh-missions.d.ts +281 -0
  116. package/dist/mesh/mesh-node-identity.d.ts +310 -0
  117. package/dist/mesh/mesh-queue-assignment.d.ts +162 -0
  118. package/dist/mesh/mesh-reconcile-acked-hold.d.ts +17 -0
  119. package/dist/mesh/mesh-reconcile-config.d.ts +6 -0
  120. package/dist/mesh/mesh-reconcile-identity.d.ts +6 -0
  121. package/dist/mesh/mesh-reconcile-loop.d.ts +84 -0
  122. package/dist/mesh/mesh-reconcile-v2-backstop.d.ts +16 -0
  123. package/dist/mesh/mesh-refine-batch.d.ts +68 -0
  124. package/dist/mesh/mesh-refine-gates.d.ts +457 -0
  125. package/dist/mesh/mesh-refine-status.d.ts +62 -0
  126. package/dist/mesh/mesh-remote-event-pull.d.ts +15 -0
  127. package/dist/mesh/mesh-review-inbox.d.ts +90 -0
  128. package/dist/mesh/mesh-routing.d.ts +70 -0
  129. package/dist/mesh/mesh-runtime-store.d.ts +567 -0
  130. package/dist/mesh/mesh-scheduling-runtime.d.ts +78 -0
  131. package/dist/mesh/mesh-task-inflight.d.ts +46 -0
  132. package/dist/mesh/mesh-task-stats.d.ts +49 -0
  133. package/dist/mesh/mesh-unresolved-forward-outbox.d.ts +34 -0
  134. package/dist/mesh/mesh-warmup-deadline.d.ts +68 -0
  135. package/dist/mesh/mesh-work-queue.d.ts +392 -1
  136. package/dist/mesh/preview-freshness.d.ts +28 -0
  137. package/dist/mesh/refine-config.d.ts +97 -0
  138. package/dist/mesh/worktree-bootstrap-config.d.ts +219 -0
  139. package/dist/providers/acp-provider-instance.d.ts +5 -0
  140. package/dist/providers/approval-utils.d.ts +46 -0
  141. package/dist/providers/chat-message-normalization.d.ts +58 -1
  142. package/dist/providers/cli-provider-effect-format.d.ts +30 -0
  143. package/dist/providers/cli-provider-history-dedup.d.ts +17 -0
  144. package/dist/providers/cli-provider-input-prompt.d.ts +12 -0
  145. package/dist/providers/cli-provider-instance-types.d.ts +45 -0
  146. package/dist/providers/cli-provider-instance.d.ts +426 -30
  147. package/dist/providers/cli-provider-status-helpers.d.ts +46 -0
  148. package/dist/providers/cli-provider-transcript-merge.d.ts +7 -0
  149. package/dist/providers/contracts.d.ts +196 -6
  150. package/dist/providers/external-sources.d.ts +71 -0
  151. package/dist/providers/manual-attendance.d.ts +79 -0
  152. package/dist/providers/native-history/antigravity-claim-registry.d.ts +39 -0
  153. package/dist/providers/native-history/antigravity-cli-transcript.d.ts +137 -0
  154. package/dist/providers/native-history/claude-cli-transcript.d.ts +70 -0
  155. package/dist/providers/native-history/codex-cli-transcript.d.ts +73 -0
  156. package/dist/providers/native-history/constants.d.ts +12 -0
  157. package/dist/providers/native-history/dispatcher.d.ts +44 -0
  158. package/dist/providers/native-history/hermes-cli-transcript.d.ts +30 -0
  159. package/dist/providers/native-history/index.d.ts +13 -0
  160. package/dist/providers/provider-instance-manager.d.ts +30 -0
  161. package/dist/providers/provider-instance.d.ts +31 -1
  162. package/dist/providers/provider-loader.d.ts +42 -5
  163. package/dist/providers/provider-trust.d.ts +31 -0
  164. package/dist/providers/read-chat-contract.d.ts +29 -0
  165. package/dist/providers/sdk/v1/builders/acp/detect-status.d.ts +68 -0
  166. package/dist/providers/sdk/v1/builders/cli/detect-status.d.ts +86 -0
  167. package/dist/providers/sdk/v1/builders/cli/parse-approval-squash.d.ts +59 -0
  168. package/dist/providers/sdk/v1/builders/cli/parse-approval.d.ts +65 -0
  169. package/dist/providers/sdk/v1/builders/cli/parse-session.d.ts +91 -0
  170. package/dist/providers/sdk/v1/builders/cli/visible-region.d.ts +42 -0
  171. package/dist/providers/sdk/v1/fixture-tooling/format.d.ts +126 -0
  172. package/dist/providers/sdk/v1/fixture-tooling/index.d.ts +8 -0
  173. package/dist/providers/sdk/v1/fixture-tooling/replay.d.ts +38 -0
  174. package/dist/providers/sdk/v1/index.d.ts +30 -0
  175. package/dist/providers/sdk/v1/sandbox/README-design.d.ts +193 -0
  176. package/dist/providers/sdk/v1/sandbox/require-whitelist.d.ts +74 -0
  177. package/dist/providers/sdk/v1/sandbox/script-runner.d.ts +98 -0
  178. package/dist/providers/sdk/v1/types/cli/index.d.ts +277 -0
  179. package/dist/providers/sdk/v1/types/common/index.d.ts +203 -0
  180. package/dist/providers/sdk/v1/validators/index.d.ts +5 -0
  181. package/dist/providers/sdk/v1/validators/manifest.d.ts +40 -0
  182. package/dist/providers/sdk/v1/validators/taint.d.ts +52 -0
  183. package/dist/providers/spec/adapter.d.ts +98 -0
  184. package/dist/providers/spec/cli-adapter.d.ts +223 -0
  185. package/dist/providers/spec/evaluator.d.ts +45 -0
  186. package/dist/providers/spec/fsm-driver.d.ts +449 -0
  187. package/dist/providers/spec/fsm-evaluator.d.ts +93 -0
  188. package/dist/providers/spec/fsm-loader.d.ts +14 -0
  189. package/dist/providers/spec/fsm-types.d.ts +202 -0
  190. package/dist/providers/spec/native-history-executor.d.ts +41 -0
  191. package/dist/providers/spec/pre-launch-trust.d.ts +16 -0
  192. package/dist/providers/spec/route.d.ts +4 -0
  193. package/dist/providers/spec/types.d.ts +244 -0
  194. package/dist/providers/status-monitor.d.ts +7 -7
  195. package/dist/providers/transcript-v2.d.ts +176 -0
  196. package/dist/providers/types/interactive-prompt.d.ts +84 -0
  197. package/dist/providers/working-dir.d.ts +17 -0
  198. package/dist/repo-mesh-types.d.ts +616 -12
  199. package/dist/runtime-defaults.d.ts +2 -0
  200. package/dist/session-host/managed-host.d.ts +64 -0
  201. package/dist/session-host/runtime-surface.d.ts +10 -16
  202. package/dist/sessions/registry.d.ts +26 -0
  203. package/dist/shared-types-extra.d.ts +2 -4
  204. package/dist/shared-types.d.ts +110 -55
  205. package/dist/status/chat-tail-hot-sessions.d.ts +40 -0
  206. package/dist/status/normalize.d.ts +1 -1
  207. package/dist/status/normalize.js +1 -0
  208. package/dist/status/normalize.js.map +1 -1
  209. package/dist/status/normalize.mjs +1 -0
  210. package/dist/status/normalize.mjs.map +1 -1
  211. package/dist/status/reporter.d.ts +2 -0
  212. package/dist/status/snapshot.d.ts +27 -0
  213. package/dist/system/hash.d.ts +8 -0
  214. package/dist/system/load-better-sqlite3.d.ts +21 -0
  215. package/dist/types.d.ts +20 -6
  216. package/package.json +11 -4
  217. package/src/agent-stream/poller.ts +2 -3
  218. package/src/agent-stream/provider-adapter.ts +1 -1
  219. package/src/boot/daemon-lifecycle.ts +80 -14
  220. package/src/boot/process-hardening.ts +89 -0
  221. package/src/build-info.ts +73 -0
  222. package/src/chat/source-machine.ts +534 -0
  223. package/src/chat/source-resolver.ts +0 -0
  224. package/src/chat/subscription-updates.ts +20 -1
  225. package/src/cli-adapter-types.d.ts +3 -1
  226. package/src/cli-adapter-types.ts +68 -2
  227. package/src/cli-adapters/cli-script-runner.ts +421 -0
  228. package/src/cli-adapters/cli-state-engine.ts +1282 -0
  229. package/src/cli-adapters/provider-cli-adapter.d.ts +1 -1
  230. package/src/cli-adapters/provider-cli-adapter.ts +1048 -1143
  231. package/src/cli-adapters/provider-cli-parse.d.ts +2 -0
  232. package/src/cli-adapters/provider-cli-parse.ts +19 -0
  233. package/src/cli-adapters/provider-cli-runtime.ts +56 -7
  234. package/src/cli-adapters/provider-cli-shared.d.ts +4 -0
  235. package/src/cli-adapters/provider-cli-shared.ts +121 -11
  236. package/src/cli-adapters/pty-transport.ts +2 -1
  237. package/src/cli-adapters/pty-write-chunking.ts +106 -0
  238. package/src/cli-adapters/raw-terminal-io.ts +252 -0
  239. package/src/cli-adapters/resolve-executable.ts +204 -0
  240. package/src/cli-adapters/session-host-transport.ts +2 -1
  241. package/src/cli-adapters/terminal-backends/ghostty-vt-backend.ts +63 -29
  242. package/src/cli-adapters/terminal-backends/types.ts +10 -3
  243. package/src/cli-adapters/terminal-screen.ts +16 -81
  244. package/src/commands/chat-commands-debug-bundle.ts +398 -0
  245. package/src/commands/chat-commands-read.ts +2788 -0
  246. package/src/commands/chat-commands-scope.ts +54 -0
  247. package/src/commands/chat-commands-shared.ts +114 -0
  248. package/src/commands/chat-commands-write.ts +891 -0
  249. package/src/commands/chat-commands.ts +19 -1841
  250. package/src/commands/cli-manager.d.ts +2 -0
  251. package/src/commands/cli-manager.ts +724 -27
  252. package/src/commands/handler.ts +865 -2
  253. package/src/commands/high-family/index.ts +28 -0
  254. package/src/commands/high-family/mesh-coordinator-launch.ts +696 -0
  255. package/src/commands/high-family/mesh-events.ts +102 -0
  256. package/src/commands/high-family/mesh-status.ts +857 -0
  257. package/src/commands/high-family/types.ts +80 -0
  258. package/src/commands/low-family/coordinator-prompt.ts +125 -0
  259. package/src/commands/low-family/daemon-lifecycle.ts +120 -0
  260. package/src/commands/low-family/diagnostics.ts +57 -0
  261. package/src/commands/low-family/index.ts +37 -0
  262. package/src/commands/low-family/mesh-ledger.ts +62 -0
  263. package/src/commands/low-family/mesh-node-logs.ts +87 -0
  264. package/src/commands/low-family/notification.ts +116 -0
  265. package/src/commands/low-family/refine-config.ts +106 -0
  266. package/src/commands/low-family/session-host.ts +282 -0
  267. package/src/commands/low-family/spec-providerdev.ts +217 -0
  268. package/src/commands/low-family/status-meta.ts +112 -0
  269. package/src/commands/low-family/types.ts +39 -0
  270. package/src/commands/med-family/cli-agent.ts +270 -0
  271. package/src/commands/med-family/fast-forward.ts +230 -0
  272. package/src/commands/med-family/ide.ts +163 -0
  273. package/src/commands/med-family/index.ts +37 -0
  274. package/src/commands/med-family/mesh-crud.ts +1268 -0
  275. package/src/commands/med-family/mesh-host-pairing.ts +234 -0
  276. package/src/commands/med-family/mesh-queue.ts +167 -0
  277. package/src/commands/med-family/mesh-restart.ts +92 -0
  278. package/src/commands/med-family/types.ts +153 -0
  279. package/src/commands/mesh-coordinator.ts +334 -124
  280. package/src/commands/router-aggregate-status.ts +209 -0
  281. package/src/commands/router-mesh-session-owner.ts +114 -0
  282. package/src/commands/router-refine.ts +1794 -0
  283. package/src/commands/router-worktree-cleanup.ts +870 -0
  284. package/src/commands/router.ts +567 -4149
  285. package/src/commands/stream-commands.ts +8 -0
  286. package/src/commands/upgrade-helper.ts +310 -45
  287. package/src/config/chat-history.ts +517 -24
  288. package/src/config/config.ts +30 -0
  289. package/src/config/mesh-config.ts +300 -24
  290. package/src/config/mesh-json-config.ts +376 -0
  291. package/src/config/recent-activity.ts +8 -2
  292. package/src/config/registry-resolver.ts +100 -0
  293. package/src/config/repo-settings.ts +111 -0
  294. package/src/config/state-store.ts +55 -0
  295. package/src/daemon/dev-auto-implement.ts +3 -2
  296. package/src/daemon/dev-cli-debug.ts +10 -1
  297. package/src/daemon/dev-server.ts +0 -541
  298. package/src/detection/cli-detector.ts +94 -9
  299. package/src/detection/ide-detector.ts +55 -16
  300. package/src/detection/win32-ide-version.ts +106 -0
  301. package/src/git/change-impact-config.ts +354 -0
  302. package/src/git/git-commands.ts +112 -16
  303. package/src/git/git-diff.ts +81 -11
  304. package/src/git/git-executor.ts +12 -0
  305. package/src/git/git-status.ts +822 -48
  306. package/src/git/git-types.ts +14 -62
  307. package/src/git/git-worktree.ts +261 -4
  308. package/src/git/index.ts +17 -0
  309. package/src/index.ts +190 -13
  310. package/src/installer.d.ts +1 -1
  311. package/src/installer.ts +8 -6
  312. package/src/ipc/local-ipc-server.ts +278 -0
  313. package/src/launch.d.ts +1 -1
  314. package/src/launch.ts +37 -28
  315. package/src/logging/async-batch-writer.ts +55 -0
  316. package/src/logging/command-log.ts +7 -5
  317. package/src/logging/debug-config.ts +25 -0
  318. package/src/logging/debug-trace.ts +7 -2
  319. package/src/logging/log-redactor.ts +100 -0
  320. package/src/logging/log-tail-reader.ts +341 -0
  321. package/src/logging/logger.ts +14 -7
  322. package/src/mesh/contracts.ts +510 -0
  323. package/src/mesh/coordinator-prompt.ts +627 -34
  324. package/src/mesh/coordinator-registry.ts +121 -0
  325. package/src/mesh/mesh-active-work.ts +706 -0
  326. package/src/mesh/mesh-clone-grace.ts +68 -0
  327. package/src/mesh/mesh-completion-synthesis.ts +416 -0
  328. package/src/mesh/mesh-coordinator-config.ts +97 -0
  329. package/src/mesh/mesh-delivery-policy.ts +284 -0
  330. package/src/mesh/mesh-event-classify.ts +78 -0
  331. package/src/mesh/mesh-event-forwarding.ts +2030 -0
  332. package/src/mesh/mesh-event-trace.ts +67 -0
  333. package/src/mesh/mesh-events-coordinator.ts +32 -0
  334. package/src/mesh/mesh-events-pending.ts +1548 -0
  335. package/src/mesh/mesh-events-stale.ts +452 -0
  336. package/src/mesh/mesh-events-utils.ts +443 -0
  337. package/src/mesh/mesh-events.ts +43 -1035
  338. package/src/mesh/mesh-fast-forward.ts +856 -0
  339. package/src/mesh/mesh-host-ownership.ts +41 -3
  340. package/src/mesh/mesh-init.ts +350 -0
  341. package/src/mesh/mesh-ledger-reconciliation.ts +12 -7
  342. package/src/mesh/mesh-ledger.ts +897 -102
  343. package/src/mesh/mesh-magi-status.ts +223 -0
  344. package/src/mesh/mesh-missions.ts +695 -0
  345. package/src/mesh/mesh-node-identity.ts +2065 -0
  346. package/src/mesh/mesh-queue-assignment.ts +2498 -0
  347. package/src/mesh/mesh-reconcile-acked-hold.ts +230 -0
  348. package/src/mesh/mesh-reconcile-config.ts +66 -0
  349. package/src/mesh/mesh-reconcile-identity.ts +103 -0
  350. package/src/mesh/mesh-reconcile-loop.ts +1696 -0
  351. package/src/mesh/mesh-reconcile-v2-backstop.ts +62 -0
  352. package/src/mesh/mesh-refine-batch.ts +205 -0
  353. package/src/mesh/mesh-refine-gates.ts +1792 -0
  354. package/src/mesh/mesh-refine-status.ts +231 -0
  355. package/src/mesh/mesh-remote-event-pull.ts +279 -0
  356. package/src/mesh/mesh-review-inbox.ts +308 -0
  357. package/src/mesh/mesh-routing.ts +291 -0
  358. package/src/mesh/mesh-runtime-store.ts +2292 -0
  359. package/src/mesh/mesh-scheduling-runtime.ts +198 -0
  360. package/src/mesh/mesh-task-inflight.ts +70 -0
  361. package/src/mesh/mesh-task-stats.ts +161 -0
  362. package/src/mesh/mesh-unresolved-forward-outbox.ts +215 -0
  363. package/src/mesh/mesh-warmup-deadline.ts +152 -0
  364. package/src/mesh/mesh-work-queue.ts +1489 -145
  365. package/src/mesh/preview-freshness.ts +163 -0
  366. package/src/mesh/refine-config.ts +129 -12
  367. package/src/mesh/worktree-bootstrap-config.ts +599 -0
  368. package/src/providers/acp-provider-instance.ts +43 -10
  369. package/src/providers/approval-utils.d.ts +5 -0
  370. package/src/providers/approval-utils.ts +100 -6
  371. package/src/providers/chat-message-normalization.ts +126 -4
  372. package/src/providers/cli-provider-effect-format.ts +53 -0
  373. package/src/providers/cli-provider-history-dedup.ts +75 -0
  374. package/src/providers/cli-provider-input-prompt.ts +133 -0
  375. package/src/providers/cli-provider-instance-types.ts +131 -0
  376. package/src/providers/cli-provider-instance.ts +2771 -499
  377. package/src/providers/cli-provider-status-helpers.ts +123 -0
  378. package/src/providers/cli-provider-transcript-merge.ts +114 -0
  379. package/src/providers/contracts.d.ts +55 -0
  380. package/src/providers/contracts.ts +207 -6
  381. package/src/providers/extension-provider-instance.ts +12 -7
  382. package/src/providers/external-sources.ts +218 -0
  383. package/src/providers/ide-provider-instance.ts +35 -12
  384. package/src/providers/manual-attendance.ts +105 -0
  385. package/src/providers/native-history/antigravity-claim-registry.ts +138 -0
  386. package/src/providers/native-history/antigravity-cli-transcript.ts +1275 -0
  387. package/src/providers/native-history/claude-cli-transcript.ts +396 -0
  388. package/src/providers/native-history/codex-cli-transcript.ts +479 -0
  389. package/src/providers/native-history/constants.ts +19 -0
  390. package/src/providers/native-history/dispatcher.ts +617 -0
  391. package/src/providers/native-history/hermes-cli-transcript.ts +312 -0
  392. package/src/providers/native-history/index.ts +30 -0
  393. package/src/providers/provider-instance-manager.ts +71 -0
  394. package/src/providers/provider-instance.ts +24 -1
  395. package/src/providers/provider-loader.ts +700 -55
  396. package/src/providers/provider-schema.ts +93 -14
  397. package/src/providers/provider-trust.ts +114 -0
  398. package/src/providers/read-chat-contract.ts +76 -16
  399. package/src/providers/sdk/README.md +49 -0
  400. package/src/providers/sdk/v1/builders/acp/detect-status.ts +144 -0
  401. package/src/providers/sdk/v1/builders/cli/detect-status.ts +313 -0
  402. package/src/providers/sdk/v1/builders/cli/parse-approval-squash.ts +158 -0
  403. package/src/providers/sdk/v1/builders/cli/parse-approval.ts +261 -0
  404. package/src/providers/sdk/v1/builders/cli/parse-session.ts +276 -0
  405. package/src/providers/sdk/v1/builders/cli/visible-region.ts +143 -0
  406. package/src/providers/sdk/v1/fixture-tooling/format.ts +130 -0
  407. package/src/providers/sdk/v1/fixture-tooling/index.ts +22 -0
  408. package/src/providers/sdk/v1/fixture-tooling/replay.ts +352 -0
  409. package/src/providers/sdk/v1/index.ts +152 -0
  410. package/src/providers/sdk/v1/sandbox/README-design.ts +195 -0
  411. package/src/providers/sdk/v1/sandbox/require-whitelist.ts +472 -0
  412. package/src/providers/sdk/v1/sandbox/script-runner.ts +150 -0
  413. package/src/providers/sdk/v1/schemas/cli/provider.schema.json +538 -0
  414. package/src/providers/sdk/v1/schemas/primitives/acp-session-protocol-v1.json +131 -0
  415. package/src/providers/sdk/v1/schemas/primitives/native-history-codex-rollout-v1.json +66 -0
  416. package/src/providers/sdk/v1/schemas/primitives/tui-approval-squash-v1.json +91 -0
  417. package/src/providers/sdk/v1/schemas/primitives/tui-assistant-block-v1.json +91 -0
  418. package/src/providers/sdk/v1/schemas/primitives/tui-cue-ordering-v1.json +47 -0
  419. package/src/providers/sdk/v1/schemas/primitives/tui-dispatch-order-v1.json +32 -0
  420. package/src/providers/sdk/v1/schemas/primitives/tui-footer-chrome-v1.json +42 -0
  421. package/src/providers/sdk/v1/schemas/primitives/tui-index-finder-v1.json +27 -0
  422. package/src/providers/sdk/v1/schemas/primitives/tui-modal-v1.json +125 -0
  423. package/src/providers/sdk/v1/schemas/primitives/tui-prompt-marker-v1.json +45 -0
  424. package/src/providers/sdk/v1/schemas/primitives/tui-session-id-extraction-v1.json +46 -0
  425. package/src/providers/sdk/v1/schemas/primitives/tui-settled-prompt-v1.json +71 -0
  426. package/src/providers/sdk/v1/schemas/primitives/tui-spinner-v1.json +83 -0
  427. package/src/providers/sdk/v1/schemas/primitives/tui-transcript-pty-v1.json +83 -0
  428. package/src/providers/sdk/v1/schemas/primitives/tui-visible-region-v1.json +57 -0
  429. package/src/providers/sdk/v1/schemas/primitives/tui-welcome-screen-v1.json +35 -0
  430. package/src/providers/sdk/v1/types/cli/index.ts +365 -0
  431. package/src/providers/sdk/v1/types/common/index.ts +229 -0
  432. package/src/providers/sdk/v1/validators/index.ts +19 -0
  433. package/src/providers/sdk/v1/validators/manifest.ts +110 -0
  434. package/src/providers/sdk/v1/validators/taint.ts +309 -0
  435. package/src/providers/spec/adapter.ts +246 -0
  436. package/src/providers/spec/cli-adapter.ts +1064 -0
  437. package/src/providers/spec/evaluator.ts +407 -0
  438. package/src/providers/spec/fsm-driver.ts +1528 -0
  439. package/src/providers/spec/fsm-evaluator.ts +290 -0
  440. package/src/providers/spec/fsm-loader.ts +128 -0
  441. package/src/providers/spec/fsm-types.ts +301 -0
  442. package/src/providers/spec/native-history-executor.ts +1241 -0
  443. package/src/providers/spec/pre-launch-trust.ts +104 -0
  444. package/src/providers/spec/route.ts +51 -0
  445. package/src/providers/spec/types.ts +284 -0
  446. package/src/providers/status-monitor.d.ts +7 -7
  447. package/src/providers/status-monitor.ts +37 -22
  448. package/src/providers/transcript-v2.ts +567 -0
  449. package/src/providers/types/interactive-prompt.ts +536 -0
  450. package/src/providers/version-archive.ts +64 -24
  451. package/src/providers/working-dir.ts +23 -0
  452. package/src/repo-mesh-types.ts +861 -14
  453. package/src/runtime-defaults.ts +39 -0
  454. package/src/session-host/managed-host.ts +218 -0
  455. package/src/session-host/runtime-surface.ts +20 -80
  456. package/src/sessions/registry.ts +44 -0
  457. package/src/shared-types-extra.ts +2 -4
  458. package/src/shared-types.d.ts +8 -0
  459. package/src/shared-types.ts +148 -55
  460. package/src/status/builders.ts +69 -6
  461. package/src/status/chat-tail-hot-sessions.ts +117 -2
  462. package/src/status/normalize.ts +2 -0
  463. package/src/status/reporter.ts +19 -1
  464. package/src/status/snapshot.ts +100 -27
  465. package/src/system/hash.ts +23 -0
  466. package/src/system/host-memory.ts +29 -12
  467. package/src/system/load-better-sqlite3.ts +68 -0
  468. package/src/types.ts +26 -6
  469. package/dist/cli-adapters/terminal-backends/xterm-backend.d.ts +0 -17
  470. package/dist/mesh/mesh-sync.d.ts +0 -53
  471. package/src/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +0 -16
  472. package/src/cli-adapters/terminal-backends/xterm-backend.ts +0 -97
  473. package/src/mesh/mesh-sync.ts +0 -111
@@ -0,0 +1,354 @@
1
+ import { existsSync, readdirSync, readFileSync, statSync } from 'fs';
2
+ import { join } from 'path';
3
+ import * as yaml from 'js-yaml';
4
+
5
+ /**
6
+ * "Change Impact" — config-driven classification of which git changes between the
7
+ * live daemon's build commit and the workspace HEAD actually require a daemon
8
+ * rebuild/restart (vs. a web-only redeploy, vs. nothing).
9
+ *
10
+ * The daemon-core git surface only knows the FACTS (which files / packages changed
11
+ * between buildCommit..HEAD). The POLICY — which packages are daemon-runtime, which
12
+ * are web-only, which root files are non-runtime, and what command to recommend —
13
+ * is declarative config injected from outside. This keeps git-status.ts repo-agnostic
14
+ * while preserving ADHDev's exact built-in behavior when no config is present.
15
+ *
16
+ * SECURITY: config is declarative only. JSON/YAML are parsed; arbitrary JS config
17
+ * (.js) is intentionally NOT supported, so loading a config can never execute code.
18
+ */
19
+
20
+ /** A change-impact classification bucket. */
21
+ export type ChangeImpactKind = 'daemon' | 'web' | 'none';
22
+
23
+ /**
24
+ * Recommended action for a given impact classification. `recommendedAction` is the
25
+ * stable classification key (always one of daemon|web|none, NOT config-overridable);
26
+ * config customizes only the human-facing `recommendedCommand` recipe.
27
+ */
28
+ export interface ChangeImpactTarget {
29
+ /** Human-facing command/recipe to act on the impact (e.g. deploy + restart). */
30
+ recommendedCommand: string;
31
+ }
32
+
33
+ export interface ChangeImpactConfig {
34
+ /**
35
+ * Package names (the `<name>` in `packages/<name>/`) whose change means the
36
+ * daemon runtime is stale and must be rebuilt/redeployed + restarted. When
37
+ * provided, this REPLACES the built-in daemon-runtime set.
38
+ */
39
+ daemonRuntimePackages?: string[];
40
+ /**
41
+ * Package names that are web-only — a change to one does not require a daemon
42
+ * restart, only a web redeploy. When provided, this REPLACES the built-in
43
+ * web-only set.
44
+ */
45
+ webOnlyPackages?: string[];
46
+ /**
47
+ * Glob patterns for root-level (non-package) files that demonstrably cannot
48
+ * change what the daemon runtime executes (markers, docs, license text). These
49
+ * are added on top of the built-in non-runtime root-file detection.
50
+ */
51
+ nonRuntimeRootFilePatterns?: string[];
52
+ /** Recommended action/command per impact classification. Missing keys fall back to built-in defaults. */
53
+ impactTargets?: Partial<Record<ChangeImpactKind, ChangeImpactTarget>>;
54
+ }
55
+
56
+ export interface ChangeImpactConfigLoadResult {
57
+ config?: ChangeImpactConfig;
58
+ source: string;
59
+ sourceType: 'repo_file' | 'unavailable' | 'invalid';
60
+ path?: string;
61
+ error?: string;
62
+ /**
63
+ * Stable identity of the config SOURCE, used as part of a cache key so a config
64
+ * edit invalidates any cached impact evaluation. Combines the resolved path and
65
+ * its mtime (or the path for the unavailable/invalid case).
66
+ */
67
+ sourceKey: string;
68
+ }
69
+
70
+ export const CHANGE_IMPACT_CONFIG_LOCATIONS = [
71
+ '.adhdev/change-impact.json',
72
+ '.adhdev/change-impact.yaml',
73
+ '.adhdev/change-impact.yml',
74
+ '.adhdev/repo-mesh-change-impact.json',
75
+ '.adhdev/repo-mesh-change-impact.yaml',
76
+ '.adhdev/repo-mesh-change-impact.yml',
77
+ ];
78
+
79
+ export const CHANGE_IMPACT_CONFIG_SCHEMA = {
80
+ $schema: 'https://json-schema.org/draft/2020-12/schema',
81
+ title: 'ADHDev Change Impact Config',
82
+ type: 'object',
83
+ additionalProperties: false,
84
+ properties: {
85
+ daemonRuntimePackages: { type: 'array', items: { type: 'string', minLength: 1 } },
86
+ webOnlyPackages: { type: 'array', items: { type: 'string', minLength: 1 } },
87
+ nonRuntimeRootFilePatterns: { type: 'array', items: { type: 'string', minLength: 1 } },
88
+ impactTargets: {
89
+ type: 'object',
90
+ additionalProperties: false,
91
+ properties: {
92
+ daemon: { $ref: '#/$defs/target' },
93
+ web: { $ref: '#/$defs/target' },
94
+ none: { $ref: '#/$defs/target' },
95
+ },
96
+ },
97
+ },
98
+ $defs: {
99
+ target: {
100
+ type: 'object',
101
+ additionalProperties: false,
102
+ required: ['recommendedCommand'],
103
+ properties: {
104
+ recommendedCommand: { type: 'string', minLength: 1 },
105
+ },
106
+ },
107
+ },
108
+ } as const;
109
+
110
+ function isRecord(value: unknown): value is Record<string, unknown> {
111
+ return !!value && typeof value === 'object' && !Array.isArray(value);
112
+ }
113
+
114
+ function isStringArray(value: unknown): value is string[] {
115
+ return Array.isArray(value) && value.every(v => typeof v === 'string' && v.length > 0);
116
+ }
117
+
118
+ function validateTarget(value: unknown, key: string, errors: string[]): ChangeImpactTarget | undefined {
119
+ if (!isRecord(value)) {
120
+ errors.push(`impactTargets.${key} must be an object`);
121
+ return undefined;
122
+ }
123
+ const { recommendedCommand } = value;
124
+ if (typeof recommendedCommand !== 'string' || !recommendedCommand.length) {
125
+ errors.push(`impactTargets.${key}.recommendedCommand must be a non-empty string`);
126
+ return undefined;
127
+ }
128
+ // recommendedAction is the fixed classification key; config supplies only the command.
129
+ for (const k of Object.keys(value)) {
130
+ if (k !== 'recommendedCommand') errors.push(`impactTargets.${key}.${k} is not a recognized field (only recommendedCommand)`);
131
+ }
132
+ return { recommendedCommand };
133
+ }
134
+
135
+ export function validateChangeImpactConfig(raw: unknown, source = 'inline'): { valid: boolean; errors: string[]; config?: ChangeImpactConfig } {
136
+ const errors: string[] = [];
137
+ if (!isRecord(raw)) {
138
+ return { valid: false, errors: [`${source}: config must be an object`] };
139
+ }
140
+ const config: ChangeImpactConfig = {};
141
+
142
+ if (raw.daemonRuntimePackages !== undefined) {
143
+ if (isStringArray(raw.daemonRuntimePackages)) config.daemonRuntimePackages = [...raw.daemonRuntimePackages];
144
+ else errors.push('daemonRuntimePackages must be an array of non-empty strings');
145
+ }
146
+ if (raw.webOnlyPackages !== undefined) {
147
+ if (isStringArray(raw.webOnlyPackages)) config.webOnlyPackages = [...raw.webOnlyPackages];
148
+ else errors.push('webOnlyPackages must be an array of non-empty strings');
149
+ }
150
+ if (raw.nonRuntimeRootFilePatterns !== undefined) {
151
+ if (isStringArray(raw.nonRuntimeRootFilePatterns)) config.nonRuntimeRootFilePatterns = [...raw.nonRuntimeRootFilePatterns];
152
+ else errors.push('nonRuntimeRootFilePatterns must be an array of non-empty strings');
153
+ }
154
+ if (raw.impactTargets !== undefined) {
155
+ if (!isRecord(raw.impactTargets)) {
156
+ errors.push('impactTargets must be an object');
157
+ } else {
158
+ const targets: Partial<Record<ChangeImpactKind, ChangeImpactTarget>> = {};
159
+ for (const key of Object.keys(raw.impactTargets)) {
160
+ if (key !== 'daemon' && key !== 'web' && key !== 'none') {
161
+ errors.push(`impactTargets.${key} is not a recognized impact kind (daemon|web|none)`);
162
+ continue;
163
+ }
164
+ const target = validateTarget(raw.impactTargets[key], key, errors);
165
+ if (target) targets[key as ChangeImpactKind] = target;
166
+ }
167
+ if (Object.keys(targets).length) config.impactTargets = targets;
168
+ }
169
+ }
170
+ // Reject unknown top-level keys to catch typos early (mirrors additionalProperties:false).
171
+ for (const key of Object.keys(raw)) {
172
+ if (!['daemonRuntimePackages', 'webOnlyPackages', 'nonRuntimeRootFilePatterns', 'impactTargets'].includes(key)) {
173
+ errors.push(`unknown config key '${key}'`);
174
+ }
175
+ }
176
+
177
+ return { valid: errors.length === 0, errors, config: errors.length === 0 ? config : undefined };
178
+ }
179
+
180
+ function parseConfigText(path: string, text: string): unknown {
181
+ if (/\.json$/i.test(path)) return JSON.parse(text);
182
+ return yaml.load(text);
183
+ }
184
+
185
+ /**
186
+ * Locate and load the Change Impact config for a repo root. Declarative only —
187
+ * never executes config. Returns a sourceKey suitable for cache invalidation:
188
+ * config path + mtime, or the sentinel for the missing/invalid case.
189
+ */
190
+ export function loadChangeImpactConfig(repoRoot: string): ChangeImpactConfigLoadResult {
191
+ for (const relative of CHANGE_IMPACT_CONFIG_LOCATIONS) {
192
+ const configPath = join(repoRoot, relative);
193
+ if (!existsSync(configPath)) continue;
194
+ try {
195
+ const text = readFileSync(configPath, 'utf-8');
196
+ let mtimeMs = 0;
197
+ try {
198
+ mtimeMs = statSync(configPath).mtimeMs;
199
+ } catch {
200
+ // Best-effort; fall back to content length so edits still perturb the key.
201
+ mtimeMs = text.length;
202
+ }
203
+ const parsed = parseConfigText(configPath, text);
204
+ const validation = validateChangeImpactConfig(parsed, relative);
205
+ if (!validation.valid) {
206
+ return {
207
+ source: relative,
208
+ sourceType: 'invalid',
209
+ path: configPath,
210
+ error: validation.errors.join('; '),
211
+ sourceKey: `invalid:${configPath}:${mtimeMs}`,
212
+ };
213
+ }
214
+ return {
215
+ config: validation.config,
216
+ source: relative,
217
+ sourceType: 'repo_file',
218
+ path: configPath,
219
+ sourceKey: `file:${configPath}:${mtimeMs}`,
220
+ };
221
+ } catch (error: any) {
222
+ return {
223
+ source: relative,
224
+ sourceType: 'invalid',
225
+ path: configPath,
226
+ error: error?.message || String(error),
227
+ sourceKey: `error:${configPath}`,
228
+ };
229
+ }
230
+ }
231
+ return {
232
+ source: 'unavailable',
233
+ sourceType: 'unavailable',
234
+ error: `No change-impact config found. Checked: ${CHANGE_IMPACT_CONFIG_LOCATIONS.join(', ')}`,
235
+ sourceKey: 'unavailable',
236
+ };
237
+ }
238
+
239
+ /**
240
+ * Translate a config glob pattern into a RegExp matched against a forward-slash
241
+ * file path. Supports `**` (any path segments), `*` (any chars except `/`), and
242
+ * `?` (single non-slash char). No brace/character-class expansion — declarative,
243
+ * minimal, predictable. All other characters are matched literally.
244
+ */
245
+ export function globToRegExp(pattern: string): RegExp {
246
+ let out = '';
247
+ for (let i = 0; i < pattern.length; i++) {
248
+ const ch = pattern[i];
249
+ if (ch === '*') {
250
+ if (pattern[i + 1] === '*') {
251
+ // `**` → any sequence of characters including path separators.
252
+ out += '.*';
253
+ i++;
254
+ // Swallow a trailing slash after `**/` so `**/x` also matches `x`.
255
+ if (pattern[i + 1] === '/') i++;
256
+ } else {
257
+ out += '[^/]*';
258
+ }
259
+ } else if (ch === '?') {
260
+ out += '[^/]';
261
+ } else if ('.+^${}()|[]\\'.includes(ch)) {
262
+ out += '\\' + ch;
263
+ } else {
264
+ out += ch;
265
+ }
266
+ }
267
+ return new RegExp(`^${out}$`);
268
+ }
269
+
270
+ export interface ChangeImpactConfigSuggestion {
271
+ /** A non-executable, declarative config draft a human can save verbatim. */
272
+ suggestedConfig: ChangeImpactConfig;
273
+ /** Per-field human-facing rationale for the proposed classification. */
274
+ notes: string[];
275
+ /** Package directories discovered under `packages/` (and `oss/packages/`). */
276
+ discoveredPackages: { daemon: string[]; web: string[]; unclassified: string[] };
277
+ }
278
+
279
+ function listPackageDirs(packagesRoot: string): string[] {
280
+ try {
281
+ return readdirSync(packagesRoot, { withFileTypes: true })
282
+ .filter(entry => entry.isDirectory() && !entry.name.startsWith('.'))
283
+ .map(entry => entry.name);
284
+ } catch {
285
+ return [];
286
+ }
287
+ }
288
+
289
+ /**
290
+ * Inspect a repo's package layout and propose a reasonable, declarative Change
291
+ * Impact config draft. This is heuristic scaffold ONLY — it never executes
292
+ * anything and the draft must be reviewed/saved by a human before it takes
293
+ * effect. The heuristic mirrors ADHDev's own conventions:
294
+ * - `web-*` / `*-web` packages → web-only (web redeploy, no daemon restart)
295
+ * - everything else under packages/ → daemon-runtime (rebuild + restart)
296
+ * - docs/license/marker root files → non-runtime
297
+ * Callers are expected to prune the draft to their actual runtime topology.
298
+ */
299
+ export function suggestChangeImpactConfig(repoRoot: string): ChangeImpactConfigSuggestion {
300
+ const notes: string[] = [];
301
+ const daemon = new Set<string>();
302
+ const web = new Set<string>();
303
+ const unclassified: string[] = [];
304
+
305
+ const roots = ['packages', join('oss', 'packages')];
306
+ for (const rel of roots) {
307
+ const packagesRoot = join(repoRoot, rel);
308
+ if (!existsSync(packagesRoot)) continue;
309
+ for (const name of listPackageDirs(packagesRoot)) {
310
+ if (/(^web[-.]|[-.]web$)/i.test(name) || /dashboard|frontend|ui$/i.test(name)) {
311
+ web.add(name);
312
+ } else {
313
+ daemon.add(name);
314
+ }
315
+ }
316
+ }
317
+
318
+ const daemonRuntimePackages = [...daemon].sort();
319
+ const webOnlyPackages = [...web].sort();
320
+
321
+ if (!daemonRuntimePackages.length && !webOnlyPackages.length) {
322
+ notes.push('No packages/ or oss/packages/ directories found — defaulting to an empty draft you should fill in by hand.');
323
+ } else {
324
+ if (daemonRuntimePackages.length) notes.push(`Classified ${daemonRuntimePackages.length} package(s) as daemon-runtime (change → rebuild/redeploy + restart).`);
325
+ if (webOnlyPackages.length) notes.push(`Classified ${webOnlyPackages.length} web-* package(s) as web-only (change → web redeploy, no daemon restart).`);
326
+ notes.push('Heuristic only: confirm each package actually matches its bucket before saving.');
327
+ }
328
+
329
+ const nonRuntimeRootFilePatterns = [
330
+ '*.md',
331
+ 'docs/**',
332
+ 'LICENSE',
333
+ 'LICENSE.*',
334
+ '.gitignore',
335
+ ];
336
+ notes.push('nonRuntimeRootFilePatterns lists root files that demonstrably cannot change daemon runtime behavior; extend with your repo markers.');
337
+
338
+ const suggestedConfig: ChangeImpactConfig = {
339
+ ...(daemonRuntimePackages.length ? { daemonRuntimePackages } : {}),
340
+ ...(webOnlyPackages.length ? { webOnlyPackages } : {}),
341
+ nonRuntimeRootFilePatterns,
342
+ impactTargets: {
343
+ daemon: { recommendedCommand: 'rebuild + redeploy the daemon, then restart it' },
344
+ web: { recommendedCommand: 'redeploy the web app (no daemon restart required)' },
345
+ none: { recommendedCommand: 'no action required' },
346
+ },
347
+ };
348
+
349
+ return {
350
+ suggestedConfig,
351
+ notes,
352
+ discoveredPackages: { daemon: daemonRuntimePackages, web: webOnlyPackages, unclassified },
353
+ };
354
+ }
@@ -4,6 +4,7 @@ import { getGitDiffSummary, getGitFileDiff } from './git-diff.js';
4
4
  import { GitCommandError, isPathInside, resolveGitRepository, runGit } from './git-executor.js';
5
5
  import { createGitSnapshotStore } from './git-snapshot-store.js';
6
6
  import { getGitRepoStatus } from './git-status.js';
7
+ import { loadConfig } from '../config/config.js';
7
8
  import type {
8
9
  GitCommandName,
9
10
  GitDiffSummary,
@@ -42,8 +43,12 @@ export interface GitLogResult extends GitRepoIdentity {
42
43
  }
43
44
 
44
45
  export interface GitCheckpointResult extends GitRepoIdentity {
45
- commit: string;
46
+ commit?: string;
46
47
  message: string;
48
+ status?: 'created' | 'skipped';
49
+ skipped?: boolean;
50
+ noop?: boolean;
51
+ reason?: 'nothing_to_commit';
47
52
  lastCheckedAt: number;
48
53
  }
49
54
 
@@ -62,9 +67,9 @@ export interface GitPushResult extends GitRepoIdentity {
62
67
  }
63
68
 
64
69
  export interface GitCommandServices {
65
- getStatus?: (params: { workspace: string; refreshUpstream?: boolean }) => Promise<GitRepoStatus> | GitRepoStatus;
66
- getDiffSummary?: (params: { workspace: string; staged?: boolean }) => Promise<GitDiffSummary> | GitDiffSummary;
67
- getDiffFile?: (params: { workspace: string; path: string; staged?: boolean }) => Promise<GitFileDiff> | GitFileDiff;
70
+ getStatus?: (params: { workspace: string; refreshUpstream?: boolean; includeSubmodules?: boolean; submoduleIgnorePaths?: string[] }) => Promise<GitRepoStatus> | GitRepoStatus;
71
+ getDiffSummary?: (params: { workspace: string; staged?: boolean; base?: string }) => Promise<GitDiffSummary> | GitDiffSummary;
72
+ getDiffFile?: (params: { workspace: string; path: string; staged?: boolean; base?: string }) => Promise<GitFileDiff> | GitFileDiff;
68
73
  createSnapshot?: (params: {
69
74
  workspace: string;
70
75
  reason: GitSnapshotReason;
@@ -97,6 +102,14 @@ export interface GitCommandServices {
97
102
  checkoutFiles?: (params: { workspace: string; paths: string[] }) => Promise<{ checkedOut: string[] }>;
98
103
  getRemoteUrl?: (params: { workspace: string; remote?: string }) => Promise<{ remoteUrl: string; remote: string }>;
99
104
  push?: (params: { workspace: string; remote?: string; branch?: string; setUpstream?: boolean }) => Promise<GitPushResult>;
105
+ /**
106
+ * Best-effort, non-blocking source of this daemon's detected provider CLI/ACP
107
+ * versions (keyed by provider id) + its build version, folded onto the git_status
108
+ * envelope so a mesh coordinator can self-heal each node's providerVersions the
109
+ * same way it does platform/arch. Wired at daemon boot from the cached CLI
110
+ * detection snapshot; omitted (⇒ versions not reported) when unavailable.
111
+ */
112
+ getReporterProviderVersions?: () => { providerVersions?: Record<string, string>; daemonBuildVersion?: string };
100
113
  }
101
114
 
102
115
  type GitCommandFailure = {
@@ -106,7 +119,12 @@ type GitCommandFailure = {
106
119
  };
107
120
 
108
121
  type GitCommandSuccess =
109
- | { success: true; status: GitRepoStatus }
122
+ // reporterPlatform/reporterArch carry the responding daemon's process.platform/
123
+ // process.arch so a mesh coordinator probing this node over P2P can self-heal the
124
+ // node's userOverrides.platform/arch (the fields capability-tag routing reads).
125
+ // reporterMachineNickname carries the responding daemon's config.machineNickname
126
+ // so the coordinator can populate node.machineNickname → the friendly display label.
127
+ | { success: true; status: GitRepoStatus; reporterPlatform?: string; reporterArch?: string; reporterMachineNickname?: string; reporterProviderVersions?: Record<string, string>; reporterDaemonBuildVersion?: string }
110
128
  | { success: true; diffSummary: GitDiffSummary }
111
129
  | { success: true; diff: GitFileDiff }
112
130
  | { success: true; snapshot: GitSnapshot }
@@ -169,11 +187,13 @@ const defaultSnapshotStore = createGitSnapshotStore({
169
187
  getDiffSummary: (workspace) => getGitDiffSummary(workspace),
170
188
  });
171
189
 
172
- export function createDefaultGitCommandServices(): GitCommandServices {
190
+ export function createDefaultGitCommandServices(
191
+ overrides?: Pick<GitCommandServices, 'getReporterProviderVersions'>,
192
+ ): GitCommandServices {
173
193
  return {
174
194
  getStatus: ({ workspace, refreshUpstream }) => getGitRepoStatus(workspace, { refreshUpstream }),
175
- getDiffSummary: ({ workspace }) => getGitDiffSummary(workspace),
176
- getDiffFile: ({ workspace, path: filePath }) => getGitFileDiff(workspace, filePath),
195
+ getDiffSummary: ({ workspace, base }) => getGitDiffSummary(workspace, base ? { baseRef: base } : {}),
196
+ getDiffFile: ({ workspace, path: filePath, base }) => getGitFileDiff(workspace, filePath, base ? { baseRef: base } : {}),
177
197
  createSnapshot: ({ workspace, reason, sessionId, turnId }) => defaultSnapshotStore.create({
178
198
  workspace,
179
199
  reason,
@@ -189,6 +209,9 @@ export function createDefaultGitCommandServices(): GitCommandServices {
189
209
  getRemoteUrl: async ({ workspace, remote = 'origin' }) => gitGetRemoteUrl(workspace, remote),
190
210
  push: async ({ workspace, remote = 'origin', branch, setUpstream = false }) =>
191
211
  gitPush(workspace, remote, branch, setUpstream),
212
+ ...(overrides?.getReporterProviderVersions
213
+ ? { getReporterProviderVersions: overrides.getReporterProviderVersions }
214
+ : {}),
192
215
  };
193
216
  }
194
217
 
@@ -290,13 +313,66 @@ export async function handleGitCommand(
290
313
  switch (command) {
291
314
  case 'git_status': {
292
315
  if (!services.getStatus) return serviceNotImplemented(command);
293
- const status = await runService(() => services.getStatus!({ workspace, refreshUpstream: optionalBoolean(args?.refreshUpstream) }));
294
- return 'success' in status ? status : { success: true, status };
316
+ const submoduleIgnorePaths = Array.isArray(args?.submoduleIgnorePaths)
317
+ ? args.submoduleIgnorePaths.filter((value: unknown): value is string => typeof value === 'string' && value.trim().length > 0)
318
+ : undefined;
319
+ const statusParams: { workspace: string; refreshUpstream?: boolean; includeSubmodules?: boolean; submoduleIgnorePaths?: string[] } = { workspace };
320
+ const refreshUpstream = optionalBoolean(args?.refreshUpstream);
321
+ const includeSubmodules = optionalBoolean(args?.includeSubmodules);
322
+ if (refreshUpstream !== undefined) statusParams.refreshUpstream = refreshUpstream;
323
+ if (includeSubmodules !== undefined) statusParams.includeSubmodules = includeSubmodules;
324
+ if (submoduleIgnorePaths && submoduleIgnorePaths.length > 0) statusParams.submoduleIgnorePaths = submoduleIgnorePaths;
325
+ const status = await runService(() => services.getStatus!(statusParams));
326
+ if ('success' in status) return status;
327
+ // Carry the responding daemon's real platform/arch alongside the git
328
+ // status. A mesh coordinator dispatches `git_status` to each member over
329
+ // P2P on every explicit graph refresh, so this is the recurring live
330
+ // channel that lets a member self-report its OS to the coordinator — which
331
+ // stamps it onto the node's userOverrides.platform/arch (the fields
332
+ // buildMeshNodeCapabilityTags reads). These are siblings of `status`, not
333
+ // part of GitRepoStatus, so the git payload shape is untouched.
334
+ // The machine nickname rides the same channel so the coordinator can render
335
+ // this node's friendly label instead of a raw daemonId/nodeId.
336
+ const reporterMachineNickname = (() => {
337
+ try {
338
+ const nick = loadConfig().machineNickname;
339
+ return typeof nick === 'string' && nick.trim() ? nick.trim() : undefined;
340
+ } catch {
341
+ return undefined;
342
+ }
343
+ })();
344
+ // Provider versions + build version ride the same self-report channel (T7
345
+ // visibility). Best-effort and non-blocking: the service reads a cached
346
+ // snapshot, so a cold cache simply omits the fields on this probe.
347
+ const reporterVersions = (() => {
348
+ try {
349
+ return services.getReporterProviderVersions?.() ?? {};
350
+ } catch {
351
+ return {};
352
+ }
353
+ })();
354
+ const reporterProviderVersions =
355
+ reporterVersions.providerVersions && Object.keys(reporterVersions.providerVersions).length > 0
356
+ ? reporterVersions.providerVersions
357
+ : undefined;
358
+ const reporterDaemonBuildVersion =
359
+ typeof reporterVersions.daemonBuildVersion === 'string' && reporterVersions.daemonBuildVersion.trim()
360
+ ? reporterVersions.daemonBuildVersion.trim()
361
+ : undefined;
362
+ return {
363
+ success: true,
364
+ status,
365
+ reporterPlatform: process.platform,
366
+ reporterArch: process.arch,
367
+ ...(reporterMachineNickname ? { reporterMachineNickname } : {}),
368
+ ...(reporterProviderVersions ? { reporterProviderVersions } : {}),
369
+ ...(reporterDaemonBuildVersion ? { reporterDaemonBuildVersion } : {}),
370
+ };
295
371
  }
296
372
 
297
373
  case 'git_diff_summary': {
298
374
  if (!services.getDiffSummary) return serviceNotImplemented(command);
299
- const diffSummary = await runService(() => services.getDiffSummary!({ workspace, staged: optionalBoolean(args?.staged) }));
375
+ const diffSummary = await runService(() => services.getDiffSummary!({ workspace, staged: optionalBoolean(args?.staged), base: optionalString(args?.base) }));
300
376
  return 'success' in diffSummary ? diffSummary : { success: true, diffSummary };
301
377
  }
302
378
 
@@ -438,10 +514,22 @@ async function gitCheckpoint(
438
514
  const repo = await resolveGitRepository(workspace);
439
515
  const repoRoot = repo.repoRoot!;
440
516
 
441
- const statusResult = await getGitRepoStatus(workspace);
517
+ // Decision-then-mutate path: this conflict / dirty-submodule precheck gates a real
518
+ // `git add` + `git commit`. Bypass the C1 TTL cache so the checkpoint never proceeds
519
+ // on a stale "clean" verdict.
520
+ const statusResult = await getGitRepoStatus(workspace, { forceFresh: true });
442
521
  if (statusResult.hasConflicts) {
443
522
  throw new GitCommandError('conflict', 'Repository has conflicts — resolve before checkpointing');
444
523
  }
524
+ const dirtySubmodules = (statusResult.submodules || []).filter(submodule => submodule.dirty);
525
+ if (dirtySubmodules.length > 0) {
526
+ const paths = dirtySubmodules.map(submodule => submodule.path).join(', ');
527
+ throw new GitCommandError(
528
+ 'dirty_index_required',
529
+ `Repository has dirty submodules that must be checkpointed first: ${paths}. ` +
530
+ 'Checkpoint or commit each dirty submodule, then checkpoint this repository to record gitlink changes.',
531
+ );
532
+ }
445
533
 
446
534
  const addArgs = includeUntracked ? ['-A'] : ['-u'];
447
535
  await runGit(repo, ['add', ...addArgs], { cwd: repoRoot });
@@ -455,10 +543,17 @@ async function gitCheckpoint(
455
543
  } catch (err: any) {
456
544
  const output = (err?.stdout || '') + (err?.stderr || '');
457
545
  if (/nothing to commit/i.test(output)) {
458
- throw new GitCommandError('nothing_to_commit', 'Nothing to commit — working tree is clean.', {
459
- stdout: err?.stdout,
460
- stderr: err?.stderr,
461
- });
546
+ return {
547
+ workspace: repo.workspace,
548
+ repoRoot,
549
+ isGitRepo: true,
550
+ message: fullMsg,
551
+ status: 'skipped',
552
+ skipped: true,
553
+ noop: true,
554
+ reason: 'nothing_to_commit',
555
+ lastCheckedAt: Date.now(),
556
+ };
462
557
  }
463
558
  throw err;
464
559
  }
@@ -469,6 +564,7 @@ async function gitCheckpoint(
469
564
  isGitRepo: true,
470
565
  commit: commitSha,
471
566
  message: fullMsg,
567
+ status: 'created',
472
568
  lastCheckedAt: Date.now(),
473
569
  };
474
570
  }