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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (429) hide show
  1. package/dist/boot/daemon-lifecycle.d.ts +9 -0
  2. package/dist/boot/process-hardening.d.ts +50 -0
  3. package/dist/build-info.d.ts +37 -0
  4. package/dist/chat/source-machine.d.ts +166 -0
  5. package/dist/chat/source-resolver.d.ts +104 -0
  6. package/dist/chat/subscription-updates.d.ts +1 -0
  7. package/dist/cli-adapter-types.d.ts +68 -2
  8. package/dist/cli-adapters/cli-script-runner.d.ts +117 -0
  9. package/dist/cli-adapters/cli-state-engine.d.ts +200 -0
  10. package/dist/cli-adapters/provider-cli-adapter.d.ts +126 -64
  11. package/dist/cli-adapters/provider-cli-parse.d.ts +5 -0
  12. package/dist/cli-adapters/provider-cli-runtime.d.ts +34 -0
  13. package/dist/cli-adapters/provider-cli-shared.d.ts +74 -0
  14. package/dist/cli-adapters/pty-write-chunking.d.ts +34 -0
  15. package/dist/cli-adapters/raw-terminal-io.d.ts +37 -0
  16. package/dist/cli-adapters/resolve-executable.d.ts +69 -0
  17. package/dist/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +6 -3
  18. package/dist/cli-adapters/terminal-backends/types.d.ts +10 -2
  19. package/dist/cli-adapters/terminal-screen.d.ts +4 -11
  20. package/dist/commands/chat-commands-debug-bundle.d.ts +14 -0
  21. package/dist/commands/chat-commands-read.d.ts +7 -0
  22. package/dist/commands/chat-commands-scope.d.ts +39 -0
  23. package/dist/commands/chat-commands-shared.d.ts +33 -0
  24. package/dist/commands/chat-commands-write.d.ts +14 -0
  25. package/dist/commands/chat-commands.d.ts +10 -23
  26. package/dist/commands/cli-manager.d.ts +25 -1
  27. package/dist/commands/handler.d.ts +125 -0
  28. package/dist/commands/high-family/index.d.ts +3 -0
  29. package/dist/commands/high-family/mesh-coordinator-launch.d.ts +2 -0
  30. package/dist/commands/high-family/mesh-events.d.ts +2 -0
  31. package/dist/commands/high-family/mesh-status.d.ts +2 -0
  32. package/dist/commands/high-family/types.d.ts +64 -0
  33. package/dist/commands/low-family/coordinator-prompt.d.ts +9 -0
  34. package/dist/commands/low-family/daemon-lifecycle.d.ts +2 -0
  35. package/dist/commands/low-family/diagnostics.d.ts +2 -0
  36. package/dist/commands/low-family/index.d.ts +3 -0
  37. package/dist/commands/low-family/mesh-ledger.d.ts +10 -0
  38. package/dist/commands/low-family/mesh-node-logs.d.ts +2 -0
  39. package/dist/commands/low-family/notification.d.ts +2 -0
  40. package/dist/commands/low-family/refine-config.d.ts +2 -0
  41. package/dist/commands/low-family/session-host.d.ts +2 -0
  42. package/dist/commands/low-family/spec-providerdev.d.ts +11 -0
  43. package/dist/commands/low-family/status-meta.d.ts +2 -0
  44. package/dist/commands/low-family/types.d.ts +33 -0
  45. package/dist/commands/med-family/cli-agent.d.ts +2 -0
  46. package/dist/commands/med-family/fast-forward.d.ts +2 -0
  47. package/dist/commands/med-family/ide.d.ts +10 -0
  48. package/dist/commands/med-family/index.d.ts +3 -0
  49. package/dist/commands/med-family/mesh-crud.d.ts +29 -0
  50. package/dist/commands/med-family/mesh-host-pairing.d.ts +2 -0
  51. package/dist/commands/med-family/mesh-queue.d.ts +2 -0
  52. package/dist/commands/med-family/mesh-restart.d.ts +2 -0
  53. package/dist/commands/med-family/types.d.ts +152 -0
  54. package/dist/commands/mesh-coordinator.d.ts +85 -1
  55. package/dist/commands/router.d.ts +279 -2
  56. package/dist/commands/upgrade-helper.d.ts +41 -1
  57. package/dist/config/chat-history.d.ts +9 -0
  58. package/dist/config/config.d.ts +5 -0
  59. package/dist/config/mesh-config.d.ts +129 -1
  60. package/dist/config/mesh-json-config.d.ts +199 -0
  61. package/dist/config/repo-settings.d.ts +77 -0
  62. package/dist/daemon/dev-server.d.ts +0 -2
  63. package/dist/detection/ide-detector.d.ts +13 -0
  64. package/dist/detection/win32-ide-version.d.ts +37 -0
  65. package/dist/git/change-impact-config.d.ts +159 -0
  66. package/dist/git/git-commands.d.ts +12 -1
  67. package/dist/git/git-diff.d.ts +6 -0
  68. package/dist/git/git-executor.d.ts +11 -0
  69. package/dist/git/git-status.d.ts +57 -0
  70. package/dist/git/git-types.d.ts +2 -50
  71. package/dist/git/git-worktree.d.ts +71 -1
  72. package/dist/git/index.d.ts +3 -1
  73. package/dist/index.d.ts +66 -14
  74. package/dist/index.js +49753 -18414
  75. package/dist/index.js.map +1 -1
  76. package/dist/index.mjs +49614 -18438
  77. package/dist/index.mjs.map +1 -1
  78. package/dist/installer.d.ts +1 -4
  79. package/dist/ipc/local-ipc-server.d.ts +91 -0
  80. package/dist/launch.d.ts +1 -1
  81. package/dist/logging/async-batch-writer.d.ts +10 -0
  82. package/dist/logging/log-redactor.d.ts +24 -0
  83. package/dist/logging/log-tail-reader.d.ts +81 -0
  84. package/dist/logging/logger.d.ts +1 -1
  85. package/dist/mesh/contracts.d.ts +164 -0
  86. package/dist/mesh/coordinator-prompt.d.ts +89 -0
  87. package/dist/mesh/coordinator-registry.d.ts +59 -0
  88. package/dist/mesh/mesh-active-work.d.ts +174 -0
  89. package/dist/mesh/mesh-clone-grace.d.ts +8 -0
  90. package/dist/mesh/mesh-coordinator-config.d.ts +21 -0
  91. package/dist/mesh/mesh-delivery-policy.d.ts +131 -0
  92. package/dist/mesh/mesh-event-classify.d.ts +5 -0
  93. package/dist/mesh/mesh-event-forwarding.d.ts +41 -0
  94. package/dist/mesh/mesh-event-trace.d.ts +21 -0
  95. package/dist/mesh/mesh-events-coordinator.d.ts +4 -0
  96. package/dist/mesh/mesh-events-pending.d.ts +69 -0
  97. package/dist/mesh/mesh-events-stale.d.ts +61 -0
  98. package/dist/mesh/mesh-events-utils.d.ts +75 -0
  99. package/dist/mesh/mesh-events.d.ts +6 -49
  100. package/dist/mesh/mesh-fast-forward.d.ts +81 -0
  101. package/dist/mesh/mesh-host-ownership.d.ts +29 -0
  102. package/dist/mesh/mesh-init.d.ts +128 -0
  103. package/dist/mesh/mesh-ledger-reconciliation.d.ts +23 -4
  104. package/dist/mesh/mesh-ledger.d.ts +115 -1
  105. package/dist/mesh/mesh-magi-status.d.ts +63 -0
  106. package/dist/mesh/mesh-missions.d.ts +189 -0
  107. package/dist/mesh/mesh-node-identity.d.ts +306 -0
  108. package/dist/mesh/mesh-queue-assignment.d.ts +113 -0
  109. package/dist/mesh/mesh-reconcile-loop.d.ts +79 -0
  110. package/dist/mesh/mesh-refine-batch.d.ts +68 -0
  111. package/dist/mesh/mesh-refine-gates.d.ts +428 -0
  112. package/dist/mesh/mesh-refine-status.d.ts +62 -0
  113. package/dist/mesh/mesh-review-inbox.d.ts +90 -0
  114. package/dist/mesh/mesh-routing.d.ts +70 -0
  115. package/dist/mesh/mesh-runtime-store.d.ts +450 -0
  116. package/dist/mesh/mesh-scheduling-runtime.d.ts +78 -0
  117. package/dist/mesh/mesh-task-inflight.d.ts +46 -0
  118. package/dist/mesh/mesh-task-stats.d.ts +49 -0
  119. package/dist/mesh/mesh-unresolved-forward-outbox.d.ts +30 -0
  120. package/dist/mesh/mesh-warmup-deadline.d.ts +68 -0
  121. package/dist/mesh/mesh-work-queue.d.ts +300 -5
  122. package/dist/mesh/preview-freshness.d.ts +18 -0
  123. package/dist/mesh/refine-config.d.ts +216 -0
  124. package/dist/mesh/worktree-bootstrap-config.d.ts +145 -0
  125. package/dist/providers/acp-provider-instance.d.ts +5 -0
  126. package/dist/providers/approval-utils.d.ts +20 -0
  127. package/dist/providers/chat-message-normalization.d.ts +32 -1
  128. package/dist/providers/cli-provider-instance.d.ts +254 -3
  129. package/dist/providers/contracts.d.ts +149 -6
  130. package/dist/providers/external-sources.d.ts +71 -0
  131. package/dist/providers/manual-attendance.d.ts +63 -0
  132. package/dist/providers/native-history/antigravity-cli-transcript.d.ts +126 -0
  133. package/dist/providers/native-history/claude-cli-transcript.d.ts +70 -0
  134. package/dist/providers/native-history/codex-cli-transcript.d.ts +73 -0
  135. package/dist/providers/native-history/constants.d.ts +12 -0
  136. package/dist/providers/native-history/dispatcher.d.ts +27 -0
  137. package/dist/providers/native-history/hermes-cli-transcript.d.ts +30 -0
  138. package/dist/providers/native-history/index.d.ts +13 -0
  139. package/dist/providers/provider-instance-manager.d.ts +29 -0
  140. package/dist/providers/provider-instance.d.ts +23 -1
  141. package/dist/providers/provider-loader.d.ts +26 -4
  142. package/dist/providers/provider-trust.d.ts +31 -0
  143. package/dist/providers/read-chat-contract.d.ts +29 -0
  144. package/dist/providers/sdk/v1/builders/acp/detect-status.d.ts +68 -0
  145. package/dist/providers/sdk/v1/builders/cli/detect-status.d.ts +86 -0
  146. package/dist/providers/sdk/v1/builders/cli/parse-approval-squash.d.ts +59 -0
  147. package/dist/providers/sdk/v1/builders/cli/parse-approval.d.ts +65 -0
  148. package/dist/providers/sdk/v1/builders/cli/parse-session.d.ts +91 -0
  149. package/dist/providers/sdk/v1/builders/cli/visible-region.d.ts +42 -0
  150. package/dist/providers/sdk/v1/fixture-tooling/format.d.ts +126 -0
  151. package/dist/providers/sdk/v1/fixture-tooling/index.d.ts +8 -0
  152. package/dist/providers/sdk/v1/fixture-tooling/replay.d.ts +38 -0
  153. package/dist/providers/sdk/v1/index.d.ts +30 -0
  154. package/dist/providers/sdk/v1/sandbox/README-design.d.ts +193 -0
  155. package/dist/providers/sdk/v1/sandbox/require-whitelist.d.ts +74 -0
  156. package/dist/providers/sdk/v1/sandbox/script-runner.d.ts +98 -0
  157. package/dist/providers/sdk/v1/types/cli/index.d.ts +277 -0
  158. package/dist/providers/sdk/v1/types/common/index.d.ts +203 -0
  159. package/dist/providers/sdk/v1/validators/index.d.ts +5 -0
  160. package/dist/providers/sdk/v1/validators/manifest.d.ts +40 -0
  161. package/dist/providers/sdk/v1/validators/taint.d.ts +52 -0
  162. package/dist/providers/spec/adapter.d.ts +98 -0
  163. package/dist/providers/spec/cli-adapter.d.ts +223 -0
  164. package/dist/providers/spec/evaluator.d.ts +45 -0
  165. package/dist/providers/spec/fsm-driver.d.ts +444 -0
  166. package/dist/providers/spec/fsm-evaluator.d.ts +93 -0
  167. package/dist/providers/spec/fsm-loader.d.ts +14 -0
  168. package/dist/providers/spec/fsm-types.d.ts +202 -0
  169. package/dist/providers/spec/native-history-executor.d.ts +41 -0
  170. package/dist/providers/spec/pre-launch-trust.d.ts +16 -0
  171. package/dist/providers/spec/route.d.ts +4 -0
  172. package/dist/providers/spec/types.d.ts +222 -0
  173. package/dist/providers/status-monitor.d.ts +7 -7
  174. package/dist/providers/transcript-v2.d.ts +176 -0
  175. package/dist/providers/types/interactive-prompt.d.ts +84 -0
  176. package/dist/providers/working-dir.d.ts +17 -0
  177. package/dist/repo-mesh-types.d.ts +519 -13
  178. package/dist/runtime-defaults.d.ts +2 -0
  179. package/dist/session-host/managed-host.d.ts +64 -0
  180. package/dist/session-host/runtime-surface.d.ts +10 -16
  181. package/dist/sessions/registry.d.ts +6 -0
  182. package/dist/shared-types-extra.d.ts +2 -4
  183. package/dist/shared-types.d.ts +86 -55
  184. package/dist/status/normalize.d.ts +1 -1
  185. package/dist/status/normalize.js +1 -0
  186. package/dist/status/normalize.js.map +1 -1
  187. package/dist/status/normalize.mjs +1 -0
  188. package/dist/status/normalize.mjs.map +1 -1
  189. package/dist/status/reporter.d.ts +2 -0
  190. package/dist/status/snapshot.d.ts +26 -0
  191. package/dist/system/hash.d.ts +8 -0
  192. package/dist/system/load-better-sqlite3.d.ts +21 -0
  193. package/dist/types.d.ts +5 -0
  194. package/package.json +7 -3
  195. package/src/agent-stream/poller.ts +2 -3
  196. package/src/agent-stream/provider-adapter.ts +1 -1
  197. package/src/boot/daemon-lifecycle.ts +63 -12
  198. package/src/boot/process-hardening.ts +89 -0
  199. package/src/build-info.ts +73 -0
  200. package/src/chat/source-machine.ts +534 -0
  201. package/src/chat/source-resolver.ts +0 -0
  202. package/src/chat/subscription-updates.ts +20 -1
  203. package/src/cli-adapter-types.d.ts +3 -1
  204. package/src/cli-adapter-types.ts +68 -2
  205. package/src/cli-adapters/cli-script-runner.ts +421 -0
  206. package/src/cli-adapters/cli-state-engine.ts +1246 -0
  207. package/src/cli-adapters/provider-cli-adapter.d.ts +1 -1
  208. package/src/cli-adapters/provider-cli-adapter.ts +914 -1144
  209. package/src/cli-adapters/provider-cli-parse.d.ts +2 -0
  210. package/src/cli-adapters/provider-cli-parse.ts +19 -0
  211. package/src/cli-adapters/provider-cli-runtime.ts +56 -7
  212. package/src/cli-adapters/provider-cli-shared.d.ts +4 -0
  213. package/src/cli-adapters/provider-cli-shared.ts +121 -11
  214. package/src/cli-adapters/pty-transport.ts +2 -1
  215. package/src/cli-adapters/pty-write-chunking.ts +106 -0
  216. package/src/cli-adapters/raw-terminal-io.ts +252 -0
  217. package/src/cli-adapters/resolve-executable.ts +204 -0
  218. package/src/cli-adapters/session-host-transport.ts +2 -1
  219. package/src/cli-adapters/terminal-backends/ghostty-vt-backend.ts +63 -29
  220. package/src/cli-adapters/terminal-backends/types.ts +10 -3
  221. package/src/cli-adapters/terminal-screen.ts +16 -81
  222. package/src/commands/WINDOWS-UPGRADE-LOCK-FAILURE.md +198 -0
  223. package/src/commands/chat-commands-debug-bundle.ts +398 -0
  224. package/src/commands/chat-commands-read.ts +2488 -0
  225. package/src/commands/chat-commands-scope.ts +54 -0
  226. package/src/commands/chat-commands-shared.ts +114 -0
  227. package/src/commands/chat-commands-write.ts +891 -0
  228. package/src/commands/chat-commands.ts +19 -1841
  229. package/src/commands/cli-manager.ts +596 -27
  230. package/src/commands/handler.ts +841 -2
  231. package/src/commands/high-family/index.ts +28 -0
  232. package/src/commands/high-family/mesh-coordinator-launch.ts +680 -0
  233. package/src/commands/high-family/mesh-events.ts +89 -0
  234. package/src/commands/high-family/mesh-status.ts +822 -0
  235. package/src/commands/high-family/types.ts +80 -0
  236. package/src/commands/low-family/coordinator-prompt.ts +72 -0
  237. package/src/commands/low-family/daemon-lifecycle.ts +107 -0
  238. package/src/commands/low-family/diagnostics.ts +57 -0
  239. package/src/commands/low-family/index.ts +37 -0
  240. package/src/commands/low-family/mesh-ledger.ts +62 -0
  241. package/src/commands/low-family/mesh-node-logs.ts +87 -0
  242. package/src/commands/low-family/notification.ts +116 -0
  243. package/src/commands/low-family/refine-config.ts +106 -0
  244. package/src/commands/low-family/session-host.ts +274 -0
  245. package/src/commands/low-family/spec-providerdev.ts +217 -0
  246. package/src/commands/low-family/status-meta.ts +112 -0
  247. package/src/commands/low-family/types.ts +39 -0
  248. package/src/commands/med-family/cli-agent.ts +238 -0
  249. package/src/commands/med-family/fast-forward.ts +230 -0
  250. package/src/commands/med-family/ide.ts +163 -0
  251. package/src/commands/med-family/index.ts +37 -0
  252. package/src/commands/med-family/mesh-crud.ts +1253 -0
  253. package/src/commands/med-family/mesh-host-pairing.ts +234 -0
  254. package/src/commands/med-family/mesh-queue.ts +167 -0
  255. package/src/commands/med-family/mesh-restart.ts +92 -0
  256. package/src/commands/med-family/types.ts +153 -0
  257. package/src/commands/mesh-coordinator.ts +334 -124
  258. package/src/commands/router.ts +2893 -3536
  259. package/src/commands/stream-commands.ts +8 -0
  260. package/src/commands/upgrade-helper.ts +310 -45
  261. package/src/config/chat-history.ts +493 -24
  262. package/src/config/config.ts +12 -0
  263. package/src/config/mesh-config.ts +619 -23
  264. package/src/config/mesh-json-config.ts +376 -0
  265. package/src/config/recent-activity.ts +8 -2
  266. package/src/config/repo-settings.ts +111 -0
  267. package/src/daemon/dev-auto-implement.ts +3 -2
  268. package/src/daemon/dev-cli-debug.ts +10 -1
  269. package/src/daemon/dev-server.ts +0 -541
  270. package/src/detection/cli-detector.ts +28 -9
  271. package/src/detection/ide-detector.ts +55 -16
  272. package/src/detection/win32-ide-version.ts +106 -0
  273. package/src/git/change-impact-config.ts +354 -0
  274. package/src/git/git-commands.ts +78 -15
  275. package/src/git/git-diff.ts +81 -11
  276. package/src/git/git-executor.ts +12 -0
  277. package/src/git/git-status.ts +767 -48
  278. package/src/git/git-types.ts +14 -62
  279. package/src/git/git-worktree.ts +261 -4
  280. package/src/git/index.ts +17 -0
  281. package/src/index.ts +198 -12
  282. package/src/installer.d.ts +1 -1
  283. package/src/installer.ts +8 -6
  284. package/src/ipc/local-ipc-server.ts +278 -0
  285. package/src/launch.d.ts +1 -1
  286. package/src/launch.ts +37 -28
  287. package/src/logging/async-batch-writer.ts +55 -0
  288. package/src/logging/command-log.ts +7 -5
  289. package/src/logging/log-redactor.ts +100 -0
  290. package/src/logging/log-tail-reader.ts +341 -0
  291. package/src/logging/logger.ts +14 -7
  292. package/src/mesh/contracts.ts +338 -0
  293. package/src/mesh/coordinator-prompt.ts +416 -34
  294. package/src/mesh/coordinator-registry.ts +121 -0
  295. package/src/mesh/mesh-active-work.ts +645 -0
  296. package/src/mesh/mesh-clone-grace.ts +68 -0
  297. package/src/mesh/mesh-coordinator-config.ts +97 -0
  298. package/src/mesh/mesh-delivery-policy.ts +315 -0
  299. package/src/mesh/mesh-event-classify.ts +51 -0
  300. package/src/mesh/mesh-event-forwarding.ts +1897 -0
  301. package/src/mesh/mesh-event-trace.ts +67 -0
  302. package/src/mesh/mesh-events-coordinator.ts +32 -0
  303. package/src/mesh/mesh-events-pending.ts +656 -0
  304. package/src/mesh/mesh-events-stale.ts +389 -0
  305. package/src/mesh/mesh-events-utils.ts +443 -0
  306. package/src/mesh/mesh-events.ts +33 -1035
  307. package/src/mesh/mesh-fast-forward.ts +843 -0
  308. package/src/mesh/mesh-host-ownership.ts +111 -0
  309. package/src/mesh/mesh-init.ts +350 -0
  310. package/src/mesh/mesh-ledger-reconciliation.ts +12 -7
  311. package/src/mesh/mesh-ledger.ts +841 -102
  312. package/src/mesh/mesh-magi-status.ts +223 -0
  313. package/src/mesh/mesh-missions.ts +449 -0
  314. package/src/mesh/mesh-node-identity.ts +1985 -0
  315. package/src/mesh/mesh-queue-assignment.ts +1924 -0
  316. package/src/mesh/mesh-reconcile-loop.ts +2018 -0
  317. package/src/mesh/mesh-refine-batch.ts +205 -0
  318. package/src/mesh/mesh-refine-gates.ts +1673 -0
  319. package/src/mesh/mesh-refine-status.ts +231 -0
  320. package/src/mesh/mesh-review-inbox.ts +307 -0
  321. package/src/mesh/mesh-routing.ts +291 -0
  322. package/src/mesh/mesh-runtime-store.ts +1853 -0
  323. package/src/mesh/mesh-scheduling-runtime.ts +198 -0
  324. package/src/mesh/mesh-task-inflight.ts +70 -0
  325. package/src/mesh/mesh-task-stats.ts +161 -0
  326. package/src/mesh/mesh-unresolved-forward-outbox.ts +185 -0
  327. package/src/mesh/mesh-warmup-deadline.ts +152 -0
  328. package/src/mesh/mesh-work-queue.ts +1254 -141
  329. package/src/mesh/preview-freshness.ts +118 -0
  330. package/src/mesh/refine-config.ts +423 -0
  331. package/src/mesh/worktree-bootstrap-config.ts +450 -0
  332. package/src/providers/acp-provider-instance.ts +43 -10
  333. package/src/providers/approval-utils.d.ts +5 -0
  334. package/src/providers/approval-utils.ts +57 -5
  335. package/src/providers/chat-message-normalization.ts +92 -4
  336. package/src/providers/cli-provider-instance.ts +2177 -107
  337. package/src/providers/contracts.d.ts +55 -0
  338. package/src/providers/contracts.ts +160 -6
  339. package/src/providers/extension-provider-instance.ts +12 -7
  340. package/src/providers/external-sources.ts +218 -0
  341. package/src/providers/ide-provider-instance.ts +35 -12
  342. package/src/providers/manual-attendance.ts +85 -0
  343. package/src/providers/native-history/antigravity-cli-transcript.ts +1043 -0
  344. package/src/providers/native-history/claude-cli-transcript.ts +396 -0
  345. package/src/providers/native-history/codex-cli-transcript.ts +479 -0
  346. package/src/providers/native-history/constants.ts +19 -0
  347. package/src/providers/native-history/dispatcher.ts +373 -0
  348. package/src/providers/native-history/hermes-cli-transcript.ts +260 -0
  349. package/src/providers/native-history/index.ts +30 -0
  350. package/src/providers/provider-instance-manager.ts +71 -0
  351. package/src/providers/provider-instance.ts +19 -1
  352. package/src/providers/provider-loader.ts +668 -50
  353. package/src/providers/provider-schema.ts +87 -14
  354. package/src/providers/provider-trust.ts +114 -0
  355. package/src/providers/read-chat-contract.ts +76 -16
  356. package/src/providers/sdk/README.md +49 -0
  357. package/src/providers/sdk/v1/builders/acp/detect-status.ts +144 -0
  358. package/src/providers/sdk/v1/builders/cli/detect-status.ts +313 -0
  359. package/src/providers/sdk/v1/builders/cli/parse-approval-squash.ts +158 -0
  360. package/src/providers/sdk/v1/builders/cli/parse-approval.ts +250 -0
  361. package/src/providers/sdk/v1/builders/cli/parse-session.ts +276 -0
  362. package/src/providers/sdk/v1/builders/cli/visible-region.ts +143 -0
  363. package/src/providers/sdk/v1/fixture-tooling/format.ts +130 -0
  364. package/src/providers/sdk/v1/fixture-tooling/index.ts +22 -0
  365. package/src/providers/sdk/v1/fixture-tooling/replay.ts +352 -0
  366. package/src/providers/sdk/v1/index.ts +152 -0
  367. package/src/providers/sdk/v1/sandbox/README-design.ts +195 -0
  368. package/src/providers/sdk/v1/sandbox/require-whitelist.ts +472 -0
  369. package/src/providers/sdk/v1/sandbox/script-runner.ts +150 -0
  370. package/src/providers/sdk/v1/schemas/cli/provider.schema.json +509 -0
  371. package/src/providers/sdk/v1/schemas/primitives/acp-session-protocol-v1.json +131 -0
  372. package/src/providers/sdk/v1/schemas/primitives/native-history-codex-rollout-v1.json +66 -0
  373. package/src/providers/sdk/v1/schemas/primitives/tui-approval-squash-v1.json +91 -0
  374. package/src/providers/sdk/v1/schemas/primitives/tui-assistant-block-v1.json +91 -0
  375. package/src/providers/sdk/v1/schemas/primitives/tui-cue-ordering-v1.json +47 -0
  376. package/src/providers/sdk/v1/schemas/primitives/tui-dispatch-order-v1.json +32 -0
  377. package/src/providers/sdk/v1/schemas/primitives/tui-footer-chrome-v1.json +42 -0
  378. package/src/providers/sdk/v1/schemas/primitives/tui-index-finder-v1.json +27 -0
  379. package/src/providers/sdk/v1/schemas/primitives/tui-modal-v1.json +125 -0
  380. package/src/providers/sdk/v1/schemas/primitives/tui-prompt-marker-v1.json +45 -0
  381. package/src/providers/sdk/v1/schemas/primitives/tui-session-id-extraction-v1.json +46 -0
  382. package/src/providers/sdk/v1/schemas/primitives/tui-settled-prompt-v1.json +71 -0
  383. package/src/providers/sdk/v1/schemas/primitives/tui-spinner-v1.json +83 -0
  384. package/src/providers/sdk/v1/schemas/primitives/tui-transcript-pty-v1.json +83 -0
  385. package/src/providers/sdk/v1/schemas/primitives/tui-visible-region-v1.json +57 -0
  386. package/src/providers/sdk/v1/schemas/primitives/tui-welcome-screen-v1.json +35 -0
  387. package/src/providers/sdk/v1/types/cli/index.ts +365 -0
  388. package/src/providers/sdk/v1/types/common/index.ts +229 -0
  389. package/src/providers/sdk/v1/validators/index.ts +19 -0
  390. package/src/providers/sdk/v1/validators/manifest.ts +110 -0
  391. package/src/providers/sdk/v1/validators/taint.ts +309 -0
  392. package/src/providers/spec/adapter.ts +246 -0
  393. package/src/providers/spec/cli-adapter.ts +1064 -0
  394. package/src/providers/spec/evaluator.ts +407 -0
  395. package/src/providers/spec/fsm-driver.ts +1481 -0
  396. package/src/providers/spec/fsm-evaluator.ts +290 -0
  397. package/src/providers/spec/fsm-loader.ts +128 -0
  398. package/src/providers/spec/fsm-types.ts +301 -0
  399. package/src/providers/spec/native-history-executor.ts +1174 -0
  400. package/src/providers/spec/pre-launch-trust.ts +104 -0
  401. package/src/providers/spec/route.ts +51 -0
  402. package/src/providers/spec/types.ts +262 -0
  403. package/src/providers/status-monitor.d.ts +7 -7
  404. package/src/providers/status-monitor.ts +37 -22
  405. package/src/providers/transcript-v2.ts +567 -0
  406. package/src/providers/types/interactive-prompt.ts +536 -0
  407. package/src/providers/version-archive.ts +64 -24
  408. package/src/providers/working-dir.ts +23 -0
  409. package/src/repo-mesh-types.ts +758 -14
  410. package/src/runtime-defaults.ts +39 -0
  411. package/src/session-host/managed-host.ts +218 -0
  412. package/src/session-host/runtime-surface.ts +20 -80
  413. package/src/sessions/registry.ts +6 -0
  414. package/src/shared-types-extra.ts +2 -4
  415. package/src/shared-types.d.ts +8 -0
  416. package/src/shared-types.ts +124 -55
  417. package/src/status/builders.ts +26 -6
  418. package/src/status/normalize.ts +2 -0
  419. package/src/status/reporter.ts +19 -1
  420. package/src/status/snapshot.ts +95 -26
  421. package/src/system/hash.ts +23 -0
  422. package/src/system/host-memory.ts +29 -12
  423. package/src/system/load-better-sqlite3.ts +68 -0
  424. package/src/types.ts +5 -0
  425. package/dist/cli-adapters/terminal-backends/xterm-backend.d.ts +0 -17
  426. package/dist/mesh/mesh-sync.d.ts +0 -53
  427. package/src/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +0 -16
  428. package/src/cli-adapters/terminal-backends/xterm-backend.ts +0 -97
  429. package/src/mesh/mesh-sync.ts +0 -111
