@reticlehq/server 3.7.0 → 3.8.1

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 (578) hide show
  1. package/SKILL.md +59 -68
  2. package/bin/reticle.js +9 -2
  3. package/dist/command/cli/adhoc-suite.js +1 -1
  4. package/dist/command/cli/adhoc-verdict.d.ts +12 -0
  5. package/dist/command/cli/adhoc-verdict.js +62 -4
  6. package/dist/command/cli/answers/gate-hook-message.d.ts +2 -0
  7. package/dist/command/cli/answers/gate-hook-message.js +5 -1
  8. package/dist/command/cli/auth/cloud-session.d.ts +11 -19
  9. package/dist/command/cli/auth/cloud-session.js +23 -0
  10. package/dist/command/cli/auth/device-flow.d.ts +3 -37
  11. package/dist/command/cli/cli-doctor.js +66 -21
  12. package/dist/command/cli/cli-flow-commands.js +53 -11
  13. package/dist/command/cli/cli-kill.d.ts +8 -0
  14. package/dist/command/cli/cli-kill.js +43 -3
  15. package/dist/command/cli/cli-parse-feedback.d.ts +4 -0
  16. package/dist/command/cli/cli-parse-feedback.js +13 -1
  17. package/dist/command/cli/cli-parse-grammar.d.ts +1 -2
  18. package/dist/command/cli/cli-parse-grammar.js +1 -6
  19. package/dist/command/cli/cli-parse-serve.d.ts +24 -0
  20. package/dist/command/cli/cli-parse-serve.js +124 -0
  21. package/dist/command/cli/cli-parse.d.ts +12 -11
  22. package/dist/command/cli/cli-parse.js +100 -123
  23. package/dist/command/cli/cli-usage.d.ts +0 -11
  24. package/dist/command/cli/cli-usage.js +43 -16
  25. package/dist/command/cli/cli-verify.d.ts +1 -1
  26. package/dist/command/cli/cli-verify.js +29 -14
  27. package/dist/command/cli/cloud-cli.js +27 -9
  28. package/dist/command/cli/cloud-kit.js +3 -3
  29. package/dist/command/cli/cloud-link.d.ts +1 -20
  30. package/dist/command/cli/cloud-link.js +2 -0
  31. package/dist/command/cli/cloud-login.d.ts +6 -2
  32. package/dist/command/cli/cloud-login.js +13 -41
  33. package/dist/command/cli/config/checkout.d.ts +10 -0
  34. package/dist/command/cli/config/checkout.js +78 -0
  35. package/dist/command/cli/doctor/doctor-agent-link.d.ts +23 -0
  36. package/dist/command/cli/doctor/doctor-agent-link.js +28 -0
  37. package/dist/command/cli/doctor/doctor-coverage-line.js +1 -7
  38. package/dist/command/cli/doctor/doctor-rows.d.ts +4 -0
  39. package/dist/command/cli/doctor/doctor-rows.js +4 -0
  40. package/dist/command/cli/drive/drive-attach.d.ts +5 -0
  41. package/dist/command/cli/drive/drive-attach.js +21 -1
  42. package/dist/command/cli/hook/codex-transcript.d.ts +20 -0
  43. package/dist/command/cli/hook/codex-transcript.js +224 -0
  44. package/dist/command/cli/hook/episode-structure.d.ts +24 -0
  45. package/dist/command/cli/hook/episode-structure.js +138 -0
  46. package/dist/command/cli/hook/hook-command.d.ts +9 -0
  47. package/dist/command/cli/hook/hook-command.js +211 -0
  48. package/dist/command/cli/hook/hook-fast.d.ts +31 -0
  49. package/dist/command/cli/hook/hook-fast.js +136 -0
  50. package/dist/command/cli/hook/prompt-hook.d.ts +30 -0
  51. package/dist/command/cli/hook/prompt-hook.js +199 -0
  52. package/dist/command/cli/hook/tool-hook.d.ts +21 -0
  53. package/dist/command/cli/hook/tool-hook.js +259 -0
  54. package/dist/command/cli/launch/cli-launch.d.ts +2 -0
  55. package/dist/command/cli/launch/cli-launch.js +22 -2
  56. package/dist/command/cli/lifecycle/daemon-lifecycle.js +28 -2
  57. package/dist/command/cli/mcp-command.d.ts +9 -0
  58. package/dist/command/cli/mcp-command.js +127 -41
  59. package/dist/command/cli/open-navigate.d.ts +43 -0
  60. package/dist/command/cli/open-navigate.js +85 -0
  61. package/dist/command/cli/ports/port-holder.d.ts +16 -4
  62. package/dist/command/cli/ports/port-holder.js +58 -12
  63. package/dist/command/cli/ports/resolve/cli-port.js +18 -2
  64. package/dist/command/cli/project-name.d.ts +1 -7
  65. package/dist/command/cli/project-name.js +1 -0
  66. package/dist/command/cli/report-command.d.ts +8 -2
  67. package/dist/command/cli/report-command.js +95 -18
  68. package/dist/command/cli/status-fields.d.ts +9 -2
  69. package/dist/command/cli/status-fields.js +148 -4
  70. package/dist/command/cli/try-command.d.ts +3 -4
  71. package/dist/command/cli/try-command.js +6 -11
  72. package/dist/command/cli/verify-results.d.ts +4 -1
  73. package/dist/command/cli/verify-results.js +3 -1
  74. package/dist/command/cli.d.ts +1 -7
  75. package/dist/command/cli.js +79 -160
  76. package/dist/command/daemon/daemon-resilience.d.ts +6 -1
  77. package/dist/command/daemon/daemon-resilience.js +31 -18
  78. package/dist/command/daemon/daemon.d.ts +11 -0
  79. package/dist/command/daemon/daemon.js +70 -2
  80. package/dist/command/daemon/lifetime/daemon-usefulness.d.ts +2 -0
  81. package/dist/command/daemon/lifetime/daemon-usefulness.js +13 -2
  82. package/dist/command/daemon/wake-decision.js +4 -2
  83. package/dist/command/daemon/win32-escape.d.ts +32 -0
  84. package/dist/command/daemon/win32-escape.js +119 -0
  85. package/dist/command/setup/agent-configs.d.ts +9 -0
  86. package/dist/command/setup/agent-configs.js +9 -0
  87. package/dist/command/setup/auto-approve.d.ts +10 -3
  88. package/dist/command/setup/auto-approve.js +51 -3
  89. package/dist/command/setup/bringup/dev-server-files.d.ts +1 -9
  90. package/dist/command/setup/bringup/dev-server-wait.js +5 -1
  91. package/dist/command/setup/bringup/ensure-daemon.js +4 -7
  92. package/dist/command/setup/init/init-host.js +6 -0
  93. package/dist/command/setup/init/init-port.js +5 -4
  94. package/dist/command/setup/init/init-runtime.js +7 -1
  95. package/dist/command/setup/node-effects.d.ts +8 -0
  96. package/dist/command/setup/node-effects.js +36 -4
  97. package/dist/command/setup/probe/dev-port.d.ts +26 -0
  98. package/dist/command/setup/probe/dev-port.js +117 -0
  99. package/dist/command/setup/probe/page-probe.d.ts +1 -1
  100. package/dist/command/setup/probe/page-probe.js +11 -3
  101. package/dist/command/setup/remaining-steps.d.ts +0 -7
  102. package/dist/command/setup/remaining-steps.js +3 -2
  103. package/dist/command/setup/run-setup.d.ts +11 -0
  104. package/dist/command/setup/run-setup.js +33 -5
  105. package/dist/command/setup/setup-command.d.ts +2 -0
  106. package/dist/command/setup/setup-command.js +22 -4
  107. package/dist/command/update/updater.d.ts +1 -6
  108. package/dist/command/update/updater.js +4 -5
  109. package/dist/command/update/version-seen.d.ts +24 -0
  110. package/dist/command/update/version-seen.js +65 -0
  111. package/dist/command/version/peer-announce.d.ts +9 -1
  112. package/dist/command/version/peer-announce.js +25 -2
  113. package/dist/command/version/sdk-fix.d.ts +5 -6
  114. package/dist/command/version/sdk-fix.js +17 -32
  115. package/dist/command/version/version-skew.d.ts +16 -1
  116. package/dist/command/version/version-skew.js +84 -10
  117. package/dist/features/crawl/crawl-tools.js +2 -2
  118. package/dist/features/crawl/crawl.js +2 -0
  119. package/dist/features/exhaust/ledger.d.ts +15 -96
  120. package/dist/features/exhaust/ledger.js +3 -3
  121. package/dist/features/harness/drive-runs.d.ts +28 -4
  122. package/dist/features/harness/drive-runs.js +99 -7
  123. package/dist/features/harness/drivers.d.ts +1 -1
  124. package/dist/features/harness/drivers.js +1 -1
  125. package/dist/features/harness/harness.d.ts +5 -0
  126. package/dist/features/harness/harness.js +24 -12
  127. package/dist/features/harness/platform/platform-drives.d.ts +7 -1
  128. package/dist/features/harness/platform/platform-drives.js +12 -7
  129. package/dist/features/harness/platform/refusal.d.ts +1 -1
  130. package/dist/features/harness/platform/refusal.js +4 -4
  131. package/dist/features/harness/platform/remote-drive.js +70 -28
  132. package/dist/features/harness/platform/server-driver.js +22 -1
  133. package/dist/features/harness/platform-config.d.ts +1 -10
  134. package/dist/features/harness/platform-config.js +0 -20
  135. package/dist/features/license/license.d.ts +2 -14
  136. package/dist/features/visual/step-shots.d.ts +33 -1
  137. package/dist/features/visual/step-shots.js +155 -1
  138. package/dist/features/visual/visual-tools.js +12 -4
  139. package/dist/hooks/coding-agents.d.ts +6 -0
  140. package/dist/hooks/coding-agents.js +24 -3
  141. package/dist/hooks/episode-stamp.d.ts +32 -0
  142. package/dist/hooks/episode-stamp.js +61 -0
  143. package/dist/hooks/hook-commands.js +19 -9
  144. package/dist/index.d.ts +5 -1
  145. package/dist/index.js +66 -24
  146. package/dist/judgement/app-graph/journal-steps.d.ts +8 -0
  147. package/dist/judgement/app-graph/journal-steps.js +92 -0
  148. package/dist/judgement/capsule/capsule-store.d.ts +2 -39
  149. package/dist/judgement/domain/domain-model.js +1 -10
  150. package/dist/judgement/domain/domain-tools.js +4 -2
  151. package/dist/judgement/runs/artifact/run-store.d.ts +28 -8
  152. package/dist/judgement/runs/artifact/run-store.js +153 -28
  153. package/dist/judgement/runs/default-run-id.d.ts +3 -1
  154. package/dist/judgement/runs/default-run-id.js +15 -3
  155. package/dist/judgement/runs/drive-run.d.ts +3 -3
  156. package/dist/judgement/runs/drive-run.js +11 -7
  157. package/dist/judgement/runs/run-ledger.d.ts +21 -0
  158. package/dist/judgement/runs/run-ledger.js +143 -0
  159. package/dist/judgement/runs/runner-port.d.ts +1 -1
  160. package/dist/judgement/runs/runner-port.js +8 -2
  161. package/dist/judgement/runs/verification-sync.d.ts +4 -3
  162. package/dist/judgement/runs/verification-sync.js +27 -5
  163. package/dist/language/flows/affected-tools.js +2 -1
  164. package/dist/language/flows/annotate-notes/annotate.js +8 -3
  165. package/dist/language/flows/annotate-tools.js +1 -1
  166. package/dist/language/flows/change/affected.d.ts +8 -0
  167. package/dist/language/flows/change/affected.js +20 -7
  168. package/dist/language/flows/decision.js +19 -4
  169. package/dist/language/flows/fields/flow-secret-field.d.ts +9 -0
  170. package/dist/language/flows/fields/flow-secret-field.js +67 -5
  171. package/dist/language/flows/flow-anchor.d.ts +5 -0
  172. package/dist/language/flows/flow-anchor.js +4 -0
  173. package/dist/language/flows/flow-cross-step.d.ts +7 -1
  174. package/dist/language/flows/flow-cross-step.js +9 -0
  175. package/dist/language/flows/flow-expect-grammar.js +15 -10
  176. package/dist/language/flows/flow-intent.js +6 -1
  177. package/dist/language/flows/flow-journey.d.ts +8 -0
  178. package/dist/language/flows/flow-journey.js +13 -0
  179. package/dist/language/flows/flow-lease.d.ts +27 -0
  180. package/dist/language/flows/flow-lease.js +59 -0
  181. package/dist/language/flows/flow-replay-run.d.ts +1 -87
  182. package/dist/language/flows/flow-replay-run.js +111 -310
  183. package/dist/language/flows/flow-replay.js +21 -19
  184. package/dist/language/flows/flow-replayable.d.ts +38 -0
  185. package/dist/language/flows/flow-replayable.js +179 -0
  186. package/dist/language/flows/flow-start-path.d.ts +108 -0
  187. package/dist/language/flows/flow-start-path.js +313 -0
  188. package/dist/language/flows/flow-step-runners.d.ts +23 -2
  189. package/dist/language/flows/flow-step-runners.js +191 -32
  190. package/dist/language/flows/flow-store-for-session.d.ts +8 -1
  191. package/dist/language/flows/flow-store-for-session.js +6 -0
  192. package/dist/language/flows/flow-tools.d.ts +2 -23
  193. package/dist/language/flows/flow-tools.js +63 -113
  194. package/dist/language/flows/flows.d.ts +4 -6
  195. package/dist/language/flows/flows.js +90 -15
  196. package/dist/language/flows/heal-run.d.ts +10 -4
  197. package/dist/language/flows/heal-run.js +26 -9
  198. package/dist/language/flows/recording/flake.d.ts +3 -27
  199. package/dist/language/flows/recording/flake.js +1 -1
  200. package/dist/language/flows/recording/recording-backtrack.js +1 -4
  201. package/dist/language/flows/recording/tape/recordings.d.ts +11 -1
  202. package/dist/language/flows/recording/tape/recordings.js +9 -3
  203. package/dist/language/flows/replay.d.ts +25 -5
  204. package/dist/language/flows/replay.js +83 -16
  205. package/dist/language/flows/stores/assertion-tiers-store.js +1 -1
  206. package/dist/language/flows/suite/coverage.d.ts +9 -0
  207. package/dist/language/flows/suite/coverage.js +12 -1
  208. package/dist/language/flows/suite-selection.d.ts +25 -0
  209. package/dist/language/flows/suite-selection.js +41 -9
  210. package/dist/machine/git-tracks.d.ts +6 -0
  211. package/dist/machine/git-tracks.js +36 -0
  212. package/dist/memory/cloud/background-sync.d.ts +25 -0
  213. package/dist/memory/cloud/background-sync.js +79 -0
  214. package/dist/memory/cloud/cloud-config.d.ts +12 -1
  215. package/dist/memory/cloud/cloud-config.js +39 -13
  216. package/dist/memory/cloud/cloud-sync.d.ts +3 -24
  217. package/dist/memory/cloud/cloud-sync.js +5 -2
  218. package/dist/memory/cloud/harness-config.d.ts +0 -7
  219. package/dist/memory/cloud/memory-scope.d.ts +19 -0
  220. package/dist/memory/cloud/memory-scope.js +48 -0
  221. package/dist/memory/cloud/sync-answer.d.ts +43 -0
  222. package/dist/memory/cloud/sync-answer.js +42 -0
  223. package/dist/memory/cloud/sync-cycle.d.ts +40 -10
  224. package/dist/memory/cloud/sync-cycle.js +97 -144
  225. package/dist/memory/cloud/sync-daemon.d.ts +50 -3
  226. package/dist/memory/cloud/sync-daemon.js +473 -83
  227. package/dist/memory/cloud/sync-describe.d.ts +28 -0
  228. package/dist/memory/cloud/sync-describe.js +92 -0
  229. package/dist/memory/cloud/sync-disk.d.ts +9 -1
  230. package/dist/memory/cloud/sync-disk.js +137 -33
  231. package/dist/memory/cloud/sync-flow-versions.d.ts +26 -0
  232. package/dist/memory/cloud/sync-flow-versions.js +42 -0
  233. package/dist/memory/impact/impact-store.js +32 -15
  234. package/dist/memory/intent/intent-shard.d.ts +41 -266
  235. package/dist/memory/intent/intent-tools.js +20 -61
  236. package/dist/memory/intent/record-request.d.ts +27 -0
  237. package/dist/memory/intent/record-request.js +88 -0
  238. package/dist/memory/intent/settled-words.js +9 -1
  239. package/dist/memory/journal/drive-flow.d.ts +3 -0
  240. package/dist/memory/journal/drive-flow.js +11 -41
  241. package/dist/memory/journal/envelope-store.js +1 -1
  242. package/dist/memory/journal/envelope.d.ts +6 -154
  243. package/dist/memory/journal/episode-log.d.ts +107 -0
  244. package/dist/memory/journal/episode-log.js +302 -0
  245. package/dist/memory/journal/journal-recorder.d.ts +7 -0
  246. package/dist/memory/journal/journal-recorder.js +22 -9
  247. package/dist/memory/journal/on-disk/ambient-file.d.ts +1 -7
  248. package/dist/memory/journal/on-disk/ambient-file.js +1 -1
  249. package/dist/memory/journal/on-disk/workspace-gitignore.d.ts +24 -3
  250. package/dist/memory/journal/on-disk/workspace-gitignore.js +38 -7
  251. package/dist/memory/journal/on-disk/workspace-tiers.js +7 -0
  252. package/dist/memory/journal/self-observation.js +3 -1
  253. package/dist/memory/journal/session-end.js +23 -9
  254. package/dist/memory/journal/session-journal.js +39 -20
  255. package/dist/memory/project/artifact-root-resolver.d.ts +14 -1
  256. package/dist/memory/project/artifact-root-resolver.js +68 -23
  257. package/dist/memory/project/artifact-root.d.ts +17 -3
  258. package/dist/memory/project/artifact-root.js +47 -9
  259. package/dist/memory/project/fs/fs-port.d.ts +5 -0
  260. package/dist/memory/project/fs/fs-port.js +13 -0
  261. package/dist/memory/project/learned-routes.d.ts +3 -4
  262. package/dist/memory/project/learned-routes.js +3 -11
  263. package/dist/memory/project/link-directory.js +5 -2
  264. package/dist/memory/project/root-claims.d.ts +3 -1
  265. package/dist/memory/project/root-claims.js +41 -7
  266. package/dist/memory/project/session-root.d.ts +1 -1
  267. package/dist/memory/project/session-root.js +1 -15
  268. package/dist/memory/project/sync-status.js +5 -6
  269. package/dist/memory/recall/memory-tools.js +2 -2
  270. package/dist/memory/recall/platform-memory.d.ts +3 -1
  271. package/dist/memory/recall/platform-memory.js +9 -1
  272. package/dist/memory/recall/project-memory.js +15 -19
  273. package/dist/portal/bridge/auth-failure-reason.d.ts +13 -0
  274. package/dist/portal/bridge/auth-failure-reason.js +19 -0
  275. package/dist/portal/bridge/bridge.d.ts +19 -4
  276. package/dist/portal/bridge/bridge.js +150 -177
  277. package/dist/portal/bridge/harness-request.d.ts +15 -0
  278. package/dist/portal/bridge/harness-request.js +19 -0
  279. package/dist/portal/bridge/origin/origin-follow.d.ts +46 -0
  280. package/dist/portal/bridge/origin/origin-follow.js +110 -0
  281. package/dist/portal/bridge/pairing-token.d.ts +6 -0
  282. package/dist/portal/bridge/pairing-token.js +47 -16
  283. package/dist/portal/bridge/protocol-skew.d.ts +27 -2
  284. package/dist/portal/bridge/protocol-skew.js +66 -2
  285. package/dist/portal/bridge/session-nonces.d.ts +46 -0
  286. package/dist/portal/bridge/session-nonces.js +72 -0
  287. package/dist/portal/input/viewport-tools.d.ts +31 -0
  288. package/dist/portal/input/viewport-tools.js +106 -15
  289. package/dist/portal/pool/bounded-close.d.ts +23 -0
  290. package/dist/portal/pool/bounded-close.js +38 -0
  291. package/dist/portal/pool/browser-pool.d.ts +44 -39
  292. package/dist/portal/pool/browser-pool.js +247 -95
  293. package/dist/portal/pool/context-permissions.d.ts +9 -1
  294. package/dist/portal/pool/context-permissions.js +26 -0
  295. package/dist/portal/pool/lease-emulation.d.ts +37 -0
  296. package/dist/portal/pool/lease-emulation.js +29 -0
  297. package/dist/portal/pool/playwright-launcher.d.ts +6 -0
  298. package/dist/portal/pool/playwright-launcher.js +74 -7
  299. package/dist/portal/pool/pool-contract.d.ts +23 -1
  300. package/dist/portal/pool/pool-lease.d.ts +128 -0
  301. package/dist/portal/pool/pool-lease.js +49 -0
  302. package/dist/portal/pool/zero-install.d.ts +8 -1
  303. package/dist/portal/pool/zero-install.js +24 -2
  304. package/dist/portal/production/production-activation.d.ts +136 -0
  305. package/dist/portal/production/production-activation.js +173 -0
  306. package/dist/portal/production/production-drive.d.ts +52 -0
  307. package/dist/portal/production/production-drive.js +301 -0
  308. package/dist/portal/production/production-hello.d.ts +23 -0
  309. package/dist/portal/production/production-hello.js +23 -0
  310. package/dist/portal/realm/web-realm.js +42 -15
  311. package/dist/portal/session/control-envelope.d.ts +1 -1
  312. package/dist/portal/session/dev-server/served-document.d.ts +0 -5
  313. package/dist/portal/session/dev-server/served-document.js +6 -8
  314. package/dist/portal/session/facts/handshake-facts.d.ts +8 -1
  315. package/dist/portal/session/first-run-wiring.d.ts +3 -36
  316. package/dist/portal/session/first-run-wiring.js +10 -103
  317. package/dist/portal/session/live-control-tools.js +61 -19
  318. package/dist/portal/session/no-session-next-action.d.ts +11 -0
  319. package/dist/portal/session/no-session-next-action.js +40 -15
  320. package/dist/portal/session/no-session-watch.d.ts +7 -0
  321. package/dist/portal/session/no-session-watch.js +67 -23
  322. package/dist/portal/session/output-budget.d.ts +10 -0
  323. package/dist/portal/session/output-budget.js +16 -0
  324. package/dist/portal/session/presence/session-lease.d.ts +2 -0
  325. package/dist/portal/session/presence/session-lease.js +8 -0
  326. package/dist/portal/session/recorded-gaps.d.ts +15 -11
  327. package/dist/portal/session/recorded-gaps.js +39 -18
  328. package/dist/portal/session/serving-directory.d.ts +24 -2
  329. package/dist/portal/session/serving-directory.js +93 -5
  330. package/dist/portal/session/session-info.d.ts +26 -0
  331. package/dist/portal/session/session-info.js +20 -0
  332. package/dist/portal/session/session-manager.d.ts +35 -3
  333. package/dist/portal/session/session-manager.js +69 -14
  334. package/dist/portal/session/session-successor.js +1 -9
  335. package/dist/portal/session/session-tools.js +22 -4
  336. package/dist/portal/session/session.d.ts +10 -10
  337. package/dist/portal/session/session.js +37 -29
  338. package/dist/portal/session/zero-install-first-call.d.ts +7 -2
  339. package/dist/portal/session/zero-install-first-call.js +43 -20
  340. package/dist/start-wiring.d.ts +2 -2
  341. package/dist/start-wiring.js +17 -3
  342. package/dist/status-payload.d.ts +11 -1
  343. package/dist/status-payload.js +7 -1
  344. package/dist/surface/agent-presence-grace.d.ts +11 -0
  345. package/dist/surface/agent-presence-grace.js +34 -0
  346. package/dist/surface/http-server.d.ts +12 -1
  347. package/dist/surface/http-server.js +64 -15
  348. package/dist/surface/mcp/faults/mcp-outage.d.ts +12 -2
  349. package/dist/surface/mcp/faults/mcp-outage.js +19 -1
  350. package/dist/surface/mcp/mcp-proxy.d.ts +17 -74
  351. package/dist/surface/mcp/mcp-proxy.js +194 -267
  352. package/dist/surface/mcp/mcp.d.ts +20 -3
  353. package/dist/surface/mcp/mcp.js +88 -25
  354. package/dist/surface/mcp/proxy/drive-calls.d.ts +44 -0
  355. package/dist/surface/mcp/proxy/drive-calls.js +114 -5
  356. package/dist/surface/mcp/proxy/proxy-boot.d.ts +11 -0
  357. package/dist/surface/mcp/proxy/proxy-boot.js +1 -0
  358. package/dist/surface/mcp/proxy/proxy-daemon-probe.d.ts +6 -0
  359. package/dist/surface/mcp/proxy/proxy-daemon-probe.js +14 -1
  360. package/dist/surface/mcp/proxy/proxy-handshake.d.ts +34 -2
  361. package/dist/surface/mcp/proxy/proxy-handshake.js +76 -8
  362. package/dist/surface/mcp/server-instructions.js +35 -16
  363. package/dist/surface/mcp/shared-params.d.ts +8 -0
  364. package/dist/surface/mcp/shared-params.js +15 -1
  365. package/dist/surface/mcp/sse-frame-parser.d.ts +11 -0
  366. package/dist/surface/mcp/sse-frame-parser.js +18 -0
  367. package/dist/surface/mcp/surface-vocabulary.d.ts +2 -0
  368. package/dist/surface/mcp/surface-vocabulary.js +13 -0
  369. package/dist/surface/mcp/tool-catalog-cache.d.ts +2 -0
  370. package/dist/surface/mcp/tool-catalog-cache.js +14 -4
  371. package/dist/surface/tools/account-tool.d.ts +4 -3
  372. package/dist/surface/tools/account-tool.js +20 -31
  373. package/dist/surface/tools/act/act-danger.d.ts +2 -0
  374. package/dist/surface/tools/act/act-danger.js +41 -14
  375. package/dist/surface/tools/act/act-observation.d.ts +11 -0
  376. package/dist/surface/tools/act/act-observation.js +33 -0
  377. package/dist/surface/tools/act/act-preflight.js +10 -3
  378. package/dist/surface/tools/act/act-sequence-retry.js +2 -1
  379. package/dist/surface/tools/act/act-target.js +19 -5
  380. package/dist/surface/tools/act/durable.js +1 -1
  381. package/dist/surface/tools/act/navigation/navigate-arrival.d.ts +9 -7
  382. package/dist/surface/tools/act/navigation/navigate-arrival.js +11 -14
  383. package/dist/surface/tools/act/unsettled-find.d.ts +36 -0
  384. package/dist/surface/tools/act/unsettled-find.js +71 -0
  385. package/dist/surface/tools/act-sequence-tool.js +53 -24
  386. package/dist/surface/tools/act-tools.d.ts +2 -3
  387. package/dist/surface/tools/act-tools.js +49 -47
  388. package/dist/surface/tools/agent/compact-envelope.d.ts +2 -2
  389. package/dist/surface/tools/agent/for-the-agent.js +41 -3
  390. package/dist/surface/tools/assert/assert-grade.js +8 -3
  391. package/dist/surface/tools/assert/assert-verdict.js +4 -2
  392. package/dist/surface/tools/browser-tools.js +7 -4
  393. package/dist/surface/tools/chat-drives.js +50 -25
  394. package/dist/surface/tools/coverage-tools.js +1 -1
  395. package/dist/surface/tools/dynamic-tools.d.ts +8 -0
  396. package/dist/surface/tools/dynamic-tools.js +89 -34
  397. package/dist/surface/tools/empty-session-list.d.ts +18 -25
  398. package/dist/surface/tools/empty-session-list.js +67 -38
  399. package/dist/surface/tools/error-recovery.d.ts +17 -7
  400. package/dist/surface/tools/error-recovery.js +53 -20
  401. package/dist/surface/tools/explore-tools.d.ts +10 -0
  402. package/dist/surface/tools/explore-tools.js +72 -19
  403. package/dist/surface/tools/feedback-tools.js +23 -2
  404. package/dist/surface/tools/gap-novelty.d.ts +6 -0
  405. package/dist/surface/tools/gap-novelty.js +9 -0
  406. package/dist/surface/tools/gaps/capability-absences.js +4 -3
  407. package/dist/surface/tools/harness-explore.d.ts +1 -1
  408. package/dist/surface/tools/harness-explore.js +6 -4
  409. package/dist/surface/tools/harness-gate.d.ts +43 -21
  410. package/dist/surface/tools/harness-gate.js +55 -81
  411. package/dist/surface/tools/harness-script.d.ts +2 -0
  412. package/dist/surface/tools/harness-script.js +11 -6
  413. package/dist/surface/tools/harness-toolset.js +3 -4
  414. package/dist/surface/tools/invoke-tool.d.ts +0 -8
  415. package/dist/surface/tools/invoke-tool.js +164 -178
  416. package/dist/surface/tools/lease-hint.d.ts +9 -0
  417. package/dist/surface/tools/lease-hint.js +22 -3
  418. package/dist/surface/tools/lease-permissions.d.ts +1 -1
  419. package/dist/surface/tools/lease-readiness.d.ts +55 -0
  420. package/dist/surface/tools/lease-readiness.js +150 -2
  421. package/dist/surface/tools/lease-tools.d.ts +3 -75
  422. package/dist/surface/tools/lease-tools.js +124 -188
  423. package/dist/surface/tools/map-tools.d.ts +20 -0
  424. package/dist/surface/tools/map-tools.js +145 -0
  425. package/dist/surface/tools/merge-tools.js +11 -7
  426. package/dist/surface/tools/next-step.js +6 -3
  427. package/dist/surface/tools/observe-tools.js +46 -35
  428. package/dist/surface/tools/platform-moment.d.ts +3 -12
  429. package/dist/surface/tools/platform-moment.js +12 -24
  430. package/dist/surface/tools/read/complete-snapshot.d.ts +7 -1
  431. package/dist/surface/tools/read/complete-snapshot.js +13 -2
  432. package/dist/surface/tools/read/query-paginate.js +6 -0
  433. package/dist/surface/tools/read/query-shape.d.ts +9 -0
  434. package/dist/surface/tools/read/query-shape.js +15 -0
  435. package/dist/surface/tools/read/snapshot-unmounted-note.d.ts +1 -0
  436. package/dist/surface/tools/read/snapshot-unmounted-note.js +73 -0
  437. package/dist/surface/tools/read-tools.js +5 -5
  438. package/dist/surface/tools/real-input-attempt.d.ts +11 -0
  439. package/dist/surface/tools/real-input-attempt.js +206 -38
  440. package/dist/surface/tools/reconcile-tools.js +21 -8
  441. package/dist/surface/tools/reticle-result.d.ts +3 -0
  442. package/dist/surface/tools/reticle-result.js +8 -1
  443. package/dist/surface/tools/run-report.d.ts +22 -0
  444. package/dist/surface/tools/run-report.js +141 -0
  445. package/dist/surface/tools/session-ports.d.ts +57 -0
  446. package/dist/surface/tools/session-ports.js +102 -0
  447. package/dist/surface/tools/tool-kit.d.ts +58 -4
  448. package/dist/surface/tools/tool-kit.js +140 -6
  449. package/dist/surface/tools/tool-surface.d.ts +2 -0
  450. package/dist/surface/tools/tool-surface.js +45 -0
  451. package/dist/surface/tools/tools.js +49 -87
  452. package/dist/telemetry/automation-hint.d.ts +5 -0
  453. package/dist/telemetry/automation-hint.js +7 -0
  454. package/dist/telemetry/cli-telemetry.d.ts +22 -0
  455. package/dist/telemetry/cli-telemetry.js +80 -11
  456. package/dist/telemetry/daemon-telemetry.d.ts +3 -1
  457. package/dist/telemetry/daemon-telemetry.js +9 -2
  458. package/dist/telemetry/feedback-cli.d.ts +1 -1
  459. package/dist/telemetry/feedback-cli.js +8 -3
  460. package/dist/telemetry/feedback.d.ts +1 -1
  461. package/dist/telemetry/feedback.js +51 -4
  462. package/dist/telemetry/harness-run.d.ts +3 -3
  463. package/dist/telemetry/harness-run.js +18 -7
  464. package/dist/telemetry/hud-events.d.ts +1 -1
  465. package/dist/telemetry/hud-metrics.d.ts +6 -3
  466. package/dist/telemetry/hud-metrics.js +20 -8
  467. package/dist/telemetry/install-source.js +1 -1
  468. package/dist/telemetry/mcp-connection.d.ts +1 -1
  469. package/dist/telemetry/mcp-connection.js +21 -2
  470. package/dist/telemetry/onboarding-firsts.d.ts +6 -1
  471. package/dist/telemetry/onboarding-firsts.js +41 -1
  472. package/dist/telemetry/proxy-telemetry.d.ts +42 -0
  473. package/dist/telemetry/proxy-telemetry.js +70 -1
  474. package/dist/telemetry/session-metrics.d.ts +1 -3
  475. package/dist/telemetry/session-metrics.js +16 -12
  476. package/dist/telemetry/telemetry.d.ts +9 -1
  477. package/dist/telemetry/telemetry.js +16 -1
  478. package/dist/telemetry/verification-of.d.ts +3 -1
  479. package/dist/telemetry/verification-of.js +7 -1
  480. package/dist/wire-journal.js +12 -2
  481. package/docs/README.md +4 -2
  482. package/docs/actions.mdx +7 -6
  483. package/docs/adapters.md +2 -1
  484. package/docs/agent-cheatsheet.md +19 -5
  485. package/docs/architecture.md +13 -10
  486. package/docs/autodrive.md +6 -5
  487. package/docs/benchmarks.md +2 -2
  488. package/docs/capabilities.mdx +1 -1
  489. package/docs/cli/affected.mdx +1 -1
  490. package/docs/cli/cloud.mdx +6 -6
  491. package/docs/cli/doctor.mdx +3 -1
  492. package/docs/cli/feedback.mdx +11 -7
  493. package/docs/cli/gate.mdx +1 -1
  494. package/docs/cli/help.mdx +1 -1
  495. package/docs/cli/init.mdx +20 -16
  496. package/docs/cli/mcp.mdx +5 -2
  497. package/docs/cli/open.mdx +5 -2
  498. package/docs/cli/report.mdx +1 -1
  499. package/docs/cli/restart.mdx +1 -1
  500. package/docs/cli/rollback.mdx +4 -4
  501. package/docs/cli/serve.mdx +7 -5
  502. package/docs/cli/setup.mdx +1 -1
  503. package/docs/cli/status.mdx +6 -2
  504. package/docs/cli/stop.mdx +3 -3
  505. package/docs/cli/telemetry.mdx +5 -1
  506. package/docs/cli/try.mdx +8 -8
  507. package/docs/cli/update.mdx +8 -5
  508. package/docs/cli/verify.mdx +12 -5
  509. package/docs/cli/version.mdx +1 -1
  510. package/docs/cli.mdx +10 -6
  511. package/docs/debugging.md +1 -1
  512. package/docs/deploy-checks.md +8 -6
  513. package/docs/desktop.mdx +14 -18
  514. package/docs/enterprise.md +6 -6
  515. package/docs/environment.mdx +5 -3
  516. package/docs/faq.mdx +9 -6
  517. package/docs/first-drive.md +19 -9
  518. package/docs/flows.md +3 -4
  519. package/docs/for-agents.md +1 -1
  520. package/docs/frameworks.mdx +34 -11
  521. package/docs/getting-started.md +46 -29
  522. package/docs/http-transport.md +2 -2
  523. package/docs/human-control.md +8 -8
  524. package/docs/index.mdx +2 -2
  525. package/docs/install-agentic.mdx +18 -19
  526. package/docs/install-manual.mdx +8 -4
  527. package/docs/integration-patterns.md +5 -5
  528. package/docs/multi-agent-testing.md +7 -5
  529. package/docs/packages/browser.mdx +34 -2
  530. package/docs/packages/core.mdx +2 -1
  531. package/docs/packages/electron.mdx +15 -3
  532. package/docs/packages/eslint-plugin.mdx +1 -1
  533. package/docs/packages/next.mdx +17 -5
  534. package/docs/packages/react.mdx +8 -1
  535. package/docs/packages/server.mdx +3 -3
  536. package/docs/packages/tauri.mdx +3 -3
  537. package/docs/packages/vite-plugin.mdx +1 -1
  538. package/docs/packages.mdx +19 -6
  539. package/docs/platform-integration.md +12 -4
  540. package/docs/predicates.mdx +18 -7
  541. package/docs/production-mode.md +108 -0
  542. package/docs/prompt-capture.md +99 -0
  543. package/docs/quickstart.mdx +14 -12
  544. package/docs/recipes.mdx +9 -8
  545. package/docs/required-checks.md +3 -2
  546. package/docs/skill-file.mdx +4 -3
  547. package/docs/skill-setup.md +2 -2
  548. package/docs/skill.md +62 -70
  549. package/docs/state-files.md +1 -0
  550. package/docs/state-management.mdx +11 -9
  551. package/docs/system-map.md +14 -13
  552. package/docs/telemetry.md +32 -24
  553. package/docs/testing.md +9 -5
  554. package/docs/tools/act-and-wait.mdx +17 -13
  555. package/docs/tools/act-sequence.mdx +40 -66
  556. package/docs/tools/act.mdx +7 -5
  557. package/docs/tools/assert.mdx +1 -1
  558. package/docs/tools/look.mdx +1 -1
  559. package/docs/tools/navigate.mdx +1 -1
  560. package/docs/tools/network.mdx +13 -11
  561. package/docs/tools/overview.mdx +3 -3
  562. package/docs/tools/query.mdx +3 -3
  563. package/docs/tools/session-and-feedback.mdx +9 -6
  564. package/docs/tools/sessions.mdx +7 -0
  565. package/docs/tools/snapshot.mdx +9 -7
  566. package/docs/tools/tools-and-run.mdx +11 -10
  567. package/docs/tools/verify.mdx +1 -1
  568. package/docs/troubleshooting.mdx +21 -9
  569. package/docs/usage.md +58 -43
  570. package/docs/use-cases.mdx +2 -2
  571. package/docs/vs-chrome-devtools-mcp.mdx +5 -5
  572. package/docs/vs-playwright-mcp.mdx +5 -4
  573. package/docs/what-is-recorded.md +12 -7
  574. package/docs/what-is-reticle.mdx +2 -2
  575. package/docs/why-reticle.mdx +1 -1
  576. package/package.json +9 -12
  577. package/dist/command/dev/stale-issue-guard.d.ts +0 -34
  578. package/dist/command/dev/stale-issue-guard.js +0 -69
