@adhdev/daemon-core 0.9.82-rc.37 → 0.9.82-rc.371

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 (384) hide show
  1. package/dist/boot/daemon-lifecycle.d.ts +9 -0
  2. package/dist/boot/process-hardening.d.ts +50 -0
  3. package/dist/build-info.d.ts +37 -0
  4. package/dist/chat/source-machine.d.ts +166 -0
  5. package/dist/chat/source-resolver.d.ts +104 -0
  6. package/dist/chat/subscription-updates.d.ts +1 -0
  7. package/dist/cli-adapter-types.d.ts +55 -2
  8. package/dist/cli-adapters/cli-script-runner.d.ts +117 -0
  9. package/dist/cli-adapters/cli-state-engine.d.ts +198 -0
  10. package/dist/cli-adapters/provider-cli-adapter.d.ts +116 -64
  11. package/dist/cli-adapters/provider-cli-parse.d.ts +4 -0
  12. package/dist/cli-adapters/provider-cli-runtime.d.ts +34 -0
  13. package/dist/cli-adapters/provider-cli-shared.d.ts +63 -0
  14. package/dist/cli-adapters/raw-terminal-io.d.ts +37 -0
  15. package/dist/cli-adapters/resolve-executable.d.ts +14 -0
  16. package/dist/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +6 -3
  17. package/dist/cli-adapters/terminal-backends/types.d.ts +10 -2
  18. package/dist/cli-adapters/terminal-screen.d.ts +4 -11
  19. package/dist/commands/chat-commands.d.ts +27 -0
  20. package/dist/commands/cli-manager.d.ts +15 -1
  21. package/dist/commands/handler.d.ts +125 -0
  22. package/dist/commands/high-family/index.d.ts +3 -0
  23. package/dist/commands/high-family/mesh-coordinator-launch.d.ts +2 -0
  24. package/dist/commands/high-family/mesh-events.d.ts +2 -0
  25. package/dist/commands/high-family/mesh-status.d.ts +2 -0
  26. package/dist/commands/high-family/types.d.ts +60 -0
  27. package/dist/commands/low-family/coordinator-prompt.d.ts +9 -0
  28. package/dist/commands/low-family/daemon-lifecycle.d.ts +2 -0
  29. package/dist/commands/low-family/diagnostics.d.ts +2 -0
  30. package/dist/commands/low-family/index.d.ts +3 -0
  31. package/dist/commands/low-family/mesh-ledger.d.ts +10 -0
  32. package/dist/commands/low-family/mesh-node-logs.d.ts +2 -0
  33. package/dist/commands/low-family/notification.d.ts +2 -0
  34. package/dist/commands/low-family/refine-config.d.ts +2 -0
  35. package/dist/commands/low-family/session-host.d.ts +2 -0
  36. package/dist/commands/low-family/spec-providerdev.d.ts +11 -0
  37. package/dist/commands/low-family/status-meta.d.ts +2 -0
  38. package/dist/commands/low-family/types.d.ts +33 -0
  39. package/dist/commands/med-family/cli-agent.d.ts +2 -0
  40. package/dist/commands/med-family/fast-forward.d.ts +2 -0
  41. package/dist/commands/med-family/ide.d.ts +10 -0
  42. package/dist/commands/med-family/index.d.ts +3 -0
  43. package/dist/commands/med-family/mesh-crud.d.ts +2 -0
  44. package/dist/commands/med-family/mesh-host-pairing.d.ts +2 -0
  45. package/dist/commands/med-family/mesh-queue.d.ts +2 -0
  46. package/dist/commands/med-family/mesh-restart.d.ts +2 -0
  47. package/dist/commands/med-family/types.d.ts +116 -0
  48. package/dist/commands/mesh-coordinator.d.ts +85 -1
  49. package/dist/commands/router.d.ts +666 -2
  50. package/dist/commands/upgrade-helper.d.ts +41 -1
  51. package/dist/config/chat-history.d.ts +9 -0
  52. package/dist/config/config.d.ts +5 -0
  53. package/dist/config/mesh-config.d.ts +77 -1
  54. package/dist/daemon/dev-server.d.ts +0 -2
  55. package/dist/detection/ide-detector.d.ts +13 -0
  56. package/dist/detection/win32-ide-version.d.ts +37 -0
  57. package/dist/git/change-impact-config.d.ts +159 -0
  58. package/dist/git/git-commands.d.ts +11 -1
  59. package/dist/git/git-diff.d.ts +6 -0
  60. package/dist/git/git-executor.d.ts +11 -0
  61. package/dist/git/git-status.d.ts +23 -0
  62. package/dist/git/git-types.d.ts +2 -50
  63. package/dist/git/index.d.ts +2 -0
  64. package/dist/index.d.ts +55 -13
  65. package/dist/index.js +46565 -19737
  66. package/dist/index.js.map +1 -1
  67. package/dist/index.mjs +43563 -16868
  68. package/dist/index.mjs.map +1 -1
  69. package/dist/installer.d.ts +1 -4
  70. package/dist/ipc/local-ipc-server.d.ts +91 -0
  71. package/dist/launch.d.ts +1 -1
  72. package/dist/logging/async-batch-writer.d.ts +10 -0
  73. package/dist/logging/log-redactor.d.ts +24 -0
  74. package/dist/logging/log-tail-reader.d.ts +46 -0
  75. package/dist/logging/logger.d.ts +1 -1
  76. package/dist/mesh/contracts.d.ts +164 -0
  77. package/dist/mesh/coordinator-prompt.d.ts +36 -0
  78. package/dist/mesh/coordinator-registry.d.ts +59 -0
  79. package/dist/mesh/mesh-active-work.d.ts +174 -0
  80. package/dist/mesh/mesh-delivery-policy.d.ts +131 -0
  81. package/dist/mesh/mesh-event-trace.d.ts +21 -0
  82. package/dist/mesh/mesh-events-coordinator.d.ts +91 -0
  83. package/dist/mesh/mesh-events-pending.d.ts +55 -0
  84. package/dist/mesh/mesh-events-stale.d.ts +40 -0
  85. package/dist/mesh/mesh-events-utils.d.ts +61 -0
  86. package/dist/mesh/mesh-events.d.ts +6 -49
  87. package/dist/mesh/mesh-fast-forward.d.ts +81 -0
  88. package/dist/mesh/mesh-host-ownership.d.ts +9 -0
  89. package/dist/mesh/mesh-init.d.ts +86 -0
  90. package/dist/mesh/mesh-ledger-reconciliation.d.ts +23 -3
  91. package/dist/mesh/mesh-ledger.d.ts +77 -1
  92. package/dist/mesh/mesh-missions.d.ts +164 -0
  93. package/dist/mesh/mesh-reconcile-loop.d.ts +7 -0
  94. package/dist/mesh/mesh-refine-batch.d.ts +68 -0
  95. package/dist/mesh/mesh-refine-status.d.ts +62 -0
  96. package/dist/mesh/mesh-review-inbox.d.ts +90 -0
  97. package/dist/mesh/mesh-routing.d.ts +70 -0
  98. package/dist/mesh/mesh-runtime-store.d.ts +429 -0
  99. package/dist/mesh/mesh-task-stats.d.ts +49 -0
  100. package/dist/mesh/mesh-unresolved-forward-outbox.d.ts +30 -0
  101. package/dist/mesh/mesh-warmup-deadline.d.ts +68 -0
  102. package/dist/mesh/mesh-work-queue.d.ts +246 -5
  103. package/dist/mesh/preview-freshness.d.ts +18 -0
  104. package/dist/mesh/refine-config.d.ts +216 -0
  105. package/dist/mesh/worktree-bootstrap-config.d.ts +135 -0
  106. package/dist/providers/acp-provider-instance.d.ts +5 -0
  107. package/dist/providers/approval-utils.d.ts +20 -0
  108. package/dist/providers/chat-message-normalization.d.ts +12 -0
  109. package/dist/providers/cli-provider-instance.d.ts +108 -3
  110. package/dist/providers/contracts.d.ts +139 -6
  111. package/dist/providers/external-sources.d.ts +71 -0
  112. package/dist/providers/manual-attendance.d.ts +63 -0
  113. package/dist/providers/native-history/antigravity-cli-transcript.d.ts +100 -0
  114. package/dist/providers/native-history/claude-cli-transcript.d.ts +70 -0
  115. package/dist/providers/native-history/codex-cli-transcript.d.ts +73 -0
  116. package/dist/providers/native-history/dispatcher.d.ts +27 -0
  117. package/dist/providers/native-history/hermes-cli-transcript.d.ts +30 -0
  118. package/dist/providers/native-history/index.d.ts +13 -0
  119. package/dist/providers/provider-instance-manager.d.ts +14 -0
  120. package/dist/providers/provider-instance.d.ts +23 -1
  121. package/dist/providers/provider-loader.d.ts +26 -4
  122. package/dist/providers/provider-trust.d.ts +31 -0
  123. package/dist/providers/read-chat-contract.d.ts +29 -0
  124. package/dist/providers/sdk/v1/builders/acp/detect-status.d.ts +68 -0
  125. package/dist/providers/sdk/v1/builders/cli/detect-status.d.ts +86 -0
  126. package/dist/providers/sdk/v1/builders/cli/parse-approval-squash.d.ts +59 -0
  127. package/dist/providers/sdk/v1/builders/cli/parse-approval.d.ts +65 -0
  128. package/dist/providers/sdk/v1/builders/cli/parse-session.d.ts +91 -0
  129. package/dist/providers/sdk/v1/builders/cli/visible-region.d.ts +42 -0
  130. package/dist/providers/sdk/v1/fixture-tooling/format.d.ts +126 -0
  131. package/dist/providers/sdk/v1/fixture-tooling/index.d.ts +8 -0
  132. package/dist/providers/sdk/v1/fixture-tooling/replay.d.ts +38 -0
  133. package/dist/providers/sdk/v1/index.d.ts +30 -0
  134. package/dist/providers/sdk/v1/sandbox/README-design.d.ts +193 -0
  135. package/dist/providers/sdk/v1/sandbox/require-whitelist.d.ts +74 -0
  136. package/dist/providers/sdk/v1/sandbox/script-runner.d.ts +98 -0
  137. package/dist/providers/sdk/v1/types/cli/index.d.ts +277 -0
  138. package/dist/providers/sdk/v1/types/common/index.d.ts +203 -0
  139. package/dist/providers/sdk/v1/validators/index.d.ts +5 -0
  140. package/dist/providers/sdk/v1/validators/manifest.d.ts +40 -0
  141. package/dist/providers/sdk/v1/validators/taint.d.ts +52 -0
  142. package/dist/providers/spec/adapter.d.ts +91 -0
  143. package/dist/providers/spec/cli-adapter.d.ts +223 -0
  144. package/dist/providers/spec/evaluator.d.ts +45 -0
  145. package/dist/providers/spec/fsm-driver.d.ts +395 -0
  146. package/dist/providers/spec/fsm-evaluator.d.ts +76 -0
  147. package/dist/providers/spec/fsm-loader.d.ts +14 -0
  148. package/dist/providers/spec/fsm-types.d.ts +174 -0
  149. package/dist/providers/spec/native-history-executor.d.ts +41 -0
  150. package/dist/providers/spec/pre-launch-trust.d.ts +16 -0
  151. package/dist/providers/spec/route.d.ts +4 -0
  152. package/dist/providers/spec/types.d.ts +222 -0
  153. package/dist/providers/status-monitor.d.ts +7 -7
  154. package/dist/providers/transcript-v2.d.ts +176 -0
  155. package/dist/providers/types/interactive-prompt.d.ts +84 -0
  156. package/dist/providers/working-dir.d.ts +17 -0
  157. package/dist/repo-mesh-types.d.ts +295 -13
  158. package/dist/sessions/registry.d.ts +6 -0
  159. package/dist/shared-types-extra.d.ts +2 -4
  160. package/dist/shared-types.d.ts +59 -2
  161. package/dist/status/normalize.d.ts +1 -1
  162. package/dist/status/normalize.js +1 -0
  163. package/dist/status/normalize.js.map +1 -1
  164. package/dist/status/normalize.mjs +1 -0
  165. package/dist/status/normalize.mjs.map +1 -1
  166. package/dist/status/reporter.d.ts +2 -0
  167. package/dist/status/snapshot.d.ts +26 -0
  168. package/dist/system/hash.d.ts +8 -0
  169. package/dist/system/load-better-sqlite3.d.ts +21 -0
  170. package/dist/types.d.ts +5 -0
  171. package/package.json +7 -3
  172. package/src/agent-stream/poller.ts +2 -3
  173. package/src/agent-stream/provider-adapter.ts +1 -1
  174. package/src/boot/daemon-lifecycle.ts +63 -12
  175. package/src/boot/process-hardening.ts +89 -0
  176. package/src/build-info.ts +73 -0
  177. package/src/chat/source-machine.ts +534 -0
  178. package/src/chat/source-resolver.ts +0 -0
  179. package/src/chat/subscription-updates.ts +20 -1
  180. package/src/cli-adapter-types.d.ts +1 -0
  181. package/src/cli-adapter-types.ts +56 -2
  182. package/src/cli-adapters/cli-script-runner.ts +421 -0
  183. package/src/cli-adapters/cli-state-engine.ts +1221 -0
  184. package/src/cli-adapters/provider-cli-adapter.d.ts +1 -1
  185. package/src/cli-adapters/provider-cli-adapter.ts +775 -1141
  186. package/src/cli-adapters/provider-cli-parse.d.ts +1 -0
  187. package/src/cli-adapters/provider-cli-parse.ts +13 -0
  188. package/src/cli-adapters/provider-cli-runtime.ts +56 -7
  189. package/src/cli-adapters/provider-cli-shared.d.ts +4 -0
  190. package/src/cli-adapters/provider-cli-shared.ts +110 -11
  191. package/src/cli-adapters/pty-transport.ts +2 -1
  192. package/src/cli-adapters/raw-terminal-io.ts +252 -0
  193. package/src/cli-adapters/resolve-executable.ts +90 -0
  194. package/src/cli-adapters/session-host-transport.ts +2 -1
  195. package/src/cli-adapters/terminal-backends/ghostty-vt-backend.ts +53 -29
  196. package/src/cli-adapters/terminal-backends/types.ts +10 -3
  197. package/src/cli-adapters/terminal-screen.ts +16 -81
  198. package/src/commands/WINDOWS-UPGRADE-LOCK-FAILURE.md +198 -0
  199. package/src/commands/chat-commands.ts +1917 -62
  200. package/src/commands/cli-manager.ts +502 -24
  201. package/src/commands/handler.ts +841 -2
  202. package/src/commands/high-family/index.ts +28 -0
  203. package/src/commands/high-family/mesh-coordinator-launch.ts +592 -0
  204. package/src/commands/high-family/mesh-events.ts +47 -0
  205. package/src/commands/high-family/mesh-status.ts +642 -0
  206. package/src/commands/high-family/types.ts +76 -0
  207. package/src/commands/low-family/coordinator-prompt.ts +72 -0
  208. package/src/commands/low-family/daemon-lifecycle.ts +107 -0
  209. package/src/commands/low-family/diagnostics.ts +57 -0
  210. package/src/commands/low-family/index.ts +37 -0
  211. package/src/commands/low-family/mesh-ledger.ts +62 -0
  212. package/src/commands/low-family/mesh-node-logs.ts +81 -0
  213. package/src/commands/low-family/notification.ts +116 -0
  214. package/src/commands/low-family/refine-config.ts +106 -0
  215. package/src/commands/low-family/session-host.ts +274 -0
  216. package/src/commands/low-family/spec-providerdev.ts +217 -0
  217. package/src/commands/low-family/status-meta.ts +112 -0
  218. package/src/commands/low-family/types.ts +39 -0
  219. package/src/commands/med-family/cli-agent.ts +218 -0
  220. package/src/commands/med-family/fast-forward.ts +198 -0
  221. package/src/commands/med-family/ide.ts +163 -0
  222. package/src/commands/med-family/index.ts +37 -0
  223. package/src/commands/med-family/mesh-crud.ts +788 -0
  224. package/src/commands/med-family/mesh-host-pairing.ts +234 -0
  225. package/src/commands/med-family/mesh-queue.ts +131 -0
  226. package/src/commands/med-family/mesh-restart.ts +92 -0
  227. package/src/commands/med-family/types.ts +120 -0
  228. package/src/commands/mesh-coordinator.ts +334 -124
  229. package/src/commands/router.ts +5121 -2369
  230. package/src/commands/stream-commands.ts +8 -0
  231. package/src/commands/upgrade-helper.ts +310 -45
  232. package/src/config/chat-history.ts +483 -24
  233. package/src/config/config.ts +12 -0
  234. package/src/config/mesh-config.ts +389 -6
  235. package/src/config/recent-activity.ts +8 -2
  236. package/src/daemon/dev-auto-implement.ts +3 -2
  237. package/src/daemon/dev-cli-debug.ts +10 -1
  238. package/src/daemon/dev-server.ts +0 -541
  239. package/src/detection/cli-detector.ts +28 -9
  240. package/src/detection/ide-detector.ts +55 -16
  241. package/src/detection/win32-ide-version.ts +106 -0
  242. package/src/git/change-impact-config.ts +354 -0
  243. package/src/git/git-commands.ts +55 -14
  244. package/src/git/git-diff.ts +81 -11
  245. package/src/git/git-executor.ts +12 -0
  246. package/src/git/git-status.ts +574 -43
  247. package/src/git/git-types.ts +14 -62
  248. package/src/git/git-worktree.ts +8 -1
  249. package/src/git/index.ts +16 -0
  250. package/src/index.ts +158 -12
  251. package/src/installer.d.ts +1 -1
  252. package/src/installer.ts +8 -6
  253. package/src/ipc/local-ipc-server.ts +278 -0
  254. package/src/launch.d.ts +1 -1
  255. package/src/launch.ts +37 -28
  256. package/src/logging/async-batch-writer.ts +55 -0
  257. package/src/logging/command-log.ts +7 -5
  258. package/src/logging/log-redactor.ts +100 -0
  259. package/src/logging/log-tail-reader.ts +220 -0
  260. package/src/logging/logger.ts +14 -7
  261. package/src/mesh/contracts.ts +338 -0
  262. package/src/mesh/coordinator-prompt.ts +234 -31
  263. package/src/mesh/coordinator-registry.ts +121 -0
  264. package/src/mesh/mesh-active-work.ts +645 -0
  265. package/src/mesh/mesh-delivery-policy.ts +315 -0
  266. package/src/mesh/mesh-event-trace.ts +67 -0
  267. package/src/mesh/mesh-events-coordinator.ts +2866 -0
  268. package/src/mesh/mesh-events-pending.ts +599 -0
  269. package/src/mesh/mesh-events-stale.ts +309 -0
  270. package/src/mesh/mesh-events-utils.ts +387 -0
  271. package/src/mesh/mesh-events.ts +30 -1035
  272. package/src/mesh/mesh-fast-forward.ts +839 -0
  273. package/src/mesh/mesh-host-ownership.ts +73 -0
  274. package/src/mesh/mesh-init.ts +260 -0
  275. package/src/mesh/mesh-ledger-reconciliation.ts +12 -5
  276. package/src/mesh/mesh-ledger.ts +591 -102
  277. package/src/mesh/mesh-missions.ts +322 -0
  278. package/src/mesh/mesh-reconcile-loop.ts +1134 -0
  279. package/src/mesh/mesh-refine-batch.ts +197 -0
  280. package/src/mesh/mesh-refine-status.ts +231 -0
  281. package/src/mesh/mesh-review-inbox.ts +307 -0
  282. package/src/mesh/mesh-routing.ts +291 -0
  283. package/src/mesh/mesh-runtime-store.ts +1697 -0
  284. package/src/mesh/mesh-task-stats.ts +161 -0
  285. package/src/mesh/mesh-unresolved-forward-outbox.ts +185 -0
  286. package/src/mesh/mesh-warmup-deadline.ts +152 -0
  287. package/src/mesh/mesh-work-queue.ts +997 -141
  288. package/src/mesh/preview-freshness.ts +118 -0
  289. package/src/mesh/refine-config.ts +423 -0
  290. package/src/mesh/worktree-bootstrap-config.ts +331 -0
  291. package/src/providers/acp-provider-instance.ts +43 -10
  292. package/src/providers/approval-utils.d.ts +5 -0
  293. package/src/providers/approval-utils.ts +57 -5
  294. package/src/providers/chat-message-normalization.ts +45 -5
  295. package/src/providers/cli-provider-instance.ts +1310 -101
  296. package/src/providers/contracts.d.ts +55 -0
  297. package/src/providers/contracts.ts +150 -6
  298. package/src/providers/extension-provider-instance.ts +12 -7
  299. package/src/providers/external-sources.ts +218 -0
  300. package/src/providers/ide-provider-instance.ts +35 -12
  301. package/src/providers/manual-attendance.ts +85 -0
  302. package/src/providers/native-history/antigravity-cli-transcript.ts +643 -0
  303. package/src/providers/native-history/claude-cli-transcript.ts +396 -0
  304. package/src/providers/native-history/codex-cli-transcript.ts +479 -0
  305. package/src/providers/native-history/dispatcher.ts +340 -0
  306. package/src/providers/native-history/hermes-cli-transcript.ts +230 -0
  307. package/src/providers/native-history/index.ts +30 -0
  308. package/src/providers/provider-instance-manager.ts +30 -0
  309. package/src/providers/provider-instance.ts +19 -1
  310. package/src/providers/provider-loader.ts +668 -50
  311. package/src/providers/provider-schema.ts +87 -14
  312. package/src/providers/provider-trust.ts +114 -0
  313. package/src/providers/read-chat-contract.ts +76 -16
  314. package/src/providers/sdk/README.md +49 -0
  315. package/src/providers/sdk/v1/builders/acp/detect-status.ts +144 -0
  316. package/src/providers/sdk/v1/builders/cli/detect-status.ts +313 -0
  317. package/src/providers/sdk/v1/builders/cli/parse-approval-squash.ts +158 -0
  318. package/src/providers/sdk/v1/builders/cli/parse-approval.ts +250 -0
  319. package/src/providers/sdk/v1/builders/cli/parse-session.ts +276 -0
  320. package/src/providers/sdk/v1/builders/cli/visible-region.ts +143 -0
  321. package/src/providers/sdk/v1/fixture-tooling/format.ts +130 -0
  322. package/src/providers/sdk/v1/fixture-tooling/index.ts +22 -0
  323. package/src/providers/sdk/v1/fixture-tooling/replay.ts +352 -0
  324. package/src/providers/sdk/v1/index.ts +152 -0
  325. package/src/providers/sdk/v1/sandbox/README-design.ts +195 -0
  326. package/src/providers/sdk/v1/sandbox/require-whitelist.ts +472 -0
  327. package/src/providers/sdk/v1/sandbox/script-runner.ts +150 -0
  328. package/src/providers/sdk/v1/schemas/cli/provider.schema.json +504 -0
  329. package/src/providers/sdk/v1/schemas/primitives/acp-session-protocol-v1.json +131 -0
  330. package/src/providers/sdk/v1/schemas/primitives/native-history-codex-rollout-v1.json +66 -0
  331. package/src/providers/sdk/v1/schemas/primitives/tui-approval-squash-v1.json +91 -0
  332. package/src/providers/sdk/v1/schemas/primitives/tui-assistant-block-v1.json +91 -0
  333. package/src/providers/sdk/v1/schemas/primitives/tui-cue-ordering-v1.json +47 -0
  334. package/src/providers/sdk/v1/schemas/primitives/tui-dispatch-order-v1.json +32 -0
  335. package/src/providers/sdk/v1/schemas/primitives/tui-footer-chrome-v1.json +42 -0
  336. package/src/providers/sdk/v1/schemas/primitives/tui-index-finder-v1.json +27 -0
  337. package/src/providers/sdk/v1/schemas/primitives/tui-modal-v1.json +125 -0
  338. package/src/providers/sdk/v1/schemas/primitives/tui-prompt-marker-v1.json +45 -0
  339. package/src/providers/sdk/v1/schemas/primitives/tui-session-id-extraction-v1.json +46 -0
  340. package/src/providers/sdk/v1/schemas/primitives/tui-settled-prompt-v1.json +71 -0
  341. package/src/providers/sdk/v1/schemas/primitives/tui-spinner-v1.json +83 -0
  342. package/src/providers/sdk/v1/schemas/primitives/tui-transcript-pty-v1.json +83 -0
  343. package/src/providers/sdk/v1/schemas/primitives/tui-visible-region-v1.json +57 -0
  344. package/src/providers/sdk/v1/schemas/primitives/tui-welcome-screen-v1.json +35 -0
  345. package/src/providers/sdk/v1/types/cli/index.ts +365 -0
  346. package/src/providers/sdk/v1/types/common/index.ts +229 -0
  347. package/src/providers/sdk/v1/validators/index.ts +19 -0
  348. package/src/providers/sdk/v1/validators/manifest.ts +110 -0
  349. package/src/providers/sdk/v1/validators/taint.ts +309 -0
  350. package/src/providers/spec/adapter.ts +235 -0
  351. package/src/providers/spec/cli-adapter.ts +1051 -0
  352. package/src/providers/spec/evaluator.ts +407 -0
  353. package/src/providers/spec/fsm-driver.ts +1305 -0
  354. package/src/providers/spec/fsm-evaluator.ts +272 -0
  355. package/src/providers/spec/fsm-loader.ts +120 -0
  356. package/src/providers/spec/fsm-types.ts +273 -0
  357. package/src/providers/spec/native-history-executor.ts +1136 -0
  358. package/src/providers/spec/pre-launch-trust.ts +104 -0
  359. package/src/providers/spec/route.ts +51 -0
  360. package/src/providers/spec/types.ts +262 -0
  361. package/src/providers/status-monitor.d.ts +7 -7
  362. package/src/providers/status-monitor.ts +37 -22
  363. package/src/providers/transcript-v2.ts +567 -0
  364. package/src/providers/types/interactive-prompt.ts +536 -0
  365. package/src/providers/version-archive.ts +64 -24
  366. package/src/providers/working-dir.ts +23 -0
  367. package/src/repo-mesh-types.ts +378 -14
  368. package/src/sessions/registry.ts +6 -0
  369. package/src/shared-types-extra.ts +2 -4
  370. package/src/shared-types.d.ts +8 -0
  371. package/src/shared-types.ts +64 -1
  372. package/src/status/builders.ts +26 -6
  373. package/src/status/normalize.ts +2 -0
  374. package/src/status/reporter.ts +19 -1
  375. package/src/status/snapshot.ts +95 -26
  376. package/src/system/hash.ts +23 -0
  377. package/src/system/host-memory.ts +29 -12
  378. package/src/system/load-better-sqlite3.ts +68 -0
  379. package/src/types.ts +5 -0
  380. package/dist/cli-adapters/terminal-backends/xterm-backend.d.ts +0 -17
  381. package/dist/mesh/mesh-sync.d.ts +0 -53
  382. package/src/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +0 -16
  383. package/src/cli-adapters/terminal-backends/xterm-backend.ts +0 -97
  384. package/src/mesh/mesh-sync.ts +0 -111
