@adhdev/daemon-core 0.9.82-rc.45 → 0.9.82-rc.451

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 (429) 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 +200 -0
  10. package/dist/cli-adapters/provider-cli-adapter.d.ts +126 -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 +7 -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 +25 -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 +29 -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.d.ts +279 -2
  56. package/dist/commands/upgrade-helper.d.ts +41 -1
  57. package/dist/config/chat-history.d.ts +9 -0
  58. package/dist/config/config.d.ts +5 -0
  59. package/dist/config/mesh-config.d.ts +129 -1
  60. package/dist/config/mesh-json-config.d.ts +199 -0
  61. package/dist/config/repo-settings.d.ts +77 -0
  62. package/dist/daemon/dev-server.d.ts +0 -2
  63. package/dist/detection/ide-detector.d.ts +13 -0
  64. package/dist/detection/win32-ide-version.d.ts +37 -0
  65. package/dist/git/change-impact-config.d.ts +159 -0
  66. package/dist/git/git-commands.d.ts +12 -1
  67. package/dist/git/git-diff.d.ts +6 -0
  68. package/dist/git/git-executor.d.ts +11 -0
  69. package/dist/git/git-status.d.ts +57 -0
  70. package/dist/git/git-types.d.ts +2 -50
  71. package/dist/git/git-worktree.d.ts +71 -1
  72. package/dist/git/index.d.ts +3 -1
  73. package/dist/index.d.ts +66 -14
  74. package/dist/index.js +49753 -18414
  75. package/dist/index.js.map +1 -1
  76. package/dist/index.mjs +49614 -18438
  77. package/dist/index.mjs.map +1 -1
  78. package/dist/installer.d.ts +1 -4
  79. package/dist/ipc/local-ipc-server.d.ts +91 -0
  80. package/dist/launch.d.ts +1 -1
  81. package/dist/logging/async-batch-writer.d.ts +10 -0
  82. package/dist/logging/log-redactor.d.ts +24 -0
  83. package/dist/logging/log-tail-reader.d.ts +81 -0
  84. package/dist/logging/logger.d.ts +1 -1
  85. package/dist/mesh/contracts.d.ts +164 -0
  86. package/dist/mesh/coordinator-prompt.d.ts +89 -0
  87. package/dist/mesh/coordinator-registry.d.ts +59 -0
  88. package/dist/mesh/mesh-active-work.d.ts +174 -0
  89. package/dist/mesh/mesh-clone-grace.d.ts +8 -0
  90. package/dist/mesh/mesh-coordinator-config.d.ts +21 -0
  91. package/dist/mesh/mesh-delivery-policy.d.ts +131 -0
  92. package/dist/mesh/mesh-event-classify.d.ts +5 -0
  93. package/dist/mesh/mesh-event-forwarding.d.ts +41 -0
  94. package/dist/mesh/mesh-event-trace.d.ts +21 -0
  95. package/dist/mesh/mesh-events-coordinator.d.ts +4 -0
  96. package/dist/mesh/mesh-events-pending.d.ts +69 -0
  97. package/dist/mesh/mesh-events-stale.d.ts +61 -0
  98. package/dist/mesh/mesh-events-utils.d.ts +75 -0
  99. package/dist/mesh/mesh-events.d.ts +6 -49
  100. package/dist/mesh/mesh-fast-forward.d.ts +81 -0
  101. package/dist/mesh/mesh-host-ownership.d.ts +29 -0
  102. package/dist/mesh/mesh-init.d.ts +128 -0
  103. package/dist/mesh/mesh-ledger-reconciliation.d.ts +23 -4
  104. package/dist/mesh/mesh-ledger.d.ts +115 -1
  105. package/dist/mesh/mesh-magi-status.d.ts +63 -0
  106. package/dist/mesh/mesh-missions.d.ts +189 -0
  107. package/dist/mesh/mesh-node-identity.d.ts +306 -0
  108. package/dist/mesh/mesh-queue-assignment.d.ts +113 -0
  109. package/dist/mesh/mesh-reconcile-loop.d.ts +79 -0
  110. package/dist/mesh/mesh-refine-batch.d.ts +68 -0
  111. package/dist/mesh/mesh-refine-gates.d.ts +428 -0
  112. package/dist/mesh/mesh-refine-status.d.ts +62 -0
  113. package/dist/mesh/mesh-review-inbox.d.ts +90 -0
  114. package/dist/mesh/mesh-routing.d.ts +70 -0
  115. package/dist/mesh/mesh-runtime-store.d.ts +450 -0
  116. package/dist/mesh/mesh-scheduling-runtime.d.ts +78 -0
  117. package/dist/mesh/mesh-task-inflight.d.ts +46 -0
  118. package/dist/mesh/mesh-task-stats.d.ts +49 -0
  119. package/dist/mesh/mesh-unresolved-forward-outbox.d.ts +30 -0
  120. package/dist/mesh/mesh-warmup-deadline.d.ts +68 -0
  121. package/dist/mesh/mesh-work-queue.d.ts +300 -5
  122. package/dist/mesh/preview-freshness.d.ts +18 -0
  123. package/dist/mesh/refine-config.d.ts +216 -0
  124. package/dist/mesh/worktree-bootstrap-config.d.ts +145 -0
  125. package/dist/providers/acp-provider-instance.d.ts +5 -0
  126. package/dist/providers/approval-utils.d.ts +20 -0
  127. package/dist/providers/chat-message-normalization.d.ts +32 -1
  128. package/dist/providers/cli-provider-instance.d.ts +254 -3
  129. package/dist/providers/contracts.d.ts +149 -6
  130. package/dist/providers/external-sources.d.ts +71 -0
  131. package/dist/providers/manual-attendance.d.ts +63 -0
  132. package/dist/providers/native-history/antigravity-cli-transcript.d.ts +126 -0
  133. package/dist/providers/native-history/claude-cli-transcript.d.ts +70 -0
  134. package/dist/providers/native-history/codex-cli-transcript.d.ts +73 -0
  135. package/dist/providers/native-history/constants.d.ts +12 -0
  136. package/dist/providers/native-history/dispatcher.d.ts +27 -0
  137. package/dist/providers/native-history/hermes-cli-transcript.d.ts +30 -0
  138. package/dist/providers/native-history/index.d.ts +13 -0
  139. package/dist/providers/provider-instance-manager.d.ts +29 -0
  140. package/dist/providers/provider-instance.d.ts +23 -1
  141. package/dist/providers/provider-loader.d.ts +26 -4
  142. package/dist/providers/provider-trust.d.ts +31 -0
  143. package/dist/providers/read-chat-contract.d.ts +29 -0
  144. package/dist/providers/sdk/v1/builders/acp/detect-status.d.ts +68 -0
  145. package/dist/providers/sdk/v1/builders/cli/detect-status.d.ts +86 -0
  146. package/dist/providers/sdk/v1/builders/cli/parse-approval-squash.d.ts +59 -0
  147. package/dist/providers/sdk/v1/builders/cli/parse-approval.d.ts +65 -0
  148. package/dist/providers/sdk/v1/builders/cli/parse-session.d.ts +91 -0
  149. package/dist/providers/sdk/v1/builders/cli/visible-region.d.ts +42 -0
  150. package/dist/providers/sdk/v1/fixture-tooling/format.d.ts +126 -0
  151. package/dist/providers/sdk/v1/fixture-tooling/index.d.ts +8 -0
  152. package/dist/providers/sdk/v1/fixture-tooling/replay.d.ts +38 -0
  153. package/dist/providers/sdk/v1/index.d.ts +30 -0
  154. package/dist/providers/sdk/v1/sandbox/README-design.d.ts +193 -0
  155. package/dist/providers/sdk/v1/sandbox/require-whitelist.d.ts +74 -0
  156. package/dist/providers/sdk/v1/sandbox/script-runner.d.ts +98 -0
  157. package/dist/providers/sdk/v1/types/cli/index.d.ts +277 -0
  158. package/dist/providers/sdk/v1/types/common/index.d.ts +203 -0
  159. package/dist/providers/sdk/v1/validators/index.d.ts +5 -0
  160. package/dist/providers/sdk/v1/validators/manifest.d.ts +40 -0
  161. package/dist/providers/sdk/v1/validators/taint.d.ts +52 -0
  162. package/dist/providers/spec/adapter.d.ts +98 -0
  163. package/dist/providers/spec/cli-adapter.d.ts +223 -0
  164. package/dist/providers/spec/evaluator.d.ts +45 -0
  165. package/dist/providers/spec/fsm-driver.d.ts +444 -0
  166. package/dist/providers/spec/fsm-evaluator.d.ts +93 -0
  167. package/dist/providers/spec/fsm-loader.d.ts +14 -0
  168. package/dist/providers/spec/fsm-types.d.ts +202 -0
  169. package/dist/providers/spec/native-history-executor.d.ts +41 -0
  170. package/dist/providers/spec/pre-launch-trust.d.ts +16 -0
  171. package/dist/providers/spec/route.d.ts +4 -0
  172. package/dist/providers/spec/types.d.ts +222 -0
  173. package/dist/providers/status-monitor.d.ts +7 -7
  174. package/dist/providers/transcript-v2.d.ts +176 -0
  175. package/dist/providers/types/interactive-prompt.d.ts +84 -0
  176. package/dist/providers/working-dir.d.ts +17 -0
  177. package/dist/repo-mesh-types.d.ts +519 -13
  178. package/dist/runtime-defaults.d.ts +2 -0
  179. package/dist/session-host/managed-host.d.ts +64 -0
  180. package/dist/session-host/runtime-surface.d.ts +10 -16
  181. package/dist/sessions/registry.d.ts +6 -0
  182. package/dist/shared-types-extra.d.ts +2 -4
  183. package/dist/shared-types.d.ts +86 -55
  184. package/dist/status/normalize.d.ts +1 -1
  185. package/dist/status/normalize.js +1 -0
  186. package/dist/status/normalize.js.map +1 -1
  187. package/dist/status/normalize.mjs +1 -0
  188. package/dist/status/normalize.mjs.map +1 -1
  189. package/dist/status/reporter.d.ts +2 -0
  190. package/dist/status/snapshot.d.ts +26 -0
  191. package/dist/system/hash.d.ts +8 -0
  192. package/dist/system/load-better-sqlite3.d.ts +21 -0
  193. package/dist/types.d.ts +5 -0
  194. package/package.json +7 -3
  195. package/src/agent-stream/poller.ts +2 -3
  196. package/src/agent-stream/provider-adapter.ts +1 -1
  197. package/src/boot/daemon-lifecycle.ts +63 -12
  198. package/src/boot/process-hardening.ts +89 -0
  199. package/src/build-info.ts +73 -0
  200. package/src/chat/source-machine.ts +534 -0
  201. package/src/chat/source-resolver.ts +0 -0
  202. package/src/chat/subscription-updates.ts +20 -1
  203. package/src/cli-adapter-types.d.ts +3 -1
  204. package/src/cli-adapter-types.ts +68 -2
  205. package/src/cli-adapters/cli-script-runner.ts +421 -0
  206. package/src/cli-adapters/cli-state-engine.ts +1246 -0
  207. package/src/cli-adapters/provider-cli-adapter.d.ts +1 -1
  208. package/src/cli-adapters/provider-cli-adapter.ts +914 -1144
  209. package/src/cli-adapters/provider-cli-parse.d.ts +2 -0
  210. package/src/cli-adapters/provider-cli-parse.ts +19 -0
  211. package/src/cli-adapters/provider-cli-runtime.ts +56 -7
  212. package/src/cli-adapters/provider-cli-shared.d.ts +4 -0
  213. package/src/cli-adapters/provider-cli-shared.ts +121 -11
  214. package/src/cli-adapters/pty-transport.ts +2 -1
  215. package/src/cli-adapters/pty-write-chunking.ts +106 -0
  216. package/src/cli-adapters/raw-terminal-io.ts +252 -0
  217. package/src/cli-adapters/resolve-executable.ts +204 -0
  218. package/src/cli-adapters/session-host-transport.ts +2 -1
  219. package/src/cli-adapters/terminal-backends/ghostty-vt-backend.ts +63 -29
  220. package/src/cli-adapters/terminal-backends/types.ts +10 -3
  221. package/src/cli-adapters/terminal-screen.ts +16 -81
  222. package/src/commands/WINDOWS-UPGRADE-LOCK-FAILURE.md +198 -0
  223. package/src/commands/chat-commands-debug-bundle.ts +398 -0
  224. package/src/commands/chat-commands-read.ts +2488 -0
  225. package/src/commands/chat-commands-scope.ts +54 -0
  226. package/src/commands/chat-commands-shared.ts +114 -0
  227. package/src/commands/chat-commands-write.ts +891 -0
  228. package/src/commands/chat-commands.ts +19 -1841
  229. package/src/commands/cli-manager.ts +596 -27
  230. package/src/commands/handler.ts +841 -2
  231. package/src/commands/high-family/index.ts +28 -0
  232. package/src/commands/high-family/mesh-coordinator-launch.ts +680 -0
  233. package/src/commands/high-family/mesh-events.ts +89 -0
  234. package/src/commands/high-family/mesh-status.ts +822 -0
  235. package/src/commands/high-family/types.ts +80 -0
  236. package/src/commands/low-family/coordinator-prompt.ts +72 -0
  237. package/src/commands/low-family/daemon-lifecycle.ts +107 -0
  238. package/src/commands/low-family/diagnostics.ts +57 -0
  239. package/src/commands/low-family/index.ts +37 -0
  240. package/src/commands/low-family/mesh-ledger.ts +62 -0
  241. package/src/commands/low-family/mesh-node-logs.ts +87 -0
  242. package/src/commands/low-family/notification.ts +116 -0
  243. package/src/commands/low-family/refine-config.ts +106 -0
  244. package/src/commands/low-family/session-host.ts +274 -0
  245. package/src/commands/low-family/spec-providerdev.ts +217 -0
  246. package/src/commands/low-family/status-meta.ts +112 -0
  247. package/src/commands/low-family/types.ts +39 -0
  248. package/src/commands/med-family/cli-agent.ts +238 -0
  249. package/src/commands/med-family/fast-forward.ts +230 -0
  250. package/src/commands/med-family/ide.ts +163 -0
  251. package/src/commands/med-family/index.ts +37 -0
  252. package/src/commands/med-family/mesh-crud.ts +1253 -0
  253. package/src/commands/med-family/mesh-host-pairing.ts +234 -0
  254. package/src/commands/med-family/mesh-queue.ts +167 -0
  255. package/src/commands/med-family/mesh-restart.ts +92 -0
  256. package/src/commands/med-family/types.ts +153 -0
  257. package/src/commands/mesh-coordinator.ts +334 -124
  258. package/src/commands/router.ts +2893 -3536
  259. package/src/commands/stream-commands.ts +8 -0
  260. package/src/commands/upgrade-helper.ts +310 -45
  261. package/src/config/chat-history.ts +493 -24
  262. package/src/config/config.ts +12 -0
  263. package/src/config/mesh-config.ts +619 -23
  264. package/src/config/mesh-json-config.ts +376 -0
  265. package/src/config/recent-activity.ts +8 -2
  266. package/src/config/repo-settings.ts +111 -0
  267. package/src/daemon/dev-auto-implement.ts +3 -2
  268. package/src/daemon/dev-cli-debug.ts +10 -1
  269. package/src/daemon/dev-server.ts +0 -541
  270. package/src/detection/cli-detector.ts +28 -9
  271. package/src/detection/ide-detector.ts +55 -16
  272. package/src/detection/win32-ide-version.ts +106 -0
  273. package/src/git/change-impact-config.ts +354 -0
  274. package/src/git/git-commands.ts +78 -15
  275. package/src/git/git-diff.ts +81 -11
  276. package/src/git/git-executor.ts +12 -0
  277. package/src/git/git-status.ts +767 -48
  278. package/src/git/git-types.ts +14 -62
  279. package/src/git/git-worktree.ts +261 -4
  280. package/src/git/index.ts +17 -0
  281. package/src/index.ts +198 -12
  282. package/src/installer.d.ts +1 -1
  283. package/src/installer.ts +8 -6
  284. package/src/ipc/local-ipc-server.ts +278 -0
  285. package/src/launch.d.ts +1 -1
  286. package/src/launch.ts +37 -28
  287. package/src/logging/async-batch-writer.ts +55 -0
  288. package/src/logging/command-log.ts +7 -5
  289. package/src/logging/log-redactor.ts +100 -0
  290. package/src/logging/log-tail-reader.ts +341 -0
  291. package/src/logging/logger.ts +14 -7
  292. package/src/mesh/contracts.ts +338 -0
  293. package/src/mesh/coordinator-prompt.ts +416 -34
  294. package/src/mesh/coordinator-registry.ts +121 -0
  295. package/src/mesh/mesh-active-work.ts +645 -0
  296. package/src/mesh/mesh-clone-grace.ts +68 -0
  297. package/src/mesh/mesh-coordinator-config.ts +97 -0
  298. package/src/mesh/mesh-delivery-policy.ts +315 -0
  299. package/src/mesh/mesh-event-classify.ts +51 -0
  300. package/src/mesh/mesh-event-forwarding.ts +1897 -0
  301. package/src/mesh/mesh-event-trace.ts +67 -0
  302. package/src/mesh/mesh-events-coordinator.ts +32 -0
  303. package/src/mesh/mesh-events-pending.ts +656 -0
  304. package/src/mesh/mesh-events-stale.ts +389 -0
  305. package/src/mesh/mesh-events-utils.ts +443 -0
  306. package/src/mesh/mesh-events.ts +33 -1035
  307. package/src/mesh/mesh-fast-forward.ts +843 -0
  308. package/src/mesh/mesh-host-ownership.ts +111 -0
  309. package/src/mesh/mesh-init.ts +350 -0
  310. package/src/mesh/mesh-ledger-reconciliation.ts +12 -7
  311. package/src/mesh/mesh-ledger.ts +841 -102
  312. package/src/mesh/mesh-magi-status.ts +223 -0
  313. package/src/mesh/mesh-missions.ts +449 -0
  314. package/src/mesh/mesh-node-identity.ts +1985 -0
  315. package/src/mesh/mesh-queue-assignment.ts +1924 -0
  316. package/src/mesh/mesh-reconcile-loop.ts +2018 -0
  317. package/src/mesh/mesh-refine-batch.ts +205 -0
  318. package/src/mesh/mesh-refine-gates.ts +1673 -0
  319. package/src/mesh/mesh-refine-status.ts +231 -0
  320. package/src/mesh/mesh-review-inbox.ts +307 -0
  321. package/src/mesh/mesh-routing.ts +291 -0
  322. package/src/mesh/mesh-runtime-store.ts +1853 -0
  323. package/src/mesh/mesh-scheduling-runtime.ts +198 -0
  324. package/src/mesh/mesh-task-inflight.ts +70 -0
  325. package/src/mesh/mesh-task-stats.ts +161 -0
  326. package/src/mesh/mesh-unresolved-forward-outbox.ts +185 -0
  327. package/src/mesh/mesh-warmup-deadline.ts +152 -0
  328. package/src/mesh/mesh-work-queue.ts +1254 -141
  329. package/src/mesh/preview-freshness.ts +118 -0
  330. package/src/mesh/refine-config.ts +423 -0
  331. package/src/mesh/worktree-bootstrap-config.ts +450 -0
  332. package/src/providers/acp-provider-instance.ts +43 -10
  333. package/src/providers/approval-utils.d.ts +5 -0
  334. package/src/providers/approval-utils.ts +57 -5
  335. package/src/providers/chat-message-normalization.ts +92 -4
  336. package/src/providers/cli-provider-instance.ts +2177 -107
  337. package/src/providers/contracts.d.ts +55 -0
  338. package/src/providers/contracts.ts +160 -6
  339. package/src/providers/extension-provider-instance.ts +12 -7
  340. package/src/providers/external-sources.ts +218 -0
  341. package/src/providers/ide-provider-instance.ts +35 -12
  342. package/src/providers/manual-attendance.ts +85 -0
  343. package/src/providers/native-history/antigravity-cli-transcript.ts +1043 -0
  344. package/src/providers/native-history/claude-cli-transcript.ts +396 -0
  345. package/src/providers/native-history/codex-cli-transcript.ts +479 -0
  346. package/src/providers/native-history/constants.ts +19 -0
  347. package/src/providers/native-history/dispatcher.ts +373 -0
  348. package/src/providers/native-history/hermes-cli-transcript.ts +260 -0
  349. package/src/providers/native-history/index.ts +30 -0
  350. package/src/providers/provider-instance-manager.ts +71 -0
  351. package/src/providers/provider-instance.ts +19 -1
  352. package/src/providers/provider-loader.ts +668 -50
  353. package/src/providers/provider-schema.ts +87 -14
  354. package/src/providers/provider-trust.ts +114 -0
  355. package/src/providers/read-chat-contract.ts +76 -16
  356. package/src/providers/sdk/README.md +49 -0
  357. package/src/providers/sdk/v1/builders/acp/detect-status.ts +144 -0
  358. package/src/providers/sdk/v1/builders/cli/detect-status.ts +313 -0
  359. package/src/providers/sdk/v1/builders/cli/parse-approval-squash.ts +158 -0
  360. package/src/providers/sdk/v1/builders/cli/parse-approval.ts +250 -0
  361. package/src/providers/sdk/v1/builders/cli/parse-session.ts +276 -0
  362. package/src/providers/sdk/v1/builders/cli/visible-region.ts +143 -0
  363. package/src/providers/sdk/v1/fixture-tooling/format.ts +130 -0
  364. package/src/providers/sdk/v1/fixture-tooling/index.ts +22 -0
  365. package/src/providers/sdk/v1/fixture-tooling/replay.ts +352 -0
  366. package/src/providers/sdk/v1/index.ts +152 -0
  367. package/src/providers/sdk/v1/sandbox/README-design.ts +195 -0
  368. package/src/providers/sdk/v1/sandbox/require-whitelist.ts +472 -0
  369. package/src/providers/sdk/v1/sandbox/script-runner.ts +150 -0
  370. package/src/providers/sdk/v1/schemas/cli/provider.schema.json +509 -0
  371. package/src/providers/sdk/v1/schemas/primitives/acp-session-protocol-v1.json +131 -0
  372. package/src/providers/sdk/v1/schemas/primitives/native-history-codex-rollout-v1.json +66 -0
  373. package/src/providers/sdk/v1/schemas/primitives/tui-approval-squash-v1.json +91 -0
  374. package/src/providers/sdk/v1/schemas/primitives/tui-assistant-block-v1.json +91 -0
  375. package/src/providers/sdk/v1/schemas/primitives/tui-cue-ordering-v1.json +47 -0
  376. package/src/providers/sdk/v1/schemas/primitives/tui-dispatch-order-v1.json +32 -0
  377. package/src/providers/sdk/v1/schemas/primitives/tui-footer-chrome-v1.json +42 -0
  378. package/src/providers/sdk/v1/schemas/primitives/tui-index-finder-v1.json +27 -0
  379. package/src/providers/sdk/v1/schemas/primitives/tui-modal-v1.json +125 -0
  380. package/src/providers/sdk/v1/schemas/primitives/tui-prompt-marker-v1.json +45 -0
  381. package/src/providers/sdk/v1/schemas/primitives/tui-session-id-extraction-v1.json +46 -0
  382. package/src/providers/sdk/v1/schemas/primitives/tui-settled-prompt-v1.json +71 -0
  383. package/src/providers/sdk/v1/schemas/primitives/tui-spinner-v1.json +83 -0
  384. package/src/providers/sdk/v1/schemas/primitives/tui-transcript-pty-v1.json +83 -0
  385. package/src/providers/sdk/v1/schemas/primitives/tui-visible-region-v1.json +57 -0
  386. package/src/providers/sdk/v1/schemas/primitives/tui-welcome-screen-v1.json +35 -0
  387. package/src/providers/sdk/v1/types/cli/index.ts +365 -0
  388. package/src/providers/sdk/v1/types/common/index.ts +229 -0
  389. package/src/providers/sdk/v1/validators/index.ts +19 -0
  390. package/src/providers/sdk/v1/validators/manifest.ts +110 -0
  391. package/src/providers/sdk/v1/validators/taint.ts +309 -0
  392. package/src/providers/spec/adapter.ts +246 -0
  393. package/src/providers/spec/cli-adapter.ts +1064 -0
  394. package/src/providers/spec/evaluator.ts +407 -0
  395. package/src/providers/spec/fsm-driver.ts +1481 -0
  396. package/src/providers/spec/fsm-evaluator.ts +290 -0
  397. package/src/providers/spec/fsm-loader.ts +128 -0
  398. package/src/providers/spec/fsm-types.ts +301 -0
  399. package/src/providers/spec/native-history-executor.ts +1174 -0
  400. package/src/providers/spec/pre-launch-trust.ts +104 -0
  401. package/src/providers/spec/route.ts +51 -0
  402. package/src/providers/spec/types.ts +262 -0
  403. package/src/providers/status-monitor.d.ts +7 -7
  404. package/src/providers/status-monitor.ts +37 -22
  405. package/src/providers/transcript-v2.ts +567 -0
  406. package/src/providers/types/interactive-prompt.ts +536 -0
  407. package/src/providers/version-archive.ts +64 -24
  408. package/src/providers/working-dir.ts +23 -0
  409. package/src/repo-mesh-types.ts +758 -14
  410. package/src/runtime-defaults.ts +39 -0
  411. package/src/session-host/managed-host.ts +218 -0
  412. package/src/session-host/runtime-surface.ts +20 -80
  413. package/src/sessions/registry.ts +6 -0
  414. package/src/shared-types-extra.ts +2 -4
  415. package/src/shared-types.d.ts +8 -0
  416. package/src/shared-types.ts +124 -55
  417. package/src/status/builders.ts +26 -6
  418. package/src/status/normalize.ts +2 -0
  419. package/src/status/reporter.ts +19 -1
  420. package/src/status/snapshot.ts +95 -26
  421. package/src/system/hash.ts +23 -0
  422. package/src/system/host-memory.ts +29 -12
  423. package/src/system/load-better-sqlite3.ts +68 -0
  424. package/src/types.ts +5 -0
  425. package/dist/cli-adapters/terminal-backends/xterm-backend.d.ts +0 -17
  426. package/dist/mesh/mesh-sync.d.ts +0 -53
  427. package/src/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +0 -16
  428. package/src/cli-adapters/terminal-backends/xterm-backend.ts +0 -97
  429. package/src/mesh/mesh-sync.ts +0 -111
