@adhdev/daemon-core 0.9.82-rc.4 → 0.9.82-rc.400

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 (418) hide show
  1. package/dist/boot/daemon-lifecycle.d.ts +11 -0
  2. package/dist/boot/process-hardening.d.ts +50 -0
  3. package/dist/build-info.d.ts +37 -0
  4. package/dist/chat/source-machine.d.ts +166 -0
  5. package/dist/chat/source-resolver.d.ts +104 -0
  6. package/dist/chat/subscription-updates.d.ts +1 -0
  7. package/dist/cli-adapter-types.d.ts +67 -2
  8. package/dist/cli-adapters/cli-script-runner.d.ts +117 -0
  9. package/dist/cli-adapters/cli-state-engine.d.ts +198 -0
  10. package/dist/cli-adapters/provider-cli-adapter.d.ts +123 -64
  11. package/dist/cli-adapters/provider-cli-parse.d.ts +4 -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 +14 -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 +15 -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 +60 -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 +2 -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 +116 -0
  54. package/dist/commands/mesh-coordinator.d.ts +85 -1
  55. package/dist/commands/router.d.ts +267 -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 +77 -1
  60. package/dist/config/mesh-json-config.d.ts +299 -0
  61. package/dist/daemon/dev-server.d.ts +0 -2
  62. package/dist/detection/ide-detector.d.ts +13 -0
  63. package/dist/detection/win32-ide-version.d.ts +37 -0
  64. package/dist/git/change-impact-config.d.ts +159 -0
  65. package/dist/git/git-commands.d.ts +12 -1
  66. package/dist/git/git-diff.d.ts +6 -0
  67. package/dist/git/git-executor.d.ts +11 -0
  68. package/dist/git/git-status.d.ts +28 -0
  69. package/dist/git/git-types.d.ts +5 -43
  70. package/dist/git/git-worktree.d.ts +22 -0
  71. package/dist/git/index.d.ts +2 -0
  72. package/dist/index.d.ts +57 -13
  73. package/dist/index.js +48373 -18578
  74. package/dist/index.js.map +1 -1
  75. package/dist/index.mjs +47576 -17923
  76. package/dist/index.mjs.map +1 -1
  77. package/dist/installer.d.ts +1 -4
  78. package/dist/ipc/local-ipc-server.d.ts +91 -0
  79. package/dist/launch.d.ts +1 -1
  80. package/dist/logging/async-batch-writer.d.ts +10 -0
  81. package/dist/logging/log-redactor.d.ts +24 -0
  82. package/dist/logging/log-tail-reader.d.ts +81 -0
  83. package/dist/logging/logger.d.ts +1 -1
  84. package/dist/mesh/contracts.d.ts +164 -0
  85. package/dist/mesh/coordinator-prompt.d.ts +89 -0
  86. package/dist/mesh/coordinator-registry.d.ts +59 -0
  87. package/dist/mesh/mesh-active-work.d.ts +174 -0
  88. package/dist/mesh/mesh-coordinator-config.d.ts +21 -0
  89. package/dist/mesh/mesh-delivery-policy.d.ts +131 -0
  90. package/dist/mesh/mesh-event-classify.d.ts +5 -0
  91. package/dist/mesh/mesh-event-forwarding.d.ts +19 -0
  92. package/dist/mesh/mesh-event-trace.d.ts +21 -0
  93. package/dist/mesh/mesh-events-coordinator.d.ts +4 -0
  94. package/dist/mesh/mesh-events-pending.d.ts +55 -0
  95. package/dist/mesh/mesh-events-stale.d.ts +61 -0
  96. package/dist/mesh/mesh-events-utils.d.ts +75 -0
  97. package/dist/mesh/mesh-events.d.ts +6 -37
  98. package/dist/mesh/mesh-fast-forward.d.ts +81 -0
  99. package/dist/mesh/mesh-host-ownership.d.ts +9 -0
  100. package/dist/mesh/mesh-init.d.ts +86 -0
  101. package/dist/mesh/mesh-ledger-reconciliation.d.ts +23 -4
  102. package/dist/mesh/mesh-ledger.d.ts +77 -1
  103. package/dist/mesh/mesh-missions.d.ts +164 -0
  104. package/dist/mesh/mesh-node-identity.d.ts +289 -0
  105. package/dist/mesh/mesh-queue-assignment.d.ts +95 -0
  106. package/dist/mesh/mesh-reconcile-loop.d.ts +65 -0
  107. package/dist/mesh/mesh-refine-batch.d.ts +68 -0
  108. package/dist/mesh/mesh-refine-gates.d.ts +428 -0
  109. package/dist/mesh/mesh-refine-status.d.ts +62 -0
  110. package/dist/mesh/mesh-review-inbox.d.ts +90 -0
  111. package/dist/mesh/mesh-routing.d.ts +70 -0
  112. package/dist/mesh/mesh-runtime-store.d.ts +447 -0
  113. package/dist/mesh/mesh-scheduling-runtime.d.ts +78 -0
  114. package/dist/mesh/mesh-task-stats.d.ts +49 -0
  115. package/dist/mesh/mesh-unresolved-forward-outbox.d.ts +30 -0
  116. package/dist/mesh/mesh-warmup-deadline.d.ts +68 -0
  117. package/dist/mesh/mesh-work-queue.d.ts +250 -6
  118. package/dist/mesh/preview-freshness.d.ts +18 -0
  119. package/dist/mesh/refine-config.d.ts +216 -0
  120. package/dist/mesh/worktree-bootstrap-config.d.ts +145 -0
  121. package/dist/providers/acp-provider-instance.d.ts +5 -0
  122. package/dist/providers/approval-utils.d.ts +20 -0
  123. package/dist/providers/chat-message-normalization.d.ts +13 -0
  124. package/dist/providers/cli-provider-instance.d.ts +157 -3
  125. package/dist/providers/contracts.d.ts +139 -6
  126. package/dist/providers/external-sources.d.ts +71 -0
  127. package/dist/providers/manual-attendance.d.ts +63 -0
  128. package/dist/providers/native-history/antigravity-cli-transcript.d.ts +100 -0
  129. package/dist/providers/native-history/claude-cli-transcript.d.ts +70 -0
  130. package/dist/providers/native-history/codex-cli-transcript.d.ts +73 -0
  131. package/dist/providers/native-history/constants.d.ts +12 -0
  132. package/dist/providers/native-history/dispatcher.d.ts +27 -0
  133. package/dist/providers/native-history/hermes-cli-transcript.d.ts +30 -0
  134. package/dist/providers/native-history/index.d.ts +13 -0
  135. package/dist/providers/provider-instance-manager.d.ts +14 -0
  136. package/dist/providers/provider-instance.d.ts +23 -1
  137. package/dist/providers/provider-loader.d.ts +26 -4
  138. package/dist/providers/provider-trust.d.ts +31 -0
  139. package/dist/providers/read-chat-contract.d.ts +29 -0
  140. package/dist/providers/sdk/v1/builders/acp/detect-status.d.ts +68 -0
  141. package/dist/providers/sdk/v1/builders/cli/detect-status.d.ts +86 -0
  142. package/dist/providers/sdk/v1/builders/cli/parse-approval-squash.d.ts +59 -0
  143. package/dist/providers/sdk/v1/builders/cli/parse-approval.d.ts +65 -0
  144. package/dist/providers/sdk/v1/builders/cli/parse-session.d.ts +91 -0
  145. package/dist/providers/sdk/v1/builders/cli/visible-region.d.ts +42 -0
  146. package/dist/providers/sdk/v1/fixture-tooling/format.d.ts +126 -0
  147. package/dist/providers/sdk/v1/fixture-tooling/index.d.ts +8 -0
  148. package/dist/providers/sdk/v1/fixture-tooling/replay.d.ts +38 -0
  149. package/dist/providers/sdk/v1/index.d.ts +30 -0
  150. package/dist/providers/sdk/v1/sandbox/README-design.d.ts +193 -0
  151. package/dist/providers/sdk/v1/sandbox/require-whitelist.d.ts +74 -0
  152. package/dist/providers/sdk/v1/sandbox/script-runner.d.ts +98 -0
  153. package/dist/providers/sdk/v1/types/cli/index.d.ts +277 -0
  154. package/dist/providers/sdk/v1/types/common/index.d.ts +203 -0
  155. package/dist/providers/sdk/v1/validators/index.d.ts +5 -0
  156. package/dist/providers/sdk/v1/validators/manifest.d.ts +40 -0
  157. package/dist/providers/sdk/v1/validators/taint.d.ts +52 -0
  158. package/dist/providers/spec/adapter.d.ts +91 -0
  159. package/dist/providers/spec/cli-adapter.d.ts +223 -0
  160. package/dist/providers/spec/evaluator.d.ts +45 -0
  161. package/dist/providers/spec/fsm-driver.d.ts +407 -0
  162. package/dist/providers/spec/fsm-evaluator.d.ts +76 -0
  163. package/dist/providers/spec/fsm-loader.d.ts +14 -0
  164. package/dist/providers/spec/fsm-types.d.ts +174 -0
  165. package/dist/providers/spec/native-history-executor.d.ts +41 -0
  166. package/dist/providers/spec/pre-launch-trust.d.ts +16 -0
  167. package/dist/providers/spec/route.d.ts +4 -0
  168. package/dist/providers/spec/types.d.ts +222 -0
  169. package/dist/providers/status-monitor.d.ts +7 -7
  170. package/dist/providers/transcript-v2.d.ts +176 -0
  171. package/dist/providers/types/interactive-prompt.d.ts +84 -0
  172. package/dist/providers/working-dir.d.ts +17 -0
  173. package/dist/repo-mesh-types.d.ts +536 -1
  174. package/dist/runtime-defaults.d.ts +2 -0
  175. package/dist/sessions/registry.d.ts +6 -0
  176. package/dist/shared-types-extra.d.ts +2 -4
  177. package/dist/shared-types.d.ts +59 -2
  178. package/dist/status/normalize.d.ts +1 -1
  179. package/dist/status/normalize.js +1 -0
  180. package/dist/status/normalize.js.map +1 -1
  181. package/dist/status/normalize.mjs +1 -0
  182. package/dist/status/normalize.mjs.map +1 -1
  183. package/dist/status/reporter.d.ts +2 -0
  184. package/dist/status/snapshot.d.ts +26 -0
  185. package/dist/system/hash.d.ts +8 -0
  186. package/dist/system/load-better-sqlite3.d.ts +21 -0
  187. package/dist/types.d.ts +5 -0
  188. package/package.json +7 -3
  189. package/src/agent-stream/poller.ts +2 -3
  190. package/src/agent-stream/provider-adapter.ts +1 -1
  191. package/src/boot/daemon-lifecycle.ts +66 -12
  192. package/src/boot/process-hardening.ts +89 -0
  193. package/src/build-info.ts +73 -0
  194. package/src/chat/source-machine.ts +534 -0
  195. package/src/chat/source-resolver.ts +0 -0
  196. package/src/chat/subscription-updates.ts +20 -1
  197. package/src/cli-adapter-types.d.ts +1 -0
  198. package/src/cli-adapter-types.ts +68 -2
  199. package/src/cli-adapters/cli-script-runner.ts +421 -0
  200. package/src/cli-adapters/cli-state-engine.ts +1221 -0
  201. package/src/cli-adapters/provider-cli-adapter.d.ts +1 -1
  202. package/src/cli-adapters/provider-cli-adapter.ts +888 -1144
  203. package/src/cli-adapters/provider-cli-parse.d.ts +1 -0
  204. package/src/cli-adapters/provider-cli-parse.ts +13 -0
  205. package/src/cli-adapters/provider-cli-runtime.ts +56 -7
  206. package/src/cli-adapters/provider-cli-shared.d.ts +4 -0
  207. package/src/cli-adapters/provider-cli-shared.ts +121 -11
  208. package/src/cli-adapters/pty-transport.ts +2 -1
  209. package/src/cli-adapters/pty-write-chunking.ts +106 -0
  210. package/src/cli-adapters/raw-terminal-io.ts +252 -0
  211. package/src/cli-adapters/resolve-executable.ts +90 -0
  212. package/src/cli-adapters/session-host-transport.ts +2 -1
  213. package/src/cli-adapters/terminal-backends/ghostty-vt-backend.ts +53 -29
  214. package/src/cli-adapters/terminal-backends/types.ts +10 -3
  215. package/src/cli-adapters/terminal-screen.ts +16 -81
  216. package/src/commands/WINDOWS-UPGRADE-LOCK-FAILURE.md +198 -0
  217. package/src/commands/chat-commands-debug-bundle.ts +398 -0
  218. package/src/commands/chat-commands-read.ts +2327 -0
  219. package/src/commands/chat-commands-scope.ts +54 -0
  220. package/src/commands/chat-commands-shared.ts +114 -0
  221. package/src/commands/chat-commands-write.ts +880 -0
  222. package/src/commands/chat-commands.ts +19 -1841
  223. package/src/commands/cli-manager.ts +513 -26
  224. package/src/commands/handler.ts +841 -2
  225. package/src/commands/high-family/index.ts +28 -0
  226. package/src/commands/high-family/mesh-coordinator-launch.ts +673 -0
  227. package/src/commands/high-family/mesh-events.ts +80 -0
  228. package/src/commands/high-family/mesh-status.ts +678 -0
  229. package/src/commands/high-family/types.ts +76 -0
  230. package/src/commands/low-family/coordinator-prompt.ts +72 -0
  231. package/src/commands/low-family/daemon-lifecycle.ts +107 -0
  232. package/src/commands/low-family/diagnostics.ts +57 -0
  233. package/src/commands/low-family/index.ts +37 -0
  234. package/src/commands/low-family/mesh-ledger.ts +62 -0
  235. package/src/commands/low-family/mesh-node-logs.ts +87 -0
  236. package/src/commands/low-family/notification.ts +116 -0
  237. package/src/commands/low-family/refine-config.ts +106 -0
  238. package/src/commands/low-family/session-host.ts +274 -0
  239. package/src/commands/low-family/spec-providerdev.ts +217 -0
  240. package/src/commands/low-family/status-meta.ts +112 -0
  241. package/src/commands/low-family/types.ts +39 -0
  242. package/src/commands/med-family/cli-agent.ts +238 -0
  243. package/src/commands/med-family/fast-forward.ts +230 -0
  244. package/src/commands/med-family/ide.ts +163 -0
  245. package/src/commands/med-family/index.ts +37 -0
  246. package/src/commands/med-family/mesh-crud.ts +865 -0
  247. package/src/commands/med-family/mesh-host-pairing.ts +234 -0
  248. package/src/commands/med-family/mesh-queue.ts +131 -0
  249. package/src/commands/med-family/mesh-restart.ts +92 -0
  250. package/src/commands/med-family/types.ts +120 -0
  251. package/src/commands/mesh-coordinator.ts +334 -124
  252. package/src/commands/router.ts +2636 -2310
  253. package/src/commands/stream-commands.ts +8 -0
  254. package/src/commands/upgrade-helper.ts +310 -45
  255. package/src/config/chat-history.ts +483 -24
  256. package/src/config/config.ts +12 -0
  257. package/src/config/mesh-config.ts +353 -22
  258. package/src/config/mesh-json-config.ts +617 -0
  259. package/src/config/recent-activity.ts +8 -2
  260. package/src/daemon/dev-auto-implement.ts +3 -2
  261. package/src/daemon/dev-cli-debug.ts +10 -1
  262. package/src/daemon/dev-server.ts +0 -541
  263. package/src/detection/cli-detector.ts +28 -9
  264. package/src/detection/ide-detector.ts +55 -16
  265. package/src/detection/win32-ide-version.ts +106 -0
  266. package/src/git/change-impact-config.ts +354 -0
  267. package/src/git/git-commands.ts +56 -15
  268. package/src/git/git-diff.ts +81 -11
  269. package/src/git/git-executor.ts +12 -0
  270. package/src/git/git-status.ts +670 -48
  271. package/src/git/git-summary.ts +3 -0
  272. package/src/git/git-types.ts +17 -54
  273. package/src/git/git-worktree.ts +76 -1
  274. package/src/git/index.ts +16 -0
  275. package/src/index.ts +179 -12
  276. package/src/installer.d.ts +1 -1
  277. package/src/installer.ts +8 -6
  278. package/src/ipc/local-ipc-server.ts +278 -0
  279. package/src/launch.d.ts +1 -1
  280. package/src/launch.ts +37 -28
  281. package/src/logging/async-batch-writer.ts +55 -0
  282. package/src/logging/command-log.ts +7 -5
  283. package/src/logging/log-redactor.ts +100 -0
  284. package/src/logging/log-tail-reader.ts +341 -0
  285. package/src/logging/logger.ts +14 -7
  286. package/src/mesh/contracts.ts +338 -0
  287. package/src/mesh/coordinator-prompt.ts +381 -33
  288. package/src/mesh/coordinator-registry.ts +121 -0
  289. package/src/mesh/mesh-active-work.ts +645 -0
  290. package/src/mesh/mesh-coordinator-config.ts +97 -0
  291. package/src/mesh/mesh-delivery-policy.ts +315 -0
  292. package/src/mesh/mesh-event-classify.ts +51 -0
  293. package/src/mesh/mesh-event-forwarding.ts +1762 -0
  294. package/src/mesh/mesh-event-trace.ts +67 -0
  295. package/src/mesh/mesh-events-coordinator.ts +31 -0
  296. package/src/mesh/mesh-events-pending.ts +590 -0
  297. package/src/mesh/mesh-events-stale.ts +389 -0
  298. package/src/mesh/mesh-events-utils.ts +443 -0
  299. package/src/mesh/mesh-events.ts +32 -897
  300. package/src/mesh/mesh-fast-forward.ts +839 -0
  301. package/src/mesh/mesh-host-ownership.ts +73 -0
  302. package/src/mesh/mesh-init.ts +260 -0
  303. package/src/mesh/mesh-ledger-reconciliation.ts +12 -7
  304. package/src/mesh/mesh-ledger.ts +596 -102
  305. package/src/mesh/mesh-missions.ts +322 -0
  306. package/src/mesh/mesh-node-identity.ts +1887 -0
  307. package/src/mesh/mesh-queue-assignment.ts +1726 -0
  308. package/src/mesh/mesh-reconcile-loop.ts +1550 -0
  309. package/src/mesh/mesh-refine-batch.ts +205 -0
  310. package/src/mesh/mesh-refine-gates.ts +1660 -0
  311. package/src/mesh/mesh-refine-status.ts +231 -0
  312. package/src/mesh/mesh-review-inbox.ts +307 -0
  313. package/src/mesh/mesh-routing.ts +291 -0
  314. package/src/mesh/mesh-runtime-store.ts +1817 -0
  315. package/src/mesh/mesh-scheduling-runtime.ts +201 -0
  316. package/src/mesh/mesh-task-stats.ts +161 -0
  317. package/src/mesh/mesh-unresolved-forward-outbox.ts +185 -0
  318. package/src/mesh/mesh-warmup-deadline.ts +152 -0
  319. package/src/mesh/mesh-work-queue.ts +1178 -162
  320. package/src/mesh/preview-freshness.ts +118 -0
  321. package/src/mesh/refine-config.ts +423 -0
  322. package/src/mesh/worktree-bootstrap-config.ts +369 -0
  323. package/src/providers/acp-provider-instance.ts +43 -10
  324. package/src/providers/approval-utils.d.ts +5 -0
  325. package/src/providers/approval-utils.ts +57 -5
  326. package/src/providers/chat-message-normalization.ts +48 -6
  327. package/src/providers/cli-provider-instance.ts +1580 -103
  328. package/src/providers/contracts.d.ts +55 -0
  329. package/src/providers/contracts.ts +150 -6
  330. package/src/providers/extension-provider-instance.ts +12 -7
  331. package/src/providers/external-sources.ts +218 -0
  332. package/src/providers/ide-provider-instance.ts +35 -12
  333. package/src/providers/manual-attendance.ts +85 -0
  334. package/src/providers/native-history/antigravity-cli-transcript.ts +643 -0
  335. package/src/providers/native-history/claude-cli-transcript.ts +396 -0
  336. package/src/providers/native-history/codex-cli-transcript.ts +479 -0
  337. package/src/providers/native-history/constants.ts +19 -0
  338. package/src/providers/native-history/dispatcher.ts +339 -0
  339. package/src/providers/native-history/hermes-cli-transcript.ts +230 -0
  340. package/src/providers/native-history/index.ts +30 -0
  341. package/src/providers/provider-instance-manager.ts +30 -0
  342. package/src/providers/provider-instance.ts +19 -1
  343. package/src/providers/provider-loader.ts +668 -50
  344. package/src/providers/provider-schema.ts +87 -14
  345. package/src/providers/provider-trust.ts +114 -0
  346. package/src/providers/read-chat-contract.ts +76 -16
  347. package/src/providers/sdk/README.md +49 -0
  348. package/src/providers/sdk/v1/builders/acp/detect-status.ts +144 -0
  349. package/src/providers/sdk/v1/builders/cli/detect-status.ts +313 -0
  350. package/src/providers/sdk/v1/builders/cli/parse-approval-squash.ts +158 -0
  351. package/src/providers/sdk/v1/builders/cli/parse-approval.ts +250 -0
  352. package/src/providers/sdk/v1/builders/cli/parse-session.ts +276 -0
  353. package/src/providers/sdk/v1/builders/cli/visible-region.ts +143 -0
  354. package/src/providers/sdk/v1/fixture-tooling/format.ts +130 -0
  355. package/src/providers/sdk/v1/fixture-tooling/index.ts +22 -0
  356. package/src/providers/sdk/v1/fixture-tooling/replay.ts +352 -0
  357. package/src/providers/sdk/v1/index.ts +152 -0
  358. package/src/providers/sdk/v1/sandbox/README-design.ts +195 -0
  359. package/src/providers/sdk/v1/sandbox/require-whitelist.ts +472 -0
  360. package/src/providers/sdk/v1/sandbox/script-runner.ts +150 -0
  361. package/src/providers/sdk/v1/schemas/cli/provider.schema.json +504 -0
  362. package/src/providers/sdk/v1/schemas/primitives/acp-session-protocol-v1.json +131 -0
  363. package/src/providers/sdk/v1/schemas/primitives/native-history-codex-rollout-v1.json +66 -0
  364. package/src/providers/sdk/v1/schemas/primitives/tui-approval-squash-v1.json +91 -0
  365. package/src/providers/sdk/v1/schemas/primitives/tui-assistant-block-v1.json +91 -0
  366. package/src/providers/sdk/v1/schemas/primitives/tui-cue-ordering-v1.json +47 -0
  367. package/src/providers/sdk/v1/schemas/primitives/tui-dispatch-order-v1.json +32 -0
  368. package/src/providers/sdk/v1/schemas/primitives/tui-footer-chrome-v1.json +42 -0
  369. package/src/providers/sdk/v1/schemas/primitives/tui-index-finder-v1.json +27 -0
  370. package/src/providers/sdk/v1/schemas/primitives/tui-modal-v1.json +125 -0
  371. package/src/providers/sdk/v1/schemas/primitives/tui-prompt-marker-v1.json +45 -0
  372. package/src/providers/sdk/v1/schemas/primitives/tui-session-id-extraction-v1.json +46 -0
  373. package/src/providers/sdk/v1/schemas/primitives/tui-settled-prompt-v1.json +71 -0
  374. package/src/providers/sdk/v1/schemas/primitives/tui-spinner-v1.json +83 -0
  375. package/src/providers/sdk/v1/schemas/primitives/tui-transcript-pty-v1.json +83 -0
  376. package/src/providers/sdk/v1/schemas/primitives/tui-visible-region-v1.json +57 -0
  377. package/src/providers/sdk/v1/schemas/primitives/tui-welcome-screen-v1.json +35 -0
  378. package/src/providers/sdk/v1/types/cli/index.ts +365 -0
  379. package/src/providers/sdk/v1/types/common/index.ts +229 -0
  380. package/src/providers/sdk/v1/validators/index.ts +19 -0
  381. package/src/providers/sdk/v1/validators/manifest.ts +110 -0
  382. package/src/providers/sdk/v1/validators/taint.ts +309 -0
  383. package/src/providers/spec/adapter.ts +235 -0
  384. package/src/providers/spec/cli-adapter.ts +1056 -0
  385. package/src/providers/spec/evaluator.ts +407 -0
  386. package/src/providers/spec/fsm-driver.ts +1304 -0
  387. package/src/providers/spec/fsm-evaluator.ts +272 -0
  388. package/src/providers/spec/fsm-loader.ts +120 -0
  389. package/src/providers/spec/fsm-types.ts +273 -0
  390. package/src/providers/spec/native-history-executor.ts +1128 -0
  391. package/src/providers/spec/pre-launch-trust.ts +104 -0
  392. package/src/providers/spec/route.ts +51 -0
  393. package/src/providers/spec/types.ts +262 -0
  394. package/src/providers/status-monitor.d.ts +7 -7
  395. package/src/providers/status-monitor.ts +37 -22
  396. package/src/providers/transcript-v2.ts +567 -0
  397. package/src/providers/types/interactive-prompt.ts +536 -0
  398. package/src/providers/version-archive.ts +64 -24
  399. package/src/providers/working-dir.ts +23 -0
  400. package/src/repo-mesh-types.ts +755 -2
  401. package/src/runtime-defaults.ts +39 -0
  402. package/src/sessions/registry.ts +6 -0
  403. package/src/shared-types-extra.ts +2 -4
  404. package/src/shared-types.d.ts +8 -0
  405. package/src/shared-types.ts +64 -1
  406. package/src/status/builders.ts +26 -6
  407. package/src/status/normalize.ts +2 -0
  408. package/src/status/reporter.ts +19 -1
  409. package/src/status/snapshot.ts +95 -26
  410. package/src/system/hash.ts +23 -0
  411. package/src/system/host-memory.ts +29 -12
  412. package/src/system/load-better-sqlite3.ts +68 -0
  413. package/src/types.ts +5 -0
  414. package/dist/cli-adapters/terminal-backends/xterm-backend.d.ts +0 -17
  415. package/dist/mesh/mesh-sync.d.ts +0 -53
  416. package/src/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +0 -16
  417. package/src/cli-adapters/terminal-backends/xterm-backend.ts +0 -97
  418. package/src/mesh/mesh-sync.ts +0 -111