@@ -7,13 +7,14 @@
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, ReplayStatus, ReticleCommand, } from '@reticlehq/core';
11
- import { ReticleTool } from '@reticlehq/core';
10
+ import { AnchorKind, DEGRADED_ANCHOR_ROLE, DOCUMENT_ANCHOR_ROLE, DriftReason, PredicateKind, QueryBy, ReplayStatus, ReticleCommand, } from '@reticlehq/core';
11
+ import { ReticleTool, isGlobalPressCall } 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
+ import { unreachableTargetNote } from '../../surface/tools/act/act-observation.js';
15
16
  import { anchorFieldName } from './flows.js';
16
- import { ambiguityDrift, refFor, anchorLabel, componentLabel, componentQueryArgs, expectElementDrift, reresolved, resolveQuery, testidDrift, } from './flow-anchor.js';
17
+ import { ambiguityDrift, refFor, anchorLabel, componentLabel, componentQueryArgs, expectElementDrift, queryOnce, reresolved, resolveQuery, testidDrift, } from './flow-anchor.js';
17
18
  import { nearestRoleName } from './role-anchor-nearest.js';
18
19
  import { roleDriftReason } from '../../judgement/outcome/role-drift-reason.js';
19
20
  /** The live act_sequence tool gives each step this transport budget when none was supplied. */
