@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,163 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ import { existsSync, readFileSync } from 'node:fs';
3
+ import { resolve } from 'node:path';
4
+
5
+ export type PreviewFreshnessStatus = 'fresh' | 'stale' | 'unknown' | 'not_configured';
6
+
7
+ export interface PreviewFreshness {
8
+ status: PreviewFreshnessStatus;
9
+ lastPreviewCommit: string | null;
10
+ currentMainCommit: string | null;
11
+ currentMainCommitSource: 'origin/main' | 'HEAD' | 'unknown';
12
+ recordPath: string;
13
+ lastDeployedAt?: string;
14
+ lastTarget?: string;
15
+ previewVersion?: string;
16
+ targets: Record<'npm' | 'server' | 'web', {
17
+ commit: string | null;
18
+ deployedAt?: string;
19
+ status: PreviewFreshnessStatus;
20
+ }>;
21
+ nextAction: string;
22
+ }
23
+
24
+ const PREVIEW_DEPLOY_RECORD = '.adhdev/preview-deploy.json';
25
+
26
+ // Repo-relative driver scripts that indicate this repository actually ships the
27
+ // preview-deploy pipeline. Presence of any one of these (or the deploy record,
28
+ // or a `deploy:preview` npm script) means the private release-pipeline guidance
29
+ // carried by buildPreviewFreshness is relevant here. In every other repo the
30
+ // pipeline is not configured and the guidance must NOT leak (F15).
31
+ const PREVIEW_PIPELINE_SCRIPTS = [
32
+ 'scripts/preview-freshness.mjs',
33
+ 'scripts/smoke-preview-web.mjs',
34
+ 'scripts/deploy-preview-local.mjs',
35
+ ] as const;
36
+
37
+ function hasDeployPreviewNpmScript(repoRoot: string): boolean {
38
+ const pkgPath = resolve(repoRoot, 'package.json');
39
+ if (!existsSync(pkgPath)) return false;
40
+ try {
41
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as { scripts?: Record<string, unknown> };
42
+ return typeof pkg?.scripts?.['deploy:preview'] === 'string';
43
+ } catch {
44
+ return false;
45
+ }
46
+ }
47
+
48
+ /**
49
+ * Gate: does this repository actually configure the preview-deploy pipeline?
50
+ *
51
+ * The preview-freshness surface embeds this project's private release-pipeline
52
+ * instructions (`npm run deploy:preview`, smoke preview, …). Those are only
53
+ * meaningful in a repo that ships the pipeline. An external repo joined to a
54
+ * mesh must not have that guidance leak into its coordinator prompt, so this
55
+ * gate keeps the surface off unless a concrete pipeline artifact is present.
56
+ */
57
+ export function isPreviewPipelineConfigured(repoRoot: string): boolean {
58
+ // Strongest signal: the repo has produced a preview-deploy record before.
59
+ if (existsSync(resolve(repoRoot, PREVIEW_DEPLOY_RECORD))) return true;
60
+ // Otherwise the pipeline's own driver scripts are enough.
61
+ if (PREVIEW_PIPELINE_SCRIPTS.some((rel) => existsSync(resolve(repoRoot, rel)))) return true;
62
+ // Or the `deploy:preview` npm script that fronts the pipeline.
63
+ return hasDeployPreviewNpmScript(repoRoot);
64
+ }
65
+
66
+ function runGit(repoRoot: string, args: readonly string[]): string {
67
+ try {
68
+ return execFileSync('git', args, {
69
+ cwd: repoRoot,
70
+ encoding: 'utf8',
71
+ stdio: ['ignore', 'pipe', 'ignore'],
72
+ timeout: 5000,
73
+ }).trim();
74
+ } catch {
75
+ return '';
76
+ }
77
+ }
78
+
79
+ function readRecord(repoRoot: string): Record<string, unknown> | null {
80
+ const path = resolve(repoRoot, PREVIEW_DEPLOY_RECORD);
81
+ if (!existsSync(path)) return null;
82
+ try {
83
+ const parsed = JSON.parse(readFileSync(path, 'utf8'));
84
+ return parsed && typeof parsed === 'object' && !Array.isArray(parsed)
85
+ ? parsed as Record<string, unknown>
86
+ : null;
87
+ } catch {
88
+ return null;
89
+ }
90
+ }
91
+
92
+ function normalizeCommit(value: unknown): string | null {
93
+ return typeof value === 'string' && /^[0-9a-f]{7,40}$/i.test(value.trim())
94
+ ? value.trim()
95
+ : null;
96
+ }
97
+
98
+ function readTargetFreshness(record: Record<string, unknown> | null, currentCommit: string | null): PreviewFreshness['targets'] {
99
+ const targets = record?.targets && typeof record.targets === 'object' && !Array.isArray(record.targets)
100
+ ? record.targets as Record<string, unknown>
101
+ : {};
102
+ const result = {} as PreviewFreshness['targets'];
103
+ for (const targetName of ['npm', 'server', 'web'] as const) {
104
+ const targetRecord = targets[targetName] && typeof targets[targetName] === 'object' && !Array.isArray(targets[targetName])
105
+ ? targets[targetName] as Record<string, unknown>
106
+ : {};
107
+ const commit = normalizeCommit(targetRecord.commit);
108
+ result[targetName] = {
109
+ commit,
110
+ deployedAt: typeof targetRecord.deployedAt === 'string' ? targetRecord.deployedAt : undefined,
111
+ status: commit && currentCommit ? (commit === currentCommit ? 'fresh' : 'stale') : 'unknown',
112
+ };
113
+ }
114
+ return result;
115
+ }
116
+
117
+ function readCurrentMainCommit(repoRoot: string): Pick<PreviewFreshness, 'currentMainCommit' | 'currentMainCommitSource'> {
118
+ const originMain = runGit(repoRoot, ['rev-parse', '--verify', 'origin/main^{commit}']);
119
+ if (originMain) {
120
+ return { currentMainCommit: originMain, currentMainCommitSource: 'origin/main' };
121
+ }
122
+ const head = runGit(repoRoot, ['rev-parse', '--verify', 'HEAD']);
123
+ if (head) {
124
+ return { currentMainCommit: head, currentMainCommitSource: 'HEAD' };
125
+ }
126
+ return { currentMainCommit: null, currentMainCommitSource: 'unknown' };
127
+ }
128
+
129
+ export function buildPreviewFreshness(repoRoot: string): PreviewFreshness | null {
130
+ // F15 gate: only surface preview-freshness (and its private pipeline
131
+ // guidance) in repos that actually configure the preview-deploy pipeline.
132
+ // Unconfigured repos return null so the caller omits the field entirely.
133
+ if (!isPreviewPipelineConfigured(repoRoot)) return null;
134
+
135
+ const current = readCurrentMainCommit(repoRoot);
136
+ const record = readRecord(repoRoot);
137
+ const lastPreviewCommit = normalizeCommit(record?.lastPreviewCommit);
138
+ const targets = readTargetFreshness(record, current.currentMainCommit);
139
+ let status: PreviewFreshnessStatus = 'unknown';
140
+ let nextAction = 'Run npm run deploy:preview from the current main commit, then smoke preview.';
141
+
142
+ if (lastPreviewCommit && current.currentMainCommit) {
143
+ status = lastPreviewCommit === current.currentMainCommit ? 'fresh' : 'stale';
144
+ nextAction = status === 'fresh'
145
+ ? 'No preview deploy action needed.'
146
+ : 'Run npm run deploy:preview from origin/main, then smoke preview.';
147
+ } else if (!current.currentMainCommit) {
148
+ nextAction = 'Resolve the current main commit before judging preview freshness.';
149
+ }
150
+
151
+ return {
152
+ status,
153
+ lastPreviewCommit,
154
+ currentMainCommit: current.currentMainCommit,
155
+ currentMainCommitSource: current.currentMainCommitSource,
156
+ recordPath: PREVIEW_DEPLOY_RECORD,
157
+ lastDeployedAt: typeof record?.updatedAt === 'string' ? record.updatedAt : undefined,
158
+ lastTarget: typeof record?.target === 'string' ? record.target : undefined,
159
+ previewVersion: typeof record?.previewVersion === 'string' ? record.previewVersion : undefined,
160
+ targets,
161
+ nextAction,
162
+ };
163
+ }
@@ -13,13 +13,36 @@ export interface RepoMeshRefineValidationCommandConfig {
13
13
  category?: MeshRefineValidationCategory;
14
14
  cwd?: string;
15
15
  timeoutMs?: number;
16
+ outputLimitBytes?: number;
16
17
  env?: Record<string, string>;
17
18
  }
