@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
@@ -12,11 +12,11 @@
12
12
  import { takeJsCoverage } from './js-coverage.js';
13
13
  import { stampedDriveUrl } from './drive-url-stamp.js';
14
14
  import { launchChromium } from '../../launch-chromium.js';
15
- import { chromiumLaunchHint, gotoOptions } from '../pool/playwright-launcher.js';
15
+ import { chromiumLaunchHint, gotoOptions, SCREENSHOT_DETERMINISM, captureWithChromeHidden, } from '../pool/playwright-launcher.js';
16
16
  import { BrowserLaunchKind } from '@reticlehq/core/telemetry';
17
17
  import { getSessionMetrics } from '../../telemetry/session-metrics.js';
18
18
  import { classifyConnectFailure } from '../../telemetry/connect-failure.js';
19
- import { ActionType, DriveErrorCode, DRIVE_PLAYWRIGHT_MISSING_MSG } from '@reticlehq/core';
19
+ import { ActionType, clampHoldMs, DriveErrorCode, DRIVE_PLAYWRIGHT_MISSING_MSG, explicitCodeFromArgs, InputMode, InputModeReason, pressKeyFromArgs, pressKeysFromArgs, pressModifiersFromArgs, } from '@reticlehq/core';
20
20
  import { installNetworkMocks } from './network-mock.js';
21
21
  import { attachNetworkDetail } from './network-detail.js';
22
22
  import { injectedConnectArgs } from '../pool/zero-install.js';
@@ -34,8 +34,8 @@ export function boxCenter(box) {
34
34
  return { cx: box.x + box.width / 2, cy: box.y + box.height / 2 };
35
35
  }
36
36
  /**
37
- * Which actions are driven by native pointer input. fill/type stay synthetic unless a
38
- * provider explicitly runs them.
37
+ * Which actions are driven by a native pointer. `press` is excluded on purpose — a key has no
38
+ * pointer, and widening this would change what every existing caller of it means.
39
39
  */