@@ -168,7 +169,7 @@ reresolve) {
168
169
  action: step.action ?? '',
169
170
  args: replayActionArgs(step.args, confirmDangerous, field),
170
171
  });
171
- return { ok: r.ok, error: r.error };
172
+ return { ok: r.ok, error: r.error, result: r.result };
172
173
  }
173
174
  finally {
174
175
  session.finishAction?.();
@@ -216,6 +217,19 @@ reresolve) {
216
217
  const result = { step: index, tool: step.tool, anchor: label, ok: act.ok };
217
218
  if (!act.ok)
218
219
  result.error = replayDestructiveActionHint(act.error ?? 'command failed');
220
+ // A click no person could have made decides nothing, on replay as on a live act.
221
+ const unreachable = act.ok ? unreachableTargetNote(act.result) : undefined;
222
+ if (unreachable !== undefined)
223
+ return {
224
+ ...result,
225
+ ok: false,
226
+ drift: {
227
+ reasonKind: DriftReason.TARGET_UNREACHABLE,
228
+ reason: unreachable,
229
+ anchor: label,
230
+ nearest: null,
231
+ },
232
+ };
219
233
  return result;
220
234
  }
221
235
  /** How long to let the app finish re-rendering before the one retry. Matches the sequence path. */
@@ -279,6 +293,26 @@ export function isDegradedAnchor(anchor) {
279
293
  anchor.role === DEGRADED_ANCHOR_ROLE &&
280
294
  anchor.name === undefined);
