@reticlehq/server 3.5.0 → 3.7.0

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 (721) hide show
  1. package/README.md +1 -1
  2. package/SKILL.md +123 -116
  3. package/dist/chromium-launch-options.d.ts +3 -1
  4. package/dist/chromium-launch-options.js +2 -1
  5. package/dist/command/cli/adhoc-suite.d.ts +14 -0
  6. package/dist/command/cli/adhoc-suite.js +42 -7
  7. package/dist/command/cli/adhoc-verdict.d.ts +19 -2
  8. package/dist/command/cli/adhoc-verdict.js +76 -9
  9. package/dist/command/cli/answers/gate-exit.d.ts +23 -0
  10. package/dist/command/cli/answers/gate-exit.js +45 -0
  11. package/dist/command/cli/answers/gate-hook-message.d.ts +2 -0
  12. package/dist/command/cli/answers/gate-hook-message.js +3 -1
  13. package/dist/command/cli/answers/open-note.d.ts +2 -0
  14. package/dist/command/cli/answers/open-note.js +22 -0
  15. package/dist/command/cli/auth/device-flow.d.ts +13 -2
  16. package/dist/command/cli/auth/device-flow.js +17 -0
  17. package/dist/command/cli/cli-doctor.js +14 -0
  18. package/dist/command/cli/cli-flow-commands.d.ts +0 -11
  19. package/dist/command/cli/cli-flow-commands.js +31 -112
  20. package/dist/command/cli/cli-kill.js +3 -2
  21. package/dist/command/cli/cli-parse-grammar.d.ts +24 -0
  22. package/dist/command/cli/cli-parse-grammar.js +75 -0
  23. package/dist/command/cli/cli-parse-verify.d.ts +2 -0
  24. package/dist/command/cli/cli-parse-verify.js +18 -0
  25. package/dist/command/cli/cli-parse.d.ts +19 -28
  26. package/dist/command/cli/cli-parse.js +82 -182
  27. package/dist/command/cli/cli-update-commands.d.ts +1 -1
  28. package/dist/command/cli/cli-update-commands.js +61 -9
  29. package/dist/command/cli/cli-usage.d.ts +33 -0
  30. package/dist/command/cli/cli-usage.js +287 -0
  31. package/dist/command/cli/cli-verify.d.ts +35 -5
  32. package/dist/command/cli/cli-verify.js +114 -35
  33. package/dist/command/cli/cloud-cli.d.ts +13 -0
  34. package/dist/command/cli/cloud-cli.js +192 -341
  35. package/dist/command/cli/cloud-kit.d.ts +12 -0
  36. package/dist/command/cli/cloud-kit.js +41 -2
  37. package/dist/command/cli/cloud-link.d.ts +57 -0
  38. package/dist/command/cli/cloud-link.js +308 -0
  39. package/dist/command/cli/cloud-login.d.ts +22 -0
  40. package/dist/command/cli/cloud-login.js +96 -8
  41. package/dist/command/cli/context-command.d.ts +1 -0
  42. package/dist/command/cli/context-command.js +33 -0
  43. package/dist/command/cli/daemon-start-options.d.ts +3 -0
  44. package/dist/command/cli/daemon-start-options.js +24 -3
  45. package/dist/command/cli/doctor/browser/chromium-hint.d.ts +46 -0
  46. package/dist/command/cli/doctor/browser/chromium-hint.js +99 -1
  47. package/dist/command/cli/doctor/doctor-coverage-line.d.ts +2 -0
  48. package/dist/command/cli/doctor/doctor-coverage-line.js +47 -0
  49. package/dist/command/cli/doctor/doctor-project-line.d.ts +0 -12
  50. package/dist/command/cli/doctor/doctor-project-line.js +5 -4
  51. package/dist/command/cli/doctor/doctor-rows.d.ts +6 -0
  52. package/dist/command/cli/doctor/doctor-rows.js +6 -0
  53. package/dist/command/cli/doctor/doctor-signing-line.d.ts +38 -0
  54. package/dist/command/cli/doctor/doctor-signing-line.js +114 -0
  55. package/dist/command/cli/drive/drive-attach.d.ts +27 -2
  56. package/dist/command/cli/drive/drive-attach.js +71 -4
  57. package/dist/command/cli/drive/drive-command.d.ts +2 -1
  58. package/dist/command/cli/drive/drive-command.js +13 -7
  59. package/dist/command/cli/known-regression.d.ts +13 -0
  60. package/dist/command/cli/known-regression.js +34 -0
  61. package/dist/command/cli/launch/sdk-version-match.d.ts +12 -0
  62. package/dist/command/cli/launch/sdk-version-match.js +25 -0
  63. package/dist/command/cli/lifecycle/daemon-lifecycle.js +15 -3
  64. package/dist/command/cli/mcp-command.d.ts +6 -0
  65. package/dist/command/cli/mcp-command.js +13 -5
  66. package/dist/command/cli/ports/port-holder.d.ts +10 -0
  67. package/dist/command/cli/ports/port-holder.js +25 -1
  68. package/dist/command/cli/project-name.d.ts +29 -1
  69. package/dist/command/cli/project-name.js +107 -2
  70. package/dist/command/cli/setup-mcp-cli.d.ts +17 -1
  71. package/dist/command/cli/setup-mcp-cli.js +35 -12
  72. package/dist/command/cli/status/status-lines.d.ts +1 -0
  73. package/dist/command/cli/status/status-lines.js +47 -2
  74. package/dist/command/cli/status/workspace-links.d.ts +10 -0
  75. package/dist/command/cli/status/workspace-links.js +29 -0
  76. package/dist/command/cli/try-command.d.ts +96 -0
  77. package/dist/command/cli/try-command.js +362 -0
  78. package/dist/command/cli/tutorial.d.ts +0 -100
  79. package/dist/command/cli/tutorial.js +0 -181
  80. package/dist/command/cli/verify-results.d.ts +19 -0
  81. package/dist/command/cli/verify-results.js +29 -0
  82. package/dist/command/cli-onboarding.d.ts +0 -11
  83. package/dist/command/cli-onboarding.js +0 -15
  84. package/dist/command/cli.d.ts +20 -0
  85. package/dist/command/cli.js +130 -104
  86. package/dist/command/daemon/binding/daemon-status-probe.d.ts +2 -0
  87. package/dist/command/daemon/binding/daemon-status-probe.js +1 -0
  88. package/dist/command/daemon/daemon-resilience.js +4 -4
  89. package/dist/command/daemon/daemon-resolve.d.ts +23 -1
  90. package/dist/command/daemon/daemon-resolve.js +79 -9
  91. package/dist/command/setup/agent-writer.d.ts +1 -1
  92. package/dist/command/setup/agent-writer.js +3 -2
  93. package/dist/command/setup/bringup/bridge-port.d.ts +3 -1
  94. package/dist/command/setup/bringup/bridge-port.js +13 -3
  95. package/dist/command/setup/bringup/connect-lease.d.ts +1 -0
  96. package/dist/command/setup/bringup/connect-lease.js +1 -0
  97. package/dist/command/setup/bringup/dev-server-log-cap.js +2 -0
  98. package/dist/command/setup/bringup/dev-server-wait.d.ts +8 -0
  99. package/dist/command/setup/bringup/dev-server-wait.js +19 -0
  100. package/dist/command/setup/bringup/ensure-daemon.js +9 -2
  101. package/dist/command/setup/init/agent-restart.d.ts +23 -0
  102. package/dist/command/setup/init/agent-restart.js +28 -0
  103. package/dist/command/setup/init/init-port.d.ts +14 -1
  104. package/dist/command/setup/init/init-port.js +32 -2
  105. package/dist/command/setup/init/init-runtime.d.ts +22 -2
  106. package/dist/command/setup/init/init-runtime.js +114 -38
  107. package/dist/command/setup/node-effects.d.ts +2 -0
  108. package/dist/command/setup/node-effects.js +38 -9
  109. package/dist/command/setup/probe/existing-app.d.ts +12 -0
  110. package/dist/command/setup/probe/existing-app.js +14 -0
  111. package/dist/command/setup/remaining-steps.js +2 -1
  112. package/dist/command/setup/run-setup.d.ts +34 -9
  113. package/dist/command/setup/run-setup.js +65 -51
  114. package/dist/command/setup/setup-command.d.ts +25 -1
  115. package/dist/command/setup/setup-command.js +59 -4
  116. package/dist/command/setup/setup-mcp.js +25 -2
  117. package/dist/command/setup/tauri-signing.d.ts +19 -0
  118. package/dist/command/setup/tauri-signing.js +79 -0
  119. package/dist/command/setup/terminal/listeners.d.ts +10 -1
  120. package/dist/command/setup/terminal/listeners.js +37 -6
  121. package/dist/command/update/update-nudge.d.ts +9 -0
  122. package/dist/command/update/update-nudge.js +1 -1
  123. package/dist/command/update/updater.js +11 -15
  124. package/dist/command/version/version-nudge.js +3 -0
  125. package/dist/command/version/version-skew.d.ts +20 -1
  126. package/dist/command/version/version-skew.js +49 -4
  127. package/dist/features/crawl/crawl-tools.js +4 -0
  128. package/dist/features/crawl/crawl.d.ts +6 -0
  129. package/dist/features/crawl/crawl.js +23 -2
  130. package/dist/features/exhaust/ledger.d.ts +21 -14
  131. package/dist/features/exhaust/ledger.js +35 -9
  132. package/dist/features/harness/app-findings.d.ts +2 -0
  133. package/dist/features/harness/app-findings.js +52 -0
  134. package/dist/features/harness/drive-report.d.ts +61 -1
  135. package/dist/features/harness/drive-report.js +394 -26
  136. package/dist/features/harness/drive-runs.d.ts +120 -0
  137. package/dist/features/harness/drive-runs.js +289 -0
  138. package/dist/features/harness/drivers.d.ts +10 -14
  139. package/dist/features/harness/drivers.js +10 -14
  140. package/dist/features/harness/explore/console-pages.d.ts +15 -0
  141. package/dist/features/harness/explore/console-pages.js +146 -0
  142. package/dist/features/harness/explore/disparity.d.ts +19 -0
  143. package/dist/features/harness/explore/disparity.js +71 -0
  144. package/dist/features/harness/explore/fake-app.d.ts +16 -0
  145. package/dist/features/harness/explore/fake-app.js +49 -0
  146. package/dist/features/harness/explore/goal-search.d.ts +26 -0
  147. package/dist/features/harness/explore/goal-search.js +144 -0
  148. package/dist/features/harness/explore/page-tree.d.ts +49 -0
  149. package/dist/features/harness/explore/page-tree.js +148 -0
  150. package/dist/features/harness/explore/site-map.d.ts +34 -0
  151. package/dist/features/harness/explore/site-map.js +150 -0
  152. package/dist/features/harness/fill-values.d.ts +3 -73
  153. package/dist/features/harness/fill-values.js +3 -169
  154. package/dist/features/harness/goals.d.ts +82 -0
  155. package/dist/features/harness/goals.js +330 -0
  156. package/dist/features/harness/harness.d.ts +51 -1
  157. package/dist/features/harness/harness.js +207 -6
  158. package/dist/features/harness/platform/drive-target.d.ts +30 -0
  159. package/dist/features/harness/platform/drive-target.js +81 -0
  160. package/dist/features/harness/platform/local-apps.d.ts +127 -0
  161. package/dist/features/harness/platform/local-apps.js +280 -0
  162. package/dist/features/harness/platform/persona-credentials.d.ts +20 -0
  163. package/dist/features/harness/platform/persona-credentials.js +69 -0
  164. package/dist/features/harness/platform/platform-drives.d.ts +61 -0
  165. package/dist/features/harness/platform/platform-drives.js +114 -0
  166. package/dist/features/harness/platform/refusal.d.ts +52 -0
  167. package/dist/features/harness/platform/refusal.js +71 -0
  168. package/dist/features/harness/platform/remote-drive.d.ts +186 -0
  169. package/dist/features/harness/platform/remote-drive.js +378 -0
  170. package/dist/features/harness/platform/script.d.ts +94 -0
  171. package/dist/features/harness/platform/script.js +260 -0
  172. package/dist/features/harness/platform/server-driver.d.ts +54 -0
  173. package/dist/features/harness/platform/server-driver.js +182 -0
  174. package/dist/features/harness/platform-config.d.ts +41 -1
  175. package/dist/features/harness/platform-config.js +106 -9
  176. package/dist/features/harness/route-guess.d.ts +13 -0
  177. package/dist/features/harness/route-guess.js +49 -0
  178. package/dist/features/harness/script/app-controls.d.ts +5 -0
  179. package/dist/features/harness/script/app-controls.js +40 -0
  180. package/dist/features/harness/script/lane-ids.d.ts +14 -0
  181. package/dist/features/harness/script/lane-ids.js +16 -0
  182. package/dist/features/harness/script/script-run.d.ts +70 -0
  183. package/dist/features/harness/script/script-run.js +606 -0
  184. package/dist/features/license/license.d.ts +2 -2
  185. package/dist/features/visual/step-shots.d.ts +31 -0
  186. package/dist/features/visual/step-shots.js +231 -0
  187. package/dist/features/visual/visual-tools.d.ts +10 -1
  188. package/dist/features/visual/visual-tools.js +62 -17
  189. package/dist/hooks/client-directory.d.ts +18 -0
  190. package/dist/hooks/client-directory.js +57 -0
  191. package/dist/hooks/coding-agents.d.ts +34 -0
  192. package/dist/hooks/coding-agents.js +117 -0
  193. package/dist/hooks/driven-by.d.ts +23 -0
  194. package/dist/hooks/driven-by.js +56 -0
  195. package/dist/hooks/hook-bus.d.ts +4 -0
  196. package/dist/hooks/hook-bus.js +18 -0
  197. package/dist/hooks/hook-commands.js +15 -4
  198. package/dist/hooks/tool-log.d.ts +9 -0
  199. package/dist/hooks/tool-log.js +29 -0
  200. package/dist/index.d.ts +2 -0
  201. package/dist/index.js +80 -243
  202. package/dist/judgement/capsule/capsule-store.d.ts +2 -2
  203. package/dist/judgement/capsule/causal-summary.d.ts +15 -1
  204. package/dist/judgement/capsule/causal-summary.js +33 -0
  205. package/dist/judgement/runs/artifact/build-verification-run.d.ts +1 -1
  206. package/dist/judgement/runs/artifact/build-verification-run.js +25 -3
  207. package/dist/judgement/runs/artifact/gap-summary.d.ts +0 -18
  208. package/dist/judgement/runs/artifact/gap-summary.js +12 -3
  209. package/dist/judgement/runs/artifact/replay-mapping.d.ts +1 -1
  210. package/dist/judgement/runs/artifact/replay-mapping.js +37 -11
  211. package/dist/judgement/runs/artifact/run-store.d.ts +14 -2
  212. package/dist/judgement/runs/artifact/run-store.js +195 -3
  213. package/dist/judgement/runs/context-tools.js +59 -1
  214. package/dist/judgement/runs/default-run-id.d.ts +3 -0
  215. package/dist/judgement/runs/default-run-id.js +16 -0
  216. package/dist/judgement/runs/drive-run.d.ts +71 -1
  217. package/dist/judgement/runs/drive-run.js +317 -5
  218. package/dist/judgement/runs/repair-prompt.js +1 -1
  219. package/dist/judgement/runs/resume.d.ts +44 -0
  220. package/dist/judgement/runs/resume.js +137 -0
  221. package/dist/judgement/runs/reticle-runner.js +13 -3
  222. package/dist/judgement/runs/runner-port.d.ts +5 -1
  223. package/dist/judgement/runs/runner-port.js +8 -2
  224. package/dist/judgement/runs/verification-sync.d.ts +5 -2
  225. package/dist/judgement/runs/verification-sync.js +40 -18
  226. package/dist/language/flows/change/gate.d.ts +10 -0
  227. package/dist/language/flows/change/gate.js +22 -0
  228. package/dist/language/flows/decision.js +36 -1
  229. package/dist/language/flows/fields/flow-secret-field.d.ts +12 -0
  230. package/dist/language/flows/fields/flow-secret-field.js +25 -2
  231. package/dist/language/flows/flow-anchor.d.ts +61 -10
  232. package/dist/language/flows/flow-anchor.js +98 -6
  233. package/dist/language/flows/flow-cross-step.d.ts +15 -0
  234. package/dist/language/flows/flow-cross-step.js +21 -0
  235. package/dist/language/flows/flow-intent.d.ts +1 -0
  236. package/dist/language/flows/flow-journey.d.ts +6 -0
  237. package/dist/language/flows/flow-journey.js +20 -0
  238. package/dist/language/flows/flow-learning.d.ts +4 -0
  239. package/dist/language/flows/flow-learning.js +45 -14
  240. package/dist/language/flows/flow-mutate-tools.js +5 -3
  241. package/dist/language/flows/flow-replay-run.d.ts +23 -9
  242. package/dist/language/flows/flow-replay-run.js +115 -110
  243. package/dist/language/flows/flow-replay-types.d.ts +1 -1
  244. package/dist/language/flows/flow-replay.d.ts +40 -1
  245. package/dist/language/flows/flow-replay.js +110 -22
  246. package/dist/language/flows/flow-result.d.ts +22 -1
  247. package/dist/language/flows/flow-result.js +47 -2
  248. package/dist/language/flows/flow-scope.js +5 -1
  249. package/dist/language/flows/flow-step-runners.d.ts +22 -2
  250. package/dist/language/flows/flow-step-runners.js +247 -47
  251. package/dist/language/flows/flow-store-for-session.d.ts +2 -2
  252. package/dist/language/flows/flow-store-for-session.js +7 -3
  253. package/dist/language/flows/flow-tools.d.ts +10 -0
  254. package/dist/language/flows/flow-tools.js +112 -89
  255. package/dist/language/flows/flows.d.ts +16 -1
  256. package/dist/language/flows/flows.js +74 -12
  257. package/dist/language/flows/heal-run.js +6 -4
  258. package/dist/language/flows/narrow-write.d.ts +7 -0
  259. package/dist/language/flows/narrow-write.js +36 -1
  260. package/dist/language/flows/recording/flake.d.ts +2 -2
  261. package/dist/language/flows/recording/recording-backtrack.js +14 -1
  262. package/dist/language/flows/recording/tape/recordings.d.ts +58 -4
  263. package/dist/language/flows/recording/tape/recordings.js +95 -13
  264. package/dist/language/flows/replay-from-hud.d.ts +20 -0
  265. package/dist/language/flows/replay-from-hud.js +51 -0
  266. package/dist/language/flows/replay.d.ts +9 -5
  267. package/dist/language/flows/replay.js +56 -15
  268. package/dist/language/flows/single-replay.d.ts +7 -0
  269. package/dist/language/flows/single-replay.js +26 -0
  270. package/dist/language/flows/suite/suite-flakes.js +2 -0
  271. package/dist/language/flows/suite-selection.d.ts +2 -15
  272. package/dist/language/flows/suite-selection.js +4 -3
  273. package/dist/language/flows/verify-change-tools.d.ts +1 -0
  274. package/dist/language/flows/verify-change-tools.js +202 -191
  275. package/dist/launch-chromium.d.ts +27 -5
  276. package/dist/launch-chromium.js +38 -8
  277. package/dist/memory/cloud/cloud-config.d.ts +22 -1
  278. package/dist/memory/cloud/cloud-config.js +34 -5
  279. package/dist/memory/cloud/cloud-sync.d.ts +17 -14
  280. package/dist/memory/cloud/cloud-sync.js +15 -4
  281. package/dist/memory/cloud/harness-config.d.ts +75 -1
  282. package/dist/memory/cloud/harness-config.js +115 -24
  283. package/dist/memory/cloud/hud-notices-source.d.ts +21 -0
  284. package/dist/memory/cloud/hud-notices-source.js +128 -0
  285. package/dist/memory/cloud/memory-scope.d.ts +161 -0
  286. package/dist/memory/cloud/memory-scope.js +227 -0
  287. package/dist/memory/cloud/sync-cycle.d.ts +44 -7
  288. package/dist/memory/cloud/sync-cycle.js +129 -15
  289. package/dist/memory/cloud/sync-daemon.d.ts +11 -0
  290. package/dist/memory/cloud/sync-daemon.js +121 -9
  291. package/dist/memory/cloud/sync-disk.d.ts +1 -1
  292. package/dist/memory/cloud/sync-disk.js +31 -10
  293. package/dist/memory/cloud/sync-screenshots.d.ts +32 -0
  294. package/dist/memory/cloud/sync-screenshots.js +105 -0
  295. package/dist/memory/cloud/unsynced-roots.d.ts +47 -0
  296. package/dist/memory/cloud/unsynced-roots.js +166 -0
  297. package/dist/memory/impact/account-watch.d.ts +34 -0
  298. package/dist/memory/impact/account-watch.js +59 -0
  299. package/dist/memory/impact/impact-recorder.d.ts +8 -0
  300. package/dist/memory/impact/impact-recorder.js +12 -2
  301. package/dist/memory/impact/impact-store.d.ts +17 -4
  302. package/dist/memory/impact/impact-store.js +169 -63
  303. package/dist/memory/intent/inline-intent.d.ts +1 -0
  304. package/dist/memory/intent/intent-shard-store.js +16 -4
  305. package/dist/memory/intent/intent-shard.d.ts +14 -2
  306. package/dist/memory/intent/intent-store.d.ts +1 -0
  307. package/dist/memory/intent/intent-tools.js +122 -4
  308. package/dist/memory/intent/open-intents.d.ts +6 -0
  309. package/dist/memory/intent/open-intents.js +10 -1
  310. package/dist/memory/intent/settled-words.d.ts +24 -0
  311. package/dist/memory/intent/settled-words.js +130 -0
  312. package/dist/memory/journal/drive-flow.d.ts +16 -0
  313. package/dist/memory/journal/drive-flow.js +34 -2
  314. package/dist/memory/journal/drive-run-flush.d.ts +2 -0
  315. package/dist/memory/journal/drive-run-flush.js +20 -5
  316. package/dist/memory/journal/envelope.d.ts +8 -8
  317. package/dist/memory/journal/journal-recorder.js +52 -3
  318. package/dist/memory/journal/on-disk/retention.d.ts +8 -0
  319. package/dist/memory/journal/on-disk/retention.js +32 -2
  320. package/dist/memory/journal/on-disk/startup-maintenance.js +3 -1
  321. package/dist/memory/journal/on-disk/workspace-tiers.js +9 -4
  322. package/dist/memory/journal/session-end.d.ts +15 -1
  323. package/dist/memory/journal/session-end.js +42 -9
  324. package/dist/memory/project/artifact-root-resolver.d.ts +26 -1
  325. package/dist/memory/project/artifact-root-resolver.js +125 -16
  326. package/dist/memory/project/artifact-root.d.ts +46 -8
  327. package/dist/memory/project/artifact-root.js +89 -10
  328. package/dist/memory/project/dir/reticle-dir.d.ts +18 -2
  329. package/dist/memory/project/dir/reticle-dir.js +26 -3
  330. package/dist/memory/project/link-directory.d.ts +15 -0
  331. package/dist/memory/project/link-directory.js +44 -0
  332. package/dist/memory/project/project-tools.js +22 -3
  333. package/dist/memory/project/root-claims.d.ts +6 -0
  334. package/dist/memory/project/root-claims.js +39 -0
  335. package/dist/memory/project/session-root.d.ts +26 -1
  336. package/dist/memory/project/session-root.js +49 -5
  337. package/dist/memory/project/sync-status.d.ts +85 -0
  338. package/dist/memory/project/sync-status.js +224 -0
  339. package/dist/memory/recall/memory-tools.js +47 -2
  340. package/dist/memory/recall/platform-memory.d.ts +34 -0
  341. package/dist/memory/recall/platform-memory.js +139 -0
  342. package/dist/memory/recall/project-memory.d.ts +19 -0
  343. package/dist/memory/recall/project-memory.js +80 -13
  344. package/dist/portal/bridge/bridge.d.ts +9 -3
  345. package/dist/portal/bridge/bridge.js +82 -22
  346. package/dist/portal/bridge/harness-request.d.ts +23 -0
  347. package/dist/portal/bridge/harness-request.js +27 -0
  348. package/dist/portal/bridge/pairing-token.d.ts +9 -0
  349. package/dist/portal/bridge/pairing-token.js +17 -0
  350. package/dist/portal/bridge/wrong-path.d.ts +17 -0
  351. package/dist/portal/bridge/wrong-path.js +35 -0
  352. package/dist/portal/input/network-mock-tools.js +11 -2
  353. package/dist/portal/input/real-input.d.ts +83 -10
  354. package/dist/portal/input/real-input.js +218 -30
  355. package/dist/portal/input/viewport-tools.js +3 -3
  356. package/dist/portal/pool/browser-pool.d.ts +70 -9
  357. package/dist/portal/pool/browser-pool.js +190 -37
  358. package/dist/portal/pool/context-permissions.d.ts +33 -0
  359. package/dist/portal/pool/context-permissions.js +33 -0
  360. package/dist/portal/pool/lease-marker-stamp.d.ts +23 -0
  361. package/dist/portal/pool/lease-marker-stamp.js +49 -0
  362. package/dist/portal/pool/playwright-launcher.d.ts +35 -0
  363. package/dist/portal/pool/playwright-launcher.js +64 -3
  364. package/dist/portal/pool/pool-contract.d.ts +28 -5
  365. package/dist/portal/session/agent-link.d.ts +8 -0
  366. package/dist/portal/session/agent-link.js +17 -0
  367. package/dist/portal/session/command-payload.d.ts +8 -0
  368. package/dist/portal/session/command-payload.js +24 -0
  369. package/dist/portal/session/daemon-answers.d.ts +3 -3
  370. package/dist/portal/session/daemon-answers.js +4 -2
  371. package/dist/portal/session/dev-server/dev-command.d.ts +21 -0
  372. package/dist/portal/session/dev-server/dev-command.js +87 -12
  373. package/dist/portal/session/facts/departure-note.d.ts +22 -0
  374. package/dist/portal/session/facts/departure-note.js +47 -0
  375. package/dist/portal/session/facts/observed-state.d.ts +16 -18
  376. package/dist/portal/session/facts/observed-state.js +46 -3
  377. package/dist/portal/session/facts/session-replaced.d.ts +5 -0
  378. package/dist/portal/session/facts/session-replaced.js +5 -0
  379. package/dist/portal/session/first-run-wiring.d.ts +42 -0
  380. package/dist/portal/session/first-run-wiring.js +132 -0
  381. package/dist/portal/session/human/live-control.d.ts +9 -2
  382. package/dist/portal/session/human/live-control.js +12 -3
  383. package/dist/portal/session/human/notes-ledger.d.ts +20 -0
  384. package/dist/portal/session/human/notes-ledger.js +55 -0
  385. package/dist/portal/session/human/review-store.d.ts +12 -0
  386. package/dist/portal/session/human/review-store.js +18 -10
  387. package/dist/portal/session/live-control-tools.d.ts +0 -13
  388. package/dist/portal/session/live-control-tools.js +107 -13
  389. package/dist/portal/session/narration-args.d.ts +5 -0
  390. package/dist/portal/session/narration-args.js +17 -0
  391. package/dist/portal/session/no-session-diagnosis.d.ts +8 -1
  392. package/dist/portal/session/no-session-diagnosis.js +46 -9
  393. package/dist/portal/session/no-session-next-action.d.ts +31 -0
  394. package/dist/portal/session/no-session-next-action.js +159 -60
  395. package/dist/portal/session/no-session-watch.d.ts +14 -1
  396. package/dist/portal/session/no-session-watch.js +227 -17
  397. package/dist/portal/session/presence/session-lease.js +1 -1
  398. package/dist/portal/session/presence/session-mirror.js +3 -0
  399. package/dist/portal/session/recorded-gaps.d.ts +97 -0
  400. package/dist/portal/session/recorded-gaps.js +251 -0
  401. package/dist/portal/session/serving-directory.d.ts +27 -0
  402. package/dist/portal/session/serving-directory.js +45 -0
  403. package/dist/portal/session/session-health.d.ts +18 -0
  404. package/dist/portal/session/session-health.js +9 -1
  405. package/dist/portal/session/session-info.d.ts +8 -1
  406. package/dist/portal/session/session-info.js +8 -1
  407. package/dist/portal/session/session-manager.d.ts +39 -0
  408. package/dist/portal/session/session-manager.js +98 -11
  409. package/dist/portal/session/session-reaper.js +4 -1
  410. package/dist/portal/session/session-successor.d.ts +13 -0
  411. package/dist/portal/session/session-successor.js +1 -1
  412. package/dist/portal/session/session-tools.js +26 -3
  413. package/dist/portal/session/session.d.ts +22 -30
  414. package/dist/portal/session/session.js +81 -79
  415. package/dist/portal/session/timing/command-timeout.js +25 -1
  416. package/dist/portal/session/timing/wall-clock.d.ts +1 -1
  417. package/dist/portal/session/timing/wall-clock.js +1 -1
  418. package/dist/portal/session/zero-install-first-call.d.ts +31 -0
  419. package/dist/portal/session/zero-install-first-call.js +88 -0
  420. package/dist/start-options.d.ts +12 -0
  421. package/dist/start-wiring.d.ts +63 -0
  422. package/dist/start-wiring.js +169 -0
  423. package/dist/status-payload.d.ts +23 -1
  424. package/dist/status-payload.js +36 -1
  425. package/dist/surface/http-server.js +18 -2
  426. package/dist/surface/mcp/attach-memory.d.ts +1 -0
  427. package/dist/surface/mcp/attach-memory.js +12 -1
  428. package/dist/surface/mcp/mcp-proxy.d.ts +9 -0
  429. package/dist/surface/mcp/mcp-proxy.js +65 -13
  430. package/dist/surface/mcp/mcp.d.ts +34 -6
  431. package/dist/surface/mcp/mcp.js +61 -17
  432. package/dist/surface/mcp/proxy/drive-calls.d.ts +10 -0
  433. package/dist/surface/mcp/proxy/drive-calls.js +27 -0
  434. package/dist/surface/mcp/proxy/mcp-post-transport.js +5 -0
  435. package/dist/surface/mcp/server-instructions.d.ts +4 -2
  436. package/dist/surface/mcp/server-instructions.js +32 -14
  437. package/dist/surface/mcp/shared-params.js +2 -2
  438. package/dist/surface/mcp/surface-vocabulary.d.ts +2 -0
  439. package/dist/surface/mcp/surface-vocabulary.js +1 -0
  440. package/dist/surface/tools/account-tool.d.ts +22 -0
  441. package/dist/surface/tools/account-tool.js +157 -0
  442. package/dist/surface/tools/act/act-danger.d.ts +11 -0
  443. package/dist/surface/tools/act/act-danger.js +38 -1
  444. package/dist/surface/tools/act/act-observation.d.ts +33 -0
  445. package/dist/surface/tools/act/act-observation.js +57 -0
  446. package/dist/surface/tools/act/act-preflight.js +25 -2
  447. package/dist/surface/tools/act/act-target.js +8 -3
  448. package/dist/surface/tools/act/navigation/navigate-arrival.d.ts +8 -0
  449. package/dist/surface/tools/act/navigation/navigate-arrival.js +56 -2
  450. package/dist/surface/tools/act/resolve-target.d.ts +1 -1
  451. package/dist/surface/tools/act/resolve-target.js +18 -3
  452. package/dist/surface/tools/act/screen-request.d.ts +34 -0
  453. package/dist/surface/tools/act/screen-request.js +113 -0
  454. package/dist/surface/tools/act/sequence-grade.d.ts +8 -0
  455. package/dist/surface/tools/act/sequence-grade.js +13 -2
  456. package/dist/surface/tools/act/settle-in-flight.js +25 -3
  457. package/dist/surface/tools/act-sequence-tool.js +138 -29
  458. package/dist/surface/tools/act-tools.d.ts +0 -9
  459. package/dist/surface/tools/act-tools.js +71 -41
  460. package/dist/surface/tools/agent/app-notes-learning.d.ts +7 -0
  461. package/dist/surface/tools/agent/app-notes-learning.js +80 -0
  462. package/dist/surface/tools/agent/app-notes.d.ts +4 -0
  463. package/dist/surface/tools/agent/app-notes.js +48 -0
  464. package/dist/surface/tools/agent/build-staleness.d.ts +7 -0
  465. package/dist/surface/tools/agent/build-staleness.js +62 -0
  466. package/dist/surface/tools/agent/compact-envelope.d.ts +80 -0
  467. package/dist/surface/tools/agent/compact-envelope.js +374 -0
  468. package/dist/surface/tools/agent/for-the-agent.d.ts +12 -0
  469. package/dist/surface/tools/agent/for-the-agent.js +44 -0
  470. package/dist/surface/tools/agent/notices.d.ts +50 -0
  471. package/dist/surface/tools/agent/notices.js +152 -0
  472. package/dist/surface/tools/agent/reteach.d.ts +11 -0
  473. package/dist/surface/tools/agent/reteach.js +50 -0
  474. package/dist/surface/tools/args/alias-args.d.ts +5 -0
  475. package/dist/surface/tools/args/alias-args.js +10 -0
  476. package/dist/surface/tools/args/confirm-dangerous-arg.d.ts +6 -0
  477. package/dist/surface/tools/args/confirm-dangerous-arg.js +6 -0
  478. package/dist/surface/tools/assert/assert-source.d.ts +15 -0
  479. package/dist/surface/tools/assert/assert-source.js +40 -0
  480. package/dist/surface/tools/assert/assert-verdict.d.ts +1 -1
  481. package/dist/surface/tools/assert/assert-verdict.js +42 -17
  482. package/dist/surface/tools/browser-tools.js +51 -2
  483. package/dist/surface/tools/chat-drives.d.ts +101 -0
  484. package/dist/surface/tools/chat-drives.js +409 -0
  485. package/dist/surface/tools/coverage-tools.d.ts +2 -10
  486. package/dist/surface/tools/coverage-tools.js +2 -53
  487. package/dist/surface/tools/dynamic-tools.js +29 -1
  488. package/dist/surface/tools/empty-session-list.d.ts +51 -0
  489. package/dist/surface/tools/empty-session-list.js +120 -0
  490. package/dist/surface/tools/error-recovery.d.ts +14 -0
  491. package/dist/surface/tools/error-recovery.js +105 -8
  492. package/dist/surface/tools/explore-tools.d.ts +31 -1
  493. package/dist/surface/tools/explore-tools.js +438 -66
  494. package/dist/surface/tools/feedback-tools.d.ts +2 -3
  495. package/dist/surface/tools/feedback-tools.js +18 -3
  496. package/dist/surface/tools/gap-novelty.d.ts +3 -1
  497. package/dist/surface/tools/gap-novelty.js +8 -1
  498. package/dist/surface/tools/harness-explore.d.ts +118 -57
  499. package/dist/surface/tools/harness-explore.js +344 -292
  500. package/dist/surface/tools/harness-gate.d.ts +88 -0
  501. package/dist/surface/tools/harness-gate.js +235 -0
  502. package/dist/surface/tools/harness-hunt.d.ts +43 -0
  503. package/dist/surface/tools/harness-hunt.js +215 -0
  504. package/dist/surface/tools/harness-plan.d.ts +17 -0
  505. package/dist/surface/tools/harness-plan.js +38 -0
  506. package/dist/surface/tools/harness-script.d.ts +30 -0
  507. package/dist/surface/tools/harness-script.js +560 -0
  508. package/dist/surface/tools/harness-tab-guard.d.ts +5 -0
  509. package/dist/surface/tools/harness-tab-guard.js +27 -0
  510. package/dist/surface/tools/harness-toolset.d.ts +22 -1
  511. package/dist/surface/tools/harness-toolset.js +101 -7
  512. package/dist/surface/tools/human-notes.d.ts +16 -0
  513. package/dist/surface/tools/human-notes.js +27 -0
  514. package/dist/surface/tools/invoke-tool.d.ts +5 -2
  515. package/dist/surface/tools/invoke-tool.js +263 -85
  516. package/dist/surface/tools/lease-hint.js +26 -5
  517. package/dist/surface/tools/lease-permissions.d.ts +33 -0
  518. package/dist/surface/tools/lease-permissions.js +73 -0
  519. package/dist/surface/tools/lease-readiness.d.ts +38 -0
  520. package/dist/surface/tools/lease-readiness.js +57 -0
  521. package/dist/surface/tools/lease-seed.d.ts +49 -0
  522. package/dist/surface/tools/lease-seed.js +167 -0
  523. package/dist/surface/tools/lease-tools.d.ts +13 -24
  524. package/dist/surface/tools/lease-tools.js +146 -197
  525. package/dist/surface/tools/live-call-text.js +4 -4
  526. package/dist/surface/tools/merge-tools.js +42 -2
  527. package/dist/surface/tools/merged-name-redirect.js +4 -0
  528. package/dist/surface/tools/next-step.d.ts +29 -0
  529. package/dist/surface/tools/next-step.js +214 -0
  530. package/dist/surface/tools/observe-tools.js +45 -9
  531. package/dist/surface/tools/platform-moment.d.ts +72 -0
  532. package/dist/surface/tools/platform-moment.js +296 -0
  533. package/dist/surface/tools/query-hint-schema.d.ts +7 -0
  534. package/dist/surface/tools/query-hint-schema.js +10 -0
  535. package/dist/surface/tools/read-tools.js +71 -14
  536. package/dist/surface/tools/real-input-attempt.js +96 -13
  537. package/dist/surface/tools/reticle-result.d.ts +120 -0
  538. package/dist/surface/tools/reticle-result.js +364 -0
  539. package/dist/surface/tools/tool-kit.d.ts +83 -3
  540. package/dist/surface/tools/tool-kit.js +77 -7
  541. package/dist/surface/tools/tools.js +43 -59
  542. package/dist/telemetry/account-envelope.d.ts +7 -0
  543. package/dist/telemetry/account-envelope.js +61 -0
  544. package/dist/telemetry/agent-client.d.ts +15 -0
  545. package/dist/telemetry/agent-client.js +57 -0
  546. package/dist/telemetry/app-instrumented.js +9 -2
  547. package/dist/telemetry/argument-shape.d.ts +7 -0
  548. package/dist/telemetry/argument-shape.js +86 -1
  549. package/dist/telemetry/automation-hint.d.ts +2 -3
  550. package/dist/telemetry/automation-hint.js +33 -8
  551. package/dist/telemetry/cli-telemetry.js +7 -2
  552. package/dist/telemetry/daemon-telemetry.js +3 -0
  553. package/dist/telemetry/error-fingerprint.d.ts +10 -1
  554. package/dist/telemetry/error-fingerprint.js +61 -5
  555. package/dist/telemetry/feedback-cli.d.ts +0 -13
  556. package/dist/telemetry/feedback-cli.js +0 -77
  557. package/dist/telemetry/feedback.d.ts +13 -0
  558. package/dist/telemetry/feedback.js +183 -17
  559. package/dist/telemetry/harness-run.d.ts +18 -0
  560. package/dist/telemetry/harness-run.js +80 -0
  561. package/dist/telemetry/hud-events.d.ts +16 -0
  562. package/dist/telemetry/hud-events.js +27 -0
  563. package/dist/telemetry/hud-metrics.d.ts +29 -6
  564. package/dist/telemetry/hud-metrics.js +116 -25
  565. package/dist/telemetry/init-telemetry.js +2 -2
  566. package/dist/telemetry/install-source.d.ts +13 -25
  567. package/dist/telemetry/install-source.js +44 -3
  568. package/dist/telemetry/mcp-connection.d.ts +0 -14
  569. package/dist/telemetry/mcp-connection.js +5 -1
  570. package/dist/telemetry/onboarding-firsts.d.ts +32 -0
  571. package/dist/telemetry/onboarding-firsts.js +81 -6
  572. package/dist/telemetry/platform-linked.d.ts +5 -0
  573. package/dist/telemetry/platform-linked.js +32 -0
  574. package/dist/telemetry/project-profile.js +5 -3
  575. package/dist/telemetry/proxy-telemetry.js +4 -1
  576. package/dist/telemetry/session-metrics.d.ts +15 -4
  577. package/dist/telemetry/session-metrics.js +88 -52
  578. package/dist/telemetry/telemetry.d.ts +38 -2
  579. package/dist/telemetry/telemetry.js +144 -34
  580. package/dist/telemetry/verification-of.d.ts +3 -1
  581. package/dist/telemetry/verification-of.js +13 -4
  582. package/dist/wire-journal.d.ts +2 -2
  583. package/dist/wire-journal.js +20 -6
  584. package/docs/README.md +3 -3
  585. package/docs/actions.mdx +6 -3
  586. package/docs/adapters.md +1 -1
  587. package/docs/agent-cheatsheet.md +25 -28
  588. package/docs/architecture.md +5 -5
  589. package/docs/autodrive.md +33 -28
  590. package/docs/benchmarks.md +5 -5
  591. package/docs/best-practices.mdx +27 -9
  592. package/docs/capabilities.mdx +14 -16
  593. package/docs/cli/affected.mdx +1 -1
  594. package/docs/cli/cloud.mdx +54 -75
  595. package/docs/cli/doctor.mdx +14 -3
  596. package/docs/cli/drive.mdx +20 -14
  597. package/docs/cli/feedback.mdx +3 -3
  598. package/docs/cli/gate.mdx +7 -2
  599. package/docs/cli/help.mdx +50 -55
  600. package/docs/cli/init.mdx +43 -28
  601. package/docs/cli/license.mdx +12 -8
  602. package/docs/cli/mcp.mdx +4 -4
  603. package/docs/cli/open.mdx +3 -3
  604. package/docs/cli/report.mdx +4 -2
  605. package/docs/cli/restart.mdx +2 -2
  606. package/docs/cli/rollback.mdx +14 -8
  607. package/docs/cli/serve.mdx +4 -4
  608. package/docs/cli/setup.mdx +23 -0
  609. package/docs/cli/status.mdx +18 -5
  610. package/docs/cli/stop.mdx +67 -8
  611. package/docs/cli/try.mdx +62 -0
  612. package/docs/cli/update.mdx +4 -3
  613. package/docs/cli/verify.mdx +17 -6
  614. package/docs/cli/version.mdx +5 -4
  615. package/docs/cli.mdx +111 -42
  616. package/docs/debugging.md +3 -3
  617. package/docs/deploy-checks.md +1 -1
  618. package/docs/desktop.mdx +9 -3
  619. package/docs/enterprise.md +11 -10
  620. package/docs/environment.mdx +7 -8
  621. package/docs/faq.mdx +3 -3
  622. package/docs/first-drive.md +5 -4
  623. package/docs/flows.md +35 -27
  624. package/docs/for-agents.md +4 -5
  625. package/docs/frameworks.mdx +32 -21
  626. package/docs/getting-started.md +65 -61
  627. package/docs/human-control.md +16 -16
  628. package/docs/index.mdx +15 -42
  629. package/docs/install-agentic.mdx +22 -37
  630. package/docs/install-manual.mdx +23 -13
  631. package/docs/instrumentation.mdx +5 -3
  632. package/docs/integration-patterns.md +7 -7
  633. package/docs/license-activation.mdx +1 -1
  634. package/docs/multi-agent-testing.md +24 -6
  635. package/docs/packages/babel-plugin.mdx +4 -2
  636. package/docs/packages/browser.mdx +16 -10
  637. package/docs/packages/core.mdx +12 -5
  638. package/docs/packages/electron.mdx +3 -2
  639. package/docs/packages/engine.mdx +1 -1
  640. package/docs/packages/eslint-plugin.mdx +18 -12
  641. package/docs/packages/next.mdx +8 -7
  642. package/docs/packages/open-verification.mdx +1 -1
  643. package/docs/packages/server.mdx +5 -5
  644. package/docs/packages/tauri.mdx +9 -9
  645. package/docs/packages/test.mdx +4 -10
  646. package/docs/packages/vite-plugin.mdx +32 -4
  647. package/docs/packages.mdx +11 -15
  648. package/docs/platform-integration.md +6 -5
  649. package/docs/predicates.mdx +40 -24
  650. package/docs/quickstart.mdx +69 -30
  651. package/docs/required-checks.md +8 -7
  652. package/docs/reticle-manual.md +15 -5
  653. package/docs/skill-file.mdx +17 -79
  654. package/docs/skill-setup.md +9 -9
  655. package/docs/skill.md +200 -0
  656. package/docs/system-map.md +7 -7
  657. package/docs/telemetry.md +23 -25
  658. package/docs/testing.md +4 -4
  659. package/docs/token-efficiency.md +12 -12
  660. package/docs/tools/act-and-wait.mdx +9 -2
  661. package/docs/tools/act-sequence.mdx +6 -7
  662. package/docs/tools/act.mdx +2 -2
  663. package/docs/tools/assert.mdx +18 -17
  664. package/docs/tools/console.mdx +9 -9
  665. package/docs/tools/inspect.mdx +16 -7
  666. package/docs/tools/look.mdx +24 -0
  667. package/docs/tools/navigate.mdx +5 -3
  668. package/docs/tools/network.mdx +2 -2
  669. package/docs/tools/observe.mdx +6 -6
  670. package/docs/tools/overview.mdx +34 -33
  671. package/docs/tools/query.mdx +5 -5
  672. package/docs/tools/session-and-feedback.mdx +22 -13
  673. package/docs/tools/sessions.mdx +8 -8
  674. package/docs/tools/snapshot.mdx +6 -5
  675. package/docs/tools/state.mdx +9 -9
  676. package/docs/tools/tools-and-run.mdx +26 -24
  677. package/docs/tools/verify.mdx +28 -0
  678. package/docs/tools/wait-for.mdx +8 -4
  679. package/docs/troubleshooting.mdx +21 -6
  680. package/docs/usage.md +55 -46
  681. package/docs/use-cases.mdx +3 -3
  682. package/docs/vs-chrome-devtools-mcp.mdx +9 -6
  683. package/docs/vs-playwright-mcp.mdx +3 -1
  684. package/docs/what-is-recorded.md +17 -5
  685. package/docs/what-is-reticle.mdx +5 -3
  686. package/docs/why-reticle.mdx +1 -1
  687. package/package.json +9 -12
  688. package/dist/command/cli/demo/demo-page.d.ts +0 -78
  689. package/dist/command/cli/demo/demo-page.js +0 -241
  690. package/dist/command/cli/demo/demo-run.d.ts +0 -38
  691. package/dist/command/cli/demo/demo-run.js +0 -138
  692. package/dist/features/harness/driver.d.ts +0 -50
  693. package/dist/features/harness/driver.js +0 -236
  694. package/dist/features/harness/jev-driver.d.ts +0 -188
  695. package/dist/features/harness/jev-driver.js +0 -678
  696. package/dist/features/harness/openai-driver.d.ts +0 -58
  697. package/dist/features/harness/openai-driver.js +0 -206
  698. package/dist/judgement/hunt/hunt-report.d.ts +0 -49
  699. package/dist/judgement/hunt/hunt-report.js +0 -84
  700. package/dist/language/flows/buddy-status.d.ts +0 -25
  701. package/dist/language/flows/buddy-status.js +0 -32
  702. package/dist/language/flows/change/watch-batcher.d.ts +0 -18
  703. package/dist/language/flows/change/watch-batcher.js +0 -19
  704. package/dist/memory/cloud/harness-offer.d.ts +0 -44
  705. package/dist/memory/cloud/harness-offer.js +0 -145
  706. package/dist/memory/project/dir/fill-value-store.d.ts +0 -32
  707. package/dist/memory/project/dir/fill-value-store.js +0 -88
  708. package/dist/surface/tools/feature-capture.d.ts +0 -151
  709. package/dist/surface/tools/feature-capture.js +0 -235
  710. package/dist/surface/tools/tool-hit-rate.d.ts +0 -87
  711. package/dist/surface/tools/tool-hit-rate.js +0 -90
  712. package/dist/telemetry/harness-drive.d.ts +0 -4
  713. package/dist/telemetry/harness-drive.js +0 -35
  714. package/dist/telemetry/identify.d.ts +0 -22
  715. package/dist/telemetry/identify.js +0 -73
  716. package/docs/cli/capsules.mdx +0 -70
  717. package/docs/cli/hunt.mdx +0 -73
  718. package/docs/cli/identify.mdx +0 -76
  719. package/docs/cli/kill.mdx +0 -91
  720. package/docs/cli/watch.mdx +0 -62
  721. package/docs/local-registry.md +0 -143
