@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
@@ -20,14 +20,12 @@ export interface PooledPage {
20
20
  */
21
21
  onConsole?(handler: (text: string) => void): void;
22
22
  /**
23
- * Capture the page as a PNG. OPTIONAL, like `onConsole`: a fake that does not implement it makes
23
+ * Capture the page as a PNG, or a JPEG at `jpegQuality` (a live picture, where size matters more). OPTIONAL, like `onConsole`: a fake that does not implement it makes
24
24
  * the pool report "no provider", which is the correct degradation — an absent screenshotter must
25
25
  * read as "this context cannot be captured", never as a blank image that a visual diff would then
26
26
  * compare against and pass.
27
27
  */
28
- screenshot?(opts?: {
29
- fullPage?: boolean;
30
- }): Promise<Uint8Array>;
28
+ screenshot?(opts?: ScreenshotOptions): Promise<Uint8Array>;
31
29
  /**
32
30
  * Move the real pointer to (x, y) so CSS `:hover` applies. OPTIONAL, like `screenshot`: a fake
33
31
  * that does not implement it makes hover refuse rather than dispatch a synthetic mouseover that
@@ -66,6 +64,11 @@ export interface PooledPage {
66
64
  * existed short of restarting the daemon), because nothing in the stack ever answered it.
67
65
  */
68
66
  onDialog?(handler: (dialog: PooledDialog) => void): void;
67
+ /**
68
+ * Make this the visible tab. OPTIONAL, like `onDialog`: a page opened beside others can start
69
+ * hidden, and a hidden tab throttles timers and rAF so nothing on it verifies (#1351).
70
+ */
71
+ bringToFront?(): Promise<void>;
69
72
  }
70
73
  /** A native dialog the page opened, handed to the pool so it can be dismissed instead of left blocking. */
