@reticlehq/server 3.7.0 → 3.8.1

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 (578) hide show
  1. package/SKILL.md +59 -68
  2. package/bin/reticle.js +9 -2
  3. package/dist/command/cli/adhoc-suite.js +1 -1
  4. package/dist/command/cli/adhoc-verdict.d.ts +12 -0
  5. package/dist/command/cli/adhoc-verdict.js +62 -4
  6. package/dist/command/cli/answers/gate-hook-message.d.ts +2 -0
  7. package/dist/command/cli/answers/gate-hook-message.js +5 -1
  8. package/dist/command/cli/auth/cloud-session.d.ts +11 -19
  9. package/dist/command/cli/auth/cloud-session.js +23 -0
  10. package/dist/command/cli/auth/device-flow.d.ts +3 -37
  11. package/dist/command/cli/cli-doctor.js +66 -21
  12. package/dist/command/cli/cli-flow-commands.js +53 -11
  13. package/dist/command/cli/cli-kill.d.ts +8 -0
  14. package/dist/command/cli/cli-kill.js +43 -3
  15. package/dist/command/cli/cli-parse-feedback.d.ts +4 -0
  16. package/dist/command/cli/cli-parse-feedback.js +13 -1
  17. package/dist/command/cli/cli-parse-grammar.d.ts +1 -2
  18. package/dist/command/cli/cli-parse-grammar.js +1 -6
  19. package/dist/command/cli/cli-parse-serve.d.ts +24 -0
  20. package/dist/command/cli/cli-parse-serve.js +124 -0
  21. package/dist/command/cli/cli-parse.d.ts +12 -11
  22. package/dist/command/cli/cli-parse.js +100 -123
  23. package/dist/command/cli/cli-usage.d.ts +0 -11
  24. package/dist/command/cli/cli-usage.js +43 -16
  25. package/dist/command/cli/cli-verify.d.ts +1 -1
  26. package/dist/command/cli/cli-verify.js +29 -14
  27. package/dist/command/cli/cloud-cli.js +27 -9
  28. package/dist/command/cli/cloud-kit.js +3 -3
  29. package/dist/command/cli/cloud-link.d.ts +1 -20
  30. package/dist/command/cli/cloud-link.js +2 -0
  31. package/dist/command/cli/cloud-login.d.ts +6 -2
  32. package/dist/command/cli/cloud-login.js +13 -41
  33. package/dist/command/cli/config/checkout.d.ts +10 -0
  34. package/dist/command/cli/config/checkout.js +78 -0
  35. package/dist/command/cli/doctor/doctor-agent-link.d.ts +23 -0
  36. package/dist/command/cli/doctor/doctor-agent-link.js +28 -0
  37. package/dist/command/cli/doctor/doctor-coverage-line.js +1 -7
  38. package/dist/command/cli/doctor/doctor-rows.d.ts +4 -0
  39. package/dist/command/cli/doctor/doctor-rows.js +4 -0
  40. package/dist/command/cli/drive/drive-attach.d.ts +5 -0
  41. package/dist/command/cli/drive/drive-attach.js +21 -1
  42. package/dist/command/cli/hook/codex-transcript.d.ts +20 -0
  43. package/dist/command/cli/hook/codex-transcript.js +224 -0
  44. package/dist/command/cli/hook/episode-structure.d.ts +24 -0
  45. package/dist/command/cli/hook/episode-structure.js +138 -0
  46. package/dist/command/cli/hook/hook-command.d.ts +9 -0
  47. package/dist/command/cli/hook/hook-command.js +211 -0
  48. package/dist/command/cli/hook/hook-fast.d.ts +31 -0
  49. package/dist/command/cli/hook/hook-fast.js +136 -0
  50. package/dist/command/cli/hook/prompt-hook.d.ts +30 -0
  51. package/dist/command/cli/hook/prompt-hook.js +199 -0
  52. package/dist/command/cli/hook/tool-hook.d.ts +21 -0
  53. package/dist/command/cli/hook/tool-hook.js +259 -0
  54. package/dist/command/cli/launch/cli-launch.d.ts +2 -0
  55. package/dist/command/cli/launch/cli-launch.js +22 -2
  56. package/dist/command/cli/lifecycle/daemon-lifecycle.js +28 -2
  57. package/dist/command/cli/mcp-command.d.ts +9 -0
  58. package/dist/command/cli/mcp-command.js +127 -41
  59. package/dist/command/cli/open-navigate.d.ts +43 -0
  60. package/dist/command/cli/open-navigate.js +85 -0
  61. package/dist/command/cli/ports/port-holder.d.ts +16 -4
  62. package/dist/command/cli/ports/port-holder.js +58 -12
  63. package/dist/command/cli/ports/resolve/cli-port.js +18 -2
  64. package/dist/command/cli/project-name.d.ts +1 -7
  65. package/dist/command/cli/project-name.js +1 -0
  66. package/dist/command/cli/report-command.d.ts +8 -2
  67. package/dist/command/cli/report-command.js +95 -18
  68. package/dist/command/cli/status-fields.d.ts +9 -2
  69. package/dist/command/cli/status-fields.js +148 -4
  70. package/dist/command/cli/try-command.d.ts +3 -4
  71. package/dist/command/cli/try-command.js +6 -11
  72. package/dist/command/cli/verify-results.d.ts +4 -1
  73. package/dist/command/cli/verify-results.js +3 -1
  74. package/dist/command/cli.d.ts +1 -7
  75. package/dist/command/cli.js +79 -160
  76. package/dist/command/daemon/daemon-resilience.d.ts +6 -1
  77. package/dist/command/daemon/daemon-resilience.js +31 -18
  78. package/dist/command/daemon/daemon.d.ts +11 -0
  79. package/dist/command/daemon/daemon.js +70 -2
  80. package/dist/command/daemon/lifetime/daemon-usefulness.d.ts +2 -0
  81. package/dist/command/daemon/lifetime/daemon-usefulness.js +13 -2
  82. package/dist/command/daemon/wake-decision.js +4 -2
  83. package/dist/command/daemon/win32-escape.d.ts +32 -0
  84. package/dist/command/daemon/win32-escape.js +119 -0
  85. package/dist/command/setup/agent-configs.d.ts +9 -0
  86. package/dist/command/setup/agent-configs.js +9 -0
  87. package/dist/command/setup/auto-approve.d.ts +10 -3
  88. package/dist/command/setup/auto-approve.js +51 -3
  89. package/dist/command/setup/bringup/dev-server-files.d.ts +1 -9
  90. package/dist/command/setup/bringup/dev-server-wait.js +5 -1
  91. package/dist/command/setup/bringup/ensure-daemon.js +4 -7
  92. package/dist/command/setup/init/init-host.js +6 -0
  93. package/dist/command/setup/init/init-port.js +5 -4
  94. package/dist/command/setup/init/init-runtime.js +7 -1
  95. package/dist/command/setup/node-effects.d.ts +8 -0
  96. package/dist/command/setup/node-effects.js +36 -4
  97. package/dist/command/setup/probe/dev-port.d.ts +26 -0
  98. package/dist/command/setup/probe/dev-port.js +117 -0
  99. package/dist/command/setup/probe/page-probe.d.ts +1 -1
  100. package/dist/command/setup/probe/page-probe.js +11 -3
  101. package/dist/command/setup/remaining-steps.d.ts +0 -7
  102. package/dist/command/setup/remaining-steps.js +3 -2
  103. package/dist/command/setup/run-setup.d.ts +11 -0
  104. package/dist/command/setup/run-setup.js +33 -5
  105. package/dist/command/setup/setup-command.d.ts +2 -0
  106. package/dist/command/setup/setup-command.js +22 -4
  107. package/dist/command/update/updater.d.ts +1 -6
  108. package/dist/command/update/updater.js +4 -5
  109. package/dist/command/update/version-seen.d.ts +24 -0
  110. package/dist/command/update/version-seen.js +65 -0
  111. package/dist/command/version/peer-announce.d.ts +9 -1
  112. package/dist/command/version/peer-announce.js +25 -2
  113. package/dist/command/version/sdk-fix.d.ts +5 -6
  114. package/dist/command/version/sdk-fix.js +17 -32
  115. package/dist/command/version/version-skew.d.ts +16 -1
  116. package/dist/command/version/version-skew.js +84 -10
  117. package/dist/features/crawl/crawl-tools.js +2 -2
  118. package/dist/features/crawl/crawl.js +2 -0
  119. package/dist/features/exhaust/ledger.d.ts +15 -96
  120. package/dist/features/exhaust/ledger.js +3 -3
  121. package/dist/features/harness/drive-runs.d.ts +28 -4
  122. package/dist/features/harness/drive-runs.js +99 -7
  123. package/dist/features/harness/drivers.d.ts +1 -1
  124. package/dist/features/harness/drivers.js +1 -1
  125. package/dist/features/harness/harness.d.ts +5 -0
  126. package/dist/features/harness/harness.js +24 -12
  127. package/dist/features/harness/platform/platform-drives.d.ts +7 -1
  128. package/dist/features/harness/platform/platform-drives.js +12 -7
  129. package/dist/features/harness/platform/refusal.d.ts +1 -1
  130. package/dist/features/harness/platform/refusal.js +4 -4
  131. package/dist/features/harness/platform/remote-drive.js +70 -28
  132. package/dist/features/harness/platform/server-driver.js +22 -1
  133. package/dist/features/harness/platform-config.d.ts +1 -10
  134. package/dist/features/harness/platform-config.js +0 -20
  135. package/dist/features/license/license.d.ts +2 -14
  136. package/dist/features/visual/step-shots.d.ts +33 -1
  137. package/dist/features/visual/step-shots.js +155 -1
  138. package/dist/features/visual/visual-tools.js +12 -4
  139. package/dist/hooks/coding-agents.d.ts +6 -0
  140. package/dist/hooks/coding-agents.js +24 -3
  141. package/dist/hooks/episode-stamp.d.ts +32 -0
  142. package/dist/hooks/episode-stamp.js +61 -0
  143. package/dist/hooks/hook-commands.js +19 -9
  144. package/dist/index.d.ts +5 -1
  145. package/dist/index.js +66 -24
  146. package/dist/judgement/app-graph/journal-steps.d.ts +8 -0
  147. package/dist/judgement/app-graph/journal-steps.js +92 -0
  148. package/dist/judgement/capsule/capsule-store.d.ts +2 -39
  149. package/dist/judgement/domain/domain-model.js +1 -10
  150. package/dist/judgement/domain/domain-tools.js +4 -2
  151. package/dist/judgement/runs/artifact/run-store.d.ts +28 -8
  152. package/dist/judgement/runs/artifact/run-store.js +153 -28
  153. package/dist/judgement/runs/default-run-id.d.ts +3 -1
  154. package/dist/judgement/runs/default-run-id.js +15 -3
  155. package/dist/judgement/runs/drive-run.d.ts +3 -3
  156. package/dist/judgement/runs/drive-run.js +11 -7
  157. package/dist/judgement/runs/run-ledger.d.ts +21 -0
  158. package/dist/judgement/runs/run-ledger.js +143 -0
  159. package/dist/judgement/runs/runner-port.d.ts +1 -1
  160. package/dist/judgement/runs/runner-port.js +8 -2
  161. package/dist/judgement/runs/verification-sync.d.ts +4 -3
  162. package/dist/judgement/runs/verification-sync.js +27 -5
  163. package/dist/language/flows/affected-tools.js +2 -1
  164. package/dist/language/flows/annotate-notes/annotate.js +8 -3
  165. package/dist/language/flows/annotate-tools.js +1 -1
  166. package/dist/language/flows/change/affected.d.ts +8 -0
  167. package/dist/language/flows/change/affected.js +20 -7
  168. package/dist/language/flows/decision.js +19 -4
  169. package/dist/language/flows/fields/flow-secret-field.d.ts +9 -0
  170. package/dist/language/flows/fields/flow-secret-field.js +67 -5
  171. package/dist/language/flows/flow-anchor.d.ts +5 -0
  172. package/dist/language/flows/flow-anchor.js +4 -0
  173. package/dist/language/flows/flow-cross-step.d.ts +7 -1
  174. package/dist/language/flows/flow-cross-step.js +9 -0
  175. package/dist/language/flows/flow-expect-grammar.js +15 -10
  176. package/dist/language/flows/flow-intent.js +6 -1
  177. package/dist/language/flows/flow-journey.d.ts +8 -0
  178. package/dist/language/flows/flow-journey.js +13 -0
  179. package/dist/language/flows/flow-lease.d.ts +27 -0
  180. package/dist/language/flows/flow-lease.js +59 -0
  181. package/dist/language/flows/flow-replay-run.d.ts +1 -87
  182. package/dist/language/flows/flow-replay-run.js +111 -310
  183. package/dist/language/flows/flow-replay.js +21 -19
  184. package/dist/language/flows/flow-replayable.d.ts +38 -0
  185. package/dist/language/flows/flow-replayable.js +179 -0
  186. package/dist/language/flows/flow-start-path.d.ts +108 -0
  187. package/dist/language/flows/flow-start-path.js +313 -0
  188. package/dist/language/flows/flow-step-runners.d.ts +23 -2
  189. package/dist/language/flows/flow-step-runners.js +191 -32
  190. package/dist/language/flows/flow-store-for-session.d.ts +8 -1
  191. package/dist/language/flows/flow-store-for-session.js +6 -0
  192. package/dist/language/flows/flow-tools.d.ts +2 -23
  193. package/dist/language/flows/flow-tools.js +63 -113
  194. package/dist/language/flows/flows.d.ts +4 -6
  195. package/dist/language/flows/flows.js +90 -15
  196. package/dist/language/flows/heal-run.d.ts +10 -4
  197. package/dist/language/flows/heal-run.js +26 -9
  198. package/dist/language/flows/recording/flake.d.ts +3 -27
  199. package/dist/language/flows/recording/flake.js +1 -1
  200. package/dist/language/flows/recording/recording-backtrack.js +1 -4
  201. package/dist/language/flows/recording/tape/recordings.d.ts +11 -1
  202. package/dist/language/flows/recording/tape/recordings.js +9 -3
  203. package/dist/language/flows/replay.d.ts +25 -5
  204. package/dist/language/flows/replay.js +83 -16
  205. package/dist/language/flows/stores/assertion-tiers-store.js +1 -1
  206. package/dist/language/flows/suite/coverage.d.ts +9 -0
  207. package/dist/language/flows/suite/coverage.js +12 -1
  208. package/dist/language/flows/suite-selection.d.ts +25 -0
  209. package/dist/language/flows/suite-selection.js +41 -9
  210. package/dist/machine/git-tracks.d.ts +6 -0
  211. package/dist/machine/git-tracks.js +36 -0
  212. package/dist/memory/cloud/background-sync.d.ts +25 -0
  213. package/dist/memory/cloud/background-sync.js +79 -0
  214. package/dist/memory/cloud/cloud-config.d.ts +12 -1
  215. package/dist/memory/cloud/cloud-config.js +39 -13
  216. package/dist/memory/cloud/cloud-sync.d.ts +3 -24
  217. package/dist/memory/cloud/cloud-sync.js +5 -2
  218. package/dist/memory/cloud/harness-config.d.ts +0 -7
  219. package/dist/memory/cloud/memory-scope.d.ts +19 -0
  220. package/dist/memory/cloud/memory-scope.js +48 -0
  221. package/dist/memory/cloud/sync-answer.d.ts +43 -0
  222. package/dist/memory/cloud/sync-answer.js +42 -0
  223. package/dist/memory/cloud/sync-cycle.d.ts +40 -10
  224. package/dist/memory/cloud/sync-cycle.js +97 -144
  225. package/dist/memory/cloud/sync-daemon.d.ts +50 -3
  226. package/dist/memory/cloud/sync-daemon.js +473 -83
  227. package/dist/memory/cloud/sync-describe.d.ts +28 -0
  228. package/dist/memory/cloud/sync-describe.js +92 -0
  229. package/dist/memory/cloud/sync-disk.d.ts +9 -1
  230. package/dist/memory/cloud/sync-disk.js +137 -33
  231. package/dist/memory/cloud/sync-flow-versions.d.ts +26 -0
  232. package/dist/memory/cloud/sync-flow-versions.js +42 -0
  233. package/dist/memory/impact/impact-store.js +32 -15
  234. package/dist/memory/intent/intent-shard.d.ts +41 -266
  235. package/dist/memory/intent/intent-tools.js +20 -61
  236. package/dist/memory/intent/record-request.d.ts +27 -0
  237. package/dist/memory/intent/record-request.js +88 -0
  238. package/dist/memory/intent/settled-words.js +9 -1
  239. package/dist/memory/journal/drive-flow.d.ts +3 -0
  240. package/dist/memory/journal/drive-flow.js +11 -41
  241. package/dist/memory/journal/envelope-store.js +1 -1
  242. package/dist/memory/journal/envelope.d.ts +6 -154
  243. package/dist/memory/journal/episode-log.d.ts +107 -0
  244. package/dist/memory/journal/episode-log.js +302 -0
  245. package/dist/memory/journal/journal-recorder.d.ts +7 -0
  246. package/dist/memory/journal/journal-recorder.js +22 -9
  247. package/dist/memory/journal/on-disk/ambient-file.d.ts +1 -7
  248. package/dist/memory/journal/on-disk/ambient-file.js +1 -1
  249. package/dist/memory/journal/on-disk/workspace-gitignore.d.ts +24 -3
  250. package/dist/memory/journal/on-disk/workspace-gitignore.js +38 -7
  251. package/dist/memory/journal/on-disk/workspace-tiers.js +7 -0
  252. package/dist/memory/journal/self-observation.js +3 -1
  253. package/dist/memory/journal/session-end.js +23 -9
  254. package/dist/memory/journal/session-journal.js +39 -20
  255. package/dist/memory/project/artifact-root-resolver.d.ts +14 -1
  256. package/dist/memory/project/artifact-root-resolver.js +68 -23
  257. package/dist/memory/project/artifact-root.d.ts +17 -3
  258. package/dist/memory/project/artifact-root.js +47 -9
  259. package/dist/memory/project/fs/fs-port.d.ts +5 -0
  260. package/dist/memory/project/fs/fs-port.js +13 -0
  261. package/dist/memory/project/learned-routes.d.ts +3 -4
  262. package/dist/memory/project/learned-routes.js +3 -11
  263. package/dist/memory/project/link-directory.js +5 -2
  264. package/dist/memory/project/root-claims.d.ts +3 -1
  265. package/dist/memory/project/root-claims.js +41 -7
  266. package/dist/memory/project/session-root.d.ts +1 -1
  267. package/dist/memory/project/session-root.js +1 -15
  268. package/dist/memory/project/sync-status.js +5 -6
  269. package/dist/memory/recall/memory-tools.js +2 -2
  270. package/dist/memory/recall/platform-memory.d.ts +3 -1
  271. package/dist/memory/recall/platform-memory.js +9 -1
  272. package/dist/memory/recall/project-memory.js +15 -19
  273. package/dist/portal/bridge/auth-failure-reason.d.ts +13 -0
  274. package/dist/portal/bridge/auth-failure-reason.js +19 -0
  275. package/dist/portal/bridge/bridge.d.ts +19 -4
  276. package/dist/portal/bridge/bridge.js +150 -177
  277. package/dist/portal/bridge/harness-request.d.ts +15 -0
  278. package/dist/portal/bridge/harness-request.js +19 -0
  279. package/dist/portal/bridge/origin/origin-follow.d.ts +46 -0
  280. package/dist/portal/bridge/origin/origin-follow.js +110 -0
  281. package/dist/portal/bridge/pairing-token.d.ts +6 -0
  282. package/dist/portal/bridge/pairing-token.js +47 -16
  283. package/dist/portal/bridge/protocol-skew.d.ts +27 -2
  284. package/dist/portal/bridge/protocol-skew.js +66 -2
  285. package/dist/portal/bridge/session-nonces.d.ts +46 -0
  286. package/dist/portal/bridge/session-nonces.js +72 -0
  287. package/dist/portal/input/viewport-tools.d.ts +31 -0
  288. package/dist/portal/input/viewport-tools.js +106 -15
  289. package/dist/portal/pool/bounded-close.d.ts +23 -0
  290. package/dist/portal/pool/bounded-close.js +38 -0
  291. package/dist/portal/pool/browser-pool.d.ts +44 -39
  292. package/dist/portal/pool/browser-pool.js +247 -95
  293. package/dist/portal/pool/context-permissions.d.ts +9 -1
  294. package/dist/portal/pool/context-permissions.js +26 -0
  295. package/dist/portal/pool/lease-emulation.d.ts +37 -0
  296. package/dist/portal/pool/lease-emulation.js +29 -0
  297. package/dist/portal/pool/playwright-launcher.d.ts +6 -0
  298. package/dist/portal/pool/playwright-launcher.js +74 -7
  299. package/dist/portal/pool/pool-contract.d.ts +23 -1
  300. package/dist/portal/pool/pool-lease.d.ts +128 -0
  301. package/dist/portal/pool/pool-lease.js +49 -0
  302. package/dist/portal/pool/zero-install.d.ts +8 -1
  303. package/dist/portal/pool/zero-install.js +24 -2
  304. package/dist/portal/production/production-activation.d.ts +136 -0
  305. package/dist/portal/production/production-activation.js +173 -0
  306. package/dist/portal/production/production-drive.d.ts +52 -0
  307. package/dist/portal/production/production-drive.js +301 -0
  308. package/dist/portal/production/production-hello.d.ts +23 -0
  309. package/dist/portal/production/production-hello.js +23 -0
  310. package/dist/portal/realm/web-realm.js +42 -15
  311. package/dist/portal/session/control-envelope.d.ts +1 -1
  312. package/dist/portal/session/dev-server/served-document.d.ts +0 -5
  313. package/dist/portal/session/dev-server/served-document.js +6 -8
  314. package/dist/portal/session/facts/handshake-facts.d.ts +8 -1
  315. package/dist/portal/session/first-run-wiring.d.ts +3 -36
  316. package/dist/portal/session/first-run-wiring.js +10 -103
  317. package/dist/portal/session/live-control-tools.js +61 -19
  318. package/dist/portal/session/no-session-next-action.d.ts +11 -0
  319. package/dist/portal/session/no-session-next-action.js +40 -15
  320. package/dist/portal/session/no-session-watch.d.ts +7 -0
  321. package/dist/portal/session/no-session-watch.js +67 -23
  322. package/dist/portal/session/output-budget.d.ts +10 -0
  323. package/dist/portal/session/output-budget.js +16 -0
  324. package/dist/portal/session/presence/session-lease.d.ts +2 -0
  325. package/dist/portal/session/presence/session-lease.js +8 -0
  326. package/dist/portal/session/recorded-gaps.d.ts +15 -11
  327. package/dist/portal/session/recorded-gaps.js +39 -18
  328. package/dist/portal/session/serving-directory.d.ts +24 -2
  329. package/dist/portal/session/serving-directory.js +93 -5
  330. package/dist/portal/session/session-info.d.ts +26 -0
  331. package/dist/portal/session/session-info.js +20 -0
  332. package/dist/portal/session/session-manager.d.ts +35 -3
  333. package/dist/portal/session/session-manager.js +69 -14
  334. package/dist/portal/session/session-successor.js +1 -9
  335. package/dist/portal/session/session-tools.js +22 -4
  336. package/dist/portal/session/session.d.ts +10 -10
  337. package/dist/portal/session/session.js +37 -29
  338. package/dist/portal/session/zero-install-first-call.d.ts +7 -2
  339. package/dist/portal/session/zero-install-first-call.js +43 -20
  340. package/dist/start-wiring.d.ts +2 -2
  341. package/dist/start-wiring.js +17 -3
  342. package/dist/status-payload.d.ts +11 -1
  343. package/dist/status-payload.js +7 -1
  344. package/dist/surface/agent-presence-grace.d.ts +11 -0
  345. package/dist/surface/agent-presence-grace.js +34 -0
  346. package/dist/surface/http-server.d.ts +12 -1
  347. package/dist/surface/http-server.js +64 -15
  348. package/dist/surface/mcp/faults/mcp-outage.d.ts +12 -2
  349. package/dist/surface/mcp/faults/mcp-outage.js +19 -1
  350. package/dist/surface/mcp/mcp-proxy.d.ts +17 -74
  351. package/dist/surface/mcp/mcp-proxy.js +194 -267
  352. package/dist/surface/mcp/mcp.d.ts +20 -3
  353. package/dist/surface/mcp/mcp.js +88 -25
  354. package/dist/surface/mcp/proxy/drive-calls.d.ts +44 -0
  355. package/dist/surface/mcp/proxy/drive-calls.js +114 -5
  356. package/dist/surface/mcp/proxy/proxy-boot.d.ts +11 -0
  357. package/dist/surface/mcp/proxy/proxy-boot.js +1 -0
  358. package/dist/surface/mcp/proxy/proxy-daemon-probe.d.ts +6 -0
  359. package/dist/surface/mcp/proxy/proxy-daemon-probe.js +14 -1
  360. package/dist/surface/mcp/proxy/proxy-handshake.d.ts +34 -2
  361. package/dist/surface/mcp/proxy/proxy-handshake.js +76 -8
  362. package/dist/surface/mcp/server-instructions.js +35 -16
  363. package/dist/surface/mcp/shared-params.d.ts +8 -0
  364. package/dist/surface/mcp/shared-params.js +15 -1
  365. package/dist/surface/mcp/sse-frame-parser.d.ts +11 -0
  366. package/dist/surface/mcp/sse-frame-parser.js +18 -0
  367. package/dist/surface/mcp/surface-vocabulary.d.ts +2 -0
  368. package/dist/surface/mcp/surface-vocabulary.js +13 -0
  369. package/dist/surface/mcp/tool-catalog-cache.d.ts +2 -0
  370. package/dist/surface/mcp/tool-catalog-cache.js +14 -4
  371. package/dist/surface/tools/account-tool.d.ts +4 -3
  372. package/dist/surface/tools/account-tool.js +20 -31
  373. package/dist/surface/tools/act/act-danger.d.ts +2 -0
  374. package/dist/surface/tools/act/act-danger.js +41 -14
  375. package/dist/surface/tools/act/act-observation.d.ts +11 -0
  376. package/dist/surface/tools/act/act-observation.js +33 -0
  377. package/dist/surface/tools/act/act-preflight.js +10 -3
  378. package/dist/surface/tools/act/act-sequence-retry.js +2 -1
  379. package/dist/surface/tools/act/act-target.js +19 -5
  380. package/dist/surface/tools/act/durable.js +1 -1
  381. package/dist/surface/tools/act/navigation/navigate-arrival.d.ts +9 -7
  382. package/dist/surface/tools/act/navigation/navigate-arrival.js +11 -14
  383. package/dist/surface/tools/act/unsettled-find.d.ts +36 -0
  384. package/dist/surface/tools/act/unsettled-find.js +71 -0
  385. package/dist/surface/tools/act-sequence-tool.js +53 -24
  386. package/dist/surface/tools/act-tools.d.ts +2 -3
  387. package/dist/surface/tools/act-tools.js +49 -47
  388. package/dist/surface/tools/agent/compact-envelope.d.ts +2 -2
  389. package/dist/surface/tools/agent/for-the-agent.js +41 -3
  390. package/dist/surface/tools/assert/assert-grade.js +8 -3
  391. package/dist/surface/tools/assert/assert-verdict.js +4 -2
  392. package/dist/surface/tools/browser-tools.js +7 -4
  393. package/dist/surface/tools/chat-drives.js +50 -25
  394. package/dist/surface/tools/coverage-tools.js +1 -1
  395. package/dist/surface/tools/dynamic-tools.d.ts +8 -0
  396. package/dist/surface/tools/dynamic-tools.js +89 -34
  397. package/dist/surface/tools/empty-session-list.d.ts +18 -25
  398. package/dist/surface/tools/empty-session-list.js +67 -38
  399. package/dist/surface/tools/error-recovery.d.ts +17 -7
  400. package/dist/surface/tools/error-recovery.js +53 -20
  401. package/dist/surface/tools/explore-tools.d.ts +10 -0
  402. package/dist/surface/tools/explore-tools.js +72 -19
  403. package/dist/surface/tools/feedback-tools.js +23 -2
  404. package/dist/surface/tools/gap-novelty.d.ts +6 -0
  405. package/dist/surface/tools/gap-novelty.js +9 -0
  406. package/dist/surface/tools/gaps/capability-absences.js +4 -3
  407. package/dist/surface/tools/harness-explore.d.ts +1 -1
  408. package/dist/surface/tools/harness-explore.js +6 -4
  409. package/dist/surface/tools/harness-gate.d.ts +43 -21
  410. package/dist/surface/tools/harness-gate.js +55 -81
  411. package/dist/surface/tools/harness-script.d.ts +2 -0
  412. package/dist/surface/tools/harness-script.js +11 -6
  413. package/dist/surface/tools/harness-toolset.js +3 -4
  414. package/dist/surface/tools/invoke-tool.d.ts +0 -8
  415. package/dist/surface/tools/invoke-tool.js +164 -178
  416. package/dist/surface/tools/lease-hint.d.ts +9 -0
  417. package/dist/surface/tools/lease-hint.js +22 -3
  418. package/dist/surface/tools/lease-permissions.d.ts +1 -1
  419. package/dist/surface/tools/lease-readiness.d.ts +55 -0
  420. package/dist/surface/tools/lease-readiness.js +150 -2
  421. package/dist/surface/tools/lease-tools.d.ts +3 -75
  422. package/dist/surface/tools/lease-tools.js +124 -188
  423. package/dist/surface/tools/map-tools.d.ts +20 -0
  424. package/dist/surface/tools/map-tools.js +145 -0
  425. package/dist/surface/tools/merge-tools.js +11 -7
  426. package/dist/surface/tools/next-step.js +6 -3
  427. package/dist/surface/tools/observe-tools.js +46 -35
  428. package/dist/surface/tools/platform-moment.d.ts +3 -12
  429. package/dist/surface/tools/platform-moment.js +12 -24
  430. package/dist/surface/tools/read/complete-snapshot.d.ts +7 -1
  431. package/dist/surface/tools/read/complete-snapshot.js +13 -2
  432. package/dist/surface/tools/read/query-paginate.js +6 -0
  433. package/dist/surface/tools/read/query-shape.d.ts +9 -0
  434. package/dist/surface/tools/read/query-shape.js +15 -0
  435. package/dist/surface/tools/read/snapshot-unmounted-note.d.ts +1 -0
  436. package/dist/surface/tools/read/snapshot-unmounted-note.js +73 -0
  437. package/dist/surface/tools/read-tools.js +5 -5
  438. package/dist/surface/tools/real-input-attempt.d.ts +11 -0
  439. package/dist/surface/tools/real-input-attempt.js +206 -38
  440. package/dist/surface/tools/reconcile-tools.js +21 -8
  441. package/dist/surface/tools/reticle-result.d.ts +3 -0
  442. package/dist/surface/tools/reticle-result.js +8 -1
  443. package/dist/surface/tools/run-report.d.ts +22 -0
  444. package/dist/surface/tools/run-report.js +141 -0
  445. package/dist/surface/tools/session-ports.d.ts +57 -0
  446. package/dist/surface/tools/session-ports.js +102 -0
  447. package/dist/surface/tools/tool-kit.d.ts +58 -4
  448. package/dist/surface/tools/tool-kit.js +140 -6
  449. package/dist/surface/tools/tool-surface.d.ts +2 -0
  450. package/dist/surface/tools/tool-surface.js +45 -0
  451. package/dist/surface/tools/tools.js +49 -87
  452. package/dist/telemetry/automation-hint.d.ts +5 -0
  453. package/dist/telemetry/automation-hint.js +7 -0
  454. package/dist/telemetry/cli-telemetry.d.ts +22 -0
  455. package/dist/telemetry/cli-telemetry.js +80 -11
  456. package/dist/telemetry/daemon-telemetry.d.ts +3 -1
  457. package/dist/telemetry/daemon-telemetry.js +9 -2
  458. package/dist/telemetry/feedback-cli.d.ts +1 -1
  459. package/dist/telemetry/feedback-cli.js +8 -3
  460. package/dist/telemetry/feedback.d.ts +1 -1
  461. package/dist/telemetry/feedback.js +51 -4
  462. package/dist/telemetry/harness-run.d.ts +3 -3
  463. package/dist/telemetry/harness-run.js +18 -7
  464. package/dist/telemetry/hud-events.d.ts +1 -1
  465. package/dist/telemetry/hud-metrics.d.ts +6 -3
  466. package/dist/telemetry/hud-metrics.js +20 -8
  467. package/dist/telemetry/install-source.js +1 -1
  468. package/dist/telemetry/mcp-connection.d.ts +1 -1
  469. package/dist/telemetry/mcp-connection.js +21 -2
  470. package/dist/telemetry/onboarding-firsts.d.ts +6 -1
  471. package/dist/telemetry/onboarding-firsts.js +41 -1
  472. package/dist/telemetry/proxy-telemetry.d.ts +42 -0
  473. package/dist/telemetry/proxy-telemetry.js +70 -1
  474. package/dist/telemetry/session-metrics.d.ts +1 -3
  475. package/dist/telemetry/session-metrics.js +16 -12
  476. package/dist/telemetry/telemetry.d.ts +9 -1
  477. package/dist/telemetry/telemetry.js +16 -1
  478. package/dist/telemetry/verification-of.d.ts +3 -1
  479. package/dist/telemetry/verification-of.js +7 -1
  480. package/dist/wire-journal.js +12 -2
  481. package/docs/README.md +4 -2
  482. package/docs/actions.mdx +7 -6
  483. package/docs/adapters.md +2 -1
  484. package/docs/agent-cheatsheet.md +19 -5
  485. package/docs/architecture.md +13 -10
  486. package/docs/autodrive.md +6 -5
  487. package/docs/benchmarks.md +2 -2
  488. package/docs/capabilities.mdx +1 -1
  489. package/docs/cli/affected.mdx +1 -1
  490. package/docs/cli/cloud.mdx +6 -6
  491. package/docs/cli/doctor.mdx +3 -1
  492. package/docs/cli/feedback.mdx +11 -7
  493. package/docs/cli/gate.mdx +1 -1
  494. package/docs/cli/help.mdx +1 -1
  495. package/docs/cli/init.mdx +20 -16
  496. package/docs/cli/mcp.mdx +5 -2
  497. package/docs/cli/open.mdx +5 -2
  498. package/docs/cli/report.mdx +1 -1
  499. package/docs/cli/restart.mdx +1 -1
  500. package/docs/cli/rollback.mdx +4 -4
  501. package/docs/cli/serve.mdx +7 -5
  502. package/docs/cli/setup.mdx +1 -1
  503. package/docs/cli/status.mdx +6 -2
  504. package/docs/cli/stop.mdx +3 -3
  505. package/docs/cli/telemetry.mdx +5 -1
  506. package/docs/cli/try.mdx +8 -8
  507. package/docs/cli/update.mdx +8 -5
  508. package/docs/cli/verify.mdx +12 -5
  509. package/docs/cli/version.mdx +1 -1
  510. package/docs/cli.mdx +10 -6
  511. package/docs/debugging.md +1 -1
  512. package/docs/deploy-checks.md +8 -6
  513. package/docs/desktop.mdx +14 -18
  514. package/docs/enterprise.md +6 -6
  515. package/docs/environment.mdx +5 -3
  516. package/docs/faq.mdx +9 -6
  517. package/docs/first-drive.md +19 -9
  518. package/docs/flows.md +3 -4
  519. package/docs/for-agents.md +1 -1
  520. package/docs/frameworks.mdx +34 -11
  521. package/docs/getting-started.md +46 -29
  522. package/docs/http-transport.md +2 -2
  523. package/docs/human-control.md +8 -8
  524. package/docs/index.mdx +2 -2
  525. package/docs/install-agentic.mdx +18 -19
  526. package/docs/install-manual.mdx +8 -4
  527. package/docs/integration-patterns.md +5 -5
  528. package/docs/multi-agent-testing.md +7 -5
  529. package/docs/packages/browser.mdx +34 -2
  530. package/docs/packages/core.mdx +2 -1
  531. package/docs/packages/electron.mdx +15 -3
  532. package/docs/packages/eslint-plugin.mdx +1 -1
  533. package/docs/packages/next.mdx +17 -5
  534. package/docs/packages/react.mdx +8 -1
  535. package/docs/packages/server.mdx +3 -3
  536. package/docs/packages/tauri.mdx +3 -3
  537. package/docs/packages/vite-plugin.mdx +1 -1
  538. package/docs/packages.mdx +19 -6
  539. package/docs/platform-integration.md +12 -4
  540. package/docs/predicates.mdx +18 -7
  541. package/docs/production-mode.md +108 -0
  542. package/docs/prompt-capture.md +99 -0
  543. package/docs/quickstart.mdx +14 -12
  544. package/docs/recipes.mdx +9 -8
  545. package/docs/required-checks.md +3 -2
  546. package/docs/skill-file.mdx +4 -3
  547. package/docs/skill-setup.md +2 -2
  548. package/docs/skill.md +62 -70
  549. package/docs/state-files.md +1 -0
  550. package/docs/state-management.mdx +11 -9
  551. package/docs/system-map.md +14 -13
  552. package/docs/telemetry.md +32 -24
  553. package/docs/testing.md +9 -5
  554. package/docs/tools/act-and-wait.mdx +17 -13
  555. package/docs/tools/act-sequence.mdx +40 -66
  556. package/docs/tools/act.mdx +7 -5
  557. package/docs/tools/assert.mdx +1 -1
  558. package/docs/tools/look.mdx +1 -1
  559. package/docs/tools/navigate.mdx +1 -1
  560. package/docs/tools/network.mdx +13 -11
  561. package/docs/tools/overview.mdx +3 -3
  562. package/docs/tools/query.mdx +3 -3
  563. package/docs/tools/session-and-feedback.mdx +9 -6
  564. package/docs/tools/sessions.mdx +7 -0
  565. package/docs/tools/snapshot.mdx +9 -7
  566. package/docs/tools/tools-and-run.mdx +11 -10
  567. package/docs/tools/verify.mdx +1 -1
  568. package/docs/troubleshooting.mdx +21 -9
  569. package/docs/usage.md +58 -43
  570. package/docs/use-cases.mdx +2 -2
  571. package/docs/vs-chrome-devtools-mcp.mdx +5 -5
  572. package/docs/vs-playwright-mcp.mdx +5 -4
  573. package/docs/what-is-recorded.md +12 -7
  574. package/docs/what-is-reticle.mdx +2 -2
  575. package/docs/why-reticle.mdx +1 -1
  576. package/package.json +9 -12
  577. package/dist/command/dev/stale-issue-guard.d.ts +0 -34
  578. package/dist/command/dev/stale-issue-guard.js +0 -69