package/dist/index.js CHANGED
@@ -1,31 +1,30 @@
1
- import { writeHarnessSwitch } from './memory/cloud/harness-switch.js';
2
- import { harnessConfigSource } from './memory/cloud/harness-config.js';
3
- import { fetchPlatformConfig } from './features/harness/platform-config.js';
1
+ import { applyHarnessSwitch, harnessConfigsByRoot } from './memory/cloud/harness-config.js';
2
+ import { coveragePercents } from './features/exhaust/ledger.js';
3
+ import { agentWiring } from './portal/session/zero-install-first-call.js';
4
+ import { pushIfMoved, watchAccountFiles } from './memory/impact/account-watch.js';
5
+ import { SESSION_FILE } from './command/cli/cloud-kit.js';
4
6
  import { join } from 'node:path';
5
- import { existsSync, readFileSync } from 'node:fs';
6
7
  import { homedir } from 'node:os';
7
- import { linkedCloudPort, platformEnvPort } from './memory/cloud/cloud-config.js';
8
+ import { linkedCloudPort, sessionCloudPort } from './memory/cloud/cloud-config.js';
9
+ import { sessionRoot } from './memory/project/session-root.js';
8
10
  import { attachCloudSync } from './memory/cloud/sync-daemon.js';
9
11
  import { wireHooks } from './hooks/hook-commands.js';
