@adhdev/daemon-core 0.9.82-rc.40 → 0.9.82-rc.401

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 (417) 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 +199 -0
  10. package/dist/cli-adapters/provider-cli-adapter.d.ts +125 -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 +14 -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 +2 -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 +116 -0
  54. package/dist/commands/mesh-coordinator.d.ts +85 -1
  55. package/dist/commands/router.d.ts +256 -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 +77 -1
  60. package/dist/config/mesh-json-config.d.ts +299 -0
  61. package/dist/daemon/dev-server.d.ts +0 -2
  62. package/dist/detection/ide-detector.d.ts +13 -0
  63. package/dist/detection/win32-ide-version.d.ts +37 -0
  64. package/dist/git/change-impact-config.d.ts +159 -0
  65. package/dist/git/git-commands.d.ts +11 -1
  66. package/dist/git/git-diff.d.ts +6 -0
  67. package/dist/git/git-executor.d.ts +11 -0
  68. package/dist/git/git-status.d.ts +23 -0
  69. package/dist/git/git-types.d.ts +2 -50
  70. package/dist/git/git-worktree.d.ts +71 -1
  71. package/dist/git/index.d.ts +3 -1
  72. package/dist/index.d.ts +57 -13
  73. package/dist/index.js +45987 -17082
  74. package/dist/index.js.map +1 -1
  75. package/dist/index.mjs +45750 -16986
  76. package/dist/index.mjs.map +1 -1
  77. package/dist/installer.d.ts +1 -4
  78. package/dist/ipc/local-ipc-server.d.ts +91 -0
  79. package/dist/launch.d.ts +1 -1
  80. package/dist/logging/async-batch-writer.d.ts +10 -0
  81. package/dist/logging/log-redactor.d.ts +24 -0
  82. package/dist/logging/log-tail-reader.d.ts +81 -0
  83. package/dist/logging/logger.d.ts +1 -1
  84. package/dist/mesh/contracts.d.ts +164 -0
  85. package/dist/mesh/coordinator-prompt.d.ts +89 -0
  86. package/dist/mesh/coordinator-registry.d.ts +59 -0
  87. package/dist/mesh/mesh-active-work.d.ts +174 -0
  88. package/dist/mesh/mesh-coordinator-config.d.ts +21 -0
  89. package/dist/mesh/mesh-delivery-policy.d.ts +131 -0
  90. package/dist/mesh/mesh-event-classify.d.ts +5 -0
  91. package/dist/mesh/mesh-event-forwarding.d.ts +19 -0
  92. package/dist/mesh/mesh-event-trace.d.ts +21 -0
  93. package/dist/mesh/mesh-events-coordinator.d.ts +4 -0
  94. package/dist/mesh/mesh-events-pending.d.ts +55 -0
  95. package/dist/mesh/mesh-events-stale.d.ts +61 -0
  96. package/dist/mesh/mesh-events-utils.d.ts +75 -0
  97. package/dist/mesh/mesh-events.d.ts +6 -49
  98. package/dist/mesh/mesh-fast-forward.d.ts +81 -0
  99. package/dist/mesh/mesh-host-ownership.d.ts +9 -0
  100. package/dist/mesh/mesh-init.d.ts +86 -0
  101. package/dist/mesh/mesh-ledger-reconciliation.d.ts +23 -4
  102. package/dist/mesh/mesh-ledger.d.ts +77 -1
  103. package/dist/mesh/mesh-missions.d.ts +164 -0
  104. package/dist/mesh/mesh-node-identity.d.ts +289 -0
  105. package/dist/mesh/mesh-queue-assignment.d.ts +95 -0
  106. package/dist/mesh/mesh-reconcile-loop.d.ts +65 -0
  107. package/dist/mesh/mesh-refine-batch.d.ts +68 -0
  108. package/dist/mesh/mesh-refine-gates.d.ts +428 -0
  109. package/dist/mesh/mesh-refine-status.d.ts +62 -0
  110. package/dist/mesh/mesh-review-inbox.d.ts +90 -0
  111. package/dist/mesh/mesh-routing.d.ts +70 -0
  112. package/dist/mesh/mesh-runtime-store.d.ts +447 -0
  113. package/dist/mesh/mesh-scheduling-runtime.d.ts +78 -0
  114. package/dist/mesh/mesh-task-stats.d.ts +49 -0
  115. package/dist/mesh/mesh-unresolved-forward-outbox.d.ts +30 -0
  116. package/dist/mesh/mesh-warmup-deadline.d.ts +68 -0
  117. package/dist/mesh/mesh-work-queue.d.ts +247 -5
  118. package/dist/mesh/preview-freshness.d.ts +18 -0
  119. package/dist/mesh/refine-config.d.ts +216 -0
  120. package/dist/mesh/worktree-bootstrap-config.d.ts +145 -0
  121. package/dist/providers/acp-provider-instance.d.ts +5 -0
  122. package/dist/providers/approval-utils.d.ts +20 -0
  123. package/dist/providers/chat-message-normalization.d.ts +13 -1
  124. package/dist/providers/cli-provider-instance.d.ts +167 -3
  125. package/dist/providers/contracts.d.ts +139 -6
  126. package/dist/providers/external-sources.d.ts +71 -0
  127. package/dist/providers/manual-attendance.d.ts +63 -0
  128. package/dist/providers/native-history/antigravity-cli-transcript.d.ts +100 -0
  129. package/dist/providers/native-history/claude-cli-transcript.d.ts +70 -0
  130. package/dist/providers/native-history/codex-cli-transcript.d.ts +73 -0
  131. package/dist/providers/native-history/constants.d.ts +12 -0
  132. package/dist/providers/native-history/dispatcher.d.ts +27 -0
  133. package/dist/providers/native-history/hermes-cli-transcript.d.ts +30 -0
  134. package/dist/providers/native-history/index.d.ts +13 -0
  135. package/dist/providers/provider-instance-manager.d.ts +14 -0
  136. package/dist/providers/provider-instance.d.ts +23 -1
  137. package/dist/providers/provider-loader.d.ts +26 -4
  138. package/dist/providers/provider-trust.d.ts +31 -0
  139. package/dist/providers/read-chat-contract.d.ts +29 -0
  140. package/dist/providers/sdk/v1/builders/acp/detect-status.d.ts +68 -0
  141. package/dist/providers/sdk/v1/builders/cli/detect-status.d.ts +86 -0
  142. package/dist/providers/sdk/v1/builders/cli/parse-approval-squash.d.ts +59 -0
  143. package/dist/providers/sdk/v1/builders/cli/parse-approval.d.ts +65 -0
  144. package/dist/providers/sdk/v1/builders/cli/parse-session.d.ts +91 -0
  145. package/dist/providers/sdk/v1/builders/cli/visible-region.d.ts +42 -0
  146. package/dist/providers/sdk/v1/fixture-tooling/format.d.ts +126 -0
  147. package/dist/providers/sdk/v1/fixture-tooling/index.d.ts +8 -0
  148. package/dist/providers/sdk/v1/fixture-tooling/replay.d.ts +38 -0
  149. package/dist/providers/sdk/v1/index.d.ts +30 -0
  150. package/dist/providers/sdk/v1/sandbox/README-design.d.ts +193 -0
  151. package/dist/providers/sdk/v1/sandbox/require-whitelist.d.ts +74 -0
  152. package/dist/providers/sdk/v1/sandbox/script-runner.d.ts +98 -0
  153. package/dist/providers/sdk/v1/types/cli/index.d.ts +277 -0
  154. package/dist/providers/sdk/v1/types/common/index.d.ts +203 -0
  155. package/dist/providers/sdk/v1/validators/index.d.ts +5 -0
  156. package/dist/providers/sdk/v1/validators/manifest.d.ts +40 -0
  157. package/dist/providers/sdk/v1/validators/taint.d.ts +52 -0
  158. package/dist/providers/spec/adapter.d.ts +91 -0
  159. package/dist/providers/spec/cli-adapter.d.ts +223 -0
  160. package/dist/providers/spec/evaluator.d.ts +45 -0
  161. package/dist/providers/spec/fsm-driver.d.ts +407 -0
  162. package/dist/providers/spec/fsm-evaluator.d.ts +76 -0
  163. package/dist/providers/spec/fsm-loader.d.ts +14 -0
  164. package/dist/providers/spec/fsm-types.d.ts +174 -0
  165. package/dist/providers/spec/native-history-executor.d.ts +41 -0
  166. package/dist/providers/spec/pre-launch-trust.d.ts +16 -0
  167. package/dist/providers/spec/route.d.ts +4 -0
  168. package/dist/providers/spec/types.d.ts +222 -0
  169. package/dist/providers/status-monitor.d.ts +7 -7
  170. package/dist/providers/transcript-v2.d.ts +176 -0
  171. package/dist/providers/types/interactive-prompt.d.ts +84 -0
  172. package/dist/providers/working-dir.d.ts +17 -0
  173. package/dist/repo-mesh-types.d.ts +420 -13
  174. package/dist/runtime-defaults.d.ts +2 -0
  175. package/dist/sessions/registry.d.ts +6 -0
  176. package/dist/shared-types-extra.d.ts +2 -4
  177. package/dist/shared-types.d.ts +59 -2
  178. package/dist/status/normalize.d.ts +1 -1
  179. package/dist/status/normalize.js +1 -0
  180. package/dist/status/normalize.js.map +1 -1
  181. package/dist/status/normalize.mjs +1 -0
  182. package/dist/status/normalize.mjs.map +1 -1
  183. package/dist/status/reporter.d.ts +2 -0
  184. package/dist/status/snapshot.d.ts +26 -0
  185. package/dist/system/hash.d.ts +8 -0
  186. package/dist/system/load-better-sqlite3.d.ts +21 -0
  187. package/dist/types.d.ts +5 -0
  188. package/package.json +7 -3
  189. package/src/agent-stream/poller.ts +2 -3
  190. package/src/agent-stream/provider-adapter.ts +1 -1
  191. package/src/boot/daemon-lifecycle.ts +63 -12
  192. package/src/boot/process-hardening.ts +89 -0
  193. package/src/build-info.ts +73 -0
  194. package/src/chat/source-machine.ts +534 -0
  195. package/src/chat/source-resolver.ts +0 -0
  196. package/src/chat/subscription-updates.ts +20 -1
  197. package/src/cli-adapter-types.d.ts +3 -1
  198. package/src/cli-adapter-types.ts +68 -2
  199. package/src/cli-adapters/cli-script-runner.ts +421 -0
  200. package/src/cli-adapters/cli-state-engine.ts +1236 -0
  201. package/src/cli-adapters/provider-cli-adapter.d.ts +1 -1
  202. package/src/cli-adapters/provider-cli-adapter.ts +909 -1144
  203. package/src/cli-adapters/provider-cli-parse.d.ts +2 -0
  204. package/src/cli-adapters/provider-cli-parse.ts +19 -0
  205. package/src/cli-adapters/provider-cli-runtime.ts +56 -7
  206. package/src/cli-adapters/provider-cli-shared.d.ts +4 -0
  207. package/src/cli-adapters/provider-cli-shared.ts +121 -11
  208. package/src/cli-adapters/pty-transport.ts +2 -1
  209. package/src/cli-adapters/pty-write-chunking.ts +106 -0
  210. package/src/cli-adapters/raw-terminal-io.ts +252 -0
  211. package/src/cli-adapters/resolve-executable.ts +90 -0
  212. package/src/cli-adapters/session-host-transport.ts +2 -1
  213. package/src/cli-adapters/terminal-backends/ghostty-vt-backend.ts +53 -29
  214. package/src/cli-adapters/terminal-backends/types.ts +10 -3
  215. package/src/cli-adapters/terminal-screen.ts +16 -81
  216. package/src/commands/WINDOWS-UPGRADE-LOCK-FAILURE.md +198 -0
  217. package/src/commands/chat-commands-debug-bundle.ts +398 -0
  218. package/src/commands/chat-commands-read.ts +2327 -0
  219. package/src/commands/chat-commands-scope.ts +54 -0
  220. package/src/commands/chat-commands-shared.ts +114 -0
  221. package/src/commands/chat-commands-write.ts +880 -0
  222. package/src/commands/chat-commands.ts +19 -1841
  223. package/src/commands/cli-manager.ts +527 -26
  224. package/src/commands/handler.ts +841 -2
  225. package/src/commands/high-family/index.ts +28 -0
  226. package/src/commands/high-family/mesh-coordinator-launch.ts +673 -0
  227. package/src/commands/high-family/mesh-events.ts +80 -0
  228. package/src/commands/high-family/mesh-status.ts +678 -0
  229. package/src/commands/high-family/types.ts +76 -0
  230. package/src/commands/low-family/coordinator-prompt.ts +72 -0
  231. package/src/commands/low-family/daemon-lifecycle.ts +107 -0
  232. package/src/commands/low-family/diagnostics.ts +57 -0
  233. package/src/commands/low-family/index.ts +37 -0
  234. package/src/commands/low-family/mesh-ledger.ts +62 -0
  235. package/src/commands/low-family/mesh-node-logs.ts +87 -0
  236. package/src/commands/low-family/notification.ts +116 -0
  237. package/src/commands/low-family/refine-config.ts +106 -0
  238. package/src/commands/low-family/session-host.ts +274 -0
  239. package/src/commands/low-family/spec-providerdev.ts +217 -0
  240. package/src/commands/low-family/status-meta.ts +112 -0
  241. package/src/commands/low-family/types.ts +39 -0
  242. package/src/commands/med-family/cli-agent.ts +238 -0
  243. package/src/commands/med-family/fast-forward.ts +230 -0
  244. package/src/commands/med-family/ide.ts +163 -0
  245. package/src/commands/med-family/index.ts +37 -0
  246. package/src/commands/med-family/mesh-crud.ts +874 -0
  247. package/src/commands/med-family/mesh-host-pairing.ts +234 -0
  248. package/src/commands/med-family/mesh-queue.ts +131 -0
  249. package/src/commands/med-family/mesh-restart.ts +92 -0
  250. package/src/commands/med-family/types.ts +120 -0
  251. package/src/commands/mesh-coordinator.ts +334 -124
  252. package/src/commands/router.ts +2516 -3221
  253. package/src/commands/stream-commands.ts +8 -0
  254. package/src/commands/upgrade-helper.ts +310 -45
  255. package/src/config/chat-history.ts +483 -24
  256. package/src/config/config.ts +12 -0
  257. package/src/config/mesh-config.ts +353 -22
  258. package/src/config/mesh-json-config.ts +617 -0
  259. package/src/config/recent-activity.ts +8 -2
  260. package/src/daemon/dev-auto-implement.ts +3 -2
  261. package/src/daemon/dev-cli-debug.ts +10 -1
  262. package/src/daemon/dev-server.ts +0 -541
  263. package/src/detection/cli-detector.ts +28 -9
  264. package/src/detection/ide-detector.ts +55 -16
  265. package/src/detection/win32-ide-version.ts +106 -0
  266. package/src/git/change-impact-config.ts +354 -0
  267. package/src/git/git-commands.ts +55 -14
  268. package/src/git/git-diff.ts +81 -11
  269. package/src/git/git-executor.ts +12 -0
  270. package/src/git/git-status.ts +574 -43
  271. package/src/git/git-types.ts +14 -62
  272. package/src/git/git-worktree.ts +261 -4
  273. package/src/git/index.ts +17 -0
  274. package/src/index.ts +171 -12
  275. package/src/installer.d.ts +1 -1
  276. package/src/installer.ts +8 -6
  277. package/src/ipc/local-ipc-server.ts +278 -0
  278. package/src/launch.d.ts +1 -1
  279. package/src/launch.ts +37 -28
  280. package/src/logging/async-batch-writer.ts +55 -0
  281. package/src/logging/command-log.ts +7 -5
  282. package/src/logging/log-redactor.ts +100 -0
  283. package/src/logging/log-tail-reader.ts +341 -0
  284. package/src/logging/logger.ts +14 -7
  285. package/src/mesh/contracts.ts +338 -0
  286. package/src/mesh/coordinator-prompt.ts +381 -33
  287. package/src/mesh/coordinator-registry.ts +121 -0
  288. package/src/mesh/mesh-active-work.ts +645 -0
  289. package/src/mesh/mesh-coordinator-config.ts +97 -0
  290. package/src/mesh/mesh-delivery-policy.ts +315 -0
  291. package/src/mesh/mesh-event-classify.ts +51 -0
  292. package/src/mesh/mesh-event-forwarding.ts +1773 -0
  293. package/src/mesh/mesh-event-trace.ts +67 -0
  294. package/src/mesh/mesh-events-coordinator.ts +31 -0
  295. package/src/mesh/mesh-events-pending.ts +590 -0
  296. package/src/mesh/mesh-events-stale.ts +389 -0
  297. package/src/mesh/mesh-events-utils.ts +443 -0
  298. package/src/mesh/mesh-events.ts +32 -1035
  299. package/src/mesh/mesh-fast-forward.ts +839 -0
  300. package/src/mesh/mesh-host-ownership.ts +73 -0
  301. package/src/mesh/mesh-init.ts +260 -0
  302. package/src/mesh/mesh-ledger-reconciliation.ts +12 -7
  303. package/src/mesh/mesh-ledger.ts +596 -102
  304. package/src/mesh/mesh-missions.ts +322 -0
  305. package/src/mesh/mesh-node-identity.ts +1887 -0
  306. package/src/mesh/mesh-queue-assignment.ts +1738 -0
  307. package/src/mesh/mesh-reconcile-loop.ts +1554 -0
  308. package/src/mesh/mesh-refine-batch.ts +205 -0
  309. package/src/mesh/mesh-refine-gates.ts +1660 -0
  310. package/src/mesh/mesh-refine-status.ts +231 -0
  311. package/src/mesh/mesh-review-inbox.ts +307 -0
  312. package/src/mesh/mesh-routing.ts +291 -0
  313. package/src/mesh/mesh-runtime-store.ts +1835 -0
  314. package/src/mesh/mesh-scheduling-runtime.ts +201 -0
  315. package/src/mesh/mesh-task-stats.ts +161 -0
  316. package/src/mesh/mesh-unresolved-forward-outbox.ts +185 -0
  317. package/src/mesh/mesh-warmup-deadline.ts +152 -0
  318. package/src/mesh/mesh-work-queue.ts +1141 -141
  319. package/src/mesh/preview-freshness.ts +118 -0
  320. package/src/mesh/refine-config.ts +423 -0
  321. package/src/mesh/worktree-bootstrap-config.ts +369 -0
  322. package/src/providers/acp-provider-instance.ts +43 -10
  323. package/src/providers/approval-utils.d.ts +5 -0
  324. package/src/providers/approval-utils.ts +57 -5
  325. package/src/providers/chat-message-normalization.ts +46 -6
  326. package/src/providers/cli-provider-instance.ts +1624 -103
  327. package/src/providers/contracts.d.ts +55 -0
  328. package/src/providers/contracts.ts +150 -6
  329. package/src/providers/extension-provider-instance.ts +12 -7
  330. package/src/providers/external-sources.ts +218 -0
  331. package/src/providers/ide-provider-instance.ts +35 -12
  332. package/src/providers/manual-attendance.ts +85 -0
  333. package/src/providers/native-history/antigravity-cli-transcript.ts +643 -0
  334. package/src/providers/native-history/claude-cli-transcript.ts +396 -0
  335. package/src/providers/native-history/codex-cli-transcript.ts +479 -0
  336. package/src/providers/native-history/constants.ts +19 -0
  337. package/src/providers/native-history/dispatcher.ts +339 -0
  338. package/src/providers/native-history/hermes-cli-transcript.ts +230 -0
  339. package/src/providers/native-history/index.ts +30 -0
  340. package/src/providers/provider-instance-manager.ts +30 -0
  341. package/src/providers/provider-instance.ts +19 -1
  342. package/src/providers/provider-loader.ts +668 -50
  343. package/src/providers/provider-schema.ts +87 -14
  344. package/src/providers/provider-trust.ts +114 -0
  345. package/src/providers/read-chat-contract.ts +76 -16
  346. package/src/providers/sdk/README.md +49 -0
  347. package/src/providers/sdk/v1/builders/acp/detect-status.ts +144 -0
  348. package/src/providers/sdk/v1/builders/cli/detect-status.ts +313 -0
  349. package/src/providers/sdk/v1/builders/cli/parse-approval-squash.ts +158 -0
  350. package/src/providers/sdk/v1/builders/cli/parse-approval.ts +250 -0
  351. package/src/providers/sdk/v1/builders/cli/parse-session.ts +276 -0
  352. package/src/providers/sdk/v1/builders/cli/visible-region.ts +143 -0
  353. package/src/providers/sdk/v1/fixture-tooling/format.ts +130 -0
  354. package/src/providers/sdk/v1/fixture-tooling/index.ts +22 -0
  355. package/src/providers/sdk/v1/fixture-tooling/replay.ts +352 -0
  356. package/src/providers/sdk/v1/index.ts +152 -0
  357. package/src/providers/sdk/v1/sandbox/README-design.ts +195 -0
  358. package/src/providers/sdk/v1/sandbox/require-whitelist.ts +472 -0
  359. package/src/providers/sdk/v1/sandbox/script-runner.ts +150 -0
  360. package/src/providers/sdk/v1/schemas/cli/provider.schema.json +504 -0
  361. package/src/providers/sdk/v1/schemas/primitives/acp-session-protocol-v1.json +131 -0
  362. package/src/providers/sdk/v1/schemas/primitives/native-history-codex-rollout-v1.json +66 -0
  363. package/src/providers/sdk/v1/schemas/primitives/tui-approval-squash-v1.json +91 -0
  364. package/src/providers/sdk/v1/schemas/primitives/tui-assistant-block-v1.json +91 -0
  365. package/src/providers/sdk/v1/schemas/primitives/tui-cue-ordering-v1.json +47 -0
  366. package/src/providers/sdk/v1/schemas/primitives/tui-dispatch-order-v1.json +32 -0
  367. package/src/providers/sdk/v1/schemas/primitives/tui-footer-chrome-v1.json +42 -0
  368. package/src/providers/sdk/v1/schemas/primitives/tui-index-finder-v1.json +27 -0
  369. package/src/providers/sdk/v1/schemas/primitives/tui-modal-v1.json +125 -0
  370. package/src/providers/sdk/v1/schemas/primitives/tui-prompt-marker-v1.json +45 -0
  371. package/src/providers/sdk/v1/schemas/primitives/tui-session-id-extraction-v1.json +46 -0
  372. package/src/providers/sdk/v1/schemas/primitives/tui-settled-prompt-v1.json +71 -0
  373. package/src/providers/sdk/v1/schemas/primitives/tui-spinner-v1.json +83 -0
  374. package/src/providers/sdk/v1/schemas/primitives/tui-transcript-pty-v1.json +83 -0
  375. package/src/providers/sdk/v1/schemas/primitives/tui-visible-region-v1.json +57 -0
  376. package/src/providers/sdk/v1/schemas/primitives/tui-welcome-screen-v1.json +35 -0
  377. package/src/providers/sdk/v1/types/cli/index.ts +365 -0
  378. package/src/providers/sdk/v1/types/common/index.ts +229 -0
  379. package/src/providers/sdk/v1/validators/index.ts +19 -0
  380. package/src/providers/sdk/v1/validators/manifest.ts +110 -0
  381. package/src/providers/sdk/v1/validators/taint.ts +309 -0
  382. package/src/providers/spec/adapter.ts +235 -0
  383. package/src/providers/spec/cli-adapter.ts +1056 -0
  384. package/src/providers/spec/evaluator.ts +407 -0
  385. package/src/providers/spec/fsm-driver.ts +1304 -0
  386. package/src/providers/spec/fsm-evaluator.ts +272 -0
  387. package/src/providers/spec/fsm-loader.ts +120 -0
  388. package/src/providers/spec/fsm-types.ts +273 -0
  389. package/src/providers/spec/native-history-executor.ts +1128 -0
  390. package/src/providers/spec/pre-launch-trust.ts +104 -0
  391. package/src/providers/spec/route.ts +51 -0
  392. package/src/providers/spec/types.ts +262 -0
  393. package/src/providers/status-monitor.d.ts +7 -7
  394. package/src/providers/status-monitor.ts +37 -22
  395. package/src/providers/transcript-v2.ts +567 -0
  396. package/src/providers/types/interactive-prompt.ts +536 -0
  397. package/src/providers/version-archive.ts +64 -24
  398. package/src/providers/working-dir.ts +23 -0
  399. package/src/repo-mesh-types.ts +629 -14
  400. package/src/runtime-defaults.ts +39 -0
  401. package/src/sessions/registry.ts +6 -0
  402. package/src/shared-types-extra.ts +2 -4
  403. package/src/shared-types.d.ts +8 -0
  404. package/src/shared-types.ts +64 -1
  405. package/src/status/builders.ts +26 -6
  406. package/src/status/normalize.ts +2 -0
  407. package/src/status/reporter.ts +19 -1
  408. package/src/status/snapshot.ts +95 -26
  409. package/src/system/hash.ts +23 -0
  410. package/src/system/host-memory.ts +29 -12
  411. package/src/system/load-better-sqlite3.ts +68 -0
  412. package/src/types.ts +5 -0
  413. package/dist/cli-adapters/terminal-backends/xterm-backend.d.ts +0 -17
  414. package/dist/mesh/mesh-sync.d.ts +0 -53
  415. package/src/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +0 -16
  416. package/src/cli-adapters/terminal-backends/xterm-backend.ts +0 -97
  417. package/src/mesh/mesh-sync.ts +0 -111
