@adhdev/daemon-core 0.9.82-rc.35 → 0.9.82-rc.350

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 (318) hide show
  1. package/dist/boot/daemon-lifecycle.d.ts +8 -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 +46 -2
  8. package/dist/cli-adapters/cli-script-runner.d.ts +117 -0
  9. package/dist/cli-adapters/cli-state-engine.d.ts +198 -0
  10. package/dist/cli-adapters/provider-cli-adapter.d.ts +116 -64
  11. package/dist/cli-adapters/provider-cli-parse.d.ts +4 -0
  12. package/dist/cli-adapters/provider-cli-runtime.d.ts +34 -0
  13. package/dist/cli-adapters/provider-cli-shared.d.ts +53 -0
  14. package/dist/cli-adapters/raw-terminal-io.d.ts +37 -0
  15. package/dist/cli-adapters/resolve-executable.d.ts +14 -0
  16. package/dist/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +6 -3
  17. package/dist/cli-adapters/terminal-backends/types.d.ts +10 -2
  18. package/dist/cli-adapters/terminal-screen.d.ts +4 -11
  19. package/dist/commands/cli-manager.d.ts +2 -1
  20. package/dist/commands/handler.d.ts +110 -0
  21. package/dist/commands/mesh-coordinator.d.ts +85 -1
  22. package/dist/commands/router.d.ts +324 -1
  23. package/dist/commands/upgrade-helper.d.ts +12 -0
  24. package/dist/config/chat-history.d.ts +9 -0
  25. package/dist/config/config.d.ts +5 -0
  26. package/dist/config/mesh-config.d.ts +77 -1
  27. package/dist/detection/ide-detector.d.ts +13 -0
  28. package/dist/detection/win32-ide-version.d.ts +37 -0
  29. package/dist/git/change-impact-config.d.ts +159 -0
  30. package/dist/git/git-commands.d.ts +11 -1
  31. package/dist/git/git-diff.d.ts +6 -0
  32. package/dist/git/git-executor.d.ts +11 -0
  33. package/dist/git/git-status.d.ts +23 -0
  34. package/dist/git/git-types.d.ts +2 -50
  35. package/dist/git/index.d.ts +2 -0
  36. package/dist/index.d.ts +52 -13
  37. package/dist/index.js +39739 -14302
  38. package/dist/index.js.map +1 -1
  39. package/dist/index.mjs +41369 -16055
  40. package/dist/index.mjs.map +1 -1
  41. package/dist/installer.d.ts +1 -4
  42. package/dist/ipc/local-ipc-server.d.ts +91 -0
  43. package/dist/launch.d.ts +1 -1
  44. package/dist/logging/async-batch-writer.d.ts +10 -0
  45. package/dist/logging/log-redactor.d.ts +24 -0
  46. package/dist/logging/log-tail-reader.d.ts +46 -0
  47. package/dist/mesh/contracts.d.ts +164 -0
  48. package/dist/mesh/coordinator-prompt.d.ts +36 -0
  49. package/dist/mesh/coordinator-registry.d.ts +59 -0
  50. package/dist/mesh/mesh-active-work.d.ts +174 -0
  51. package/dist/mesh/mesh-delivery-policy.d.ts +131 -0
  52. package/dist/mesh/mesh-events-coordinator.d.ts +169 -0
  53. package/dist/mesh/mesh-events-pending.d.ts +55 -0
  54. package/dist/mesh/mesh-events-stale.d.ts +40 -0
  55. package/dist/mesh/mesh-events-utils.d.ts +62 -0
  56. package/dist/mesh/mesh-events.d.ts +6 -49
  57. package/dist/mesh/mesh-fast-forward.d.ts +81 -0
  58. package/dist/mesh/mesh-host-ownership.d.ts +9 -0
  59. package/dist/mesh/mesh-init.d.ts +86 -0
  60. package/dist/mesh/mesh-ledger-reconciliation.d.ts +23 -3
  61. package/dist/mesh/mesh-ledger.d.ts +77 -1
  62. package/dist/mesh/mesh-missions.d.ts +164 -0
  63. package/dist/mesh/mesh-reconcile-loop.d.ts +7 -0
  64. package/dist/mesh/mesh-refine-batch.d.ts +68 -0
  65. package/dist/mesh/mesh-refine-status.d.ts +62 -0
  66. package/dist/mesh/mesh-review-inbox.d.ts +90 -0
  67. package/dist/mesh/mesh-routing.d.ts +70 -0
  68. package/dist/mesh/mesh-runtime-store.d.ts +419 -0
  69. package/dist/mesh/mesh-task-stats.d.ts +49 -0
  70. package/dist/mesh/mesh-unresolved-forward-outbox.d.ts +30 -0
  71. package/dist/mesh/mesh-work-queue.d.ts +218 -5
  72. package/dist/mesh/preview-freshness.d.ts +18 -0
  73. package/dist/mesh/refine-config.d.ts +216 -0
  74. package/dist/mesh/worktree-bootstrap-config.d.ts +135 -0
  75. package/dist/providers/acp-provider-instance.d.ts +2 -0
  76. package/dist/providers/approval-utils.d.ts +13 -0
  77. package/dist/providers/chat-message-normalization.d.ts +12 -0
  78. package/dist/providers/cli-provider-instance.d.ts +77 -3
  79. package/dist/providers/contracts.d.ts +139 -6
  80. package/dist/providers/external-sources.d.ts +71 -0
  81. package/dist/providers/native-history/antigravity-cli-transcript.d.ts +100 -0
  82. package/dist/providers/native-history/claude-cli-transcript.d.ts +70 -0
  83. package/dist/providers/native-history/codex-cli-transcript.d.ts +73 -0
  84. package/dist/providers/native-history/dispatcher.d.ts +27 -0
  85. package/dist/providers/native-history/hermes-cli-transcript.d.ts +30 -0
  86. package/dist/providers/native-history/index.d.ts +13 -0
  87. package/dist/providers/provider-instance-manager.d.ts +14 -0
  88. package/dist/providers/provider-instance.d.ts +15 -1
  89. package/dist/providers/provider-loader.d.ts +26 -4
  90. package/dist/providers/provider-trust.d.ts +31 -0
  91. package/dist/providers/read-chat-contract.d.ts +29 -0
  92. package/dist/providers/sdk/v1/builders/acp/detect-status.d.ts +68 -0
  93. package/dist/providers/sdk/v1/builders/cli/detect-status.d.ts +85 -0
  94. package/dist/providers/sdk/v1/builders/cli/parse-approval-squash.d.ts +59 -0
  95. package/dist/providers/sdk/v1/builders/cli/parse-approval.d.ts +65 -0
  96. package/dist/providers/sdk/v1/builders/cli/parse-session.d.ts +91 -0
  97. package/dist/providers/sdk/v1/builders/cli/visible-region.d.ts +42 -0
  98. package/dist/providers/sdk/v1/fixture-tooling/format.d.ts +126 -0
  99. package/dist/providers/sdk/v1/fixture-tooling/index.d.ts +8 -0
  100. package/dist/providers/sdk/v1/fixture-tooling/replay.d.ts +38 -0
  101. package/dist/providers/sdk/v1/index.d.ts +30 -0
  102. package/dist/providers/sdk/v1/sandbox/README-design.d.ts +193 -0
  103. package/dist/providers/sdk/v1/sandbox/require-whitelist.d.ts +74 -0
  104. package/dist/providers/sdk/v1/sandbox/script-runner.d.ts +98 -0
  105. package/dist/providers/sdk/v1/types/cli/index.d.ts +277 -0
  106. package/dist/providers/sdk/v1/types/common/index.d.ts +203 -0
  107. package/dist/providers/sdk/v1/validators/index.d.ts +5 -0
  108. package/dist/providers/sdk/v1/validators/manifest.d.ts +40 -0
  109. package/dist/providers/sdk/v1/validators/taint.d.ts +52 -0
  110. package/dist/providers/spec/adapter.d.ts +69 -0
  111. package/dist/providers/spec/cli-adapter.d.ts +217 -0
  112. package/dist/providers/spec/evaluator.d.ts +23 -0
  113. package/dist/providers/spec/fsm-driver.d.ts +322 -0
  114. package/dist/providers/spec/fsm-evaluator.d.ts +72 -0
  115. package/dist/providers/spec/fsm-loader.d.ts +14 -0
  116. package/dist/providers/spec/fsm-types.d.ts +144 -0
  117. package/dist/providers/spec/native-history-executor.d.ts +41 -0
  118. package/dist/providers/spec/pre-launch-trust.d.ts +16 -0
  119. package/dist/providers/spec/route.d.ts +4 -0
  120. package/dist/providers/spec/types.d.ts +180 -0
  121. package/dist/providers/status-monitor.d.ts +7 -7
  122. package/dist/providers/transcript-v2.d.ts +176 -0
  123. package/dist/providers/types/interactive-prompt.d.ts +84 -0
  124. package/dist/providers/working-dir.d.ts +17 -0
  125. package/dist/repo-mesh-types.d.ts +295 -13
  126. package/dist/sessions/registry.d.ts +6 -0
  127. package/dist/shared-types-extra.d.ts +2 -4
  128. package/dist/shared-types.d.ts +59 -2
  129. package/dist/status/normalize.d.ts +1 -1
  130. package/dist/status/normalize.js +1 -0
  131. package/dist/status/normalize.js.map +1 -1
  132. package/dist/status/normalize.mjs +1 -0
  133. package/dist/status/normalize.mjs.map +1 -1
  134. package/dist/status/reporter.d.ts +2 -0
  135. package/dist/status/snapshot.d.ts +26 -0
  136. package/dist/system/load-better-sqlite3.d.ts +21 -0
  137. package/dist/types.d.ts +5 -0
  138. package/package.json +7 -3
  139. package/src/agent-stream/poller.ts +2 -3
  140. package/src/agent-stream/provider-adapter.ts +1 -1
  141. package/src/boot/daemon-lifecycle.ts +55 -12
  142. package/src/boot/process-hardening.ts +89 -0
  143. package/src/build-info.ts +73 -0
  144. package/src/chat/source-machine.ts +534 -0
  145. package/src/chat/source-resolver.ts +0 -0
  146. package/src/chat/subscription-updates.ts +20 -1
  147. package/src/cli-adapter-types.d.ts +1 -0
  148. package/src/cli-adapter-types.ts +47 -2
  149. package/src/cli-adapters/cli-script-runner.ts +421 -0
  150. package/src/cli-adapters/cli-state-engine.ts +1215 -0
  151. package/src/cli-adapters/provider-cli-adapter.d.ts +1 -1
  152. package/src/cli-adapters/provider-cli-adapter.ts +774 -1141
  153. package/src/cli-adapters/provider-cli-parse.d.ts +1 -0
  154. package/src/cli-adapters/provider-cli-parse.ts +13 -0
  155. package/src/cli-adapters/provider-cli-runtime.ts +56 -7
  156. package/src/cli-adapters/provider-cli-shared.d.ts +4 -0
  157. package/src/cli-adapters/provider-cli-shared.ts +100 -11
  158. package/src/cli-adapters/pty-transport.ts +2 -1
  159. package/src/cli-adapters/raw-terminal-io.ts +252 -0
  160. package/src/cli-adapters/resolve-executable.ts +90 -0
  161. package/src/cli-adapters/session-host-transport.ts +2 -1
  162. package/src/cli-adapters/terminal-backends/ghostty-vt-backend.ts +53 -29
  163. package/src/cli-adapters/terminal-backends/types.ts +10 -3
  164. package/src/cli-adapters/terminal-screen.ts +16 -81
  165. package/src/commands/chat-commands.ts +1823 -62
  166. package/src/commands/cli-manager.ts +304 -14
  167. package/src/commands/handler.ts +809 -2
  168. package/src/commands/mesh-coordinator.ts +332 -122
  169. package/src/commands/router.ts +7505 -1311
  170. package/src/commands/stream-commands.ts +8 -0
  171. package/src/commands/upgrade-helper.ts +81 -30
  172. package/src/config/chat-history.ts +483 -24
  173. package/src/config/config.ts +12 -0
  174. package/src/config/mesh-config.ts +388 -6
  175. package/src/config/recent-activity.ts +8 -2
  176. package/src/daemon/dev-auto-implement.ts +3 -2
  177. package/src/daemon/dev-cli-debug.ts +10 -1
  178. package/src/detection/cli-detector.ts +28 -9
  179. package/src/detection/ide-detector.ts +55 -16
  180. package/src/detection/win32-ide-version.ts +106 -0
  181. package/src/git/change-impact-config.ts +354 -0
  182. package/src/git/git-commands.ts +55 -14
  183. package/src/git/git-diff.ts +53 -0
  184. package/src/git/git-executor.ts +12 -0
  185. package/src/git/git-status.ts +574 -43
  186. package/src/git/git-types.ts +14 -62
  187. package/src/git/git-worktree.ts +8 -1
  188. package/src/git/index.ts +16 -0
  189. package/src/index.ts +146 -12
  190. package/src/installer.d.ts +1 -1
  191. package/src/installer.ts +8 -6
  192. package/src/ipc/local-ipc-server.ts +278 -0
  193. package/src/launch.d.ts +1 -1
  194. package/src/launch.ts +37 -28
  195. package/src/logging/async-batch-writer.ts +55 -0
  196. package/src/logging/log-redactor.ts +100 -0
  197. package/src/logging/log-tail-reader.ts +220 -0
  198. package/src/logging/logger.ts +2 -1
  199. package/src/mesh/contracts.ts +329 -0
  200. package/src/mesh/coordinator-prompt.ts +234 -31
  201. package/src/mesh/coordinator-registry.ts +121 -0
  202. package/src/mesh/mesh-active-work.ts +623 -0
  203. package/src/mesh/mesh-delivery-policy.ts +315 -0
  204. package/src/mesh/mesh-events-coordinator.ts +2224 -0
  205. package/src/mesh/mesh-events-pending.ts +558 -0
  206. package/src/mesh/mesh-events-stale.ts +290 -0
  207. package/src/mesh/mesh-events-utils.ts +381 -0
  208. package/src/mesh/mesh-events.ts +30 -1035
  209. package/src/mesh/mesh-fast-forward.ts +839 -0
  210. package/src/mesh/mesh-host-ownership.ts +73 -0
  211. package/src/mesh/mesh-init.ts +260 -0
  212. package/src/mesh/mesh-ledger-reconciliation.ts +12 -5
  213. package/src/mesh/mesh-ledger.ts +590 -102
  214. package/src/mesh/mesh-missions.ts +322 -0
  215. package/src/mesh/mesh-reconcile-loop.ts +989 -0
  216. package/src/mesh/mesh-refine-batch.ts +197 -0
  217. package/src/mesh/mesh-refine-status.ts +231 -0
  218. package/src/mesh/mesh-review-inbox.ts +307 -0
  219. package/src/mesh/mesh-routing.ts +291 -0
  220. package/src/mesh/mesh-runtime-store.ts +1660 -0
  221. package/src/mesh/mesh-task-stats.ts +154 -0
  222. package/src/mesh/mesh-unresolved-forward-outbox.ts +185 -0
  223. package/src/mesh/mesh-work-queue.ts +901 -141
  224. package/src/mesh/preview-freshness.ts +118 -0
  225. package/src/mesh/refine-config.ts +423 -0
  226. package/src/mesh/worktree-bootstrap-config.ts +331 -0
  227. package/src/providers/acp-provider-instance.ts +25 -9
  228. package/src/providers/approval-utils.d.ts +4 -0
  229. package/src/providers/approval-utils.ts +47 -5
  230. package/src/providers/chat-message-normalization.ts +45 -5
  231. package/src/providers/cli-provider-instance.ts +1041 -99
  232. package/src/providers/contracts.d.ts +55 -0
  233. package/src/providers/contracts.ts +150 -6
  234. package/src/providers/extension-provider-instance.ts +12 -7
  235. package/src/providers/external-sources.ts +218 -0
  236. package/src/providers/ide-provider-instance.ts +35 -12
  237. package/src/providers/native-history/antigravity-cli-transcript.ts +643 -0
  238. package/src/providers/native-history/claude-cli-transcript.ts +396 -0
  239. package/src/providers/native-history/codex-cli-transcript.ts +479 -0
  240. package/src/providers/native-history/dispatcher.ts +340 -0
  241. package/src/providers/native-history/hermes-cli-transcript.ts +230 -0
  242. package/src/providers/native-history/index.ts +30 -0
  243. package/src/providers/provider-instance-manager.ts +30 -0
  244. package/src/providers/provider-instance.ts +10 -1
  245. package/src/providers/provider-loader.ts +670 -50
  246. package/src/providers/provider-schema.ts +87 -14
  247. package/src/providers/provider-trust.ts +114 -0
  248. package/src/providers/read-chat-contract.ts +76 -16
  249. package/src/providers/sdk/README.md +49 -0
  250. package/src/providers/sdk/v1/builders/acp/detect-status.ts +144 -0
  251. package/src/providers/sdk/v1/builders/cli/detect-status.ts +262 -0
  252. package/src/providers/sdk/v1/builders/cli/parse-approval-squash.ts +158 -0
  253. package/src/providers/sdk/v1/builders/cli/parse-approval.ts +250 -0
  254. package/src/providers/sdk/v1/builders/cli/parse-session.ts +276 -0
  255. package/src/providers/sdk/v1/builders/cli/visible-region.ts +143 -0
  256. package/src/providers/sdk/v1/fixture-tooling/format.ts +130 -0
  257. package/src/providers/sdk/v1/fixture-tooling/index.ts +22 -0
  258. package/src/providers/sdk/v1/fixture-tooling/replay.ts +352 -0
  259. package/src/providers/sdk/v1/index.ts +152 -0
  260. package/src/providers/sdk/v1/sandbox/README-design.ts +195 -0
  261. package/src/providers/sdk/v1/sandbox/require-whitelist.ts +472 -0
  262. package/src/providers/sdk/v1/sandbox/script-runner.ts +150 -0
  263. package/src/providers/sdk/v1/schemas/cli/provider.schema.json +504 -0
  264. package/src/providers/sdk/v1/schemas/primitives/acp-session-protocol-v1.json +131 -0
  265. package/src/providers/sdk/v1/schemas/primitives/native-history-codex-rollout-v1.json +66 -0
  266. package/src/providers/sdk/v1/schemas/primitives/tui-approval-squash-v1.json +91 -0
  267. package/src/providers/sdk/v1/schemas/primitives/tui-assistant-block-v1.json +91 -0
  268. package/src/providers/sdk/v1/schemas/primitives/tui-cue-ordering-v1.json +47 -0
  269. package/src/providers/sdk/v1/schemas/primitives/tui-dispatch-order-v1.json +32 -0
  270. package/src/providers/sdk/v1/schemas/primitives/tui-footer-chrome-v1.json +42 -0
  271. package/src/providers/sdk/v1/schemas/primitives/tui-index-finder-v1.json +27 -0
  272. package/src/providers/sdk/v1/schemas/primitives/tui-modal-v1.json +125 -0
  273. package/src/providers/sdk/v1/schemas/primitives/tui-prompt-marker-v1.json +45 -0
  274. package/src/providers/sdk/v1/schemas/primitives/tui-session-id-extraction-v1.json +46 -0
  275. package/src/providers/sdk/v1/schemas/primitives/tui-settled-prompt-v1.json +71 -0
  276. package/src/providers/sdk/v1/schemas/primitives/tui-spinner-v1.json +83 -0
  277. package/src/providers/sdk/v1/schemas/primitives/tui-transcript-pty-v1.json +83 -0
  278. package/src/providers/sdk/v1/schemas/primitives/tui-visible-region-v1.json +57 -0
  279. package/src/providers/sdk/v1/schemas/primitives/tui-welcome-screen-v1.json +35 -0
  280. package/src/providers/sdk/v1/types/cli/index.ts +365 -0
  281. package/src/providers/sdk/v1/types/common/index.ts +229 -0
  282. package/src/providers/sdk/v1/validators/index.ts +19 -0
  283. package/src/providers/sdk/v1/validators/manifest.ts +110 -0
  284. package/src/providers/sdk/v1/validators/taint.ts +309 -0
  285. package/src/providers/spec/adapter.ts +168 -0
  286. package/src/providers/spec/cli-adapter.ts +986 -0
  287. package/src/providers/spec/evaluator.ts +345 -0
  288. package/src/providers/spec/fsm-driver.ts +1065 -0
  289. package/src/providers/spec/fsm-evaluator.ts +255 -0
  290. package/src/providers/spec/fsm-loader.ts +120 -0
  291. package/src/providers/spec/fsm-types.ts +238 -0
  292. package/src/providers/spec/native-history-executor.ts +1136 -0
  293. package/src/providers/spec/pre-launch-trust.ts +104 -0
  294. package/src/providers/spec/route.ts +51 -0
  295. package/src/providers/spec/types.ts +226 -0
  296. package/src/providers/status-monitor.d.ts +7 -7
  297. package/src/providers/status-monitor.ts +37 -22
  298. package/src/providers/transcript-v2.ts +567 -0
  299. package/src/providers/types/interactive-prompt.ts +536 -0
  300. package/src/providers/version-archive.ts +64 -24
  301. package/src/providers/working-dir.ts +23 -0
  302. package/src/repo-mesh-types.ts +378 -14
  303. package/src/sessions/registry.ts +6 -0
  304. package/src/shared-types-extra.ts +2 -4
  305. package/src/shared-types.d.ts +8 -0
  306. package/src/shared-types.ts +64 -1
  307. package/src/status/builders.ts +26 -6
  308. package/src/status/normalize.ts +2 -0
  309. package/src/status/reporter.ts +19 -1
  310. package/src/status/snapshot.ts +95 -26
  311. package/src/system/host-memory.ts +29 -12
  312. package/src/system/load-better-sqlite3.ts +68 -0
  313. package/src/types.ts +5 -0
  314. package/dist/cli-adapters/terminal-backends/xterm-backend.d.ts +0 -17
  315. package/dist/mesh/mesh-sync.d.ts +0 -53
  316. package/src/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +0 -16
  317. package/src/cli-adapters/terminal-backends/xterm-backend.ts +0 -97
  318. package/src/mesh/mesh-sync.ts +0 -111
