@reticlehq/server 3.5.0 → 3.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (721) hide show
  1. package/README.md +1 -1
  2. package/SKILL.md +123 -116
  3. package/dist/chromium-launch-options.d.ts +3 -1
  4. package/dist/chromium-launch-options.js +2 -1
  5. package/dist/command/cli/adhoc-suite.d.ts +14 -0
  6. package/dist/command/cli/adhoc-suite.js +42 -7
  7. package/dist/command/cli/adhoc-verdict.d.ts +19 -2
  8. package/dist/command/cli/adhoc-verdict.js +76 -9
  9. package/dist/command/cli/answers/gate-exit.d.ts +23 -0
  10. package/dist/command/cli/answers/gate-exit.js +45 -0
  11. package/dist/command/cli/answers/gate-hook-message.d.ts +2 -0
  12. package/dist/command/cli/answers/gate-hook-message.js +3 -1
  13. package/dist/command/cli/answers/open-note.d.ts +2 -0
  14. package/dist/command/cli/answers/open-note.js +22 -0
  15. package/dist/command/cli/auth/device-flow.d.ts +13 -2
  16. package/dist/command/cli/auth/device-flow.js +17 -0
  17. package/dist/command/cli/cli-doctor.js +14 -0
  18. package/dist/command/cli/cli-flow-commands.d.ts +0 -11
  19. package/dist/command/cli/cli-flow-commands.js +31 -112
  20. package/dist/command/cli/cli-kill.js +3 -2
  21. package/dist/command/cli/cli-parse-grammar.d.ts +24 -0
  22. package/dist/command/cli/cli-parse-grammar.js +75 -0
  23. package/dist/command/cli/cli-parse-verify.d.ts +2 -0
  24. package/dist/command/cli/cli-parse-verify.js +18 -0
  25. package/dist/command/cli/cli-parse.d.ts +19 -28
  26. package/dist/command/cli/cli-parse.js +82 -182
  27. package/dist/command/cli/cli-update-commands.d.ts +1 -1
  28. package/dist/command/cli/cli-update-commands.js +61 -9
  29. package/dist/command/cli/cli-usage.d.ts +33 -0
  30. package/dist/command/cli/cli-usage.js +287 -0
  31. package/dist/command/cli/cli-verify.d.ts +35 -5
  32. package/dist/command/cli/cli-verify.js +114 -35
  33. package/dist/command/cli/cloud-cli.d.ts +13 -0
  34. package/dist/command/cli/cloud-cli.js +192 -341
  35. package/dist/command/cli/cloud-kit.d.ts +12 -0
  36. package/dist/command/cli/cloud-kit.js +41 -2
  37. package/dist/command/cli/cloud-link.d.ts +57 -0
  38. package/dist/command/cli/cloud-link.js +308 -0
  39. package/dist/command/cli/cloud-login.d.ts +22 -0
  40. package/dist/command/cli/cloud-login.js +96 -8
  41. package/dist/command/cli/context-command.d.ts +1 -0
  42. package/dist/command/cli/context-command.js +33 -0
  43. package/dist/command/cli/daemon-start-options.d.ts +3 -0
  44. package/dist/command/cli/daemon-start-options.js +24 -3
  45. package/dist/command/cli/doctor/browser/chromium-hint.d.ts +46 -0
  46. package/dist/command/cli/doctor/browser/chromium-hint.js +99 -1
  47. package/dist/command/cli/doctor/doctor-coverage-line.d.ts +2 -0
  48. package/dist/command/cli/doctor/doctor-coverage-line.js +47 -0
  49. package/dist/command/cli/doctor/doctor-project-line.d.ts +0 -12
  50. package/dist/command/cli/doctor/doctor-project-line.js +5 -4
  51. package/dist/command/cli/doctor/doctor-rows.d.ts +6 -0
  52. package/dist/command/cli/doctor/doctor-rows.js +6 -0
  53. package/dist/command/cli/doctor/doctor-signing-line.d.ts +38 -0
  54. package/dist/command/cli/doctor/doctor-signing-line.js +114 -0
  55. package/dist/command/cli/drive/drive-attach.d.ts +27 -2
  56. package/dist/command/cli/drive/drive-attach.js +71 -4
  57. package/dist/command/cli/drive/drive-command.d.ts +2 -1
  58. package/dist/command/cli/drive/drive-command.js +13 -7
  59. package/dist/command/cli/known-regression.d.ts +13 -0
  60. package/dist/command/cli/known-regression.js +34 -0
  61. package/dist/command/cli/launch/sdk-version-match.d.ts +12 -0
  62. package/dist/command/cli/launch/sdk-version-match.js +25 -0
  63. package/dist/command/cli/lifecycle/daemon-lifecycle.js +15 -3
  64. package/dist/command/cli/mcp-command.d.ts +6 -0
  65. package/dist/command/cli/mcp-command.js +13 -5
  66. package/dist/command/cli/ports/port-holder.d.ts +10 -0
  67. package/dist/command/cli/ports/port-holder.js +25 -1
  68. package/dist/command/cli/project-name.d.ts +29 -1
  69. package/dist/command/cli/project-name.js +107 -2
  70. package/dist/command/cli/setup-mcp-cli.d.ts +17 -1
  71. package/dist/command/cli/setup-mcp-cli.js +35 -12
  72. package/dist/command/cli/status/status-lines.d.ts +1 -0
  73. package/dist/command/cli/status/status-lines.js +47 -2
  74. package/dist/command/cli/status/workspace-links.d.ts +10 -0
  75. package/dist/command/cli/status/workspace-links.js +29 -0
  76. package/dist/command/cli/try-command.d.ts +96 -0
  77. package/dist/command/cli/try-command.js +362 -0
  78. package/dist/command/cli/tutorial.d.ts +0 -100
  79. package/dist/command/cli/tutorial.js +0 -181
  80. package/dist/command/cli/verify-results.d.ts +19 -0
  81. package/dist/command/cli/verify-results.js +29 -0
  82. package/dist/command/cli-onboarding.d.ts +0 -11
  83. package/dist/command/cli-onboarding.js +0 -15
  84. package/dist/command/cli.d.ts +20 -0
  85. package/dist/command/cli.js +130 -104
  86. package/dist/command/daemon/binding/daemon-status-probe.d.ts +2 -0
  87. package/dist/command/daemon/binding/daemon-status-probe.js +1 -0
  88. package/dist/command/daemon/daemon-resilience.js +4 -4
  89. package/dist/command/daemon/daemon-resolve.d.ts +23 -1
  90. package/dist/command/daemon/daemon-resolve.js +79 -9
  91. package/dist/command/setup/agent-writer.d.ts +1 -1
  92. package/dist/command/setup/agent-writer.js +3 -2
  93. package/dist/command/setup/bringup/bridge-port.d.ts +3 -1
  94. package/dist/command/setup/bringup/bridge-port.js +13 -3
  95. package/dist/command/setup/bringup/connect-lease.d.ts +1 -0
  96. package/dist/command/setup/bringup/connect-lease.js +1 -0
  97. package/dist/command/setup/bringup/dev-server-log-cap.js +2 -0
  98. package/dist/command/setup/bringup/dev-server-wait.d.ts +8 -0
  99. package/dist/command/setup/bringup/dev-server-wait.js +19 -0
  100. package/dist/command/setup/bringup/ensure-daemon.js +9 -2
  101. package/dist/command/setup/init/agent-restart.d.ts +23 -0
  102. package/dist/command/setup/init/agent-restart.js +28 -0
  103. package/dist/command/setup/init/init-port.d.ts +14 -1
  104. package/dist/command/setup/init/init-port.js +32 -2
  105. package/dist/command/setup/init/init-runtime.d.ts +22 -2
  106. package/dist/command/setup/init/init-runtime.js +114 -38
  107. package/dist/command/setup/node-effects.d.ts +2 -0
  108. package/dist/command/setup/node-effects.js +38 -9
  109. package/dist/command/setup/probe/existing-app.d.ts +12 -0
  110. package/dist/command/setup/probe/existing-app.js +14 -0
  111. package/dist/command/setup/remaining-steps.js +2 -1
  112. package/dist/command/setup/run-setup.d.ts +34 -9
  113. package/dist/command/setup/run-setup.js +65 -51
  114. package/dist/command/setup/setup-command.d.ts +25 -1
  115. package/dist/command/setup/setup-command.js +59 -4
  116. package/dist/command/setup/setup-mcp.js +25 -2
  117. package/dist/command/setup/tauri-signing.d.ts +19 -0
  118. package/dist/command/setup/tauri-signing.js +79 -0
  119. package/dist/command/setup/terminal/listeners.d.ts +10 -1
  120. package/dist/command/setup/terminal/listeners.js +37 -6
  121. package/dist/command/update/update-nudge.d.ts +9 -0
  122. package/dist/command/update/update-nudge.js +1 -1
  123. package/dist/command/update/updater.js +11 -15
  124. package/dist/command/version/version-nudge.js +3 -0
  125. package/dist/command/version/version-skew.d.ts +20 -1
  126. package/dist/command/version/version-skew.js +49 -4
  127. package/dist/features/crawl/crawl-tools.js +4 -0
  128. package/dist/features/crawl/crawl.d.ts +6 -0
  129. package/dist/features/crawl/crawl.js +23 -2
  130. package/dist/features/exhaust/ledger.d.ts +21 -14
  131. package/dist/features/exhaust/ledger.js +35 -9
  132. package/dist/features/harness/app-findings.d.ts +2 -0
  133. package/dist/features/harness/app-findings.js +52 -0
  134. package/dist/features/harness/drive-report.d.ts +61 -1
  135. package/dist/features/harness/drive-report.js +394 -26
  136. package/dist/features/harness/drive-runs.d.ts +120 -0
  137. package/dist/features/harness/drive-runs.js +289 -0
  138. package/dist/features/harness/drivers.d.ts +10 -14
  139. package/dist/features/harness/drivers.js +10 -14
  140. package/dist/features/harness/explore/console-pages.d.ts +15 -0
  141. package/dist/features/harness/explore/console-pages.js +146 -0
  142. package/dist/features/harness/explore/disparity.d.ts +19 -0
  143. package/dist/features/harness/explore/disparity.js +71 -0
  144. package/dist/features/harness/explore/fake-app.d.ts +16 -0
  145. package/dist/features/harness/explore/fake-app.js +49 -0
  146. package/dist/features/harness/explore/goal-search.d.ts +26 -0
  147. package/dist/features/harness/explore/goal-search.js +144 -0
  148. package/dist/features/harness/explore/page-tree.d.ts +49 -0
  149. package/dist/features/harness/explore/page-tree.js +148 -0
  150. package/dist/features/harness/explore/site-map.d.ts +34 -0
  151. package/dist/features/harness/explore/site-map.js +150 -0
  152. package/dist/features/harness/fill-values.d.ts +3 -73
  153. package/dist/features/harness/fill-values.js +3 -169
  154. package/dist/features/harness/goals.d.ts +82 -0
  155. package/dist/features/harness/goals.js +330 -0
  156. package/dist/features/harness/harness.d.ts +51 -1
  157. package/dist/features/harness/harness.js +207 -6
  158. package/dist/features/harness/platform/drive-target.d.ts +30 -0
  159. package/dist/features/harness/platform/drive-target.js +81 -0
  160. package/dist/features/harness/platform/local-apps.d.ts +127 -0
  161. package/dist/features/harness/platform/local-apps.js +280 -0
  162. package/dist/features/harness/platform/persona-credentials.d.ts +20 -0
  163. package/dist/features/harness/platform/persona-credentials.js +69 -0
  164. package/dist/features/harness/platform/platform-drives.d.ts +61 -0
  165. package/dist/features/harness/platform/platform-drives.js +114 -0
  166. package/dist/features/harness/platform/refusal.d.ts +52 -0
  167. package/dist/features/harness/platform/refusal.js +71 -0
  168. package/dist/features/harness/platform/remote-drive.d.ts +186 -0
  169. package/dist/features/harness/platform/remote-drive.js +378 -0
  170. package/dist/features/harness/platform/script.d.ts +94 -0
  171. package/dist/features/harness/platform/script.js +260 -0
  172. package/dist/features/harness/platform/server-driver.d.ts +54 -0
  173. package/dist/features/harness/platform/server-driver.js +182 -0
  174. package/dist/features/harness/platform-config.d.ts +41 -1
  175. package/dist/features/harness/platform-config.js +106 -9
  176. package/dist/features/harness/route-guess.d.ts +13 -0
  177. package/dist/features/harness/route-guess.js +49 -0
  178. package/dist/features/harness/script/app-controls.d.ts +5 -0
  179. package/dist/features/harness/script/app-controls.js +40 -0
  180. package/dist/features/harness/script/lane-ids.d.ts +14 -0
  181. package/dist/features/harness/script/lane-ids.js +16 -0
  182. package/dist/features/harness/script/script-run.d.ts +70 -0
  183. package/dist/features/harness/script/script-run.js +606 -0
  184. package/dist/features/license/license.d.ts +2 -2
  185. package/dist/features/visual/step-shots.d.ts +31 -0
  186. package/dist/features/visual/step-shots.js +231 -0
  187. package/dist/features/visual/visual-tools.d.ts +10 -1
  188. package/dist/features/visual/visual-tools.js +62 -17
  189. package/dist/hooks/client-directory.d.ts +18 -0
  190. package/dist/hooks/client-directory.js +57 -0
  191. package/dist/hooks/coding-agents.d.ts +34 -0
  192. package/dist/hooks/coding-agents.js +117 -0
  193. package/dist/hooks/driven-by.d.ts +23 -0
  194. package/dist/hooks/driven-by.js +56 -0
  195. package/dist/hooks/hook-bus.d.ts +4 -0
  196. package/dist/hooks/hook-bus.js +18 -0
  197. package/dist/hooks/hook-commands.js +15 -4
  198. package/dist/hooks/tool-log.d.ts +9 -0
  199. package/dist/hooks/tool-log.js +29 -0
  200. package/dist/index.d.ts +2 -0
  201. package/dist/index.js +80 -243
  202. package/dist/judgement/capsule/capsule-store.d.ts +2 -2
  203. package/dist/judgement/capsule/causal-summary.d.ts +15 -1
  204. package/dist/judgement/capsule/causal-summary.js +33 -0
  205. package/dist/judgement/runs/artifact/build-verification-run.d.ts +1 -1
  206. package/dist/judgement/runs/artifact/build-verification-run.js +25 -3
  207. package/dist/judgement/runs/artifact/gap-summary.d.ts +0 -18
  208. package/dist/judgement/runs/artifact/gap-summary.js +12 -3
  209. package/dist/judgement/runs/artifact/replay-mapping.d.ts +1 -1
  210. package/dist/judgement/runs/artifact/replay-mapping.js +37 -11
  211. package/dist/judgement/runs/artifact/run-store.d.ts +14 -2
  212. package/dist/judgement/runs/artifact/run-store.js +195 -3
  213. package/dist/judgement/runs/context-tools.js +59 -1
  214. package/dist/judgement/runs/default-run-id.d.ts +3 -0
  215. package/dist/judgement/runs/default-run-id.js +16 -0
  216. package/dist/judgement/runs/drive-run.d.ts +71 -1
  217. package/dist/judgement/runs/drive-run.js +317 -5
  218. package/dist/judgement/runs/repair-prompt.js +1 -1
  219. package/dist/judgement/runs/resume.d.ts +44 -0
  220. package/dist/judgement/runs/resume.js +137 -0
  221. package/dist/judgement/runs/reticle-runner.js +13 -3
  222. package/dist/judgement/runs/runner-port.d.ts +5 -1
  223. package/dist/judgement/runs/runner-port.js +8 -2
  224. package/dist/judgement/runs/verification-sync.d.ts +5 -2
  225. package/dist/judgement/runs/verification-sync.js +40 -18
  226. package/dist/language/flows/change/gate.d.ts +10 -0
  227. package/dist/language/flows/change/gate.js +22 -0
  228. package/dist/language/flows/decision.js +36 -1
  229. package/dist/language/flows/fields/flow-secret-field.d.ts +12 -0
  230. package/dist/language/flows/fields/flow-secret-field.js +25 -2
  231. package/dist/language/flows/flow-anchor.d.ts +61 -10
  232. package/dist/language/flows/flow-anchor.js +98 -6
  233. package/dist/language/flows/flow-cross-step.d.ts +15 -0
  234. package/dist/language/flows/flow-cross-step.js +21 -0
  235. package/dist/language/flows/flow-intent.d.ts +1 -0
  236. package/dist/language/flows/flow-journey.d.ts +6 -0
  237. package/dist/language/flows/flow-journey.js +20 -0
  238. package/dist/language/flows/flow-learning.d.ts +4 -0
  239. package/dist/language/flows/flow-learning.js +45 -14
  240. package/dist/language/flows/flow-mutate-tools.js +5 -3
  241. package/dist/language/flows/flow-replay-run.d.ts +23 -9
  242. package/dist/language/flows/flow-replay-run.js +115 -110
  243. package/dist/language/flows/flow-replay-types.d.ts +1 -1
  244. package/dist/language/flows/flow-replay.d.ts +40 -1
  245. package/dist/language/flows/flow-replay.js +110 -22
  246. package/dist/language/flows/flow-result.d.ts +22 -1
  247. package/dist/language/flows/flow-result.js +47 -2
  248. package/dist/language/flows/flow-scope.js +5 -1
  249. package/dist/language/flows/flow-step-runners.d.ts +22 -2
  250. package/dist/language/flows/flow-step-runners.js +247 -47
  251. package/dist/language/flows/flow-store-for-session.d.ts +2 -2
  252. package/dist/language/flows/flow-store-for-session.js +7 -3
  253. package/dist/language/flows/flow-tools.d.ts +10 -0
  254. package/dist/language/flows/flow-tools.js +112 -89
  255. package/dist/language/flows/flows.d.ts +16 -1
  256. package/dist/language/flows/flows.js +74 -12
  257. package/dist/language/flows/heal-run.js +6 -4
  258. package/dist/language/flows/narrow-write.d.ts +7 -0
  259. package/dist/language/flows/narrow-write.js +36 -1
  260. package/dist/language/flows/recording/flake.d.ts +2 -2
  261. package/dist/language/flows/recording/recording-backtrack.js +14 -1
  262. package/dist/language/flows/recording/tape/recordings.d.ts +58 -4
  263. package/dist/language/flows/recording/tape/recordings.js +95 -13
  264. package/dist/language/flows/replay-from-hud.d.ts +20 -0
  265. package/dist/language/flows/replay-from-hud.js +51 -0
  266. package/dist/language/flows/replay.d.ts +9 -5
  267. package/dist/language/flows/replay.js +56 -15
  268. package/dist/language/flows/single-replay.d.ts +7 -0
  269. package/dist/language/flows/single-replay.js +26 -0
  270. package/dist/language/flows/suite/suite-flakes.js +2 -0
  271. package/dist/language/flows/suite-selection.d.ts +2 -15
  272. package/dist/language/flows/suite-selection.js +4 -3
  273. package/dist/language/flows/verify-change-tools.d.ts +1 -0
  274. package/dist/language/flows/verify-change-tools.js +202 -191
  275. package/dist/launch-chromium.d.ts +27 -5
  276. package/dist/launch-chromium.js +38 -8
  277. package/dist/memory/cloud/cloud-config.d.ts +22 -1
  278. package/dist/memory/cloud/cloud-config.js +34 -5
  279. package/dist/memory/cloud/cloud-sync.d.ts +17 -14
  280. package/dist/memory/cloud/cloud-sync.js +15 -4
  281. package/dist/memory/cloud/harness-config.d.ts +75 -1
  282. package/dist/memory/cloud/harness-config.js +115 -24
  283. package/dist/memory/cloud/hud-notices-source.d.ts +21 -0
  284. package/dist/memory/cloud/hud-notices-source.js +128 -0
  285. package/dist/memory/cloud/memory-scope.d.ts +161 -0
  286. package/dist/memory/cloud/memory-scope.js +227 -0
  287. package/dist/memory/cloud/sync-cycle.d.ts +44 -7
  288. package/dist/memory/cloud/sync-cycle.js +129 -15
  289. package/dist/memory/cloud/sync-daemon.d.ts +11 -0
  290. package/dist/memory/cloud/sync-daemon.js +121 -9
  291. package/dist/memory/cloud/sync-disk.d.ts +1 -1
  292. package/dist/memory/cloud/sync-disk.js +31 -10
  293. package/dist/memory/cloud/sync-screenshots.d.ts +32 -0
  294. package/dist/memory/cloud/sync-screenshots.js +105 -0
  295. package/dist/memory/cloud/unsynced-roots.d.ts +47 -0
  296. package/dist/memory/cloud/unsynced-roots.js +166 -0
  297. package/dist/memory/impact/account-watch.d.ts +34 -0
  298. package/dist/memory/impact/account-watch.js +59 -0
  299. package/dist/memory/impact/impact-recorder.d.ts +8 -0
  300. package/dist/memory/impact/impact-recorder.js +12 -2
  301. package/dist/memory/impact/impact-store.d.ts +17 -4
  302. package/dist/memory/impact/impact-store.js +169 -63
  303. package/dist/memory/intent/inline-intent.d.ts +1 -0
  304. package/dist/memory/intent/intent-shard-store.js +16 -4
  305. package/dist/memory/intent/intent-shard.d.ts +14 -2
  306. package/dist/memory/intent/intent-store.d.ts +1 -0
  307. package/dist/memory/intent/intent-tools.js +122 -4
  308. package/dist/memory/intent/open-intents.d.ts +6 -0
  309. package/dist/memory/intent/open-intents.js +10 -1
  310. package/dist/memory/intent/settled-words.d.ts +24 -0
  311. package/dist/memory/intent/settled-words.js +130 -0
  312. package/dist/memory/journal/drive-flow.d.ts +16 -0
  313. package/dist/memory/journal/drive-flow.js +34 -2
  314. package/dist/memory/journal/drive-run-flush.d.ts +2 -0
  315. package/dist/memory/journal/drive-run-flush.js +20 -5
  316. package/dist/memory/journal/envelope.d.ts +8 -8
  317. package/dist/memory/journal/journal-recorder.js +52 -3
  318. package/dist/memory/journal/on-disk/retention.d.ts +8 -0
  319. package/dist/memory/journal/on-disk/retention.js +32 -2
  320. package/dist/memory/journal/on-disk/startup-maintenance.js +3 -1
  321. package/dist/memory/journal/on-disk/workspace-tiers.js +9 -4
  322. package/dist/memory/journal/session-end.d.ts +15 -1
  323. package/dist/memory/journal/session-end.js +42 -9
  324. package/dist/memory/project/artifact-root-resolver.d.ts +26 -1
  325. package/dist/memory/project/artifact-root-resolver.js +125 -16
  326. package/dist/memory/project/artifact-root.d.ts +46 -8
  327. package/dist/memory/project/artifact-root.js +89 -10
  328. package/dist/memory/project/dir/reticle-dir.d.ts +18 -2
  329. package/dist/memory/project/dir/reticle-dir.js +26 -3
  330. package/dist/memory/project/link-directory.d.ts +15 -0
  331. package/dist/memory/project/link-directory.js +44 -0
  332. package/dist/memory/project/project-tools.js +22 -3
  333. package/dist/memory/project/root-claims.d.ts +6 -0
  334. package/dist/memory/project/root-claims.js +39 -0
  335. package/dist/memory/project/session-root.d.ts +26 -1
  336. package/dist/memory/project/session-root.js +49 -5
  337. package/dist/memory/project/sync-status.d.ts +85 -0
  338. package/dist/memory/project/sync-status.js +224 -0
  339. package/dist/memory/recall/memory-tools.js +47 -2
  340. package/dist/memory/recall/platform-memory.d.ts +34 -0
  341. package/dist/memory/recall/platform-memory.js +139 -0
  342. package/dist/memory/recall/project-memory.d.ts +19 -0
  343. package/dist/memory/recall/project-memory.js +80 -13
  344. package/dist/portal/bridge/bridge.d.ts +9 -3
  345. package/dist/portal/bridge/bridge.js +82 -22
  346. package/dist/portal/bridge/harness-request.d.ts +23 -0
  347. package/dist/portal/bridge/harness-request.js +27 -0
  348. package/dist/portal/bridge/pairing-token.d.ts +9 -0
  349. package/dist/portal/bridge/pairing-token.js +17 -0
  350. package/dist/portal/bridge/wrong-path.d.ts +17 -0
  351. package/dist/portal/bridge/wrong-path.js +35 -0
  352. package/dist/portal/input/network-mock-tools.js +11 -2
  353. package/dist/portal/input/real-input.d.ts +83 -10
  354. package/dist/portal/input/real-input.js +218 -30
  355. package/dist/portal/input/viewport-tools.js +3 -3
  356. package/dist/portal/pool/browser-pool.d.ts +70 -9
  357. package/dist/portal/pool/browser-pool.js +190 -37
  358. package/dist/portal/pool/context-permissions.d.ts +33 -0
  359. package/dist/portal/pool/context-permissions.js +33 -0
  360. package/dist/portal/pool/lease-marker-stamp.d.ts +23 -0
  361. package/dist/portal/pool/lease-marker-stamp.js +49 -0
  362. package/dist/portal/pool/playwright-launcher.d.ts +35 -0
  363. package/dist/portal/pool/playwright-launcher.js +64 -3
  364. package/dist/portal/pool/pool-contract.d.ts +28 -5
  365. package/dist/portal/session/agent-link.d.ts +8 -0
  366. package/dist/portal/session/agent-link.js +17 -0
  367. package/dist/portal/session/command-payload.d.ts +8 -0
  368. package/dist/portal/session/command-payload.js +24 -0
  369. package/dist/portal/session/daemon-answers.d.ts +3 -3
  370. package/dist/portal/session/daemon-answers.js +4 -2
  371. package/dist/portal/session/dev-server/dev-command.d.ts +21 -0
  372. package/dist/portal/session/dev-server/dev-command.js +87 -12
  373. package/dist/portal/session/facts/departure-note.d.ts +22 -0
  374. package/dist/portal/session/facts/departure-note.js +47 -0
  375. package/dist/portal/session/facts/observed-state.d.ts +16 -18
  376. package/dist/portal/session/facts/observed-state.js +46 -3
  377. package/dist/portal/session/facts/session-replaced.d.ts +5 -0
  378. package/dist/portal/session/facts/session-replaced.js +5 -0
  379. package/dist/portal/session/first-run-wiring.d.ts +42 -0
  380. package/dist/portal/session/first-run-wiring.js +132 -0
  381. package/dist/portal/session/human/live-control.d.ts +9 -2
  382. package/dist/portal/session/human/live-control.js +12 -3
  383. package/dist/portal/session/human/notes-ledger.d.ts +20 -0
  384. package/dist/portal/session/human/notes-ledger.js +55 -0
  385. package/dist/portal/session/human/review-store.d.ts +12 -0
  386. package/dist/portal/session/human/review-store.js +18 -10
  387. package/dist/portal/session/live-control-tools.d.ts +0 -13
  388. package/dist/portal/session/live-control-tools.js +107 -13
  389. package/dist/portal/session/narration-args.d.ts +5 -0
  390. package/dist/portal/session/narration-args.js +17 -0
  391. package/dist/portal/session/no-session-diagnosis.d.ts +8 -1
  392. package/dist/portal/session/no-session-diagnosis.js +46 -9
  393. package/dist/portal/session/no-session-next-action.d.ts +31 -0
  394. package/dist/portal/session/no-session-next-action.js +159 -60
  395. package/dist/portal/session/no-session-watch.d.ts +14 -1
  396. package/dist/portal/session/no-session-watch.js +227 -17
  397. package/dist/portal/session/presence/session-lease.js +1 -1
  398. package/dist/portal/session/presence/session-mirror.js +3 -0
  399. package/dist/portal/session/recorded-gaps.d.ts +97 -0
  400. package/dist/portal/session/recorded-gaps.js +251 -0
  401. package/dist/portal/session/serving-directory.d.ts +27 -0
  402. package/dist/portal/session/serving-directory.js +45 -0
  403. package/dist/portal/session/session-health.d.ts +18 -0
  404. package/dist/portal/session/session-health.js +9 -1
  405. package/dist/portal/session/session-info.d.ts +8 -1
  406. package/dist/portal/session/session-info.js +8 -1
  407. package/dist/portal/session/session-manager.d.ts +39 -0
  408. package/dist/portal/session/session-manager.js +98 -11
  409. package/dist/portal/session/session-reaper.js +4 -1
  410. package/dist/portal/session/session-successor.d.ts +13 -0
  411. package/dist/portal/session/session-successor.js +1 -1
  412. package/dist/portal/session/session-tools.js +26 -3
  413. package/dist/portal/session/session.d.ts +22 -30
  414. package/dist/portal/session/session.js +81 -79
  415. package/dist/portal/session/timing/command-timeout.js +25 -1
  416. package/dist/portal/session/timing/wall-clock.d.ts +1 -1
  417. package/dist/portal/session/timing/wall-clock.js +1 -1
  418. package/dist/portal/session/zero-install-first-call.d.ts +31 -0
  419. package/dist/portal/session/zero-install-first-call.js +88 -0
  420. package/dist/start-options.d.ts +12 -0
  421. package/dist/start-wiring.d.ts +63 -0
  422. package/dist/start-wiring.js +169 -0
  423. package/dist/status-payload.d.ts +23 -1
  424. package/dist/status-payload.js +36 -1
  425. package/dist/surface/http-server.js +18 -2
  426. package/dist/surface/mcp/attach-memory.d.ts +1 -0
  427. package/dist/surface/mcp/attach-memory.js +12 -1
  428. package/dist/surface/mcp/mcp-proxy.d.ts +9 -0
  429. package/dist/surface/mcp/mcp-proxy.js +65 -13
  430. package/dist/surface/mcp/mcp.d.ts +34 -6
  431. package/dist/surface/mcp/mcp.js +61 -17
  432. package/dist/surface/mcp/proxy/drive-calls.d.ts +10 -0
  433. package/dist/surface/mcp/proxy/drive-calls.js +27 -0
  434. package/dist/surface/mcp/proxy/mcp-post-transport.js +5 -0
  435. package/dist/surface/mcp/server-instructions.d.ts +4 -2
  436. package/dist/surface/mcp/server-instructions.js +32 -14
  437. package/dist/surface/mcp/shared-params.js +2 -2
  438. package/dist/surface/mcp/surface-vocabulary.d.ts +2 -0
  439. package/dist/surface/mcp/surface-vocabulary.js +1 -0
  440. package/dist/surface/tools/account-tool.d.ts +22 -0
  441. package/dist/surface/tools/account-tool.js +157 -0
  442. package/dist/surface/tools/act/act-danger.d.ts +11 -0
  443. package/dist/surface/tools/act/act-danger.js +38 -1
  444. package/dist/surface/tools/act/act-observation.d.ts +33 -0
  445. package/dist/surface/tools/act/act-observation.js +57 -0
  446. package/dist/surface/tools/act/act-preflight.js +25 -2
  447. package/dist/surface/tools/act/act-target.js +8 -3
  448. package/dist/surface/tools/act/navigation/navigate-arrival.d.ts +8 -0
  449. package/dist/surface/tools/act/navigation/navigate-arrival.js +56 -2
  450. package/dist/surface/tools/act/resolve-target.d.ts +1 -1
  451. package/dist/surface/tools/act/resolve-target.js +18 -3
  452. package/dist/surface/tools/act/screen-request.d.ts +34 -0
  453. package/dist/surface/tools/act/screen-request.js +113 -0
  454. package/dist/surface/tools/act/sequence-grade.d.ts +8 -0
  455. package/dist/surface/tools/act/sequence-grade.js +13 -2
  456. package/dist/surface/tools/act/settle-in-flight.js +25 -3
  457. package/dist/surface/tools/act-sequence-tool.js +138 -29
  458. package/dist/surface/tools/act-tools.d.ts +0 -9
  459. package/dist/surface/tools/act-tools.js +71 -41
  460. package/dist/surface/tools/agent/app-notes-learning.d.ts +7 -0
  461. package/dist/surface/tools/agent/app-notes-learning.js +80 -0
  462. package/dist/surface/tools/agent/app-notes.d.ts +4 -0
  463. package/dist/surface/tools/agent/app-notes.js +48 -0
  464. package/dist/surface/tools/agent/build-staleness.d.ts +7 -0
  465. package/dist/surface/tools/agent/build-staleness.js +62 -0
  466. package/dist/surface/tools/agent/compact-envelope.d.ts +80 -0
  467. package/dist/surface/tools/agent/compact-envelope.js +374 -0
  468. package/dist/surface/tools/agent/for-the-agent.d.ts +12 -0
  469. package/dist/surface/tools/agent/for-the-agent.js +44 -0
  470. package/dist/surface/tools/agent/notices.d.ts +50 -0
  471. package/dist/surface/tools/agent/notices.js +152 -0
  472. package/dist/surface/tools/agent/reteach.d.ts +11 -0
  473. package/dist/surface/tools/agent/reteach.js +50 -0
  474. package/dist/surface/tools/args/alias-args.d.ts +5 -0
  475. package/dist/surface/tools/args/alias-args.js +10 -0
  476. package/dist/surface/tools/args/confirm-dangerous-arg.d.ts +6 -0
  477. package/dist/surface/tools/args/confirm-dangerous-arg.js +6 -0
  478. package/dist/surface/tools/assert/assert-source.d.ts +15 -0
  479. package/dist/surface/tools/assert/assert-source.js +40 -0
  480. package/dist/surface/tools/assert/assert-verdict.d.ts +1 -1
  481. package/dist/surface/tools/assert/assert-verdict.js +42 -17
  482. package/dist/surface/tools/browser-tools.js +51 -2
  483. package/dist/surface/tools/chat-drives.d.ts +101 -0
  484. package/dist/surface/tools/chat-drives.js +409 -0
  485. package/dist/surface/tools/coverage-tools.d.ts +2 -10
  486. package/dist/surface/tools/coverage-tools.js +2 -53
  487. package/dist/surface/tools/dynamic-tools.js +29 -1
  488. package/dist/surface/tools/empty-session-list.d.ts +51 -0
  489. package/dist/surface/tools/empty-session-list.js +120 -0
  490. package/dist/surface/tools/error-recovery.d.ts +14 -0
  491. package/dist/surface/tools/error-recovery.js +105 -8
  492. package/dist/surface/tools/explore-tools.d.ts +31 -1
  493. package/dist/surface/tools/explore-tools.js +438 -66
  494. package/dist/surface/tools/feedback-tools.d.ts +2 -3
  495. package/dist/surface/tools/feedback-tools.js +18 -3
  496. package/dist/surface/tools/gap-novelty.d.ts +3 -1
  497. package/dist/surface/tools/gap-novelty.js +8 -1
  498. package/dist/surface/tools/harness-explore.d.ts +118 -57
  499. package/dist/surface/tools/harness-explore.js +344 -292
  500. package/dist/surface/tools/harness-gate.d.ts +88 -0
  501. package/dist/surface/tools/harness-gate.js +235 -0
  502. package/dist/surface/tools/harness-hunt.d.ts +43 -0
  503. package/dist/surface/tools/harness-hunt.js +215 -0
  504. package/dist/surface/tools/harness-plan.d.ts +17 -0
  505. package/dist/surface/tools/harness-plan.js +38 -0
  506. package/dist/surface/tools/harness-script.d.ts +30 -0
  507. package/dist/surface/tools/harness-script.js +560 -0
  508. package/dist/surface/tools/harness-tab-guard.d.ts +5 -0
  509. package/dist/surface/tools/harness-tab-guard.js +27 -0
  510. package/dist/surface/tools/harness-toolset.d.ts +22 -1
  511. package/dist/surface/tools/harness-toolset.js +101 -7
  512. package/dist/surface/tools/human-notes.d.ts +16 -0
  513. package/dist/surface/tools/human-notes.js +27 -0
  514. package/dist/surface/tools/invoke-tool.d.ts +5 -2
  515. package/dist/surface/tools/invoke-tool.js +263 -85
  516. package/dist/surface/tools/lease-hint.js +26 -5
  517. package/dist/surface/tools/lease-permissions.d.ts +33 -0
  518. package/dist/surface/tools/lease-permissions.js +73 -0
  519. package/dist/surface/tools/lease-readiness.d.ts +38 -0
  520. package/dist/surface/tools/lease-readiness.js +57 -0
  521. package/dist/surface/tools/lease-seed.d.ts +49 -0
  522. package/dist/surface/tools/lease-seed.js +167 -0
  523. package/dist/surface/tools/lease-tools.d.ts +13 -24
  524. package/dist/surface/tools/lease-tools.js +146 -197
  525. package/dist/surface/tools/live-call-text.js +4 -4
  526. package/dist/surface/tools/merge-tools.js +42 -2
  527. package/dist/surface/tools/merged-name-redirect.js +4 -0
  528. package/dist/surface/tools/next-step.d.ts +29 -0
  529. package/dist/surface/tools/next-step.js +214 -0
  530. package/dist/surface/tools/observe-tools.js +45 -9
  531. package/dist/surface/tools/platform-moment.d.ts +72 -0
  532. package/dist/surface/tools/platform-moment.js +296 -0
  533. package/dist/surface/tools/query-hint-schema.d.ts +7 -0
  534. package/dist/surface/tools/query-hint-schema.js +10 -0
  535. package/dist/surface/tools/read-tools.js +71 -14
  536. package/dist/surface/tools/real-input-attempt.js +96 -13
  537. package/dist/surface/tools/reticle-result.d.ts +120 -0
  538. package/dist/surface/tools/reticle-result.js +364 -0
  539. package/dist/surface/tools/tool-kit.d.ts +83 -3
  540. package/dist/surface/tools/tool-kit.js +77 -7
  541. package/dist/surface/tools/tools.js +43 -59
  542. package/dist/telemetry/account-envelope.d.ts +7 -0
  543. package/dist/telemetry/account-envelope.js +61 -0
  544. package/dist/telemetry/agent-client.d.ts +15 -0
  545. package/dist/telemetry/agent-client.js +57 -0
  546. package/dist/telemetry/app-instrumented.js +9 -2
  547. package/dist/telemetry/argument-shape.d.ts +7 -0
  548. package/dist/telemetry/argument-shape.js +86 -1
  549. package/dist/telemetry/automation-hint.d.ts +2 -3
  550. package/dist/telemetry/automation-hint.js +33 -8
  551. package/dist/telemetry/cli-telemetry.js +7 -2
  552. package/dist/telemetry/daemon-telemetry.js +3 -0
  553. package/dist/telemetry/error-fingerprint.d.ts +10 -1
  554. package/dist/telemetry/error-fingerprint.js +61 -5
  555. package/dist/telemetry/feedback-cli.d.ts +0 -13
  556. package/dist/telemetry/feedback-cli.js +0 -77
  557. package/dist/telemetry/feedback.d.ts +13 -0
  558. package/dist/telemetry/feedback.js +183 -17
  559. package/dist/telemetry/harness-run.d.ts +18 -0
  560. package/dist/telemetry/harness-run.js +80 -0
  561. package/dist/telemetry/hud-events.d.ts +16 -0
  562. package/dist/telemetry/hud-events.js +27 -0
  563. package/dist/telemetry/hud-metrics.d.ts +29 -6
  564. package/dist/telemetry/hud-metrics.js +116 -25
  565. package/dist/telemetry/init-telemetry.js +2 -2
  566. package/dist/telemetry/install-source.d.ts +13 -25
  567. package/dist/telemetry/install-source.js +44 -3
  568. package/dist/telemetry/mcp-connection.d.ts +0 -14
  569. package/dist/telemetry/mcp-connection.js +5 -1
  570. package/dist/telemetry/onboarding-firsts.d.ts +32 -0
  571. package/dist/telemetry/onboarding-firsts.js +81 -6
  572. package/dist/telemetry/platform-linked.d.ts +5 -0
  573. package/dist/telemetry/platform-linked.js +32 -0
  574. package/dist/telemetry/project-profile.js +5 -3
  575. package/dist/telemetry/proxy-telemetry.js +4 -1
  576. package/dist/telemetry/session-metrics.d.ts +15 -4
  577. package/dist/telemetry/session-metrics.js +88 -52
  578. package/dist/telemetry/telemetry.d.ts +38 -2
  579. package/dist/telemetry/telemetry.js +144 -34
  580. package/dist/telemetry/verification-of.d.ts +3 -1
  581. package/dist/telemetry/verification-of.js +13 -4
  582. package/dist/wire-journal.d.ts +2 -2
  583. package/dist/wire-journal.js +20 -6
  584. package/docs/README.md +3 -3
  585. package/docs/actions.mdx +6 -3
  586. package/docs/adapters.md +1 -1
  587. package/docs/agent-cheatsheet.md +25 -28
  588. package/docs/architecture.md +5 -5
  589. package/docs/autodrive.md +33 -28
  590. package/docs/benchmarks.md +5 -5
  591. package/docs/best-practices.mdx +27 -9
  592. package/docs/capabilities.mdx +14 -16
  593. package/docs/cli/affected.mdx +1 -1
  594. package/docs/cli/cloud.mdx +54 -75
  595. package/docs/cli/doctor.mdx +14 -3
  596. package/docs/cli/drive.mdx +20 -14
  597. package/docs/cli/feedback.mdx +3 -3
  598. package/docs/cli/gate.mdx +7 -2
  599. package/docs/cli/help.mdx +50 -55
  600. package/docs/cli/init.mdx +43 -28
  601. package/docs/cli/license.mdx +12 -8
  602. package/docs/cli/mcp.mdx +4 -4
  603. package/docs/cli/open.mdx +3 -3
  604. package/docs/cli/report.mdx +4 -2
  605. package/docs/cli/restart.mdx +2 -2
  606. package/docs/cli/rollback.mdx +14 -8
  607. package/docs/cli/serve.mdx +4 -4
  608. package/docs/cli/setup.mdx +23 -0
  609. package/docs/cli/status.mdx +18 -5
  610. package/docs/cli/stop.mdx +67 -8
  611. package/docs/cli/try.mdx +62 -0
  612. package/docs/cli/update.mdx +4 -3
  613. package/docs/cli/verify.mdx +17 -6
  614. package/docs/cli/version.mdx +5 -4
  615. package/docs/cli.mdx +111 -42
  616. package/docs/debugging.md +3 -3
  617. package/docs/deploy-checks.md +1 -1
  618. package/docs/desktop.mdx +9 -3
  619. package/docs/enterprise.md +11 -10
  620. package/docs/environment.mdx +7 -8
  621. package/docs/faq.mdx +3 -3
  622. package/docs/first-drive.md +5 -4
  623. package/docs/flows.md +35 -27
  624. package/docs/for-agents.md +4 -5
  625. package/docs/frameworks.mdx +32 -21
  626. package/docs/getting-started.md +65 -61
  627. package/docs/human-control.md +16 -16
  628. package/docs/index.mdx +15 -42
  629. package/docs/install-agentic.mdx +22 -37
  630. package/docs/install-manual.mdx +23 -13
  631. package/docs/instrumentation.mdx +5 -3
  632. package/docs/integration-patterns.md +7 -7
  633. package/docs/license-activation.mdx +1 -1
  634. package/docs/multi-agent-testing.md +24 -6
  635. package/docs/packages/babel-plugin.mdx +4 -2
  636. package/docs/packages/browser.mdx +16 -10
  637. package/docs/packages/core.mdx +12 -5
  638. package/docs/packages/electron.mdx +3 -2
  639. package/docs/packages/engine.mdx +1 -1
  640. package/docs/packages/eslint-plugin.mdx +18 -12
  641. package/docs/packages/next.mdx +8 -7
  642. package/docs/packages/open-verification.mdx +1 -1
  643. package/docs/packages/server.mdx +5 -5
  644. package/docs/packages/tauri.mdx +9 -9
  645. package/docs/packages/test.mdx +4 -10
  646. package/docs/packages/vite-plugin.mdx +32 -4
  647. package/docs/packages.mdx +11 -15
  648. package/docs/platform-integration.md +6 -5
  649. package/docs/predicates.mdx +40 -24
  650. package/docs/quickstart.mdx +69 -30
  651. package/docs/required-checks.md +8 -7
  652. package/docs/reticle-manual.md +15 -5
  653. package/docs/skill-file.mdx +17 -79
  654. package/docs/skill-setup.md +9 -9
  655. package/docs/skill.md +200 -0
  656. package/docs/system-map.md +7 -7
  657. package/docs/telemetry.md +23 -25
  658. package/docs/testing.md +4 -4
  659. package/docs/token-efficiency.md +12 -12
  660. package/docs/tools/act-and-wait.mdx +9 -2
  661. package/docs/tools/act-sequence.mdx +6 -7
  662. package/docs/tools/act.mdx +2 -2
  663. package/docs/tools/assert.mdx +18 -17
  664. package/docs/tools/console.mdx +9 -9
  665. package/docs/tools/inspect.mdx +16 -7
  666. package/docs/tools/look.mdx +24 -0
  667. package/docs/tools/navigate.mdx +5 -3
  668. package/docs/tools/network.mdx +2 -2
  669. package/docs/tools/observe.mdx +6 -6
  670. package/docs/tools/overview.mdx +34 -33
  671. package/docs/tools/query.mdx +5 -5
  672. package/docs/tools/session-and-feedback.mdx +22 -13
  673. package/docs/tools/sessions.mdx +8 -8
  674. package/docs/tools/snapshot.mdx +6 -5
  675. package/docs/tools/state.mdx +9 -9
  676. package/docs/tools/tools-and-run.mdx +26 -24
  677. package/docs/tools/verify.mdx +28 -0
  678. package/docs/tools/wait-for.mdx +8 -4
  679. package/docs/troubleshooting.mdx +21 -6
  680. package/docs/usage.md +55 -46
  681. package/docs/use-cases.mdx +3 -3
  682. package/docs/vs-chrome-devtools-mcp.mdx +9 -6
  683. package/docs/vs-playwright-mcp.mdx +3 -1
  684. package/docs/what-is-recorded.md +17 -5
  685. package/docs/what-is-reticle.mdx +5 -3
  686. package/docs/why-reticle.mdx +1 -1
  687. package/package.json +9 -12
  688. package/dist/command/cli/demo/demo-page.d.ts +0 -78
  689. package/dist/command/cli/demo/demo-page.js +0 -241
  690. package/dist/command/cli/demo/demo-run.d.ts +0 -38
  691. package/dist/command/cli/demo/demo-run.js +0 -138
  692. package/dist/features/harness/driver.d.ts +0 -50
  693. package/dist/features/harness/driver.js +0 -236
  694. package/dist/features/harness/jev-driver.d.ts +0 -188
  695. package/dist/features/harness/jev-driver.js +0 -678
  696. package/dist/features/harness/openai-driver.d.ts +0 -58
  697. package/dist/features/harness/openai-driver.js +0 -206
  698. package/dist/judgement/hunt/hunt-report.d.ts +0 -49
  699. package/dist/judgement/hunt/hunt-report.js +0 -84
  700. package/dist/language/flows/buddy-status.d.ts +0 -25
  701. package/dist/language/flows/buddy-status.js +0 -32
  702. package/dist/language/flows/change/watch-batcher.d.ts +0 -18
  703. package/dist/language/flows/change/watch-batcher.js +0 -19
  704. package/dist/memory/cloud/harness-offer.d.ts +0 -44
  705. package/dist/memory/cloud/harness-offer.js +0 -145
  706. package/dist/memory/project/dir/fill-value-store.d.ts +0 -32
  707. package/dist/memory/project/dir/fill-value-store.js +0 -88
  708. package/dist/surface/tools/feature-capture.d.ts +0 -151
  709. package/dist/surface/tools/feature-capture.js +0 -235
  710. package/dist/surface/tools/tool-hit-rate.d.ts +0 -87
  711. package/dist/surface/tools/tool-hit-rate.js +0 -90
  712. package/dist/telemetry/harness-drive.d.ts +0 -4
  713. package/dist/telemetry/harness-drive.js +0 -35
  714. package/dist/telemetry/identify.d.ts +0 -22
  715. package/dist/telemetry/identify.js +0 -73
  716. package/docs/cli/capsules.mdx +0 -70
  717. package/docs/cli/hunt.mdx +0 -73
  718. package/docs/cli/identify.mdx +0 -76
  719. package/docs/cli/kill.mdx +0 -91
  720. package/docs/cli/watch.mdx +0 -62
  721. package/docs/local-registry.md +0 -143
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Two-way testing: the coding agent's verdict on a goal beside the Harness's, compared.
3
+ *
4
+ * The agent knows where everything is; the Harness starts with one sentence. Agent proved and
5
+ * Harness could not find is a discoverability finding (where a newcomer gives up), not noise. Only
6
+ * a DECIDED agent verdict (yes or no) on a claim naming the goal's text is compared: an undecided one
7
+ * says nothing either way, and a claim about something else is not the same goal.
8
+ */
9
+ import { DisparityKind, JournalVerdictEffectSchema, MAX_DISPARITY_SEARCHED, Verified, VerifiedReason, } from '@reticlehq/core';
10
+ /** The decided verdicts the connected agent itself made: actions no Harness drove. */
11
+ export function agentVerdictsIn(actions) {
12
+ return actions.flatMap((action) => {
13
+ if (action.drivenBy !== undefined)
14
+ return [];
15
+ const parsed = JournalVerdictEffectSchema.safeParse(action.effect);
16
+ if (!parsed.success)
17
+ return [];
18
+ const { claim, verified } = parsed.data;
19
+ return Verified.YES === verified || Verified.NO === verified ? [{ claim, verified }] : [];
20
+ });
21
+ }
22
+ /** The comparison for one goal, or undefined when the agent made no decided claim about it. */
23
+ export function disparityFor(check, agent, search) {
24
+ if (true === check.absent)
25
+ return undefined;
26
+ const wanted = comparable(check.text);
27
+ const said = agent.filter((v) => claimed(v.claim).includes(wanted)).at(-1);
28
+ if (said === undefined)
29
+ return undefined;
30
+ // On the page before the drive began: plainly findable, never "hard to find" (persona 22).
31
+ const alreadyShown = true === check.reason?.startsWith(VerifiedReason.ALREADY_TRUE);
32
+ const harnessYes = Verified.YES === check.verified || alreadyShown;
33
+ const agentYes = Verified.YES === said.verified;
34
+ const kind = agentYes
35
+ ? harnessYes
36
+ ? DisparityKind.FINDABLE
37
+ : DisparityKind.DISCOVERABILITY
38
+ : harnessYes
39
+ ? DisparityKind.AGENT_ASSUMPTION
40
+ : DisparityKind.DEFECT;
41
+ const searched = (search?.searched ?? []).slice(-MAX_DISPARITY_SEARCHED);
42
+ return {
43
+ goal: check.text,
44
+ kind,
45
+ agent: said,
46
+ harness: {
47
+ verified: asVerified(check.verified),
48
+ found: alreadyShown || (search?.found ?? harnessYes),
49
+ searched,
50
+ ...(search?.gaveUpAt === undefined ? {} : { gaveUpAt: search.gaveUpAt }),
51
+ },
52
+ };
53
+ }
54
+ /**
55
+ * Text as two writers of the same words would both put it: no case, no quote marks of any kind, one
56
+ * space. A claim reads `text containing ‘Free shipping threshold’`; the goal is the bare words.
57
+ */
58
+ const comparable = (text) => text
59
+ .toLowerCase()
60
+ .replace(/["'“”‘’`]/g, '')
61
+ .replace(/\s+/g, ' ')
62
+ .trim();
63
+ /**
64
+ * What a claim says IS there: its "the absence of …" clauses claim the opposite, so they are cut.
65
+ * ponytail: a clause ends at `;` or `)`, as `describeWaitTarget` writes them; a goal text holding
66
+ * either inside an absence would keep its tail.
67
+ */
68
+ const ABSENCE = /the absence of [^;)]*/g;
69
+ const claimed = (claim) => comparable(claim).replace(ABSENCE, '');
70
+ const VERIFIED = new Set(Object.values(Verified));
71
+ const asVerified = (value) => VERIFIED.has(value) ? value : Verified.UNKNOWN;
@@ -0,0 +1,16 @@
1
+ export interface FakePage {
2
+ tree: string;
3
+ /** Text on the page that is below the fold: a scroll-to finds it, a read of the tree does not. */
4
+ below?: readonly string[];
5
+ /** What pressing a ref does: go to a route, or show another tree on the same route (a menu). */
6
+ press?: Record<string, {
7
+ to: string;
8
+ } | {
9
+ opens: string;
10
+ }>;
11
+ }
12
+ export declare function fakeApp(pages: Record<string, FakePage>, start: string): {
13
+ invoke: (name: string, args: Record<string, unknown>) => Promise<unknown>;
14
+ calls: [string, Record<string, unknown>][];
15
+ route: () => string;
16
+ };
@@ -0,0 +1,49 @@
1
+ /**
2
+ * A pretend app for the exploratory Harness's tests: pages by route, each a snapshot tree, some
3
+ * text only a scroll reaches, and what each control does when pressed. It answers the same tool
4
+ * calls the daemon's toolset does, so the search and the survey run against it unchanged.
5
+ */
6
+ import { ReticleTool, asRecord } from '@reticlehq/core';
7
+ export function fakeApp(pages, start) {
8
+ let route = start;
9
+ let overlay;
10
+ const calls = [];
11
+ const page = () => pages[route] ?? { tree: '- heading "Not found"' };
12
+ const tree = () => overlay ?? page().tree;
13
+ const invoke = (name, args) => {
14
+ calls.push([name, args]);
15
+ switch (name) {
16
+ case ReticleTool.SNAPSHOT:
17
+ return Promise.resolve({ tree: tree(), status: { route: `${route}` } });
18
+ case ReticleTool.NAVIGATE:
19
+ route = String(args['url']);
20
+ overlay = undefined;
21
+ return Promise.resolve({ ok: true, confirmed: true });
22
+ case ReticleTool.ACT:
23
+ case ReticleTool.ACT_AND_WAIT: {
24
+ const effect = page().press?.[String(args['ref'])];
25
+ if (effect !== undefined && 'to' in effect) {
26
+ route = effect.to;
27
+ overlay = undefined;
28
+ }
29
+ else if (effect !== undefined)
30
+ overlay = effect.opens;
31
+ return Promise.resolve({ ok: true });
32
+ }
33
+ case ReticleTool.SCROLL_TO: {
34
+ const value = String(args['value']);
35
+ return Promise.resolve({
36
+ found: tree().includes(value) || true === page().below?.includes(value),
37
+ });
38
+ }
39
+ case ReticleTool.ASSERT: {
40
+ const contains = String(asRecord(args['predicate'])['contains']);
41
+ const shown = tree().includes(contains) || true === page().below?.includes(contains);
42
+ return Promise.resolve({ verified: shown ? 'yes' : 'no' });
43
+ }
44
+ default:
45
+ return Promise.resolve({ pass: true });
46
+ }
47
+ };
48
+ return { invoke, calls, route: () => route };
49
+ }
@@ -0,0 +1,26 @@
1
+ import type { HarnessMap } from '@reticlehq/core/artifacts';
2
+ import { type Invoke } from './page-tree.js';
3
+ /** Presses the hunt may spend: enough for a menu, its item and a tab, or a few toggles. */
4
+ export declare const SEARCH_MOVES = 10;
5
+ export interface GoalSearch {
6
+ found: boolean;
7
+ /** Where it was found. */
8
+ at?: string;
9
+ /** Each place looked at and each press made, in order: `/runs`, `/runs: button "Team"`. */
10
+ searched: string[];
11
+ /** The last place looked at, when it was not found. */
12
+ gaveUpAt?: string;
13
+ }
14
+ /** Hunt for `goal`, leaving the tab where it was found. */
15
+ export declare function searchForGoal(invoke: Invoke, options: {
16
+ goal: string;
17
+ journey?: string;
18
+ map?: HarnessMap;
19
+ moves?: number;
20
+ /** Text the Harness wrote itself: a match inside it is not the goal found. */
21
+ own?: readonly string[];
22
+ /** The pages the drive reached, in order: the goal may be on one it left. */
23
+ reached?: readonly string[];
24
+ }): Promise<GoalSearch>;
25
+ /** The mapped pages that show the goal, then the ones the journey names by heading. */
26
+ export declare function mappedPagesFor(map: HarnessMap | undefined, goal: string, journey: string): string[];
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Search before grading: a goal the drive did not end on is hunted for, the way a person would,
3
+ * before anything is said about it.
4
+ *
5
+ * Every Harness miss in the persona drives had one shape: it graded where it stood. It judged an
6
+ * Impact text on /runs, stopped one click short of "Team", read an empty search result as the
7
+ * answer, called an opened menu a wrong guess, and walked past a goal it had reached. This hunt is
8
+ * deterministic (no model) and bounded: from the page the drive ended on it tries the toggles and
9
+ * tabs, then the controls the journey names (a menu that opens is followed into its items), then the
10
+ * same page without its query, then the pages the map says show the goal, then the pages the drive
11
+ * reached. It never fills a field
12
+ * and never presses a name on the never-pressed list. Each place it looks is kept, so "not found"
13
+ * says where it searched, and a goal it did not find is undecided, never a failure.
14
+ */
15
+ import { ReticleTool } from '@reticlehq/core';
16
+ import { lookFor } from '../goals.js';
17
+ import { journeyNames, namedControls, navLinks, overlayOpen, parseTree, readPage, toggles, withoutQuery, } from './page-tree.js';
18
+ /** Presses the hunt may spend: enough for a menu, its item and a tab, or a few toggles. */
19
+ export const SEARCH_MOVES = 10;
20
+ /** Shortest heading matched against the journey; shorter ones match by accident. */
21
+ const MIN_HEADING = 4;
22
+ /** How deep a chain of presses goes from one page: menu, item, tab. */
23
+ const MAX_DEPTH = 3;
24
+ const label = (line) => `${line.role} "${line.name}"`;
25
+ /** Hunt for `goal`, leaving the tab where it was found. */
26
+ export async function searchForGoal(invoke, options) {
27
+ const { goal } = options;
28
+ const journey = options.journey ?? '';
29
+ const searched = [];
30
+ const looked = new Set();
31
+ const pressed = new Set();
32
+ let left = options.moves ?? SEARCH_MOVES;
33
+ let at;
34
+ let reopened = false;
35
+ /** Look here, then press what a person would press here, deeper while presses are left. */
36
+ const explore = async (depth) => {
37
+ const page = await readPage(invoke);
38
+ if (page === undefined)
39
+ return false;
40
+ searched.push(page.route);
41
+ looked.add(page.route);
42
+ if (await lookFor(invoke, goal, options.own)) {
43
+ at = page.route;
44
+ return true;
45
+ }
46
+ if (MAX_DEPTH <= depth)
47
+ return false;
48
+ // Read again, settled by the look: a page read as it loaded offered none of its controls.
49
+ const lines = parseTree((await readPage(invoke))?.tree ?? page.tree);
50
+ // A menu or dialog the drive left open hides the page behind it: the live drive's hunt read the
51
+ // workspace switcher and nothing else. Close it by reloading the page, once, and look again.
52
+ if (0 === depth && !reopened && overlayOpen(lines)) {
53
+ reopened = true;
54
+ return (await go(page.route)) && explore(0);
55
+ }
56
+ // What the journey names on this page first ("press Run plan"), then the toggles, then the
57
+ // named links that leave it: a switcher pressed as a toggle opened its menu over the plan page,
58
+ // and the button the journey named was never pressed.
59
+ const named = namedControls(lines, journey);
60
+ const leaving = new Set(navLinks(lines));
61
+ const tries = [
62
+ ...new Set([
63
+ ...named.filter((l) => !leaving.has(l)),
64
+ ...toggles(lines),
65
+ ...named.filter((l) => leaving.has(l)),
66
+ ].map(label)),
67
+ ];
68
+ const overlaid = overlayOpen(lines);
69
+ for (const name of tries) {
70
+ const key = `${page.route}: ${name}`;
71
+ if (pressed.has(key))
72
+ continue;
73
+ if (left <= 0)
74
+ return false;
75
+ // Found again on a fresh read: a ref does not survive the page coming back.
76
+ const now = await readPage(invoke);
77
+ const line = parseTree(now?.tree ?? '').find((l) => l.ref !== undefined && label(l) === name);
78
+ if (line?.ref === undefined)
79
+ continue;
80
+ pressed.add(key);
81
+ left -= 1;
82
+ searched.push(key);
83
+ try {
84
+ await invoke(ReticleTool.ACT, { ref: line.ref, action: 'click' });
85
+ }
86
+ catch {
87
+ continue;
88
+ }
89
+ if (await explore(depth + 1))
90
+ return true;
91
+ // Back where it pressed from, with nothing it opened left over the page to hide the rest.
92
+ const back = await readPage(invoke);
93
+ const leftOpen = !overlaid && overlayOpen(parseTree(back?.tree ?? ''));
94
+ if (back !== undefined && (back.route !== page.route || leftOpen))
95
+ await go(page.route);
96
+ }
97
+ return false;
98
+ };
99
+ const go = async (route) => {
100
+ try {
101
+ await invoke(ReticleTool.NAVIGATE, { url: route });
102
+ return true;
103
+ }
104
+ catch {
105
+ return false;
106
+ }
107
+ };
108
+ const start = await readPage(invoke);
109
+ if (await explore(0))
110
+ return { found: true, ...(at === undefined ? {} : { at }), searched };
111
+ // A search or a filter that emptied the list, undone.
112
+ const elsewhere = [
113
+ ...(start === undefined || withoutQuery(start.route) === start.route
114
+ ? []
115
+ : [withoutQuery(start.route)]),
116
+ ...mappedPagesFor(options.map, goal, journey),
117
+ // Newest first: the drive's last page before it moved on is where a saved thing shows.
118
+ ...[...(options.reached ?? [])].reverse(),
119
+ ];
120
+ for (const route of elsewhere) {
121
+ if (looked.has(route) || left <= 0)
122
+ continue;
123
+ if (!(await go(route)))
124
+ continue;
125
+ if (await explore(1))
126
+ return { found: true, ...(at === undefined ? {} : { at }), searched };
127
+ }
128
+ const gaveUpAt = searched.at(-1);
129
+ return { found: false, searched, ...(gaveUpAt === undefined ? {} : { gaveUpAt }) };
130
+ }
131
+ /** The mapped pages that show the goal, then the ones the journey names by heading. */
132
+ export function mappedPagesFor(map, goal, journey) {
133
+ if (map === undefined)
134
+ return [];
135
+ const wanted = goal.toLowerCase();
136
+ const said = journey.toLowerCase();
137
+ const showing = map.pages.filter((p) => p.texts.some((t) => t.toLowerCase().includes(wanted)));
138
+ // A page whose controls name what the journey asks for: Memory is a link on Flows.
139
+ const leading = map.pages.filter((p) => p.controls.some((c) => journeyNames(said, /"([^"]*)"/.exec(c)?.[1] ?? '')));
140
+ const named = map.pages.filter((p) => p.heading !== undefined &&
141
+ MIN_HEADING <= p.heading.length &&
142
+ said.includes(p.heading.toLowerCase()));
143
+ return [...new Set([...showing, ...leading, ...named].map((p) => p.route))];
144
+ }
@@ -0,0 +1,49 @@
1
+ export type Invoke = (name: string, args: Record<string, unknown>) => Promise<unknown>;
2
+ /** One element line: ` - button "Team" (ref=e252) [pressed]`. */
3
+ export interface TreeLine {
4
+ depth: number;
5
+ role: string;
6
+ name: string;
7
+ ref?: string;
8
+ states: string[];
9
+ /** The element's own text, `[text="…"]`, when it has no name to carry it. */
10
+ text?: string;
11
+ /** The roles of the lines it sits inside, nearest last. */
12
+ within: string[];
13
+ }
14
+ export interface PageRead {
15
+ route: string;
16
+ tree: string;
17
+ }
18
+ export declare function parseTree(tree: string): TreeLine[];
19
+ /** The page's own address: path, query and hash, without the parameters Reticle adds. */
20
+ export declare function routeOf(route: string): string;
21
+ /** The same page with no query: a search or a filter undone. */
22
+ export declare function withoutQuery(route: string): string;
23
+ /** Read the page in full. Undefined when it cannot be read. */
24
+ export declare function readPage(invoke: Invoke): Promise<PageRead | undefined>;
25
+ /** Whether a menu or dialog is open, so the read shows it and little else. */
26
+ export declare function overlayOpen(lines: readonly TreeLine[]): boolean;
27
+ /** Links in the app's navigation: where a person goes to look around. */
28
+ export declare function navLinks(lines: readonly TreeLine[]): (TreeLine & {
29
+ ref: string;
30
+ })[];
31
+ /**
32
+ * Toggles and tabs not already on: a button beside a pressed sibling (Mine | Team), and tabs, radios
33
+ * and switches. Pressing one changes what the page shows without leaving it.
34
+ */
35
+ export declare function toggles(lines: readonly TreeLine[]): (TreeLine & {
36
+ ref: string;
37
+ })[];
38
+ /**
39
+ * Controls the journey names ("open Account, choose Settings, then Members and access"): the plan
40
+ * is a hint, and these are where it points. A name like `Account: Leo Martin · Pro` matches on the
41
+ * part before its colon.
42
+ */
43
+ export declare function namedControls(lines: readonly TreeLine[], journey: string): (TreeLine & {
44
+ ref: string;
45
+ })[];
46
+ /** Whether the journey names a control: its name, or the part before its colon, as whole words. */
47
+ export declare function journeyNames(journey: string, name: string): boolean;
48
+ /** The words a page shows, as a reader would list them: headings, text and labels, not controls. */
49
+ export declare function textsOf(lines: readonly TreeLine[], max: number): string[];
@@ -0,0 +1,148 @@
1
+ /**
2
+ * A page as the exploratory Harness reads it: one full snapshot, and the controls on it that a
3
+ * person hunting for something would try — nav links, toggles and tabs, and whatever the journey
4
+ * names. Pure over the snapshot's line format (core's `snapshot-tree.ts`); no browser here.
5
+ */
6
+ import { RETICLE_URL_PARAM, ReticleTool, asRecord } from '@reticlehq/core';
7
+ const LINE = /^(\s*)-\s+([a-z]+)(?:\s+"((?:[^"\\]|\\.)*)")?(.*)$/;
8
+ const REF = /\(ref=(e\d+)\)/;
9
+ const STATES = /\[([a-z,]+)\]\s*$/;
10
+ const OWN_TEXT = /\[text="((?:[^"\\]|\\.)*)"\]/;
11
+ export function parseTree(tree) {
12
+ const out = [];
13
+ const stack = [];
14
+ for (const raw of tree.split('\n')) {
15
+ const m = LINE.exec(raw);
16
+ if (null === m)
17
+ continue;
18
+ const depth = (m[1] ?? '').length;
19
+ while (0 < stack.length && (stack.at(-1)?.depth ?? 0) >= depth)
20
+ stack.pop();
21
+ const rest = m[4] ?? '';
22
+ const ref = REF.exec(rest)?.[1];
23
+ const text = OWN_TEXT.exec(rest)?.[1];
24
+ out.push({
25
+ depth,
26
+ role: m[2] ?? '',
27
+ name: m[3] ?? '',
28
+ ...(ref === undefined ? {} : { ref }),
29
+ ...(text === undefined ? {} : { text }),
30
+ states: (STATES.exec(rest)?.[1] ?? '').split(',').filter((s) => 0 < s.length),
31
+ within: stack.map((s) => s.role),
32
+ });
33
+ stack.push({ depth, role: m[2] ?? '' });
34
+ }
35
+ return out;
36
+ }
37
+ /** The page's own address: path, query and hash, without the parameters Reticle adds. */
38
+ export function routeOf(route) {
39
+ const [pathAndQuery = '', ...hash] = route.split('#');
40
+ const [path = '', query] = pathAndQuery.split('?');
41
+ const ours = Object.values(RETICLE_URL_PARAM);
42
+ const kept = (query ?? '')
43
+ .split('&')
44
+ .filter((pair) => 0 < pair.length && !ours.some((p) => pair.startsWith(`${p}=`)))
45
+ .join('&');
46
+ return `${path || '/'}${0 === kept.length ? '' : `?${kept}`}${0 === hash.length ? '' : `#${hash.join('#')}`}`;
47
+ }
48
+ /** The same page with no query: a search or a filter undone. */
49
+ export function withoutQuery(route) {
50
+ const [pathAndQuery = '', ...hash] = route.split('#');
51
+ const path = pathAndQuery.split('?')[0] ?? '';
52
+ return `${0 === path.length ? '/' : path}${0 === hash.length ? '' : `#${hash.join('#')}`}`;
53
+ }
54
+ /** Read the page in full. Undefined when it cannot be read. */
55
+ export async function readPage(invoke) {
56
+ try {
57
+ const result = asRecord(await invoke(ReticleTool.SNAPSHOT, { mode: 'full' }));
58
+ const tree = result['tree'];
59
+ const route = asRecord(result['status'])['route'];
60
+ return 'string' === typeof tree
61
+ ? { tree, route: routeOf('string' === typeof route ? route : '/') }
62
+ : undefined;
63
+ }
64
+ catch {
65
+ return undefined;
66
+ }
67
+ }
68
+ /**
69
+ * Names the hunt never presses: each is a write, or leaves the session. The action tool's own
70
+ * destructive-action gate still applies; this keeps the search from even asking.
71
+ */
72
+ const NEVER_PRESSED = /\b(?:sign ?out|log ?out|delete|remove|leave|revoke|join|cancel|archive|reset|disconnect|accept|decline|mark as|resolve|ignore|invite|pay|buy|upgrade|save|submit|send|create|new)\b/i;
73
+ const pressable = (line) => line.ref !== undefined && 0 < line.name.length && !NEVER_PRESSED.test(line.name);
74
+ const NAV_LANDMARKS = new Set(['navigation', 'complementary', 'banner']);
75
+ const TOGGLE_ROLES = new Set(['tab', 'radio', 'switch']);
76
+ const TOGGLE_GROUPS = new Set(['group', 'toolbar', 'radiogroup', 'tablist']);
77
+ /** Roles that, open, make the rest of the page inert to a reader. */
78
+ const OVERLAYS = new Set(['menu', 'dialog', 'alertdialog', 'listbox']);
79
+ /** Whether a menu or dialog is open, so the read shows it and little else. */
80
+ export function overlayOpen(lines) {
81
+ return lines.some((l) => OVERLAYS.has(l.role));
82
+ }
83
+ const PRESSED = 'pressed';
84
+ const CHECKED = 'checked';
85
+ /** Links in the app's navigation: where a person goes to look around. */
86
+ export function navLinks(lines) {
87
+ return lines.filter((l) => 'link' === l.role && l.within.some((r) => NAV_LANDMARKS.has(r)) && pressable(l));
88
+ }
89
+ /**
90
+ * Toggles and tabs not already on: a button beside a pressed sibling (Mine | Team), and tabs, radios
91
+ * and switches. Pressing one changes what the page shows without leaving it.
92
+ */
93
+ export function toggles(lines) {
94
+ return lines.filter((l, i) => {
95
+ if (!pressable(l) || l.states.includes(PRESSED) || l.states.includes(CHECKED))
96
+ return false;
97
+ if (TOGGLE_ROLES.has(l.role))
98
+ return true;
99
+ // Only inside a group of its kind (Mine | Team, Map | List). A banner's "Hide sidebar" is
100
+ // pressed too, and the workspace switcher beside it was pressed as a toggle on a live drive.
101
+ if ('button' !== l.role || !TOGGLE_GROUPS.has(l.within.at(-1) ?? ''))
102
+ return false;
103
+ const siblings = [lines[i - 1], lines[i + 1]].filter((s) => s !== undefined && s.depth === l.depth && 'button' === s.role);
104
+ return siblings.some((s) => s.states.includes(PRESSED));
105
+ });
106
+ }
107
+ /** Shortest name matched against the journey's words; shorter ones match by accident. */
108
+ const MIN_NAMED = 4;
109
+ const ROLES_FOLLOWED = new Set(['link', 'button', 'menuitem', 'tab']);
110
+ /**
111
+ * Controls the journey names ("open Account, choose Settings, then Members and access"): the plan
112
+ * is a hint, and these are where it points. A name like `Account: Leo Martin · Pro` matches on the
113
+ * part before its colon.
114
+ */
115
+ export function namedControls(lines, journey) {
116
+ const said = journey.toLowerCase();
117
+ return lines.filter((l) => ROLES_FOLLOWED.has(l.role) && pressable(l) && journeyNames(said, l.name));
118
+ }
119
+ /** Whether the journey names a control: its name, or the part before its colon, as whole words. */
120
+ export function journeyNames(journey, name) {
121
+ const head = (name.split(':')[0] ?? '').trim().toLowerCase();
122
+ return (MIN_NAMED <= head.length && new RegExp(`\\b${escape(head)}\\b`).test(journey.toLowerCase()));
123
+ }
124
+ const escape = (text) => text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
125
+ /** Roles a person acts on rather than reads. */
126
+ const INTERACTIVE = new Set([
127
+ 'link',
128
+ 'button',
129
+ 'textbox',
130
+ 'searchbox',
131
+ 'checkbox',
132
+ 'radio',
133
+ 'switch',
134
+ 'combobox',
135
+ 'option',
136
+ 'menuitem',
137
+ 'tab',
138
+ 'slider',
139
+ 'spinbutton',
140
+ ]);
141
+ /** The words a page shows, as a reader would list them: headings, text and labels, not controls. */
142
+ export function textsOf(lines, max) {
143
+ const words = lines.flatMap((l) => [
144
+ ...(INTERACTIVE.has(l.role) || 0 === l.name.length ? [] : [l.name]),
145
+ ...(l.text === undefined ? [] : [l.text]),
146
+ ]);
147
+ return [...new Set(words)].slice(0, max);
148
+ }
@@ -0,0 +1,34 @@
1
+ import { type HarnessMap, type HarnessMapPage } from '@reticlehq/core/artifacts';
2
+ import type { ToolOutcome } from '../harness.js';
3
+ import { type Invoke, type PageRead } from './page-tree.js';
4
+ /** Presses the survey may spend: a dashboard's navigation and its toggles, not its rows. */
5
+ export declare const SURVEY_PRESSES = 12;
6
+ /** A map older than this is surveyed again; a younger one is reused and refreshed from drives. */
7
+ export declare const MAP_FRESH_MS: number;
8
+ /**
9
+ * Whether the app was surveyed for the run that started at `since` (or there is no map at all): a
10
+ * run that reused a fresh map does not sweep the whole app again.
11
+ */
12
+ export declare function surveyedSince(map: HarnessMap | undefined, since: number): boolean;
13
+ /** One page read, as the map keeps it. */
14
+ export declare function pageFrom(read: PageRead, at: number, reachedBy?: string): HarnessMapPage;
15
+ /** Pages merged by route, the newest read winning, newest first, within the map's bound. */
16
+ export declare function mergePages(map: HarnessMap, pages: readonly HarnessMapPage[], surveyedAt?: number): HarnessMap;
17
+ /** The pages a drive read in full, for refreshing the map from what it saw. */
18
+ export declare function pagesReadIn(calls: readonly ToolOutcome[], at: number): HarnessMapPage[];
19
+ /**
20
+ * Survey the app from where the tab stands, and leave the tab where it started. Every press is
21
+ * found again by its name on a fresh read of the start page, since a ref does not survive a reload.
22
+ */
23
+ export declare function surveyApp(invoke: Invoke, now: () => number, presses?: number): Promise<HarnessMap | undefined>;
24
+ /** The map from its file's text, or undefined when there is none or it does not parse. */
25
+ export declare function parseMap(text: string | undefined): HarnessMap | undefined;
26
+ /** The map as the platform takes it: pages only, the fields its engine reads. */
27
+ export declare function mapForPlatform(map: HarnessMap): {
28
+ pages: {
29
+ route: string;
30
+ heading?: string;
31
+ texts: string[];
32
+ controls: string[];
33
+ }[];
34
+ };