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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (473) hide show
  1. package/dist/boot/daemon-lifecycle.d.ts +9 -0
  2. package/dist/boot/process-hardening.d.ts +50 -0
  3. package/dist/build-info.d.ts +37 -0
  4. package/dist/chat/source-machine.d.ts +166 -0
  5. package/dist/chat/source-resolver.d.ts +104 -0
  6. package/dist/chat/subscription-updates.d.ts +1 -0
  7. package/dist/cli-adapter-types.d.ts +68 -2
  8. package/dist/cli-adapters/cli-script-runner.d.ts +117 -0
  9. package/dist/cli-adapters/cli-state-engine.d.ts +220 -0
  10. package/dist/cli-adapters/provider-cli-adapter.d.ts +126 -64
  11. package/dist/cli-adapters/provider-cli-parse.d.ts +5 -0
  12. package/dist/cli-adapters/provider-cli-runtime.d.ts +34 -0
  13. package/dist/cli-adapters/provider-cli-shared.d.ts +74 -0
  14. package/dist/cli-adapters/pty-write-chunking.d.ts +34 -0
  15. package/dist/cli-adapters/raw-terminal-io.d.ts +37 -0
  16. package/dist/cli-adapters/resolve-executable.d.ts +69 -0
  17. package/dist/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +6 -3
  18. package/dist/cli-adapters/terminal-backends/types.d.ts +10 -2
  19. package/dist/cli-adapters/terminal-screen.d.ts +4 -11
  20. package/dist/commands/chat-commands-debug-bundle.d.ts +14 -0
  21. package/dist/commands/chat-commands-read.d.ts +23 -0
  22. package/dist/commands/chat-commands-scope.d.ts +39 -0
  23. package/dist/commands/chat-commands-shared.d.ts +33 -0
  24. package/dist/commands/chat-commands-write.d.ts +14 -0
  25. package/dist/commands/chat-commands.d.ts +10 -23
  26. package/dist/commands/cli-manager.d.ts +51 -1
  27. package/dist/commands/handler.d.ts +125 -0
  28. package/dist/commands/high-family/index.d.ts +3 -0
  29. package/dist/commands/high-family/mesh-coordinator-launch.d.ts +2 -0
  30. package/dist/commands/high-family/mesh-events.d.ts +2 -0
  31. package/dist/commands/high-family/mesh-status.d.ts +2 -0
  32. package/dist/commands/high-family/types.d.ts +64 -0
  33. package/dist/commands/low-family/coordinator-prompt.d.ts +9 -0
  34. package/dist/commands/low-family/daemon-lifecycle.d.ts +2 -0
  35. package/dist/commands/low-family/diagnostics.d.ts +2 -0
  36. package/dist/commands/low-family/index.d.ts +3 -0
  37. package/dist/commands/low-family/mesh-ledger.d.ts +10 -0
  38. package/dist/commands/low-family/mesh-node-logs.d.ts +2 -0
  39. package/dist/commands/low-family/notification.d.ts +2 -0
  40. package/dist/commands/low-family/refine-config.d.ts +2 -0
  41. package/dist/commands/low-family/session-host.d.ts +2 -0
  42. package/dist/commands/low-family/spec-providerdev.d.ts +11 -0
  43. package/dist/commands/low-family/status-meta.d.ts +2 -0
  44. package/dist/commands/low-family/types.d.ts +33 -0
  45. package/dist/commands/med-family/cli-agent.d.ts +2 -0
  46. package/dist/commands/med-family/fast-forward.d.ts +2 -0
  47. package/dist/commands/med-family/ide.d.ts +10 -0
  48. package/dist/commands/med-family/index.d.ts +3 -0
  49. package/dist/commands/med-family/mesh-crud.d.ts +48 -0
  50. package/dist/commands/med-family/mesh-host-pairing.d.ts +2 -0
  51. package/dist/commands/med-family/mesh-queue.d.ts +2 -0
  52. package/dist/commands/med-family/mesh-restart.d.ts +2 -0
  53. package/dist/commands/med-family/types.d.ts +152 -0
  54. package/dist/commands/mesh-coordinator.d.ts +85 -1
  55. package/dist/commands/router-aggregate-status.d.ts +24 -0
  56. package/dist/commands/router-mesh-session-owner.d.ts +59 -0
  57. package/dist/commands/router-refine.d.ts +137 -0
  58. package/dist/commands/router-worktree-cleanup.d.ts +133 -0
  59. package/dist/commands/router.d.ts +204 -15
  60. package/dist/commands/upgrade-helper.d.ts +41 -1
  61. package/dist/config/chat-history.d.ts +11 -0
  62. package/dist/config/config.d.ts +19 -0
  63. package/dist/config/mesh-config.d.ts +136 -1
  64. package/dist/config/mesh-json-config.d.ts +199 -0
  65. package/dist/config/registry-resolver.d.ts +54 -0
  66. package/dist/config/repo-settings.d.ts +77 -0
  67. package/dist/config/state-store.d.ts +30 -0
  68. package/dist/daemon/dev-server.d.ts +0 -2
  69. package/dist/detection/cli-detector.d.ts +17 -0
  70. package/dist/detection/ide-detector.d.ts +13 -0
  71. package/dist/detection/win32-ide-version.d.ts +37 -0
  72. package/dist/git/change-impact-config.d.ts +159 -0
  73. package/dist/git/git-commands.d.ts +26 -2
  74. package/dist/git/git-diff.d.ts +6 -0
  75. package/dist/git/git-executor.d.ts +11 -0
  76. package/dist/git/git-status.d.ts +57 -0
  77. package/dist/git/git-types.d.ts +2 -50
  78. package/dist/git/git-worktree.d.ts +71 -1
  79. package/dist/git/index.d.ts +3 -1
  80. package/dist/index.d.ts +73 -17
  81. package/dist/index.js +52979 -18657
  82. package/dist/index.js.map +1 -1
  83. package/dist/index.mjs +59496 -25355
  84. package/dist/index.mjs.map +1 -1
  85. package/dist/installer.d.ts +1 -4
  86. package/dist/ipc/local-ipc-server.d.ts +91 -0
  87. package/dist/launch.d.ts +1 -1
  88. package/dist/logging/async-batch-writer.d.ts +10 -0
  89. package/dist/logging/debug-config.d.ts +16 -0
  90. package/dist/logging/log-redactor.d.ts +24 -0
  91. package/dist/logging/log-tail-reader.d.ts +81 -0
  92. package/dist/logging/logger.d.ts +1 -1
  93. package/dist/mesh/contracts.d.ts +230 -0
  94. package/dist/mesh/coordinator-prompt.d.ts +76 -0
  95. package/dist/mesh/coordinator-registry.d.ts +59 -0
  96. package/dist/mesh/mesh-active-work.d.ts +203 -0
  97. package/dist/mesh/mesh-clone-grace.d.ts +8 -0
  98. package/dist/mesh/mesh-completion-synthesis.d.ts +4 -0
  99. package/dist/mesh/mesh-coordinator-config.d.ts +21 -0
  100. package/dist/mesh/mesh-delivery-policy.d.ts +104 -0
  101. package/dist/mesh/mesh-event-classify.d.ts +7 -0
  102. package/dist/mesh/mesh-event-forwarding.d.ts +49 -0
  103. package/dist/mesh/mesh-event-trace.d.ts +21 -0
  104. package/dist/mesh/mesh-events-coordinator.d.ts +4 -0
  105. package/dist/mesh/mesh-events-pending.d.ts +246 -0
  106. package/dist/mesh/mesh-events-stale.d.ts +61 -0
  107. package/dist/mesh/mesh-events-utils.d.ts +75 -0
  108. package/dist/mesh/mesh-events.d.ts +6 -49
  109. package/dist/mesh/mesh-fast-forward.d.ts +81 -0
  110. package/dist/mesh/mesh-host-ownership.d.ts +29 -0
  111. package/dist/mesh/mesh-init.d.ts +128 -0
  112. package/dist/mesh/mesh-ledger-reconciliation.d.ts +23 -4
  113. package/dist/mesh/mesh-ledger.d.ts +139 -1
  114. package/dist/mesh/mesh-magi-status.d.ts +63 -0
  115. package/dist/mesh/mesh-missions.d.ts +281 -0
  116. package/dist/mesh/mesh-node-identity.d.ts +310 -0
  117. package/dist/mesh/mesh-queue-assignment.d.ts +158 -0
  118. package/dist/mesh/mesh-reconcile-acked-hold.d.ts +17 -0
  119. package/dist/mesh/mesh-reconcile-config.d.ts +6 -0
  120. package/dist/mesh/mesh-reconcile-identity.d.ts +6 -0
  121. package/dist/mesh/mesh-reconcile-loop.d.ts +80 -0
  122. package/dist/mesh/mesh-reconcile-v2-backstop.d.ts +16 -0
  123. package/dist/mesh/mesh-refine-batch.d.ts +68 -0
  124. package/dist/mesh/mesh-refine-gates.d.ts +428 -0
  125. package/dist/mesh/mesh-refine-status.d.ts +62 -0
  126. package/dist/mesh/mesh-remote-event-pull.d.ts +15 -0
  127. package/dist/mesh/mesh-review-inbox.d.ts +90 -0
  128. package/dist/mesh/mesh-routing.d.ts +70 -0
  129. package/dist/mesh/mesh-runtime-store.d.ts +508 -0
  130. package/dist/mesh/mesh-scheduling-runtime.d.ts +78 -0
  131. package/dist/mesh/mesh-task-inflight.d.ts +46 -0
  132. package/dist/mesh/mesh-task-stats.d.ts +49 -0
  133. package/dist/mesh/mesh-unresolved-forward-outbox.d.ts +30 -0
  134. package/dist/mesh/mesh-warmup-deadline.d.ts +68 -0
  135. package/dist/mesh/mesh-work-queue.d.ts +363 -5
  136. package/dist/mesh/preview-freshness.d.ts +28 -0
  137. package/dist/mesh/refine-config.d.ts +216 -0
  138. package/dist/mesh/worktree-bootstrap-config.d.ts +219 -0
  139. package/dist/providers/acp-provider-instance.d.ts +5 -0
  140. package/dist/providers/approval-utils.d.ts +46 -0
  141. package/dist/providers/chat-message-normalization.d.ts +58 -1
  142. package/dist/providers/cli-provider-effect-format.d.ts +30 -0
  143. package/dist/providers/cli-provider-history-dedup.d.ts +17 -0
  144. package/dist/providers/cli-provider-input-prompt.d.ts +12 -0
  145. package/dist/providers/cli-provider-instance-types.d.ts +45 -0
  146. package/dist/providers/cli-provider-instance.d.ts +406 -30
  147. package/dist/providers/cli-provider-status-helpers.d.ts +46 -0
  148. package/dist/providers/cli-provider-transcript-merge.d.ts +7 -0
  149. package/dist/providers/contracts.d.ts +149 -6
  150. package/dist/providers/external-sources.d.ts +71 -0
  151. package/dist/providers/manual-attendance.d.ts +79 -0
  152. package/dist/providers/native-history/antigravity-claim-registry.d.ts +39 -0
  153. package/dist/providers/native-history/antigravity-cli-transcript.d.ts +137 -0
  154. package/dist/providers/native-history/claude-cli-transcript.d.ts +70 -0
  155. package/dist/providers/native-history/codex-cli-transcript.d.ts +73 -0
  156. package/dist/providers/native-history/constants.d.ts +12 -0
  157. package/dist/providers/native-history/dispatcher.d.ts +44 -0
  158. package/dist/providers/native-history/hermes-cli-transcript.d.ts +30 -0
  159. package/dist/providers/native-history/index.d.ts +13 -0
  160. package/dist/providers/provider-instance-manager.d.ts +29 -0
  161. package/dist/providers/provider-instance.d.ts +30 -1
  162. package/dist/providers/provider-loader.d.ts +42 -5
  163. package/dist/providers/provider-trust.d.ts +31 -0
  164. package/dist/providers/read-chat-contract.d.ts +29 -0
  165. package/dist/providers/sdk/v1/builders/acp/detect-status.d.ts +68 -0
  166. package/dist/providers/sdk/v1/builders/cli/detect-status.d.ts +86 -0
  167. package/dist/providers/sdk/v1/builders/cli/parse-approval-squash.d.ts +59 -0
  168. package/dist/providers/sdk/v1/builders/cli/parse-approval.d.ts +65 -0
  169. package/dist/providers/sdk/v1/builders/cli/parse-session.d.ts +91 -0
  170. package/dist/providers/sdk/v1/builders/cli/visible-region.d.ts +42 -0
  171. package/dist/providers/sdk/v1/fixture-tooling/format.d.ts +126 -0
  172. package/dist/providers/sdk/v1/fixture-tooling/index.d.ts +8 -0
  173. package/dist/providers/sdk/v1/fixture-tooling/replay.d.ts +38 -0
  174. package/dist/providers/sdk/v1/index.d.ts +30 -0
  175. package/dist/providers/sdk/v1/sandbox/README-design.d.ts +193 -0
  176. package/dist/providers/sdk/v1/sandbox/require-whitelist.d.ts +74 -0
  177. package/dist/providers/sdk/v1/sandbox/script-runner.d.ts +98 -0
  178. package/dist/providers/sdk/v1/types/cli/index.d.ts +277 -0
  179. package/dist/providers/sdk/v1/types/common/index.d.ts +203 -0
  180. package/dist/providers/sdk/v1/validators/index.d.ts +5 -0
  181. package/dist/providers/sdk/v1/validators/manifest.d.ts +40 -0
  182. package/dist/providers/sdk/v1/validators/taint.d.ts +52 -0
  183. package/dist/providers/spec/adapter.d.ts +98 -0
  184. package/dist/providers/spec/cli-adapter.d.ts +223 -0
  185. package/dist/providers/spec/evaluator.d.ts +45 -0
  186. package/dist/providers/spec/fsm-driver.d.ts +449 -0
  187. package/dist/providers/spec/fsm-evaluator.d.ts +93 -0
  188. package/dist/providers/spec/fsm-loader.d.ts +14 -0
  189. package/dist/providers/spec/fsm-types.d.ts +202 -0
  190. package/dist/providers/spec/native-history-executor.d.ts +41 -0
  191. package/dist/providers/spec/pre-launch-trust.d.ts +16 -0
  192. package/dist/providers/spec/route.d.ts +4 -0
  193. package/dist/providers/spec/types.d.ts +244 -0
  194. package/dist/providers/status-monitor.d.ts +7 -7
  195. package/dist/providers/transcript-v2.d.ts +176 -0
  196. package/dist/providers/types/interactive-prompt.d.ts +84 -0
  197. package/dist/providers/working-dir.d.ts +17 -0
  198. package/dist/repo-mesh-types.d.ts +629 -12
  199. package/dist/runtime-defaults.d.ts +2 -0
  200. package/dist/session-host/managed-host.d.ts +64 -0
  201. package/dist/session-host/runtime-surface.d.ts +10 -16
  202. package/dist/sessions/registry.d.ts +26 -0
  203. package/dist/shared-types-extra.d.ts +2 -4
  204. package/dist/shared-types.d.ts +98 -55
  205. package/dist/status/chat-tail-hot-sessions.d.ts +40 -0
  206. package/dist/status/normalize.d.ts +1 -1
  207. package/dist/status/normalize.js +1 -0
  208. package/dist/status/normalize.js.map +1 -1
  209. package/dist/status/normalize.mjs +1 -0
  210. package/dist/status/normalize.mjs.map +1 -1
  211. package/dist/status/reporter.d.ts +2 -0
  212. package/dist/status/snapshot.d.ts +26 -0
  213. package/dist/system/hash.d.ts +8 -0
  214. package/dist/system/load-better-sqlite3.d.ts +21 -0
  215. package/dist/types.d.ts +5 -0
  216. package/package.json +11 -4
  217. package/src/agent-stream/poller.ts +2 -3
  218. package/src/agent-stream/provider-adapter.ts +1 -1
  219. package/src/boot/daemon-lifecycle.ts +80 -14
  220. package/src/boot/process-hardening.ts +89 -0
  221. package/src/build-info.ts +73 -0
  222. package/src/chat/source-machine.ts +534 -0
  223. package/src/chat/source-resolver.ts +0 -0
  224. package/src/chat/subscription-updates.ts +20 -1
  225. package/src/cli-adapter-types.d.ts +3 -1
  226. package/src/cli-adapter-types.ts +68 -2
  227. package/src/cli-adapters/cli-script-runner.ts +421 -0
  228. package/src/cli-adapters/cli-state-engine.ts +1282 -0
  229. package/src/cli-adapters/provider-cli-adapter.d.ts +1 -1
  230. package/src/cli-adapters/provider-cli-adapter.ts +954 -1144
  231. package/src/cli-adapters/provider-cli-parse.d.ts +2 -0
  232. package/src/cli-adapters/provider-cli-parse.ts +19 -0
  233. package/src/cli-adapters/provider-cli-runtime.ts +56 -7
  234. package/src/cli-adapters/provider-cli-shared.d.ts +4 -0
  235. package/src/cli-adapters/provider-cli-shared.ts +121 -11
  236. package/src/cli-adapters/pty-transport.ts +2 -1
  237. package/src/cli-adapters/pty-write-chunking.ts +106 -0
  238. package/src/cli-adapters/raw-terminal-io.ts +252 -0
  239. package/src/cli-adapters/resolve-executable.ts +204 -0
  240. package/src/cli-adapters/session-host-transport.ts +2 -1
  241. package/src/cli-adapters/terminal-backends/ghostty-vt-backend.ts +63 -29
  242. package/src/cli-adapters/terminal-backends/types.ts +10 -3
  243. package/src/cli-adapters/terminal-screen.ts +16 -81
  244. package/src/commands/chat-commands-debug-bundle.ts +398 -0
  245. package/src/commands/chat-commands-read.ts +2767 -0
  246. package/src/commands/chat-commands-scope.ts +54 -0
  247. package/src/commands/chat-commands-shared.ts +114 -0
  248. package/src/commands/chat-commands-write.ts +891 -0
  249. package/src/commands/chat-commands.ts +19 -1841
  250. package/src/commands/cli-manager.d.ts +2 -0
  251. package/src/commands/cli-manager.ts +659 -27
  252. package/src/commands/handler.ts +845 -2
  253. package/src/commands/high-family/index.ts +28 -0
  254. package/src/commands/high-family/mesh-coordinator-launch.ts +680 -0
  255. package/src/commands/high-family/mesh-events.ts +102 -0
  256. package/src/commands/high-family/mesh-status.ts +849 -0
  257. package/src/commands/high-family/types.ts +80 -0
  258. package/src/commands/low-family/coordinator-prompt.ts +72 -0
  259. package/src/commands/low-family/daemon-lifecycle.ts +120 -0
  260. package/src/commands/low-family/diagnostics.ts +57 -0
  261. package/src/commands/low-family/index.ts +37 -0
  262. package/src/commands/low-family/mesh-ledger.ts +62 -0
  263. package/src/commands/low-family/mesh-node-logs.ts +87 -0
  264. package/src/commands/low-family/notification.ts +116 -0
  265. package/src/commands/low-family/refine-config.ts +106 -0
  266. package/src/commands/low-family/session-host.ts +282 -0
  267. package/src/commands/low-family/spec-providerdev.ts +217 -0
  268. package/src/commands/low-family/status-meta.ts +112 -0
  269. package/src/commands/low-family/types.ts +39 -0
  270. package/src/commands/med-family/cli-agent.ts +241 -0
  271. package/src/commands/med-family/fast-forward.ts +230 -0
  272. package/src/commands/med-family/ide.ts +163 -0
  273. package/src/commands/med-family/index.ts +37 -0
  274. package/src/commands/med-family/mesh-crud.ts +1287 -0
  275. package/src/commands/med-family/mesh-host-pairing.ts +234 -0
  276. package/src/commands/med-family/mesh-queue.ts +167 -0
  277. package/src/commands/med-family/mesh-restart.ts +92 -0
  278. package/src/commands/med-family/types.ts +153 -0
  279. package/src/commands/mesh-coordinator.ts +334 -124
  280. package/src/commands/router-aggregate-status.ts +209 -0
  281. package/src/commands/router-mesh-session-owner.ts +114 -0
  282. package/src/commands/router-refine.ts +1711 -0
  283. package/src/commands/router-worktree-cleanup.ts +870 -0
  284. package/src/commands/router.ts +795 -4143
  285. package/src/commands/stream-commands.ts +8 -0
  286. package/src/commands/upgrade-helper.ts +310 -45
  287. package/src/config/chat-history.ts +517 -24
  288. package/src/config/config.ts +30 -0
  289. package/src/config/mesh-config.ts +632 -23
  290. package/src/config/mesh-json-config.ts +376 -0
  291. package/src/config/recent-activity.ts +8 -2
  292. package/src/config/registry-resolver.ts +100 -0
  293. package/src/config/repo-settings.ts +111 -0
  294. package/src/config/state-store.ts +55 -0
  295. package/src/daemon/dev-auto-implement.ts +3 -2
  296. package/src/daemon/dev-cli-debug.ts +10 -1
  297. package/src/daemon/dev-server.ts +0 -541
  298. package/src/detection/cli-detector.ts +94 -9
  299. package/src/detection/ide-detector.ts +55 -16
  300. package/src/detection/win32-ide-version.ts +106 -0
  301. package/src/git/change-impact-config.ts +354 -0
  302. package/src/git/git-commands.ts +112 -16
  303. package/src/git/git-diff.ts +81 -11
  304. package/src/git/git-executor.ts +12 -0
  305. package/src/git/git-status.ts +767 -48
  306. package/src/git/git-types.ts +14 -62
  307. package/src/git/git-worktree.ts +261 -4
  308. package/src/git/index.ts +17 -0
  309. package/src/index.ts +213 -13
  310. package/src/installer.d.ts +1 -1
  311. package/src/installer.ts +8 -6
  312. package/src/ipc/local-ipc-server.ts +278 -0
  313. package/src/launch.d.ts +1 -1
  314. package/src/launch.ts +37 -28
  315. package/src/logging/async-batch-writer.ts +55 -0
  316. package/src/logging/command-log.ts +7 -5
  317. package/src/logging/debug-config.ts +25 -0
  318. package/src/logging/debug-trace.ts +7 -2
  319. package/src/logging/log-redactor.ts +100 -0
  320. package/src/logging/log-tail-reader.ts +341 -0
  321. package/src/logging/logger.ts +14 -7
  322. package/src/mesh/contracts.ts +469 -0
  323. package/src/mesh/coordinator-prompt.ts +572 -34
  324. package/src/mesh/coordinator-registry.ts +121 -0
  325. package/src/mesh/mesh-active-work.ts +706 -0
  326. package/src/mesh/mesh-clone-grace.ts +68 -0
  327. package/src/mesh/mesh-completion-synthesis.ts +416 -0
  328. package/src/mesh/mesh-coordinator-config.ts +97 -0
  329. package/src/mesh/mesh-delivery-policy.ts +284 -0
  330. package/src/mesh/mesh-event-classify.ts +78 -0
  331. package/src/mesh/mesh-event-forwarding.ts +2002 -0
  332. package/src/mesh/mesh-event-trace.ts +67 -0
  333. package/src/mesh/mesh-events-coordinator.ts +32 -0
  334. package/src/mesh/mesh-events-pending.ts +1494 -0
  335. package/src/mesh/mesh-events-stale.ts +452 -0
  336. package/src/mesh/mesh-events-utils.ts +443 -0
  337. package/src/mesh/mesh-events.ts +43 -1035
  338. package/src/mesh/mesh-fast-forward.ts +856 -0
  339. package/src/mesh/mesh-host-ownership.ts +111 -0
  340. package/src/mesh/mesh-init.ts +350 -0
  341. package/src/mesh/mesh-ledger-reconciliation.ts +12 -7
  342. package/src/mesh/mesh-ledger.ts +898 -102
  343. package/src/mesh/mesh-magi-status.ts +223 -0
  344. package/src/mesh/mesh-missions.ts +695 -0
  345. package/src/mesh/mesh-node-identity.ts +2065 -0
  346. package/src/mesh/mesh-queue-assignment.ts +2263 -0
  347. package/src/mesh/mesh-reconcile-acked-hold.ts +230 -0
  348. package/src/mesh/mesh-reconcile-config.ts +66 -0
  349. package/src/mesh/mesh-reconcile-identity.ts +103 -0
  350. package/src/mesh/mesh-reconcile-loop.ts +1473 -0
  351. package/src/mesh/mesh-reconcile-v2-backstop.ts +62 -0
  352. package/src/mesh/mesh-refine-batch.ts +205 -0
  353. package/src/mesh/mesh-refine-gates.ts +1686 -0
  354. package/src/mesh/mesh-refine-status.ts +231 -0
  355. package/src/mesh/mesh-remote-event-pull.ts +279 -0
  356. package/src/mesh/mesh-review-inbox.ts +308 -0
  357. package/src/mesh/mesh-routing.ts +291 -0
  358. package/src/mesh/mesh-runtime-store.ts +2150 -0
  359. package/src/mesh/mesh-scheduling-runtime.ts +198 -0
  360. package/src/mesh/mesh-task-inflight.ts +70 -0
  361. package/src/mesh/mesh-task-stats.ts +161 -0
  362. package/src/mesh/mesh-unresolved-forward-outbox.ts +185 -0
  363. package/src/mesh/mesh-warmup-deadline.ts +152 -0
  364. package/src/mesh/mesh-work-queue.ts +1437 -147
  365. package/src/mesh/preview-freshness.ts +163 -0
  366. package/src/mesh/refine-config.ts +423 -0
  367. package/src/mesh/worktree-bootstrap-config.ts +599 -0
  368. package/src/providers/acp-provider-instance.ts +43 -10
  369. package/src/providers/approval-utils.d.ts +5 -0
  370. package/src/providers/approval-utils.ts +100 -6
  371. package/src/providers/chat-message-normalization.ts +126 -4
  372. package/src/providers/cli-provider-effect-format.ts +53 -0
  373. package/src/providers/cli-provider-history-dedup.ts +75 -0
  374. package/src/providers/cli-provider-input-prompt.ts +133 -0
  375. package/src/providers/cli-provider-instance-types.ts +131 -0
  376. package/src/providers/cli-provider-instance.ts +2709 -499
  377. package/src/providers/cli-provider-status-helpers.ts +123 -0
  378. package/src/providers/cli-provider-transcript-merge.ts +114 -0
  379. package/src/providers/contracts.d.ts +55 -0
  380. package/src/providers/contracts.ts +160 -6
  381. package/src/providers/extension-provider-instance.ts +12 -7
  382. package/src/providers/external-sources.ts +218 -0
  383. package/src/providers/ide-provider-instance.ts +35 -12
  384. package/src/providers/manual-attendance.ts +105 -0
  385. package/src/providers/native-history/antigravity-claim-registry.ts +138 -0
  386. package/src/providers/native-history/antigravity-cli-transcript.ts +1275 -0
  387. package/src/providers/native-history/claude-cli-transcript.ts +396 -0
  388. package/src/providers/native-history/codex-cli-transcript.ts +479 -0
  389. package/src/providers/native-history/constants.ts +19 -0
  390. package/src/providers/native-history/dispatcher.ts +617 -0
  391. package/src/providers/native-history/hermes-cli-transcript.ts +312 -0
  392. package/src/providers/native-history/index.ts +30 -0
  393. package/src/providers/provider-instance-manager.ts +71 -0
  394. package/src/providers/provider-instance.ts +24 -1
  395. package/src/providers/provider-loader.ts +700 -55
  396. package/src/providers/provider-schema.ts +87 -14
  397. package/src/providers/provider-trust.ts +114 -0
  398. package/src/providers/read-chat-contract.ts +76 -16
  399. package/src/providers/sdk/README.md +49 -0
  400. package/src/providers/sdk/v1/builders/acp/detect-status.ts +144 -0
  401. package/src/providers/sdk/v1/builders/cli/detect-status.ts +313 -0
  402. package/src/providers/sdk/v1/builders/cli/parse-approval-squash.ts +158 -0
  403. package/src/providers/sdk/v1/builders/cli/parse-approval.ts +261 -0
  404. package/src/providers/sdk/v1/builders/cli/parse-session.ts +276 -0
  405. package/src/providers/sdk/v1/builders/cli/visible-region.ts +143 -0
  406. package/src/providers/sdk/v1/fixture-tooling/format.ts +130 -0
  407. package/src/providers/sdk/v1/fixture-tooling/index.ts +22 -0
  408. package/src/providers/sdk/v1/fixture-tooling/replay.ts +352 -0
  409. package/src/providers/sdk/v1/index.ts +152 -0
  410. package/src/providers/sdk/v1/sandbox/README-design.ts +195 -0
  411. package/src/providers/sdk/v1/sandbox/require-whitelist.ts +472 -0
  412. package/src/providers/sdk/v1/sandbox/script-runner.ts +150 -0
  413. package/src/providers/sdk/v1/schemas/cli/provider.schema.json +509 -0
  414. package/src/providers/sdk/v1/schemas/primitives/acp-session-protocol-v1.json +131 -0
  415. package/src/providers/sdk/v1/schemas/primitives/native-history-codex-rollout-v1.json +66 -0
  416. package/src/providers/sdk/v1/schemas/primitives/tui-approval-squash-v1.json +91 -0
  417. package/src/providers/sdk/v1/schemas/primitives/tui-assistant-block-v1.json +91 -0
  418. package/src/providers/sdk/v1/schemas/primitives/tui-cue-ordering-v1.json +47 -0
  419. package/src/providers/sdk/v1/schemas/primitives/tui-dispatch-order-v1.json +32 -0
  420. package/src/providers/sdk/v1/schemas/primitives/tui-footer-chrome-v1.json +42 -0
  421. package/src/providers/sdk/v1/schemas/primitives/tui-index-finder-v1.json +27 -0
  422. package/src/providers/sdk/v1/schemas/primitives/tui-modal-v1.json +125 -0
  423. package/src/providers/sdk/v1/schemas/primitives/tui-prompt-marker-v1.json +45 -0
  424. package/src/providers/sdk/v1/schemas/primitives/tui-session-id-extraction-v1.json +46 -0
  425. package/src/providers/sdk/v1/schemas/primitives/tui-settled-prompt-v1.json +71 -0
  426. package/src/providers/sdk/v1/schemas/primitives/tui-spinner-v1.json +83 -0
  427. package/src/providers/sdk/v1/schemas/primitives/tui-transcript-pty-v1.json +83 -0
  428. package/src/providers/sdk/v1/schemas/primitives/tui-visible-region-v1.json +57 -0
  429. package/src/providers/sdk/v1/schemas/primitives/tui-welcome-screen-v1.json +35 -0
  430. package/src/providers/sdk/v1/types/cli/index.ts +365 -0
  431. package/src/providers/sdk/v1/types/common/index.ts +229 -0
  432. package/src/providers/sdk/v1/validators/index.ts +19 -0
  433. package/src/providers/sdk/v1/validators/manifest.ts +110 -0
  434. package/src/providers/sdk/v1/validators/taint.ts +309 -0
  435. package/src/providers/spec/adapter.ts +246 -0
  436. package/src/providers/spec/cli-adapter.ts +1064 -0
  437. package/src/providers/spec/evaluator.ts +407 -0
  438. package/src/providers/spec/fsm-driver.ts +1528 -0
  439. package/src/providers/spec/fsm-evaluator.ts +290 -0
  440. package/src/providers/spec/fsm-loader.ts +128 -0
  441. package/src/providers/spec/fsm-types.ts +301 -0
  442. package/src/providers/spec/native-history-executor.ts +1241 -0
  443. package/src/providers/spec/pre-launch-trust.ts +104 -0
  444. package/src/providers/spec/route.ts +51 -0
  445. package/src/providers/spec/types.ts +284 -0
  446. package/src/providers/status-monitor.d.ts +7 -7
  447. package/src/providers/status-monitor.ts +37 -22
  448. package/src/providers/transcript-v2.ts +567 -0
  449. package/src/providers/types/interactive-prompt.ts +536 -0
  450. package/src/providers/version-archive.ts +64 -24
  451. package/src/providers/working-dir.ts +23 -0
  452. package/src/repo-mesh-types.ts +868 -13
  453. package/src/runtime-defaults.ts +39 -0
  454. package/src/session-host/managed-host.ts +218 -0
  455. package/src/session-host/runtime-surface.ts +20 -80
  456. package/src/sessions/registry.ts +44 -0
  457. package/src/shared-types-extra.ts +2 -4
  458. package/src/shared-types.d.ts +8 -0
  459. package/src/shared-types.ts +136 -55
  460. package/src/status/builders.ts +26 -6
  461. package/src/status/chat-tail-hot-sessions.ts +117 -2
  462. package/src/status/normalize.ts +2 -0
  463. package/src/status/reporter.ts +19 -1
  464. package/src/status/snapshot.ts +95 -26
  465. package/src/system/hash.ts +23 -0
  466. package/src/system/host-memory.ts +29 -12
  467. package/src/system/load-better-sqlite3.ts +68 -0
  468. package/src/types.ts +5 -0
  469. package/dist/cli-adapters/terminal-backends/xterm-backend.d.ts +0 -17
  470. package/dist/mesh/mesh-sync.d.ts +0 -53
  471. package/src/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +0 -16
  472. package/src/cli-adapters/terminal-backends/xterm-backend.ts +0 -97
  473. package/src/mesh/mesh-sync.ts +0 -111