@@ -0,0 +1,104 @@
1
+ /**
2
+ * pre_launch_trust — generic, declarative "trust this folder before spawn"
3
+ * step for spec-backed CLI providers.
4
+ *
5
+ * Some agent CLIs (the canonical case is antigravity's `agy`) gate the first
6
+ * run in any new folder behind an interactive "Do you trust the files in this
7
+ * folder?" prompt. Under the v4 FSM spec path the daemon spawns the binary
8
+ * directly in the worktree (`cwd = workingDir`), so every fresh worktree —
9
+ * every delegated mesh task running in its own clone — hits that prompt and
10
+ * stalls until something clicks through it. (The legacy bash-wrapper symlink
11
+ * trick in provider.v1.json's `spawn` block is not used by SpecCliAdapter.)
12
+ *
13
+ * These CLIs persist their trusted folders in a JSON settings file as a string
14
+ * array. If we add the workspace path to that array *before* spawning, the
15
+ * prompt never appears. That is the most robust fix: the agent runs trusted
16
+ * from the first frame instead of relying on the FSM to detect and auto-click
17
+ * a modal whose wording or position could drift.
18
+ *
19
+ * The mechanism is intentionally data-driven and CLI-agnostic. A spec declares
20
+ * the settings file and the array key; the engine does the rest. CLIs that do
21
+ * not have a folder-trust gate simply omit `pre_launch_trust` and this code
22
+ * never runs for them — so other providers (claude/codex/hermes) are untouched.
23
+ */
24
+ 'use strict';
25
+
26
+ import * as fs from 'node:fs';
27
+ import * as os from 'node:os';
28
+ import * as path from 'node:path';
29
+ import type { PreLaunchTrust } from './fsm-types.js';
30
+ import { LOG } from '../../logging/logger.js';
31
+
32
+ /** Expand a leading `~` to the user's home directory. */
33
+ function expandHome(p: string): string {
34
+ if (p === '~') return os.homedir();
35
+ if (p.startsWith('~/')) return path.join(os.homedir(), p.slice(2));
36
+ return p;
37
+ }
38
+
39
+ /**
40
+ * Resolve the canonical, real (symlink-followed) absolute form of the
41
+ * workspace path. Trust files store realpaths, and matching has to be exact, so
42
+ * we normalise the same way the CLI does. Falls back to the raw path if the
43
+ * directory can't be stat'd (e.g. it does not exist yet).
44
+ */
45
+ function realWorkspacePath(workingDir: string): string {
46
+ try {
47
+ return fs.realpathSync(workingDir);
48
+ } catch {
49
+ return path.resolve(workingDir);
50
+ }
51
+ }
52
+
53
+ /**
54
+ * Idempotently add `workingDir` (realpath) to the trusted-folders array named
55
+ * by `trust.key` inside the JSON settings file at `trust.settings_path`.
56
+ *
57
+ * - Creates the file (and parent dir) if missing.
58
+ * - Preserves all other settings; only the trust array is touched.
59
+ * - No-ops if the path is already present.
60
+ * - Best-effort: any failure is logged and swallowed. A failed pre-trust must
61
+ * not block the launch — the worst case is the old behavior (the FSM still
62
+ * detects the trust modal as an approval state), not a crash.
63
+ *
64
+ * Returns the path that was added (realpath), or null if nothing changed /
65
+ * an error occurred — purely so callers/tests can assert the effect.
66
+ */
67
+ export function applyPreLaunchTrust(trust: PreLaunchTrust, workingDir: string): string | null {
68
+ const settingsPath = expandHome(trust.settings_path);
69
+ const key = trust.key;
70
+ const real = realWorkspacePath(workingDir);
71
+ try {
72
+ let parsed: Record<string, unknown> = {};
73
+ if (fs.existsSync(settingsPath)) {
74
+ const text = fs.readFileSync(settingsPath, 'utf8');
75
+ if (text.trim().length > 0) {
76
+ const json = JSON.parse(text);
77
+ if (json && typeof json === 'object' && !Array.isArray(json)) {
78
+ parsed = json as Record<string, unknown>;
79
+ }
80
+ }
81
+ }
82
+
83
+ const existing = parsed[key];
84
+ const list: string[] = Array.isArray(existing)
85
+ ? existing.filter((v): v is string => typeof v === 'string')
86
+ : [];
87
+
88
+ if (list.includes(real)) {
89
+ LOG.debug('pre-launch-trust', `[${trust.settings_path}] ${real} already trusted — no change`);
90
+ return null;
91
+ }
92
+
93
+ list.push(real);
94
+ parsed[key] = list;
95
+
96
+ fs.mkdirSync(path.dirname(settingsPath), { recursive: true });
97
+ fs.writeFileSync(settingsPath, `${JSON.stringify(parsed, null, 2)}\n`, 'utf8');
98
+ LOG.info('pre-launch-trust', `pre-trusted workspace in ${trust.settings_path} (key="${key}")`);
99
+ return real;
100
+ } catch (err) {
101
+ LOG.warn('pre-launch-trust', `failed to pre-trust workspace in ${trust.settings_path}: ${(err as Error).message}`);
102
+ return null;
103
+ }
104
+ }
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Routing — given a CLI provider definition, decide whether to drive
3
+ * it via the legacy ProviderCliAdapter (scripts/v1/*.js parsers +
4
+ * cli-state-engine) or via SpecCliAdapter (single spec.json +
5
+ * SpecDriver). The gate is the presence of spec.json in the resolved
6
+ * provider directory.
7
+ *
8
+ * This is the only place in the daemon that knows which path a given
9
+ * provider takes. Providers can be migrated one at a time by adding
10
+ * a spec.json next to their scripts/v1/, then deleting scripts/v1/.
11
+ */
12
+ 'use strict';
13
+
14
+ import * as fs from 'node:fs';
15
+ import * as path from 'node:path';
16
+ import { ProviderCliAdapter } from '../../cli-adapters/provider-cli-adapter.js';
17
+ import type { CliProviderModule } from '../../cli-adapters/provider-cli-adapter.js';
18
+ import type { PtyTransportFactory } from '../../cli-adapters/pty-transport.js';
19
+ import type { CliAdapter } from '../../cli-adapter-types.js';
20
+ import { SpecCliAdapter } from './cli-adapter.js';
21
+ import { LOG } from '../../logging/logger.js';
22
+
23
+ export function createCliAdapter(
24
+ provider: CliProviderModule,
25
+ workingDir: string,
26
+ cliArgs: string[],
27
+ extraEnv: Record<string, string>,
28
+ transportFactory?: PtyTransportFactory,
29
+ ): CliAdapter {
30
+ // Prefer the path provider-loader already resolved (it walks the
31
+ // compatibility[i].spec → specs/default.json → spec.json chain).
32
+ // Fall back to the legacy spec.json-in-provider-dir lookup if the
33
+ // loader didn't attach one — keeps out-of-tree providers that still
34
+ // use the original layout working.
35
+ const resolvedSpecPath = (provider as unknown as { _resolvedSpecPath?: string })._resolvedSpecPath;
36
+ const dir = (provider as unknown as { _resolvedProviderDir?: string })._resolvedProviderDir;
37
+ let specPath: string | undefined = resolvedSpecPath && fs.existsSync(resolvedSpecPath) ? resolvedSpecPath : undefined;
38
+ if (!specPath && dir) {
39
+ const legacy = path.join(dir, 'spec.json');
40
+ if (fs.existsSync(legacy)) specPath = legacy;
41
+ }
42
+ if (specPath) {
43
+ try {
44
+ LOG.info('spec-route', `[${provider.type}] routing through SpecCliAdapter (${path.relative(dir || '', specPath) || specPath})`);
45
+ return new SpecCliAdapter(specPath, workingDir, cliArgs, extraEnv, transportFactory);
46
+ } catch (err) {
47
+ LOG.warn('spec-route', `[${provider.type}] spec invalid, falling back to ProviderCliAdapter: ${(err as Error).message}`);
48
+ }
49
+ }
50
+ return new ProviderCliAdapter(provider, workingDir, cliArgs, extraEnv, transportFactory) as unknown as CliAdapter;
51
+ }
@@ -0,0 +1,226 @@
1
+ /**
2
+ * Shared types for the adhdev:cli/spec@4 FSM spec system.
3
+ *
4
+ * These are the building blocks reused by fsm-types.ts, evaluator.ts, and
5
+ * the rest of the spec stack. v3/v1 types have been removed — all providers
6
+ * are on v4.
7
+ */
8
+ 'use strict';
9
+
10
+ // ─────────────────────────────────────────────────────────────────────────────
11
+ // Shared / layout types
12
+ // ─────────────────────────────────────────────────────────────────────────────
13
+
14
+ export type Size = number | string;
15
+
16
+ export interface SectionPattern {
17
+ section?: string;
18
+ pattern: string;
19
+ flags?: string;
20
+ }
21
+
22
+ /** Inline wait_for shape used by open_picker control actions. */
23
+ export interface WaitForCondition {
24
+ section?: string;
25
+ regex?: string;
26
+ flags?: string;
27
+ }
28
+
29
+ export type ControlAction =
30
+ | { type: 'send_keys'; keys: string }
31
+ | {
32
+ type: 'open_picker';
33
+ trigger_keys: string;
34
+ wait_for: WaitForCondition;
35
+ extract_choices: SectionPattern;
36
+ submit_key: string;
37
+ }
38
+ | {
39
+ type: 'attach_image';
40
+ method: 'tempfile_then_keys';
41
+ keys_template: string;
42
+ };
43
+
44
+ export interface Control {
45
+ id: string;
46
+ label: string;
47
+ visible_when_state?: string[];
48
+ action: ControlAction;
49
+ }
50
+
51
+ export interface NotificationRule {
52
+ id: string;
53
+ when_state: string;
54
+ title: string;
55
+ body?: string;
56
+ }
57
+
58
+ export interface DelegateTrigger {
59
+ id: string;
60
+ when_state: string;
61
+ after_duration_ms?: number;
62
+ task_template: string;
63
+ }
64
+
65
+ export interface NativeHistoryConfig {
66
+ reader?: 'claude-cli' | 'codex-cli' | 'antigravity-cli' | 'hermes-cli';
67
+ source?: NativeHistorySource;
68
+ override_path?: string;
69
+ }
70
+
71
+ export type NativeHistorySource =
72
+ | NativeHistoryJsonlSource
73
+ | NativeHistorySqliteSource;
74
+
75
+ export interface NativeHistoryJsonlSource {
76
+ kind: 'jsonl';
77
+ path: string;
78
+ file_pattern?: string;
79
+ recent_window_ms?: number;
80
+ session_id_from?: 'filename_uuid' | 'first_record';
81
+ session_id_path?: string;
82
+ message_filter?: { where: string };
83
+ message_map: NativeHistoryMessageMap;
84
+ }
85
+
86
+ export interface NativeHistorySqliteSource {
87
+ kind: 'sqlite';
88
+ path: string;
89
+ session_query: string;
90
+ message_query: string;
91
+ message_map: NativeHistoryMessageMap;
92
+ }
93
+
94
+ export interface NativeHistoryMessageMap {
95
+ role: string;
96
+ content: string;
97
+ content_strip?: string[];
98
+ content_unwrap?: string[];
99
+ timestamp_ms?: string;
100
+ kind?: string;
101
+ /**
102
+ * Declarative tool-bubble extraction. Without it the executor only emits
103
+ * the text-bearing parts of each record, so a turn that is purely a tool
104
+ * call or tool result (no prose) is dropped — the restored transcript
105
+ * loses every tool interaction. When present, the executor walks each
106
+ * record's content blocks and emits an extra `kind:'tool'` message for
107
+ * any block whose `$.type` matches a tool shape.
108
+ *
109
+ * Defaults target the Anthropic-style content-block shape that claude-cli
110
+ * and codex-cli persist (blocks of `{ type: 'tool_use' | 'tool_result',
111
+ * name, input, content }`); a provider with a different on-disk shape
112
+ * overrides the field paths. Set `tools: {}` to opt in with the defaults.
113
+ */
114
+ tools?: NativeHistoryToolMap;
115
+ }
116
+
117
+ /**
118
+ * How to surface tool-call / tool-result blocks as `kind:'tool'` bubbles.
119
+ * Every field is optional — the defaults read the Anthropic block shape.
120
+ * Paths are jsonpath-lite evaluated against a single content block (the
121
+ * element of `$.message.content[]`), not the whole record.
122
+ */
123
+ export interface NativeHistoryToolMap {
124
+ /** Path to a block's discriminator. Default `$.type`. */
125
+ block_type?: string;
126
+ /** Block-type values that mean "a tool was invoked". Default
127
+ * `['tool_use', 'function_call', 'custom_tool_call']`. */
128
+ call_types?: string[];
129
+ /** Block-type values that mean "a tool returned". Default
130
+ * `['tool_result', 'function_call_output', 'custom_tool_call_output']`. */
131
+ result_types?: string[];
132
+ /** Path to the tool name on a call block. Default `$.name`. */
133
+ call_name?: string;
134
+ /** Path to the tool arguments on a call block. Default `$.input`. */
135
+ call_args?: string;
136
+ /** Path to the result payload on a result block. Default `$.content`. */
137
+ result_content?: string;
138
+ }
139
+
140
+ // ─────────────────────────────────────────────────────────────────────────────
141
+ // Section definition
142
+ // ─────────────────────────────────────────────────────────────────────────────
143
+
144
+ export interface AnchorContext {
145
+ prev?: string;
146
+ next?: string;
147
+ prev_flags?: string;
148
+ next_flags?: string;
149
+ }
150
+
151
+ export interface SectionDef {
152
+ from_top?: Size;
153
+ from_bottom?: Size;
154
+ until?: string; // section id OR regex (starts with ^)
155
+ /**
156
+ * Anchor regex(es). A single string anchors on the first/last matching line
157
+ * (per `anchor_last`). An array is an OR-set: every candidate line is one
158
+ * that matches ANY entry; with `anchor_last` the LAST such line across all
159
+ * patterns wins, otherwise the FIRST. This lets one section capture two
160
+ * different shapes — e.g. a box-divider modal AND a divider-less modal whose
161
+ * only stable landmark is the question line above its numbered choices.
162
+ */
163
+ anchor?: string | string[];
164
+ anchor_flags?: string;
165
+ anchor_last?: boolean;
166
+ /**
167
+ * Context guard(s) for the anchor. A single object applies to every anchor
168
+ * pattern. An array is matched positionally against an `anchor` array (entry
169
+ * i guards anchor i); a positional `undefined`/null entry means "no guard"
170
+ * for that anchor. A scalar `anchor` ignores array form beyond index 0.
171
+ */
172
+ anchor_context?: AnchorContext | (AnchorContext | null)[];
173
+ lines?: number;
174
+ until_regex?: string;
175
+ until_regex_flags?: string;
176
+ }
177
+
178
+ // ─────────────────────────────────────────────────────────────────────────────
179
+ // Conditions (shared with fsm-types.ts FsmCondition leaves)
180
+ // ─────────────────────────────────────────────────────────────────────────────
181
+
182
+ export interface RegexCondition {
183
+ section?: string;
184
+ matches: string;
185
+ flags?: string;
186
+ cursor_row_min?: number;
187
+ cursor_row_max?: number;
188
+ cursor_col_min?: number;
189
+ cursor_col_max?: number;
190
+ }
191
+
192
+ export interface ChangedCondition {
193
+ cursor_above: number;
194
+ changed: boolean;
195
+ stable_ms?: number;
196
+ }
197
+
198
+ export interface AllCondition {
199
+ all: Condition[];
200
+ }
201
+
202
+ export interface AnyCondition {
203
+ any: Condition[];
204
+ }
205
+
206
+ export type Condition = RegexCondition | ChangedCondition | AllCondition | AnyCondition;
207
+
208
+ // ─────────────────────────────────────────────────────────────────────────────
209
+ // Extraction helpers
210
+ // ─────────────────────────────────────────────────────────────────────────────
211
+
212
+ export interface ExtractTitle {
213
+ section?: string;
214
+ regex?: string;
215
+ flags?: string;
216
+ first_line?: true;
217
+ }
218
+
219
+ export interface ExtractButtons {
220
+ section?: string;
221
+ pattern: string;
222
+ flags?: string;
223
+ key_for_index: string;
224
+ min_count?: number;
225
+ continuation_lines?: boolean;
226
+ }
@@ -3,16 +3,16 @@
3
3
  *
4
4
  * Common across all Provider categories (IDE/Extension/CLI/ACP).
5
5
  * - Approval waiting (waiting_approval) notification
6
- * - Notification when generating persists for extended duration
6
+ * - No-progress watchdog: alert when an active turn makes no progress for a while
7
7
  * - All config toggleable via Provider Settings
8
8
  */
9
9
  export interface MonitorConfig {
10
10
  /** Enable awaiting-approval notification */
11
11
  approvalAlert: boolean;
12
- /** Prolonged generating notification enabled */
13
- longGeneratingAlert: boolean;
14
- /** Prolonged threshold (seconds) */
15
- longGeneratingThresholdSec: number;
12
+ /** No-progress watchdog notification enabled */
13
+ noProgressAlert: boolean;
14
+ /** No-progress threshold (seconds) */
15
+ noProgressThresholdSec: number;
16
16
  /** Repeat notification cooldown (seconds) */
17
17
  alertCooldownSec: number;
18
18
  }
@@ -28,7 +28,7 @@ export declare class StatusMonitor {
28
28
  private config;
29
29
  private lastAlertTime;
30
30
  private generatingStartTimes;
31
- private longGeneratingAlerted;
31
+ private noProgressAlerted;
32
32
  private lastProgressFingerprint;
33
33
  private lastProgressChangeAt;
34
34
  constructor(config?: Partial<MonitorConfig>);
@@ -40,7 +40,7 @@ export declare class StatusMonitor {
40
40
  * Check status transition → return notification event array.
41
41
  * Called from each onTick() or detectStatusTransition().
42
42
  */
43
- check(agentKey: string, status: string, now: number, progressFingerprint?: string): MonitorEvent[];
43
+ check(agentKey: string, status: string, now: number, progressFingerprint?: string, approvalPending?: boolean): MonitorEvent[];
44
44
  /** Cooldown check — prevent sending the same notification too frequently */
45
45
  private shouldAlert;
46
46
  /** Reset (on agent terminate/restart) */
@@ -3,26 +3,26 @@
3
3
  *
4
4
  * Common across all Provider categories (IDE/Extension/CLI/ACP).
5
5
  * - Approval waiting (waiting_approval) notification
6
- * - Notification when generating persists for extended duration
6
+ * - No-progress watchdog: alert when an active turn makes no progress for a while
7
7
  * - All config toggleable via Provider Settings
8
8
  */
9
9
 
10
10
  export interface MonitorConfig {
11
11
  /** Enable awaiting-approval notification */
12
12
  approvalAlert: boolean;
13
- /** Prolonged generating notification enabled */
14
- longGeneratingAlert: boolean;
15
- /** Prolonged threshold (seconds) */
16
- longGeneratingThresholdSec: number;
13
+ /** No-progress watchdog notification enabled */
14
+ noProgressAlert: boolean;
15
+ /** No-progress threshold (seconds) */
16
+ noProgressThresholdSec: number;
17
17
  /** Repeat notification cooldown (seconds) */
18
18
  alertCooldownSec: number;
19
19
  }
20
20
 
21
21
  export const DEFAULT_MONITOR_CONFIG: MonitorConfig = {
22
22
  approvalAlert: true,
23
- longGeneratingAlert: true,
24
- longGeneratingThresholdSec: 180, // 3 minutes
25
- alertCooldownSec: 60, // 1 minute cooldown
23
+ noProgressAlert: true,
24
+ noProgressThresholdSec: 180, // 3 minutes
25
+ alertCooldownSec: 60, // 1 minute cooldown
26
26
  };
27
27
 
28
28
  export interface MonitorEvent {
@@ -37,7 +37,7 @@ export class StatusMonitor {
37
37
  private config: MonitorConfig;
38
38
  private lastAlertTime = new Map<string, number>();
39
39
  private generatingStartTimes = new Map<string, number>();
40
- private longGeneratingAlerted = new Map<string, boolean>();
40
+ private noProgressAlerted = new Map<string, boolean>();
41
41
  private lastProgressFingerprint = new Map<string, string>();
42
42
  private lastProgressChangeAt = new Map<string, number>();
43
43
 
@@ -59,7 +59,7 @@ export class StatusMonitor {
59
59
  * Check status transition → return notification event array.
60
60
  * Called from each onTick() or detectStatusTransition().
61
61
  */
62
- check(agentKey: string, status: string, now: number, progressFingerprint?: string): MonitorEvent[] {
62
+ check(agentKey: string, status: string, now: number, progressFingerprint?: string, approvalPending?: boolean): MonitorEvent[] {
63
63
  const events: MonitorEvent[] = [];
64
64
 
65
65
  // 1. Approval waiting notification
@@ -74,11 +74,26 @@ export class StatusMonitor {
74
74
  }
75
75
  }
76
76
 
77
- // 2. Detect prolonged generating (identical for IDE/Extension/CLI/ACP)
77
+ // 2. No-progress watchdog (identical for IDE/Extension/CLI/ACP)
78
78
  if (status === 'generating' || status === 'streaming') {
79
+ // While an approval modal is pending we must NOT count the wait as
80
+ // no-progress. The assistant emits no tokens and the screen is frozen
81
+ // on the modal, so the progress fingerprint goes static — but this is
82
+ // a user action wait, not a freeze. Some callers (CLI/IDE auto-approve)
83
+ // also synthesize the reported status to 'generating' during the wait,
84
+ // so the plain `waiting_approval` branch below cannot catch it. Hold the
85
+ // progress anchor at `now` so the elapsed timer restarts the moment the
86
+ // approval clears and real generating resumes.
87
+ if (approvalPending) {
88
+ this.generatingStartTimes.set(agentKey, now);
89
+ this.lastProgressFingerprint.set(agentKey, progressFingerprint ?? '');
90
+ this.lastProgressChangeAt.set(agentKey, now);
91
+ this.noProgressAlerted.set(agentKey, false);
92
+ return events;
93
+ }
79
94
  if (!this.generatingStartTimes.has(agentKey)) {
80
95
  this.generatingStartTimes.set(agentKey, now);
81
- this.longGeneratingAlerted.set(agentKey, false);
96
+ this.noProgressAlerted.set(agentKey, false);
82
97
  const initialFingerprint = progressFingerprint ?? '';
83
98
  this.lastProgressFingerprint.set(agentKey, initialFingerprint);
84
99
  this.lastProgressChangeAt.set(agentKey, now);
@@ -88,17 +103,17 @@ export class StatusMonitor {
88
103
  if (previousFingerprint !== currentFingerprint) {
89
104
  this.lastProgressFingerprint.set(agentKey, currentFingerprint);
90
105
  this.lastProgressChangeAt.set(agentKey, now);
91
- this.longGeneratingAlerted.set(agentKey, false);
106
+ this.noProgressAlerted.set(agentKey, false);
92
107
  }
93
- if (this.config.longGeneratingAlert) {
108
+ if (this.config.noProgressAlert) {
94
109
  const progressChangedAt = this.lastProgressChangeAt.get(agentKey) || this.generatingStartTimes.get(agentKey)!;
95
110
  const elapsedSec = Math.round((now - progressChangedAt) / 1000);
96
- const alreadyAlerted = this.longGeneratingAlerted.get(agentKey) === true;
97
- if (elapsedSec > this.config.longGeneratingThresholdSec && !alreadyAlerted) {
98
- if (this.shouldAlert(agentKey + ':long_gen', now)) {
99
- this.longGeneratingAlerted.set(agentKey, true);
111
+ const alreadyAlerted = this.noProgressAlerted.get(agentKey) === true;
112
+ if (elapsedSec > this.config.noProgressThresholdSec && !alreadyAlerted) {
113
+ if (this.shouldAlert(agentKey + ':no_progress', now)) {
114
+ this.noProgressAlerted.set(agentKey, true);
100
115
  events.push({
101
- type: 'monitor:long_generating',
116
+ type: 'monitor:no_progress',
102
117
  agentKey,
103
118
  elapsedSec,
104
119
  timestamp: now,
@@ -110,7 +125,7 @@ export class StatusMonitor {
110
125
  } else {
111
126
  // Reset timer when switching to non-generating status
112
127
  this.generatingStartTimes.delete(agentKey);
113
- this.longGeneratingAlerted.delete(agentKey);
128
+ this.noProgressAlerted.delete(agentKey);
114
129
  this.lastProgressFingerprint.delete(agentKey);
115
130
  this.lastProgressChangeAt.delete(agentKey);
116
131
  }
@@ -132,7 +147,7 @@ export class StatusMonitor {
132
147
  reset(agentKey?: string): void {
133
148
  if (agentKey) {
134
149
  this.generatingStartTimes.delete(agentKey);
135
- this.longGeneratingAlerted.delete(agentKey);
150
+ this.noProgressAlerted.delete(agentKey);
136
151
  this.lastProgressFingerprint.delete(agentKey);
137
152
  this.lastProgressChangeAt.delete(agentKey);
138
153
  // Delete all cooldowns for this key
@@ -141,7 +156,7 @@ export class StatusMonitor {
141
156
  }
142
157
  } else {
143
158
  this.generatingStartTimes.clear();
144
- this.longGeneratingAlerted.clear();
159
+ this.noProgressAlerted.clear();
145
160
  this.lastProgressFingerprint.clear();
146
161
  this.lastProgressChangeAt.clear();
147
162
  this.lastAlertTime.clear();