@reticlehq/server 3.6.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 (614) hide show
  1. package/SKILL.md +122 -123
  2. package/dist/command/cli/adhoc-suite.d.ts +14 -0
  3. package/dist/command/cli/adhoc-suite.js +42 -7
  4. package/dist/command/cli/adhoc-verdict.d.ts +18 -2
  5. package/dist/command/cli/adhoc-verdict.js +70 -6
  6. package/dist/command/cli/answers/gate-exit.d.ts +23 -0
  7. package/dist/command/cli/answers/gate-exit.js +45 -0
  8. package/dist/command/cli/answers/gate-hook-message.d.ts +2 -0
  9. package/dist/command/cli/answers/gate-hook-message.js +3 -1
  10. package/dist/command/cli/auth/device-flow.d.ts +13 -2
  11. package/dist/command/cli/auth/device-flow.js +17 -0
  12. package/dist/command/cli/cli-doctor.js +14 -0
  13. package/dist/command/cli/cli-flow-commands.d.ts +0 -11
  14. package/dist/command/cli/cli-flow-commands.js +28 -105
  15. package/dist/command/cli/cli-kill.js +3 -2
  16. package/dist/command/cli/cli-parse-grammar.d.ts +24 -0
  17. package/dist/command/cli/cli-parse-grammar.js +75 -0
  18. package/dist/command/cli/cli-parse-verify.d.ts +2 -0
  19. package/dist/command/cli/cli-parse-verify.js +18 -0
  20. package/dist/command/cli/cli-parse.d.ts +19 -28
  21. package/dist/command/cli/cli-parse.js +82 -182
  22. package/dist/command/cli/cli-update-commands.d.ts +1 -1
  23. package/dist/command/cli/cli-update-commands.js +61 -9
  24. package/dist/command/cli/cli-usage.d.ts +33 -0
  25. package/dist/command/cli/cli-usage.js +287 -0
  26. package/dist/command/cli/cli-verify.d.ts +34 -4
  27. package/dist/command/cli/cli-verify.js +81 -12
  28. package/dist/command/cli/cloud-cli.d.ts +13 -0
  29. package/dist/command/cli/cloud-cli.js +145 -333
  30. package/dist/command/cli/cloud-kit.d.ts +12 -0
  31. package/dist/command/cli/cloud-kit.js +41 -2
  32. package/dist/command/cli/cloud-link.d.ts +57 -0
  33. package/dist/command/cli/cloud-link.js +308 -0
  34. package/dist/command/cli/cloud-login.d.ts +15 -1
  35. package/dist/command/cli/cloud-login.js +67 -13
  36. package/dist/command/cli/context-command.d.ts +1 -0
  37. package/dist/command/cli/context-command.js +33 -0
  38. package/dist/command/cli/daemon-start-options.d.ts +3 -0
  39. package/dist/command/cli/daemon-start-options.js +24 -3
  40. package/dist/command/cli/doctor/doctor-coverage-line.d.ts +2 -0
  41. package/dist/command/cli/doctor/doctor-coverage-line.js +47 -0
  42. package/dist/command/cli/doctor/doctor-project-line.d.ts +0 -12
  43. package/dist/command/cli/doctor/doctor-project-line.js +5 -4
  44. package/dist/command/cli/doctor/doctor-rows.d.ts +6 -0
  45. package/dist/command/cli/doctor/doctor-rows.js +6 -0
  46. package/dist/command/cli/doctor/doctor-signing-line.d.ts +38 -0
  47. package/dist/command/cli/doctor/doctor-signing-line.js +114 -0
  48. package/dist/command/cli/known-regression.d.ts +13 -0
  49. package/dist/command/cli/known-regression.js +34 -0
  50. package/dist/command/cli/launch/sdk-version-match.d.ts +12 -0
  51. package/dist/command/cli/launch/sdk-version-match.js +25 -0
  52. package/dist/command/cli/lifecycle/daemon-lifecycle.js +11 -2
  53. package/dist/command/cli/mcp-command.d.ts +6 -0
  54. package/dist/command/cli/mcp-command.js +13 -5
  55. package/dist/command/cli/ports/port-holder.js +1 -1
  56. package/dist/command/cli/project-name.d.ts +29 -1
  57. package/dist/command/cli/project-name.js +107 -2
  58. package/dist/command/cli/setup-mcp-cli.d.ts +17 -1
  59. package/dist/command/cli/setup-mcp-cli.js +29 -8
  60. package/dist/command/cli/status/status-lines.d.ts +1 -0
  61. package/dist/command/cli/status/status-lines.js +47 -2
  62. package/dist/command/cli/status/workspace-links.d.ts +10 -0
  63. package/dist/command/cli/status/workspace-links.js +29 -0
  64. package/dist/command/cli/try-command.d.ts +96 -0
  65. package/dist/command/cli/try-command.js +362 -0
  66. package/dist/command/cli/tutorial.d.ts +0 -100
  67. package/dist/command/cli/tutorial.js +0 -178
  68. package/dist/command/cli/verify-results.d.ts +19 -0
  69. package/dist/command/cli/verify-results.js +29 -0
  70. package/dist/command/cli-onboarding.d.ts +0 -11
  71. package/dist/command/cli-onboarding.js +0 -15
  72. package/dist/command/cli.d.ts +14 -0
  73. package/dist/command/cli.js +103 -83
  74. package/dist/command/daemon/daemon-resilience.js +4 -4
  75. package/dist/command/daemon/daemon-resolve.d.ts +9 -1
  76. package/dist/command/daemon/daemon-resolve.js +49 -10
  77. package/dist/command/setup/bringup/bridge-port.d.ts +3 -1
  78. package/dist/command/setup/bringup/bridge-port.js +13 -3
  79. package/dist/command/setup/bringup/dev-server-log-cap.js +2 -0
  80. package/dist/command/setup/bringup/ensure-daemon.js +9 -2
  81. package/dist/command/setup/init/agent-restart.d.ts +23 -0
  82. package/dist/command/setup/init/agent-restart.js +28 -0
  83. package/dist/command/setup/init/init-port.d.ts +10 -1
  84. package/dist/command/setup/init/init-port.js +22 -2
  85. package/dist/command/setup/init/init-runtime.d.ts +12 -2
  86. package/dist/command/setup/init/init-runtime.js +96 -37
  87. package/dist/command/setup/node-effects.d.ts +2 -0
  88. package/dist/command/setup/node-effects.js +36 -8
  89. package/dist/command/setup/probe/existing-app.d.ts +12 -0
  90. package/dist/command/setup/probe/existing-app.js +14 -0
  91. package/dist/command/setup/remaining-steps.js +1 -1
  92. package/dist/command/setup/run-setup.d.ts +29 -9
  93. package/dist/command/setup/run-setup.js +34 -28
  94. package/dist/command/setup/setup-command.d.ts +23 -0
  95. package/dist/command/setup/setup-command.js +57 -4
  96. package/dist/command/setup/setup-mcp.js +25 -2
  97. package/dist/command/setup/tauri-signing.d.ts +19 -0
  98. package/dist/command/setup/tauri-signing.js +79 -0
  99. package/dist/command/setup/terminal/listeners.d.ts +10 -1
  100. package/dist/command/setup/terminal/listeners.js +37 -6
  101. package/dist/command/update/update-nudge.d.ts +9 -0
  102. package/dist/command/update/update-nudge.js +1 -1
  103. package/dist/command/update/updater.js +11 -15
  104. package/dist/command/version/version-nudge.js +3 -0
  105. package/dist/command/version/version-skew.d.ts +20 -1
  106. package/dist/command/version/version-skew.js +38 -2
  107. package/dist/features/crawl/crawl.js +14 -1
  108. package/dist/features/exhaust/ledger.d.ts +14 -14
  109. package/dist/features/harness/drive-report.d.ts +39 -5
  110. package/dist/features/harness/drive-report.js +271 -54
  111. package/dist/features/harness/drive-runs.d.ts +120 -0
  112. package/dist/features/harness/drive-runs.js +289 -0
  113. package/dist/features/harness/drivers.d.ts +1 -1
  114. package/dist/features/harness/drivers.js +1 -1
  115. package/dist/features/harness/explore/console-pages.d.ts +15 -0
  116. package/dist/features/harness/explore/console-pages.js +146 -0
  117. package/dist/features/harness/explore/disparity.d.ts +19 -0
  118. package/dist/features/harness/explore/disparity.js +71 -0
  119. package/dist/features/harness/explore/fake-app.d.ts +16 -0
  120. package/dist/features/harness/explore/fake-app.js +49 -0
  121. package/dist/features/harness/explore/goal-search.d.ts +26 -0
  122. package/dist/features/harness/explore/goal-search.js +144 -0
  123. package/dist/features/harness/explore/page-tree.d.ts +49 -0
  124. package/dist/features/harness/explore/page-tree.js +148 -0
  125. package/dist/features/harness/explore/site-map.d.ts +34 -0
  126. package/dist/features/harness/explore/site-map.js +150 -0
  127. package/dist/features/harness/goals.d.ts +68 -7
  128. package/dist/features/harness/goals.js +289 -36
  129. package/dist/features/harness/harness.d.ts +30 -1
  130. package/dist/features/harness/harness.js +141 -7
  131. package/dist/features/harness/platform/local-apps.d.ts +36 -3
  132. package/dist/features/harness/platform/local-apps.js +81 -5
  133. package/dist/features/harness/platform/persona-credentials.d.ts +20 -0
  134. package/dist/features/harness/platform/persona-credentials.js +69 -0
  135. package/dist/features/harness/platform/platform-drives.d.ts +61 -0
  136. package/dist/features/harness/platform/platform-drives.js +114 -0
  137. package/dist/features/harness/platform/refusal.d.ts +52 -0
  138. package/dist/features/harness/platform/refusal.js +71 -0
  139. package/dist/features/harness/platform/remote-drive.d.ts +8 -2
  140. package/dist/features/harness/platform/remote-drive.js +22 -9
  141. package/dist/features/harness/platform/script.d.ts +57 -11
  142. package/dist/features/harness/platform/script.js +144 -12
  143. package/dist/features/harness/platform/server-driver.d.ts +17 -4
  144. package/dist/features/harness/platform/server-driver.js +29 -26
  145. package/dist/features/harness/platform-config.d.ts +38 -5
  146. package/dist/features/harness/platform-config.js +93 -8
  147. package/dist/features/harness/route-guess.d.ts +13 -0
  148. package/dist/features/harness/route-guess.js +49 -0
  149. package/dist/features/harness/script/script-run.d.ts +30 -1
  150. package/dist/features/harness/script/script-run.js +355 -48
  151. package/dist/features/license/license.d.ts +2 -2
  152. package/dist/features/visual/step-shots.d.ts +31 -0
  153. package/dist/features/visual/step-shots.js +231 -0
  154. package/dist/features/visual/visual-tools.js +22 -14
  155. package/dist/hooks/client-directory.d.ts +18 -0
  156. package/dist/hooks/client-directory.js +57 -0
  157. package/dist/hooks/coding-agents.d.ts +34 -0
  158. package/dist/hooks/coding-agents.js +117 -0
  159. package/dist/hooks/driven-by.d.ts +21 -2
  160. package/dist/hooks/driven-by.js +42 -2
  161. package/dist/hooks/hook-bus.d.ts +4 -0
  162. package/dist/hooks/hook-bus.js +18 -0
  163. package/dist/index.d.ts +1 -0
  164. package/dist/index.js +26 -183
  165. package/dist/judgement/capsule/capsule-store.d.ts +2 -2
  166. package/dist/judgement/capsule/causal-summary.d.ts +15 -1
  167. package/dist/judgement/capsule/causal-summary.js +33 -0
  168. package/dist/judgement/runs/artifact/build-verification-run.d.ts +1 -1
  169. package/dist/judgement/runs/artifact/build-verification-run.js +20 -4
  170. package/dist/judgement/runs/artifact/gap-summary.d.ts +0 -18
  171. package/dist/judgement/runs/artifact/gap-summary.js +12 -3
  172. package/dist/judgement/runs/artifact/replay-mapping.js +25 -9
  173. package/dist/judgement/runs/artifact/run-store.d.ts +13 -1
  174. package/dist/judgement/runs/artifact/run-store.js +175 -8
  175. package/dist/judgement/runs/context-tools.js +59 -1
  176. package/dist/judgement/runs/default-run-id.d.ts +3 -0
  177. package/dist/judgement/runs/default-run-id.js +16 -0
  178. package/dist/judgement/runs/drive-run.d.ts +53 -5
  179. package/dist/judgement/runs/drive-run.js +234 -20
  180. package/dist/judgement/runs/resume.d.ts +44 -0
  181. package/dist/judgement/runs/resume.js +137 -0
  182. package/dist/judgement/runs/reticle-runner.js +5 -2
  183. package/dist/judgement/runs/runner-port.d.ts +5 -1
  184. package/dist/judgement/runs/runner-port.js +8 -2
  185. package/dist/judgement/runs/verification-sync.d.ts +2 -0
  186. package/dist/judgement/runs/verification-sync.js +36 -15
  187. package/dist/language/flows/decision.js +2 -1
  188. package/dist/language/flows/fields/flow-secret-field.d.ts +12 -0
  189. package/dist/language/flows/fields/flow-secret-field.js +25 -2
  190. package/dist/language/flows/flow-anchor.d.ts +7 -2
  191. package/dist/language/flows/flow-anchor.js +10 -3
  192. package/dist/language/flows/flow-intent.d.ts +1 -0
  193. package/dist/language/flows/flow-journey.d.ts +6 -0
  194. package/dist/language/flows/flow-journey.js +20 -0
  195. package/dist/language/flows/flow-learning.d.ts +4 -0
  196. package/dist/language/flows/flow-learning.js +37 -3
  197. package/dist/language/flows/flow-replay-run.js +16 -18
  198. package/dist/language/flows/flow-replay-types.d.ts +1 -1
  199. package/dist/language/flows/flow-replay.d.ts +18 -1
  200. package/dist/language/flows/flow-replay.js +22 -7
  201. package/dist/language/flows/flow-result.d.ts +22 -1
  202. package/dist/language/flows/flow-result.js +47 -2
  203. package/dist/language/flows/flow-step-runners.d.ts +2 -0
  204. package/dist/language/flows/flow-step-runners.js +12 -6
  205. package/dist/language/flows/flow-store-for-session.js +5 -1
  206. package/dist/language/flows/flow-tools.d.ts +10 -0
  207. package/dist/language/flows/flow-tools.js +61 -62
  208. package/dist/language/flows/flows.d.ts +16 -1
  209. package/dist/language/flows/flows.js +69 -10
  210. package/dist/language/flows/narrow-write.d.ts +7 -0
  211. package/dist/language/flows/narrow-write.js +36 -1
  212. package/dist/language/flows/recording/recording-backtrack.js +14 -1
  213. package/dist/language/flows/recording/tape/recordings.d.ts +29 -1
  214. package/dist/language/flows/recording/tape/recordings.js +60 -10
  215. package/dist/language/flows/replay.js +29 -6
  216. package/dist/language/flows/single-replay.d.ts +7 -0
  217. package/dist/language/flows/single-replay.js +26 -0
  218. package/dist/language/flows/verify-change-tools.d.ts +1 -0
  219. package/dist/language/flows/verify-change-tools.js +200 -193
  220. package/dist/memory/cloud/cloud-config.d.ts +10 -1
  221. package/dist/memory/cloud/cloud-config.js +19 -5
  222. package/dist/memory/cloud/cloud-sync.js +3 -3
  223. package/dist/memory/cloud/harness-config.d.ts +49 -0
  224. package/dist/memory/cloud/harness-config.js +16 -20
  225. package/dist/memory/cloud/memory-scope.d.ts +17 -0
  226. package/dist/memory/cloud/memory-scope.js +22 -0
  227. package/dist/memory/cloud/sync-cycle.d.ts +32 -4
  228. package/dist/memory/cloud/sync-cycle.js +113 -12
  229. package/dist/memory/cloud/sync-daemon.d.ts +11 -0
  230. package/dist/memory/cloud/sync-daemon.js +114 -4
  231. package/dist/memory/cloud/sync-disk.js +26 -2
  232. package/dist/memory/cloud/sync-screenshots.d.ts +32 -0
  233. package/dist/memory/cloud/sync-screenshots.js +105 -0
  234. package/dist/memory/cloud/unsynced-roots.d.ts +47 -0
  235. package/dist/memory/cloud/unsynced-roots.js +166 -0
  236. package/dist/memory/impact/account-watch.d.ts +16 -1
  237. package/dist/memory/impact/account-watch.js +26 -1
  238. package/dist/memory/impact/impact-store.d.ts +1 -4
  239. package/dist/memory/impact/impact-store.js +32 -42
  240. package/dist/memory/intent/inline-intent.d.ts +1 -0
  241. package/dist/memory/intent/intent-shard-store.js +16 -4
  242. package/dist/memory/intent/intent-shard.d.ts +12 -0
  243. package/dist/memory/intent/intent-store.d.ts +1 -0
  244. package/dist/memory/intent/intent-tools.js +42 -2
  245. package/dist/memory/intent/open-intents.d.ts +6 -0
  246. package/dist/memory/intent/open-intents.js +10 -1
  247. package/dist/memory/intent/settled-words.d.ts +24 -0
  248. package/dist/memory/intent/settled-words.js +130 -0
  249. package/dist/memory/journal/drive-flow.d.ts +16 -0
  250. package/dist/memory/journal/drive-flow.js +34 -2
  251. package/dist/memory/journal/drive-run-flush.d.ts +2 -0
  252. package/dist/memory/journal/drive-run-flush.js +20 -5
  253. package/dist/memory/journal/journal-recorder.js +46 -3
  254. package/dist/memory/journal/on-disk/retention.d.ts +5 -0
  255. package/dist/memory/journal/on-disk/retention.js +27 -2
  256. package/dist/memory/journal/on-disk/workspace-tiers.js +2 -0
  257. package/dist/memory/journal/session-end.d.ts +15 -1
  258. package/dist/memory/journal/session-end.js +38 -7
  259. package/dist/memory/project/artifact-root-resolver.js +33 -5
  260. package/dist/memory/project/artifact-root.d.ts +4 -3
  261. package/dist/memory/project/artifact-root.js +2 -2
  262. package/dist/memory/project/dir/reticle-dir.d.ts +14 -0
  263. package/dist/memory/project/dir/reticle-dir.js +23 -2
  264. package/dist/memory/project/link-directory.d.ts +15 -0
  265. package/dist/memory/project/link-directory.js +44 -0
  266. package/dist/memory/project/root-claims.d.ts +6 -0
  267. package/dist/memory/project/root-claims.js +39 -0
  268. package/dist/memory/project/session-root.d.ts +2 -0
  269. package/dist/memory/project/session-root.js +9 -1
  270. package/dist/memory/project/sync-status.d.ts +46 -0
  271. package/dist/memory/project/sync-status.js +135 -1
  272. package/dist/memory/recall/memory-tools.js +46 -3
  273. package/dist/memory/recall/platform-memory.d.ts +34 -0
  274. package/dist/memory/recall/platform-memory.js +139 -0
  275. package/dist/memory/recall/project-memory.js +36 -8
  276. package/dist/portal/bridge/bridge.d.ts +9 -5
  277. package/dist/portal/bridge/bridge.js +66 -23
  278. package/dist/portal/bridge/harness-request.d.ts +23 -0
  279. package/dist/portal/bridge/harness-request.js +27 -0
  280. package/dist/portal/bridge/wrong-path.d.ts +17 -0
  281. package/dist/portal/bridge/wrong-path.js +35 -0
  282. package/dist/portal/input/network-mock-tools.js +11 -2
  283. package/dist/portal/input/real-input.d.ts +2 -0
  284. package/dist/portal/input/real-input.js +13 -10
  285. package/dist/portal/pool/browser-pool.d.ts +48 -0
  286. package/dist/portal/pool/browser-pool.js +120 -2
  287. package/dist/portal/pool/context-permissions.d.ts +33 -0
  288. package/dist/portal/pool/context-permissions.js +33 -0
  289. package/dist/portal/pool/lease-marker-stamp.d.ts +23 -0
  290. package/dist/portal/pool/lease-marker-stamp.js +49 -0
  291. package/dist/portal/pool/playwright-launcher.d.ts +27 -5
  292. package/dist/portal/pool/playwright-launcher.js +59 -14
  293. package/dist/portal/pool/pool-contract.d.ts +21 -1
  294. package/dist/portal/session/agent-link.d.ts +8 -0
  295. package/dist/portal/session/agent-link.js +17 -0
  296. package/dist/portal/session/command-payload.js +6 -1
  297. package/dist/portal/session/daemon-answers.d.ts +3 -3
  298. package/dist/portal/session/daemon-answers.js +4 -2
  299. package/dist/portal/session/dev-server/dev-command.d.ts +9 -0
  300. package/dist/portal/session/dev-server/dev-command.js +27 -1
  301. package/dist/portal/session/facts/observed-state.d.ts +16 -18
  302. package/dist/portal/session/facts/observed-state.js +46 -3
  303. package/dist/portal/session/human/live-control.d.ts +9 -2
  304. package/dist/portal/session/human/live-control.js +12 -3
  305. package/dist/portal/session/live-control-tools.js +82 -13
  306. package/dist/portal/session/narration-args.d.ts +5 -0
  307. package/dist/portal/session/narration-args.js +17 -0
  308. package/dist/portal/session/no-session-diagnosis.d.ts +1 -1
  309. package/dist/portal/session/no-session-diagnosis.js +31 -9
  310. package/dist/portal/session/no-session-next-action.d.ts +20 -0
  311. package/dist/portal/session/no-session-next-action.js +134 -61
  312. package/dist/portal/session/no-session-watch.js +179 -22
  313. package/dist/portal/session/presence/session-lease.js +1 -1
  314. package/dist/portal/session/recorded-gaps.d.ts +97 -0
  315. package/dist/portal/session/recorded-gaps.js +251 -0
  316. package/dist/portal/session/session-health.d.ts +11 -0
  317. package/dist/portal/session/session-health.js +3 -1
  318. package/dist/portal/session/session-info.js +2 -1
  319. package/dist/portal/session/session-manager.d.ts +18 -0
  320. package/dist/portal/session/session-manager.js +54 -3
  321. package/dist/portal/session/session-successor.d.ts +8 -0
  322. package/dist/portal/session/session-successor.js +1 -1
  323. package/dist/portal/session/session.d.ts +15 -28
  324. package/dist/portal/session/session.js +60 -61
  325. package/dist/portal/session/timing/command-timeout.js +25 -1
  326. package/dist/portal/session/timing/wall-clock.d.ts +1 -1
  327. package/dist/portal/session/timing/wall-clock.js +1 -1
  328. package/dist/portal/session/zero-install-first-call.d.ts +31 -0
  329. package/dist/portal/session/zero-install-first-call.js +88 -0
  330. package/dist/start-options.d.ts +7 -1
  331. package/dist/start-wiring.d.ts +63 -0
  332. package/dist/start-wiring.js +169 -0
  333. package/dist/status-payload.d.ts +13 -1
  334. package/dist/status-payload.js +13 -1
  335. package/dist/surface/http-server.js +7 -1
  336. package/dist/surface/mcp/attach-memory.d.ts +1 -0
  337. package/dist/surface/mcp/attach-memory.js +12 -1
  338. package/dist/surface/mcp/mcp-proxy.d.ts +4 -0
  339. package/dist/surface/mcp/mcp-proxy.js +29 -8
  340. package/dist/surface/mcp/mcp.d.ts +23 -0
  341. package/dist/surface/mcp/mcp.js +34 -4
  342. package/dist/surface/mcp/proxy/drive-calls.d.ts +10 -0
  343. package/dist/surface/mcp/proxy/drive-calls.js +27 -0
  344. package/dist/surface/mcp/proxy/mcp-post-transport.js +5 -0
  345. package/dist/surface/mcp/server-instructions.js +22 -14
  346. package/dist/surface/mcp/shared-params.js +1 -1
  347. package/dist/surface/mcp/surface-vocabulary.d.ts +2 -0
  348. package/dist/surface/mcp/surface-vocabulary.js +1 -0
  349. package/dist/surface/tools/account-tool.d.ts +22 -0
  350. package/dist/surface/tools/account-tool.js +157 -0
  351. package/dist/surface/tools/act/act-danger.d.ts +11 -0
  352. package/dist/surface/tools/act/act-danger.js +38 -1
  353. package/dist/surface/tools/act/act-observation.d.ts +33 -0
  354. package/dist/surface/tools/act/act-observation.js +57 -0
  355. package/dist/surface/tools/act/act-preflight.js +25 -2
  356. package/dist/surface/tools/act/act-target.js +8 -3
  357. package/dist/surface/tools/act/resolve-target.d.ts +1 -1
  358. package/dist/surface/tools/act/resolve-target.js +18 -3
  359. package/dist/surface/tools/act/screen-request.d.ts +34 -0
  360. package/dist/surface/tools/act/screen-request.js +113 -0
  361. package/dist/surface/tools/act/sequence-grade.d.ts +8 -0
  362. package/dist/surface/tools/act/sequence-grade.js +13 -2
  363. package/dist/surface/tools/act-sequence-tool.js +136 -27
  364. package/dist/surface/tools/act-tools.d.ts +0 -9
  365. package/dist/surface/tools/act-tools.js +48 -34
  366. package/dist/surface/tools/agent/app-notes-learning.d.ts +7 -0
  367. package/dist/surface/tools/agent/app-notes-learning.js +80 -0
  368. package/dist/surface/tools/agent/app-notes.d.ts +4 -0
  369. package/dist/surface/tools/agent/app-notes.js +48 -0
  370. package/dist/surface/tools/agent/build-staleness.d.ts +7 -0
  371. package/dist/surface/tools/agent/build-staleness.js +62 -0
  372. package/dist/surface/tools/agent/compact-envelope.d.ts +80 -0
  373. package/dist/surface/tools/agent/compact-envelope.js +374 -0
  374. package/dist/surface/tools/agent/for-the-agent.d.ts +12 -0
  375. package/dist/surface/tools/agent/for-the-agent.js +44 -0
  376. package/dist/surface/tools/agent/notices.d.ts +50 -0
  377. package/dist/surface/tools/agent/notices.js +152 -0
  378. package/dist/surface/tools/agent/reteach.d.ts +11 -0
  379. package/dist/surface/tools/agent/reteach.js +50 -0
  380. package/dist/surface/tools/args/alias-args.d.ts +5 -0
  381. package/dist/surface/tools/args/alias-args.js +10 -0
  382. package/dist/surface/tools/args/confirm-dangerous-arg.d.ts +6 -0
  383. package/dist/surface/tools/args/confirm-dangerous-arg.js +6 -0
  384. package/dist/surface/tools/assert/assert-source.d.ts +15 -0
  385. package/dist/surface/tools/assert/assert-source.js +40 -0
  386. package/dist/surface/tools/assert/assert-verdict.js +25 -15
  387. package/dist/surface/tools/browser-tools.js +43 -1
  388. package/dist/surface/tools/chat-drives.d.ts +75 -0
  389. package/dist/surface/tools/chat-drives.js +265 -21
  390. package/dist/surface/tools/coverage-tools.d.ts +2 -10
  391. package/dist/surface/tools/coverage-tools.js +2 -53
  392. package/dist/surface/tools/dynamic-tools.js +29 -1
  393. package/dist/surface/tools/empty-session-list.d.ts +10 -0
  394. package/dist/surface/tools/empty-session-list.js +45 -5
  395. package/dist/surface/tools/error-recovery.d.ts +8 -0
  396. package/dist/surface/tools/error-recovery.js +69 -5
  397. package/dist/surface/tools/explore-tools.d.ts +23 -2
  398. package/dist/surface/tools/explore-tools.js +377 -74
  399. package/dist/surface/tools/feedback-tools.d.ts +2 -3
  400. package/dist/surface/tools/feedback-tools.js +4 -3
  401. package/dist/surface/tools/gap-novelty.d.ts +3 -1
  402. package/dist/surface/tools/gap-novelty.js +8 -1
  403. package/dist/surface/tools/harness-explore.d.ts +52 -73
  404. package/dist/surface/tools/harness-explore.js +177 -146
  405. package/dist/surface/tools/harness-gate.d.ts +88 -0
  406. package/dist/surface/tools/harness-gate.js +235 -0
  407. package/dist/surface/tools/harness-hunt.d.ts +43 -0
  408. package/dist/surface/tools/harness-hunt.js +215 -0
  409. package/dist/surface/tools/harness-plan.d.ts +5 -0
  410. package/dist/surface/tools/harness-plan.js +7 -0
  411. package/dist/surface/tools/harness-script.d.ts +22 -0
  412. package/dist/surface/tools/harness-script.js +256 -38
  413. package/dist/surface/tools/harness-tab-guard.d.ts +5 -0
  414. package/dist/surface/tools/harness-tab-guard.js +27 -0
  415. package/dist/surface/tools/harness-toolset.d.ts +8 -0
  416. package/dist/surface/tools/harness-toolset.js +27 -4
  417. package/dist/surface/tools/human-notes.d.ts +16 -0
  418. package/dist/surface/tools/human-notes.js +27 -0
  419. package/dist/surface/tools/invoke-tool.d.ts +5 -2
  420. package/dist/surface/tools/invoke-tool.js +220 -93
  421. package/dist/surface/tools/lease-hint.js +26 -5
  422. package/dist/surface/tools/lease-permissions.d.ts +33 -0
  423. package/dist/surface/tools/lease-permissions.js +73 -0
  424. package/dist/surface/tools/lease-readiness.d.ts +38 -0
  425. package/dist/surface/tools/lease-readiness.js +57 -0
  426. package/dist/surface/tools/lease-seed.d.ts +20 -0
  427. package/dist/surface/tools/lease-seed.js +45 -1
  428. package/dist/surface/tools/lease-tools.d.ts +10 -1
  429. package/dist/surface/tools/lease-tools.js +119 -69
  430. package/dist/surface/tools/live-call-text.js +2 -2
  431. package/dist/surface/tools/merge-tools.js +42 -2
  432. package/dist/surface/tools/merged-name-redirect.js +4 -0
  433. package/dist/surface/tools/next-step.d.ts +11 -1
  434. package/dist/surface/tools/next-step.js +73 -18
  435. package/dist/surface/tools/observe-tools.js +43 -5
  436. package/dist/surface/tools/platform-moment.d.ts +60 -0
  437. package/dist/surface/tools/platform-moment.js +132 -4
  438. package/dist/surface/tools/read-tools.js +65 -14
  439. package/dist/surface/tools/reticle-result.d.ts +120 -0
  440. package/dist/surface/tools/reticle-result.js +364 -0
  441. package/dist/surface/tools/tool-kit.d.ts +68 -2
  442. package/dist/surface/tools/tool-kit.js +73 -1
  443. package/dist/surface/tools/tools.js +25 -13
  444. package/dist/telemetry/account-envelope.d.ts +7 -0
  445. package/dist/telemetry/account-envelope.js +61 -0
  446. package/dist/telemetry/agent-client.d.ts +15 -0
  447. package/dist/telemetry/agent-client.js +57 -0
  448. package/dist/telemetry/app-instrumented.js +9 -2
  449. package/dist/telemetry/argument-shape.d.ts +7 -0
  450. package/dist/telemetry/argument-shape.js +86 -1
  451. package/dist/telemetry/automation-hint.d.ts +2 -3
  452. package/dist/telemetry/automation-hint.js +33 -8
  453. package/dist/telemetry/cli-telemetry.js +7 -2
  454. package/dist/telemetry/daemon-telemetry.js +3 -0
  455. package/dist/telemetry/error-fingerprint.d.ts +10 -1
  456. package/dist/telemetry/error-fingerprint.js +61 -5
  457. package/dist/telemetry/feedback-cli.d.ts +0 -13
  458. package/dist/telemetry/feedback-cli.js +0 -77
  459. package/dist/telemetry/feedback.d.ts +13 -0
  460. package/dist/telemetry/feedback.js +183 -17
  461. package/dist/telemetry/harness-run.d.ts +18 -0
  462. package/dist/telemetry/harness-run.js +80 -0
  463. package/dist/telemetry/hud-events.d.ts +16 -0
  464. package/dist/telemetry/hud-events.js +27 -0
  465. package/dist/telemetry/hud-metrics.d.ts +27 -6
  466. package/dist/telemetry/hud-metrics.js +99 -25
  467. package/dist/telemetry/init-telemetry.js +2 -2
  468. package/dist/telemetry/install-source.d.ts +13 -25
  469. package/dist/telemetry/install-source.js +44 -3
  470. package/dist/telemetry/mcp-connection.d.ts +0 -14
  471. package/dist/telemetry/mcp-connection.js +5 -1
  472. package/dist/telemetry/onboarding-firsts.d.ts +32 -0
  473. package/dist/telemetry/onboarding-firsts.js +81 -6
  474. package/dist/telemetry/platform-linked.d.ts +5 -0
  475. package/dist/telemetry/platform-linked.js +32 -0
  476. package/dist/telemetry/project-profile.js +5 -3
  477. package/dist/telemetry/proxy-telemetry.js +4 -1
  478. package/dist/telemetry/session-metrics.d.ts +15 -4
  479. package/dist/telemetry/session-metrics.js +88 -52
  480. package/dist/telemetry/telemetry.d.ts +26 -2
  481. package/dist/telemetry/telemetry.js +102 -21
  482. package/dist/telemetry/verification-of.d.ts +3 -1
  483. package/dist/telemetry/verification-of.js +12 -4
  484. package/dist/wire-journal.d.ts +2 -2
  485. package/dist/wire-journal.js +16 -5
  486. package/docs/README.md +2 -2
  487. package/docs/actions.mdx +6 -3
  488. package/docs/adapters.md +1 -1
  489. package/docs/agent-cheatsheet.md +24 -27
  490. package/docs/architecture.md +5 -5
  491. package/docs/autodrive.md +13 -12
  492. package/docs/benchmarks.md +5 -5
  493. package/docs/best-practices.mdx +27 -9
  494. package/docs/capabilities.mdx +14 -16
  495. package/docs/cli/affected.mdx +1 -1
  496. package/docs/cli/cloud.mdx +54 -75
  497. package/docs/cli/doctor.mdx +8 -3
  498. package/docs/cli/drive.mdx +12 -12
  499. package/docs/cli/feedback.mdx +3 -3
  500. package/docs/cli/gate.mdx +7 -2
  501. package/docs/cli/help.mdx +50 -55
  502. package/docs/cli/init.mdx +32 -15
  503. package/docs/cli/license.mdx +12 -8
  504. package/docs/cli/mcp.mdx +4 -4
  505. package/docs/cli/open.mdx +3 -3
  506. package/docs/cli/report.mdx +4 -2
  507. package/docs/cli/restart.mdx +2 -2
  508. package/docs/cli/rollback.mdx +14 -8
  509. package/docs/cli/serve.mdx +4 -4
  510. package/docs/cli/setup.mdx +23 -0
  511. package/docs/cli/status.mdx +13 -4
  512. package/docs/cli/stop.mdx +67 -8
  513. package/docs/cli/try.mdx +62 -0
  514. package/docs/cli/update.mdx +4 -3
  515. package/docs/cli/verify.mdx +17 -6
  516. package/docs/cli/version.mdx +3 -2
  517. package/docs/cli.mdx +110 -41
  518. package/docs/debugging.md +3 -3
  519. package/docs/deploy-checks.md +1 -1
  520. package/docs/desktop.mdx +5 -3
  521. package/docs/enterprise.md +11 -10
  522. package/docs/environment.mdx +5 -2
  523. package/docs/faq.mdx +3 -3
  524. package/docs/first-drive.md +5 -4
  525. package/docs/flows.md +35 -27
  526. package/docs/for-agents.md +4 -5
  527. package/docs/frameworks.mdx +32 -21
  528. package/docs/getting-started.md +66 -64
  529. package/docs/human-control.md +15 -14
  530. package/docs/index.mdx +15 -43
  531. package/docs/install-agentic.mdx +22 -37
  532. package/docs/install-manual.mdx +22 -12
  533. package/docs/instrumentation.mdx +5 -3
  534. package/docs/integration-patterns.md +7 -7
  535. package/docs/license-activation.mdx +1 -1
  536. package/docs/multi-agent-testing.md +24 -6
  537. package/docs/packages/babel-plugin.mdx +4 -2
  538. package/docs/packages/browser.mdx +16 -10
  539. package/docs/packages/core.mdx +12 -5
  540. package/docs/packages/electron.mdx +3 -2
  541. package/docs/packages/engine.mdx +1 -1
  542. package/docs/packages/eslint-plugin.mdx +18 -12
  543. package/docs/packages/next.mdx +8 -7
  544. package/docs/packages/open-verification.mdx +1 -1
  545. package/docs/packages/server.mdx +5 -5
  546. package/docs/packages/tauri.mdx +8 -8
  547. package/docs/packages/test.mdx +4 -10
  548. package/docs/packages/vite-plugin.mdx +11 -4
  549. package/docs/packages.mdx +11 -15
  550. package/docs/platform-integration.md +6 -5
  551. package/docs/predicates.mdx +40 -24
  552. package/docs/quickstart.mdx +58 -29
  553. package/docs/required-checks.md +8 -7
  554. package/docs/reticle-manual.md +15 -5
  555. package/docs/skill-file.mdx +17 -79
  556. package/docs/skill-setup.md +9 -9
  557. package/docs/skill.md +200 -0
  558. package/docs/system-map.md +7 -7
  559. package/docs/telemetry.md +22 -24
  560. package/docs/testing.md +4 -4
  561. package/docs/token-efficiency.md +12 -12
  562. package/docs/tools/act-and-wait.mdx +9 -2
  563. package/docs/tools/act-sequence.mdx +6 -7
  564. package/docs/tools/act.mdx +2 -2
  565. package/docs/tools/assert.mdx +18 -17
  566. package/docs/tools/console.mdx +9 -9
  567. package/docs/tools/inspect.mdx +16 -7
  568. package/docs/tools/look.mdx +24 -0
  569. package/docs/tools/navigate.mdx +5 -3
  570. package/docs/tools/network.mdx +2 -2
  571. package/docs/tools/observe.mdx +6 -6
  572. package/docs/tools/overview.mdx +34 -33
  573. package/docs/tools/query.mdx +5 -5
  574. package/docs/tools/session-and-feedback.mdx +13 -4
  575. package/docs/tools/sessions.mdx +8 -8
  576. package/docs/tools/snapshot.mdx +6 -5
  577. package/docs/tools/state.mdx +9 -9
  578. package/docs/tools/tools-and-run.mdx +26 -24
  579. package/docs/tools/verify.mdx +28 -0
  580. package/docs/tools/wait-for.mdx +8 -4
  581. package/docs/troubleshooting.mdx +21 -6
  582. package/docs/usage.md +51 -45
  583. package/docs/use-cases.mdx +3 -3
  584. package/docs/vs-chrome-devtools-mcp.mdx +9 -6
  585. package/docs/vs-playwright-mcp.mdx +3 -1
  586. package/docs/what-is-recorded.md +7 -5
  587. package/docs/what-is-reticle.mdx +2 -2
  588. package/docs/why-reticle.mdx +1 -1
  589. package/package.json +6 -5
  590. package/dist/command/cli/demo/demo-page.d.ts +0 -78
  591. package/dist/command/cli/demo/demo-page.js +0 -249
  592. package/dist/command/cli/demo/demo-run.d.ts +0 -38
  593. package/dist/command/cli/demo/demo-run.js +0 -138
  594. package/dist/judgement/hunt/hunt-report.d.ts +0 -49
  595. package/dist/judgement/hunt/hunt-report.js +0 -84
  596. package/dist/language/flows/buddy-status.d.ts +0 -25
  597. package/dist/language/flows/buddy-status.js +0 -32
  598. package/dist/language/flows/change/watch-batcher.d.ts +0 -18
  599. package/dist/language/flows/change/watch-batcher.js +0 -19
  600. package/dist/memory/cloud/harness-offer.d.ts +0 -44
  601. package/dist/memory/cloud/harness-offer.js +0 -145
  602. package/dist/surface/tools/feature-capture.d.ts +0 -151
  603. package/dist/surface/tools/feature-capture.js +0 -235
  604. package/dist/surface/tools/tool-hit-rate.d.ts +0 -87
  605. package/dist/surface/tools/tool-hit-rate.js +0 -90
  606. package/dist/telemetry/harness-drive.d.ts +0 -4
  607. package/dist/telemetry/harness-drive.js +0 -35
  608. package/dist/telemetry/identify.d.ts +0 -22
  609. package/dist/telemetry/identify.js +0 -73
  610. package/docs/cli/capsules.mdx +0 -70
  611. package/docs/cli/hunt.mdx +0 -73
  612. package/docs/cli/identify.mdx +0 -76
  613. package/docs/cli/kill.mdx +0 -91
  614. package/docs/cli/watch.mdx +0 -62