@@ -1,901 +1,36 @@
1
- import type { DaemonComponents } from '../boot/daemon-lifecycle.js';
2
- import { loadConfig } from '../config/config.js';
3
- import { getMesh, getMeshByRepo } from '../config/mesh-config.js';
4
- import { detectCLI } from '../detection/cli-detector.js';
5
- import { LOG } from '../logging/logger.js';
6
- import { appendLedgerEntry, buildTaskCompletionEvidence, getSessionRecoveryContext, isIntentionalCleanupStopEntry, readLedgerEntries } from './mesh-ledger.js';
7
- import type { MeshLedgerKind, SessionRecoveryContext } from './mesh-ledger.js';
8
- import { claimNextTask, updateSessionTaskStatus, enqueueTask, updateTaskStatus, getQueue, recordTaskAutoLaunch } from './mesh-work-queue.js';
9
-
10
- // ---------------------------------------------------------------------------
11
- // Remote Node Idle Session Tracking
12
- // ---------------------------------------------------------------------------
13
- // Tracks remote sessions that emitted 'agent:ready' so triggerMeshQueue
14
- // can assign tasks to them.
15
1
  // ---------------------------------------------------------------------------
16
- interface RemoteIdleSession {
17
- nodeId: string;
18
- sessionId: string;
19
- providerType: string;
20
- }
21
- const remoteIdleSessions = new Map<string, RemoteIdleSession>(); // key: `${nodeId}:${sessionId}`
22
-
23
- // ---------------------------------------------------------------------------
24
- // MCP coordinator pending-event queue
2
+ // mesh-events — entry point
25
3
  // ---------------------------------------------------------------------------
