@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
@@ -7,15 +7,17 @@
7
7
  * or a step's events land in the wrong window depending on how it was addressed.
8
8
  */
9
9
  import { expectedElementTestid } from '@reticlehq/core';
10
- import { AnchorKind, DEGRADED_ANCHOR_ROLE, DriftReason, PredicateKind, QueryBy, ReticleCommand, } from '@reticlehq/core';
10
+ import { AnchorKind, DEGRADED_ANCHOR_ROLE, DriftReason, PredicateKind, QueryBy, ReplayStatus, ReticleCommand, } from '@reticlehq/core';
11
11
  import { ReticleTool } from '@reticlehq/core';
12
12
  import { replayActionArgs } from './replay.js';
13
13
  import { isStaleRefError } from '../../surface/tools/act/act-sequence-retry.js';
14
14
  import { waitForReaction } from '../../surface/tools/act/react-grace.js';
15
15
  import { anchorFieldName } from './flows.js';
16
- import { anchorLabel, componentLabel, componentQueryArgs, expectElementDrift, resolveQuery, testidDrift, } from './flow-anchor.js';
16
+ import { ambiguityDrift, refFor, anchorLabel, componentLabel, componentQueryArgs, expectElementDrift, reresolved, resolveQuery, testidDrift, } from './flow-anchor.js';
17
17
  import { nearestRoleName } from './role-anchor-nearest.js';
18
18
  import { roleDriftReason } from '../../judgement/outcome/role-drift-reason.js';
19
+ /** The live act_sequence tool gives each step this transport budget when none was supplied. */
20
+ export const DEFAULT_SEQUENCE_STEP_TIMEOUT_MS = 8_000;
19
21
  /** Query args for a NAMED role anchor — the handle that identifies an instance, not a JSX site. */
