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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (473) hide show
  1. package/dist/boot/daemon-lifecycle.d.ts +9 -0
  2. package/dist/boot/process-hardening.d.ts +50 -0
  3. package/dist/build-info.d.ts +37 -0
  4. package/dist/chat/source-machine.d.ts +166 -0
  5. package/dist/chat/source-resolver.d.ts +104 -0
  6. package/dist/chat/subscription-updates.d.ts +1 -0
  7. package/dist/cli-adapter-types.d.ts +68 -2
  8. package/dist/cli-adapters/cli-script-runner.d.ts +117 -0
  9. package/dist/cli-adapters/cli-state-engine.d.ts +220 -0
  10. package/dist/cli-adapters/provider-cli-adapter.d.ts +137 -64
  11. package/dist/cli-adapters/provider-cli-parse.d.ts +5 -0
  12. package/dist/cli-adapters/provider-cli-runtime.d.ts +34 -0
  13. package/dist/cli-adapters/provider-cli-shared.d.ts +74 -0
  14. package/dist/cli-adapters/pty-write-chunking.d.ts +34 -0
  15. package/dist/cli-adapters/raw-terminal-io.d.ts +37 -0
  16. package/dist/cli-adapters/resolve-executable.d.ts +69 -0
  17. package/dist/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +6 -3
  18. package/dist/cli-adapters/terminal-backends/types.d.ts +10 -2
  19. package/dist/cli-adapters/terminal-screen.d.ts +4 -11
  20. package/dist/commands/chat-commands-debug-bundle.d.ts +14 -0
  21. package/dist/commands/chat-commands-read.d.ts +23 -0
  22. package/dist/commands/chat-commands-scope.d.ts +39 -0
  23. package/dist/commands/chat-commands-shared.d.ts +33 -0
  24. package/dist/commands/chat-commands-write.d.ts +14 -0
  25. package/dist/commands/chat-commands.d.ts +10 -23
  26. package/dist/commands/cli-manager.d.ts +71 -1
  27. package/dist/commands/handler.d.ts +125 -0
  28. package/dist/commands/high-family/index.d.ts +3 -0
  29. package/dist/commands/high-family/mesh-coordinator-launch.d.ts +2 -0
  30. package/dist/commands/high-family/mesh-events.d.ts +2 -0
  31. package/dist/commands/high-family/mesh-status.d.ts +2 -0
  32. package/dist/commands/high-family/types.d.ts +64 -0
  33. package/dist/commands/low-family/coordinator-prompt.d.ts +9 -0
  34. package/dist/commands/low-family/daemon-lifecycle.d.ts +2 -0
  35. package/dist/commands/low-family/diagnostics.d.ts +2 -0
  36. package/dist/commands/low-family/index.d.ts +3 -0
  37. package/dist/commands/low-family/mesh-ledger.d.ts +10 -0
  38. package/dist/commands/low-family/mesh-node-logs.d.ts +2 -0
  39. package/dist/commands/low-family/notification.d.ts +2 -0
  40. package/dist/commands/low-family/refine-config.d.ts +2 -0
  41. package/dist/commands/low-family/session-host.d.ts +2 -0
  42. package/dist/commands/low-family/spec-providerdev.d.ts +11 -0
  43. package/dist/commands/low-family/status-meta.d.ts +2 -0
  44. package/dist/commands/low-family/types.d.ts +33 -0
  45. package/dist/commands/med-family/cli-agent.d.ts +2 -0
  46. package/dist/commands/med-family/fast-forward.d.ts +2 -0
  47. package/dist/commands/med-family/ide.d.ts +10 -0
  48. package/dist/commands/med-family/index.d.ts +3 -0
  49. package/dist/commands/med-family/mesh-crud.d.ts +48 -0
  50. package/dist/commands/med-family/mesh-host-pairing.d.ts +2 -0
  51. package/dist/commands/med-family/mesh-queue.d.ts +2 -0
  52. package/dist/commands/med-family/mesh-restart.d.ts +2 -0
  53. package/dist/commands/med-family/types.d.ts +152 -0
  54. package/dist/commands/mesh-coordinator.d.ts +85 -1
  55. package/dist/commands/router-aggregate-status.d.ts +24 -0
  56. package/dist/commands/router-mesh-session-owner.d.ts +59 -0
  57. package/dist/commands/router-refine.d.ts +151 -0
  58. package/dist/commands/router-worktree-cleanup.d.ts +133 -0
  59. package/dist/commands/router.d.ts +203 -15
  60. package/dist/commands/upgrade-helper.d.ts +41 -1
  61. package/dist/config/chat-history.d.ts +11 -0
  62. package/dist/config/config.d.ts +19 -0
  63. package/dist/config/mesh-config.d.ts +65 -0
  64. package/dist/config/mesh-json-config.d.ts +199 -0
  65. package/dist/config/registry-resolver.d.ts +54 -0
  66. package/dist/config/repo-settings.d.ts +77 -0
  67. package/dist/config/state-store.d.ts +30 -0
  68. package/dist/daemon/dev-server.d.ts +0 -2
  69. package/dist/detection/cli-detector.d.ts +17 -0
  70. package/dist/detection/ide-detector.d.ts +13 -0
  71. package/dist/detection/win32-ide-version.d.ts +37 -0
  72. package/dist/git/change-impact-config.d.ts +159 -0
  73. package/dist/git/git-commands.d.ts +26 -2
  74. package/dist/git/git-diff.d.ts +6 -0
  75. package/dist/git/git-executor.d.ts +11 -0
  76. package/dist/git/git-status.d.ts +80 -0
  77. package/dist/git/git-types.d.ts +2 -50
  78. package/dist/git/git-worktree.d.ts +71 -1
  79. package/dist/git/index.d.ts +3 -1
  80. package/dist/index.d.ts +70 -17
  81. package/dist/index.js +53532 -19073
  82. package/dist/index.js.map +1 -1
  83. package/dist/index.mjs +53283 -18989
  84. package/dist/index.mjs.map +1 -1
  85. package/dist/installer.d.ts +1 -4
  86. package/dist/ipc/local-ipc-server.d.ts +91 -0
  87. package/dist/launch.d.ts +1 -1
  88. package/dist/logging/async-batch-writer.d.ts +10 -0
  89. package/dist/logging/debug-config.d.ts +16 -0
  90. package/dist/logging/log-redactor.d.ts +24 -0
  91. package/dist/logging/log-tail-reader.d.ts +81 -0
  92. package/dist/logging/logger.d.ts +1 -1
  93. package/dist/mesh/contracts.d.ts +256 -0
  94. package/dist/mesh/coordinator-prompt.d.ts +76 -0
  95. package/dist/mesh/coordinator-registry.d.ts +59 -0
  96. package/dist/mesh/mesh-active-work.d.ts +203 -0
  97. package/dist/mesh/mesh-clone-grace.d.ts +8 -0
  98. package/dist/mesh/mesh-completion-synthesis.d.ts +4 -0
  99. package/dist/mesh/mesh-coordinator-config.d.ts +21 -0
  100. package/dist/mesh/mesh-delivery-policy.d.ts +104 -0
  101. package/dist/mesh/mesh-event-classify.d.ts +7 -0
  102. package/dist/mesh/mesh-event-forwarding.d.ts +58 -0
  103. package/dist/mesh/mesh-event-trace.d.ts +21 -0
  104. package/dist/mesh/mesh-events-coordinator.d.ts +4 -0
  105. package/dist/mesh/mesh-events-pending.d.ts +258 -0
  106. package/dist/mesh/mesh-events-stale.d.ts +61 -0
  107. package/dist/mesh/mesh-events-utils.d.ts +75 -0
  108. package/dist/mesh/mesh-events.d.ts +6 -49
  109. package/dist/mesh/mesh-fast-forward.d.ts +81 -0
  110. package/dist/mesh/mesh-host-ownership.d.ts +21 -1
  111. package/dist/mesh/mesh-init.d.ts +128 -0
  112. package/dist/mesh/mesh-ledger-reconciliation.d.ts +23 -4
  113. package/dist/mesh/mesh-ledger.d.ts +139 -1
  114. package/dist/mesh/mesh-magi-status.d.ts +63 -0
  115. package/dist/mesh/mesh-missions.d.ts +281 -0
  116. package/dist/mesh/mesh-node-identity.d.ts +310 -0
  117. package/dist/mesh/mesh-queue-assignment.d.ts +162 -0
  118. package/dist/mesh/mesh-reconcile-acked-hold.d.ts +17 -0
  119. package/dist/mesh/mesh-reconcile-config.d.ts +6 -0
  120. package/dist/mesh/mesh-reconcile-identity.d.ts +6 -0
  121. package/dist/mesh/mesh-reconcile-loop.d.ts +84 -0
  122. package/dist/mesh/mesh-reconcile-v2-backstop.d.ts +16 -0
  123. package/dist/mesh/mesh-refine-batch.d.ts +68 -0
  124. package/dist/mesh/mesh-refine-gates.d.ts +457 -0
  125. package/dist/mesh/mesh-refine-status.d.ts +62 -0
  126. package/dist/mesh/mesh-remote-event-pull.d.ts +15 -0
  127. package/dist/mesh/mesh-review-inbox.d.ts +90 -0
  128. package/dist/mesh/mesh-routing.d.ts +70 -0
  129. package/dist/mesh/mesh-runtime-store.d.ts +567 -0
  130. package/dist/mesh/mesh-scheduling-runtime.d.ts +78 -0
  131. package/dist/mesh/mesh-task-inflight.d.ts +46 -0
  132. package/dist/mesh/mesh-task-stats.d.ts +49 -0
  133. package/dist/mesh/mesh-unresolved-forward-outbox.d.ts +34 -0
  134. package/dist/mesh/mesh-warmup-deadline.d.ts +68 -0
  135. package/dist/mesh/mesh-work-queue.d.ts +392 -1
  136. package/dist/mesh/preview-freshness.d.ts +28 -0
  137. package/dist/mesh/refine-config.d.ts +97 -0
  138. package/dist/mesh/worktree-bootstrap-config.d.ts +219 -0
  139. package/dist/providers/acp-provider-instance.d.ts +5 -0
  140. package/dist/providers/approval-utils.d.ts +46 -0
  141. package/dist/providers/chat-message-normalization.d.ts +58 -1
  142. package/dist/providers/cli-provider-effect-format.d.ts +30 -0
  143. package/dist/providers/cli-provider-history-dedup.d.ts +17 -0
  144. package/dist/providers/cli-provider-input-prompt.d.ts +12 -0
  145. package/dist/providers/cli-provider-instance-types.d.ts +45 -0
  146. package/dist/providers/cli-provider-instance.d.ts +426 -30
  147. package/dist/providers/cli-provider-status-helpers.d.ts +46 -0
  148. package/dist/providers/cli-provider-transcript-merge.d.ts +7 -0
  149. package/dist/providers/contracts.d.ts +196 -6
  150. package/dist/providers/external-sources.d.ts +71 -0
  151. package/dist/providers/manual-attendance.d.ts +79 -0
  152. package/dist/providers/native-history/antigravity-claim-registry.d.ts +39 -0
  153. package/dist/providers/native-history/antigravity-cli-transcript.d.ts +137 -0
  154. package/dist/providers/native-history/claude-cli-transcript.d.ts +70 -0
  155. package/dist/providers/native-history/codex-cli-transcript.d.ts +73 -0
  156. package/dist/providers/native-history/constants.d.ts +12 -0
  157. package/dist/providers/native-history/dispatcher.d.ts +44 -0
  158. package/dist/providers/native-history/hermes-cli-transcript.d.ts +30 -0
  159. package/dist/providers/native-history/index.d.ts +13 -0
  160. package/dist/providers/provider-instance-manager.d.ts +30 -0
  161. package/dist/providers/provider-instance.d.ts +31 -1
  162. package/dist/providers/provider-loader.d.ts +42 -5
  163. package/dist/providers/provider-trust.d.ts +31 -0
  164. package/dist/providers/read-chat-contract.d.ts +29 -0
  165. package/dist/providers/sdk/v1/builders/acp/detect-status.d.ts +68 -0
  166. package/dist/providers/sdk/v1/builders/cli/detect-status.d.ts +86 -0
  167. package/dist/providers/sdk/v1/builders/cli/parse-approval-squash.d.ts +59 -0
  168. package/dist/providers/sdk/v1/builders/cli/parse-approval.d.ts +65 -0
  169. package/dist/providers/sdk/v1/builders/cli/parse-session.d.ts +91 -0
  170. package/dist/providers/sdk/v1/builders/cli/visible-region.d.ts +42 -0
  171. package/dist/providers/sdk/v1/fixture-tooling/format.d.ts +126 -0
  172. package/dist/providers/sdk/v1/fixture-tooling/index.d.ts +8 -0
  173. package/dist/providers/sdk/v1/fixture-tooling/replay.d.ts +38 -0
  174. package/dist/providers/sdk/v1/index.d.ts +30 -0
  175. package/dist/providers/sdk/v1/sandbox/README-design.d.ts +193 -0
  176. package/dist/providers/sdk/v1/sandbox/require-whitelist.d.ts +74 -0
  177. package/dist/providers/sdk/v1/sandbox/script-runner.d.ts +98 -0
  178. package/dist/providers/sdk/v1/types/cli/index.d.ts +277 -0
  179. package/dist/providers/sdk/v1/types/common/index.d.ts +203 -0
  180. package/dist/providers/sdk/v1/validators/index.d.ts +5 -0
  181. package/dist/providers/sdk/v1/validators/manifest.d.ts +40 -0
  182. package/dist/providers/sdk/v1/validators/taint.d.ts +52 -0
  183. package/dist/providers/spec/adapter.d.ts +98 -0
  184. package/dist/providers/spec/cli-adapter.d.ts +223 -0
  185. package/dist/providers/spec/evaluator.d.ts +45 -0
  186. package/dist/providers/spec/fsm-driver.d.ts +449 -0
  187. package/dist/providers/spec/fsm-evaluator.d.ts +93 -0
  188. package/dist/providers/spec/fsm-loader.d.ts +14 -0
  189. package/dist/providers/spec/fsm-types.d.ts +202 -0
  190. package/dist/providers/spec/native-history-executor.d.ts +41 -0
  191. package/dist/providers/spec/pre-launch-trust.d.ts +16 -0
  192. package/dist/providers/spec/route.d.ts +4 -0
  193. package/dist/providers/spec/types.d.ts +244 -0
  194. package/dist/providers/status-monitor.d.ts +7 -7
  195. package/dist/providers/transcript-v2.d.ts +176 -0
  196. package/dist/providers/types/interactive-prompt.d.ts +84 -0
  197. package/dist/providers/working-dir.d.ts +17 -0
  198. package/dist/repo-mesh-types.d.ts +616 -12
  199. package/dist/runtime-defaults.d.ts +2 -0
  200. package/dist/session-host/managed-host.d.ts +64 -0
  201. package/dist/session-host/runtime-surface.d.ts +10 -16
  202. package/dist/sessions/registry.d.ts +26 -0
  203. package/dist/shared-types-extra.d.ts +2 -4
  204. package/dist/shared-types.d.ts +110 -55
  205. package/dist/status/chat-tail-hot-sessions.d.ts +40 -0
  206. package/dist/status/normalize.d.ts +1 -1
  207. package/dist/status/normalize.js +1 -0
  208. package/dist/status/normalize.js.map +1 -1
  209. package/dist/status/normalize.mjs +1 -0
  210. package/dist/status/normalize.mjs.map +1 -1
  211. package/dist/status/reporter.d.ts +2 -0
  212. package/dist/status/snapshot.d.ts +27 -0
  213. package/dist/system/hash.d.ts +8 -0
  214. package/dist/system/load-better-sqlite3.d.ts +21 -0
  215. package/dist/types.d.ts +20 -6
  216. package/package.json +11 -4
  217. package/src/agent-stream/poller.ts +2 -3
  218. package/src/agent-stream/provider-adapter.ts +1 -1
  219. package/src/boot/daemon-lifecycle.ts +80 -14
  220. package/src/boot/process-hardening.ts +89 -0
  221. package/src/build-info.ts +73 -0
  222. package/src/chat/source-machine.ts +534 -0
  223. package/src/chat/source-resolver.ts +0 -0
  224. package/src/chat/subscription-updates.ts +20 -1
  225. package/src/cli-adapter-types.d.ts +3 -1
  226. package/src/cli-adapter-types.ts +68 -2
  227. package/src/cli-adapters/cli-script-runner.ts +421 -0
  228. package/src/cli-adapters/cli-state-engine.ts +1282 -0
  229. package/src/cli-adapters/provider-cli-adapter.d.ts +1 -1
  230. package/src/cli-adapters/provider-cli-adapter.ts +1048 -1143
  231. package/src/cli-adapters/provider-cli-parse.d.ts +2 -0
  232. package/src/cli-adapters/provider-cli-parse.ts +19 -0
  233. package/src/cli-adapters/provider-cli-runtime.ts +56 -7
  234. package/src/cli-adapters/provider-cli-shared.d.ts +4 -0
  235. package/src/cli-adapters/provider-cli-shared.ts +121 -11
  236. package/src/cli-adapters/pty-transport.ts +2 -1
  237. package/src/cli-adapters/pty-write-chunking.ts +106 -0
  238. package/src/cli-adapters/raw-terminal-io.ts +252 -0
  239. package/src/cli-adapters/resolve-executable.ts +204 -0
  240. package/src/cli-adapters/session-host-transport.ts +2 -1
  241. package/src/cli-adapters/terminal-backends/ghostty-vt-backend.ts +63 -29
  242. package/src/cli-adapters/terminal-backends/types.ts +10 -3
  243. package/src/cli-adapters/terminal-screen.ts +16 -81
  244. package/src/commands/chat-commands-debug-bundle.ts +398 -0
  245. package/src/commands/chat-commands-read.ts +2788 -0
  246. package/src/commands/chat-commands-scope.ts +54 -0
  247. package/src/commands/chat-commands-shared.ts +114 -0
  248. package/src/commands/chat-commands-write.ts +891 -0
  249. package/src/commands/chat-commands.ts +19 -1841
  250. package/src/commands/cli-manager.d.ts +2 -0
  251. package/src/commands/cli-manager.ts +724 -27
  252. package/src/commands/handler.ts +865 -2
  253. package/src/commands/high-family/index.ts +28 -0
  254. package/src/commands/high-family/mesh-coordinator-launch.ts +696 -0
  255. package/src/commands/high-family/mesh-events.ts +102 -0
  256. package/src/commands/high-family/mesh-status.ts +857 -0
  257. package/src/commands/high-family/types.ts +80 -0
  258. package/src/commands/low-family/coordinator-prompt.ts +125 -0
  259. package/src/commands/low-family/daemon-lifecycle.ts +120 -0
  260. package/src/commands/low-family/diagnostics.ts +57 -0
  261. package/src/commands/low-family/index.ts +37 -0
  262. package/src/commands/low-family/mesh-ledger.ts +62 -0
  263. package/src/commands/low-family/mesh-node-logs.ts +87 -0
  264. package/src/commands/low-family/notification.ts +116 -0
  265. package/src/commands/low-family/refine-config.ts +106 -0
  266. package/src/commands/low-family/session-host.ts +282 -0
  267. package/src/commands/low-family/spec-providerdev.ts +217 -0
  268. package/src/commands/low-family/status-meta.ts +112 -0
  269. package/src/commands/low-family/types.ts +39 -0
  270. package/src/commands/med-family/cli-agent.ts +270 -0
  271. package/src/commands/med-family/fast-forward.ts +230 -0
  272. package/src/commands/med-family/ide.ts +163 -0
  273. package/src/commands/med-family/index.ts +37 -0
  274. package/src/commands/med-family/mesh-crud.ts +1268 -0
  275. package/src/commands/med-family/mesh-host-pairing.ts +234 -0
  276. package/src/commands/med-family/mesh-queue.ts +167 -0
  277. package/src/commands/med-family/mesh-restart.ts +92 -0
  278. package/src/commands/med-family/types.ts +153 -0
  279. package/src/commands/mesh-coordinator.ts +334 -124
  280. package/src/commands/router-aggregate-status.ts +209 -0
  281. package/src/commands/router-mesh-session-owner.ts +114 -0
  282. package/src/commands/router-refine.ts +1794 -0
  283. package/src/commands/router-worktree-cleanup.ts +870 -0
  284. package/src/commands/router.ts +567 -4149
  285. package/src/commands/stream-commands.ts +8 -0
  286. package/src/commands/upgrade-helper.ts +310 -45
  287. package/src/config/chat-history.ts +517 -24
  288. package/src/config/config.ts +30 -0
  289. package/src/config/mesh-config.ts +300 -24
  290. package/src/config/mesh-json-config.ts +376 -0
  291. package/src/config/recent-activity.ts +8 -2
  292. package/src/config/registry-resolver.ts +100 -0
  293. package/src/config/repo-settings.ts +111 -0
  294. package/src/config/state-store.ts +55 -0
  295. package/src/daemon/dev-auto-implement.ts +3 -2
  296. package/src/daemon/dev-cli-debug.ts +10 -1
  297. package/src/daemon/dev-server.ts +0 -541
  298. package/src/detection/cli-detector.ts +94 -9
  299. package/src/detection/ide-detector.ts +55 -16
  300. package/src/detection/win32-ide-version.ts +106 -0
  301. package/src/git/change-impact-config.ts +354 -0
  302. package/src/git/git-commands.ts +112 -16
  303. package/src/git/git-diff.ts +81 -11
  304. package/src/git/git-executor.ts +12 -0
  305. package/src/git/git-status.ts +822 -48
  306. package/src/git/git-types.ts +14 -62
  307. package/src/git/git-worktree.ts +261 -4
  308. package/src/git/index.ts +17 -0
  309. package/src/index.ts +190 -13
  310. package/src/installer.d.ts +1 -1
  311. package/src/installer.ts +8 -6
  312. package/src/ipc/local-ipc-server.ts +278 -0
  313. package/src/launch.d.ts +1 -1
  314. package/src/launch.ts +37 -28
  315. package/src/logging/async-batch-writer.ts +55 -0
  316. package/src/logging/command-log.ts +7 -5
  317. package/src/logging/debug-config.ts +25 -0
  318. package/src/logging/debug-trace.ts +7 -2
  319. package/src/logging/log-redactor.ts +100 -0
  320. package/src/logging/log-tail-reader.ts +341 -0
  321. package/src/logging/logger.ts +14 -7
  322. package/src/mesh/contracts.ts +510 -0
  323. package/src/mesh/coordinator-prompt.ts +627 -34
  324. package/src/mesh/coordinator-registry.ts +121 -0
  325. package/src/mesh/mesh-active-work.ts +706 -0
  326. package/src/mesh/mesh-clone-grace.ts +68 -0
  327. package/src/mesh/mesh-completion-synthesis.ts +416 -0
  328. package/src/mesh/mesh-coordinator-config.ts +97 -0
  329. package/src/mesh/mesh-delivery-policy.ts +284 -0
  330. package/src/mesh/mesh-event-classify.ts +78 -0
  331. package/src/mesh/mesh-event-forwarding.ts +2030 -0
  332. package/src/mesh/mesh-event-trace.ts +67 -0
  333. package/src/mesh/mesh-events-coordinator.ts +32 -0
  334. package/src/mesh/mesh-events-pending.ts +1548 -0
  335. package/src/mesh/mesh-events-stale.ts +452 -0
  336. package/src/mesh/mesh-events-utils.ts +443 -0
  337. package/src/mesh/mesh-events.ts +43 -1035
  338. package/src/mesh/mesh-fast-forward.ts +856 -0
  339. package/src/mesh/mesh-host-ownership.ts +41 -3
  340. package/src/mesh/mesh-init.ts +350 -0
  341. package/src/mesh/mesh-ledger-reconciliation.ts +12 -7
  342. package/src/mesh/mesh-ledger.ts +897 -102
  343. package/src/mesh/mesh-magi-status.ts +223 -0
  344. package/src/mesh/mesh-missions.ts +695 -0
  345. package/src/mesh/mesh-node-identity.ts +2065 -0
  346. package/src/mesh/mesh-queue-assignment.ts +2498 -0
  347. package/src/mesh/mesh-reconcile-acked-hold.ts +230 -0
  348. package/src/mesh/mesh-reconcile-config.ts +66 -0
  349. package/src/mesh/mesh-reconcile-identity.ts +103 -0
  350. package/src/mesh/mesh-reconcile-loop.ts +1696 -0
  351. package/src/mesh/mesh-reconcile-v2-backstop.ts +62 -0
  352. package/src/mesh/mesh-refine-batch.ts +205 -0
  353. package/src/mesh/mesh-refine-gates.ts +1792 -0
  354. package/src/mesh/mesh-refine-status.ts +231 -0
  355. package/src/mesh/mesh-remote-event-pull.ts +279 -0
  356. package/src/mesh/mesh-review-inbox.ts +308 -0
  357. package/src/mesh/mesh-routing.ts +291 -0
  358. package/src/mesh/mesh-runtime-store.ts +2292 -0
  359. package/src/mesh/mesh-scheduling-runtime.ts +198 -0
  360. package/src/mesh/mesh-task-inflight.ts +70 -0
  361. package/src/mesh/mesh-task-stats.ts +161 -0
  362. package/src/mesh/mesh-unresolved-forward-outbox.ts +215 -0
  363. package/src/mesh/mesh-warmup-deadline.ts +152 -0
  364. package/src/mesh/mesh-work-queue.ts +1489 -145
  365. package/src/mesh/preview-freshness.ts +163 -0
  366. package/src/mesh/refine-config.ts +129 -12
  367. package/src/mesh/worktree-bootstrap-config.ts +599 -0
  368. package/src/providers/acp-provider-instance.ts +43 -10
  369. package/src/providers/approval-utils.d.ts +5 -0
  370. package/src/providers/approval-utils.ts +100 -6
  371. package/src/providers/chat-message-normalization.ts +126 -4
  372. package/src/providers/cli-provider-effect-format.ts +53 -0
  373. package/src/providers/cli-provider-history-dedup.ts +75 -0
  374. package/src/providers/cli-provider-input-prompt.ts +133 -0
  375. package/src/providers/cli-provider-instance-types.ts +131 -0
  376. package/src/providers/cli-provider-instance.ts +2771 -499
  377. package/src/providers/cli-provider-status-helpers.ts +123 -0
  378. package/src/providers/cli-provider-transcript-merge.ts +114 -0
  379. package/src/providers/contracts.d.ts +55 -0
  380. package/src/providers/contracts.ts +207 -6
  381. package/src/providers/extension-provider-instance.ts +12 -7
  382. package/src/providers/external-sources.ts +218 -0
  383. package/src/providers/ide-provider-instance.ts +35 -12
  384. package/src/providers/manual-attendance.ts +105 -0
  385. package/src/providers/native-history/antigravity-claim-registry.ts +138 -0
  386. package/src/providers/native-history/antigravity-cli-transcript.ts +1275 -0
  387. package/src/providers/native-history/claude-cli-transcript.ts +396 -0
  388. package/src/providers/native-history/codex-cli-transcript.ts +479 -0
  389. package/src/providers/native-history/constants.ts +19 -0
  390. package/src/providers/native-history/dispatcher.ts +617 -0
  391. package/src/providers/native-history/hermes-cli-transcript.ts +312 -0
  392. package/src/providers/native-history/index.ts +30 -0
  393. package/src/providers/provider-instance-manager.ts +71 -0
  394. package/src/providers/provider-instance.ts +24 -1
  395. package/src/providers/provider-loader.ts +700 -55
  396. package/src/providers/provider-schema.ts +93 -14
  397. package/src/providers/provider-trust.ts +114 -0
  398. package/src/providers/read-chat-contract.ts +76 -16
  399. package/src/providers/sdk/README.md +49 -0
  400. package/src/providers/sdk/v1/builders/acp/detect-status.ts +144 -0
  401. package/src/providers/sdk/v1/builders/cli/detect-status.ts +313 -0
  402. package/src/providers/sdk/v1/builders/cli/parse-approval-squash.ts +158 -0
  403. package/src/providers/sdk/v1/builders/cli/parse-approval.ts +261 -0
  404. package/src/providers/sdk/v1/builders/cli/parse-session.ts +276 -0
  405. package/src/providers/sdk/v1/builders/cli/visible-region.ts +143 -0
  406. package/src/providers/sdk/v1/fixture-tooling/format.ts +130 -0
  407. package/src/providers/sdk/v1/fixture-tooling/index.ts +22 -0
  408. package/src/providers/sdk/v1/fixture-tooling/replay.ts +352 -0
  409. package/src/providers/sdk/v1/index.ts +152 -0
  410. package/src/providers/sdk/v1/sandbox/README-design.ts +195 -0
  411. package/src/providers/sdk/v1/sandbox/require-whitelist.ts +472 -0
  412. package/src/providers/sdk/v1/sandbox/script-runner.ts +150 -0
  413. package/src/providers/sdk/v1/schemas/cli/provider.schema.json +538 -0
  414. package/src/providers/sdk/v1/schemas/primitives/acp-session-protocol-v1.json +131 -0
  415. package/src/providers/sdk/v1/schemas/primitives/native-history-codex-rollout-v1.json +66 -0
  416. package/src/providers/sdk/v1/schemas/primitives/tui-approval-squash-v1.json +91 -0
  417. package/src/providers/sdk/v1/schemas/primitives/tui-assistant-block-v1.json +91 -0
  418. package/src/providers/sdk/v1/schemas/primitives/tui-cue-ordering-v1.json +47 -0
  419. package/src/providers/sdk/v1/schemas/primitives/tui-dispatch-order-v1.json +32 -0
  420. package/src/providers/sdk/v1/schemas/primitives/tui-footer-chrome-v1.json +42 -0
  421. package/src/providers/sdk/v1/schemas/primitives/tui-index-finder-v1.json +27 -0
  422. package/src/providers/sdk/v1/schemas/primitives/tui-modal-v1.json +125 -0
  423. package/src/providers/sdk/v1/schemas/primitives/tui-prompt-marker-v1.json +45 -0
  424. package/src/providers/sdk/v1/schemas/primitives/tui-session-id-extraction-v1.json +46 -0
  425. package/src/providers/sdk/v1/schemas/primitives/tui-settled-prompt-v1.json +71 -0
  426. package/src/providers/sdk/v1/schemas/primitives/tui-spinner-v1.json +83 -0
  427. package/src/providers/sdk/v1/schemas/primitives/tui-transcript-pty-v1.json +83 -0
  428. package/src/providers/sdk/v1/schemas/primitives/tui-visible-region-v1.json +57 -0
  429. package/src/providers/sdk/v1/schemas/primitives/tui-welcome-screen-v1.json +35 -0
  430. package/src/providers/sdk/v1/types/cli/index.ts +365 -0
  431. package/src/providers/sdk/v1/types/common/index.ts +229 -0
  432. package/src/providers/sdk/v1/validators/index.ts +19 -0
  433. package/src/providers/sdk/v1/validators/manifest.ts +110 -0
  434. package/src/providers/sdk/v1/validators/taint.ts +309 -0
  435. package/src/providers/spec/adapter.ts +246 -0
  436. package/src/providers/spec/cli-adapter.ts +1064 -0
  437. package/src/providers/spec/evaluator.ts +407 -0
  438. package/src/providers/spec/fsm-driver.ts +1528 -0
  439. package/src/providers/spec/fsm-evaluator.ts +290 -0
  440. package/src/providers/spec/fsm-loader.ts +128 -0
  441. package/src/providers/spec/fsm-types.ts +301 -0
  442. package/src/providers/spec/native-history-executor.ts +1241 -0
  443. package/src/providers/spec/pre-launch-trust.ts +104 -0
  444. package/src/providers/spec/route.ts +51 -0
  445. package/src/providers/spec/types.ts +284 -0
  446. package/src/providers/status-monitor.d.ts +7 -7
  447. package/src/providers/status-monitor.ts +37 -22
  448. package/src/providers/transcript-v2.ts +567 -0
  449. package/src/providers/types/interactive-prompt.ts +536 -0
  450. package/src/providers/version-archive.ts +64 -24
  451. package/src/providers/working-dir.ts +23 -0
  452. package/src/repo-mesh-types.ts +861 -14
  453. package/src/runtime-defaults.ts +39 -0
  454. package/src/session-host/managed-host.ts +218 -0
  455. package/src/session-host/runtime-surface.ts +20 -80
  456. package/src/sessions/registry.ts +44 -0
  457. package/src/shared-types-extra.ts +2 -4
  458. package/src/shared-types.d.ts +8 -0
  459. package/src/shared-types.ts +148 -55
  460. package/src/status/builders.ts +69 -6
  461. package/src/status/chat-tail-hot-sessions.ts +117 -2
  462. package/src/status/normalize.ts +2 -0
  463. package/src/status/reporter.ts +19 -1
  464. package/src/status/snapshot.ts +100 -27
  465. package/src/system/hash.ts +23 -0
  466. package/src/system/host-memory.ts +29 -12
  467. package/src/system/load-better-sqlite3.ts +68 -0
  468. package/src/types.ts +26 -6
  469. package/dist/cli-adapters/terminal-backends/xterm-backend.d.ts +0 -17
  470. package/dist/mesh/mesh-sync.d.ts +0 -53
  471. package/src/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +0 -16
  472. package/src/cli-adapters/terminal-backends/xterm-backend.ts +0 -97
  473. package/src/mesh/mesh-sync.ts +0 -111