10
- import { PROJECT_REGISTRY_FILE, parseProjectRegistry, projectCandidates, } from '@reticlehq/core/artifacts';
11
- import { discoverProjectConfigs } from './command/cli/config/config-discovery.js';
12
- import { artifactRootResolver, projectDirectoryFor, } from './memory/project/artifact-root-resolver.js';
12
+ import { currentDrivenBy } from './hooks/driven-by.js';
13
+ import { artifactRootResolver } from './memory/project/artifact-root-resolver.js';
14
+ import { servingDirectoryOf } from './portal/session/serving-directory.js';
13
15
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
14
- import { AGENT_STOPPED_NOTICE, RETICLE_DEFAULT_PORT, bridgeWsUrl, ReticleCommand, ReticleDir, ReticleEnv, LOOPBACK_HOST, ReplayStatus, EventType, } from '@reticlehq/core';
15
- import { originOf } from './portal/session/session-manager.js';
16
- import { setBrowserMode, BrowserMode } from './telemetry/browser-mode.js';
17
- import { replayAndLearn } from './language/flows/flow-learning.js';
16
+ import { AGENT_STOPPED_NOTICE, RETICLE_DEFAULT_PORT, ReticleCommand, ReticleDir, ReticleEnv, LOOPBACK_HOST, } from '@reticlehq/core';
17
+ import { replayFromHud } from './language/flows/replay-from-hud.js';
18
18
  import { createSharedServer } from './surface/http-server.js';
