@adhdev/daemon-core 0.9.82-rc.43 → 0.9.82-rc.430

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 (425) 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 +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 +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 +142 -0
  54. package/dist/commands/mesh-coordinator.d.ts +85 -1
  55. package/dist/commands/router.d.ts +276 -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 +100 -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 +11 -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 +64 -14
  74. package/dist/index.js +49391 -19228
  75. package/dist/index.js.map +1 -1
  76. package/dist/index.mjs +48574 -18570
  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 +9 -0
  102. package/dist/mesh/mesh-init.d.ts +86 -0
  103. package/dist/mesh/mesh-ledger-reconciliation.d.ts +23 -4
  104. package/dist/mesh/mesh-ledger.d.ts +77 -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 +289 -0
  108. package/dist/mesh/mesh-queue-assignment.d.ts +113 -0
  109. package/dist/mesh/mesh-reconcile-loop.d.ts +65 -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 +290 -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 +31 -1
  128. package/dist/providers/cli-provider-instance.d.ts +221 -3
  129. package/dist/providers/contracts.d.ts +139 -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 +100 -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 +91 -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 +422 -0
  166. package/dist/providers/spec/fsm-evaluator.d.ts +76 -0
  167. package/dist/providers/spec/fsm-loader.d.ts +14 -0
  168. package/dist/providers/spec/fsm-types.d.ts +174 -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 +501 -13
  178. package/dist/runtime-defaults.d.ts +2 -0
  179. package/dist/sessions/registry.d.ts +6 -0
  180. package/dist/shared-types-extra.d.ts +2 -4
  181. package/dist/shared-types.d.ts +59 -2
  182. package/dist/status/normalize.d.ts +1 -1
  183. package/dist/status/normalize.js +1 -0
  184. package/dist/status/normalize.js.map +1 -1
  185. package/dist/status/normalize.mjs +1 -0
  186. package/dist/status/normalize.mjs.map +1 -1
  187. package/dist/status/reporter.d.ts +2 -0
  188. package/dist/status/snapshot.d.ts +26 -0
  189. package/dist/system/hash.d.ts +8 -0
  190. package/dist/system/load-better-sqlite3.d.ts +21 -0
  191. package/dist/types.d.ts +5 -0
  192. package/package.json +7 -3
  193. package/src/agent-stream/poller.ts +2 -3
  194. package/src/agent-stream/provider-adapter.ts +1 -1
  195. package/src/boot/daemon-lifecycle.ts +63 -12
  196. package/src/boot/process-hardening.ts +89 -0
  197. package/src/build-info.ts +73 -0
  198. package/src/chat/source-machine.ts +534 -0
  199. package/src/chat/source-resolver.ts +0 -0
  200. package/src/chat/subscription-updates.ts +20 -1
  201. package/src/cli-adapter-types.d.ts +3 -1
  202. package/src/cli-adapter-types.ts +68 -2
  203. package/src/cli-adapters/cli-script-runner.ts +421 -0
  204. package/src/cli-adapters/cli-state-engine.ts +1246 -0
  205. package/src/cli-adapters/provider-cli-adapter.d.ts +1 -1
  206. package/src/cli-adapters/provider-cli-adapter.ts +914 -1144
  207. package/src/cli-adapters/provider-cli-parse.d.ts +2 -0
  208. package/src/cli-adapters/provider-cli-parse.ts +19 -0
  209. package/src/cli-adapters/provider-cli-runtime.ts +56 -7
  210. package/src/cli-adapters/provider-cli-shared.d.ts +4 -0
  211. package/src/cli-adapters/provider-cli-shared.ts +121 -11
  212. package/src/cli-adapters/pty-transport.ts +2 -1
  213. package/src/cli-adapters/pty-write-chunking.ts +106 -0
  214. package/src/cli-adapters/raw-terminal-io.ts +252 -0
  215. package/src/cli-adapters/resolve-executable.ts +204 -0
  216. package/src/cli-adapters/session-host-transport.ts +2 -1
  217. package/src/cli-adapters/terminal-backends/ghostty-vt-backend.ts +63 -29
  218. package/src/cli-adapters/terminal-backends/types.ts +10 -3
  219. package/src/cli-adapters/terminal-screen.ts +16 -81
  220. package/src/commands/WINDOWS-UPGRADE-LOCK-FAILURE.md +198 -0
  221. package/src/commands/chat-commands-debug-bundle.ts +398 -0
  222. package/src/commands/chat-commands-read.ts +2327 -0
  223. package/src/commands/chat-commands-scope.ts +54 -0
  224. package/src/commands/chat-commands-shared.ts +114 -0
  225. package/src/commands/chat-commands-write.ts +891 -0
  226. package/src/commands/chat-commands.ts +19 -1841
  227. package/src/commands/cli-manager.ts +544 -26
  228. package/src/commands/handler.ts +841 -2
  229. package/src/commands/high-family/index.ts +28 -0
  230. package/src/commands/high-family/mesh-coordinator-launch.ts +678 -0
  231. package/src/commands/high-family/mesh-events.ts +80 -0
  232. package/src/commands/high-family/mesh-status.ts +710 -0
  233. package/src/commands/high-family/types.ts +76 -0
  234. package/src/commands/low-family/coordinator-prompt.ts +72 -0
  235. package/src/commands/low-family/daemon-lifecycle.ts +107 -0
  236. package/src/commands/low-family/diagnostics.ts +57 -0
  237. package/src/commands/low-family/index.ts +37 -0
  238. package/src/commands/low-family/mesh-ledger.ts +62 -0
  239. package/src/commands/low-family/mesh-node-logs.ts +87 -0
  240. package/src/commands/low-family/notification.ts +116 -0
  241. package/src/commands/low-family/refine-config.ts +106 -0
  242. package/src/commands/low-family/session-host.ts +274 -0
  243. package/src/commands/low-family/spec-providerdev.ts +217 -0
  244. package/src/commands/low-family/status-meta.ts +112 -0
  245. package/src/commands/low-family/types.ts +39 -0
  246. package/src/commands/med-family/cli-agent.ts +238 -0
  247. package/src/commands/med-family/fast-forward.ts +230 -0
  248. package/src/commands/med-family/ide.ts +163 -0
  249. package/src/commands/med-family/index.ts +37 -0
  250. package/src/commands/med-family/mesh-crud.ts +1066 -0
  251. package/src/commands/med-family/mesh-host-pairing.ts +234 -0
  252. package/src/commands/med-family/mesh-queue.ts +167 -0
  253. package/src/commands/med-family/mesh-restart.ts +92 -0
  254. package/src/commands/med-family/types.ts +143 -0
  255. package/src/commands/mesh-coordinator.ts +334 -124
  256. package/src/commands/router.ts +2711 -3254
  257. package/src/commands/stream-commands.ts +8 -0
  258. package/src/commands/upgrade-helper.ts +310 -45
  259. package/src/config/chat-history.ts +483 -24
  260. package/src/config/config.ts +12 -0
  261. package/src/config/mesh-config.ts +495 -22
  262. package/src/config/mesh-json-config.ts +376 -0
  263. package/src/config/recent-activity.ts +8 -2
  264. package/src/config/repo-settings.ts +111 -0
  265. package/src/daemon/dev-auto-implement.ts +3 -2
  266. package/src/daemon/dev-cli-debug.ts +10 -1
  267. package/src/daemon/dev-server.ts +0 -541
  268. package/src/detection/cli-detector.ts +28 -9
  269. package/src/detection/ide-detector.ts +55 -16
  270. package/src/detection/win32-ide-version.ts +106 -0
  271. package/src/git/change-impact-config.ts +354 -0
  272. package/src/git/git-commands.ts +59 -15
  273. package/src/git/git-diff.ts +81 -11
  274. package/src/git/git-executor.ts +12 -0
  275. package/src/git/git-status.ts +767 -48
  276. package/src/git/git-types.ts +14 -62
  277. package/src/git/git-worktree.ts +261 -4
  278. package/src/git/index.ts +17 -0
  279. package/src/index.ts +194 -12
  280. package/src/installer.d.ts +1 -1
  281. package/src/installer.ts +8 -6
  282. package/src/ipc/local-ipc-server.ts +278 -0
  283. package/src/launch.d.ts +1 -1
  284. package/src/launch.ts +37 -28
  285. package/src/logging/async-batch-writer.ts +55 -0
  286. package/src/logging/command-log.ts +7 -5
  287. package/src/logging/log-redactor.ts +100 -0
  288. package/src/logging/log-tail-reader.ts +341 -0
  289. package/src/logging/logger.ts +14 -7
  290. package/src/mesh/contracts.ts +338 -0
  291. package/src/mesh/coordinator-prompt.ts +381 -33
  292. package/src/mesh/coordinator-registry.ts +121 -0
  293. package/src/mesh/mesh-active-work.ts +645 -0
  294. package/src/mesh/mesh-clone-grace.ts +68 -0
  295. package/src/mesh/mesh-coordinator-config.ts +97 -0
  296. package/src/mesh/mesh-delivery-policy.ts +315 -0
  297. package/src/mesh/mesh-event-classify.ts +51 -0
  298. package/src/mesh/mesh-event-forwarding.ts +1888 -0
  299. package/src/mesh/mesh-event-trace.ts +67 -0
  300. package/src/mesh/mesh-events-coordinator.ts +32 -0
  301. package/src/mesh/mesh-events-pending.ts +656 -0
  302. package/src/mesh/mesh-events-stale.ts +389 -0
  303. package/src/mesh/mesh-events-utils.ts +443 -0
  304. package/src/mesh/mesh-events.ts +33 -1035
  305. package/src/mesh/mesh-fast-forward.ts +843 -0
  306. package/src/mesh/mesh-host-ownership.ts +73 -0
  307. package/src/mesh/mesh-init.ts +260 -0
  308. package/src/mesh/mesh-ledger-reconciliation.ts +12 -7
  309. package/src/mesh/mesh-ledger.ts +656 -102
  310. package/src/mesh/mesh-magi-status.ts +223 -0
  311. package/src/mesh/mesh-missions.ts +449 -0
  312. package/src/mesh/mesh-node-identity.ts +1887 -0
  313. package/src/mesh/mesh-queue-assignment.ts +1918 -0
  314. package/src/mesh/mesh-reconcile-loop.ts +1780 -0
  315. package/src/mesh/mesh-refine-batch.ts +205 -0
  316. package/src/mesh/mesh-refine-gates.ts +1673 -0
  317. package/src/mesh/mesh-refine-status.ts +231 -0
  318. package/src/mesh/mesh-review-inbox.ts +307 -0
  319. package/src/mesh/mesh-routing.ts +291 -0
  320. package/src/mesh/mesh-runtime-store.ts +1853 -0
  321. package/src/mesh/mesh-scheduling-runtime.ts +198 -0
  322. package/src/mesh/mesh-task-inflight.ts +70 -0
  323. package/src/mesh/mesh-task-stats.ts +161 -0
  324. package/src/mesh/mesh-unresolved-forward-outbox.ts +185 -0
  325. package/src/mesh/mesh-warmup-deadline.ts +152 -0
  326. package/src/mesh/mesh-work-queue.ts +1243 -141
  327. package/src/mesh/preview-freshness.ts +118 -0
  328. package/src/mesh/refine-config.ts +423 -0
  329. package/src/mesh/worktree-bootstrap-config.ts +450 -0
  330. package/src/providers/acp-provider-instance.ts +43 -10
  331. package/src/providers/approval-utils.d.ts +5 -0
  332. package/src/providers/approval-utils.ts +57 -5
  333. package/src/providers/chat-message-normalization.ts +92 -4
  334. package/src/providers/cli-provider-instance.ts +1933 -104
  335. package/src/providers/contracts.d.ts +55 -0
  336. package/src/providers/contracts.ts +150 -6
  337. package/src/providers/extension-provider-instance.ts +12 -7
  338. package/src/providers/external-sources.ts +218 -0
  339. package/src/providers/ide-provider-instance.ts +35 -12
  340. package/src/providers/manual-attendance.ts +85 -0
  341. package/src/providers/native-history/antigravity-cli-transcript.ts +643 -0
  342. package/src/providers/native-history/claude-cli-transcript.ts +396 -0
  343. package/src/providers/native-history/codex-cli-transcript.ts +479 -0
  344. package/src/providers/native-history/constants.ts +19 -0
  345. package/src/providers/native-history/dispatcher.ts +339 -0
  346. package/src/providers/native-history/hermes-cli-transcript.ts +230 -0
  347. package/src/providers/native-history/index.ts +30 -0
  348. package/src/providers/provider-instance-manager.ts +71 -0
  349. package/src/providers/provider-instance.ts +19 -1
  350. package/src/providers/provider-loader.ts +668 -50
  351. package/src/providers/provider-schema.ts +87 -14
  352. package/src/providers/provider-trust.ts +114 -0
  353. package/src/providers/read-chat-contract.ts +76 -16
  354. package/src/providers/sdk/README.md +49 -0
  355. package/src/providers/sdk/v1/builders/acp/detect-status.ts +144 -0
  356. package/src/providers/sdk/v1/builders/cli/detect-status.ts +313 -0
  357. package/src/providers/sdk/v1/builders/cli/parse-approval-squash.ts +158 -0
  358. package/src/providers/sdk/v1/builders/cli/parse-approval.ts +250 -0
  359. package/src/providers/sdk/v1/builders/cli/parse-session.ts +276 -0
  360. package/src/providers/sdk/v1/builders/cli/visible-region.ts +143 -0
  361. package/src/providers/sdk/v1/fixture-tooling/format.ts +130 -0
  362. package/src/providers/sdk/v1/fixture-tooling/index.ts +22 -0
  363. package/src/providers/sdk/v1/fixture-tooling/replay.ts +352 -0
  364. package/src/providers/sdk/v1/index.ts +152 -0
  365. package/src/providers/sdk/v1/sandbox/README-design.ts +195 -0
  366. package/src/providers/sdk/v1/sandbox/require-whitelist.ts +472 -0
  367. package/src/providers/sdk/v1/sandbox/script-runner.ts +150 -0
  368. package/src/providers/sdk/v1/schemas/cli/provider.schema.json +504 -0
  369. package/src/providers/sdk/v1/schemas/primitives/acp-session-protocol-v1.json +131 -0
  370. package/src/providers/sdk/v1/schemas/primitives/native-history-codex-rollout-v1.json +66 -0
  371. package/src/providers/sdk/v1/schemas/primitives/tui-approval-squash-v1.json +91 -0
  372. package/src/providers/sdk/v1/schemas/primitives/tui-assistant-block-v1.json +91 -0
  373. package/src/providers/sdk/v1/schemas/primitives/tui-cue-ordering-v1.json +47 -0
  374. package/src/providers/sdk/v1/schemas/primitives/tui-dispatch-order-v1.json +32 -0
  375. package/src/providers/sdk/v1/schemas/primitives/tui-footer-chrome-v1.json +42 -0
  376. package/src/providers/sdk/v1/schemas/primitives/tui-index-finder-v1.json +27 -0
  377. package/src/providers/sdk/v1/schemas/primitives/tui-modal-v1.json +125 -0
  378. package/src/providers/sdk/v1/schemas/primitives/tui-prompt-marker-v1.json +45 -0
  379. package/src/providers/sdk/v1/schemas/primitives/tui-session-id-extraction-v1.json +46 -0
  380. package/src/providers/sdk/v1/schemas/primitives/tui-settled-prompt-v1.json +71 -0
  381. package/src/providers/sdk/v1/schemas/primitives/tui-spinner-v1.json +83 -0
  382. package/src/providers/sdk/v1/schemas/primitives/tui-transcript-pty-v1.json +83 -0
  383. package/src/providers/sdk/v1/schemas/primitives/tui-visible-region-v1.json +57 -0
  384. package/src/providers/sdk/v1/schemas/primitives/tui-welcome-screen-v1.json +35 -0
  385. package/src/providers/sdk/v1/types/cli/index.ts +365 -0
  386. package/src/providers/sdk/v1/types/common/index.ts +229 -0
  387. package/src/providers/sdk/v1/validators/index.ts +19 -0
  388. package/src/providers/sdk/v1/validators/manifest.ts +110 -0
  389. package/src/providers/sdk/v1/validators/taint.ts +309 -0
  390. package/src/providers/spec/adapter.ts +235 -0
  391. package/src/providers/spec/cli-adapter.ts +1056 -0
  392. package/src/providers/spec/evaluator.ts +407 -0
  393. package/src/providers/spec/fsm-driver.ts +1410 -0
  394. package/src/providers/spec/fsm-evaluator.ts +272 -0
  395. package/src/providers/spec/fsm-loader.ts +120 -0
  396. package/src/providers/spec/fsm-types.ts +273 -0
  397. package/src/providers/spec/native-history-executor.ts +1128 -0
  398. package/src/providers/spec/pre-launch-trust.ts +104 -0
  399. package/src/providers/spec/route.ts +51 -0
  400. package/src/providers/spec/types.ts +262 -0
  401. package/src/providers/status-monitor.d.ts +7 -7
  402. package/src/providers/status-monitor.ts +37 -22
  403. package/src/providers/transcript-v2.ts +567 -0
  404. package/src/providers/types/interactive-prompt.ts +536 -0
  405. package/src/providers/version-archive.ts +64 -24
  406. package/src/providers/working-dir.ts +23 -0
  407. package/src/repo-mesh-types.ts +740 -14
  408. package/src/runtime-defaults.ts +39 -0
  409. package/src/sessions/registry.ts +6 -0
  410. package/src/shared-types-extra.ts +2 -4
  411. package/src/shared-types.d.ts +8 -0
  412. package/src/shared-types.ts +64 -1
  413. package/src/status/builders.ts +26 -6
  414. package/src/status/normalize.ts +2 -0
  415. package/src/status/reporter.ts +19 -1
  416. package/src/status/snapshot.ts +95 -26
  417. package/src/system/hash.ts +23 -0
  418. package/src/system/host-memory.ts +29 -12
  419. package/src/system/load-better-sqlite3.ts +68 -0
  420. package/src/types.ts +5 -0
  421. package/dist/cli-adapters/terminal-backends/xterm-backend.d.ts +0 -17
  422. package/dist/mesh/mesh-sync.d.ts +0 -53
  423. package/src/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +0 -16
  424. package/src/cli-adapters/terminal-backends/xterm-backend.ts +0 -97
  425. package/src/mesh/mesh-sync.ts +0 -111