18
19
 
19
20
  export interface RepoMeshRefineConfig {
20
21
  version: 1;
22
+ /**
23
+ * Narrow Refinery opt-in for monorepos with submodule gitlinks.
24
+ * When true, Refinery may non-force publish unreachable submodule gitlink
25
+ * commits to the submodule remote main branch after validation and
26
+ * patch-equivalence pass, then verify remote-main reachability.
27
+ */
28
+ allowAutoPublishSubmoduleMainCommits?: boolean;
21
29
  validation?: {
22
30
  required?: boolean;
31
+ /**
32
+ * M2-2 (v2): how Refinery sources its bootstrap stage.
33
+ * 'inherit' (default) — consume the worktree_bootstrap config/state:
34
+ * skip when the node's bootstrap is 'ready' (staleInputs unchanged),
35
+ * run the worktree_bootstrap definition when stale/never-ran.
36
+ * 'skip' — no bootstrap stage at all (validation commands run as-is).
37
+ */
38
+ bootstrap?: 'inherit' | 'skip';
39
+ /**
40
+ * DEPRECATED (M2-2): define bootstrap once in
41
+ * .adhdev/worktree_bootstrap.json instead. Still honored when no
42
+ * worktree_bootstrap config exists, with a deprecation warning; when
43
+ * both exist the worktree_bootstrap config wins.
44
+ */
45
+ bootstrapCommands?: RepoMeshRefineValidationCommandConfig[];
23
46
  commands?: RepoMeshRefineValidationCommandConfig[];
24
47
  };
25
48
  }
