@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
@@ -25,7 +25,14 @@ export interface NarrowWritePort {
25
25
  resolvePath: (name: string, projectId?: ProjectId) => Promise<string | null>;
26
26
  write: (path: string, contents: string) => Promise<void>;
27
27
  serialize: (flow: FlowFile) => string;
28
+ /** The file as it is on disk, so a change lands in it and nothing else moves. */
29
+ readRaw?: (path: string) => Promise<string>;
28
30
  }
31
+ /**
32
+ * `raw` with only what changed between `before` and `after` applied, everything else as written:
33
+ * its key order, its fields the reader fills in by default, its own spelling. Pure.
34
+ */
35
+ export declare function withChangesOnly(raw: unknown, before: unknown, after: unknown): unknown;
29
36
  export declare function changeInPlace<T>(port: NarrowWritePort, name: string, projectId: ProjectId | undefined, change: (flow: FlowFile) => {
30
37
  next: FlowFile;
31
38
  value: T;
@@ -2,6 +2,28 @@ import { FlowErrorCode, FlowFileSchema } from '@reticlehq/core';
2
2
  import { describeFlowZodFailure } from './flow-expect-grammar.js';
3
3
  import { isValidFlowName } from '../../memory/project/dir/reticle-dir.js';
4
4
  import { safeProjectId } from './flow-result.js';
5
+ const isPlain = (v) => 'object' === typeof v && null !== v && !Array.isArray(v);
6
+ const same = (a, b) => JSON.stringify(a) === JSON.stringify(b);
7
+ /**
8
+ * `raw` with only what changed between `before` and `after` applied, everything else as written:
9
+ * its key order, its fields the reader fills in by default, its own spelling. Pure.
10
+ */
11
+ export function withChangesOnly(raw, before, after) {
12
+ if (Array.isArray(raw) && Array.isArray(before) && Array.isArray(after))
13
+ return raw.length === before.length && before.length === after.length
14
+ ? raw.map((item, i) => withChangesOnly(item, before[i], after[i]))
15
+ : after;
16
+ if (!isPlain(raw) || !isPlain(before) || !isPlain(after))
17
+ return after;
18
+ const out = { ...raw };
19
+ for (const key of Object.keys(after))
20
+ if (!same(after[key], before[key]))
21
+ out[key] = key in raw ? withChangesOnly(raw[key], before[key], after[key]) : after[key];
22
+ for (const key of Object.keys(before))
23
+ if (!(key in after))
24
+ delete out[key];
25
+ return out;
26
+ }
5
27
  export async function changeInPlace(port, name, projectId, change) {
6
28
  if (!isValidFlowName(name))
7
29
  return { ok: false, code: FlowErrorCode.INVALID_NAME };
@@ -21,6 +43,19 @@ export async function changeInPlace(port, name, projectId, change) {
21
43
  detail: describeFlowZodFailure(parsed.error),
22
44
  };
23
45
  }
24
- await port.write(path, port.serialize(parsed.data));
46
+ // A replay that learned nothing new leaves a committed file alone: every replay used to rewrite
47
+ // it (keys reordered, defaults written in), and `git status` called it modified.
48
+ if (port.serialize(parsed.data) === port.serialize(loaded.value))
49
+ return { ok: true, value };
50
+ let raw;
51
+ try {
52
+ raw = JSON.parse((await port.readRaw?.(path)) ?? 'null');
53
+ }
54
+ catch {
55
+ raw = null;
56
+ }
57
+ await port.write(path, isPlain(raw)
58
+ ? `${JSON.stringify(withChangesOnly(raw, loaded.value, parsed.data), null, 2)}\n`
59
+ : port.serialize(parsed.data));
25
60
  return { ok: true, value };
26
61
  }
@@ -27,6 +27,19 @@ function recordingRouteOf(pathname, hash = '') {
27
27
  return routePathOf(0 === pathname.length ? '/' : pathname, fragment);
28
28
  return pathname;
29
29
  }
30
+ /**
31
+ * A startPath as a page key: its query dropped, hash kept. A startPath keeps the app's query so
32
+ * replay starts on the filtered page (#1411), but a ROUTE_CHANGE contributes only pathname and
33
+ * hash, so `/products?scope=X` then `/checkout` then `/products` must compare the first and last
34
+ * as one page or the backtrack goes unseen.
35
+ */
36
+ function pageKeyOf(startPath) {
37
+ const hashAt = startPath.indexOf('#');
38
+ const queryAt = startPath.indexOf('?');
39
+ if (queryAt < 0 || (hashAt >= 0 && queryAt > hashAt))
40
+ return startPath;
41
+ return startPath.slice(0, queryAt) + (hashAt >= 0 ? startPath.slice(hashAt) : '');
42
+ }
30
43
  function collapseConsecutive(routes) {
31
44
  const out = [];
32
45
  for (const route of routes) {
@@ -60,7 +73,7 @@ export function recordingBacktrackWarning(routes) {
60
73
  export function routesFromRecording(startPath, events) {
61
74
  const raw = [];
62
75
  if (undefined !== startPath)
63
- raw.push(recordingRouteOf(startPath));
76
+ raw.push(recordingRouteOf(pageKeyOf(startPath)));
64
77
  for (const event of events) {
65
78
  if (EventType.ROUTE_CHANGE !== event.type)
66
79
  continue;
@@ -7,6 +7,8 @@ export interface RecordedStep {
7
7
  args: Record<string, unknown>;
8
8
  /** false if any ref could not be normalized to a testid (replay only valid in-session). */
9
9
  stable: boolean;
10
+ /** The caller's per-step wait budget, when one was explicitly provided. */
11
+ timeoutMs?: number;
10
12
  /** Optional post-condition annotation carried into the on-disk flow's expect. */
11
13
  expect?: Predicate;
12
14
  /**
@@ -27,6 +29,12 @@ export interface RecordedStep {
27
29
  * `invoke` first and treats the step as a call.
28
30
  */
29
31
  invoke?: string;
32
+ /**
33
+ * Network mocks were active on this step's tab when it ran. RECORDER-INTERNAL, ambient tape only,
34
+ * like `route`: a journey that ran against mocked responses replays against the real backend,
35
+ * so it is not auto-saved (#1459).
36
+ */
37
+ mocked?: true;
30
38
  /** The page this step ran on. Written to the saved step (unlike `route`, which cuts journeys). */
31
39
  page?: string;
32
40
  /** The page it ended on once it settled — see `markEnded`. */
@@ -51,6 +59,11 @@ interface ActiveRecording {
51
59
  steps: RecordedStep[];
52
60
  /** The route the journey began on. See CompiledProgram.startPath. */
53
61
  startPath?: string;
62
+ /**
63
+ * The document the tab was on at start. A full-page load makes a new one even when the SDK keeps
64
+ * its session id, and its clock is from a different connection, so this is how stop tells (#1411).
65
+ */
66
+ document?: string;
54
67
  /**
55
68
  * For each recording that was ALREADY in flight when this one started, how many steps it had.
56
69
  *
@@ -101,12 +114,20 @@ export declare const INVOKE_TOOL: string;
101
114
  * buffer.
102
115
  */
103
116
  export declare const AMBIENT_RECORDING = "__ambient__";
117
+ /**
118
+ * One ambient tape per tab. It was one for the whole daemon, so a drive in ANOTHER app (the console
119
+ * beside the repo's own app) was cut into a flow and saved into this repo's committed `flows/`, and
120
+ * synced to its project. A tape now holds one tab's steps, and that tab's end takes only its own.
121
+ */
122
+ export declare const ambientRecordingOf: (session: string | undefined) => string;
123
+ /** Whether a recording is an ambient tape: the daemon's own, never one somebody opened. */
124
+ export declare const isAmbient: (name: string) => boolean;
104
125
  export declare class RecordingStore {
105
126
  #private;
106
127
  private readonly byHarness;
107
128
  /** `byHarness`: whether the step being captured was driven by the Harness, which tapes its own. */
108
129
  constructor(byHarness?: () => boolean);
109
- start(name: string, cursor: number, startPath?: string, session?: string): void;
130
+ start(name: string, cursor: number, startPath?: string, session?: string, document?: string): void;
110
131
  isRecording(name: string): boolean;
111
132
  /**
112
133
  * Number of steps captured so far in the named ACTIVE recording (0 if it
@@ -127,6 +148,11 @@ export declare class RecordingStore {
127
148
  * Opened lazily on the first step rather than in the constructor: a store that never records
128
149
  * anything should not carry an empty tape, and "did anything happen at all" stays answerable.
129
150
  */
151
+ /**
152
+ * Whether a tab has network mocks installed from now on. Each ambient step on it is marked while
153
+ * they are, so the journey it belongs to is not auto-saved as a flow (#1459).
154
+ */
155
+ markMocked(session: string | undefined, active: boolean): void;
130
156
  capture(step: RecordedStep, route?: string, session?: string): void;
131
157
  /**
132
158
  * Add a consequence to the last captured step of every active recording.
@@ -176,6 +202,8 @@ export declare class RecordingStore {
176
202
  saveCompiled(program: CompiledProgram): void;
177
203
  getCompiled(name: string): CompiledProgram | undefined;
178
204
  active(): string[];
205
+ /** The ambient tape of one tab (or of steps no tab named), taken: what its session end saves. */
206
+ takeAmbient(session: string | undefined): ActiveRecording | undefined;
179
207
  /**
180
208
  * Names of recordings that have been STOPPED and compiled.
181
209
  *
@@ -20,6 +20,14 @@ export const INVOKE_TOOL = FlowStepTool.INVOKE;
20
20
  * buffer.
21
21
  */
22
22
  export const AMBIENT_RECORDING = '__ambient__';
23
+ /**
24
+ * One ambient tape per tab. It was one for the whole daemon, so a drive in ANOTHER app (the console
25
+ * beside the repo's own app) was cut into a flow and saved into this repo's committed `flows/`, and
26
+ * synced to its project. A tape now holds one tab's steps, and that tab's end takes only its own.
27
+ */
28
+ export const ambientRecordingOf = (session) => session === undefined ? AMBIENT_RECORDING : `${AMBIENT_RECORDING}:${session}`;
29
+ /** Whether a recording is an ambient tape: the daemon's own, never one somebody opened. */
30
+ export const isAmbient = (name) => AMBIENT_RECORDING === name || name.startsWith(`${AMBIENT_RECORDING}:`);
23
31
  /**
24
32
  * How long a journey the ambient tape will hold.
25
33
  *
@@ -32,13 +40,17 @@ export class RecordingStore {
32
40
  byHarness;
33
41
  #active = new Map();
34
42
  #compiled = new Map();
43
+ /** The ambient tape the last step went on: the one a refuted claim is taken off. */
44
+ #lastAmbient;
35
45
  /** A navigation came after the last captured step — see markNavigated. */
36
46
  #navigatedSinceStep = false;
47
+ /** Tabs with network mocks installed now, keyed by session ('' for none named). See markMocked. */
48
+ #mocked = new Set();
37
49
  /** `byHarness`: whether the step being captured was driven by the Harness, which tapes its own. */
38
50
  constructor(byHarness = () => false) {
39
51
  this.byHarness = byHarness;
40
52
  }
41
- start(name, cursor, startPath, session) {
53
+ start(name, cursor, startPath, session, document) {
42
54
  const openedOver = new Map();
43
55
  for (const [outer, rec] of this.#targets(session))
44
56
  openedOver.set(outer, rec.steps.length);
@@ -48,6 +60,7 @@ export class RecordingStore {
48
60
  openedOver,
49
61
  ...(startPath === undefined ? {} : { startPath }),
50
62
  ...(session === undefined ? {} : { session }),
63
+ ...(document === undefined ? {} : { document }),
51
64
  });
52
65
  }
53
66
  /** The open recordings a step from `session` belongs to. See ActiveRecording.session. */
@@ -78,27 +91,44 @@ export class RecordingStore {
78
91
  * Opened lazily on the first step rather than in the constructor: a store that never records
79
92
  * anything should not carry an empty tape, and "did anything happen at all" stays answerable.
80
93
  */
94
+ /**
95
+ * Whether a tab has network mocks installed from now on. Each ambient step on it is marked while
96
+ * they are, so the journey it belongs to is not auto-saved as a flow (#1459).
97
+ */
98
+ markMocked(session, active) {
99
+ if (active)
100
+ this.#mocked.add(session ?? '');
101
+ else
102
+ this.#mocked.delete(session ?? '');
103
+ }
81
104
  capture(step, route, session) {
82
105
  this.#navigatedSinceStep = false;
83
- if (!this.#active.has(AMBIENT_RECORDING)) {
84
- this.#active.set(AMBIENT_RECORDING, {
106
+ const mocked = this.#mocked.has(session ?? '');
107
+ const ambient = ambientRecordingOf(session);
108
+ if (!this.#active.has(ambient)) {
109
+ this.#active.set(ambient, {
85
110
  cursor: 0,
86
111
  steps: [],
87
112
  openedOver: new Map(),
113
+ ...(session === undefined ? {} : { session }),
88
114
  });
89
115
  }
116
+ this.#lastAmbient = ambient;
90
117
  for (const [name, rec] of this.#targets(session)) {
118
+ // Another tab's tape is that tab's journey, whatever else this step belongs to.
119
+ if (isAmbient(name) && name !== ambient)
120
+ continue;
91
121
  // The ambient tape is opened by the system and closed by nobody, so it is the one recording
92
122
  // with no human deciding when it has seen enough. Bounded here rather than left to grow for
93
123
  // the length of a daemon's life. Appending STOPS at the cap instead of dropping the oldest: a
94
124
  // flow replays from its FIRST step, so a tape missing its beginning is not a shorter journey,
95
125
  // it is a different one that starts in a state nothing established. A recording somebody
96
126
  // opened on purpose is not capped — they said when it starts and they say when it stops.
97
- if (AMBIENT_RECORDING === name && rec.steps.length >= AMBIENT_STEP_CAP)
127
+ if (isAmbient(name) && rec.steps.length >= AMBIENT_STEP_CAP)
98
128
  continue;
99
129
  // The Harness saves its own recordings. Taping its steps too saved every drive twice: once as
100
130
  // the Harness's flow and again, at session end, as a `drive-*` copy with a guessed name.
101
- if (AMBIENT_RECORDING === name && this.byHarness())
131
+ if (isAmbient(name) && this.byHarness())
102
132
  continue;
103
133
  // A step nobody marked ended where the next one began.
104
134
  const previous = rec.steps.at(-1);
@@ -108,7 +138,13 @@ export class RecordingStore {
108
138
  // The route rides on the AMBIENT tape only: a recording somebody opened deliberately is
109
139
  // already one journey by construction, and stamping a route on its steps would change what a
110
140
  // deliberate recording contains.
111
- rec.steps.push(AMBIENT_RECORDING === name && route !== undefined ? { ...step, route } : step);
141
+ rec.steps.push(isAmbient(name) && (route !== undefined || mocked)
142
+ ? {
143
+ ...step,
144
+ ...(route === undefined ? {} : { route }),
145
+ ...(mocked ? { mocked: true } : {}),
146
+ }
147
+ : step);
112
148
  }
113
149
  }
114
150
  /**
@@ -121,10 +157,17 @@ export class RecordingStore {
121
157
  attachExpect(expect, session) {
122
158
  if (this.#navigatedSinceStep)
123
159
  return;
124
- for (const [, rec] of this.#targets(session)) {
160
+ const mocked = this.#mocked.has(session ?? '');
161
+ for (const [name, rec] of this.#targets(session)) {
162
+ if (isAmbient(name) && name !== ambientRecordingOf(session))
163
+ continue;
125
164
  const last = rec.steps.at(-1);
126
165
  if (last === undefined)
127
166
  continue;
167
+ // A proof read while mocks are active rests on mocked responses even when the act before it
168
+ // ran unmocked, so the ambient step it joins is marked too (#1459).
169
+ if (mocked && isAmbient(name))
170
+ last.mocked = true;
128
171
  const held = last.expect;
129
172
  last.expect =
130
173
  held === undefined
@@ -153,7 +196,7 @@ export class RecordingStore {
153
196
  * is left as they drove it.
154
197
  */
155
198
  unassertLast() {
156
- const tape = this.#active.get(AMBIENT_RECORDING);
199
+ const tape = this.#lastAmbient === undefined ? undefined : this.#active.get(this.#lastAmbient);
157
200
  const last = tape?.steps.at(-1);
158
201
  if (tape === undefined || last === undefined || last.expect === undefined)
159
202
  return;
@@ -169,7 +212,9 @@ export class RecordingStore {
169
212
  markEnded(page, session) {
170
213
  if (page === undefined)
171
214
  return;
172
- for (const [, rec] of this.#targets(session)) {
215
+ for (const [name, rec] of this.#targets(session)) {
216
+ if (isAmbient(name) && name !== ambientRecordingOf(session))
217
+ continue;
173
218
  const last = rec.steps.at(-1);
174
219
  if (last !== undefined && last.endPage === undefined)
175
220
  last.endPage = page;
@@ -214,7 +259,12 @@ export class RecordingStore {
214
259
  return this.#compiled.get(name);
215
260
  }
216
261
  active() {
217
- return [...this.#active.keys()];
262
+ // One tab's tape is that tab's: the list names what somebody opened, and the plain tape as before.
263
+ return [...this.#active.keys()].filter((name) => !name.startsWith(`${AMBIENT_RECORDING}:`));
264
+ }
265
+ /** The ambient tape of one tab (or of steps no tab named), taken: what its session end saves. */
266
+ takeAmbient(session) {
267
+ return this.stop(ambientRecordingOf(session));
218
268
  }
219
269
  /**
220
270
  * Names of recordings that have been STOPPED and compiled.
@@ -1,7 +1,7 @@
1
- import { REDACTED_FILL, secretEnvKey } from './fields/flow-secret-field.js';
1
+ import { REDACTED_FILL, SECRET_NAME_ARG, secretEnvKey, secretValue, } from './fields/flow-secret-field.js';
2
2
  import { FlowPredicateSchema, Verified } from '@reticlehq/core';
3
3
  import { DANGEROUS_ACTION_CONFIRM_ARG, ReticleCommand, QueryBy, } from '@reticlehq/core';
4
- import { ReticleTool } from '@reticlehq/core';
4
+ import { ReticleTool, invokedFlowMissing } from '@reticlehq/core';
5
5
  import { formatStepAddress } from 'open-verification';
6
6
  import { refFor } from './flow-anchor.js';
7
7
  import { asRecord, asString } from '@reticlehq/core';
@@ -44,10 +44,11 @@ export function queryRefs(result) {
44
44
  export function replayActionArgs(value, confirmDangerous = false, field) {
45
45
  const args = { ...asRecord(value) };
46
46
  delete args[DANGEROUS_ACTION_CONFIRM_ARG];
47
+ delete args[SECRET_NAME_ARG];
47
48
  if (confirmDangerous)
48
49
  args[DANGEROUS_ACTION_CONFIRM_ARG] = true;
49
50
  if (REDACTED_FILL === args['value'] && field !== undefined) {
50
- const supplied = process.env[secretEnvKey(field)];
51
+ const supplied = secretValue(secretEnvKey(field), process.env);
51
52
  if (supplied !== undefined && supplied.length > 0)
52
53
  args['value'] = supplied;
53
54
  }
@@ -176,7 +177,23 @@ function enforceableExpect(raw) {
176
177
  */
177
178
  export function compileActStep(args, res) {
178
179
  const { args: compiled, stable } = compileAnchorArgs(asRecord(res), asString(args['ref']) ?? '', asString(args['action']) ?? '', replayActionArgs(args['args']));
179
- return { tool: ReticleTool.ACT, stable, args: compiled };
180
+ const timeoutMs = explicitTimeoutMs(args);
181
+ return {
182
+ tool: ReticleTool.ACT,
183
+ stable,
184
+ args: compiled,
185
+ ...(timeoutMs === undefined ? {} : { timeoutMs }),
186
+ };
187
+ }
188
+ /** Keep only the timeout shape accepted by the public tool, including an intentional zero. */
189
+ function explicitTimeoutMs(args) {
190
+ const timeoutMs = args['timeout_ms'];
191
+ return 'number' === typeof timeoutMs &&
192
+ Number.isFinite(timeoutMs) &&
193
+ Number.isInteger(timeoutMs) &&
194
+ 0 <= timeoutMs
195
+ ? timeoutMs
196
+ : undefined;
180
197
  }
181
198
  /**
182
199
  * The ONE anchor chooser: testid (gold) > role+name (identifies an instance) > component/source
@@ -258,7 +275,13 @@ export function compileSequenceStep(args, res) {
258
275
  const expect = enforceableExpect(step['expect']);
259
276
  return expect === undefined ? compiled.args : { ...compiled.args, expect };
260
277
  });
261
- return { tool: ReticleTool.ACT_SEQUENCE, stable, args: { steps: subSteps } };
278
+ const timeoutMs = explicitTimeoutMs(args);
279
+ return {
280
+ tool: ReticleTool.ACT_SEQUENCE,
281
+ stable,
282
+ args: { steps: subSteps },
283
+ ...(timeoutMs === undefined ? {} : { timeoutMs }),
284
+ };
262
285
  }
263
286
  /**
264
287
  * Resolve a recorded step's element to a live ref, by whichever anchor the compiler chose.
@@ -368,7 +391,7 @@ via = []) {
368
391
  tool: step.tool,
369
392
  ok: false,
370
393
  at: address,
371
- error: `cannot replay "${step.invoke}": it was not found, so this journey would report green having never run it`,
394
+ error: invokedFlowMissing(step.invoke),
372
395
  });
373
396
  break;
374
397
  }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * `reticle_flow_replay`'s answer: one flow replayed, written down as a run, ending with the Reticle
3
+ * result block. The run id is minted first, so each replayed step's screenshot is filed under it.
4
+ */
5
+ import { type FlowReplayResult } from '@reticlehq/core';
6
+ import type { ToolDeps } from '../../surface/tools/tool-kit.js';
7
+ export declare function replayOneFlow(deps: ToolDeps, args: Record<string, unknown>, appUrl: string | undefined): Promise<FlowReplayResult>;
@@ -0,0 +1,26 @@
1
+ /**
2
+ * `reticle_flow_replay`'s answer: one flow replayed, written down as a run, ending with the Reticle
3
+ * result block. The run id is minted first, so each replayed step's screenshot is filed under it.
4
+ */
5
+ import { asString } from '@reticlehq/core';
6
+ import { defaultRunId, withShotRun } from '../../judgement/runs/default-run-id.js';
7
+ import { persistAndSyncVerificationRun } from '../../judgement/runs/verification-sync.js';
8
+ import { rootForTarget, safeSessionTarget } from '../../memory/project/session-root.js';
9
+ import { replayResult, resultField } from '../../surface/tools/reticle-result.js';
10
+ import { replaySeededOrNot } from './flow-learning.js';
11
+ export function replayOneFlow(deps, args, appUrl) {
12
+ return withShotRun(defaultRunId(), async () => {
13
+ const start = deps.now();
14
+ const replay = await replaySeededOrNot(deps, args, appUrl);
15
+ const durationMs = deps.now() - start;
16
+ const target = safeSessionTarget(deps, asString(args['sessionId']));
17
+ // Written down as a run, and named in the answer: the platform's Re-verify ties its check to
18
+ // it, and a check with no run could never resolve the issue it was for.
19
+ const runId = await persistAndSyncVerificationRun(deps, [{ replay, durationMs }], target);
20
+ return {
21
+ ...replay,
22
+ ...(runId === undefined ? {} : { runId }),
23
+ ...resultField(() => replayResult(rootForTarget(deps, target), replay, durationMs, runId)),
24
+ };
25
+ });
26
+ }
@@ -1,2 +1,3 @@
1
1
  import type { ToolDef } from '../../surface/tools/tool-kit.js';
2
+ /** Every answer carries the Reticle result block, under the verdict this tool decided. */
2
3
  export declare const VERIFY_CHANGE_TOOLS: ToolDef[];