@@ -14,3 +14,42 @@ export const DEFAULT_SESSION_HOST_DIAGNOSTICS_SUBSCRIPTION_INTERVAL_MS = 10_000;
14
14
  export const DEFAULT_SESSION_HOST_READY_TIMEOUT_MS = 15_000;
15
15
 
16
16
  export const STANDALONE_CDP_SCAN_INTERVAL_MS = 15_000;
17
+
18
+ // ---------------------------------------------------------------------------
19
+ // Mesh P2P timeout windows (env-overridable)
20
+ // ---------------------------------------------------------------------------
21
+
22
+ // Reads a mesh timeout (ms) from the first non-empty env var in `names`, clamped
23
+ // to [1_000, 120_000]; falls back to `defaultMs` when none is set or the value is
24
+ // out of range. The clamp lets a slow real link be tuned up (TURN-relayed peers
25
+ // whose RTT is many seconds) and lets the test harness shrink the window to its
26
+ // 1s minimum, without ever degenerating to 0 or an absurd value. Multiple names
27
+ // are accepted so a renamed constant can keep honoring a legacy alias.
28
+ export function readMeshTimeoutEnvMs(names: string | string[], defaultMs: number): number {
29
+ const candidates = Array.isArray(names) ? names : [names];
30
+ for (const name of candidates) {
31
+ const raw = process.env[name]?.trim();
32
+ if (!raw) continue;
33
+ const parsed = Number.parseInt(raw, 10);
34
+ if (Number.isFinite(parsed) && parsed >= 1_000 && parsed <= 120_000) return parsed;
35
+ return defaultMs;
36
+ }
37
+ return defaultMs;
38
+ }
39
+
40
+ // SINGLE source of truth for the mesh cold-open *connect* budget — the time a
41
+ // caller grants a peer whose mesh DataChannel is not open yet to drive the
42
+ // cross-machine (often TURN-relayed) ICE/DTLS handshake before the response
43
+ // deadline takes over. Two call sites share this so an env override tunes BOTH:
44
+ // - commands/router.ts direct-peer git_status probe (requireDirectPeerTruth)
45
+ // - mesh/mesh-events-coordinator.ts remote task-dispatch (deliverTaskToSession)
46
+ // Before unification the coordinator hard-coded 45_000 while the router was
47
+ // env-overridable, so setting the env tuned the probe path but silently left the
48
+ // dispatch path at 45s — the same nominal 45s, but divergent the moment the env
49
+ // was set. Matches the daemon-cloud DaemonMeshManager CONNECT_TIMEOUT_MS (45s).
50
+ // `MESH_DIRECT_PROBE_CONNECT_TIMEOUT_MS` is honored as a backward-compat alias so
51
+ // environments already tuned under the old name keep working.
52
+ export const MESH_CONNECT_TIMEOUT_MS = readMeshTimeoutEnvMs(
53
+ ['MESH_CONNECT_TIMEOUT_MS', 'MESH_DIRECT_PROBE_CONNECT_TIMEOUT_MS'],
54
+ 45_000,
55
+ );
@@ -8,6 +8,12 @@ export interface SessionRuntimeTarget {
8
8
  cdpManagerKey?: string;
9
9
  adapterKey?: string;
10
10
  instanceKey?: string;
11
+ /** Working directory for CLI/ACP sessions. Used by read_chat to resolve
12
+ * native history when there is no live adapter (e.g. subscription path). */
13
+ workspace?: string;
14
+ /** Wall clock at register time. native-history readers use it as a
15
+ * cutoff so a fresh session can't show records from a prior one. */
16
+ spawnedAtMs?: number;
11
17
  }