281
295
  }
296
+ /**
297
+ * A saved document-key press (#1559): the nameless `document` ROLE anchor on a press of a document
298
+ * key. It is dispatched with no ref, the way `act` ran it live, and never QUERIED: there is no
299
+ * element with that role to find, and the page's root would be the wrong target if there were.
300
+ *
301
+ * The press is checked as well as the anchor, so the same anchor on any other action stays an
302
+ * anchor that addresses nothing.
303
+ */
304
+ export function isDocumentPressStep(step) {
305
+ return (step.anchor.kind === AnchorKind.ROLE &&
306
+ step.anchor.role === DOCUMENT_ANCHOR_ROLE &&
307
+ step.anchor.name === undefined &&
308
+ isGlobalPressCall({ action: step.action, args: step.args }));
309
+ }
310
+ /** A `document` ROLE anchor names no element, whatever the step's action. */
311
+ function isDocumentAnchor(anchor) {
312
+ return (anchor.kind === AnchorKind.ROLE &&
313
+ anchor.role === DOCUMENT_ANCHOR_ROLE &&
314
+ anchor.name === undefined);
315
+ }
282
316
  /** What a step with no resolvable anchor reports, instead of a missing-element story. */
283
317
  const DEGRADED_STEP_REASON = 'recorded without a resolvable anchor (no data-testid, no accessible role+name), so it can never ' +
