@adhdev/daemon-core 0.9.82-rc.38 → 0.9.82-rc.381

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 (414) 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 +55 -2
  8. package/dist/cli-adapters/cli-script-runner.d.ts +117 -0
  9. package/dist/cli-adapters/cli-state-engine.d.ts +198 -0
  10. package/dist/cli-adapters/provider-cli-adapter.d.ts +121 -64
  11. package/dist/cli-adapters/provider-cli-parse.d.ts +4 -0
  12. package/dist/cli-adapters/provider-cli-runtime.d.ts +34 -0
  13. package/dist/cli-adapters/provider-cli-shared.d.ts +63 -0
  14. package/dist/cli-adapters/pty-write-chunking.d.ts +34 -0
  15. package/dist/cli-adapters/raw-terminal-io.d.ts +37 -0
  16. package/dist/cli-adapters/resolve-executable.d.ts +14 -0
  17. package/dist/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +6 -3
  18. package/dist/cli-adapters/terminal-backends/types.d.ts +10 -2
  19. package/dist/cli-adapters/terminal-screen.d.ts +4 -11
  20. package/dist/commands/chat-commands-debug-bundle.d.ts +14 -0
  21. package/dist/commands/chat-commands-read.d.ts +7 -0
  22. package/dist/commands/chat-commands-scope.d.ts +39 -0
  23. package/dist/commands/chat-commands-shared.d.ts +33 -0
  24. package/dist/commands/chat-commands-write.d.ts +14 -0
  25. package/dist/commands/chat-commands.d.ts +10 -23
  26. package/dist/commands/cli-manager.d.ts +15 -1
  27. package/dist/commands/handler.d.ts +125 -0
  28. package/dist/commands/high-family/index.d.ts +3 -0
  29. package/dist/commands/high-family/mesh-coordinator-launch.d.ts +2 -0
  30. package/dist/commands/high-family/mesh-events.d.ts +2 -0
  31. package/dist/commands/high-family/mesh-status.d.ts +2 -0
  32. package/dist/commands/high-family/types.d.ts +60 -0
  33. package/dist/commands/low-family/coordinator-prompt.d.ts +9 -0
  34. package/dist/commands/low-family/daemon-lifecycle.d.ts +2 -0
  35. package/dist/commands/low-family/diagnostics.d.ts +2 -0
  36. package/dist/commands/low-family/index.d.ts +3 -0
  37. package/dist/commands/low-family/mesh-ledger.d.ts +10 -0
  38. package/dist/commands/low-family/mesh-node-logs.d.ts +2 -0
  39. package/dist/commands/low-family/notification.d.ts +2 -0
  40. package/dist/commands/low-family/refine-config.d.ts +2 -0
  41. package/dist/commands/low-family/session-host.d.ts +2 -0
  42. package/dist/commands/low-family/spec-providerdev.d.ts +11 -0
  43. package/dist/commands/low-family/status-meta.d.ts +2 -0
  44. package/dist/commands/low-family/types.d.ts +33 -0
  45. package/dist/commands/med-family/cli-agent.d.ts +2 -0
  46. package/dist/commands/med-family/fast-forward.d.ts +2 -0
  47. package/dist/commands/med-family/ide.d.ts +10 -0
  48. package/dist/commands/med-family/index.d.ts +3 -0
  49. package/dist/commands/med-family/mesh-crud.d.ts +2 -0
  50. package/dist/commands/med-family/mesh-host-pairing.d.ts +2 -0
  51. package/dist/commands/med-family/mesh-queue.d.ts +2 -0
  52. package/dist/commands/med-family/mesh-restart.d.ts +2 -0
  53. package/dist/commands/med-family/types.d.ts +116 -0
  54. package/dist/commands/mesh-coordinator.d.ts +85 -1
  55. package/dist/commands/router.d.ts +227 -2
  56. package/dist/commands/upgrade-helper.d.ts +41 -1
  57. package/dist/config/chat-history.d.ts +9 -0
  58. package/dist/config/config.d.ts +5 -0
  59. package/dist/config/mesh-config.d.ts +77 -1
  60. package/dist/daemon/dev-server.d.ts +0 -2
  61. package/dist/detection/ide-detector.d.ts +13 -0
  62. package/dist/detection/win32-ide-version.d.ts +37 -0
  63. package/dist/git/change-impact-config.d.ts +159 -0
  64. package/dist/git/git-commands.d.ts +11 -1
  65. package/dist/git/git-diff.d.ts +6 -0
  66. package/dist/git/git-executor.d.ts +11 -0
  67. package/dist/git/git-status.d.ts +23 -0
  68. package/dist/git/git-types.d.ts +2 -50
  69. package/dist/git/index.d.ts +2 -0
  70. package/dist/index.d.ts +57 -13
  71. package/dist/index.js +47417 -19860
  72. package/dist/index.js.map +1 -1
  73. package/dist/index.mjs +45865 -18449
  74. package/dist/index.mjs.map +1 -1
  75. package/dist/installer.d.ts +1 -4
  76. package/dist/ipc/local-ipc-server.d.ts +91 -0
  77. package/dist/launch.d.ts +1 -1
  78. package/dist/logging/async-batch-writer.d.ts +10 -0
  79. package/dist/logging/log-redactor.d.ts +24 -0
  80. package/dist/logging/log-tail-reader.d.ts +81 -0
  81. package/dist/logging/logger.d.ts +1 -1
  82. package/dist/mesh/contracts.d.ts +164 -0
  83. package/dist/mesh/coordinator-prompt.d.ts +89 -0
  84. package/dist/mesh/coordinator-registry.d.ts +59 -0
  85. package/dist/mesh/mesh-active-work.d.ts +174 -0
  86. package/dist/mesh/mesh-coordinator-config.d.ts +21 -0
  87. package/dist/mesh/mesh-delivery-policy.d.ts +131 -0
  88. package/dist/mesh/mesh-event-classify.d.ts +5 -0
  89. package/dist/mesh/mesh-event-forwarding.d.ts +18 -0
  90. package/dist/mesh/mesh-event-trace.d.ts +21 -0
  91. package/dist/mesh/mesh-events-coordinator.d.ts +4 -0
  92. package/dist/mesh/mesh-events-pending.d.ts +55 -0
  93. package/dist/mesh/mesh-events-stale.d.ts +52 -0
  94. package/dist/mesh/mesh-events-utils.d.ts +64 -0
  95. package/dist/mesh/mesh-events.d.ts +6 -49
  96. package/dist/mesh/mesh-fast-forward.d.ts +81 -0
  97. package/dist/mesh/mesh-host-ownership.d.ts +9 -0
  98. package/dist/mesh/mesh-init.d.ts +86 -0
  99. package/dist/mesh/mesh-ledger-reconciliation.d.ts +23 -4
  100. package/dist/mesh/mesh-ledger.d.ts +77 -1
  101. package/dist/mesh/mesh-missions.d.ts +164 -0
  102. package/dist/mesh/mesh-node-identity.d.ts +289 -0
  103. package/dist/mesh/mesh-queue-assignment.d.ts +86 -0
  104. package/dist/mesh/mesh-reconcile-loop.d.ts +8 -0
  105. package/dist/mesh/mesh-refine-batch.d.ts +68 -0
  106. package/dist/mesh/mesh-refine-gates.d.ts +428 -0
  107. package/dist/mesh/mesh-refine-status.d.ts +62 -0
  108. package/dist/mesh/mesh-review-inbox.d.ts +90 -0
  109. package/dist/mesh/mesh-routing.d.ts +70 -0
  110. package/dist/mesh/mesh-runtime-store.d.ts +439 -0
  111. package/dist/mesh/mesh-scheduling-runtime.d.ts +78 -0
  112. package/dist/mesh/mesh-task-stats.d.ts +49 -0
  113. package/dist/mesh/mesh-unresolved-forward-outbox.d.ts +30 -0
  114. package/dist/mesh/mesh-warmup-deadline.d.ts +68 -0
  115. package/dist/mesh/mesh-work-queue.d.ts +247 -5
  116. package/dist/mesh/preview-freshness.d.ts +18 -0
  117. package/dist/mesh/refine-config.d.ts +216 -0
  118. package/dist/mesh/worktree-bootstrap-config.d.ts +135 -0
  119. package/dist/providers/acp-provider-instance.d.ts +5 -0
  120. package/dist/providers/approval-utils.d.ts +20 -0
  121. package/dist/providers/chat-message-normalization.d.ts +13 -1
  122. package/dist/providers/cli-provider-instance.d.ts +111 -3
  123. package/dist/providers/contracts.d.ts +139 -6
  124. package/dist/providers/external-sources.d.ts +71 -0
  125. package/dist/providers/manual-attendance.d.ts +63 -0
  126. package/dist/providers/native-history/antigravity-cli-transcript.d.ts +100 -0
  127. package/dist/providers/native-history/claude-cli-transcript.d.ts +70 -0
  128. package/dist/providers/native-history/codex-cli-transcript.d.ts +73 -0
  129. package/dist/providers/native-history/constants.d.ts +12 -0
  130. package/dist/providers/native-history/dispatcher.d.ts +27 -0
  131. package/dist/providers/native-history/hermes-cli-transcript.d.ts +30 -0
  132. package/dist/providers/native-history/index.d.ts +13 -0
  133. package/dist/providers/provider-instance-manager.d.ts +14 -0
  134. package/dist/providers/provider-instance.d.ts +23 -1
  135. package/dist/providers/provider-loader.d.ts +26 -4
  136. package/dist/providers/provider-trust.d.ts +31 -0
  137. package/dist/providers/read-chat-contract.d.ts +29 -0
  138. package/dist/providers/sdk/v1/builders/acp/detect-status.d.ts +68 -0
  139. package/dist/providers/sdk/v1/builders/cli/detect-status.d.ts +86 -0
  140. package/dist/providers/sdk/v1/builders/cli/parse-approval-squash.d.ts +59 -0
  141. package/dist/providers/sdk/v1/builders/cli/parse-approval.d.ts +65 -0
  142. package/dist/providers/sdk/v1/builders/cli/parse-session.d.ts +91 -0
  143. package/dist/providers/sdk/v1/builders/cli/visible-region.d.ts +42 -0
  144. package/dist/providers/sdk/v1/fixture-tooling/format.d.ts +126 -0
  145. package/dist/providers/sdk/v1/fixture-tooling/index.d.ts +8 -0
  146. package/dist/providers/sdk/v1/fixture-tooling/replay.d.ts +38 -0
  147. package/dist/providers/sdk/v1/index.d.ts +30 -0
  148. package/dist/providers/sdk/v1/sandbox/README-design.d.ts +193 -0
  149. package/dist/providers/sdk/v1/sandbox/require-whitelist.d.ts +74 -0
  150. package/dist/providers/sdk/v1/sandbox/script-runner.d.ts +98 -0
  151. package/dist/providers/sdk/v1/types/cli/index.d.ts +277 -0
  152. package/dist/providers/sdk/v1/types/common/index.d.ts +203 -0
  153. package/dist/providers/sdk/v1/validators/index.d.ts +5 -0
  154. package/dist/providers/sdk/v1/validators/manifest.d.ts +40 -0
  155. package/dist/providers/sdk/v1/validators/taint.d.ts +52 -0
  156. package/dist/providers/spec/adapter.d.ts +91 -0
  157. package/dist/providers/spec/cli-adapter.d.ts +223 -0
  158. package/dist/providers/spec/evaluator.d.ts +45 -0
  159. package/dist/providers/spec/fsm-driver.d.ts +397 -0
  160. package/dist/providers/spec/fsm-evaluator.d.ts +76 -0
  161. package/dist/providers/spec/fsm-loader.d.ts +14 -0
  162. package/dist/providers/spec/fsm-types.d.ts +174 -0
  163. package/dist/providers/spec/native-history-executor.d.ts +41 -0
  164. package/dist/providers/spec/pre-launch-trust.d.ts +16 -0
  165. package/dist/providers/spec/route.d.ts +4 -0
  166. package/dist/providers/spec/types.d.ts +222 -0
  167. package/dist/providers/status-monitor.d.ts +7 -7
  168. package/dist/providers/transcript-v2.d.ts +176 -0
  169. package/dist/providers/types/interactive-prompt.d.ts +84 -0
  170. package/dist/providers/working-dir.d.ts +17 -0
  171. package/dist/repo-mesh-types.d.ts +376 -13
  172. package/dist/runtime-defaults.d.ts +2 -0
  173. package/dist/sessions/registry.d.ts +6 -0
  174. package/dist/shared-types-extra.d.ts +2 -4
  175. package/dist/shared-types.d.ts +59 -2
  176. package/dist/status/normalize.d.ts +1 -1
  177. package/dist/status/normalize.js +1 -0
  178. package/dist/status/normalize.js.map +1 -1
  179. package/dist/status/normalize.mjs +1 -0
  180. package/dist/status/normalize.mjs.map +1 -1
  181. package/dist/status/reporter.d.ts +2 -0
  182. package/dist/status/snapshot.d.ts +26 -0
  183. package/dist/system/hash.d.ts +8 -0
  184. package/dist/system/load-better-sqlite3.d.ts +21 -0
  185. package/dist/types.d.ts +5 -0
  186. package/package.json +7 -3
  187. package/src/agent-stream/poller.ts +2 -3
  188. package/src/agent-stream/provider-adapter.ts +1 -1
  189. package/src/boot/daemon-lifecycle.ts +63 -12
  190. package/src/boot/process-hardening.ts +89 -0
  191. package/src/build-info.ts +73 -0
  192. package/src/chat/source-machine.ts +534 -0
  193. package/src/chat/source-resolver.ts +0 -0
  194. package/src/chat/subscription-updates.ts +20 -1
  195. package/src/cli-adapter-types.d.ts +1 -0
  196. package/src/cli-adapter-types.ts +56 -2
  197. package/src/cli-adapters/cli-script-runner.ts +421 -0
  198. package/src/cli-adapters/cli-state-engine.ts +1221 -0
  199. package/src/cli-adapters/provider-cli-adapter.d.ts +1 -1
  200. package/src/cli-adapters/provider-cli-adapter.ts +836 -1141
  201. package/src/cli-adapters/provider-cli-parse.d.ts +1 -0
  202. package/src/cli-adapters/provider-cli-parse.ts +13 -0
  203. package/src/cli-adapters/provider-cli-runtime.ts +56 -7
  204. package/src/cli-adapters/provider-cli-shared.d.ts +4 -0
  205. package/src/cli-adapters/provider-cli-shared.ts +110 -11
  206. package/src/cli-adapters/pty-transport.ts +2 -1
  207. package/src/cli-adapters/pty-write-chunking.ts +106 -0
  208. package/src/cli-adapters/raw-terminal-io.ts +252 -0
  209. package/src/cli-adapters/resolve-executable.ts +90 -0
  210. package/src/cli-adapters/session-host-transport.ts +2 -1
  211. package/src/cli-adapters/terminal-backends/ghostty-vt-backend.ts +53 -29
  212. package/src/cli-adapters/terminal-backends/types.ts +10 -3
  213. package/src/cli-adapters/terminal-screen.ts +16 -81
  214. package/src/commands/WINDOWS-UPGRADE-LOCK-FAILURE.md +198 -0
  215. package/src/commands/chat-commands-debug-bundle.ts +398 -0
  216. package/src/commands/chat-commands-read.ts +2327 -0
  217. package/src/commands/chat-commands-scope.ts +54 -0
  218. package/src/commands/chat-commands-shared.ts +114 -0
  219. package/src/commands/chat-commands-write.ts +880 -0
  220. package/src/commands/chat-commands.ts +19 -1841
  221. package/src/commands/cli-manager.ts +513 -26
  222. package/src/commands/handler.ts +841 -2
  223. package/src/commands/high-family/index.ts +28 -0
  224. package/src/commands/high-family/mesh-coordinator-launch.ts +657 -0
  225. package/src/commands/high-family/mesh-events.ts +47 -0
  226. package/src/commands/high-family/mesh-status.ts +642 -0
  227. package/src/commands/high-family/types.ts +76 -0
  228. package/src/commands/low-family/coordinator-prompt.ts +72 -0
  229. package/src/commands/low-family/daemon-lifecycle.ts +107 -0
  230. package/src/commands/low-family/diagnostics.ts +57 -0
  231. package/src/commands/low-family/index.ts +37 -0
  232. package/src/commands/low-family/mesh-ledger.ts +62 -0
  233. package/src/commands/low-family/mesh-node-logs.ts +87 -0
  234. package/src/commands/low-family/notification.ts +116 -0
  235. package/src/commands/low-family/refine-config.ts +106 -0
  236. package/src/commands/low-family/session-host.ts +274 -0
  237. package/src/commands/low-family/spec-providerdev.ts +217 -0
  238. package/src/commands/low-family/status-meta.ts +112 -0
  239. package/src/commands/low-family/types.ts +39 -0
  240. package/src/commands/med-family/cli-agent.ts +230 -0
  241. package/src/commands/med-family/fast-forward.ts +230 -0
  242. package/src/commands/med-family/ide.ts +163 -0
  243. package/src/commands/med-family/index.ts +37 -0
  244. package/src/commands/med-family/mesh-crud.ts +825 -0
  245. package/src/commands/med-family/mesh-host-pairing.ts +234 -0
  246. package/src/commands/med-family/mesh-queue.ts +131 -0
  247. package/src/commands/med-family/mesh-restart.ts +92 -0
  248. package/src/commands/med-family/types.ts +120 -0
  249. package/src/commands/mesh-coordinator.ts +334 -124
  250. package/src/commands/router.ts +2395 -3206
  251. package/src/commands/stream-commands.ts +8 -0
  252. package/src/commands/upgrade-helper.ts +310 -45
  253. package/src/config/chat-history.ts +483 -24
  254. package/src/config/config.ts +12 -0
  255. package/src/config/mesh-config.ts +353 -22
  256. package/src/config/recent-activity.ts +8 -2
  257. package/src/daemon/dev-auto-implement.ts +3 -2
  258. package/src/daemon/dev-cli-debug.ts +10 -1
  259. package/src/daemon/dev-server.ts +0 -541
  260. package/src/detection/cli-detector.ts +28 -9
  261. package/src/detection/ide-detector.ts +55 -16
  262. package/src/detection/win32-ide-version.ts +106 -0
  263. package/src/git/change-impact-config.ts +354 -0
  264. package/src/git/git-commands.ts +55 -14
  265. package/src/git/git-diff.ts +81 -11
  266. package/src/git/git-executor.ts +12 -0
  267. package/src/git/git-status.ts +574 -43
  268. package/src/git/git-types.ts +14 -62
  269. package/src/git/git-worktree.ts +8 -1
  270. package/src/git/index.ts +16 -0
  271. package/src/index.ts +171 -12
  272. package/src/installer.d.ts +1 -1
  273. package/src/installer.ts +8 -6
  274. package/src/ipc/local-ipc-server.ts +278 -0
  275. package/src/launch.d.ts +1 -1
  276. package/src/launch.ts +37 -28
  277. package/src/logging/async-batch-writer.ts +55 -0
  278. package/src/logging/command-log.ts +7 -5
  279. package/src/logging/log-redactor.ts +100 -0
  280. package/src/logging/log-tail-reader.ts +341 -0
  281. package/src/logging/logger.ts +14 -7
  282. package/src/mesh/contracts.ts +338 -0
  283. package/src/mesh/coordinator-prompt.ts +381 -33
  284. package/src/mesh/coordinator-registry.ts +121 -0
  285. package/src/mesh/mesh-active-work.ts +645 -0
  286. package/src/mesh/mesh-coordinator-config.ts +97 -0
  287. package/src/mesh/mesh-delivery-policy.ts +315 -0
  288. package/src/mesh/mesh-event-classify.ts +51 -0
  289. package/src/mesh/mesh-event-forwarding.ts +1575 -0
  290. package/src/mesh/mesh-event-trace.ts +67 -0
  291. package/src/mesh/mesh-events-coordinator.ts +30 -0
  292. package/src/mesh/mesh-events-pending.ts +590 -0
  293. package/src/mesh/mesh-events-stale.ts +363 -0
  294. package/src/mesh/mesh-events-utils.ts +425 -0
  295. package/src/mesh/mesh-events.ts +30 -1035
  296. package/src/mesh/mesh-fast-forward.ts +839 -0
  297. package/src/mesh/mesh-host-ownership.ts +73 -0
  298. package/src/mesh/mesh-init.ts +260 -0
  299. package/src/mesh/mesh-ledger-reconciliation.ts +12 -7
  300. package/src/mesh/mesh-ledger.ts +596 -102
  301. package/src/mesh/mesh-missions.ts +322 -0
  302. package/src/mesh/mesh-node-identity.ts +1887 -0
  303. package/src/mesh/mesh-queue-assignment.ts +1491 -0
  304. package/src/mesh/mesh-reconcile-loop.ts +1332 -0
  305. package/src/mesh/mesh-refine-batch.ts +197 -0
  306. package/src/mesh/mesh-refine-gates.ts +1652 -0
  307. package/src/mesh/mesh-refine-status.ts +231 -0
  308. package/src/mesh/mesh-review-inbox.ts +307 -0
  309. package/src/mesh/mesh-routing.ts +291 -0
  310. package/src/mesh/mesh-runtime-store.ts +1708 -0
  311. package/src/mesh/mesh-scheduling-runtime.ts +199 -0
  312. package/src/mesh/mesh-task-stats.ts +161 -0
  313. package/src/mesh/mesh-unresolved-forward-outbox.ts +185 -0
  314. package/src/mesh/mesh-warmup-deadline.ts +152 -0
  315. package/src/mesh/mesh-work-queue.ts +997 -141
  316. package/src/mesh/preview-freshness.ts +118 -0
  317. package/src/mesh/refine-config.ts +423 -0
  318. package/src/mesh/worktree-bootstrap-config.ts +331 -0
  319. package/src/providers/acp-provider-instance.ts +43 -10
  320. package/src/providers/approval-utils.d.ts +5 -0
  321. package/src/providers/approval-utils.ts +57 -5
  322. package/src/providers/chat-message-normalization.ts +46 -6
  323. package/src/providers/cli-provider-instance.ts +1416 -101
  324. package/src/providers/contracts.d.ts +55 -0
  325. package/src/providers/contracts.ts +150 -6
  326. package/src/providers/extension-provider-instance.ts +12 -7
  327. package/src/providers/external-sources.ts +218 -0
  328. package/src/providers/ide-provider-instance.ts +35 -12
  329. package/src/providers/manual-attendance.ts +85 -0
  330. package/src/providers/native-history/antigravity-cli-transcript.ts +643 -0
  331. package/src/providers/native-history/claude-cli-transcript.ts +396 -0
  332. package/src/providers/native-history/codex-cli-transcript.ts +479 -0
  333. package/src/providers/native-history/constants.ts +19 -0
  334. package/src/providers/native-history/dispatcher.ts +339 -0
  335. package/src/providers/native-history/hermes-cli-transcript.ts +230 -0
  336. package/src/providers/native-history/index.ts +30 -0
  337. package/src/providers/provider-instance-manager.ts +30 -0
  338. package/src/providers/provider-instance.ts +19 -1
  339. package/src/providers/provider-loader.ts +668 -50
  340. package/src/providers/provider-schema.ts +87 -14
  341. package/src/providers/provider-trust.ts +114 -0
  342. package/src/providers/read-chat-contract.ts +76 -16
  343. package/src/providers/sdk/README.md +49 -0
  344. package/src/providers/sdk/v1/builders/acp/detect-status.ts +144 -0
  345. package/src/providers/sdk/v1/builders/cli/detect-status.ts +313 -0
  346. package/src/providers/sdk/v1/builders/cli/parse-approval-squash.ts +158 -0
  347. package/src/providers/sdk/v1/builders/cli/parse-approval.ts +250 -0
  348. package/src/providers/sdk/v1/builders/cli/parse-session.ts +276 -0
  349. package/src/providers/sdk/v1/builders/cli/visible-region.ts +143 -0
  350. package/src/providers/sdk/v1/fixture-tooling/format.ts +130 -0
  351. package/src/providers/sdk/v1/fixture-tooling/index.ts +22 -0
  352. package/src/providers/sdk/v1/fixture-tooling/replay.ts +352 -0
  353. package/src/providers/sdk/v1/index.ts +152 -0
  354. package/src/providers/sdk/v1/sandbox/README-design.ts +195 -0
  355. package/src/providers/sdk/v1/sandbox/require-whitelist.ts +472 -0
  356. package/src/providers/sdk/v1/sandbox/script-runner.ts +150 -0
  357. package/src/providers/sdk/v1/schemas/cli/provider.schema.json +504 -0
  358. package/src/providers/sdk/v1/schemas/primitives/acp-session-protocol-v1.json +131 -0
  359. package/src/providers/sdk/v1/schemas/primitives/native-history-codex-rollout-v1.json +66 -0
  360. package/src/providers/sdk/v1/schemas/primitives/tui-approval-squash-v1.json +91 -0
  361. package/src/providers/sdk/v1/schemas/primitives/tui-assistant-block-v1.json +91 -0
  362. package/src/providers/sdk/v1/schemas/primitives/tui-cue-ordering-v1.json +47 -0
  363. package/src/providers/sdk/v1/schemas/primitives/tui-dispatch-order-v1.json +32 -0
  364. package/src/providers/sdk/v1/schemas/primitives/tui-footer-chrome-v1.json +42 -0
  365. package/src/providers/sdk/v1/schemas/primitives/tui-index-finder-v1.json +27 -0
  366. package/src/providers/sdk/v1/schemas/primitives/tui-modal-v1.json +125 -0
  367. package/src/providers/sdk/v1/schemas/primitives/tui-prompt-marker-v1.json +45 -0
  368. package/src/providers/sdk/v1/schemas/primitives/tui-session-id-extraction-v1.json +46 -0
  369. package/src/providers/sdk/v1/schemas/primitives/tui-settled-prompt-v1.json +71 -0
  370. package/src/providers/sdk/v1/schemas/primitives/tui-spinner-v1.json +83 -0
  371. package/src/providers/sdk/v1/schemas/primitives/tui-transcript-pty-v1.json +83 -0
  372. package/src/providers/sdk/v1/schemas/primitives/tui-visible-region-v1.json +57 -0
  373. package/src/providers/sdk/v1/schemas/primitives/tui-welcome-screen-v1.json +35 -0
  374. package/src/providers/sdk/v1/types/cli/index.ts +365 -0
  375. package/src/providers/sdk/v1/types/common/index.ts +229 -0
  376. package/src/providers/sdk/v1/validators/index.ts +19 -0
  377. package/src/providers/sdk/v1/validators/manifest.ts +110 -0
  378. package/src/providers/sdk/v1/validators/taint.ts +309 -0
  379. package/src/providers/spec/adapter.ts +235 -0
  380. package/src/providers/spec/cli-adapter.ts +1051 -0
  381. package/src/providers/spec/evaluator.ts +407 -0
  382. package/src/providers/spec/fsm-driver.ts +1292 -0
  383. package/src/providers/spec/fsm-evaluator.ts +272 -0
  384. package/src/providers/spec/fsm-loader.ts +120 -0
  385. package/src/providers/spec/fsm-types.ts +273 -0
  386. package/src/providers/spec/native-history-executor.ts +1128 -0
  387. package/src/providers/spec/pre-launch-trust.ts +104 -0
  388. package/src/providers/spec/route.ts +51 -0
  389. package/src/providers/spec/types.ts +262 -0
  390. package/src/providers/status-monitor.d.ts +7 -7
  391. package/src/providers/status-monitor.ts +37 -22
  392. package/src/providers/transcript-v2.ts +567 -0
  393. package/src/providers/types/interactive-prompt.ts +536 -0
  394. package/src/providers/version-archive.ts +64 -24
  395. package/src/providers/working-dir.ts +23 -0
  396. package/src/repo-mesh-types.ts +542 -14
  397. package/src/runtime-defaults.ts +39 -0
  398. package/src/sessions/registry.ts +6 -0
  399. package/src/shared-types-extra.ts +2 -4
  400. package/src/shared-types.d.ts +8 -0
  401. package/src/shared-types.ts +64 -1
  402. package/src/status/builders.ts +26 -6
  403. package/src/status/normalize.ts +2 -0
  404. package/src/status/reporter.ts +19 -1
  405. package/src/status/snapshot.ts +95 -26
  406. package/src/system/hash.ts +23 -0
  407. package/src/system/host-memory.ts +29 -12
  408. package/src/system/load-better-sqlite3.ts +68 -0
  409. package/src/types.ts +5 -0
  410. package/dist/cli-adapters/terminal-backends/xterm-backend.d.ts +0 -17
  411. package/dist/mesh/mesh-sync.d.ts +0 -53
  412. package/src/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +0 -16
  413. package/src/cli-adapters/terminal-backends/xterm-backend.ts +0 -97
  414. package/src/mesh/mesh-sync.ts +0 -111
