@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,510 @@
1
+ /**
2
+ * Mesh contract v2 — first-class identity, scopes, and protocol version.
3
+ *
4
+ * Replaces the implicit conventions that grew across mesh-events.ts,
5
+ * mesh-work-queue.ts, mesh-ledger.ts, and mesh-tools.ts where the same
6
+ * concept (a coordinator, a session, a task status) appeared in different
7
+ * shapes per file. The audit found:
8
+ *
9
+ * - PendingMeshCoordinatorEvent had no targetCoordinatorDaemonId. All
10
+ * events were broadcast to every coordinator that drained them. Two
11
+ * coordinators sharing a mesh would each receive every event,
12
+ * leading to duplicate completion handling and missed targeting.
13
+ * - drainPendingMeshCoordinatorEvents accepted only meshId. The caller's
14
+ * coordinator identity was never available, so per-coordinator
15
+ * routing was impossible by construction.
16
+ * - Session identifier keys diverged across stores: targetSessionId /
17
+ * assignedSessionId / instanceId / runtimeSessionId / providerSessionId.
18
+ * resolveEventSessionId() tried four fallbacks per call.
19
+ * - No protocol version on the JSONL ledger or MeshRuntimeStore. Schema
20
+ * evolutions had no guard rail.
21
+ * - mesh_reconcile_ledger existed as a routine recovery tool, not as
22
+ * an incident-response escape hatch. That itself signals the routing
23
+ * layer cannot be trusted.
24
+ *
25
+ * This module introduces the types; the actual wiring lands in B2 (data
26
+ * model + 3-way transactional store), B3 (MCP layer enforcement), and B4
27
+ * (frontend consumption). B1 is intentionally non-breaking — it adds the
28
+ * types and leaves runtime behaviour unchanged.
29
+ */
30
+
31
+ import { daemonIdsEquivalent, machineCoreFromDaemonId } from '@adhdev/mesh-shared';
32
+
33
+ /** Provider type identifier (e.g. 'claude-cli', 'codex-cli', 'roo-code').
34
+ * Free-form string; no shared enum exists in daemon-core yet. */
35
+ type ProviderType = string;
36
+
37
+ // ─── Protocol version ────────────────────────────────────────────────────
38
+
39
+ export const MESH_PROTOCOL_VERSION_V1 = '1.0' as const;
40
+ export const MESH_PROTOCOL_VERSION_V2 = '2.0' as const;
41
+
42
+ export type MeshProtocolVersion =
43
+ | typeof MESH_PROTOCOL_VERSION_V1
44
+ | typeof MESH_PROTOCOL_VERSION_V2;
45
+
46
+ export const SUPPORTED_MESH_PROTOCOL_VERSIONS: readonly MeshProtocolVersion[] = [
47
+ MESH_PROTOCOL_VERSION_V1,
48
+ MESH_PROTOCOL_VERSION_V2,
49
+ ] as const;
50
+
51
+ export function isSupportedMeshProtocolVersion(value: unknown): value is MeshProtocolVersion {
52
+ return typeof value === 'string'
53
+ && (SUPPORTED_MESH_PROTOCOL_VERSIONS as readonly string[]).includes(value);
54
+ }
55
+
56
+ // ─── Coordinator identity ────────────────────────────────────────────────
57
+
58
+ /**
59
+ * Identity of a mesh coordinator. Required (non-optional) on every dispatch
60
+ * and drain operation in v2 — opaque/missing identity is the audit's
61
+ * smoking gun for routing failures and is structurally banned by the v2
62
+ * types.
63
+ *
64
+ * - daemonId: the machineId of the daemon hosting the coordinator. Stable
65
+ * across coordinator restarts on the same machine.
66
+ * - coordinatorRunId: a UUID generated when the coordinator process starts.
67
+ * Stable for the coordinator's lifetime, fresh on restart. Required so
68
+ * two coordinators on the same daemon (one CLI, one MCP) can be told
69
+ * apart without conflating their drains.
70
+ * - sessionId: optional CLI coordinator session identifier (instanceId).
71
+ * Present when the coordinator is itself a CLI session, absent for
72
+ * pure MCP coordinators.
73
+ */
74
+ export interface CoordinatorIdentity {
75
+ readonly daemonId: string;
76
+ readonly coordinatorRunId: string;
77
+ readonly sessionId?: string;
78
+ }
79
+
80
+ export function coordinatorIdentityEquals(a: CoordinatorIdentity, b: CoordinatorIdentity): boolean {
81
+ // daemonId compares by machine core: the same daemon answers to three
82
+ // interchangeable id forms (mach_X / daemon_mach_X / standalone_mach_X), so a
83
+ // raw `===` would treat one coordinator addressed under two forms as distinct.
84
+ return daemonIdsEquivalent(a.daemonId, b.daemonId)
85
+ && a.coordinatorRunId === b.coordinatorRunId
86
+ && (a.sessionId ?? '') === (b.sessionId ?? '');
87
+ }
88
+
89
+ export function coordinatorIdentityKey(identity: CoordinatorIdentity): string {
90
+ // Stable string form for map keys and ledger payloads. Avoids the
91
+ // {a:b, c:d} JSON.stringify ordering trap by enforcing field order. The
92
+ // daemonId is normalized to its machine core so the key stays consistent with
93
+ // coordinatorIdentityEquals — two equal identities addressed under different
94
+ // daemon-id forms must produce the SAME key (else equal-but-distinct-key bug).
95
+ const daemonCore = machineCoreFromDaemonId(identity.daemonId) ?? identity.daemonId;
96
+ return `${daemonCore}|${identity.coordinatorRunId}|${identity.sessionId ?? ''}`;
97
+ }
98
+
99
+ // ─── Session handle ──────────────────────────────────────────────────────
100
+
101
+ /**
102
+ * Unified mesh session identifier. v1 referred to "the session" with five
103
+ * different field names depending on which store you were reading; v2
104
+ * collapses them into one explicit handle that carries every disambiguator
105
+ * a consumer might need.
106
+ *
107
+ * - nodeId: the mesh node this session belongs to (FK into mesh node table).
108
+ * - sessionId: provider-instance identifier (the runtime session id).
109
+ * - providerType: which provider category/type the session runs (e.g.
110
+ * 'claude-cli', 'codex-cli', 'roo-code').
111
+ * - coordinatorDaemonId: which coordinator dispatched the work that
112
+ * spawned this session. Used for completion event routing.
113
+ * - assignedAt: ms epoch when the session was bound to its current task.
114
+ */
115
+ export interface MeshSessionHandle {
116
+ readonly nodeId: string;
117
+ readonly sessionId: string;
118
+ readonly providerType: ProviderType;
119
+ readonly coordinatorDaemonId: string;
120
+ readonly assignedAt: number;
121
+ }
122
+
123
+ export function meshSessionHandleKey(handle: MeshSessionHandle): string {
124
+ return `${handle.nodeId}|${handle.sessionId}`;
125
+ }
126
+
127
+ // ─── Task status (canonical enum) ────────────────────────────────────────
128
+
129
+ /**
130
+ * Single canonical task status enum. v1 had at least three overlapping
131
+ * sets (queue / ledger / direct-dispatch). v2 consumers import from here.
132
+ */
133
+ export const MESH_TASK_STATUSES = [
134
+ 'pending',
135
+ 'assigned',
136
+ 'in_progress',
137
+ 'completed',
138
+ 'failed',
139
+ 'cancelled',
140
+ ] as const;
141
+ export type MeshTaskStatus = typeof MESH_TASK_STATUSES[number];
142
+
143
+ export function isMeshTaskStatus(value: unknown): value is MeshTaskStatus {
144
+ return typeof value === 'string'
145
+ && (MESH_TASK_STATUSES as readonly string[]).includes(value);
146
+ }
147
+
148
+ // ─── Event scope ─────────────────────────────────────────────────────────
149
+
150
+ /**
151
+ * Explicit scope for pending coordinator events. v1 had no scope: every
152
+ * event was broadcast to every drainer. v2 forces producers to declare
153
+ * intent.
154
+ *
155
+ * - 'unicast': delivered to exactly one coordinator (intendedFor). Other
156
+ * coordinators' drains skip it.
157
+ * - 'broadcast': delivered to every coordinator on the mesh. Used for
158
+ * system-wide signals (e.g. mesh-wide policy changes). The v1 default
159
+ * becomes explicit here so audit tools can flag unintended broadcasts.
160
+ * - 'system': delivered to the daemon-level handler, not coordinators.
161
+ * Reserved for infrastructure events that no coordinator should see
162
+ * (e.g. ledger reconciliation outcomes).
163
+ */
164
+ export const MESH_EVENT_SCOPES = ['unicast', 'broadcast', 'system'] as const;
165
+ export type MeshEventScope = typeof MESH_EVENT_SCOPES[number];
166
+
167
+ export function isMeshEventScope(value: unknown): value is MeshEventScope {
168
+ return typeof value === 'string'
169
+ && (MESH_EVENT_SCOPES as readonly string[]).includes(value);
170
+ }
171
+
172
+ // ─── Pending coordinator event v2 ────────────────────────────────────────
173
+
174
+ /**
175
+ * v2 shape of a pending coordinator event. Strict supersets of the v1
176
+ * shape — every v1 field is preserved so existing readers do not break;
177
+ * v2 fields (scope, dispatchedBy, intendedFor, protocolVersion) are
178
+ * additive and consulted by v2-aware drainers only.
179
+ *
180
+ * Mixed v1/v2 events coexist during the rollout window. B2 fully cuts
181
+ * over once every coordinator drain is v2-aware.
182
+ */
183
+ export interface PendingMeshCoordinatorEventV2 {
184
+ // v1 fields (preserved exactly)
185
+ readonly event: string;
186
+ readonly meshId: string;
187
+ readonly nodeLabel: string;
188
+ readonly nodeId?: string;
189
+ readonly workspace?: string;
190
+ readonly metadataEvent: Record<string, unknown>;
191
+ readonly coordinatorMessage?: string;
192
+ readonly queuedAt: number;
193
+
194
+ // v2 additions
195
+ readonly protocolVersion: MeshProtocolVersion;
196
+ /**
197
+ * Idempotency key. A UUID generated ONCE at emit time and preserved verbatim
198
+ * across every store (SQLite payload + column, JSONL) and the P2P relay
199
+ * boundary. The receiving drain uses eventId as the authoritative dedup key
200
+ * (B3): an event whose eventId was already drained is skipped even if its
201
+ * content fingerprint differs. Distinct from the content fingerprint, which
202
+ * stays the v1 dedup mechanism during rollout.
203
+ */
204
+ readonly eventId: string;
205
+ readonly scope: MeshEventScope;
206
+ readonly dispatchedBy: CoordinatorIdentity;
207
+ /**
208
+ * Required when scope === 'unicast', forbidden otherwise. Drainers MUST
209
+ * skip unicast events whose intendedFor does not equal their own identity.
210
+ */
211
+ readonly intendedFor?: CoordinatorIdentity;
212
+ }
213
+
214
+ // ─── Ledger entry v2 ─────────────────────────────────────────────────────
215
+
216
+ /**
217
+ * v2 ledger entry additions. The originatingCoordinator field is the
218
+ * source of truth that lets completion events route back to the
219
+ * coordinator that dispatched the task. v1's "worker settings carried it
220
+ * if it happened to be set" approach is replaced.
221
+ */
222
+ export interface MeshLedgerOriginatingCoordinatorV2 {
223
+ readonly originatingCoordinator: CoordinatorIdentity;
224
+ readonly protocolVersion: MeshProtocolVersion;
225
+ }
226
+
227
+ // ─── Validation primitives ───────────────────────────────────────────────
228
+
229
+ export class MeshContractViolationError extends Error {
230
+ readonly violationPath: string;
231
+ readonly protocolVersion: MeshProtocolVersion;
232
+ constructor(
233
+ protocolVersion: MeshProtocolVersion,
234
+ violationPath: string,
235
+ detail: string,
236
+ ) {
237
+ super(`mesh contract ${protocolVersion} violation at ${violationPath}: ${detail}`);
238
+ this.name = 'MeshContractViolationError';
239
+ this.violationPath = violationPath;
240
+ this.protocolVersion = protocolVersion;
241
+ }
242
+ }
243
+
244
+ function isNonEmptyString(value: unknown): value is string {
245
+ return typeof value === 'string' && value.length > 0;
246
+ }
247
+
248
+ export function assertCoordinatorIdentity(raw: unknown, path: string): CoordinatorIdentity {
249
+ if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {
250
+ throw new MeshContractViolationError(MESH_PROTOCOL_VERSION_V2, path, 'must be an object');
251
+ }
252
+ const obj = raw as Record<string, unknown>;
253
+ if (!isNonEmptyString(obj.daemonId)) {
254
+ throw new MeshContractViolationError(MESH_PROTOCOL_VERSION_V2, `${path}.daemonId`, 'must be a non-empty string');
255
+ }
256
+ if (!isNonEmptyString(obj.coordinatorRunId)) {
257
+ throw new MeshContractViolationError(MESH_PROTOCOL_VERSION_V2, `${path}.coordinatorRunId`, 'must be a non-empty string');
258
+ }
259
+ const sessionId = obj.sessionId;
260
+ if (sessionId !== undefined && !isNonEmptyString(sessionId)) {
261
+ throw new MeshContractViolationError(MESH_PROTOCOL_VERSION_V2, `${path}.sessionId`, 'must be a non-empty string when provided');
262
+ }
263
+ return sessionId !== undefined
264
+ ? { daemonId: obj.daemonId, coordinatorRunId: obj.coordinatorRunId, sessionId }
265
+ : { daemonId: obj.daemonId, coordinatorRunId: obj.coordinatorRunId };
266
+ }
267
+
268
+ export function assertPendingMeshCoordinatorEventV2(raw: unknown, path = '$'): PendingMeshCoordinatorEventV2 {
269
+ if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {
270
+ throw new MeshContractViolationError(MESH_PROTOCOL_VERSION_V2, path, 'must be an object');
271
+ }
272
+ const obj = raw as Record<string, unknown>;
273
+ if (!isSupportedMeshProtocolVersion(obj.protocolVersion)) {
274
+ throw new MeshContractViolationError(MESH_PROTOCOL_VERSION_V2, `${path}.protocolVersion`, `must be one of ${SUPPORTED_MESH_PROTOCOL_VERSIONS.join(', ')}`);
275
+ }
276
+ if (!isNonEmptyString(obj.eventId)) {
277
+ throw new MeshContractViolationError(MESH_PROTOCOL_VERSION_V2, `${path}.eventId`, 'must be a non-empty string');
278
+ }
279
+ if (!isMeshEventScope(obj.scope)) {
280
+ throw new MeshContractViolationError(MESH_PROTOCOL_VERSION_V2, `${path}.scope`, `must be one of ${MESH_EVENT_SCOPES.join(', ')}`);
281
+ }
282
+ if (!isNonEmptyString(obj.event)) {
283
+ throw new MeshContractViolationError(MESH_PROTOCOL_VERSION_V2, `${path}.event`, 'must be a non-empty string');
284
+ }
285
+ if (!isNonEmptyString(obj.meshId)) {
286
+ throw new MeshContractViolationError(MESH_PROTOCOL_VERSION_V2, `${path}.meshId`, 'must be a non-empty string');
287
+ }
288
+ const dispatchedBy = assertCoordinatorIdentity(obj.dispatchedBy, `${path}.dispatchedBy`);
289
+
290
+ if (obj.scope === 'unicast') {
291
+ if (!obj.intendedFor) {
292
+ throw new MeshContractViolationError(MESH_PROTOCOL_VERSION_V2, `${path}.intendedFor`, 'unicast scope requires intendedFor');
293
+ }
294
+ } else if (obj.intendedFor !== undefined) {
295
+ throw new MeshContractViolationError(MESH_PROTOCOL_VERSION_V2, `${path}.intendedFor`, 'only unicast scope may set intendedFor');
296
+ }
297
+ const intendedFor = obj.intendedFor
298
+ ? assertCoordinatorIdentity(obj.intendedFor, `${path}.intendedFor`)
299
+ : undefined;
300
+
301
+ const metadata = obj.metadataEvent && typeof obj.metadataEvent === 'object' && !Array.isArray(obj.metadataEvent)
302
+ ? (obj.metadataEvent as Record<string, unknown>)
303
+ : null;
304
+ if (!metadata) {
305
+ throw new MeshContractViolationError(MESH_PROTOCOL_VERSION_V2, `${path}.metadataEvent`, 'must be an object');
306
+ }
307
+ const queuedAt = typeof obj.queuedAt === 'number' && Number.isFinite(obj.queuedAt) ? obj.queuedAt : null;
308
+ if (queuedAt === null) {
309
+ throw new MeshContractViolationError(MESH_PROTOCOL_VERSION_V2, `${path}.queuedAt`, 'must be a finite number');
310
+ }
311
+
312
+ return {
313
+ event: obj.event,
314
+ meshId: obj.meshId,
315
+ nodeLabel: isNonEmptyString(obj.nodeLabel) ? obj.nodeLabel : '',
316
+ nodeId: typeof obj.nodeId === 'string' ? obj.nodeId : undefined,
317
+ workspace: typeof obj.workspace === 'string' ? obj.workspace : undefined,
318
+ metadataEvent: metadata,
319
+ coordinatorMessage: typeof obj.coordinatorMessage === 'string' ? obj.coordinatorMessage : undefined,
320
+ queuedAt,
321
+ protocolVersion: obj.protocolVersion,
322
+ eventId: obj.eventId,
323
+ scope: obj.scope,
324
+ dispatchedBy,
325
+ ...(intendedFor ? { intendedFor } : {}),
326
+ };
327
+ }
328
+
329
+ // ─── Routing helper ──────────────────────────────────────────────────────
330
+
331
+ /**
332
+ * Decide whether a v2 pending event should be delivered to the given drainer.
333
+ * Centralised so every drain implementation uses the same rule.
334
+ *
335
+ * - 'broadcast': always delivered. NOTE: a terminal task event that reached the
336
+ * queue as broadcast is an ownership leak (it belongs to its dispatching
337
+ * coordinator). This pure helper does not have the drain-window
338
+ * daemon-form/session matching semantics, so the terminal+broadcast
339
+ * dispatchedBy filter is applied one layer up in the drainer (see
340
+ * mesh-events-pending routeV2EventsForDrainer) where those semantics live.
341
+ * - 'system': never delivered to coordinators (system handler only).
342
+ * - 'unicast': delivered iff intendedFor matches drainer identity.
343
+ *
344
+ * v1 events (no scope / no protocolVersion) are treated as broadcast for
345
+ * backward compatibility during rollout; B3 tightens this so v1 events
346
+ * are quarantined to a dedicated drain endpoint instead.
347
+ */
348
+ export function shouldDeliverPendingEventToCoordinator(
349
+ event: PendingMeshCoordinatorEventV2,
350
+ drainer: CoordinatorIdentity,
351
+ ): boolean {
352
+ if (event.scope === 'system') return false;
353
+ if (event.scope === 'broadcast') return true;
354
+ if (!event.intendedFor) return false;
355
+ return coordinatorIdentityEquals(event.intendedFor, drainer);
356
+ }
357
+
358
+ // ─── Emit-side scope defaulting (B2a) ────────────────────────────────────────
359
+
360
+ /**
361
+ * Terminal task events. In v2 these are unicast: a completion/failure/approval
362
+ * belongs to exactly the coordinator (session) that dispatched the task, so
363
+ * delivering it to a sibling coordinator on the same daemon is a routing bug.
364
+ * The names match the v1 producer event strings queued by the emit call sites
365
+ * (mesh-event-forwarding, mesh-events-stale, router-refine).
366
+ */
367
+ const TERMINAL_TASK_EVENTS: ReadonlySet<string> = new Set([
368
+ 'agent:generating_completed',
369
+ 'agent:stopped',
370
+ 'refine:completed',
371
+ 'refine:failed',
372
+ 'refine:accepted',
373
+ ]);
374
+
375
+ /**
376
+ * True for a terminal task event (completion / stop / refine outcome). A terminal
377
+ * event belongs to exactly the coordinator that dispatched the task, so it must
378
+ * never fan out to sibling coordinators that did not dispatch it. Used by the
379
+ * emit-side stamp (to avoid downgrading an unaddressed terminal event to full
380
+ * broadcast) and by the drain-side filter (defense-in-depth for any terminal
381
+ * event that already reached the queue as broadcast).
382
+ */
383
+ export function isTerminalTaskEvent(eventName: string): boolean {
384
+ return TERMINAL_TASK_EVENTS.has(eventName);
385
+ }
386
+
387
+ /**
388
+ * Coordinator-addressed dispatch-plane alerts. `mesh:dispatch_blocked` is the
389
+ * Fix (1) actionable dispatch-skip notification: it exists precisely to page the
390
+ * ORIGINATING coordinator (it carries a why+how coordinatorMessage and is
391
+ * targetCoordinator*-addressed by its producer), so it routes unicast exactly
392
+ * like a terminal task event. B2a originally classed it 'system' — that made it
393
+ * a dead letter: no daemon-level system drain exists, so the blocker never
394
+ * reached any coordinator and the task sat silently undispatched.
395
+ */
396
+ const COORDINATOR_ALERT_EVENTS: ReadonlySet<string> = new Set([
397
+ 'mesh:dispatch_blocked',
398
+ ]);
399
+
400
+ /**
401
+ * Default the v2 scope for an event by its producer event name (design decision
402
+ * §3). Terminal task events and coordinator-addressed alerts → unicast (routed
403
+ * to the originating coordinator). Everything else — node lifecycle and
404
+ * progress signals — → broadcast, which also matches v1's implicit "deliver to
405
+ * any coordinator" behaviour, so an unstamped v1 event and a v2-stamped-as-
406
+ * broadcast event route identically during rollout. No event currently defaults
407
+ * to 'system'; the scope remains in MESH_EVENT_SCOPES for wire compatibility
408
+ * (an already-queued or version-skewed 'system' event still routes away from
409
+ * coordinators).
410
+ */
411
+ export function defaultScopeForEvent(eventName: string): MeshEventScope {
412
+ if (TERMINAL_TASK_EVENTS.has(eventName) || COORDINATOR_ALERT_EVENTS.has(eventName)) return 'unicast';
413
+ return 'broadcast';
414
+ }
415
+
416
+ /**
417
+ * The v2 envelope stamp applied to a pending coordinator event at emit time.
418
+ * Additive over the v1 shape: every field is consulted by v2-aware drainers
419
+ * only, so a v1 reader that ignores them is unaffected.
420
+ */
421
+ export interface PendingEventEmitStampV2 {
422
+ readonly protocolVersion: typeof MESH_PROTOCOL_VERSION_V2;
423
+ readonly eventId: string;
424
+ readonly scope: MeshEventScope;
425
+ readonly dispatchedBy: CoordinatorIdentity;
426
+ readonly intendedFor?: CoordinatorIdentity;
427
+ }
428
+
429
+ /**
430
+ * Build a coordinator identity from the loosely-typed fields the v1 emit call
431
+ * sites already carry (a daemonId, and — sometimes — a coordinator session id).
432
+ * Returns undefined when no usable daemonId is present; the caller then leaves
433
+ * the event unstamped (v1, broadcast-treated) rather than fabricating identity.
434
+ * coordinatorRunId is not known at every emit site yet (B2 wires the registry),
435
+ * so it falls back to the daemonId — a stable, non-empty value that keeps the
436
+ * identity well-formed for assertCoordinatorIdentity without inventing a UUID
437
+ * that would differ per emit and defeat equality.
438
+ */
439
+ export function coordinatorIdentityFromEmitFields(fields: {
440
+ daemonId?: string | null;
441
+ coordinatorRunId?: string | null;
442
+ sessionId?: string | null;
443
+ }): CoordinatorIdentity | undefined {
444
+ const daemonId = typeof fields.daemonId === 'string' && fields.daemonId.length > 0 ? fields.daemonId : undefined;
445
+ if (!daemonId) return undefined;
446
+ const coordinatorRunId = typeof fields.coordinatorRunId === 'string' && fields.coordinatorRunId.length > 0
447
+ ? fields.coordinatorRunId
448
+ : daemonId;
449
+ const sessionId = typeof fields.sessionId === 'string' && fields.sessionId.length > 0 ? fields.sessionId : undefined;
450
+ return sessionId !== undefined
451
+ ? { daemonId, coordinatorRunId, sessionId }
452
+ : { daemonId, coordinatorRunId };
453
+ }
454
+
455
+ /**
456
+ * Compute the v2 emit stamp for an event (B2a). `eventId` MUST be supplied by
457
+ * the caller (generated via crypto.randomUUID at the daemon-core boundary so
458
+ * this module stays dependency-free and deterministically testable). Scope
459
+ * defaults from the event name unless explicitly overridden.
460
+ *
461
+ * When `dispatchedBy` cannot be constructed (no coordinator daemon known),
462
+ * returns undefined: the event stays a v1 (unstamped) event and is broadcast-
463
+ * treated during rollout, exactly as before — no regression, no fabricated
464
+ * identity. When the resolved scope is 'unicast' but no `intendedFor` is
465
+ * available, the fallback depends on the event class:
466
+ *
467
+ * - Terminal task events (completion / stop / refine outcome) MUST NOT be
468
+ * broadcast to every coordinator — a completion belongs to the coordinator
469
+ * that dispatched the task, and broadcasting it makes non-owner coordinators
470
+ * (e.g. sibling MAGI coordinators that never dispatched this replica's task)
471
+ * act on a completion that is not theirs (MAGI-REPLICA-COMPLETION-EVENT-LEAK).
472
+ * For these we address the event to `dispatchedBy` (the dispatching
473
+ * coordinator) and KEEP it unicast, so the stamp stays contract-valid and the
474
+ * event reaches only its originating coordinator.
475
+ * - Any other unicast event with no addressable target falls back to broadcast
476
+ * (contract-valid, still delivered, never dropped) — unchanged.
477
+ */
478
+ export function buildPendingEventEmitStamp(opts: {
479
+ eventName: string;
480
+ eventId: string;
481
+ dispatchedBy?: CoordinatorIdentity;
482
+ intendedFor?: CoordinatorIdentity;
483
+ scope?: MeshEventScope;
484
+ }): PendingEventEmitStampV2 | undefined {
485
+ if (!opts.dispatchedBy) return undefined;
486
+ let scope: MeshEventScope = opts.scope ?? defaultScopeForEvent(opts.eventName);
487
+ let intendedFor = opts.intendedFor;
488
+ if (scope === 'unicast' && !intendedFor) {
489
+ if (isTerminalTaskEvent(opts.eventName)) {
490
+ // Terminal event with no explicit target: address it to the dispatching
491
+ // coordinator rather than broadcasting to every coordinator. dispatchedBy
492
+ // is the coordinator that owns the task, so this is the correct — and
493
+ // contract-valid (unicast requires intendedFor) — narrowing.
494
+ intendedFor = opts.dispatchedBy;
495
+ } else {
496
+ // No addressable target for a non-terminal unicast event — fall back to
497
+ // broadcast so the stamp is contract-valid and the event is still
498
+ // delivered (never dropped).
499
+ scope = 'broadcast';
500
+ }
501
+ }
502
+ if (scope !== 'unicast') intendedFor = undefined;
503
+ return {
504
+ protocolVersion: MESH_PROTOCOL_VERSION_V2,
505
+ eventId: opts.eventId,
506
+ scope,
507
+ dispatchedBy: opts.dispatchedBy,
508
+ ...(intendedFor ? { intendedFor } : {}),
509
+ };
510
+ }