@@ -0,0 +1,407 @@
1
+ import { type SpecPtyEvent } from './adapter.js';
2
+ import type { PtyTransportFactory } from '../../cli-adapters/pty-transport.js';
3
+ import { type TraceEntry } from './evaluator.js';
4
+ import { type TransitionEval } from './fsm-evaluator.js';
5
+ import { chunkPreservingSurrogates as chunkPreservingSurrogatesShared } from '../../cli-adapters/pty-write-chunking.js';
6
+ export type DashboardEvent = {
7
+ kind: 'pty_data';
8
+ chunk: string;
9
+ } | {
10
+ kind: 'state_changed';
11
+ state: {
12
+ id: string;
13
+ label: string;
14
+ title: string | null;
15
+ status: 'idle' | 'generating' | 'approval';
16
+ };
17
+ modal: {
18
+ title: string | null;
19
+ buttons: {
20
+ index: number;
21
+ label: string;
22
+ }[];
23
+ kind: 'approval' | 'picker' | 'confirm' | null;
24
+ } | null;
25
+ controls: {
26
+ id: string;
27
+ label: string;
28
+ action_type: string;
29
+ }[];
30
+ } | {
31
+ kind: 'notification';
32
+ id: string;
33
+ title: string;
34
+ body: string;
35
+ } | {
36
+ kind: 'delegate';
37
+ id: string;
38
+ task: string;
39
+ } | {
40
+ kind: 'spec_trace';
41
+ entries: TraceEntry[];
42
+ } | {
43
+ kind: 'exit';
44
+ exit_code: number;
45
+ } | {
46
+ kind: 'spec_error';
47
+ errors: string[];
48
+ };
49
+ export type DashboardCommand = {
50
+ kind: 'send_message';
51
+ text: string;
52
+ } | {
53
+ kind: 'pty_write';
54
+ data: string;
55
+ } | {
56
+ kind: 'click_control';
57
+ control_id: string;
58
+ payload?: unknown;
59
+ } | {
60
+ kind: 'click_modal_button';
61
+ index: number;
62
+ } | {
63
+ kind: 'attach_image';
64
+ blob: string;
65
+ mime: string;
66
+ } | {
67
+ kind: 'resize';
68
+ cols: number;
69
+ rows: number;
70
+ } | {
71
+ kind: 'cancel';
72
+ } | {
73
+ kind: 'shutdown';
74
+ };
75
+ export interface DriverHistoryEntry {
76
+ stateId: string;
77
+ label: string;
78
+ at: number;
79
+ durationMs: number;
80
+ reason: string;
81
+ matchedStateId?: string;
82
+ matchedRules?: string[];
83
+ debounceKind?: string;
84
+ idleHoldMs?: number;
85
+ busyHoldMs?: number;
86
+ via?: string;
87
+ }
88
+ /**
89
+ * A frozen snapshot of the FULL FSM evaluation captured at the instant a
90
+ * transition fired — the rich `transitions[]` table (per-transition eligible /
91
+ * hold countdown / per-condition CondResult + remainingMs) that `getFsmDebug()`
92
+ * otherwise only computes live for the current instant. Kept in a separate ring
93
+ * buffer from `stateHistory` (which stays intentionally lightweight) so the
94
+ * "why did this rule fire just before the transition" question is answerable
95
+ * after the fact. before-only: this is the evaluation that PRODUCED the
96
+ * transition, not the post-transition state.
97
+ */
98
+ export interface FsmSnapshotEntry {
99
+ /** State we transitioned out of. */
100
+ stateFrom: string;
101
+ /** State we transitioned into (the fired transition's destination). */
102
+ stateTo: string;
103
+ /** Wall-clock time the transition committed (ms). */
104
+ at: number;
105
+ /** The fired transition's destination state id (== stateTo; kept explicit
106
+ * to mirror the rule that fired). */
107
+ firedTo: string;
108
+ /** Human label of the fired transition (e.g. "approval→busy"). */
109
+ firedLabel: string;
110
+ /** Why-it-fired summary, same shape produced for stateHistory.matchedRules. */
111
+ reason: string[];
112
+ /** Every outgoing transition from `stateFrom` as evaluated at `at`, each
113
+ * with its eligible / hold / per-condition CondResult + remainingMs. This
114
+ * is the full pre-transition evaluation table — the whole point of the
115
+ * snapshot. */
116
+ transitions: TransitionEval[];
117
+ }
118
+ export interface ISpecDriver {
119
+ subscribe(listener: (ev: DashboardEvent) => void): () => void;
120
+ start(): void;
121
+ dispatch(cmd: DashboardCommand): void;
122
+ snapshot(): string;
123
+ getCursorPosition(): {
124
+ row: number;
125
+ col: number;
126
+ };
127
+ getScreen(): string;
128
+ getSpecPath(): string;
129
+ shutdown(): void;
130
+ getStateHistory(): ReadonlyArray<DriverHistoryEntry>;
131
+ getSections(): Array<{
132
+ id: string;
133
+ text: string;
134
+ }> | null;
135
+ getLastBusyAt(): number;
136
+ hasIdleHoldPending(): boolean;
137
+ hasSeenReady(): boolean;
138
+ getCompletionIdleDebounceState(): {
139
+ active: boolean;
140
+ ageMs: number;
141
+ holdMs: number;
142
+ forceAfterMs: number;
143
+ } | null;
144
+ getFsmDebug?(): unknown;
145
+ getFsmSnapshotHistory?(): ReadonlyArray<FsmSnapshotEntry>;
146
+ getEventTimeline?(limit?: number): ReadonlyArray<SpecPtyEvent>;
147
+ }
148
+ export interface SpecDriverOpts {
149
+ specPath: string;
150
+ workingDir: string;
151
+ extraEnv?: Record<string, string>;
152
+ cols?: number;
153
+ rows?: number;
154
+ hotReload?: boolean;
155
+ emitTrace?: boolean;
156
+ transportFactory?: PtyTransportFactory;
157
+ extraCliArgs?: string[];
158
+ }
159
+ export declare function resolveSubmitDelayMs(specBeforeSubmit: number | undefined, text: string): number;
160
+ /** Re-export of the shared surrogate-safe splitter so existing imports of
161
+ * `chunkPreservingSurrogates` from this module keep working. The implementation
162
+ * lives in ../../cli-adapters/pty-write-chunking so the spec driver and the
163
+ * legacy adapter share one definition. */
164
+ export declare const chunkPreservingSurrogates: typeof chunkPreservingSurrogatesShared;
165
+ export declare function guessExt(mime: string): string;
166
+ type HistoryEntry = DriverHistoryEntry;
167
+ export declare class FsmDriver implements ISpecDriver {
168
+ private readonly opts;
169
+ private spec;
170
+ private adapter;
171
+ private listeners;
172
+ private currentStateId;
173
+ private stateEnteredAt;
174
+ private startedAtMs;
175
+ private prevScreenLines;
176
+ /** Per cursor_above region (key: cursor_above, -1 = whole screen) → last
177
+ * time that region's content changed. Drives stable_ms conditions. */
178
+ private regionLastChangedAt;
179
+ /** Timer that re-runs evaluate() when a time-condition would flip true
180
+ * with no PTY frame to trigger it. */
181
+ private wakeTimer;
182
+ /** Timer driving the focus-gated stall watchdog (refocus_when_stalled_ms).
183
+ * Re-arms itself while the machine is generating so a re-prime can fire
184
+ * even when the PTY has gone completely quiet. */
185
+ private stallTimer;
186
+ /** Wall-clock time the last stall re-prime was injected. The cooldown gate:
187
+ * after a re-prime we don't re-inject until the screen changes (which
188
+ * resets the stall reference) or another full stall window lapses. */
189
+ private lastRefocusAt;
190
+ /** Timer driving the win32 verification-based submit resend loop (see
191
+ * WIN32_SUBMIT_* and scheduleWin32Submit). Re-arms itself until the FSM
192
+ * leaves idle (submitted) or the resend budget is spent. */
193
+ private win32SubmitTimer;
194
+ /** Wall-clock (ms) of the most recent raw PTY output chunk. Advances on every
195
+ * on_pty_data — including the echo of text written into the composer — so the
196
+ * win32 submit settle-gate can tell when input has finished landing. */
197
+ private lastPtyDataAt;
198
+ /** Wall-clock (ms) of the most recent win32 message-body input write. Bridges
199
+ * the gap between writing a chunk and its echo so the settle-gate does not
200
+ * declare "quiet" mid-write. */
201
+ private lastWin32WriteAt;
202
+ /** Pending paced chunk-write timer for a large win32 body (see writeWin32Body). */
203
+ private win32WriteTimer;
204
+ /** Timer driving the win32 verification-based modal-confirm CR resend loop (see
205
+ * scheduleWin32ModalConfirm). A lone CR that confirms an approval/picker choice
206
+ * is absorbed by ConPTY the same way a send_message submit CR is, so the confirm
207
+ * must be resent until the modal actually resolves (status leaves 'approval'). */
208
+ private win32ModalConfirmTimer;
209
+ private currentEval;
210
+ private stateHistory;
211
+ private prevStateAt;
212
+ private readySeenOnce;
213
+ private pendingSends;
214
+ private pickerInProgress;
215
+ private delegateTimers;
216
+ private specWatcher;
217
+ /** Last full FSM evaluation, kept for the debugger. */
218
+ private lastFsmEval;
219
+ /** Ring buffer (max 20) of the full FSM evaluation captured at each
220
+ * transition — the rich pre-transition table that lastFsmEval only keeps
221
+ * for the single most recent evaluation. Separate from stateHistory. */
222
+ private fsmSnapshotHistory;
223
+ constructor(opts: SpecDriverOpts);
224
+ subscribe(listener: (ev: DashboardEvent) => void): () => void;
225
+ start(): void;
226
+ private scheduleSpawnPrime;
227
+ /** Write the declared `send_on_spawn` sequences to the PTY once. Used both
228
+ * at spawn (scheduleSpawnPrime) and, for focus-gated TUIs, by the stall
229
+ * watchdog to re-inject the focus-in wake mid-turn. No-op when the spec
230
+ * declares no prime, so non-focus-gated CLIs are never poked. */
231
+ private sendSpawnPrime;
232
+ dispatch(cmd: DashboardCommand): void;
233
+ snapshot(): string;
234
+ getCursorPosition(): {
235
+ row: number;
236
+ col: number;
237
+ };
238
+ getScreen(): string;
239
+ /** Scrollback-inclusive screen as line array — used only for modal/button
240
+ * content extraction so a tall prompt's off-screen anchors stay matchable.
241
+ * Falls back to the viewport snapshot if scrollback read is unavailable. */
242
+ private scrollbackLines;
243
+ getSpecPath(): string;
244
+ shutdown(): void;
245
+ getFsmDebug(): {
246
+ currentState: string;
247
+ label: string;
248
+ stateAgeMs: number;
249
+ status: string;
250
+ cursor: {
251
+ row: number;
252
+ col: number;
253
+ };
254
+ transitions: TransitionEval[];
255
+ };
256
+ getStateHistory(): ReadonlyArray<HistoryEntry>;
257
+ getFsmSnapshotHistory(): ReadonlyArray<FsmSnapshotEntry>;
258
+ /** Debug-only PTY input/output/resize/cursor timeline from the adapter. */
259
+ getEventTimeline(limit?: number): ReadonlyArray<SpecPtyEvent>;
260
+ getSections(): Array<{
261
+ id: string;
262
+ text: string;
263
+ }> | null;
264
+ /** v3-compat shims so the cli-adapter's existing debug snapshot keeps
265
+ * working without branching on driver type. */
266
+ getLastBusyAt(): number;
267
+ hasIdleHoldPending(): boolean;
268
+ /**
269
+ * True once the machine has reached its first non-initial idle state (the
270
+ * prompt is genuinely drawn — see maybeMarkReady). The cli-adapter surfaces
271
+ * this on its idle status so CliProviderInstance can re-arm the queue-claim
272
+ * agent:ready on the first genuine ready, independent of the boot-time
273
+ * starting→idle one-shot (which is consumed too early for specs whose
274
+ * initial state already reports idle).
275
+ */
276
+ hasSeenReady(): boolean;
277
+ getCompletionIdleDebounceState(): {
278
+ active: boolean;
279
+ ageMs: number;
280
+ holdMs: number;
281
+ forceAfterMs: number;
282
+ } | null;
283
+ private loadSpecOrThrow;
284
+ private buildAdapterOpts;
285
+ private armSpecWatcher;
286
+ private emitInitialState;
287
+ private buildClock;
288
+ private evalFsmNow;
289
+ private reevaluate;
290
+ private commitTransition;
291
+ /** Snapshot the full FSM evaluation that produced a transition into the
292
+ * separate fsmSnapshotHistory ring buffer (max 20). The transitions[]
293
+ * table is captured by reference — it is freshly built per evaluation in
294
+ * evaluateFsm and never mutated after, so no clone is needed. */
295
+ private pushFsmSnapshot;
296
+ /** Re-derive the visible modal + controls for the current state and emit a
297
+ * state_changed if anything differs from the last emit. */
298
+ private emitStateChanged;
299
+ private deriveModal;
300
+ private deriveTitle;
301
+ private deriveControls;
302
+ /** Track which cursor_above regions changed since the previous frame so
303
+ * stable_ms conditions can measure quiet time. We record every region
304
+ * size referenced by a stable_ms condition in the spec, plus the whole
305
+ * screen (-1). */
306
+ private trackRegionChanges;
307
+ /** All cursor_above region sizes referenced by stable_ms conditions in the
308
+ * current state's outgoing transitions, plus whole-screen. Cached lazily
309
+ * per spec load would be nicer but the set is tiny. */
310
+ private stableRegionSizes;
311
+ /** Schedule a re-evaluation for the soonest pending time-condition on any
312
+ * outgoing transition (elapsed_ms / stable_ms / min_hold_ms). Without
313
+ * this, a state whose only exit is time-based would never leave once the
314
+ * PTY goes quiet. */
315
+ private scheduleWakeForState;
316
+ /** True when this spec opts into stall recovery (declares a positive
317
+ * refocus window AND a wake sequence to re-inject). */
318
+ private stallRecoveryEnabled;
319
+ /** Wall-clock time the screen last changed in the current state, falling
320
+ * back to state entry when it has not changed since (i.e. fully stalled
321
+ * from the start of the state). */
322
+ private lastScreenChangeAt;
323
+ /** Arm a timer to re-inject the focus-in prime if the screen stays frozen
324
+ * through a `generating` state. Only active for opted-in focus-gated specs;
325
+ * a no-op (and cleared) for every other CLI and every non-generating state.
326
+ * Re-arms itself so it keeps watching while the PTY is quiet. */
327
+ private scheduleStallWatchdog;
328
+ /** Fire when the stall window elapses: if the screen is still frozen and we
329
+ * are still generating, re-inject the focus-in wake once, then re-arm. */
330
+ private onStallTick;
331
+ private maybeMarkReady;
332
+ private fireNotifications;
333
+ private armOrCancelDelegateTimers;
334
+ private fireDelegate;
335
+ private handleSendMessage;
336
+ private actuallySendMessage;
337
+ /** The agent's current coarse status, derived from the FSM node we're in. */
338
+ private currentStatus;
339
+ /** Record a win32 body write so the settle-gate counts it as input activity
340
+ * even before the echo arrives. */
341
+ private markWin32Write;
342
+ /** Most recent win32 input activity — a write we issued OR a PTY output chunk
343
+ * (echo). The submit settle-gate waits for this to go quiet. */
344
+ private lastWin32InputActivityAt;
345
+ /**
346
+ * Write the message body to the PTY for win32, paced into bounded chunks. A
347
+ * single unbounded ConPTY write can overflow the input pipe and drop leading
348
+ * bytes; splitting it with a short inter-chunk gap keeps the console input
349
+ * buffer from overflowing. Small bodies still go out in a single write. Each
350
+ * chunk advances lastWin32WriteAt so the submit settle-gate keeps waiting until
351
+ * the final chunk is out and echoed.
352
+ */
353
+ private writeWin32Body;
354
+ /**
355
+ * win32 submit. Two phases:
356
+ *
357
+ * Phase 1 (echo-gate): hold the first CR until the body text is CONFIRMED in the
358
+ * composer (its whitespace-collapsed tail appears in the rendered screen) AND the
359
+ * PTY output is then quiet for WIN32_SUBMIT_SETTLE_MS (the full, possibly multi-KB
360
+ * / multiline body has finished arriving). This replaces a bare output-quiet
361
+ * settle: an early write that races claude's boot is buffered, not dropped, so the
362
+ * screen can go quiet with the body NOT YET in the composer — a quiet-only gate
363
+ * would then fire a CR into an empty composer (no submit). Waiting on the echo
364
+ * closes that. Honors an initial minimum delay and a generous WIN32_ECHO_MAX_WAIT_MS
365
+ * last-resort blind fire so a body that truly never confirms still submits (carried
366
+ * by phase 2) rather than hanging. A settled session echoes immediately → no delay.
367
+ *
368
+ * Phase 2 (verified resend — unchanged): send the submit key, wait a gap, and
369
+ * if the FSM is still 'idle' (the CR was absorbed as a multiline-paste
370
+ * newline) resend, up to WIN32_SUBMIT_MAX_RESENDS. The first CR always fires
371
+ * (a stale/edge status never suppresses it); resends are gated on still being
372
+ * idle and stop the instant the agent leaves idle (submitted → generating /
373
+ * approval). This preserves the win32 lone-CR-swallow handling.
374
+ */
375
+ private scheduleWin32Submit;
376
+ private handleClickControl;
377
+ private handleClickModalButton;
378
+ /**
379
+ * Submit a modal-confirm key sequence (the choice key + its trailing CR).
380
+ *
381
+ * On win32 the trailing CR is the SAME lone-CR-swallow case as a send_message
382
+ * submit: ConPTY can absorb a single CR as a literal newline instead of a
383
+ * confirm, so the approval/picker modal never resolves and the FSM flaps
384
+ * approval↔busy while auto-approve keeps firing into the void (APPROVESTUCK).
385
+ * So we split any non-CR prefix (e.g. the "1" of "1\r") off, write it once, and
386
+ * resend the CR on a fixed cadence until the modal actually resolves (status
387
+ * leaves 'approval'). Non-win32 keeps the single direct write — its CR submits
388
+ * on the first try.
389
+ */
390
+ private submitModalConfirm;
391
+ /**
392
+ * win32 modal-confirm CR resend loop. Mirrors scheduleWin32Submit's phase-2
393
+ * verified resend, but gated on still being IN a modal (status 'approval')
394
+ * rather than still idle: the first CR fires immediately, then resends every
395
+ * WIN32_SUBMIT_RESEND_GAP_MS while the FSM is still showing the modal, up to
396
+ * WIN32_SUBMIT_MAX_RESENDS. The instant the modal resolves (status flips to
397
+ * generating/idle) we stop, so no stray CR leaks into the next turn's composer.
398
+ */
399
+ private scheduleWin32ModalConfirm;
400
+ private handleAttachImage;
401
+ private tryAdvancePicker;
402
+ private handleExit;
403
+ private pushHistory;
404
+ private specTag;
405
+ private emit;
406
+ }
407
+ export {};
@@ -0,0 +1,76 @@
1
+ import type { SectionDef } from './types.js';
2
+ import { type ResolvedSection, type TraceEntry } from './evaluator.js';
3
+ import { type CliSpecV4, type FsmCondition } from './fsm-types.js';
4
+ export interface FsmClock {
5
+ /** Wall-clock now (ms). Passed in so the evaluator stays pure. */
6
+ now: number;
7
+ /** When the current state was entered (ms). */
8
+ stateEnteredAt: number;
9
+ /** Last-changed timestamp per cursor_above region. Key = cursor_above
10
+ * value (0 / undefined → whole-screen, keyed as -1). Missing key means
11
+ * "never observed changing" → treated as stable since stateEnteredAt. */
12
+ regionLastChangedAt: Map<number, number>;
13
+ }
14
+ /** Per-condition evaluation detail — the debugging payload. */
15
+ export interface CondResult {
16
+ kind: 'regex' | 'changed' | 'elapsed' | 'stable' | 'all' | 'any' | 'not';
17
+ result: boolean;
18
+ detail: string;
19
+ /** Remaining ms until a time-based condition would flip to true. 0 if
20
+ * already true or not applicable. Lets the UI show a countdown. */
21
+ remainingMs?: number;
22
+ /** Debug-only: the actual substring a TRUE regex condition matched, so the
23
+ * snapshot shows WHAT text the rule fired on — not just which regex. Never
24
+ * read by the FSM; purely for the Spec Debug Snapshot. */
25
+ matchedText?: string;
26
+ children?: CondResult[];
27
+ }
28
+ /** One evaluated transition with its full reasoning. */
29
+ export interface TransitionEval {
30
+ to: string;
31
+ label: string;
32
+ /** Did the `from` clause include the current state? (Always true for the
33
+ * transitions we return — kept for completeness.) */
34
+ eligible: boolean;
35
+ /** min_hold_ms guard satisfied? */
36
+ holdSatisfied: boolean;
37
+ holdRemainingMs: number;
38
+ /** Guard condition result (true if no `when`). */
39
+ condResult: boolean;
40
+ cond?: CondResult;
41
+ /** Overall: would this transition fire? */
42
+ fires: boolean;
43
+ priority: number;
44
+ }
45
+ export interface FsmEvaluation {
46
+ /** Sections resolved from the screen (shared with v3 shape). */
47
+ sections: ResolvedSection[];
48
+ /** Every outgoing transition from the current state, priority-ordered,
49
+ * each annotated with why it fired or didn't. */
50
+ transitions: TransitionEval[];
51
+ /** The transition that fires (first in priority order with fires===true),
52
+ * or null to stay in the current state. */
53
+ fired: TransitionEval | null;
54
+ /** v3-compatible trace lines for the legacy inspector. */
55
+ trace: TraceEntry[];
56
+ }
57
+ /**
58
+ * Evaluate the FSM: given the current state id and screen, return every
59
+ * outgoing transition annotated with why it fires/doesn't, plus the one that
60
+ * fires (if any).
61
+ */
62
+ export declare function evaluateFsm(spec: CliSpecV4, currentStateId: string, screenText: string, cursor: {
63
+ row: number;
64
+ col: number;
65
+ } | undefined, prevLines: string[] | undefined, clock: FsmClock): FsmEvaluation;
66
+ /**
67
+ * Evaluate a single condition against a screen + section map — for the spec
68
+ * editor's live preview ("does this regex match the current screen right
69
+ * now?"). Time leaves (elapsed_ms/stable_ms) are evaluated against a synthetic
70
+ * clock where the state was just entered, so they report their countdown
71
+ * rather than firing; the preview is about screen-content match, not timing.
72
+ */
73
+ export declare function evaluateConditionPreview(cond: FsmCondition, sections: Record<string, SectionDef> | undefined, screenText: string, cursor?: {
74
+ row: number;
75
+ col: number;
76
+ }): CondResult;
@@ -0,0 +1,14 @@
1
+ import { type CliSpecV4 } from './fsm-types.js';
2
+ export interface FsmLoadOk {
3
+ ok: true;
4
+ spec: CliSpecV4;
5
+ sourcePath: string;
6
+ }
7
+ export interface FsmLoadErr {
8
+ ok: false;
9
+ errors: string[];
10
+ sourcePath: string;
11
+ }
12
+ export declare function loadFsmSpec(sourcePath: string): FsmLoadOk | FsmLoadErr;
13
+ /** Pure validator — usable from a "validate before save" API in the panel. */
14
+ export declare function validateFsmSpec(raw: unknown): string[];
@@ -0,0 +1,174 @@
1
+ import type { RegexCondition, ChangedCondition, Control, NotificationRule, DelegateTrigger, NativeHistoryConfig, SectionDef, ExtractTitle, ExtractButtons } from './types.js';
2
+ /** True once `ms` have elapsed since the current state was entered. */
3
+ export interface ElapsedCondition {
4
+ elapsed_ms: number;
5
+ }
6
+ /** True once the region `cursor_above` lines above the cursor has been
7
+ * unchanged for `ms`. A stability gate — the inverse of a busy signal. */
8
+ export interface StableCondition {
9
+ stable_ms: number;
10
+ /** Lines above the cursor that must be stable. Default: whole screen. */
11
+ cursor_above?: number;
12
+ }
13
+ export interface FsmAllCondition {
14
+ all: FsmCondition[];
15
+ }
16
+ export interface FsmAnyCondition {
17
+ any: FsmCondition[];
18
+ }
19
+ /** Negation — true when the inner condition is false. Lets a transition say
20
+ * "go busy unless the completion marker is present", etc. */
21
+ export interface FsmNotCondition {
22
+ not: FsmCondition;
23
+ }
24
+ export type FsmCondition = RegexCondition | ChangedCondition | ElapsedCondition | StableCondition | FsmAllCondition | FsmAnyCondition | FsmNotCondition;
25
+ export interface FsmState {
26
+ id: string;
27
+ label: string;
28
+ /** Exactly one state must be `initial: true` — the state at spawn. */
29
+ initial?: boolean;
30
+ /** Modal states (approval/picker) expose modal buttons in the UI and are
31
+ * treated as "interesting" — the dashboard surfaces them distinctly. */
32
+ modal?: boolean;
33
+ /**
34
+ * For a modal state, what KIND of modal it is — the semantic distinction the
35
+ * status field (always 'approval' for any modal, so the dashboard surfaces it)
36
+ * deliberately loses. The auto-approve worker uses this to decide whether it
37
+ * may answer the modal on the user's behalf:
38
+ *
39
+ * - 'approval' — a tool/command/trust consent prompt ("Allow Bash?",
40
+ * "Trust this folder?"). Auto-approve MAY fire (a background mesh worker
41
+ * should not stall on these).
42
+ * - 'picker' — a selection menu the user opened (/model, /mode, …). There
43
+ * is no "correct" answer to auto-pick; blindly selecting the first option
44
+ * silently changes the model/mode. Auto-approve must NOT fire — the user
45
+ * chooses.
46
+ * - 'confirm' — a non-consent yes/no the user must decide. Left to the user.
47
+ *
48
+ * Defaults to 'approval' for a modal state that omits it (preserves the
49
+ * pre-existing "auto-approve any modal" behaviour for un-migrated specs;
50
+ * picker/confirm states declare their kind explicitly). Non-modal states
51
+ * have no modal_kind.
52
+ */
53
+ modal_kind?: 'approval' | 'picker' | 'confirm';
54
+ /** Status this state maps to for the dashboard/cli-adapter status field.
55
+ * One of: idle | generating | approval. Defaults: modal→approval,
56
+ * initial→idle, id==='busy'→generating, else idle. Explicit wins. */
57
+ status?: 'idle' | 'generating' | 'approval';
58
+ /** Optional extraction run whenever this state is the committed state —
59
+ * used by modal states to surface a title + buttons. */
60
+ extract?: {
61
+ title?: ExtractTitle;
62
+ buttons?: ExtractButtons;
63
+ };
64
+ }
65
+ export interface FsmTransition {
66
+ /** Source state id, or list of source ids, or "*" for any state. */
67
+ from: string | string[];
68
+ /** Destination state id. */
69
+ to: string;
70
+ /** Guard condition. Omitted → always eligible (only gated by `from` +
71
+ * min_hold_ms). Evaluated against the current screen + clock. */
72
+ when?: FsmCondition;
73
+ /** Minimum time the machine must have been in `from` before this edge can
74
+ * fire. Replaces busy_hold_ms / idle_hold_ms (per-edge, not global). */
75
+ min_hold_ms?: number;
76
+ /** Higher priority transitions are evaluated first. Default 0. Ties broken
77
+ * by declaration order. */
78
+ priority?: number;
79
+ /** Human label for the debugger. */
80
+ label?: string;
81
+ }
82
+ /**
83
+ * Declarative "trust this folder before spawn" config. Some agent CLIs gate the
84
+ * first run in a new folder behind an interactive trust prompt and persist the
85
+ * answer as a string array in a JSON settings file. Declaring this lets the
86
+ * engine add the workspace path to that array before spawn so the prompt never
87
+ * appears — the robust alternative to detecting and auto-clicking the modal.
88
+ * CLIs without such a gate omit this field and the engine does nothing.
89
+ */
90
+ export interface PreLaunchTrust {
91
+ /** Path to the CLI's JSON settings file. A leading `~` expands to $HOME. */
92
+ settings_path: string;
93
+ /** Key of the string-array of trusted folder paths within that file. */
94
+ key: string;
95
+ }
96
+ export interface CliSpecV4 {
97
+ $schema: 'adhdev:cli/spec@4';
98
+ id: string;
99
+ name: string;
100
+ binary: string;
101
+ spawn_args?: string[];
102
+ env?: Record<string, string>;
103
+ cli_version_range?: string;
104
+ /**
105
+ * Optional raw byte sequences written to the PTY once, shortly after spawn,
106
+ * to prime a TUI that gates its input handling on a terminal event the
107
+ * daemon would otherwise never emit. The canonical case is a focus-event
108
+ * TUI (Ink `useStdin`/`useFocus`, e.g. antigravity's `agy`) that enables
109
+ * focus reporting (`CSI ?1004h`) and treats its input box as unfocused —
110
+ * silently dropping the first programmatic write — until it receives a
111
+ * focus-in event (`ESC [ I`). Declaring `[""]` here wakes the input
112
+ * stream on spawn so the first delegated message lands without a manual
113
+ * keystroke. CLIs that do not focus-gate input simply omit this field; the
114
+ * engine writes nothing extra for them, so it stays CLI-agnostic.
115
+ */
116
+ send_on_spawn?: string[];
117
+ /** Delay (ms) after spawn before writing `send_on_spawn`. Default 250. */
118
+ send_on_spawn_delay_ms?: number;
119
+ /**
120
+ * Opt-in stall recovery for focus-gated TUIs. The same CLIs that need
121
+ * `send_on_spawn` (focus-event TUIs like antigravity's `agy`) also stop
122
+ * rendering / flushing output the moment they believe they have lost focus
123
+ * MID-TURN — the screen freezes and only repaints once the user presses a
124
+ * key, which the daemon never does on its own. When this field is set and
125
+ * the machine is in a `generating`-status state whose screen has not changed
126
+ * for `refocus_when_stalled_ms`, the engine re-injects the `send_on_spawn`
127
+ * prime (the focus-in event) once to wake the render loop, then waits for the
128
+ * screen to change or for the stall window to lapse again before re-priming
129
+ * (a cooldown that prevents a tight re-prime loop). Requires `send_on_spawn`
130
+ * to carry the wake sequence; with no `send_on_spawn` there is nothing to
131
+ * re-inject and the engine does nothing. Omitted by every non-focus-gated
132
+ * CLI spec, so the engine stays CLI-agnostic.
133
+ */
134
+ refocus_when_stalled_ms?: number;
135
+ /**
136
+ * Optional pre-spawn folder-trust step. When present, the engine adds the
137
+ * launch workspace path to the declared trusted-folders array before
138
+ * spawning, so a CLI that gates first run on a "trust this folder?" prompt
139
+ * (e.g. antigravity's `agy`) starts trusted and never blocks. Omitted for
140
+ * CLIs without such a gate. See pre-launch-trust.ts.
141
+ */
142
+ pre_launch_trust?: PreLaunchTrust;
143
+ send_message: {
144
+ submit_key: string;
145
+ delay_ms_before_submit?: number;
146
+ delay_ms_per_char?: number;
147
+ };
148
+ sections: Record<string, SectionDef>;
149
+ states: FsmState[];
150
+ transitions: FsmTransition[];
151
+ control_bar?: Control[];
152
+ notifications?: NotificationRule[];
153
+ delegate?: DelegateTrigger[];
154
+ native_history?: NativeHistoryConfig;
155
+ requiresFinalAssistantBeforeIdle?: boolean;
156
+ }
157
+ export declare function isV4Spec(raw: unknown): raw is CliSpecV4;
158
+ export declare function initialState(spec: CliSpecV4): FsmState;
159
+ export declare function stateById(spec: CliSpecV4, id: string): FsmState | undefined;
160
+ /** Outgoing transitions from `stateId`, highest priority first, declaration
161
+ * order as tiebreak. Includes wildcard ("*") and list-membership sources. */
162
+ export declare function outgoingTransitions(spec: CliSpecV4, stateId: string): FsmTransition[];
163
+ /** Map a state to the dashboard status string, applying the documented
164
+ * defaults when `status` is not explicit. */
165
+ export declare function statusForState(state: FsmState): 'idle' | 'generating' | 'approval';
166
+ /**
167
+ * The modal kind for a state, or null when the state is not modal. A modal state
168
+ * that omits `modal_kind` defaults to 'approval' so the established
169
+ * auto-approve-any-modal behaviour is preserved for specs that have not yet
170
+ * declared a kind; picker/confirm states must opt out by declaring their kind.
171
+ * This is the value the cli-adapter carries on `activeModal.kind` and the
172
+ * auto-approve gate reads — see cli-provider-instance.maybeAutoApproveStatus.
173
+ */
174
+ export declare function modalKindForState(state: FsmState): 'approval' | 'picker' | 'confirm' | null;