@@ -0,0 +1,642 @@
1
+ /**
2
+ * RF-ROUTER HIGH family — mesh aggregate status + review inbox.
3
+ *
4
+ * mesh_status: the coordinator's aggregate mesh render — resolves membership,
5
+ * gates the memory cache against pending coordinator events / explicit refresh,
6
+ * optionally fans out a direct peer-truth probe, then renders per-node health
7
+ * (live session records, local/remote/inline git truth, branch convergence) and
8
+ * folds in queue/ledger/missions/async-refine/historical-session/active-refine
9
+ * state. get_mesh_review_inbox: derives review-inbox items from node statuses +
10
+ * ledger and annotates each with a worktree git-diff summary. Extracted verbatim
11
+ * from executeDaemonCommand — only `this.*` router members became `ctx.*` and the
12
+ * relative dynamic-import paths were re-based one directory deeper.
13
+ */
14
+ import * as fs from 'fs';
15
+ import { hostname as osHostname } from 'os';
16
+ import { loadConfig } from '../../config/config.js';
17
+ import { getGitRepoStatus } from '../../git/git-status.js';
18
+ import {
19
+ normalizeMeshNodeId,
20
+ daemonIdsEquivalent,
21
+ } from '@adhdev/mesh-shared';
22
+ import { getPendingMeshCoordinatorEvents } from '../../mesh/mesh-events.js';
23
+ import { getRecentUnroutableDeliveries } from '../../mesh/mesh-routing.js';
24
+ import { normalizeMeshDaemonRole, resolveMeshHostStatus } from '../../mesh/mesh-host-ownership.js';
25
+ import { buildPreviewFreshness } from '../../mesh/preview-freshness.js';
26
+ import { buildMeshAsyncRefineJobs } from '../../mesh/mesh-refine-status.js';
27
+ import { partitionSessionHostRecords } from '../../session-host/runtime-surface.js';
28
+ import {
29
+ readStringValue,
30
+ readObjectRecord,
31
+ readBooleanValue,
32
+ readMeshNodeMachineId,
33
+ readMeshNodeHostname,
34
+ readProviderPriorityFromPolicy,
35
+ buildMeshNodeMachineIdentity,
36
+ buildMeshNodeDisplayLabel,
37
+ collectLiveMeshSessionRecords,
38
+ readLiveMeshNodeWorkspace,
39
+ summarizeMeshSessionRecord,
40
+ buildInlineMeshTransitGitStatus,
41
+ deriveMeshNodeHealthFromGit,
42
+ buildLivePeerGitConnection,
43
+ probeRemoteMeshGitStatusWithRetry,
44
+ recordInlineMeshDirectGitTruth,
45
+ persistNodeReporterPlatform,
46
+ applyCachedInlineMeshNodeStatus,
47
+ applyInlineMeshBranchConvergence,
48
+ finalizeMeshNodeStatus,
49
+ summarizeInlineMeshBranchConvergence,
50
+ buildHistoricalMeshSessions,
51
+ hydrateInlineMeshDirectTruth,
52
+ MESH_NODE_LIVE_TRUTH_MARKER,
53
+ logRepoMeshStatusDebug,
54
+ summarizeRepoMeshStatusDebug,
55
+ MESH_DIRECT_PROBE_TIMEOUT_MS,
56
+ MESH_DIRECT_PROBE_RETRY_TIMEOUT_MS,
57
+ } from '../router.js';
58
+ import type { HighFamilyContext, HighFamilyHandler } from './types.js';
59
+
60
+ export const meshStatusHandlers: Record<string, HighFamilyHandler> = {
61
+ mesh_status: async (ctx: HighFamilyContext, args: any) => {
62
+ const meshId = typeof args?.meshId === 'string' ? args.meshId.trim() : '';
63
+ if (!meshId) return { success: false, error: 'meshId required' };
64
+ try {
65
+ const meshRecord = await ctx.getMeshForCommand(meshId, args?.inlineMesh, { preferInline: true });
66
+ const mesh = meshRecord?.mesh;
67
+ if (!mesh) return { success: false, error: 'Mesh not found' };
68
+ const meshHost = resolveMeshHostStatus(mesh);
69
+
70
+ const refreshRequested = args?.refresh === true || args?.forceRefresh === true;
71
+ // Compact (default) elides each mission's full goal text from the
72
+ // payload — coordinators polling node health don't need every
73
+ // mission's multi-hundred-char goal repeated. verbose=true (or the
74
+ // explicit compact=false) restores full goals. Verbose bypasses the
75
+ // shared (compact) aggregate cache so a verbose call never poisons
76
+ // the compact cache and vice versa.
77
+ const verboseMissions = args?.verbose === true || args?.compact === false;
78
+ // See (B3) below: scope the peek to this daemon when the
79
+ // caller doesn't tell us, otherwise scoped events look
80
+ // missing and we falsely return a stale cache.
81
+ const peekScope = typeof args?.coordinatorDaemonId === 'string' && args.coordinatorDaemonId.trim()
82
+ ? args.coordinatorDaemonId.trim()
83
+ : (ctx.deps.statusInstanceId || undefined);
84
+ const pendingCoordinatorEventCount = getPendingMeshCoordinatorEvents(meshId, peekScope).length;
85
+ const hadAggregateCache = ctx.aggregateMeshStatusCache.has(meshId);
86
+ if (!refreshRequested && !verboseMissions && pendingCoordinatorEventCount === 0) {
87
+ const cachedStatus = ctx.getCachedAggregateMeshStatus(meshId, mesh, { requireDirectPeerTruth: args?.requireDirectPeerTruth === true });
88
+ if (cachedStatus) {
89
+ logRepoMeshStatusDebug('return_cached', {
90
+ meshId,
91
+ command: 'mesh_status',
92
+ refreshRequested,
93
+ summary: summarizeRepoMeshStatusDebug(cachedStatus),
94
+ });
95
+ return cachedStatus;
96
+ }
97
+ }
98
+ const refreshReason = refreshRequested
99
+ ? 'explicit_refresh'
100
+ : pendingCoordinatorEventCount > 0
101
+ ? 'pending_coordinator_events'
102
+ : hadAggregateCache
103
+ ? 'stale_pending_cache_refresh'
104
+ : 'cold_cache_miss';
105
+
106
+ const { getMeshQueueStats, getQueue } = await import('../../mesh/mesh-work-queue.js');
107
+ const queue = getQueue(meshId);
108
+ const queueSummary = getMeshQueueStats(meshId);
109
+
110
+ const { readLedgerEntries, getLedgerSummary } = await import('../../mesh/mesh-ledger.js');
111
+ const ledgerEntries = readLedgerEntries(meshId, { tail: 20 });
112
+ const asyncRefineLedgerEntries = readLedgerEntries(meshId, { tail: 100 });
113
+ const ledgerSummary = getLedgerSummary(meshId);
114
+ const sessionHostRecords = ctx.deps.sessionHostControl?.listSessions
115
+ ? await ctx.deps.sessionHostControl.listSessions().catch(() => [])
116
+ : [];
117
+ const liveMeshSessions = partitionSessionHostRecords(Array.isArray(sessionHostRecords) ? sessionHostRecords : []).liveRuntimes;
118
+
119
+ const localMachineId = loadConfig().machineId || '';
120
+ const requireDirectPeerTruth = args?.requireDirectPeerTruth === true;
121
+ // Shared probe gate for this mesh_status call: the bootstrap
122
+ // hydrate below and the per-node render loop further down both
123
+ // probe the same peers — route both through this cache so they
124
+ // dedup within the call and reuse recent results across calls.
125
+ const meshGitProbeCache = ctx.meshGitProbeCache;
126
+ const directTruth = requireDirectPeerTruth
127
+ ? await hydrateInlineMeshDirectTruth({
128
+ mesh,
129
+ meshSource: meshRecord.source,
130
+ dispatchMeshCommand: ctx.deps.dispatchMeshCommand,
131
+ getMeshPeerConnectionStatus: ctx.deps.getMeshPeerConnectionStatus,
132
+ statusInstanceId: ctx.deps.statusInstanceId,
133
+ localMachineId,
134
+ // Standing-state model: only an explicit refresh fans
135
+ // out a blocking peer git probe. Default loads return
136
+ // held truth so one slow peer can't block the graph.
137
+ probeRemotePeers: refreshRequested,
138
+ probeCache: meshGitProbeCache,
139
+ })
140
+ : {
141
+ directEvidenceCount: 0,
142
+ localConfirmedCount: 0,
143
+ peerAttemptedCount: 0,
144
+ peerConfirmedCount: 0,
145
+ standingEvidenceCount: 0,
146
+ unavailableNodeIds: [] as string[],
147
+ deadNodeIds: [] as string[],
148
+ };
149
+ // Default/cached loads may not attempt a remote peer probe yet; do not surface that as
150
+ // a direct mesh truth failure until an explicit probe attempt actually fails.
151
+ const passivePeerTruthNotAttempted = requireDirectPeerTruth
152
+ && !refreshRequested
153
+ && directTruth.directEvidenceCount > 0
154
+ && directTruth.peerAttemptedCount === 0;
155
+ const effectiveDirectTruth = passivePeerTruthNotAttempted
156
+ ? { ...directTruth, unavailableNodeIds: [] as string[] }
157
+ : directTruth;
158
+ const unavailableDirectTruthNodeIds = new Set(effectiveDirectTruth.unavailableNodeIds);
159
+ const unavailableNodesAreOnlyRemovedWorktrees = unavailableDirectTruthNodeIds.size > 0
160
+ && Array.isArray(mesh.nodes)
161
+ && mesh.nodes
162
+ .filter((node: any) => unavailableDirectTruthNodeIds.has(normalizeMeshNodeId(node) ?? ''))
163
+ .every((node: any) => node?.isLocalWorktree === true);
164
+ // Default (non-refresh) loads never hard-fail: held
165
+ // standing-state truth is returned and the graph renders
166
+ // immediately. The hard mesh_direct_peer_truth_unavailable
167
+ // failure is reserved for an explicit refresh that actually
168
+ // attempted a peer probe and could not confirm any evidence.
169
+ const directTruthSatisfied = !requireDirectPeerTruth
170
+ || !refreshRequested
171
+ || (effectiveDirectTruth.directEvidenceCount > 0 && (effectiveDirectTruth.unavailableNodeIds.length === 0 || unavailableNodesAreOnlyRemovedWorktrees));
172
+ if (requireDirectPeerTruth && refreshRequested && !directTruthSatisfied) {
173
+ const failureResult = {
174
+ success: false,
175
+ code: 'mesh_direct_peer_truth_unavailable',
176
+ error: 'Selected coordinator could not confirm direct mesh truth yet. Bootstrap inventory stays unavailable until direct mesh_status probes succeed.',
177
+ sourceOfTruth: {
178
+ membership: meshRecord.source === 'inline_cache'
179
+ ? 'coordinator_inline_mesh_cache'
180
+ : meshRecord.source === 'local_config'
181
+ ? 'local_mesh_config'
182
+ : 'inline_bootstrap_snapshot',
183
+ coordinatorOwnsLiveTruth: false,
184
+ currentStatus: 'direct_peer_truth_unavailable',
185
+ directPeerTruth: {
186
+ required: true,
187
+ satisfied: false,
188
+ directEvidenceCount: directTruth.directEvidenceCount,
189
+ localConfirmedCount: directTruth.localConfirmedCount,
190
+ peerAttemptedCount: directTruth.peerAttemptedCount,
191
+ peerConfirmedCount: directTruth.peerConfirmedCount,
192
+ unavailableNodeIds: directTruth.unavailableNodeIds,
193
+ },
194
+ },
195
+ };
196
+ logRepoMeshStatusDebug('direct_truth_unavailable', {
197
+ meshId,
198
+ command: 'mesh_status',
199
+ refreshRequested,
200
+ meshSource: meshRecord.source,
201
+ directTruth,
202
+ });
203
+ return failureResult;
204
+ }
205
+ const directTruthUnavailableNodeIds = new Set(effectiveDirectTruth.unavailableNodeIds);
206
+ const coordinatorHostname = osHostname();
207
+ const selectedCoordinatorNodeId = readStringValue(
208
+ mesh.coordinator?.preferredNodeId,
209
+ normalizeMeshNodeId(mesh.nodes?.[0] as any),
210
+ );
211
+ const inlineCoordinatorNodeId = meshRecord?.inline && Array.isArray(mesh.nodes)
212
+ ? selectedCoordinatorNodeId
213
+ : undefined;
214
+ const refreshedAt = new Date().toISOString();
215
+ const nodeStatuses = [];
216
+ for (const [nodeIndex, node] of (mesh.nodes || []).entries()) {
217
+ const nodeId = normalizeMeshNodeId(node) ?? '';
218
+ const daemonId = readStringValue(node.daemonId);
219
+ const nodeMachineId = readMeshNodeMachineId(node as Record<string, unknown>);
220
+ const nodeHostname = readMeshNodeHostname(node as Record<string, unknown>);
221
+ const providerPriority = readProviderPriorityFromPolicy(node.policy);
222
+ const configuredCoordinatorNode = Boolean(
223
+ nodeId && selectedCoordinatorNodeId && nodeId === selectedCoordinatorNodeId,
224
+ );
225
+ const sparseConfiguredCoordinatorNode = configuredCoordinatorNode
226
+ && !daemonId
227
+ && !nodeMachineId
228
+ && !nodeHostname;
229
+ const isSelfNode = Boolean(
230
+ nodeId && inlineCoordinatorNodeId && nodeId === inlineCoordinatorNodeId,
231
+ ) || Boolean(
232
+ daemonId && (daemonIdsEquivalent(daemonId, localMachineId) || daemonIdsEquivalent(daemonId, ctx.deps.statusInstanceId)),
233
+ ) || Boolean(meshRecord?.inline && nodeIndex === 0)
234
+ || sparseConfiguredCoordinatorNode;
235
+ const machineIdentity = buildMeshNodeMachineIdentity(node as Record<string, unknown>, {
236
+ localMachineId,
237
+ localDaemonId: ctx.deps.statusInstanceId,
238
+ coordinatorHostname,
239
+ isSelfNode,
240
+ });
241
+ const status: Record<string, unknown> = {
242
+ nodeId,
243
+ machineLabel: buildMeshNodeDisplayLabel(node as Record<string, unknown>, nodeId, providerPriority),
244
+ labelSource: readStringValue(node.machineLabel, node.machine_label, node.machineNickname, node.machine_nickname, node.alias)
245
+ ? 'explicit_metadata'
246
+ : 'workspace_host_provider_context',
247
+ workspace: node.workspace,
248
+ repoRoot: node.repoRoot,
249
+ isLocalWorktree: node.isLocalWorktree,
250
+ worktreeBranch: node.worktreeBranch,
251
+ role: normalizeMeshDaemonRole(node.role) || (meshHost.hostNodeId && nodeId === meshHost.hostNodeId ? 'host' : undefined),
252
+ daemonId,
253
+ machineId: nodeMachineId || node.machineId,
254
+ machine: machineIdentity,
255
+ machineStatus: node.machineStatus,
256
+ health: 'unknown',
257
+ providers: node.providers || [],
258
+ providerPriority,
259
+ activeSessions: [],
260
+ activeSessionDetails: [],
261
+ launchReady: false,
262
+ };
263
+ if (isSelfNode) {
264
+ status.connection = {
265
+ perspective: 'selected_coordinator',
266
+ source: 'mesh_peer_status',
267
+ state: 'self',
268
+ transport: 'local',
269
+ reported: true,
270
+ reason: 'Selected coordinator daemon',
271
+ lastStateChangeAt: refreshedAt,
272
+ };
273
+ } else if (daemonId) {
274
+ const connection = ctx.deps.getMeshPeerConnectionStatus?.(daemonId);
275
+ status.connection = connection ?? {
276
+ perspective: 'selected_coordinator',
277
+ source: 'not_reported',
278
+ state: 'unknown',
279
+ transport: 'unknown',
280
+ reported: false,
281
+ reason: 'No live mesh peer telemetry reported by the selected coordinator yet.',
282
+ };
283
+ } else {
284
+ status.connection = {
285
+ perspective: 'selected_coordinator',
286
+ source: 'not_reported',
287
+ state: 'unknown',
288
+ transport: 'unknown',
289
+ reported: false,
290
+ reason: 'Node has no daemon id, so mesh transport cannot be reported from the selected coordinator.',
291
+ };
292
+ }
293
+ const matchedLiveSessionRecords = collectLiveMeshSessionRecords({
294
+ meshId,
295
+ node,
296
+ nodeId,
297
+ liveSessionRecords: liveMeshSessions,
298
+ allowCoordinatorSession: nodeId === selectedCoordinatorNodeId,
299
+ });
300
+ const workspace = readLiveMeshNodeWorkspace({
301
+ meshId,
302
+ nodeId,
303
+ liveSessionRecords: matchedLiveSessionRecords,
304
+ allowCoordinatorSession: nodeId === selectedCoordinatorNodeId,
305
+ }) || (typeof node.workspace === 'string' ? node.workspace : '');
306
+ status.workspace = workspace || node.workspace;
307
+ if (matchedLiveSessionRecords.length > 0) {
308
+ const sessionIds = matchedLiveSessionRecords
309
+ .map((record: any) => typeof record?.sessionId === 'string' ? record.sessionId : '')
310
+ .filter(Boolean);
311
+ const providerTypes = matchedLiveSessionRecords
312
+ .map((record: any) => readStringValue(record?.providerType))
313
+ .filter(Boolean) as string[];
314
+ status.activeSessions = sessionIds;
315
+ status.activeSessionDetails = matchedLiveSessionRecords.map(summarizeMeshSessionRecord);
316
+ if (providerTypes.length > 0) {
317
+ status.providers = Array.from(new Set([...(Array.isArray(status.providers) ? status.providers as string[] : []), ...providerTypes]));
318
+ }
319
+ }
320
+ if (workspace) {
321
+ if (!fs.existsSync(workspace)) {
322
+ // Workspace not local — prefer direct live inline truth, then attempt a P2P git probe.
323
+ const inlineTransitGit = buildInlineMeshTransitGitStatus(node);
324
+ let remoteProbeApplied = false;
325
+ if (inlineTransitGit) {
326
+ status.git = inlineTransitGit;
327
+ status.health = inlineTransitGit.isGitRepo
328
+ ? deriveMeshNodeHealthFromGit(inlineTransitGit as unknown as Record<string, unknown>)
329
+ : 'degraded';
330
+ const connection = readObjectRecord(status.connection);
331
+ const connectionState = readStringValue(connection.state);
332
+ const connectionReported = readBooleanValue(connection.reported) ?? false;
333
+ if (!connectionReported || connectionState === 'unknown') {
334
+ status.connection = buildLivePeerGitConnection(connection, refreshedAt);
335
+ }
336
+ remoteProbeApplied = true;
337
+ } else if (refreshRequested && !isSelfNode && daemonId && ctx.deps.dispatchMeshCommand && !directTruthUnavailableNodeIds.has(nodeId)) {
338
+ // Only an explicit refresh fans out a blocking
339
+ // per-node git probe. On the default load a peer
340
+ // with no held truth falls through to
341
+ // gitProbePending below — the graph still renders.
342
+ // Bounded retry (shared with the bootstrap hydrate
343
+ // path), gated on the peer staying connected, so a
344
+ // slow TURN-relayed peer is recovered rather than
345
+ // dropped after a single timeout.
346
+ const runNodeProbe = () => probeRemoteMeshGitStatusWithRetry({
347
+ dispatchMeshCommand: ctx.deps.dispatchMeshCommand,
348
+ daemonId,
349
+ workspace,
350
+ timeoutMs: MESH_DIRECT_PROBE_TIMEOUT_MS,
351
+ retryTimeoutMs: MESH_DIRECT_PROBE_RETRY_TIMEOUT_MS,
352
+ getConnection: ctx.deps.getMeshPeerConnectionStatus,
353
+ onConnection: connection => { status.connection = connection; },
354
+ });
355
+ // Same shared cache as the bootstrap hydrate path: within one
356
+ // mesh_status call this dedups the bootstrap probe against this
357
+ // per-node probe for the same peer, and across calls it reuses a
358
+ // recent result so the dashboard auto-retry loop can't restart a
359
+ // fresh refreshUpstream probe seconds apart.
360
+ const remoteGit = await meshGitProbeCache.probe(daemonId, workspace, runNodeProbe);
361
+ if (remoteGit) {
362
+ status.git = remoteGit;
363
+ status[MESH_NODE_LIVE_TRUTH_MARKER] = true;
364
+ status.health = remoteGit.isGitRepo
365
+ ? deriveMeshNodeHealthFromGit(remoteGit as unknown as Record<string, unknown>)
366
+ : 'degraded';
367
+ const connection = readObjectRecord(status.connection);
368
+ const connectionState = readStringValue(connection.state);
369
+ const connectionReported = readBooleanValue(connection.reported) ?? false;
370
+ if (!connectionReported || connectionState === 'unknown') {
371
+ status.connection = buildLivePeerGitConnection(connection, refreshedAt);
372
+ }
373
+ const reporter = recordInlineMeshDirectGitTruth(node, remoteGit, 'selected_coordinator_mesh_p2p_git');
374
+ persistNodeReporterPlatform(meshRecord.source, mesh, nodeId, reporter);
375
+ remoteProbeApplied = true;
376
+ }
377
+ }
378
+ if (!remoteProbeApplied) {
379
+ const connectionState = readStringValue((status.connection as any)?.state);
380
+ const pendingPeerGitProbe = !inlineTransitGit
381
+ && !isSelfNode
382
+ && !!daemonId
383
+ && (
384
+ readStringValue(status.machineStatus) === 'online'
385
+ || readStringValue(status.health) === 'online'
386
+ || connectionState === 'connecting'
387
+ || connectionState === 'connected'
388
+ || connectionState === 'unknown'
389
+ );
390
+ if (pendingPeerGitProbe) {
391
+ status.gitProbePending = true;
392
+ status.health = 'unknown';
393
+ }
394
+ if (applyCachedInlineMeshNodeStatus(
395
+ status,
396
+ node,
397
+ pendingPeerGitProbe ? { skipGit: true, skipError: true, skipHealth: true } : undefined,
398
+ )) {
399
+ applyInlineMeshBranchConvergence(mesh, node, status);
400
+ finalizeMeshNodeStatus({ status, node, daemonId, isSelfNode, directTruthUnavailable: directTruthUnavailableNodeIds.has(nodeId) });
401
+ nodeStatuses.push(status);
402
+ continue;
403
+ }
404
+ if (meshRecord?.source === 'inline_cache' && !isSelfNode) {
405
+ applyInlineMeshBranchConvergence(mesh, node, status);
406
+ finalizeMeshNodeStatus({ status, node, daemonId, isSelfNode, directTruthUnavailable: directTruthUnavailableNodeIds.has(nodeId) });
407
+ nodeStatuses.push(status);
408
+ continue;
409
+ }
410
+ }
411
+ } else {
412
+ try {
413
+ const gitStatus = await getGitRepoStatus(workspace, { timeoutMs: 10_000, refreshUpstream: true });
414
+ status.git = gitStatus;
415
+ status[MESH_NODE_LIVE_TRUTH_MARKER] = true;
416
+ const reporter = recordInlineMeshDirectGitTruth(node, gitStatus as unknown as Record<string, unknown>, 'selected_coordinator_local_git');
417
+ persistNodeReporterPlatform(meshRecord.source, mesh, nodeId, reporter);
418
+ if (gitStatus.isGitRepo) {
419
+ status.health = deriveMeshNodeHealthFromGit(gitStatus as unknown as Record<string, unknown>);
420
+ } else {
421
+ status.health = 'degraded';
422
+ if (gitStatus.error && !status.error) status.error = gitStatus.error;
423
+ }
424
+ } catch {
425
+ if (!applyCachedInlineMeshNodeStatus(status, node)) {
426
+ status.health = 'degraded';
427
+ }
428
+ }
429
+ }
430
+ } else {
431
+ applyCachedInlineMeshNodeStatus(status, node);
432
+ }
433
+ applyInlineMeshBranchConvergence(mesh, node, status);
434
+ finalizeMeshNodeStatus({ status, node, daemonId, isSelfNode, directTruthUnavailable: directTruthUnavailableNodeIds.has(nodeId) });
435
+ nodeStatuses.push(status);
436
+ }
437
+
438
+ // (B3) Resolve the coordinator daemon scope for the peek.
439
+ // mesh_status is a read-only status query — it must not consume
440
+ // (drain) pending events as a side effect. Coordinators that see
441
+ // pendingCoordinatorEvents in the response are expected to call
442
+ // get_pending_mesh_events to explicitly drain them after processing.
443
+ const callerCoordinatorDaemonId = typeof args?.coordinatorDaemonId === 'string' && args.coordinatorDaemonId.trim()
444
+ ? args.coordinatorDaemonId.trim()
445
+ : (ctx.deps.statusInstanceId || undefined);
446
+ const pendingCoordinatorEvents = getPendingMeshCoordinatorEvents(meshId, callerCoordinatorDaemonId);
447
+ // R4: surface recent fail-loud routing drops so a coordinator/operator can see
448
+ // that a worker completion was lost (envelope present, mesh unresolved) instead
449
+ // of it vanishing silently. Diagnostic-only — never cached (see omit below).
450
+ const unroutableDeliveries = getRecentUnroutableDeliveries();
451
+ const previewFreshness = (() => {
452
+ const localRepoRoot = nodeStatuses
453
+ .map((node: any) => readStringValue(node?.git?.repoRoot, node?.repoRoot, node?.workspace))
454
+ .find((candidate: string | undefined) => !!candidate && fs.existsSync(candidate));
455
+ return localRepoRoot ? buildPreviewFreshness(localRepoRoot) : undefined;
456
+ })();
457
+ const asyncRefineJobs = buildMeshAsyncRefineJobs({
458
+ meshId,
459
+ ledgerEntries: asyncRefineLedgerEntries,
460
+ pendingEvents: [...pendingCoordinatorEvents],
461
+ });
462
+ const historicalSessions = buildHistoricalMeshSessions({
463
+ meshId,
464
+ nodes: mesh.nodes || [],
465
+ liveSessionRecords: liveMeshSessions,
466
+ });
467
+ const { getMeshStatusMissionSummaries } = await import('../../mesh/mesh-missions.js');
468
+ // withStats opts in to per-mission operational rollups (durations /
469
+ // retries) for the dashboard mission detail. The rollup scans a
470
+ // bounded ledger tail per mission, but only over the bounded set
471
+ // returned here (live + capped history), so the cost stays linear
472
+ // in visible missions rather than the whole mesh history.
473
+ const missions = getMeshStatusMissionSummaries(meshId, { verbose: verboseMissions, withStats: true });
474
+ const statusResult = {
475
+ success: true,
476
+ meshId: mesh.id,
477
+ meshName: mesh.name,
478
+ repoIdentity: mesh.repoIdentity,
479
+ defaultBranch: mesh.defaultBranch,
480
+ refreshedAt,
481
+ meshHost,
482
+ sourceOfTruth: {
483
+ membership: meshRecord?.source === 'inline_cache'
484
+ ? 'coordinator_inline_mesh_cache'
485
+ : meshRecord?.source === 'local_config'
486
+ ? 'local_mesh_config'
487
+ : 'inline_bootstrap_snapshot',
488
+ coordinatorOwnsLiveTruth: directTruthSatisfied,
489
+ meshHost: {
490
+ owner: 'mesh_host_daemon',
491
+ localRole: meshHost.role,
492
+ hostDaemonId: meshHost.hostDaemonId,
493
+ hostNodeId: meshHost.hostNodeId,
494
+ hostAddress: meshHost.hostAddress,
495
+ },
496
+ ...(requireDirectPeerTruth ? {
497
+ currentStatus: directTruthSatisfied ? 'live_git_and_session_probes' : 'direct_peer_truth_unavailable',
498
+ directPeerTruth: {
499
+ required: true,
500
+ satisfied: directTruthSatisfied,
501
+ directEvidenceCount: effectiveDirectTruth.directEvidenceCount,
502
+ localConfirmedCount: effectiveDirectTruth.localConfirmedCount,
503
+ peerAttemptedCount: effectiveDirectTruth.peerAttemptedCount,
504
+ peerConfirmedCount: effectiveDirectTruth.peerConfirmedCount,
505
+ unavailableNodeIds: effectiveDirectTruth.unavailableNodeIds,
506
+ partialNodeFailures: effectiveDirectTruth.unavailableNodeIds,
507
+ },
508
+ } : {}),
509
+ historicalEvidenceOnly: ['recoveryHints', 'ledger.summary', 'queue.summary', 'historicalSessions'],
510
+ },
511
+ branchConvergenceSummary: summarizeInlineMeshBranchConvergence(nodeStatuses),
512
+ ...(previewFreshness ? { previewFreshness, deployFreshness: previewFreshness } : {}),
513
+ nodes: nodeStatuses,
514
+ queue: { tasks: queue, summary: queueSummary },
515
+ ledger: { entries: ledgerEntries, summary: ledgerSummary },
516
+ ...(missions.length > 0 ? { missions } : {}),
517
+ ...(asyncRefineJobs.length > 0 ? { asyncRefineJobs } : {}),
518
+ ...(historicalSessions ? { historicalSessions } : {}),
519
+ ...(pendingCoordinatorEvents.length > 0 ? { pendingCoordinatorEvents } : {}),
520
+ ...(unroutableDeliveries.length > 0 ? { unroutableDeliveries } : {}),
521
+ activeRefineJobs: Array.from(ctx.runningRefineJobs.values())
522
+ .filter(job => job.meshId === meshId)
523
+ .map(job => ({
524
+ jobId: job.jobId,
525
+ nodeId: job.targetNodeId,
526
+ workspace: job.workspace,
527
+ startedAt: job.startedAt,
528
+ status: job.status,
529
+ targetCoordinatorDaemonId: job.targetCoordinatorDaemonId,
530
+ })),
531
+ };
532
+ const { pendingCoordinatorEvents: _pendingCoordinatorEvents, unroutableDeliveries: _unroutableDeliveries, ...cacheableStatusResult } = statusResult as any;
533
+ // Verbose carries full mission goals; never store it in the shared
534
+ // (compact) aggregate cache or a later compact poll would return the
535
+ // heavy goals from cache. Return it without caching.
536
+ const rememberedStatus = verboseMissions
537
+ ? cacheableStatusResult
538
+ : ctx.rememberAggregateMeshStatus(meshId, cacheableStatusResult, refreshReason);
539
+ const returnedStatus = {
540
+ ...rememberedStatus,
541
+ ...(pendingCoordinatorEvents.length > 0 ? { pendingCoordinatorEvents } : {}),
542
+ ...(unroutableDeliveries.length > 0 ? { unroutableDeliveries } : {}),
543
+ };
544
+ logRepoMeshStatusDebug('return_live', {
545
+ meshId,
546
+ command: 'mesh_status',
547
+ refreshRequested,
548
+ refreshReason,
549
+ meshSource: meshRecord.source,
550
+ directTruth,
551
+ summary: summarizeRepoMeshStatusDebug(returnedStatus),
552
+ });
553
+ return returnedStatus;
554
+ } catch (e: any) {
555
+ return { success: false, error: e.message };
556
+ }
557
+ },
558
+
559
+ get_mesh_review_inbox: async (ctx: HighFamilyContext, args: any) => {
560
+ const meshId = typeof args?.meshId === 'string' ? args.meshId.trim() : '';
561
+ if (!meshId) return { success: false, error: 'meshId required' };
562
+ try {
563
+ const { deriveMeshReviewInboxItems } = await import('../../mesh/mesh-review-inbox.js');
564
+ const { readLedgerEntries } = await import('../../mesh/mesh-ledger.js');
565
+ const { getGitDiffSummary } = await import('../../git/git-diff.js');
566
+ const { existsSync } = await import('node:fs');
567
+
568
+ const meshRecord = await ctx.getMeshForCommand(meshId, args?.inlineMesh, { preferInline: true });
569
+ const mesh = meshRecord?.mesh;
570
+ if (!mesh) return { success: false, error: 'Mesh not found' };
571
+
572
+ // Ensure we have a fresh aggregate status so nodeStatuses carry
573
+ // computed fields (connection.state, branchConvergence, isLocalWorktree)
574
+ // that the raw mesh.nodes config objects don't have.
575
+ // When the caller provides an inlineMesh, prefer its nodes directly
576
+ // (they already carry the computed fields from the coordinator).
577
+ const inlineNodes = args?.inlineMesh && Array.isArray((args.inlineMesh as any)?.nodes)
578
+ ? (args.inlineMesh as any).nodes as Record<string, unknown>[]
579
+ : null;
580
+ let cachedStatus = !inlineNodes ? ctx.getCachedAggregateMeshStatus(meshId, mesh, {}) : null;
581
+ if (!cachedStatus && !inlineNodes) {
582
+ const freshStatus = await ctx.execute('mesh_status', {
583
+ meshId,
584
+ inlineMesh: args?.inlineMesh,
585
+ refresh: true,
586
+ }, 'get_mesh_review_inbox');
587
+ cachedStatus = (freshStatus?.success !== false) ? freshStatus : null;
588
+ }
589
+ const nodeStatuses: Record<string, unknown>[] = inlineNodes
590
+ ? inlineNodes
591
+ : Array.isArray(cachedStatus?.nodes)
592
+ ? cachedStatus.nodes as Record<string, unknown>[]
593
+ : Array.isArray(mesh.nodes)
594
+ ? mesh.nodes as Record<string, unknown>[]
595
+ : [];
596
+
597
+ const ledgerEntries = readLedgerEntries(meshId, { tail: 300 });
598
+ const derivation = deriveMeshReviewInboxItems({ nodes: nodeStatuses, ledgerEntries });
599
+
600
+ for (const item of derivation.items) {
601
+ const workspace = item.workspace;
602
+ if (!workspace || !existsSync(workspace)) continue;
603
+ const baseRef = item.defaultBranch
604
+ ? `origin/${item.defaultBranch}`
605
+ : 'origin/main';
606
+ try {
607
+ const diffResult = await getGitDiffSummary(workspace, { baseRef, maxFiles: 100 });
608
+ if (diffResult.isGitRepo) {
609
+ item.diffSummary = {
610
+ baseRef,
611
+ files: diffResult.files.map(f => ({
612
+ path: f.path,
613
+ status: f.status,
614
+ insertions: f.insertions,
615
+ deletions: f.deletions,
616
+ binary: f.binary,
617
+ oldPath: f.oldPath,
618
+ })),
619
+ totalFiles: diffResult.files.length,
620
+ totalInsertions: diffResult.totalInsertions,
621
+ totalDeletions: diffResult.totalDeletions,
622
+ truncated: diffResult.truncated,
623
+ ...(diffResult.error ? { error: diffResult.error } : {}),
624
+ };
625
+ }
626
+ } catch {
627
+ item.diffSummary = null;
628
+ }
629
+ }
630
+
631
+ return {
632
+ success: true,
633
+ meshId,
634
+ inbox: derivation.items,
635
+ remoteNodesExcluded: derivation.remoteNodesExcluded,
636
+ excludedRemoteNodeIds: derivation.excludedRemoteNodeIds,
637
+ };
638
+ } catch (e: any) {
639
+ return { success: false, error: e.message };
640
+ }
641
+ },
642
+ };