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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (473) hide show
  1. package/dist/boot/daemon-lifecycle.d.ts +9 -0
  2. package/dist/boot/process-hardening.d.ts +50 -0
  3. package/dist/build-info.d.ts +37 -0
  4. package/dist/chat/source-machine.d.ts +166 -0
  5. package/dist/chat/source-resolver.d.ts +104 -0
  6. package/dist/chat/subscription-updates.d.ts +1 -0
  7. package/dist/cli-adapter-types.d.ts +68 -2
  8. package/dist/cli-adapters/cli-script-runner.d.ts +117 -0
  9. package/dist/cli-adapters/cli-state-engine.d.ts +220 -0
  10. package/dist/cli-adapters/provider-cli-adapter.d.ts +137 -64
  11. package/dist/cli-adapters/provider-cli-parse.d.ts +5 -0
  12. package/dist/cli-adapters/provider-cli-runtime.d.ts +34 -0
  13. package/dist/cli-adapters/provider-cli-shared.d.ts +74 -0
  14. package/dist/cli-adapters/pty-write-chunking.d.ts +34 -0
  15. package/dist/cli-adapters/raw-terminal-io.d.ts +37 -0
  16. package/dist/cli-adapters/resolve-executable.d.ts +69 -0
  17. package/dist/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +6 -3
  18. package/dist/cli-adapters/terminal-backends/types.d.ts +10 -2
  19. package/dist/cli-adapters/terminal-screen.d.ts +4 -11
  20. package/dist/commands/chat-commands-debug-bundle.d.ts +14 -0
  21. package/dist/commands/chat-commands-read.d.ts +23 -0
  22. package/dist/commands/chat-commands-scope.d.ts +39 -0
  23. package/dist/commands/chat-commands-shared.d.ts +33 -0
  24. package/dist/commands/chat-commands-write.d.ts +14 -0
  25. package/dist/commands/chat-commands.d.ts +10 -23
  26. package/dist/commands/cli-manager.d.ts +71 -1
  27. package/dist/commands/handler.d.ts +125 -0
  28. package/dist/commands/high-family/index.d.ts +3 -0
  29. package/dist/commands/high-family/mesh-coordinator-launch.d.ts +2 -0
  30. package/dist/commands/high-family/mesh-events.d.ts +2 -0
  31. package/dist/commands/high-family/mesh-status.d.ts +2 -0
  32. package/dist/commands/high-family/types.d.ts +64 -0
  33. package/dist/commands/low-family/coordinator-prompt.d.ts +9 -0
  34. package/dist/commands/low-family/daemon-lifecycle.d.ts +2 -0
  35. package/dist/commands/low-family/diagnostics.d.ts +2 -0
  36. package/dist/commands/low-family/index.d.ts +3 -0
  37. package/dist/commands/low-family/mesh-ledger.d.ts +10 -0
  38. package/dist/commands/low-family/mesh-node-logs.d.ts +2 -0
  39. package/dist/commands/low-family/notification.d.ts +2 -0
  40. package/dist/commands/low-family/refine-config.d.ts +2 -0
  41. package/dist/commands/low-family/session-host.d.ts +2 -0
  42. package/dist/commands/low-family/spec-providerdev.d.ts +11 -0
  43. package/dist/commands/low-family/status-meta.d.ts +2 -0
  44. package/dist/commands/low-family/types.d.ts +33 -0
  45. package/dist/commands/med-family/cli-agent.d.ts +2 -0
  46. package/dist/commands/med-family/fast-forward.d.ts +2 -0
  47. package/dist/commands/med-family/ide.d.ts +10 -0
  48. package/dist/commands/med-family/index.d.ts +3 -0
  49. package/dist/commands/med-family/mesh-crud.d.ts +48 -0
  50. package/dist/commands/med-family/mesh-host-pairing.d.ts +2 -0
  51. package/dist/commands/med-family/mesh-queue.d.ts +2 -0
  52. package/dist/commands/med-family/mesh-restart.d.ts +2 -0
  53. package/dist/commands/med-family/types.d.ts +152 -0
  54. package/dist/commands/mesh-coordinator.d.ts +85 -1
  55. package/dist/commands/router-aggregate-status.d.ts +24 -0
  56. package/dist/commands/router-mesh-session-owner.d.ts +59 -0
  57. package/dist/commands/router-refine.d.ts +151 -0
  58. package/dist/commands/router-worktree-cleanup.d.ts +133 -0
  59. package/dist/commands/router.d.ts +203 -15
  60. package/dist/commands/upgrade-helper.d.ts +41 -1
  61. package/dist/config/chat-history.d.ts +11 -0
  62. package/dist/config/config.d.ts +19 -0
  63. package/dist/config/mesh-config.d.ts +65 -0
  64. package/dist/config/mesh-json-config.d.ts +199 -0
  65. package/dist/config/registry-resolver.d.ts +54 -0
  66. package/dist/config/repo-settings.d.ts +77 -0
  67. package/dist/config/state-store.d.ts +30 -0
  68. package/dist/daemon/dev-server.d.ts +0 -2
  69. package/dist/detection/cli-detector.d.ts +17 -0
  70. package/dist/detection/ide-detector.d.ts +13 -0
  71. package/dist/detection/win32-ide-version.d.ts +37 -0
  72. package/dist/git/change-impact-config.d.ts +159 -0
  73. package/dist/git/git-commands.d.ts +26 -2
  74. package/dist/git/git-diff.d.ts +6 -0
  75. package/dist/git/git-executor.d.ts +11 -0
  76. package/dist/git/git-status.d.ts +80 -0
  77. package/dist/git/git-types.d.ts +2 -50
  78. package/dist/git/git-worktree.d.ts +71 -1
  79. package/dist/git/index.d.ts +3 -1
  80. package/dist/index.d.ts +70 -17
  81. package/dist/index.js +53532 -19073
  82. package/dist/index.js.map +1 -1
  83. package/dist/index.mjs +53283 -18989
  84. package/dist/index.mjs.map +1 -1
  85. package/dist/installer.d.ts +1 -4
  86. package/dist/ipc/local-ipc-server.d.ts +91 -0
  87. package/dist/launch.d.ts +1 -1
  88. package/dist/logging/async-batch-writer.d.ts +10 -0
  89. package/dist/logging/debug-config.d.ts +16 -0
  90. package/dist/logging/log-redactor.d.ts +24 -0
  91. package/dist/logging/log-tail-reader.d.ts +81 -0
  92. package/dist/logging/logger.d.ts +1 -1
  93. package/dist/mesh/contracts.d.ts +256 -0
  94. package/dist/mesh/coordinator-prompt.d.ts +76 -0
  95. package/dist/mesh/coordinator-registry.d.ts +59 -0
  96. package/dist/mesh/mesh-active-work.d.ts +203 -0
  97. package/dist/mesh/mesh-clone-grace.d.ts +8 -0
  98. package/dist/mesh/mesh-completion-synthesis.d.ts +4 -0
  99. package/dist/mesh/mesh-coordinator-config.d.ts +21 -0
  100. package/dist/mesh/mesh-delivery-policy.d.ts +104 -0
  101. package/dist/mesh/mesh-event-classify.d.ts +7 -0
  102. package/dist/mesh/mesh-event-forwarding.d.ts +58 -0
  103. package/dist/mesh/mesh-event-trace.d.ts +21 -0
  104. package/dist/mesh/mesh-events-coordinator.d.ts +4 -0
  105. package/dist/mesh/mesh-events-pending.d.ts +258 -0
  106. package/dist/mesh/mesh-events-stale.d.ts +61 -0
  107. package/dist/mesh/mesh-events-utils.d.ts +75 -0
  108. package/dist/mesh/mesh-events.d.ts +6 -49
  109. package/dist/mesh/mesh-fast-forward.d.ts +81 -0
  110. package/dist/mesh/mesh-host-ownership.d.ts +21 -1
  111. package/dist/mesh/mesh-init.d.ts +128 -0
  112. package/dist/mesh/mesh-ledger-reconciliation.d.ts +23 -4
  113. package/dist/mesh/mesh-ledger.d.ts +139 -1
  114. package/dist/mesh/mesh-magi-status.d.ts +63 -0
  115. package/dist/mesh/mesh-missions.d.ts +281 -0
  116. package/dist/mesh/mesh-node-identity.d.ts +310 -0
  117. package/dist/mesh/mesh-queue-assignment.d.ts +162 -0
  118. package/dist/mesh/mesh-reconcile-acked-hold.d.ts +17 -0
  119. package/dist/mesh/mesh-reconcile-config.d.ts +6 -0
  120. package/dist/mesh/mesh-reconcile-identity.d.ts +6 -0
  121. package/dist/mesh/mesh-reconcile-loop.d.ts +84 -0
  122. package/dist/mesh/mesh-reconcile-v2-backstop.d.ts +16 -0
  123. package/dist/mesh/mesh-refine-batch.d.ts +68 -0
  124. package/dist/mesh/mesh-refine-gates.d.ts +457 -0
  125. package/dist/mesh/mesh-refine-status.d.ts +62 -0
  126. package/dist/mesh/mesh-remote-event-pull.d.ts +15 -0
  127. package/dist/mesh/mesh-review-inbox.d.ts +90 -0
  128. package/dist/mesh/mesh-routing.d.ts +70 -0
  129. package/dist/mesh/mesh-runtime-store.d.ts +567 -0
  130. package/dist/mesh/mesh-scheduling-runtime.d.ts +78 -0
  131. package/dist/mesh/mesh-task-inflight.d.ts +46 -0
  132. package/dist/mesh/mesh-task-stats.d.ts +49 -0
  133. package/dist/mesh/mesh-unresolved-forward-outbox.d.ts +34 -0
  134. package/dist/mesh/mesh-warmup-deadline.d.ts +68 -0
  135. package/dist/mesh/mesh-work-queue.d.ts +392 -1
  136. package/dist/mesh/preview-freshness.d.ts +28 -0
  137. package/dist/mesh/refine-config.d.ts +97 -0
  138. package/dist/mesh/worktree-bootstrap-config.d.ts +219 -0
  139. package/dist/providers/acp-provider-instance.d.ts +5 -0
  140. package/dist/providers/approval-utils.d.ts +46 -0
  141. package/dist/providers/chat-message-normalization.d.ts +58 -1
  142. package/dist/providers/cli-provider-effect-format.d.ts +30 -0
  143. package/dist/providers/cli-provider-history-dedup.d.ts +17 -0
  144. package/dist/providers/cli-provider-input-prompt.d.ts +12 -0
  145. package/dist/providers/cli-provider-instance-types.d.ts +45 -0
  146. package/dist/providers/cli-provider-instance.d.ts +426 -30
  147. package/dist/providers/cli-provider-status-helpers.d.ts +46 -0
  148. package/dist/providers/cli-provider-transcript-merge.d.ts +7 -0
  149. package/dist/providers/contracts.d.ts +196 -6
  150. package/dist/providers/external-sources.d.ts +71 -0
  151. package/dist/providers/manual-attendance.d.ts +79 -0
  152. package/dist/providers/native-history/antigravity-claim-registry.d.ts +39 -0
  153. package/dist/providers/native-history/antigravity-cli-transcript.d.ts +137 -0
  154. package/dist/providers/native-history/claude-cli-transcript.d.ts +70 -0
  155. package/dist/providers/native-history/codex-cli-transcript.d.ts +73 -0
  156. package/dist/providers/native-history/constants.d.ts +12 -0
  157. package/dist/providers/native-history/dispatcher.d.ts +44 -0
  158. package/dist/providers/native-history/hermes-cli-transcript.d.ts +30 -0
  159. package/dist/providers/native-history/index.d.ts +13 -0
  160. package/dist/providers/provider-instance-manager.d.ts +30 -0
  161. package/dist/providers/provider-instance.d.ts +31 -1
  162. package/dist/providers/provider-loader.d.ts +42 -5
  163. package/dist/providers/provider-trust.d.ts +31 -0
  164. package/dist/providers/read-chat-contract.d.ts +29 -0
  165. package/dist/providers/sdk/v1/builders/acp/detect-status.d.ts +68 -0
  166. package/dist/providers/sdk/v1/builders/cli/detect-status.d.ts +86 -0
  167. package/dist/providers/sdk/v1/builders/cli/parse-approval-squash.d.ts +59 -0
  168. package/dist/providers/sdk/v1/builders/cli/parse-approval.d.ts +65 -0
  169. package/dist/providers/sdk/v1/builders/cli/parse-session.d.ts +91 -0
  170. package/dist/providers/sdk/v1/builders/cli/visible-region.d.ts +42 -0
  171. package/dist/providers/sdk/v1/fixture-tooling/format.d.ts +126 -0
  172. package/dist/providers/sdk/v1/fixture-tooling/index.d.ts +8 -0
  173. package/dist/providers/sdk/v1/fixture-tooling/replay.d.ts +38 -0
  174. package/dist/providers/sdk/v1/index.d.ts +30 -0
  175. package/dist/providers/sdk/v1/sandbox/README-design.d.ts +193 -0
  176. package/dist/providers/sdk/v1/sandbox/require-whitelist.d.ts +74 -0
  177. package/dist/providers/sdk/v1/sandbox/script-runner.d.ts +98 -0
  178. package/dist/providers/sdk/v1/types/cli/index.d.ts +277 -0
  179. package/dist/providers/sdk/v1/types/common/index.d.ts +203 -0
  180. package/dist/providers/sdk/v1/validators/index.d.ts +5 -0
  181. package/dist/providers/sdk/v1/validators/manifest.d.ts +40 -0
  182. package/dist/providers/sdk/v1/validators/taint.d.ts +52 -0
  183. package/dist/providers/spec/adapter.d.ts +98 -0
  184. package/dist/providers/spec/cli-adapter.d.ts +223 -0
  185. package/dist/providers/spec/evaluator.d.ts +45 -0
  186. package/dist/providers/spec/fsm-driver.d.ts +449 -0
  187. package/dist/providers/spec/fsm-evaluator.d.ts +93 -0
  188. package/dist/providers/spec/fsm-loader.d.ts +14 -0
  189. package/dist/providers/spec/fsm-types.d.ts +202 -0
  190. package/dist/providers/spec/native-history-executor.d.ts +41 -0
  191. package/dist/providers/spec/pre-launch-trust.d.ts +16 -0
  192. package/dist/providers/spec/route.d.ts +4 -0
  193. package/dist/providers/spec/types.d.ts +244 -0
  194. package/dist/providers/status-monitor.d.ts +7 -7
  195. package/dist/providers/transcript-v2.d.ts +176 -0
  196. package/dist/providers/types/interactive-prompt.d.ts +84 -0
  197. package/dist/providers/working-dir.d.ts +17 -0
  198. package/dist/repo-mesh-types.d.ts +616 -12
  199. package/dist/runtime-defaults.d.ts +2 -0
  200. package/dist/session-host/managed-host.d.ts +64 -0
  201. package/dist/session-host/runtime-surface.d.ts +10 -16
  202. package/dist/sessions/registry.d.ts +26 -0
  203. package/dist/shared-types-extra.d.ts +2 -4
  204. package/dist/shared-types.d.ts +110 -55
  205. package/dist/status/chat-tail-hot-sessions.d.ts +40 -0
  206. package/dist/status/normalize.d.ts +1 -1
  207. package/dist/status/normalize.js +1 -0
  208. package/dist/status/normalize.js.map +1 -1
  209. package/dist/status/normalize.mjs +1 -0
  210. package/dist/status/normalize.mjs.map +1 -1
  211. package/dist/status/reporter.d.ts +2 -0
  212. package/dist/status/snapshot.d.ts +27 -0
  213. package/dist/system/hash.d.ts +8 -0
  214. package/dist/system/load-better-sqlite3.d.ts +21 -0
  215. package/dist/types.d.ts +20 -6
  216. package/package.json +11 -4
  217. package/src/agent-stream/poller.ts +2 -3
  218. package/src/agent-stream/provider-adapter.ts +1 -1
  219. package/src/boot/daemon-lifecycle.ts +80 -14
  220. package/src/boot/process-hardening.ts +89 -0
  221. package/src/build-info.ts +73 -0
  222. package/src/chat/source-machine.ts +534 -0
  223. package/src/chat/source-resolver.ts +0 -0
  224. package/src/chat/subscription-updates.ts +20 -1
  225. package/src/cli-adapter-types.d.ts +3 -1
  226. package/src/cli-adapter-types.ts +68 -2
  227. package/src/cli-adapters/cli-script-runner.ts +421 -0
  228. package/src/cli-adapters/cli-state-engine.ts +1282 -0
  229. package/src/cli-adapters/provider-cli-adapter.d.ts +1 -1
  230. package/src/cli-adapters/provider-cli-adapter.ts +1048 -1143
  231. package/src/cli-adapters/provider-cli-parse.d.ts +2 -0
  232. package/src/cli-adapters/provider-cli-parse.ts +19 -0
  233. package/src/cli-adapters/provider-cli-runtime.ts +56 -7
  234. package/src/cli-adapters/provider-cli-shared.d.ts +4 -0
  235. package/src/cli-adapters/provider-cli-shared.ts +121 -11
  236. package/src/cli-adapters/pty-transport.ts +2 -1
  237. package/src/cli-adapters/pty-write-chunking.ts +106 -0
  238. package/src/cli-adapters/raw-terminal-io.ts +252 -0
  239. package/src/cli-adapters/resolve-executable.ts +204 -0
  240. package/src/cli-adapters/session-host-transport.ts +2 -1
  241. package/src/cli-adapters/terminal-backends/ghostty-vt-backend.ts +63 -29
  242. package/src/cli-adapters/terminal-backends/types.ts +10 -3
  243. package/src/cli-adapters/terminal-screen.ts +16 -81
  244. package/src/commands/chat-commands-debug-bundle.ts +398 -0
  245. package/src/commands/chat-commands-read.ts +2788 -0
  246. package/src/commands/chat-commands-scope.ts +54 -0
  247. package/src/commands/chat-commands-shared.ts +114 -0
  248. package/src/commands/chat-commands-write.ts +891 -0
  249. package/src/commands/chat-commands.ts +19 -1841
  250. package/src/commands/cli-manager.d.ts +2 -0
  251. package/src/commands/cli-manager.ts +724 -27
  252. package/src/commands/handler.ts +865 -2
  253. package/src/commands/high-family/index.ts +28 -0
  254. package/src/commands/high-family/mesh-coordinator-launch.ts +696 -0
  255. package/src/commands/high-family/mesh-events.ts +102 -0
  256. package/src/commands/high-family/mesh-status.ts +857 -0
  257. package/src/commands/high-family/types.ts +80 -0
  258. package/src/commands/low-family/coordinator-prompt.ts +125 -0
  259. package/src/commands/low-family/daemon-lifecycle.ts +120 -0
  260. package/src/commands/low-family/diagnostics.ts +57 -0
  261. package/src/commands/low-family/index.ts +37 -0
  262. package/src/commands/low-family/mesh-ledger.ts +62 -0
  263. package/src/commands/low-family/mesh-node-logs.ts +87 -0
  264. package/src/commands/low-family/notification.ts +116 -0
  265. package/src/commands/low-family/refine-config.ts +106 -0
  266. package/src/commands/low-family/session-host.ts +282 -0
  267. package/src/commands/low-family/spec-providerdev.ts +217 -0
  268. package/src/commands/low-family/status-meta.ts +112 -0
  269. package/src/commands/low-family/types.ts +39 -0
  270. package/src/commands/med-family/cli-agent.ts +270 -0
  271. package/src/commands/med-family/fast-forward.ts +230 -0
  272. package/src/commands/med-family/ide.ts +163 -0
  273. package/src/commands/med-family/index.ts +37 -0
  274. package/src/commands/med-family/mesh-crud.ts +1268 -0
  275. package/src/commands/med-family/mesh-host-pairing.ts +234 -0
  276. package/src/commands/med-family/mesh-queue.ts +167 -0
  277. package/src/commands/med-family/mesh-restart.ts +92 -0
  278. package/src/commands/med-family/types.ts +153 -0
  279. package/src/commands/mesh-coordinator.ts +334 -124
  280. package/src/commands/router-aggregate-status.ts +209 -0
  281. package/src/commands/router-mesh-session-owner.ts +114 -0
  282. package/src/commands/router-refine.ts +1794 -0
  283. package/src/commands/router-worktree-cleanup.ts +870 -0
  284. package/src/commands/router.ts +567 -4149
  285. package/src/commands/stream-commands.ts +8 -0
  286. package/src/commands/upgrade-helper.ts +310 -45
  287. package/src/config/chat-history.ts +517 -24
  288. package/src/config/config.ts +30 -0
  289. package/src/config/mesh-config.ts +300 -24
  290. package/src/config/mesh-json-config.ts +376 -0
  291. package/src/config/recent-activity.ts +8 -2
  292. package/src/config/registry-resolver.ts +100 -0
  293. package/src/config/repo-settings.ts +111 -0
  294. package/src/config/state-store.ts +55 -0
  295. package/src/daemon/dev-auto-implement.ts +3 -2
  296. package/src/daemon/dev-cli-debug.ts +10 -1
  297. package/src/daemon/dev-server.ts +0 -541
  298. package/src/detection/cli-detector.ts +94 -9
  299. package/src/detection/ide-detector.ts +55 -16
  300. package/src/detection/win32-ide-version.ts +106 -0
  301. package/src/git/change-impact-config.ts +354 -0
  302. package/src/git/git-commands.ts +112 -16
  303. package/src/git/git-diff.ts +81 -11
  304. package/src/git/git-executor.ts +12 -0
  305. package/src/git/git-status.ts +822 -48
  306. package/src/git/git-types.ts +14 -62
  307. package/src/git/git-worktree.ts +261 -4
  308. package/src/git/index.ts +17 -0
  309. package/src/index.ts +190 -13
  310. package/src/installer.d.ts +1 -1
  311. package/src/installer.ts +8 -6
  312. package/src/ipc/local-ipc-server.ts +278 -0
  313. package/src/launch.d.ts +1 -1
  314. package/src/launch.ts +37 -28
  315. package/src/logging/async-batch-writer.ts +55 -0
  316. package/src/logging/command-log.ts +7 -5
  317. package/src/logging/debug-config.ts +25 -0
  318. package/src/logging/debug-trace.ts +7 -2
  319. package/src/logging/log-redactor.ts +100 -0
  320. package/src/logging/log-tail-reader.ts +341 -0
  321. package/src/logging/logger.ts +14 -7
  322. package/src/mesh/contracts.ts +510 -0
  323. package/src/mesh/coordinator-prompt.ts +627 -34
  324. package/src/mesh/coordinator-registry.ts +121 -0
  325. package/src/mesh/mesh-active-work.ts +706 -0
  326. package/src/mesh/mesh-clone-grace.ts +68 -0
  327. package/src/mesh/mesh-completion-synthesis.ts +416 -0
  328. package/src/mesh/mesh-coordinator-config.ts +97 -0
  329. package/src/mesh/mesh-delivery-policy.ts +284 -0
  330. package/src/mesh/mesh-event-classify.ts +78 -0
  331. package/src/mesh/mesh-event-forwarding.ts +2030 -0
  332. package/src/mesh/mesh-event-trace.ts +67 -0
  333. package/src/mesh/mesh-events-coordinator.ts +32 -0
  334. package/src/mesh/mesh-events-pending.ts +1548 -0
  335. package/src/mesh/mesh-events-stale.ts +452 -0
  336. package/src/mesh/mesh-events-utils.ts +443 -0
  337. package/src/mesh/mesh-events.ts +43 -1035
  338. package/src/mesh/mesh-fast-forward.ts +856 -0
  339. package/src/mesh/mesh-host-ownership.ts +41 -3
  340. package/src/mesh/mesh-init.ts +350 -0
  341. package/src/mesh/mesh-ledger-reconciliation.ts +12 -7
  342. package/src/mesh/mesh-ledger.ts +897 -102
  343. package/src/mesh/mesh-magi-status.ts +223 -0
  344. package/src/mesh/mesh-missions.ts +695 -0
  345. package/src/mesh/mesh-node-identity.ts +2065 -0
  346. package/src/mesh/mesh-queue-assignment.ts +2498 -0
  347. package/src/mesh/mesh-reconcile-acked-hold.ts +230 -0
  348. package/src/mesh/mesh-reconcile-config.ts +66 -0
  349. package/src/mesh/mesh-reconcile-identity.ts +103 -0
  350. package/src/mesh/mesh-reconcile-loop.ts +1696 -0
  351. package/src/mesh/mesh-reconcile-v2-backstop.ts +62 -0
  352. package/src/mesh/mesh-refine-batch.ts +205 -0
  353. package/src/mesh/mesh-refine-gates.ts +1792 -0
  354. package/src/mesh/mesh-refine-status.ts +231 -0
  355. package/src/mesh/mesh-remote-event-pull.ts +279 -0
  356. package/src/mesh/mesh-review-inbox.ts +308 -0
  357. package/src/mesh/mesh-routing.ts +291 -0
  358. package/src/mesh/mesh-runtime-store.ts +2292 -0
  359. package/src/mesh/mesh-scheduling-runtime.ts +198 -0
  360. package/src/mesh/mesh-task-inflight.ts +70 -0
  361. package/src/mesh/mesh-task-stats.ts +161 -0
  362. package/src/mesh/mesh-unresolved-forward-outbox.ts +215 -0
  363. package/src/mesh/mesh-warmup-deadline.ts +152 -0
  364. package/src/mesh/mesh-work-queue.ts +1489 -145
  365. package/src/mesh/preview-freshness.ts +163 -0
  366. package/src/mesh/refine-config.ts +129 -12
  367. package/src/mesh/worktree-bootstrap-config.ts +599 -0
  368. package/src/providers/acp-provider-instance.ts +43 -10
  369. package/src/providers/approval-utils.d.ts +5 -0
  370. package/src/providers/approval-utils.ts +100 -6
  371. package/src/providers/chat-message-normalization.ts +126 -4
  372. package/src/providers/cli-provider-effect-format.ts +53 -0
  373. package/src/providers/cli-provider-history-dedup.ts +75 -0
  374. package/src/providers/cli-provider-input-prompt.ts +133 -0
  375. package/src/providers/cli-provider-instance-types.ts +131 -0
  376. package/src/providers/cli-provider-instance.ts +2771 -499
  377. package/src/providers/cli-provider-status-helpers.ts +123 -0
  378. package/src/providers/cli-provider-transcript-merge.ts +114 -0
  379. package/src/providers/contracts.d.ts +55 -0
  380. package/src/providers/contracts.ts +207 -6
  381. package/src/providers/extension-provider-instance.ts +12 -7
  382. package/src/providers/external-sources.ts +218 -0
  383. package/src/providers/ide-provider-instance.ts +35 -12
  384. package/src/providers/manual-attendance.ts +105 -0
  385. package/src/providers/native-history/antigravity-claim-registry.ts +138 -0
  386. package/src/providers/native-history/antigravity-cli-transcript.ts +1275 -0
  387. package/src/providers/native-history/claude-cli-transcript.ts +396 -0
  388. package/src/providers/native-history/codex-cli-transcript.ts +479 -0
  389. package/src/providers/native-history/constants.ts +19 -0
  390. package/src/providers/native-history/dispatcher.ts +617 -0
  391. package/src/providers/native-history/hermes-cli-transcript.ts +312 -0
  392. package/src/providers/native-history/index.ts +30 -0
  393. package/src/providers/provider-instance-manager.ts +71 -0
  394. package/src/providers/provider-instance.ts +24 -1
  395. package/src/providers/provider-loader.ts +700 -55
  396. package/src/providers/provider-schema.ts +93 -14
  397. package/src/providers/provider-trust.ts +114 -0
  398. package/src/providers/read-chat-contract.ts +76 -16
  399. package/src/providers/sdk/README.md +49 -0
  400. package/src/providers/sdk/v1/builders/acp/detect-status.ts +144 -0
  401. package/src/providers/sdk/v1/builders/cli/detect-status.ts +313 -0
  402. package/src/providers/sdk/v1/builders/cli/parse-approval-squash.ts +158 -0
  403. package/src/providers/sdk/v1/builders/cli/parse-approval.ts +261 -0
  404. package/src/providers/sdk/v1/builders/cli/parse-session.ts +276 -0
  405. package/src/providers/sdk/v1/builders/cli/visible-region.ts +143 -0
  406. package/src/providers/sdk/v1/fixture-tooling/format.ts +130 -0
  407. package/src/providers/sdk/v1/fixture-tooling/index.ts +22 -0
  408. package/src/providers/sdk/v1/fixture-tooling/replay.ts +352 -0
  409. package/src/providers/sdk/v1/index.ts +152 -0
  410. package/src/providers/sdk/v1/sandbox/README-design.ts +195 -0
  411. package/src/providers/sdk/v1/sandbox/require-whitelist.ts +472 -0
  412. package/src/providers/sdk/v1/sandbox/script-runner.ts +150 -0
  413. package/src/providers/sdk/v1/schemas/cli/provider.schema.json +538 -0
  414. package/src/providers/sdk/v1/schemas/primitives/acp-session-protocol-v1.json +131 -0
  415. package/src/providers/sdk/v1/schemas/primitives/native-history-codex-rollout-v1.json +66 -0
  416. package/src/providers/sdk/v1/schemas/primitives/tui-approval-squash-v1.json +91 -0
  417. package/src/providers/sdk/v1/schemas/primitives/tui-assistant-block-v1.json +91 -0
  418. package/src/providers/sdk/v1/schemas/primitives/tui-cue-ordering-v1.json +47 -0
  419. package/src/providers/sdk/v1/schemas/primitives/tui-dispatch-order-v1.json +32 -0
  420. package/src/providers/sdk/v1/schemas/primitives/tui-footer-chrome-v1.json +42 -0
  421. package/src/providers/sdk/v1/schemas/primitives/tui-index-finder-v1.json +27 -0
  422. package/src/providers/sdk/v1/schemas/primitives/tui-modal-v1.json +125 -0
  423. package/src/providers/sdk/v1/schemas/primitives/tui-prompt-marker-v1.json +45 -0
  424. package/src/providers/sdk/v1/schemas/primitives/tui-session-id-extraction-v1.json +46 -0
  425. package/src/providers/sdk/v1/schemas/primitives/tui-settled-prompt-v1.json +71 -0
  426. package/src/providers/sdk/v1/schemas/primitives/tui-spinner-v1.json +83 -0
  427. package/src/providers/sdk/v1/schemas/primitives/tui-transcript-pty-v1.json +83 -0
  428. package/src/providers/sdk/v1/schemas/primitives/tui-visible-region-v1.json +57 -0
  429. package/src/providers/sdk/v1/schemas/primitives/tui-welcome-screen-v1.json +35 -0
  430. package/src/providers/sdk/v1/types/cli/index.ts +365 -0
  431. package/src/providers/sdk/v1/types/common/index.ts +229 -0
  432. package/src/providers/sdk/v1/validators/index.ts +19 -0
  433. package/src/providers/sdk/v1/validators/manifest.ts +110 -0
  434. package/src/providers/sdk/v1/validators/taint.ts +309 -0
  435. package/src/providers/spec/adapter.ts +246 -0
  436. package/src/providers/spec/cli-adapter.ts +1064 -0
  437. package/src/providers/spec/evaluator.ts +407 -0
  438. package/src/providers/spec/fsm-driver.ts +1528 -0
  439. package/src/providers/spec/fsm-evaluator.ts +290 -0
  440. package/src/providers/spec/fsm-loader.ts +128 -0
  441. package/src/providers/spec/fsm-types.ts +301 -0
  442. package/src/providers/spec/native-history-executor.ts +1241 -0
  443. package/src/providers/spec/pre-launch-trust.ts +104 -0
  444. package/src/providers/spec/route.ts +51 -0
  445. package/src/providers/spec/types.ts +284 -0
  446. package/src/providers/status-monitor.d.ts +7 -7
  447. package/src/providers/status-monitor.ts +37 -22
  448. package/src/providers/transcript-v2.ts +567 -0
  449. package/src/providers/types/interactive-prompt.ts +536 -0
  450. package/src/providers/version-archive.ts +64 -24
  451. package/src/providers/working-dir.ts +23 -0
  452. package/src/repo-mesh-types.ts +861 -14
  453. package/src/runtime-defaults.ts +39 -0
  454. package/src/session-host/managed-host.ts +218 -0
  455. package/src/session-host/runtime-surface.ts +20 -80
  456. package/src/sessions/registry.ts +44 -0
  457. package/src/shared-types-extra.ts +2 -4
  458. package/src/shared-types.d.ts +8 -0
  459. package/src/shared-types.ts +148 -55
  460. package/src/status/builders.ts +69 -6
  461. package/src/status/chat-tail-hot-sessions.ts +117 -2
  462. package/src/status/normalize.ts +2 -0
  463. package/src/status/reporter.ts +19 -1
  464. package/src/status/snapshot.ts +100 -27
  465. package/src/system/hash.ts +23 -0
  466. package/src/system/host-memory.ts +29 -12
  467. package/src/system/load-better-sqlite3.ts +68 -0
  468. package/src/types.ts +26 -6
  469. package/dist/cli-adapters/terminal-backends/xterm-backend.d.ts +0 -17
  470. package/dist/mesh/mesh-sync.d.ts +0 -53
  471. package/src/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +0 -16
  472. package/src/cli-adapters/terminal-backends/xterm-backend.ts +0 -97
  473. package/src/mesh/mesh-sync.ts +0 -111