12
18
 
13
19
  export class SessionRegistry {
@@ -21,14 +21,12 @@ export interface RuntimeAttachedClient {
21
21
  }
22
22
 
23
23
  /** Session status union (used by SessionEntry.status, legacy recent-launch metadata, etc.) */
24
- export type SessionStatus = 'idle' | 'generating' | 'waiting_approval' | 'error' | 'stopped' | 'starting' | 'panel_hidden' | 'not_monitored' | 'disconnected';
24
+ export type SessionStatus = 'idle' | 'generating' | 'waiting_approval' | 'waiting_choice' | 'error' | 'stopped' | 'starting' | 'panel_hidden' | 'not_monitored' | 'disconnected';
25
25
 
26
26
  /** Inbox bucket categories for recent sessions */
27
27
  export type RecentSessionBucket = 'needs_attention' | 'working' | 'task_complete' | 'idle';
28
28
 
29
29
  /** Terminal backend status */
30
30
  export interface TerminalBackendStatus {
31
- backend: 'xterm' | 'ghostty-vt';
32
- preference: 'auto' | 'xterm' | 'ghostty-vt';
33
- ghosttyAvailable: boolean;
31
+ backend: 'ghostty-vt';
34
32
  }
@@ -206,6 +206,14 @@ export interface SessionEntry {
206
206
  completionMarker?: string;
207
207
  seenCompletionMarker?: string;
208
208
  surfaceHidden?: boolean;
209
+ /**
210
+ * True owning-daemon id for a session a coordinator synthesises into its own
211
+ * status snapshot (mesh delegated sessions), so the dashboard attributes it to the
212
+ * worker node instead of the coordinator daemon hosting the snapshot.
213
+ */
214
+ ownerDaemonId?: string;
215
+ /** True owning-machine display name fallback when the owning daemon is not aggregated. */
216
+ ownerMachineName?: string;
209
217
  }
210
218
  /**
211
219
  * Compact session metadata stored in UserSessionDO and reused by server-side
@@ -56,6 +56,7 @@ import type {
56
56
  GitWorkspaceUpdate,
57
57
  WorkspaceGitSubscriptionParams,
58
58
  } from './git/git-types.js';
59
+ import type { InteractivePrompt } from './providers/types/interactive-prompt.js';
59
60
 
60
61
  export type {
61
62
  GitCommandName,
@@ -110,6 +111,14 @@ export interface ReadChatSyncResult {
110
111
  status: string;
111
112
  title?: string;
112
113
  activeModal?: { message: string; buttons: string[] } | null;
114
+ activeInteractivePrompt?: InteractivePrompt | null;
115
+ /**
116
+ * Chat source provenance from ChatSourceMachine (A2). Carries the
117
+ * selected source, transition cause, lock state, and legacy
118
+ * fallbackReason — opaque to the daemon-core, consumed by web-core
119
+ * for the source debug badge and SourceTimeline (A3).
120
+ */
121
+ messageSource?: Record<string, unknown>;
113
122
  }
