@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,150 @@
1
+ /**
2
+ * Map first: before the Harness pursues a goal, it surveys the app, cheaply and with no model.
3
+ *
4
+ * Persona drives missed goals that sat one page away: the drive committed to a route, a prediction
5
+ * missed, and it graded where it stood. A person new to an app looks around first. The survey reads
6
+ * the start page, presses each nav link and each toggle once (never a field, never a name on the
7
+ * never-pressed list), reads where that leads, and goes back. The map is kept per app and refreshed
8
+ * by every drive's own reads, so the survey runs again only when the map is old.
9
+ */
10
+ import { PredicateKind, ReticleTool, SnapshotMode, asRecord } from '@reticlehq/core';
11
+ import { HarnessMapLimit, HarnessMapSchema, } from '@reticlehq/core/artifacts';
12
+ import { navLinks, overlayOpen, parseTree, readPage, routeOf, textsOf, toggles, } from './page-tree.js';
13
+ /** Presses the survey may spend: a dashboard's navigation and its toggles, not its rows. */
14
+ export const SURVEY_PRESSES = 12;
15
+ /** A map older than this is surveyed again; a younger one is reused and refreshed from drives. */
16
+ export const MAP_FRESH_MS = 24 * 60 * 60 * 1000;
17
+ /** How long a page gets to settle after a press before it is read. */
18
+ const SETTLE_MS = 3000;
19
+ /**
20
+ * Whether the app was surveyed for the run that started at `since` (or there is no map at all): a
21
+ * run that reused a fresh map does not sweep the whole app again.
22
+ */
23
+ export function surveyedSince(map, since) {
24
+ return map === undefined || since <= map.surveyedAt;
25
+ }
26
+ /** One page read, as the map keeps it. */
27
+ export function pageFrom(read, at, reachedBy) {
28
+ const lines = parseTree(read.tree);
29
+ const heading = lines.find((l) => 'heading' === l.role && 0 < l.name.length)?.name;
30
+ const clip = (t) => t.slice(0, HarnessMapLimit.TEXT);
31
+ return {
32
+ route: clip(read.route),
33
+ ...(heading === undefined ? {} : { heading: clip(heading) }),
34
+ texts: textsOf(lines, HarnessMapLimit.TEXTS).map(clip),
35
+ controls: lines
36
+ .filter((l) => l.ref !== undefined && 0 < l.name.length)
37
+ .slice(0, HarnessMapLimit.CONTROLS)
38
+ .map((l) => clip(`${l.role} "${l.name}"`)),
39
+ ...(reachedBy === undefined ? {} : { reachedBy: clip(reachedBy) }),
40
+ at,
41
+ };
42
+ }
43
+ /** Pages merged by route, the newest read winning, newest first, within the map's bound. */
44
+ export function mergePages(map, pages, surveyedAt = map.surveyedAt) {
45
+ const byRoute = new Map(map.pages.map((p) => [p.route, p]));
46
+ for (const page of pages) {
47
+ const was = byRoute.get(page.route);
48
+ if (was === undefined || was.at <= page.at) {
49
+ const reachedBy = page.reachedBy ?? was?.reachedBy;
50
+ byRoute.set(page.route, { ...page, ...(reachedBy === undefined ? {} : { reachedBy }) });
51
+ }
52
+ }
53
+ const pagesOut = [...byRoute.values()]
54
+ .sort((a, b) => b.at - a.at)
55
+ .slice(0, HarnessMapLimit.PAGES);
56
+ return { surveyedAt, pages: pagesOut };
57
+ }
58
+ /** The pages a drive read in full, for refreshing the map from what it saw. */
59
+ export function pagesReadIn(calls, at) {
60
+ return calls.flatMap((call) => {
61
+ // Only a full read of an unobstructed page: a quick read has no text, and a page behind an open
62
+ // menu reads as the menu. Either one once replaced the survey's page and emptied the map.
63
+ if (ReticleTool.SNAPSHOT !== call.name || call.isError)
64
+ return [];
65
+ if (SnapshotMode.FULL !== asRecord(call.args)['mode'])
66
+ return [];
67
+ const result = asRecord(call.result);
68
+ const tree = result['tree'];
69
+ const route = asRecord(result['status'])['route'];
70
+ if ('string' !== typeof tree || 'string' !== typeof route)
71
+ return [];
72
+ if (overlayOpen(parseTree(tree)))
73
+ return [];
74
+ return [pageFrom({ tree, route: routeOf(route) }, at)];
75
+ });
76
+ }
77
+ const label = (line) => `${line.role} "${line.name}"`;
78
+ async function settle(invoke) {
79
+ try {
80
+ await invoke(ReticleTool.WAIT_FOR, {
81
+ predicate: { kind: PredicateKind.SETTLED },
82
+ timeout_ms: SETTLE_MS,
83
+ });
84
+ }
85
+ catch {
86
+ /* a page that never settles is read as it stands */
87
+ }
88
+ }
89
+ /**
90
+ * Survey the app from where the tab stands, and leave the tab where it started. Every press is
91
+ * found again by its name on a fresh read of the start page, since a ref does not survive a reload.
92
+ */
93
+ export async function surveyApp(invoke, now, presses = SURVEY_PRESSES) {
94
+ let start = await readPage(invoke);
95
+ if (start === undefined)
96
+ return undefined;
97
+ // A menu left open hides the page behind it: reload it once before reading what it offers.
98
+ if (overlayOpen(parseTree(start.tree))) {
99
+ await invoke(ReticleTool.NAVIGATE, { url: start.route }).catch(() => undefined);
100
+ start = (await readPage(invoke)) ?? start;
101
+ }
102
+ const pages = [pageFrom(start, now())];
103
+ const startLines = parseTree(start.tree);
104
+ const targets = [...navLinks(startLines), ...toggles(startLines)]
105
+ .map(label)
106
+ .filter((name, i, all) => all.indexOf(name) === i)
107
+ .slice(0, presses);
108
+ for (const target of targets) {
109
+ try {
110
+ const here = await readPage(invoke);
111
+ const line = parseTree(here?.tree ?? '').find((l) => l.ref !== undefined && label(l) === target);
112
+ if (line?.ref === undefined)
113
+ continue;
114
+ await invoke(ReticleTool.ACT, { ref: line.ref, action: 'click' });
115
+ await settle(invoke);
116
+ const read = await readPage(invoke);
117
+ if (read !== undefined)
118
+ pages.push(pageFrom(read, now(), target));
119
+ if (read !== undefined && read.route !== start.route)
120
+ await invoke(ReticleTool.NAVIGATE, { url: start.route });
121
+ }
122
+ catch {
123
+ /* a press that fails is a page the map does not have */
124
+ }
125
+ }
126
+ return mergePages({ surveyedAt: now(), pages: [] }, pages, now());
127
+ }
128
+ /** The map from its file's text, or undefined when there is none or it does not parse. */
129
+ export function parseMap(text) {
130
+ if (text === undefined)
131
+ return undefined;
132
+ try {
133
+ const parsed = HarnessMapSchema.safeParse(JSON.parse(text));
134
+ return parsed.success ? parsed.data : undefined;
135
+ }
136
+ catch {
137
+ return undefined;
138
+ }
139
+ }
140
+ /** The map as the platform takes it: pages only, the fields its engine reads. */
141
+ export function mapForPlatform(map) {
142
+ return {
143
+ pages: map.pages.map((p) => ({
144
+ route: p.route,
145
+ ...(p.heading === undefined ? {} : { heading: p.heading }),
146
+ texts: p.texts,
147
+ controls: p.controls,
148
+ })),
149
+ };
150
+ }
@@ -1,77 +1,7 @@
1
1
  /**
2
- * What to type into a field, and the one place in a drive worth paying a generating model for.
2
+ * What to type into a text field, from its label alone.
3
3
  *
4
- * A System One model answers typed questions against a state; it cannot write a string. That is not
5
- * a shortcoming to route around everywhere — it is why the drive is two orders of magnitude cheaper,
6
- * and every decision it makes (which tool, which element, what should follow) is a decision, not a
7
- * composition. But a text field is a composition. "A card number", "a search term that returns
8
- * results", "a description a human would write" cannot be enumerated from the page, and a label-keyed
9
- * table of guesses is what stands in for them today.
10
- *
11
- * ## Why this is escalation rather than partnership
12
- *
13
- * Put a generating model in the per-turn loop and you pay its per-turn tax on every step, which is
14
- * the cost the cheap driver exists to avoid. Typing is a small minority of what a drive does —
15
- * clicks and navigations are the overwhelming majority — so the model is called for the few steps
16
- * that compose text, never for the many that select, and a drive with no text fields never calls it
17
- * at all.
18
- *
19
- * ## Why it is cached, and cached where it is
20
- *
21
- * A generated value is paid for ONCE and then belongs to the project: the same field on the same
22
- * app wants the same value tomorrow, and a replay must send exactly what the recording sent or it
23
- * is not a replay. Writing them to `.reticle` makes the second drive free, makes the values
24
- * reviewable by a human who can correct a bad one by hand, and keeps them out of the model's way
25
- * entirely. It is the same economics as the flows themselves: pay once, replay forever.
26
- *
27
- * ## What it must never do
28
- *
29
- * Fill a slot, never propose a call. The driver decides what to click and what to claim; this
30
- * answers one question — "what text goes in this box" — and a wrong answer costs one act, not a
31
- * wrong verdict. Nothing here touches what is judged.
32
- */
33
- import { type HarnessDriverOptions } from './driver.js';
34
- import { type OpenAiDriverOptions } from './openai-driver.js';
35
- /** What the caller must be able to do for values to survive past this drive. */
36
- export interface FillCache {
37
- get(label: string): string | undefined;
38
- set(label: string, value: string): void;
39
- }
40
- /**
41
- * The fallback, and still the answer for most fields.
42
- *
43
- * An exploration drive needs PLAUSIBLE input, not creative input: the engine is judging what the app
44
- * did with the value, not the value. A field that rejects everything here is itself worth finding,
45
- * and shows up as an act that did not settle.
4
+ * Used by the crawl, which fills a field to see what the app does with it and never needs the value
5
+ * to be clever. The Harness fills fields on the platform, where its engine decides them.
46
6
  */
