@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
@@ -0,0 +1,251 @@
1
+ /**
2
+ * The instrumentation gaps each session's verdicts actually recorded, kept for the surfaces that
3
+ * describe an app rather than one verdict: the platform's app report, the HUD's coverage line and
4
+ * `doctor`. Fed from the one function every verdict's gaps already pass through (`withGapNovelty`),
5
+ * so nothing here surveys a page: a gap is listed only because a verdict paid for it.
6
+ *
7
+ * Deduped by kind + missing, newest first, bounded per session.
8
+ */
9
+ import { withRunningDrive } from '../../features/harness/drive-runs.js';
10
+ import { agentLinkOf } from './agent-link.js';
11
+ import { CoverageMarker, InstrumentationGapKind, LINK_APP_GAPS_MAX, ReticleCommand, agentPromptFor, coverageOf, harnessGateOf, harnessUnlockPrompt, CoverageCapability, } from '@reticlehq/core';
12
+ const bySession = new Map();
13
+ const text = (value) => 'string' === typeof value && 0 < value.length ? value : undefined;
14
+ /** Remember gaps a verdict on this session just reported. Malformed entries are skipped. */
15
+ export function recordGaps(sessionId, gaps, now) {
16
+ let list = bySession.get(sessionId) ?? [];
17
+ for (const raw of gaps) {
18
+ const gap = raw;
19
+ const kind = text(gap['kind']);
20
+ const missing = text(gap['missing']);
21
+ const fix = text(gap['fix']);
22
+ if (kind === undefined || missing === undefined || fix === undefined)
23
+ continue;
24
+ const cost = text(gap['cost']);
25
+ const ref = text(gap['ref']);
26
+ const source = text(gap['source']);
27
+ list = [
28
+ {
29
+ kind,
30
+ missing,
31
+ fix,
32
+ seenAt: now,
33
+ ...(cost === undefined ? {} : { cost }),
34
+ ...(ref === undefined ? {} : { ref }),
35
+ ...(source === undefined ? {} : { source }),
36
+ },
37
+ ...list.filter((g) => g.kind !== kind || g.missing !== missing),
38
+ ].slice(0, LINK_APP_GAPS_MAX);
39
+ }
40
+ if (0 < list.length)
41
+ bySession.set(sessionId, list);
42
+ }
43
+ /**
44
+ * The app a tab shows, as a key: its project, else its origin. What one tab of an app has shown
45
+ * (a file:line, a test id) is a fact about the app, and a fresh tab of it has not acted yet: keyed
46
+ * by session alone, every new lease reported the app at 75% and the platform locked a Harness run
47
+ * mid-drive that it had let start at 87.5%.
48
+ */
49
+ function appKeyOf(tab) {
50
+ if (tab.projectId !== undefined && 0 < tab.projectId.length)
51
+ return `project:${tab.projectId}`;
52
+ if (tab.url === undefined)
53
+ return undefined;
54
+ try {
55
+ return `origin:${new URL(tab.url).origin}`;
56
+ }
57
+ catch {
58
+ return undefined;
59
+ }
60
+ }
61
+ /** Sessions, and apps, where at least one verdict mapped a control to its file:line. */
62
+ const sourceSeen = new Set();
63
+ /** Mark a tab, and the app it shows, in a seen-set. */
64
+ function markSeen(seen, tab) {
65
+ seen.add(tab.id);
66
+ const app = appKeyOf(tab);
67
+ if (app !== undefined)
68
+ seen.add(app);
69
+ }
70
+ /** Whether this tab, or any tab of its app, was marked. */
71
+ function wasSeen(seen, tab) {
72
+ const app = appKeyOf(tab);
73
+ return seen.has(tab.id) || (app !== undefined && seen.has(app));
74
+ }
75
+ /** A verdict on this tab named a file:line: source mapping is seen, whatever else lacks one. */
76
+ export function noteSourceSeen(tab, source) {
77
+ if (source !== undefined)
78
+ markSeen(sourceSeen, tab);
79
+ }
80
+ /** Sessions, and apps, where an acted element carried a `data-testid`. */
81
+ const testidSeen = new Set();
82
+ /** An acted element carried a test id: the app uses them, whatever one control lacks. */
83
+ export function noteTestidSeen(tab, testid) {
84
+ if (testid !== undefined && 0 < testid.length)
85
+ markSeen(testidSeen, tab);
86
+ }
87
+ /** What an act result says about the element it reached: its test id and its source stamp. */
88
+ export function noteActedElement(tab, result) {
89
+ if ('object' !== typeof result || null === result)
90
+ return;
91
+ const acted = result;
92
+ noteTestidSeen(tab, text(acted['testid']));
93
+ const source = acted['source'];
94
+ if ('object' === typeof source && null !== source) {
95
+ const file = text(source['file']);
96
+ if (file !== undefined)
97
+ markSeen(sourceSeen, tab);
98
+ }
99
+ }
100
+ /**
101
+ * An act's result, passed through after noting what it says about the element it reached. Every act
102
+ * dispatches through one function, so coverage sees test ids and source stamps from the first
103
+ * control acted on rather than only from a verdict.
104
+ */
105
+ export function notedAct(tab, done) {
106
+ if (done.ok)
107
+ noteActedElement(tab, done.result);
108
+ return done;
109
+ }
110
+ /** The markers a page said it carries (`ReticleCommand.MARKERS`), marked for its tab and its app. */
111
+ function noteMarkers(tab, result) {
112
+ if ('object' !== typeof result || null === result)
113
+ return;
114
+ const markers = result['markers'];
115
+ if (!Array.isArray(markers))
116
+ return;
117
+ if (markers.includes(CoverageMarker.SOURCE))
118
+ markSeen(sourceSeen, tab);
119
+ if (markers.includes(CoverageMarker.TESTID))
120
+ markSeen(testidSeen, tab);
121
+ const notApplicable = result['notApplicable'];
122
+ if (Array.isArray(notApplicable) && notApplicable.includes(CoverageCapability.SOURCE_MAPPING))
123
+ markSeen(sourceNotApplicable, tab);
124
+ }
125
+ /** Apps whose page said file:line cannot apply (plain HTML: no plugin, no framework, no stamp). */
126
+ const sourceNotApplicable = new Set();
127
+ /** How long a page gets to say what it carries. Silent and cheap, so a page that cannot is skipped. */
128
+ const MARKERS_PROBE_MS = 2_000;
129
+ /**
130
+ * Ask each page whose app has not shown both markers yet what it carries. What an act happens to
131
+ * reach decides nothing then: an app with test ids is seen to have them before anything acted, and a
132
+ * hidden tab of it says the same. A page that cannot answer (an older SDK, a closed tab) is skipped.
133
+ * True when a page showed something not known before.
134
+ */
135
+ export async function probeMarkers(tabs) {
136
+ const before = sourceSeen.size + testidSeen.size;
137
+ await Promise.all(tabs
138
+ .filter((tab) => !(wasSeen(sourceSeen, tab) || wasSeen(sourceNotApplicable, tab)) ||
139
+ !wasSeen(testidSeen, tab))
140
+ .map(async (tab) => {
141
+ const done = await tab
142
+ .command?.(ReticleCommand.MARKERS, {}, MARKERS_PROBE_MS)
143
+ .catch(() => undefined);
144
+ if (true === done?.ok)
145
+ noteMarkers(tab, done.result);
146
+ }));
147
+ return before < sourceSeen.size + testidSeen.size;
148
+ }
149
+ /** What this session's verdicts recorded, newest first. */
150
+ export function recordedGaps(sessionId) {
151
+ return bySession.get(sessionId) ?? [];
152
+ }
153
+ /** Forget a session that ended. What its app has shown is kept: it is still that app's. */
154
+ export function forgetRecordedGaps(sessionId) {
155
+ bySession.delete(sessionId);
156
+ sourceSeen.delete(sessionId);
157
+ testidSeen.delete(sessionId);
158
+ }
159
+ /** Forget everything, apps included. For tests. */
160
+ export function forgetAllRecordedGaps() {
161
+ bySession.clear();
162
+ sourceSeen.clear();
163
+ testidSeen.clear();
164
+ sourceNotApplicable.clear();
165
+ }
166
+ /**
167
+ * The tab's HELLO channels, plus the `source` marker when an act or verdict mapped a control to
168
+ * its file:line (seen anywhere is seen) or its page said it carries source mapping, and the
169
+ * `testid` marker once an acted element carried one — the list the platform report sends and
170
+ * coverage reads. A build that turned the stamp off has no source marker, whatever was seen.
171
+ */
172
+ export function announcedChannels(tab) {
173
+ const channels = [...(tab.channels ?? [])];
174
+ const gaps = recordedGaps(tab.id);
175
+ // Only the build turning the stamp off overrules the page: one unmapped control does not mean
176
+ // the app has no source mapping (core's per-control rule).
177
+ const off = gaps.some((gap) => InstrumentationGapKind.SOURCE_MAPPING_OFF === gap.kind);
178
+ if (!off && (wasSeen(sourceSeen, tab) || true === tab.sourceMapping))
179
+ channels.push(CoverageMarker.SOURCE);
180
+ // Nothing announces test ids, so they are seen on an acted element — and a control the agent
181
+ // could only reach without one keeps the capability missing.
182
+ const noTestid = gaps.some((gap) => InstrumentationGapKind.MISSING_TESTID === gap.kind);
183
+ if (!noTestid && wasSeen(testidSeen, tab))
184
+ channels.push(CoverageMarker.TESTID);
185
+ return channels;
186
+ }
187
+ /** The app a tab shows, named for a prompt: its host, else its url. */
188
+ const appNameOf = (url) => {
189
+ try {
190
+ return new URL(url).host;
191
+ }
192
+ catch {
193
+ return url;
194
+ }
195
+ };
196
+ /**
197
+ * The coverage capabilities that do not apply to this tab's app, excluded from both sides of the
198
+ * score: file:line on a page that said it cannot apply there (plain HTML), until a stamp shows up.
199
+ * The platform reads the same list from the local-apps report, so both sides move together.
200
+ */
201
+ export function notApplicableOf(tab) {
202
+ return wasSeen(sourceNotApplicable, tab) && !wasSeen(sourceSeen, tab)
203
+ ? [CoverageCapability.SOURCE_MAPPING]
204
+ : [];
205
+ }
206
+ /**
207
+ * This tab's coverage and its Harness gate, with the coding-agent prompt when its verdicts recorded
208
+ * any gap or the gate is shut: below the gate the prompt names every unseen capability, so there is
209
+ * always something to hand the agent.
210
+ */
211
+ export function instrumentationOf(tab,
212
+ /** The app's other tabs: what any of them has seen or recorded counts, as on the platform. */
213
+ siblings = []) {
214
+ const tabs = [tab, ...siblings];
215
+ const gaps = [
216
+ ...new Map(tabs.flatMap((each) => recordedGaps(each.id)).map((g) => [`${g.kind}\u0000${g.missing}`, g])).values(),
217
+ ];
218
+ const channels = [...new Set(tabs.flatMap((each) => announcedChannels(each)))];
219
+ const coverage = coverageOf({ channels, gaps });
220
+ const url = tab.url ?? '';
221
+ const appName = appNameOf(url);
222
+ const notApplicable = notApplicableOf(tab);
223
+ const gate = harnessGateOf(coverage, notApplicable);
224
+ const harnessGate = {
225
+ percent: gate.percent,
226
+ unlocked: gate.unlocked,
227
+ ...(gate.reason === undefined ? {} : { reason: gate.reason }),
228
+ };
229
+ if (!gate.unlocked)
230
+ return {
231
+ ...coverage,
232
+ harnessGate,
233
+ prompt: harnessUnlockPrompt({ coverage, gaps, appName, url, notApplicable }),
234
+ };
235
+ return 0 === gaps.length
236
+ ? { ...coverage, harnessGate }
237
+ : { ...coverage, harnessGate, prompt: agentPromptFor({ gaps, appName, url }) };
238
+ }
239
+ /**
240
+ * The impact snapshot a tab is pushed, carrying that tab's own coverage, running drive and agent
241
+ * link (who is attached, and this tab's notes to them). Every
242
+ * push needs the drive: one without it reads as "no drive", and the drive's own tool calls push.
243
+ */
244
+ export function withInstrumentation(tab, snapshot) {
245
+ const pushed = {
246
+ ...snapshot,
247
+ instrumentation: { ...instrumentationOf(tab) },
248
+ agent: agentLinkOf(tab.inboxHistory?.() ?? []),
249
+ };
250
+ return withRunningDrive(pushed, tab.id) ?? pushed;
251
+ }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Which directory the dev server that served a page runs in.
3
+ *
4
+ * The tie-breaker for a project several checkouts declare: every git worktree carries the same
5
+ * committed `.reticle.json`, so the projectId cannot tell them apart, but the process serving the
6
+ * page runs inside exactly one of them. Lives with the session rather than the artifact resolver
7
+ * because both observations are about this machine's processes -- daemon state files and `lsof` --
8
+ * which `memory/project` has no business knowing. The resolver takes the answer as an injected
9
+ * function; the composition roots pass this one.
10
+ */
11
+ import { type DevServerEntry } from '@reticlehq/core';
12
+ /** Where `servingDirectoryOf` gets its two observations. Injected so a test needs no processes. */
13
+ export interface ServingDirectoryIo {
14
+ /** Live dev servers that announced themselves (the Vite plugin writes `devserver-<port>.json`). */
15
+ devServers: () => readonly DevServerEntry[];
16
+ /** The working directory of whatever listens on `port`, or null when it cannot be read. */
17
+ listenerCwd: (port: number) => string | null;
18
+ }
19
+ /**
20
+ * The directory of the dev server that served `origin`, or undefined when it cannot be observed.
21
+ *
22
+ * Two observations, exact one first. A dev server whose plugin announced this port names its own
23
+ * root and works on every platform. Otherwise the process listening on the port is asked for its
24
+ * working directory, which covers frameworks with no announcing plugin (Next.js) wherever `lsof`
25
+ * runs. Loopback only: a remote page's port says nothing about any process on this machine.
26
+ */
27
+ export declare function servingDirectoryOf(origin: string, io?: ServingDirectoryIo): string | undefined;
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Which directory the dev server that served a page runs in.
3
+ *
4
+ * The tie-breaker for a project several checkouts declare: every git worktree carries the same
5
+ * committed `.reticle.json`, so the projectId cannot tell them apart, but the process serving the
6
+ * page runs inside exactly one of them. Lives with the session rather than the artifact resolver
7
+ * because both observations are about this machine's processes -- daemon state files and `lsof` --
8
+ * which `memory/project` has no business knowing. The resolver takes the answer as an injected
9
+ * function; the composition roots pass this one.
10
+ */
11
+ import { isLoopbackHostname } from '@reticlehq/core';
12
+ import { captureLookup, findListenerCwd } from '../../command/cli/ports/port-holder.js';
13
+ import { reticleStateHome } from '../../command/daemon/daemon.js';
14
+ import { readDevServers } from '../../command/daemon/dev-servers.js';
15
+ const DEFAULT_PORT = { 'http:': 80, 'https:': 443 };
16
+ const liveIo = {
17
+ devServers: () => readDevServers(reticleStateHome()),
18
+ listenerCwd: (port) => findListenerCwd(port, captureLookup),
19
+ };
20
+ /**
21
+ * The directory of the dev server that served `origin`, or undefined when it cannot be observed.
22
+ *
23
+ * Two observations, exact one first. A dev server whose plugin announced this port names its own
24
+ * root and works on every platform. Otherwise the process listening on the port is asked for its
25
+ * working directory, which covers frameworks with no announcing plugin (Next.js) wherever `lsof`
26
+ * runs. Loopback only: a remote page's port says nothing about any process on this machine.
27
+ */
28
+ export function servingDirectoryOf(origin, io = liveIo) {
29
+ let url;
30
+ try {
31
+ url = new URL(origin);
32
+ }
33
+ catch {
34
+ return undefined;
35
+ }
36
+ if (!isLoopbackHostname(url.hostname))
37
+ return undefined;
38
+ const port = '' === url.port ? DEFAULT_PORT[url.protocol] : Number(url.port);
39
+ if (port === undefined)
40
+ return undefined;
41
+ const announced = io.devServers().find((entry) => entry.port === port);
42
+ if (announced !== undefined)
43
+ return announced.root;
44
+ return io.listenerCwd(port) ?? undefined;
45
+ }
@@ -75,6 +75,17 @@ export interface SessionHealth {
75
75
  * That is the trade: an over-firing field gets ignored, and a field nobody reads catches nothing.
76
76
  */
77
77
  export declare const PENDING_NAVIGATION_NOTICE_MS = 10000;
78
+ /**
79
+ * Said beside `dispatched` / `settled` on a skewed session, because those fields read as success.
80
+ *
81
+ * The reporter's own account of the cost: "the false-positive dispatch confirmation is what cost the
82
+ * most time — I trusted `dispatched: true, domMutatedWithin: Nms` as real signal for a long time
83
+ * before suspecting the skew banner." Stating the contradiction is the whole job here; the existing
84
+ * banner was accurate and simply never appeared where it was needed.
85
+ */
86
+ /** The skew warning after an agent has read the paragraph once this session. */
87
+ export declare const SKEW_SHORT_WARNING = "version skew: `dispatched`/`settled` here do not prove the app acted \u2014 see session.versionSkew.";
88
+ export declare const SKEW_VERDICT_WARNING: string;
78
89
  /**
79
90
  * The age of the oldest request that STARTED and never completed, or undefined when there is none
80
91
  * worth reporting.
@@ -163,6 +174,13 @@ interface HealthReport {
163
174
  * closed list is that an unbounded string can never reach telemetry through it.
164
175
  */
165
176
  brand: BrowserBrand | undefined;
177
+ /** Only the keys the page reported, so merging it never erases one an earlier report set. */
178
+ page: PageIdentity;
179
+ }
180
+ /** Which desktop window a session is, and what its document was served with. */
181
+ export interface PageIdentity {
182
+ windowLabel?: string;
183
+ documentStatus?: number;
166
184
  }
