@adhdev/daemon-core 0.9.82-rc.43 → 0.9.82-rc.430

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 (425) 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 +200 -0
  10. package/dist/cli-adapters/provider-cli-adapter.d.ts +126 -64
  11. package/dist/cli-adapters/provider-cli-parse.d.ts +5 -0
  12. package/dist/cli-adapters/provider-cli-runtime.d.ts +34 -0
  13. package/dist/cli-adapters/provider-cli-shared.d.ts +74 -0
  14. package/dist/cli-adapters/pty-write-chunking.d.ts +34 -0
  15. package/dist/cli-adapters/raw-terminal-io.d.ts +37 -0
  16. package/dist/cli-adapters/resolve-executable.d.ts +69 -0
  17. package/dist/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +6 -3
  18. package/dist/cli-adapters/terminal-backends/types.d.ts +10 -2
  19. package/dist/cli-adapters/terminal-screen.d.ts +4 -11
  20. package/dist/commands/chat-commands-debug-bundle.d.ts +14 -0
  21. package/dist/commands/chat-commands-read.d.ts +7 -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 +15 -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 +60 -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 +29 -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 +142 -0
  54. package/dist/commands/mesh-coordinator.d.ts +85 -1
  55. package/dist/commands/router.d.ts +276 -2
  56. package/dist/commands/upgrade-helper.d.ts +41 -1
  57. package/dist/config/chat-history.d.ts +9 -0
  58. package/dist/config/config.d.ts +5 -0
  59. package/dist/config/mesh-config.d.ts +100 -1
  60. package/dist/config/mesh-json-config.d.ts +199 -0
  61. package/dist/config/repo-settings.d.ts +77 -0
  62. package/dist/daemon/dev-server.d.ts +0 -2
  63. package/dist/detection/ide-detector.d.ts +13 -0
  64. package/dist/detection/win32-ide-version.d.ts +37 -0
  65. package/dist/git/change-impact-config.d.ts +159 -0
  66. package/dist/git/git-commands.d.ts +11 -1
  67. package/dist/git/git-diff.d.ts +6 -0
  68. package/dist/git/git-executor.d.ts +11 -0
  69. package/dist/git/git-status.d.ts +57 -0
  70. package/dist/git/git-types.d.ts +2 -50
  71. package/dist/git/git-worktree.d.ts +71 -1
  72. package/dist/git/index.d.ts +3 -1
  73. package/dist/index.d.ts +64 -14
  74. package/dist/index.js +49391 -19228
  75. package/dist/index.js.map +1 -1
  76. package/dist/index.mjs +48574 -18570
  77. package/dist/index.mjs.map +1 -1
  78. package/dist/installer.d.ts +1 -4
  79. package/dist/ipc/local-ipc-server.d.ts +91 -0
  80. package/dist/launch.d.ts +1 -1
  81. package/dist/logging/async-batch-writer.d.ts +10 -0
  82. package/dist/logging/log-redactor.d.ts +24 -0
  83. package/dist/logging/log-tail-reader.d.ts +81 -0
  84. package/dist/logging/logger.d.ts +1 -1
  85. package/dist/mesh/contracts.d.ts +164 -0
  86. package/dist/mesh/coordinator-prompt.d.ts +89 -0
  87. package/dist/mesh/coordinator-registry.d.ts +59 -0
  88. package/dist/mesh/mesh-active-work.d.ts +174 -0
  89. package/dist/mesh/mesh-clone-grace.d.ts +8 -0
  90. package/dist/mesh/mesh-coordinator-config.d.ts +21 -0
  91. package/dist/mesh/mesh-delivery-policy.d.ts +131 -0
  92. package/dist/mesh/mesh-event-classify.d.ts +5 -0
  93. package/dist/mesh/mesh-event-forwarding.d.ts +41 -0
  94. package/dist/mesh/mesh-event-trace.d.ts +21 -0
  95. package/dist/mesh/mesh-events-coordinator.d.ts +4 -0
  96. package/dist/mesh/mesh-events-pending.d.ts +69 -0
  97. package/dist/mesh/mesh-events-stale.d.ts +61 -0
  98. package/dist/mesh/mesh-events-utils.d.ts +75 -0
  99. package/dist/mesh/mesh-events.d.ts +6 -49
  100. package/dist/mesh/mesh-fast-forward.d.ts +81 -0
  101. package/dist/mesh/mesh-host-ownership.d.ts +9 -0
  102. package/dist/mesh/mesh-init.d.ts +86 -0
  103. package/dist/mesh/mesh-ledger-reconciliation.d.ts +23 -4
  104. package/dist/mesh/mesh-ledger.d.ts +77 -1
  105. package/dist/mesh/mesh-magi-status.d.ts +63 -0
  106. package/dist/mesh/mesh-missions.d.ts +189 -0
  107. package/dist/mesh/mesh-node-identity.d.ts +289 -0
  108. package/dist/mesh/mesh-queue-assignment.d.ts +113 -0
  109. package/dist/mesh/mesh-reconcile-loop.d.ts +65 -0
  110. package/dist/mesh/mesh-refine-batch.d.ts +68 -0
  111. package/dist/mesh/mesh-refine-gates.d.ts +428 -0
  112. package/dist/mesh/mesh-refine-status.d.ts +62 -0
  113. package/dist/mesh/mesh-review-inbox.d.ts +90 -0
  114. package/dist/mesh/mesh-routing.d.ts +70 -0
  115. package/dist/mesh/mesh-runtime-store.d.ts +450 -0
  116. package/dist/mesh/mesh-scheduling-runtime.d.ts +78 -0
  117. package/dist/mesh/mesh-task-inflight.d.ts +46 -0
  118. package/dist/mesh/mesh-task-stats.d.ts +49 -0
  119. package/dist/mesh/mesh-unresolved-forward-outbox.d.ts +30 -0
  120. package/dist/mesh/mesh-warmup-deadline.d.ts +68 -0
  121. package/dist/mesh/mesh-work-queue.d.ts +290 -5
  122. package/dist/mesh/preview-freshness.d.ts +18 -0
  123. package/dist/mesh/refine-config.d.ts +216 -0
  124. package/dist/mesh/worktree-bootstrap-config.d.ts +145 -0
  125. package/dist/providers/acp-provider-instance.d.ts +5 -0
  126. package/dist/providers/approval-utils.d.ts +20 -0
  127. package/dist/providers/chat-message-normalization.d.ts +31 -1
  128. package/dist/providers/cli-provider-instance.d.ts +221 -3
  129. package/dist/providers/contracts.d.ts +139 -6
  130. package/dist/providers/external-sources.d.ts +71 -0
  131. package/dist/providers/manual-attendance.d.ts +63 -0
  132. package/dist/providers/native-history/antigravity-cli-transcript.d.ts +100 -0
  133. package/dist/providers/native-history/claude-cli-transcript.d.ts +70 -0
  134. package/dist/providers/native-history/codex-cli-transcript.d.ts +73 -0
  135. package/dist/providers/native-history/constants.d.ts +12 -0
  136. package/dist/providers/native-history/dispatcher.d.ts +27 -0
  137. package/dist/providers/native-history/hermes-cli-transcript.d.ts +30 -0
  138. package/dist/providers/native-history/index.d.ts +13 -0
  139. package/dist/providers/provider-instance-manager.d.ts +29 -0
  140. package/dist/providers/provider-instance.d.ts +23 -1
  141. package/dist/providers/provider-loader.d.ts +26 -4
  142. package/dist/providers/provider-trust.d.ts +31 -0
  143. package/dist/providers/read-chat-contract.d.ts +29 -0
  144. package/dist/providers/sdk/v1/builders/acp/detect-status.d.ts +68 -0
  145. package/dist/providers/sdk/v1/builders/cli/detect-status.d.ts +86 -0
  146. package/dist/providers/sdk/v1/builders/cli/parse-approval-squash.d.ts +59 -0
  147. package/dist/providers/sdk/v1/builders/cli/parse-approval.d.ts +65 -0
  148. package/dist/providers/sdk/v1/builders/cli/parse-session.d.ts +91 -0
  149. package/dist/providers/sdk/v1/builders/cli/visible-region.d.ts +42 -0
  150. package/dist/providers/sdk/v1/fixture-tooling/format.d.ts +126 -0
  151. package/dist/providers/sdk/v1/fixture-tooling/index.d.ts +8 -0
  152. package/dist/providers/sdk/v1/fixture-tooling/replay.d.ts +38 -0
  153. package/dist/providers/sdk/v1/index.d.ts +30 -0
  154. package/dist/providers/sdk/v1/sandbox/README-design.d.ts +193 -0
  155. package/dist/providers/sdk/v1/sandbox/require-whitelist.d.ts +74 -0
  156. package/dist/providers/sdk/v1/sandbox/script-runner.d.ts +98 -0
  157. package/dist/providers/sdk/v1/types/cli/index.d.ts +277 -0
  158. package/dist/providers/sdk/v1/types/common/index.d.ts +203 -0
  159. package/dist/providers/sdk/v1/validators/index.d.ts +5 -0
  160. package/dist/providers/sdk/v1/validators/manifest.d.ts +40 -0
  161. package/dist/providers/sdk/v1/validators/taint.d.ts +52 -0
  162. package/dist/providers/spec/adapter.d.ts +91 -0
  163. package/dist/providers/spec/cli-adapter.d.ts +223 -0
  164. package/dist/providers/spec/evaluator.d.ts +45 -0
  165. package/dist/providers/spec/fsm-driver.d.ts +422 -0
  166. package/dist/providers/spec/fsm-evaluator.d.ts +76 -0
  167. package/dist/providers/spec/fsm-loader.d.ts +14 -0
  168. package/dist/providers/spec/fsm-types.d.ts +174 -0
  169. package/dist/providers/spec/native-history-executor.d.ts +41 -0
  170. package/dist/providers/spec/pre-launch-trust.d.ts +16 -0
  171. package/dist/providers/spec/route.d.ts +4 -0
  172. package/dist/providers/spec/types.d.ts +222 -0
  173. package/dist/providers/status-monitor.d.ts +7 -7
  174. package/dist/providers/transcript-v2.d.ts +176 -0
  175. package/dist/providers/types/interactive-prompt.d.ts +84 -0
  176. package/dist/providers/working-dir.d.ts +17 -0
  177. package/dist/repo-mesh-types.d.ts +501 -13
  178. package/dist/runtime-defaults.d.ts +2 -0
  179. package/dist/sessions/registry.d.ts +6 -0
  180. package/dist/shared-types-extra.d.ts +2 -4
  181. package/dist/shared-types.d.ts +59 -2
  182. package/dist/status/normalize.d.ts +1 -1
  183. package/dist/status/normalize.js +1 -0
  184. package/dist/status/normalize.js.map +1 -1
  185. package/dist/status/normalize.mjs +1 -0
  186. package/dist/status/normalize.mjs.map +1 -1
  187. package/dist/status/reporter.d.ts +2 -0
  188. package/dist/status/snapshot.d.ts +26 -0
  189. package/dist/system/hash.d.ts +8 -0
  190. package/dist/system/load-better-sqlite3.d.ts +21 -0
  191. package/dist/types.d.ts +5 -0
  192. package/package.json +7 -3
  193. package/src/agent-stream/poller.ts +2 -3
  194. package/src/agent-stream/provider-adapter.ts +1 -1
  195. package/src/boot/daemon-lifecycle.ts +63 -12
  196. package/src/boot/process-hardening.ts +89 -0
  197. package/src/build-info.ts +73 -0
  198. package/src/chat/source-machine.ts +534 -0
  199. package/src/chat/source-resolver.ts +0 -0
  200. package/src/chat/subscription-updates.ts +20 -1
  201. package/src/cli-adapter-types.d.ts +3 -1
  202. package/src/cli-adapter-types.ts +68 -2
  203. package/src/cli-adapters/cli-script-runner.ts +421 -0
  204. package/src/cli-adapters/cli-state-engine.ts +1246 -0
  205. package/src/cli-adapters/provider-cli-adapter.d.ts +1 -1
  206. package/src/cli-adapters/provider-cli-adapter.ts +914 -1144
  207. package/src/cli-adapters/provider-cli-parse.d.ts +2 -0
  208. package/src/cli-adapters/provider-cli-parse.ts +19 -0
  209. package/src/cli-adapters/provider-cli-runtime.ts +56 -7
  210. package/src/cli-adapters/provider-cli-shared.d.ts +4 -0
  211. package/src/cli-adapters/provider-cli-shared.ts +121 -11
  212. package/src/cli-adapters/pty-transport.ts +2 -1
  213. package/src/cli-adapters/pty-write-chunking.ts +106 -0
  214. package/src/cli-adapters/raw-terminal-io.ts +252 -0
  215. package/src/cli-adapters/resolve-executable.ts +204 -0
  216. package/src/cli-adapters/session-host-transport.ts +2 -1
  217. package/src/cli-adapters/terminal-backends/ghostty-vt-backend.ts +63 -29
  218. package/src/cli-adapters/terminal-backends/types.ts +10 -3
  219. package/src/cli-adapters/terminal-screen.ts +16 -81
  220. package/src/commands/WINDOWS-UPGRADE-LOCK-FAILURE.md +198 -0
  221. package/src/commands/chat-commands-debug-bundle.ts +398 -0
  222. package/src/commands/chat-commands-read.ts +2327 -0
  223. package/src/commands/chat-commands-scope.ts +54 -0
  224. package/src/commands/chat-commands-shared.ts +114 -0
  225. package/src/commands/chat-commands-write.ts +891 -0
  226. package/src/commands/chat-commands.ts +19 -1841
  227. package/src/commands/cli-manager.ts +544 -26
  228. package/src/commands/handler.ts +841 -2
  229. package/src/commands/high-family/index.ts +28 -0
  230. package/src/commands/high-family/mesh-coordinator-launch.ts +678 -0
  231. package/src/commands/high-family/mesh-events.ts +80 -0
  232. package/src/commands/high-family/mesh-status.ts +710 -0
  233. package/src/commands/high-family/types.ts +76 -0
  234. package/src/commands/low-family/coordinator-prompt.ts +72 -0
  235. package/src/commands/low-family/daemon-lifecycle.ts +107 -0
  236. package/src/commands/low-family/diagnostics.ts +57 -0
  237. package/src/commands/low-family/index.ts +37 -0
  238. package/src/commands/low-family/mesh-ledger.ts +62 -0
  239. package/src/commands/low-family/mesh-node-logs.ts +87 -0
  240. package/src/commands/low-family/notification.ts +116 -0
  241. package/src/commands/low-family/refine-config.ts +106 -0
  242. package/src/commands/low-family/session-host.ts +274 -0
  243. package/src/commands/low-family/spec-providerdev.ts +217 -0
  244. package/src/commands/low-family/status-meta.ts +112 -0
  245. package/src/commands/low-family/types.ts +39 -0
  246. package/src/commands/med-family/cli-agent.ts +238 -0
  247. package/src/commands/med-family/fast-forward.ts +230 -0
  248. package/src/commands/med-family/ide.ts +163 -0
  249. package/src/commands/med-family/index.ts +37 -0
  250. package/src/commands/med-family/mesh-crud.ts +1066 -0
  251. package/src/commands/med-family/mesh-host-pairing.ts +234 -0
  252. package/src/commands/med-family/mesh-queue.ts +167 -0
  253. package/src/commands/med-family/mesh-restart.ts +92 -0
  254. package/src/commands/med-family/types.ts +143 -0
  255. package/src/commands/mesh-coordinator.ts +334 -124
  256. package/src/commands/router.ts +2711 -3254
  257. package/src/commands/stream-commands.ts +8 -0
  258. package/src/commands/upgrade-helper.ts +310 -45
  259. package/src/config/chat-history.ts +483 -24
  260. package/src/config/config.ts +12 -0
  261. package/src/config/mesh-config.ts +495 -22
  262. package/src/config/mesh-json-config.ts +376 -0
  263. package/src/config/recent-activity.ts +8 -2
  264. package/src/config/repo-settings.ts +111 -0
  265. package/src/daemon/dev-auto-implement.ts +3 -2
  266. package/src/daemon/dev-cli-debug.ts +10 -1
  267. package/src/daemon/dev-server.ts +0 -541
  268. package/src/detection/cli-detector.ts +28 -9
  269. package/src/detection/ide-detector.ts +55 -16
  270. package/src/detection/win32-ide-version.ts +106 -0
  271. package/src/git/change-impact-config.ts +354 -0
  272. package/src/git/git-commands.ts +59 -15
  273. package/src/git/git-diff.ts +81 -11
  274. package/src/git/git-executor.ts +12 -0
  275. package/src/git/git-status.ts +767 -48
  276. package/src/git/git-types.ts +14 -62
  277. package/src/git/git-worktree.ts +261 -4
  278. package/src/git/index.ts +17 -0
  279. package/src/index.ts +194 -12
  280. package/src/installer.d.ts +1 -1
  281. package/src/installer.ts +8 -6
  282. package/src/ipc/local-ipc-server.ts +278 -0
  283. package/src/launch.d.ts +1 -1
  284. package/src/launch.ts +37 -28
  285. package/src/logging/async-batch-writer.ts +55 -0
  286. package/src/logging/command-log.ts +7 -5
  287. package/src/logging/log-redactor.ts +100 -0
  288. package/src/logging/log-tail-reader.ts +341 -0
  289. package/src/logging/logger.ts +14 -7
  290. package/src/mesh/contracts.ts +338 -0
  291. package/src/mesh/coordinator-prompt.ts +381 -33
  292. package/src/mesh/coordinator-registry.ts +121 -0
  293. package/src/mesh/mesh-active-work.ts +645 -0
  294. package/src/mesh/mesh-clone-grace.ts +68 -0
  295. package/src/mesh/mesh-coordinator-config.ts +97 -0
  296. package/src/mesh/mesh-delivery-policy.ts +315 -0
  297. package/src/mesh/mesh-event-classify.ts +51 -0
  298. package/src/mesh/mesh-event-forwarding.ts +1888 -0
  299. package/src/mesh/mesh-event-trace.ts +67 -0
  300. package/src/mesh/mesh-events-coordinator.ts +32 -0
  301. package/src/mesh/mesh-events-pending.ts +656 -0
  302. package/src/mesh/mesh-events-stale.ts +389 -0
  303. package/src/mesh/mesh-events-utils.ts +443 -0
  304. package/src/mesh/mesh-events.ts +33 -1035
  305. package/src/mesh/mesh-fast-forward.ts +843 -0
  306. package/src/mesh/mesh-host-ownership.ts +73 -0
  307. package/src/mesh/mesh-init.ts +260 -0
  308. package/src/mesh/mesh-ledger-reconciliation.ts +12 -7
  309. package/src/mesh/mesh-ledger.ts +656 -102
  310. package/src/mesh/mesh-magi-status.ts +223 -0
  311. package/src/mesh/mesh-missions.ts +449 -0
  312. package/src/mesh/mesh-node-identity.ts +1887 -0
  313. package/src/mesh/mesh-queue-assignment.ts +1918 -0
  314. package/src/mesh/mesh-reconcile-loop.ts +1780 -0
  315. package/src/mesh/mesh-refine-batch.ts +205 -0
  316. package/src/mesh/mesh-refine-gates.ts +1673 -0
  317. package/src/mesh/mesh-refine-status.ts +231 -0
  318. package/src/mesh/mesh-review-inbox.ts +307 -0
  319. package/src/mesh/mesh-routing.ts +291 -0
  320. package/src/mesh/mesh-runtime-store.ts +1853 -0
  321. package/src/mesh/mesh-scheduling-runtime.ts +198 -0
  322. package/src/mesh/mesh-task-inflight.ts +70 -0
  323. package/src/mesh/mesh-task-stats.ts +161 -0
  324. package/src/mesh/mesh-unresolved-forward-outbox.ts +185 -0
  325. package/src/mesh/mesh-warmup-deadline.ts +152 -0
  326. package/src/mesh/mesh-work-queue.ts +1243 -141
  327. package/src/mesh/preview-freshness.ts +118 -0
  328. package/src/mesh/refine-config.ts +423 -0
  329. package/src/mesh/worktree-bootstrap-config.ts +450 -0
  330. package/src/providers/acp-provider-instance.ts +43 -10
  331. package/src/providers/approval-utils.d.ts +5 -0
  332. package/src/providers/approval-utils.ts +57 -5
  333. package/src/providers/chat-message-normalization.ts +92 -4
  334. package/src/providers/cli-provider-instance.ts +1933 -104
  335. package/src/providers/contracts.d.ts +55 -0
  336. package/src/providers/contracts.ts +150 -6
  337. package/src/providers/extension-provider-instance.ts +12 -7
  338. package/src/providers/external-sources.ts +218 -0
  339. package/src/providers/ide-provider-instance.ts +35 -12
  340. package/src/providers/manual-attendance.ts +85 -0
  341. package/src/providers/native-history/antigravity-cli-transcript.ts +643 -0
  342. package/src/providers/native-history/claude-cli-transcript.ts +396 -0
  343. package/src/providers/native-history/codex-cli-transcript.ts +479 -0
  344. package/src/providers/native-history/constants.ts +19 -0
  345. package/src/providers/native-history/dispatcher.ts +339 -0
  346. package/src/providers/native-history/hermes-cli-transcript.ts +230 -0
  347. package/src/providers/native-history/index.ts +30 -0
  348. package/src/providers/provider-instance-manager.ts +71 -0
  349. package/src/providers/provider-instance.ts +19 -1
  350. package/src/providers/provider-loader.ts +668 -50
  351. package/src/providers/provider-schema.ts +87 -14
  352. package/src/providers/provider-trust.ts +114 -0
  353. package/src/providers/read-chat-contract.ts +76 -16
  354. package/src/providers/sdk/README.md +49 -0
  355. package/src/providers/sdk/v1/builders/acp/detect-status.ts +144 -0
  356. package/src/providers/sdk/v1/builders/cli/detect-status.ts +313 -0
  357. package/src/providers/sdk/v1/builders/cli/parse-approval-squash.ts +158 -0
  358. package/src/providers/sdk/v1/builders/cli/parse-approval.ts +250 -0
  359. package/src/providers/sdk/v1/builders/cli/parse-session.ts +276 -0
  360. package/src/providers/sdk/v1/builders/cli/visible-region.ts +143 -0
  361. package/src/providers/sdk/v1/fixture-tooling/format.ts +130 -0
  362. package/src/providers/sdk/v1/fixture-tooling/index.ts +22 -0
  363. package/src/providers/sdk/v1/fixture-tooling/replay.ts +352 -0
  364. package/src/providers/sdk/v1/index.ts +152 -0
  365. package/src/providers/sdk/v1/sandbox/README-design.ts +195 -0
  366. package/src/providers/sdk/v1/sandbox/require-whitelist.ts +472 -0
  367. package/src/providers/sdk/v1/sandbox/script-runner.ts +150 -0
  368. package/src/providers/sdk/v1/schemas/cli/provider.schema.json +504 -0
  369. package/src/providers/sdk/v1/schemas/primitives/acp-session-protocol-v1.json +131 -0
  370. package/src/providers/sdk/v1/schemas/primitives/native-history-codex-rollout-v1.json +66 -0
  371. package/src/providers/sdk/v1/schemas/primitives/tui-approval-squash-v1.json +91 -0
  372. package/src/providers/sdk/v1/schemas/primitives/tui-assistant-block-v1.json +91 -0
  373. package/src/providers/sdk/v1/schemas/primitives/tui-cue-ordering-v1.json +47 -0
  374. package/src/providers/sdk/v1/schemas/primitives/tui-dispatch-order-v1.json +32 -0
  375. package/src/providers/sdk/v1/schemas/primitives/tui-footer-chrome-v1.json +42 -0
  376. package/src/providers/sdk/v1/schemas/primitives/tui-index-finder-v1.json +27 -0
  377. package/src/providers/sdk/v1/schemas/primitives/tui-modal-v1.json +125 -0
  378. package/src/providers/sdk/v1/schemas/primitives/tui-prompt-marker-v1.json +45 -0
  379. package/src/providers/sdk/v1/schemas/primitives/tui-session-id-extraction-v1.json +46 -0
  380. package/src/providers/sdk/v1/schemas/primitives/tui-settled-prompt-v1.json +71 -0
  381. package/src/providers/sdk/v1/schemas/primitives/tui-spinner-v1.json +83 -0
  382. package/src/providers/sdk/v1/schemas/primitives/tui-transcript-pty-v1.json +83 -0
  383. package/src/providers/sdk/v1/schemas/primitives/tui-visible-region-v1.json +57 -0
  384. package/src/providers/sdk/v1/schemas/primitives/tui-welcome-screen-v1.json +35 -0
  385. package/src/providers/sdk/v1/types/cli/index.ts +365 -0
  386. package/src/providers/sdk/v1/types/common/index.ts +229 -0
  387. package/src/providers/sdk/v1/validators/index.ts +19 -0
  388. package/src/providers/sdk/v1/validators/manifest.ts +110 -0
  389. package/src/providers/sdk/v1/validators/taint.ts +309 -0
  390. package/src/providers/spec/adapter.ts +235 -0
  391. package/src/providers/spec/cli-adapter.ts +1056 -0
  392. package/src/providers/spec/evaluator.ts +407 -0
  393. package/src/providers/spec/fsm-driver.ts +1410 -0
  394. package/src/providers/spec/fsm-evaluator.ts +272 -0
  395. package/src/providers/spec/fsm-loader.ts +120 -0
  396. package/src/providers/spec/fsm-types.ts +273 -0
  397. package/src/providers/spec/native-history-executor.ts +1128 -0
  398. package/src/providers/spec/pre-launch-trust.ts +104 -0
  399. package/src/providers/spec/route.ts +51 -0
  400. package/src/providers/spec/types.ts +262 -0
  401. package/src/providers/status-monitor.d.ts +7 -7
  402. package/src/providers/status-monitor.ts +37 -22
  403. package/src/providers/transcript-v2.ts +567 -0
  404. package/src/providers/types/interactive-prompt.ts +536 -0
  405. package/src/providers/version-archive.ts +64 -24
  406. package/src/providers/working-dir.ts +23 -0
  407. package/src/repo-mesh-types.ts +740 -14
  408. package/src/runtime-defaults.ts +39 -0
  409. package/src/sessions/registry.ts +6 -0
  410. package/src/shared-types-extra.ts +2 -4
  411. package/src/shared-types.d.ts +8 -0
  412. package/src/shared-types.ts +64 -1
  413. package/src/status/builders.ts +26 -6
  414. package/src/status/normalize.ts +2 -0
  415. package/src/status/reporter.ts +19 -1
  416. package/src/status/snapshot.ts +95 -26
  417. package/src/system/hash.ts +23 -0
  418. package/src/system/host-memory.ts +29 -12
  419. package/src/system/load-better-sqlite3.ts +68 -0
  420. package/src/types.ts +5 -0
  421. package/dist/cli-adapters/terminal-backends/xterm-backend.d.ts +0 -17
  422. package/dist/mesh/mesh-sync.d.ts +0 -53
  423. package/src/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +0 -16
  424. package/src/cli-adapters/terminal-backends/xterm-backend.ts +0 -97
  425. package/src/mesh/mesh-sync.ts +0 -111