19
19
  import { openLoopbackAlias } from './command/daemon/binding/loopback-alias.js';
20
20
  import { reportAppInstrumented } from './telemetry/app-instrumented.js';
21
21
  import { resolveBridgeSecurityWithAutoToken } from './portal/bridge/bridge-security.js';
22
22
  import { Bridge } from './portal/bridge/bridge.js';
23
- import { sdkFixForDirectory } from './command/version/sdk-fix.js';
24
23
  import { connectionSkew } from './command/version/version-nudge.js';
25
24
  import { SERVER_VERSION } from './command/version/identity/server-version.js';
26
25
  import { BaselineStore } from './memory/project/baselines.js';
27
26
  import { RecordingStore } from './language/flows/recording/tape/recordings.js';
28
- import { initImpact } from './memory/impact/impact-recorder.js';
27
+ import { initImpact, impactSnapshot } from './memory/impact/impact-recorder.js';
29
28
  import { flowAuthor } from './language/flows/flow-author.js';
30
29
  import { FlowStore } from './language/flows/flows.js';
31
30
  import { buildFlowChips } from './language/flows/flow-scope.js';
@@ -40,37 +39,25 @@ import { createRunnerPort } from './judgement/runs/runner-port.js';
40
39
  import { RunStore } from './judgement/runs/artifact/run-store.js';