167
185
  /**
168
186
  * Narrow a PAGE_HEALTH payload. Every field is optional on the wire — an older SDK does not report
@@ -27,7 +27,9 @@ export const PENDING_NAVIGATION_NOTICE_MS = 10_000;
27
27
  * before suspecting the skew banner." Stating the contradiction is the whole job here; the existing
28
28
  * banner was accurate and simply never appeared where it was needed.
29
29
  */
30
- const SKEW_VERDICT_WARNING = 'version skew: `dispatched` and `settled` on this session mean the event was sent, NOT that the ' +
30
+ /** The skew warning after an agent has read the paragraph once this session. */
31
+ export const SKEW_SHORT_WARNING = 'version skew: `dispatched`/`settled` here do not prove the app acted — see session.versionSkew.';
32
+ export const SKEW_VERDICT_WARNING = 'version skew: `dispatched` and `settled` on this session mean the event was sent, NOT that the ' +
31
33
  'app acted on it — a skewed pair drops actions silently. Re-read the control (aria-checked, ' +
32
34
  'data-state, its text) before trusting any verdict from this session, and converge the versions ' +
33
35
  '(see session.versionSkew).';
@@ -161,6 +163,12 @@ export function readHealthEvent(data) {
161
163
  runtime: 'string' === typeof data['runtime'] ? data['runtime'] : undefined,
162
164
  engine: 'string' === typeof data['engine'] ? data['engine'] : undefined,
163
165
  brand: Object.values(BrowserBrand).find((known) => known === data['brand']),
166
+ page: {
167
+ ...('string' === typeof data['windowLabel'] ? { windowLabel: data['windowLabel'] } : {}),
168
+ ...(Number.isInteger(data['documentStatus'])
169
+ ? { documentStatus: data['documentStatus'] }
170
+ : {}),
171
+ },
164
172
  };
