@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
@@ -1,19 +1,24 @@
1
+ import { CALL_SECRETS_ARG, callSecretsArg } from './fields/flow-secret-field.js';
1
2
  import { flowAuthor } from './flow-author.js';
2
3
  import { FLOW_MUTATE_TOOL } from './flow-mutate-tools.js';
3
- import { seedSchema } from '../../surface/tools/args/numeric-bounds.js';
4
+ import { seedSchema, workerCountSchema } from '../../surface/tools/args/numeric-bounds.js';
5
+ import { confirmDangerousArg } from '../../surface/tools/args/confirm-dangerous-arg.js';
4
6
  import { z } from 'zod';
5
7
  import { emptyFlowRefusal } from './empty-flow.js';
6
- import { aliasParam } from '../../surface/tools/args/alias-args.js';
8
+ import { aliasParam, aliasUsed } from '../../surface/tools/args/alias-args.js';
9
+ import { stillRecording, stillRecordingMessage } from './flow-result.js';
10
+ import { resolveAnnotateTarget } from './annotate-notes/annotate-target.js';
7
11
  import { FlowErrorCode, RecordedSaveError, ReplayStatus, SuiteIsolation, } from '@reticlehq/core';
8
12
  import { recordSuiteFlakes } from './suite/suite-flakes.js';
9
- import { ReticleTool } from '@reticlehq/core';
10
- import { asNumber, asString, mutationTargetsFor, perturbationFor } from '@reticlehq/core';
11
- import { workerCountSchema } from '../../surface/tools/args/numeric-bounds.js';
13
+ import { AppRuntime, ReticleTool } from '@reticlehq/core';
14
+ import { asNumber, asString } from '@reticlehq/core';
12
15
  import { log } from '../../log.js';
13
16
  import { cloudFetch, syncFlowToCloud, SyncOutcome } from '../../memory/cloud/cloud-sync.js';
14
17
  import { mapWithConcurrency, resolveConcurrency } from './suite/parallel-suite.js';
15
- import { acquireLeasedSession, sessionPerturbationPort, suiteFixtureSeed, } from '../../surface/tools/lease-tools.js';
18
+ import { acquireLeasedSession, suiteFixtureSeed } from '../../surface/tools/lease-tools.js';
16
19
  import { homedir } from 'node:os';
20
+ import { withShotRun } from '../../judgement/runs/default-run-id.js';
21
+ import { defaultRunId } from '../../judgement/runs/default-run-id.js';
17
22
  import { resolveProjectCloud } from '../../memory/cloud/cloud-config.js';
18
23
  import { buildSuiteVerdict } from './decision.js';
19
24
  import { classifyFlowAssertions, flattenSteps } from './flow-classify.js';
@@ -21,12 +26,15 @@ import { recordingBacktrackWarning } from './recording/recording-backtrack.js';
21
26
  import { isValidFlowName, flowPath } from '../../memory/project/dir/reticle-dir.js';
22
27
  import {} from './flows.js';
23
28
  import { flowsForSession } from './flow-store-for-session.js';
24
- import { rootForProjectId } from '../../memory/project/session-root.js';
29
+ import { rootForTarget, sessionTarget } from '../../memory/project/session-root.js';
30
+ import { originOf } from '../../portal/session/session-manager.js';
25
31
  import { resolveSuiteSelection } from './suite-selection.js';
26
- import { replayNamedFlow, flowErrorMessage, latestRecordedFlow, sessionProjectId, } from './flow-replay-run.js';
32
+ import { flowErrorMessage, latestRecordedFlow, sessionProjectId } from './flow-replay-run.js';
27
33
  import { persistAndSyncVerificationRun, } from '../../judgement/runs/verification-sync.js';
28
34
  import { runServerVerify } from './suite/server-verify.js';
29
35
  import { healFlow } from './heal-run.js';
36
+ import { RESULT_FIELD, resultField, suiteResult } from '../../surface/tools/reticle-result.js';
37
+ import { replayOneFlow } from './single-replay.js';
30
38
  export { replayNamedFlow } from './flow-replay-run.js';