20
22
  function roleQueryArgs(anchor) {
21
23
  return {
@@ -63,7 +65,25 @@ async function nearestRoleNameOnPage(session, anchor) {
63
65
  export async function runRoleStep(session, step, index, anchor, confirmDangerous, sleep) {
64
66
  const label = `${anchor.role} "${String(anchor.name)}"`;
65
67
  const { refs } = await resolveQuery(session, roleQueryArgs(anchor), sleep);
66
- const ref = refs[0];
68
+ /*
69
+ * More than one match is DRIFT, not a guess. This path took `refs[0]`, dispatched, and returned
70
+ * `ok: true`, so a flow recorded against "View result" on row 3 of a table replayed by clicking row
71
+ * 1 and PASSED whenever every row shared the consequence (the same GET returning 200). The verdict
72
+ * reads `drift` and `ok` and nothing else, so a green here is indistinguishable from a replay that
73
+ * did what it did before.
74
+ *
75
+ * A role+name anchor is MORE likely to land here than a testid is: `button "View result"` is
76
+ * user-visible text, and a table repeats it by nature, so several matches is the expected shape of
77
+ * a recorded row action rather than an accident.
78
+ *
79
+ * The check itself lives in `ambiguityDrift`, shared with the testid and component runners: written
80
+ * per-runner, this rule got applied to two anchor kinds and forgotten for the third.
81
+ */
82
+ const ambiguous = ambiguityDrift(anchor, refs);
83
+ if (ambiguous !== null) {
84
+ return { step: index, tool: step.tool, anchor: label, ok: false, drift: ambiguous };
85
+ }
86
+ const ref = refFor(anchor, refs);
67
87
  if (ref === undefined) {
68
88
  // `nearest` used to be the literal null, so heal answered "no nearest match cleared the
69
89
  // confidence floor" for EVERY role-anchored drift — a structural limit reported as a judgement
@@ -86,8 +106,15 @@ export async function runRoleStep(session, step, index, anchor, confirmDangerous
86
106
  };
87
107
  }
88
108
  return await actOnResolvedRef(session, step, index, label, ref, confirmDangerous, anchorFieldName(anchor),
89
- // The retry's whole point: run the SAME locator against the DOM as it is now.
90
- async () => (await resolveQuery(session, roleQueryArgs(anchor), sleep)).refs[0]);
109
+ /*
110
+ * The retry's whole point: run the SAME locator against the DOM as it is now.
111
+ *
112
+ * It reports WHAT it found, not just a ref. A re-render can turn an unambiguous anchor into an
113
+ * ambiguous one between the two dispatches, and dispatching at the first of the new matches would
114
+ * re-make the guess the check above exists to refuse — one layer deeper, where the caller cannot
115
+ * see it. `reresolved` is the same rule as that check, so the two cannot disagree.
116
+ */
117
+ async () => reresolved(anchor, (await resolveQuery(session, roleQueryArgs(anchor), sleep)).refs));
91
118
  }
92
119
  /**
93
120
  * `assertActionAllowed`'s refusal — "potentially destructive action blocked; retry with
@@ -109,11 +136,8 @@ function replayDestructiveActionHint(rawError) {
109
136
  return (`${rawError} — this is a flow REPLAY: a step's own args.confirmDangerous is stripped before ` +
110
137
  'dispatch and never persists, so editing the flow file does nothing. Pass it at the call level ' +
111
138
  `instead: ${ReticleTool.FLOW_REPLAY} { confirmDangerous: true } acknowledges every flagged step ` +
112
- // `reticle_verify{action:"flows"}` (the batch suite runner) has no such argument today — naming
113
- // it here would repeat the exact defect this message exists to fix, so the honest statement is
114
- // that a flow with a flagged step currently has to be replayed on its own to pass it.
115
- 'for this run. The batch reticle_verify{action:"flows"} has no equivalent option yet, so a flow ' +
116
- 'with a flagged step has to be replayed on its own to acknowledge it.');
139
+ 'for this run, as do reticle_verify{action:"flows", confirmDangerous: true} for a suite and ' +
140
+ '`reticle verify <url> --confirm-dangerous` from the command line.');
117
141
  }
118
142
  /**
119
143
  * Dispatch one already-resolved step. Shared so every anchor kind runs the action the same way —
@@ -131,6 +155,9 @@ field,
131
155
  * found, and the retry below is worthless without it: re-dispatching the SAME dead ref fails
132
156
  * identically. What changed between the two attempts is the DOM, so the locator has to be run
133
157
  * against it again.
158
+ *
159
+ * It reports WHAT it found, not just a ref: see `Reresolved`. A re-render that turns one match into
160
+ * three is a drift, and the caller is the only layer that can say so with the right anchor in hand.
134
161
  */
135
162
  reresolve) {
136
163
  const dispatch = async (at) => {
@@ -167,8 +194,24 @@ reresolve) {
167
194
  sleep: (ms) => new Promise((resolve) => setTimeout(resolve, ms)),
168
195
  });
169
196
  const fresh = await reresolve();
197
+ /*
198
+ * The re-render turned one match into SEVERAL, so there is nothing to dispatch at and the answer
199
+ * is a drift — the same `anchor_ambiguous` the first resolution would have given, reported for the
200
+ * same reason.
201
+ *
202
+ * The staleness this retry exists to absorb is a different diagnosis with a different fix, and
203
+ * this used to be the only one reported: the step came back as `{ok: false, error: "ref 'e-orig'
204
+ * no longer resolves to an element"}` — a sentence about an element that is GONE, sent for an
205
+ * element that is now three. An agent reading it goes hunting for a rename, or re-records the
206
+ * flow, when the actual fix is a narrower anchor. Telling the two apart is what `Reresolved` is
207
+ * for, and the reason `ANCHOR_AMBIGUOUS` exists as its own kind rather than folding into "not
208
+ * found".
209
+ */
210
+ if (fresh !== undefined && 'drift' in fresh) {
211
+ return { step: index, tool: step.tool, anchor: label, ok: false, drift: fresh.drift };
212
+ }
170
213
  if (fresh !== undefined)
171
- act = await dispatch(fresh);
214
+ act = await dispatch(fresh.ref);
172
215
  }
173
216
  const result = { step: index, tool: step.tool, anchor: label, ok: act.ok };
174
217
  if (!act.ok)
@@ -195,10 +238,28 @@ export async function runComponentStep(session, step, index, anchor, confirmDang
195
238
  },
196
239
  };
197
240
  }