165
173
  }
166
174
  /**
@@ -1,4 +1,6 @@
1
- import type { SessionHealth } from './session-health.js';
1
+ import type { PageIdentity, SessionHealth } from './session-health.js';
2
+ /** A document served as 4xx/5xx — a dev server's 404 page that still mounted the SDK, say. */
3
+ export declare function isErrorDocument(page: PageIdentity | undefined): boolean;
2
4
  export interface SessionInfo {
3
5
  sessionId: string;
4
6
  url: string;
@@ -17,6 +19,10 @@ export interface SessionInfo {
17
19
  * not render like it.
18
20
  */
19
21
  runtime?: string;
22
+ /** The desktop window's own name (Tauri's label: `main`, `setup`) — absent on a web page. */
23
+ window?: string;
24
+ /** Present only when the document was served as an error (4xx/5xx): a 404 page is not the app. */
25
+ documentStatus?: number;
20
26
  /** Present only when the page's SDK version differs from the daemon's — see version-skew.ts. */
21
27
  versionSkew?: string;
22
28
  /** ms since the SDK last reported anything (silence ⇒ likely throttled). */
@@ -72,6 +78,7 @@ interface SessionView {
72
78
  runtime: string | undefined;
73
79
  versionSkew: string | undefined;
74
80
  hidden: boolean;
81
+ page?: PageIdentity;
75
82
  health: () => SessionHealth;
76
83
  staleMs: () => number;
77
84
  pendingMarkCount: () => number;
@@ -6,6 +6,10 @@
6
6
  * it, and separating them keeps the wire-facing shape reviewable on its own.
7
7
  */
8
8
  import { SESSION_LEASE } from '@reticlehq/core';
9
+ /** A document served as 4xx/5xx — a dev server's 404 page that still mounted the SDK, say. */
10
+ export function isErrorDocument(page) {
11
+ return (page?.documentStatus ?? 0) >= 400;
12
+ }
9
13
  /**
10
14
  * Project a live Session into the shape the tools return.
11
15
  *
@@ -27,6 +31,8 @@ export function buildSessionInfo(session) {
27
31
  hasCapabilities: session.hasCapabilities,
28
32
  // Omitted when the page never said, so absence stays readable as "unknown" rather than "web".
29
33
  ...(session.runtime === undefined ? {} : { runtime: session.runtime }),
34
+ ...(session.page?.windowLabel === undefined ? {} : { window: session.page.windowLabel }),
35
+ ...(isErrorDocument(session.page) ? { documentStatus: session.page?.documentStatus ?? 0 } : {}),
30
36
  // On every listing, not buried in a log — skew explains failures that read as app bugs.
31
37
  ...(session.versionSkew === undefined ? {} : { versionSkew: session.versionSkew }),
32
38
  hidden: session.hidden,
@@ -43,7 +49,8 @@ export function buildSessionInfo(session) {
43
49
  base.unresponsive = true;
44
50
  base.unresponsive_suggestion =
45
51
  'This tab is connected but has stopped answering commands, so every call against it will time ' +
46
- 'out. Ending the session does not revive the page. Reload the tab, or run `reticle open <url>` ' +
52
+ 'out. Ending the session does not revive the page. Reload the tab, or run ' +
53
+ '`npx @reticlehq/server open <url>` ' +
47
54
  'to get a fresh one — it will no longer hand this tab back.';
48
55
  }
49
56
  // Surface human bug reports in reticle_sessions (only when > 0, so a clean session adds nothing).
@@ -14,6 +14,17 @@ interface ResolveScope {
14
14
  }
15
15
  /** The scheme://host:port of a URL, or undefined if it can't be parsed. Used to compare origins. */
16
16
  export declare function originOf(url: string | undefined): string | undefined;
17
+ /**
18
+ * Honest, scoped error when sessions exist but none match the agent's project.
19
+ *
20
+ * The daemon takes its default scope from the `.reticle.json` of whichever directory started it, so
21
+ * attaching from a second project — or another worktree of the SAME project — makes every tool
22
+ * refuse while `reticle_sessions` shows the tab sitting right there. The old message asked "is that
23
+ * app running with @reticlehq/core enabled?", which is the one thing that is definitely true, so the
24
+ * reader goes looking at their app instead of at the scope. Name what IS connected and how to
25
+ * target it: both facts are already in hand here.
26
+ */
27
+ export declare function scopeMissError(connected: Session[], scope?: ResolveScope): string;
17
28
  /** What a refused hello said about itself: the page it was on and the project it claimed. */
18
29
  export interface RefusedPage {
19
30
  readonly url?: string;
@@ -31,6 +42,16 @@ export declare class SessionManager {
31
42
  setDefaultScope(scope: ResolveScope | undefined): void;
32
43
  setConnectionRecorder(record: ((projectId: string | undefined) => void) | undefined): void;
33
44
  add(session: Session): Session | undefined;
45
+ /**
46
+ * Close a window's connection and refuse its id until the daemon restarts.
47
+ *
48
+ * Reported from a Tauri app whose hidden windows kept reconnecting: ending the session only ended
49
+ * the presenter, so the window came straight back. A reload keeps its id (sessionStorage), so the
50
+ * id is what stays parked; the 1008 close tells the SDK not to retry. Its tombstone goes too, so a
51
+ * call naming it is refused rather than handed a sibling window.
52
+ */
53
+ park(session: Session): void;
54
+ isParked(sessionId: string): boolean;
34
55
  remove(session: Session): boolean;
35
56
  get(sessionId: string): Session | undefined;
36
57
  /**
@@ -47,6 +68,13 @@ export declare class SessionManager {
47
68
  attachmentOf(sessionId: string): ReturnType<AttachmentHistory['of']>;
48
69
  /** Every connected session — used by the liveness reaper to sweep for idle/disconnected ones. */
49
70
  all(): Session[];
71
+ /**
72
+ * The connected sessions an id-less call may consider: the active project's, when one is set.
73
+ *
74
+ * The same set `resolve()` chooses from, so a caller that falls back from a refused resolution
75
+ * (an id-less yield) never reaches a tab the project scope would never have handed it.
76
+ */
77
+ inScope(): Session[];
50
78
  count(): number;
51
79
  /** Wire the diagnosis provider (daemon boot). Absent ⇒ the plain, static message. */
52
80
  setNoSessionHint(hint: (() => string | undefined) | undefined): void;
@@ -68,6 +96,8 @@ export declare class SessionManager {
68
96
  setNoSessionNextAction(next: (() => NoSessionNextAction | undefined) | undefined): void;
69
97
  noSessionNextAction(): NoSessionNextAction | undefined;
70
98
  everConnected(): boolean;
99
+ /** Whether a session for this project has registered since boot. An unknown id has not. */
100
+ everConnectedTo(projectId: string): boolean;
71
101
  /**
72
102
  * Record a bridge-initiated close so `resolve` can explain a session that vanished.
73
103
  *
@@ -99,6 +129,15 @@ export declare class SessionManager {
99
129
  * a connected tab is in `list()`, not here.
100
130
  */
101
131
  lastKnown(): SessionIdentity | undefined;
132
+ /**
133
+ * The most recent departed session for one project.
134
+ *
135
+ * `lastKnown` is the newest tombstone of any project. A shared daemon that quoted it to every
136
+ * caller told the second project to reopen the first project's tab.
137
+ */
138
+ lastKnownFor(projectId: string): SessionIdentity | undefined;
139
+ /** Every departed session's URL, oldest first. The port scan has to see all of them, not only the newest. */
140
+ tombstoneUrls(): readonly string[];
102
141
  resolve(sessionId?: string, scope?: ResolveScope): Session;
103
142
  }
104
143
  export {};