@adhdev/daemon-core 0.9.82-rc.48 → 0.9.82-rc.481

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 +126 -64
  11. package/dist/cli-adapters/provider-cli-parse.d.ts +5 -0
  12. package/dist/cli-adapters/provider-cli-runtime.d.ts +34 -0
  13. package/dist/cli-adapters/provider-cli-shared.d.ts +74 -0
  14. package/dist/cli-adapters/pty-write-chunking.d.ts +34 -0
  15. package/dist/cli-adapters/raw-terminal-io.d.ts +37 -0
  16. package/dist/cli-adapters/resolve-executable.d.ts +69 -0
  17. package/dist/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +6 -3
  18. package/dist/cli-adapters/terminal-backends/types.d.ts +10 -2
  19. package/dist/cli-adapters/terminal-screen.d.ts +4 -11
  20. package/dist/commands/chat-commands-debug-bundle.d.ts +14 -0
  21. package/dist/commands/chat-commands-read.d.ts +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 +51 -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 +137 -0
  58. package/dist/commands/router-worktree-cleanup.d.ts +133 -0
  59. package/dist/commands/router.d.ts +204 -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 +136 -1
  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 +57 -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 +73 -17
  81. package/dist/index.js +52979 -18657
  82. package/dist/index.js.map +1 -1
  83. package/dist/index.mjs +59496 -25355
  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 +230 -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 +49 -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 +246 -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 +29 -0
  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 +158 -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 +80 -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 +428 -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 +508 -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 +30 -0
  134. package/dist/mesh/mesh-warmup-deadline.d.ts +68 -0
  135. package/dist/mesh/mesh-work-queue.d.ts +363 -5
  136. package/dist/mesh/preview-freshness.d.ts +28 -0
  137. package/dist/mesh/refine-config.d.ts +216 -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 +406 -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 +149 -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 +29 -0
  161. package/dist/providers/provider-instance.d.ts +30 -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 +629 -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 +98 -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 +26 -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 +5 -0
  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 +954 -1144
  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 +2767 -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 +659 -27
  252. package/src/commands/handler.ts +845 -2
  253. package/src/commands/high-family/index.ts +28 -0
  254. package/src/commands/high-family/mesh-coordinator-launch.ts +680 -0
  255. package/src/commands/high-family/mesh-events.ts +102 -0
  256. package/src/commands/high-family/mesh-status.ts +849 -0
  257. package/src/commands/high-family/types.ts +80 -0
  258. package/src/commands/low-family/coordinator-prompt.ts +72 -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 +241 -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 +1287 -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 +1711 -0
  283. package/src/commands/router-worktree-cleanup.ts +870 -0
  284. package/src/commands/router.ts +795 -4143
  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 +632 -23
  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 +767 -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 +213 -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 +469 -0
  323. package/src/mesh/coordinator-prompt.ts +572 -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 +2002 -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 +1494 -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 +111 -0
  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 +898 -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 +2263 -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 +1473 -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 +1686 -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 +2150 -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 +185 -0
  363. package/src/mesh/mesh-warmup-deadline.ts +152 -0
  364. package/src/mesh/mesh-work-queue.ts +1437 -147
  365. package/src/mesh/preview-freshness.ts +163 -0
  366. package/src/mesh/refine-config.ts +423 -0
  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 +2709 -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 +160 -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 +87 -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 +509 -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 +868 -13
  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 +136 -55
  460. package/src/status/builders.ts +26 -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 +95 -26
  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 +5 -0
  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,230 @@