241
+ /*
242
+ * Several matches is DRIFT here too, and this runner is where the rule was MISSING.
243
+ *
244
+ * The other two runners check it (through `ambiguityDrift`); this one took `refs[0]`, dispatched and
245
+ * returned `ok: true`. `by: QueryBy.COMPONENT` matches by component NAME, and a component rendered
246
+ * once per row — a table's action button, a card's menu — matches as many times as there are rows.
247
+ * So the guessed-green shape is not an edge case for this anchor kind, it is its ordinary one, and
248
+ * it is the exact defect #1227 describes: a click on the wrong element reported as a pass because
249
+ * the verdict reads `drift` and `ok` and never reads which element was hit.
250
+ */
251
+ const ambiguous = ambiguityDrift(anchor, refs);
252
+ if (ambiguous !== null) {
253
+ return { step: index, tool: step.tool, anchor: label, ok: false, drift: ambiguous };
254
+ }
198
255
  const ref = refs[0] ?? '';
199
256
  // Shared with the role path so both get the same action window AND the same stale-ref retry —
200
257
  // this used to dispatch inline, which is how one anchor kind could gain a fix the other lacked.
201
- return await actOnResolvedRef(session, step, index, label, ref, confirmDangerous, anchorFieldName(anchor), async () => (await resolveQuery(session, componentQueryArgs(anchor), sleep)).refs[0]);
258
+ return await actOnResolvedRef(session, step, index, label, ref, confirmDangerous, anchorFieldName(anchor),
259
+ // Same rule one layer deeper, same helper: a re-render that turns one match into three must not
260
+ // be dispatched at either, and it must say so as a drift rather than as a dead ref. This callback
261
+ // used to return `refs[0]` unconditionally.
262
+ async () => reresolved(anchor, (await resolveQuery(session, componentQueryArgs(anchor), sleep)).refs));
202
263
  }
203
264
  /**
204
265
  * DEGRADED_ANCHOR_ROLE is a MARKER ("no anchor could be determined"), never a locator.
@@ -268,6 +329,63 @@ export function anchorPrecondition(anchor) {
268
329
  }
269
330
  return undefined;
270
331
  }
332
+ /** What is added to a stale-ref error when it cannot be traced to one sub-step of the sequence. */
333
+ const STALE_SUB_STEP_UNKNOWN = ' (which sub-step that was could not be told, so the ones before it may have run)';
334
+ /** Where a ref that stayed stale sat in the sequence, and that every sub-step before it ran. */
335
+ const staleSubStepPosition = (at, total) => ` (sub-step ${String(at)} of ${String(total)}; ${String(at)} before it ran)`;
336
+ /**
337
+ * Why a step whose target kept going stale is unverifiable, as the replay result tells a reader.
338
+ * `step` is the index of the step that could not be acted on.
339
+ */
340
+ const staleTargetReason = (step) => `step ${String(step)} could not be acted on: its target kept going stale, because the ` +
341
+ `page re-rendered between finding the element and using it, and the replay looked it up ` +
342
+ `again for as long as that got it further. The steps before it are reported and nothing ` +
343
+ `after it ran. Nothing here says the app failed. If an earlier step makes the page ` +
344
+ `re-render, record that step's consequence with \`expect\` so the replay waits for the new ` +
345
+ `render before it moves on.`;
346
+ /**
347
+ * The sub-step, among live[from, to), whose ref the page said it could not find.
348
+ *
349
+ * The page echoes the ref in "ref 'x' no longer resolves to an element". A ref it shortened, or one
350
+ * that is not among these, gives no answer. Neither does a ref that two sub-steps share: the first of
351
+ * them may already have run, and may be what re-rendered the page, which makes the later one the stale
352
+ * one, and nothing in the message says so. The caller must not guess which actions already ran.
353
+ */
354
+ function staleSubStep(error, live, from, to) {
355
+ const named = /ref '([^']*)'/.exec(error)?.[1];
356
+ if (named === undefined)
357
+ return undefined;
358
+ const sharing = live.flatMap((one, at) => at >= from && at < to && one.ref === named ? [at] : []);
359
+ const [only] = sharing;
360
+ return 1 === sharing.length ? only : undefined;
361
+ }
362
+ /**
363
+ * The honest answer when a step's target kept going stale.
364
+ *
365
+ * Replay looks the element up again and goes on while that gets it further, so a step still stale
366
+ * after that is one the page re-rendered around faster than it could be targeted. Reporting it as
367
+ * `error` with the browser's own sentence says "your app broke", which is a claim nothing observed
368
+ * and sends a reader into product code that is fine. It is the same bucket as a document that went
369
+ * away: the steps before it are real and are attached, the step that could not be acted on is among
370
+ * them with its index, and nothing after it ran.
371
+ *
372
+ * Left alone, so the ordinary verdict stands, when anything else is in the run: a drifted anchor is
373
+ * drift whatever else happened, and a failure that is not staleness is a failure.
374
+ */
375
+ export function staleTargetResult(name, steps) {
376
+ if (steps.some((step) => step.drift !== undefined))
377
+ return undefined;
378
+ const failed = steps.filter((step) => !step.ok);
379
+ const [only] = failed;
380
+ if (failed.length !== 1 || only === undefined || !isStaleRefError(only.error))
381
+ return undefined;
382
+ return {
383
+ name,
384
+ status: ReplayStatus.UNVERIFIABLE,
385
+ steps: [...steps],
386
+ unverifiable: { reason: staleTargetReason(only.step) },
387
+ };
388
+ }
271
389
  /**
272
390
  * Run an act_sequence step: resolve every sub-step's OWN anchor, then dispatch the whole thing as one
273
391
  * ACT_SEQUENCE — the same shape `replayProgram` already uses, so a recorded sequence and a saved one
@@ -281,37 +399,62 @@ export function anchorPrecondition(anchor) {
281
399
  export async function runSequenceStep(session, step, index, subs, confirmDangerous, sleep,
282
400
  /** Testids whose presence is deliberately NOT asserted — the LLM-output case. */
