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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (473) hide show
  1. package/dist/boot/daemon-lifecycle.d.ts +9 -0
  2. package/dist/boot/process-hardening.d.ts +50 -0
  3. package/dist/build-info.d.ts +37 -0
  4. package/dist/chat/source-machine.d.ts +166 -0
  5. package/dist/chat/source-resolver.d.ts +104 -0
  6. package/dist/chat/subscription-updates.d.ts +1 -0
  7. package/dist/cli-adapter-types.d.ts +68 -2
  8. package/dist/cli-adapters/cli-script-runner.d.ts +117 -0
  9. package/dist/cli-adapters/cli-state-engine.d.ts +220 -0
  10. package/dist/cli-adapters/provider-cli-adapter.d.ts +137 -64
  11. package/dist/cli-adapters/provider-cli-parse.d.ts +5 -0
  12. package/dist/cli-adapters/provider-cli-runtime.d.ts +34 -0
  13. package/dist/cli-adapters/provider-cli-shared.d.ts +74 -0
  14. package/dist/cli-adapters/pty-write-chunking.d.ts +34 -0
  15. package/dist/cli-adapters/raw-terminal-io.d.ts +37 -0
  16. package/dist/cli-adapters/resolve-executable.d.ts +69 -0
  17. package/dist/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +6 -3
  18. package/dist/cli-adapters/terminal-backends/types.d.ts +10 -2
  19. package/dist/cli-adapters/terminal-screen.d.ts +4 -11
  20. package/dist/commands/chat-commands-debug-bundle.d.ts +14 -0
  21. package/dist/commands/chat-commands-read.d.ts +23 -0
  22. package/dist/commands/chat-commands-scope.d.ts +39 -0
  23. package/dist/commands/chat-commands-shared.d.ts +33 -0
  24. package/dist/commands/chat-commands-write.d.ts +14 -0
  25. package/dist/commands/chat-commands.d.ts +10 -23
  26. package/dist/commands/cli-manager.d.ts +71 -1
  27. package/dist/commands/handler.d.ts +125 -0
  28. package/dist/commands/high-family/index.d.ts +3 -0
  29. package/dist/commands/high-family/mesh-coordinator-launch.d.ts +2 -0
  30. package/dist/commands/high-family/mesh-events.d.ts +2 -0
  31. package/dist/commands/high-family/mesh-status.d.ts +2 -0
  32. package/dist/commands/high-family/types.d.ts +64 -0
  33. package/dist/commands/low-family/coordinator-prompt.d.ts +9 -0
  34. package/dist/commands/low-family/daemon-lifecycle.d.ts +2 -0
  35. package/dist/commands/low-family/diagnostics.d.ts +2 -0
  36. package/dist/commands/low-family/index.d.ts +3 -0
  37. package/dist/commands/low-family/mesh-ledger.d.ts +10 -0
  38. package/dist/commands/low-family/mesh-node-logs.d.ts +2 -0
  39. package/dist/commands/low-family/notification.d.ts +2 -0
  40. package/dist/commands/low-family/refine-config.d.ts +2 -0
  41. package/dist/commands/low-family/session-host.d.ts +2 -0
  42. package/dist/commands/low-family/spec-providerdev.d.ts +11 -0
  43. package/dist/commands/low-family/status-meta.d.ts +2 -0
  44. package/dist/commands/low-family/types.d.ts +33 -0
  45. package/dist/commands/med-family/cli-agent.d.ts +2 -0
  46. package/dist/commands/med-family/fast-forward.d.ts +2 -0
  47. package/dist/commands/med-family/ide.d.ts +10 -0
  48. package/dist/commands/med-family/index.d.ts +3 -0
  49. package/dist/commands/med-family/mesh-crud.d.ts +48 -0
  50. package/dist/commands/med-family/mesh-host-pairing.d.ts +2 -0
  51. package/dist/commands/med-family/mesh-queue.d.ts +2 -0
  52. package/dist/commands/med-family/mesh-restart.d.ts +2 -0
  53. package/dist/commands/med-family/types.d.ts +152 -0
  54. package/dist/commands/mesh-coordinator.d.ts +85 -1
  55. package/dist/commands/router-aggregate-status.d.ts +24 -0
  56. package/dist/commands/router-mesh-session-owner.d.ts +59 -0
  57. package/dist/commands/router-refine.d.ts +151 -0
  58. package/dist/commands/router-worktree-cleanup.d.ts +133 -0
  59. package/dist/commands/router.d.ts +203 -15
  60. package/dist/commands/upgrade-helper.d.ts +41 -1
  61. package/dist/config/chat-history.d.ts +11 -0
  62. package/dist/config/config.d.ts +19 -0
  63. package/dist/config/mesh-config.d.ts +65 -0
  64. package/dist/config/mesh-json-config.d.ts +199 -0
  65. package/dist/config/registry-resolver.d.ts +54 -0
  66. package/dist/config/repo-settings.d.ts +77 -0
  67. package/dist/config/state-store.d.ts +30 -0
  68. package/dist/daemon/dev-server.d.ts +0 -2
  69. package/dist/detection/cli-detector.d.ts +17 -0
  70. package/dist/detection/ide-detector.d.ts +13 -0
  71. package/dist/detection/win32-ide-version.d.ts +37 -0
  72. package/dist/git/change-impact-config.d.ts +159 -0
  73. package/dist/git/git-commands.d.ts +26 -2
  74. package/dist/git/git-diff.d.ts +6 -0
  75. package/dist/git/git-executor.d.ts +11 -0
  76. package/dist/git/git-status.d.ts +80 -0
  77. package/dist/git/git-types.d.ts +2 -50
  78. package/dist/git/git-worktree.d.ts +71 -1
  79. package/dist/git/index.d.ts +3 -1
  80. package/dist/index.d.ts +70 -17
  81. package/dist/index.js +53532 -19073
  82. package/dist/index.js.map +1 -1
  83. package/dist/index.mjs +53283 -18989
  84. package/dist/index.mjs.map +1 -1
  85. package/dist/installer.d.ts +1 -4
  86. package/dist/ipc/local-ipc-server.d.ts +91 -0
  87. package/dist/launch.d.ts +1 -1
  88. package/dist/logging/async-batch-writer.d.ts +10 -0
  89. package/dist/logging/debug-config.d.ts +16 -0
  90. package/dist/logging/log-redactor.d.ts +24 -0
  91. package/dist/logging/log-tail-reader.d.ts +81 -0
  92. package/dist/logging/logger.d.ts +1 -1
  93. package/dist/mesh/contracts.d.ts +256 -0
  94. package/dist/mesh/coordinator-prompt.d.ts +76 -0
  95. package/dist/mesh/coordinator-registry.d.ts +59 -0
  96. package/dist/mesh/mesh-active-work.d.ts +203 -0
  97. package/dist/mesh/mesh-clone-grace.d.ts +8 -0
  98. package/dist/mesh/mesh-completion-synthesis.d.ts +4 -0
  99. package/dist/mesh/mesh-coordinator-config.d.ts +21 -0
  100. package/dist/mesh/mesh-delivery-policy.d.ts +104 -0
  101. package/dist/mesh/mesh-event-classify.d.ts +7 -0
  102. package/dist/mesh/mesh-event-forwarding.d.ts +58 -0
  103. package/dist/mesh/mesh-event-trace.d.ts +21 -0
  104. package/dist/mesh/mesh-events-coordinator.d.ts +4 -0
  105. package/dist/mesh/mesh-events-pending.d.ts +258 -0
  106. package/dist/mesh/mesh-events-stale.d.ts +61 -0
  107. package/dist/mesh/mesh-events-utils.d.ts +75 -0
  108. package/dist/mesh/mesh-events.d.ts +6 -49
  109. package/dist/mesh/mesh-fast-forward.d.ts +81 -0
  110. package/dist/mesh/mesh-host-ownership.d.ts +21 -1
  111. package/dist/mesh/mesh-init.d.ts +128 -0
  112. package/dist/mesh/mesh-ledger-reconciliation.d.ts +23 -4
  113. package/dist/mesh/mesh-ledger.d.ts +139 -1
  114. package/dist/mesh/mesh-magi-status.d.ts +63 -0
  115. package/dist/mesh/mesh-missions.d.ts +281 -0
  116. package/dist/mesh/mesh-node-identity.d.ts +310 -0
  117. package/dist/mesh/mesh-queue-assignment.d.ts +162 -0
  118. package/dist/mesh/mesh-reconcile-acked-hold.d.ts +17 -0
  119. package/dist/mesh/mesh-reconcile-config.d.ts +6 -0
  120. package/dist/mesh/mesh-reconcile-identity.d.ts +6 -0
  121. package/dist/mesh/mesh-reconcile-loop.d.ts +84 -0
  122. package/dist/mesh/mesh-reconcile-v2-backstop.d.ts +16 -0
  123. package/dist/mesh/mesh-refine-batch.d.ts +68 -0
  124. package/dist/mesh/mesh-refine-gates.d.ts +457 -0
  125. package/dist/mesh/mesh-refine-status.d.ts +62 -0
  126. package/dist/mesh/mesh-remote-event-pull.d.ts +15 -0
  127. package/dist/mesh/mesh-review-inbox.d.ts +90 -0
  128. package/dist/mesh/mesh-routing.d.ts +70 -0
  129. package/dist/mesh/mesh-runtime-store.d.ts +567 -0
  130. package/dist/mesh/mesh-scheduling-runtime.d.ts +78 -0
  131. package/dist/mesh/mesh-task-inflight.d.ts +46 -0
  132. package/dist/mesh/mesh-task-stats.d.ts +49 -0
  133. package/dist/mesh/mesh-unresolved-forward-outbox.d.ts +34 -0
  134. package/dist/mesh/mesh-warmup-deadline.d.ts +68 -0
  135. package/dist/mesh/mesh-work-queue.d.ts +392 -1
  136. package/dist/mesh/preview-freshness.d.ts +28 -0
  137. package/dist/mesh/refine-config.d.ts +97 -0
  138. package/dist/mesh/worktree-bootstrap-config.d.ts +219 -0
  139. package/dist/providers/acp-provider-instance.d.ts +5 -0
  140. package/dist/providers/approval-utils.d.ts +46 -0
  141. package/dist/providers/chat-message-normalization.d.ts +58 -1
  142. package/dist/providers/cli-provider-effect-format.d.ts +30 -0
  143. package/dist/providers/cli-provider-history-dedup.d.ts +17 -0
  144. package/dist/providers/cli-provider-input-prompt.d.ts +12 -0
  145. package/dist/providers/cli-provider-instance-types.d.ts +45 -0
  146. package/dist/providers/cli-provider-instance.d.ts +426 -30
  147. package/dist/providers/cli-provider-status-helpers.d.ts +46 -0
  148. package/dist/providers/cli-provider-transcript-merge.d.ts +7 -0
  149. package/dist/providers/contracts.d.ts +196 -6
  150. package/dist/providers/external-sources.d.ts +71 -0
  151. package/dist/providers/manual-attendance.d.ts +79 -0
  152. package/dist/providers/native-history/antigravity-claim-registry.d.ts +39 -0
  153. package/dist/providers/native-history/antigravity-cli-transcript.d.ts +137 -0
  154. package/dist/providers/native-history/claude-cli-transcript.d.ts +70 -0
  155. package/dist/providers/native-history/codex-cli-transcript.d.ts +73 -0
  156. package/dist/providers/native-history/constants.d.ts +12 -0
  157. package/dist/providers/native-history/dispatcher.d.ts +44 -0
  158. package/dist/providers/native-history/hermes-cli-transcript.d.ts +30 -0
  159. package/dist/providers/native-history/index.d.ts +13 -0
  160. package/dist/providers/provider-instance-manager.d.ts +30 -0
  161. package/dist/providers/provider-instance.d.ts +31 -1
  162. package/dist/providers/provider-loader.d.ts +42 -5
  163. package/dist/providers/provider-trust.d.ts +31 -0
  164. package/dist/providers/read-chat-contract.d.ts +29 -0
  165. package/dist/providers/sdk/v1/builders/acp/detect-status.d.ts +68 -0
  166. package/dist/providers/sdk/v1/builders/cli/detect-status.d.ts +86 -0
  167. package/dist/providers/sdk/v1/builders/cli/parse-approval-squash.d.ts +59 -0
  168. package/dist/providers/sdk/v1/builders/cli/parse-approval.d.ts +65 -0
  169. package/dist/providers/sdk/v1/builders/cli/parse-session.d.ts +91 -0
  170. package/dist/providers/sdk/v1/builders/cli/visible-region.d.ts +42 -0
  171. package/dist/providers/sdk/v1/fixture-tooling/format.d.ts +126 -0
  172. package/dist/providers/sdk/v1/fixture-tooling/index.d.ts +8 -0
  173. package/dist/providers/sdk/v1/fixture-tooling/replay.d.ts +38 -0
  174. package/dist/providers/sdk/v1/index.d.ts +30 -0
  175. package/dist/providers/sdk/v1/sandbox/README-design.d.ts +193 -0
  176. package/dist/providers/sdk/v1/sandbox/require-whitelist.d.ts +74 -0
  177. package/dist/providers/sdk/v1/sandbox/script-runner.d.ts +98 -0
  178. package/dist/providers/sdk/v1/types/cli/index.d.ts +277 -0
  179. package/dist/providers/sdk/v1/types/common/index.d.ts +203 -0
  180. package/dist/providers/sdk/v1/validators/index.d.ts +5 -0
  181. package/dist/providers/sdk/v1/validators/manifest.d.ts +40 -0
  182. package/dist/providers/sdk/v1/validators/taint.d.ts +52 -0
  183. package/dist/providers/spec/adapter.d.ts +98 -0
  184. package/dist/providers/spec/cli-adapter.d.ts +223 -0
  185. package/dist/providers/spec/evaluator.d.ts +45 -0
  186. package/dist/providers/spec/fsm-driver.d.ts +449 -0
  187. package/dist/providers/spec/fsm-evaluator.d.ts +93 -0
  188. package/dist/providers/spec/fsm-loader.d.ts +14 -0
  189. package/dist/providers/spec/fsm-types.d.ts +202 -0
  190. package/dist/providers/spec/native-history-executor.d.ts +41 -0
  191. package/dist/providers/spec/pre-launch-trust.d.ts +16 -0
  192. package/dist/providers/spec/route.d.ts +4 -0
  193. package/dist/providers/spec/types.d.ts +244 -0
  194. package/dist/providers/status-monitor.d.ts +7 -7
  195. package/dist/providers/transcript-v2.d.ts +176 -0
  196. package/dist/providers/types/interactive-prompt.d.ts +84 -0
  197. package/dist/providers/working-dir.d.ts +17 -0
  198. package/dist/repo-mesh-types.d.ts +616 -12
  199. package/dist/runtime-defaults.d.ts +2 -0
  200. package/dist/session-host/managed-host.d.ts +64 -0
  201. package/dist/session-host/runtime-surface.d.ts +10 -16
  202. package/dist/sessions/registry.d.ts +26 -0
  203. package/dist/shared-types-extra.d.ts +2 -4
  204. package/dist/shared-types.d.ts +110 -55
  205. package/dist/status/chat-tail-hot-sessions.d.ts +40 -0
  206. package/dist/status/normalize.d.ts +1 -1
  207. package/dist/status/normalize.js +1 -0
  208. package/dist/status/normalize.js.map +1 -1
  209. package/dist/status/normalize.mjs +1 -0
  210. package/dist/status/normalize.mjs.map +1 -1
  211. package/dist/status/reporter.d.ts +2 -0
  212. package/dist/status/snapshot.d.ts +27 -0
  213. package/dist/system/hash.d.ts +8 -0
  214. package/dist/system/load-better-sqlite3.d.ts +21 -0
  215. package/dist/types.d.ts +20 -6
  216. package/package.json +11 -4
  217. package/src/agent-stream/poller.ts +2 -3
  218. package/src/agent-stream/provider-adapter.ts +1 -1
  219. package/src/boot/daemon-lifecycle.ts +80 -14
  220. package/src/boot/process-hardening.ts +89 -0
  221. package/src/build-info.ts +73 -0
  222. package/src/chat/source-machine.ts +534 -0
  223. package/src/chat/source-resolver.ts +0 -0
  224. package/src/chat/subscription-updates.ts +20 -1
  225. package/src/cli-adapter-types.d.ts +3 -1
  226. package/src/cli-adapter-types.ts +68 -2
  227. package/src/cli-adapters/cli-script-runner.ts +421 -0
  228. package/src/cli-adapters/cli-state-engine.ts +1282 -0
  229. package/src/cli-adapters/provider-cli-adapter.d.ts +1 -1
  230. package/src/cli-adapters/provider-cli-adapter.ts +1048 -1143
  231. package/src/cli-adapters/provider-cli-parse.d.ts +2 -0
  232. package/src/cli-adapters/provider-cli-parse.ts +19 -0
  233. package/src/cli-adapters/provider-cli-runtime.ts +56 -7
  234. package/src/cli-adapters/provider-cli-shared.d.ts +4 -0
  235. package/src/cli-adapters/provider-cli-shared.ts +121 -11
  236. package/src/cli-adapters/pty-transport.ts +2 -1
  237. package/src/cli-adapters/pty-write-chunking.ts +106 -0
  238. package/src/cli-adapters/raw-terminal-io.ts +252 -0
  239. package/src/cli-adapters/resolve-executable.ts +204 -0
  240. package/src/cli-adapters/session-host-transport.ts +2 -1
  241. package/src/cli-adapters/terminal-backends/ghostty-vt-backend.ts +63 -29
  242. package/src/cli-adapters/terminal-backends/types.ts +10 -3
  243. package/src/cli-adapters/terminal-screen.ts +16 -81
  244. package/src/commands/chat-commands-debug-bundle.ts +398 -0
  245. package/src/commands/chat-commands-read.ts +2788 -0
  246. package/src/commands/chat-commands-scope.ts +54 -0
  247. package/src/commands/chat-commands-shared.ts +114 -0
  248. package/src/commands/chat-commands-write.ts +891 -0
  249. package/src/commands/chat-commands.ts +19 -1841
  250. package/src/commands/cli-manager.d.ts +2 -0
  251. package/src/commands/cli-manager.ts +724 -27
  252. package/src/commands/handler.ts +865 -2
  253. package/src/commands/high-family/index.ts +28 -0
  254. package/src/commands/high-family/mesh-coordinator-launch.ts +696 -0
  255. package/src/commands/high-family/mesh-events.ts +102 -0
  256. package/src/commands/high-family/mesh-status.ts +857 -0
  257. package/src/commands/high-family/types.ts +80 -0
  258. package/src/commands/low-family/coordinator-prompt.ts +125 -0
  259. package/src/commands/low-family/daemon-lifecycle.ts +120 -0
  260. package/src/commands/low-family/diagnostics.ts +57 -0
  261. package/src/commands/low-family/index.ts +37 -0
  262. package/src/commands/low-family/mesh-ledger.ts +62 -0
  263. package/src/commands/low-family/mesh-node-logs.ts +87 -0
  264. package/src/commands/low-family/notification.ts +116 -0
  265. package/src/commands/low-family/refine-config.ts +106 -0
  266. package/src/commands/low-family/session-host.ts +282 -0
  267. package/src/commands/low-family/spec-providerdev.ts +217 -0
  268. package/src/commands/low-family/status-meta.ts +112 -0
  269. package/src/commands/low-family/types.ts +39 -0
  270. package/src/commands/med-family/cli-agent.ts +270 -0
  271. package/src/commands/med-family/fast-forward.ts +230 -0
  272. package/src/commands/med-family/ide.ts +163 -0
  273. package/src/commands/med-family/index.ts +37 -0
  274. package/src/commands/med-family/mesh-crud.ts +1268 -0
  275. package/src/commands/med-family/mesh-host-pairing.ts +234 -0
  276. package/src/commands/med-family/mesh-queue.ts +167 -0
  277. package/src/commands/med-family/mesh-restart.ts +92 -0
  278. package/src/commands/med-family/types.ts +153 -0
  279. package/src/commands/mesh-coordinator.ts +334 -124
  280. package/src/commands/router-aggregate-status.ts +209 -0
  281. package/src/commands/router-mesh-session-owner.ts +114 -0
  282. package/src/commands/router-refine.ts +1794 -0
  283. package/src/commands/router-worktree-cleanup.ts +870 -0
  284. package/src/commands/router.ts +567 -4149
  285. package/src/commands/stream-commands.ts +8 -0
  286. package/src/commands/upgrade-helper.ts +310 -45
  287. package/src/config/chat-history.ts +517 -24
  288. package/src/config/config.ts +30 -0
  289. package/src/config/mesh-config.ts +300 -24
  290. package/src/config/mesh-json-config.ts +376 -0
  291. package/src/config/recent-activity.ts +8 -2
  292. package/src/config/registry-resolver.ts +100 -0
  293. package/src/config/repo-settings.ts +111 -0
  294. package/src/config/state-store.ts +55 -0
  295. package/src/daemon/dev-auto-implement.ts +3 -2
  296. package/src/daemon/dev-cli-debug.ts +10 -1
  297. package/src/daemon/dev-server.ts +0 -541
  298. package/src/detection/cli-detector.ts +94 -9
  299. package/src/detection/ide-detector.ts +55 -16
  300. package/src/detection/win32-ide-version.ts +106 -0
  301. package/src/git/change-impact-config.ts +354 -0
  302. package/src/git/git-commands.ts +112 -16
  303. package/src/git/git-diff.ts +81 -11
  304. package/src/git/git-executor.ts +12 -0
  305. package/src/git/git-status.ts +822 -48
  306. package/src/git/git-types.ts +14 -62
  307. package/src/git/git-worktree.ts +261 -4
  308. package/src/git/index.ts +17 -0
  309. package/src/index.ts +190 -13
  310. package/src/installer.d.ts +1 -1
  311. package/src/installer.ts +8 -6
  312. package/src/ipc/local-ipc-server.ts +278 -0
  313. package/src/launch.d.ts +1 -1
  314. package/src/launch.ts +37 -28
  315. package/src/logging/async-batch-writer.ts +55 -0
  316. package/src/logging/command-log.ts +7 -5
  317. package/src/logging/debug-config.ts +25 -0
  318. package/src/logging/debug-trace.ts +7 -2
  319. package/src/logging/log-redactor.ts +100 -0
  320. package/src/logging/log-tail-reader.ts +341 -0
  321. package/src/logging/logger.ts +14 -7
  322. package/src/mesh/contracts.ts +510 -0
  323. package/src/mesh/coordinator-prompt.ts +627 -34
  324. package/src/mesh/coordinator-registry.ts +121 -0
  325. package/src/mesh/mesh-active-work.ts +706 -0
  326. package/src/mesh/mesh-clone-grace.ts +68 -0
  327. package/src/mesh/mesh-completion-synthesis.ts +416 -0
  328. package/src/mesh/mesh-coordinator-config.ts +97 -0
  329. package/src/mesh/mesh-delivery-policy.ts +284 -0
  330. package/src/mesh/mesh-event-classify.ts +78 -0
  331. package/src/mesh/mesh-event-forwarding.ts +2030 -0
  332. package/src/mesh/mesh-event-trace.ts +67 -0
  333. package/src/mesh/mesh-events-coordinator.ts +32 -0
  334. package/src/mesh/mesh-events-pending.ts +1548 -0
  335. package/src/mesh/mesh-events-stale.ts +452 -0
  336. package/src/mesh/mesh-events-utils.ts +443 -0
  337. package/src/mesh/mesh-events.ts +43 -1035
  338. package/src/mesh/mesh-fast-forward.ts +856 -0
  339. package/src/mesh/mesh-host-ownership.ts +41 -3
  340. package/src/mesh/mesh-init.ts +350 -0
  341. package/src/mesh/mesh-ledger-reconciliation.ts +12 -7
  342. package/src/mesh/mesh-ledger.ts +897 -102
  343. package/src/mesh/mesh-magi-status.ts +223 -0
  344. package/src/mesh/mesh-missions.ts +695 -0
  345. package/src/mesh/mesh-node-identity.ts +2065 -0
  346. package/src/mesh/mesh-queue-assignment.ts +2498 -0
  347. package/src/mesh/mesh-reconcile-acked-hold.ts +230 -0
  348. package/src/mesh/mesh-reconcile-config.ts +66 -0
  349. package/src/mesh/mesh-reconcile-identity.ts +103 -0
  350. package/src/mesh/mesh-reconcile-loop.ts +1696 -0
  351. package/src/mesh/mesh-reconcile-v2-backstop.ts +62 -0
  352. package/src/mesh/mesh-refine-batch.ts +205 -0
  353. package/src/mesh/mesh-refine-gates.ts +1792 -0
  354. package/src/mesh/mesh-refine-status.ts +231 -0
  355. package/src/mesh/mesh-remote-event-pull.ts +279 -0
  356. package/src/mesh/mesh-review-inbox.ts +308 -0
  357. package/src/mesh/mesh-routing.ts +291 -0
  358. package/src/mesh/mesh-runtime-store.ts +2292 -0
  359. package/src/mesh/mesh-scheduling-runtime.ts +198 -0
  360. package/src/mesh/mesh-task-inflight.ts +70 -0
  361. package/src/mesh/mesh-task-stats.ts +161 -0
  362. package/src/mesh/mesh-unresolved-forward-outbox.ts +215 -0
  363. package/src/mesh/mesh-warmup-deadline.ts +152 -0
  364. package/src/mesh/mesh-work-queue.ts +1489 -145
  365. package/src/mesh/preview-freshness.ts +163 -0
  366. package/src/mesh/refine-config.ts +129 -12
  367. package/src/mesh/worktree-bootstrap-config.ts +599 -0
  368. package/src/providers/acp-provider-instance.ts +43 -10
  369. package/src/providers/approval-utils.d.ts +5 -0
  370. package/src/providers/approval-utils.ts +100 -6
  371. package/src/providers/chat-message-normalization.ts +126 -4
  372. package/src/providers/cli-provider-effect-format.ts +53 -0
  373. package/src/providers/cli-provider-history-dedup.ts +75 -0
  374. package/src/providers/cli-provider-input-prompt.ts +133 -0
  375. package/src/providers/cli-provider-instance-types.ts +131 -0
  376. package/src/providers/cli-provider-instance.ts +2771 -499
  377. package/src/providers/cli-provider-status-helpers.ts +123 -0
  378. package/src/providers/cli-provider-transcript-merge.ts +114 -0
  379. package/src/providers/contracts.d.ts +55 -0
  380. package/src/providers/contracts.ts +207 -6
  381. package/src/providers/extension-provider-instance.ts +12 -7
  382. package/src/providers/external-sources.ts +218 -0
  383. package/src/providers/ide-provider-instance.ts +35 -12
  384. package/src/providers/manual-attendance.ts +105 -0
  385. package/src/providers/native-history/antigravity-claim-registry.ts +138 -0
  386. package/src/providers/native-history/antigravity-cli-transcript.ts +1275 -0
  387. package/src/providers/native-history/claude-cli-transcript.ts +396 -0
  388. package/src/providers/native-history/codex-cli-transcript.ts +479 -0
  389. package/src/providers/native-history/constants.ts +19 -0
  390. package/src/providers/native-history/dispatcher.ts +617 -0
  391. package/src/providers/native-history/hermes-cli-transcript.ts +312 -0
  392. package/src/providers/native-history/index.ts +30 -0
  393. package/src/providers/provider-instance-manager.ts +71 -0
  394. package/src/providers/provider-instance.ts +24 -1
  395. package/src/providers/provider-loader.ts +700 -55
  396. package/src/providers/provider-schema.ts +93 -14
  397. package/src/providers/provider-trust.ts +114 -0
  398. package/src/providers/read-chat-contract.ts +76 -16
  399. package/src/providers/sdk/README.md +49 -0
  400. package/src/providers/sdk/v1/builders/acp/detect-status.ts +144 -0
  401. package/src/providers/sdk/v1/builders/cli/detect-status.ts +313 -0
  402. package/src/providers/sdk/v1/builders/cli/parse-approval-squash.ts +158 -0
  403. package/src/providers/sdk/v1/builders/cli/parse-approval.ts +261 -0
  404. package/src/providers/sdk/v1/builders/cli/parse-session.ts +276 -0
  405. package/src/providers/sdk/v1/builders/cli/visible-region.ts +143 -0
  406. package/src/providers/sdk/v1/fixture-tooling/format.ts +130 -0
  407. package/src/providers/sdk/v1/fixture-tooling/index.ts +22 -0
  408. package/src/providers/sdk/v1/fixture-tooling/replay.ts +352 -0
  409. package/src/providers/sdk/v1/index.ts +152 -0
  410. package/src/providers/sdk/v1/sandbox/README-design.ts +195 -0
  411. package/src/providers/sdk/v1/sandbox/require-whitelist.ts +472 -0
  412. package/src/providers/sdk/v1/sandbox/script-runner.ts +150 -0
  413. package/src/providers/sdk/v1/schemas/cli/provider.schema.json +538 -0
  414. package/src/providers/sdk/v1/schemas/primitives/acp-session-protocol-v1.json +131 -0
  415. package/src/providers/sdk/v1/schemas/primitives/native-history-codex-rollout-v1.json +66 -0
  416. package/src/providers/sdk/v1/schemas/primitives/tui-approval-squash-v1.json +91 -0
  417. package/src/providers/sdk/v1/schemas/primitives/tui-assistant-block-v1.json +91 -0
  418. package/src/providers/sdk/v1/schemas/primitives/tui-cue-ordering-v1.json +47 -0
  419. package/src/providers/sdk/v1/schemas/primitives/tui-dispatch-order-v1.json +32 -0
  420. package/src/providers/sdk/v1/schemas/primitives/tui-footer-chrome-v1.json +42 -0
  421. package/src/providers/sdk/v1/schemas/primitives/tui-index-finder-v1.json +27 -0
  422. package/src/providers/sdk/v1/schemas/primitives/tui-modal-v1.json +125 -0
  423. package/src/providers/sdk/v1/schemas/primitives/tui-prompt-marker-v1.json +45 -0
  424. package/src/providers/sdk/v1/schemas/primitives/tui-session-id-extraction-v1.json +46 -0
  425. package/src/providers/sdk/v1/schemas/primitives/tui-settled-prompt-v1.json +71 -0
  426. package/src/providers/sdk/v1/schemas/primitives/tui-spinner-v1.json +83 -0
  427. package/src/providers/sdk/v1/schemas/primitives/tui-transcript-pty-v1.json +83 -0
  428. package/src/providers/sdk/v1/schemas/primitives/tui-visible-region-v1.json +57 -0
  429. package/src/providers/sdk/v1/schemas/primitives/tui-welcome-screen-v1.json +35 -0
  430. package/src/providers/sdk/v1/types/cli/index.ts +365 -0
  431. package/src/providers/sdk/v1/types/common/index.ts +229 -0
  432. package/src/providers/sdk/v1/validators/index.ts +19 -0
  433. package/src/providers/sdk/v1/validators/manifest.ts +110 -0
  434. package/src/providers/sdk/v1/validators/taint.ts +309 -0
  435. package/src/providers/spec/adapter.ts +246 -0
  436. package/src/providers/spec/cli-adapter.ts +1064 -0
  437. package/src/providers/spec/evaluator.ts +407 -0
  438. package/src/providers/spec/fsm-driver.ts +1528 -0
  439. package/src/providers/spec/fsm-evaluator.ts +290 -0
  440. package/src/providers/spec/fsm-loader.ts +128 -0
  441. package/src/providers/spec/fsm-types.ts +301 -0
  442. package/src/providers/spec/native-history-executor.ts +1241 -0
  443. package/src/providers/spec/pre-launch-trust.ts +104 -0
  444. package/src/providers/spec/route.ts +51 -0
  445. package/src/providers/spec/types.ts +284 -0
  446. package/src/providers/status-monitor.d.ts +7 -7
  447. package/src/providers/status-monitor.ts +37 -22
  448. package/src/providers/transcript-v2.ts +567 -0
  449. package/src/providers/types/interactive-prompt.ts +536 -0
  450. package/src/providers/version-archive.ts +64 -24
  451. package/src/providers/working-dir.ts +23 -0
  452. package/src/repo-mesh-types.ts +861 -14
  453. package/src/runtime-defaults.ts +39 -0
  454. package/src/session-host/managed-host.ts +218 -0
  455. package/src/session-host/runtime-surface.ts +20 -80
  456. package/src/sessions/registry.ts +44 -0
  457. package/src/shared-types-extra.ts +2 -4
  458. package/src/shared-types.d.ts +8 -0
  459. package/src/shared-types.ts +148 -55
  460. package/src/status/builders.ts +69 -6
  461. package/src/status/chat-tail-hot-sessions.ts +117 -2
  462. package/src/status/normalize.ts +2 -0
  463. package/src/status/reporter.ts +19 -1
  464. package/src/status/snapshot.ts +100 -27
  465. package/src/system/hash.ts +23 -0
  466. package/src/system/host-memory.ts +29 -12
  467. package/src/system/load-better-sqlite3.ts +68 -0
  468. package/src/types.ts +26 -6
  469. package/dist/cli-adapters/terminal-backends/xterm-backend.d.ts +0 -17
  470. package/dist/mesh/mesh-sync.d.ts +0 -53
  471. package/src/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +0 -16
  472. package/src/cli-adapters/terminal-backends/xterm-backend.ts +0 -97
  473. package/src/mesh/mesh-sync.ts +0 -111
