@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
@@ -1,6 +1,7 @@
1
1
  import * as http from 'node:http';
2
2
  import { Session } from '../session/session.js';
3
3
  import { SessionManager } from '../session/session-manager.js';
4
+ import { type HarnessRequest } from './harness-request.js';
4
5
  import { pairingTokenSource } from './pairing-token.js';
5
6
  /** A human clicked ▶ on a saved flow in the panel — replay it with no agent. Wired by the daemon. */
6
7
  type ReplayRequestHandler = (sessionId: string, flowName: string) => void;
@@ -107,10 +108,15 @@ export declare class Bridge {
107
108
  */
108
109
  attachSyncRequest(handler: () => void): void;
109
110
  /**
110
- * Register a handler for the panel's harness switch. Optional for the same reason as the above: a
111
- * bridge built without one ignores the request rather than refusing it.
111
+ * Register a handler for the panel's Harness controls (switch, Run, Stop). Optional for the same
112
+ * reason as the above: a bridge built without one ignores the request rather than refusing it.
112
113
  */
113
- attachHarnessRequest(handler: (enabled: boolean) => void): void;
114
+ attachHarnessRequest(handler: (request: HarnessRequest, session: Session) => void): void;
115
+ /**
116
+ * Register a handler for the panel's Sign in, told which tab asked (its project is linked once the
117
+ * sign-in lands). Optional, like the above: without one it is ignored.
118
+ */
119
+ attachSigninRequest(handler: (from: Session) => void): void;
114
120
  /** Register a handler to run when a session connects. Additive — every handler runs. */
115
121
  attachSessionCreate(handler: (session: Session) => void): void;
116
122
  close(): Promise<void>;
@@ -8,11 +8,13 @@ import { EventType, HumanControlKind, RETICLE_WS_PATH, ReticleMessageSchema, LOO
8
8
  import { Session } from '../session/session.js';
9
9
  import { SessionManager } from '../session/session-manager.js';
10
10
  import { tokensMatch } from './token-auth.js';
11
+ import { noteWrongPathUpgrades, wrongPathReason } from './wrong-path.js';
12
+ import { harnessRequest } from './harness-request.js';
11
13
  import { pairingTokenSource } from './pairing-token.js';
12
14
  import { log } from '../../log.js';
13
15
  import { getSessionMetrics } from '../../telemetry/session-metrics.js';
14
- import { sessionReplacedReason } from '../session/facts/session-replaced.js';
15
- import { describeSkew, sdkFix, SkewPair } from '../../command/version/version-skew.js';
16
+ import { SESSION_PARKED_REASON, sessionReplacedReason, } from '../session/facts/session-replaced.js';
17
+ import { describeSdkBehind, describeSkew, sdkFix, SDK_BEHIND_NARRATION, SkewPair, } from '../../command/version/version-skew.js';
16
18
  import { noteVersionSkew } from '../../command/version/version-nudge.js';
17
19
  import { protocolSkewReason } from './protocol-skew.js';
18
20
  import { SERVER_VERSION } from '../../command/version/identity/server-version.js';
@@ -129,23 +131,9 @@ function replayRequest(event) {
129
131
  const name = event.data['text'];
130
132
  return 'string' === typeof name && name.length > 0 ? name : undefined;
131
133
  }
132
- /**
133
- * The desired harness state if this event is the panel's switch, else undefined.
134
- *
135
- * Carries `on`/`off` rather than meaning "toggle": a double-click on a flaky connection sends two,
136
- * and two toggles land back where they started while two `on`s are the same as one.
137
- */
138
- function harnessRequest(event) {
139
- if (event.type !== EventType.HUMAN_CONTROL)
140
- return undefined;
141
- if (event.data['kind'] !== HumanControlKind.HARNESS)
142
- return undefined;
143
- const want = event.data['text'];
144
- if ('on' === want)
145
- return true;
146
- if ('off' === want)
147
- return false;
148
- return undefined;
134
+ /** True when this event is the panel's Sign in. Pure boundary narrowing, like the above. */
135
+ function isSigninRequest(event) {
136
+ return event.type === EventType.HUMAN_CONTROL && event.data['kind'] === HumanControlKind.SIGNIN;
149
137
  }
150
138
  /** True when this event is the panel's "sync now" button. Pure boundary narrowing, like the above. */
151
139
  function isSyncRequest(event) {
@@ -273,6 +261,7 @@ export class Bridge {
273
261
  /** Wired by the daemon: push to the dashboard now, because somebody asked in the panel. */
274
262
  #onSyncRequest;
275
263
  #onHarnessRequest;
264
+ #onSigninRequest;
276
265
  constructor(options) {
277
266
  const host = options.host ?? LOOPBACK_HOST;
278
267
  if ((options.token?.length ?? 0) > TRANSPORT_LIMITS.MAX_TOKEN_LENGTH) {
@@ -396,6 +385,15 @@ export class Bridge {
396
385
  this.#wss.on('error', (err) => {
397
386
  log('bridge_ws_error', { error: err.message });
398
387
  });
388
+ // A dial on any other path got a bare 400 from `ws` and left no trace for a diagnosis (#1242).
389
+ // Only a dial the origin check would have let in is the app's: a socket with no Origin is any
390
+ // local process, and recording it would tell the agent the app is running when it may not be.
391
+ noteWrongPathUpgrades(this.#wss, (path, origin) => {
392
+ log('bridge_wrong_path', { path, origin: origin ?? 'missing' });
393
+ if (origin !== undefined && this.#originAllowed(origin)) {
394
+ this.sessions.noteClosure(wrongPathReason(path, origin), this.#clock());
395
+ }
396
+ });
399
397
  this.#wss.on('connection', (socket) => {
400
398
  this.#onConnection(socket);
401
399
  });
@@ -478,6 +476,22 @@ export class Bridge {
478
476
  log('hello_invalid', { ...refused });
479
477
  this.sessions.noteClosure(WS_CLOSE_REASON.INVALID_HELLO, this.#clock(), refused);
480
478
  }
479
+ // On a LIVE session a frame that fails the schema is dropped, not answered with a close.
480
+ // The SDK reads every 1008 as permanent and stops reconnecting, so one event kind from a
481
+ // newer SDK ended the session for good, mid-drive, until a manual reload (#1413). What was
482
+ // thrown away is evidence, so it is recorded as a transport gap in this window: a verdict
483
+ // over it is downgraded rather than graded over an event nobody read. Only before hello is
484
+ // a bad frame still a terminal refusal.
485
+ if (undefined !== session) {
486
+ log('invalid_frame_dropped', { sessionId: session.id, ...peekFrameKind(text) });
487
+ session.pushEvent({
488
+ t: session.elapsed(),
489
+ type: EventType.TRANSPORT_OVERFLOW,
490
+ sessionId: session.id,
491
+ data: { dropped: 1 },
492
+ });
493
+ return;
494
+ }
481
495
  socket.close(...WS_CLOSE.INVALID_MESSAGE);
482
496
  return;
483
497
  }
@@ -543,6 +557,11 @@ export class Bridge {
543
557
  socket.close(WS_CLOSE.AUTH_FAILED[0], reason);
544
558
  return;
545
559
  }
560
+ // A window the agent detached stays detached across its own reloads. See SessionManager.park.
561
+ if (this.sessions.isParked(parsed.sessionId)) {
562
+ socket.close(1008, SESSION_PARKED_REASON);
563
+ return;
564
+ }
546
565
  const existing = this.sessions.get(parsed.sessionId);
547
566
  if (existing === undefined && this.sessions.count() >= this.#maxSessions) {
548
567
  socket.close(...WS_CLOSE.SESSION_LIMIT);
@@ -654,6 +673,16 @@ export class Bridge {
654
673
  session.versionSkew = skew;
655
674
  noteVersionSkew(SkewPair.SDK, skew);
656
675
  }
676
+ else {
677
+ // Wire-compatible but a minor or more behind: the agent hears it on its next tool call
678
+ // and the person on the overlay. Not `versionSkew`, which marks the pair as broken.
679
+ const behind = describeSdkBehind(parsed.sdkVersion, SERVER_VERSION, fixForThisProject);
680
+ if (behind !== undefined && parsed.sdkVersion !== undefined) {
681
+ log('sdk_behind', { sessionId: session.id, sdk: parsed.sdkVersion });
682
+ noteVersionSkew(SkewPair.SDK_BEHIND, behind);
683
+ session.pushNarration(SDK_BEHIND_NARRATION(parsed.sdkVersion, SERVER_VERSION), false);
684
+ }
685
+ }
657
686
  log('session_connected', { sessionId: session.id, url: session.url });
658
687
  // The one fact that separates a broken install from an unused one. Best-effort and wrapped:
659
688
  // a metric must never affect whether an app can connect. See SessionSummary.appConnects.
@@ -695,7 +724,10 @@ export class Bridge {
695
724
  // The switch is written through to the platform by the daemon, for the same reason: the
696
725
  // Session has no cloud credential and should not grow one.
697
726
  else if (harness !== undefined)
698
- this.#onHarnessRequest?.(harness);
727
+ this.#onHarnessRequest?.(harness, session);
728
+ // Signing in writes `~/.reticle`, which only the daemon may do; the panel only asks.
729
+ else if (isSigninRequest(parsed.event))
730
+ this.#onSigninRequest?.(session);
699
731
  // Pass the raw frame's byte length so the buffer doesn't re-serialize every event for accounting.
700
732
  else
701
733
  session.pushEvent(parsed.event, Buffer.byteLength(text, 'utf8'));
@@ -832,12 +864,19 @@ export class Bridge {
832
864
  this.#onSyncRequest = handler;
833
865
  }
834
866
  /**
835
- * Register a handler for the panel's harness switch. Optional for the same reason as the above: a
836
- * bridge built without one ignores the request rather than refusing it.
867
+ * Register a handler for the panel's Harness controls (switch, Run, Stop). Optional for the same
868
+ * reason as the above: a bridge built without one ignores the request rather than refusing it.
837
869
  */
838
870
  attachHarnessRequest(handler) {
839
871
  this.#onHarnessRequest = handler;
840
872
  }
873
+ /**
874
+ * Register a handler for the panel's Sign in, told which tab asked (its project is linked once the
875
+ * sign-in lands). Optional, like the above: without one it is ignored.
876
+ */
877
+ attachSigninRequest(handler) {
878
+ this.#onSigninRequest = handler;
879
+ }
841
880
  /** Register a handler to run when a session connects. Additive — every handler runs. */
842
881
  attachSessionCreate(handler) {
843
882
  this.#onSessionCreate.push(handler);
@@ -852,3 +891,24 @@ export class Bridge {
852
891
  });
853
892
  }
854
893
  }
894
+ /**
895
+ * The `kind` and event `type` of a frame that failed the schema, for the log: never its payload,
896
+ * which can carry anything the page sent. Each is a bounded string or absent.
897
+ */
898
+ function peekFrameKind(text) {
899
+ const short = (v) => 'string' === typeof v ? v.slice(0, MAX_LOGGED_FRAME_FIELD) : undefined;
900
+ try {
901
+ const json = JSON.parse(text);
902
+ const kind = short(json?.kind);
903
+ const eventType = short(json?.event?.type);
904
+ return {
905
+ ...(kind === undefined ? {} : { kind }),
906
+ ...(eventType === undefined ? {} : { eventType }),
907
+ };
908
+ }
909
+ catch {
910
+ return {};
911
+ }
912
+ }
913
+ /** How much of a frame's `kind` or event `type` the drop log keeps. */
914
+ const MAX_LOGGED_FRAME_FIELD = 64;
@@ -0,0 +1,23 @@
1
+ /**
2
+ * What the panel's Harness controls asked for, narrowed at the boundary: the autonomous switch,
3
+ * Run Harness (with an optional persona), or Stop. Keyed by the control's own wire kind.
4
+ *
5
+ * The switch carries `on`/`off` rather than meaning "toggle": a double-click on a flaky connection
6
+ * sends two, and two toggles land back where they started while two `on`s are the same as one.
7
+ */
8
+ import { HumanControlKind } from '@reticlehq/core';
9
+ export type HarnessRequest = {
10
+ kind: typeof HumanControlKind.HARNESS;
11
+ enabled: boolean;
12
+ } | {
13
+ kind: typeof HumanControlKind.HARNESS_RUN;
14
+ persona?: string;
15
+ } | {
16
+ kind: typeof HumanControlKind.HARNESS_STOP;
17
+ } | {
18
+ kind: typeof HumanControlKind.HARNESS_LINK;
19
+ };
20
+ export declare function harnessRequest(event: {
21
+ type: string;
22
+ data: Record<string, unknown>;
23
+ }): HarnessRequest | undefined;
@@ -0,0 +1,27 @@
1
+ /**
2
+ * What the panel's Harness controls asked for, narrowed at the boundary: the autonomous switch,
3
+ * Run Harness (with an optional persona), or Stop. Keyed by the control's own wire kind.
4
+ *
5
+ * The switch carries `on`/`off` rather than meaning "toggle": a double-click on a flaky connection
6
+ * sends two, and two toggles land back where they started while two `on`s are the same as one.
7
+ */
8
+ import { EventType, HumanControlKind } from '@reticlehq/core';
9
+ export function harnessRequest(event) {
10
+ if (event.type !== EventType.HUMAN_CONTROL)
11
+ return undefined;
12
+ const kind = event.data['kind'];
13
+ const text = event.data['text'];
14
+ if (HumanControlKind.HARNESS_STOP === kind || HumanControlKind.HARNESS_LINK === kind)
15
+ return { kind };
16
+ if (HumanControlKind.HARNESS_RUN === kind) {
17
+ const persona = 'string' === typeof text ? text.trim() : '';
18
+ return 0 < persona.length ? { kind, persona } : { kind };
19
+ }
20
+ if (HumanControlKind.HARNESS !== kind)
21
+ return undefined;
22
+ if ('on' === text)
23
+ return { kind, enabled: true };
24
+ if ('off' === text)
25
+ return { kind, enabled: false };
26
+ return undefined;
27
+ }
@@ -33,6 +33,15 @@ export declare function pairingTokenSource(input: {
33
33
  explicit: boolean;
34
34
  env: NodeJS.ProcessEnv;
35
35
  }): 'explicit' | 'env:RETICLE_TOKEN' | 'env:RETICLE_PAIRING_TOKEN_DIR' | 'default';
36
+ /**
37
+ * The pairing token this machine was told to use, or undefined when it was told nothing.
38
+ *
39
+ * `RETICLE_TOKEN` first, then the token file in `RETICLE_PAIRING_TOKEN_DIR`, the precedence
40
+ * `pairingTokenSource` names. A command that mints its own one-shot token for a hosted preview asks
41
+ * this first: in a container the app's plugin bakes the directory token in, and a fresh token made
42
+ * the daemon refuse the only app it was started to verify (#1251).
43
+ */
44
+ export declare function configuredPairingToken(env: NodeJS.ProcessEnv, deps: PairingTokenDeps): Promise<string | undefined>;
36
45
  export declare function pairingTokenPath(dir: string): string;
37
46
  /** Production IO adapter: 0600 file + 0700 dir so only the owner can read the secret. */
38
47
  export declare function nodePairingTokenDeps(): PairingTokenDeps;
@@ -41,6 +41,23 @@ export function pairingTokenSource(input) {
41
41
  return `env:${PAIRING_TOKEN_DIR_ENV}`;
42
42
  return 'default';
43
43
  }
44
+ /**
45
+ * The pairing token this machine was told to use, or undefined when it was told nothing.
46
+ *
47
+ * `RETICLE_TOKEN` first, then the token file in `RETICLE_PAIRING_TOKEN_DIR`, the precedence
48
+ * `pairingTokenSource` names. A command that mints its own one-shot token for a hosted preview asks
49
+ * this first: in a container the app's plugin bakes the directory token in, and a fresh token made
50
+ * the daemon refuse the only app it was started to verify (#1251).
51
+ */
52
+ export async function configuredPairingToken(env, deps) {
53
+ const token = env[ReticleEnv.TOKEN]?.trim();
54
+ if (token !== undefined && 0 < token.length)
55
+ return token;
56
+ const dir = env[PAIRING_TOKEN_DIR_ENV];
57
+ if (dir === undefined || 0 === dir.length)
58
+ return undefined;
59
+ return readOrCreatePairingToken(dir, deps);
60
+ }
44
61
  export function pairingTokenPath(dir) {
45
62
  return join(dir, ReticleDir.PAIRING_TOKEN_FILE);
46
63
  }
@@ -0,0 +1,17 @@
1
+ import type { WebSocketServer } from 'ws';
2
+ /** The path an upgrade asked for: the pathname only, because a query can carry a pairing token. */
3
+ export declare function requestedPath(url: string | undefined): string;
4
+ /**
5
+ * What the no-session diagnosis says about it. The path is in it because the path is the fix. It
6
+ * says only what the record shows: a wrong-path upgrade is answered before any origin check, so
7
+ * the client could be anything, and a sentence promising the app is running would send the agent
8
+ * away from a dev server that really is stopped. The bridge records one only from an Origin its
9
+ * handshake would have accepted.
10
+ */
11
+ export declare function wrongPathReason(path: string, origin: string): string;
12
+ /**
13
+ * Report each upgrade `ws` turns away for its path. Wraps `shouldHandle`, which `ws` documents as
14
+ * the method to override and calls for every upgrade before it answers 400, so the decision itself
15
+ * is left to `ws` and only observed here.
16
+ */
17
+ export declare function noteWrongPathUpgrades(wss: WebSocketServer, note: (path: string, origin: string | undefined) => void): void;
@@ -0,0 +1,35 @@
1
+ import { RETICLE_WS_PATH } from '@reticlehq/core';
2
+ /** Long enough for any real path, short enough that a junk request cannot fill the log line. */
3
+ const MAX_PATH_SHOWN = 80;
4
+ /** The path an upgrade asked for: the pathname only, because a query can carry a pairing token. */
5
+ export function requestedPath(url) {
6
+ const path = (url ?? '').split('?', 1)[0] ?? '';
7
+ const shown = 0 === path.length ? '/' : path;
8
+ return shown.length > MAX_PATH_SHOWN ? `${shown.slice(0, MAX_PATH_SHOWN)}…` : shown;
9
+ }
10
+ /**
11
+ * What the no-session diagnosis says about it. The path is in it because the path is the fix. It
12
+ * says only what the record shows: a wrong-path upgrade is answered before any origin check, so
13
+ * the client could be anything, and a sentence promising the app is running would send the agent
14
+ * away from a dev server that really is stopped. The bridge records one only from an Origin its
15
+ * handshake would have accepted.
16
+ */
17
+ export function wrongPathReason(path, origin) {
18
+ return (`a WebSocket upgrade from ${origin} asked for ${path} and got a 400: the bridge listens on ` +
19
+ `${RETICLE_WS_PATH} only. If that was your app, point the URL given to connect({ url }) at ` +
20
+ `the bridge path, for example ws://localhost:<port>${RETICLE_WS_PATH}.`);
21
+ }
22
+ /**
23
+ * Report each upgrade `ws` turns away for its path. Wraps `shouldHandle`, which `ws` documents as
24
+ * the method to override and calls for every upgrade before it answers 400, so the decision itself
25
+ * is left to `ws` and only observed here.
26
+ */
27
+ export function noteWrongPathUpgrades(wss, note) {
28
+ const handles = wss.shouldHandle.bind(wss);
29
+ wss.shouldHandle = (req) => {
30
+ const handled = handles(req);
31
+ if (false === handled)
32
+ note(requestedPath(req.url), req.headers.origin);
33
+ return handled;
34
+ };
35
+ }
@@ -70,6 +70,15 @@ export function toRules(value) {
70
70
  return rule;
71
71
  });
72
72
  }
73
+ /**
74
+ * The applied result, after telling the recorder. Steps driven while a mock is active are marked
75
+ * on the ambient tape, so a journey proved against mocked responses is not auto-saved as a flow
76
+ * that would replay against the real backend (#1459).
77
+ */
78
+ function mocksApplied(deps, sessionId, count) {
79
+ deps.recordings.markMocked(sessionId, 0 < count);
80
+ return { applied: true, count };
81
+ }
73
82
  export const NETWORK_MOCK_TOOLS = [
74
83
  {
75
84
  name: ReticleTool.NETWORK_MOCK,
@@ -104,14 +113,14 @@ export const NETWORK_MOCK_TOOLS = [
104
113
  if (provider !== undefined) {
105
114
  const applied = await provider.setMocks(session.url, rules);
106
115
  if (applied)
107
- return { applied: true, count: rules.length };
116
+ return mocksApplied(deps, session.id, rules.length);
108
117
  }
109
118
  // A lease is a Playwright-owned page — CDP intercept was always there, this tool just had no
110
119
  // route to it. Tried after the driven provider: when both exist, drive is the page the caller
111
120
  // means, and a lease is the fallback rather than a competitor.
112
121
  const leased = await deps.pool?.setMocksLease(session.id, rules);
113
122
  if (true === leased)
114
- return { applied: true, count: rules.length };
123
+ return mocksApplied(deps, session.id, rules.length);
115
124
  return {
116
125
  applied: false,
117
126
  count: 0,
@@ -11,7 +11,7 @@
11
11
  */
12
12
  import { type ScriptCoverage } from './js-coverage.js';
13
13
  import type { Browser, Page } from 'playwright';
14
- import { ActionType, DriveErrorCode } from '@reticlehq/core';
14
+ import { ActionType, DriveErrorCode, InputMode, InputModeReason } from '@reticlehq/core';
15
15
  import { type MockRule } from './network-mock.js';
16
16
  import { type NetworkDetail } from './network-detail.js';
17
17
  /** Viewport CSS-px box as returned by the INSPECT command (getBoundingClientRect). */
@@ -21,28 +21,74 @@ export interface ElementBox {
21
21
  width: number;
22
22
  height: number;
23
23
  }
24
- /** Args forwarded from reticle_act (fill value, type text, drag drop-target box). */
25
- export interface RealInputArgs {
24
+ /**
25
+ * Args forwarded from reticle_act (fill value, type text, press key, drag drop-target box).
26
+ *
27
+ * A `type`, not an `interface`: only the alias form gets an implicit index signature, so the core
28
+ * arg readers take it as a plain record without a cast at every call site.
29
+ */
30
+ export type RealInputArgs = {
26
31
  value?: string;
27
32
  text?: string;
33
+ /** For press: the key name, e.g. Escape or Tab. `text` also carries it; `key` is the fallback. */
34
+ key?: string;
35
+ /** For press: modifier names (Meta/Control/Shift/Alt; aliases like `cmd` accepted). */
36
+ modifiers?: string[];
37
+ /**
38
+ * For press: several keys held down TOGETHER, pressed in order and released in reverse. Read but
39
+ * never forwarded — a chord with a non-modifier key has no `page.keyboard.press` spelling, so the
40
+ * caller routes such a press to the synthetic dispatcher before it reaches here.
41
+ */
42
+ keys?: string[];
43
+ /**
44
+ * For press: how long to keep the key down between keydown and keyup. The same argument the
45
+ * synthetic path has always honoured, so a hold-to-confirm key driven through the driver holds
46
+ * for exactly as long as one driven in the page.
47
+ */
48
+ holdMs?: number;
28
49
  /** For drag: the resolved box of the drop-target ref (toRef). */
29
50
  toBox?: ElementBox;
30
51
  steps?: number;
31
- }
32
- interface RealInputResult {
52
+ };
53
+ /** What a provider reports for one driven gesture. Exported so a fake can build it by name. */
54
+ export interface RealInputResult {
33
55
  /** True if a native gesture was actually driven. */
34
56
  performed: boolean;
35
- /** Center used, for diagnostics/tests. */
36
- center: {
57
+ /** Center used, for diagnostics/tests. ABSENT for a key press: see `undriven`. */
58
+ center?: {
37
59
  cx: number;
38
60
  cy: number;
39
61
  };
62
+ /**
63
+ * Which path this result came from. `real` whenever a gesture was actually driven, so a caller
64
+ * reading it on a `performed: true` result learns nothing it did not already know — it is here
65
+ * for the `performed: false` case, where the caller is about to take the synthetic path and
66
+ * saying `real` would describe a gesture that never ran.
67
+ */
68
+ inputMode: InputMode;
69
+ /**
70
+ * How long the key was ACTUALLY held, for a real press that was asked to hold. Absent for every
71
+ * other gesture, and for a press with no `holdMs` — the same rule the synthetic path uses, where
72
+ * an absent `heldMs` means "this action does not hold" rather than "it held for no time".
73
+ *
74
+ * Measured rather than echoed back: `holdMs: 1200` against a 1200ms animation is a race by
75
+ * construction, and a throttled tab stretches the wait. A caller needs to tell "held 1200" from
76
+ * "held 1204", and can only do that with the achieved number.
77
+ */
78
+ heldMs?: number;
40
79
  }
41
80
  /** Options for a page screenshot — full-page scroll capture and/or a clip box. */
42
81
  export interface ScreenshotOpts {
43
82
  fullPage?: boolean;
44
83
  /** Restrict the capture to one element/region (viewport CSS px). */
45
84
  clip?: ElementBox;
85
+ /**
86
+ * A live picture, as a JPEG at this quality: what a person is watching, taken as it is. The
87
+ * baseline tweaks (hiding the HUD, stopping animations) would make their window flicker each second.
88
+ */
89
+ jpegQuality?: number;
90
+ /** One image pixel per CSS pixel, so a high-density display does not double a step screenshot. */
91
+ cssScale?: boolean;
46
92
  }
47
93
  /** The capability surface reticle_act depends on. A FAKE implementing this is injected in tests. */
48
94
  export interface RealInputProvider {
@@ -117,17 +163,40 @@ export declare function boxCenter(box: ElementBox): {
117
163
  cy: number;
118
164
  };
119
165
  /**
120
- * Which actions are driven by native pointer input. fill/type stay synthetic unless a
121
- * provider explicitly runs them.
166
+ * Which actions are driven by a native pointer. `press` is excluded on purpose — a key has no
167
+ * pointer, and widening this would change what every existing caller of it means.
122
168
  */
123
169
  export declare function isPointerAction(action: ActionType): boolean;
170
+ /**
171
+ * The routing question `tryRealInput` asks: does this action have a real-input path at all? Wider
172
+ * than `isPointerAction` by `press`, which needs no coordinates.
173
+ */
174
+ export declare function isRealInputAction(action: ActionType): boolean;
124
175
  type SleepFn = (ms: number) => Promise<void>;
125
176
  type ConnectFn = (url: string) => Promise<Browser>;
177
+ /**
178
+ * The `press`es this module will NOT drive: a chord that only the in-page dispatcher can express.
179
+ *
180
+ * `args.keys` asks for several keys held down TOGETHER, pressed in order and released in reverse.
181
+ * That is not a `page.keyboard.press` chord — a non-modifier key cannot appear before the last `+`
182
+ * — and a real keyboard cannot aim a key at a named element. `args.code` is the third: the driver
183
+ * presses by KEY name and offers no way to send a physical `code` that disagrees with it, so
184
+ * `{ text: 'z', code: 'KeyY' }` would strike a different key than the one asked for. All three are
185
+ * routed to the synthetic path by the caller, which reports the reason rather than pretending a
186
+ * different gesture happened.
187
+ *
188
+ * Ordered by how specifically the caller asked: `keys` then `code` name the KEY, `ref` names only
189
+ * the target. Two can apply at once, and the earlier one is the more unusual request — the reason
190
+ * should name that, not the generic "you passed a ref".
191
+ */
192
+ export declare function unspellablePressReason(ref: string, args: Record<string, unknown>): InputModeReason | undefined;
126
193
  /**
127
194
  * Shared gesture executor: drive a native gesture on an already-resolved Page. Used by both the
128
195
  * CDP-attached and the launched (drive) providers so the pointer logic lives in one place.
129
196
  */
130
- export declare function performGesture(page: Page, action: ActionType, box: ElementBox, args: RealInputArgs, sleep: SleepFn): Promise<RealInputResult>;
197
+ export declare function performGesture(page: Page, action: ActionType, box: ElementBox, args: RealInputArgs, sleep: SleepFn,
198
+ /** Injected so a test can assert the achieved hold deterministically; defaults to the real clock. */
199
+ now?: () => number): Promise<RealInputResult>;
131
200
  /**
132
201
  * Capture a PNG from a Playwright page. Shared by the CDP + launched providers so the
133
202
  * screenshot path lives in one place (mirrors performGesture). Returns the raw PNG bytes.
@@ -137,6 +206,8 @@ interface CdpProviderOptions {
137
206
  cdpUrl: string;
138
207
  /** Injected so the settle delay is deterministic in tests; defaults to a real Node timer. */
139
208
  sleep?: SleepFn;
209
+ /** Injected so a measured hold is deterministic in tests; defaults to the real clock. */
210
+ now?: () => number;
140
211
  /** Injected connector so unit tests can stub Playwright without import. */
141
212
  connect?: ConnectFn;
142
213
  /**
@@ -193,6 +264,8 @@ export interface LaunchedProviderOptions {
193
264
  headless: boolean;
194
265
  /** Injected so the settle delay is deterministic in tests; defaults to a real Node timer. */
195
266
  sleep?: SleepFn;
267
+ /** Injected so a measured hold is deterministic in tests; defaults to the real clock. */
268
+ now?: () => number;
196
269
  /** Injected launcher so unit tests can stub Playwright; defaults to dynamic import('playwright'). */
197
270
  launch?: LaunchFn;
198
271
  /** When set, re-invoke the page's reticle.connect with these after load (drive-a-hosted-preview). */