31
39
  import { replayAndLearn } from './flow-learning.js';
32
40
  /**
@@ -34,19 +42,21 @@ import { replayAndLearn } from './flow-learning.js';
34
42
  * set). Fire-and-forget: resolves the config, POSTs via the platform fetch, and logs the outcome. Any
35
43
  * failure is swallowed so a network hiccup never affects the local save.
36
44
  */
37
- async function syncSavedFlowToCloud(deps, flow, projectId) {
45
+ async function syncSavedFlowToCloud(deps, flow, target) {
38
46
  // Per-project cloud: sync a saved flow only when cloud is attached AND flow sync is enabled.
39
47
  // The link file of the project this flow belongs to — the flow itself was already saved through
40
48
  // `flowsForSession`, and reading the credential from a different tree is how one project's work
41
49
  // reaches another project's dashboard.
42
- const cloud = await resolveProjectCloud(deps.fs, rootForProjectId(deps, projectId), homedir(), process.env);
50
+ const cloud = await resolveProjectCloud(deps.fs, rootForTarget(deps, target), homedir(), process.env);
43
51
  if (null === cloud.config || !cloud.policy.flows)
44
52
  return; // not attached / flows disabled → local only
45
- const result = await syncFlowToCloud(flow, cloud.config, projectId, cloudFetch);
53
+ const result = await syncFlowToCloud(flow, cloud.config, target.projectId, cloudFetch);
46
54
  if (result.outcome !== SyncOutcome.SYNCED) {
47
55
  log('cloud-flow-sync-failed', { flow: flow.name, status: result.status, error: result.error });
48
56
  }
49
57
  }
58
+ /** A step index no recorded flow reaches; bounds `to` and `at`. */
59
+ const MAX_REPLAY_STEP = 10_000;
50
60
  /**
51
61
  * The URL a leased context should open: the app's ORIGIN, not the live tab's current location.
52
62
  *
@@ -57,7 +67,10 @@ async function syncSavedFlowToCloud(deps, flow, projectId) {
57
67
  */
58
68
  export function leasableAppUrl(deps, sessionId) {
59
69
  try {
60
- const url = deps.sessions.resolve(sessionId).url;
70
+ const session = deps.sessions.resolve(sessionId);
71
+ if (AppRuntime.WEB !== (session.runtime ?? AppRuntime.WEB))
72
+ return undefined; // desktop: no IPC in a lease
73
+ const url = session.url;
61
74
  if (typeof url !== 'string' || 0 === url.length)
62
75
  return undefined;
63
76
  return new URL(url).origin;
@@ -75,7 +88,7 @@ export function leasableAppUrl(deps, sessionId) {
75
88
  * refusal on that path is deliberately silent — a fixture is an optimisation, and a suite must not
76
89
  * die when one is unavailable.
77
90
  */
78
- function sessionUrlOf(deps, sessionId) {
91
+ export function sessionUrlOf(deps, sessionId) {
79
92
  try {
80
93
  return deps.sessions.resolve(sessionId).url;
81
94
  }
@@ -112,15 +125,17 @@ export const FLOW_TOOLS = [
112
125
  FLOW_MUTATE_TOOL,
113
126
  {
114
127
  name: ReticleTool.FLOW_SAVE,
115
- description: 'Persist the last/active recording (by name) as a git-checked, anchor-resolved flow at .reticle/flows/<name>.json. Each step is bound to a SEMANTIC anchor (testid/role/signal), never a volatile ref; steps without a resolvable testid are kept with degraded:true (a "add a data-testid here" marker) rather than dropped. Returns { name, stepCount, degraded, empty, assertions, warning? } — `assertions.grade` is asserted | presence-only | assertion-free: a flow that only acts (or only checks element presence) will pass even if the feature breaks, so when grade is not "asserted" follow assertions.warning and add a consequence assertion via reticle_annotate (assert-signal / assert-net / success-state). `warning` is present when the recording left a page and returned to it: replay has no navigation steps, so the next click will look for a control on a page the tab is no longer on.',
128
+ description: 'Persist a STOPPED recording (by name) as a git-checked, anchor-resolved flow at .reticle/flows/<name>.json. A recording that is still running is refused: stop it first with reticle_record{action:"stop"}, and the refusal names the exact call. Each step is bound to a SEMANTIC anchor (testid/role/signal), never a volatile ref; steps without a resolvable testid are kept with degraded:true (a "add a data-testid here" marker) rather than dropped. Returns { name, stepCount, degraded, empty, assertions, warning? } — `assertions.grade` is asserted | presence-only | assertion-free: a flow that only acts (or only checks element presence) will pass even if the feature breaks, so when grade is not "asserted" follow assertions.warning and add a consequence assertion via reticle_annotate (assert-signal / assert-net / success-state). `warning` is present when the recording left a page and returned to it: replay has no navigation steps, so the next click will look for a control on a page the tab is no longer on.',
116
129
  inputSchema: {
117
130
  flow: z
118
131
  .string()
119
132
  .optional()
120
133
  .describe('Alias for `flowName` (the name reticle_annotate uses).'),
134
+ name: z.string().optional().describe('Alias for `flowName`.'),
121
135
  flowName: z
122
136
  .string()
123
- .describe('Which RECORDING to save — the name reticle_record{start} was called with. This is a lookup key, not the filename: pass `saveAs` to choose that.'),
137
+ .optional()
138
+ .describe('Which RECORDING to save — the name reticle_record{start} was called with ("last-journey" for the reticle_act {steps} just proved). Omit when only one is stopped. This is a lookup key, not the filename: pass `saveAs` to choose that.'),
124
139
  saveAs: z
125
140
  .string()
126
141
  .optional()
@@ -156,6 +171,7 @@ export const FLOW_TOOLS = [
156
171
  })
157
172
  .optional(),
158
173
  intentGap: INTENT_GAP_FIELD,
174
+ normalized: z.array(z.string()).optional(),
159
175
  warning: z
160
176
  .string()
161
177
  .optional()
@@ -164,7 +180,12 @@ export const FLOW_TOOLS = [
164
180
  code: z.string().optional(),
165
181
  },
166
182
  handler: (deps, args) => {
167
- const name = asString(aliasParam(args, 'flowName', ['flow'])['flowName']) ?? '';
183
+ const aliases = ['flow', 'name', 'recordingName'];
184
+ const normalized = aliasUsed(args, 'flowName', aliases);
185
+ const explicitName = asString(aliasParam(args, 'flowName', aliases)['flowName']);
186
+ // The one stopped recording when the call names none — the same defaulting record{stop} and
187
+ // annotate use. With several, nothing is picked: the refusal below names them.
188
+ const name = resolveAnnotateTarget(explicitName, deps.recordings.compiled());
168
189
  const program = deps.recordings.getCompiled(name);
169
190
  if (program === undefined) {
170
191
  /*
@@ -177,6 +198,13 @@ export const FLOW_TOOLS = [
177
198
  * before the names were compared.
178
199
  */
179
200
  const held = deps.recordings.compiled();
201
+ const running = stillRecording(deps.recordings.active(), name, explicitName, held);
202
+ if (running !== undefined) {
203
+ return Promise.resolve({
204
+ error: stillRecordingMessage(running),
205
+ code: FlowErrorCode.NO_RECORDING,
206
+ });
207
+ }
180
208
  return Promise.resolve({
181
209
  error: 0 === held.length
182
210
  ? flowErrorMessage(FlowErrorCode.NO_RECORDING)
@@ -211,13 +239,14 @@ export const FLOW_TOOLS = [
211
239
  ...(success !== undefined ? { success } : {}),
212
240
  ...(intent !== undefined ? { intent } : {}),
213
241
  };
214
- const projectId = sessionProjectId(deps, asString(args['sessionId']));
242
+ const target = sessionTarget(deps, asString(args['sessionId']));
243
+ const { projectId } = target;
215
244
  // A zero-step recording is not a flow. Saving it wrote a file the suite reports "unverifiable"
216
245
  // forever while telling the agent it had saved a regression test — see empty-flow.
217
246
  const emptyRefusal = emptyFlowRefusal(program.steps.length, name);
218
247
  if (emptyRefusal !== undefined)
219
248
  return Promise.resolve(emptyRefusal);
220
- const { flows, root } = flowsForSession(deps, projectId);
249
+ const { flows, root } = flowsForSession(deps, target);
221
250
  const author = flowAuthor();
222
251
  const toSave = {
223
252
  ...program,
@@ -244,6 +273,7 @@ export const FLOW_TOOLS = [
244
273
  const invoked = loaded.ok ? await loadInvoked(flows, loaded.value, projectId) : new Map();
245
274
  return loaded.ok
246
275
  ? {
276
+ ...(0 === normalized.length ? {} : { normalized }),
247
277
  ...res.value,
248
278
  ...(path === undefined ? {} : { path }),
249
279
  assertions: classifyFlowAssertions(loaded.value, invoked),
@@ -275,10 +305,11 @@ export const FLOW_TOOLS = [
275
305
  // (the prior bug) made schema-validating MCP clients reject the result ("expected object,
276
306
  // received string") — caught driving the live demo.
277
307
  handler: (deps, args) => {
278
- const projectId = sessionProjectId(deps, asString(args['sessionId']));
308
+ const target = sessionTarget(deps, asString(args['sessionId']));
309
+ const { projectId } = target;
279
310
  // The APP's flows, not the daemon's. Listing where the daemon was launched is what showed a
280
311
  // React dashboard a HUD full of Electron and Tauri flows from an unrelated checkout.
281
- const { flows: store, root } = flowsForSession(deps, projectId);
312
+ const { flows: store, root } = flowsForSession(deps, target);
282
313
  return store.list(projectId).then((names) => ({
283
314
  // `list` deliberately returns invalid names so they are reported rather than silently
284
315
  // dropped — but the declared outputSchema requires `path` on EVERY entry, and omitting it made
@@ -366,16 +397,15 @@ export const FLOW_TOOLS = [
366
397
  {
367
398
  name: ReticleTool.FLOW_REPLAY,
368
399
  description: "Replay a git-checked flow from .reticle/flows/<name>.json. RE-RESOLVES each step's semantic " +
369
- 'anchor (testid via reticle_query; signal via predicate) against the LIVE DOM — never reuses a ' +
370
- 'stale ref. On an anchor MISS returns legible DRIFT { step, anchor, drift:{ reasonKind, reason, ' +
371
- 'nearest } } (the closest surviving testid) and stops — the "whose fault is it" contract. ' +
372
- 'Returns { name, status: ok|drift|error, steps:[...] }; missing/malformed files and action ' +
373
- 'failures are status:error with a structured code (distinct from contract-changed drift). ' +
374
- 'An ok replay of a flow that asserts no consequence also carries unverifiable:{reason} — it ' +
375
- 'would read ok even if the feature were broken, so do NOT treat that ok as proof. ' +
376
- 'A run that stops early carries halted:{atStep, notAttempted}: `steps` is SHORTER than the ' +
377
- 'flow because replay stopped, not because a step was skipped — do not read a missing step as ' +
378
- 'an action that failed to dispatch.',
400
+ 'anchor (testid via reticle_query; signal via predicate) against LIVE DOM. On anchor MISS returns ' +
401
+ 'DRIFT { step, anchor, drift:{ reasonKind, reason, nearest } } and stops. ' +
402
+ 'Returns { name, status: ok|drift|error|unverifiable, steps:[...] }. ' +
403
+ 'Action failures are status:error. ' +
404
+ 'Status unverifiable means flow could not be graded (missing secrets, unmet preconditions, lost ' +
405
+ 'document) — neither pass nor fail, treat as UNKNOWN. ' +
406
+ 'An ok replay of a flow asserting no consequence also carries unverifiable:{reason} — do not ' +
407
+ 'treat as proof. ' +
408
+ 'Early halt carries halted:{atStep, notAttempted}: `steps` is shorter because replay stopped.',
379
409
  inputSchema: {
380
410
  flow: z
381
411
  .string()
@@ -384,14 +414,26 @@ export const FLOW_TOOLS = [
384
414
  flowName: z
385
415
  .string()
386
416
  .describe('Flow file name (without .json extension) from reticle_flow{action:"list"}.'),
387
- confirmDangerous: z
388
- .boolean()
389
- .optional()
390
- .describe('Set true to allow destructive controls during this replay only.'),
417
+ [CALL_SECRETS_ARG]: callSecretsArg,
418
+ confirmDangerous: confirmDangerousArg('this replay'),
391
419
  from: z
392
420
  .union([z.number().int().nonnegative(), z.string().min(1)])
393
421
  .optional()
394
422
  .describe('Resume at this step (index or step id). Earlier steps re-run as unchecked, unreported setup; a setup step marked effect:"commits" refuses the resume.'),
423
+ to: z
424
+ .number()
425
+ .int()
426
+ .positive()
427
+ .max(MAX_REPLAY_STEP)
428
+ .optional()
429
+ .describe('Stop before this step (drive only to a point journeys branch from).'),
430
+ at: z
431
+ .number()
432
+ .int()
433
+ .nonnegative()
434
+ .max(MAX_REPLAY_STEP)
435
+ .optional()
436
+ .describe('Continue at this step on the page as it is (after another flow ran `to` it); 0 replays the whole flow on the page the flow before it left, with no reload.'),
395
437
  sweep: z
396
438
  .boolean()
397
439
  .optional()
@@ -409,10 +451,12 @@ export const FLOW_TOOLS = [
409
451
  .array(z.unknown())
410
452
  .optional()
411
453
  .describe('Present when `seed` was given: which endpoints were delayed, and by how long.'),
454
+ [RESULT_FIELD]: z.string().optional(),
412
455
  // The flow's name — always present in FlowReplayResult (the description promises `{ name, … }`),
413
456
  // but omitted here, so a validating profile stripped it and a replay result arrived anonymous.
414
457
  name: z.string(),
415
- status: z.string().describe('ok | drift | error'),
458
+ status: z.string().describe('ok | drift | error | unverifiable'),
459
+ runId: z.string().optional().describe('The run this replay was written down as.'),
416
460
  steps: z.array(z.unknown()),
417
461
  proposals: z.array(z.unknown()).optional(),
418
462
  deviation: z
@@ -466,41 +510,7 @@ export const FLOW_TOOLS = [
466
510
  },
467
511
  // The decision envelope is attached by replayNamedFlow only on drift/fail (clean pass stays
468
512
  // token-flat). Single-flow replay and whole-suite verify share that one implementation.
469
- handler: async (deps, args) => {
470
- const seed = asNumber(args['seed']);
471
- if (seed === undefined)
472
- return await replayAndLearn(deps, args);
473
- /*
474
- * Seeded chaos, and always put the page back.
475
- *
476
- * The targets are the endpoints the FLOW declared it depends on, so the perturbation lands on
477
- * traffic the flow claims to care about rather than on something it never mentioned. No
478
- * declared endpoints means nothing to slow, and the replay runs clean rather than pretending
479
- * a seed did something.
480
- *
481
- * `finally` is not tidiness: a page left slowed is damage the NEXT run inherits, and it would
482
- * inherit it as a mystery — the same rule the mutation loop had to earn.
483
- */
484
- const sessionId = asString(args['sessionId']);
485
- const loaded = await flowsForSession(deps, sessionProjectId(deps, sessionId))
486
- .flows.load(asString(args['flowName']) ?? asString(args['flow']) ?? '', sessionProjectId(deps, sessionId))
487
- .catch(() => null);
488
- const targets = loaded !== null && loaded.ok ? mutationTargetsFor(loaded.value) : [];
489
- const rules = perturbationFor(seed, targets);
490
- const port = 0 === rules.length
491
- ? undefined
492
- : await sessionPerturbationPort(deps.realInput, leasableAppUrl(deps, sessionId));
493
- if (port === undefined)
494
- return replayAndLearn(deps, args);
495
- try {
496
- await port.slow(rules);
497
- const replay = await replayNamedFlow(deps, args);
498
- return { ...replay, perturbed: rules };
499
- }
500
- finally {
501
- await port.clear().catch(() => undefined);
502
- }
503
- },
513
+ handler: (deps, args) => replayOneFlow(deps, args, leasableAppUrl(deps, asString(args['sessionId']))),
504
514
  },
505
515
  {
506
516
  name: ReticleTool.FLOW_VERIFY,
@@ -510,6 +520,7 @@ export const FLOW_TOOLS = [
510
520
  'whatChanged, whereInSource, nextAction }] } plus `flaky` (flows seen to pass AND fail on unchanged code) — passing flows are counted, only failures carry ' +
511
521
  'detail (the actionable fix). One call replaces N hand-driven replays.',
512
522
  inputSchema: {
523
+ [CALL_SECRETS_ARG]: callSecretsArg,
513
524
  names: z
514
525
  .array(z.string())
515
526
  .optional()
@@ -521,6 +532,7 @@ export const FLOW_TOOLS = [
521
532
  parallel: workerCountSchema
522
533
  .optional()
523
534
  .describe('Run this many flows at once, each in its own isolated leased browser context (needs the browser pool). Clamped to the pool capacity and the flow count. Omit for the sequential single-tab run.'),
535
+ confirmDangerous: confirmDangerousArg('this run of the suite'),
524
536
  sessionId: z
525
537
  .string()
526
538
  .optional()
@@ -528,10 +540,12 @@ export const FLOW_TOOLS = [
528
540
  },
529
541
  outputSchema: {
530
542
  status: z.string().describe('pass | fail'),
543
+ runId: z.string().optional().describe('The run this suite was written down as.'),
531
544
  total: z.number(),
532
545
  passed: z.number(),
533
546
  failed: z.number(),
534
547
  summary: z.string(),
548
+ [RESULT_FIELD]: z.string().optional(),
535
549
  failures: z.array(z.unknown()),
536
550
  isolation: z
537
551
  .string()
@@ -573,11 +587,14 @@ export const FLOW_TOOLS = [
573
587
  // feedback ask here or a validating profile strips it off the suite verdict.
574
588
  feedback_prompt: z.unknown().optional(),
575
589
  },
576
- handler: async (deps, args) => {
590
+ // The run id is minted first, so each replayed step's screenshot is filed under the run.
591
+ handler: (deps, args) => withShotRun(defaultRunId(), async () => {
577
592
  const sessionId = asString(args['sessionId']);
593
+ const confirmed = true === args['confirmDangerous'] ? { confirmDangerous: true } : {};
578
594
  // "Replay all" means all of THIS app's flows (+ legacy), not every project's on a shared daemon.
579
- const projectId = sessionProjectId(deps, sessionId);
580
- const selected = await resolveSuiteSelection(deps, projectId, args);
595
+ const target = sessionTarget(deps, sessionId);
596
+ const { projectId } = target;
597
+ const selected = await resolveSuiteSelection(deps, target, args);
581
598
  const requested = selected.run;
582
599
  /** Named rather than subtracted — a suite that returns fewer than were asked for must say so. */
583
600
  const heldBack = {
@@ -587,7 +604,7 @@ export const FLOW_TOOLS = [
587
604
  ...(selected.unsatisfied === undefined ? {} : { unsatisfied: selected.unsatisfied }),
588
605
  };
589
606
  // verify:server — hand the whole suite to the hosted runner; it records the verification itself.
590
- const cloud = await resolveProjectCloud(deps.fs, rootForProjectId(deps, projectId), homedir(), process.env);
607
+ const cloud = await resolveProjectCloud(deps.fs, rootForTarget(deps, target), homedir(), process.env);
591
608
  const server = await runServerVerify(deps, cloud, sessionId, requested);
592
609
  if (server !== null)
593
610
  return server;
@@ -629,7 +646,11 @@ export const FLOW_TOOLS = [
629
646
  const start = deps.now();
630
647
  const lease = await acquireLeasedSession(pool, deps.sessions, appUrl, projectId, seed);
631
648
  try {
632
- const replay = await replayAndLearn(deps, { flowName, sessionId: lease.sessionId });
649
+ const replay = await replayAndLearn(deps, {
650
+ flowName,
651
+ sessionId: lease.sessionId,
652
+ ...confirmed,
653
+ });
633
654
  return { replay, durationMs: deps.now() - start };
634
655
  }
635
656
  finally {
@@ -639,7 +660,7 @@ export const FLOW_TOOLS = [
639
660
  const parallelRuns = await Promise.all(outcomes.map(async (o, i) => {
640
661
  const name = requested[i] ?? '';
641
662
  const replay = o.ok && o.value !== undefined ? o.value.replay : leaseFailureReplay(name, o.error);
642
- const loaded = await flowsForSession(deps, projectId)
663
+ const loaded = await flowsForSession(deps, target)
643
664
  .flows.load(name, projectId)
644
665
  .catch(() => null);
645
666
  const flow = loaded !== null && loaded.ok ? loaded.value : undefined;
@@ -649,13 +670,15 @@ export const FLOW_TOOLS = [
649
670
  ...(parallelRuns[i] ?? { replay: leaseFailureReplay(requested[i] ?? '', o.error) }),
650
671
  durationMs: o.ok && o.value !== undefined ? o.value.durationMs : 0,
651
672
  }));
652
- const flaky = await recordSuiteFlakes(deps.fs, rootForProjectId(deps, projectId), parallelRuns);
653
- await persistAndSyncVerificationRun(deps, timed, projectId);
673
+ const flaky = await recordSuiteFlakes(deps.fs, rootForTarget(deps, target), parallelRuns);
674
+ const runId = await persistAndSyncVerificationRun(deps, timed, target);
654
675
  const verdict = buildSuiteVerdict(parallelRuns, selected.knownRoutes, SuiteIsolation.PER_FLOW_LEASE);
655
676
  return {
656
677
  ...verdict,
678
+ ...(runId === undefined ? {} : { runId }),
657
679
  ...(flaky.length > 0 ? { flaky: [...flaky] } : {}),
658
680
  ...heldBack,
681
+ ...resultField(() => suiteResult(rootForTarget(deps, target), verdict, timed, runId)),
659
682
  };
660
683
  }
661
684
  // The flow FILE travels with each replay so the verdict can tell a green that verified
@@ -673,8 +696,8 @@ export const FLOW_TOOLS = [
673
696
  // (1 of 2 flows). Restoring two thirds of a session is worse than restoring none.
674
697
  for (const flowName of requested) {
675
698
  const start = deps.now();
676
- const replay = await replayAndLearn(deps, { flowName, sessionId });
677
- const loaded = await flowsForSession(deps, projectId)
699
+ const replay = await replayAndLearn(deps, { flowName, sessionId, ...confirmed });
700
+ const loaded = await flowsForSession(deps, target)
678
701
  .flows.load(flowName, projectId)
679
702
  .catch(() => null);
680
703
  const flow = loaded !== null && loaded.ok ? loaded.value : undefined;
@@ -689,19 +712,21 @@ export const FLOW_TOOLS = [
689
712
  // `reticle flow` on the command line, so an AGENT running this tool a hundred times learned
690
713
  // nothing about which flows are intermittent. Same product, same ledger, two surfaces, and the
691
714
  // one an agent uses was the blind half.
692
- const flaky = await recordSuiteFlakes(deps.fs, rootForProjectId(deps, projectId), runs);
715
+ const flaky = await recordSuiteFlakes(deps.fs, rootForTarget(deps, target), runs);
693
716
  // Emit the consolidated run artifact (Runs tab) + best-effort cloud push. Never blocks the verdict.
694
- await persistAndSyncVerificationRun(deps, timed, projectId);
717
+ const runId = await persistAndSyncVerificationRun(deps, timed, target);
695
718
  const verdict = buildSuiteVerdict(runs, selected.knownRoutes, SuiteIsolation.SHARED_SESSION);
696
719
  // A flow that has both passed and failed on UNCHANGED code is a different thing from a
697
720
  // regression, and an agent that cannot tell them apart either chases a ghost or ignores a real
698
721
  // break. Present only when the ledger has seen enough runs to say so.
699
722
  return {
700
723
  ...verdict,
724
+ ...(runId === undefined ? {} : { runId }),
701
725
  ...(flaky.length > 0 ? { flaky: [...flaky] } : {}),
702
726
  ...heldBack,
727
+ ...resultField(() => suiteResult(rootForTarget(deps, target), verdict, timed, runId)),
703
728
  };
704
- },
729
+ }),
705
730
  },
706
731
  {
707
732
  name: ReticleTool.FLOW_SAVE_RECORDED,
@@ -766,12 +791,13 @@ export const FLOW_TOOLS = [
766
791
  // Resolved like every other path now. This save used to go to the daemon's root while the
767
792
  // recorded-flow save resolved per session, so where a flow landed depended on which tool wrote
768
793
  // it — and the pair that disagreed were the two ways to save the same thing.
769
- const res = await flowsForSession(deps, session.projectId).flows.saveFlow(flow, session.projectId);
794
+ const target = { projectId: session.projectId, origin: originOf(session.url) };
795
+ const res = await flowsForSession(deps, target).flows.saveFlow(flow, session.projectId);
770
796
  if (!res.ok)
771
797
  return { error: flowErrorMessage(res.code, res.detail), code: res.code };
772
798
  // If logged in to Reticle, mirror the saved flow to the team's regression suite. Best-effort
773
799
  // and non-blocking: the flow is already on disk, so a sync failure never fails the save.
774
- void syncSavedFlowToCloud(deps, flow, session.projectId);
800
+ void syncSavedFlowToCloud(deps, flow, target);
775
801
  // Return the SaveSummary as-is ({ name, stepCount, degraded, empty }) — the outputSchema
776
802
  // declares `name`, so the old `flowName` key was silently stripped by schema-strict clients.
777
803
  return res.value;
@@ -795,10 +821,7 @@ export const FLOW_TOOLS = [
795
821
  .describe('Alias for `flowName` (the name reticle_annotate uses).'),
796
822
  flowName: z.string().describe('Flow file name to heal (from reticle_flow{action:"list"}).'),
797
823
  apply: z.boolean().optional(),
798
- confirmDangerous: z
799
- .boolean()
800
- .optional()
801
- .describe('Set true to allow destructive controls during this heal replay only.'),
824
+ confirmDangerous: confirmDangerousArg('this heal replay'),
802
825
  sessionId: z
803
826
  .string()
804
827
  .optional()
@@ -11,6 +11,14 @@ export declare function anchorForStep(args: Record<string, unknown>): {
11
11
  anchor: FlowAnchor;
12
12
  degraded: boolean;
13
13
  };
14
+ /**
15
+ * The recorded steps as they may be SHOWN: every credential fill carries the placeholder.
16
+ *
17
+ * The same rule the saved flow is written by, applied to what a tool hands back. `record stop`
18
+ * returned the compiled program verbatim, so the password a saved flow never contained went into
19
+ * the agent's transcript instead. The store keeps the real value — an in-session replay types it.
20
+ */
21
+ export declare function redactRecordedSteps(steps: readonly RecordedStep[]): RecordedStep[];
14
22
  /**
15
23
  * What the anchor CALLS the field it points at.
16
24
  *
@@ -58,7 +66,14 @@ export interface FlowAnnotations {
58
66
  /** Persists anchored flows to .reticle/flows/<name>.json. Filesystem + clock are injected. */
59
67
  export declare class FlowStore {
60
68
  #private;
61
- constructor(fs: FileSystemPort, root: string, clock: Clock);
69
+ /**
70
+ * `onWrote` is told after a save lands, so cloud sync cycles on a new flow the way it does on a
71
+ * new run (`RunStore` takes the same callback). Without it a flow saved with no run behind it
72
+ * waited for the timer, and a daemon that exited first never sent it.
73
+ */
74
+ constructor(fs: FileSystemPort, root: string, clock: Clock, opts?: {
75
+ onWrote?: () => void;
76
+ });
62
77
  /**
63
78
  * Convert a CompiledProgram (testid-normalized) into an anchored, on-disk flow + write it.
64
79
  * Optionally fold structured annotations (per-step expect, dynamic[], success) onto