114
123
 
115
124
  export interface ProviderSummaryItem {
@@ -365,6 +374,7 @@ export interface SessionEntry {
365
374
  runtimeRecoveryState?: string | null;
366
375
  resume?: ProviderResumeCapability;
367
376
  activeChat: SessionActiveChatData | null;
377
+ activeInteractivePrompt?: InteractivePrompt | null;
368
378
  capabilities?: SessionCapability[];
369
379
  /** Effective message input/media support for this session. Defaults fail-closed to text-only. */
370
380
  messageInput?: MessageInputSupport;
@@ -389,6 +399,17 @@ export interface SessionEntry {
389
399
  seenCompletionMarker?: string;
390
400
  surfaceHidden?: boolean;
391
401
  settings?: Record<string, any>;
402
+ /**
403
+ * True owning-daemon id for a session a coordinator synthesises into its own
404
+ * status snapshot (mesh delegated sessions). The dashboard attributes the session
405
+ * to this daemon instead of the snapshot daemon so the worker node — not the
406
+ * coordinator — is shown as its machine.
407
+ */
408
+ ownerDaemonId?: string;
409
+ /** True owning-machine display name fallback when the owning daemon is not aggregated. */
410
+ ownerMachineName?: string;
411
+ /** Set when this session is acting as a mesh coordinator for the given mesh. */
412
+ coordinator?: { meshId: string; role: 'coordinator' };
392
413
  meshQueueStats?: {
393
414
  total?: number;
394
415
  active?: number;
@@ -516,7 +537,39 @@ export interface AvailableProviderInfo {
516
537
  lastVerification?: MachineProviderCheckResult;
517
538
  /** Provider-declared Repo Mesh coordinator/MCP behavior. */
518
539
  meshCoordinator?: ProviderMeshCoordinatorConfig;
519
- }
540
+ /**
541
+ * Provider trust classification — derived from the on-disk layer the
542
+ * manifest came from and the shape of the manifest. Dashboards use
543
+ * this to render a trust badge and gate activation of
544
+ * `external-untrusted` providers behind a confirm modal.
545
+ */
546
+ trust?: ProviderTrust;
547
+ /** Daemon-side human-readable description of the trust value. */
548
+ trustDescription?: string;
549
+ /** True when activation needs a user-side confirmation step. */
550
+ requiresConfirmation?: boolean;
551
+ /** Which on-disk layer the manifest lives in. */
552
+ sourceLayer?: 'user' | 'upstream' | 'external';
553
+ /** For external providers, the source-name namespace it came from. */
554
+ sourceName?: string | null;
555
+ /** Manifest-declared version, e.g. "1.2.1". */
556
+ providerVersion?: string;
557
+ /** Underlying executable name (CLI/binary providers). */
558
+ binary?: string;
559
+ /** Lifecycle label from the manifest: "Stable", "Beta", … */
560
+ status?: string;
561
+ /** One-line provider description from the manifest. */
562
+ details?: string;
563
+ /** Manifest-declared links: homepage, docs, repo, … */
564
+ links?: Record<string, string>;
565
+ }
566
+
567
+ export type ProviderTrust =
568
+ | 'user-custom'
569
+ | 'trusted'
570
+ | 'trusted-with-scripts'
571
+ | 'external-safe'
572
+ | 'external-untrusted';
520
573
 
521
574
  export interface MachineProviderCheckResult {
522
575
  ok: boolean;
@@ -582,6 +635,13 @@ export interface ProviderControlSchema {
582
635
  order?: number;
583
636
  /** Hide this control even if it would otherwise render */
584
637
  hidden?: boolean;
638
+ /**
639
+ * FSM state ids in which this control should be visible. When omitted the
640
+ * control is always visible. Mirrors the daemon's click-time enforcement so
641
+ * the bar hides controls the daemon would silently drop. Uses raw FSM state
642
+ * ids (e.g. 'idle', 'busy'), not the derived dashboard status.
643
+ */
644
+ visibleWhenState?: string[];
585
645
  }
586
646
 
587
647
  // ─── Common Sub-Types (used across StatusReportPayload, BaseDaemonData, etc.) ──
@@ -687,6 +747,9 @@ export type DaemonStatusEventName =
687
747
  | 'agent:waiting_approval'
688
748
  | 'agent:generating_completed'
689
749
  | 'agent:stopped'
750
+ | 'monitor:no_progress'
751
+ // Legacy alias for 'monitor:no_progress' — kept so older daemons that still
752
+ // emit it remain type-compatible with consumers during rollout.
690
753
  | 'monitor:long_generating';
691
754
 
692
755
  /** Minimal daemon-originated event payload relayed through the server. */
@@ -25,6 +25,7 @@ import {
25
25
  type NormalizeActiveChatOptions,
26
26
  } from './normalize.js';
27
27
  import { getMeshQueueStats } from '../mesh/mesh-work-queue.js';
28
+ import { getCoordinatorForSession } from '../mesh/coordinator-registry.js';
28
29
  import { normalizeProviderStateControlValues } from '../providers/provider-patch-state.js';
29
30
  import { normalizeProviderSummaryMetadata } from '../providers/summary-metadata.js';
30
31
  import {
@@ -164,7 +165,7 @@ const ACP_SESSION_CAPABILITIES: SessionCapability[] = [
164
165
  'set_thought_level',
165
166
  ];
166
167
 
167
- function buildIdeWorkspaceSession(
168
+ function buildWorkspaceSession(
168
169
  state: IdeProviderState,
169
170
  cdpManagers: Map<string, DaemonCdpManager>,
170
171
  options: SessionEntryBuildOptions,
@@ -179,7 +180,10 @@ function buildIdeWorkspaceSession(
179
180
  const git = getGitSummaryForWorkspace(workspace, options);
180
181
  const title = activeChat?.title || state.name;
181
182
  const meshCoordinatorFor = state.settings?.meshCoordinatorFor as string | undefined;
182
- const meshQueueStats = meshCoordinatorFor ? getMeshQueueStats(meshCoordinatorFor) : undefined;
183
+ const registryEntry = state.instanceId ? getCoordinatorForSession(state.instanceId) : undefined;
184
+ const effectiveMeshId = meshCoordinatorFor || registryEntry?.meshId;
185
+ const coordinator = effectiveMeshId ? { meshId: effectiveMeshId, role: 'coordinator' as const } : undefined;
186
+ const meshQueueStats = effectiveMeshId ? getMeshQueueStats(effectiveMeshId) : undefined;
183
187
  return {
184
188
  id: state.instanceId || state.type,
185
189
  parentId: null,
@@ -203,6 +207,7 @@ function buildIdeWorkspaceSession(
203
207
  errorReason: state.errorReason,
204
208
  lastUpdated: state.lastUpdated,
205
209
  settings: state.settings,
210
+ ...(coordinator && { coordinator }),
206
211
  ...(meshQueueStats && { meshQueueStats }),
207
212
  };
208
213
  }
@@ -221,7 +226,10 @@ function buildExtensionAgentSession(
221
226
  const workspace = parent.workspace || null;
222
227
  const git = getGitSummaryForWorkspace(workspace, options);
223
228
  const meshCoordinatorFor = ext.settings?.meshCoordinatorFor as string | undefined;
224
- const meshQueueStats = meshCoordinatorFor ? getMeshQueueStats(meshCoordinatorFor) : undefined;
229
+ const registryEntry = ext.instanceId ? getCoordinatorForSession(ext.instanceId) : undefined;
230
+ const effectiveMeshId = meshCoordinatorFor || registryEntry?.meshId;
231
+ const coordinator = effectiveMeshId ? { meshId: effectiveMeshId, role: 'coordinator' as const } : undefined;
232
+ const meshQueueStats = effectiveMeshId ? getMeshQueueStats(effectiveMeshId) : undefined;
225
233
  return {
226
234
  id: ext.instanceId || `${parent.instanceId}:${ext.type}`,
227
235
  parentId: parent.instanceId || parent.type,
@@ -245,6 +253,7 @@ function buildExtensionAgentSession(
245
253
  errorReason: ext.errorReason,
246
254
  lastUpdated: ext.lastUpdated,
247
255
  settings: ext.settings,
256
+ ...(coordinator && { coordinator }),
248
257
  ...(meshQueueStats && { meshQueueStats }),
249
258
  };
250
259
  }
@@ -287,7 +296,10 @@ function buildCliSession(state: CliProviderState, options: SessionEntryBuildOpti
287
296
  const workspace = state.workspace || null;
288
297
  const git = getGitSummaryForWorkspace(workspace, options);
289
298
  const meshCoordinatorFor = state.settings?.meshCoordinatorFor as string | undefined;
290
- const meshQueueStats = meshCoordinatorFor ? getMeshQueueStats(meshCoordinatorFor) : undefined;
299
+ const registryEntry = state.instanceId ? getCoordinatorForSession(state.instanceId) : undefined;
300
+ const effectiveMeshId = meshCoordinatorFor || registryEntry?.meshId;
301
+ const coordinator = effectiveMeshId ? { meshId: effectiveMeshId, role: 'coordinator' as const } : undefined;
302
+ const meshQueueStats = effectiveMeshId ? getMeshQueueStats(effectiveMeshId) : undefined;
291
303
  return {
292
304
  id: state.instanceId,
293
305
  parentId: null,
@@ -314,6 +326,7 @@ function buildCliSession(state: CliProviderState, options: SessionEntryBuildOpti
314
326
  mode: state.mode,
315
327
  resume: state.resume,
316
328
  activeChat,
329
+ activeInteractivePrompt: state.activeInteractivePrompt ?? null,
317
330
  ...(summaryMetadata && { summaryMetadata }),
318
331
  ...(includeSessionMetadata && {
319
332
  capabilities: state.mode === 'terminal' ? PTY_SESSION_CAPABILITIES : CLI_CHAT_SESSION_CAPABILITIES,
@@ -327,7 +340,9 @@ function buildCliSession(state: CliProviderState, options: SessionEntryBuildOpti
327
340
  errorReason: state.errorReason,
328
341
  lastUpdated: state.lastUpdated,
329
342
  settings: state.settings,
343
+ ...(coordinator && { coordinator }),
330
344
  ...(meshQueueStats && { meshQueueStats }),
345
+ ...(state.settings?.spawnedSessionVisibility === 'hidden' && { surfaceHidden: true }),
331
346
  };
332
347
  }
333
348
 
@@ -341,7 +356,10 @@ function buildAcpSession(state: AcpProviderState, options: SessionEntryBuildOpti
341
356
  const workspace = state.workspace || null;
342
357
  const git = getGitSummaryForWorkspace(workspace, options);
343
358
  const meshCoordinatorFor = state.settings?.meshCoordinatorFor as string | undefined;
344
- const meshQueueStats = meshCoordinatorFor ? getMeshQueueStats(meshCoordinatorFor) : undefined;
359
+ const registryEntry = state.instanceId ? getCoordinatorForSession(state.instanceId) : undefined;
360
+ const effectiveMeshId = meshCoordinatorFor || registryEntry?.meshId;
361
+ const coordinator = effectiveMeshId ? { meshId: effectiveMeshId, role: 'coordinator' as const } : undefined;
362
+ const meshQueueStats = effectiveMeshId ? getMeshQueueStats(effectiveMeshId) : undefined;
345
363
  return {
346
364
  id: state.instanceId,
347
365
  parentId: null,
@@ -364,7 +382,9 @@ function buildAcpSession(state: AcpProviderState, options: SessionEntryBuildOpti
364
382
  errorReason: state.errorReason,
365
383
  lastUpdated: state.lastUpdated,
366
384
  settings: state.settings,
385
+ ...(coordinator && { coordinator }),
367
386
  ...(meshQueueStats && { meshQueueStats }),
387
+ ...(state.settings?.spawnedSessionVisibility === 'hidden' && { surfaceHidden: true }),
368
388
  };
369
389
  }
370
390
 
@@ -380,7 +400,7 @@ export function buildSessionEntries(
380
400
  const acpStates = allStates.filter((s): s is AcpProviderState => s.category === 'acp');
381
401
 
382
402
  for (const state of ideStates) {
383
- sessions.push(buildIdeWorkspaceSession(state, cdpManagers, options));
403
+ sessions.push(buildWorkspaceSession(state, cdpManagers, options));
384
404
  for (const ext of state.extensions as ExtensionProviderState[]) {
385
405
  if (!shouldIncludeExtensionSession(ext)) continue;
386
406
  sessions.push(buildExtensionAgentSession(state, ext, options));
@@ -5,6 +5,7 @@ export type ManagedStatus =
5
5
  | 'idle'
6
6
  | 'generating'
7
7
  | 'waiting_approval'
8
+ | 'waiting_choice'
8
9
  | 'error'
9
10
  | 'stopped'
10
11
  | 'starting'
@@ -151,6 +152,7 @@ export function normalizeManagedStatus(
151
152
 
152
153
  const normalized = String(status || 'idle').trim().toLowerCase();
153
154
  if (normalized === 'waiting_approval') return 'waiting_approval';
155
+ if (normalized === 'waiting_choice') return 'waiting_choice';
154
156
  if (WORKING_STATUSES.has(normalized)) return 'generating';
155
157
  if (normalized === 'error') return 'error';
156
158
  if (normalized === 'stopped') return 'stopped';
@@ -51,6 +51,8 @@ export class DaemonStatusReporter {
51
51
  private lastStatusSentAt = 0;
52
52
  private statusPendingThrottle = false;
53
53
  private lastP2PStatusHash = '';
54
+ private lastP2PStatusSentAt: number = 0;
55
+ private p2pDebounceTimer: ReturnType<typeof setTimeout> | null = null;
54
56
  private lastServerStatusHash = '';
55
57
  private lastStatusSummary = '';
56
58
 
@@ -118,7 +120,7 @@ export class DaemonStatusReporter {
118
120
  case 'agent:waiting_approval':
119
121
  case 'agent:generating_completed':
120
122
  case 'agent:stopped':
121
- case 'monitor:long_generating':
123
+ case 'monitor:no_progress':
122
124
  return value;
123
125
  default:
124
126
  return null;
@@ -317,6 +319,9 @@ export class DaemonStatusReporter {
317
319
  cdpConnected: session.cdpConnected,
318
320
  summaryMetadata: session.summaryMetadata,
319
321
  settings: session.settings,
322
+ // Forward surfaceHidden so the server can gate push notifications for
323
+ // coordinator-hidden sessions (the WS path is the only one the server sees).
324
+ surfaceHidden: session.surfaceHidden,
320
325
  })),
321
326
  p2p: payload.p2p,
322
327
  timestamp: now,
@@ -355,7 +360,20 @@ export class DaemonStatusReporter {
355
360
  : { ...hashTarget, sessions };
356
361
  const h = this.simpleHash(JSON.stringify(hashPayload));
357
362
  if (h !== this.lastP2PStatusHash) {
363
+ const now = Date.now();
364
+ // Rate limit: max 1 per 500ms
365
+ if (this.lastP2PStatusSentAt && now - this.lastP2PStatusSentAt < 500) {
366
+ if (!this.p2pDebounceTimer) {
367
+ this.p2pDebounceTimer = setTimeout(() => {
368
+ this.p2pDebounceTimer = null;
369
+ this.sendUnifiedStatusReport({ reason: 'p2p_debounce' });
370
+ }, 500);
371
+ }
372
+ return false; // Dropped for now, but will trigger later
373
+ }
374
+
358
375
  this.lastP2PStatusHash = h;
376
+ this.lastP2PStatusSentAt = now;
359
377
  this.deps.p2p?.sendStatus(payload);
360
378
  return true;
361
379
  }
@@ -145,21 +145,56 @@ function buildAvailableProviders(
145
145
  lastDetection?: AvailableProviderInfo['lastDetection'];
146
146
  lastVerification?: AvailableProviderInfo['lastVerification'];
147
147
  meshCoordinator?: AvailableProviderInfo['meshCoordinator'];
148
+ _sourceTrust?: AvailableProviderInfo['trust'];
149
+ _sourceLayer?: AvailableProviderInfo['sourceLayer'];
150
+ _sourceName?: string | null;
151
+ providerVersion?: string;
152
+ binary?: string;
153
+ status?: string;
154
+ details?: string;
155
+ links?: Record<string, string>;
148
156
  }> = providerLoader.getAvailableProviderInfos?.() || providerLoader.getAll();
149
- return providers.map((provider) => ({
150
- type: provider.type,
151
- name: provider.displayName || provider.type,
152
- displayName: provider.displayName || provider.type,
153
- icon: provider.icon || '💻',
154
- category: provider.category,
155
- ...(provider.installed !== undefined ? { installed: provider.installed } : {}),
156
- ...(provider.detectedPath !== undefined ? { detectedPath: provider.detectedPath } : {}),
157
- ...(provider.enabled !== undefined ? { enabled: provider.enabled } : {}),
158
- ...(provider.machineStatus !== undefined ? { machineStatus: provider.machineStatus } : {}),
159
- ...(provider.lastDetection !== undefined ? { lastDetection: provider.lastDetection } : {}),
160
- ...(provider.lastVerification !== undefined ? { lastVerification: provider.lastVerification } : {}),
161
- ...(provider.meshCoordinator !== undefined ? { meshCoordinator: provider.meshCoordinator } : {}),
162
- }));
157
+ // Trust helpers come from daemon-core; resolve them lazily so the
158
+ // status snapshot path stays loadable in older bundles that don't
159
+ // ship provider-trust yet.
160
+ let describeTrust: (trust: AvailableProviderInfo['trust']) => string = () => '';
161
+ let requiresConfirmation: (trust: AvailableProviderInfo['trust']) => boolean = () => false;
162
+ try {
163
+ const mod = require('../providers/provider-trust.js') as typeof import('../providers/provider-trust.js');
164
+ describeTrust = mod.describeTrust as typeof describeTrust;
165
+ requiresConfirmation = mod.requiresConfirmation as typeof requiresConfirmation;
166
+ } catch { /* enrichment only */ }
167
+ return providers.map((provider) => {
168
+ const trust = (provider as any)._sourceTrust as AvailableProviderInfo['trust'] | undefined;
169
+ const sourceLayer = (provider as any)._sourceLayer as AvailableProviderInfo['sourceLayer'] | undefined;
170
+ const sourceName = (provider as any)._sourceName as string | null | undefined;
171
+ return {
172
+ type: provider.type,
173
+ name: provider.displayName || provider.type,
174
+ displayName: provider.displayName || provider.type,
175
+ icon: provider.icon || '💻',
176
+ category: provider.category,
177
+ ...(provider.installed !== undefined ? { installed: provider.installed } : {}),
178
+ ...(provider.detectedPath !== undefined ? { detectedPath: provider.detectedPath } : {}),
179
+ ...(provider.enabled !== undefined ? { enabled: provider.enabled } : {}),
180
+ ...(provider.machineStatus !== undefined ? { machineStatus: provider.machineStatus } : {}),
181
+ ...(provider.lastDetection !== undefined ? { lastDetection: provider.lastDetection } : {}),
182
+ ...(provider.lastVerification !== undefined ? { lastVerification: provider.lastVerification } : {}),
183
+ ...(provider.meshCoordinator !== undefined ? { meshCoordinator: provider.meshCoordinator } : {}),
184
+ ...(trust ? {
185
+ trust,
186
+ trustDescription: describeTrust(trust),
187
+ requiresConfirmation: requiresConfirmation(trust),
188
+ } : {}),
189
+ ...(sourceLayer ? { sourceLayer } : {}),
190
+ ...(sourceName ? { sourceName } : {}),
191
+ ...(provider.providerVersion ? { providerVersion: provider.providerVersion } : {}),
192
+ ...(provider.binary ? { binary: provider.binary } : {}),
193
+ ...(provider.status ? { status: provider.status } : {}),
194
+ ...(provider.details ? { details: provider.details } : {}),
195
+ ...(provider.links ? { links: provider.links } : {}),
196
+ };
197
+ });
163
198
  }
164
199
 
165
200
  export function buildMachineInfo(profile: 'full' | 'live' | 'metadata' = 'full'): MachineInfo {
@@ -248,7 +283,17 @@ function simplePreviewHash(value: string): string {
248
283
  return h.toString(16);
249
284
  }
250
285
 
251
- function getLastDisplayMessage(session: {
286
+ /**
287
+ * Resolve the last user-visible (non-system) message for a session as a preview.
288
+ *
289
+ * Exported so the cloud coordinator can derive a preview for a LOCAL mesh-owned
290
+ * worktree session directly from the real provider instance it hosts. A REMOTE
291
+ * worker session has no local instance (its preview rides the completion event's
292
+ * finalSummary — see resolveMeshSurfacedSessionPreview), but a LOCAL coordinator
293
+ * IS the worker, so its hosted instance's transcript holds the assistant reply and
294
+ * this is the source of truth for that case.
295
+ */
296
+ export function getLastDisplayMessage(session: {
252
297
  activeChat?: {
253
298
  messages?: Array<{
254
299
  role?: string;
@@ -297,18 +342,30 @@ export function getSessionCompletionMarker(session: {
297
342
  receivedAt?: number | string;
298
343
  timestamp?: number | string;
299
344
  _turnKey?: string;
345
+ kind?: string;
300
346
  }> | null
301
347
  } | null
302
348
  }) {
303
- const lastMessage = session.activeChat?.messages?.at?.(-1);
304
- if (!lastMessage) return '';
305
- const role = typeof lastMessage.role === 'string' ? lastMessage.role : '';
306
- if (role === 'user' || role === 'human' || role === 'system') return '';
307
- if (typeof lastMessage._turnKey === 'string' && lastMessage._turnKey) return `turn:${lastMessage._turnKey}`;
308
- if (typeof lastMessage.id === 'string' && lastMessage.id) return `id:${lastMessage.id}`;
309
- if (typeof lastMessage.index === 'number' && Number.isFinite(lastMessage.index)) return `idx:${lastMessage.index}`;
310
- const timestamp = getMessageEventTime(lastMessage);
311
- return timestamp > 0 ? `ts:${timestamp}` : '';
349
+ const messages = session.activeChat?.messages;
350
+ if (!Array.isArray(messages) || messages.length === 0) return '';
351
+ // Walk backwards until we find an assistant message that's not a tool call,
352
+ // or a user/human message (which ends the turn). System messages and tool
353
+ // messages don't gate "task completion" they can't be acknowledged
354
+ // independently and rotate too aggressively for marker-based bell clearing.
355
+ for (let i = messages.length - 1; i >= 0; i -= 1) {
356
+ const m = messages[i];
357
+ const role = typeof m?.role === 'string' ? m.role : '';
358
+ const kind = typeof m?.kind === 'string' ? m.kind : '';
359
+ if (role === 'user' || role === 'human') return '';
360
+ if (role === 'system') continue;
361
+ if (kind === 'tool') continue;
362
+ if (typeof m._turnKey === 'string' && m._turnKey) return `turn:${m._turnKey}`;
363
+ if (typeof m.id === 'string' && m.id) return `id:${m.id}`;
364
+ if (typeof m.index === 'number' && Number.isFinite(m.index)) return `idx:${m.index}`;
365
+ const timestamp = getMessageEventTime(m);
366
+ return timestamp > 0 ? `ts:${timestamp}` : '';
367
+ }
368
+ return '';
312
369
  }
313
370
 
314
371
  function getSessionLastUsedAt(session: {
@@ -347,9 +404,21 @@ function getUnreadState(
347
404
  if (status === 'generating' || status === 'starting') {
348
405
  return { unread: false, inboxBucket: 'working' };
349
406
  }
407
+ // Read-state resolution:
408
+ // - When provider supplies a `completionMarker`, prefer marker-equality.
409
+ // But if `seenCompletionMarker` hasn't been recorded yet (legacy/transition
410
+ // case), fall back to timestamp comparison so a stale marker doesn't keep
411
+ // the bell lit after the user already viewed the conversation.
412
+ // - When there is no completionMarker, use timestamp + role guard.
413
+ // - Trailing `assistant.tool` turns no longer count as unread on their own
414
+ // — the human can't acknowledge a tool call separately from the answer,
415
+ // so they'd be stuck with a perpetually unread badge.
416
+ const ignorableTrailingRoles = lastRole === 'user' || lastRole === 'human' || lastRole === 'system' || lastRole === 'tool';
350
417
  const unread = completionMarker
351
- ? completionMarker !== seenCompletionMarker
352
- : hasContentChange && lastUsedAt > lastSeenAt && lastRole !== 'user' && lastRole !== 'human' && lastRole !== 'system';
418
+ ? (seenCompletionMarker
419
+ ? completionMarker !== seenCompletionMarker
420
+ : hasContentChange && lastUsedAt > lastSeenAt && !ignorableTrailingRoles)
421
+ : hasContentChange && lastUsedAt > lastSeenAt && !ignorableTrailingRoles;
353
422
  return { unread, inboxBucket: unread ? 'task_complete' : 'idle' };
354
423
  }
355
424
 
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Shared SHA-256 hashing helpers for daemon-core (Node runtime).
3
+ *
4
+ * daemon-core runs under Node, so it uses `node:crypto` directly and must NOT
5
+ * import the server's WebCrypto-based `utils/crypto.ts` (different runtime +
6
+ * cross-package dependency direction). Output is byte-identical to that helper
7
+ * for the same input — lowercase hex SHA-256.
8
+ */
9
+ import { createHash } from 'node:crypto';
10
+
11
+ /** Full lowercase hex SHA-256 digest of `input`. */
12
+ export function sha256Hex(input: string): string {
13
+ return createHash('sha256').update(input).digest('hex');
14
+ }
15
+
16
+ /**
17
+ * Truncated SHA-256 hex digest — the first `length` hex chars (default 16).
18
+ * Used for stable short identifiers (workspace hashes, token ids, coordinator
19
+ * home dirs) where collision risk at 16 hex chars (64 bits) is negligible.
20
+ */
21
+ export function shortHash(input: string, length = 16): string {
22
+ return sha256Hex(input).slice(0, length);
23
+ }
@@ -11,7 +11,10 @@
11
11
  */
12
12
 
13
13
  import * as os from 'os';
14
- import { execSync } from 'child_process';
14
+ import { exec } from 'child_process';
15
+ import { promisify } from 'util';
16
+
17
+ const execAsync = promisify(exec);
15
18
 
16
19
  export interface HostMemorySnapshot {
17
20
  totalMem: number;
@@ -21,19 +24,22 @@ export interface HostMemorySnapshot {
21
24
  availableMem: number;
22
25
  }
23
26
 
24
- function parseDarwinAvailableBytes(totalMem: number): number | null {
25
- if (os.platform() !== 'darwin') return null;
27
+ let cachedDarwinAvail: number | null = null;
28
+ let darwinMemoryInterval: NodeJS.Timeout | null = null;
29
+
30
+ async function updateDarwinMemoryCache() {
31
+ if (os.platform() !== 'darwin') return;
26
32
  try {
27
- const out = execSync('vm_stat', {
33
+ const { stdout } = await execAsync('vm_stat', {
28
34
  encoding: 'utf-8',
29
35
  timeout: 4000,
30
36
  maxBuffer: 256 * 1024,
31
37
  });
32
- const pageSizeMatch = out.match(/page size of (\d+)\s*bytes/i);
38
+ const pageSizeMatch = stdout.match(/page size of (\d+)\s*bytes/i);
33
39
  const pageSize = pageSizeMatch ? parseInt(pageSizeMatch[1], 10) : 4096;
34
40
 
35
41
  const counts: Record<string, number> = {};
36
- for (const line of out.split('\n')) {
42
+ for (const line of stdout.split('\n')) {
37
43
  const m = line.match(/^\s*Pages\s+([^:]+):\s+([\d,]+)\s*\.?/);
38
44
  if (!m) continue;
39
45
  const key = m[1].trim().toLowerCase().replace(/\s+/g, '_');
@@ -49,17 +55,28 @@ function parseDarwinAvailableBytes(totalMem: number): number | null {
49
55
 
50
56
  const availPages = free + inactive + speculative + purgeable + fileBacked;
51
57
  const bytes = availPages * pageSize;
52
- if (!Number.isFinite(bytes) || bytes < 0) return null;
53
- return Math.min(bytes, totalMem);
58
+ cachedDarwinAvail = Number.isFinite(bytes) && bytes >= 0 ? Math.min(bytes, os.totalmem()) : null;
54
59
  } catch {
55
- return null;
60
+ // silently fallback
56
61
  }
57
62
  }
58
63
 
59
64
  export function getHostMemorySnapshot(): HostMemorySnapshot {
65
+ if (os.platform() === 'darwin' && !darwinMemoryInterval) {
66
+ updateDarwinMemoryCache();
67
+ darwinMemoryInterval = setInterval(updateDarwinMemoryCache, 3000);
68
+ darwinMemoryInterval.unref();
69
+ }
70
+
60
71
  const totalMem = os.totalmem();
61
72
  const freeMem = os.freemem();
62
- const darwinAvail = parseDarwinAvailableBytes(totalMem);
63
- const availableMem = darwinAvail != null ? darwinAvail : freeMem;
64
- return { totalMem, freeMem, availableMem };
73
+ const availableMem = os.platform() === 'darwin'
74
+ ? (cachedDarwinAvail ?? freeMem)
75
+ : freeMem;
76
+
77
+ return {
78
+ totalMem,
79
+ freeMem,
80
+ availableMem,
81
+ };
65
82
  }