47
7
  export declare function heuristicFillValue(label: string): string;
48
- /**
49
- * Whether a label is worth spending a model call on.
50
- *
51
- * The heuristic is RIGHT about an email box and an amount box, and a generated "john@example.com"
52
- * is not an improvement on `harness@reticle.dev`. What it cannot do is a field whose label it does
53
- * not recognise at all, where it falls back to typing the words "reticle harness" into whatever the
54
- * app asked for. That fallback is the whole of what generation is for.
55
- */
56
- export declare function needsGeneration(label: string): boolean;
57
- /**
58
- * The seam the driver calls: a label in, a value out, always.
59
- *
60
- * Three layers, cheapest first, and the expensive one is skipped entirely unless the two above it
61
- * have nothing better than "type the words reticle harness into this box".
62
- */
63
- export declare function fillValues(deps: {
64
- cache?: FillCache;
65
- /** GPT, the generator a Jev drive pairs with. Asked ahead of `generator` when both are set. */
66
- openai?: OpenAiDriverOptions;
67
- /** Anthropic, for a machine that holds only that key. */
68
- generator?: HarnessDriverOptions;
69
- /** One line about where the drive is, so a value suits the page it is typed on. */
70
- context?: () => string;
71
- /**
72
- * A value the user SUPPLIED for this field — the same `RETICLE_SECRET_<FIELD>` replay reads for
73
- * a redacted one. Checked first so a drive gets past a login, and never cached: the cache is a
74
- * file on disk.
75
- */
76
- secret?: (label: string) => string | undefined;
77
- }): (label: string) => Promise<string>;
@@ -1,55 +1,8 @@
1
1
  /**
2
- * What to type into a field, and the one place in a drive worth paying a generating model for.
2
+ * What to type into a text field, from its label alone.
3
3
  *
4
- * A System One model answers typed questions against a state; it cannot write a string. That is not
5
- * a shortcoming to route around everywhere — it is why the drive is two orders of magnitude cheaper,
6
- * and every decision it makes (which tool, which element, what should follow) is a decision, not a
7
- * composition. But a text field is a composition. "A card number", "a search term that returns
8
- * results", "a description a human would write" cannot be enumerated from the page, and a label-keyed
9
- * table of guesses is what stands in for them today.
10
- *
11
- * ## Why this is escalation rather than partnership
12
- *
13
- * Put a generating model in the per-turn loop and you pay its per-turn tax on every step, which is
14
- * the cost the cheap driver exists to avoid. Typing is a small minority of what a drive does —
15
- * clicks and navigations are the overwhelming majority — so the model is called for the few steps
16
- * that compose text, never for the many that select, and a drive with no text fields never calls it
17
- * at all.
18
- *
19
- * ## Why it is cached, and cached where it is
20
- *
21
- * A generated value is paid for ONCE and then belongs to the project: the same field on the same
22
- * app wants the same value tomorrow, and a replay must send exactly what the recording sent or it
23
- * is not a replay. Writing them to `.reticle` makes the second drive free, makes the values
24
- * reviewable by a human who can correct a bad one by hand, and keeps them out of the model's way
25
- * entirely. It is the same economics as the flows themselves: pay once, replay forever.
26
- *
27
- * ## What it must never do
28
- *
29
- * Fill a slot, never propose a call. The driver decides what to click and what to claim; this
30
- * answers one question — "what text goes in this box" — and a wrong answer costs one act, not a
31
- * wrong verdict. Nothing here touches what is judged.
32
- */
33
- import { DEFAULT_HARNESS_BASE_URL, } from './driver.js';
34
- import { DEFAULT_OPENAI_MODEL, OPENAI_REASONING_EFFORT, openAiCompletionsUrl, } from './openai-driver.js';
35
- /** Deliberately small. A field value is a phrase; anything longer is the model misunderstanding. */
36
- const MAX_TOKENS = 64;
37
- const ANTHROPIC_VERSION = '2023-06-01';
38
- const MESSAGES_PATH = '/v1/messages';
39
- /**
40
- * How many values one drive will generate.
41
- *
42
- * The cache makes the steady state nearly free, but the FIRST drive on a form-heavy app is the one
43
- * that pays, and an uncapped loop on a page with forty inputs is a bill nobody agreed to. Past the
44
- * cap the heuristic answers, which is what every drive used before this existed.
45
- */
46
- const MAX_PER_DRIVE = 12;
47
- /**
48
- * The fallback, and still the answer for most fields.
49
- *
50
- * An exploration drive needs PLAUSIBLE input, not creative input: the engine is judging what the app
51
- * did with the value, not the value. A field that rejects everything here is itself worth finding,
52
- * and shows up as an act that did not settle.
4
+ * Used by the crawl, which fills a field to see what the app does with it and never needs the value
5
+ * to be clever. The Harness fills fields on the platform, where its engine decides them.
53
6
  */