@@ -0,0 +1,106 @@
1
+ /**
2
+ * RF-ROUTER LOW family — mesh refine-config / change-impact config commands.
3
+ *
4
+ * Schema/validate/suggest endpoints for the repo mesh refine config and the
5
+ * change-impact config. Pure: every handler is a function of args only (it reads
6
+ * no router deps), so ctx is unused. Extracted verbatim from executeDaemonCommand;
7
+ * the config helpers are imported from their source modules, identical to router.ts.
8
+ */
9
+ import {
10
+ CHANGE_IMPACT_CONFIG_LOCATIONS,
11
+ CHANGE_IMPACT_CONFIG_SCHEMA,
12
+ loadChangeImpactConfig,
13
+ suggestChangeImpactConfig,
14
+ validateChangeImpactConfig,
15
+ } from '../../git/change-impact-config.js';
16
+ import {
17
+ MESH_REFINE_CONFIG_LOCATIONS,
18
+ MESH_REFINE_CONFIG_SCHEMA,
19
+ loadMeshRefineConfig,
20
+ suggestMeshRefineConfig,
21
+ validateMeshRefineConfig,
22
+ } from '../../mesh/refine-config.js';
23
+ import {
24
+ MESH_WORKTREE_BOOTSTRAP_CONFIG_LOCATIONS,
25
+ MESH_WORKTREE_BOOTSTRAP_CONFIG_SCHEMA,
26
+ } from '../../mesh/worktree-bootstrap-config.js';
27
+ import type { LowFamilyContext, LowFamilyHandler } from './types.js';
28
+
29
+ export const refineConfigHandlers: Record<string, LowFamilyHandler> = {
30
+ get_mesh_refine_config_schema: async (_ctx: LowFamilyContext, _args: any) => {
31
+ return {
32
+ success: true,
33
+ schema: MESH_REFINE_CONFIG_SCHEMA,
34
+ locations: MESH_REFINE_CONFIG_LOCATIONS,
35
+ worktreeBootstrap: {
36
+ schema: MESH_WORKTREE_BOOTSTRAP_CONFIG_SCHEMA,
37
+ locations: MESH_WORKTREE_BOOTSTRAP_CONFIG_LOCATIONS,
38
+ sourceOfTruth: 'repo worktree bootstrap config',
39
+ runBehavior: 'When present and enabled, clone_mesh_node runs commands after submodule initialization and records status on the worktree node.',
40
+ },
41
+ sourceOfTruth: 'repo mesh/refine config',
42
+ heuristicRole: 'suggestions_only_not_execution_path',
43
+ };
44
+ },
45
+
46
+ validate_mesh_refine_config: async (_ctx: LowFamilyContext, args: any) => {
47
+ const workspace = typeof args?.workspace === 'string' ? args.workspace : process.cwd();
48
+ const mesh = args?.inlineMesh || {};
49
+ const loaded = args?.config !== undefined
50
+ ? { config: args.config, source: 'inline', sourceType: 'mesh_policy' as const }
51
+ : loadMeshRefineConfig(mesh, workspace);
52
+ const validation = loaded.config
53
+ ? validateMeshRefineConfig(loaded.config, loaded.source)
54
+ : { valid: false, errors: [((loaded as { error?: string }).error) || 'repo mesh/refine config unavailable'], commands: [], rejectedCommands: [] };
55
+ return { success: validation.valid, ...loaded, ...validation };
56
+ },
57
+
58
+ suggest_mesh_refine_config: async (_ctx: LowFamilyContext, args: any) => {
59
+ const workspace = typeof args?.workspace === 'string' ? args.workspace : process.cwd();
60
+ const mesh = args?.inlineMesh || {};
61
+ return {
62
+ success: true,
63
+ ...suggestMeshRefineConfig(mesh, workspace),
64
+ note: 'Suggestions are heuristic scaffold only; Refinery will not execute them until saved into repo mesh/refine config.',
65
+ };
66
+ },
67
+
68
+ get_mesh_change_impact_config_schema: async (_ctx: LowFamilyContext, _args: any) => {
69
+ return {
70
+ success: true,
71
+ schema: CHANGE_IMPACT_CONFIG_SCHEMA,
72
+ locations: CHANGE_IMPACT_CONFIG_LOCATIONS,
73
+ sourceOfTruth: 'repo change-impact config',
74
+ heuristicRole: 'suggestions_only_not_execution_path',
75
+ note: 'Declarative config only — JSON/YAML are parsed but never executed. Defines which package/file changes require a daemon rebuild/restart vs. a web-only redeploy vs. nothing.',
76
+ };
77
+ },
78
+
79
+ validate_mesh_change_impact_config: async (_ctx: LowFamilyContext, args: any) => {
80
+ const workspace = typeof args?.workspace === 'string' ? args.workspace : process.cwd();
81
+ if (args?.config !== undefined) {
82
+ const validation = validateChangeImpactConfig(args.config, 'inline');
83
+ return { success: validation.valid, source: 'inline', sourceType: 'mesh_policy', ...validation };
84
+ }
85
+ const loaded = loadChangeImpactConfig(workspace);
86
+ if (loaded.sourceType === 'repo_file') {
87
+ const validation = validateChangeImpactConfig(loaded.config, loaded.source);
88
+ return { success: validation.valid, ...loaded, ...validation };
89
+ }
90
+ return {
91
+ success: false,
92
+ ...loaded,
93
+ valid: false,
94
+ errors: [loaded.error || 'repo change-impact config unavailable'],
95
+ };
96
+ },
97
+
98
+ suggest_mesh_change_impact_config: async (_ctx: LowFamilyContext, args: any) => {
99
+ const workspace = typeof args?.workspace === 'string' ? args.workspace : process.cwd();
100
+ return {
101
+ success: true,
102
+ ...suggestChangeImpactConfig(workspace),
103
+ note: 'Suggestions are heuristic scaffold only; the draft must be reviewed and saved into repo change-impact config before it takes effect. Nothing is executed.',
104
+ };
105
+ },
106
+ };
@@ -0,0 +1,274 @@
1
+ /**
2
+ * RF-ROUTER LOW family — session-host control commands.
3
+ *
4
+ * Extracted verbatim from DaemonCommandRouter.executeDaemonCommand. Each handler
5
+ * reads only ctx.deps.sessionHostControl (+ cliManager for the resume/restart
6
+ * hosted-session restore) and returns the same CommandRouterResult as before.
7
+ * The trace/summarize helpers were `this`-free module functions in router.ts and
8
+ * are relocated here unchanged.
9
+ */
10
+ import type { HostedCliRuntimeDescriptor } from '../cli-manager.js';
11
+ import { recordDebugTrace } from '../../logging/debug-trace.js';
12
+ import { getSessionHostSurfaceKind, partitionSessionHostRecords } from '../../session-host/runtime-surface.js';
13
+ import type { LowFamilyContext, LowFamilyHandler } from './types.js';
14
+
15
+ function toHostedCliRuntimeDescriptor(record: any): HostedCliRuntimeDescriptor | null {
16
+ if (!record || typeof record !== 'object') return null;
17
+ const runtimeId = typeof record.sessionId === 'string' ? record.sessionId : '';
18
+ const cliType = typeof record.providerType === 'string' ? record.providerType : '';
19
+ const workspace = typeof record.workspace === 'string' ? record.workspace : '';
20
+ if (!runtimeId || !cliType || !workspace) return null;
21
+ return {
22
+ runtimeId,
23
+ runtimeKey: typeof record.runtimeKey === 'string' ? record.runtimeKey : undefined,
24
+ displayName: typeof record.displayName === 'string' ? record.displayName : undefined,
25
+ workspaceLabel: typeof record.workspaceLabel === 'string' ? record.workspaceLabel : undefined,
26
+ lifecycle: typeof record.lifecycle === 'string' ? record.lifecycle as HostedCliRuntimeDescriptor['lifecycle'] : undefined,
27
+ recoveryState: typeof record.meta?.runtimeRecoveryState === 'string'
28
+ ? String(record.meta.runtimeRecoveryState)
29
+ : null,
30
+ cliType,
31
+ workspace,
32
+ cliArgs: Array.isArray(record.meta?.cliArgs) ? record.meta.cliArgs as string[] : [],
33
+ providerSessionId: typeof record.meta?.providerSessionId === 'string'
34
+ ? String(record.meta.providerSessionId)
35
+ : undefined,
36
+ };
37
+ }
38
+
39
+ function getWriteConflictOwnerClientId(error: unknown): string | undefined {
40
+ const message = typeof error === 'string'
41
+ ? error
42
+ : error instanceof Error
43
+ ? error.message
44
+ : '';
45
+ const match = /^Write owned by\s+(.+)$/.exec(message.trim());
46
+ return match?.[1]?.trim() || undefined;
47
+ }
48
+
49
+ function summarizeSessionHostRecord(result: unknown): Record<string, unknown> {
50
+ if (!result || typeof result !== 'object') return {};
51
+ const record = result as Record<string, any>;
52
+ return {
53
+ runtimeKey: typeof record.runtimeKey === 'string' ? record.runtimeKey : undefined,
54
+ lifecycle: typeof record.lifecycle === 'string' ? record.lifecycle : undefined,
55
+ surfaceKind: getSessionHostSurfaceKind(record as any),
56
+ attachedClientCount: Array.isArray(record.attachedClients) ? record.attachedClients.length : undefined,
57
+ hasWriteOwner: !!record.writeOwner,
58
+ writeOwnerClientId: typeof record.writeOwner?.clientId === 'string' ? record.writeOwner.clientId : undefined,
59
+ };
60
+ }
61
+
62
+ function summarizeSessionHostRecords(result: unknown): Record<string, unknown> {
63
+ const records = Array.isArray(result) ? result : [];
64
+ const groups = partitionSessionHostRecords(records as any[]);
65
+ return {
66
+ sessionCount: records.length,
67
+ liveRuntimeCount: groups.liveRuntimes.length,
68
+ recoverySnapshotCount: groups.recoverySnapshots.length,
69
+ inactiveRecordCount: groups.inactiveRecords.length,
70
+ };
71
+ }
72
+
73
+ function summarizeSessionHostDiagnostics(result: unknown): Record<string, unknown> {
74
+ const diagnostics = result && typeof result === 'object' ? result as Record<string, any> : {};
75
+ const sessions = Array.isArray(diagnostics.sessions) ? diagnostics.sessions : [];
76
+ return {
77
+ runtimeCount: typeof diagnostics.runtimeCount === 'number' ? diagnostics.runtimeCount : undefined,
78
+ ...summarizeSessionHostRecords(sessions),
79
+ };
80
+ }
81
+
82
+ function summarizeSessionHostPruneResult(result: unknown): Record<string, unknown> {
83
+ const value = result && typeof result === 'object' ? result as Record<string, any> : {};
84
+ return {
85
+ duplicateGroupCount: typeof value.duplicateGroupCount === 'number' ? value.duplicateGroupCount : undefined,
86
+ prunedCount: Array.isArray(value.prunedSessionIds) ? value.prunedSessionIds.length : undefined,
87
+ keptCount: Array.isArray(value.keptSessionIds) ? value.keptSessionIds.length : undefined,
88
+ };
89
+ }
90
+
91
+ async function traceSessionHostAction<T>(
92
+ action: string,
93
+ args: any,
94
+ run: () => Promise<T>,
95
+ summarizeResult?: (result: T) => Record<string, unknown>,
96
+ ): Promise<T> {
97
+ const interactionId = typeof args?._interactionId === 'string' ? args._interactionId : undefined;
98
+ const sessionId = typeof args?.sessionId === 'string' ? args.sessionId : undefined;
99
+ const requestedPayload: Record<string, unknown> = { action };
100
+ if (sessionId) requestedPayload.sessionId = sessionId;
101
+ if (typeof args?.clientId === 'string') requestedPayload.clientId = args.clientId;
102
+ if (typeof args?.signal === 'string') requestedPayload.signal = args.signal;
103
+ if (typeof args?.providerType === 'string') requestedPayload.providerType = args.providerType;
104
+ if (typeof args?.workspace === 'string') requestedPayload.workspace = args.workspace;
105
+ if (typeof args?.dryRun === 'boolean') requestedPayload.dryRun = args.dryRun;
106
+
107
+ recordDebugTrace({
108
+ interactionId,
109
+ category: 'session_host',
110
+ stage: 'action_requested',
111
+ level: 'info',
112
+ sessionId,
113
+ payload: requestedPayload,
114
+ });
115
+
116
+ try {
117
+ const result = await run();
118
+ recordDebugTrace({
119
+ interactionId,
120
+ category: 'session_host',
121
+ stage: 'action_result',
122
+ level: 'info',
123
+ sessionId,
124
+ payload: {
125
+ ...requestedPayload,
126
+ success: true,
127
+ ...(summarizeResult ? summarizeResult(result) : {}),
128
+ },
129
+ });
130
+ return result;
131
+ } catch (error: any) {
132
+ recordDebugTrace({
133
+ interactionId,
134
+ category: 'session_host',
135
+ stage: 'action_failed',
136
+ level: 'error',
137
+ sessionId,
138
+ payload: {
139
+ ...requestedPayload,
140
+ error: error?.message || String(error),
141
+ failureKind: getWriteConflictOwnerClientId(error) ? 'write_conflict' : 'request_failed',
142
+ conflictOwnerClientId: getWriteConflictOwnerClientId(error),
143
+ },
144
+ });
145
+ throw error;
146
+ }
147
+ }
148
+
149
+ export const sessionHostHandlers: Record<string, LowFamilyHandler> = {
150
+ session_host_get_diagnostics: async (ctx: LowFamilyContext, args: any) => {
151
+ if (!ctx.deps.sessionHostControl) return { success: false, error: 'Session host control unavailable' };
152
+ const diagnostics = await traceSessionHostAction('session_host_get_diagnostics', args, () => ctx.deps.sessionHostControl!.getDiagnostics({
153
+ includeSessions: args?.includeSessions !== false,
154
+ limit: Number(args?.limit) || undefined,
155
+ }), (result) => ({
156
+ includeSessions: args?.includeSessions !== false,
157
+ limit: Number(args?.limit) || undefined,
158
+ ...summarizeSessionHostDiagnostics(result),
159
+ }));
160
+ return { success: true, diagnostics };
161
+ },
162
+
163
+ session_host_list_sessions: async (ctx: LowFamilyContext, args: any) => {
164
+ if (!ctx.deps.sessionHostControl) return { success: false, error: 'Session host control unavailable' };
165
+ const sessions = await traceSessionHostAction('session_host_list_sessions', args, () => ctx.deps.sessionHostControl!.listSessions(), (records) => summarizeSessionHostRecords(records));
166
+ return { success: true, sessions };
167
+ },
168
+
169
+ session_host_stop_session: async (ctx: LowFamilyContext, args: any) => {
170
+ if (!ctx.deps.sessionHostControl) return { success: false, error: 'Session host control unavailable' };
171
+ const sessionId = typeof args?.sessionId === 'string' ? args.sessionId : '';
172
+ if (!sessionId) return { success: false, error: 'sessionId required' };
173
+ const record = await traceSessionHostAction('session_host_stop_session', args, () => ctx.deps.sessionHostControl!.stopSession(sessionId), (result) => summarizeSessionHostRecord(result));
174
+ return { success: true, record };
175
+ },
176
+
177
+ session_host_resume_session: async (ctx: LowFamilyContext, args: any) => {
178
+ if (!ctx.deps.sessionHostControl) return { success: false, error: 'Session host control unavailable' };
179
+ const sessionId = typeof args?.sessionId === 'string' ? args.sessionId : '';
180
+ if (!sessionId) return { success: false, error: 'sessionId required' };
181
+ const record = await traceSessionHostAction('session_host_resume_session', args, async () => {
182
+ const nextRecord = await ctx.deps.sessionHostControl!.resumeSession(sessionId);
183
+ const hosted = toHostedCliRuntimeDescriptor(nextRecord);
184
+ if (hosted) {
185
+ await ctx.deps.cliManager.restoreHostedSessions([hosted]);
186
+ }
187
+ return nextRecord;
188
+ }, (result) => ({
189
+ ...summarizeSessionHostRecord(result),
190
+ restoredHostedSession: !!toHostedCliRuntimeDescriptor(result),
191
+ }));
192
+ return { success: true, record };
193
+ },
194
+
195
+ session_host_restart_session: async (ctx: LowFamilyContext, args: any) => {
196
+ if (!ctx.deps.sessionHostControl) return { success: false, error: 'Session host control unavailable' };
197
+ const sessionId = typeof args?.sessionId === 'string' ? args.sessionId : '';
198
+ if (!sessionId) return { success: false, error: 'sessionId required' };
199
+ const record = await traceSessionHostAction('session_host_restart_session', args, async () => {
200
+ const nextRecord = await ctx.deps.sessionHostControl!.restartSession(sessionId);
201
+ const hosted = toHostedCliRuntimeDescriptor(nextRecord);
202
+ if (hosted) {
203
+ await ctx.deps.cliManager.restoreHostedSessions([hosted]);
204
+ }
205
+ return nextRecord;
206
+ }, (result) => ({
207
+ ...summarizeSessionHostRecord(result),
208
+ restoredHostedSession: !!toHostedCliRuntimeDescriptor(result),
209
+ }));
210
+ return { success: true, record };
211
+ },
212
+
213
+ session_host_send_signal: async (ctx: LowFamilyContext, args: any) => {
214
+ if (!ctx.deps.sessionHostControl) return { success: false, error: 'Session host control unavailable' };
215
+ const sessionId = typeof args?.sessionId === 'string' ? args.sessionId : '';
216
+ const signal = typeof args?.signal === 'string' ? args.signal : '';
217
+ if (!sessionId) return { success: false, error: 'sessionId required' };
218
+ if (!signal) return { success: false, error: 'signal required' };
219
+ const record = await traceSessionHostAction('session_host_send_signal', args, () => ctx.deps.sessionHostControl!.sendSignal(sessionId, signal), (result) => summarizeSessionHostRecord(result));
220
+ return { success: true, record };
221
+ },
222
+
223
+ session_host_force_detach_client: async (ctx: LowFamilyContext, args: any) => {
224
+ if (!ctx.deps.sessionHostControl) return { success: false, error: 'Session host control unavailable' };
225
+ const sessionId = typeof args?.sessionId === 'string' ? args.sessionId : '';
226
+ const clientId = typeof args?.clientId === 'string' ? args.clientId : '';
227
+ if (!sessionId) return { success: false, error: 'sessionId required' };
228
+ if (!clientId) return { success: false, error: 'clientId required' };
229
+ const record = await traceSessionHostAction('session_host_force_detach_client', args, () => ctx.deps.sessionHostControl!.forceDetachClient(sessionId, clientId), (result) => summarizeSessionHostRecord(result));
230
+ return { success: true, record };
231
+ },
232
+
233
+ session_host_prune_duplicate_sessions: async (ctx: LowFamilyContext, args: any) => {
234
+ if (!ctx.deps.sessionHostControl) return { success: false, error: 'Session host control unavailable' };
235
+ const result = await traceSessionHostAction('session_host_prune_duplicate_sessions', args, () => ctx.deps.sessionHostControl!.pruneDuplicateSessions({
236
+ providerType: typeof args?.providerType === 'string' ? args.providerType : undefined,
237
+ workspace: typeof args?.workspace === 'string' ? args.workspace : undefined,
238
+ dryRun: args?.dryRun === true,
239
+ }), (value) => summarizeSessionHostPruneResult(value));
240
+ return { success: true, result };
241
+ },
242
+
243
+ session_host_acquire_write: async (ctx: LowFamilyContext, args: any) => {
244
+ if (!ctx.deps.sessionHostControl) return { success: false, error: 'Session host control unavailable' };
245
+ const sessionId = typeof args?.sessionId === 'string' ? args.sessionId : '';
246
+ const clientId = typeof args?.clientId === 'string' ? args.clientId : '';
247
+ const ownerType = args?.ownerType === 'agent' ? 'agent' : 'user';
248
+ if (!sessionId) return { success: false, error: 'sessionId required' };
249
+ if (!clientId) return { success: false, error: 'clientId required' };
250
+ const record = await traceSessionHostAction('session_host_acquire_write', args, () => ctx.deps.sessionHostControl!.acquireWrite({
251
+ sessionId,
252
+ clientId,
253
+ ownerType,
254
+ force: args?.force !== false,
255
+ }), (result) => ({
256
+ ...summarizeSessionHostRecord(result),
257
+ ownerType,
258
+ }));
259
+ return { success: true, record };
260
+ },
261
+
262
+ session_host_release_write: async (ctx: LowFamilyContext, args: any) => {
263
+ if (!ctx.deps.sessionHostControl) return { success: false, error: 'Session host control unavailable' };
264
+ const sessionId = typeof args?.sessionId === 'string' ? args.sessionId : '';
265
+ const clientId = typeof args?.clientId === 'string' ? args.clientId : '';
266
+ if (!sessionId) return { success: false, error: 'sessionId required' };
267
+ if (!clientId) return { success: false, error: 'clientId required' };
268
+ const record = await traceSessionHostAction('session_host_release_write', args, () => ctx.deps.sessionHostControl!.releaseWrite({
269
+ sessionId,
270
+ clientId,
271
+ }), (result) => summarizeSessionHostRecord(result));
272
+ return { success: true, record };
273
+ },
274
+ };
@@ -0,0 +1,217 @@
1
+ /**
2
+ * RF-ROUTER LOW family — provider-dev / spec debug commands.
3
+ *
4
+ * Powers the dev console's spec editor: read/write a session's spec.json, validate
5
+ * an in-progress spec, and preview condition/section resolution against a live
6
+ * session's screen. Extracted verbatim from executeDaemonCommand; reads only
7
+ * ctx.deps.sessionRegistry + ctx.deps.cliManager. resolveSpecPathInProviders (a
8
+ * `this`-free module helper) is relocated here unchanged.
9
+ */
10
+ import type { LowFamilyContext, LowFamilyHandler } from './types.js';
11
+
12
+ function resolveSpecPathInProviders(
13
+ specPath: string,
14
+ fsm: typeof import('node:fs'),
15
+ pathm: typeof import('node:path'),
16
+ osm: typeof import('node:os'),
17
+ ): { ok: true; path: string } | { ok: false; error: string } {
18
+ let rootReal: string;
19
+ try {
20
+ rootReal = fsm.realpathSync(pathm.join(osm.homedir(), '.adhdev', 'providers'));
21
+ } catch (e) {
22
+ return { ok: false, error: `providers root unavailable: ${(e as Error).message}` };
23
+ }
24
+ const resolved = pathm.resolve(specPath);
25
+ const base = pathm.basename(resolved);
26
+ if (!/^[\w.-]+\.json$/.test(base)) {
27
+ return { ok: false, error: 'refused: spec file must be a *.json basename' };
28
+ }
29
+ let parentReal: string;
30
+ try {
31
+ parentReal = fsm.realpathSync(pathm.dirname(resolved));
32
+ } catch (e) {
33
+ return { ok: false, error: `spec directory not found: ${(e as Error).message}` };
34
+ }
35
+ if (parentReal !== rootReal && !parentReal.startsWith(rootReal + pathm.sep)) {
36
+ return { ok: false, error: 'refused: spec path must be under the providers root' };
37
+ }
38
+ const safe = pathm.join(parentReal, base);
39
+ // Reject if the final file itself is a symlink pointing elsewhere.
40
+ try {
41
+ const st = fsm.lstatSync(safe);
42
+ if (st.isSymbolicLink()) return { ok: false, error: 'refused: spec path is a symlink' };
43
+ } catch { /* file may not exist yet (write case) — fine */ }
44
+ return { ok: true, path: safe };
45
+ }
46
+
47
+ export const specProviderDevHandlers: Record<string, LowFamilyHandler> = {
48
+ get_spec_debug: async (ctx: LowFamilyContext, args: any) => {
49
+ const sessionId = typeof args?.targetSessionId === 'string' ? args.targetSessionId.trim()
50
+ : typeof args?.sessionId === 'string' ? args.sessionId.trim() : '';
51
+ if (!sessionId) return { success: false, error: 'targetSessionId required' };
52
+ const target = ctx.deps.sessionRegistry.get(sessionId);
53
+ if (!target) return { success: false, error: 'Session not found', sessionId };
54
+ const adapterObj = ctx.deps.cliManager.findAdapter(target.providerType, { instanceKey: sessionId })?.adapter;
55
+ const snapshot = adapterObj
56
+ ? (typeof (adapterObj as any).getDebugSnapshot === 'function'
57
+ ? (adapterObj as any).getDebugSnapshot()
58
+ : typeof (adapterObj as any).getDebugState === 'function'
59
+ ? (adapterObj as any).getDebugState()
60
+ : null)
61
+ : null;
62
+ return {
63
+ success: true,
64
+ sessionId,
65
+ providerType: target.providerType,
66
+ isSpecProvider: snapshot !== null,
67
+ snapshot,
68
+ };
69
+ },
70
+
71
+ // ── Spec source read/write for the debug panel's live editor.
72
+ // Lets the dashboard load a session's spec.json, edit it, and save it back —
73
+ // the driver's fs.watch picks up the change and hot-reloads the FSM with no
74
+ // restart. Writes are confined to files under ~/.adhdev/providers.
75
+ get_spec_source: async (ctx: LowFamilyContext, args: any) => {
76
+ const fsm = await import('node:fs');
77
+ const pathm = await import('node:path');
78
+ const osm = await import('node:os');
79
+ const sessionId = typeof args?.targetSessionId === 'string' ? args.targetSessionId.trim()
80
+ : typeof args?.sessionId === 'string' ? args.sessionId.trim() : '';
81
+ let specPath = typeof args?.specPath === 'string' ? args.specPath : '';
82
+ if (!specPath && sessionId) {
83
+ const target = ctx.deps.sessionRegistry.get(sessionId);
84
+ const adapterObj = target ? ctx.deps.cliManager.findAdapter(target.providerType, { instanceKey: sessionId })?.adapter : null;
85
+ const snap = adapterObj && typeof (adapterObj as any).getDebugSnapshot === 'function' ? (adapterObj as any).getDebugSnapshot() : null;
86
+ specPath = snap?.specPath ?? '';
87
+ }
88
+ if (!specPath) return { success: false, error: 'specPath or resolvable targetSessionId required' };
89
+ // Confine reads to the providers tree, resolving symlinks so a crafted path
90
+ // can't escape via a symlinked spec file.
91
+ const safe = resolveSpecPathInProviders(specPath, fsm, pathm, osm);
92
+ if (!safe.ok) return { success: false, error: safe.error, specPath };
93
+ try {
94
+ const content = fsm.readFileSync(safe.path, 'utf8');
95
+ return { success: true, specPath: safe.path, content };
96
+ } catch (e) {
97
+ return { success: false, error: `read failed: ${(e as Error).message}`, specPath };
98
+ }
99
+ },
100
+
101
+ write_spec_source: async (_ctx: LowFamilyContext, args: any) => {
102
+ const fsm = await import('node:fs');
103
+ const pathm = await import('node:path');
104
+ const osm = await import('node:os');
105
+ const specPath = typeof args?.specPath === 'string' ? args.specPath : '';
106
+ const content = typeof args?.content === 'string' ? args.content : '';
107
+ if (!specPath) return { success: false, error: 'specPath required' };
108
+ if (!content) return { success: false, error: 'content required' };
109
+ // Confine writes to the providers tree (symlink-safe — see helper).
110
+ const safe = resolveSpecPathInProviders(specPath, fsm, pathm, osm);
111
+ if (!safe.ok) return { success: false, error: safe.error };
112
+ // Validate JSON + (if v4) FSM structure before writing so a bad edit can't
113
+ // break the live session — return precise errors.
114
+ let parsed: unknown;
115
+ try { parsed = JSON.parse(content); }
116
+ catch (e) { return { success: false, error: `invalid JSON: ${(e as Error).message}` }; }
117
+ if ((parsed as any)?.$schema === 'adhdev:cli/spec@4') {
118
+ const { validateFsmSpec } = await import('../../providers/spec/fsm-loader.js');
119
+ const errs = validateFsmSpec(parsed);
120
+ if (errs.length) return { success: false, error: 'spec invalid', validationErrors: errs };
121
+ }
122
+ try {
123
+ fsm.writeFileSync(safe.path, content, 'utf8');
124
+ return { success: true, specPath: safe.path };
125
+ } catch (e) {
126
+ return { success: false, error: `write failed: ${(e as Error).message}` };
127
+ }
128
+ },
129
+
130
+ // ── Validate an in-progress spec (string or object) without writing. The form
131
+ // builder calls this on every change so Save can stay disabled while there
132
+ // are structural / reference / regex errors.
133
+ validate_spec: async (_ctx: LowFamilyContext, args: any) => {
134
+ let parsed: unknown = args?.spec;
135
+ if (typeof args?.content === 'string') {
136
+ try { parsed = JSON.parse(args.content); }
137
+ catch (e) { return { success: true, valid: false, errors: [`invalid JSON: ${(e as Error).message}`] }; }
138
+ }
139
+ if (!parsed || typeof parsed !== 'object') {
140
+ return { success: true, valid: false, errors: ['spec must be an object or content string'] };
141
+ }
142
+ const schema = (parsed as any).$schema;
143
+ if (schema === 'adhdev:cli/spec@4') {
144
+ const { validateFsmSpec } = await import('../../providers/spec/fsm-loader.js');
145
+ const errors = validateFsmSpec(parsed);
146
+ return { success: true, valid: errors.length === 0, errors };
147
+ }
148
+ // v1/v3 left to the legacy loader path; the builder is v4-only.
149
+ return { success: true, valid: false, errors: [`unsupported $schema "${schema}" — form builder is v4-only`] };
150
+ },
151
+
152
+ // ── Evaluate a single condition against a live session's current screen —
153
+ // powers the editor's "does this match right now?" preview. Returns the
154
+ // recursive match tree.
155
+ eval_condition_preview: async (ctx: LowFamilyContext, args: any) => {
156
+ const sessionId = typeof args?.targetSessionId === 'string' ? args.targetSessionId.trim()
157
+ : typeof args?.sessionId === 'string' ? args.sessionId.trim() : '';
158
+ if (!sessionId) return { success: false, error: 'targetSessionId required' };
159
+ if (!args?.condition || typeof args.condition !== 'object') return { success: false, error: 'condition required' };
160
+ const target = ctx.deps.sessionRegistry.get(sessionId);
161
+ if (!target) return { success: false, error: 'Session not found', sessionId };
162
+ const adapterObj = ctx.deps.cliManager.findAdapter(target.providerType, { instanceKey: sessionId })?.adapter as any;
163
+ const snap = adapterObj && typeof adapterObj.getDebugSnapshot === 'function' ? adapterObj.getDebugSnapshot() : null;
164
+ if (!snap?.screen) return { success: false, error: 'no live screen for session' };
165
+ // Reconstruct the sections map the spec would resolve. We pass the spec's
166
+ // sections so section-scoped regexes resolve the same way they do at
167
+ // runtime; fall back to the on-disk spec.
168
+ let sectionsDef: Record<string, unknown> | undefined;
169
+ try {
170
+ const fsm2 = await import('node:fs');
171
+ if (snap.specPath) {
172
+ const raw = JSON.parse(fsm2.readFileSync(snap.specPath, 'utf8'));
173
+ sectionsDef = raw?.sections;
174
+ }
175
+ } catch { /* fall back to whole-screen matching */ }
176
+ const { evaluateConditionPreview } = await import('../../providers/spec/fsm-evaluator.js');
177
+ try {
178
+ const result = evaluateConditionPreview(
179
+ args.condition,
180
+ sectionsDef as any,
181
+ snap.screen,
182
+ snap.cursorPosition ?? undefined,
183
+ );
184
+ return { success: true, result, sections: snap.sections ?? null };
185
+ } catch (e) {
186
+ return { success: false, error: `eval failed: ${(e as Error).message}` };
187
+ }
188
+ },
189
+
190
+ // ── Resolve a sections map against a live session's screen — the section
191
+ // editor's "test" button. Returns, for each section id, the line range + the
192
+ // text it captures. Accepts an in-progress sections map so it previews
193
+ // unsaved edits.
194
+ resolve_section_preview: async (ctx: LowFamilyContext, args: any) => {
195
+ const sessionId = typeof args?.targetSessionId === 'string' ? args.targetSessionId.trim()
196
+ : typeof args?.sessionId === 'string' ? args.sessionId.trim() : '';
197
+ if (!sessionId) return { success: false, error: 'targetSessionId required' };
198
+ if (!args?.sections || typeof args.sections !== 'object') return { success: false, error: 'sections map required' };
199
+ const target = ctx.deps.sessionRegistry.get(sessionId);
200
+ if (!target) return { success: false, error: 'Session not found', sessionId };
201
+ const adapterObj = ctx.deps.cliManager.findAdapter(target.providerType, { instanceKey: sessionId })?.adapter as any;
202
+ const snap = adapterObj && typeof adapterObj.getDebugSnapshot === 'function' ? adapterObj.getDebugSnapshot() : null;
203
+ if (!snap?.screen) return { success: false, error: 'no live screen for session' };
204
+ const { resolveSections } = await import('../../providers/spec/evaluator.js');
205
+ try {
206
+ const lines = String(snap.screen).split('\n').map((l: string) => l.endsWith('\r') ? l.slice(0, -1) : l);
207
+ const resolved = resolveSections(args.sections as any, lines);
208
+ return {
209
+ success: true,
210
+ screenLineCount: lines.length,
211
+ sections: resolved.map(s => ({ id: s.id, fromLine: s.fromLine, toLine: s.toLine, text: s.text })),
212
+ };
213
+ } catch (e) {
214
+ return { success: false, error: `resolve failed: ${(e as Error).message}` };
215
+ }
216
+ },
217
+ };