@@ -56,6 +56,7 @@ import type {
56
56
  GitWorkspaceUpdate,
57
57
  WorkspaceGitSubscriptionParams,
58
58
  } from './git/git-types.js';
59
+ import type { InteractivePrompt } from './providers/types/interactive-prompt.js';
59
60
 
60
61
  export type {
61
62
  GitCommandName,
@@ -110,6 +111,14 @@ export interface ReadChatSyncResult {
110
111
  status: string;
111
112
  title?: string;
112
113
  activeModal?: { message: string; buttons: string[] } | null;
114
+ activeInteractivePrompt?: InteractivePrompt | null;
115
+ /**
116
+ * Chat source provenance from ChatSourceMachine (A2). Carries the
117
+ * selected source, transition cause, lock state, and legacy
118
+ * fallbackReason — opaque to the daemon-core, consumed by web-core
119
+ * for the source debug badge and SourceTimeline (A3).
120
+ */
121
+ messageSource?: Record<string, unknown>;
113
122
  }
114
123
 
115
124
  export interface ProviderSummaryItem {
@@ -365,6 +374,7 @@ export interface SessionEntry {
365
374
  runtimeRecoveryState?: string | null;
366
375
  resume?: ProviderResumeCapability;
367
376
  activeChat: SessionActiveChatData | null;
377
+ activeInteractivePrompt?: InteractivePrompt | null;
368
378
  capabilities?: SessionCapability[];
369
379
  /** Effective message input/media support for this session. Defaults fail-closed to text-only. */
370
380
  messageInput?: MessageInputSupport;
@@ -389,6 +399,17 @@ export interface SessionEntry {
389
399
  seenCompletionMarker?: string;
390
400
  surfaceHidden?: boolean;
391
401
  settings?: Record<string, any>;
402
+ /**
403
+ * True owning-daemon id for a session a coordinator synthesises into its own
404
+ * status snapshot (mesh delegated sessions). The dashboard attributes the session
405
+ * to this daemon instead of the snapshot daemon so the worker node — not the
406
+ * coordinator — is shown as its machine.
407
+ */
408
+ ownerDaemonId?: string;
409
+ /** True owning-machine display name fallback when the owning daemon is not aggregated. */
410
+ ownerMachineName?: string;
411
+ /** Set when this session is acting as a mesh coordinator for the given mesh. */
412
+ coordinator?: { meshId: string; role: 'coordinator' };
392
413
  meshQueueStats?: {
393
414
  total?: number;
394
415
  active?: number;
@@ -516,7 +537,39 @@ export interface AvailableProviderInfo {
516
537
  lastVerification?: MachineProviderCheckResult;
517
538
  /** Provider-declared Repo Mesh coordinator/MCP behavior. */
518
539
  meshCoordinator?: ProviderMeshCoordinatorConfig;
519
- }
540
+ /**
541
+ * Provider trust classification — derived from the on-disk layer the
542
+ * manifest came from and the shape of the manifest. Dashboards use
543
+ * this to render a trust badge and gate activation of
544
+ * `external-untrusted` providers behind a confirm modal.
545
+ */
546
+ trust?: ProviderTrust;
547
+ /** Daemon-side human-readable description of the trust value. */
548
+ trustDescription?: string;
549
+ /** True when activation needs a user-side confirmation step. */
550
+ requiresConfirmation?: boolean;
551
+ /** Which on-disk layer the manifest lives in. */
552
+ sourceLayer?: 'user' | 'upstream' | 'external';
553
+ /** For external providers, the source-name namespace it came from. */
554
+ sourceName?: string | null;
555
+ /** Manifest-declared version, e.g. "1.2.1". */
556
+ providerVersion?: string;
557
+ /** Underlying executable name (CLI/binary providers). */
558
+ binary?: string;
559
+ /** Lifecycle label from the manifest: "Stable", "Beta", … */
560
+ status?: string;
561
+ /** One-line provider description from the manifest. */
562
+ details?: string;
563
+ /** Manifest-declared links: homepage, docs, repo, … */
564
+ links?: Record<string, string>;
565
+ }
566
+
567
+ export type ProviderTrust =
568
+ | 'user-custom'
569
+ | 'trusted'
570
+ | 'trusted-with-scripts'
571
+ | 'external-safe'
572
+ | 'external-untrusted';
520
573
 
521
574
  export interface MachineProviderCheckResult {
522
575
  ok: boolean;
@@ -582,6 +635,13 @@ export interface ProviderControlSchema {
582
635
  order?: number;
583
636
  /** Hide this control even if it would otherwise render */
584
637
  hidden?: boolean;
638
+ /**
639
+ * FSM state ids in which this control should be visible. When omitted the
640
+ * control is always visible. Mirrors the daemon's click-time enforcement so
641
+ * the bar hides controls the daemon would silently drop. Uses raw FSM state
642
+ * ids (e.g. 'idle', 'busy'), not the derived dashboard status.
643
+ */
644
+ visibleWhenState?: string[];
585
645
  }
586
646
 
587
647
  // ─── Common Sub-Types (used across StatusReportPayload, BaseDaemonData, etc.) ──
@@ -687,6 +747,9 @@ export type DaemonStatusEventName =
687
747
  | 'agent:waiting_approval'
688
748
  | 'agent:generating_completed'
689
749
  | 'agent:stopped'
750
+ | 'monitor:no_progress'
751
+ // Legacy alias for 'monitor:no_progress' — kept so older daemons that still
752
+ // emit it remain type-compatible with consumers during rollout.
690
753
  | 'monitor:long_generating';
691
754
 
692
755
  /** Minimal daemon-originated event payload relayed through the server. */
@@ -25,6 +25,7 @@ import {
25
25
  type NormalizeActiveChatOptions,
26
26
  } from './normalize.js';
27
27
  import { getMeshQueueStats } from '../mesh/mesh-work-queue.js';
28
+ import { getCoordinatorForSession } from '../mesh/coordinator-registry.js';
28
29
  import { normalizeProviderStateControlValues } from '../providers/provider-patch-state.js';
29
30
  import { normalizeProviderSummaryMetadata } from '../providers/summary-metadata.js';
30
31
  import {
@@ -164,7 +165,7 @@ const ACP_SESSION_CAPABILITIES: SessionCapability[] = [
164
165
  'set_thought_level',
165
166
  ];
166
167
 
167
- function buildIdeWorkspaceSession(
168
+ function buildWorkspaceSession(
168
169
  state: IdeProviderState,
169
170
  cdpManagers: Map<string, DaemonCdpManager>,
170
171
  options: SessionEntryBuildOptions,
@@ -179,7 +180,10 @@ function buildIdeWorkspaceSession(
179
180
  const git = getGitSummaryForWorkspace(workspace, options);
180
181
  const title = activeChat?.title || state.name;
181
182
  const meshCoordinatorFor = state.settings?.meshCoordinatorFor as string | undefined;
182
- const meshQueueStats = meshCoordinatorFor ? getMeshQueueStats(meshCoordinatorFor) : undefined;
183
+ const registryEntry = state.instanceId ? getCoordinatorForSession(state.instanceId) : undefined;
184
+ const effectiveMeshId = meshCoordinatorFor || registryEntry?.meshId;
185
+ const coordinator = effectiveMeshId ? { meshId: effectiveMeshId, role: 'coordinator' as const } : undefined;
186
+ const meshQueueStats = effectiveMeshId ? getMeshQueueStats(effectiveMeshId) : undefined;
183
187
  return {
184
188
  id: state.instanceId || state.type,
185
189
  parentId: null,
@@ -203,6 +207,7 @@ function buildIdeWorkspaceSession(
203
207
  errorReason: state.errorReason,
204
208
  lastUpdated: state.lastUpdated,
205
209
  settings: state.settings,
210
+ ...(coordinator && { coordinator }),
206
211
  ...(meshQueueStats && { meshQueueStats }),
207
212
  };
208
213
  }
@@ -221,7 +226,10 @@ function buildExtensionAgentSession(
221
226
  const workspace = parent.workspace || null;
222
227
  const git = getGitSummaryForWorkspace(workspace, options);
223
228
  const meshCoordinatorFor = ext.settings?.meshCoordinatorFor as string | undefined;
224
- const meshQueueStats = meshCoordinatorFor ? getMeshQueueStats(meshCoordinatorFor) : undefined;
229
+ const registryEntry = ext.instanceId ? getCoordinatorForSession(ext.instanceId) : undefined;
230
+ const effectiveMeshId = meshCoordinatorFor || registryEntry?.meshId;
231
+ const coordinator = effectiveMeshId ? { meshId: effectiveMeshId, role: 'coordinator' as const } : undefined;
232
+ const meshQueueStats = effectiveMeshId ? getMeshQueueStats(effectiveMeshId) : undefined;
225
233
  return {
226
234
  id: ext.instanceId || `${parent.instanceId}:${ext.type}`,
227
235
  parentId: parent.instanceId || parent.type,
@@ -245,6 +253,7 @@ function buildExtensionAgentSession(
245
253
  errorReason: ext.errorReason,
246
254
  lastUpdated: ext.lastUpdated,
247
255
  settings: ext.settings,
256
+ ...(coordinator && { coordinator }),
248
257
  ...(meshQueueStats && { meshQueueStats }),
249
258
  };
250
259
  }
@@ -287,7 +296,10 @@ function buildCliSession(state: CliProviderState, options: SessionEntryBuildOpti
287
296
  const workspace = state.workspace || null;
288
297
  const git = getGitSummaryForWorkspace(workspace, options);
289
298
  const meshCoordinatorFor = state.settings?.meshCoordinatorFor as string | undefined;
290
- const meshQueueStats = meshCoordinatorFor ? getMeshQueueStats(meshCoordinatorFor) : undefined;
299
+ const registryEntry = state.instanceId ? getCoordinatorForSession(state.instanceId) : undefined;
300
+ const effectiveMeshId = meshCoordinatorFor || registryEntry?.meshId;
301
+ const coordinator = effectiveMeshId ? { meshId: effectiveMeshId, role: 'coordinator' as const } : undefined;
302
+ const meshQueueStats = effectiveMeshId ? getMeshQueueStats(effectiveMeshId) : undefined;
291
303
  return {
292
304
  id: state.instanceId,
293
305
  parentId: null,
@@ -314,6 +326,7 @@ function buildCliSession(state: CliProviderState, options: SessionEntryBuildOpti
314
326
  mode: state.mode,
315
327
  resume: state.resume,
316
328
  activeChat,
329
+ activeInteractivePrompt: state.activeInteractivePrompt ?? null,
317
330
  ...(summaryMetadata && { summaryMetadata }),
318
331
  ...(includeSessionMetadata && {
319
332
  capabilities: state.mode === 'terminal' ? PTY_SESSION_CAPABILITIES : CLI_CHAT_SESSION_CAPABILITIES,
@@ -327,7 +340,9 @@ function buildCliSession(state: CliProviderState, options: SessionEntryBuildOpti
327
340
  errorReason: state.errorReason,
328
341
  lastUpdated: state.lastUpdated,
329
342
  settings: state.settings,
343
+ ...(coordinator && { coordinator }),
330
344
  ...(meshQueueStats && { meshQueueStats }),
345
+ ...(state.settings?.spawnedSessionVisibility === 'hidden' && { surfaceHidden: true }),
331
346
  };
332
347
  }
333
348
 
@@ -341,7 +356,10 @@ function buildAcpSession(state: AcpProviderState, options: SessionEntryBuildOpti
341
356
  const workspace = state.workspace || null;
342
357
  const git = getGitSummaryForWorkspace(workspace, options);
343
358
  const meshCoordinatorFor = state.settings?.meshCoordinatorFor as string | undefined;
344
- const meshQueueStats = meshCoordinatorFor ? getMeshQueueStats(meshCoordinatorFor) : undefined;
359
+ const registryEntry = state.instanceId ? getCoordinatorForSession(state.instanceId) : undefined;
360
+ const effectiveMeshId = meshCoordinatorFor || registryEntry?.meshId;
361
+ const coordinator = effectiveMeshId ? { meshId: effectiveMeshId, role: 'coordinator' as const } : undefined;
362
+ const meshQueueStats = effectiveMeshId ? getMeshQueueStats(effectiveMeshId) : undefined;
345
363
  return {
346
364
  id: state.instanceId,
347
365
  parentId: null,
@@ -364,7 +382,9 @@ function buildAcpSession(state: AcpProviderState, options: SessionEntryBuildOpti
364
382
  errorReason: state.errorReason,
365
383
  lastUpdated: state.lastUpdated,
366
384
  settings: state.settings,
385
+ ...(coordinator && { coordinator }),
367
386
  ...(meshQueueStats && { meshQueueStats }),
387
+ ...(state.settings?.spawnedSessionVisibility === 'hidden' && { surfaceHidden: true }),
368
388
  };
369
389
  }
370
390
 
@@ -380,7 +400,7 @@ export function buildSessionEntries(
380
400
  const acpStates = allStates.filter((s): s is AcpProviderState => s.category === 'acp');
381
401
 
382
402
  for (const state of ideStates) {
383
- sessions.push(buildIdeWorkspaceSession(state, cdpManagers, options));
403
+ sessions.push(buildWorkspaceSession(state, cdpManagers, options));
384
404
  for (const ext of state.extensions as ExtensionProviderState[]) {
385
405
  if (!shouldIncludeExtensionSession(ext)) continue;
386
406
  sessions.push(buildExtensionAgentSession(state, ext, options));
@@ -5,6 +5,7 @@ export type ManagedStatus =
5
5
  | 'idle'
6
6
  | 'generating'
7
7
  | 'waiting_approval'
8
+ | 'waiting_choice'
8
9
  | 'error'
9
10
  | 'stopped'
10
11
  | 'starting'
@@ -151,6 +152,7 @@ export function normalizeManagedStatus(
151
152
 
152
153
  const normalized = String(status || 'idle').trim().toLowerCase();
153
154
  if (normalized === 'waiting_approval') return 'waiting_approval';
155
+ if (normalized === 'waiting_choice') return 'waiting_choice';
154
156
  if (WORKING_STATUSES.has(normalized)) return 'generating';
155
157
  if (normalized === 'error') return 'error';
156
158
  if (normalized === 'stopped') return 'stopped';
@@ -51,6 +51,8 @@ export class DaemonStatusReporter {
51
51
  private lastStatusSentAt = 0;
52
52
  private statusPendingThrottle = false;
53
53
  private lastP2PStatusHash = '';
54
+ private lastP2PStatusSentAt: number = 0;
55
+ private p2pDebounceTimer: ReturnType<typeof setTimeout> | null = null;
54
56
  private lastServerStatusHash = '';
55
57
  private lastStatusSummary = '';
56
58
 
@@ -118,7 +120,7 @@ export class DaemonStatusReporter {
118
120
  case 'agent:waiting_approval':
119
121
  case 'agent:generating_completed':
120
122
  case 'agent:stopped':
121
- case 'monitor:long_generating':
123
+ case 'monitor:no_progress':
122
124
  return value;
123
125
  default:
124
126
  return null;
@@ -317,6 +319,9 @@ export class DaemonStatusReporter {
317
319
  cdpConnected: session.cdpConnected,
318
320
  summaryMetadata: session.summaryMetadata,
319
321
  settings: session.settings,
322
+ // Forward surfaceHidden so the server can gate push notifications for
323
+ // coordinator-hidden sessions (the WS path is the only one the server sees).
324
+ surfaceHidden: session.surfaceHidden,
320
325
  })),
321
326
  p2p: payload.p2p,
322
327
  timestamp: now,
@@ -355,7 +360,20 @@ export class DaemonStatusReporter {
355
360
  : { ...hashTarget, sessions };
356
361
  const h = this.simpleHash(JSON.stringify(hashPayload));
357
362
  if (h !== this.lastP2PStatusHash) {
363
+ const now = Date.now();
364
+ // Rate limit: max 1 per 500ms
365
+ if (this.lastP2PStatusSentAt && now - this.lastP2PStatusSentAt < 500) {
366
+ if (!this.p2pDebounceTimer) {
367
+ this.p2pDebounceTimer = setTimeout(() => {
368
+ this.p2pDebounceTimer = null;
369
+ this.sendUnifiedStatusReport({ reason: 'p2p_debounce' });
370
+ }, 500);
371
+ }
372
+ return false; // Dropped for now, but will trigger later
373
+ }
374
+
358
375
  this.lastP2PStatusHash = h;
376
+ this.lastP2PStatusSentAt = now;
359
377
  this.deps.p2p?.sendStatus(payload);
360
378
  return true;
361
379
  }
@@ -145,21 +145,56 @@ function buildAvailableProviders(
145
145
  lastDetection?: AvailableProviderInfo['lastDetection'];
146
146
  lastVerification?: AvailableProviderInfo['lastVerification'];
147
147
  meshCoordinator?: AvailableProviderInfo['meshCoordinator'];
148
+ _sourceTrust?: AvailableProviderInfo['trust'];
149
+ _sourceLayer?: AvailableProviderInfo['sourceLayer'];
150
+ _sourceName?: string | null;
151
+ providerVersion?: string;
152
+ binary?: string;
153
+ status?: string;
154
+ details?: string;
155
+ links?: Record<string, string>;
148
156
  }> = providerLoader.getAvailableProviderInfos?.() || providerLoader.getAll();
149
- return providers.map((provider) => ({
150
- type: provider.type,
151
- name: provider.displayName || provider.type,
152
- displayName: provider.displayName || provider.type,
153
- icon: provider.icon || '💻',
154
- category: provider.category,
155
- ...(provider.installed !== undefined ? { installed: provider.installed } : {}),
156
- ...(provider.detectedPath !== undefined ? { detectedPath: provider.detectedPath } : {}),
157
- ...(provider.enabled !== undefined ? { enabled: provider.enabled } : {}),
158
- ...(provider.machineStatus !== undefined ? { machineStatus: provider.machineStatus } : {}),
159
- ...(provider.lastDetection !== undefined ? { lastDetection: provider.lastDetection } : {}),
160
- ...(provider.lastVerification !== undefined ? { lastVerification: provider.lastVerification } : {}),
161
- ...(provider.meshCoordinator !== undefined ? { meshCoordinator: provider.meshCoordinator } : {}),
162
- }));
157
+ // Trust helpers come from daemon-core; resolve them lazily so the
158
+ // status snapshot path stays loadable in older bundles that don't
159
+ // ship provider-trust yet.
160
+ let describeTrust: (trust: AvailableProviderInfo['trust']) => string = () => '';
161
+ let requiresConfirmation: (trust: AvailableProviderInfo['trust']) => boolean = () => false;
162
+ try {
163
+ const mod = require('../providers/provider-trust.js') as typeof import('../providers/provider-trust.js');
164
+ describeTrust = mod.describeTrust as typeof describeTrust;
165
+ requiresConfirmation = mod.requiresConfirmation as typeof requiresConfirmation;
166
+ } catch { /* enrichment only */ }
167
+ return providers.map((provider) => {
168
+ const trust = (provider as any)._sourceTrust as AvailableProviderInfo['trust'] | undefined;
169
+ const sourceLayer = (provider as any)._sourceLayer as AvailableProviderInfo['sourceLayer'] | undefined;
170
+ const sourceName = (provider as any)._sourceName as string | null | undefined;
171
+ return {
172
+ type: provider.type,
173
+ name: provider.displayName || provider.type,
174
+ displayName: provider.displayName || provider.type,
175
+ icon: provider.icon || '💻',
176
+ category: provider.category,
177
+ ...(provider.installed !== undefined ? { installed: provider.installed } : {}),
178
+ ...(provider.detectedPath !== undefined ? { detectedPath: provider.detectedPath } : {}),
179
+ ...(provider.enabled !== undefined ? { enabled: provider.enabled } : {}),
180
+ ...(provider.machineStatus !== undefined ? { machineStatus: provider.machineStatus } : {}),
181
+ ...(provider.lastDetection !== undefined ? { lastDetection: provider.lastDetection } : {}),
182
+ ...(provider.lastVerification !== undefined ? { lastVerification: provider.lastVerification } : {}),
183
+ ...(provider.meshCoordinator !== undefined ? { meshCoordinator: provider.meshCoordinator } : {}),
184
+ ...(trust ? {
185
+ trust,
186
+ trustDescription: describeTrust(trust),
187
+ requiresConfirmation: requiresConfirmation(trust),
188
+ } : {}),
189
+ ...(sourceLayer ? { sourceLayer } : {}),
190
+ ...(sourceName ? { sourceName } : {}),
191
+ ...(provider.providerVersion ? { providerVersion: provider.providerVersion } : {}),
192
+ ...(provider.binary ? { binary: provider.binary } : {}),
193
+ ...(provider.status ? { status: provider.status } : {}),
194
+ ...(provider.details ? { details: provider.details } : {}),
195
+ ...(provider.links ? { links: provider.links } : {}),
196
+ };
197
+ });
163
198
  }
164
199
 
165
200
  export function buildMachineInfo(profile: 'full' | 'live' | 'metadata' = 'full'): MachineInfo {
@@ -248,7 +283,17 @@ function simplePreviewHash(value: string): string {
248
283
  return h.toString(16);
249
284
  }
250
285
 
251
- function getLastDisplayMessage(session: {
286
+ /**
287
+ * Resolve the last user-visible (non-system) message for a session as a preview.
288
+ *
289
+ * Exported so the cloud coordinator can derive a preview for a LOCAL mesh-owned
290
+ * worktree session directly from the real provider instance it hosts. A REMOTE
291
+ * worker session has no local instance (its preview rides the completion event's
292
+ * finalSummary — see resolveMeshSurfacedSessionPreview), but a LOCAL coordinator
293
+ * IS the worker, so its hosted instance's transcript holds the assistant reply and
294
+ * this is the source of truth for that case.
295
+ */
296
+ export function getLastDisplayMessage(session: {
252
297
  activeChat?: {
253
298
  messages?: Array<{
254
299
  role?: string;
@@ -297,18 +342,30 @@ export function getSessionCompletionMarker(session: {
297
342
  receivedAt?: number | string;
298
343
  timestamp?: number | string;
299
344
  _turnKey?: string;
345
+ kind?: string;
300
346
  }> | null
301
347
  } | null
302
348
  }) {
303
- const lastMessage = session.activeChat?.messages?.at?.(-1);
304
- if (!lastMessage) return '';
305
- const role = typeof lastMessage.role === 'string' ? lastMessage.role : '';
306
- if (role === 'user' || role === 'human' || role === 'system') return '';
307
- if (typeof lastMessage._turnKey === 'string' && lastMessage._turnKey) return `turn:${lastMessage._turnKey}`;
308
- if (typeof lastMessage.id === 'string' && lastMessage.id) return `id:${lastMessage.id}`;
309
- if (typeof lastMessage.index === 'number' && Number.isFinite(lastMessage.index)) return `idx:${lastMessage.index}`;
310
- const timestamp = getMessageEventTime(lastMessage);
311
- return timestamp > 0 ? `ts:${timestamp}` : '';
349
+ const messages = session.activeChat?.messages;
350
+ if (!Array.isArray(messages) || messages.length === 0) return '';
351
+ // Walk backwards until we find an assistant message that's not a tool call,
352
+ // or a user/human message (which ends the turn). System messages and tool
353
+ // messages don't gate "task completion" they can't be acknowledged
354
+ // independently and rotate too aggressively for marker-based bell clearing.
355
+ for (let i = messages.length - 1; i >= 0; i -= 1) {
356
+ const m = messages[i];
357
+ const role = typeof m?.role === 'string' ? m.role : '';
358
+ const kind = typeof m?.kind === 'string' ? m.kind : '';
359
+ if (role === 'user' || role === 'human') return '';
360
+ if (role === 'system') continue;
361
+ if (kind === 'tool') continue;
362
+ if (typeof m._turnKey === 'string' && m._turnKey) return `turn:${m._turnKey}`;
363
+ if (typeof m.id === 'string' && m.id) return `id:${m.id}`;
364
+ if (typeof m.index === 'number' && Number.isFinite(m.index)) return `idx:${m.index}`;
365
+ const timestamp = getMessageEventTime(m);
366
+ return timestamp > 0 ? `ts:${timestamp}` : '';
367
+ }
368
+ return '';
312
369
  }
313
370
 
314
371
  function getSessionLastUsedAt(session: {
@@ -347,9 +404,21 @@ function getUnreadState(
347
404
  if (status === 'generating' || status === 'starting') {
348
405
  return { unread: false, inboxBucket: 'working' };
349
406
  }
407
+ // Read-state resolution:
408
+ // - When provider supplies a `completionMarker`, prefer marker-equality.
409
+ // But if `seenCompletionMarker` hasn't been recorded yet (legacy/transition
410
+ // case), fall back to timestamp comparison so a stale marker doesn't keep
411
+ // the bell lit after the user already viewed the conversation.
412
+ // - When there is no completionMarker, use timestamp + role guard.
413
+ // - Trailing `assistant.tool` turns no longer count as unread on their own
414
+ // — the human can't acknowledge a tool call separately from the answer,
415
+ // so they'd be stuck with a perpetually unread badge.
416
+ const ignorableTrailingRoles = lastRole === 'user' || lastRole === 'human' || lastRole === 'system' || lastRole === 'tool';
350
417
  const unread = completionMarker
351
- ? completionMarker !== seenCompletionMarker
352
- : hasContentChange && lastUsedAt > lastSeenAt && lastRole !== 'user' && lastRole !== 'human' && lastRole !== 'system';
418
+ ? (seenCompletionMarker
419
+ ? completionMarker !== seenCompletionMarker
420
+ : hasContentChange && lastUsedAt > lastSeenAt && !ignorableTrailingRoles)
421
+ : hasContentChange && lastUsedAt > lastSeenAt && !ignorableTrailingRoles;
353
422
  return { unread, inboxBucket: unread ? 'task_complete' : 'idle' };
354
423
  }
355
424
 
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Shared SHA-256 hashing helpers for daemon-core (Node runtime).
3
+ *
4
+ * daemon-core runs under Node, so it uses `node:crypto` directly and must NOT
5
+ * import the server's WebCrypto-based `utils/crypto.ts` (different runtime +
6
+ * cross-package dependency direction). Output is byte-identical to that helper
7
+ * for the same input — lowercase hex SHA-256.
8
+ */
9
+ import { createHash } from 'node:crypto';
10
+
11
+ /** Full lowercase hex SHA-256 digest of `input`. */
12
+ export function sha256Hex(input: string): string {
13
+ return createHash('sha256').update(input).digest('hex');
14
+ }
15
+
16
+ /**
17
+ * Truncated SHA-256 hex digest — the first `length` hex chars (default 16).
18
+ * Used for stable short identifiers (workspace hashes, token ids, coordinator
19
+ * home dirs) where collision risk at 16 hex chars (64 bits) is negligible.
20
+ */
21
+ export function shortHash(input: string, length = 16): string {
22
+ return sha256Hex(input).slice(0, length);
23
+ }
@@ -11,7 +11,10 @@
11
11
  */
12
12
 
13
13
  import * as os from 'os';
14
- import { execSync } from 'child_process';
14
+ import { exec } from 'child_process';
15
+ import { promisify } from 'util';
16
+
17
+ const execAsync = promisify(exec);
15
18
 
16
19
  export interface HostMemorySnapshot {
17
20
  totalMem: number;
@@ -21,19 +24,22 @@ export interface HostMemorySnapshot {
21
24
  availableMem: number;
22
25
  }
23
26
 
24
- function parseDarwinAvailableBytes(totalMem: number): number | null {
25
- if (os.platform() !== 'darwin') return null;
27
+ let cachedDarwinAvail: number | null = null;
28
+ let darwinMemoryInterval: NodeJS.Timeout | null = null;
29
+
30
+ async function updateDarwinMemoryCache() {
31
+ if (os.platform() !== 'darwin') return;
26
32
  try {
27
- const out = execSync('vm_stat', {
33
+ const { stdout } = await execAsync('vm_stat', {
28
34
  encoding: 'utf-8',
29
35
  timeout: 4000,
30
36
  maxBuffer: 256 * 1024,
31
37
  });
32
- const pageSizeMatch = out.match(/page size of (\d+)\s*bytes/i);
38
+ const pageSizeMatch = stdout.match(/page size of (\d+)\s*bytes/i);
33
39
  const pageSize = pageSizeMatch ? parseInt(pageSizeMatch[1], 10) : 4096;
34
40
 
35
41
  const counts: Record<string, number> = {};
36
- for (const line of out.split('\n')) {
42
+ for (const line of stdout.split('\n')) {
37
43
  const m = line.match(/^\s*Pages\s+([^:]+):\s+([\d,]+)\s*\.?/);
38
44
  if (!m) continue;
39
45
  const key = m[1].trim().toLowerCase().replace(/\s+/g, '_');
@@ -49,17 +55,28 @@ function parseDarwinAvailableBytes(totalMem: number): number | null {
49
55
 
50
56
  const availPages = free + inactive + speculative + purgeable + fileBacked;
51
57
  const bytes = availPages * pageSize;
52
- if (!Number.isFinite(bytes) || bytes < 0) return null;
53
- return Math.min(bytes, totalMem);
58
+ cachedDarwinAvail = Number.isFinite(bytes) && bytes >= 0 ? Math.min(bytes, os.totalmem()) : null;
54
59
  } catch {
55
- return null;
60
+ // silently fallback
56
61
  }
57
62
  }
58
63
 
59
64
  export function getHostMemorySnapshot(): HostMemorySnapshot {
65
+ if (os.platform() === 'darwin' && !darwinMemoryInterval) {
66
+ updateDarwinMemoryCache();
67
+ darwinMemoryInterval = setInterval(updateDarwinMemoryCache, 3000);
68
+ darwinMemoryInterval.unref();
69
+ }
70
+
60
71
  const totalMem = os.totalmem();
61
72
  const freeMem = os.freemem();
62
- const darwinAvail = parseDarwinAvailableBytes(totalMem);
63
- const availableMem = darwinAvail != null ? darwinAvail : freeMem;
64
- return { totalMem, freeMem, availableMem };
73
+ const availableMem = os.platform() === 'darwin'
74
+ ? (cachedDarwinAvail ?? freeMem)
75
+ : freeMem;
76
+
77
+ return {
78
+ totalMem,
79
+ freeMem,
80
+ availableMem,
81
+ };
65
82
  }
@@ -0,0 +1,68 @@
1
+ import { createRequire } from 'module';
2
+ import type BetterSqlite3 from 'better-sqlite3';
3
+
4
+ let cached: typeof BetterSqlite3 | undefined;
5
+
6
+ /**
7
+ * Load the `better-sqlite3` constructor in a way that survives every runtime the
8
+ * daemon ships in.
9
+ *
10
+ * The naive `typeof require === 'function' ? require : createRequire(import.meta.url)`
11
+ * is unsafe inside the daemon-cloud bundle: esbuild emits CJS output but, for any
12
+ * chunk that touches `import.meta.url`, it shims the local `require` with a stub
13
+ * that THROWS `Dynamic require of "..." is not supported`. That stub is still
14
+ * `typeof === 'function'`, so the ternary picks it and the call throws — it never
15
+ * reaches the `createRequire` fallback. The failure surfaced as `mesh_send_task`
16
+ * crashing the whole tool call instead of gracefully degrading.
17
+ *
18
+ * The robust approach is to ATTEMPT the real `require` and CATCH the esbuild stub's
19
+ * throw, then fall back to `createRequire`. We try multiple resolution bases so the
20
+ * load works whether the code runs as:
21
+ * - a genuine CJS module (bare `require` works),
22
+ * - an esbuild CJS bundle with the throwing `require` shim (createRequire(import.meta.url)),
23
+ * - a pure ESM module where `require` is undefined (createRequire(import.meta.url)).
24
+ */
25
+ export function loadBetterSqlite3(): typeof BetterSqlite3 {
26
+ if (cached) return cached;
27
+
28
+ const errors: unknown[] = [];
29
+
30
+ // 1) Real CJS require, when present and not the esbuild throwing shim.
31
+ if (typeof require === 'function') {
32
+ try {
33
+ cached = require('better-sqlite3') as typeof BetterSqlite3;
34
+ return cached;
35
+ } catch (e) {
36
+ // Either the esbuild "Dynamic require is not supported" shim, or a
37
+ // genuine resolution failure. Fall through to createRequire.
38
+ errors.push(e);
39
+ }
40
+ }
41
+
42
+ // 2) createRequire anchored at this module's URL (works in ESM and in esbuild
43
+ // CJS bundles, where import.meta.url is rewritten to a usable value).
44
+ try {
45
+ const metaUrl = typeof import.meta?.url === 'string' ? import.meta.url : undefined;
46
+ if (metaUrl) {
47
+ cached = createRequire(metaUrl)('better-sqlite3') as typeof BetterSqlite3;
48
+ return cached;
49
+ }
50
+ } catch (e) {
51
+ errors.push(e);
52
+ }
53
+
54
+ // 3) Last resort: createRequire anchored at the current working directory.
55
+ try {
56
+ cached = createRequire(`${process.cwd()}/__adhdev_better_sqlite3_loader__.js`)(
57
+ 'better-sqlite3',
58
+ ) as typeof BetterSqlite3;
59
+ return cached;
60
+ } catch (e) {
61
+ errors.push(e);
62
+ }
63
+
64
+ const detail = errors
65
+ .map((e) => (e instanceof Error ? e.message : String(e)))
66
+ .join('; ');
67
+ throw new Error(`Failed to load better-sqlite3: ${detail}`);
68
+ }
package/src/types.ts CHANGED
@@ -43,6 +43,11 @@ export interface ChatMessage {
43
43
  index?: number;
44
44
  timestamp?: number;
45
45
  receivedAt?: number;
46
+ /** (A2.3) Monotonic sequence number per (session, source). Producer-asserted
47
+ * when emitted by v2-aware providers (transcript v2 schema); otherwise
48
+ * derived by the daemon from receivedAt/timestamp/index. ChatSourceMachine
49
+ * uses this as the native peak watermark for regression detection. */
50
+ sequence?: number;
46
51
  _turnKey?: string;
47
52
  /** Tool calls associated with this message */
48
53
  toolCalls?: ToolCallInfo[];
@@ -1,17 +0,0 @@
1
- import type { TerminalViewportBackend, TerminalViewportBackendOptions } from './types.js';
2
- export declare class XtermTerminalBackend implements TerminalViewportBackend {
3
- readonly kind: "xterm";
4
- private rows;
5
- private cols;
6
- private terminal;
7
- constructor(options: TerminalViewportBackendOptions);
8
- resize(rows: number, cols: number): void;
9
- write(data: string): void;
10
- getText(): string;
11
- getCursorPosition(): {
12
- col: number;
13
- row: number;
14
- };
15
- dispose(): void;
16
- private createTerminal;
17
- }