@@ -15,6 +15,15 @@ import type {
15
15
  DetectedIde,
16
16
  AgentEntry,
17
17
  } from './types.js';
18
+ import type {
19
+ SessionAttachedClient as CoreSessionAttachedClient,
20
+ SessionWriteOwner as CoreSessionWriteOwner,
21
+ SessionHostRecord as CoreSessionHostRecord,
22
+ SessionHostLogEntry as CoreSessionHostLogEntry,
23
+ SessionHostRequestTrace as CoreSessionHostRequestTrace,
24
+ SessionHostRuntimeTransition as CoreSessionHostRuntimeTransition,
25
+ SessionHostDiagnostics as CoreSessionHostDiagnostics,
26
+ } from '@adhdev/session-host-core';
18
27
 
19
28
  export type {
20
29
  StatusResponse,
@@ -56,6 +65,7 @@ import type {
56
65
  GitWorkspaceUpdate,
57
66
  WorkspaceGitSubscriptionParams,
58
67
  } from './git/git-types.js';
68
+ import type { InteractivePrompt } from './providers/types/interactive-prompt.js';
59
69
 
60
70
  export type {
61
71
  GitCommandName,
@@ -110,6 +120,14 @@ export interface ReadChatSyncResult {
110
120
  status: string;
111
121
  title?: string;
112
122
  activeModal?: { message: string; buttons: string[] } | null;
123
+ activeInteractivePrompt?: InteractivePrompt | null;
124
+ /**
125
+ * Chat source provenance from ChatSourceMachine (A2). Carries the
126
+ * selected source, transition cause, lock state, and legacy
127
+ * fallbackReason — opaque to the daemon-core, consumed by web-core
128
+ * for the source debug badge and SourceTimeline (A3).
129
+ */
130
+ messageSource?: Record<string, unknown>;
113
131
  }
114
132
 
115
133
  export interface ProviderSummaryItem {
@@ -125,70 +143,67 @@ export interface ProviderSummaryMetadata {
125
143
  items: ProviderSummaryItem[];
126
144
  }
127
145
 
128
- export interface SessionHostAttachedClient {
129
- clientId: string;
146
+ /**
147
+ * Wire-subset session-host types.
148
+ *
149
+ * These are the shapes daemon-core / web-core see over the wire — a subset of the
150
+ * authoritative types owned by @adhdev/session-host-core (which additionally carry
151
+ * transport / category / launchCommand / buffer and stricter union typing on wire
152
+ * scalars). They are DERIVED from the SSOT via Pick/Omit so shared fields cannot
153
+ * drift; only the deliberate wire looseness (string-typed `type`/`lifecycle`,
154
+ * optional `meta`) is re-applied here.
155
+ */
156
+ export type SessionHostAttachedClient = Omit<CoreSessionAttachedClient, 'type'> & {
157
+ /** Widened over the wire — the raw client-type string is not re-validated here. */
130
158
  type: string;
131
- readOnly: boolean;
132
- attachedAt: number;
133
- lastSeenAt: number;
134
- }
135
-
136
- export interface SessionHostWriteOwner {
137
- clientId: string;
138
- ownerType: 'agent' | 'user';
139
- acquiredAt: number;
140
- }
159
+ };
141
160
 
142
- export interface SessionHostRecord {
143
- sessionId: string;
144
- runtimeKey: string;
145
- displayName: string;
146
- workspaceLabel: string;
147
- providerType: string;
148
- workspace: string;
149
- lifecycle: 'starting' | 'running' | 'stopping' | 'stopped' | 'failed' | 'interrupted';
150
- surfaceKind?: 'live_runtime' | 'recovery_snapshot' | 'inactive_record';
161
+ export type SessionHostWriteOwner = CoreSessionWriteOwner;
162
+
163
+ export type SessionHostRecord = Pick<
164
+ CoreSessionHostRecord,
165
+ | 'sessionId'
166
+ | 'runtimeKey'
167
+ | 'displayName'
168
+ | 'workspaceLabel'
169
+ | 'providerType'
170
+ | 'workspace'
171
+ | 'lifecycle'
172
+ | 'surfaceKind'
173
+ | 'osPid'
174
+ | 'lastActivityAt'
175
+ | 'createdAt'
176
+ | 'startedAt'
177
+ > & {
151
178
  writeOwner: SessionHostWriteOwner | null;
152
179
  attachedClients: SessionHostAttachedClient[];
153
- osPid?: number;
154
- lastActivityAt: number;
155
- createdAt: number;
156
- startedAt?: number;
180
+ /** Optional over the wire — omitted when the record carries no metadata. */
157
181
  meta?: Record<string, unknown>;
158
- }
182
+ };
159
183
 
160
- export interface SessionHostLogEntry {
161
- timestamp: number;
162
- level: 'debug' | 'info' | 'warn' | 'error';
163
- message: string;
164
- sessionId?: string;
165
- }
184
+ export type SessionHostLogEntry = Omit<CoreSessionHostLogEntry, 'data'>;
166
185
 
167
- export interface SessionHostRequestTrace {
168
- timestamp: number;
169
- requestId: string;
186
+ export type SessionHostRequestTrace = Omit<CoreSessionHostRequestTrace, 'type'> & {
187
+ /** Widened over the wire — the request-type union is not re-validated here. */
170
188
  type: string;
171
- sessionId?: string;
172
- clientId?: string;
173
- success: boolean;
174
- durationMs: number;
175
- error?: string;
176
- }
189
+ };
177
190
 
178
- export interface SessionHostRuntimeTransition {
179
- timestamp: number;
180
- sessionId: string;
181
- action: string;
191
+ export type SessionHostRuntimeTransition = Omit<CoreSessionHostRuntimeTransition, 'lifecycle'> & {
192
+ /** Widened over the wire — the lifecycle union is not re-validated here. */
182
193
  lifecycle?: string;
183
- detail?: string;
184
- success?: boolean;
185
- error?: string;
186
- }
194
+ };
187
195
 
188
- export interface SessionHostDiagnosticsSnapshot {
189
- hostStartedAt: number;
190
- endpoint: string;
191
- runtimeCount: number;
196
+ export type SessionHostDiagnosticsSnapshot = Omit<
197
+ CoreSessionHostDiagnostics,
198
+ | 'supportedRequestTypes'
199
+ | 'sessions'
200
+ | 'liveRuntimes'
201
+ | 'recoverySnapshots'
202
+ | 'inactiveRecords'
203
+ | 'recentLogs'
204
+ | 'recentRequests'
205
+ | 'recentTransitions'
206
+ > & {
192
207
  sessions?: SessionHostRecord[];
193
208
  liveRuntimes?: SessionHostRecord[];
194
209
  recoverySnapshots?: SessionHostRecord[];
@@ -196,7 +211,7 @@ export interface SessionHostDiagnosticsSnapshot {
196
211
  recentLogs: SessionHostLogEntry[];
197
212
  recentRequests: SessionHostRequestTrace[];
198
213
  recentTransitions: SessionHostRuntimeTransition[];
199
- }
214
+ };
200
215
 
201
216
  export type TransportTopic = 'session.chat_tail' | 'session.runtime_output' | 'machine.runtime' | 'session_host.diagnostics' | 'session.modal' | 'daemon.metadata' | 'workspace.git';
202
217
 
@@ -283,6 +298,18 @@ export interface DaemonMetadataUpdate {
283
298
  userName?: string;
284
299
  seq: number;
285
300
  timestamp: number;
301
+ /**
302
+ * Per-mesh state-change revision counters (meshId → monotonically increasing
303
+ * integer), bumped whenever the daemon's mesh graph/queue/mission state for that
304
+ * mesh changes (onMeshStateChange). Lets the dashboard replace its client-side
305
+ * mesh_status polling with an event-driven background refresh: when the revision
306
+ * for the mesh it is viewing advances, it re-fetches the aggregate mesh_status
307
+ * (SWR, keeping the current graph on screen). This is a lightweight nudge — the
308
+ * full aggregate snapshot is fetched on demand, not embedded here, so the
309
+ * daemon.metadata payload stays small. Optional/absent for daemons/builds that
310
+ * don't emit it (the client then keeps its polling fallback).
311
+ */
312
+ meshStateRevisions?: Record<string, number>;
286
313
  }
287
314
 
288
315
  export interface TopicUpdateEnvelopeMap {
@@ -365,6 +392,7 @@ export interface SessionEntry {
365
392
  runtimeRecoveryState?: string | null;
366
393
  resume?: ProviderResumeCapability;
367
394
  activeChat: SessionActiveChatData | null;
395
+ activeInteractivePrompt?: InteractivePrompt | null;
368
396
  capabilities?: SessionCapability[];
369
397
  /** Effective message input/media support for this session. Defaults fail-closed to text-only. */
370
398
  messageInput?: MessageInputSupport;
@@ -388,7 +416,25 @@ export interface SessionEntry {
388
416
  completionMarker?: string;
389
417
  seenCompletionMarker?: string;
390
418
  surfaceHidden?: boolean;
419
+ /**
420
+ * User (or coordinator-policy) muted: suppress attention side-effects
421
+ * (notifications, toasts, completion audio) for this session WITHOUT removing
422
+ * it from the inbox list. Distinct from surfaceHidden (which collapses it from
423
+ * the list). Daemon-owned, in-memory; rides the status snapshot.
424
+ */
425
+ muted?: boolean;
391
426
  settings?: Record<string, any>;
427
+ /**
428
+ * True owning-daemon id for a session a coordinator synthesises into its own
429
+ * status snapshot (mesh delegated sessions). The dashboard attributes the session
430
+ * to this daemon instead of the snapshot daemon so the worker node — not the
431
+ * coordinator — is shown as its machine.
432
+ */
433
+ ownerDaemonId?: string;
434
+ /** True owning-machine display name fallback when the owning daemon is not aggregated. */
435
+ ownerMachineName?: string;
436
+ /** Set when this session is acting as a mesh coordinator for the given mesh. */
437
+ coordinator?: { meshId: string; role: 'coordinator' };
392
438
  meshQueueStats?: {
393
439
  total?: number;
394
440
  active?: number;
@@ -449,6 +495,7 @@ export interface CompactSessionEntry {
449
495
  completionMarker?: string;
450
496
  seenCompletionMarker?: string;
451
497
  surfaceHidden?: boolean;
498
+ muted?: boolean;
452
499
  controlValues?: Record<string, string | number | boolean>;
453
500
  providerControls?: ProviderControlSchema[];
454
501
  summaryMetadata?: ProviderSummaryMetadata;
@@ -516,7 +563,43 @@ export interface AvailableProviderInfo {
516
563
  lastVerification?: MachineProviderCheckResult;
517
564
  /** Provider-declared Repo Mesh coordinator/MCP behavior. */
518
565
  meshCoordinator?: ProviderMeshCoordinatorConfig;
519
- }
566
+ /** BRAIN-ROUTING: suggested model values for the new-session model dropdown. */
567
+ modelOptions?: string[];
568
+ /** BRAIN-ROUTING: reasoning-effort values for the new-session thinking dropdown. */
569
+ thinkingLevelOptions?: string[];
570
+ /**
571
+ * Provider trust classification — derived from the on-disk layer the
572
+ * manifest came from and the shape of the manifest. Dashboards use
573
+ * this to render a trust badge and gate activation of
574
+ * `external-untrusted` providers behind a confirm modal.
575
+ */
576
+ trust?: ProviderTrust;
577
+ /** Daemon-side human-readable description of the trust value. */
578
+ trustDescription?: string;
579
+ /** True when activation needs a user-side confirmation step. */
580
+ requiresConfirmation?: boolean;
581
+ /** Which on-disk layer the manifest lives in. */
582
+ sourceLayer?: 'user' | 'upstream' | 'external';
583
+ /** For external providers, the source-name namespace it came from. */
584
+ sourceName?: string | null;
585
+ /** Manifest-declared version, e.g. "1.2.1". */
586
+ providerVersion?: string;
587
+ /** Underlying executable name (CLI/binary providers). */
588
+ binary?: string;
589
+ /** Lifecycle label from the manifest: "Stable", "Beta", … */
590
+ status?: string;
591
+ /** One-line provider description from the manifest. */
592
+ details?: string;
593
+ /** Manifest-declared links: homepage, docs, repo, … */
594
+ links?: Record<string, string>;
595
+ }
596
+
597
+ export type ProviderTrust =
598
+ | 'user-custom'
599
+ | 'trusted'
600
+ | 'trusted-with-scripts'
601
+ | 'external-safe'
602
+ | 'external-untrusted';
520
603
 
521
604
  export interface MachineProviderCheckResult {
522
605
  ok: boolean;
@@ -582,6 +665,13 @@ export interface ProviderControlSchema {
582
665
  order?: number;
583
666
  /** Hide this control even if it would otherwise render */
584
667
  hidden?: boolean;
668
+ /**
669
+ * FSM state ids in which this control should be visible. When omitted the
670
+ * control is always visible. Mirrors the daemon's click-time enforcement so
671
+ * the bar hides controls the daemon would silently drop. Uses raw FSM state
672
+ * ids (e.g. 'idle', 'busy'), not the derived dashboard status.
673
+ */
674
+ visibleWhenState?: string[];
585
675
  }
586
676
 
587
677
  // ─── Common Sub-Types (used across StatusReportPayload, BaseDaemonData, etc.) ──
@@ -687,6 +777,9 @@ export type DaemonStatusEventName =
687
777
  | 'agent:waiting_approval'
688
778
  | 'agent:generating_completed'
689
779
  | 'agent:stopped'
780
+ | 'monitor:no_progress'
781
+ // Legacy alias for 'monitor:no_progress' — kept so older daemons that still
782
+ // emit it remain type-compatible with consumers during rollout.
690
783
  | 'monitor:long_generating';
691
784
 
692
785
  /** 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 {
@@ -33,6 +34,47 @@ import {
33
34
  } from '../providers/open-panel-support.js';
34
35
  import { TEXT_ONLY_MESSAGE_INPUT_SUPPORT } from '../providers/provider-input-support.js';
35
36
 
37
+ /**
38
+ * A coordinator-spawned worker session that mesh policy launched hidden. This is
39
+ * the daemon-side equivalent of the web `shouldAutoHideMeshConversation` predicate:
40
+ * these sessions should default to muted+hidden in the user dashboard (the user
41
+ * interacts through the ONE coordinator session, not each worker), while the
42
+ * coordinator↔worker mesh data/completion path (mesh-event-forwarding) is
43
+ * unaffected.
44
+ */
45
+ function isCoordinatorSpawnedHiddenWorker(settings: Record<string, any> | undefined): boolean {
46
+ if (!settings) return false;
47
+ return settings.launchedByCoordinator === true
48
+ && typeof settings.meshNodeFor === 'string'
49
+ && settings.meshNodeFor.trim().length > 0
50
+ && settings.spawnedSessionVisibility === 'hidden';
51
+ }
52
+
53
+ /**
54
+ * A session is surface-hidden (collapsed from the user's inbox/notifications) when
55
+ * mesh policy spawned it hidden, OR when a coordinator-spawned worker defaults
56
+ * hidden, OR when the user manually hid it (userHidden). userHidden === false is an
57
+ * explicit un-hide that overrides the policy/worker default until daemon restart.
58
+ */
59
+ function resolveSurfaceHidden(settings: Record<string, any> | undefined): boolean {
60
+ if (!settings) return false;
61
+ if (settings.userHidden === true) return true;
62
+ if (settings.userHidden === false) return false;
63
+ return settings.spawnedSessionVisibility === 'hidden' || isCoordinatorSpawnedHiddenWorker(settings);
64
+ }
65
+
66
+ /**
67
+ * A session is muted (attention side-effects suppressed, but still shown in the
68
+ * list) when the user muted it, OR a coordinator-spawned worker defaults muted.
69
+ * userMuted === false is an explicit un-mute overriding the worker default.
70
+ */
71
+ function resolveMuted(settings: Record<string, any> | undefined): boolean {
72
+ if (!settings) return false;
73
+ if (settings.userMuted === true) return true;
74
+ if (settings.userMuted === false) return false;
75
+ return isCoordinatorSpawnedHiddenWorker(settings);
76
+ }
77
+
36
78
  export type SessionEntryProfile = 'full' | 'live' | 'metadata';
37
79
 
38
80
  export interface SessionEntryBuildOptions {
@@ -164,7 +206,7 @@ const ACP_SESSION_CAPABILITIES: SessionCapability[] = [
164
206
  'set_thought_level',
165
207
  ];
166
208
 
167
- function buildIdeWorkspaceSession(
209
+ function buildWorkspaceSession(
168
210
  state: IdeProviderState,
169
211
  cdpManagers: Map<string, DaemonCdpManager>,
170
212
  options: SessionEntryBuildOptions,
@@ -179,7 +221,10 @@ function buildIdeWorkspaceSession(
179
221
  const git = getGitSummaryForWorkspace(workspace, options);
180
222
  const title = activeChat?.title || state.name;
181
223
  const meshCoordinatorFor = state.settings?.meshCoordinatorFor as string | undefined;
182
- const meshQueueStats = meshCoordinatorFor ? getMeshQueueStats(meshCoordinatorFor) : undefined;
224
+ const registryEntry = state.instanceId ? getCoordinatorForSession(state.instanceId) : undefined;
225
+ const effectiveMeshId = meshCoordinatorFor || registryEntry?.meshId;
226
+ const coordinator = effectiveMeshId ? { meshId: effectiveMeshId, role: 'coordinator' as const } : undefined;
227
+ const meshQueueStats = effectiveMeshId ? getMeshQueueStats(effectiveMeshId) : undefined;
183
228
  return {
184
229
  id: state.instanceId || state.type,
185
230
  parentId: null,
@@ -203,6 +248,7 @@ function buildIdeWorkspaceSession(
203
248
  errorReason: state.errorReason,
204
249
  lastUpdated: state.lastUpdated,
205
250
  settings: state.settings,
251
+ ...(coordinator && { coordinator }),
206
252
  ...(meshQueueStats && { meshQueueStats }),
207
253
  };
208
254
  }
@@ -221,7 +267,10 @@ function buildExtensionAgentSession(
221
267
  const workspace = parent.workspace || null;
222
268
  const git = getGitSummaryForWorkspace(workspace, options);
223
269
  const meshCoordinatorFor = ext.settings?.meshCoordinatorFor as string | undefined;
224
- const meshQueueStats = meshCoordinatorFor ? getMeshQueueStats(meshCoordinatorFor) : undefined;
270
+ const registryEntry = ext.instanceId ? getCoordinatorForSession(ext.instanceId) : undefined;
271
+ const effectiveMeshId = meshCoordinatorFor || registryEntry?.meshId;
272
+ const coordinator = effectiveMeshId ? { meshId: effectiveMeshId, role: 'coordinator' as const } : undefined;
273
+ const meshQueueStats = effectiveMeshId ? getMeshQueueStats(effectiveMeshId) : undefined;
225
274
  return {
226
275
  id: ext.instanceId || `${parent.instanceId}:${ext.type}`,
227
276
  parentId: parent.instanceId || parent.type,
@@ -245,6 +294,7 @@ function buildExtensionAgentSession(
245
294
  errorReason: ext.errorReason,
246
295
  lastUpdated: ext.lastUpdated,
247
296
  settings: ext.settings,
297
+ ...(coordinator && { coordinator }),
248
298
  ...(meshQueueStats && { meshQueueStats }),
249
299
  };
250
300
  }
@@ -287,7 +337,10 @@ function buildCliSession(state: CliProviderState, options: SessionEntryBuildOpti
287
337
  const workspace = state.workspace || null;
288
338
  const git = getGitSummaryForWorkspace(workspace, options);
289
339
  const meshCoordinatorFor = state.settings?.meshCoordinatorFor as string | undefined;
290
- const meshQueueStats = meshCoordinatorFor ? getMeshQueueStats(meshCoordinatorFor) : undefined;
340
+ const registryEntry = state.instanceId ? getCoordinatorForSession(state.instanceId) : undefined;
341
+ const effectiveMeshId = meshCoordinatorFor || registryEntry?.meshId;
342
+ const coordinator = effectiveMeshId ? { meshId: effectiveMeshId, role: 'coordinator' as const } : undefined;
343
+ const meshQueueStats = effectiveMeshId ? getMeshQueueStats(effectiveMeshId) : undefined;
291
344
  return {
292
345
  id: state.instanceId,
293
346
  parentId: null,
@@ -314,6 +367,7 @@ function buildCliSession(state: CliProviderState, options: SessionEntryBuildOpti
314
367
  mode: state.mode,
315
368
  resume: state.resume,
316
369
  activeChat,
370
+ activeInteractivePrompt: state.activeInteractivePrompt ?? null,
317
371
  ...(summaryMetadata && { summaryMetadata }),
318
372
  ...(includeSessionMetadata && {
319
373
  capabilities: state.mode === 'terminal' ? PTY_SESSION_CAPABILITIES : CLI_CHAT_SESSION_CAPABILITIES,
@@ -327,7 +381,10 @@ function buildCliSession(state: CliProviderState, options: SessionEntryBuildOpti
327
381
  errorReason: state.errorReason,
328
382
  lastUpdated: state.lastUpdated,
329
383
  settings: state.settings,
384
+ ...(coordinator && { coordinator }),
330
385
  ...(meshQueueStats && { meshQueueStats }),
386
+ ...(resolveSurfaceHidden(state.settings) && { surfaceHidden: true }),
387
+ ...(resolveMuted(state.settings) && { muted: true }),
331
388
  };
332
389
  }
333
390
 
@@ -341,7 +398,10 @@ function buildAcpSession(state: AcpProviderState, options: SessionEntryBuildOpti
341
398
  const workspace = state.workspace || null;
342
399
  const git = getGitSummaryForWorkspace(workspace, options);
343
400
  const meshCoordinatorFor = state.settings?.meshCoordinatorFor as string | undefined;
344
- const meshQueueStats = meshCoordinatorFor ? getMeshQueueStats(meshCoordinatorFor) : undefined;
401
+ const registryEntry = state.instanceId ? getCoordinatorForSession(state.instanceId) : undefined;
402
+ const effectiveMeshId = meshCoordinatorFor || registryEntry?.meshId;
403
+ const coordinator = effectiveMeshId ? { meshId: effectiveMeshId, role: 'coordinator' as const } : undefined;
404
+ const meshQueueStats = effectiveMeshId ? getMeshQueueStats(effectiveMeshId) : undefined;
345
405
  return {
346
406
  id: state.instanceId,
347
407
  parentId: null,
@@ -364,7 +424,10 @@ function buildAcpSession(state: AcpProviderState, options: SessionEntryBuildOpti
364
424
  errorReason: state.errorReason,
365
425
  lastUpdated: state.lastUpdated,
366
426
  settings: state.settings,
427
+ ...(coordinator && { coordinator }),
367
428
  ...(meshQueueStats && { meshQueueStats }),
429
+ ...(resolveSurfaceHidden(state.settings) && { surfaceHidden: true }),
430
+ ...(resolveMuted(state.settings) && { muted: true }),
368
431
  };
369
432
  }
370
433
 
@@ -380,7 +443,7 @@ export function buildSessionEntries(
380
443
  const acpStates = allStates.filter((s): s is AcpProviderState => s.category === 'acp');
381
444
 
382
445
  for (const state of ideStates) {
383
- sessions.push(buildIdeWorkspaceSession(state, cdpManagers, options));
446
+ sessions.push(buildWorkspaceSession(state, cdpManagers, options));
384
447
  for (const ext of state.extensions as ExtensionProviderState[]) {
385
448
  if (!shouldIncludeExtensionSession(ext)) continue;
386
449
  sessions.push(buildExtensionAgentSession(state, ext, options));
@@ -60,8 +60,35 @@ export function classifyHotChatSessionsForSubscriptionFlush(
60
60
  recentMessageGraceMs?: number;
61
61
  activeStatuses?: ReadonlySet<string>;
62
62
  activeSessionIds?: ReadonlySet<string>;
63
+ /**
64
+ * Per-session `lastMessageAt` of the most recent completion tail that has
65
+ * already been flushed to subscribers. A completed-but-unseen session is
66
+ * kept hot for delivery REGARDLESS of the 8s recency timer, but only until
67
+ * its current tail has been delivered once — bounding the guaranteed
68
+ * delivery so a slow-finalizing turn is not re-pushed every tick forever.
69
+ * A newer `lastMessageAt` (fresh turn) re-arms delivery.
70
+ */
71
+ deliveredCompletionTailAt?: ReadonlyMap<string, number>;
72
+ /**
73
+ * (D8) PER-SUBSCRIPTION ACK gate — the authoritative guaranteed-delivery
74
+ * signal. Session ids for which at least one currently-subscribed ws has
75
+ * NOT yet been sent the session's finalized tail (its per-ws
76
+ * `lastDeliveredSignature` is empty / does not match the session's current
77
+ * tail). The daemon computes this from its live ws-subscription map; the
78
+ * classifier keeps every such session hot-for-delivery INDEPENDENT of the
79
+ * seen/unread badge, so a session whose unread badge cleared (or a fresh
80
+ * browser that re-subscribed after the single completion flush already
81
+ * fired) still gets its assistant-final tail delivered. Bounded because a
82
+ * subscriber's `lastDeliveredSignature` converges to the current tail the
83
+ * moment it is actually sent, dropping the session out of this set. When
84
+ * provided, this set is the guaranteed-delivery driver and the
85
+ * `deliveredCompletionTailAt` recency-watermark path is bypassed for these
86
+ * sessions (it stays only as the legacy opt-in for callers that don't pass
87
+ * a per-subscription set).
88
+ */
89
+ underDeliveredSessionIds?: ReadonlySet<string>;
63
90
  } = {},
64
- ): { active: Set<string>; finalizing: Set<string> } {
91
+ ): { active: Set<string>; finalizing: Set<string>; guaranteedDelivery: Set<string> } {
65
92
  const now = options.now ?? Date.now();
66
93
  const recentMessageGraceMs = Math.max(
67
94
  0,
@@ -71,8 +98,19 @@ export function classifyHotChatSessionsForSubscriptionFlush(
71
98
  );
72
99
  const activeStatuses = options.activeStatuses ?? DEFAULT_ACTIVE_CHAT_POLL_STATUSES;
73
100
  const activeSessionIds = options.activeSessionIds ?? new Set<string>();
101
+ // The guaranteed-delivery path is opt-in: only callers that provide a
102
+ // delivered-watermark map (so they can BOUND re-pushes) participate. Callers
103
+ // without it keep the original recency-window-only behavior and never enter
104
+ // the completed-but-unseen keep-hot branch (which would otherwise thrash by
105
+ // re-pushing every tick with no delivered record to stop it).
106
+ const deliveredCompletionTailAt = options.deliveredCompletionTailAt ?? null;
107
+ const underDeliveredSessionIds = options.underDeliveredSessionIds ?? null;
74
108
  const active = new Set<string>();
75
109
  const excluded = new Set<string>();
110
+ // Sessions kept hot purely because they finalized late (outside the 8s
111
+ // window) and have not been delivered yet. The caller records these so the
112
+ // next classification knows their tail is now delivered.
113
+ const guaranteedDelivery = new Set<string>();
76
114
 
77
115
  for (const session of sessions) {
78
116
  const sessionId = typeof session?.id === 'string' ? session.id : '';
@@ -104,6 +142,49 @@ export function classifyHotChatSessionsForSubscriptionFlush(
104
142
 
105
143
  if (activeStatuses.has(status) || shouldKeepRecentTailHot) {
106
144
  active.add(sessionId);
145
+ continue;
146
+ }
147
+
148
+ // (D8) PER-SUBSCRIPTION ACK-BASED guaranteed delivery — the authoritative
149
+ // path. If ANY currently-subscribed ws for this session still lacks the
150
+ // finalized tail (empty / mismatched per-ws lastDeliveredSignature), keep
151
+ // the session hot-for-delivery REGARDLESS of the seen/unread badge. This is
152
+ // the fix for the agy coordinator stranded user-only: the single completion
153
+ // flush was marked "delivered" on FLUSH-FIRE (not browser-APPLIED), and
154
+ // re-delivery was gated on completedUnseen — so once the unread badge
155
+ // cleared, a subscriber that never actually applied the assistant tail (D6
156
+ // shrink-defer drop, or a fresh browser that re-subscribed after the flush
157
+ // instant) was permanently dropped and stayed user-only forever. Gating on
158
+ // "does a live subscriber still lack the tail" instead of the badge makes it
159
+ // re-arm for exactly those subscribers, and it self-bounds: the moment a
160
+ // subscriber is actually sent the tail its signature matches and it leaves
161
+ // this set (a same-tail re-flush is a cheap no-op via prepareSessionChatTailUpdate).
162
+ if (underDeliveredSessionIds && underDeliveredSessionIds.has(sessionId)) {
163
+ active.add(sessionId);
164
+ guaranteedDelivery.add(sessionId);
165
+ continue;
166
+ }
167
+
168
+ // Legacy recency-watermark guaranteed-delivery path (opt-in via
169
+ // deliveredCompletionTailAt): a completed-but-unseen session whose native
170
+ // tail finalized AFTER the 8s window (common for multi-turn MAGI
171
+ // coordinators — the native-history tail lags the last PTY echo). Kept for
172
+ // callers that do not supply a per-subscription ACK set. When the
173
+ // per-subscription set is provided it is authoritative and this path is not
174
+ // consulted (the `continue` above already handled under-delivered sessions;
175
+ // a session NOT in the set is genuinely delivered, so it must not be revived
176
+ // here on the stale badge alone).
177
+ const completedUnseen = unread || inboxBucket === 'task_complete';
178
+ if (!underDeliveredSessionIds && deliveredCompletionTailAt && completedUnseen) {
179
+ const delivered = deliveredCompletionTailAt.get(sessionId) ?? 0;
180
+ // Not yet delivered for this turn (no record, or a newer tail arrived
181
+ // since the last delivery). lastMessageAt===0 (unknown ts) still counts
182
+ // as undelivered so the tail is not silently dropped.
183
+ const alreadyDelivered = delivered > 0 && lastMessageAt > 0 && delivered >= lastMessageAt;
184
+ if (!alreadyDelivered) {
185
+ active.add(sessionId);
186
+ guaranteedDelivery.add(sessionId);
187
+ }
107
188
  }
108
189
  }
109
190
 
@@ -111,5 +192,39 @@ export function classifyHotChatSessionsForSubscriptionFlush(
111
192
  Array.from(previousHotSessionIds).filter((sessionId) => !active.has(sessionId) && !excluded.has(sessionId)),
112
193
  );
113
194
 
114
- return { active, finalizing };
195
+ return { active, finalizing, guaranteedDelivery };
196
+ }
197
+
198
+ /**
199
+ * Detect sessions that just transitioned from an active/generating state into
200
+ * a settled/completed-but-unseen state, so their finalized completion tail can
201
+ * be flushed exactly once regardless of the recency window. Pure: the caller
202
+ * owns the `previousStatus` map and updates it from the returned `nextStatus`.
203
+ */
204
+ export function detectNewlySettledCompletedSessions(
205
+ sessions: HotChatSessionLike[],
206
+ previousStatus: ReadonlyMap<string, string>,
207
+ options: { activeStatuses?: ReadonlySet<string> } = {},
208
+ ): { settled: Set<string>; nextStatus: Map<string, string> } {
209
+ const activeStatuses = options.activeStatuses ?? DEFAULT_ACTIVE_CHAT_POLL_STATUSES;
210
+ const settled = new Set<string>();
211
+ const nextStatus = new Map<string, string>();
212
+
213
+ for (const session of sessions) {
214
+ const sessionId = typeof session?.id === 'string' ? session.id : '';
215
+ if (!sessionId) continue;
216
+ const status = String(session?.status || '').toLowerCase();
217
+ const prevStatus = previousStatus.get(sessionId);
218
+ nextStatus.set(sessionId, status);
219
+
220
+ const wasActive = prevStatus !== undefined && activeStatuses.has(prevStatus);
221
+ const isSettledNow = !activeStatuses.has(status);
222
+ const inboxBucket = String(session?.inboxBucket || '').toLowerCase();
223
+ const completedUnseen = session?.unread === true || inboxBucket === 'task_complete';
224
+ if (wasActive && isSettledNow && completedUnseen) {
225
+ settled.add(sessionId);
226
+ }
227
+ }
228
+
229
+ return { settled, nextStatus };
115
230
  }
@@ -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
  }