71
74
  export interface PooledDialog {
@@ -105,14 +108,34 @@ export interface PooledContext {
105
108
  newPage(): Promise<PooledPage>;
106
109
  close(): Promise<void>;
107
110
  addCookies?(cookies: PooledCookie[]): Promise<void>;
111
+ /**
112
+ * Grant browser permissions on this context. OPTIONAL, like `addCookies`: a context that cannot
113
+ * grant makes a lease that asked for permissions refuse, rather than open with none granted while
114
+ * the caller believes otherwise.
115
+ */
116
+ grantPermissions?(permissions: string[], opts?: {
117
+ origin?: string;
118
+ }): Promise<void>;
119
+ /** Drop every permission granted on this context. OPTIONAL, for the same reason. */
120
+ clearPermissions?(): Promise<void>;
108
121
  }
109
122
  /** The launched browser. Real Playwright `Browser` satisfies this. */
110
123
  export interface PooledBrowser {
111
124
  isConnected(): boolean;
112
- newContext(): Promise<PooledContext>;
125
+ /** `ignoreHTTPSErrors` accepts a self-signed or local-CA certificate for this context only. */
126
+ newContext(opts?: {
127
+ ignoreHTTPSErrors?: boolean;
128
+ }): Promise<PooledContext>;
113
129
  close(): Promise<void>;
114
130
  /** Fires when the browser process dies/crashes so the pool can relaunch on the next acquire. */
115
131
  onDisconnected(handler: () => void): void;
116
132
  }
117
133
  /** Produces a freshly launched browser. Injected so tests can supply a fake. */
118
134
  export type Launcher = () => Promise<PooledBrowser>;
135
+ /** How a page is captured: the whole page or the viewport, and JPEG at a quality instead of PNG. */
136
+ export interface ScreenshotOptions {
137
+ fullPage?: boolean;
138
+ jpegQuality?: number;
139
+ /** One image pixel per CSS pixel, so a high-density display does not double a step screenshot. */
140
+ cssScale?: boolean;
141
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * What the HUD shows about the coding agent: who is attached, and this tab's latest notes to it with
3
+ * whether an agent's tool call has taken each one. Read from the session's own inbox history, so
4
+ * "Seen" is shown only for a note that was actually handed to an agent.
5
+ */
6
+ import { type AgentLink } from '@reticlehq/core';
7
+ import type { InboxMessage } from './human/live-control.js';
8
+ export declare function agentLinkOf(history: readonly InboxMessage[]): AgentLink;
@@ -0,0 +1,17 @@
1
+ /**
2
+ * What the HUD shows about the coding agent: who is attached, and this tab's latest notes to it with
3
+ * whether an agent's tool call has taken each one. Read from the session's own inbox history, so
4
+ * "Seen" is shown only for a note that was actually handed to an agent.
5
+ */
6
+ import { AGENT_NOTE_MAX, AGENT_NOTES_SHOWN } from '@reticlehq/core';
7
+ import { connectedAgents } from '../../hooks/coding-agents.js';
8
+ export function agentLinkOf(history) {
9
+ return {
10
+ agents: connectedAgents(),
11
+ notes: history.slice(-AGENT_NOTES_SHOWN).map((message) => ({
12
+ text: message.text.slice(0, AGENT_NOTE_MAX),
13
+ seen: true === message.seen,
14
+ ...(message.by === undefined ? {} : { by: message.by }),
15
+ })),
16
+ };
17
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * The command a session sends its page, as wire JSON.
3
+ *
4
+ * Marked `by: harness` when the Harness is the one calling, so the HUD can show the person watching
5
+ * which of the two is driving their app. Absent means the connected agent, which is also what an
6
+ * older page that does not know the field assumes.
7
+ */
8
+ export declare function commandPayload(id: string, sessionId: string, name: string, args: Record<string, unknown>): string;
@@ -0,0 +1,24 @@
1
+ import { CommandActor, MessageKind } from '@reticlehq/core';
2
+ import { currentDrivenBy, harnessOutwardAllowed } from '../../hooks/driven-by.js';
3
+ /**
4
+ * The command a session sends its page, as wire JSON.
5
+ *
6
+ * Marked `by: harness` when the Harness is the one calling, so the HUD can show the person watching
7
+ * which of the two is driving their app. Absent means the connected agent, which is also what an
8
+ * older page that does not know the field assumes.
9
+ */
10
+ export function commandPayload(id, sessionId, name, args) {
11
+ return JSON.stringify({
12
+ kind: MessageKind.COMMAND,
13
+ id,
14
+ sessionId,
15
+ name,
16
+ args,
17
+ ...(currentDrivenBy() === undefined ? {} : { by: CommandActor.HARNESS }),
18
+ // The page presses no outward control (invite, send, delete, pay…) the journey did not ask for.
19
+ ...outwardField(harnessOutwardAllowed()),
20
+ });
21
+ }
22
+ function outwardField(allowed) {
23
+ return allowed === undefined ? {} : { outward: { allowed } };
24
+ }
@@ -1,5 +1,4 @@
1
1
  import { log } from '../../log.js';
2
- import { bindSpanContext } from '../../trace.js';
3
2
  /**
4
3
  * What the daemon answers when the rules that decide a verdict ask it for something.
5
4
  *
@@ -15,6 +14,7 @@ import { bindSpanContext } from '../../trace.js';
15
14
  export declare const noteToDaemonLog: typeof log;
16
15
  /**
17
16
  * Keep a callback belonging to the call that created it, so a re-check scheduled for later still
18
- * traces back to the wait that asked for it instead of looking like work starting from nowhere.
17
+ * traces back to the wait that asked for it instead of looking like work starting from nowhere, and
18
+ * is still the Harness's when the Harness made the call: the HUD files it by who drove it.
19
19
  */
20
- export declare const keepCallerContextInDaemon: typeof bindSpanContext;
20
+ export declare const keepCallerContextInDaemon: <A extends unknown[]>(fn: (...args: A) => void) => ((...args: A) => void);
@@ -1,5 +1,6 @@
1
1
  import { log } from '../../log.js';
2
2
  import { bindSpanContext } from '../../trace.js';
3
+ import { bindDrivenBy } from '../../hooks/driven-by.js';
3
4
  /**
4
5
  * What the daemon answers when the rules that decide a verdict ask it for something.
5
6
  *
@@ -15,6 +16,7 @@ import { bindSpanContext } from '../../trace.js';
15
16
  export const noteToDaemonLog = log;
16
17
  /**
17
18
  * Keep a callback belonging to the call that created it, so a re-check scheduled for later still
18
- * traces back to the wait that asked for it instead of looking like work starting from nowhere.
19
+ * traces back to the wait that asked for it instead of looking like work starting from nowhere, and
20
+ * is still the Harness's when the Harness made the call: the HUD files it by who drove it.
19
21
  */
20
- export const keepCallerContextInDaemon = bindSpanContext;
22
+ export const keepCallerContextInDaemon = (fn) => bindDrivenBy(bindSpanContext(fn));
@@ -16,6 +16,8 @@ export interface DevCommand {
16
16
  script?: string;
17
17
  /** The port the script PINS, when it pins one. Absent means the tool picks — never a guess. */
18
18
  port?: number;
19
+ /** The app's directory, when it is not the project root. The caller must run the command there. */
20
+ directory?: string;
19
21
  }
20
22
  /**
21
23
  * The dev command for the project in `directory`, or undefined when there is not one to be sure of.
@@ -24,3 +26,22 @@ export interface DevCommand {
24
26
  * default disk reader.
25
27
  */
26
28
  export declare function detectDevCommand(directory: string, read?: (path: string) => string | undefined): DevCommand | undefined;
29
+ /**
30
+ * The dev command for the project, looking one level down when the root has none.
31
+ *
32
+ * `reticle init` is run at the repo root, and in a monorepo the app is a directory down — so the
33
+ * daemon's "this project declares no dev script" was false for a root whose `frontend/package.json`
34
+ * held `"dev": "vite"`, and the agent asked a human for a command that was on disk (reticle#1368).
35
+ * init's own workspace listing answers which directories to consider; the root's lockfile picks the
36
+ * package manager, because a workspace package usually has no lockfile of its own.
37
+ */
38
+ export declare function detectDevCommandInProject(directory: string, read?: (path: string) => string | undefined, listDirs?: (path: string) => readonly string[]): DevCommand | undefined;
39
+ /**
40
+ * The command that wires THIS project for good: `init`, in the app's own folder, through the
41
+ * one-off runner the project's package manager ships.
42
+ *
43
+ * Handed to an agent whose install never ran `init` (an MCP-only route), so it has to be right first
44
+ * time: `init` run in a folder that is not the app stops on a missing package.json, and a runner the
45
+ * machine does not have is "command not found". npx whenever there is doubt — it ships with Node.
46
+ */
47
+ export declare function initCommandIn(directory: string, read?: (path: string) => string | undefined, listDirs?: (path: string) => readonly string[]): string;
@@ -8,9 +8,9 @@
8
8
  *
9
9
  * Pure apart from one injected reader, so every case is a unit test rather than a temp directory.
10
10
  */
11
- import { readFileSync } from 'node:fs';
11
+ import { readFileSync, readdirSync } from 'node:fs';
12
12
  import { join } from 'node:path';
13
- import { desktopLaunch } from '@reticlehq/init';
13
+ import { RETICLE_NPM_PACKAGE, desktopLaunch, workspacePackageDirs } from '@reticlehq/init';
14
14
  /**
15
15
  * Script names checked, in order.
16
16
  *
@@ -23,11 +23,27 @@ const DEV_SCRIPTS = ['dev', 'develop', 'start'];
23
23
  const LOCKFILES = [
24
24
  { file: 'pnpm-lock.yaml', manager: 'pnpm' },
25
25
  { file: 'yarn.lock', manager: 'yarn' },
26
+ { file: 'bun.lockb', manager: 'bun' },
27
+ { file: 'bun.lock', manager: 'bun' },
26
28
  ];
29
+ /** The one-off runner each manager ships, for running Reticle's CLI without installing it. */
30
+ const RUNNER = { pnpm: 'pnpm dlx', bun: 'bunx' };
31
+ const NPX = 'npx';
32
+ const YARN = 'yarn';
33
+ /** `yarn dlx` exists only on Yarn 2+, which is the yarn that writes this file; classic yarn has none. */
34
+ const YARN_BERRY_MARKER = '.yarnrc.yml';
35
+ const YARN_DLX = 'yarn dlx';
36
+ const INIT_VERB = 'init';
27
37
  const DEFAULT_PACKAGE_MANAGER = 'npm';
28
38
  const PACKAGE_JSON = 'package.json';
29
39
  /** `--port 4311` / `--port=4311`, the flag every dev server in this list accepts. */
30
40
  const PORT_FLAG = /--port[= ]\s*(\d+)/;
41
+ /**
42
+ * `-p 3005`, the short form Next, Nuxt and Astro accept (reticle#1367).
43
+ *
44
+ * Anchored to a start or a whitespace so the `-p` inside a longer flag (`--pretty`) is not a port.
45
+ */
46
+ const PORT_SHORT_FLAG = /(?:^|\s)-p\s*(\d+)/;
31
47
  /** `PORT=8080 remix dev` — the other half of how a project pins its port. */
32
48
  const PORT_ENV = /(?:^|\s)PORT=(\d+)/;
33
49
  /** Reads a file, or undefined if it is not there / not readable. */
@@ -41,7 +57,7 @@ function readTextFile(path) {
41
57
  }
42
58
  /** The port the script pins, when it pins one at all. */
43
59
  function pinnedPort(script) {
44
- const match = PORT_FLAG.exec(script) ?? PORT_ENV.exec(script);
60
+ const match = PORT_FLAG.exec(script) ?? PORT_SHORT_FLAG.exec(script) ?? PORT_ENV.exec(script);
45
61
  const digits = match?.[1];
46
62
  if (digits === undefined)
47
63
  return undefined;
@@ -68,17 +84,15 @@ function scriptsOf(manifest) {
68
84
  return {};
69
85
  return scripts;
70
86
  }
71
- /**
72
- * The dev command for the project in `directory`, or undefined when there is not one to be sure of.
73
- *
74
- * `read` is injected so the whole decision is testable without a filesystem; the daemon uses the
75
- * default disk reader.
76
- */
77
- export function detectDevCommand(directory, read = readTextFile) {
87
+ /** The package manager the lockfiles under `directory` identify. Anything else is npm. */
88
+ function packageManager(directory, read) {
89
+ return (LOCKFILES.find(({ file }) => read(join(directory, file)) !== undefined)?.manager ??
90
+ DEFAULT_PACKAGE_MANAGER);
91
+ }
92
+ /** The dev command for the package in `directory`, with the manager chosen by the caller. */
93
+ function devCommandFor(directory, manager, read) {
78
94
  const manifest = readManifest(read(join(directory, PACKAGE_JSON)));
79
95
  const scripts = scriptsOf(manifest);
80
- const manager = LOCKFILES.find(({ file }) => read(join(directory, file)) !== undefined)?.manager ??
81
- DEFAULT_PACKAGE_MANAGER;
82
96
  // A desktop shell's `dev` is its renderer's dev server, which no window ever opens onto. init's
83
97
  // rule decides which launcher it is, so the command the daemon hands an agent and the one init
84
98
  // spawns are the same.
@@ -105,3 +119,64 @@ export function detectDevCommand(directory, read = readTextFile) {
105
119
  }
106
120
  return undefined;
107
121
  }
122
+ /** Directory names under `path`, or none when it cannot be read. */
123
+ function readDirNames(path) {
124
+ try {
125
+ return readdirSync(path, { withFileTypes: true })
126
+ .filter((entry) => entry.isDirectory())
127
+ .map((entry) => entry.name);
128
+ }
129
+ catch {
130
+ return [];
131
+ }
132
+ }
133
+ /**
134
+ * The dev command for the project in `directory`, or undefined when there is not one to be sure of.
135
+ *
136
+ * `read` is injected so the whole decision is testable without a filesystem; the daemon uses the
137
+ * default disk reader.
138
+ */
139
+ export function detectDevCommand(directory, read = readTextFile) {
140
+ return devCommandFor(directory, packageManager(directory, read), read);
141
+ }
142
+ /**
143
+ * The dev command for the project, looking one level down when the root has none.
144
+ *
145
+ * `reticle init` is run at the repo root, and in a monorepo the app is a directory down — so the
146
+ * daemon's "this project declares no dev script" was false for a root whose `frontend/package.json`
147
+ * held `"dev": "vite"`, and the agent asked a human for a command that was on disk (reticle#1368).
148
+ * init's own workspace listing answers which directories to consider; the root's lockfile picks the
149
+ * package manager, because a workspace package usually has no lockfile of its own.
150
+ */
151
+ export function detectDevCommandInProject(directory, read = readTextFile, listDirs = readDirNames) {
152
+ const manager = packageManager(directory, read);
153
+ const here = devCommandFor(directory, manager, read);
154
+ if (here !== undefined)
155
+ return here;
156
+ const packages = workspacePackageDirs({
157
+ readFile: (path) => read(join(directory, path)) ?? null,
158
+ listDirs: (path) => listDirs(join(directory, path)),
159
+ });
160
+ for (const sub of packages) {
161
+ const found = devCommandFor(join(directory, sub), manager, read);
162
+ if (found !== undefined)
163
+ return { ...found, directory: sub };
164
+ }
165
+ return undefined;
166
+ }
167
+ /**
168
+ * The command that wires THIS project for good: `init`, in the app's own folder, through the
169
+ * one-off runner the project's package manager ships.
170
+ *
171
+ * Handed to an agent whose install never ran `init` (an MCP-only route), so it has to be right first
172
+ * time: `init` run in a folder that is not the app stops on a missing package.json, and a runner the
173
+ * machine does not have is "command not found". npx whenever there is doubt — it ships with Node.
174
+ */
175
+ export function initCommandIn(directory, read = readTextFile, listDirs = readDirNames) {
176
+ const manager = packageManager(directory, read);
177
+ const berry = read(join(directory, YARN_BERRY_MARKER)) !== undefined;
178
+ const runner = YARN === manager ? (berry ? YARN_DLX : NPX) : (RUNNER[manager] ?? NPX);
179
+ const command = `${runner} ${RETICLE_NPM_PACKAGE} ${INIT_VERB}`;
180
+ const app = detectDevCommandInProject(directory, read, listDirs)?.directory;
181
+ return app === undefined ? command : `cd ${app} && ${command}`;
182
+ }
@@ -0,0 +1,22 @@
1
+ import { type ReticleEvent } from '@reticlehq/core';
2
+ /**
3
+ * Where the SDK last saw the page heading.
4
+ *
5
+ * The SDK emits a navigation-initiated NET_PENDING while the old document is still alive — the
6
+ * one fact that can outrun the socket close (#1256). This keeps it off `Session.url` deliberately:
7
+ * successor matching and the 5xx probe need the page the tab was ON; this is where it was GOING.
8
+ * Timestamps are session-relative milliseconds, read from the session's injected clock.
9
+ */
10
+ export declare class DepartureNote {
11
+ #private;
12
+ /** Fold one inbound event into the note. */
13
+ observe(event: ReticleEvent, elapsedMs: number): void;
14
+ /**
15
+ * The navigation target, if it is fresh enough to be this departure's story.
16
+ *
17
+ * A navigation intent from long ago is not this departure: the document survived it — it kept
18
+ * talking — so attributing a later disconnect to it would invent a story. Read at tombstone
19
+ * time, when `elapsedMs` is the disconnect time.
20
+ */
21
+ read(elapsedMs: number): string | undefined;
22
+ }
@@ -0,0 +1,47 @@
1
+ import { EventType, NetInitiator } from '@reticlehq/core';
2
+ /**
3
+ * How long a navigation-departure note stays attributable to the disconnect that follows it.
4
+ *
5
+ * The socket close follows a real departure within seconds; a note older than this belongs to a
6
+ * navigation the document survived, and blaming a later disconnect on it would invent a story.
7
+ */
8
+ const DEPARTED_TO_FRESHNESS_MS = 30_000;
9
+ /**
10
+ * Where the SDK last saw the page heading.
11
+ *
12
+ * The SDK emits a navigation-initiated NET_PENDING while the old document is still alive — the
13
+ * one fact that can outrun the socket close (#1256). This keeps it off `Session.url` deliberately:
14
+ * successor matching and the 5xx probe need the page the tab was ON; this is where it was GOING.
15
+ * Timestamps are session-relative milliseconds, read from the session's injected clock.
16
+ */
17
+ export class DepartureNote {
18
+ #note;
19
+ /** Fold one inbound event into the note. */
20
+ observe(event, elapsedMs) {
21
+ if (event.type !== EventType.NET_PENDING)
22
+ return;
23
+ // Only navigation-initiated pendings count: a fetch that never settled is in-flight work,
24
+ // not a departure.
25
+ if (event.data['initiator'] !== NetInitiator.NAVIGATION)
26
+ return;
27
+ // A download never takes the document away, so it must not explain a later disconnect.
28
+ if (true === event.data['download'])
29
+ return;
30
+ const url = event.data['url'];
31
+ if ('string' !== typeof url || 0 === url.length)
32
+ return;
33
+ this.#note = { url, at: elapsedMs };
34
+ }
35
+ /**
36
+ * The navigation target, if it is fresh enough to be this departure's story.
37
+ *
38
+ * A navigation intent from long ago is not this departure: the document survived it — it kept
39
+ * talking — so attributing a later disconnect to it would invent a story. Read at tombstone
40
+ * time, when `elapsedMs` is the disconnect time.
41
+ */
42
+ read(elapsedMs) {
43
+ if (this.#note === undefined)
44
+ return undefined;
45
+ return elapsedMs - this.#note.at <= DEPARTED_TO_FRESHNESS_MS ? this.#note.url : undefined;
46
+ }
47
+ }
@@ -1,21 +1,5 @@
1
1
  import { type ReticleEvent } from '@reticlehq/core';
2
2
  import { type AmbientCounts } from '@reticlehq/engine/window/ambient.js';
3
- /**
4
- * The two things a session learns by watching its own event stream, as opposed to storing.
5
- *
6
- * Both are LEVELS derived from a stream, and both have to outlive the ring buffer — which is what
7
- * separates them from the buffer's job and earns them their own unit:
8
- *
9
- * ambient — which regions of the page move on their own (chat, tickers, live counters). Used by
10
- * the settle oracle to ignore background motion, so an action isn't held open forever
11
- * by churn it did not cause.
12
- * blindSpots — how much of the page the SDK cannot observe (cross-origin frames, closed shadow
13
- * roots). The SDK reports these only when the count CHANGES, so a page that mounts
14
- * two frames at load announces them once and is silent forever after. Anything that
15
- * infers coverage from a window of events therefore sees nothing and concludes the
16
- * page was fully observed — a positive claim to have seen what we cannot see. Holding
17
- * the level here makes coverage something to ask rather than infer.
18
- */
19
3
  export declare class ObservedState {
20
4
  #private;
21
5
  /** Fold one already-attributed event into the learned state. */
@@ -57,8 +41,22 @@ export declare class ObservedState {
57
41
  * dropped before they reached the observer. Recording it here keeps the honesty contract intact —
58
42
  * a verdict over a sampled window says `coverage: partial` rather than implying it saw everything.
59
43
  */
60
- noteRateLimited(dropped: number): void;
61
- blindSpots(): Readonly<Record<string, number>>;
44
+ noteRateLimited(dropped: number, at?: number): void;
45
+ /**
46
+ * How many events the bridge sampled away at or after `since` (session-elapsed ms).
47
+ *
48
+ * A bucket is counted when any part of its second reaches the window, so a drop in the same
49
+ * second as the window's start still impeaches it: erring toward unclean is the safe direction.
50
+ */
51
+ rateDroppedSince(since: number): number;
52
+ /**
53
+ * The blind spots, session-wide; or, given `since`, with bridge sampling counted only from then on.
54
+ *
55
+ * Coverage reads the session-wide view: that sampling happened at all is a fact about the session.
56
+ * A verdict deciding whether ITS capture is clean reads the windowed one. Read session-wide there,
57
+ * one early burst made every later verdict on the tab `unclean_capture` (#1414).
58
+ */
59
+ blindSpots(since?: number): Readonly<Record<string, number>>;
62
60
  }
63
61
  /**
64
62
  * The snapshot-shaped labels an act reply names its control by: the testid, and `role "name"`.
@@ -16,12 +16,18 @@ import { ambientKeyOf } from '@reticlehq/engine/window/ambient.js';
16
16
  * page was fully observed — a positive claim to have seen what we cannot see. Holding
17
17
  * the level here makes coverage something to ask rather than infer.
18
18
  */
19
+ /** The resolution rate-limit drops are kept at: per second of session time. */
20
+ const RATE_DROP_BUCKET_MS = 1000;
21
+ /** An hour of seconds; older buckets are past any window a verdict reads. */
22
+ const MAX_RATE_DROP_BUCKETS = 3600;
19
23
  export class ObservedState {
20
24
  /** What THIS session observed. Never contains seeded history — see seedAmbient. */
21
25
  #ownAmbient = {};
22
26
  /** What previous sessions learned, kept separate so it is never re-persisted as if newly seen. */
23
27
  #seededAmbient = {};
24
28
  #blindSpots = {};
29
+ /** Bridge-side sampling, by second of session time. See noteRateLimited. */
30
+ #rateDrops = [];
25
31
  /** Fold one already-attributed event into the learned state. */
26
32
  observe(event) {
27
33
  // Only UNATTRIBUTED events count as ambient: an event caused by an action is the action's work,
@@ -124,11 +130,48 @@ export class ObservedState {
124
130
  * dropped before they reached the observer. Recording it here keeps the honesty contract intact —
125
131
  * a verdict over a sampled window says `coverage: partial` rather than implying it saw everything.
126
132
  */
127
- noteRateLimited(dropped) {
133
+ noteRateLimited(dropped, at) {
134
+ const before = this.#blindSpots[BlindSpotKind.RATE_LIMITED] ?? 0;
128
135
  this.#blindSpots[BlindSpotKind.RATE_LIMITED] = dropped;
136
+ // WHEN, beside how many: the running total above is a fact about the session, and read as one
137
+ // it made every verdict after a single burst `unclean_capture`, however quiet its own window
138
+ // was (#1414). Bucketed per second so a sustained flood stays a bounded list.
139
+ if (at === undefined || dropped <= before)
140
+ return;
141
+ const second = Math.floor(at / RATE_DROP_BUCKET_MS) * RATE_DROP_BUCKET_MS;
142
+ const last = this.#rateDrops[this.#rateDrops.length - 1];
143
+ if (last !== undefined && last.at === second)
144
+ last.count += dropped - before;
145
+ else
146
+ this.#rateDrops.push({ at: second, count: dropped - before });
147
+ if (this.#rateDrops.length > MAX_RATE_DROP_BUCKETS)
148
+ this.#rateDrops.shift();
129
149
  }
130
- blindSpots() {
131
- return this.#blindSpots;
150
+ /**
151
+ * How many events the bridge sampled away at or after `since` (session-elapsed ms).
152
+ *
153
+ * A bucket is counted when any part of its second reaches the window, so a drop in the same
154
+ * second as the window's start still impeaches it: erring toward unclean is the safe direction.
155
+ */
156
+ rateDroppedSince(since) {
157
+ let total = 0;
158
+ for (const bucket of this.#rateDrops) {
159
+ if (bucket.at + RATE_DROP_BUCKET_MS > since)
160
+ total += bucket.count;
161
+ }
162
+ return total;
163
+ }
164
+ /**
165
+ * The blind spots, session-wide; or, given `since`, with bridge sampling counted only from then on.
166
+ *
167
+ * Coverage reads the session-wide view: that sampling happened at all is a fact about the session.
168
+ * A verdict deciding whether ITS capture is clean reads the windowed one. Read session-wide there,
169
+ * one early burst made every later verdict on the tab `unclean_capture` (#1414).
170
+ */
171
+ blindSpots(since) {
172
+ if (since === undefined)
173
+ return this.#blindSpots;
174
+ return { ...this.#blindSpots, [BlindSpotKind.RATE_LIMITED]: this.rateDroppedSince(since) };
132
175
  }
133
176
  }
134
177
  /**
@@ -33,6 +33,11 @@ export declare function isSessionReplacedError(error: unknown): boolean;
33
33
  * `PendingCommands.rejectAll` documents, and a caller that CAN wait decides what it means.
34
34
  */
35
35
  export declare const SESSION_DISCONNECTED_REASON = "session disconnected";
36
+ /**
37
+ * The close an agent's `reticle_session { action: "end", disconnect: true }` sends. The page's SDK
38
+ * prints it and stops retrying, so it says how to undo it. A close reason is capped at 123 bytes.
39
+ */
40
+ export declare const SESSION_PARKED_REASON = "detached by the agent (session end, disconnect) \u2014 restart the daemon to attach this window again";
36
41
  /**
37
42
  * Is this failure the page's transport going away, rather than an answer from the page?
38
43
  *
@@ -38,6 +38,11 @@ export function isSessionReplacedError(error) {
38
38
  * `PendingCommands.rejectAll` documents, and a caller that CAN wait decides what it means.
39
39
  */
40
40
  export const SESSION_DISCONNECTED_REASON = 'session disconnected';
41
+ /**
42
+ * The close an agent's `reticle_session { action: "end", disconnect: true }` sends. The page's SDK
43
+ * prints it and stops retrying, so it says how to undo it. A close reason is capped at 123 bytes.
44
+ */
45
+ export const SESSION_PARKED_REASON = 'detached by the agent (session end, disconnect) — restart the daemon to attach this window again';
41
46
  /**
42
47
  * Is this failure the page's transport going away, rather than an answer from the page?
43
48
  *
@@ -0,0 +1,42 @@
1
+ export interface WiredStep {
2
+ mark: string;
3
+ title: string;
4
+ target: string;
5
+ }
6
+ export interface WireOutcome {
7
+ ok: boolean;
8
+ /** Where init ran. */
9
+ directory: string;
10
+ /** Every step of init's plan, applied or not, as it printed them. */
11
+ steps: WiredStep[];
12
+ /** The app's url, when init got as far as the dev server. */
13
+ url?: string;
14
+ /** Why it stopped, in init's words or ours. */
15
+ error?: string;
16
+ }
17
+ export interface RunResult {
18
+ code: number;
19
+ stdout: string;
20
+ stderr: string;
21
+ }
22
+ export type RunCli = (args: readonly string[], cwd: string) => Promise<RunResult>;
23
+ export interface FirstRunWiring {
24
+ /**
25
+ * The directory init would run in, or undefined when it cannot be told without guessing: a
26
+ * daemon started in the home directory or at a filesystem root has no project of its own.
27
+ */
28
+ projectDirectory(cwd: string): string | undefined;
29
+ wire(directory: string): Promise<WireOutcome>;
30
+ }
31
+ export declare function projectDirectoryOf(cwd: string, home?: string, wired?: (dir: string) => boolean): string | undefined;
32
+ /** init's plan lines, and the one JSON object it prints last under `--json`. */
33
+ export declare function readInitOutput(stdout: string): {
34
+ steps: WiredStep[];
35
+ result: unknown;
36
+ };
37
+ export declare function firstRunWiring(options: {
38
+ /** This daemon's port, so init wires the app to it rather than choosing another. */
39
+ port: number;
40
+ cliPath: string;
41
+ run?: RunCli;
42
+ }): FirstRunWiring;