41
40
  import { startVerifyServer } from './judgement/runs/verify-server.js';
42
41
  import { createMcpServer } from './surface/mcp/mcp.js';
42
+ import { instructionStateAt } from './surface/mcp/mcp-proxy.js';
43
43
  import { LEASE_ACQUIRE_TOOL } from './surface/tools/lease-tools.js';
44
+ import { attachHudHarness, projectLinkOnly, startChatDrives } from './surface/tools/chat-drives.js';
44
45
  import { runTool } from './surface/tools/invoke-tool.js';
45
46
  import { SessionReaper, endAllSessions, MCP_DISCONNECT_SUMMARY, } from './portal/session/session-reaper.js';
46
47
  import { wireSessionScope } from './portal/session/no-session-watch.js';
47
48
  import { buildIdlePredicate, noteSetupHold } from './command/daemon/lifetime/daemon-usefulness.js';
48
49
  import { resolveToolSurface } from './surface/tools/tool-surface.js';
49
50
  import { statusPayload } from './status-payload.js';
50
- import { CdpRealInputProvider, LaunchedRealInputProvider } from './portal/input/real-input.js';
51
- import { cpus } from 'node:os';
52
- import { BrowserPool } from './portal/pool/browser-pool.js';
53
51
  import { AGENT_ALREADY_DRIVING_ELSEWHERE, shouldGreetWithLeaseNotice, } from './portal/session/lease-visibility.js';
54
- import { playwrightLauncher, resolveMaxContexts } from './portal/pool/playwright-launcher.js';
55
52
  import { LeaseReaper } from './portal/pool/lease-reaper.js';