284
318
  'resolve on replay — add a data-testid to the element and record this flow again';
@@ -310,8 +344,9 @@ export function anchorQueryArgs(anchor) {
310
344
  return { by: QueryBy.TESTID, value: anchor.value };
311
345
  if (anchor.kind === AnchorKind.COMPONENT)
312
346
  return componentQueryArgs(anchor);
313
- if (anchor.kind === AnchorKind.ROLE && !isDegradedAnchor(anchor))
347
+ if (anchor.kind === AnchorKind.ROLE && !isDegradedAnchor(anchor) && !isDocumentAnchor(anchor)) {
314
348
  return roleQueryArgs(anchor);
349
+ }
315
350
  return null;
316
351
  }
317
352
  /**
@@ -324,7 +359,7 @@ export function anchorPrecondition(anchor) {
324
359
  if (anchor.kind === AnchorKind.TESTID) {
325
360
  return { kind: PredicateKind.ELEMENT, query: { testid: anchor.value } };
326
361
  }
327
- if (anchor.kind === AnchorKind.ROLE && !isDegradedAnchor(anchor)) {
362
+ if (anchor.kind === AnchorKind.ROLE && !isDegradedAnchor(anchor) && !isDocumentAnchor(anchor)) {
328
363
  return { kind: PredicateKind.ELEMENT, query: { role: anchor.role, name: anchor.name } };
329
364
  }
330
365
  return undefined;
@@ -373,6 +408,10 @@ function staleSubStep(error, live, from, to) {
373
408
  * drift whatever else happened, and a failure that is not staleness is a failure.
374
409
  */