@@ -8,7 +8,7 @@
8
8
  */
9
9
  import { z } from 'zod';
10
10
  import type { BrowserPool } from '../../portal/pool/browser-pool.js';
11
- export declare const LEASE_PERMISSIONS_ARG: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
11
+ export declare const LEASE_PERMISSIONS_ARG: z.ZodOptional<z.ZodArray<z.ZodString>>;
12
12
  type PermissionPool = Pick<BrowserPool, 'notificationPermission'>;
13
13
  /** The validated list, undefined when the caller passed none, or a refusal naming the right shape. */
14
14
  export declare function parseLeasePermissions(raw: unknown): readonly string[] | undefined;
@@ -1,7 +1,10 @@
1
1
  /**
2
2
  * Is a leased tab usable right now? The checks `reticle_lease` runs before it may say `ready: true`.
3
3
  * Presence in the sessions map is not enough: the tab has to answer, and it has to be visible.
4
+ * The wait for the tab to connect is here too, with the zero-install reader for a page that stays silent,
5
+ * and the move that takes a reused lease to the page it was asked for.
4
6
  */
7
+ import { LeaseNotReadyReason } from '@reticlehq/core';
5
8
  /** The narrow slice of a session the probe needs. Anything that quacks like this works. */
6
9
  interface ProbeableSession {
7
10
  command?: (name: string, args: Record<string, unknown>, timeoutMs: number) => Promise<unknown>;
@@ -14,6 +17,11 @@ interface ProbeableSession {
14
17
  * default `false`. The pool foregrounding the page is what covers the gap; this catches the rest.
15
18
  */
16
19
  export declare function tabHidden(session: unknown): boolean;
20
+ /**
21
+ * Why a lease that connected is not ready: `failed` when it did not answer, `tab_hidden` when it
22
+ * answers from a hidden tab, nothing when it is ready.
23
+ */
24
+ export declare function notReadyReason(answered: boolean, session: unknown, failed?: LeaseNotReadyReason): LeaseNotReadyReason | undefined;
17
25
  /**
18
26
  * Does this tab still answer?
19
27
  *
@@ -35,4 +43,51 @@ export declare function tabHidden(session: unknown): boolean;
35
43
  * failure than the one being fixed.
36
44
  */
37
45
  export declare function probeLeaseAlive(session: ProbeableSession | undefined, timeoutMs?: number): Promise<boolean>;
46
+ /**
47
+ * Poll until the leased tab's SDK has actually registered on the bridge, so the sessionId we return
48
+ * is immediately usable (the page navigates first, then connects a moment later — without this wait
49
+ * an agent's very next call could race and hit "no connected session"). Returns whether it connected
50
+ * in time. `isConnected`, `sleeper`, and `attempts` are injected so this is fast to unit-test.
51
+ */
52
+ export declare function waitForLeasedSession(isConnected: () => boolean, sleeper?: (ms: number) => Promise<void>, attempts?: number, pollMs?: number): Promise<boolean>;
53
+ /**
54
+ * Wait for the leased tab to connect; if its app never does, hand it the zero-install reader.
55
+ *
56
+ * The decision is taken HERE, by the daemon, on the one fact that settles it: no HELLO arrived. A
57
+ * timer inside the page cannot know that — an app can connect from a dynamic import that resolves
58
+ * after `load` — and a reader injected into a page whose app was about to connect would take its
59
+ * place and drop the app's own options. So an app that connected itself is never touched, and a page
60
+ * that stayed silent through the whole readiness wait is the one that gets a reader.
61
+ */
62
+ export declare function connectOrInject(lease: {
63
+ injectReader?: () => Promise<boolean>;
64
+ isLoading?: () => Promise<boolean>;
65
+ release?: () => Promise<void>;
66
+ }, isConnected: () => boolean, wait?: (isConnected: () => boolean) => Promise<boolean>, graceRounds?: number): Promise<{
67
+ ready: boolean;
68
+ zeroInstall: boolean;
69
+ stillLoading?: true;
70
+ readerFailure?: LeaseReaderFailure;
71
+ }>;
72
+ /** Why the zero-install reader did not run, and the short cause that the hint shows. */
73
+ export interface LeaseReaderFailure {
74
+ reason: LeaseNotReadyReason;
75
+ cause: string;
76
+ }
77
+ /**
78
+ * Move a reused lease to the page it was asked for (#1667).
79
+ *
80
+ * Reuse hands back the tab wherever the last caller left it. Answering with the requested url
81
+ * while the tab stayed elsewhere sent the next read to another page. So the tab goes there, and
82
+ * the answer waits for its SDK to come back on that page, as a minted lease's does.
83
+ *
84
+ * `undefined` when there is nothing to move: the tab is already there, or its url is unknown.
85
+ * Otherwise `navigated` says whether the tab got there, `url` is the page it is on, and `arrived`
86
+ * whether its SDK connected there within the wait.
87
+ */
88
+ export declare function moveReusedLease(tabUrl: () => string | undefined, requested: string, goto: () => Promise<boolean>, now: () => number): Promise<{
89
+ navigated: boolean;
90
+ url: string;
91
+ arrived: boolean;
92
+ } | undefined>;
38
93
  export {};
@@ -1,8 +1,11 @@
1
1
  /**
2
2
  * Is a leased tab usable right now? The checks `reticle_lease` runs before it may say `ready: true`.
3
3
  * Presence in the sessions map is not enough: the tab has to answer, and it has to be visible.
4
+ * The wait for the tab to connect is here too, with the zero-install reader for a page that stays silent,
5
+ * and the move that takes a reused lease to the page it was asked for.
4
6
  */
5
- import { ReticleCommand } from '@reticlehq/core';
7
+ import { LeaseNotReadyReason, ReticleCommand, RETICLE_URL_PARAM } from '@reticlehq/core';
8
+ import { NotHtmlDocumentError } from '../../portal/pool/zero-install.js';
6
9
  /**
7
10
  * How long a liveness probe waits for the tab to say anything at all.
8
11
  *
@@ -23,6 +26,16 @@ export function tabHidden(session) {
23
26
  'object' === typeof session &&
24
27
  true === session.info?.().hidden);
25
28
  }
29
+ /**
30
+ * Why a lease that connected is not ready: `failed` when it did not answer, `tab_hidden` when it
31
+ * answers from a hidden tab, nothing when it is ready.
32
+ */
33
+ export function notReadyReason(answered, session, failed = LeaseNotReadyReason.SDK_STOPPED_ANSWERING) {
34
+ if (!answered) {
35
+ return failed;
36
+ }
37
+ return tabHidden(session) ? LeaseNotReadyReason.TAB_HIDDEN : undefined;
38
+ }
26
39
  /**
27
40
  * Does this tab still answer?
28
41
  *
@@ -45,8 +58,9 @@ export function tabHidden(session) {
45
58
  */
46
59
  export async function probeLeaseAlive(session, timeoutMs = LEASE_PROBE_TIMEOUT_MS) {
47
60
  const send = session?.command;
48
- if (send === undefined)
61
+ if (send === undefined) {
49
62
  return true;
63
+ }
50
64
  try {
51
65
  await send.call(session, ReticleCommand.CAPABILITIES, {}, timeoutMs);
52
66
  return true;
@@ -55,3 +69,137 @@ export async function probeLeaseAlive(session, timeoutMs = LEASE_PROBE_TIMEOUT_M
55
69
  return false;
56
70
  }
57
71
  }
72
+ const LEASE_READY_ATTEMPTS = 100;
73
+ const LEASE_READY_POLL_MS = 100;
74
+ /** Extra readiness waits allowed while the leased page is still loading (each one is ~10 s). */
75
+ const LEASE_LOADING_GRACE_ROUNDS = 3;
76
+ const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
77
+ /**
78
+ * Poll until the leased tab's SDK has actually registered on the bridge, so the sessionId we return
79
+ * is immediately usable (the page navigates first, then connects a moment later — without this wait
80
+ * an agent's very next call could race and hit "no connected session"). Returns whether it connected
81
+ * in time. `isConnected`, `sleeper`, and `attempts` are injected so this is fast to unit-test.
82
+ */
83
+ export async function waitForLeasedSession(isConnected, sleeper = sleep, attempts = LEASE_READY_ATTEMPTS, pollMs = LEASE_READY_POLL_MS) {
84
+ for (let i = 0; i < attempts; i++) {
85
+ if (isConnected()) {
86
+ return true;
87
+ }
88
+ await sleeper(pollMs);
89
+ }
90
+ return isConnected();
91
+ }
92
+ /**
93
+ * Wait for the leased tab to connect; if its app never does, hand it the zero-install reader.
94
+ *
95
+ * The decision is taken HERE, by the daemon, on the one fact that settles it: no HELLO arrived. A
96
+ * timer inside the page cannot know that — an app can connect from a dynamic import that resolves
97
+ * after `load` — and a reader injected into a page whose app was about to connect would take its
98
+ * place and drop the app's own options. So an app that connected itself is never touched, and a page
99
+ * that stayed silent through the whole readiness wait is the one that gets a reader.
100
+ */
101
+ export async function connectOrInject(lease, isConnected, wait = waitForLeasedSession, graceRounds = LEASE_LOADING_GRACE_ROUNDS) {
102
+ if (await wait(isConnected)) {
103
+ return { ready: true, zeroInstall: false };
104
+ }
105
+ let injected;
106
+ try {
107
+ injected = true === (await lease.injectReader?.());
108
+ }
109
+ catch (err) {
110
+ // No SDK can connect to this tab now (#1701). Release the lease, so that its slot is free.
111
+ await lease.release?.().catch(() => undefined);
112
+ return { ready: false, zeroInstall: false, readerFailure: readerFailureOf(err) };
113
+ }
114
+ if (injected && (await wait(isConnected))) {
115
+ return { ready: true, zeroInstall: true };
116
+ }
117
+ // A slow first dev compile can hold the document past both waits, and its app connects a moment
118
+ // later (#1555). Keep waiting while the page itself says it is still loading, bounded so a page
119
+ // that never finishes cannot hold the acquire forever.
120
+ for (let round = 0; round < graceRounds; round++) {
121
+ if (!(await pageStillLoading(lease))) {
122
+ break;
123
+ }
124
+ if (await wait(isConnected)) {
125
+ return { ready: true, zeroInstall: injected };
126
+ }
127
+ }
128
+ // Re-check right before answering: a connect that landed during the last loading probe counts.
129
+ if (isConnected()) {
130
+ return { ready: true, zeroInstall: injected };
131
+ }
132
+ return (await pageStillLoading(lease))
133
+ ? { ready: false, zeroInstall: false, stillLoading: true }
134
+ : { ready: false, zeroInstall: false };
135
+ }
136
+ /** Whether the leased page reports it has not finished loading. Unknown counts as loaded. */
137
+ async function pageStillLoading(lease) {
138
+ try {
139
+ return true === (await lease.isLoading?.());
140
+ }
141
+ catch {
142
+ return false;
143
+ }
144
+ }
145
+ /** The longest cause that a reader failure keeps. A Playwright error can carry a long call log. */
146
+ const READER_CAUSE_MAX_CHARS = 200;
147
+ function readerFailureOf(err) {
148
+ const message = err instanceof Error ? err.message : String(err);
149
+ // Only the first line: the lines after it are the Playwright call log, not the cause.
150
+ const cause = (message.split('\n')[0] ?? '').slice(0, READER_CAUSE_MAX_CHARS);
151
+ return {
152
+ reason: err instanceof NotHtmlDocumentError
153
+ ? LeaseNotReadyReason.NOT_HTML_DOCUMENT
154
+ : LeaseNotReadyReason.READER_FAILED,
155
+ cause,
156
+ };
157
+ }
158
+ /** How long a moved lease's SDK gets to come back on the new page: the mint path's wait. */
159
+ const REUSED_ARRIVAL_MS = LEASE_READY_ATTEMPTS * LEASE_READY_POLL_MS;
160
+ /** A URL as a page: without Reticle's own params or the fragment. Undefined when it is not a URL. */
161
+ function pageOf(url) {
162
+ if (url === undefined) {
163
+ return undefined;
164
+ }
165
+ try {
166
+ const u = new URL(url);
167
+ for (const param of Object.values(RETICLE_URL_PARAM)) {
168
+ u.searchParams.delete(param);
169
+ }
170
+ u.hash = '';
171
+ return u.href;
172
+ }
173
+ catch {
174
+ return undefined;
175
+ }
176
+ }
177
+ /**
178
+ * Move a reused lease to the page it was asked for (#1667).
179
+ *
180
+ * Reuse hands back the tab wherever the last caller left it. Answering with the requested url
181
+ * while the tab stayed elsewhere sent the next read to another page. So the tab goes there, and
182
+ * the answer waits for its SDK to come back on that page, as a minted lease's does.
183
+ *
184
+ * `undefined` when there is nothing to move: the tab is already there, or its url is unknown.
185
+ * Otherwise `navigated` says whether the tab got there, `url` is the page it is on, and `arrived`
186
+ * whether its SDK connected there within the wait.
187
+ */
188
+ export async function moveReusedLease(tabUrl, requested, goto, now) {
189
+ const from = tabUrl();
190
+ const target = pageOf(requested);
191
+ if (pageOf(from) === undefined || target === undefined || pageOf(from) === target) {
192
+ return undefined;
193
+ }
194
+ const went = await Promise.resolve()
195
+ .then(goto)
196
+ .catch(() => false);
197
+ if (!went) {
198
+ return { navigated: false, url: from ?? requested, arrived: true };
199
+ }
200
+ const start = now();
201
+ while (pageOf(tabUrl()) !== target && now() - start < REUSED_ARRIVAL_MS) {
202
+ await sleep(LEASE_READY_POLL_MS);
203
+ }
204
+ return { navigated: true, url: requested, arrived: pageOf(tabUrl()) === target };
205
+ }
@@ -9,14 +9,11 @@
9
9
  *
10
10
  * Attach-only: the pool drives a browser against an already-running dev server — it never starts one.
11
11
  */
12
- import type { RealInputProvider } from '../../portal/input/real-input.js';
13
- import { type StorageFixturePort } from '../../portal/input/storage-fixture.js';
14
- import { type NetworkMutationPort } from '../../portal/input/network-mutation.js';
15
- import type { Perturbation } from '@reticlehq/core';
16
12
  import { type SeedStorage } from '@reticlehq/core';
17
13
  import { HudVisibility } from '@reticlehq/core';
18
14
  import { type ToolDef, type ToolDeps } from './tool-kit.js';
19
- import type { BrowserPool } from '../../portal/pool/browser-pool.js';
15
+ import { type BrowserPool } from '../../portal/pool/browser-pool.js';
16
+ export { sessionMutationPort, sessionPerturbationPort, suiteFixturePort, suiteFixtureSeed, } from './session-ports.js';
20
17
  /**
21
18
  * Append Reticle identity params (__reticle_session, optional __reticle_project) to a URL so the app's own SDK
22
19
  * adopts them on connect. Pure; falls back to plain concatenation if the URL can't be parsed.
@@ -57,12 +54,6 @@ export declare function resolveLeasedSessionId(sessions: {
57
54
  * a human's own URL.
58
55
  */
59
56
  export declare function carryReticleIdentity(fromUrl: string | undefined, toUrl: string): string;
60
- /**
61
- * Poll until the leased tab's SDK has actually registered on the bridge, so the sessionId we return
62
- * is immediately usable (the page navigates first, then connects a moment later — without this wait
63
- * an agent's very next call could race and hit "no connected session"). Returns whether it connected
64
- * in time. `isConnected`, `sleeper`, and `attempts` are injected so this is fast to unit-test.
65
- */
66
57
  /**
67
58
  * Acquire a leased, SDK-connected context for a caller that is not the lease TOOL (the parallel suite).
68
59
  * Returns the session id plus its release; the caller must release in a finally so a crashed flow never
@@ -77,6 +68,7 @@ export declare function acquireLeasedSession(pool: {
77
68
  release: () => Promise<void>;
78
69
  navStatus?: number;
79
70
  injectReader?: () => Promise<boolean>;
71
+ isLoading?: () => Promise<boolean>;
80
72
  }>;
81
73
  /**
82
74
  * The address this lease's page said it could not reach. Optional so a test double need not
@@ -95,22 +87,6 @@ export declare function acquireLeasedSession(pool: {
95
87
  sessionId: string;
96
88
  release: () => Promise<void>;
97
89
  }>;
98
- export declare function waitForLeasedSession(isConnected: () => boolean, sleeper?: (ms: number) => Promise<void>, attempts?: number, pollMs?: number): Promise<boolean>;
99
- /**
100
- * Wait for the leased tab to connect; if its app never does, hand it the zero-install reader.
101
- *
102
- * The decision is taken HERE, by the daemon, on the one fact that settles it: no HELLO arrived. A
103
- * timer inside the page cannot know that — an app can connect from a dynamic import that resolves
104
- * after `load` — and a reader injected into a page whose app was about to connect would take its
105
- * place and drop the app's own options. So an app that connected itself is never touched, and a page
106
- * that stayed silent through the whole readiness wait is the one that gets a reader.
107
- */
108
- export declare function connectOrInject(lease: {
109
- injectReader?: () => Promise<boolean>;
110
- }, isConnected: () => boolean, wait?: (isConnected: () => boolean) => Promise<boolean>): Promise<{
111
- ready: boolean;
112
- zeroInstall: boolean;
113
- }>;
114
90
  export declare function hasOriginLock(origin: string): boolean;
115
91
  export declare const LEASE_ACQUIRE_TOOL: ToolDef;
116
92
  /**
@@ -122,51 +98,3 @@ export declare const LEASE_ACQUIRE_TOOL: ToolDef;
122
98
  */
123
99
  export declare function releaseLease(deps: ToolDeps, pool: BrowserPool, sessionId: string): Promise<number>;
124
100
  export declare const LEASE_TOOLS: ToolDef[];
125
- /**
126
- * The state a suite should boot its flows from: whatever the agent is already sitting in.
127
- *
128
- * This is the join the fixture work was building toward. A suite's flows each start from cold, so
129
- * fifty of them prove the login works fifty times — and the flow that LOGS OUT leaves every flow
130
- * after it signed out, which no navigation repairs, because the problem is not where the subject is
131
- * but what it holds. A seed is applied to an isolated context BEFORE the first navigation, which is
132
- * exactly and only when a fixture can work.
133
- *
134
- * Best-effort, deliberately. A fixture is an OPTIMISATION over running from cold, and running from
135
- * cold is correct: a suite that refused to start because a cookie jar could not be read would have
136
- * traded a slow answer for no answer. Every "no" here — no provider, no storage support, nothing
137
- * driven, a browser that threw, nothing worth seeding — produces the same honest `undefined`, and
138
- * the suite runs exactly as it did before any of this existed.
139
- */
140
- export declare function suiteFixtureSeed(realInput: RealInputProvider | undefined, appUrl: string): Promise<SeedStorage | undefined>;
141
- /**
142
- * A way to make this session's page SLOW on purpose, or nothing.
143
- *
144
- * The third of these seams, for the same reason as the other two: a feature reaching into the input
145
- * layer directly is a feature depending on a driver, and the boundary guard asks about it.
146
- *
147
- * Installs delays and NOTHING else. A rule that carried a status or a body would substitute a
148
- * response the server never sent, and an app raced against invented data produces invented races —
149
- * a fabricated defect handed to somebody at 3am, which is worse than finding nothing.
150
- */
151
- export declare function sessionPerturbationPort(realInput: RealInputProvider | undefined, appUrl: string | undefined): Promise<{
152
- slow(rules: readonly Perturbation[]): Promise<void>;
153
- clear(): Promise<void>;
154
- } | undefined>;
155
- /**
156
- * Save/restore for this session's page, or nothing.
157
- *
158
- * The same job as `suiteFixtureSeed` next door, stopping one step earlier: that one captures and
159
- * converts, this hands back the PORT so a caller can re-apply what it captured later. It lives here
160
- * for the reason written above — a feature reaching into the input layer directly is a feature
161
- * depending on a driver, and the boundary guard asks about it. It asked.
162
- */
163
- export declare function suiteFixturePort(realInput: RealInputProvider | undefined, appUrl: string | undefined): Promise<StorageFixturePort | undefined>;
164
- /**
165
- * A way to break this session's page, or nothing.
166
- *
167
- * Sits beside `suiteFixtureSeed` because it is the same shape of job: turning a provider capability
168
- * into something a feature can use, on the one side of the graph that is allowed to know about both.
169
- * A flow tool reaching into the input layer directly would be a feature depending on a driver, which
170
- * is the reach the boundary guard exists to ask about.
171
- */
172
- export declare function sessionMutationPort(realInput: RealInputProvider | undefined, appUrl: string | undefined): Promise<NetworkMutationPort | undefined>;