54
7
  export function heuristicFillValue(label) {
55
8
  const l = label.toLowerCase();
@@ -71,122 +24,3 @@ export function heuristicFillValue(label) {
71
24
  return '42';
72
25
  return 'reticle harness';
73
26
  }
74
- /**
75
- * Whether a label is worth spending a model call on.
76
- *
77
- * The heuristic is RIGHT about an email box and an amount box, and a generated "john@example.com"
78
- * is not an improvement on `harness@reticle.dev`. What it cannot do is a field whose label it does
79
- * not recognise at all, where it falls back to typing the words "reticle harness" into whatever the
80
- * app asked for. That fallback is the whole of what generation is for.
81
- */
82
- export function needsGeneration(label) {
83
- return heuristicFillValue(label) === heuristicFillValue('');
84
- }
85
- const PROMPT = (label, context) => `A test harness is filling in a form field on a web application so it can check what the app does with the input.\n\n` +
86
- `The field is labelled: "${label}"\n` +
87
- `${context}\n\n` +
88
- `Reply with ONLY the value to type. No quotes, no explanation, no markdown. It must be something a ` +
89
- `real user would plausibly enter, and short. If the field wants an identifier or a code, invent a ` +
90
- `well-formed one.`;
91
- /**
92
- * A model's one-line answer as a field value, or nothing. A model asked for one value occasionally
93
- * answers with a sentence about the value; anything long enough to be prose is not a field value,
94
- * and typing prose proves nothing about the app.
95
- */
96
- function asValue(raw) {
97
- const text = raw?.trim().split('\n')[0];
98
- if (text === undefined || 0 === text.length)
99
- return undefined;
100
- return 80 < text.length ? undefined : text.replace(/^["']|["']$/g, '');
101
- }
102
- /** One string from GPT over Chat Completions — directly, or through the platform with its key. */
103
- async function generateWithOpenAi(options, label, context) {
104
- const call = options.fetch ?? ((url, init) => fetch(url, init));
105
- try {
106
- const res = await call(openAiCompletionsUrl(options), {
107
- method: 'POST',
108
- headers: { 'content-type': 'application/json', authorization: `Bearer ${options.apiKey}` },
109
- body: JSON.stringify({
110
- model: options.model ?? DEFAULT_OPENAI_MODEL,
111
- max_completion_tokens: MAX_TOKENS,
112
- reasoning_effort: OPENAI_REASONING_EFFORT,
113
- messages: [{ role: 'user', content: PROMPT(label, context) }],
114
- }),
115
- });
116
- if (!res.ok)
117
- return undefined;
118
- const parsed = JSON.parse(await res.text());
119
- return asValue(parsed.choices?.[0]?.message?.content ?? undefined);
120
- }
121
- catch {
122
- return undefined;
123
- }
124
- }
125
- /** One string from a generating model, or nothing. Never throws: a drive must not fail over a field. */
126
- async function generateOne(options, label, context) {
127
- const call = options.fetch ?? ((url, init) => fetch(url, init));
128
- const baseUrl = options.baseUrl ?? DEFAULT_HARNESS_BASE_URL;
129
- try {
130
- const res = await call(`${baseUrl}${MESSAGES_PATH}`, {
131
- method: 'POST',
132
- headers: {
133
- 'content-type': 'application/json',
134
- 'x-api-key': options.apiKey,
135
- 'anthropic-version': ANTHROPIC_VERSION,
136
- },
137
- body: JSON.stringify({
138
- model: options.model ?? 'claude-sonnet-5',
139
- max_tokens: MAX_TOKENS,
140
- messages: [{ role: 'user', content: PROMPT(label, context) }],
141
- }),
142
- });
143
- if (!res.ok)
144
- return undefined;
145
- const parsed = JSON.parse(await res.text());
146
- const content = parsed.content ?? [];
147
- return asValue(content
148
- .filter((block) => 'text' === block.type)
149
- .map((block) => block.text ?? '')
150
- .join(''));
151
- }
152
- catch {
153
- // Offline, refused, rate-limited, malformed. All the same answer: use the heuristic.
154
- return undefined;
155
- }
156
- }
157
- /**
158
- * The seam the driver calls: a label in, a value out, always.
159
- *
160
- * Three layers, cheapest first, and the expensive one is skipped entirely unless the two above it
161
- * have nothing better than "type the words reticle harness into this box".
162
- */
163
- export function fillValues(deps) {
164
- let spent = 0;
165
- return async (label) => {
166
- const supplied = deps.secret?.(label);
167
- if (supplied !== undefined && supplied.length > 0)
168
- return supplied;
169
- const cached = deps.cache?.get(label);
170
- if (cached !== undefined)
171
- return cached;
172
- const fallback = heuristicFillValue(label);
173
- const { openai, generator } = deps;
174
- if ((openai === undefined && generator === undefined) ||
175
- !needsGeneration(label) ||
176
- MAX_PER_DRIVE <= spent)
177
- return fallback;
178
- spent += 1;
179
- const context = deps.context?.() ?? '';
180
- const generated = openai !== undefined
181
- ? await generateWithOpenAi(openai, label, context)
182
- : generator !== undefined
183
- ? await generateOne(generator, label, context)
184
- : undefined;
185
- if (generated === undefined)
186
- return fallback;
187
- // Cached under the LABEL, not the ref: refs expire with the page, labels are what the next drive
188
- // and every replay will meet again.
189
- deps.cache?.set(label, generated);
190
- return generated;
191
- };
192
- }
@@ -0,0 +1,82 @@
1
+ /** One goal: text the page must show, or — when the persona negated it — must not. */
2
+ export interface Goal {
3
+ text: string;
4
+ /** The persona said the page must NOT show it: an absence goal, graded by asserting it is not there. */
5
+ absent?: true;
6
+ }
7
+ export interface GoalCheck {
8
+ /** The text that had to be on the page (or, for an absence goal, not on it). */
9
+ text: string;
10
+ /** Set for an absence goal. */
11
+ absent?: true;
12
+ /** The engine's verdict on it: only `yes` is proved. */
13
+ verified: string;
14
+ /** Why it was not checked, when it was not. */
15
+ reason?: string;
16
+ }
17
+ /**
18
+ * Whether `shown` — one element's text, maybe cut short with "…" — is text the Harness wrote itself
19
+ * rather than the app: one of `own` (its journey, the names of the plan and the flows it saved), in
20
+ * full or cut short, holding `goal`. A Harness asked to rename a plan stopped on the /plans list and
21
+ * was graded PROVED on every quote: the plan it had just saved was named after the journey, and the
22
+ * journey quoted them all. An element showing exactly the goal is the app's, whoever else wrote it.
23
+ */
24
+ export declare function writtenByHarness(shown: string, goal: string, own: readonly string[]): boolean;
25
+ /** The end state a goal quotes: its last quoted text that it does not negate. */
26
+ export declare function endOf(goal: string): string | undefined;
27
+ /** The observable goals in a persona: whatever it quoted, each marked absent when it was negated. */
28
+ export declare function parseGoals(persona: string | undefined): Goal[];
29
+ /** The texts a persona says must be on the page: the quoted goals it did not negate. */
30
+ export declare function goalsIn(persona: string | undefined): string[];
31
+ /**
32
+ * Check each goal on the page the drive ended on, recording ONE assert for the drive.
33
+ *
34
+ * Each quote used to be its own assert, and every assert is a check in the drive's run, so a goal
35
+ * that quotes where it starts ("from "Count is 0" to "Count is 1"") recorded a "no" for the start
36
+ * text a working app had rightly replaced, and the run synced as a failing flow. The page is let
37
+ * settle, read once, and each goal is scrolled to by its text — one below the fold read `unknown`
38
+ * on a drive that never scrolled. The one recorded assert covers the goals found. A goal not found
39
+ * is undecided, not failed: nothing here knows the drive reached the page that would show it. A
40
+ * check that cannot run is `unknown`, never skipped.
41
+ */
42
+ export declare function checkGoals(invoke: (name: string, args: Record<string, unknown>) => Promise<unknown>, goals: readonly (string | Goal)[],
43
+ /** The page as it read before the drive: a goal it already showed proves nothing at the end. */
44
+ opening?: string,
45
+ /** Text the Harness wrote itself (its journey, its plan's and flows' names): never evidence. */
46
+ own?: readonly string[]): Promise<GoalCheck[]>;
47
+ /**
48
+ * Whether the page shows `text` once it has settled, scrolled to if need be — how a person looks
49
+ * for something before saying it is not there. Records no check.
50
+ */
51
+ export declare function lookFor(invoke: (name: string, args: Record<string, unknown>) => Promise<unknown>, text: string,
52
+ /** Text the Harness wrote itself: a match inside it is not the page showing the goal. */
53
+ own?: readonly string[]): Promise<boolean>;
54
+ /** The page as it reads now, or undefined when it cannot be read. Taken before a drive starts. */
55
+ export declare function readOpening(invoke: (name: string, args: Record<string, unknown>) => Promise<unknown>): Promise<string | undefined>;
56
+ /**
57
+ * The end state the caller declared, checked like any assert.
58
+ *
59
+ * Quoted text only proves some words are on the last page, which is how a drive that never used the
60
+ * app could pass: from the field, "it only checks that I have certain titles on my page". An `expect`
61
+ * names an OUTCOME — a route reached, a request made, state changed — in the same predicate grammar
62
+ * as reticle_assert, and is graded the same way. A check that cannot run is `unknown`.
63
+ */
64
+ export declare function checkExpect(invoke: (name: string, args: Record<string, unknown>) => Promise<unknown>, predicate: Record<string, unknown>): Promise<GoalCheck>;
65
+ /** Whether the drive met the goals it was given: undefined when it was given none. */
66
+ export declare function goalsMet(checks: readonly GoalCheck[]): boolean | undefined;
67
+ /**
68
+ * Whether the drive met its goal, as the answer and the run report it. The driver's own `goalMet`
69
+ * is its word, never evidence: a run answered `goalMet: true` after zero actions on a tab that
70
+ * already showed the end state, and another with both its goals `unknown`. With goals, met exactly
71
+ * when every one was proved; with none, the driver's word stands, and only after an action ran.
72
+ * Undefined when nothing judged it.
73
+ */
74
+ export declare function goalOfDrive(claimed: boolean | undefined, checks: readonly GoalCheck[], acted: boolean): boolean | undefined;
75
+ /** One line naming the goals the drive did not prove, or undefined when it proved them all. */
76
+ export declare function unprovedGoals(checks: readonly GoalCheck[]): string | undefined;
77
+ /**
78
+ * The goals a drive is graded on: every quote, less a value the drive typed — an input, never
79
+ * evidence — except the journey's end (its last text to show), which stays even when typed: saving
80
+ * "Order 7" and then seeing it listed is the journey. Absence goals always stay.
81
+ */
82
+ export declare function endGoalsOf(goals: readonly Goal[], typed: readonly string[]): Goal[];