375
410
  export function staleTargetResult(name, steps) {
411
+ // A target no person could reach is the same kind of answer: nothing about the app was decided.
412
+ const unreachable = unreachableTargetResult(name, steps) ?? unreachedStepResult(name, steps);
413
+ if (unreachable !== undefined)
414
+ return unreachable;
376
415
  if (steps.some((step) => step.drift !== undefined))
377
416
  return undefined;
378
417
  const failed = steps.filter((step) => !step.ok);
@@ -386,6 +425,64 @@ export function staleTargetResult(name, steps) {
386
425
  unverifiable: { reason: staleTargetReason(only.step) },
387
426
  };
388
427
  }
428
+ /**
429
+ * The honest answer when a step acted on a target no person could have clicked (covered, of no
430
+ * size, off screen). The replay stopped there, and nothing about the app was decided: undecided as a
431
+ * whole, with the cause and the fix, as a live act answers it. Read as a drift, the suite counted it
432
+ * as a failed flow ("Reticle result: failed") on an app that may be fine.
433
+ */
434
+ export function unreachableTargetResult(name, steps) {
435
+ const step = steps.find((s) => DriftReason.TARGET_UNREACHABLE === s.drift?.reasonKind);
436
+ if (step?.drift === undefined)
437
+ return undefined;
438
+ return {
439
+ name,
440
+ status: ReplayStatus.UNVERIFIABLE,
441
+ steps: [...steps],
442
+ unverifiable: { reason: `step ${String(step.step)}: ${step.drift.reason}` },
443
+ };
444
+ }
445
+ /** Drifts where the step's own control was never resolved, so the step never acted. */
446
+ const ANCHOR_MISSES = new Set([
447
+ DriftReason.TESTID_NOT_FOUND,
448
+ DriftReason.COMPONENT_NOT_FOUND,
449
+ DriftReason.ANCHOR_AMBIGUOUS,
450
+ DriftReason.ANCHOR_DEGRADED,
451
+ ]);
452
+ /**
453
+ * The honest answer when a replay stopped before it acted on anything: its first failing step's
454
+ * control was not on the page, often because the page lacks a state the recording had (a task added
455
+ * before recording started). Nothing ran, so nothing was proved. Read as drift, the run synced as
456
+ * FAIL, and the dashboard showed a failure for a journey that was never tested.
457
+ *
458
+ * Only when no earlier step ran. A control that is missing after earlier steps acted is on a page
459
+ * those steps made, so it stays drift, and heal reads it. A step that acted and whose expectation
460
+ * did not hold is a consequence drift and stays a failure. The failing step keeps its index and
461
+ * its `drift.reasonKind`, which the synced run carries in `stepResults`.
462
+ */
463
+ function unreachedStepResult(name, steps) {
464
+ const at = steps.findIndex((s) => !s.ok);
465
+ const step = steps[at];
466
+ const drift = step?.drift;
467
+ if (step === undefined || drift === undefined || !ANCHOR_MISSES.has(drift.reasonKind))
468
+ return undefined;
469
+ if (steps.slice(0, at).some((s) => s.ok))
470
+ return undefined;
471
+ // ponytail: one close, unambiguous survivor reads as a rename (heal's case), so it stays drift. A
472
+ // page with exactly one sibling of the missing control (`toggle-1` for `toggle-3`) reads the same.
473
+ if (drift.nearest !== null && true !== drift.ambiguous)
474
+ return undefined;
475
+ return {
476
+ name,
477
+ status: ReplayStatus.UNVERIFIABLE,
478
+ steps: [...steps],
479
+ unverifiable: {
480
+ reason: `did not reach step ${String(step.step + 1)} (${drift.reason}), so nothing was acted ` +
481
+ `on and nothing was proved. Start the replay from the state this step needs, or record the ` +
482
+ `steps that make it.`,
483
+ },
484
+ };
485
+ }
389
486
  /**
390
487
  * Run an act_sequence step: resolve every sub-step's OWN anchor, then dispatch the whole thing as one
391
488
  * ACT_SEQUENCE — the same shape `replayProgram` already uses, so a recorded sequence and a saved one
@@ -398,7 +495,12 @@ export function staleTargetResult(name, steps) {
398
495
  */