283
401
  dynamic = new Set()) {
284
- const live = [];
285
- for (const [subIndex, sub] of subs.entries()) {
402
+ /**
403
+ * Find one sub-step's element as the page is NOW. Either the live step to dispatch, or the step
404
+ * result that ends the run: a degraded anchor, or one that is no longer on the page.
405
+ *
406
+ * `afterRerender` is the second look, taken because the page re-rendered under a sub-step. An anchor
407
+ * that now matches several elements is drift there, as it is for a single step's retry: the first of
408
+ * the new matches may be an element the recording did not mean, and acting on it would report a pass
409
+ * for a click nobody can attribute. The first look keeps taking the first match.
410
+ */
411
+ const resolveSub = async (sub, subIndex, afterRerender = false) => {
286
412
  const label = `${anchorLabel(sub.anchor)} (sub-step ${String(subIndex)})`;
287
413
  const queryArgs = anchorQueryArgs(sub.anchor);
288
414
  if (null === queryArgs)
289
- return degradedStepResult(step, index, label);
415
+ return { stop: degradedStepResult(step, index, label) };
290
416
  const { refs, hint } = await resolveQuery(session, queryArgs, sleep);
291
- const ref = refs[0];
417
+ const ambiguous = afterRerender ? ambiguityDrift(sub.anchor, refs) : null;
418
+ if (ambiguous !== null) {
419
+ return { stop: { step: index, tool: step.tool, anchor: label, ok: false, drift: ambiguous } };
420
+ }
421
+ const ref = afterRerender ? refFor(sub.anchor, refs) : refs[0];
292
422
  if (ref === undefined) {
293
423
  return {
294
- step: index,
295
- tool: step.tool,
296
- anchor: label,
297
- ok: false,
298
- drift: sub.anchor.kind === AnchorKind.TESTID
299
- ? testidDrift(sub.anchor.value, hint)
300
- : {
301
- reasonKind: DriftReason.COMPONENT_NOT_FOUND,
302
- reason: `anchor ${label} not found`,
303
- anchor: label,
304
- nearest: null,
305
- },
424
+ stop: {
425
+ step: index,
426
+ tool: step.tool,
427
+ anchor: label,
428
+ ok: false,
429
+ drift: sub.anchor.kind === AnchorKind.TESTID
430
+ ? testidDrift(sub.anchor.value, hint)
431
+ : {
432
+ reasonKind: DriftReason.COMPONENT_NOT_FOUND,
433
+ reason: `anchor ${label} not found`,
434
+ anchor: label,
435
+ nearest: null,
436
+ },
437
+ },
306
438
  };
307
439
  }
308
- live.push({
309
- ref,
310
- action: sub.action ?? '',
311
- // Each sub-step carries its OWN anchor, so each gets its own field name. A sequence that ends
312
- // in a login is the shape this was reported on, and the sub-step is where the fill lives.
313
- args: replayActionArgs(sub.args, confirmDangerous, anchorFieldName(sub.anchor)),
314
- });
440
+ return {
441
+ live: {
442
+ ref,
443
+ action: sub.action ?? '',
444
+ // Each sub-step carries its OWN anchor, so each gets its own field name. A sequence that ends
445
+ // in a login is the shape this was reported on, and the sub-step is where the fill lives.
446
+ args: replayActionArgs(sub.args, confirmDangerous, anchorFieldName(sub.anchor)),
447
+ },
448
+ };
449
+ };
450
+ // Every anchor is checked before anything runs, so a sub-step that has drifted away is reported as
451
+ // drift and not discovered half way through a sequence that has already acted.
452
+ const live = [];
453
+ for (const [subIndex, sub] of subs.entries()) {
454
+ const resolved = await resolveSub(sub, subIndex);
455
+ if ('stop' in resolved)
456
+ return resolved.stop;
457
+ live.push(resolved.live);
315
458
  }
316
459
  const result = {
317
460
  step: index,
@@ -320,20 +463,78 @@ dynamic = new Set()) {
320
463
  ok: true,
321
464
  };
322
465
  /** One dispatch through the SAME command either way, so batched and walked replay identically. */
323
- const dispatch = async (steps) => {
466
+ const send = async (steps) => {
324
467
  session.beginAction?.(ReticleTool.FLOW_REPLAY, { steps: steps.length });
325
- let act;
326
468
  try {
327
- act = await session.command(ReticleCommand.ACT_SEQUENCE, { steps });
469
+ // A recorded zero means "do not wait for the element", not "abort the whole batch now".
470
+ // Keep the transport alive long enough for the sequence's default per-step budget, and give
471
+ // an omitted timeout the same aggregate budget as the live tool's independent step waits.
472
+ const perStepTimeout = undefined === step.timeoutMs || 0 === step.timeoutMs
473
+ ? DEFAULT_SEQUENCE_STEP_TIMEOUT_MS
474
+ : step.timeoutMs;
475
+ const timeoutMs = perStepTimeout * steps.length;
476
+ return await session.command(ReticleCommand.ACT_SEQUENCE, { steps }, timeoutMs);
328
477
  }
329
478
  finally {
330
479
  session.finishAction?.();
331
480
  }
332
- if (act.ok)
333
- return true;
334
- result.ok = false;
335
- result.error = replayDestructiveActionHint(act.error ?? 'command failed');
336
- return false;
481
+ };
482
+ /**
483
+ * Run sub-steps [from, to), and survive the page re-rendering under them.
484
+ *
485
+ * The refs were resolved before anything ran, and the first action of a sequence is allowed to
486
+ * re-render the page, so by the time a later sub-step is reached its ref may be dead. The same
487
+ * anchor is almost always still there under a new ref; what was missing is a second look.
488
+ *
489
+ * The page names the ref it could not find, which says WHICH sub-step failed and so which ones
490
+ * already ran, as long as no other sub-step holds the same ref. Only the rest is resolved again and
491
+ * sent, so nothing acts twice: starting over is what turns one click into two. A stale ref is the
492
+ * only failure retried, and the retry goes on only while it gets further. A sub-step that is stale
493
+ * again at the same point is a target that does not hold still, and the run says so, with how far
494
+ * it got.
495
+ */
496
+ const dispatchFrom = async (from, to) => {
497
+ let start = from;
498
+ let staleBefore = -1;
499
+ for (;;) {
500
+ const act = await send(live.slice(start, to));
501
+ if (act.ok)
502
+ return true;
503
+ const error = act.error ?? 'command failed';
504
+ if (!isStaleRefError(error)) {
505
+ result.ok = false;
506
+ result.error = replayDestructiveActionHint(error);
507
+ return false;
508
+ }
509
+ const staleAt = staleSubStep(error, live, start, to);
510
+ if (staleAt === undefined) {
511
+ result.ok = false;
512
+ result.error = error + STALE_SUB_STEP_UNKNOWN;
513
+ return false;
514
+ }
515
+ if (staleAt <= staleBefore) {
516
+ result.ok = false;
517
+ result.error = error + staleSubStepPosition(staleAt, subs.length);
518
+ return false;
519
+ }
520
+ staleBefore = staleAt;
521
+ await waitForReaction(session, 0, STALE_REF_GRACE_MS, { sleep });
522
+ for (let at = staleAt; at < to; at += 1) {
523
+ const sub = subs[at];
524
+ if (sub === undefined)
525
+ continue;
526
+ const resolved = await resolveSub(sub, at, true);
527
+ if ('stop' in resolved) {
528
+ result.ok = false;
529
+ result.anchor = resolved.stop.anchor;
530
+ if (resolved.stop.drift !== undefined)
531
+ result.drift = resolved.stop.drift;
532
+ return false;
533
+ }
534
+ live[at] = resolved.live;
535
+ }
536
+ start = staleAt;
537
+ }
337
538
  };
338
539
  /** The sub-step's own expectation, unless its testid is deliberately unasserted. */
339
540
  const declaredBy = (sub) => {
@@ -368,14 +569,13 @@ dynamic = new Set()) {
368
569
  */
369
570
  const declaring = subs.some((sub) => declaredBy(sub) !== undefined);
370
571
  if (!declaring) {
371
- await dispatch(live);
572
+ await dispatchFrom(0, live.length);
372
573
  return result;
373
574
  }
374
575
  for (const [subIndex, sub] of subs.entries()) {
375
- const one = live[subIndex];
376
- if (one === undefined)
576
+ if (live[subIndex] === undefined)
377
577
  continue;
378
- if (!(await dispatch([one])))
578
+ if (!(await dispatchFrom(subIndex, subIndex + 1)))
379
579
  return result;
380
580
  const testid = declaredBy(sub);
381
581
  if (testid !== undefined && !(await assertDeclared(testid)))
@@ -24,9 +24,9 @@
24
24
  * returned unchanged.
25
25
  */
26
26
  import { FlowStore } from './flows.js';
27
- import type { ProjectId } from '@reticlehq/core';
27
+ import type { ProjectTarget } from '../../memory/project/session-root.js';
28
28
  import type { ToolDeps } from '../../surface/tools/tool-kit.js';
29
- export declare function flowsForSession(deps: ToolDeps, projectId: ProjectId | undefined): {
29
+ export declare function flowsForSession(deps: ToolDeps, target: ProjectTarget): {
30
30
  flows: FlowStore;
31
31
  root: string;
32
32
  };
@@ -24,10 +24,14 @@
24
24
  * returned unchanged.
25
25
  */
26
26
  import { FlowStore } from './flows.js';
27
- export function flowsForSession(deps, projectId) {
28
- const resolved = deps.artifactRootFor?.(projectId);
27
+ export function flowsForSession(deps, target) {
28
+ const resolved = deps.artifactRootFor?.(target.projectId, target.origin);
29
29
  if (resolved === undefined || resolved.root === deps.reticleRoot) {
30
30
  return { flows: deps.flows, root: deps.reticleRoot };
31
31
  }
32
- return { flows: new FlowStore(deps.fs, resolved.root, { now: deps.now }), root: resolved.root };
32
+ const onWrote = deps.onRunPersisted;
33
+ return {
34
+ flows: new FlowStore(deps.fs, resolved.root, { now: deps.now }, onWrote === undefined ? {} : { onWrote }),
35
+ root: resolved.root,
36
+ };
33
37
  }
@@ -10,6 +10,16 @@ export { replayNamedFlow } from './flow-replay-run.js';
10
10
  * point; flows that need another page carry their own startPath.
11
11
  */
12
12
  export declare function leasableAppUrl(deps: ToolDeps, sessionId: string | undefined): string | undefined;
13
+ /**
14
+ * The live session's own URL — what the fixture port must be looked up by.
15
+ *
16
+ * NOT `leasableAppUrl`. That returns an ORIGIN, and the input provider finds a page by comparing
17
+ * full URLs, so an origin matched no page: `suiteFixtureSeed` answered `undefined` on every run and
18
+ * every leased flow booted cold while the code read as if it were seeded. Silent, because every
19
+ * refusal on that path is deliberately silent — a fixture is an optimisation, and a suite must not
20
+ * die when one is unavailable.
21
+ */
22
+ export declare function sessionUrlOf(deps: ToolDeps, sessionId: string | undefined): string | undefined;
13
23
  /** A flow whose leased context never came up is a suite ERROR, never a silent pass. */
14
24
  export declare function leaseFailureReplay(name: string, error: string | undefined): FlowReplayResult;
15
25
  export declare const FLOW_TOOLS: ToolDef[];