1
+ // ---------------------------------------------------------------------------
2
+ // mesh-reconcile-acked-hold — in-flight acked-hold state (persistence + tuning)
3
+ // ---------------------------------------------------------------------------
4
+ // Pure move out of mesh-reconcile-loop.ts (no behavior change). This is the
5
+ // read-through/write-through cache over the mesh_inflight_hold table plus the
6
+ // env-tunable timers (death deadline, transcript fast-track grace) that govern
7
+ // when an acked dispatch's indefinite synth hold is released. See the R4f and
8
+ // ACKED-HOLD-IDLE-OVERTRUST design commentary inline.
9
+ // ---------------------------------------------------------------------------
10
+
11
+ import { LOG } from '../logging/logger.js';
12
+ import { MeshRuntimeStore } from './mesh-runtime-store.js';
13
+ import { readNonEmptyString } from './mesh-events-utils.js';
14
+
15
+ // R4f backstop (a): how many CONSECUTIVE read_chat failures (transport error / success:false /
16
+ // no payload) for an acked task are treated as a death signal that releases the indefinite hold.
17
+ // A single failed read is a transient probe blip; a session that genuinely died reads-fail every
18
+ // tick, so a small streak distinguishes the two without racing a live-but-slow worker.
19
+ export const ACKED_DEATH_CONSECUTIVE_READ_FAILURES = 3;
20
+
21
+ // R4f backstop (b): the absolute death-deadline. An acked task is held indefinitely until this much
22
+ // time has elapsed since its generating_started ack (dispatch.updatedAt); past it, a persistently
23
+ // idle session is synthesized as a notification-loss net. This is set FAR above any observed emit
24
+ // latency (R4e's worst case was ~16s) so it does NOT race a normal slow turn — it only catches a
25
+ // genuinely wedged worker or a permanently-lost emit. Read at call time so tests can tune it.
26
+ export function resolveTunedReconcileMs(envName: string, def: number, min: number, max: number): number {
27
+ const raw = readNonEmptyString(process.env[envName]);
28
+ if (raw) {
29
+ const parsed = Number.parseInt(raw, 10);
30
+ if (Number.isFinite(parsed) && parsed >= min && parsed <= max) return parsed;
31
+ }
32
+ return def;
33
+ }
34
+ export function resolveAckedDeathDeadlineMs(): number {
35
+ // Default 8 min — FAR above the variable emit latency the finite R4..R4e timers raced (R4e's
36
+ // worst case was ~16s); by the time this fires a live worker would long since have emitted its
37
+ // real terminal. The env-override floor is 0 so tests can force the deadline (production never
38
+ // sets it that low); the ceiling is 60min so a mis-set env cannot disable the loss-net forever.
39
+ return resolveTunedReconcileMs('MESH_INFLIGHT_ACKED_DEATH_DEADLINE_MS', 8 * 60_000, 0, 60 * 60_000);
40
+ }
41
+
42
+ // ACKED-HOLD-IDLE-OVERTRUST (transcript-completion fast-track). The indefinite acked-hold above is
43
+ // safe but SLOW: when the worker's real generating_completed emit is dropped/lost, the only thing
44
+ // that promotes the missing completion is the 8-min death backstop — even though the answer has been
45
+ // FULLY rendered in the transcript for minutes (read_chat reports idle WITH a final visible assistant
46
+ // message every ~4s). Observed live: completions surfaced 144s / 492s late, both incompatible with the
47
+ // provider's own emit ceiling (COMPLETED_FINALIZATION_MAX_WAIT_MS 30s + NATIVE_HISTORY_MESH_IDLE_SETTLE
48
+ // 4s ≈ 34s). That gap = a worker that finished, whose PTY generating→idle edge / real emit was lost,
49
+ // held hostage to the 8-min net.
50
+ //
51
+ // Fast-track: when an acked task reads idle AND a final visible assistant message is present (the same
52
+ // transcript-completion evidence PHASE 4 already requires to synth), and that idle-with-final-assistant
53
+ // state has PERSISTED for a short continuous grace, promote the synth EARLY — ahead of the 8-min
54
+ // backstop. The grace is the correctness gate: a SINGLE idle read could be a mid-turn blip (PTY
55
+ // inter-tool-call settle, or final text rendered while the next tool call is about to start), so we
56
+ // require the idle-with-final-assistant signal to hold continuously for the grace window before
57
+ // trusting it as a genuine turn-end. Any non-idle read (generating / waiting_approval), a read
58
+ // failure, or the disappearance of the final assistant message RESETS the streak — so an actively
59
+ // streaming worker that momentarily reads idle never crosses the grace.
60
+ //
61
+ // Safety: this only changes WHEN an acked synth fires (earlier), never WHETHER it is correct —
62
+ // reconcileDirectDispatchCompletionFromTranscript's hasTerminalLedgerAfterDispatch makes a real
63
+ // emit that lands later an idempotent no-op, exactly as the death-backstop synth relies on. The
64
+ // death backstop (8 min) is PRESERVED unchanged as the final net; the fast-track is a faster path in
65
+ // front of it. The grace is set ABOVE the provider's own emit ceiling (~34s) so a worker still inside
66
+ // its normal finalization window is never pre-empted — we only fast-track once enough continuous idle
67
+ // has elapsed that a live emit would already have arrived.
68
+ export function resolveAckedTranscriptFastTrackGraceMs(): number {
69
+ // Default 40s — above the provider emit ceiling (30s COMPLETED_FINALIZATION_MAX_WAIT_MS + 4s
70
+ // NATIVE_HISTORY_MESH_IDLE_SETTLE ≈ 34s): a genuinely-live worker would have emitted its real
71
+ // terminal within that window, so 40s of CONTINUOUS idle-with-final-assistant means the emit was
72
+ // lost, not late. Far below the 8-min death backstop, so the fast-track is the dominant path for a
73
+ // lost emit while the backstop remains the last-resort net. Floor 0 lets tests force an immediate
74
+ // fast-track; ceiling 5min keeps a mis-set env from collapsing it into the death backstop.
75
+ return resolveTunedReconcileMs('MESH_INFLIGHT_ACKED_TRANSCRIPT_FASTTRACK_GRACE_MS', 40_000, 0, 5 * 60_000);
76
+ }
77
+
78
+ // Per-task in-flight hold state for an acked dispatch:
79
+ // - liveConfirmedSinceAck: we have seen at least one conclusive read (idle OR generating) since
80
+ // the ack — proves the session is reachable, so a later read FAILURE is a genuine liveness loss
81
+ // rather than a node that was never reachable.
82
+ // - consecutiveReadFailures: streak of inconclusive read_chat results (death backstop (a)).
83
+ // - transcriptIdleSinceMs: the timestamp of the FIRST tick in the current continuous run of
84
+ // idle-with-final-assistant reads (ACKED-HOLD-IDLE-OVERTRUST fast-track). Cleared to undefined
85
+ // whenever the signal breaks (non-idle read, read failure, or no final assistant message), so a
86
+ // mid-turn idle blip never accumulates grace. When `now - transcriptIdleSinceMs` exceeds the
87
+ // fast-track grace the synth is promoted ahead of the death backstop.
88
+ export interface AckedHoldState {
89
+ liveConfirmedSinceAck: boolean;
90
+ consecutiveReadFailures: number;
91
+ transcriptIdleSinceMs?: number;
92
+ }
93
+
94
+ // T2 (B2b): acked-hold state persistence. The Map below is a process-local CACHE;
95
+ // the SSOT is the mesh_inflight_hold table in MeshRuntimeStore. Every read goes
96
+ // read-through (Map miss → load from store, then cache), every mutation goes
97
+ // write-through (Map set → store upsert; Map delete → store delete). On daemon
98
+ // boot the reconcile loop rehydrates the Map from the store per-mesh the first
99
+ // time it touches that mesh (rehydrateAckedHoldsForMesh), so a hold established
100
+ // before a restart survives it — closing the duplicate-emit / drop window the
101
+ // PHASE-4 transcript synth backstop otherwise had to correct after the fact.
102
+ //
103
+ // Store row ↔ AckedHoldState mapping:
104
+ // hold_reason 'live'|'unconfirmed' ↔ liveConfirmedSinceAck (boolean)
105
+ // read_failure_count ↔ consecutiveReadFailures
106
+ // first_idle_since_ack ↔ transcriptIdleSinceMs (undefined ⇒ NULL)
107
+ // mesh_id = the owning mesh (for listByMesh / prune)
108
+ // held_at = ms the hold was first created (store-managed)
109
+ export const inFlightAckedHoldState = new Map<string, AckedHoldState>();
110
+ // Meshes whose store rows have already been rehydrated into the Map this process.
111
+ // A restart resets this set, so the first touch of each mesh reloads from disk.
112
+ const rehydratedHoldMeshes = new Set<string>();
113
+
114
+ export function inFlightSynthKey(meshId: string, taskId: string): string {
115
+ return `${meshId}::${taskId}`;
116
+ }
117
+
118
+ // Extract the taskId back out of a `${meshId}::${taskId}` synth key. The meshId
119
+ // prefix can itself contain '::' only if the caller passed one (mesh ids are
120
+ // config-derived and never do), so split on the FIRST '::' and treat the remainder
121
+ // as the taskId.
122
+ function taskIdFromSynthKey(meshId: string, synthKey: string): string {
123
+ const prefix = `${meshId}::`;
124
+ return synthKey.startsWith(prefix) ? synthKey.slice(prefix.length) : synthKey;
125
+ }
126
+
127
+ function holdStore(): MeshRuntimeStore | undefined {
128
+ try { return MeshRuntimeStore.getInstance(); } catch { return undefined; }
129
+ }
130
+
131
+ // Read-through: Map hit returns the cached state; a miss consults the store and,
132
+ // when a row exists, hydrates the Map from it before returning. A store failure
133
+ // degrades to Map-only (returns undefined on a miss) — identical to the pre-T2
134
+ // in-memory behavior, never worse.
135
+ export function getHoldState(synthKey: string, meshId: string): AckedHoldState | undefined {
136
+ const cached = inFlightAckedHoldState.get(synthKey);
137
+ if (cached) return cached;
138
+ const store = holdStore();
139
+ if (!store) return undefined;
140
+ let row;
141
+ try { row = store.getInflightHold(taskIdFromSynthKey(meshId, synthKey)); } catch { return undefined; }
142
+ if (!row) return undefined;
143
+ const state: AckedHoldState = {
144
+ liveConfirmedSinceAck: row.holdReason === 'live',
145
+ consecutiveReadFailures: row.readFailureCount ?? 0,
146
+ ...(row.firstIdleSinceAck !== null && row.firstIdleSinceAck !== undefined
147
+ ? { transcriptIdleSinceMs: row.firstIdleSinceAck }
148
+ : {}),
149
+ };
150
+ inFlightAckedHoldState.set(synthKey, state);
151
+ return state;
152
+ }
153
+
154
+ // Write-through: update the Map cache AND the store row. A store failure leaves the
155
+ // Map authoritative for this process (degrade, never crash the tick).
156
+ export function setHoldState(synthKey: string, meshId: string, state: AckedHoldState): void {
157
+ inFlightAckedHoldState.set(synthKey, state);
158
+ const store = holdStore();
159
+ if (!store) return;
160
+ try {
161
+ store.upsertInflightHold({
162
+ taskId: taskIdFromSynthKey(meshId, synthKey),
163
+ meshId,
164
+ holdReason: state.liveConfirmedSinceAck ? 'live' : 'unconfirmed',
165
+ firstIdleSinceAck: state.transcriptIdleSinceMs ?? null,
166
+ readFailureCount: state.consecutiveReadFailures,
167
+ });
168
+ } catch { /* degrade to Map-only */ }
169
+ }
170
+
171
+ // Write-through delete: drop the Map entry AND the store row.
172
+ export function deleteHoldState(synthKey: string, meshId: string): void {
173
+ inFlightAckedHoldState.delete(synthKey);
174
+ const store = holdStore();
175
+ if (!store) return;
176
+ try { store.deleteInflightHold(taskIdFromSynthKey(meshId, synthKey)); } catch { /* degrade */ }
177
+ }
178
+
179
+ // Restart rehydration: on the first touch of a mesh this process, pull its persisted
180
+ // acked-hold rows from the store into the Map cache so a hold that outlived a daemon
181
+ // restart is honored again. Idempotent per process via rehydratedHoldMeshes. A store
182
+ // failure just skips rehydration (Map starts empty for the mesh — pre-T2 behavior).
183
+ export function rehydrateAckedHoldsForMesh(meshId: string): void {
184
+ if (rehydratedHoldMeshes.has(meshId)) return;
185
+ rehydratedHoldMeshes.add(meshId);
186
+ const store = holdStore();
187
+ if (!store) return;
188
+ let rows;
189
+ try { rows = store.listInflightHoldsByMesh(meshId); } catch { return; }
190
+ for (const row of rows) {
191
+ const synthKey = inFlightSynthKey(meshId, row.taskId);
192
+ if (inFlightAckedHoldState.has(synthKey)) continue; // a live tick already set fresher state
193
+ inFlightAckedHoldState.set(synthKey, {
194
+ liveConfirmedSinceAck: row.holdReason === 'live',
195
+ consecutiveReadFailures: row.readFailureCount ?? 0,
196
+ ...(row.firstIdleSinceAck !== null && row.firstIdleSinceAck !== undefined
197
+ ? { transcriptIdleSinceMs: row.firstIdleSinceAck }
198
+ : {}),
199
+ });
200
+ }
201
+ if (rows.length > 0) {
202
+ LOG.info('MeshReconcile', `Rehydrated ${rows.length} persisted acked-hold row(s) for mesh ${meshId} after (re)start`);
203
+ }
204
+ }
205
+
206
+ // Collect the union of held synth keys for a mesh — the Map cache entries plus every
207
+ // persisted store row — so the PHASE-4 prune can drop a hold that exists ONLY on disk
208
+ // (not yet cached). A store failure degrades to the Map-only key set (never throws).
209
+ export function collectHeldSynthKeysForMesh(meshId: string): Set<string> {
210
+ const heldKeys = new Set<string>();
211
+ for (const key of inFlightAckedHoldState.keys()) {
212
+ if (key.startsWith(`${meshId}::`)) heldKeys.add(key);
213
+ }
214
+ const store = holdStore();
215
+ if (store) {
216
+ try {
217
+ for (const row of store.listInflightHoldsByMesh(meshId)) {
218
+ heldKeys.add(inFlightSynthKey(meshId, row.taskId));
219
+ }
220
+ } catch { /* degrade — prune only what's in the Map */ }
221
+ }
222
+ return heldKeys;
223
+ }
224
+
225
+ // Test hook: clear the in-flight acked-hold state between cases (both the Map cache
226
+ // and the per-mesh rehydrate guard, so each case starts from a clean read-through).
227
+ export function __resetReconcileInFlightSynthDebounceForTests(): void {
228
+ inFlightAckedHoldState.clear();
229
+ rehydratedHoldMeshes.clear();
230
+ }
@@ -0,0 +1,66 @@
1
+ // ---------------------------------------------------------------------------
2
+ // mesh-reconcile-config — reconcile-loop timing tunables + env resolvers
3
+ // ---------------------------------------------------------------------------
4
+ // Extracted from mesh-reconcile-loop.ts (A-3 god-module decomposition, pure move,
5
+ // no behavior change). Holds the loop-cadence tunables and their env-override
6
+ // resolvers. Each resolver reads MESH_*_MS from the environment and clamps the
7
+ // value so a mis-set env cannot make the loop pathological. Single-consumer
8
+ // deadline constants that live next to their sole reader (e.g.
9
+ // ASSIGNED_STRANDED_DEADLINE_MS, STRICT_SESSION_MATCH_TTL_MS) intentionally stay
10
+ // in mesh-reconcile-loop.ts — only the shared loop-cadence tunables move here.
11
+ // ---------------------------------------------------------------------------
12
+
13
+ import { readNonEmptyString } from './mesh-events-utils.js';
14
+ import { resolveTunedReconcileMs } from './mesh-reconcile-acked-hold.js';
15
+
16
+ // Default reconcile cadence. approval/completion notifications to a live CLI
17
+ // coordinator land within at most one interval. Overridable via env for tuning.
18
+ export const DEFAULT_RECONCILE_INTERVAL_MS = 4_000;
19
+
20
+ // PHASE 5 (auto-prune) conservative age gate. A direct dispatch whose node/session is
21
+ // orphaned (no longer in the live mesh) is only auto-pruned once it is at least this old,
22
+ // measured from its dispatch time. This protects against a node/session that is only
23
+ // *transiently* invisible (a momentary probe failure, a daemon restart) being pruned the
24
+ // instant it disappears. The MANUAL prune (mesh_prune_stale_direct) has no age gate — an
25
+ // operator pruning explicitly wants the orphan gone now. Overridable via env for tuning.
26
+ export const DEFAULT_AUTO_PRUNE_MIN_AGE_MS = 24 * 60 * 60_000; // 24h
27
+
28
+ export function resolveAutoPruneMinAgeMs(): number {
29
+ const raw = readNonEmptyString(process.env.MESH_AUTO_PRUNE_MIN_AGE_MS);
30
+ if (raw) {
31
+ const parsed = Number.parseInt(raw, 10);
32
+ // Clamp to [1h, 30d] so a mis-set env can't make the gate pathologically aggressive
33
+ // (prune the moment something blinks) or effectively disable it forever.
34
+ if (Number.isFinite(parsed) && parsed >= 60 * 60_000 && parsed <= 30 * 24 * 60 * 60_000) return parsed;
35
+ }
36
+ return DEFAULT_AUTO_PRUNE_MIN_AGE_MS;
37
+ }
38
+
39
+ // PTY-OVERTRUST-DRAIN (Defect B, fix B). Age-based escape for the
40
+ // `generating_no_idle_coordinator` hold. Fix A makes the drain predicate read the RAW
41
+ // adapter (mask-stripped), so the common mask-driven false-busy is gone. But a hold can
42
+ // still arise from a genuine status-source desync that fix A does not reach (e.g. the
43
+ // adapter raw itself momentarily reads generating while the coordinator is actually at a
44
+ // turn end). This is a TIME-BASED BACKSTOP: when a mesh's pending terminal events have
45
+ // been held this long, re-confirm the coordinator's RAW adapter idle on the tick and, if
46
+ // it is genuinely idle, drain ONCE. It NEVER injects into a genuinely-generating PTY —
47
+ // the re-confirmation gates on raw adapter idle, so the intentional removal of
48
+ // force-inject-into-generating (data-loss) is preserved. Default 12s = 3 reconcile ticks
49
+ // at the 4s cadence: long enough that a normal mid-turn settle is not pre-empted, short
50
+ // enough that a desync-stranded completion is not held for minutes. Env-tunable.
51
+ export const DEFAULT_PENDING_HELD_DRAIN_ESCALATE_MS = 12_000;
52
+
53
+ export function resolvePendingHeldDrainEscalateMs(): number {
54
+ // Floor 4s (one tick) so a mis-set env cannot make the escape race a normal settle;
55
+ // ceiling 5min so it cannot be disabled into a permanent strand.
56
+ return resolveTunedReconcileMs('MESH_PENDING_HELD_DRAIN_ESCALATE_MS', DEFAULT_PENDING_HELD_DRAIN_ESCALATE_MS, 4_000, 5 * 60_000);
57
+ }
58
+
59
+ export function resolveReconcileIntervalMs(): number {
60
+ const raw = readNonEmptyString(process.env.MESH_RECONCILE_INTERVAL_MS);
61
+ if (raw) {
62
+ const parsed = Number.parseInt(raw, 10);
63
+ if (Number.isFinite(parsed) && parsed >= 1_000 && parsed <= 60_000) return parsed;
64
+ }
65
+ return DEFAULT_RECONCILE_INTERVAL_MS;
66
+ }
@@ -0,0 +1,103 @@
1
+ // ---------------------------------------------------------------------------
2
+ // mesh-reconcile-identity — daemon-id / self-identity resolution for the reconcile loop
3
+ // ---------------------------------------------------------------------------
4
+ // Pure move out of mesh-reconcile-loop.ts (no behavior change). This is the single
5
+ // source of truth for "which id-forms does THIS daemon answer to?" across both the
6
+ // coordinator-daemon drain scope and the per-mesh host gate / remote pull filter.
7
+ // ---------------------------------------------------------------------------
8
+
9
+ import type { DaemonComponents } from '../boot/daemon-lifecycle.js';
10
+ import type { LocalMeshEntry } from '../repo-mesh-types.js';
11
+ import { loadConfig } from '../config/config.js';
12
+ import { expandDaemonIdForms, daemonIdsEquivalent } from '@adhdev/mesh-shared';
13
+ import { readNonEmptyString } from './mesh-events-utils.js';
14
+
15
+ // The set of coordinator-daemon ids THIS daemon answers to when draining the
16
+ // pending-events queue. A unicast completion event is stamped with the worker's
17
+ // meshCoordinatorDaemonId, which can be either:
18
+ // - the daemon's canonical status id (`standalone_<machineId>` / `daemon_<machineId>`),
19
+ // stamped by the MCP layer via ctx.localDaemonId (= getStatus().status.instanceId), or
20
+ // - the bare machineId, stamped by the local queue-assignment path (loadConfig().machineId).
21
+ // - the config-form node daemonId (`daemon_<machineId>`), which the MCP layer's
22
+ // resolveCoordinatorDaemonId prefers and stamps onto direct-dispatch workers.
23
+ // Draining with only one of these silently misses events stamped with the other —
24
+ // the exact reason a generating coordinator never self-received local completions,
25
+ // and the base-node completion-surface bug (base completions land full-form
26
+ // `daemon_<machineId>` while a coordinator that only knows itself as bare
27
+ // `<machineId>` never matches them). We expand to EVERY equivalent form so the
28
+ // scope match (host gate, self-node detection, and the drain IN-filter downstream)
29
+ // succeeds regardless of which path stamped the event.
30
+ export function resolveCoordinatorDaemonIds(components: DaemonComponents): string[] {
31
+ const statusInstanceId = readNonEmptyString((components as { statusInstanceId?: string }).statusInstanceId);
32
+ const machineId = readNonEmptyString(loadConfig().machineId);
33
+ return expandDaemonIdForms([statusInstanceId, machineId]);
34
+ }
35
+
36
+ // Whether THIS daemon is the coordinator/host for a mesh — i.e. the daemon that
37
+ // owns coordinator ownership and must collect every worker node's completion
38
+ // events into its local queue. This is true regardless of whether a *live CLI*
39
+ // coordinator session currently exists: the coordinator is frequently a pure
40
+ // stdio MCP LLM (no live CLI session to inject into), and that LLM only sees the
41
+ // queue when it next calls a mesh tool. For it to see remote worker completions
42
+ // at all, the daemon must have already pulled them into the local queue on the
43
+ // timer — which is exactly what this predicate gates.
44
+ //
45
+ // Rule: this daemon hosts the mesh when meshHost.role is 'host' (the default for
46
+ // standalone-compat meshes with no host metadata) AND, when a hostDaemonId is
47
+ // pinned, it resolves to one of this daemon's ids. Member-only daemons return
48
+ // false — their own queue is pulled BY the host, not the other way around.
49
+ //
50
+ // `daemonIds` here is the EXPANDED self-identity set (runtime drain ids ∪ this
51
+ // daemon's mesh-config node id forms) — see resolveCoordinatorSelfIds. The
52
+ // pinned hostDaemonId is itself a config-form id and frequently does NOT equal a
53
+ // runtime id (bare machineId / status id), so gating on the runtime ids alone
54
+ // would wrongly classify the real host as a non-host and skip the remote pull
55
+ // entirely.
56
+ export function daemonHostsMesh(mesh: LocalMeshEntry, daemonIds: string[]): boolean {
57
+ const host = mesh.meshHost;
58
+ // No metadata → default host (standalone compatibility, see createDefaultMeshHostMetadata).
59
+ if (!host) return true;
60
+ if (host.role && host.role !== 'host') return false;
61
+ const hostDaemonId = readNonEmptyString(host.hostDaemonId);
62
+ // Host role but no pinned hostDaemonId → treat as host (single-daemon / legacy).
63
+ if (!hostDaemonId) return true;
64
+ return daemonIdListIncludes(daemonIds, hostDaemonId);
65
+ }
66
+
67
+ export function daemonIdListIncludes(ids: readonly string[], id: string | undefined): boolean {
68
+ if (!id) return false;
69
+ return ids.some(candidate => candidate === id || daemonIdsEquivalent(candidate, id));
70
+ }
71
+
72
+ // Resolve EVERY id-form this daemon answers to FOR A GIVEN MESH: the runtime drain
73
+ // ids (status id + bare machineId) unioned with this daemon's mesh-config identity
74
+ // forms — the self node's daemonId/machineId (the node whose daemonId/machineId
75
+ // matches a runtime id) and the pinned meshHost.hostDaemonId WHEN it is provably
76
+ // ours. This is the single source of truth for "is this id me?" across both the
77
+ // host gate and the remote pull filter; the worker's meshCoordinatorDaemonId stamp
78
+ // is guaranteed to be one of these forms (it comes from resolveCoordinatorDaemonId,
79
+ // which prefers the coordinator node's config-form daemonId over the runtime status id).
80
+ export function resolveCoordinatorSelfIds(mesh: LocalMeshEntry, drainDaemonIds: string[]): string[] {
81
+ const ids = new Set<string>(drainDaemonIds);
82
+ // Expand with the config-form id(s) of the self node — the mesh node whose
83
+ // daemonId/machineId matches a runtime id. Its config-form daemonId is exactly
84
+ // what resolveCoordinatorNode()→resolveCoordinatorDaemonId() stamps onto a worker.
85
+ for (const node of mesh.nodes) {
86
+ const nodeDaemonId = readNonEmptyString(node.daemonId);
87
+ const nodeMachineId = readNonEmptyString(node.machineId);
88
+ const isSelf = (nodeDaemonId && daemonIdListIncludes(drainDaemonIds, nodeDaemonId))
89
+ || (nodeMachineId && daemonIdListIncludes(drainDaemonIds, nodeMachineId));
90
+ if (!isSelf) continue;
91
+ if (nodeDaemonId) ids.add(nodeDaemonId);
92
+ if (nodeMachineId) ids.add(nodeMachineId);
93
+ }
94
+ // The pinned host id is included ONLY when it is provably one of THIS daemon's ids
95
+ // (it already matches a runtime id or a resolved self-node id). A hostDaemonId that
96
+ // names a DIFFERENT daemon must NOT be claimed — that would make a member-only
97
+ // daemon believe it is the host and pull queues it does not own. Having a node on
98
+ // this daemon does not make this daemon the host; daemonHostsMesh still honours a
99
+ // foreign hostDaemonId and rejects ownership.
100
+ const hostDaemonId = readNonEmptyString(mesh.meshHost?.hostDaemonId);
101
+ if (hostDaemonId && daemonIdListIncludes([...ids], hostDaemonId)) ids.add(hostDaemonId);
102
+ return [...ids];
103
+ }