@@ -0,0 +1,443 @@
1
+ import type { SessionRecoveryContext } from './mesh-ledger.js';
2
+
3
+ export function readNonEmptyString(value: unknown): string {
4
+ return typeof value === 'string' && value.trim() ? value.trim() : '';
5
+ }
6
+
7
+ export function readRecord(value: unknown): Record<string, unknown> | undefined {
8
+ return value && typeof value === 'object' && !Array.isArray(value)
9
+ ? value as Record<string, unknown>
10
+ : undefined;
11
+ }
12
+
13
+ /**
14
+ * The relay-safety metadata a worker session must carry so that its completion /
15
+ * generating events route back to the coordinator proactively (without waiting for
16
+ * a mesh_read_chat reconcile). meshCoordinatorDaemonId is the routing anchor the
17
+ * core forwarder (injectMeshSystemMessage) keys on to pick a remote coordinator
18
+ * target; meshNodeFor/meshNodeId identify the worker, and launchedByCoordinator is
19
+ * the delegation proof. See resolveWorkerDelegateRouting().
20
+ */
21
+ export interface MeshWorkerRelayStamp {
22
+ meshNodeFor?: string;
23
+ meshNodeId?: string;
24
+ meshCoordinatorDaemonId?: string;
25
+ // The ORIGINATING coordinator SESSION (not just its daemon). Carried so a worker's
26
+ // completion event can be routed back to the exact coordinator session that
27
+ // dispatched the work, even when several coordinator sessions share one daemon
28
+ // (the multi-coordinator misroute). Optional + absent on legacy dispatches, in
29
+ // which case routing falls back to the daemon-level anchor (current behaviour).
30
+ meshCoordinatorSessionId?: string;
31
+ launchedByCoordinator?: boolean;
32
+ }
33
+
34
+ /**
35
+ * Build the relay-safety stamp from a dispatch's meshContext, only including fields
36
+ * the session does not already carry. Returns undefined when there is nothing new to
37
+ * stamp, so callers can skip a no-op updateSettings() write.
38
+ *
39
+ * This closes the remote-session relay gap: a worker session reached by a dispatch
40
+ * that carries coordinatorDaemonId (mesh_send_task / queue assignment over P2P) gets
41
+ * the coordinator anchor persisted onto its settings at dispatch time, even if it was
42
+ * not launched via mesh_launch_session. Without the stamp the forwarder cannot resolve
43
+ * a remote coordinator and the completion event sits in the pending queue until a
44
+ * read_chat-triggered reconcile drains it.
45
+ */
46
+ export function buildMeshWorkerRelayStamp(
47
+ currentSettings: Record<string, unknown> | undefined,
48
+ meshContext: {
49
+ meshId?: unknown;
50
+ nodeId?: unknown;
51
+ coordinatorDaemonId?: unknown;
52
+ coordinatorSessionId?: unknown;
53
+ } | undefined,
54
+ ): MeshWorkerRelayStamp | undefined {
55
+ if (!meshContext) return undefined;
56
+ const settings = currentSettings && typeof currentSettings === 'object' ? currentSettings : {};
57
+ const stamp: MeshWorkerRelayStamp = {};
58
+
59
+ const meshId = readNonEmptyString(meshContext.meshId);
60
+ if (meshId && !readNonEmptyString(settings.meshNodeFor)) stamp.meshNodeFor = meshId;
61
+
62
+ const nodeId = readNonEmptyString(meshContext.nodeId);
63
+ if (nodeId && !readNonEmptyString(settings.meshNodeId)) stamp.meshNodeId = nodeId;
64
+
65
+ const coordinatorDaemonId = readNonEmptyString(meshContext.coordinatorDaemonId);
66
+ if (coordinatorDaemonId && !readNonEmptyString(settings.meshCoordinatorDaemonId)) {
67
+ stamp.meshCoordinatorDaemonId = coordinatorDaemonId;
68
+ }
69
+
70
+ // Session-level anchor (multi-coordinator routing): stamp the originating
71
+ // coordinator session id so the completion event can target the exact session.
72
+ // Carried over P2P to remote workers so a remote worker's echo returns it.
73
+ const coordinatorSessionId = readNonEmptyString(meshContext.coordinatorSessionId);
74
+ if (coordinatorSessionId && !readNonEmptyString(settings.meshCoordinatorSessionId)) {
75
+ stamp.meshCoordinatorSessionId = coordinatorSessionId;
76
+ }
77
+
78
+ // A dispatch from a coordinator is itself proof of delegation; stamp it when the
79
+ // session is being given any mesh routing context but has no marker yet.
80
+ if ((meshId || nodeId || coordinatorDaemonId || coordinatorSessionId) && settings.launchedByCoordinator !== true) {
81
+ stamp.launchedByCoordinator = true;
82
+ }
83
+
84
+ return Object.keys(stamp).length > 0 ? stamp : undefined;
85
+ }
86
+
87
+ export function resolveEventSessionId(event: Record<string, unknown>, fallback?: unknown): string {
88
+ return readNonEmptyString(event.targetSessionId)
89
+ || readNonEmptyString(event.sessionId)
90
+ || readNonEmptyString(event.instanceId)
91
+ || readNonEmptyString(fallback);
92
+ }
93
+
94
+ export function readRefineJobId(event: { metadataEvent?: Record<string, unknown> } | Record<string, unknown>): string {
95
+ const metadata = readRecord((event as any).metadataEvent) || event as Record<string, unknown>;
96
+ const result = readRecord(metadata.result);
97
+ const refineJob = readRecord(result?.refineJob);
98
+ return readNonEmptyString(metadata.jobId) || readNonEmptyString(refineJob?.jobId);
99
+ }
100
+
101
+ export function readWorkerResultMetadata(event: Record<string, unknown>): Record<string, unknown> | undefined {
102
+ return readRecord(event.workerResult) || readRecord(event.meshWorkerResult) || readRecord(event.structuredResult);
103
+ }
104
+
105
+ const MESH_SURFACED_PREVIEW_MAX_CHARS = 512;
106
+
107
+ // Cap for the worker final summary surfaced INLINE into the coordinator's chat
108
+ // (buildMeshSystemMessage). Larger than the mirror preview cap because this is the
109
+ // coordinator-facing payload that replaces a "go call mesh_read_chat" instruction —
110
+ // it should carry enough of the worker's result to act on without a second round-trip,
111
+ // while still bounding what is written into the coordinator PTY.
112
+ const MESH_COMPLETION_SURFACE_MAX_CHARS = 16000;
113
+
114
+ /**
115
+ * The worker's final assistant text carried on a completion event — read from
116
+ * `finalSummary` (and the `workerResult.summary` / `result.summary` fallbacks some
117
+ * paths use). Returns '' when the event carries no assistant text (lifecycle events
118
+ * without a summary). Shared by the coordinator chat surface (buildMeshSystemMessage)
119
+ * and the held-event ledger audit record so both read the summary the same way.
120
+ */
121
+ export function readMeshCompletionSummary(metadataEvent: Record<string, unknown>): string {
122
+ const workerResult = readWorkerResultMetadata(metadataEvent);
123
+ const resultRecord = readRecord(metadataEvent.result);
124
+ return readNonEmptyString(metadataEvent.finalSummary)
125
+ || readNonEmptyString(workerResult?.summary)
126
+ || readNonEmptyString(workerResult?.finalSummary)
127
+ || readNonEmptyString(resultRecord?.summary)
128
+ || readNonEmptyString(resultRecord?.finalSummary);
129
+ }
130
+
131
+ /**
132
+ * A coordinator that surfaces a REMOTE worker's mesh session has no local instance for
133
+ * it, so the status snapshot's getLastDisplayMessage has nothing to read and the only
134
+ * preview the coordinator-mirrored copy could ever carry comes from the worker's
135
+ * completion event. The worker's latest assistant reply rides on that event as
136
+ * `finalSummary` (and as `workerResult.summary` / `result.summary` on some paths).
137
+ *
138
+ * This resolves that assistant text into a preview the coordinator can stamp onto its
139
+ * mirror entry so the mobile inbox shows the worker's latest assistant response instead
140
+ * of being stuck on the first dispatched user task (which is the only message the
141
+ * coordinator-side transcript ever holds). Returns undefined when the event carries no
142
+ * assistant text — non-completion lifecycle events (generating_started / ready without a
143
+ * summary) must NOT clobber a previously surfaced preview.
144
+ */
145
+ function truncateSurfacedPreview(text: string): string {
146
+ const truncationSuffix = '...[truncated]';
147
+ return text.length > MESH_SURFACED_PREVIEW_MAX_CHARS
148
+ ? `${text.slice(0, MESH_SURFACED_PREVIEW_MAX_CHARS - truncationSuffix.length)}${truncationSuffix}`
149
+ : text;
150
+ }
151
+
152
+ export function resolveMeshSurfacedSessionPreview(
153
+ metadataEvent: Record<string, unknown>,
154
+ ): { preview: string; role: 'assistant'; receivedAt: number } | undefined {
155
+ // 1) Completion summary — the worker's final assistant text rides a completion event
156
+ // as finalSummary / workerResult.summary / result.summary.
157
+ const summaryText = readMeshCompletionSummary(metadataEvent);
158
+ if (summaryText) {
159
+ return {
160
+ preview: truncateSurfacedPreview(summaryText),
161
+ role: 'assistant',
162
+ receivedAt: readEventTimestampValue(metadataEvent.timestamp),
163
+ };
164
+ }
165
+ // 2) Status-snapshot fallback — a completion that carried NO summary (and any later
166
+ // status-sync event) still ships the worker's latest display message on the event as
167
+ // lastMessagePreview/lastMessageRole/lastMessageAt (computed by getLastDisplayMessage
168
+ // on the worker, attached in injectMeshSystemMessage and carried over the relay).
169
+ // Surface it ONLY when it is an assistant reply: a user-role last message means the
170
+ // turn is still mid-flight (the dispatched task is the only message), and surfacing it
171
+ // would both re-introduce the "inbox stuck on the user task" bug and clobber a
172
+ // previously surfaced assistant preview. The web inbox guard renders only an
173
+ // assistant-role preview anyway, so a user-role one would be inert there.
174
+ const lastPreview = readNonEmptyString(metadataEvent.lastMessagePreview);
175
+ const lastRole = readNonEmptyString(metadataEvent.lastMessageRole);
176
+ if (lastPreview && lastRole === 'assistant') {
177
+ return {
178
+ preview: truncateSurfacedPreview(lastPreview),
179
+ role: 'assistant',
180
+ receivedAt: readEventTimestampValue(metadataEvent.lastMessageAt)
181
+ || readEventTimestampValue(metadataEvent.timestamp),
182
+ };
183
+ }
184
+ return undefined;
185
+ }
186
+
187
+ function readEventTimestampValue(value: unknown): number {
188
+ if (typeof value === 'number' && Number.isFinite(value)) return value;
189
+ if (typeof value === 'string' && value.trim()) {
190
+ const parsed = Number(value);
191
+ if (Number.isFinite(parsed)) return parsed;
192
+ const dateMs = Date.parse(value);
193
+ if (Number.isFinite(dateMs)) return dateMs;
194
+ }
195
+ return 0;
196
+ }
197
+
198
+ // The completionDiagnostic "false idle" clause, extracted from the five inline copies
199
+ // it used to be duplicated into (the ledger / metadata weak checks and isFalseIdleCompletion).
200
+ // True when the worker FSM dropped to idle WITHOUT a confirmed final assistant message for
201
+ // the turn — a finalization timeout or a "scheduled fallback" idle. cli-provider-instance
202
+ // emits this as completionDiagnostic.blockReason='missing_final_assistant' /
203
+ // finalAssistantPresent=false. The diagnostic lives at the same `completionDiagnostic` field
204
+ // on both a ledger terminal payload and a live metadata event, so one helper serves both.
205
+ export function isMissingFinalAssistantDiagnostic(record: Record<string, unknown> | undefined): boolean {
206
+ const diag = readRecord(record?.completionDiagnostic);
207
+ return diag?.finalAssistantPresent === false || diag?.blockReason === 'missing_final_assistant';
208
+ }
209
+
210
+ // A false-idle completion: the provider dropped to idle WITHOUT a confirmed final assistant
211
+ // message (the completionDiagnostic missing-final-assistant signal). This is a strict SUBSET
212
+ // of weak-completion evidence — it DELIBERATELY ignores evidenceLevel/reviewRecommended,
213
+ // because isGenuineCompletionEvidence (coordinator) gates the truncated-terminal supersession
214
+ // on the false-idle distinction alone. Folding evidenceLevel/reviewRecommended in here would
215
+ // change that genuine-completion judgement, so keep this narrow.
216
+ export function isFalseIdleCompletion(record: Record<string, unknown>): boolean {
217
+ return isMissingFinalAssistantDiagnostic(record);
218
+ }
219
+
220
+ // A completion whose evidence is WEAK: the worker FSM reached idle but the turn's final
221
+ // assistant message was never confirmed (missing_final_assistant / finalAssistantPresent=false),
222
+ // or the event self-declares insufficient/weak evidence, or a review is recommended. The single
223
+ // source of truth that the live metadata path (mesh-events-pending fingerprint, this module's
224
+ // system-message builder) AND the ledger-terminal paths (mesh-events-coordinator supersession,
225
+ // mesh-events-stale reconcile) all share — the same evidenceLevel / reviewRecommended /
226
+ // completionDiagnostic fields appear on a terminal ledger payload and on a live metadata event.
227
+ //
228
+ // cli-provider-instance emits this on the CANON-C decoupled-immediate path and on a forced
229
+ // finalization timeout, and the structural approval-resolution gate (FALSEIDLE-a) can also let
230
+ // an unconfirmed approval→idle through. Such a completion is NOT trustworthy terminal evidence:
231
+ // a later genuine completion (live path) or a transcript reconcile (fallback path) may supersede
232
+ // it, and the coordinator surfaces a verify hint before declaring the task done.
233
+ //
234
+ // NOTE: this intentionally treats evidenceLevel 'weak' as weak — the ledger variants used to
235
+ // omit it, so a producer emitting 'weak' would have had its weak terminal misjudged as
236
+ // authoritative (genuine completion could no longer supersede it). Applying it uniformly here
237
+ // seals that latent divergence.
238
+ export function isWeakCompletionEvidence(record: Record<string, unknown> | undefined): boolean {
239
+ if (!record) return false;
240
+ const evidenceLevel = readNonEmptyString(record.evidenceLevel);
241
+ if (evidenceLevel === 'insufficient' || evidenceLevel === 'weak') return true;
242
+ if (record.reviewRecommended === true) return true;
243
+ return isMissingFinalAssistantDiagnostic(record);
244
+ }
245
+
246
+ // Back-compat alias for the live metadata-event call sites (system-message builder below,
247
+ // pending-event fingerprint). Identical to isWeakCompletionEvidence; kept as a named export so
248
+ // the metadata-flavoured call sites read naturally.
249
+ export function isWeakCompletionMetadata(metadataEvent: Record<string, unknown>): boolean {
250
+ return isWeakCompletionEvidence(metadataEvent);
251
+ }
252
+
253
+ function formatCompletionMetadata(event: Record<string, unknown>): string {
254
+ const completionDiagnostic = event.completionDiagnostic && typeof event.completionDiagnostic === 'object'
255
+ ? event.completionDiagnostic as Record<string, unknown>
256
+ : null;
257
+ const diagnosticReason = completionDiagnostic
258
+ ? readNonEmptyString(completionDiagnostic.blockReason) || 'present'
259
+ : '';
260
+ const finalAssistantPresent = typeof completionDiagnostic?.finalAssistantPresent === 'boolean'
261
+ ? String(completionDiagnostic.finalAssistantPresent)
262
+ : '';
263
+ const evidenceLevel = readNonEmptyString(event.evidenceLevel);
264
+ const parts = [
265
+ readNonEmptyString(event.targetSessionId) ? `session_id=${readNonEmptyString(event.targetSessionId)}` : '',
266
+ readNonEmptyString(event.providerType) ? `provider=${readNonEmptyString(event.providerType)}` : '',
267
+ readNonEmptyString(event.providerSessionId) ? `provider_session_id=${readNonEmptyString(event.providerSessionId)}` : '',
268
+ diagnosticReason ? `completion_diagnostic=${diagnosticReason}` : '',
269
+ finalAssistantPresent ? `final_assistant=${finalAssistantPresent}` : '',
270
+ evidenceLevel && evidenceLevel !== 'sufficient' ? `evidence_level=${evidenceLevel}` : '',
271
+ ].filter(Boolean);
272
+ return parts.length > 0 ? ` (${parts.join('; ')})` : '';
273
+ }
274
+
275
+ export function buildMeshSystemMessage(args: {
276
+ event: string;
277
+ nodeLabel: string;
278
+ metadataEvent: Record<string, unknown>;
279
+ recoveryContext?: SessionRecoveryContext | null;
280
+ /**
281
+ * BOOTSTRAP-MSG: true when a queued task targeting this freshly-bootstrapped
282
+ * worktree node is pending/assigned and will be (or has just been) auto-claimed
283
+ * by the post-bootstrap queue re-fire. When set, the worktree_bootstrap_complete
284
+ * message drops the misleading "use mesh_launch_session" advice (which would
285
+ * spawn a DUPLICATE session alongside the auto-claimed one) and tells the
286
+ * coordinator the queue will handle it. Absent/false → no targeted task → keep
287
+ * the manual-launch advice. The caller computes this from the work queue; the
288
+ * builder stays pure so both branches are unit-testable via this flag.
289
+ */
290
+ worktreeHasQueuedTask?: boolean;
291
+ }): string {
292
+ const metadata = formatCompletionMetadata(args.metadataEvent);
293
+ if (args.event === 'agent:generating_completed') {
294
+ if (args.metadataEvent.source === 'no_progress_reconciliation') {
295
+ return `[System] ${args.nodeLabel} already has completion evidence${metadata}. The no-progress monitor reconciled the terminal handoff and marked the session complete; wait for the queued completion event/status refresh before doing any manual transcript check.`;
296
+ }
297
+ const reviewRecommended = args.metadataEvent.reviewRecommended === true;
298
+ // FALSEIDLE-b: a weak completion (missing final assistant / finalAssistantPresent=false /
299
+ // insufficient evidence) is not trustworthy terminal evidence even when reviewRecommended
300
+ // is not set. Append an explicit verify hint so the coordinator does not declare the task
301
+ // done off a false idle. Only the weak case is affected — a genuine completion (final
302
+ // assistant confirmed, no weak diagnostic) carries no extra note and is unchanged.
303
+ const weakCompletion = isWeakCompletionMetadata(args.metadataEvent);
304
+ const verifyTextNote = ' Completion evidence is weak — verify via mesh_read_chat or git status before declaring the task done; the worker may still be parked on an approval/modal.';
305
+ // Auto-surface the worker's final summary directly into the coordinator chat so it
306
+ // does not have to call mesh_read_chat just to see the result. The summary IS the
307
+ // worker's final assistant message; embedding it here replaces the previous
308
+ // "go call mesh_read_chat" instruction with the answer itself. This rides the
309
+ // existing (non-modal) coordinator delivery channel — it does not write into a
310
+ // parked harness modal. Falls back to the read_chat instruction only when the event
311
+ // genuinely carries no summary (so behaviour is unchanged for summary-less events).
312
+ const completionSummary = readMeshCompletionSummary(args.metadataEvent);
313
+ if (completionSummary) {
314
+ const truncationSuffix = '\n…[truncated — call mesh_read_chat once for the full transcript]';
315
+ const surfaced = completionSummary.length > MESH_COMPLETION_SURFACE_MAX_CHARS
316
+ ? `${completionSummary.slice(0, MESH_COMPLETION_SURFACE_MAX_CHARS - truncationSuffix.length)}${truncationSuffix}`
317
+ : completionSummary;
318
+ const verifyNote = reviewRecommended
319
+ ? ' Completion evidence is insufficient — verify via git status or provider_session_id before assuming the task is done.'
320
+ : (weakCompletion ? verifyTextNote : '');
321
+ return `[System] ${args.nodeLabel} has completed its task and is now idle${metadata}. Its final summary is included below — read it directly and only call mesh_read_chat if you need the full transcript.${verifyNote}\n\n--- ${args.nodeLabel} final summary ---\n${surfaced}`;
322
+ }
323
+ const reviewNote = reviewRecommended
324
+ ? ' Completion evidence is insufficient — verify via git status or provider_session_id before assuming the task is done. Use mesh_read_chat once if needed, but do not poll repeatedly.'
325
+ : (weakCompletion
326
+ ? `${verifyTextNote} Use mesh_read_chat once if needed, but do not poll repeatedly.`
327
+ : ' Use mesh_read_chat once to review its final progress, but do not poll repeatedly.');
328
+ return `[System] ${args.nodeLabel} has completed its task and is now idle${metadata}. This completion came from the agent status event path;${reviewNote}`;
329
+ }
330
+ if (args.event === 'agent:waiting_approval') {
331
+ return `[System] ${args.nodeLabel} is waiting for approval to proceed${metadata}. You may use mesh_read_chat and mesh_approve to handle it.`;
332
+ }
333
+ if (args.event === 'agent:stopped') {
334
+ const rc = args.recoveryContext;
335
+ if (rc && rc.consecutiveNodeFailures > 0) {
336
+ const parts = [
337
+ `[System] ${args.nodeLabel} has stopped unexpectedly${metadata}.`,
338
+ `\n\n**Recovery Context:**`,
339
+ `- Consecutive failures on this node: ${rc.consecutiveNodeFailures}`,
340
+ rc.taskAttemptCount > 0 ? `- This task has been attempted ${rc.taskAttemptCount} time(s)` : '',
341
+ `- Recommendation: ${rc.advice}`,
342
+ ];
343
+ if (rc.retryRecommended && rc.lastTaskMessage) {
344
+ parts.push(
345
+ `\n\n**Original task to retry:**`,
346
+ `> ${rc.lastTaskMessage.length > 300 ? rc.lastTaskMessage.slice(0, 300) + '...' : rc.lastTaskMessage}`,
347
+ `\nTo retry: call \`mesh_launch_session\` for this node, then \`mesh_send_task\` with the original task.`,
348
+ );
349
+ } else if (!rc.retryRecommended) {
350
+ parts.push(
351
+ `\nDo NOT retry on this node. Consider reassigning to a different node or asking the user for guidance.`,
352
+ );
353
+ }
354
+ return parts.filter(Boolean).join('\n');
355
+ }
356
+ return `[System] ${args.nodeLabel} has stopped${metadata}. Use mesh_read_chat once if you need to inspect its last output.`;
357
+ }
358
+ if (args.event === 'monitor:no_progress') {
359
+ return `[System] ${args.nodeLabel} is still reported as generating after a long interval${metadata}. Wait for pendingCoordinatorEvents or a completion/status event; if the user explicitly asks for status, make one bounded status check and then wait again.`;
360
+ }
361
+ if (args.event === 'worktree_bootstrap_complete') {
362
+ const worktreePath = readNonEmptyString(args.metadataEvent.worktreePath);
363
+ const durationMs = typeof args.metadataEvent.durationMs === 'number' ? args.metadataEvent.durationMs : undefined;
364
+ const prefix = `[System] ${args.nodeLabel} worktree bootstrap completed${worktreePath ? ` at ${worktreePath}` : ''}${durationMs !== undefined ? ` in ${Math.round(durationMs / 1000)}s` : ''}.`;
365
+ // BOOTSTRAP-MSG: a task already targeting this node is auto-claimed by the
366
+ // post-bootstrap queue re-fire (see mesh-event-forwarding worktree_bootstrap_complete
367
+ // handler). Advising mesh_launch_session here would spawn a duplicate session.
368
+ if (args.worktreeHasQueuedTask) {
369
+ return `${prefix} The worktree is ready; a queued task targeting this node will auto-claim it — no manual \`mesh_launch_session\` needed.`;
370
+ }
371
+ return `${prefix} The worktree is ready — use \`mesh_launch_session\` to start an agent.`;
372
+ }
373
+ if (args.event === 'worktree_bootstrap_failed') {
374
+ const error = readNonEmptyString(args.metadataEvent.error);
375
+ return `[System] ${args.nodeLabel} worktree bootstrap failed${error ? `: ${error}` : '.'}. Use \`mesh_retry_node_bootstrap\` to retry or inspect the node state.`;
376
+ }
377
+ if (args.event === 'refine:accepted') {
378
+ const jobId = readRefineJobId({ metadataEvent: args.metadataEvent });
379
+ return `[System] Refinery accepted async job${jobId ? ` ${jobId}` : ''} for ${args.nodeLabel}. Completion/failure will be delivered as a terminal refine event; do not poll repeatedly.`;
380
+ }
381
+ if (args.event === 'refine:completed') {
382
+ const jobId = readRefineJobId({ metadataEvent: args.metadataEvent });
383
+ const result = readRecord(args.metadataEvent.result);
384
+ const validationSummary = readRecord(result?.validationSummary);
385
+ const patchEquivalence = readRecord(result?.patchEquivalence);
386
+ const finalConvergence = readRecord(result?.finalBranchConvergenceState);
387
+ const validationStatus = readNonEmptyString(validationSummary?.status);
388
+ const patchStatus = readNonEmptyString(patchEquivalence?.status)
389
+ || (patchEquivalence?.equivalent === true ? 'passed' : '');
390
+ const into = readNonEmptyString(result?.into);
391
+ const branch = readNonEmptyString(result?.branch);
392
+ const mergeStatus = result?.merged === true ? 'merged' : readNonEmptyString(finalConvergence?.status);
393
+ const convergenceStatus = readNonEmptyString(finalConvergence?.status);
394
+ const nextStep = readNonEmptyString(result?.nextStep)
395
+ || readNonEmptyString(finalConvergence?.nextStep)
396
+ || 'Continue from the updated mesh state.';
397
+ const details = [
398
+ jobId ? `job_id=${jobId}` : '',
399
+ branch && into ? `${branch}→${into}` : '',
400
+ validationStatus ? `validation=${validationStatus}` : '',
401
+ patchStatus ? `patch_equivalence=${patchStatus}` : '',
402
+ mergeStatus ? `merge=${mergeStatus}` : '',
403
+ convergenceStatus ? `final_convergence=${convergenceStatus}` : '',
404
+ ].filter(Boolean).join('; ');
405
+ return `[System] Refinery async job for ${args.nodeLabel} completed successfully${details ? ` (${details})` : ''}.\nNext step: ${nextStep}`;
406
+ }
407
+ if (args.event === 'refine:failed') {
408
+ const jobId = readRefineJobId({ metadataEvent: args.metadataEvent });
409
+ const result = readRecord(args.metadataEvent.result);
410
+ const validationSummary = readRecord(result?.validationSummary);
411
+ const patchEquivalence = readRecord(result?.patchEquivalence);
412
+ const finalConvergence = readRecord(result?.finalBranchConvergenceState);
413
+ const code = readNonEmptyString(result?.code);
414
+ const error = readNonEmptyString(result?.error);
415
+ const validationStatus = readNonEmptyString(validationSummary?.status);
416
+ const patchStatus = readNonEmptyString(patchEquivalence?.status)
417
+ || (patchEquivalence?.equivalent === true ? 'passed' : '');
418
+ const mergeStatus = result?.merged === true
419
+ ? 'merged'
420
+ : finalConvergence?.merged === false
421
+ ? 'not_merged'
422
+ : '';
423
+ const convergenceStatus = readNonEmptyString(result?.convergenceStatus)
424
+ || readNonEmptyString(finalConvergence?.status);
425
+ const blockedReason = readNonEmptyString(result?.blockedReason);
426
+ const nextStep = readNonEmptyString(result?.nextStep) || readNonEmptyString(finalConvergence?.nextStep);
427
+ const details = [
428
+ jobId ? `job_id=${jobId}` : '',
429
+ code ? `code=${code}` : '',
430
+ validationStatus ? `validation=${validationStatus}` : '',
431
+ patchStatus ? `patch_equivalence=${patchStatus}` : '',
432
+ mergeStatus ? `merge=${mergeStatus}` : '',
433
+ convergenceStatus ? `convergence=${convergenceStatus}` : '',
434
+ blockedReason ? `reason=${blockedReason}` : '',
435
+ ].filter(Boolean).join('; ');
436
+ const parts = [
437
+ `[System] Refinery async job for ${args.nodeLabel} failed${details ? ` (${details})` : ''}${error ? `: ${error}` : '.'}`,
438
+ nextStep ? `Next step: ${nextStep}` : 'Review the terminal refine event/ledger before retrying.',
439
+ ];
440
+ return parts.join('\n');
441
+ }
442
+ return '';
443
+ }