@@ -0,0 +1,34 @@
1
+ /**
2
+ * The opt-in screen/request check, wired: after an act_and_wait, compare what the window's write
3
+ * requests carried with the values the page's form controls show (engine: screen-request.ts).
4
+ *
5
+ * OPT-IN (`RETICLE_SCREEN_REQUEST_CHECK=1`) and ADVISORY. It ships behind the flag until its
6
+ * false-alarm rate is measured at zero on the e2e battery, the benchmark and the persona fixtures;
7
+ * until then it must cost nothing for anyone who did not ask. It runs AFTER the verdict is decided
8
+ * and is appended to `contradictions` as an advisory kind, so it can never move a verdict.
9
+ */
10
+ import { type Contradiction, type ReticleEvent } from '@reticlehq/core';
11
+ import type { Session } from '../../../portal/session/session.js';
12
+ export declare const SCREEN_REQUEST_CHECK_ENV = "RETICLE_SCREEN_REQUEST_CHECK";
13
+ export interface SentBody {
14
+ method: string;
15
+ url: string;
16
+ /** The request body as sent (JSON text). */
17
+ body: string;
18
+ }
19
+ export interface ShownControl {
20
+ /** `name` or `id` attribute — the only link from a control to a field. */
21
+ field: string;
22
+ /** The control's current value (a select's selected option value, an input's text). */
23
+ value: string;
24
+ /** What the user sees, when it differs from the value (a select's option label). */
25
+ label?: string | undefined;
26
+ ref?: string | undefined;
27
+ }
28
+ export declare function screenRequestMismatches(sent: readonly SentBody[], controls: readonly ShownControl[]): Contradiction[];
29
+ /** Advisory findings for this window, or none when the check is off or nothing was written. */
30
+ export declare function screenRequestFindings(session: Session, windowEvents: readonly ReticleEvent[]): Promise<Contradiction[]>;
31
+ /** The `contradictions` field: the verdict's own, then any advisory ones; omitted when both are empty. */
32
+ export declare function withAdvisories(decided: readonly Contradiction[], advisory: readonly Contradiction[]): {
33
+ contradictions?: Contradiction[];
34
+ };
@@ -0,0 +1,113 @@
1
+ /**
2
+ * The opt-in screen/request check, wired: after an act_and_wait, compare what the window's write
3
+ * requests carried with the values the page's form controls show (engine: screen-request.ts).
4
+ *
5
+ * OPT-IN (`RETICLE_SCREEN_REQUEST_CHECK=1`) and ADVISORY. It ships behind the flag until its
6
+ * false-alarm rate is measured at zero on the e2e battery, the benchmark and the persona fixtures;
7
+ * until then it must cost nothing for anyone who did not ask. It runs AFTER the verdict is decided
8
+ * and is appended to `contradictions` as an advisory kind, so it can never move a verdict.
9
+ */
10
+ import { ContradictionKind, EventType, REDACTED_VALUE, ReticleCommand, } from '@reticlehq/core';
11
+ export const SCREEN_REQUEST_CHECK_ENV = 'RETICLE_SCREEN_REQUEST_CHECK';
12
+ const READ_METHODS = new Set(['GET', 'HEAD', 'OPTIONS']);
13
+ /** The form controls whose value a request can carry. */
14
+ const CONTROL_ROLES = ['combobox', 'listbox', 'textbox', 'spinbutton'];
15
+ function primitiveFields(body) {
16
+ const out = new Map();
17
+ try {
18
+ const parsed = JSON.parse(body);
19
+ if ('object' !== typeof parsed || null === parsed || Array.isArray(parsed))
20
+ return out;
21
+ for (const [key, value] of Object.entries(parsed)) {
22
+ if ('string' === typeof value || 'number' === typeof value || 'boolean' === typeof value) {
23
+ out.set(key.toLowerCase(), String(value));
24
+ }
25
+ }
26
+ }
27
+ catch {
28
+ // Not JSON: nothing comparable, so nothing reported.
29
+ }
30
+ return out;
31
+ }
32
+ function pathOf(url) {
33
+ try {
34
+ return new URL(url, 'http://local.invalid').pathname;
35
+ }
36
+ catch {
37
+ return url;
38
+ }
39
+ }
40
+ export function screenRequestMismatches(sent, controls) {
41
+ const out = [];
42
+ for (const request of sent) {
43
+ const fields = primitiveFields(request.body);
44
+ if (0 === fields.size)
45
+ continue;
46
+ for (const control of controls) {
47
+ const key = control.field.toLowerCase();
48
+ const carried = fields.get(key);
49
+ if (carried === undefined || carried === control.value)
50
+ continue;
51
+ const shown = control.label !== undefined && control.label !== control.value
52
+ ? `"${control.label}" (value "${control.value}")`
53
+ : `"${control.value}"`;
54
+ out.push({
55
+ kind: ContradictionKind.SCREEN_REQUEST_MISMATCH,
56
+ claim: `the screen's "${control.field}" control shows ${shown}`,
57
+ counter: `${request.method.toUpperCase()} ${pathOf(request.url)} sent ${control.field}=${JSON.stringify(carried)}`,
58
+ detail: `${control.ref === undefined ? '' : `${control.ref} `}${control.field}: shown ${shown}, sent ${JSON.stringify(carried)}`,
59
+ });
60
+ }
61
+ }
62
+ return out;
63
+ }
64
+ function sentBodies(events) {
65
+ return events.flatMap((event) => {
66
+ if (EventType.NET_REQUEST !== event.type)
67
+ return [];
68
+ const raw = event.data['method'];
69
+ const method = ('string' === typeof raw ? raw : 'GET').toUpperCase();
70
+ const body = event.data['requestBody'];
71
+ const url = event.data['url'];
72
+ if (READ_METHODS.has(method) || 'string' !== typeof body || 'string' !== typeof url)
73
+ return [];
74
+ return [{ method, url, body }];
75
+ });
76
+ }
77
+ async function shownControls(session) {
78
+ const out = [];
79
+ for (const role of CONTROL_ROLES) {
80
+ const res = await session.command(ReticleCommand.MATCH, {
81
+ query: { role, attrs: ['name', 'id'] },
82
+ });
83
+ if (!res.ok)
84
+ continue;
85
+ for (const el of res.result?.elements ?? []) {
86
+ const field = el.attrs?.['name'] ?? el.attrs?.['id'];
87
+ // No value read, or a redacted one: nothing to compare, so nothing is guessed.
88
+ if (field === undefined || el.value === undefined || REDACTED_VALUE === el.value)
89
+ continue;
90
+ out.push({ field, value: el.value, ref: el.ref });
91
+ }
92
+ }
93
+ return out;
94
+ }
95
+ /** Advisory findings for this window, or none when the check is off or nothing was written. */
96
+ export async function screenRequestFindings(session, windowEvents) {
97
+ if ('1' !== process.env[SCREEN_REQUEST_CHECK_ENV])
98
+ return [];
99
+ const sent = sentBodies(windowEvents);
100
+ if (0 === sent.length)
101
+ return [];
102
+ try {
103
+ return screenRequestMismatches(sent, await shownControls(session));
104
+ }
105
+ catch {
106
+ return [];
107
+ }
108
+ }
109
+ /** The `contradictions` field: the verdict's own, then any advisory ones; omitted when both are empty. */
110
+ export function withAdvisories(decided, advisory) {
111
+ const all = [...decided, ...advisory];
112
+ return 0 === all.length ? {} : { contradictions: all };
113
+ }
@@ -40,6 +40,12 @@ export interface StepExpectation {
40
40
  * filter act_and_wait applies. A held step with one is a UI that advanced over a failed write.
41
41
  */
42
42
  contradicted?: readonly string[];
43
+ /**
44
+ * Why this step could not be judged at all: its target was missing (nothing was acted on), the
45
+ * page left the app and the observation went with it, or the predicate could not be read. Such a
46
+ * step is undecided, never a miss — `unknown`, as act_and_wait says.
47
+ */
48
+ undecided?: string;
43
49
  }