26
- // When a mesh event fires but no CLI coordinator session is registered (e.g.
27
- // the coordinator is Claude Code running via MCP), we buffer the event here.
28
- // The MCP server drains this queue on every mesh_status / mesh_send_task poll.
4
+ // Public API re-exported from sub-modules for backward compatibility.
5
+ // New code should import directly from the relevant sub-module.
29
6
  // ---------------------------------------------------------------------------
30
7
 
31
- export interface PendingMeshCoordinatorEvent {
32
- event: string;
33
- meshId: string;
34
- nodeLabel: string;
35
- metadataEvent: Record<string, unknown>;
36
- queuedAt: number;
37
- }
38
-
39
- const MAX_PENDING_EVENTS = 50;
40
- const pendingMeshCoordinatorEvents: PendingMeshCoordinatorEvent[] = [];
41
-
42
- /** Drain and return all pending coordinator events, clearing the queue. */
43
- export function drainPendingMeshCoordinatorEvents(): PendingMeshCoordinatorEvent[] {
44
- return pendingMeshCoordinatorEvents.splice(0);
45
- }
46
-
47
- /** Peek at pending coordinator events without draining (non-destructive). */
48
- export function getPendingMeshCoordinatorEvents(): readonly PendingMeshCoordinatorEvent[] {
49
- return pendingMeshCoordinatorEvents.slice();
50
- }
51
-
52
- /** Explicitly clear all pending coordinator events. */
53
- export function clearPendingMeshCoordinatorEvents(): void {
54
- pendingMeshCoordinatorEvents.splice(0);
55
- }
56
-
57
- function readNonEmptyString(value: unknown): string {
58
- return typeof value === 'string' && value.trim() ? value.trim() : '';
59
- }
60
-
61
- function resolveEventSessionId(event: Record<string, unknown>, fallback?: unknown): string {
62
- return readNonEmptyString(event.targetSessionId)
63
- || readNonEmptyString(event.sessionId)
64
- || readNonEmptyString(event.instanceId)
65
- || readNonEmptyString(fallback);
66
- }
67
-
68
- const MESH_COORDINATOR_EVENTS = new Set([
69
- 'agent:generating_started',
70
- 'agent:generating_completed',
71
- 'agent:waiting_approval',
72
- 'agent:stopped',
73
- 'agent:ready',
74
- 'monitor:long_generating',
75
- ]);
76
-
77
- const EVENT_TO_LEDGER_KIND: Record<string, MeshLedgerKind> = {
78
- 'agent:generating_completed': 'task_completed',
79
- 'agent:waiting_approval': 'task_approval_needed',
80
- 'agent:stopped': 'task_failed',
81
- 'monitor:long_generating': 'task_stalled',
82
- };
83
-
84
- function isMeshCoordinatorEvent(eventName: unknown): eventName is string {
85
- return typeof eventName === 'string' && MESH_COORDINATOR_EVENTS.has(eventName);
86
- }
87
-
88
- function formatCompletionMetadata(event: Record<string, unknown>): string {
89
- const parts = [
90
- readNonEmptyString(event.targetSessionId) ? `session_id=${readNonEmptyString(event.targetSessionId)}` : '',
91
- readNonEmptyString(event.providerType) ? `provider=${readNonEmptyString(event.providerType)}` : '',
92
- readNonEmptyString(event.providerSessionId) ? `provider_session_id=${readNonEmptyString(event.providerSessionId)}` : '',
93
- ].filter(Boolean);
94
- return parts.length > 0 ? ` (${parts.join('; ')})` : '';
95
- }
96
-
97
- function getMeshWithCache(components: DaemonComponents, meshId: string): any | undefined {
98
- const localMesh = getMesh(meshId);
99
- if (localMesh) return localMesh;
100
- return components.router?.getCachedInlineMesh(meshId);
101
- }
102
-
103
- const INTENTIONAL_CLEANUP_STOP_SUPPRESSION_MS = 30 * 60 * 1000;
104
-
105
- function isIntentionalCleanupStopMetadata(event: Record<string, unknown>): boolean {
106
- return event.intentional === true
107
- || event.intentionalStop === true
108
- || event.operatorCleanup === true
109
- || event.reason === 'operator_cleanup'
110
- || event.stopReason === 'operator_cleanup'
111
- || event.cleanupReason === 'operator_cleanup'
112
- || event.source === 'mesh_cleanup_sessions'
113
- || event.source === 'mesh_remove_node';
114
- }
115
-
116
- function hasRecentIntentionalCleanupStop(meshId: string, sessionId?: string, nodeId?: string): boolean {
117
- if (!sessionId && !nodeId) return false;
118
- const cutoff = Date.now() - INTENTIONAL_CLEANUP_STOP_SUPPRESSION_MS;
119
- const entries = readLedgerEntries(meshId);
120
- for (let i = entries.length - 1; i >= 0; i--) {
121
- const entry = entries[i];
122
- const timestamp = new Date(entry.timestamp).getTime();
123
- if (!Number.isNaN(timestamp) && timestamp < cutoff) break;
124
- if (!isIntentionalCleanupStopEntry(entry)) continue;
125
- if (sessionId && entry.sessionId === sessionId) return true;
126
- if (!sessionId && nodeId && entry.nodeId === nodeId) return true;
127
- }
128
- return false;
129
- }
130
-
131
- function shouldSuppressIntentionalCleanupStop(args: {
132
- event: string;
133
- meshId: string;
134
- metadataEvent: Record<string, unknown>;
135
- sessionId?: string;
136
- nodeId?: string;
137
- }): boolean {
138
- if (args.event !== 'agent:stopped' && args.event !== 'monitor:long_generating') return false;
139
- if (isIntentionalCleanupStopMetadata(args.metadataEvent)) return true;
140
- return hasRecentIntentionalCleanupStop(args.meshId, args.sessionId, args.nodeId);
141
- }
142
-
143
-
144
- export function tryAssignQueueTask(
145
- components: DaemonComponents,
146
- meshId: string,
147
- nodeId: string,
148
- sessionId: string,
149
- providerType: string
150
- ): boolean {
151
- const task = claimNextTask(meshId, nodeId, sessionId);
152
- if (!task) {
153
- return false;
154
- }
155
-
156
- LOG.info('MeshQueue', `Node ${nodeId} (${sessionId}) pulled task ${task.id}`);
157
-
158
- // Check if the node is remote
159
- const mesh = getMeshWithCache(components, meshId);
160
- const node = mesh?.nodes.find((n: any) => n.id === nodeId);
161
-
162
- // If the node is explicitly remote and we have a dispatch mechanism, route via P2P
163
- if (node?.daemonId && components.dispatchMeshCommand) {
164
- const isLocalNode = components.cliManager.adapters.has(sessionId);
165
- if (!isLocalNode) {
166
- components.dispatchMeshCommand(node.daemonId, 'agent_command', {
167
- targetSessionId: sessionId,
168
- cliType: providerType,
169
- action: 'send_chat',
170
- message: task.message,
171
- }).catch((e: any) => {
172
- LOG.error('MeshQueue', `Failed to dispatch task via P2P to remote node ${nodeId}: ${e?.message}`);
173
- updateTaskStatus(meshId, task.id, 'failed');
174
- });
175
- return true;
176
- }
177
- }
178
-
179
- // Local routing
180
- components.cliManager.handleCliCommand('agent_command', {
181
- targetSessionId: sessionId,
182
- cliType: providerType,
183
- action: 'send_chat',
184
- message: task.message,
185
- }).catch((e: any) => {
186
- LOG.error('MeshQueue', `Failed to dispatch task locally to node ${nodeId}: ${e?.message}`);
187
- updateTaskStatus(meshId, task.id, 'failed');
188
- });
189
-
190
- return true;
191
- }
192
-
193
- const autoLaunchInProgress = new Set<string>();
194
- const autoLaunchCooldownUntil = new Map<string, number>();
195
- const AUTO_LAUNCH_COOLDOWN_MS = 5_000;
196
-
197
- function normalizeProviderPriority(policy: unknown): string[] {
198
- const raw = policy && typeof policy === 'object' && !Array.isArray(policy)
199
- ? (policy as Record<string, unknown>).providerPriority
200
- : undefined;
201
- if (!Array.isArray(raw)) return [];
202
- const seen = new Set<string>();
203
- return raw
204
- .map(type => typeof type === 'string' ? type.trim() : '')
205
- .filter(Boolean)
206
- .filter(type => {
207
- if (seen.has(type)) return false;
208
- seen.add(type);
209
- return true;
210
- });
211
- }
212
-
213
- function isTerminalSessionStatus(status: string): boolean {
214
- return ['stopped', 'failed', 'terminated', 'exited', 'closed'].includes(status);
215
- }
216
-
217
- function isIdleSessionState(state: any): boolean {
218
- const status = readNonEmptyString(state?.status).toLowerCase();
219
- if (isTerminalSessionStatus(status)) return false;
220
- return status === 'idle' || state?.activeChat?.status === 'waiting_input';
221
- }
222
-
223
- function isDirtyNode(node: any): boolean {
224
- return node?.health === 'dirty' || node?.git?.dirty === true;
225
- }
226
-
227
- function isLaunchableNode(node: any): boolean {
228
- if (!node || node.status === 'disabled' || node.status === 'removed') return false;
229
- const health = readNonEmptyString(node.health).toLowerCase();
230
- if (!health) return true;
231
- return health === 'online' || health === 'unknown';
232
- }
233
-
234
- function localAutoLaunchSkipReason(node: any): string | null {
235
- const daemonId = readNonEmptyString(node?.daemonId);
236
- const machineId = readNonEmptyString(node?.machineId);
237
- const appConfig = loadConfig();
238
- const localMachineId = readNonEmptyString(appConfig.machineId) || readNonEmptyString(appConfig.registeredMachineId);
239
- const cloudDaemonId = localMachineId ? `daemon_${localMachineId}` : '';
240
- const standaloneDaemonId = localMachineId ? `standalone_${localMachineId}` : '';
241
-
242
- const daemonMatchesLocal = !daemonId || daemonId === cloudDaemonId || daemonId === standaloneDaemonId;
243
- const machineMatchesLocal = !machineId || (localMachineId && machineId === localMachineId);
244
-
245
- // ADHDev-managed local worktrees are explicitly safe to launch locally, but
246
- // still must not be auto-launched if their metadata points at another
247
- // daemon/machine. Remote nodes require an explicit coordinator launch path.
248
- if (node?.isLocalWorktree === true) {
249
- return daemonMatchesLocal && machineMatchesLocal ? null : 'remote_auto_launch_unsupported';
250
- }
251
-
252
- // Legacy/local workspace nodes may not have daemon/machine metadata. If
253
- // metadata is present, require it to identify this daemon/machine before
254
- // using the local cliManager.launch_cli path.
255
- if (daemonId || machineId) {
256
- return daemonMatchesLocal && machineMatchesLocal ? null : 'remote_auto_launch_unsupported';
257
- }
258
-
259
- return null;
260
- }
261
-
262
- function activeAssignedCount(meshId: string): number {
263
- return getQueue(meshId, { status: ['assigned'] as any }).length;
264
- }
265
-
266
- function nodeHasActiveAssignment(meshId: string, nodeId: string): boolean {
267
- return getQueue(meshId, { status: ['assigned'] as any }).some(task => task.assignedNodeId === nodeId);
268
- }
269
-
270
- function liveSessionCountForNode(components: DaemonComponents, meshId: string, nodeId: string): number {
271
- return components.instanceManager.getByCategory('cli').filter((inst: any) => {
272
- const state = inst.getState();
273
- const settings = state.settings as Record<string, unknown> || {};
274
- if (readNonEmptyString(settings.meshNodeFor) !== meshId) return false;
275
- const instNodeId = readNonEmptyString(settings.meshNodeId) || readNonEmptyString(settings.nodeId);
276
- if (instNodeId !== nodeId) return false;
277
- const status = readNonEmptyString(state.status).toLowerCase();
278
- return !isTerminalSessionStatus(status);
279
- }).length;
280
- }
281
-
282
- function recordAutoLaunchEvent(meshId: string, args: {
283
- phase: 'skipped' | 'started' | 'failed' | 'completed';
284
- taskId: string;
285
- nodeId?: string;
286
- providerType?: string;
287
- sessionId?: string;
288
- reason?: string;
289
- error?: string;
290
- }) {
291
- try {
292
- appendLedgerEntry(meshId, {
293
- kind: 'session_auto_launch',
294
- nodeId: args.nodeId,
295
- sessionId: args.sessionId,
296
- providerType: args.providerType,
297
- payload: {
298
- phase: args.phase,
299
- taskId: args.taskId,
300
- reason: args.reason,
301
- error: args.error,
302
- },
303
- });
304
- } catch (e: any) {
305
- LOG.warn('MeshQueue', `Failed to record auto-launch ledger event: ${e?.message || e}`);
306
- }
307
- }
308
-
309
- function markAutoLaunch(meshId: string, taskId: string, args: {
310
- status: 'skipped' | 'started' | 'failed' | 'completed';
311
- reason?: string;
312
- nodeId?: string;
313
- providerType?: string;
314
- sessionId?: string;
315
- error?: string;
316
- }) {
317
- recordTaskAutoLaunch(meshId, taskId, {
318
- status: args.status,
319
- reason: args.reason || args.error,
320
- nodeId: args.nodeId,
321
- providerType: args.providerType,
322
- sessionId: args.sessionId,
323
- });
324
- recordAutoLaunchEvent(meshId, {
325
- phase: args.status,
326
- taskId,
327
- nodeId: args.nodeId,
328
- providerType: args.providerType,
329
- sessionId: args.sessionId,
330
- reason: args.reason,
331
- error: args.error,
332
- });
333
- }
334
-
335
- async function resolveUsableProvider(components: DaemonComponents, nodeId: string, node: any): Promise<{ providerType?: string; reason?: string }> {
336
- const providerPriority = normalizeProviderPriority(node?.policy);
337
- if (!providerPriority.length) return { reason: 'missing_provider_priority' };
338
- const providerLoader = components.providerLoader;
339
- if (!providerLoader) return { reason: 'provider_loader_unavailable' };
340
-
341
- const failed: string[] = [];
342
- for (const requestedType of providerPriority) {
343
- const normalizedType = typeof providerLoader.resolveAlias === 'function'
344
- ? providerLoader.resolveAlias(requestedType)
345
- : requestedType;
346
- if (typeof providerLoader.isMachineProviderEnabled === 'function' && !providerLoader.isMachineProviderEnabled(normalizedType)) {
347
- failed.push(`${requestedType}: disabled`);
348
- continue;
349
- }
350
- let detected: any;
351
- try {
352
- detected = await detectCLI(normalizedType, providerLoader, { includeVersion: false });
353
- } catch (e: any) {
354
- failed.push(`${requestedType}: detect failed: ${e?.message || e}`);
355
- continue;
356
- }
357
- if (typeof providerLoader.setCliDetectionResults === 'function') {
358
- providerLoader.setCliDetectionResults([{
359
- id: normalizedType,
360
- installed: !!detected,
361
- path: detected?.path,
362
- }], false);
363
- }
364
- (components as any).onStatusChange?.();
365
- if (detected) return { providerType: normalizedType };
366
- failed.push(`${requestedType}: not detected`);
367
- }
368
- return { reason: `provider_priority_unusable: ${failed.join('; ') || nodeId}` };
369
- }
370
-
371
- async function maybeAutoLaunchOneQueueSession(components: DaemonComponents, meshId: string, mesh: any): Promise<boolean> {
372
- const queue = getQueue(meshId);
373
- const pending = queue.filter(task => task.status === 'pending');
374
- if (!pending.length) return false;
375
-
376
- const maxParallelTasks = Math.max(1, Math.floor(Number(mesh?.policy?.maxParallelTasks) || 2));
377
- for (const task of pending) {
378
- if (activeAssignedCount(meshId) >= maxParallelTasks) {
379
- markAutoLaunch(meshId, task.id, { status: 'skipped', reason: 'max_parallel_tasks_reached' });
380
- return false;
381
- }
382
- if (task.targetSessionId) {
383
- markAutoLaunch(meshId, task.id, { status: 'skipped', reason: 'target_session_constraint' });
384
- continue;
385
- }
386
-
387
- const candidateNodes = Array.isArray(mesh?.nodes)
388
- ? mesh.nodes.filter((node: any) => task.targetNodeId ? node?.id === task.targetNodeId : true)
389
- : [];
390
- if (!candidateNodes.length) {
391
- markAutoLaunch(meshId, task.id, { status: 'skipped', reason: 'no_matching_node', nodeId: task.targetNodeId });
392
- continue;
393
- }
394
-
395
- for (const node of candidateNodes) {
396
- const nodeId = readNonEmptyString(node?.id);
397
- if (!nodeId) continue;
398
- const launchKey = `${meshId}:${nodeId}`;
399
- const cooldownUntil = autoLaunchCooldownUntil.get(launchKey) || 0;
400
- if (autoLaunchInProgress.has(launchKey)) {
401
- markAutoLaunch(meshId, task.id, { status: 'skipped', reason: 'auto_launch_in_progress', nodeId });
402
- continue;
403
- }
404
- if (Date.now() < cooldownUntil) {
405
- markAutoLaunch(meshId, task.id, { status: 'skipped', reason: 'auto_launch_cooldown', nodeId });
406
- continue;
407
- }
408
- if (isDirtyNode(node)) {
409
- markAutoLaunch(meshId, task.id, { status: 'skipped', reason: 'dirty_workspace', nodeId });
410
- continue;
411
- }
412
- if (!isLaunchableNode(node)) {
413
- markAutoLaunch(meshId, task.id, { status: 'skipped', reason: 'node_not_launch_ready', nodeId });
414
- continue;
415
- }
416
- const localSkipReason = localAutoLaunchSkipReason(node);
417
- if (localSkipReason) {
418
- markAutoLaunch(meshId, task.id, { status: 'skipped', reason: localSkipReason, nodeId });
419
- continue;
420
- }
421
- if (nodeHasActiveAssignment(meshId, nodeId)) {
422
- markAutoLaunch(meshId, task.id, { status: 'skipped', reason: 'node_has_active_assignment', nodeId });
423
- continue;
424
- }
425
- const maxConcurrentSessions = Number(node?.policy?.maxConcurrentSessions);
426
- if (Number.isFinite(maxConcurrentSessions) && maxConcurrentSessions >= 0 && liveSessionCountForNode(components, meshId, nodeId) >= maxConcurrentSessions) {
427
- markAutoLaunch(meshId, task.id, { status: 'skipped', reason: 'max_concurrent_sessions_reached', nodeId });
428
- continue;
429
- }
430
-
431
- autoLaunchInProgress.add(launchKey);
432
- try {
433
- const resolved = await resolveUsableProvider(components, nodeId, node);
434
- if (!resolved.providerType) {
435
- markAutoLaunch(meshId, task.id, { status: 'skipped', reason: resolved.reason || 'provider_unusable', nodeId });
436
- continue;
437
- }
438
-
439
- markAutoLaunch(meshId, task.id, { status: 'started', nodeId, providerType: resolved.providerType });
440
- const launchResult: any = await components.cliManager.handleCliCommand('launch_cli', {
441
- cliType: resolved.providerType,
442
- dir: node.workspace,
443
- settings: {
444
- meshNodeFor: meshId,
445
- meshNodeId: nodeId,
446
- spawnedSessionVisibility: mesh?.policy?.spawnedSessionVisibility || 'hidden',
447
- launchedByCoordinator: true,
448
- autoLaunchedForQueueTaskId: task.id,
449
- },
450
- });
451
- if (!launchResult?.success) {
452
- const reason = launchResult?.error || 'launch_cli_failed';
453
- markAutoLaunch(meshId, task.id, { status: 'failed', reason, nodeId, providerType: resolved.providerType });
454
- autoLaunchCooldownUntil.set(launchKey, Date.now() + AUTO_LAUNCH_COOLDOWN_MS);
455
- return false;
456
- }
457
- const sessionId = readNonEmptyString(launchResult.sessionId) || readNonEmptyString(launchResult.id) || readNonEmptyString(launchResult.runtimeSessionId);
458
- if (!sessionId) {
459
- markAutoLaunch(meshId, task.id, { status: 'failed', reason: 'launch_missing_session_id', nodeId, providerType: resolved.providerType });
460
- autoLaunchCooldownUntil.set(launchKey, Date.now() + AUTO_LAUNCH_COOLDOWN_MS);
461
- return false;
462
- }
463
- markAutoLaunch(meshId, task.id, { status: 'completed', nodeId, providerType: resolved.providerType, sessionId });
464
- tryAssignQueueTask(components, meshId, nodeId, sessionId, resolved.providerType);
465
- return true;
466
- } catch (e: any) {
467
- markAutoLaunch(meshId, task.id, { status: 'failed', error: e?.message || String(e), nodeId });
468
- autoLaunchCooldownUntil.set(launchKey, Date.now() + AUTO_LAUNCH_COOLDOWN_MS);
469
- return false;
470
- } finally {
471
- autoLaunchInProgress.delete(launchKey);
472
- }
473
- }
474
- }
475
- return false;
476
- }
477
-
478
- /**
479
- * Triggers a queue check for all nodes in the mesh.
480
- * Called when a new task is enqueued, in case nodes are already idle.
481
- */
482
- export async function triggerMeshQueue(components: DaemonComponents, meshId: string): Promise<void> {
483
- const mesh = getMeshWithCache(components, meshId);
484
- if (!mesh) return;
485
-
486
- // Find all CLI instances that belong to this mesh and are idle
487
- const cliInstances = components.instanceManager.getByCategory('cli');
488
- for (const inst of cliInstances) {
489
- const state = inst.getState();
490
- const settings = state.settings as Record<string, unknown> || {};
491
-
492
- const instMeshId = readNonEmptyString(settings.meshNodeFor);
493
- if (instMeshId !== meshId) continue;
494
-
495
- const nodeId = readNonEmptyString(settings.meshNodeId) || readNonEmptyString(settings.nodeId);
496
- if (!nodeId) continue;
497
-
498
- // Only genuinely idle live sessions can pull work. Restored/stopped
499
- // records are kept for transcript/recovery visibility, but assigning
500
- // queue items to them strands tasks in assigned/pending without chat.
501
- if (!isIdleSessionState(state)) continue;
502
-
503
- const sessionId = state.instanceId;
504
- const providerType = state.type || readNonEmptyString(settings.providerType);
505
-
506
- if (providerType) {
507
- // Try to assign a task to this idle node
508
- tryAssignQueueTask(components, meshId, nodeId, sessionId, providerType);
509
- }
510
- }
511
-
512
- // Also check known idle remote sessions
513
- for (const [key, idle] of remoteIdleSessions.entries()) {
514
- // Find if this node is in the same mesh
515
- const node = mesh.nodes.find((n: any) => n.id === idle.nodeId);
516
- if (node) {
517
- const assigned = tryAssignQueueTask(components, meshId, idle.nodeId, idle.sessionId, idle.providerType);
518
- if (assigned) {
519
- remoteIdleSessions.delete(key);
520
- }
521
- }
522
- }
523
-
524
- await maybeAutoLaunchOneQueueSession(components, meshId, mesh);
525
- }
526
-
527
- function buildMeshSystemMessage(args: {
528
- event: string;
529
- nodeLabel: string;
530
- metadataEvent: Record<string, unknown>;
531
- recoveryContext?: SessionRecoveryContext | null;
532
- }): string {
533
- const metadata = formatCompletionMetadata(args.metadataEvent);
534
- if (args.event === 'agent:generating_completed') {
535
- return `[System] ${args.nodeLabel} has completed its task and is now idle${metadata}. This completion came from the agent status event path; use mesh_read_chat once to review its final progress, but do not poll repeatedly.`;
536
- }
537
- if (args.event === 'agent:waiting_approval') {
538
- return `[System] ${args.nodeLabel} is waiting for approval to proceed${metadata}. You may use mesh_read_chat and mesh_approve to handle it.`;
539
- }
540
- if (args.event === 'agent:stopped') {
541
- const rc = args.recoveryContext;
542
- if (rc && rc.consecutiveNodeFailures > 0) {
543
- const parts = [
544
- `[System] ${args.nodeLabel} has stopped unexpectedly${metadata}.`,
545
- `\n\n**Recovery Context:**`,
546
- `- Consecutive failures on this node: ${rc.consecutiveNodeFailures}`,
547
- rc.taskAttemptCount > 0 ? `- This task has been attempted ${rc.taskAttemptCount} time(s)` : '',
548
- `- Recommendation: ${rc.advice}`,
549
- ];
550
- if (rc.retryRecommended && rc.lastTaskMessage) {
551
- parts.push(
552
- `\n\n**Original task to retry:**`,
553
- `> ${rc.lastTaskMessage.length > 300 ? rc.lastTaskMessage.slice(0, 300) + '...' : rc.lastTaskMessage}`,
554
- `\nTo retry: call \`mesh_launch_session\` for this node, then \`mesh_send_task\` with the original task.`,
555
- );
556
- } else if (!rc.retryRecommended) {
557
- parts.push(
558
- `\nDo NOT retry on this node. Consider reassigning to a different node or asking the user for guidance.`,
559
- );
560
- }
561
- return parts.filter(Boolean).join('\n');
562
- }
563
- return `[System] ${args.nodeLabel} has stopped${metadata}. Use mesh_read_chat once if you need to inspect its last output.`;
564
- }
565
- if (args.event === 'monitor:long_generating') {
566
- return `[System] ${args.nodeLabel} has been generating for a long time${metadata}. Use mesh_read_chat once for a status check, but do not poll repeatedly.`;
567
- }
568
- return '';
569
- }
570
-
571
- function injectMeshSystemMessage(components: DaemonComponents, args: {
572
- meshId: string;
573
- sourceInstanceId?: string;
574
- nodeId?: string;
575
- nodeLabel: string;
576
- event: string;
577
- metadataEvent: Record<string, unknown>;
578
- }) {
579
- const eventSessionId = resolveEventSessionId(args.metadataEvent, args.sourceInstanceId);
580
- const eventNodeId = readNonEmptyString(args.nodeId) || readNonEmptyString(args.metadataEvent.meshNodeId);
581
- const intentionalCleanupStop = shouldSuppressIntentionalCleanupStop({
582
- event: args.event,
583
- meshId: args.meshId,
584
- metadataEvent: args.metadataEvent,
585
- sessionId: eventSessionId || undefined,
586
- nodeId: eventNodeId || undefined,
587
- });
588
- if (intentionalCleanupStop) {
589
- if (eventSessionId && eventNodeId) {
590
- remoteIdleSessions.delete(`${eventNodeId}:${eventSessionId}`);
591
- }
592
- LOG.info('MeshEvents', `Suppressed ${args.event} for intentionally cleanup-stopped session ${eventSessionId || '(unknown session)'}`);
593
- return { success: true, forwarded: 0, suppressed: true, intentionalCleanupStop: true };
594
- }
595
-
596
- // ── Task Queue & Ledger ──
597
- let completedTaskForLedger: { id?: string } | null = null;
598
- if (args.event === 'agent:generating_completed') {
599
- const sessionId = resolveEventSessionId(args.metadataEvent, args.sourceInstanceId);
600
- const nodeId = readNonEmptyString(args.nodeId) || readNonEmptyString(args.metadataEvent.meshNodeId);
601
- const providerType = readNonEmptyString(args.metadataEvent.providerType);
602
-
603
- if (sessionId) {
604
- const completedTask = updateSessionTaskStatus(args.meshId, sessionId, 'completed');
605
- completedTaskForLedger = completedTask ? { id: completedTask.id } : null;
606
- if (nodeId && providerType) {
607
- // Short delay to allow completion event to propagate before pulling next
608
- setTimeout(() => {
609
- tryAssignQueueTask(components, args.meshId, nodeId, sessionId, providerType);
610
- }, 500);
611
- }
612
- }
613
- } else if (args.event === 'agent:ready') {
614
- const sessionId = resolveEventSessionId(args.metadataEvent, args.sourceInstanceId);
615
- const nodeId = readNonEmptyString(args.nodeId) || readNonEmptyString(args.metadataEvent.meshNodeId);
616
- const providerType = readNonEmptyString(args.metadataEvent.providerType);
617
- const completedTask = sessionId
618
- ? updateSessionTaskStatus(args.meshId, sessionId, 'completed')
619
- : null;
620
- if (completedTask) {
621
- completedTaskForLedger = { id: completedTask.id };
622
- try {
623
- appendLedgerEntry(args.meshId, {
624
- kind: 'task_completed',
625
- nodeId: nodeId || undefined,
626
- sessionId,
627
- providerType: providerType || undefined,
628
- payload: {
629
- event: args.event,
630
- nodeLabel: args.nodeLabel,
631
- taskId: completedTask.id,
632
- completedViaReady: true,
633
- providerSessionId: readNonEmptyString(args.metadataEvent.providerSessionId) || undefined,
634
- finalSummary: readNonEmptyString(args.metadataEvent.finalSummary) || undefined,
635
- evidence: buildTaskCompletionEvidence({
636
- event: 'agent:ready',
637
- nodeId,
638
- sessionId,
639
- providerType: providerType || undefined,
640
- providerSessionId: readNonEmptyString(args.metadataEvent.providerSessionId) || undefined,
641
- finalSummary: readNonEmptyString(args.metadataEvent.finalSummary) || undefined,
642
- }),
643
- },
644
- });
645
- } catch (e: any) {
646
- LOG.warn('MeshLedger', `Failed to record task_completed from ready: ${e?.message || e}`);
647
- }
648
- }
649
-
650
- if (sessionId && nodeId && providerType) {
651
- remoteIdleSessions.set(`${nodeId}:${sessionId}`, { nodeId, sessionId, providerType });
652
- setTimeout(() => {
653
- const assigned = tryAssignQueueTask(components, args.meshId, nodeId, sessionId, providerType);
654
- if (assigned) {
655
- remoteIdleSessions.delete(`${nodeId}:${sessionId}`);
656
- }
657
- }, 500);
658
- }
659
- } else if (args.event === 'agent:generating_started') {
660
- const sessionId = resolveEventSessionId(args.metadataEvent, args.sourceInstanceId);
661
- const nodeId = readNonEmptyString(args.nodeId) || readNonEmptyString(args.metadataEvent.meshNodeId);
662
- if (sessionId && nodeId) {
663
- remoteIdleSessions.delete(`${nodeId}:${sessionId}`);
664
- }
665
- } else if (args.event === 'agent:stopped') {
666
- const sessionId = resolveEventSessionId(args.metadataEvent, args.sourceInstanceId);
667
- const nodeId = readNonEmptyString(args.nodeId) || readNonEmptyString(args.metadataEvent.meshNodeId);
668
- if (sessionId && nodeId) {
669
- remoteIdleSessions.delete(`${nodeId}:${sessionId}`);
670
- }
671
- if (sessionId) {
672
- updateSessionTaskStatus(args.meshId, sessionId, 'failed');
673
- }
674
- }
675
-
676
- const ledgerKind = EVENT_TO_LEDGER_KIND[args.event];
677
- if (ledgerKind) {
678
- try {
679
- const ledgerNodeId = readNonEmptyString(args.nodeId) || readNonEmptyString(args.metadataEvent.meshNodeId) || undefined;
680
- const ledgerSessionId = resolveEventSessionId(args.metadataEvent, args.sourceInstanceId) || undefined;
681
- const ledgerProviderType = readNonEmptyString(args.metadataEvent.providerType) || undefined;
682
- const completionEvidence = ledgerKind === 'task_completed' && ledgerNodeId && ledgerSessionId
683
- ? buildTaskCompletionEvidence({
684
- event: 'agent:generating_completed',
685
- nodeId: ledgerNodeId,
686
- sessionId: ledgerSessionId,
687
- providerType: ledgerProviderType,
688
- providerSessionId: readNonEmptyString(args.metadataEvent.providerSessionId) || undefined,
689
- finalSummary: readNonEmptyString(args.metadataEvent.finalSummary) || undefined,
690
- })
691
- : undefined;
692
- appendLedgerEntry(args.meshId, {
693
- kind: ledgerKind,
694
- nodeId: ledgerNodeId,
695
- sessionId: ledgerSessionId,
696
- providerType: ledgerProviderType,
697
- payload: {
698
- event: args.event,
699
- nodeLabel: args.nodeLabel,
700
- taskId: completedTaskForLedger?.id || undefined,
701
- providerSessionId: readNonEmptyString(args.metadataEvent.providerSessionId) || undefined,
702
- finalSummary: readNonEmptyString(args.metadataEvent.finalSummary) || undefined,
703
- evidence: completionEvidence,
704
- },
705
- });
706
- } catch (e: any) {
707
- LOG.warn('MeshLedger', `Failed to record ${ledgerKind}: ${e?.message || e}`);
708
- }
709
- }
710
-
711
- // ── Recovery Context: enrich agent:stopped with retry intelligence ──
712
- let recoveryContext: SessionRecoveryContext | null = null;
713
- if (args.event === 'agent:stopped') {
714
- try {
715
- // Resolve maxTaskRetries from mesh policy
716
- const mesh = getMesh(args.meshId);
717
- const maxRetries = mesh?.policy?.maxTaskRetries ?? 1;
718
-
719
- recoveryContext = getSessionRecoveryContext(args.meshId, {
720
- sessionId: resolveEventSessionId(args.metadataEvent, args.sourceInstanceId) || undefined,
721
- nodeId: readNonEmptyString(args.nodeId) || readNonEmptyString(args.metadataEvent.meshNodeId) || undefined,
722
- maxRetries,
723
- });
724
- recoveryContext.failedProviderType = readNonEmptyString(args.metadataEvent.providerType) || null;
725
-
726
- // Record recovery_attempted if retry is recommended
727
- if (recoveryContext.retryRecommended && recoveryContext.consecutiveNodeFailures > 0) {
728
- appendLedgerEntry(args.meshId, {
729
- kind: 'recovery_attempted',
730
- nodeId: recoveryContext.failedNodeId || undefined,
731
- sessionId: recoveryContext.failedSessionId || undefined,
732
- providerType: recoveryContext.failedProviderType || undefined,
733
- payload: {
734
- consecutiveFailures: recoveryContext.consecutiveNodeFailures,
735
- taskAttemptCount: recoveryContext.taskAttemptCount,
736
- retryRecommended: recoveryContext.retryRecommended,
737
- advice: recoveryContext.advice,
738
- },
739
- });
740
-
741
- // Auto-Recovery (Phase 5): Automatically re-enqueue the task and re-launch the session
742
- if (recoveryContext.lastTaskMessage && recoveryContext.failedNodeId && recoveryContext.failedProviderType) {
743
- const autoNodeId = recoveryContext.failedNodeId;
744
- try {
745
- const task = enqueueTask(args.meshId, recoveryContext.lastTaskMessage, {
746
- targetNodeId: autoNodeId
747
- });
748
- LOG.info('MeshRecovery', `Auto-requeued failed task: ${task.id} for node ${autoNodeId}`);
749
-
750
- const node = mesh?.nodes.find(n => n.id === autoNodeId);
751
- if (node) {
752
- components.cliManager.handleCliCommand('launch_cli', {
753
- cliType: recoveryContext.failedProviderType,
754
- dir: node.workspace,
755
- settings: {
756
- meshNodeFor: args.meshId,
757
- meshNodeId: node.id,
758
- spawnedSessionVisibility: mesh?.policy?.spawnedSessionVisibility || 'hidden',
759
- launchedByCoordinator: true,
760
- }
761
- }).catch((e: any) => LOG.error('MeshRecovery', `Failed to auto-relaunch session for ${node.id}: ${e?.message}`));
762
- }
763
- } catch (e: any) {
764
- LOG.warn('MeshRecovery', `Failed to execute auto-recovery: ${e?.message}`);
765
- }
766
- }
767
- }
768
-
769
- LOG.info('MeshRecovery', `Recovery context for ${args.nodeLabel}: ${recoveryContext.advice}`);
770
- } catch (e: any) {
771
- LOG.warn('MeshRecovery', `Failed to build recovery context: ${e?.message || e}`);
772
- }
773
- }
774
-
775
- const coordinatorInstances = components.instanceManager.getByCategory('cli').filter((inst) => {
776
- const instState = inst.getState();
777
- if (instState.settings?.meshCoordinatorFor !== args.meshId) return false;
778
- if (args.sourceInstanceId && instState.instanceId === args.sourceInstanceId) return false;
779
- return true;
780
- });
781
-
782
- if (coordinatorInstances.length === 0) {
783
- // No CLI coordinator session found — buffer for MCP-based coordinators.
784
- if (pendingMeshCoordinatorEvents.length < MAX_PENDING_EVENTS) {
785
- pendingMeshCoordinatorEvents.push({
786
- event: args.event,
787
- meshId: args.meshId,
788
- nodeLabel: args.nodeLabel,
789
- metadataEvent: {
790
- ...args.metadataEvent,
791
- ...(recoveryContext ? { recoveryContext } : {}),
792
- },
793
- queuedAt: Date.now(),
794
- });
795
- LOG.info('MeshEvents', `Queued ${args.event} for MCP coordinator (mesh ${args.meshId})`);
796
- }
797
- return { success: true, forwarded: 0 };
798
- }
799
-
800
- const messageText = buildMeshSystemMessage({
801
- event: args.event,
802
- nodeLabel: args.nodeLabel,
803
- metadataEvent: args.metadataEvent,
804
- recoveryContext,
805
- });
806
- if (!messageText) return { success: false, error: 'unsupported mesh event' };
807
-
808
- for (const coord of coordinatorInstances) {
809
- const coordState = coord.getState();
810
- LOG.info('MeshEvents', `Forwarding mesh event to coordinator ${coordState.instanceId}`);
811
- coord.onEvent('send_message', { input: { text: messageText, textFallback: messageText } });
812
- }
813
- return { success: true, forwarded: coordinatorInstances.length };
814
- }
815
-
816
- export function handleMeshForwardEvent(components: DaemonComponents, payload: Record<string, unknown>) {
817
- const eventName = readNonEmptyString(payload.event);
818
- if (!isMeshCoordinatorEvent(eventName)) {
819
- return { success: false, error: 'unsupported mesh event' };
820
- }
821
- const meshId = readNonEmptyString(payload.meshId);
822
- if (!meshId) return { success: false, error: 'meshId required' };
823
-
824
- const nodeId = readNonEmptyString(payload.nodeId);
825
- const workspace = readNonEmptyString(payload.workspace);
826
- const nodeLabel = nodeId ? `Node '${nodeId}'` : workspace ? `Agent at ${workspace}` : 'Remote agent';
827
- return injectMeshSystemMessage(components, {
828
- meshId,
829
- nodeId,
830
- nodeLabel,
831
- event: eventName,
832
- metadataEvent: {
833
- targetSessionId: readNonEmptyString(payload.targetSessionId) || readNonEmptyString(payload.sessionId) || readNonEmptyString(payload.instanceId),
834
- providerType: readNonEmptyString(payload.providerType),
835
- providerSessionId: readNonEmptyString(payload.providerSessionId),
836
- finalSummary: readNonEmptyString(payload.finalSummary) || readNonEmptyString(payload.summary),
837
- intentional: payload.intentional === true,
838
- intentionalStop: payload.intentionalStop === true,
839
- operatorCleanup: payload.operatorCleanup === true,
840
- reason: readNonEmptyString(payload.reason),
841
- stopReason: readNonEmptyString(payload.stopReason),
842
- cleanupReason: readNonEmptyString(payload.cleanupReason),
843
- source: readNonEmptyString(payload.source),
844
- },
845
- });
846
- }
847
-
848
- export function setupMeshEventForwarding(components: DaemonComponents) {
849
- components.instanceManager.onEvent((event) => {
850
- // We only care about lightweight Repo Mesh coordinator control/status hints.
851
- if (!isMeshCoordinatorEvent(event.event)) return;
852
-
853
- const instanceId = readNonEmptyString(event.instanceId);
854
- if (!instanceId) return;
855
-
856
- // Try to find the workspace and mesh metadata of the sub-agent.
857
- const sourceInstance = components.instanceManager.getInstance(instanceId);
858
- if (!sourceInstance || sourceInstance.category !== 'cli') return;
859
- const state = sourceInstance.getState();
860
- const workspace = readNonEmptyString(state.workspace);
861
- if (!workspace) return;
862
- const settings = state.settings && typeof state.settings === 'object' ? state.settings as Record<string, unknown> : {};
863
-
864
- // Coordinator sessions must never inject events into themselves.
865
- // A coordinator instance carries meshCoordinatorFor but not meshNodeFor/launchedByCoordinator.
866
- if (readNonEmptyString(settings.meshCoordinatorFor)) return;
867
-
868
- const meshIdFromRuntime = readNonEmptyString(settings.meshNodeFor);
869
-
870
- // Only forward events for sessions that were explicitly launched as mesh-node delegates
871
- // (meshNodeFor set by mesh_launch_session) or that carry the launchedByCoordinator flag.
872
- // Do NOT fall back to workspace-based mesh lookup: that would pick up coordinator sessions
873
- // and any other CLI session that happens to share the same workspace, causing spurious
874
- // system-message injection into the coordinator's own conversation.
875
- const isMeshDelegate = Boolean(meshIdFromRuntime || settings.launchedByCoordinator);
876
- if (!isMeshDelegate) return;
877
-
878
- const mesh = meshIdFromRuntime ? getMeshWithCache(components, meshIdFromRuntime) : getMeshByRepo(workspace);
879
- const meshId = meshIdFromRuntime || readNonEmptyString(mesh?.id);
880
- if (!meshId) return;
881
-
882
- // Determine node label. Inline/cloud meshes may be unavailable here, so preserve runtime node id.
883
- const targetNode = mesh?.nodes?.find((n: any) => n.workspace === workspace);
884
- const runtimeNodeId = readNonEmptyString(settings.meshNodeId);
885
- const resolvedNodeId = targetNode?.id || runtimeNodeId;
886
- const nodeLabel = targetNode
887
- ? `Node '${targetNode.id}'`
888
- : runtimeNodeId
889
- ? `Node '${runtimeNodeId}'`
890
- : `Agent at ${workspace}`;
891
-
892
- injectMeshSystemMessage(components, {
893
- meshId,
894
- sourceInstanceId: instanceId,
895
- nodeId: resolvedNodeId,
896
- nodeLabel,
897
- event: event.event,
898
- metadataEvent: event,
899
- });
900
- });
901
- }
8
+ export type { PendingMeshCoordinatorEvent } from './mesh-events-pending.js';
9
+ export {
10
+ queuePendingMeshCoordinatorEvent,
11
+ drainPendingMeshCoordinatorEvents,
12
+ getPendingMeshCoordinatorEvents,
13
+ clearPendingMeshCoordinatorEvents,
14
+ } from './mesh-events-pending.js';
15
+
16
+ export {
17
+ reconcileDirectDispatchCompletionFromTranscript,
18
+ } from './mesh-events-stale.js';
19
+
20
+ export {
21
+ setupMeshReconcileLoop,
22
+ runMeshReconcileTick,
23
+ resolveCoordinatorDrainDeliverability,
24
+ shouldHoldPendingDrainForBusyLocalCoordinator,
25
+ } from './mesh-reconcile-loop.js';
26
+
27
+ export type { MeshQueueTriggerResult } from './mesh-events-coordinator.js';
28
+ export {
29
+ tryAssignQueueTask,
30
+ triggerMeshQueue,
31
+ handleMeshForwardEvent,
32
+ setupMeshEventForwarding,
33
+ isMeshCoordinatorEvent,
34
+ __resetIdleAutoFastForwardForTests,
35
+ __resetMeshWorkspaceCacheForTests,
36
+ } from './mesh-events-coordinator.js';