@@ -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;
@@ -389,6 +417,17 @@ export interface SessionEntry {
389
417
  seenCompletionMarker?: string;
390
418
  surfaceHidden?: boolean;
391
419
  settings?: Record<string, any>;
420
+ /**
421
+ * True owning-daemon id for a session a coordinator synthesises into its own
422
+ * status snapshot (mesh delegated sessions). The dashboard attributes the session
423
+ * to this daemon instead of the snapshot daemon so the worker node — not the
424
+ * coordinator — is shown as its machine.
425
+ */
426
+ ownerDaemonId?: string;
427
+ /** True owning-machine display name fallback when the owning daemon is not aggregated. */
428
+ ownerMachineName?: string;
429
+ /** Set when this session is acting as a mesh coordinator for the given mesh. */
430
+ coordinator?: { meshId: string; role: 'coordinator' };
392
431
  meshQueueStats?: {
393
432
  total?: number;
394
433
  active?: number;
@@ -516,7 +555,39 @@ export interface AvailableProviderInfo {
516
555
  lastVerification?: MachineProviderCheckResult;
517
556
  /** Provider-declared Repo Mesh coordinator/MCP behavior. */
518
557
  meshCoordinator?: ProviderMeshCoordinatorConfig;
519
- }
558
+ /**
559
+ * Provider trust classification — derived from the on-disk layer the
560
+ * manifest came from and the shape of the manifest. Dashboards use
561
+ * this to render a trust badge and gate activation of
562
+ * `external-untrusted` providers behind a confirm modal.
563
+ */
564
+ trust?: ProviderTrust;
565
+ /** Daemon-side human-readable description of the trust value. */
566
+ trustDescription?: string;
567
+ /** True when activation needs a user-side confirmation step. */
568
+ requiresConfirmation?: boolean;
569
+ /** Which on-disk layer the manifest lives in. */
570
+ sourceLayer?: 'user' | 'upstream' | 'external';
571
+ /** For external providers, the source-name namespace it came from. */
572
+ sourceName?: string | null;
573
+ /** Manifest-declared version, e.g. "1.2.1". */
574
+ providerVersion?: string;
575
+ /** Underlying executable name (CLI/binary providers). */
576
+ binary?: string;
577
+ /** Lifecycle label from the manifest: "Stable", "Beta", … */
578
+ status?: string;
579
+ /** One-line provider description from the manifest. */
580
+ details?: string;
581
+ /** Manifest-declared links: homepage, docs, repo, … */
582
+ links?: Record<string, string>;
583
+ }
584
+
585
+ export type ProviderTrust =
586
+ | 'user-custom'
587
+ | 'trusted'
588
+ | 'trusted-with-scripts'
589
+ | 'external-safe'
590
+ | 'external-untrusted';
520
591
 
521
592
  export interface MachineProviderCheckResult {
522
593
  ok: boolean;
@@ -582,6 +653,13 @@ export interface ProviderControlSchema {
582
653
  order?: number;
583
654
  /** Hide this control even if it would otherwise render */
584
655
  hidden?: boolean;
656
+ /**
657
+ * FSM state ids in which this control should be visible. When omitted the
658
+ * control is always visible. Mirrors the daemon's click-time enforcement so
659
+ * the bar hides controls the daemon would silently drop. Uses raw FSM state
660
+ * ids (e.g. 'idle', 'busy'), not the derived dashboard status.
661
+ */
662
+ visibleWhenState?: string[];
585
663
  }
586
664
 
587
665
  // ─── Common Sub-Types (used across StatusReportPayload, BaseDaemonData, etc.) ──
@@ -687,6 +765,9 @@ export type DaemonStatusEventName =
687
765
  | 'agent:waiting_approval'
688
766
  | 'agent:generating_completed'
689
767
  | 'agent:stopped'
768
+ | 'monitor:no_progress'
769
+ // Legacy alias for 'monitor:no_progress' — kept so older daemons that still
770
+ // emit it remain type-compatible with consumers during rollout.
690
771
  | 'monitor:long_generating';
691
772
 
692
773
  /** 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));
@@ -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
  }