@@ -0,0 +1,376 @@
1
+ /**
2
+ * Repo-shared declarative mesh config — `.adhdev/mesh.json`
3
+ *
4
+ * A repo-committed, machine-independent file carrying ONLY the repo-shared
5
+ * coordinator-prompt config and operating notes:
6
+ *
7
+ * - coordinator — systemPromptOverride (local wins, else repo) and
8
+ * systemPromptAppend (repo append + local append BOTH
9
+ * stack, repo first).
10
+ * - operatingNotes — repo-declared baseline notes merged with the runtime
11
+ * ledger notes; on duplicate text the ledger note wins.
12
+ * - limits — advisory-only (`maxNoteChars`, `maxNotes`,
13
+ * `coordinator.maxPromptChars`); recorded, never enforced in v1.
14
+ *
15
+ * POLICY IS NOT HERE. RepoMeshPolicy (the 15 scheduling/approval fields) is
16
+ * MACHINE-LOCAL only — it lives in meshes.json and is never sourced from, merged
17
+ * with, or overlaid by a repo file. There is no `policy` zone and no
18
+ * `policy.scheduling` overlay in mesh.json; the scheduler reads the stored
19
+ * machine-local policy directly. The repo file shapes the coordinator prompt and
20
+ * operating notes, nothing else.
21
+ *
22
+ * The coordinator/operatingNotes merge is **in-memory only**: the on-disk
23
+ * machine-local `meshes.json` is never mutated by this module.
24
+ *
25
+ * FILE SEPARATION: refine / worktree-bootstrap / change-impact configs live in
26
+ * their OWN `.adhdev/*` files with their own loaders — they are NOT inlined into
27
+ * mesh.json. `loadRepoSettings` (config/repo-settings.ts) assembles all of them
28
+ * into one object for consumers.
29
+ *
30
+ * SECURITY: declarative only. JSON/YAML is parsed; arbitrary JS (.js) is NOT
31
+ * supported, so loading a config can never execute code.
32
+ */
33
+
34
+ import { existsSync, readFileSync } from 'fs';
35
+ import { join } from 'path';
36
+ import * as yaml from 'js-yaml';
37
+ import type {
38
+ RepoMeshCoordinatorConfig,
39
+ LocalMeshEntry,
40
+ } from '../repo-mesh-types.js';
41
+ import type { CoordinatorOperatingNote } from '../mesh/coordinator-prompt.js';
42
+
43
+ // ─── Types (declarative config zones) ───────────
44
+
45
+ export interface RepoMeshDeclarativeCoordinatorConfig {
46
+ /** Full mesh-level system prompt override. Same semantics as
47
+ * RepoMeshCoordinatorConfig.systemPromptOverride; LOCAL-WINS. */
48
+ systemPromptOverride?: string;
49
+ /** Mesh-level append stacked after the base prompt. Both the repo append
50
+ * and the machine-local append apply; the repo append comes first. */
51
+ systemPromptAppend?: string;
52
+ /** Advisory only in v1 — recorded but never enforced. */
53
+ maxPromptChars?: number;
54
+ }
55
+
56
+ export interface RepoMeshDeclarativeLimits {
57
+ /** Advisory only in v1 — recorded but never enforced. */
58
+ maxNoteChars?: number;
59
+ /** Advisory only in v1 — recorded but never enforced. */
60
+ maxNotes?: number;
61
+ }
62
+
63
+ /**
64
+ * Parsed + normalized `.adhdev/mesh.json` shape. Every field is optional except
65
+ * version so a repo can declare only the zone(s) it cares about. Policy is NOT a
66
+ * zone here — it is machine-local (meshes.json) only.
67
+ */
68
+ export interface RepoMeshDeclarativeConfig {
69
+ version: 1;
70
+ coordinator?: RepoMeshDeclarativeCoordinatorConfig;
71
+ operatingNotes?: CoordinatorOperatingNote[];
72
+ limits?: RepoMeshDeclarativeLimits;
73
+ }
74
+
75
+ export interface RepoMeshJsonConfigLoadResult {
76
+ config?: RepoMeshDeclarativeConfig;
77
+ /** Relative location matched, or 'unavailable'/'invalid' marker. */
78
+ source: string;
79
+ sourceType: 'repo_file' | 'unavailable' | 'invalid';
80
+ /** Absolute path of the matched file, when one was read. */
81
+ path?: string;
82
+ error?: string;
83
+ }
84
+
85
+ // MESH_JSON_CONFIG_LOCATIONS is retained for backward compatibility: it is the
86
+ // shared list of `.adhdev/mesh.*` filenames the loader probes (and other modules
87
+ // reference for diagnostics). The file now carries only coordinator + operating
88
+ // notes; there is no scheduling overlay.
89
+ export const MESH_JSON_CONFIG_LOCATIONS = [
90
+ '.adhdev/mesh.json',
91
+ '.adhdev/mesh.yaml',
92
+ '.adhdev/mesh.yml',
93
+ ];
94
+
95
+ export const MESH_JSON_CONFIG_SCHEMA = {
96
+ $schema: 'https://json-schema.org/draft/2020-12/schema',
97
+ title: 'ADHDev Repo Mesh Declarative Config',
98
+ type: 'object',
99
+ additionalProperties: false,
100
+ required: ['version'],
101
+ properties: {
102
+ version: { const: 1 },
103
+ coordinator: {
104
+ type: 'object',
105
+ additionalProperties: false,
106
+ properties: {
107
+ systemPromptOverride: { type: 'string' },
108
+ systemPromptAppend: { type: 'string' },
109
+ maxPromptChars: { type: 'number', minimum: 1 },
110
+ },
111
+ },
112
+ operatingNotes: {
113
+ type: 'array',
114
+ maxItems: 200,
115
+ items: {
116
+ type: 'object',
117
+ additionalProperties: false,
118
+ required: ['text'],
119
+ properties: {
120
+ text: { type: 'string', minLength: 1 },
121
+ category: { enum: ['provider_quirk', 'pattern_to_avoid', 'recovery_lesson'] },
122
+ createdAt: { type: 'string' },
123
+ sourceCoordinator: { type: 'string' },
124
+ },
125
+ },
126
+ },
127
+ limits: {
128
+ type: 'object',
129
+ additionalProperties: false,
130
+ properties: {
131
+ maxNoteChars: { type: 'number', minimum: 1 },
132
+ maxNotes: { type: 'number', minimum: 1 },
133
+ },
134
+ },
135
+ },
136
+ } as const;
137
+
138
+ // ─── Shared helpers ─────────────────────────────
139
+
140
+ function isRecord(value: unknown): value is Record<string, unknown> {
141
+ return !!value && typeof value === 'object' && !Array.isArray(value);
142
+ }
143
+
144
+ function parseConfigText(path: string, text: string): unknown {
145
+ if (/\.json$/i.test(path)) return JSON.parse(text);
146
+ return yaml.load(text);
147
+ }
148
+
149
+ // ─── Declarative config: Parse / Normalize ──────
150
+
151
+ function normalizeOperatingNote(value: unknown): CoordinatorOperatingNote | null {
152
+ if (!isRecord(value)) return null;
153
+ const text = typeof value.text === 'string' ? value.text.trim() : '';
154
+ if (!text) return null;
155
+ const category = value.category === 'provider_quirk' || value.category === 'pattern_to_avoid' || value.category === 'recovery_lesson'
156
+ ? value.category
157
+ : undefined;
158
+ return {
159
+ text,
160
+ ...(category ? { category } : {}),
161
+ ...(typeof value.createdAt === 'string' ? { createdAt: value.createdAt } : {}),
162
+ ...(typeof value.sourceCoordinator === 'string' ? { sourceCoordinator: value.sourceCoordinator } : {}),
163
+ };
164
+ }
165
+
166
+ /**
167
+ * Validate + normalize a parsed `.adhdev/mesh.json` object into a typed
168
+ * RepoMeshDeclarativeConfig. Returns the config plus any non-fatal warnings;
169
+ * `valid` is false only when the document is structurally unusable (not an
170
+ * object / wrong version). Unknown top-level keys are tolerated (dropped) so a
171
+ * newer repo file authored against a future schema still loads its known zones.
172
+ */
173
+ export function normalizeRepoMeshDeclarativeConfig(parsed: unknown): {
174
+ valid: boolean;
175
+ config?: RepoMeshDeclarativeConfig;
176
+ errors: string[];
177
+ } {
178
+ const errors: string[] = [];
179
+ if (!isRecord(parsed)) return { valid: false, errors: ['config must be an object'] };
180
+ if (parsed.version !== 1) {
181
+ return { valid: false, errors: [`version must be 1 (got ${JSON.stringify(parsed.version)})`] };
182
+ }
183
+
184
+ const config: RepoMeshDeclarativeConfig = { version: 1 };
185
+
186
+ if (parsed.coordinator !== undefined) {
187
+ if (isRecord(parsed.coordinator)) {
188
+ const coord: RepoMeshDeclarativeCoordinatorConfig = {};
189
+ const c = parsed.coordinator;
190
+ if (typeof c.systemPromptOverride === 'string') coord.systemPromptOverride = c.systemPromptOverride;
191
+ if (typeof c.systemPromptAppend === 'string') coord.systemPromptAppend = c.systemPromptAppend;
192
+ if (Number.isFinite(Number(c.maxPromptChars))) coord.maxPromptChars = Number(c.maxPromptChars);
193
+ config.coordinator = coord;
194
+ } else {
195
+ errors.push('coordinator must be an object when provided');
196
+ }
197
+ }
198
+
199
+ if (parsed.operatingNotes !== undefined) {
200
+ if (Array.isArray(parsed.operatingNotes)) {
201
+ const notes = parsed.operatingNotes
202
+ .map(normalizeOperatingNote)
203
+ .filter((n): n is CoordinatorOperatingNote => n !== null);
204
+ if (notes.length) config.operatingNotes = notes;
205
+ } else {
206
+ errors.push('operatingNotes must be an array when provided');
207
+ }
208
+ }
209
+
210
+ if (parsed.limits !== undefined) {
211
+ if (isRecord(parsed.limits)) {
212
+ const limits: RepoMeshDeclarativeLimits = {};
213
+ if (Number.isFinite(Number(parsed.limits.maxNoteChars))) limits.maxNoteChars = Number(parsed.limits.maxNoteChars);
214
+ if (Number.isFinite(Number(parsed.limits.maxNotes))) limits.maxNotes = Number(parsed.limits.maxNotes);
215
+ if (Object.keys(limits).length) config.limits = limits;
216
+ } else {
217
+ errors.push('limits must be an object when provided');
218
+ }
219
+ }
220
+
221
+ return { valid: true, config, errors };
222
+ }
223
+
224
+ // ─── Declarative config: Loader ─────────────────
225
+
226
+ /**
227
+ * Load the repo-shared declarative mesh config for a coordinator workspace.
228
+ *
229
+ * Resolution: the coordinator node workspace is checked first; if it carries no
230
+ * `.adhdev/mesh.json`, the calling process cwd is tried as a fallback (per the
231
+ * design: "workspace path = coordinator node workspace's .adhdev/mesh.json,
232
+ * else calling cwd"). The first existing file across both bases (and the
233
+ * json/yaml/yml variants) wins.
234
+ *
235
+ * Read/parse errors never throw — they resolve to a sourceType:'invalid'
236
+ * result so a broken repo file degrades to "no repo base" instead of blocking
237
+ * coordinator launch.
238
+ */
239
+ export function loadRepoMeshJsonConfig(workspace?: string): RepoMeshJsonConfigLoadResult {
240
+ const bases: string[] = [];
241
+ const ws = typeof workspace === 'string' ? workspace.trim() : '';
242
+ if (ws) bases.push(ws);
243
+ let cwd = '';
244
+ try { cwd = process.cwd(); } catch { /* cwd unavailable in some sandboxes */ }
245
+ if (cwd && cwd !== ws) bases.push(cwd);
246
+
247
+ for (const base of bases) {
248
+ for (const relative of MESH_JSON_CONFIG_LOCATIONS) {
249
+ const configPath = join(base, relative);
250
+ if (!existsSync(configPath)) continue;
251
+ try {
252
+ const parsed = parseConfigText(configPath, readFileSync(configPath, 'utf-8'));
253
+ const result = normalizeRepoMeshDeclarativeConfig(parsed);
254
+ if (!result.valid || !result.config) {
255
+ return { source: relative, sourceType: 'invalid', path: configPath, error: result.errors.join('; ') };
256
+ }
257
+ return { config: result.config, source: relative, sourceType: 'repo_file', path: configPath };
258
+ } catch (error: any) {
259
+ return { source: relative, sourceType: 'invalid', path: configPath, error: error?.message || String(error) };
260
+ }
261
+ }
262
+ }
263
+ return {
264
+ source: 'unavailable',
265
+ sourceType: 'unavailable',
266
+ error: `No repo mesh config found. Checked: ${MESH_JSON_CONFIG_LOCATIONS.join(', ')}`,
267
+ };
268
+ }
269
+
270
+ // ─── Declarative config: Merge (coordinator + operating notes) ─────
271
+
272
+ /**
273
+ * Effective coordinator config. systemPromptOverride: local wins, else repo.
274
+ * systemPromptAppend: repo append + local append BOTH stack (repo first). Other
275
+ * coordinator fields (providerType, preferredNodeId, …) are carried from the
276
+ * machine-local config unchanged.
277
+ */
278
+ export function mergeEffectiveCoordinatorConfig(
279
+ repoCoord: RepoMeshDeclarativeCoordinatorConfig | undefined,
280
+ localCoord: RepoMeshCoordinatorConfig | undefined,
281
+ ): RepoMeshCoordinatorConfig {
282
+ const out: RepoMeshCoordinatorConfig = { ...(localCoord || {}) };
283
+
284
+ const localOverride = localCoord?.systemPromptOverride?.trim();
285
+ const repoOverride = repoCoord?.systemPromptOverride?.trim();
286
+ if (localOverride) {
287
+ out.systemPromptOverride = localCoord!.systemPromptOverride;
288
+ } else if (repoOverride) {
289
+ out.systemPromptOverride = repoCoord!.systemPromptOverride;
290
+ } else {
291
+ delete out.systemPromptOverride;
292
+ }
293
+
294
+ const repoAppend = repoCoord?.systemPromptAppend?.trim() ? repoCoord!.systemPromptAppend!.trim() : '';
295
+ // The machine-local append may live on the new field or the legacy alias.
296
+ const localAppendRaw = (localCoord?.systemPromptAppend ?? localCoord?.systemPromptSuffix);
297
+ const localAppend = localAppendRaw?.trim() ? localAppendRaw.trim() : '';
298
+ const stacked = [repoAppend, localAppend].filter(Boolean).join('\n\n');
299
+ if (stacked) {
300
+ out.systemPromptAppend = stacked;
301
+ // The stacked value already folds in any legacy suffix; drop the alias so
302
+ // buildCoordinatorSystemPrompt doesn't risk double-applying it.
303
+ delete out.systemPromptSuffix;
304
+ }
305
+
306
+ return out;
307
+ }
308
+
309
+ /**
310
+ * Effective operating notes = repo-declared baseline ⊕ runtime ledger notes.
311
+ * Dedup by trimmed text with the LEDGER note winning (repo duplicates dropped),
312
+ * so a runtime note's freshest wording/category survives. Order: repo baseline
313
+ * first, then ledger notes. Returns undefined when nothing usable remains so the
314
+ * prompt's "## Operating Notes" section is omitted exactly as before.
315
+ */
316
+ export function mergeEffectiveOperatingNotes(
317
+ repoNotes: CoordinatorOperatingNote[] | undefined,
318
+ ledgerNotes: CoordinatorOperatingNote[] | undefined,
319
+ ): CoordinatorOperatingNote[] | undefined {
320
+ const usable = (notes: CoordinatorOperatingNote[] | undefined): CoordinatorOperatingNote[] =>
321
+ Array.isArray(notes) ? notes.filter(n => n && typeof n.text === 'string' && n.text.trim()) : [];
322
+ const repo = usable(repoNotes);
323
+ const ledger = usable(ledgerNotes);
324
+ const ledgerTexts = new Set(ledger.map(n => n.text.trim()));
325
+ const repoKept = repo.filter(n => !ledgerTexts.has(n.text.trim()));
326
+ const merged = [...repoKept, ...ledger];
327
+ return merged.length ? merged : undefined;
328
+ }
329
+
330
+ /**
331
+ * Produce an in-memory effective mesh by layering the repo declarative config
332
+ * UNDER the machine-local mesh entry — coordinator zone ONLY. Policy is
333
+ * machine-local and is left exactly as the stored mesh carries it (never sourced
334
+ * from the repo file). Returns a new object; the input mesh and on-disk
335
+ * meshes.json are never mutated. operatingNotes are merged separately at launch
336
+ * (they ride the prompt context, not the mesh).
337
+ */
338
+ export function applyRepoMeshConfig<T extends Pick<LocalMeshEntry, 'coordinator'>>(
339
+ mesh: T,
340
+ repoConfig: RepoMeshDeclarativeConfig | null | undefined,
341
+ ): T {
342
+ if (!repoConfig) return mesh;
343
+ return {
344
+ ...mesh,
345
+ coordinator: mergeEffectiveCoordinatorConfig(repoConfig.coordinator, mesh.coordinator),
346
+ };
347
+ }
348
+
349
+ // ─── Declarative config: Export scaffold ────────
350
+
351
+ /**
352
+ * Build a `.adhdev/mesh.json` DRAFT from a machine-local mesh entry. This is a
353
+ * scaffold for the operator to review and commit — NOT an automatic migration.
354
+ * It captures the coordinator prompt override/append so a repo can adopt the
355
+ * current machine's prompt customization as the shared base. Policy is NOT
356
+ * exported — it is machine-local only and has no place in mesh.json. Operating
357
+ * notes are intentionally NOT exported either: those are runtime ledger lessons,
358
+ * and a repo should declare baseline notes deliberately.
359
+ */
360
+ export function buildMeshJsonConfigScaffold(
361
+ mesh: Pick<LocalMeshEntry, 'coordinator'>,
362
+ ): RepoMeshDeclarativeConfig {
363
+ const scaffold: RepoMeshDeclarativeConfig = { version: 1 };
364
+ const coord: RepoMeshDeclarativeCoordinatorConfig = {};
365
+ const override = mesh.coordinator?.systemPromptOverride;
366
+ if (typeof override === 'string' && override.trim()) coord.systemPromptOverride = override;
367
+ const append = mesh.coordinator?.systemPromptAppend ?? mesh.coordinator?.systemPromptSuffix;
368
+ if (typeof append === 'string' && append.trim()) coord.systemPromptAppend = append;
369
+ if (Object.keys(coord).length) scaffold.coordinator = coord;
370
+ return scaffold;
371
+ }
372
+
373
+ /** Serialize a scaffold to the canonical 2-space JSON draft text. */
374
+ export function serializeMeshJsonConfigScaffold(config: RepoMeshDeclarativeConfig): string {
375
+ return JSON.stringify(config, null, 2);
376
+ }
@@ -92,12 +92,18 @@ export function buildSessionReadStateKey(sessionId: string, providerSessionId?:
92
92
 
93
93
  export function getSessionSeenAt(state: DaemonState, sessionId: string, providerSessionId?: string | null): number {
94
94
  const providerKey = buildSessionReadStateKey(sessionId, providerSessionId);
95
- return state.sessionReads?.[providerKey] || state.sessionReads?.[sessionId] || 0;
95
+ return Math.max(state.sessionReads?.[providerKey] || 0, state.sessionReads?.[sessionId] || 0);
96
96
  }
97
97
 
98
98
  export function getSessionSeenMarker(state: DaemonState, sessionId: string, providerSessionId?: string | null): string {
99
99
  const providerKey = buildSessionReadStateKey(sessionId, providerSessionId);
100
- return state.sessionReadMarkers?.[providerKey] || state.sessionReadMarkers?.[sessionId] || '';
100
+ const providerSeenAt = state.sessionReads?.[providerKey] || 0;
101
+ const sessionSeenAt = state.sessionReads?.[sessionId] || 0;
102
+ const providerMarker = state.sessionReadMarkers?.[providerKey] || '';
103
+ const sessionMarker = state.sessionReadMarkers?.[sessionId] || '';
104
+ if (sessionSeenAt > providerSeenAt && sessionMarker) return sessionMarker;
105
+ if (providerSeenAt > sessionSeenAt && providerMarker) return providerMarker;
106
+ return providerMarker || sessionMarker;
101
107
  }
102
108
 
103
109
  export function getSessionNotificationDismissal(state: DaemonState, sessionId: string, providerSessionId?: string | null): string {
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Registry / provider-distribution URL resolver.
3
+ *
4
+ * Single source of truth for the ADHDev provider *registry* base URL and the
5
+ * provider *tarball* (GitHub) URL. Self-hosters can repoint both away from the
6
+ * vendor defaults so the daemon never phones home to `api.adhf.dev` /
7
+ * `github.com/vilmire/adhdev-providers`.
8
+ *
9
+ * Resolution priority (highest first):
10
+ * 1. Explicit config field — `config.registryUrl` / `config.providerTarballUrl`
11
+ * 2. Environment variable — `ADHDEV_REGISTRY_URL` / `ADHDEV_PROVIDER_TARBALL_URL`
12
+ * 3. Vendor default — existing URLs (unchanged for default users)
13
+ *
14
+ * Default users get byte-identical behavior: the vendor defaults equal the
15
+ * literals these functions replaced.
16
+ */
17
+
18
+ /** Vendor default registry base URL (no trailing slash). */
19
+ export const DEFAULT_REGISTRY_BASE_URL = 'https://api.adhf.dev/api/v1/registry';
20
+
21
+ /** Vendor default provider tarball URL (GitHub main branch archive). */
22
+ export const DEFAULT_PROVIDER_TARBALL_URL =
23
+ 'https://github.com/vilmire/adhdev-providers/archive/refs/heads/main.tar.gz';
24
+
25
+ /** Env var that overrides the registry base URL. */
26
+ export const REGISTRY_URL_ENV_VAR = 'ADHDEV_REGISTRY_URL';
27
+
28
+ /** Env var that overrides the provider tarball URL. */
29
+ export const PROVIDER_TARBALL_URL_ENV_VAR = 'ADHDEV_PROVIDER_TARBALL_URL';
30
+
31
+ function cleanString(value: unknown): string | undefined {
32
+ return typeof value === 'string' && value.trim() ? value.trim() : undefined;
33
+ }
34
+
35
+ function stripTrailingSlashes(url: string): string {
36
+ return url.replace(/\/+$/, '');
37
+ }
38
+
39
+ /**
40
+ * Resolve the provider registry base URL.
41
+ *
42
+ * @param configuredUrl explicit config value (config.registryUrl); highest priority.
43
+ * @param env process env source (defaults to process.env; injectable for tests).
44
+ * @returns the resolved base URL with any trailing slash stripped, so callers
45
+ * can safely append `/providers`, `/providers/<type>`, etc.
46
+ */
47
+ export function resolveRegistryBaseUrl(
48
+ configuredUrl?: string | null,
49
+ env: NodeJS.ProcessEnv = process.env,
50
+ ): string {
51
+ const resolved =
52
+ cleanString(configuredUrl) ??
53
+ cleanString(env[REGISTRY_URL_ENV_VAR]) ??
54
+ DEFAULT_REGISTRY_BASE_URL;
55
+ return stripTrailingSlashes(resolved);
56
+ }
57
+
58
+ /**
59
+ * Resolve the provider tarball (archive) URL.
60
+ *
61
+ * @param configuredUrl explicit config value (config.providerTarballUrl); highest priority.
62
+ * @param env process env source (defaults to process.env; injectable for tests).
63
+ */
64
+ export function resolveProviderTarballUrl(
65
+ configuredUrl?: string | null,
66
+ env: NodeJS.ProcessEnv = process.env,
67
+ ): string {
68
+ return (
69
+ cleanString(configuredUrl) ??
70
+ cleanString(env[PROVIDER_TARBALL_URL_ENV_VAR]) ??
71
+ DEFAULT_PROVIDER_TARBALL_URL
72
+ );
73
+ }
74
+
75
+ /** Parsed tarball request target for callers that issue raw hostname/path requests. */
76
+ export interface TarballRequestTarget {
77
+ /** Full resolved tarball URL. */
78
+ url: string;
79
+ /** Hostname component (e.g. `github.com`). */
80
+ hostname: string;
81
+ /** Path component including any query string (e.g. `/vilmire/...tar.gz`). */
82
+ path: string;
83
+ }
84
+
85
+ /**
86
+ * Resolve the provider tarball URL and split it into `{ url, hostname, path }`
87
+ * for callers that build raw `https.request` options (e.g. HEAD ETag probes).
88
+ */
89
+ export function resolveProviderTarballTarget(
90
+ configuredUrl?: string | null,
91
+ env: NodeJS.ProcessEnv = process.env,
92
+ ): TarballRequestTarget {
93
+ const url = resolveProviderTarballUrl(configuredUrl, env);
94
+ const parsed = new URL(url);
95
+ return {
96
+ url,
97
+ hostname: parsed.hostname,
98
+ path: parsed.pathname + (parsed.search || ''),
99
+ };
100
+ }
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Repo Settings — one unified loader over the repo-committed `.adhdev/*` config
3
+ * files (the "single source" assembly point).
4
+ *
5
+ * DESIGN (option B — file separation preserved): the repo keeps its declarative
6
+ * config in SEPARATE files, each with its own dedicated loader:
7
+ *
8
+ * .adhdev/mesh.json → loadRepoMeshJsonConfig (coordinator + operatingNotes)
9
+ * .adhdev/refine.json → loadMeshRefineConfig (Refinery validation)
10
+ * .adhdev/worktree_bootstrap.json → loadMeshWorktreeBootstrapConfig
11
+ * .adhdev/change-impact.json → loadChangeImpactConfig
12
+ *
13
+ * Nothing is inlined into mesh.json. `loadRepoSettings` simply CALLS each
14
+ * dedicated loader and assembles the results into one `RepoSettings` object so a
15
+ * consumer can read every repo-shared setting through a single call instead of
16
+ * threading four loaders. The per-file loaders remain the source of truth (and
17
+ * stay independently usable); this is a convenience aggregator, not a new schema.
18
+ *
19
+ * IMPORTANT — policy is NOT here. RepoMeshPolicy (the 15 scheduling/approval
20
+ * fields) is MACHINE-LOCAL only: it lives in meshes.json and is never sourced
21
+ * from or merged with a repo file. mesh.json carries only coordinator prompt
22
+ * config + operating notes (+ advisory limits).
23
+ *
24
+ * The refine/worktree-bootstrap loaders also honor a machine-local INLINE seam
25
+ * (mesh.refineConfig / mesh.policy.worktreeBootstrap, etc.) — that seam is for
26
+ * machine-local config and is unchanged here; mesh.json gains no such zone.
27
+ */
28
+
29
+ import {
30
+ loadRepoMeshJsonConfig,
31
+ type RepoMeshDeclarativeCoordinatorConfig,
32
+ type RepoMeshDeclarativeLimits,
33
+ type RepoMeshJsonConfigLoadResult,
34
+ } from './mesh-json-config.js';
35
+ import {
36
+ loadMeshRefineConfig,
37
+ type MeshRefineConfigLoadResult,
38
+ } from '../mesh/refine-config.js';
39
+ import {
40
+ loadMeshWorktreeBootstrapConfig,
41
+ type WorktreeBootstrapConfigLoadResult,
42
+ } from '../mesh/worktree-bootstrap-config.js';
43
+ import {
44
+ loadChangeImpactConfig,
45
+ type ChangeImpactConfigLoadResult,
46
+ } from '../git/change-impact-config.js';
47
+ import type { CoordinatorOperatingNote } from '../mesh/coordinator-prompt.js';
48
+
49
+ export interface LoadRepoSettingsOptions {
50
+ /** Workspace path whose `.adhdev/*` files are resolved (mesh.json / refine / bootstrap). */
51
+ workspace: string;
52
+ /**
53
+ * Machine-local mesh entry, consulted ONLY for the INLINE seam of the
54
+ * refine / worktree-bootstrap loaders (mesh.refineConfig etc.). Optional —
55
+ * omit it and only the repo files are considered. NEVER used to source policy.
56
+ */
57
+ mesh?: any;
58
+ /**
59
+ * Repo root for change-impact resolution. Defaults to `workspace` when omitted
60
+ * (change-impact compares the daemon build commit against the workspace HEAD).
61
+ */
62
+ repoRoot?: string;
63
+ }
64
+
65
+ /**
66
+ * The assembled repo-shared settings. Each sub-config carries its own load
67
+ * result (source / sourceType / error) so a consumer can tell "absent" from
68
+ * "invalid" per file. `coordinator` / `operatingNotes` / `limits` are lifted out
69
+ * of the mesh.json load result for convenience; `meshJson` keeps the full result
70
+ * (e.g. for the `sourceType === 'invalid'` warning on coordinator launch).
71
+ */
72
+ export interface RepoSettings {
73
+ /** Repo-shared coordinator prompt config (override/append) from `.adhdev/mesh.json`. */
74
+ coordinator?: RepoMeshDeclarativeCoordinatorConfig;
75
+ /** Repo-declared baseline operating notes from `.adhdev/mesh.json`. */
76
+ operatingNotes?: CoordinatorOperatingNote[];
77
+ /** Advisory-only limits from `.adhdev/mesh.json` (recorded, not enforced in v1). */
78
+ limits?: RepoMeshDeclarativeLimits;
79
+ /** Full `.adhdev/mesh.json` declarative load result (coordinator/operatingNotes source). */
80
+ meshJson: RepoMeshJsonConfigLoadResult;
81
+ /** `.adhdev/refine.json` Refinery validation config load result. */
82
+ refine: MeshRefineConfigLoadResult;
83
+ /** `.adhdev/worktree_bootstrap.json` bootstrap config load result. */
84
+ worktreeBootstrap: WorktreeBootstrapConfigLoadResult;
85
+ /** `.adhdev/change-impact.json` change-impact config load result. */
86
+ changeImpact: ChangeImpactConfigLoadResult;
87
+ }
88
+
89
+ /**
90
+ * Load every repo-committed `.adhdev/*` setting for a workspace and assemble them
91
+ * into one object. Each dedicated loader degrades to an `unavailable`/`invalid`
92
+ * load result rather than throwing, so this never throws on a missing or broken
93
+ * file — a consumer inspects the per-sub-config `sourceType`.
94
+ */
95
+ export function loadRepoSettings(opts: LoadRepoSettingsOptions): RepoSettings {
96
+ const workspace = typeof opts.workspace === 'string' ? opts.workspace : '';
97
+ const mesh = opts.mesh;
98
+ const repoRoot = typeof opts.repoRoot === 'string' && opts.repoRoot ? opts.repoRoot : workspace;
99
+
100
+ const meshJson = loadRepoMeshJsonConfig(workspace);
101
+
102
+ return {
103
+ coordinator: meshJson.config?.coordinator,
104
+ operatingNotes: meshJson.config?.operatingNotes,
105
+ limits: meshJson.config?.limits,
106
+ meshJson,
107
+ refine: loadMeshRefineConfig(mesh, workspace),
108
+ worktreeBootstrap: loadMeshWorktreeBootstrapConfig(mesh, workspace),
109
+ changeImpact: loadChangeImpactConfig(repoRoot),
110
+ };
111
+ }