@@ -32,6 +55,7 @@ export interface MeshRefineValidationCommandPlan {
32
55
  source: string;
33
56
  cwd?: string;
34
57
  timeoutMs?: number;
58
+ outputLimitBytes?: number;
35
59
  env?: Record<string, string>;
36
60
  }
37
61
 
@@ -46,8 +70,13 @@ export interface MeshRefineConfigLoadResult {
46
70
  export interface MeshRefineValidationPlan {
47
71
  source: string;
48
72
  sourceType: MeshRefineConfigLoadResult['sourceType'];
73
+ /** M2-2: how the bootstrap stage is sourced ('inherit' consumes worktree_bootstrap; 'skip' disables it). */
74
+ bootstrapMode: 'inherit' | 'skip';
75
+ bootstrapCommands: MeshRefineValidationCommandPlan[];
49
76
  commands: MeshRefineValidationCommandPlan[];
50
77
  rejectedCommands: Array<Record<string, unknown>>;
78
+ /** M2-2: deprecation notices (e.g. validation.bootstrapCommands present). */
79
+ deprecationWarnings: string[];
51
80
  suggestions: RepoMeshRefineValidationCommandConfig[];
52
81
  suggestedConfig?: RepoMeshRefineConfig;
53
82
  unavailableReason?: string;
@@ -73,11 +102,21 @@ export const MESH_REFINE_CONFIG_SCHEMA = {
73
102
  required: ['version'],
74
103
  properties: {
75
104
  version: { const: 1 },
105
+ allowAutoPublishSubmoduleMainCommits: {
106
+ type: 'boolean',
107
+ default: false,
108
+ description: 'When true, Refinery may non-force publish submodule gitlink commits referenced by the refined root tree to each submodule origin/main after validation and patch-equivalence pass, then verify reachability.',
109
+ },
76
110
  validation: {
77
111
  type: 'object',
78
112
  additionalProperties: false,
79
113
  properties: {
80
114
  required: { type: 'boolean', default: true },
115
+ bootstrap: {
116
+ enum: ['inherit', 'skip'],
117
+ default: 'inherit',
118
+ description: "M2-2 (v2): 'inherit' consumes the worktree_bootstrap config/state (skip when ready, rerun when stale); 'skip' disables the bootstrap stage entirely.",
119
+ },
81
120
  commands: {
82
121
  type: 'array',
83
122
  minItems: 1,
@@ -92,6 +131,26 @@ export const MESH_REFINE_CONFIG_SCHEMA = {
92
131
  category: { enum: [...MESH_REFINE_VALIDATION_CATEGORIES, 'custom'] },
93
132
  cwd: { type: 'string' },
94
133
  timeoutMs: { type: 'number', minimum: 1000, maximum: 600000 },
134
+ outputLimitBytes: { type: 'number', minimum: 1024, maximum: 1048576 },
135
+ env: { type: 'object', additionalProperties: { type: 'string' } },
136
+ },
137
+ },
138
+ },
139
+ bootstrapCommands: {
140
+ type: 'array',
141
+ maxItems: 4,
142
+ description: 'DEPRECATED: define bootstrap once in .adhdev/worktree_bootstrap.json. Honored only when no worktree_bootstrap config exists (with a deprecation warning); worktree_bootstrap wins when both exist.',
143
+ items: {
144
+ type: 'object',
145
+ additionalProperties: false,
146
+ required: ['command'],
147
+ properties: {
148
+ command: { type: 'string', minLength: 1 },
149
+ args: { type: 'array', items: { type: 'string' } },
150
+ category: { enum: [...MESH_REFINE_VALIDATION_CATEGORIES, 'custom'] },
151
+ cwd: { type: 'string' },
152
+ timeoutMs: { type: 'number', minimum: 1000, maximum: 600000 },
153
+ outputLimitBytes: { type: 'number', minimum: 1024, maximum: 1048576 },
95
154
  env: { type: 'object', additionalProperties: { type: 'string' } },
96
155
  },
97
156
  },
@@ -101,19 +160,39 @@ export const MESH_REFINE_CONFIG_SCHEMA = {
101
160
  },
102
161
  } as const;
103
162
 
104
- function isRecord(value: unknown): value is Record<string, unknown> {
163
+ export function isMeshConfigRecord(value: unknown): value is Record<string, unknown> {
105
164
  return !!value && typeof value === 'object' && !Array.isArray(value);
106
165
  }
107
166
 
108
- function tokenizeCommandString(command: string): string[] | null {
167
+ // True shell metacharacters never allowed anywhere in a config command, on
168
+ // any platform. Note: backslash is deliberately NOT in this set; it is handled
169
+ // separately (allowed only in the win32 executable token).
170
+ const SHELL_METACHAR_RE = /[;&|<>`$\n\r'"]/;
171
+ // Per-token allowlist for argument tokens and non-win32 executable tokens.
172
+ const SAFE_TOKEN_RE = /^[A-Za-z0-9_@./:=+-]+$/;
173
+ // Executable token on win32: same as SAFE_TOKEN_RE but also permits backslash so
174
+ // an absolute path like C:\Users\me\AppData\Roaming\npm\npm.cmd is accepted.
175
+ const SAFE_WIN32_EXEC_TOKEN_RE = /^[A-Za-z0-9_@./:=+\\-]+$/;
176
+
177
+ export function tokenizeCommandString(command: string): string[] | null {
109
178
  const trimmed = command.trim();
110
179
  if (!trimmed) return null;
111
180
  // Explicit config may name any executable, but the Refinery never invokes a shell.
112
181
  // Reject shell syntax, quotes and substitutions so config cannot smuggle a compound command.
113
- if (/[;&|<>`$\\\n\r'\"]/.test(trimmed)) return null;
182
+ // Backslash is the one exception (handled per-token below): rejecting it here
183
+ // would block legitimate win32 absolute .cmd paths, but it is never a shell
184
+ // metacharacter in the no-shell execFile boundary we run under.
185
+ if (SHELL_METACHAR_RE.test(trimmed)) return null;
114
186
  const tokens = trimmed.split(/\s+/).filter(Boolean);
115
187
  if (!tokens.length) return null;
116
- if (tokens.some(token => !/^[A-Za-z0-9_@./:=+-]+$/.test(token))) return null;
188
+ const isWin32 = process.platform === 'win32';
189
+ for (let i = 0; i < tokens.length; i++) {
190
+ // Backslash is permitted ONLY in the executable (first) token, ONLY on
191
+ // win32. Every other token (and all tokens off win32) uses the strict
192
+ // allowlist with no backslash.
193
+ const re = (isWin32 && i === 0) ? SAFE_WIN32_EXEC_TOKEN_RE : SAFE_TOKEN_RE;
194
+ if (!re.test(tokens[i])) return null;
195
+ }
117
196
  return tokens;
118
197
  }
119
198
 
@@ -123,8 +202,8 @@ function validateCategory(value: unknown): MeshRefineValidationCategory | 'custo
123
202
  : 'custom';
124
203
  }
125
204
 
126
- function normalizeCommandConfig(entry: unknown, source: string): { command?: MeshRefineValidationCommandPlan; rejected?: Record<string, unknown> } {
127
- if (!isRecord(entry) || typeof entry.command !== 'string') {
205
+ export function normalizeMeshCommandConfig(entry: unknown, source: string): { command?: MeshRefineValidationCommandPlan; rejected?: Record<string, unknown> } {
206
+ if (!isMeshConfigRecord(entry) || typeof entry.command !== 'string') {
128
207
  return { rejected: { source, reason: 'validation command must be an object with a command string' } };
129
208
  }
130
209
 
@@ -154,7 +233,10 @@ function normalizeCommandConfig(entry: unknown, source: string): { command?: Mes
154
233
  if (entry.timeoutMs !== undefined && (typeof entry.timeoutMs !== 'number' || !Number.isFinite(entry.timeoutMs) || entry.timeoutMs < 1000 || entry.timeoutMs > 600000)) {
155
234
  return { rejected: { source, command: commandText, reason: 'timeoutMs must be between 1000 and 600000' } };
156
235
  }
157
- if (entry.env !== undefined && (!isRecord(entry.env) || !Object.values(entry.env).every(value => typeof value === 'string'))) {
236
+ if (entry.outputLimitBytes !== undefined && (typeof entry.outputLimitBytes !== 'number' || !Number.isFinite(entry.outputLimitBytes) || entry.outputLimitBytes < 1024 || entry.outputLimitBytes > 1048576)) {
237
+ return { rejected: { source, command: commandText, reason: 'outputLimitBytes must be between 1024 and 1048576' } };
238
+ }
239
+ if (entry.env !== undefined && (!isMeshConfigRecord(entry.env) || !Object.values(entry.env).every(value => typeof value === 'string'))) {
158
240
  return { rejected: { source, command: commandText, reason: 'env must be an object of string values' } };
159
241
  }
160
242
 
@@ -167,31 +249,60 @@ function normalizeCommandConfig(entry: unknown, source: string): { command?: Mes
167
249
  source,
168
250
  ...(typeof entry.cwd === 'string' && entry.cwd.trim() ? { cwd: entry.cwd.trim() } : {}),
169
251
  ...(typeof entry.timeoutMs === 'number' ? { timeoutMs: entry.timeoutMs } : {}),
170
- ...(isRecord(entry.env) ? { env: entry.env as Record<string, string> } : {}),
252
+ ...(typeof entry.outputLimitBytes === 'number' ? { outputLimitBytes: entry.outputLimitBytes } : {}),
253
+ ...(isMeshConfigRecord(entry.env) ? { env: entry.env as Record<string, string> } : {}),
171
254
  },
172
255
  };
173
256
  }
174
257
 
175
- export function validateMeshRefineConfig(config: unknown, source = 'inline'): { valid: boolean; errors: string[]; commands: MeshRefineValidationCommandPlan[]; rejectedCommands: Array<Record<string, unknown>> } {
258
+ const isRecord = isMeshConfigRecord;
259
+
260
+ export function validateMeshRefineConfig(config: unknown, source = 'inline'): { valid: boolean; errors: string[]; bootstrapCommands: MeshRefineValidationCommandPlan[]; commands: MeshRefineValidationCommandPlan[]; rejectedCommands: Array<Record<string, unknown>>; bootstrapMode: 'inherit' | 'skip'; deprecationWarnings: string[] } {
176
261
  const errors: string[] = [];
262
+ const bootstrapCommands: MeshRefineValidationCommandPlan[] = [];
177
263
  const commands: MeshRefineValidationCommandPlan[] = [];
178
264
  const rejectedCommands: Array<Record<string, unknown>> = [];
265
+ const deprecationWarnings: string[] = [];
266
+ let bootstrapMode: 'inherit' | 'skip' = 'inherit';
179
267
 
180
- if (!isRecord(config)) return { valid: false, errors: ['config must be an object'], commands, rejectedCommands };
268
+ if (!isRecord(config)) return { valid: false, errors: ['config must be an object'], bootstrapCommands, commands, rejectedCommands, bootstrapMode, deprecationWarnings };
181
269
  if (config.version !== 1) errors.push('version must be 1');
270
+ if (config.allowAutoPublishSubmoduleMainCommits !== undefined && typeof config.allowAutoPublishSubmoduleMainCommits !== 'boolean') {
271
+ errors.push('allowAutoPublishSubmoduleMainCommits must be a boolean when provided');
272
+ }
182
273
  const validation = config.validation;
183
274
  if (validation !== undefined && !isRecord(validation)) errors.push('validation must be an object');
275
+ const rawBootstrapMode = isRecord(validation) ? validation.bootstrap : undefined;
276
+ if (rawBootstrapMode !== undefined) {
277
+ if (rawBootstrapMode === 'inherit' || rawBootstrapMode === 'skip') {
278
+ bootstrapMode = rawBootstrapMode;
279
+ } else {
280
+ errors.push("validation.bootstrap must be 'inherit' or 'skip' when provided");
281
+ }
282
+ }
184
283
  const rawCommands = isRecord(validation) ? validation.commands : undefined;
284
+ const rawBootstrapCommands = isRecord(validation) ? validation.bootstrapCommands : undefined;
185
285
  if (rawCommands !== undefined && !Array.isArray(rawCommands)) errors.push('validation.commands must be an array');
286
+ if (rawBootstrapCommands !== undefined && !Array.isArray(rawBootstrapCommands)) errors.push('validation.bootstrapCommands must be an array');
287
+ if (Array.isArray(rawBootstrapCommands) && rawBootstrapCommands.length > 0) {
288
+ deprecationWarnings.push('validation.bootstrapCommands is deprecated: define bootstrap once in .adhdev/worktree_bootstrap.json. It still runs when no worktree_bootstrap config exists; when both exist the worktree_bootstrap config wins.');
289
+ }
290
+ if (Array.isArray(rawBootstrapCommands)) {
291
+ rawBootstrapCommands.forEach((entry, index) => {
292
+ const normalized = normalizeMeshCommandConfig(entry, `${source}:validation.bootstrapCommands[${index}]`);
293
+ if (normalized.command) bootstrapCommands.push(normalized.command);
294
+ if (normalized.rejected) rejectedCommands.push(normalized.rejected);
295
+ });
296
+ }
186
297
  if (Array.isArray(rawCommands)) {
187
298
  rawCommands.forEach((entry, index) => {
188
- const normalized = normalizeCommandConfig(entry, `${source}:validation.commands[${index}]`);
299
+ const normalized = normalizeMeshCommandConfig(entry, `${source}:validation.commands[${index}]`);
189
300
  if (normalized.command) commands.push(normalized.command);
190
301
  if (normalized.rejected) rejectedCommands.push(normalized.rejected);
191
302
  });
192
303
  }
193
304
  if (rejectedCommands.length) errors.push('one or more validation commands are invalid');
194
- return { valid: errors.length === 0, errors, commands, rejectedCommands };
305
+ return { valid: errors.length === 0, errors, bootstrapCommands, commands, rejectedCommands, bootstrapMode, deprecationWarnings };
195
306
  }
196
307
 
197
308
  function parseConfigText(path: string, text: string): unknown {
@@ -285,8 +396,11 @@ export function resolveMeshRefineValidationPlan(mesh: any, workspace: string): M
285
396
  return {
286
397
  source: loaded.source,
287
398
  sourceType: loaded.sourceType,
399
+ bootstrapMode: 'inherit',
400
+ bootstrapCommands: [],
288
401
  commands: [],
289
402
  rejectedCommands: loaded.error ? [{ source: loaded.source, reason: loaded.error }] : [],
403
+ deprecationWarnings: [],
290
404
  suggestions: suggestion.suggestions,
291
405
  suggestedConfig: suggestion.suggestedConfig,
292
406
  unavailableReason: loaded.error || 'validation_unavailable: repo mesh/refine config missing',
@@ -297,8 +411,11 @@ export function resolveMeshRefineValidationPlan(mesh: any, workspace: string): M
297
411
  return {
298
412
  source: loaded.path || loaded.source,
299
413
  sourceType: loaded.sourceType,
414
+ bootstrapMode: validation.bootstrapMode,
415
+ bootstrapCommands: validation.bootstrapCommands,
300
416
  commands: validation.commands,
301
417
  rejectedCommands: validation.rejectedCommands,
418
+ deprecationWarnings: validation.deprecationWarnings,
302
419
  suggestions: suggestion.suggestions,
303
420
  suggestedConfig: suggestion.suggestedConfig,
304
421
  unavailableReason: validation.commands.length ? undefined : 'validation_unavailable: repo mesh/refine config has no validation.commands',