40
40
  export function isPointerAction(action) {
41
41
  return (action === ActionType.HOVER ||
@@ -43,37 +43,217 @@ export function isPointerAction(action) {
43
43
  action === ActionType.DBLCLICK ||
44
44
  action === ActionType.DRAG);
45
45
  }
46
+ /**
47
+ * The routing question `tryRealInput` asks: does this action have a real-input path at all? Wider
48
+ * than `isPointerAction` by `press`, which needs no coordinates.
49
+ */
50
+ export function isRealInputAction(action) {
51
+ return isPointerAction(action) || action === ActionType.PRESS;
52
+ }
53
+ /**
54
+ * A gesture that was NOT driven. No center for a key press — a zero would read as a real point.
55
+ *
56
+ * `inputMode` is SYNTHETIC: no real gesture ran, so this is the path the caller is about to take.
57
+ */
58
+ function undriven(action, box) {
59
+ const base = { performed: false, inputMode: InputMode.SYNTHETIC };
60
+ return action === ActionType.PRESS ? base : { ...base, center: boxCenter(box) };
61
+ }
46
62
  /** Settle delay after a native gesture so the reaction can begin to flush (named, not free). */
47
63
  const REAL_INPUT_SETTLE_MS = 16;
48
64
  /** Default number of interpolation steps for a native drag. */
49
65
  const DEFAULT_DRAG_STEPS = 8;
66
+ /**
67
+ * Drive a `press` with a real keyboard — coordinate-free; the key goes to whatever holds focus.
68
+ * Key and modifiers come from the same core helpers the synthetic dispatcher uses, so the two paths
69
+ * cannot read the same args differently.
70
+ *
71
+ * A `holdMs` splits the chord into down / wait / up, the same shape the page uses for a held key.
72
+ * `keyboard.press` would send it instantly instead, reporting a hold-to-confirm that never held.
73
+ * The one thing this cannot reproduce is the auto-repeat a held key emits: the driver sends a single
74
+ * keydown, where the in-page path sends the repeats a browser would. Named rather than papered over
75
+ * — an app that counts repeats needs the synthetic path, and a caller that sees a held key do
76
+ * nothing now has a reason to try it.
77
+ */
78
+ async function pressViaKeyboard(page, args, sleep, now) {
79
+ const key = pressKeyFromArgs(args);
80
+ const modifiers = pressModifiersFromArgs(args);
81
+ const chord = 0 < modifiers.length ? `${modifiers.join('+')}+${key}` : key;
82
+ const holdMs = clampHoldMs(args.holdMs);
83
+ if (0 === holdMs) {
84
+ // `press` DOES take a chord string ("Control+k"), so the tap path needs no splitting.
85
+ await page.keyboard.press(chord);
86
+ return 0;
87
+ }
88
+ /*
89
+ * `down`/`up` take ONE key each, unlike `press`: `down('Control+k')` throws
90
+ * `Unknown key: "Control+k"` — measured on a real Chromium, not assumed. The chord string the
91
+ * tap path uses therefore cannot express a hold, so the chord is split here: modifiers down in
92
+ * chord order, the key last, and released in reverse (key first, modifiers reversed), which is
93
+ * what a hand does and what an app's keyup bookkeeping expects.
94
+ *
95
+ * Without the split a held shortcut threw before a single key moved, the caller fell back to
96
+ * the synthetic path, and a real hold was impossible for any press with modifiers — the exact
97
+ * gesture `holdMs` exists for.
98
+ *
99
+ * ## Why every key that went down is tracked, and every exit path cleans up
100
+ *
101
+ * The down calls are the ones that MOVE the keyboard, and they can fail partway: `Control` goes
102
+ * down, the key after it rejects, and the driver's copy of `Control` is still held. That path
103
+ * used to fall straight to the caller's synthetic replay — which presses the same chord again on
104
+ * a keyboard that is already holding a modifier. Tracking what actually went down is what makes
105
+ * the cleanup below able to release the right keys, and only those: releasing a key that never
106
+ * went down is its own lie, and it would turn a clean failure into an unnecessary refusal.
107
+ */
108
+ const pressed = [];
109
+ const pressDown = async (k) => {
110
+ await page.keyboard.down(k);
111
+ pressed.push(k);
112
+ };
113
+ try {
114
+ for (const modifier of modifiers)
115
+ await pressDown(modifier);
116
+ await pressDown(key);
117
+ }
118
+ catch (error) {
119
+ // The chord is PARTIALLY down. Release what is held before reporting the failure; if that
120
+ // cannot be proved, `releaseKeys` throws RELEASE_FAILED and the caller refuses the replay —
121
+ // the same rule as a failed release on the ordinary path, for the same reason. Only when the
122
+ // cleanup DOES succeed is the original error safe to hand back.
123
+ await releaseKeys(page, pressed);
124
+ throw error;
125
+ }
126
+ const startedAt = now();
127
+ try {
128
+ await sleep(holdMs);
129
+ }
130
+ catch (error) {
131
+ // The wait failed, and the caller is about to run the synthetic path — which presses this SAME
132
+ // key a second time. If the driver's copy stays down, a held modifier then colours every later
133
+ // action for the rest of the run. Best-effort on purpose: whatever went wrong with the wait is
134
+ // the error worth reporting. A cleanup that cannot be proved is the exception — that one is a
135
+ // stuck key, and it must reach the caller as a refusal rather than be swallowed.
136
+ try {
137
+ await releaseKeys(page, pressed);
138
+ }
139
+ catch {
140
+ throw new DriveError(DriveErrorCode.RELEASE_FAILED, 'the wait failed and the keys it pressed could not be released, so they may still be held');
141
+ }
142
+ throw error;
143
+ }
144
+ // NOT best-effort: on the ordinary path a failed release is a real failure the caller must hear
145
+ // about, and swallowing it would report a press whose key is still down.
146
+ await releaseKeys(page, pressed);
147
+ return now() - startedAt;
148
+ }
149
+ /**
150
+ * Release the given keys, in reverse press order, and report a failure as one that leaves the
151
+ * keyboard UNKNOWN rather than as an ordinary provider error.
152
+ *
153
+ * Every release is attempted even after one fails: a stuck `Control` is worse than a stuck letter,
154
+ * so a failure on one key must not skip the rest. The first failure is what is thrown, since it is
155
+ * the one that happened first, and it is wrapped in `DriveError` so the caller can tell "this
156
+ * gesture failed" from "this gesture may have left a key down" — the difference between a safe
157
+ * synthetic replay and an unsafe one.
158
+ */
159
+ async function releaseKeys(page, pressed) {
160
+ let failure;
161
+ for (const k of [...pressed].reverse()) {
162
+ try {
163
+ await page.keyboard.up(k);
164
+ }
165
+ catch (error) {
166
+ failure ??= error;
167
+ }
168
+ }
169
+ if (failure !== undefined) {
170
+ throw new DriveError(DriveErrorCode.RELEASE_FAILED, `the key was pressed but could not be released, so it may still be held: ${describeFailure(failure)}`);
171
+ }
172
+ }
173
+ /**
174
+ * A thrown value as a line a reader can act on.
175
+ *
176
+ * Not `String(error)`: a non-Error thrown value (a rejected plain object, an SDK that throws a
177
+ * record) stringifies to `[object Object]`, which names nothing and hides the one fact the message
178
+ * exists to carry. Anything that is neither an Error nor a string says so rather than pretending.
179
+ */
180
+ function describeFailure(error) {
181
+ if (error instanceof Error)
182
+ return error.message;
183
+ return 'string' === typeof error ? error : 'an unknown error';
184
+ }
185
+ /**
186
+ * The `press`es this module will NOT drive: a chord that only the in-page dispatcher can express.
187
+ *
188
+ * `args.keys` asks for several keys held down TOGETHER, pressed in order and released in reverse.
189
+ * That is not a `page.keyboard.press` chord — a non-modifier key cannot appear before the last `+`
190
+ * — and a real keyboard cannot aim a key at a named element. `args.code` is the third: the driver
191
+ * presses by KEY name and offers no way to send a physical `code` that disagrees with it, so
192
+ * `{ text: 'z', code: 'KeyY' }` would strike a different key than the one asked for. All three are
193
+ * routed to the synthetic path by the caller, which reports the reason rather than pretending a
194
+ * different gesture happened.
195
+ *
196
+ * Ordered by how specifically the caller asked: `keys` then `code` name the KEY, `ref` names only
197
+ * the target. Two can apply at once, and the earlier one is the more unusual request — the reason
198
+ * should name that, not the generic "you passed a ref".
199
+ */
200
+ export function unspellablePressReason(ref, args) {
201
+ if (0 < pressKeysFromArgs(args).length) {
202
+ return InputModeReason.SYNTHETIC_MULTI_KEY_PRESS_PREFERRED;
203
+ }
204
+ if (explicitCodeFromArgs(args) !== undefined) {
205
+ return InputModeReason.SYNTHETIC_KEY_CODE_PRESS_PREFERRED;
206
+ }
207
+ if (0 < ref.length)
208
+ return InputModeReason.SYNTHETIC_ELEMENT_PRESS_PREFERRED;
209
+ return undefined;
210
+ }
50
211
  /**
51
212
  * Shared gesture executor: drive a native gesture on an already-resolved Page. Used by both the
52
213
  * CDP-attached and the launched (drive) providers so the pointer logic lives in one place.
53
214
  */
54
- export async function performGesture(page, action, box, args, sleep) {
215
+ export async function performGesture(page, action, box, args, sleep,
216
+ /** Injected so a test can assert the achieved hold deterministically; defaults to the real clock. */
217
+ now = Date.now) {
218
+ // Ahead of the box, not after it: a press addresses focus rather than a point, and the
219
+ // placeholder box its caller passes would otherwise be turned into a (0,0) that reads like a real
220
+ // location. The result reports NO `center` for the same reason.
221
+ if (action === ActionType.PRESS) {
222
+ const heldMs = await pressViaKeyboard(page, args, sleep, now);
223
+ return {
224
+ performed: true,
225
+ inputMode: InputMode.REAL,
226
+ // Omitted rather than 0 when there was no hold — see `RealInputResult.heldMs`.
227
+ ...(heldMs > 0 ? { heldMs } : {}),
228
+ };
229
+ }
55
230
  const center = boxCenter(box);
56
231
  const { cx, cy } = center;
232
+ const real = (performed) => ({
233
+ performed,
234
+ center,
235
+ inputMode: InputMode.REAL,
236
+ });
57
237
  if (action === ActionType.HOVER) {
58
238
  await page.mouse.move(cx, cy);
59
239
  await page.mouse.move(cx + 1, cy);
60
240
  await page.mouse.move(cx, cy);
61
241
  await sleep(REAL_INPUT_SETTLE_MS);
62
- return { performed: true, center };
242
+ return real(true);
63
243
  }
64
244
  if (action === ActionType.CLICK) {
65
245
  await page.mouse.move(cx, cy);
66
246
  await page.mouse.click(cx, cy);
67
- return { performed: true, center };
247
+ return real(true);
68
248
  }
69
249
  if (action === ActionType.DBLCLICK) {
70
250
  await page.mouse.move(cx, cy);
71
251
  await page.mouse.dblclick(cx, cy);
72
- return { performed: true, center };
252
+ return real(true);
73
253
  }
74
254
  if (action === ActionType.DRAG) {
75
255
  if (args.toBox === undefined)
76
- return { performed: false, center };
256
+ return real(false);
77
257
  const dst = boxCenter(args.toBox);
78
258
  const steps = args.steps ?? DEFAULT_DRAG_STEPS;
79
259
  await page.mouse.move(cx, cy);
@@ -84,34 +264,38 @@ export async function performGesture(page, action, box, args, sleep) {
84
264
  await page.mouse.move(px, py, { steps: 1 });
85
265
  }
86
266
  await page.mouse.up();
87
- return { performed: true, center };
267
+ return real(true);
88
268
  }
89
269
  if (action === ActionType.FILL || action === ActionType.TYPE) {
90
270
  await page.mouse.click(cx, cy);
91
271
  await page.keyboard.type(args.value ?? args.text ?? '');
92
- return { performed: true, center };
272
+ return real(true);
93
273
  }
94
- return { performed: false, center };
274
+ return real(false);
95
275
  }
96
- /**
97
- * Reticle paints its own dev overlay (presenter HUD + border glow) into the page. That chrome is
98
- * time-varying — the activity log and border state change with every command — so capturing it
99
- * makes a fresh screenshot of an unchanged page differ from its baseline. Hide it during capture
100
- * (Playwright applies this stylesheet only for the shot, then reverts) so visual baselines reflect
101
- * the app, not Reticle. Disabling animations settles any remaining transitions for determinism.
102
- */
103
- const HIDE_RETICLE_CHROME_CSS = '[data-reticle-overlay]{display:none !important}';
104
- const SCREENSHOT_DETERMINISM = { style: HIDE_RETICLE_CHROME_CSS, animations: 'disabled' };
105
276
  /**
106
277
  * Capture a PNG from a Playwright page. Shared by the CDP + launched providers so the
107
278
  * screenshot path lives in one place (mirrors performGesture). Returns the raw PNG bytes.
108
279
  */
109
280
  export async function capturePage(page, opts) {
110
- const buf = await page.screenshot(opts.clip !== undefined
111
- ? { ...SCREENSHOT_DETERMINISM, clip: opts.clip }
112
- : true === opts.fullPage
113
- ? { ...SCREENSHOT_DETERMINISM, fullPage: true }
114
- : { ...SCREENSHOT_DETERMINISM });
281
+ // A step capture injects nothing into the page, so Reticle's own hosts are hidden another way.
282
+ if (true === opts.cssScale) {
283
+ return captureWithChromeHidden({ evaluate: (script) => page.evaluate(script) }, () => shoot(page, opts));
284
+ }
285
+ return shoot(page, opts);
286
+ }
287
+ async function shoot(page, opts) {
288
+ const buf = await page.screenshot(opts.jpegQuality !== undefined
289
+ ? {
290
+ type: 'jpeg',
291
+ quality: opts.jpegQuality,
292
+ ...(true === opts.cssScale ? { scale: 'css' } : {}),
293
+ }
294
+ : opts.clip !== undefined
295
+ ? { ...SCREENSHOT_DETERMINISM, clip: opts.clip }
296
+ : true === opts.fullPage
297
+ ? { ...SCREENSHOT_DETERMINISM, fullPage: true }
298
+ : { ...SCREENSHOT_DETERMINISM });
115
299
  return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);
116
300
  }
117
301
  const nodeSleep = (ms) => new Promise((resolve) => {
@@ -138,6 +322,7 @@ const cdpConnect = async (url) => {
138
322
  export class CdpRealInputProvider {
139
323
  #cdpUrl;
140
324
  #sleep;
325
+ #now;
141
326
  #connect;
142
327
  #onNetworkDetail;
143
328
  /** Pages already listening. #pageFor resolves on EVERY call, so without this each action would add
@@ -149,6 +334,7 @@ export class CdpRealInputProvider {
149
334
  constructor(options) {
150
335
  this.#cdpUrl = options.cdpUrl;
151
336
  this.#sleep = options.sleep ?? nodeSleep;
337
+ this.#now = options.now ?? Date.now;
152
338
  this.#connect = options.connect ?? cdpConnect;
153
339
  this.#onNetworkDetail = options.onNetworkDetail;
154
340
  }
@@ -205,8 +391,8 @@ export class CdpRealInputProvider {
205
391
  async perform(sessionUrl, action, box, args) {
206
392
  const page = await this.#pageFor(sessionUrl);
207
393
  if (page === undefined)
208
- return { performed: false, center: boxCenter(box) };
209
- return performGesture(page, action, box, args, this.#sleep);
394
+ return undriven(action, box);
395
+ return performGesture(page, action, box, args, this.#sleep, this.#now);
210
396
  }
211
397
  /** PNG of the correlated page, or undefined if none matches. */
212
398
  async screenshot(sessionUrl, opts) {
@@ -309,6 +495,7 @@ export class LaunchedRealInputProvider {
309
495
  #driveUrl;
310
496
  #headless;
311
497
  #sleep;
498
+ #now;
312
499
  #launch;
313
500
  #injectConnect;
314
501
  #storageState;
@@ -321,6 +508,7 @@ export class LaunchedRealInputProvider {
321
508
  this.#driveUrl = options.driveUrl;
322
509
  this.#headless = options.headless;
323
510
  this.#sleep = options.sleep ?? nodeSleep;
511
+ this.#now = options.now ?? Date.now;
324
512
  this.#launch = options.launch ?? launchedChromium;
325
513
  this.#injectConnect = options.injectConnect;
326
514
  this.#storageState = options.storageState;
@@ -438,8 +626,8 @@ export class LaunchedRealInputProvider {
438
626
  perform(_sessionUrl, action, box, args) {
439
627
  const page = this.#livePage();
440
628
  if (page === undefined)
441
- return Promise.resolve({ performed: false, center: boxCenter(box) });
442
- return performGesture(page, action, box, args, this.#sleep);
629
+ return Promise.resolve(undriven(action, box));
630
+ return performGesture(page, action, box, args, this.#sleep, this.#now);
443
631
  }
444
632
  /** PNG of the owned page, or undefined before navigate / after dispose. */
445
633
  screenshot(_sessionUrl, opts) {
@@ -1,5 +1,5 @@
1
1
  import { z } from 'zod';
2
- import { CDP_NO_PROVIDER_REASON, CDP_NO_PROVIDER_RECOMMENDATION } from '@reticlehq/core';
2
+ import { CDP_NO_PROVIDER_REASON, VIEWPORT_NO_PROVIDER_RECOMMENDATION } from '@reticlehq/core';
3
3
  import { ReticleTool } from '@reticlehq/core';
4
4
  import { sessionIdShape } from '../../surface/tools/tool-kit.js';
5
5
  import { MAX_VIEWPORT_PX, MIN_VIEWPORT_PX, viewportPxSchema, } from '../../surface/tools/args/numeric-bounds.js';
@@ -16,7 +16,7 @@ function viewportProvider(deps) {
16
16
  export const VIEWPORT_TOOLS = [
17
17
  {
18
18
  name: ReticleTool.VIEWPORT,
19
- description: 'Pin the DRIVEN page (needs `reticle drive`) to a fixed viewport size so a screenshot baseline is ' +
19
+ description: 'Pin the DRIVEN or LEASED page (needs `reticle drive`, or `reticle_lease` acquire when there is no CDP provider) to a fixed viewport size so a screenshot baseline is ' +
20
20
  'reproducible across machines — the missing piece of CI-stable visual regression, alongside ' +
21
21
  'reticle_visual_diff `masks` and a frozen clock (reticle_clock). Set it once before reticle_screenshot / ' +
22
22
  'reticle_visual_diff. Returns { applied, width, height } or the no-provider recommendation.',
@@ -60,7 +60,7 @@ export const VIEWPORT_TOOLS = [
60
60
  height: 0,
61
61
  ok: false,
62
62
  reason: CDP_NO_PROVIDER_REASON,
63
- recommendation: CDP_NO_PROVIDER_RECOMMENDATION,
63
+ recommendation: VIEWPORT_NO_PROVIDER_RECOMMENDATION,
64
64
  };
65
65
  },
66
66
  },
@@ -10,7 +10,7 @@
10
10
  * the thin Playwright adapter that satisfies these interfaces lives separately.
11
11
  */
12
12
  import { type SeedStorage } from '@reticlehq/core';
13
- import type { Launcher, PooledMockRule } from './pool-contract.js';
13
+ import type { Launcher, PooledMockRule, ScreenshotOptions } from './pool-contract.js';
14
14
  export type { InitScriptHandle, Launcher, PooledBrowser, PooledContext, PooledCookie, PooledDialog, PooledMockRule, PooledPage, } from './pool-contract.js';
15
15
  /** A leased context+page for one flow. `release` frees the slot and closes the context. */
16
16
  export interface Lease {
@@ -42,9 +42,17 @@ interface BrowserPoolOptions {
42
42
  * the ~450KB build is only read if some page ever needs it; undefined when there is none to give.
43
43
  */
44
44
  zeroInstallScript?: () => string | undefined;
45
+ /**
46
+ * Launches a browser with a window, for a lease somebody wants to watch. Launched only when the
47
+ * first headed lease is asked for. Absent: a headed lease is refused.
48
+ */
49
+ launchHeaded?: Launcher;
45
50
  }
51
+ /** What a headed lease is refused with where no window can be opened. */
52
+ export declare const NO_HEADED_BROWSER = "no headed browser can be opened here";
46
53
  /**
47
- * Owns a single browser and leases isolated contexts out of it, capped at `maxContexts`.
54
+ * Owns a headless browser (and, when asked, a headed one) and leases isolated contexts out of them,
55
+ * capped at `maxContexts` across both.
48
56
  * Not exported as a singleton — the daemon owns one instance.
49
57
  */
50
58
  export declare class BrowserPool {
@@ -60,15 +68,17 @@ export declare class BrowserPool {
60
68
  /** The sessionIds of every currently leased context — used to report/group leased sessions. */
61
69
  leasedSessionIds(): string[];
62
70
  /**
63
- * The public session id of an active lease on this origin, if we already hold one.
71
+ * The public session id of an active lease on this origin that `owner` took, if there is one.
64
72
  *
65
73
  * The lease TOOL reuses that id instead of minting a second context: a second acquire on the same
66
- * origin used to leave both tabs connected and poison default session resolution (#600). The pool's
67
- * own `acquire` still mints — the parallel suite needs isolation on purpose.
74
+ * origin used to leave both tabs connected and poison default session resolution (#600). Only the
75
+ * caller that took the lease gets it back: handing it to whoever asked put two agents in one tab,
76
+ * each one's verdicts resting on the other's actions (#1226). A caller with no owner cannot be told
77
+ * apart from another, so it always gets its own. The pool's own `acquire` still mints.
68
78
  *
69
79
  * Prefers the alias the agent was given, when the app registered under its own name.
70
80
  */
71
- leaseIdOnOrigin(origin: string): string | undefined;
81
+ leaseIdOnOrigin(origin: string, owner: string | undefined): string | undefined;
72
82
  /**
73
83
  * Release a lease by its sessionId (closes the context, frees the slot). No-op if unknown.
74
84
  *
@@ -90,6 +100,12 @@ export declare class BrowserPool {
90
100
  * that would have read a computed value.
91
101
  */
92
102
  alias(registeredId: string, leaseId: string): void;
103
+ /**
104
+ * Whether `sessionId` is a live lease that `owner` may let go of: one it took, or one taken by a
105
+ * caller with no id, which cannot be told apart from it. Another agent's lease is never this
106
+ * caller's to close (#1226).
107
+ */
108
+ heldBy(sessionId: string, owner: string | undefined): boolean;
93
109
  /** Mark a lease as still in use (called on agent activity) so the reaper doesn't reclaim it. */
94
110
  touch(sessionId: string): void;
95
111
  /**
@@ -106,9 +122,15 @@ export declare class BrowserPool {
106
122
  * Touches the lease like any other tool call, so capturing keeps it alive rather than letting the
107
123
  * reaper take it out from under a diff.
108
124
  */
109
- screenshotLease(sessionId: string, opts?: {
110
- fullPage?: boolean;
111
- }): Promise<Uint8Array | undefined>;
125
+ screenshotLease(sessionId: string, opts?: ScreenshotOptions): Promise<Uint8Array | undefined>;
126
+ /** The URL a lease was opened on — the one that carries its Reticle identity. */
127
+ leaseUrl(sessionId: string): string | undefined;
128
+ /**
129
+ * Navigate a leased page through the browser. For a lease whose page has no SDK to take the
130
+ * command — a navigate to an image left the lease unreachable, and the next navigate answered "no
131
+ * connected session". False when this is not a lease or the page would not go.
132
+ */
133
+ gotoLease(sessionId: string, url: string, timeoutMs?: number): Promise<boolean>;
112
134
  /**
113
135
  * Move the real pointer on a leased page, or false when this session is not a lease or cannot
114
136
  * hover. Same optional-capability contract as screenshotLease: absence must read as "could not
@@ -136,6 +158,28 @@ export declare class BrowserPool {
136
158
  height: number;
137
159
  }): Promise<boolean>;
138
160
  setMocksLease(sessionId: string, rules: readonly PooledMockRule[]): Promise<boolean>;
161
+ /** What a lease was granted when it opened, or undefined for a session that is not a lease. */
162
+ permissionsOf(sessionId: string): readonly string[] | undefined;
163
+ /**
164
+ * Whether this lease's page runs a caller-supplied init script — a stub of the bindings a desktop
165
+ * shell injects. Alias-resolved like every agent-facing lookup, and false for any session that is
166
+ * not a lease with a stub, so a verdict can say when it was measured against a fake shell.
167
+ */
168
+ stubInstalled(sessionId: string): boolean;
169
+ /**
170
+ * The init script this lease installed, or undefined when it runs none. Alias-resolved like
171
+ * `stubInstalled`. The lease tool compares it to the script a caller asks for: the same text means
172
+ * the held tab already is what was asked for, so it is reused rather than released and remade.
173
+ */
174
+ hostStubScript(sessionId: string): string | undefined;
175
+ /**
176
+ * What the leased page's `Notification.permission` says, or undefined when it cannot be asked.
177
+ *
178
+ * Read back rather than inferred from the grant, because the headless shell answers `denied`
179
+ * after a notifications grant — see context-permissions.ts. Bounded, so a page that never answers
180
+ * reads as "could not ask" instead of holding the caller.
181
+ */
182
+ notificationPermission(sessionId: string): Promise<string | undefined>;
139
183
  sweepExpired(): Promise<string[]>;
140
184
  /**
141
185
  * How many leases this pool has reclaimed for going stale.
@@ -167,6 +211,19 @@ export declare class BrowserPool {
167
211
  signal?: AbortSignal;
168
212
  sessionId?: string;
169
213
  seedStorage?: SeedStorage;
214
+ owner?: string;
215
+ /** In a browser with a window the person can watch. */
216
+ headed?: boolean;
217
+ /**
218
+ * JavaScript installed before any page script runs, for this lease only. A view built for a
219
+ * desktop shell calls bindings the shell injects (`window.go`, `window.runtime`, a preload
220
+ * object) on mount; a stub here is what lets it reach its data path in a leased tab.
221
+ */
222
+ initScript?: string;
223
+ /** Granted on the lease's origin before the first navigation, so the first render sees them. */
224
+ permissions?: readonly string[];
225
+ /** Accept a self-signed or local-CA dev certificate for this lease's context only (#1255). */
226
+ ignoreHTTPSErrors?: boolean;
170
227
  }): Promise<Lease>;
171
228
  /**
172
229
  * The websocket address this lease's page reported it could not reach, if it reported one.
@@ -181,4 +238,8 @@ export declare class BrowserPool {
181
238
  lastDialogMessage(sessionId: string): string | undefined;
182
239
  /** Close every context and the browser. Pending waiters are rejected (the pool is terminal now). */
183
240
  shutdown(): Promise<void>;
241
+ /** Whether this lease's context skips certificate checks. A context cannot change it later. */
242
+ ignoresHTTPSErrors(sessionId: string): boolean;
243
+ /** Whether this lease lives in the headed browser. */
244
+ isHeaded(sessionId: string): boolean;
184
245
  }