56
- import { findProjectConfig, projectIdsAt, readJournalEnabled, readProjectId, } from './command/cli/ports/resolve/cli-port.js';
57
- import { hasAnyProjectConnectedBefore } from './memory/recall/prior/connection-memory.js';
58
- import { reticleStateHome } from './command/daemon/daemon.js';
53
+ import { findProjectConfig, readJournalEnabled, readProjectId, } from './command/cli/ports/resolve/cli-port.js';
59
54
  import { probeLaunchableChromium } from './launch-chromium.js';
60
55
  import { attachJournal } from './wire-journal.js';
61
56
  import { reportOnboardingStep } from './telemetry/onboarding-funnel.js';
62
- import { AMBIENT_RECORDING } from './language/flows/recording/tape/recordings.js';
63
57
  import { readRetainPolicy } from './memory/journal/on-disk/retain-policy.js';
64
58
  import { log } from './log.js';
65
- import { readReaderBundle, zeroInstallScript as zeroInstallScriptFor, } from './portal/pool/zero-install.js';
66
- /** A human-facing one-liner for a panel replay verdict — ✓ passed / ⚠ drifted / ✗ errored. */
67
- function replayVerdictLine(result) {
68
- if (result.status === ReplayStatus.OK)
69
- return `✓ "${result.name}" passed`;
70
- if (result.status === ReplayStatus.DRIFT)
71
- return `⚠ "${result.name}" drifted — a step no longer matches`;
72
- return `✗ "${result.name}" failed — ${result.error?.message ?? 'could not replay'}`;
73
- }
59
+ import { createBrowserPool, knownProjectRoots, loadHarnessConfig, makeNetworkDetailRouter, platformEnvFor, readerConnect, resolveRealInput, sdkFixForProject, } from './start-wiring.js';
60
+ export { replayVerdictLine } from './language/flows/replay-from-hud.js';
74
61
  // Re-exported from the contract, where the names now live: a consumer importing the server should
75
62
  // not have to know that the vocabulary moved.
76
63
  export { ReticleTool } from '@reticlehq/core';
@@ -112,181 +99,21 @@ export { findContradictions } from '@reticlehq/engine/disagreement/contradiction
112
99
  /** Default localhost port for the verify HTTP endpoint (see docs/platform-integration.md). */
113
100
  export const RETICLE_VERIFY_DEFAULT_PORT = 7331;
114
101
  export { resolveBridgeSecurity } from './portal/bridge/bridge-security.js';
115
- /**
116
- * Build the shared browser pool (one headless Chromium, N capped isolated leased contexts). Lazy —
117
- * no Chromium launches until the first lease — so creating it is free even when never used.
118
- */
119
- /** Where the zero-install reader connects: this daemon's own bridge, with its pairing token. */
120
- function readerConnect(port, token) {
121
- return { url: bridgeWsUrl(port), ...(token === undefined ? {} : { token }) };
122
- }
123
- function createBrowserPool(headless, reader) {
124
- const maxContexts = resolveMaxContexts(process.env[ReticleEnv.MAX_CONTEXTS], cpus().length);
125
- const genSessionId = () => `lease-${'function' === typeof globalThis.crypto?.randomUUID
126
- ? globalThis.crypto.randomUUID()
127
- : String(Date.now())}`;
128
- // Built on first use and kept: the page that needs it is one whose app never connected.
129
- let script;
130
- const zeroInstallScript = () => {
131
- if (script === undefined) {
132
- const bundle = readReaderBundle();
133
- script = bundle === undefined ? null : zeroInstallScriptFor(bundle, reader);
134
- }
135
- return script ?? undefined;
136
- };
137
- return new BrowserPool(playwrightLauncher({ headless }), {
138
- maxContexts,
139
- genSessionId,
140
- zeroInstallScript,
141
- });
142
- }
143
- /**
144
- * Route CDP-authoritative network detail onto the driven session's journal.
145
- *
146
- * The page and the SDK session share an origin, so a NET_DETAIL is pushed to the matching connected
147
- * session. Shared by both entry points: `startDaemon` previously omitted it entirely, so on the path
148
- * users actually take, CDP network detail was collected and then dropped on the floor.
149
- */
150
- function makeNetworkDetailRouter(bridge, driveUrl) {
151
- const driveOrigin = originOf(driveUrl ?? '');
152
- return (detail) => {
153
- // Route by the DOCUMENT that issued the request, not by the request's own origin.
154
- //
155
- // Matching the request's origin only works for same-origin calls. An app on one origin calling an
156
- // API on another — most API calls — produced a detail matching no session, and it was dropped
157
- // without a trace. The drive-URL fallback papered over it on the launched path and did nothing on
158
- // the CDP-attach path, where driveUrl is undefined and the fallback compares against ''.
159
- const pageOrigin = originOf(detail.pageUrl ?? '');
160
- const requestOrigin = originOf(detail.url);
161
- for (const session of bridge.sessions.all()) {
162
- const origin = originOf(session.url);
163
- // originOf returns `string | undefined`, NEVER '' — so the old `!== ''` guards were dead, and a
164
- // bare `origin === requestOrigin` matched `undefined === undefined` when BOTH the session URL and
165
- // the detail URL were unparseable. That routed a NET_DETAIL (with its response headers, incl.
166
- // set-cookie) onto an unrelated session. Require a DEFINED origin; undefined operands then simply
167
- // fail to match any of the three candidates.
168
- const matches = origin !== undefined &&
169
- (origin === pageOrigin || origin === requestOrigin || origin === driveOrigin);
170
- if (matches) {
171
- session.pushEvent({
172
- t: 0,
173
- type: EventType.NET_DETAIL,
174
- sessionId: session.id,
175
- data: { ...detail },
176
- });
177
- }
178
- }
179
- };
180
- }
181
- /**
182
- * Resolve the drive/real-input provider from options — shared by start and startDaemon so the
183
- * precedence (driveUrl launch+own → CDP attach → none) and the storageState/injectConnect plumbing
184
- * live in ONE place. `onNavigateError` is the entrypoint's own cleanup (close the bridge/shared server)
185
- * so a failed launch never leaks a WS port. A past divergence between the two paths let daemon mode
186
- * run with a different setup — this removes that risk.
187
- */
188
- async function resolveRealInput(options, onNavigateError, onNetworkDetail) {
189
- const driveUrl = options.driveUrl;
190
- if (driveUrl !== undefined && driveUrl.length > 0) {
191
- const headless = options.headless ?? true;
192
- // The one place that knows. Everything downstream reads it rather than re-deriving it, and a
193
- // daemon that launches nothing keeps the default (ATTACHED) rather than guessing.
194
- setBrowserMode(headless ? BrowserMode.HEADLESS : BrowserMode.HEADED);
195
- const injectConnect = options.injectConnect;
196
- const storageState = options.storageState;
197
- const factory = options.realInputFactory ??
198
- ((opts) => new LaunchedRealInputProvider({
199
- driveUrl: opts.driveUrl,
200
- headless: opts.headless,
201
- ...(injectConnect !== undefined ? { injectConnect } : {}),
202
- ...(storageState !== undefined ? { storageState } : {}),
203
- ...(onNetworkDetail !== undefined ? { onNetworkDetail } : {}),
204
- }));
205
- const launched = factory({ driveUrl, headless });
206
- try {
207
- await launched.navigate();
208
- }
209
- catch (error) {
210
- await onNavigateError(); // no leaked WS port on a failed start
211
- throw error;
212
- }
213
- return { realInput: launched, owned: launched };
214
- }
215
- const cdpUrl = options.cdpUrl ?? process.env[ReticleEnv.CDP_URL];
216
- if (cdpUrl !== undefined && cdpUrl.length > 0) {
217
- // Same network sink as the launched path. Whether Reticle opened the browser or attached to one
218
- // someone else opened has no bearing on whether it can read that browser's network.
219
- const cdp = new CdpRealInputProvider({
220
- cdpUrl,
221
- ...(onNetworkDetail !== undefined ? { onNetworkDetail } : {}),
222
- });
223
- return { realInput: cdp, owned: cdp };
224
- }
225
- return {};
226
- }
227
102
  /** Start the Reticle bridge (browser WS endpoint) and, by default, the MCP stdio server. */