44
50
  export interface SequenceGrade {
45
51
  verified: Verified;
@@ -80,5 +86,7 @@ export declare function gradeSequence(steps: readonly StepExpectation[], plan?:
80
86
  * two-of-twelve plan as a regression flow is a reasonable thing to do and a bad thing to do without
81
87
  * knowing it.
82
88
  */
89
+ /** The stopped recording a proved journey is held under, so the `keep` offer can be taken. */
90
+ export declare const JOURNEY_RECORDING = "last-journey";
83
91
  export declare function offerToKeep(grade: SequenceGrade): string | undefined;
84
92
  export {};
@@ -29,7 +29,7 @@ export function gradeSequence(steps, plan = { planned: steps.length, dispatched:
29
29
  const declared = declaring.length;
30
30
  // `held: false` on an undeclared step means it could not be performed at all — the journey broke
31
31
  // there whether or not anything was declared about it.
32
- const missed = steps.find((step) => (step.declared ? true !== step.held : false === step.held));
32
+ const missed = steps.find((step) => step.undecided === undefined && (step.declared ? true !== step.held : false === step.held));
33
33
  // A miss decides the grade before coverage does. How much of the plan declared nothing is
34
34
  // context on a red, never a softening of it.
35
35
  if (missed !== undefined) {
@@ -52,6 +52,15 @@ export function gradeSequence(steps, plan = { planned: steps.length, dispatched:
52
52
  because: `step ${String(contradictedAt + 1)}: channels disagree about this action (${kinds}) even though it went on`,
53
53
  };
54
54
  }
55
+ // Nothing failed that was seen: a step nobody could judge leaves the plan undecided, saying why.
56
+ const unjudged = steps.find((step) => step.undecided !== undefined);
57
+ if (unjudged !== undefined)
58
+ return {
59
+ verified: Verified.UNKNOWN,
60
+ declared,
61
+ total,
62
+ because: `a step could not be judged — ${unjudged.undecided ?? ''}`,
63
+ };
55
64
  /*
56
65
  * `unknown` rather than `no-fault`, and the distinction is load-bearing.
57
66
  *
@@ -125,11 +134,13 @@ export function gradeSequence(steps, plan = { planned: steps.length, dispatched:
125
134
  * two-of-twelve plan as a regression flow is a reasonable thing to do and a bad thing to do without
126
135
  * knowing it.
127
136
  */
137
+ /** The stopped recording a proved journey is held under, so the `keep` offer can be taken. */
138
+ export const JOURNEY_RECORDING = 'last-journey';
128
139
  export function offerToKeep(grade) {
129
140
  if (grade.verified !== Verified.YES || 0 === grade.declared)
130
141
  return undefined;
131
142
  return (`this plan proved something (${String(grade.declared)} of ${String(grade.total)} steps declared a ` +
132
143
  'consequence and every one held) — keep it as a regression flow with ' +
133
- 'reticle_flow_save { saveAs: "<name>" }, and the steps that declared nothing will replay ' +
144
+ `reticle_flow_save { flowName: "${JOURNEY_RECORDING}", saveAs: "<name>" }, and the steps that declared nothing will replay ` +
134
145
  'without proving anything, exactly as they did here');
135
146
  }
@@ -12,22 +12,28 @@
12
12
  import { z } from 'zod';
13
13
  import { timeoutMsSchema } from './args/numeric-bounds.js';
14
14
  import { compileSequenceStep, pathOf } from '../../language/flows/replay.js';
15
+ import { DEFAULT_SEQUENCE_STEP_TIMEOUT_MS } from '../../language/flows/flow-step-runners.js';
15
16
  import { sequenceStepArgs } from './act/act-preflight.js';
16
- import { ReticleTool } from '@reticlehq/core';
17
+ import { REPLAY_PROGRAM_VERSION, ReticleTool, Verified, VerifiedReason, } from '@reticlehq/core';
17
18
  import { healthEnvelope } from '../../portal/session/session-health.js';
18
19
  import { pausedShortCircuit, pausedOutputShape, withControl, } from '../../portal/session/control-envelope.js';
19
20
  import { asRecord, isAbsenceDerived, isAdvisory } from '@reticlehq/core';
20
21
  import { sessionIdFromArgs } from './tools-helpers.js';
21
22
  import { describeStepResult, runStepWithStaleRetry } from './act/act-sequence-retry.js';
22
23
  import { assertSequenceSteps } from './act/act-preflight.js';
23
- import { sessionIdShape } from './tool-kit.js';
24
+ import { EnvelopeKey, sessionIdShape } from './tool-kit.js';
25
+ import { takeStepShot } from '../../features/visual/step-shots.js';
24
26
  import { actCommand } from './act-tools.js';
25
27
  import { PredicateSchema, waitForPredicate, } from '@reticlehq/engine/question/predicate/predicate.js';
26
- import { DeviationMode, gradeSequence, offerToKeep, } from './act/sequence-grade.js';
28
+ import { DeviationMode, gradeSequence, JOURNEY_RECORDING, offerToKeep, } from './act/sequence-grade.js';
27
29
  import { stepEffect } from '@reticlehq/engine/evidence/step-effect.js';
28
30
  // resolveActTarget moved out of act-tools into its own module on this branch; #706 was written
29
31
  // against the older layout where act-tools re-exported it.
30
32
  import { resolveActTarget } from './act/act-target.js';
33
+ import { gradeOfPredicate } from './assert/assert-grade.js';
34
+ import { describeWaitTarget } from '@reticlehq/engine/evidence/unsettled.js';
35
+ import { sourceOf } from './tools-helpers.js';
36
+ import { confirmedByDeclaration } from './act/act-danger.js';
31
37
  /**
32
38
  * The step's effect record, best-effort.
33
39
  *
@@ -45,6 +51,38 @@ function effectOf(session, since) {
45
51
  return {};
46
52
  }
47
53
  }
54
+ /** The verdict effect for one step: the same rules act_and_wait applies to one action. */
55
+ function stepVerdictEffect(check) {
56
+ const { verified, reason } = check.held
57
+ ? 0 < check.contradicted.length
58
+ ? { verified: Verified.NO, reason: VerifiedReason.CONTRADICTED }
59
+ : { verified: Verified.YES, reason: undefined }
60
+ : check.undecided
61
+ ? { verified: Verified.UNKNOWN, reason: VerifiedReason.OBSERVATION_LOST }
62
+ : { verified: Verified.NO, reason: VerifiedReason.ASSERTION_FAILED };
63
+ const source = sourceOf(check.source);
64
+ return {
65
+ claim: describeWaitTarget(check.expect),
66
+ verified,
67
+ ...(source === undefined ? {} : { source: `${source.file}:${String(source.line)}` }),
68
+ ...(check.expected === undefined ? {} : { expected: check.expected }),
69
+ ...(check.observed === undefined ? {} : { observed: check.observed }),
70
+ // Named in the step before the step ran — a check, not a rationalisation.
71
+ declaredBeforeActing: true,
72
+ grade: gradeOfPredicate(check.expect),
73
+ kind: check.expect.kind,
74
+ ...(reason === undefined ? {} : { reason }),
75
+ };
76
+ }
77
+ /** One step's check, journaled best-effort: the record must never fail the drive it records. */
78
+ function journalStep(session, args, effect) {
79
+ try {
80
+ session.recordAction(ReticleTool.ACT_SEQUENCE, args, effect);
81
+ }
82
+ catch {
83
+ // ponytail: a session without a journal (a test double, journaling off) keeps no check.
84
+ }
85
+ }
48
86
  /**
49
87
  * Ceiling for a burst gap. Past this it is not a burst, it is a paced walk.
50
88
  *
@@ -57,6 +95,8 @@ function effectOf(session, since) {
57
95
  * number: read its own slow endpoint.
58
96
  */
59
97
  const BURST_MAX_GAP_MS = 500;
98
+ /** A step error that means nothing was acted on, or the page went away with the observation. */
99
+ const UNJUDGED_STEP = /matched no element|no longer resolves|session disconnected|session (was )?replaced/i;
60
100
  export const ACT_SEQUENCE_TOOL = {
61
101
  name: ReticleTool.ACT_SEQUENCE,
62
102
  // The example is required for a core tool, and this one carries weight: the loop it replaces is
@@ -96,6 +136,8 @@ export const ACT_SEQUENCE_TOOL = {
96
136
  since: z.number(),
97
137
  dispatched: z.boolean(),
98
138
  completed: z.number(),
139
+ /** Number of steps included in the saved recording, when a recording was created. */
140
+ recorded: z.number(),
99
141
  stalled_at: z.number().optional(),
100
142
  /** Index of the step whose declared consequence did not hold, when one did not. */
101
143
  stopped_at: z.number().optional(),
@@ -137,8 +179,17 @@ export const ACT_SEQUENCE_TOOL = {
137
179
  try {
138
180
  const inputSteps = Array.isArray(args['steps']) ? args['steps'] : [];
139
181
  assertSequenceSteps(inputSteps);
140
- const perStepTimeout = 'number' === typeof args['timeout_ms'] ? args['timeout_ms'] : 8000;
182
+ const perStepTimeout = 'number' === typeof args['timeout_ms']
183
+ ? args['timeout_ms']
184
+ : DEFAULT_SEQUENCE_STEP_TIMEOUT_MS;
141
185
  const stepResults = [];
186
+ // Every step leaves a picture of the page as its outcome was decided — see step-shots.ts.
187
+ const pushStep = async (row) => {
188
+ stepResults.push({
189
+ ...row,
190
+ [EnvelopeKey.SCREENSHOT]: await takeStepShot(deps, session.id, ReticleTool.ACT),
191
+ });
192
+ };
142
193
  const expectations = [];
143
194
  // `true` means the default window; a number means that window exactly. 0 is legal and means
144
195
  // "no settle at all" — useful only when the app issues its request synchronously.
@@ -181,9 +232,9 @@ export const ACT_SEQUENCE_TOOL = {
181
232
  // race rAF and return early anyway — a budget is a CEILING, not a floor, which is
182
233
  // why an earlier attempt to pace with `settleMs` alone produced a 12ms step and
183
234
  // no race at all.
184
- args: burstGapMs === undefined
185
- ? sequenceStepArgs(step)
186
- : { ...sequenceStepArgs(step), settleMs: 0 },
235
+ // A step that names its dangerous control and declares its consequence is
236
+ // confirmed by that declaration, as act_and_wait is — see confirmedByDeclaration.
237
+ args: ((stepArgs) => burstGapMs === undefined ? stepArgs : { ...stepArgs, settleMs: 0 })(confirmedByDeclaration(sequenceStepArgs(step), step['target'], step['expect'] !== undefined)),
187
238
  }, perStepTimeout);
188
239
  }, session, since, perStepTimeout);
189
240
  // Hold the gap BEFORE the next dispatch, measured from this step's own start so the
@@ -197,16 +248,19 @@ export const ACT_SEQUENCE_TOOL = {
197
248
  }
198
249
  if (!outcome.ok) {
199
250
  stalledAt = i;
200
- stepResults.push({
251
+ await pushStep({
201
252
  ref: step['ref'],
202
253
  action: step['action'],
203
254
  dispatched: false,
204
255
  error: outcome.error ?? 'step failed',
205
256
  });
257
+ const error = outcome.error ?? 'the step could not be performed';
206
258
  expectations.push({
207
259
  declared: undefined !== step['expect'],
208
260
  held: false,
209
- observed: outcome.error ?? 'the step could not be performed',
261
+ observed: error,
262
+ // Nothing acted on, or the page gone with the observation: undecided, not a miss.
263
+ ...(UNJUDGED_STEP.test(error) ? { undecided: error } : {}),
210
264
  });
211
265
  break;
212
266
  }
@@ -218,10 +272,13 @@ export const ACT_SEQUENCE_TOOL = {
218
272
  * cannot be read. Sharing the builder is what makes that true by construction rather than
219
273
  * by two implementations agreeing today.
220
274
  */
221
- const described = {
275
+ const describe = () => ({
222
276
  ...describeStepResult(step, asRecord(outcome.result)),
223
277
  ...effectOf(session, stepSince),
224
- };
278
+ });
279
+ const deciding = (step) => (step.contradictions ?? [])
280
+ .map((c) => c.kind)
281
+ .filter((kind) => !isAdvisory(kind) && !isAbsenceDerived(kind));
225
282
  /*
226
283
  * Evaluate what the step SAID it would cause, in the window this step opened.
227
284
  *
@@ -230,29 +287,61 @@ export const ACT_SEQUENCE_TOOL = {
230
287
  * satisfy step four's assertion, which is a false green built out of correct parts.
231
288
  */
232
289
  const parsed = PredicateSchema.safeParse(step['expect']);
233
- const contradicted = (described.contradictions ?? [])
234
- .map((c) => c.kind)
235
- .filter((kind) => !isAdvisory(kind) && !isAbsenceDerived(kind));
236
- const disagreement = 0 === contradicted.length ? {} : { contradicted };
237
290
  if (!parsed.success) {
238
- expectations.push({ declared: false, ...disagreement });
239
- stepResults.push(described);
291
+ const described = describe();
292
+ const contradicted = deciding(described);
293
+ expectations.push({
294
+ declared: false,
295
+ ...(0 === contradicted.length ? {} : { contradicted }),
296
+ });
297
+ await pushStep(described);
240
298
  }
241
299
  else {
242
300
  const verdict = await waitForPredicate(session, parsed.data, perStepTimeout, stepSince);
301
+ // Described over the window the verdict was taken in, not the dispatch window before it:
302
+ // a step that waited 1.5s for its declared 200 reported that request "still in flight"
303
+ // beside `held: true`, a contradiction about a moment the verdict was not taken at.
304
+ const described = describe();
305
+ const contradicted = deciding(described);
306
+ const disagreement = 0 === contradicted.length ? {} : { contradicted };
243
307
  const held = true === verdict.pass;
308
+ // A tab that went away (an external checkout page) or a predicate that could not be
309
+ // read decided nothing: unknown, never a miss blamed on the app.
310
+ const undecided = !held && (true === verdict.observationLost || verdict.inconclusive !== undefined);
311
+ // One check per declared step, journaled as act_and_wait journals its own, so the
312
+ // session's result, its run file and the dashboard all count it. See sequence-journal.ts.
313
+ journalStep(session, { step: i, expect: step['expect'] }, stepVerdictEffect({
314
+ expect: parsed.data,
315
+ held,
316
+ undecided,
317
+ contradicted,
318
+ expected: verdict.expected,
319
+ observed: held ? undefined : (verdict.observed ?? verdict.failureReason),
320
+ source: asRecord(outcome.result)['source'],
321
+ }));
244
322
  expectations.push({
245
323
  declared: true,
246
324
  held,
325
+ ...(undecided
326
+ ? {
327
+ undecided: true === verdict.observationLost
328
+ ? `${verdict.failureReason ?? 'the observation was lost'} (the page left)`
329
+ : (verdict.failureReason ?? 'the predicate could not be read'),
330
+ }
331
+ : {}),
247
332
  ...disagreement,
248
333
  ...(verdict.observed === undefined ? {} : { observed: verdict.observed }),
249
334
  ...(verdict.expected === undefined ? {} : { expected: verdict.expected }),
250
335
  });
251
- stepResults.push({
336
+ await pushStep({
252
337
  ...described,
253
338
  expected: verdict.expected ?? true,
254
339
  held,
255
340
  ...(held ? {} : { observed: verdict.observed ?? verdict.failureReason }),
341
+ // What would have held, on a case-only miss — the verdict stays a miss.
342
+ ...(true === verdict.caseOnlyMiss
343
+ ? { caseOnlyMiss: true, wouldHold: verdict.wouldHold }
344
+ : {}),
256
345
  });
257
346
  if (!held) {
258
347
  stoppedAt ??= i;
@@ -263,7 +352,7 @@ export const ACT_SEQUENCE_TOOL = {
263
352
  }
264
353
  catch (err) {
265
354
  stalledAt = i;
266
- stepResults.push({
355
+ await pushStep({
267
356
  ref: step['ref'],
268
357
  action: step['action'],
269
358
  dispatched: null,
@@ -285,24 +374,30 @@ export const ACT_SEQUENCE_TOOL = {
285
374
  * The halted step counts: it WAS dispatched, and only the consequence it declared failed
286
375
  * afterwards. A stalled step never ran, which is why that index stays exclusive.
287
376
  */
288
- const completed = stoppedAt !== undefined ? stoppedAt + 1 : (stalledAt ?? inputSteps.length);
377
+ const completed = DeviationMode.CONTINUE === onDeviation
378
+ ? (stalledAt ?? inputSteps.length)
379
+ : stoppedAt !== undefined
380
+ ? stoppedAt + 1
381
+ : (stalledAt ?? inputSteps.length);
289
382
  if (completed > 0) {
290
383
  session.lastAct.markActed(since, undefined, undefined);
291
384
  }
292
385
  // Same as captureAct: no `active()` gate, so a sequence driven with nothing open still lands
293
- // in the ambient tape. A stalled plan is still excluded — those steps never ran.
294
- if (stalledAt === undefined) {
386
+ // in the ambient tape. A stalled plan keeps only the prefix whose steps actually ran.
387
+ let journey;
388
+ if (completed > 0) {
295
389
  // A sub-step keeps its `expect` only if it held — same rule as act_and_wait, so a flow
296
390
  // never replays an expectation that was never once observed to hold.
297
- const proved = inputSteps.map((raw, i) => {
391
+ const proved = inputSteps.slice(0, completed).map((raw, i) => {
298
392
  const step = asRecord(raw);
299
393
  const { expect: _expect, ...rest } = step;
300
394
  return true === expectations[i]?.held ? step : rest;
301
395
  });
302
396
  const recorded = compileSequenceStep({ ...args, steps: proved }, {
303
- count: inputSteps.length,
304
- steps: stepResults,
397
+ count: completed,
398
+ steps: stepResults.slice(0, completed),
305
399
  });
400
+ journey = recorded;
306
401
  deps.recordings.capture(pageBefore === undefined ? recorded : { ...recorded, page: pageBefore }, undefined, session.id);
307
402
  deps.recordings.markEnded(pathOf(session.url), session.id);
308
403
  }
@@ -317,12 +412,26 @@ export const ACT_SEQUENCE_TOOL = {
317
412
  planned: inputSteps.length,
318
413
  dispatched: completed > 0,
319
414
  });
320
- const ran = stoppedAt ?? stalledAt ?? inputSteps.length;
321
- const tail = inputSteps.slice(ran + (stoppedAt === undefined ? 0 : 1));
415
+ // The journey a `keep` offer names, held as a stopped recording so `reticle_flow_save
416
+ // { flowName: JOURNEY_RECORDING, saveAs }` saves exactly what was just driven. The offer used
417
+ // to name a save that refused with no recording, a dead end that cost a round trip.
418
+ if (journey !== undefined && offerToKeep(grade) !== undefined) {
419
+ deps.recordings.saveCompiled({
420
+ name: JOURNEY_RECORDING,
421
+ version: REPLAY_PROGRAM_VERSION,
422
+ steps: [journey],
423
+ ...(pageBefore === undefined ? {} : { startPath: pageBefore }),
424
+ });
425
+ }
426
+ const tailStart = DeviationMode.HALT === onDeviation && stoppedAt !== undefined
427
+ ? stoppedAt + 1
428
+ : (stalledAt ?? inputSteps.length);
429
+ const tail = inputSteps.slice(tailStart);
322
430
  return withControl(session, {
323
431
  since,
324
432
  dispatched: completed > 0,
325
433
  completed,
434
+ recorded: journey === undefined ? 0 : completed,
326
435
  ...(stalledAt !== undefined ? { stalled_at: stalledAt } : {}),
327
436
  ...(stoppedAt !== undefined ? { stopped_at: stoppedAt } : {}),
328
437
  verified: grade.verified,
@@ -1,12 +1,3 @@
1
- /**
2
- * Action tools — reticle_act and reticle_act_and_wait. Split out of tools.ts to keep that file under
3
- * the line cap and assembled back into the tool list there via ...ACT_TOOLS; the native-input attempt
4
- * itself lives in real-input-attempt.ts for the same reason.
5
- *
6
- * `reticle_act_sequence` is a sibling file and is assembled by `tools.ts` directly. It used to be
7
- * re-exported through this list, which made a cycle out of nothing: that file needs `actCommand` from
8
- * here, and a registry is the right place to collect a definition from.
9
- */
10
1
  import type { Session } from '../../portal/session/session.js';
11
2
  import { type ToolDef, type ToolDeps } from './tool-kit.js';
12
3
  /**