399
496
  export async function runSequenceStep(session, step, index, subs, confirmDangerous, sleep,
400
497
  /** Testids whose presence is deliberately NOT asserted — the LLM-output case. */
401
- dynamic = new Set()) {
498
+ dynamic = new Set(),
499
+ /**
500
+ * Judge one sub-step's `expect` over the window from `since`, which opens just before that
501
+ * sub-step's dispatch. Omitted for a setup step, whose consequences are not checked.
502
+ */
503
+ judge) {
402
504
  /**
403
505
  * Find one sub-step's element as the page is NOW. Either the live step to dispatch, or the step
404
506
  * result that ends the run: a degraded anchor, or one that is no longer on the page.
@@ -407,19 +509,36 @@ dynamic = new Set()) {
407
509
  * that now matches several elements is drift there, as it is for a single step's retry: the first of
408
510
  * the new matches may be an element the recording did not mean, and acting on it would report a pass
409
511
  * for a click nobody can attribute. The first look keeps taking the first match.
512
+ *
513
+ * `ahead` is a look at a sub-step before its turn. It is one query with no settle. An anchor that is
514
+ * not on the page yet is `pending`, not drift, because an earlier sub-step can render it.
410
515
  */
411
- const resolveSub = async (sub, subIndex, afterRerender = false) => {
516
+ const resolveSub = async (sub, subIndex, afterRerender = false, ahead = false) => {
412
517
  const label = `${anchorLabel(sub.anchor)} (sub-step ${String(subIndex)})`;
518
+ if (isDocumentPressStep(sub)) {
519
+ // Dispatched as it ran live, at the document with no ref (#1559).
520
+ return {
521
+ live: {
522
+ ref: '',
523
+ action: sub.action ?? '',
524
+ args: replayActionArgs(sub.args, confirmDangerous, undefined),
525
+ },
526
+ };
527
+ }
413
528
  const queryArgs = anchorQueryArgs(sub.anchor);
414
529
  if (null === queryArgs)
415
530
  return { stop: degradedStepResult(step, index, label) };
416
- const { refs, hint } = await resolveQuery(session, queryArgs, sleep);
531
+ const { refs, hint } = ahead
532
+ ? await queryOnce(session, queryArgs)
533
+ : await resolveQuery(session, queryArgs, sleep);
417
534
  const ambiguous = afterRerender ? ambiguityDrift(sub.anchor, refs) : null;
418
535
  if (ambiguous !== null) {
419
536
  return { stop: { step: index, tool: step.tool, anchor: label, ok: false, drift: ambiguous } };
420
537
  }
421
538
  const ref = afterRerender ? refFor(sub.anchor, refs) : refs[0];
422
539
  if (ref === undefined) {
540
+ if (ahead)
541
+ return { pending: true };
423
542
  return {
424
543
  stop: {
425
544
  step: index,
@@ -447,15 +566,31 @@ dynamic = new Set()) {
447
566
  },
448
567
  };
449
568
  };
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
569
  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);
458
- }
570
+ /**
571
+ * Resolve sub-steps from `from`, as far as the page allows now. Return the index where the run must
572
+ * dispatch before it can look further.
573
+ *
574
+ * Sub-step `from` is the one whose turn it is. It gets the full settle, and it drifts if it is
575
+ * missing. At 0, that is before anything acted. Each later sub-step gets one look before its turn.
576
+ * The first one that is not on the page yet ends the stretch. Live, a later sub-step can target
577
+ * what an earlier one renders, for example the "Cancel" of a form that "Edit" opens (#1523). A
578
+ * sequence whose anchors are all on the page at the start is one stretch, so it is one batch.
579
+ */
580
+ const resolveFrom = async (from) => {
581
+ for (let at = from; at < subs.length; at += 1) {
582
+ const sub = subs[at];
583
+ if (sub === undefined)
584
+ continue;
585
+ const resolved = await resolveSub(sub, at, false, at > from);
586
+ if ('pending' in resolved)
587
+ return { end: at };
588
+ if ('stop' in resolved)
589
+ return resolved;
590
+ live[at] = resolved.live;
591
+ }
592
+ return { end: subs.length };
593
+ };
459
594
  const result = {
460
595
  step: index,
461
596
  tool: step.tool,
@@ -482,7 +617,7 @@ dynamic = new Set()) {
482
617
  /**
483
618
  * Run sub-steps [from, to), and survive the page re-rendering under them.
484
619
  *
485
- * The refs were resolved before anything ran, and the first action of a sequence is allowed to
620
+ * The refs were resolved before their stretch ran, and the first action of a sequence is allowed to
486
621
  * re-render the page, so by the time a later sub-step is reached its ref may be dead. The same
487
622
  * anchor is almost always still there under a new ref; what was missing is a second look.
488
623
  *
@@ -531,7 +666,9 @@ dynamic = new Set()) {
531
666
  result.drift = resolved.stop.drift;
532
667
  return false;
533
668
  }
534
- live[at] = resolved.live;
669
+ // A second look settles, so it is never `pending`.
670
+ if ('live' in resolved)
671
+ live[at] = resolved.live;
535
672
  }
536
673
  start = staleAt;
537
674
  }
@@ -567,19 +704,41 @@ dynamic = new Set()) {
567
704
  *
568
705
  * The walk costs a round trip per sub-step, so only a flow that declared something pays for it.
569
706
  */
570
- const declaring = subs.some((sub) => declaredBy(sub) !== undefined);
571
- if (!declaring) {
572
- await dispatchFrom(0, live.length);
573
- return result;
574
- }
575
- for (const [subIndex, sub] of subs.entries()) {
576
- if (live[subIndex] === undefined)
577
- continue;
578
- if (!(await dispatchFrom(subIndex, subIndex + 1)))
579
- return result;
580
- const testid = declaredBy(sub);
581
- if (testid !== undefined && !(await assertDeclared(testid)))
582
- return result;
707
+ const judged = (sub) => judge !== undefined && sub.expect !== undefined;
708
+ const declaring = subs.some((sub) => declaredBy(sub) !== undefined || judged(sub));
709
+ for (let next = 0; next < subs.length;) {
710
+ const stretch = await resolveFrom(next);
711
+ if ('stop' in stretch)
712
+ return stretch.stop;
713
+ const { end } = stretch;
714
+ if (!declaring) {
715
+ if (!(await dispatchFrom(next, end)))
716
+ return result;
717
+ }
718
+ else {
719
+ for (let at = next; at < end; at += 1) {
720
+ const sub = subs[at];
721
+ if (sub === undefined)
722
+ continue;
723
+ const since = session.elapsed();
724
+ if (!(await dispatchFrom(at, at + 1)))
725
+ return result;
726
+ const testid = declaredBy(sub);
727
+ if (testid !== undefined && !(await assertDeclared(testid)))
728
+ return result;
729
+ // The claim is about THIS sub-step: a later one has not run, and an earlier one is before
730
+ // `since`. Judged at the end, a middle route expect failed and a late claim passed early.
731
+ const drift = judge !== undefined && sub.expect !== undefined
732
+ ? await judge(sub.expect, since)
733
+ : undefined;
734
+ if (drift !== undefined) {
735
+ result.ok = false;
736
+ result.drift = drift;
737
+ return result;
738
+ }
739
+ }
740
+ }
741
+ next = end;
583
742
  }
584
743
  return result;
585
744
  }
@@ -24,9 +24,16 @@
24
24
  * returned unchanged.
25
25
  */
26
26
  import { FlowStore } from './flows.js';
27
- import type { ProjectTarget } from '../../memory/project/session-root.js';
27
+ import { type ProjectTarget } from '../../memory/project/session-root.js';
28
+ import type { ProjectId } from '@reticlehq/core';
28
29
  import type { ToolDeps } from '../../surface/tools/tool-kit.js';
29
30
  export declare function flowsForSession(deps: ToolDeps, target: ProjectTarget): {
30
31
  flows: FlowStore;
31
32
  root: string;
32
33
  };
34
+ /** `flowsForSession` for a session id, with the project id to scope the store by. Same refusals. */
35
+ export declare function flowsForSessionId(deps: ToolDeps, sessionId: string | undefined): {
36
+ flows: FlowStore;
37
+ root: string;
38
+ projectId: ProjectId | undefined;
39
+ };
@@ -24,6 +24,7 @@
24
24
  * returned unchanged.
25
25
  */
26
26
  import { FlowStore } from './flows.js';
27
+ import { sessionTarget } from '../../memory/project/session-root.js';
27
28
  export function flowsForSession(deps, target) {
28
29
  const resolved = deps.artifactRootFor?.(target.projectId, target.origin);
29
30
  if (resolved === undefined || resolved.root === deps.reticleRoot) {
@@ -35,3 +36,8 @@ export function flowsForSession(deps, target) {
35
36
  root: resolved.root,
36
37
  };
37
38
  }
39
+ /** `flowsForSession` for a session id, with the project id to scope the store by. Same refusals. */
40
+ export function flowsForSessionId(deps, sessionId) {
41
+ const target = sessionTarget(deps, sessionId);
42
+ return { ...flowsForSession(deps, target), projectId: target.projectId };
43
+ }
@@ -1,25 +1,4 @@
1
- import { type FlowReplayResult } from '@reticlehq/core';
2
- import type { ToolDef, ToolDeps } from '../../surface/tools/tool-kit.js';
1
+ import type { ToolDef } from '../../surface/tools/tool-kit.js';
3
2
  export { replayNamedFlow } from './flow-replay-run.js';
4
- /**
5
- * The URL a leased context should open: the app's ORIGIN, not the live tab's current location.
6
- *
7
- * The live tab drifts — every replay navigates it — so using its full URL made each lease start wherever
8
- * the previous run happened to finish (observed: leases opening /deployments and failing to find the
9
- * login control that only exists at the root). A lease must be a FRESH visit to a deterministic entry
10
- * point; flows that need another page carry their own startPath.
11
- */
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;
23
- /** A flow whose leased context never came up is a suite ERROR, never a silent pass. */
24
- export declare function leaseFailureReplay(name: string, error: string | undefined): FlowReplayResult;
3
+ export { leasableAppUrl, leaseFailureReplay, sessionUrlOf } from './flow-lease.js';
25
4
  export declare const FLOW_TOOLS: ToolDef[];