@@ -0,0 +1,68 @@
1
+ import { normalizeMeshNodeId, type MeshNodeIdentified } from '@adhdev/mesh-shared';
2
+
3
+ // ---------------------------------------------------------------------------
4
+ // Recently-cloned worktree node grace window
5
+ // ---------------------------------------------------------------------------
6
+ // FALSE-BLOCKER-CLONE-QUEUE: right after mesh_clone_node registers a worktree node, a
7
+ // queue task pinned to that node id (target_node pin) can transiently find NO matching
8
+ // node in the coordinator-owning daemon's mesh view, because:
9
+ // - the clone wrote the node ONLY into the inline mesh cache (med-family clone branch),
10
+ // and that inline entry has not yet PROPAGATED to the coordinator daemon (the clone
11
+ // may have run on the source node's machine and forwarded), and/or
12
+ // - the node's worktree bootstrap (npm install / native-addon repair) is still running,
13
+ // so the claim gate defers anyway.
14
+ // In BOTH cases the unmatch SELF-RESOLVES within ~seconds (observed bootstrap ~2m8s) — it
15
+ // is NOT the permanent `target_node_id_unmatched` routing miss (a removed/dead node) that
16
+ // the actionable-blocker coordinator notification exists for. This registry lets the skip
17
+ // classifier tell the transient case apart from the permanent one: a node id recorded here
18
+ // (within the grace TTL) is a freshly cloned worktree whose unmatch should be reported as a
19
+ // transient, NON-actionable skip rather than paging the coordinator with a false
20
+ // "will NOT clear on its own" blocker.
21
+ //
22
+ // The window is floored well above the observed clone + bootstrap + inline-cache
23
+ // propagation latency so a slow-but-live clone is never misclassified as a permanent
24
+ // unmatch. A genuinely dead/removed node is never recorded here (or its entry has long
25
+ // expired), so its `target_node_id_unmatched` stays correctly actionable.
26
+ export const CLONE_BOOTSTRAP_GRACE_MS = 10 * 60 * 1000;
27
+
28
+ const recentlyClonedNodeExpiry = new Map<string, number>(); // normalized nodeId -> expiry epoch ms
29
+ const MAX_TRACKED_CLONED_NODES = 512;
30
+
31
+ function normalizeNodeIdKey(nodeId: string | undefined | null): string {
32
+ return normalizeMeshNodeId({ id: nodeId ?? undefined } as MeshNodeIdentified) ?? '';
33
+ }
34
+
35
+ /** Record that a worktree node id was just cloned, opening its transient grace window. */
36
+ export function noteRecentlyClonedNode(nodeId: string | undefined | null, nowMs: number = Date.now()): void {
37
+ const key = normalizeNodeIdKey(nodeId);
38
+ if (!key) return;
39
+ recentlyClonedNodeExpiry.set(key, nowMs + CLONE_BOOTSTRAP_GRACE_MS);
40
+ if (recentlyClonedNodeExpiry.size > MAX_TRACKED_CLONED_NODES) {
41
+ // Map iteration is insertion-ordered; the first key is the oldest-inserted entry.
42
+ const oldest = recentlyClonedNodeExpiry.keys().next().value;
43
+ if (oldest !== undefined) recentlyClonedNodeExpiry.delete(oldest);
44
+ }
45
+ }
46
+
47
+ /** True when nodeId was cloned within the grace window (and the entry has not expired). */
48
+ export function isWithinCloneBootstrapGrace(nodeId: string | undefined | null, nowMs: number = Date.now()): boolean {
49
+ const key = normalizeNodeIdKey(nodeId);
50
+ if (!key) return false;
51
+ const expiry = recentlyClonedNodeExpiry.get(key);
52
+ if (expiry === undefined) return false;
53
+ if (nowMs >= expiry) {
54
+ recentlyClonedNodeExpiry.delete(key);
55
+ return false;
56
+ }
57
+ return true;
58
+ }
59
+
60
+ /** Drop a node's grace entry (e.g. once it has fully resolved into the mesh view). */
61
+ export function clearCloneBootstrapGrace(nodeId: string | undefined | null): void {
62
+ const key = normalizeNodeIdKey(nodeId);
63
+ if (key) recentlyClonedNodeExpiry.delete(key);
64
+ }
65
+
66
+ export function __resetCloneBootstrapGraceForTests(): void {
67
+ recentlyClonedNodeExpiry.clear();
68
+ }
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Hermes / MCP coordinator config helpers
3
+ *
4
+ * Extracted from commands/router.ts (behavior-preserving move). Contains the
5
+ * MCP-server config parse/serialize helpers and the Hermes coordinator base
6
+ * config loading / temp-override stripping / credential-copy helpers.
7
+ *
8
+ * router.ts re-exports every public symbol from here so existing import paths
9
+ * keep working.
10
+ */
11
+
12
+ import { LOG } from '../logging/logger.js';
13
+ import * as yaml from 'js-yaml';
14
+ import { homedir } from 'os';
15
+ import { join as pathJoin, resolve as pathResolve } from 'path';
16
+ import * as fs from 'fs';
17
+ import type { MeshCoordinatorConfigFormat } from './mesh-refine-gates.js';
18
+
19
+ function loadYamlModule(): { load: (input: string) => any; dump: (input: any, options?: Record<string, any>) => string } {
20
+ return yaml as { load: (input: string) => any; dump: (input: any, options?: Record<string, any>) => string };
21
+ }
22
+
23
+ export function getMcpServersKey(format: MeshCoordinatorConfigFormat): 'mcpServers' | 'mcp_servers' {
24
+ return format === 'hermes_config_yaml' ? 'mcp_servers' : 'mcpServers';
25
+ }
26
+
27
+ export function parseMeshCoordinatorMcpConfig(text: string, format: MeshCoordinatorConfigFormat): Record<string, any> {
28
+ if (!text.trim()) return {};
29
+ if (format === 'claude_mcp_json') return JSON.parse(text);
30
+ const parsed = loadYamlModule().load(text);
31
+ return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : {};
32
+ }
33
+
34
+ export function serializeMeshCoordinatorMcpConfig(config: Record<string, any>, format: MeshCoordinatorConfigFormat): string {
35
+ if (format === 'claude_mcp_json') return JSON.stringify(config, null, 2);
36
+ return loadYamlModule().dump(config, { noRefs: true, lineWidth: 120 });
37
+ }
38
+
39
+ function resolveHermesUserHome(): string {
40
+ const explicitHome = process.env.HERMES_HOME?.trim();
41
+ return explicitHome || pathJoin(homedir(), '.hermes');
42
+ }
43
+
44
+ export function loadHermesCoordinatorBaseConfig(targetConfigPath: string): { config: Record<string, any>; sourceHome: string; sourceConfigPath: string } {
45
+ const sourceHome = resolveHermesUserHome();
46
+ const sourceConfigPath = pathJoin(sourceHome, 'config.yaml');
47
+ if (!fs.existsSync(sourceConfigPath)) return { config: {}, sourceHome, sourceConfigPath };
48
+ if (pathResolve(sourceConfigPath) === pathResolve(targetConfigPath)) return { config: {}, sourceHome, sourceConfigPath };
49
+
50
+ const parsed = parseMeshCoordinatorMcpConfig(fs.readFileSync(sourceConfigPath, 'utf-8'), 'hermes_config_yaml');
51
+ const { mcp_servers: _mcpServers, ...baseConfig } = parsed;
52
+ return { config: baseConfig, sourceHome, sourceConfigPath };
53
+ }
54
+
55
+ export function stripHermesCoordinatorTempModelProviderOverrides(config: Record<string, any>): Record<string, any> {
56
+ const {
57
+ model: _model,
58
+ provider: _provider,
59
+ default_model: _defaultModel,
60
+ defaultProvider: _defaultProvider,
61
+ default_provider: _defaultProviderSnake,
62
+ modelProvider: _modelProvider,
63
+ model_provider: _modelProviderSnake,
64
+ ...sanitized
65
+ } = config;
66
+ const delegation = sanitized.delegation;
67
+ if (delegation && typeof delegation === 'object' && !Array.isArray(delegation)) {
68
+ const {
69
+ model: _delegationModel,
70
+ provider: _delegationProvider,
71
+ modelProvider: _delegationModelProvider,
72
+ model_provider: _delegationModelProviderSnake,
73
+ ...delegationRest
74
+ } = delegation;
75
+ if (Object.keys(delegationRest).length > 0) {
76
+ sanitized.delegation = delegationRest;
77
+ } else {
78
+ delete sanitized.delegation;
79
+ }
80
+ }
81
+ return sanitized;
82
+ }
83
+
84
+ export function copyHermesCoordinatorCredentialFiles(sourceHome: string, targetHome: string) {
85
+ if (pathResolve(sourceHome) === pathResolve(targetHome)) return;
86
+ for (const fileName of ['.env', 'auth.json']) {
87
+ const sourcePath = pathJoin(sourceHome, fileName);
88
+ const targetPath = pathJoin(targetHome, fileName);
89
+ if (!fs.existsSync(sourcePath)) continue;
90
+ try {
91
+ fs.copyFileSync(sourcePath, targetPath);
92
+ } catch (error: any) {
93
+ LOG.warn('MeshCoordinator', `Could not copy Hermes ${fileName} into isolated coordinator home: ${error?.message || error}`);
94
+ }
95
+ }
96
+ }
97
+
@@ -0,0 +1,315 @@
1
+ import { randomUUID } from 'crypto';
2
+ import { MeshRuntimeStore } from './mesh-runtime-store.js';
3
+
4
+ /**
5
+ * Possible delivery statuses for a session delivery record.
6
+ */
7
+ export type MeshSessionDeliveryStatus =
8
+ | 'queued'
9
+ | 'delivering'
10
+ | 'delivered'
11
+ | 'acked'
12
+ | 'completed'
13
+ | 'failed'
14
+ | 'expired'
15
+ | 'cancelled';
16
+
17
+ /**
18
+ * Kind of delivery — controls priority and policy handling.
19
+ */
20
+ export type MeshSessionDeliveryKind =
21
+ | 'task'
22
+ | 'followup'
23
+ | 'approval'
24
+ | 'recovery'
25
+ | 'system_notice';
26
+
27
+ /**
28
+ * A session delivery decision — what to do when a task arrives for a session.
29
+ */
30
+ export type MeshDeliveryDecision =
31
+ | 'immediate' // Session is idle: deliver now, create an 'acked' delivery record
32
+ | 'queued' // Session is busy: hold delivery until session becomes idle
33
+ | 'rejected'; // Session is terminal or unknown: cannot deliver
34
+
35
+ export interface MeshDeliveryPolicyResult {
36
+ decision: MeshDeliveryDecision;
37
+ reason: string;
38
+ /** When decision='queued', estimated deliver-after ISO timestamp if known. */
39
+ deliverAfter?: string;
40
+ /** Human-readable explanation for coordinator/operator. */
41
+ message: string;
42
+ }
43
+
44
+ /**
45
+ * Session statuses where immediate delivery is allowed.
46
+ * The session is ready to accept new work.
47
+ */
48
+ const IMMEDIATE_DELIVERY_STATUSES = new Set([
49
+ 'idle',
50
+ 'waiting_input',
51
+ 'ready',
52
+ ]);
53
+
54
+ /**
55
+ * Session statuses that indicate the session is busy but still alive.
56
+ * Delivery is queued rather than attempted immediately.
57
+ */
58
+ const BUSY_DELIVERY_STATUSES = new Set([
59
+ 'generating',
60
+ 'running',
61
+ 'streaming',
62
+ 'busy',
63
+ 'starting',
64
+ 'initializing',
65
+ 'waiting_approval',
66
+ ]);
67
+
68
+ /**
69
+ * Session statuses that indicate the session is permanently unavailable.
70
+ * Delivery should be rejected.
71
+ */
72
+ const TERMINAL_DELIVERY_STATUSES = new Set([
73
+ 'stopped',
74
+ 'failed',
75
+ 'terminated',
76
+ 'exited',
77
+ 'closed',
78
+ 'deleted',
79
+ 'error',
80
+ ]);
81
+
82
+ /**
83
+ * Determine whether to deliver immediately, queue, or reject based on session status.
84
+ *
85
+ * This is a pure function — it does not write to any store.
86
+ */
87
+ export function resolveDeliveryDecision(
88
+ sessionStatus: string | undefined,
89
+ opts?: {
90
+ kind?: MeshSessionDeliveryKind;
91
+ /** When true, busy session immediate injection is allowed (provider-specific capability). */
92
+ allowBusyInjection?: boolean;
93
+ },
94
+ ): MeshDeliveryPolicyResult {
95
+ const status = (sessionStatus || '').trim().toLowerCase();
96
+
97
+ if (!status) {
98
+ return {
99
+ decision: 'rejected',
100
+ reason: 'unknown_session_status',
101
+ message: 'Session status is unknown. Delivery rejected (fail-closed). Use mesh_launch_session to start a fresh session.',
102
+ };
103
+ }
104
+
105
+ if (IMMEDIATE_DELIVERY_STATUSES.has(status)) {
106
+ return {
107
+ decision: 'immediate',
108
+ reason: `session_${status}`,
109
+ message: `Session is ${status} — delivery allowed immediately.`,
110
+ };
111
+ }
112
+
113
+ if (BUSY_DELIVERY_STATUSES.has(status)) {
114
+ if (opts?.allowBusyInjection) {
115
+ return {
116
+ decision: 'immediate',
117
+ reason: `session_${status}_busy_injection_allowed`,
118
+ message: `Session is ${status} but provider supports busy injection. Delivered immediately.`,
119
+ };
120
+ }
121
+ // approval-kind may be delivered to waiting_approval sessions
122
+ if (status === 'waiting_approval' && opts?.kind === 'approval') {
123
+ return {
124
+ decision: 'immediate',
125
+ reason: 'session_waiting_approval_approval_message',
126
+ message: 'Session is waiting for approval — approval message delivered immediately.',
127
+ };
128
+ }
129
+ return {
130
+ decision: 'queued',
131
+ reason: `session_${status}_busy`,
132
+ message: `Session is ${status}. Task queued for delivery when session becomes idle. Do not inject directly into a busy session.`,
133
+ };
134
+ }
135
+
136
+ if (TERMINAL_DELIVERY_STATUSES.has(status)) {
137
+ return {
138
+ decision: 'rejected',
139
+ reason: `session_${status}_terminal`,
140
+ message: `Session is ${status} (terminal). Delivery rejected. Launch a new session before dispatching tasks.`,
141
+ };
142
+ }
143
+
144
+ // Unknown/unrecognized status: fail-closed
145
+ return {
146
+ decision: 'rejected',
147
+ reason: 'unrecognized_session_status',
148
+ message: `Session status '${sessionStatus}' is not recognized. Delivery rejected (fail-closed). Inspect session state before retrying.`,
149
+ };
150
+ }
151
+
152
+ export interface SessionDeliveryRecord {
153
+ id: string;
154
+ meshId: string;
155
+ nodeId?: string;
156
+ sessionId?: string;
157
+ providerType?: string;
158
+ taskId?: string;
159
+ kind: MeshSessionDeliveryKind;
160
+ priority: number;
161
+ message: string;
162
+ status: MeshSessionDeliveryStatus;
163
+ deliverAfter?: string;
164
+ expiresAt?: string;
165
+ attemptCount: number;
166
+ sourceCoordinatorSessionId?: string;
167
+ sourceCoordinatorDaemonId?: string;
168
+ lastError?: string;
169
+ createdAt: string;
170
+ updatedAt: string;
171
+ }
172
+
173
+ /**
174
+ * Create a delivery record in the store.
175
+ */
176
+ export function createSessionDelivery(opts: {
177
+ meshId: string;
178
+ nodeId?: string;
179
+ sessionId?: string;
180
+ providerType?: string;
181
+ taskId?: string;
182
+ kind: MeshSessionDeliveryKind;
183
+ message: string;
184
+ status: MeshSessionDeliveryStatus;
185
+ priority?: number;
186
+ deliverAfter?: string;
187
+ expiresAt?: string;
188
+ sourceCoordinatorSessionId?: string;
189
+ sourceCoordinatorDaemonId?: string;
190
+ }): SessionDeliveryRecord {
191
+ const now = new Date().toISOString();
192
+ const id = randomUUID();
193
+ const record: SessionDeliveryRecord = {
194
+ id,
195
+ meshId: opts.meshId,
196
+ nodeId: opts.nodeId,
197
+ sessionId: opts.sessionId,
198
+ providerType: opts.providerType,
199
+ taskId: opts.taskId,
200
+ kind: opts.kind,
201
+ priority: opts.priority ?? 0,
202
+ message: opts.message,
203
+ status: opts.status,
204
+ deliverAfter: opts.deliverAfter,
205
+ expiresAt: opts.expiresAt,
206
+ attemptCount: 0,
207
+ sourceCoordinatorSessionId: opts.sourceCoordinatorSessionId,
208
+ sourceCoordinatorDaemonId: opts.sourceCoordinatorDaemonId,
209
+ createdAt: now,
210
+ updatedAt: now,
211
+ };
212
+ MeshRuntimeStore.getInstance().insertSessionDelivery({
213
+ id,
214
+ meshId: opts.meshId,
215
+ nodeId: opts.nodeId,
216
+ sessionId: opts.sessionId,
217
+ providerType: opts.providerType,
218
+ taskId: opts.taskId,
219
+ kind: opts.kind,
220
+ priority: opts.priority ?? 0,
221
+ message: opts.message,
222
+ status: opts.status,
223
+ deliverAfter: opts.deliverAfter,
224
+ expiresAt: opts.expiresAt,
225
+ sourceCoordinatorSessionId: opts.sourceCoordinatorSessionId,
226
+ sourceCoordinatorDaemonId: opts.sourceCoordinatorDaemonId,
227
+ createdAt: now,
228
+ updatedAt: now,
229
+ });
230
+ return record;
231
+ }
232
+
233
+ /**
234
+ * Update the status of a delivery record.
235
+ */
236
+ export function updateSessionDeliveryStatus(
237
+ id: string,
238
+ status: MeshSessionDeliveryStatus,
239
+ opts?: { lastError?: string; incrementAttempt?: boolean },
240
+ ): void {
241
+ try {
242
+ MeshRuntimeStore.getInstance().updateSessionDeliveryStatus(id, status, opts);
243
+ } catch { /* best-effort */ }
244
+ }
245
+
246
+ /**
247
+ * Get active (non-terminal) deliveries for a mesh, optionally filtered by session.
248
+ */
249
+ export function getActiveSessionDeliveries(meshId: string, sessionId?: string) {
250
+ try {
251
+ return MeshRuntimeStore.getInstance().getActiveSessionDeliveries(meshId, sessionId);
252
+ } catch {
253
+ return [];
254
+ }
255
+ }
256
+
257
+ /**
258
+ * Record a completion conflict diagnostic when a duplicate event points to
259
+ * different task/session than the already-seen event with the same fingerprint.
260
+ */
261
+ export function recordCompletionConflict(opts: {
262
+ meshId: string;
263
+ fingerprint: string;
264
+ conflictingTaskId?: string;
265
+ conflictingSessionId?: string;
266
+ originalTaskId?: string;
267
+ originalSessionId?: string;
268
+ event: string;
269
+ }): void {
270
+ try {
271
+ MeshRuntimeStore.getInstance().recordCompletionConflict({
272
+ id: randomUUID(),
273
+ meshId: opts.meshId,
274
+ fingerprint: opts.fingerprint,
275
+ conflictingTaskId: opts.conflictingTaskId,
276
+ conflictingSessionId: opts.conflictingSessionId,
277
+ originalTaskId: opts.originalTaskId,
278
+ originalSessionId: opts.originalSessionId,
279
+ event: opts.event,
280
+ createdAt: new Date().toISOString(),
281
+ });
282
+ } catch { /* best-effort diagnostics */ }
283
+ }
284
+
285
+ /**
286
+ * Get recent completion conflicts for diagnostic inspection.
287
+ */
288
+ export function getRecentCompletionConflicts(meshId: string, limitMs?: number) {
289
+ try {
290
+ return MeshRuntimeStore.getInstance().getRecentCompletionConflicts(meshId, limitMs);
291
+ } catch {
292
+ return [];
293
+ }
294
+ }
295
+
296
+ export function __clearSessionDeliveriesForTests(meshId: string): void {
297
+ MeshRuntimeStore.getInstance().deleteSessionDeliveries(meshId);
298
+ }
299
+
300
+ /**
301
+ * Mark all active (queued/delivering/delivered/acked) deliveries for a session as completed or failed.
302
+ * Called when a task's terminal status is confirmed so delivery records stay in sync.
303
+ */
304
+ export function markSessionDeliveriesTerminal(
305
+ meshId: string,
306
+ sessionId: string,
307
+ terminalStatus: 'completed' | 'failed',
308
+ ): void {
309
+ try {
310
+ const active = MeshRuntimeStore.getInstance().getActiveSessionDeliveries(meshId, sessionId);
311
+ for (const delivery of active) {
312
+ MeshRuntimeStore.getInstance().updateSessionDeliveryStatus(delivery.id, terminalStatus);
313
+ }
314
+ } catch { /* best-effort */ }
315
+ }
@@ -0,0 +1,51 @@
1
+ import type { MeshLedgerKind } from './mesh-ledger.js';
2
+
3
+ // ---------------------------------------------------------------------------
4
+ // Core event injection
5
+ // ---------------------------------------------------------------------------
6
+
7
+ const MESH_COORDINATOR_EVENTS = new Set([
8
+ 'agent:generating_started',
9
+ 'agent:generating_completed',
10
+ 'agent:waiting_approval',
11
+ 'agent:stopped',
12
+ 'agent:ready',
13
+ 'monitor:no_progress',
14
+ 'refine:accepted',
15
+ 'refine:completed',
16
+ 'refine:failed',
17
+ 'worktree_bootstrap_complete',
18
+ 'worktree_bootstrap_failed',
19
+ ]);
20
+
21
+ export const EVENT_TO_LEDGER_KIND: Record<string, MeshLedgerKind> = {
22
+ 'agent:generating_completed': 'task_completed',
23
+ 'agent:waiting_approval': 'task_approval_needed',
24
+ 'agent:stopped': 'task_failed',
25
+ 'monitor:no_progress': 'task_stalled',
26
+ };
27
+
28
+ export function isMeshCoordinatorEvent(eventName: unknown): eventName is string {
29
+ return typeof eventName === 'string' && MESH_COORDINATOR_EVENTS.has(eventName);
30
+ }
31
+
32
+ // Terminal events that the coordinator is actively blocked waiting on. When the
33
+ // coordinator CLI session dispatches a task (e.g. mesh_send_task) it stays in
34
+ // `generating` until the result arrives — but a generating coordinator queues
35
+ // incoming send_message calls into its adapter's pendingOutboundQueue, which is
36
+ // only flushed on the coordinator's OWN idle transition. That transition can't
37
+ // happen until it receives this very event → deadlock. We force-inject these so
38
+ // they bypass the busy send-guard and land in the PTY while generating.
39
+ export const MESH_FORCE_INJECT_EVENTS: ReadonlySet<string> = new Set([
40
+ 'agent:generating_completed',
41
+ 'agent:stopped',
42
+ 'agent:waiting_approval',
43
+ 'refine:completed',
44
+ 'refine:failed',
45
+ 'worktree_bootstrap_complete',
46
+ 'worktree_bootstrap_failed',
47
+ ]);
48
+
49
+ export function shouldForceInjectMeshEvent(eventName: unknown): boolean {
50
+ return typeof eventName === 'string' && MESH_FORCE_INJECT_EVENTS.has(eventName);
51
+ }