@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
@@ -17,7 +17,10 @@
17
17
  * 3. **Everything is injected** — the model, the tools, the clock. The loop below has no network in
18
18
  * it, which is what lets the whole thing be tested against a scripted model with no API key.
19
19
  */
20
+ import { ReticleTool, Verified, WRITING_RULE, asRecord } from '@reticlehq/core';
21
+ import { claimsOnlyRoute, knownPagesLine, routeHint } from './route-guess.js';
20
22
  import { withTimeout } from './with-timeout.js';
23
+ import { lookFor } from './goals.js';
21
24
  /** Why a run stopped. Every one of these is a real outcome; none of them is an error. */
22
25
  export const StopReason = {
23
26
  /** The model called `finish` — it believes it is done. */
@@ -28,7 +31,92 @@ export const StopReason = {
28
31
  STALLED: 'stalled',
29
32
  /** The toolset or the model itself failed in a way the loop cannot continue through. */
30
33
  BROKEN: 'broken',
34
+ /** A person switched autonomous driving off while it was driving. Not a failure. */
35
+ STOPPED: 'stopped',
31
36
  };
37
+ /** Thrown by a driver when a person, not a fault, ended the drive. */
38
+ export class DriveStoppedError extends Error {
39
+ }
40
+ /** The finish's judgement of the goal, and what the drive cost, when it carried them. */
41
+ function goalMetOf(args) {
42
+ const met = args['goalMet'];
43
+ const spent = args['creditsSpent'];
44
+ return {
45
+ ...('boolean' === typeof met ? { goalMet: met } : {}),
46
+ ...('number' === typeof spent ? { creditsSpent: spent } : {}),
47
+ };
48
+ }
49
+ /**
50
+ * The answer to a `finish` that came before anything was proved. Sent once per drive: a real drive
51
+ * asked to "click twice and check it reads 2" clicked once, finished, and saved a flow whose replay
52
+ * verifies nothing, which is the paid feature producing an empty pass.
53
+ */
54
+ export const MSG_FINISH_UNPROVED = `Not finished: nothing has been proved yet. Before finishing, end the journey with ` +
55
+ `${ReticleTool.ACT_AND_WAIT} and an \`until\` naming the end state it must reach, or ` +
56
+ `${ReticleTool.ASSERT} on it. A drive that proves nothing replays as "verified nothing".`;
57
+ /**
58
+ * The answer to a click repeated after it changed nothing. A persona drive clicked the logo four
59
+ * times on the page the logo leads to, each a wasted action and a wrong route guess.
60
+ */
61
+ export const MSG_REPEAT_CHANGED_NOTHING = 'Not done again: the same action on the same control just changed nothing on the page — no ' +
62
+ 'content, request, route or signal. Doing it again will not either. Look at the page and take ' +
63
+ 'the next step the journey names.';
64
+ /**
65
+ * Said on a click whose route guess missed while it opened something on the page. A persona drive
66
+ * clicked the account button expecting to leave /overview; it opened a menu, the miss read as a
67
+ * failure, and the drive abandoned the route its plan named instead of choosing "Settings" in it.
68
+ */
69
+ export const MSG_OPENED_IN_PLACE = 'This click opened something on this page (a menu, a panel, a dialog) instead of going where you ' +
70
+ 'guessed. That is progress, not a dead end: look at what it opened and act on the item the ' +
71
+ 'journey names next.';
72
+ /** A route-only guess that missed, on a click that added content: it opened something in place. */
73
+ function openedInPlace(outcome) {
74
+ if (outcome.isError || ReticleTool.ACT_AND_WAIT !== outcome.name)
75
+ return false;
76
+ if (!claimsOnlyRoute(asRecord(outcome.args)['until']))
77
+ return false;
78
+ const result = asRecord(outcome.result);
79
+ if (Verified.YES === result['verified'])
80
+ return false;
81
+ const summary = asRecord(asRecord(result['trace'])['summary']);
82
+ return 0 < (Number(summary['domAdded']) || 0);
83
+ }
84
+ /** A route-only guess that missed: the known page to go to instead, when the map knows any. */
85
+ function missedRouteHint(outcome, routes) {
86
+ if (outcome.isError || ReticleTool.ACT_AND_WAIT !== outcome.name)
87
+ return undefined;
88
+ const until = asRecord(outcome.args)['until'];
89
+ if (!claimsOnlyRoute(until) || Verified.YES === asRecord(outcome.result)['verified'])
90
+ return undefined;
91
+ return routeHint(until, routes);
92
+ }
93
+ /** The tools that act on one control, keyed by what they did to which control. */
94
+ const ACTING_TOOLS = new Set([ReticleTool.ACT, ReticleTool.ACT_AND_WAIT]);
95
+ /** What an action did to which control, or undefined for a call that does not act on one. */
96
+ function actKey(name, args) {
97
+ if (!ACTING_TOOLS.has(name))
98
+ return undefined;
99
+ const target = args['ref'] ?? args['target'];
100
+ if (target === undefined)
101
+ return undefined;
102
+ return JSON.stringify([target, args['action'] ?? null, args['value'] ?? null]);
103
+ }
104
+ /** Whether a result's reaction digest says the page did nothing at all; undefined when it has none. */
105
+ function changedNothing(result) {
106
+ const summary = asRecord(asRecord(asRecord(result)['trace'])['summary']);
107
+ if ('number' !== typeof summary['total'])
108
+ return undefined;
109
+ const moved = ['network', 'domAdded', 'domRemoved', 'domChanged', 'routeChanges', 'signals'].some((k) => 0 < (Number(summary[k]) || 0));
110
+ return !moved;
111
+ }
112
+ /** A check that ran: the only thing that turns a drive into evidence. */
113
+ function isProof(outcome) {
114
+ if (outcome.isError)
115
+ return false;
116
+ if (ReticleTool.ASSERT === outcome.name)
117
+ return true;
118
+ return ReticleTool.ACT_AND_WAIT === outcome.name && asRecord(outcome.args)['until'] !== undefined;
119
+ }
32
120
  /**
33
121
  * The one tool the harness adds to Reticle's surface.
34
122
  *
@@ -51,6 +139,10 @@ export const FINISH_TOOL = {
51
139
  additionalProperties: false,
52
140
  },
53
141
  };
142
+ /** Why a drive ended before the model said so. */
143
+ const msgReachedEnd = (end) => `Reached the end the goal names ("${end}") after a check held, so the drive stopped there.`;
144
+ /** A check in this turn that came back yes: the moment worth looking for the end. */
145
+ const heldCheck = (outcome) => isProof(outcome) && Verified.YES === asRecord(outcome.result)['verified'];
54
146
  export const DEFAULT_MAX_STEPS = 40;
55
147
  /**
56
148
  * How long a single model turn may take before the run gives up on it.
@@ -79,7 +171,7 @@ const OPENING = 'The app is loaded and connected. Begin by looking at the page,
79
171
  * deterministically for a few hundred tokens, forever. That is the whole economics of this feature,
80
172
  * so it is an instruction and not a hope.
81
173
  */
82
- export function systemPrompt(focus) {
174
+ export function systemPrompt(focus, routes = []) {
83
175
  return [
84
176
  'You are driving a real web application through a verification tool, to find out whether it actually works.',
85
177
  '',
@@ -94,7 +186,9 @@ export function systemPrompt(focus) {
94
186
  'the app is broken underneath.',
95
187
  '',
96
188
  'Drive the app the way a user would: complete whole journeys, not single clicks. Submit the forms.',
97
- 'Follow the navigation. If something looks interactive, try it.',
189
+ 'Follow the navigation. If something looks interactive, try it — unless the focus below says',
190
+ 'not to: "without opening a run", "changes nothing" and the like bind the whole drive. Read the',
191
+ 'list a journey says to read; do not open what it says to leave closed.',
98
192
  '',
99
193
  'RECORD WHAT YOU DRIVE. Before each journey call reticle_record { action: "start" }, drive it, then',
100
194
  'reticle_flow_save with a short descriptive name. A saved flow replays deterministically on every',
@@ -110,6 +204,14 @@ export function systemPrompt(focus) {
110
204
  'expectations as you go. Do not report bugs; drive the app.',
111
205
  '',
112
206
  'Call `finish` when you have covered the app or cannot get further.',
207
+ '',
208
+ WRITING_RULE,
209
+ ...(0 === routes.length
210
+ ? []
211
+ : [
212
+ '',
213
+ `Pages this app has: ${knownPagesLine(routes)}. To reach one, press its link or reticle_navigate to it; do not guess which control leads there.`,
214
+ ]),
113
215
  ...(focus === undefined ? [] : ['', `Focus for this run: ${focus}`]),
114
216
  ].join('\n');
115
217
  }
@@ -122,22 +224,44 @@ export function systemPrompt(focus) {
122
224
  export async function runHarness(driver, toolset, options = {}) {
123
225
  const maxSteps = options.maxSteps ?? DEFAULT_MAX_STEPS;
124
226
  const tools = [...toolset.tools, FINISH_TOOL];
125
- const system = systemPrompt(options.focus);
227
+ const routes = options.routes ?? [];
228
+ const system = systemPrompt(options.focus, routes);
126
229
  const history = [{ role: 'user', text: OPENING }];
127
230
  const toolCalls = [];
128
231
  const usage = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };
232
+ const proved = () => toolCalls.some(isProof);
233
+ let askedToProve = false;
234
+ // Actions that just changed nothing; forgotten as soon as any action moves the page.
235
+ const inert = new Set();
129
236
  for (let step = 0; step < maxSteps; step += 1) {
237
+ if (true === options.stopped?.()) {
238
+ return {
239
+ stopReason: StopReason.STOPPED,
240
+ summary: '',
241
+ steps: step,
242
+ toolCalls,
243
+ usage,
244
+ proved: proved(),
245
+ goalMet: false,
246
+ };
247
+ }
248
+ for (const text of options.inbox?.() ?? [])
249
+ history.push({ role: 'user', text });
130
250
  let turn;
131
251
  try {
132
252
  turn = await withTimeout(driver.turn({ system, tools, history }), options.turnTimeoutMs ?? DEFAULT_TURN_TIMEOUT_MS, 'the model did not answer');
133
253
  }
134
254
  catch (error) {
135
255
  return {
136
- stopReason: StopReason.BROKEN,
256
+ stopReason: error instanceof DriveStoppedError ? StopReason.STOPPED : StopReason.BROKEN,
137
257
  summary: '',
138
258
  steps: step,
139
259
  toolCalls,
140
260
  usage,
261
+ proved: proved(),
262
+ // Cut off is not done: the checks that held before a refusal (credits gone, a 5xx) prove
263
+ // the steps before it, never the journey, and every verdict downstream reads this.
264
+ goalMet: false,
141
265
  error: error instanceof Error ? error.message : String(error),
142
266
  };
143
267
  }
@@ -156,10 +280,38 @@ export async function runHarness(driver, toolset, options = {}) {
156
280
  steps: step + 1,
157
281
  toolCalls,
158
282
  usage,
283
+ proved: proved(),
159
284
  };
160
285
  }
161
286
  history.push({ role: 'assistant', text: turn.text, calls: turn.calls });
162
287
  const finish = turn.calls.find((call) => FINISH_TOOL.name === call.name);
288
+ if (finish !== undefined && !proved() && !askedToProve) {
289
+ // Whatever else the turn asked for runs first: a check sent alongside `finish` is proof.
290
+ const others = await Promise.all(turn.calls.filter((c) => c !== finish).map((c) => invokeOne(toolset, c)));
291
+ toolCalls.push(...others);
292
+ if (proved()) {
293
+ const summary = finish.args['summary'];
294
+ return {
295
+ stopReason: StopReason.FINISHED,
296
+ summary: 'string' === typeof summary ? summary : turn.text,
297
+ steps: step + 1,
298
+ toolCalls,
299
+ usage,
300
+ proved: true,
301
+ ...goalMetOf(finish.args),
302
+ };
303
+ }
304
+ askedToProve = true;
305
+ const refused = {
306
+ id: finish.id,
307
+ name: finish.name,
308
+ args: finish.args,
309
+ result: { error: MSG_FINISH_UNPROVED },
310
+ isError: true,
311
+ };
312
+ history.push({ role: 'tool', outcomes: [...others, refused] });
313
+ continue;
314
+ }
163
315
  if (finish !== undefined) {
164
316
  const summary = finish.args['summary'];
165
317
  return {
@@ -168,16 +320,65 @@ export async function runHarness(driver, toolset, options = {}) {
168
320
  steps: step + 1,
169
321
  toolCalls,
170
322
  usage,
323
+ proved: proved(),
324
+ ...goalMetOf(finish.args),
171
325
  };
172
326
  }
173
327
  // Every call the model asked for is answered, including ones that fail. A dropped result leaves
174
328
  // the model waiting on an answer that never comes, and it will usually re-ask — burning the
175
329
  // budget on a call that already ran, against an app it already changed.
176
- const outcomes = await Promise.all(turn.calls.map((call) => invokeOne(toolset, call)));
330
+ const outcomes = await Promise.all(turn.calls.map((call) => {
331
+ const key = actKey(call.name, call.args);
332
+ return key !== undefined && inert.has(key)
333
+ ? Promise.resolve({
334
+ id: call.id,
335
+ name: call.name,
336
+ args: call.args,
337
+ result: { error: MSG_REPEAT_CHANGED_NOTHING },
338
+ isError: true,
339
+ })
340
+ : invokeOne(toolset, call);
341
+ }));
342
+ for (const [i, outcome] of outcomes.entries()) {
343
+ const hint = openedInPlace(outcome) ? MSG_OPENED_IN_PLACE : missedRouteHint(outcome, routes);
344
+ if (hint !== undefined)
345
+ outcomes[i] = { ...outcome, result: { ...asRecord(outcome.result), next: hint } };
346
+ }
347
+ for (const outcome of outcomes) {
348
+ const key = actKey(outcome.name, outcome.args);
349
+ if (key === undefined || outcome.isError)
350
+ continue;
351
+ const nothing = changedNothing(outcome.result);
352
+ if (true === nothing)
353
+ inert.add(key);
354
+ else if (false === nothing)
355
+ inert.clear();
356
+ }
177
357
  toolCalls.push(...outcomes);
178
358
  history.push({ role: 'tool', outcomes });
359
+ const end = options.endsAt;
360
+ if (end !== undefined &&
361
+ outcomes.some(heldCheck) &&
362
+ (await lookFor((name, args) => toolset.invoke(name, args), end.text, end.own))) {
363
+ return {
364
+ stopReason: StopReason.FINISHED,
365
+ summary: msgReachedEnd(end.text),
366
+ steps: step + 1,
367
+ toolCalls,
368
+ usage,
369
+ proved: proved(),
370
+ goalMet: true,
371
+ };
372
+ }
179
373
  }
180
- return { stopReason: StopReason.BUDGET, summary: '', steps: maxSteps, toolCalls, usage };
374
+ return {
375
+ stopReason: StopReason.BUDGET,
376
+ summary: '',
377
+ steps: maxSteps,
378
+ toolCalls,
379
+ usage,
380
+ proved: proved(),
381
+ };
181
382
  }
182
383
  /**
183
384
  * One tool call, with its failure captured rather than thrown.
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Make ready the tab a platform drive runs in, as its spec asks, and say what was and was not done.
3
+ *
4
+ * The person's own tab, or one opened for the drive: headless, or in a window they can watch. Then
5
+ * the HUD as asked. Every step that cannot be done is reported, never thrown: a drive asked for a
6
+ * window on a machine with no display still runs headless if that is all there is, and says so.
7
+ */
8
+ import { HudVisibility, type DriveApplied, type DriveSpec, type SpecIgnored } from '@reticlehq/core';
9
+ /** How many times the HUD is asked for before giving up: a page's HUD mounts after it connects. */
10
+ export declare const HUD_ATTEMPTS = 4;
11
+ export declare const HUD_RETRY_MS = 500;
12
+ /** What a refused drive is told when no address was given to open. */
13
+ export declare const NO_ADDRESS_TO_OPEN = "Nothing says where this app runs, so no browser could be opened for it. Open the app once with Reticle running, or give the drive an address.";
14
+ export interface DriveTargetPorts {
15
+ /** The person's own tab for the drive, as the chat already picks it. Null: none may be driven. */
16
+ pickTab: () => Promise<string | null | undefined>;
17
+ /** Open `url` in a browser of the daemon's own; answers the tab's session id. Throws why not. */
18
+ open: (url: string, headed: boolean, hud: HudVisibility | undefined) => Promise<string>;
19
+ /** Ask the page for this HUD; throws when the page did not take it (no HUD yet, an older SDK). */
20
+ tuneHud: (sessionId: string, hud: HudVisibility) => Promise<void>;
21
+ sleep: (ms: number) => Promise<void>;
22
+ }
23
+ export interface PreparedDrive {
24
+ sessionId: string | null | undefined;
25
+ applied: DriveApplied;
26
+ ignored: SpecIgnored[];
27
+ /** Why the drive cannot run, in a person's words, when it cannot. */
28
+ refusal?: string;
29
+ }
30
+ export declare function prepareDrive(spec: DriveSpec, fallbackUrl: string | undefined, ports: DriveTargetPorts): Promise<PreparedDrive>;
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Make ready the tab a platform drive runs in, as its spec asks, and say what was and was not done.
3
+ *
4
+ * The person's own tab, or one opened for the drive: headless, or in a window they can watch. Then
5
+ * the HUD as asked. Every step that cannot be done is reported, never thrown: a drive asked for a
6
+ * window on a machine with no display still runs headless if that is all there is, and says so.
7
+ */
8
+ import { DriveMode, DriveTarget, HudVisibility, SpecIgnoredReason, } from '@reticlehq/core';
9
+ /** How many times the HUD is asked for before giving up: a page's HUD mounts after it connects. */
10
+ export const HUD_ATTEMPTS = 4;
11
+ export const HUD_RETRY_MS = 500;
12
+ /** What a refused drive is told when no address was given to open. */
13
+ export const NO_ADDRESS_TO_OPEN = 'Nothing says where this app runs, so no browser could be opened for it. Open the app once with Reticle running, or give the drive an address.';
14
+ export async function prepareDrive(spec, fallbackUrl, ports) {
15
+ const mode = spec.mode ?? DriveMode.LOCAL;
16
+ const ignored = [];
17
+ let target = spec.target ?? DriveTarget.TAB;
18
+ let sessionId;
19
+ let url;
20
+ if (DriveTarget.TAB !== target) {
21
+ url = spec.url ?? fallbackUrl;
22
+ if (url === undefined)
23
+ return {
24
+ sessionId: null,
25
+ applied: { target, mode },
26
+ ignored,
27
+ refusal: NO_ADDRESS_TO_OPEN,
28
+ };
29
+ try {
30
+ sessionId = await ports.open(url, DriveTarget.HEADED === target, spec.hud);
31
+ }
32
+ catch (error) {
33
+ const detail = error instanceof Error ? error.message : String(error);
34
+ // A window that cannot open falls back to a browser with none: the drive still runs.
35
+ if (DriveTarget.HEADED !== target)
36
+ return { sessionId: null, applied: { target, mode, url }, ignored, refusal: detail };
37
+ ignored.push({ field: 'target', reason: SpecIgnoredReason.UNAVAILABLE, detail });
38
+ target = DriveTarget.HEADLESS;
39
+ try {
40
+ sessionId = await ports.open(url, false, spec.hud);
41
+ }
42
+ catch (again) {
43
+ const why = again instanceof Error ? again.message : String(again);
44
+ return { sessionId: null, applied: { target, mode, url }, ignored, refusal: why };
45
+ }
46
+ }
47
+ }
48
+ else {
49
+ sessionId = await ports.pickTab();
50
+ }
51
+ const applied = {
52
+ target,
53
+ mode,
54
+ ...(url === undefined ? {} : { url }),
55
+ ...('string' === typeof sessionId ? { sessionId } : {}),
56
+ };
57
+ if (spec.hud !== undefined && 'string' === typeof sessionId) {
58
+ const taken = await tune(ports, sessionId, spec.hud);
59
+ if (taken === undefined)
60
+ applied.hud = spec.hud;
61
+ else
62
+ ignored.push({ field: 'hud', reason: SpecIgnoredReason.UNAVAILABLE, detail: taken });
63
+ }
64
+ return { sessionId, applied, ignored };
65
+ }
66
+ /** Ask for the HUD until the page takes it; answers why not when it never does. */
67
+ async function tune(ports, sessionId, hud) {
68
+ let why = 'the page did not take it';
69
+ for (let attempt = 1; attempt <= HUD_ATTEMPTS; attempt += 1) {
70
+ try {
71
+ await ports.tuneHud(sessionId, hud);
72
+ return undefined;
73
+ }
74
+ catch (error) {
75
+ why = error instanceof Error ? error.message : String(error);
76
+ if (attempt < HUD_ATTEMPTS)
77
+ await ports.sleep(HUD_RETRY_MS);
78
+ }
79
+ }
80
+ return why;
81
+ }
@@ -0,0 +1,127 @@
1
+ import { type CoverageCapability, type LinkAppGap, type LinkDevServer, type LinkHelloFailure, type LinkUnsyncedRoot, type LinkCapability, type LinkNotice } from '@reticlehq/core';
2
+ import { type DriveCandidate } from './remote-drive.js';
3
+ /** How often apps are reported. The platform counts an app live for two and a half of these. */
4
+ export declare const LOCAL_APPS_REPORT_MS = 10000;
5
+ /** How long a drive waits for an app it opened to connect before it is refused. */
6
+ export declare const APP_OPEN_WAIT_MS = 20000;
7
+ export interface Platform {
8
+ url: string;
9
+ apiKey: string;
10
+ }
11
+ export interface Machine {
12
+ id: string;
13
+ name: string;
14
+ }
15
+ /** One connected tab, as far as reporting and picking go. */
16
+ export interface AppTab extends DriveCandidate {
17
+ title?: string;
18
+ projectId?: string;
19
+ adapters: string[];
20
+ runtime?: string;
21
+ /** The SDK the page announced. The dashboard compares it with `reticleVersion` per app. */
22
+ sdkVersion?: string;
23
+ /** The page's HELLO channels, plus the coverage markers (`source`, `testid`) it earned. */
24
+ channels?: string[];
25
+ /** Instrumentation gaps this tab's verdicts recorded, newest first. */
26
+ gaps?: LinkAppGap[];
27
+ /** Coverage capabilities that do not apply to this app. */
28
+ notApplicable?: CoverageCapability[];
29
+ }
30
+ export interface ReportedApp {
31
+ key: string;
32
+ name: string;
33
+ url: string;
34
+ title?: string;
35
+ stack: string[];
36
+ sdkVersion?: string;
37
+ channels?: string[];
38
+ gaps?: LinkAppGap[];
39
+ adapters?: string[];
40
+ notApplicable?: CoverageCapability[];
41
+ }
42
+ /** What a report carries beside its apps. Every field additive; see `LinkReportKey`. */
43
+ export interface ReportExtras {
44
+ devServers?: LinkDevServer[];
45
+ helloFailure?: LinkHelloFailure;
46
+ unsynced?: LinkUnsyncedRoot[];
47
+ }
48
+ /** `path` under `home` as `~/...`, so no home directory leaves the machine in a report. */
49
+ export declare function homeRelative(path: string, home: string): string;
50
+ /** This machine: a stable id that is not its home path, and the name a person knows it by. */
51
+ export declare const machineOf: (hostname: string, home: string) => Machine;
52
+ /**
53
+ * One project checkout on one machine. Its port is not part of it. The tab's projectId is: a daemon
54
+ * that cannot map a project to its checkout files every such project under one shared directory.
55
+ */
56
+ export declare const appKeyOf: (machineId: string, projectDir: string, projectId: string | undefined) => string;
57
+ /** What a refused open is told. */
58
+ export declare const NOT_AN_APP_ADDRESS = "Reticle only opens a web address on this machine or one of the apps already open here.";
59
+ /**
60
+ * Whether the daemon may open an address the platform named: a web page on this machine, or one on
61
+ * an origin a connected tab already has. Never a file, and never anywhere else on the network.
62
+ */
63
+ export declare function mayOpen(url: string, openUrls: readonly string[]): boolean;
64
+ /** A project id as a name: the SDK stamps `<package>-<8 hex>`, and the hash means nothing to a person. */
65
+ export declare const nameFromProjectId: (projectId: string) => string;
66
+ /** The address as the app knows it: the params Reticle put on it to adopt a tab are not the app's. */
67
+ export declare const withoutMarks: (raw: string) => string;
68
+ /**
69
+ * The apps to report, grouped by the platform credential each one's project is linked with. The
70
+ * linked credential is reported even with no app open: it is how the chat knows the machine is there
71
+ * to open one. A tab whose project is not linked is left out: no chat can drive it.
72
+ */
73
+ export declare function appsByPlatform(tabs: readonly AppTab[], linked: Platform | undefined, machineId: string, describe: (tab: AppTab) => Promise<{
74
+ platform?: Platform;
75
+ dir: string;
76
+ name: string;
77
+ }>): Promise<{
78
+ platform: Platform;
79
+ apps: ReportedApp[];
80
+ }[]>;
81
+ type FetchLike = (url: string, init: RequestInit) => Promise<Response>;
82
+ export interface AppReportDeps {
83
+ machine: Machine;
84
+ version: string;
85
+ /** What this daemon can do for the platform: it offers a person only what is here. */
86
+ capabilities: readonly LinkCapability[];
87
+ apps: () => Promise<{
88
+ platform: Platform;
89
+ apps: ReportedApp[];
90
+ }[]>;
91
+ /**
92
+ * Open an app so it connects: one somebody asked to bring back, named by its app key so the tab
93
+ * writes into that app's own `.reticle`. A throw is logged, never fatal.
94
+ */
95
+ open: (url: string, appKey?: string) => Promise<void>;
96
+ /** A drive is waiting for the project this credential is for. */
97
+ drivePending: (platform: Platform) => void;
98
+ /** Dev servers, the last refused hello and unsent runs: read once per report. */
99
+ extras?: () => Promise<ReportExtras>;
100
+ /**
101
+ * Something the platform wants the person told ("update Reticle"), for the project this credential
102
+ * is for. Called once per notice for the daemon's life, however often the platform repeats it.
103
+ */
104
+ notify?: (notice: LinkNotice, platform: Platform) => void;
105
+ fetch?: FetchLike;
106
+ intervalMs?: number;
107
+ log?: (line: string) => void;
108
+ }
109
+ export interface AppReports {
110
+ tick: () => Promise<void>;
111
+ stop: () => void;
112
+ }
113
+ export declare function startAppReports(deps: AppReportDeps): AppReports;
114
+ /**
115
+ * Report now rather than on the next tick: the Harness gate just learned what an app's pages carry,
116
+ * and the platform, which locks a drive on its last report, would otherwise refuse on the old one.
117
+ */
118
+ export declare const reportAppsNow: () => Promise<void>;
119
+ /**
120
+ * The tab a drive the chat attached to one app uses: a tab of that app and no other, even on the
121
+ * same port. None open: open the app, and wait for it to connect. Null when it never does.
122
+ */
123
+ export declare function pickAppTab(app: {
124
+ key: string;
125
+ url: string | null;
126
+ }, goal: string, tabs: () => readonly AppTab[], keyOf: (sessionId: string) => string | undefined, open: (url: string) => Promise<void>, waitMs?: number): Promise<string | null>;
127
+ export {};