228
- /**
229
- * The SDK-upgrade sentence for the package.json of the project the page announced, evaluated at
230
- * each HELLO so a just-edited manifest is what we name. The daemon's cwd only when that project's
231
- * directory is unknown, and the framework-neutral sensor when that is not an app either (#1135).
232
- */
233
- function sdkFixForProject(projectId) {
234
- return sdkFixForDirectory(SERVER_VERSION, projectDirectoryFor(projectId) ?? process.cwd());
235
- }
236
- /**
237
- * Resolve a session's artifact root, from everything this machine knows about where projects live.
238
- *
239
- * Built once per daemon and closed over by every tool call. The two sources are read lazily and
240
- * cheaply on each call rather than snapshotted at startup: `init` can run in another terminal while
241
- * this daemon is up, and a resolution that used a startup snapshot would keep answering with a map
242
- * from before the project the agent is now driving existed.
243
- */
244
- /**
245
- * Every `.reticle` root on this machine that sync should consider, from the same two sources the
246
- * artifact resolver uses.
247
- *
248
- * Read on every call rather than snapshotted, for the same reason: `reticle link` can run in
249
- * another terminal while this daemon is up, and a startup snapshot would keep that repo silent
250
- * until somebody restarted a process they have no reason to suspect.
251
- *
252
- * Returns directories that MIGHT be linked; the caller resolves each and skips the ones that are
253
- * not. Deciding that here would mean reading every cloud.json on every tick.
254
- */
255
- function knownProjectRoots() {
256
- const roots = new Set();
257
- try {
258
- const path = join(homedir(), ReticleDir.ROOT, PROJECT_REGISTRY_FILE);
259
- if (existsSync(path)) {
260
- const registry = parseProjectRegistry(JSON.parse(readFileSync(path, 'utf8')));
261
- for (const candidate of projectCandidates(registry))
262
- roots.add(join(candidate.directory, ReticleDir.ROOT));
263
- }
264
- }
265
- catch {
266
- // A registry that cannot be read is an empty one — never a reason to stop syncing.
267
- }
268
- try {
269
- for (const config of discoverProjectConfigs(process.cwd()).found)
270
- roots.add(join(config.directory, ReticleDir.ROOT));
271
- }
272
- catch {
273
- // Same: a diagnostic walk that throws must not take the sync loop with it.
274
- }
275
- return [...roots];
276
- }
277
- /** This project's platform credential (stored, else the env key), as the env the platform readers take. */
278
- const platformEnvFor = (root) => platformEnvPort(createNodeFileSystem(), root ?? join(process.cwd(), ReticleDir.ROOT), homedir(), process.env);
279
103
  export async function start(options = {}) {
280
104
  const port = options.port ?? RETICLE_DEFAULT_PORT;
105
+ const configForRoot = harnessConfigsByRoot(loadHarnessConfig);
281
106
  // Open the user's impact record before anything can connect. Not inside the MCP branch: a daemon
282
107
  // serving a browser with no agent attached still has a HUD to answer, and a report that reads
283
108
  // "nothing recorded yet" over a month of history on disk is the worst version of this feature.
284
109
  initImpact({
110
+ sdkVersion: SERVER_VERSION,
285
111
  reticleRoot: options.reticleRoot ?? join(process.cwd(), ReticleDir.ROOT),
286
112
  // The daemon owns both sides of this seam, so it is the layer that may join them: the cache
287
113
  // lives in cloud memory, the platform read lives in the harness feature, and neither is allowed
288
114
  // to reach for the other.
289
- config: harnessConfigSource(async () => fetchPlatformConfig(await platformEnvFor(options.reticleRoot)())),
115
+ configForRoot,
116
+ coverageForRoot: (root) => () => coveragePercents(root),
290
117
  });
291
118
  const uninstallHooks = wireHooks(options.reticleRoot ?? join(process.cwd(), ReticleDir.ROOT), readProjectId(process.cwd()));
292
119
  const security = await resolveBridgeSecurityWithAutoToken(options);
@@ -302,7 +129,7 @@ export async function start(options = {}) {
302
129
  bridge.sessions.setDefaultScope({ projectId: activeProjectId });
303
130
  }
304
131
  const baselines = new BaselineStore();
305
- const recordings = new RecordingStore();
132
+ const recordings = new RecordingStore(() => currentDrivenBy() !== undefined);
306
133
  // drive precedence: driveUrl (launch+own a browser) → CDP (attach) → none.
307
134
  let pool;
308
135
  let leaseReaper;
@@ -310,6 +137,7 @@ export async function start(options = {}) {
310
137
  // page and the SDK session share an origin, so a NET_DETAIL is pushed to the matching connected session.
311
138
  const routeNetworkDetail = makeNetworkDetailRouter(bridge, options.driveUrl);
312
139
  const { realInput, owned } = await resolveRealInput(options, () => bridge.close(), routeNetworkDetail);
140
+ let chatDrives;
313
141
  if (options.mcp !== false) {
314
142
  // cwd/Date.now are confined to start — never inside reticle-dir.ts's pure logic (rule 7).
315
143
  const fs = createNodeFileSystem();
@@ -326,7 +154,7 @@ export async function start(options = {}) {
326
154
  enabled: journalEnabled,
327
155
  retain,
328
156
  // Bound HERE, where the recorder is already in hand: teardown gets the tape, not the recorder.
329
- takeAmbientTape: () => recordings.stop(AMBIENT_RECORDING),
157
+ takeAmbientTape: (sessionId) => recordings.takeAmbient(sessionId),
330
158
  reportStep: reportOnboardingStep,
331
159
  flows,
332
160
  author: flowAuthor,
@@ -367,7 +195,7 @@ export async function start(options = {}) {
367
195
  fs,
368
196
  reticleRoot,
369
197
  linkedCloud: linkedCloudPort(fs, reticleRoot, homedir(), process.env),
370
- artifactRootFor: artifactRootResolver(reticleRoot),
198
+ artifactRootFor: artifactRootResolver(reticleRoot, { servingDirectory: servingDirectoryOf }),
371
199
  now,
372
200
  bridgePort: port,
373
201
  browserProbe: probeLaunchableChromium,
@@ -376,13 +204,13 @@ export async function start(options = {}) {
376
204
  ...(activeProjectId === undefined ? {} : { projectId: activeProjectId }),
377
205
  };
378
206
  const profile = resolveToolSurface(options.toolProfile);
379
- const server = createMcpServer(realInput !== undefined ? { ...deps, realInput } : deps, profile,
380
- // A session live RIGHT NOW is stronger evidence than the durable memory, which can be empty or
381
- // stale for a project the plugin wired without writing `.reticle.json` (see connection-memory.ts's
382
- // KNOWN LIMIT). Without this OR, that project's `initialize` led with the first-install steps
383
- // while a real session was already connected — see #1138.
384
- bridge.sessions.count() > 0 ||
385
- hasAnyProjectConnectedBefore(reticleStateHome(), port, projectIdsAt(process.cwd())));
207
+ const toolDeps = realInput !== undefined ? { ...deps, realInput } : deps;
208
+ // The platform chat sees this app too: `reticle drive` in a window runs here, not in a daemon.
209
+ chatDrives = startChatDrives(toolDeps, bridge.sessions, fs, {
210
+ sessionCloud: sessionCloudPort(fs, homedir(), process.env, (id) => sessionRoot(toolDeps, id)),
211
+ version: SERVER_VERSION,
212
+ }, log);
213
+ const server = createMcpServer(toolDeps, profile, instructionStateAt(port, bridge.sessions.count()));
386
214
  // When the agent (the MCP client) disconnects cleanly, end every active session at once so the
387
215
  // HUD doesn't linger. (If the agent instead KILLS this process, the WS dies and the browser
388
216
  // self-ends via SESSION_LIFECYCLE.BRIDGE_LOST_MS — see transport.ts.)
@@ -401,6 +229,7 @@ export async function start(options = {}) {
401
229
  uninstallHooks();
402
230
  await cleanupCaptureDirectories();
403
231
  leaseReaper?.stop();
232
+ chatDrives?.stop();
404
233
  await pool?.shutdown();
405
234
  await owned?.dispose();
406
235
  await bridge.close();
@@ -415,17 +244,21 @@ export async function start(options = {}) {
415
244
  */
416
245
  export async function startDaemon(options = {}) {
417
246
  const port = options.port ?? RETICLE_DEFAULT_PORT;
247
+ let pushHarnessConfig = () => undefined;
248
+ const configForRoot = harnessConfigsByRoot(loadHarnessConfig, (root) => pushHarnessConfig(root));
418
249
  // The SAME line as in `start`, because these are two entry points that each wire their own world
419
250
  // and the daemon is the one that actually serves people. Wired only in `start`, the impact record
420
251
  // was never opened in the process the HUD talks to: tool calls still recorded (the dispatch
421
252
  // chokepoint opens it lazily), but a tab that connected before the first tool call was pushed
422
253
  // nothing, so the report read "nothing recorded yet" over a file with history in it.
423
254
  initImpact({
255
+ sdkVersion: SERVER_VERSION,
424
256
  reticleRoot: options.reticleRoot ?? join(process.cwd(), ReticleDir.ROOT),
425
257
  // The daemon owns both sides of this seam, so it is the layer that may join them: the cache
426
258
  // lives in cloud memory, the platform read lives in the harness feature, and neither is allowed
427
259
  // to reach for the other.
428
- config: harnessConfigSource(async () => fetchPlatformConfig(await platformEnvFor(options.reticleRoot)())),
260
+ configForRoot,
261
+ coverageForRoot: (root) => () => coveragePercents(root),
429
262
  });
430
263
  const security = await resolveBridgeSecurityWithAutoToken(options);
431
264
  const shared = createSharedServer(security.token === undefined ? {} : { token: security.token });
@@ -435,6 +268,14 @@ export async function startDaemon(options = {}) {
435
268
  sdkFix: sdkFixForProject,
436
269
  ...security,
437
270
  });
271
+ const repaint = (only, ifChanged = false) => {
272
+ for (const session of bridge.sessions.all()) {
273
+ const root = session.artifactRoot ?? options.reticleRoot ?? join(process.cwd(), ReticleDir.ROOT);
274
+ if ((only ?? root) === root)
275
+ pushIfMoved(session, () => impactSnapshot(root), ifChanged);
276
+ }
277
+ };
278
+ pushHarnessConfig = repaint;
438
279
  // The daemon owns listen (below), so the real bind error is reported there; absorb bridge.ready's
439
280
  // mirror rejection so a port collision can't surface as an unhandled promise rejection.
440
281
  void bridge.ready.catch(() => undefined);
@@ -450,7 +291,7 @@ export async function startDaemon(options = {}) {
450
291
  // `init` holds the daemon it is waiting on, so the idle rule cannot shut it down mid-wait.
451
292
  if (held)
452
293
  noteSetupHold(Date.now());
453
- return statusPayload(bridge.sessions.count(), bridge.sessions.list(), bridge.sessions.noSessionHint(), verifyHttp?.port, bridge.sessions.noSessionLead());
294
+ return statusPayload(bridge.sessions.count(), bridge.sessions.list(), bridge.sessions.noSessionHint(), verifyHttp?.port, bridge.sessions.noSessionLead(), bridge.sessions.all());
454
295
  });
455
296
  // Agent-independent presence: the daemon outlives any single agent, so when the LAST agent's MCP
456
297
  // connection drops (it stopped, or is waiting on the human), end every session and push a clear
@@ -473,10 +314,11 @@ export async function startDaemon(options = {}) {
473
314
  const retain = readRetainPolicy(findProjectConfig(process.cwd()));
474
315
  // See the sibling path: `retain.sessions: 0` stops the capture too, not only the sweep.
475
316
  const journalEnabled = readJournalEnabled(process.cwd(), process.env[ReticleEnv.JOURNAL]) && 0 < retain.sessions;
476
- const flows = new FlowStore(fs, reticleRoot, { now });
317
+ // A saved flow wakes sync like a landed run: see FlowStore's `onWrote`.
318
+ const flows = new FlowStore(fs, reticleRoot, { now }, { onWrote: () => syncNudge.run?.() });
477
319
  // Built here rather than inside `deps` below, so teardown can save what a drive recorded. Both
478
320
  // paths pass the same pair — `daemon-parity.test.ts` is what keeps them from drifting apart.
479
- const recordings = new RecordingStore();
321
+ const recordings = new RecordingStore(() => currentDrivenBy() !== undefined);
480
322
  /*
481
323
  * Bound AFTER the sync daemon exists, read only when a run is actually written.
482
324
  *
@@ -485,12 +327,12 @@ export async function startDaemon(options = {}) {
485
327
  * setup ahead of session capture for the sake of one callback.
486
328
  */
487
329
  const syncNudge = {};
488
- attachJournal(bridge, {
330
+ const endLiveSessions = attachJournal(bridge, {
489
331
  fs,
490
332
  reticleRoot,
491
333
  enabled: journalEnabled,
492
334
  retain,
493
- takeAmbientTape: () => recordings.stop(AMBIENT_RECORDING),
335
+ takeAmbientTape: (sessionId) => recordings.takeAmbient(sessionId),
494
336
  reportStep: reportOnboardingStep,
495
337
  flows,
496
338
  author: flowAuthor,
@@ -526,14 +368,15 @@ export async function startDaemon(options = {}) {
526
368
  otherRoots: knownProjectRoots,
527
369
  });
528
370
  syncNudge.run = () => cloudSync.nudge();
529
- // `syncNow`, not `nudge`: a nudge schedules a cycle soon, which is right for "a run landed" and
530
- // wrong for a button somebody is watching. Never awaited.
371
+ // `syncNow`, not `nudge` (a cycle soon): somebody is watching the button. Never awaited.
531
372
  bridge.attachSyncRequest(() => void cloudSync.syncNow());
532
- // The panel's harness switch. Written through to the platform rather than kept locally, so the
533
- // console and the panel cannot disagree about a setting they both offer. Nothing is awaited and a
534
- // failure is not surfaced: the next snapshot re-reads the platform, so a lost write shows up as
535
- // the switch springing back, which is the truthful outcome.
536
- bridge.attachHarnessRequest((enabled) => void platformEnvFor(reticleRoot)().then((env) => writeHarnessSwitch(env, enabled)));
373
+ if (options.hudSignIn !== undefined)
374
+ bridge.attachSigninRequest(options.hudSignIn(repaint, projectLinkOnly(options.hudLink)));
375
+ // Logout and link run in another process: repaint when their files change, the rest on a timer.
376
+ const accountFiles = watchAccountFiles(repaint, undefined, () => repaint(undefined, true));
377
+ accountFiles.watch(join(homedir(), ReticleDir.ROOT, SESSION_FILE));
378
+ bridge.attachSessionReady((s) => accountFiles.watch(join(s.artifactRoot ?? reticleRoot, ReticleDir.CLOUD_LINK_FILE)));
379
+ attachHudHarness(bridge, { deps: () => deps, root: reticleRoot, repaint: () => repaint() }, (r, on) => applyHarnessSwitch(configForRoot, r, on, platformEnvFor(r)), options.hudLink);
537
380
  // Scope auto-selection to the active project (from .reticle.json) so a stray tab from another app is
538
381
  // never picked when the agent omits a sessionId. Explicit per-call scope/sessionId still overrides.
539
382
  // Scope + the no-session diagnosis: "no browser session connected" is the error that ends most
@@ -542,6 +385,7 @@ export async function startDaemon(options = {}) {
542
385
  // server for a wired project (see no-session-watch.ts), and it opens it through the pool — the same
543
386
  // path reticle_lease takes, in this process, binding nothing.
544
387
  wireSessionScope(bridge.sessions, readProjectId(process.cwd()), port, (sessionId) => pool.wasReapedLease(sessionId), (url) => pool.acquire(url));
388
+ const leaseUrl = (url) => runTool(LEASE_ACQUIRE_TOOL, effectiveDeps, { url });
545
389
  const deps = {
546
390
  sessions: bridge.sessions,
547
391
  pool,
@@ -562,12 +406,14 @@ export async function startDaemon(options = {}) {
562
406
  // daemon — the common case — so flows were listed, loaded and healed against wherever the
563
407
  // daemon happened to be launched. Wired in only one of the two places, a resolver is a resolver
564
408
  // that does not run.
565
- artifactRootFor: artifactRootResolver(reticleRoot),
409
+ artifactRootFor: artifactRootResolver(reticleRoot, { servingDirectory: servingDirectoryOf }),
566
410
  now,
567
411
  bridgePort: port,
568
412
  browserProbe: probeLaunchableChromium,
413
+ ...agentWiring(port, bridge.sessions, leaseUrl),
569
414
  // A finished verification should not sit behind a one-minute timer — see ToolDeps.onRunPersisted.
570
415
  onRunPersisted: () => cloudSync.nudge(),
416
+ syncNow: () => cloudSync.syncNow(),
571
417
  };
572
418
  const profile = resolveToolSurface(options.toolProfile);
573
419
  const effectiveDeps = realInput !== undefined ? { ...deps, realInput } : deps;
@@ -575,15 +421,14 @@ export async function startDaemon(options = {}) {
575
421
  // being told to wire itself on the next agent that connects.
576
422
  shared.attachMcp((peerSkew) => createMcpServer(peerSkew === undefined
577
423
  ? effectiveDeps
578
- : { ...effectiveDeps, peerSkew: connectionSkew(peerSkew) }, profile,
579
- // See the sibling call in `start`: a live session outweighs empty/stale durable memory (#1138).
580
- bridge.sessions.count() > 0 ||
581
- hasAnyProjectConnectedBefore(reticleStateHome(), port, projectIdsAt(process.cwd()))));
582
- // `reticle drive <url>` when this daemon already owns the port: it asks HERE instead of trying to
583
- // bind a port we are holding, and gets the same pooled context an agent's reticle_lease returns —
584
- // through runTool, so it is counted and reported like any other call rather than being a second,
585
- // invisible dispatch path. See cli/drive/drive-attach.ts for why attaching beats refereeing the race.
586
- shared.attachDrive((url) => runTool(LEASE_ACQUIRE_TOOL, effectiveDeps, { url }));
424
+ : { ...effectiveDeps, peerSkew: connectionSkew(peerSkew) }, profile, instructionStateAt(port, bridge.sessions.count())));
425
+ shared.attachDrive(leaseUrl); // `reticle drive <url>` — see cli/drive/drive-attach.ts.
426
+ // The platform chat's apps and drives, run here. See chat-drives.ts.
427
+ const chatDrives = startChatDrives(effectiveDeps, bridge.sessions, fs, {
428
+ sessionCloud: sessionCloudPort(fs, homedir(), process.env, (id) => sessionRoot(effectiveDeps, id)),
429
+ version: SERVER_VERSION,
430
+ unsynced: () => cloudSync.unsyncedRoots(),
431
+ }, log);
587
432
  // Optional OEM/CI verify endpoint: a host platform POSTs to /verify and gets an ReticleVerificationRun,
588
433
  // driving the same flow-replay machinery the agent uses — no MCP stdio, no human. Each verdict is
589
434
  // persisted via RunStore. Localhost-bound + token-guarded. Off unless `reticle serve --http`.
@@ -601,16 +446,9 @@ export async function startDaemon(options = {}) {
601
446
  // verdict into the same activity log they watch the agent in. The page animates via the normal
602
447
  // replay path, so they see it re-drive and the ✓/⚠/✗ land.
603
448
  bridge.attachReplay((sessionId, flowName) => {
604
- const session = bridge.sessions.get(sessionId);
605
- if (session === undefined)
449
+ if (bridge.sessions.get(sessionId) === undefined)
606
450
  return;
607
- session.pushNarration(`▶ Replaying "${flowName}"…`);
608
- replayAndLearn(effectiveDeps, { flowName, sessionId })
609
- .then((result) => session.pushNarration(replayVerdictLine(result)))
610
- .catch((error) => {
611
- const message = error instanceof Error ? error.message : String(error);
612
- session.pushNarration(`✗ Replay "${flowName}" failed — ${message}`);
613
- });
451
+ void replayFromHud(effectiveDeps, (id) => bridge.sessions.get(id), sessionId, flowName);
614
452
  });
615
453
  // On connect, hand the panel the replayable flows so it can render the ▶ list. Scoped to the
616
454
  // connecting session's project (a shared daemon serves many apps; each panel shows only its own
@@ -680,6 +518,9 @@ export async function startDaemon(options = {}) {
680
518
  if (vh !== undefined)
681
519
  await new Promise((resolve) => vh.server.close(() => resolve()));
682
520
  leaseReaper.stop();
521
+ chatDrives.stop();
522
+ accountFiles.close();
523
+ await endLiveSessions(); // first: an open tab's teardown writes the flow this flush sends
683
524
  await cloudSync.flush(); // not stop(): the last run written is the one nobody has yet
684
525
  await loopbackAlias.close?.();
685
526
  await pool.shutdown();
@@ -689,12 +530,8 @@ export async function startDaemon(options = {}) {
689
530
  },
690
531
  };
691
532
  }
692
- // The OpenVerification binding, exported so a conformance run can be driven from outside this package.
693
- //
694
- // It was written and then not reachable: `conformanceClient` takes a `WebRealm`, a `WebRealm`
695
- // takes a live `Session`, and a `Session` exists only inside a running daemon. A runner that
696
- // cannot import it cannot score anything, which would have made the whole conformance chain
697
- // complete and unusable.
533
+ // The OpenVerification binding, exported so a conformance run can be driven from outside this
534
+ // package: a `WebRealm` needs a live `Session`, which exists only inside a running daemon.
698
535
  export { WebRealm } from './portal/realm/web-realm.js';
699
536
  export { conformanceClient } from './portal/realm/conformance-client.js';
700
537
  /**
@@ -45,9 +45,9 @@ declare const CapsuleSchema: z.ZodObject<{
45
45
  version: 1;
46
46
  id: string;
47
47
  origin: string;
48
+ createdAt: number;
48
49
  expected: string;
49
50
  steps: FlowStep[];
50
- createdAt: number;
51
51
  observed: string;
52
52
  flow?: string | undefined;
53
53
  seen?: number | undefined;
@@ -56,9 +56,9 @@ declare const CapsuleSchema: z.ZodObject<{
56
56
  version: 1;
57
57
  id: string;
58
58
  origin: string;
59
+ createdAt: number;
59
60
  expected: string;
60
61
  steps: FlowStep[];
61
- createdAt: number;
62
62
  observed: string;
63
63
  flow?: string | undefined;
64
64
  seen?: number | undefined;
@@ -40,10 +40,24 @@ export interface CausalSummary {
40
40
  headline?: string;
41
41
  };
42
42
  consoleErrors: number;
43
+ /** The first console error's text, capped — so a count is never the only thing an agent can read. */
44
+ firstConsoleError?: string;
45
+ /**
46
+ * The app's requests in this window as `METHOD /path STATUS` (`pending` when unanswered), capped.
47
+ * Origin and query string are left out: the line is for recognising the call, and the full record is
48
+ * one `reticle_observe { since }` away. Present only when there were any.
49
+ */
50
+ requests?: string[];
43
51
  statePathsChanged: string[];
44
52
  storageKeysChanged: string[];
45
53
  /** Before→after for each changed store path — the diffs, not just the names. Values capped. */
46
54
  stateDiffs: StateDiff[];
55
+ /**
56
+ * How many store diffs were left out of `stateDiffs` because they moved only a cache's own
57
+ * bookkeeping (fetchStatus, isStale, dataUpdatedAt — see engine's state-bookkeeping rule). Present
58
+ * only when there were any: a trim is never silent. Predicates still see every transition.
59
+ */
60
+ ignoredBookkeeping?: number;
47
61
  /**
48
62
  * How long the store took to stop moving: last state change − first, in ms. Present only when more
49
63
  * than one path changed, because with a single change there is no interval to describe.
@@ -126,6 +140,6 @@ interface SummaryContext {
126
140
  */
127
141
  export declare const MAX_SUMMARY_ENTRIES = 20;
128
142
  /** The lists that are capped, named so `elided` can say which one lost entries. */
129
- type CappedList = 'statePathsChanged' | 'storageKeysChanged' | 'stateDiffs' | 'storageDiffs' | 'signals' | 'fieldsChanged';
143
+ type CappedList = 'requests' | 'statePathsChanged' | 'storageKeysChanged' | 'stateDiffs' | 'storageDiffs' | 'signals' | 'fieldsChanged';
130
144
  export declare function causalSummary(events: readonly ReticleEvent[], context?: SummaryContext): CausalSummary;
131
145
  export {};