@@ -0,0 +1,90 @@
1
+ /**
2
+ * M4.0: Review inbox — derive review items from existing truth.
3
+ *
4
+ * No new store: review items are a query-time projection of
5
+ * - mesh_status node statuses (daemon-owned branchConvergence), and
6
+ * - the task ledger (completion evidence envelopes + refine job results).
7
+ *
8
+ * Scope (M4.0): host-daemon-local nodes only. Remote nodes are excluded and
9
+ * surfaced via remoteNodesExcluded/excludedRemoteNodeIds until the
10
+ * daemon↔daemon P2P relay path is live-verified (M4.2).
11
+ */
12
+ import type { MeshLedgerEntry } from './mesh-ledger.js';
13
+ export type MeshReviewInboxReason = 'merge_candidate' | 'refine_blocked_review';
14
+ export interface MeshReviewInboxConvergence {
15
+ status: string;
16
+ reason: string | null;
17
+ nextStep: string | null;
18
+ needsConvergence: boolean;
19
+ }
20
+ export interface MeshReviewInboxEvidence {
21
+ available: boolean;
22
+ /** Ledger kind of the entry the evidence came from. */
23
+ kind?: 'task_completed' | 'task_failed';
24
+ /** 'task_completion' = ordinary worker completion envelope; 'refine_job' = Refinery result. */
25
+ source?: 'task_completion' | 'refine_job';
26
+ timestamp?: string;
27
+ taskId?: string;
28
+ sessionId?: string;
29
+ /** M2-3 bootstrap stage from the refine validation gate: cached|ran|failed|skipped|legacy|not_configured. */
30
+ bootstrap?: Record<string, unknown> | null;
31
+ validation?: Record<string, unknown> | null;
32
+ checkpoint?: Record<string, unknown> | null;
33
+ worker?: {
34
+ status: string;
35
+ classification?: string;
36
+ changedFiles: string[];
37
+ changedFilesTruncated?: true;
38
+ validationResults: Array<Record<string, unknown>>;
39
+ errors: string[];
40
+ requiresUserAction: boolean;
41
+ } | null;
42
+ finalBranchConvergenceState?: Record<string, unknown>;
43
+ refineJob?: Record<string, unknown>;
44
+ }
45
+ export interface MeshReviewInboxDiffFile {
46
+ path: string;
47
+ status?: string;
48
+ insertions?: number;
49
+ deletions?: number;
50
+ binary?: boolean;
51
+ oldPath?: string;
52
+ }
53
+ export interface MeshReviewInboxDiffSummary {
54
+ baseRef: string;
55
+ files: MeshReviewInboxDiffFile[];
56
+ totalFiles: number;
57
+ totalInsertions: number;
58
+ totalDeletions: number;
59
+ truncated: boolean;
60
+ error?: string;
61
+ }
62
+ export interface MeshReviewInboxItem {
63
+ nodeId: string;
64
+ workspace: string | null;
65
+ branch: string | null;
66
+ defaultBranch: string | null;
67
+ isLocalWorktree: boolean;
68
+ reviewReason: MeshReviewInboxReason;
69
+ convergence: MeshReviewInboxConvergence;
70
+ evidence: MeshReviewInboxEvidence;
71
+ transcriptHandle: Record<string, unknown> | null;
72
+ /** Latest non-terminal Refinery job for this node (accepted/running), if any. */
73
+ activeRefineJob: Record<string, unknown> | null;
74
+ lastActivityAt: string | null;
75
+ /** Filled by the daemon command with a bounded base-branch diff probe; null when the workspace is not locally readable. */
76
+ diffSummary?: MeshReviewInboxDiffSummary | null;
77
+ }
78
+ export interface MeshReviewInboxDerivation {
79
+ items: MeshReviewInboxItem[];
80
+ remoteNodesExcluded: boolean;
81
+ excludedRemoteNodeIds: string[];
82
+ }
83
+ /**
84
+ * Derive review inbox items from mesh_status node statuses and a bounded
85
+ * ledger tail. Pure and read-only; the caller attaches diffSummary separately.
86
+ */
87
+ export declare function deriveMeshReviewInboxItems(args: {
88
+ nodes: Array<Record<string, unknown>>;
89
+ ledgerEntries: MeshLedgerEntry[];
90
+ }): MeshReviewInboxDerivation;
@@ -0,0 +1,70 @@
1
+ import type { DaemonComponents } from '../boot/daemon-lifecycle.js';
2
+ export type WorkerDelegateRejectionReason = 'not_cli' | 'no_workspace' | 'no_worker_envelope' | 'coordinator_not_dispatch_target' | 'mesh_unresolved';
3
+ export interface WorkerDelegateRouting {
4
+ /** True when the source session is a mesh worker whose events must route to a coordinator. */
5
+ isDelegate: boolean;
6
+ /** Resolved mesh id (runtime stamp, direct-dispatch recovery, or workspace lookup). */
7
+ meshId: string;
8
+ /** Resolved node id within the mesh, or '' when it cannot be determined. */
9
+ nodeId: string;
10
+ /** Human-readable node label for the coordinator system message. */
11
+ nodeLabel: string;
12
+ /** Coordinator daemon anchor (prefixed id) when the worker carries one; '' otherwise. */
13
+ coordinatorDaemonId: string;
14
+ /** Source session workspace (best-effort; '' when the session/workspace is missing). */
15
+ workspace: string;
16
+ /** Source session id echoed back, so diagnostics can name the dropped event's origin. */
17
+ sessionId: string;
18
+ /** Why routing was rejected (isDelegate=false), for fail-loud diagnostics (R4). */
19
+ rejectionReason?: WorkerDelegateRejectionReason;
20
+ }
21
+ interface ResolveDeps {
22
+ /** Resolve a mesh by id (local config + inline cache). */
23
+ getMeshById: (meshId: string) => any | undefined;
24
+ /** Resolve a mesh by workspace path (cached repo lookup). */
25
+ getMeshByWorkspace: (workspace: string) => any | undefined;
26
+ }
27
+ /**
28
+ * Resolve how a source CLI session's mesh events should route to a coordinator.
29
+ *
30
+ * This is the single authoritative interpretation of the worker envelope. It folds
31
+ * together every signal that previously lived in inline branches:
32
+ * - runtime stamps (meshNodeFor / meshNodeId)
33
+ * - the coordinator anchor (meshCoordinatorDaemonId) and launch marker (launchedByCoordinator,
34
+ * meshCoordinatorNodeId) — any one proves delegation even if the node/mesh stamp was dropped
35
+ * - direct-dispatch recovery: a coordinator session that is itself a dispatch target
36
+ * - workspace→mesh fallback when no runtime mesh id survived
37
+ *
38
+ * Returns isDelegate=false (with a rejectionReason) instead of throwing, so the caller
39
+ * can either ignore non-delegate events or surface a diagnostic.
40
+ */
41
+ export declare function resolveWorkerDelegateRouting(components: DaemonComponents, instanceId: string, deps: ResolveDeps): WorkerDelegateRouting;
42
+ /** Ledger stream that collects delivery_unroutable diagnostics (no real mesh id exists for them). */
43
+ export declare const UNROUTABLE_DIAGNOSTIC_STREAM = "__unroutable__";
44
+ export declare function __resetUnroutableDiagnosticsForTests(): void;
45
+ /** True only for rejections that represent a silently-dropped delegate event worth a diagnostic. */
46
+ export declare function isUnroutableDelegateRejection(routing: WorkerDelegateRouting): boolean;
47
+ /**
48
+ * R4: record that a worker event with a valid envelope could not be routed to a coordinator.
49
+ * Writes a `delivery_unroutable` ledger entry (deduped within a short window) so operators see
50
+ * WHY a completion never arrived instead of it vanishing. No-op for non-diagnostic rejections.
51
+ */
52
+ export declare function recordUnroutableDelegateEvent(routing: WorkerDelegateRouting, eventName: string): boolean;
53
+ export interface UnroutableDeliveryDiagnostic {
54
+ timestamp: string;
55
+ event: string;
56
+ sessionId?: string;
57
+ workspace?: string;
58
+ coordinatorDaemonId?: string;
59
+ }
60
+ /**
61
+ * R4 visibility: recent delivery_unroutable diagnostics, newest first. Surfaced in mesh_status
62
+ * so an operator/coordinator can see that completions were dropped (envelope present, mesh
63
+ * unresolved) rather than the drops being invisible in a ledger nobody reads. The diagnostics
64
+ * live in a single shared stream because an unroutable event has no resolvable mesh.
65
+ */
66
+ export declare function getRecentUnroutableDeliveries(opts?: {
67
+ sinceMs?: number;
68
+ limit?: number;
69
+ }): UnroutableDeliveryDiagnostic[];
70
+ export {};
@@ -0,0 +1,450 @@
1
+ import type { MeshTaskStatus, MeshWorkQueueEntry } from './mesh-work-queue.js';
2
+ export declare class MeshRuntimeStore {
3
+ private static instance;
4
+ private readonly db;
5
+ private readonly dbPath;
6
+ private readonly migratedMeshIds;
7
+ private fingerprintSweepCounter;
8
+ private walWriteCounter;
9
+ private toolCallLogCounter;
10
+ private static readonly WAL_CHECK_INTERVAL;
11
+ private static readonly WAL_MAX_BYTES;
12
+ private constructor();
13
+ private static loggedGetInstanceFailure;
14
+ static getInstance(): MeshRuntimeStore;
15
+ static resetForTests(): void;
16
+ close(): void;
17
+ transaction<T>(fn: () => T): T;
18
+ private migrate;
19
+ private tableColumns;
20
+ /**
21
+ * MESH-ISOLATION-LEAK migration. Two tables historically lacked a `mesh_id` column,
22
+ * letting one machine that belongs to multiple meshes (multiple repos) leak rows
23
+ * across meshes. Both migrations are idempotent and run on every boot — the column
24
+ * check short-circuits once the new schema is in place.
25
+ */
26
+ private migrateMeshIsolationColumns;
27
+ hasCompletionFingerprint(meshId: string, fingerprint: string): boolean;
28
+ recordCompletionFingerprint(meshId: string, fingerprint: string, ttlMs: number): void;
29
+ sweepExpiredFingerprints(): void;
30
+ private maybeCheckpointWal;
31
+ private ensureLegacyQueueMigrated;
32
+ getQueueEntries(meshId: string, statuses?: MeshTaskStatus[]): MeshWorkQueueEntry[];
33
+ getQueueRevision(meshId: string): string;
34
+ replaceQueue(meshId: string, queue: MeshWorkQueueEntry[]): void;
35
+ deleteQueue(meshId: string): void;
36
+ insertQueueEntry(entry: MeshWorkQueueEntry): void;
37
+ updateQueueEntry(entry: MeshWorkQueueEntry): void;
38
+ findQueueEntryById(meshId: string, id: string): MeshWorkQueueEntry | null;
39
+ hasActiveAssignment(meshId: string, sessionId: string, nodeId: string): boolean;
40
+ /** A session may only execute one task at a time, regardless of task mode. */
41
+ private hasActiveSessionAssignment;
42
+ /** A node may only execute one write task at a time (worktree isolation). */
43
+ private hasActiveNodeAssignment;
44
+ /**
45
+ * Count active (status='assigned') tasks on a node, regardless of provider or
46
+ * task mode. This is the load metric for least-loaded / round-robin ranking:
47
+ * the scheduler prefers the node with the fewest active assignments so
48
+ * untargeted work spreads instead of piling onto whichever node asks first.
49
+ */
50
+ nodeActiveAssignmentCount(meshId: string, nodeId: string): number;
51
+ /**
52
+ * O(1) count of queue tasks in 'pending' status for a mesh. A COUNT(*) over the
53
+ * indexed status column, so it avoids JSON.parse-ing every queue row — used as a
54
+ * cheap guard before the reconcile loop runs a full triggerMeshQueue scan.
55
+ */
56
+ pendingQueueTaskCount(meshId: string): number;
57
+ /**
58
+ * Read the current per-mesh round-robin cursor (0 when unset). Used to rotate
59
+ * the tie-break winner among nodes tied at the least load.
60
+ */
61
+ getSchedulerCursor(meshId: string): number;
62
+ /**
63
+ * Atomically advance the per-mesh round-robin cursor by one and return the
64
+ * value that was current BEFORE the bump (the value the caller should rotate
65
+ * by for this pass). UPSERT keeps it lock-free across concurrent passes.
66
+ */
67
+ bumpSchedulerCursor(meshId: string): number;
68
+ /**
69
+ * Count active (status='assigned') tasks on a (node, provider) combination,
70
+ * matched by the assignedProviderType stamped on the payload at claim time.
71
+ * Drives the per-(node, provider) maxParallel cap (RepoMeshNodePolicy
72
+ * providerRoles). The active-assignment set for a single node is tiny, so
73
+ * parsing payloads here is cheap and avoids a schema migration. Pre-cap legacy
74
+ * rows (no provider stamp) and other providers on the same node do not consume
75
+ * this provider's budget, so the cap is fully backward compatible.
76
+ */
77
+ private activeProviderAssignmentCount;
78
+ claimNextQueueTask(meshId: string, nodeId: string, sessionId: string, capabilityTags?: string[], opts?: {
79
+ providerType?: string;
80
+ providerMaxParallel?: number;
81
+ nodeIsWorktree?: boolean;
82
+ }): MeshWorkQueueEntry | null;
83
+ getQueueStatsByStatus(meshId: string): {
84
+ status: string;
85
+ count: number;
86
+ }[];
87
+ getActiveAssignmentDetails(meshId: string): Array<{
88
+ id: string;
89
+ nodeId?: string;
90
+ sessionId?: string;
91
+ message: string;
92
+ }>;
93
+ /**
94
+ * Resolve the `assigned` queue row a completion event belongs to.
95
+ *
96
+ * Clock-skew safety (C2): a completion event's `occurredAtIso` carries the
97
+ * REMOTE WORKER's clock, while `updated_at` carries the COORDINATOR's clock
98
+ * (set at assignment and re-bumped on every mutation). For a remote node,
99
+ * coordinator-clock > worker-clock skew used to make an `updated_at <= occurredAt`
100
+ * filter return nothing, stranding the finished task as `assigned` forever.
101
+ *
102
+ * We therefore NEVER filter completion-matching on the mutable `updated_at`:
103
+ * 1. If `taskId` is given, match the exact `assigned` row by id (no time filter).
104
+ * 2. Otherwise a session holds at most one `assigned` task — match it without a
105
+ * time filter. If several exist (shouldn't normally), disambiguate by the
106
+ * IMMUTABLE `dispatchTimestamp`: latest `dispatchTimestamp <= occurredAt`,
107
+ * and if skew makes ALL of them later than `occurredAt`, fall back to the
108
+ * most-recent `dispatchTimestamp` rather than returning null.
109
+ */
110
+ findAssignedBySession(meshId: string, sessionId: string, occurredAtIso?: string, taskId?: string): MeshWorkQueueEntry | null;
111
+ private toRow;
112
+ insertDirectDispatch(entry: {
113
+ taskId: string;
114
+ meshId: string;
115
+ nodeId?: string;
116
+ sessionId?: string;
117
+ providerType?: string;
118
+ message: string;
119
+ taskMode?: string;
120
+ via: string;
121
+ dispatchedToIdleSession?: boolean;
122
+ dispatchedAt: string;
123
+ }): void;
124
+ getActiveDirectDispatches(meshId: string): Array<{
125
+ taskId: string;
126
+ meshId: string;
127
+ nodeId: string | null;
128
+ sessionId: string | null;
129
+ providerType: string | null;
130
+ message: string;
131
+ taskMode: string | null;
132
+ via: string;
133
+ status: string;
134
+ dispatchedToIdleSession: boolean;
135
+ dispatchedAt: string;
136
+ updatedAt: string;
137
+ }>;
138
+ updateDirectDispatchStatus(meshId: string, sessionId: string, status: 'acked' | 'completed' | 'failed' | 'stale', taskId?: string): void;
139
+ /**
140
+ * MESH-DISPATCH-MISROUTE (fix 3, consumer residual): resolve the task_id of the SINGLE
141
+ * non-terminal direct dispatch a session owns. Returns the task_id only when the session
142
+ * holds exactly ONE active ('dispatched'/'acked') row — the case where a taskId-less
143
+ * lifecycle event (a legacy/relayed worker whose producer never stamped meshActiveTaskId)
144
+ * unambiguously belongs to that one dispatch. With zero rows there is nothing to ack; with
145
+ * two or more (a re-dispatch/nudge sibling) the firing event's owner is ambiguous, so we
146
+ * return null and the caller MUST NOT fall back to the session_id sweep that would flip a
147
+ * sibling row ("may flip a sibling dispatch row"). This narrows the legacy fallback to the
148
+ * only safe case instead of removing the producer-side TASKIDLESS stamp's safety net.
149
+ */
150
+ getSoleActiveDirectDispatchTaskId(meshId: string, sessionId: string): string | null;
151
+ cleanupTerminalDirectDispatches(olderThanMs: number): void;
152
+ deleteDirectDispatches(meshId: string): void;
153
+ /**
154
+ * Delete specific direct dispatch rows by taskId for a mesh. Used by the staleDirect prune
155
+ * path to remove orphaned/terminal dispatch records whose node/session is no longer in the
156
+ * live mesh. Returns the number of rows actually deleted. No-op for an empty taskId list.
157
+ */
158
+ deleteDirectDispatchesByTaskId(meshId: string, taskIds: string[]): number;
159
+ markStaleDirectDispatches(meshId: string, olderThanMs: number): void;
160
+ setRemoteIdleSession(meshId: string, nodeId: string, sessionId: string, providerType: string, expiresAt: number, metadata?: any): void;
161
+ getRemoteIdleSessions(meshId: string): Array<{
162
+ nodeId: string;
163
+ sessionId: string;
164
+ providerType: string;
165
+ expiresAt: number;
166
+ metadata?: any;
167
+ }>;
168
+ deleteRemoteIdleSession(meshId: string, nodeId: string, sessionId: string): void;
169
+ pruneExpiredRemoteIdleSessions(): void;
170
+ insertSessionDelivery(entry: {
171
+ id: string;
172
+ meshId: string;
173
+ nodeId?: string;
174
+ sessionId?: string;
175
+ providerType?: string;
176
+ taskId?: string;
177
+ kind: string;
178
+ priority?: number;
179
+ message: string;
180
+ status: string;
181
+ deliverAfter?: string;
182
+ expiresAt?: string;
183
+ sourceCoordinatorSessionId?: string;
184
+ sourceCoordinatorDaemonId?: string;
185
+ createdAt: string;
186
+ updatedAt: string;
187
+ }): void;
188
+ updateSessionDeliveryStatus(id: string, status: string, opts?: {
189
+ lastError?: string;
190
+ incrementAttempt?: boolean;
191
+ }): void;
192
+ getActiveSessionDeliveries(meshId: string, sessionId?: string): Array<{
193
+ id: string;
194
+ meshId: string;
195
+ nodeId: string | null;
196
+ sessionId: string | null;
197
+ providerType: string | null;
198
+ taskId: string | null;
199
+ kind: string;
200
+ priority: number;
201
+ message: string;
202
+ status: string;
203
+ deliverAfter: string | null;
204
+ expiresAt: string | null;
205
+ attemptCount: number;
206
+ sourceCoordinatorSessionId: string | null;
207
+ sourceCoordinatorDaemonId: string | null;
208
+ lastError: string | null;
209
+ createdAt: string;
210
+ updatedAt: string;
211
+ }>;
212
+ /**
213
+ * Bug B watchdog support: true when at least one delivery record for the task has
214
+ * reached a confirmed-handed-off status (delivered / acked / completed). The
215
+ * assigned-stranded watchdog uses this to distinguish a dispatch that was never
216
+ * confirmed (reclaimable) from one that WAS handed to the worker (a genuinely
217
+ * in-flight or completion-lost task, which is PHASE 4's responsibility, not this
218
+ * watchdog's). Indexed by (mesh_id, task_id).
219
+ */
220
+ taskHasConfirmedDelivery(meshId: string, taskId: string): boolean;
221
+ expireStaleSessionDeliveries(meshId: string): void;
222
+ deleteSessionDeliveries(meshId: string): void;
223
+ recordCompletionConflict(entry: {
224
+ id: string;
225
+ meshId: string;
226
+ fingerprint: string;
227
+ conflictingTaskId?: string;
228
+ conflictingSessionId?: string;
229
+ originalTaskId?: string;
230
+ originalSessionId?: string;
231
+ event: string;
232
+ createdAt: string;
233
+ }): void;
234
+ getRecentCompletionConflicts(meshId: string, limitMs?: number): Array<{
235
+ id: string;
236
+ meshId: string;
237
+ fingerprint: string;
238
+ conflictingTaskId: string | null;
239
+ conflictingSessionId: string | null;
240
+ originalTaskId: string | null;
241
+ originalSessionId: string | null;
242
+ event: string;
243
+ createdAt: string;
244
+ }>;
245
+ /**
246
+ * Record a mesh tool call and check whether this mesh+tool combination is
247
+ * being called too rapidly (sliding window rate guard).
248
+ *
249
+ * Returns a rate-limit advisory string when the call rate is too high, null otherwise.
250
+ * windowMs: sliding window size in ms (default 10s)
251
+ * maxCalls: max allowed calls within the window (default 5)
252
+ */
253
+ recordMeshToolCall(opts: {
254
+ meshId: string;
255
+ tool: string;
256
+ sessionId?: string | null;
257
+ windowMs?: number;
258
+ maxCalls?: number;
259
+ }): {
260
+ rateLimitExceeded: boolean;
261
+ callsInWindow: number;
262
+ advisory: string | null;
263
+ };
264
+ /**
265
+ * Prune tool call log entries older than the given age in ms.
266
+ * Exposed for testing.
267
+ */
268
+ pruneToolCallLog(olderThanMs: number): void;
269
+ appendLedgerEntry(entry: {
270
+ id: string;
271
+ meshId: string;
272
+ timestamp: string;
273
+ kind: string;
274
+ nodeId?: string | null;
275
+ sessionId?: string | null;
276
+ providerType?: string | null;
277
+ payload?: unknown;
278
+ }): void;
279
+ readLedgerEntries(meshId: string, opts?: {
280
+ tail?: number;
281
+ since?: string;
282
+ kind?: string;
283
+ limit?: number;
284
+ }): Array<{
285
+ id: string;
286
+ meshId: string;
287
+ timestamp: string;
288
+ kind: string;
289
+ nodeId: string | null;
290
+ sessionId: string | null;
291
+ providerType: string | null;
292
+ payload: unknown;
293
+ }>;
294
+ /**
295
+ * G2 read cutover: read ledger entries in append order (oldest first),
296
+ * matching legacy JSONL file-order semantics. Ties on the same timestamp
297
+ * are broken by rowid (insertion order), preserving the positional
298
+ * guarantee that mesh-events relies on for same-millisecond entries.
299
+ */
300
+ readLedgerEntriesOrdered(meshId: string, opts?: {
301
+ since?: string;
302
+ kinds?: string[];
303
+ tail?: number;
304
+ }): Array<{
305
+ id: string;
306
+ meshId: string;
307
+ timestamp: string;
308
+ kind: string;
309
+ nodeId: string | null;
310
+ sessionId: string | null;
311
+ providerType: string | null;
312
+ payload: unknown;
313
+ }>;
314
+ /** Remove all ledger entries for a mesh (mesh deletion / test cleanup). */
315
+ clearLedgerForMesh(meshId: string): number;
316
+ /** G2: remove entries moved to the JSONL archive so the SQLite runtime set mirrors the active ledger. */
317
+ deleteLedgerEntries(meshId: string, ids: string[]): number;
318
+ hasLedgerEntry(meshId: string, id: string): boolean;
319
+ ledgerEntryCount(meshId: string): number;
320
+ importLedgerEntries(entries: Array<{
321
+ id: string;
322
+ meshId: string;
323
+ timestamp: string;
324
+ kind: string;
325
+ nodeId?: string | null;
326
+ sessionId?: string | null;
327
+ providerType?: string | null;
328
+ payload?: unknown;
329
+ }>): number;
330
+ /**
331
+ * G4: Read a bounded, cursor-addressable ledger slice directly from the SQLite
332
+ * mesh_event_ledger table. This is the P2P reconcile read path; JSONL files are
333
+ * retained as export/import/debug/legacy artifacts only.
334
+ *
335
+ * The return shape is structurally compatible with MeshLedgerSlice so callers
336
+ * in mesh-tools.ts can pass it directly to buildMeshLedgerReplicaEvidence.
337
+ */
338
+ readLedgerSlice(meshId: string, opts?: {
339
+ afterId?: string;
340
+ since?: string;
341
+ kind?: string;
342
+ limit?: number;
343
+ }): {
344
+ protocol: 'adhdev.mesh.ledger.slice.v1';
345
+ meshId: string;
346
+ entries: Array<{
347
+ id: string;
348
+ meshId: string;
349
+ timestamp: string;
350
+ kind: string;
351
+ nodeId: string | null;
352
+ sessionId: string | null;
353
+ providerType: string | null;
354
+ payload: unknown;
355
+ }>;
356
+ cursor: {
357
+ afterId: string | null;
358
+ nextAfterId: string | null;
359
+ limit: number;
360
+ hasMore: boolean;
361
+ };
362
+ sourceOfTruth: {
363
+ kind: 'local_sqlite';
364
+ table: 'mesh_event_ledger';
365
+ bounded: true;
366
+ maxLimit: number;
367
+ };
368
+ };
369
+ insertPendingEvent(event: {
370
+ id: string;
371
+ meshId: string;
372
+ coordinatorDaemonId?: string | null;
373
+ event: string;
374
+ payload?: unknown;
375
+ fingerprint?: string | null;
376
+ queuedAt: number;
377
+ }): boolean;
378
+ /**
379
+ * Drain undrained pending events for a mesh, atomically marking them drained.
380
+ * When `opts.onlyEvents` is supplied, ONLY rows whose `event` is in that set are
381
+ * drained — the rest stay queued (drained=0) for a later drain. This is how the
382
+ * reconcile loop force-drains terminal/force-inject events into a *generating*
383
+ * coordinator while leaving non-force progress events for the coordinator's next
384
+ * idle transition. Filtering happens inside the same transaction as the
385
+ * drained=1 marking, so force-drain + a concurrent full drain can never both
386
+ * consume the same row.
387
+ */
388
+ drainPendingEvents(meshId: string, coordinatorDaemonId?: string | null | ReadonlyArray<string>, opts?: {
389
+ onlyEvents?: ReadonlySet<string>;
390
+ }): Array<{
391
+ id: string;
392
+ event: string;
393
+ payload: unknown;
394
+ }>;
395
+ /** Non-destructive peek — returns undrained events without marking them drained. */
396
+ peekPendingEvents(meshId: string, coordinatorDaemonId?: string | null | ReadonlyArray<string>): Array<{
397
+ id: string;
398
+ event: string;
399
+ payload: unknown;
400
+ }>;
401
+ hasPendingEventFingerprint(meshId: string, fingerprint: string): boolean;
402
+ upsertMission(mission: {
403
+ id: string;
404
+ meshId: string;
405
+ title: string;
406
+ goal?: string;
407
+ status?: string;
408
+ source?: string;
409
+ }): void;
410
+ getMission(meshId: string, missionId: string): {
411
+ id: string;
412
+ meshId: string;
413
+ title: string;
414
+ goal: string;
415
+ status: string;
416
+ source?: string;
417
+ createdAt: string;
418
+ updatedAt: string;
419
+ } | null;
420
+ getMissions(meshId: string, statuses?: string[]): Array<{
421
+ id: string;
422
+ meshId: string;
423
+ title: string;
424
+ goal: string;
425
+ status: string;
426
+ source?: string;
427
+ createdAt: string;
428
+ updatedAt: string;
429
+ }>;
430
+ /** Remove all missions for a mesh — mesh deletion / test cleanup. */
431
+ clearMissionsForMesh(meshId: string): number;
432
+ /** Remove all pending-event rows (drained included) for a mesh — mesh deletion / test cleanup. */
433
+ clearPendingEventsForMesh(meshId: string): number;
434
+ pendingEventCount(meshId: string): number;
435
+ /**
436
+ * Mark specific pending-event rows drained by id (ack). Used by the
437
+ * unresolved-delegate durable-forward outbox: an event is peeked (not drained)
438
+ * while its push to the coordinator is unconfirmed, then marked drained ONLY
439
+ * after the push is acked. A failed push leaves the row undrained so the next
440
+ * reconcile tick retries it. Returns the number of rows newly marked drained.
441
+ */
442
+ markPendingEventsDrainedById(ids: ReadonlyArray<string>): number;
443
+ /**
444
+ * Hard-delete pending-event rows by id (including the dedup fingerprint history).
445
+ * Used to expire an unresolved-delegate outbox entry that has exhausted its retry
446
+ * budget — fully removing it frees the fingerprint so a genuinely new completion
447
+ * for the same task could be re-queued later. Returns the number of rows deleted.
448
+ */
449
+ deletePendingEventsById(ids: ReadonlyArray<string>): number;
450
+ }
@@ -0,0 +1,78 @@
1
+ import type { RepoMeshNodePolicy, RepoMeshSchedulingStrategy } from '../repo-mesh-types.js';
2
+ import type { MeshWorkQueueEntry } from './mesh-work-queue.js';
3
+ /** Per-(node, provider) cap and its current consumption. */
4
+ export interface MeshNodeProviderSchedulingRuntime {
5
+ providerType: string;
6
+ /** Declared maxParallel cap for this (node, provider). Omitted when uncapped. */
7
+ maxParallel?: number;
8
+ /** Active (status='assigned') tasks on this node claimed by this provider. */
9
+ activeAssigned: number;
10
+ /** True when activeAssigned has reached maxParallel (a further claim is refused). */
11
+ capReached: boolean;
12
+ }
13
+ /** Per-node scheduling-runtime projection. */
14
+ export interface MeshNodeSchedulingRuntime {
15
+ nodeId: string;
16
+ /** Active (status='assigned') task count on this node — the least-loaded rank key. */
17
+ load: number;
18
+ /** Soft scheduling priority (PRIORITY rank key; higher = preferred). */
19
+ schedulingPriority: number;
20
+ /** Per-node concurrent-session cap, when configured. */
21
+ maxConcurrentSessions?: number;
22
+ /** Per-(node, provider) caps + consumption, when providerRoles declares any. */
23
+ providerRoles?: MeshNodeProviderSchedulingRuntime[];
24
+ /**
25
+ * True when the node currently cannot claim a NEW write (non-readonly) task —
26
+ * either the global write cap is exhausted or a node-local gate (active write
27
+ * assignment / a fully-consumed provider cap / session cap) blocks it.
28
+ */
29
+ capReached: boolean;
30
+ /** Structured reasons backing capReached (empty when the node can take work). */
31
+ capReasons: string[];
32
+ }
33
+ /** Mesh-level scheduling-runtime projection. */
34
+ export interface MeshSchedulingRuntime {
35
+ /** Resolved tie-break strategy (defaults to 'first_eligible'). */
36
+ strategy: RepoMeshSchedulingStrategy;
37
+ /** Effective global write-task parallel cap (clamped). */
38
+ maxParallelTasks: number;
39
+ /** Derived read-only diagnosis cap (max(2, 2× write cap)) — mirrors the claim path. */
40
+ maxReadonlyParallelTasks: number;
41
+ /** Current global write (non-readonly) assigned-task load. */
42
+ activeWriteAssigned: number;
43
+ /** Current global read-only assigned-task load. */
44
+ activeReadonlyAssigned: number;
45
+ /** True when the global write cap is exhausted (no new write task can launch). */
46
+ globalWriteCapReached: boolean;
47
+ /** True when the read-only diagnosis cap is exhausted. */
48
+ globalReadonlyCapReached: boolean;
49
+ /** Per-node projections, in mesh config order. */
50
+ nodes: MeshNodeSchedulingRuntime[];
51
+ }
52
+ interface MeshLike {
53
+ policy?: {
54
+ schedulingStrategy?: unknown;
55
+ maxParallelTasks?: unknown;
56
+ } | null;
57
+ nodes?: Array<{
58
+ id?: string;
59
+ nodeId?: string;
60
+ node_id?: string;
61
+ policy?: RepoMeshNodePolicy | null;
62
+ isLocalWorktree?: boolean;
63
+ }> | null;
64
+ }
65
+ /**
66
+ * Build the scheduling-runtime projection for a mesh from its config + a snapshot of
67
+ * its work queue. Pure and side-effect free — safe to call on any read path.
68
+ *
69
+ * The derivation deliberately mirrors maybeAutoLaunchOneQueueSession's gates so the
70
+ * exposed "capReached/capReasons" match why a real claim would be refused:
71
+ * • global write cap → activeWriteAssigned >= maxParallelTasks
72
+ * • node write conflict→ a node already holding an assigned write task (worktree isolation)
73
+ * • provider cap → a (node, provider) at its declared maxParallel
74
+ * It does NOT re-evaluate eligibility/required-tags (those are task-specific); it only
75
+ * reports the capacity picture, which is what an operator needs to read load balance.
76
+ */
77
+ export declare function buildMeshSchedulingRuntime(mesh: MeshLike | null | undefined, queue: MeshWorkQueueEntry[]): MeshSchedulingRuntime;
78
+ export {};