@reticlehq/server 3.6.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 (614) hide show
  1. package/SKILL.md +122 -123
  2. package/dist/command/cli/adhoc-suite.d.ts +14 -0
  3. package/dist/command/cli/adhoc-suite.js +42 -7
  4. package/dist/command/cli/adhoc-verdict.d.ts +18 -2
  5. package/dist/command/cli/adhoc-verdict.js +70 -6
  6. package/dist/command/cli/answers/gate-exit.d.ts +23 -0
  7. package/dist/command/cli/answers/gate-exit.js +45 -0
  8. package/dist/command/cli/answers/gate-hook-message.d.ts +2 -0
  9. package/dist/command/cli/answers/gate-hook-message.js +3 -1
  10. package/dist/command/cli/auth/device-flow.d.ts +13 -2
  11. package/dist/command/cli/auth/device-flow.js +17 -0
  12. package/dist/command/cli/cli-doctor.js +14 -0
  13. package/dist/command/cli/cli-flow-commands.d.ts +0 -11
  14. package/dist/command/cli/cli-flow-commands.js +28 -105
  15. package/dist/command/cli/cli-kill.js +3 -2
  16. package/dist/command/cli/cli-parse-grammar.d.ts +24 -0
  17. package/dist/command/cli/cli-parse-grammar.js +75 -0
  18. package/dist/command/cli/cli-parse-verify.d.ts +2 -0
  19. package/dist/command/cli/cli-parse-verify.js +18 -0
  20. package/dist/command/cli/cli-parse.d.ts +19 -28
  21. package/dist/command/cli/cli-parse.js +82 -182
  22. package/dist/command/cli/cli-update-commands.d.ts +1 -1
  23. package/dist/command/cli/cli-update-commands.js +61 -9
  24. package/dist/command/cli/cli-usage.d.ts +33 -0
  25. package/dist/command/cli/cli-usage.js +287 -0
  26. package/dist/command/cli/cli-verify.d.ts +34 -4
  27. package/dist/command/cli/cli-verify.js +81 -12
  28. package/dist/command/cli/cloud-cli.d.ts +13 -0
  29. package/dist/command/cli/cloud-cli.js +145 -333
  30. package/dist/command/cli/cloud-kit.d.ts +12 -0
  31. package/dist/command/cli/cloud-kit.js +41 -2
  32. package/dist/command/cli/cloud-link.d.ts +57 -0
  33. package/dist/command/cli/cloud-link.js +308 -0
  34. package/dist/command/cli/cloud-login.d.ts +15 -1
  35. package/dist/command/cli/cloud-login.js +67 -13
  36. package/dist/command/cli/context-command.d.ts +1 -0
  37. package/dist/command/cli/context-command.js +33 -0
  38. package/dist/command/cli/daemon-start-options.d.ts +3 -0
  39. package/dist/command/cli/daemon-start-options.js +24 -3
  40. package/dist/command/cli/doctor/doctor-coverage-line.d.ts +2 -0
  41. package/dist/command/cli/doctor/doctor-coverage-line.js +47 -0
  42. package/dist/command/cli/doctor/doctor-project-line.d.ts +0 -12
  43. package/dist/command/cli/doctor/doctor-project-line.js +5 -4
  44. package/dist/command/cli/doctor/doctor-rows.d.ts +6 -0
  45. package/dist/command/cli/doctor/doctor-rows.js +6 -0
  46. package/dist/command/cli/doctor/doctor-signing-line.d.ts +38 -0
  47. package/dist/command/cli/doctor/doctor-signing-line.js +114 -0
  48. package/dist/command/cli/known-regression.d.ts +13 -0
  49. package/dist/command/cli/known-regression.js +34 -0
  50. package/dist/command/cli/launch/sdk-version-match.d.ts +12 -0
  51. package/dist/command/cli/launch/sdk-version-match.js +25 -0
  52. package/dist/command/cli/lifecycle/daemon-lifecycle.js +11 -2
  53. package/dist/command/cli/mcp-command.d.ts +6 -0
  54. package/dist/command/cli/mcp-command.js +13 -5
  55. package/dist/command/cli/ports/port-holder.js +1 -1
  56. package/dist/command/cli/project-name.d.ts +29 -1
  57. package/dist/command/cli/project-name.js +107 -2
  58. package/dist/command/cli/setup-mcp-cli.d.ts +17 -1
  59. package/dist/command/cli/setup-mcp-cli.js +29 -8
  60. package/dist/command/cli/status/status-lines.d.ts +1 -0
  61. package/dist/command/cli/status/status-lines.js +47 -2
  62. package/dist/command/cli/status/workspace-links.d.ts +10 -0
  63. package/dist/command/cli/status/workspace-links.js +29 -0
  64. package/dist/command/cli/try-command.d.ts +96 -0
  65. package/dist/command/cli/try-command.js +362 -0
  66. package/dist/command/cli/tutorial.d.ts +0 -100
  67. package/dist/command/cli/tutorial.js +0 -178
  68. package/dist/command/cli/verify-results.d.ts +19 -0
  69. package/dist/command/cli/verify-results.js +29 -0
  70. package/dist/command/cli-onboarding.d.ts +0 -11
  71. package/dist/command/cli-onboarding.js +0 -15
  72. package/dist/command/cli.d.ts +14 -0
  73. package/dist/command/cli.js +103 -83
  74. package/dist/command/daemon/daemon-resilience.js +4 -4
  75. package/dist/command/daemon/daemon-resolve.d.ts +9 -1
  76. package/dist/command/daemon/daemon-resolve.js +49 -10
  77. package/dist/command/setup/bringup/bridge-port.d.ts +3 -1
  78. package/dist/command/setup/bringup/bridge-port.js +13 -3
  79. package/dist/command/setup/bringup/dev-server-log-cap.js +2 -0
  80. package/dist/command/setup/bringup/ensure-daemon.js +9 -2
  81. package/dist/command/setup/init/agent-restart.d.ts +23 -0
  82. package/dist/command/setup/init/agent-restart.js +28 -0
  83. package/dist/command/setup/init/init-port.d.ts +10 -1
  84. package/dist/command/setup/init/init-port.js +22 -2
  85. package/dist/command/setup/init/init-runtime.d.ts +12 -2
  86. package/dist/command/setup/init/init-runtime.js +96 -37
  87. package/dist/command/setup/node-effects.d.ts +2 -0
  88. package/dist/command/setup/node-effects.js +36 -8
  89. package/dist/command/setup/probe/existing-app.d.ts +12 -0
  90. package/dist/command/setup/probe/existing-app.js +14 -0
  91. package/dist/command/setup/remaining-steps.js +1 -1
  92. package/dist/command/setup/run-setup.d.ts +29 -9
  93. package/dist/command/setup/run-setup.js +34 -28
  94. package/dist/command/setup/setup-command.d.ts +23 -0
  95. package/dist/command/setup/setup-command.js +57 -4
  96. package/dist/command/setup/setup-mcp.js +25 -2
  97. package/dist/command/setup/tauri-signing.d.ts +19 -0
  98. package/dist/command/setup/tauri-signing.js +79 -0
  99. package/dist/command/setup/terminal/listeners.d.ts +10 -1
  100. package/dist/command/setup/terminal/listeners.js +37 -6
  101. package/dist/command/update/update-nudge.d.ts +9 -0
  102. package/dist/command/update/update-nudge.js +1 -1
  103. package/dist/command/update/updater.js +11 -15
  104. package/dist/command/version/version-nudge.js +3 -0
  105. package/dist/command/version/version-skew.d.ts +20 -1
  106. package/dist/command/version/version-skew.js +38 -2
  107. package/dist/features/crawl/crawl.js +14 -1
  108. package/dist/features/exhaust/ledger.d.ts +14 -14
  109. package/dist/features/harness/drive-report.d.ts +39 -5
  110. package/dist/features/harness/drive-report.js +271 -54
  111. package/dist/features/harness/drive-runs.d.ts +120 -0
  112. package/dist/features/harness/drive-runs.js +289 -0
  113. package/dist/features/harness/drivers.d.ts +1 -1
  114. package/dist/features/harness/drivers.js +1 -1
  115. package/dist/features/harness/explore/console-pages.d.ts +15 -0
  116. package/dist/features/harness/explore/console-pages.js +146 -0
  117. package/dist/features/harness/explore/disparity.d.ts +19 -0
  118. package/dist/features/harness/explore/disparity.js +71 -0
  119. package/dist/features/harness/explore/fake-app.d.ts +16 -0
  120. package/dist/features/harness/explore/fake-app.js +49 -0
  121. package/dist/features/harness/explore/goal-search.d.ts +26 -0
  122. package/dist/features/harness/explore/goal-search.js +144 -0
  123. package/dist/features/harness/explore/page-tree.d.ts +49 -0
  124. package/dist/features/harness/explore/page-tree.js +148 -0
  125. package/dist/features/harness/explore/site-map.d.ts +34 -0
  126. package/dist/features/harness/explore/site-map.js +150 -0
  127. package/dist/features/harness/goals.d.ts +68 -7
  128. package/dist/features/harness/goals.js +289 -36
  129. package/dist/features/harness/harness.d.ts +30 -1
  130. package/dist/features/harness/harness.js +141 -7
  131. package/dist/features/harness/platform/local-apps.d.ts +36 -3
  132. package/dist/features/harness/platform/local-apps.js +81 -5
  133. package/dist/features/harness/platform/persona-credentials.d.ts +20 -0
  134. package/dist/features/harness/platform/persona-credentials.js +69 -0
  135. package/dist/features/harness/platform/platform-drives.d.ts +61 -0
  136. package/dist/features/harness/platform/platform-drives.js +114 -0
  137. package/dist/features/harness/platform/refusal.d.ts +52 -0
  138. package/dist/features/harness/platform/refusal.js +71 -0
  139. package/dist/features/harness/platform/remote-drive.d.ts +8 -2
  140. package/dist/features/harness/platform/remote-drive.js +22 -9
  141. package/dist/features/harness/platform/script.d.ts +57 -11
  142. package/dist/features/harness/platform/script.js +144 -12
  143. package/dist/features/harness/platform/server-driver.d.ts +17 -4
  144. package/dist/features/harness/platform/server-driver.js +29 -26
  145. package/dist/features/harness/platform-config.d.ts +38 -5
  146. package/dist/features/harness/platform-config.js +93 -8
  147. package/dist/features/harness/route-guess.d.ts +13 -0
  148. package/dist/features/harness/route-guess.js +49 -0
  149. package/dist/features/harness/script/script-run.d.ts +30 -1
  150. package/dist/features/harness/script/script-run.js +355 -48
  151. package/dist/features/license/license.d.ts +2 -2
  152. package/dist/features/visual/step-shots.d.ts +31 -0
  153. package/dist/features/visual/step-shots.js +231 -0
  154. package/dist/features/visual/visual-tools.js +22 -14
  155. package/dist/hooks/client-directory.d.ts +18 -0
  156. package/dist/hooks/client-directory.js +57 -0
  157. package/dist/hooks/coding-agents.d.ts +34 -0
  158. package/dist/hooks/coding-agents.js +117 -0
  159. package/dist/hooks/driven-by.d.ts +21 -2
  160. package/dist/hooks/driven-by.js +42 -2
  161. package/dist/hooks/hook-bus.d.ts +4 -0
  162. package/dist/hooks/hook-bus.js +18 -0
  163. package/dist/index.d.ts +1 -0
  164. package/dist/index.js +26 -183
  165. package/dist/judgement/capsule/capsule-store.d.ts +2 -2
  166. package/dist/judgement/capsule/causal-summary.d.ts +15 -1
  167. package/dist/judgement/capsule/causal-summary.js +33 -0
  168. package/dist/judgement/runs/artifact/build-verification-run.d.ts +1 -1
  169. package/dist/judgement/runs/artifact/build-verification-run.js +20 -4
  170. package/dist/judgement/runs/artifact/gap-summary.d.ts +0 -18
  171. package/dist/judgement/runs/artifact/gap-summary.js +12 -3
  172. package/dist/judgement/runs/artifact/replay-mapping.js +25 -9
  173. package/dist/judgement/runs/artifact/run-store.d.ts +13 -1
  174. package/dist/judgement/runs/artifact/run-store.js +175 -8
  175. package/dist/judgement/runs/context-tools.js +59 -1
  176. package/dist/judgement/runs/default-run-id.d.ts +3 -0
  177. package/dist/judgement/runs/default-run-id.js +16 -0
  178. package/dist/judgement/runs/drive-run.d.ts +53 -5
  179. package/dist/judgement/runs/drive-run.js +234 -20
  180. package/dist/judgement/runs/resume.d.ts +44 -0
  181. package/dist/judgement/runs/resume.js +137 -0
  182. package/dist/judgement/runs/reticle-runner.js +5 -2
  183. package/dist/judgement/runs/runner-port.d.ts +5 -1
  184. package/dist/judgement/runs/runner-port.js +8 -2
  185. package/dist/judgement/runs/verification-sync.d.ts +2 -0
  186. package/dist/judgement/runs/verification-sync.js +36 -15
  187. package/dist/language/flows/decision.js +2 -1
  188. package/dist/language/flows/fields/flow-secret-field.d.ts +12 -0
  189. package/dist/language/flows/fields/flow-secret-field.js +25 -2
  190. package/dist/language/flows/flow-anchor.d.ts +7 -2
  191. package/dist/language/flows/flow-anchor.js +10 -3
  192. package/dist/language/flows/flow-intent.d.ts +1 -0
  193. package/dist/language/flows/flow-journey.d.ts +6 -0
  194. package/dist/language/flows/flow-journey.js +20 -0
  195. package/dist/language/flows/flow-learning.d.ts +4 -0
  196. package/dist/language/flows/flow-learning.js +37 -3
  197. package/dist/language/flows/flow-replay-run.js +16 -18
  198. package/dist/language/flows/flow-replay-types.d.ts +1 -1
  199. package/dist/language/flows/flow-replay.d.ts +18 -1
  200. package/dist/language/flows/flow-replay.js +22 -7
  201. package/dist/language/flows/flow-result.d.ts +22 -1
  202. package/dist/language/flows/flow-result.js +47 -2
  203. package/dist/language/flows/flow-step-runners.d.ts +2 -0
  204. package/dist/language/flows/flow-step-runners.js +12 -6
  205. package/dist/language/flows/flow-store-for-session.js +5 -1
  206. package/dist/language/flows/flow-tools.d.ts +10 -0
  207. package/dist/language/flows/flow-tools.js +61 -62
  208. package/dist/language/flows/flows.d.ts +16 -1
  209. package/dist/language/flows/flows.js +69 -10
  210. package/dist/language/flows/narrow-write.d.ts +7 -0
  211. package/dist/language/flows/narrow-write.js +36 -1
  212. package/dist/language/flows/recording/recording-backtrack.js +14 -1
  213. package/dist/language/flows/recording/tape/recordings.d.ts +29 -1
  214. package/dist/language/flows/recording/tape/recordings.js +60 -10
  215. package/dist/language/flows/replay.js +29 -6
  216. package/dist/language/flows/single-replay.d.ts +7 -0
  217. package/dist/language/flows/single-replay.js +26 -0
  218. package/dist/language/flows/verify-change-tools.d.ts +1 -0
  219. package/dist/language/flows/verify-change-tools.js +200 -193
  220. package/dist/memory/cloud/cloud-config.d.ts +10 -1
  221. package/dist/memory/cloud/cloud-config.js +19 -5
  222. package/dist/memory/cloud/cloud-sync.js +3 -3
  223. package/dist/memory/cloud/harness-config.d.ts +49 -0
  224. package/dist/memory/cloud/harness-config.js +16 -20
  225. package/dist/memory/cloud/memory-scope.d.ts +17 -0
  226. package/dist/memory/cloud/memory-scope.js +22 -0
  227. package/dist/memory/cloud/sync-cycle.d.ts +32 -4
  228. package/dist/memory/cloud/sync-cycle.js +113 -12
  229. package/dist/memory/cloud/sync-daemon.d.ts +11 -0
  230. package/dist/memory/cloud/sync-daemon.js +114 -4
  231. package/dist/memory/cloud/sync-disk.js +26 -2
  232. package/dist/memory/cloud/sync-screenshots.d.ts +32 -0
  233. package/dist/memory/cloud/sync-screenshots.js +105 -0
  234. package/dist/memory/cloud/unsynced-roots.d.ts +47 -0
  235. package/dist/memory/cloud/unsynced-roots.js +166 -0
  236. package/dist/memory/impact/account-watch.d.ts +16 -1
  237. package/dist/memory/impact/account-watch.js +26 -1
  238. package/dist/memory/impact/impact-store.d.ts +1 -4
  239. package/dist/memory/impact/impact-store.js +32 -42
  240. package/dist/memory/intent/inline-intent.d.ts +1 -0
  241. package/dist/memory/intent/intent-shard-store.js +16 -4
  242. package/dist/memory/intent/intent-shard.d.ts +12 -0
  243. package/dist/memory/intent/intent-store.d.ts +1 -0
  244. package/dist/memory/intent/intent-tools.js +42 -2
  245. package/dist/memory/intent/open-intents.d.ts +6 -0
  246. package/dist/memory/intent/open-intents.js +10 -1
  247. package/dist/memory/intent/settled-words.d.ts +24 -0
  248. package/dist/memory/intent/settled-words.js +130 -0
  249. package/dist/memory/journal/drive-flow.d.ts +16 -0
  250. package/dist/memory/journal/drive-flow.js +34 -2
  251. package/dist/memory/journal/drive-run-flush.d.ts +2 -0
  252. package/dist/memory/journal/drive-run-flush.js +20 -5
  253. package/dist/memory/journal/journal-recorder.js +46 -3
  254. package/dist/memory/journal/on-disk/retention.d.ts +5 -0
  255. package/dist/memory/journal/on-disk/retention.js +27 -2
  256. package/dist/memory/journal/on-disk/workspace-tiers.js +2 -0
  257. package/dist/memory/journal/session-end.d.ts +15 -1
  258. package/dist/memory/journal/session-end.js +38 -7
  259. package/dist/memory/project/artifact-root-resolver.js +33 -5
  260. package/dist/memory/project/artifact-root.d.ts +4 -3
  261. package/dist/memory/project/artifact-root.js +2 -2
  262. package/dist/memory/project/dir/reticle-dir.d.ts +14 -0
  263. package/dist/memory/project/dir/reticle-dir.js +23 -2
  264. package/dist/memory/project/link-directory.d.ts +15 -0
  265. package/dist/memory/project/link-directory.js +44 -0
  266. package/dist/memory/project/root-claims.d.ts +6 -0
  267. package/dist/memory/project/root-claims.js +39 -0
  268. package/dist/memory/project/session-root.d.ts +2 -0
  269. package/dist/memory/project/session-root.js +9 -1
  270. package/dist/memory/project/sync-status.d.ts +46 -0
  271. package/dist/memory/project/sync-status.js +135 -1
  272. package/dist/memory/recall/memory-tools.js +46 -3
  273. package/dist/memory/recall/platform-memory.d.ts +34 -0
  274. package/dist/memory/recall/platform-memory.js +139 -0
  275. package/dist/memory/recall/project-memory.js +36 -8
  276. package/dist/portal/bridge/bridge.d.ts +9 -5
  277. package/dist/portal/bridge/bridge.js +66 -23
  278. package/dist/portal/bridge/harness-request.d.ts +23 -0
  279. package/dist/portal/bridge/harness-request.js +27 -0
  280. package/dist/portal/bridge/wrong-path.d.ts +17 -0
  281. package/dist/portal/bridge/wrong-path.js +35 -0
  282. package/dist/portal/input/network-mock-tools.js +11 -2
  283. package/dist/portal/input/real-input.d.ts +2 -0
  284. package/dist/portal/input/real-input.js +13 -10
  285. package/dist/portal/pool/browser-pool.d.ts +48 -0
  286. package/dist/portal/pool/browser-pool.js +120 -2
  287. package/dist/portal/pool/context-permissions.d.ts +33 -0
  288. package/dist/portal/pool/context-permissions.js +33 -0
  289. package/dist/portal/pool/lease-marker-stamp.d.ts +23 -0
  290. package/dist/portal/pool/lease-marker-stamp.js +49 -0
  291. package/dist/portal/pool/playwright-launcher.d.ts +27 -5
  292. package/dist/portal/pool/playwright-launcher.js +59 -14
  293. package/dist/portal/pool/pool-contract.d.ts +21 -1
  294. package/dist/portal/session/agent-link.d.ts +8 -0
  295. package/dist/portal/session/agent-link.js +17 -0
  296. package/dist/portal/session/command-payload.js +6 -1
  297. package/dist/portal/session/daemon-answers.d.ts +3 -3
  298. package/dist/portal/session/daemon-answers.js +4 -2
  299. package/dist/portal/session/dev-server/dev-command.d.ts +9 -0
  300. package/dist/portal/session/dev-server/dev-command.js +27 -1
  301. package/dist/portal/session/facts/observed-state.d.ts +16 -18
  302. package/dist/portal/session/facts/observed-state.js +46 -3
  303. package/dist/portal/session/human/live-control.d.ts +9 -2
  304. package/dist/portal/session/human/live-control.js +12 -3
  305. package/dist/portal/session/live-control-tools.js +82 -13
  306. package/dist/portal/session/narration-args.d.ts +5 -0
  307. package/dist/portal/session/narration-args.js +17 -0
  308. package/dist/portal/session/no-session-diagnosis.d.ts +1 -1
  309. package/dist/portal/session/no-session-diagnosis.js +31 -9
  310. package/dist/portal/session/no-session-next-action.d.ts +20 -0
  311. package/dist/portal/session/no-session-next-action.js +134 -61
  312. package/dist/portal/session/no-session-watch.js +179 -22
  313. package/dist/portal/session/presence/session-lease.js +1 -1
  314. package/dist/portal/session/recorded-gaps.d.ts +97 -0
  315. package/dist/portal/session/recorded-gaps.js +251 -0
  316. package/dist/portal/session/session-health.d.ts +11 -0
  317. package/dist/portal/session/session-health.js +3 -1
  318. package/dist/portal/session/session-info.js +2 -1
  319. package/dist/portal/session/session-manager.d.ts +18 -0
  320. package/dist/portal/session/session-manager.js +54 -3
  321. package/dist/portal/session/session-successor.d.ts +8 -0
  322. package/dist/portal/session/session-successor.js +1 -1
  323. package/dist/portal/session/session.d.ts +15 -28
  324. package/dist/portal/session/session.js +60 -61
  325. package/dist/portal/session/timing/command-timeout.js +25 -1
  326. package/dist/portal/session/timing/wall-clock.d.ts +1 -1
  327. package/dist/portal/session/timing/wall-clock.js +1 -1
  328. package/dist/portal/session/zero-install-first-call.d.ts +31 -0
  329. package/dist/portal/session/zero-install-first-call.js +88 -0
  330. package/dist/start-options.d.ts +7 -1
  331. package/dist/start-wiring.d.ts +63 -0
  332. package/dist/start-wiring.js +169 -0
  333. package/dist/status-payload.d.ts +13 -1
  334. package/dist/status-payload.js +13 -1
  335. package/dist/surface/http-server.js +7 -1
  336. package/dist/surface/mcp/attach-memory.d.ts +1 -0
  337. package/dist/surface/mcp/attach-memory.js +12 -1
  338. package/dist/surface/mcp/mcp-proxy.d.ts +4 -0
  339. package/dist/surface/mcp/mcp-proxy.js +29 -8
  340. package/dist/surface/mcp/mcp.d.ts +23 -0
  341. package/dist/surface/mcp/mcp.js +34 -4
  342. package/dist/surface/mcp/proxy/drive-calls.d.ts +10 -0
  343. package/dist/surface/mcp/proxy/drive-calls.js +27 -0
  344. package/dist/surface/mcp/proxy/mcp-post-transport.js +5 -0
  345. package/dist/surface/mcp/server-instructions.js +22 -14
  346. package/dist/surface/mcp/shared-params.js +1 -1
  347. package/dist/surface/mcp/surface-vocabulary.d.ts +2 -0
  348. package/dist/surface/mcp/surface-vocabulary.js +1 -0
  349. package/dist/surface/tools/account-tool.d.ts +22 -0
  350. package/dist/surface/tools/account-tool.js +157 -0
  351. package/dist/surface/tools/act/act-danger.d.ts +11 -0
  352. package/dist/surface/tools/act/act-danger.js +38 -1
  353. package/dist/surface/tools/act/act-observation.d.ts +33 -0
  354. package/dist/surface/tools/act/act-observation.js +57 -0
  355. package/dist/surface/tools/act/act-preflight.js +25 -2
  356. package/dist/surface/tools/act/act-target.js +8 -3
  357. package/dist/surface/tools/act/resolve-target.d.ts +1 -1
  358. package/dist/surface/tools/act/resolve-target.js +18 -3
  359. package/dist/surface/tools/act/screen-request.d.ts +34 -0
  360. package/dist/surface/tools/act/screen-request.js +113 -0
  361. package/dist/surface/tools/act/sequence-grade.d.ts +8 -0
  362. package/dist/surface/tools/act/sequence-grade.js +13 -2
  363. package/dist/surface/tools/act-sequence-tool.js +136 -27
  364. package/dist/surface/tools/act-tools.d.ts +0 -9
  365. package/dist/surface/tools/act-tools.js +48 -34
  366. package/dist/surface/tools/agent/app-notes-learning.d.ts +7 -0
  367. package/dist/surface/tools/agent/app-notes-learning.js +80 -0
  368. package/dist/surface/tools/agent/app-notes.d.ts +4 -0
  369. package/dist/surface/tools/agent/app-notes.js +48 -0
  370. package/dist/surface/tools/agent/build-staleness.d.ts +7 -0
  371. package/dist/surface/tools/agent/build-staleness.js +62 -0
  372. package/dist/surface/tools/agent/compact-envelope.d.ts +80 -0
  373. package/dist/surface/tools/agent/compact-envelope.js +374 -0
  374. package/dist/surface/tools/agent/for-the-agent.d.ts +12 -0
  375. package/dist/surface/tools/agent/for-the-agent.js +44 -0
  376. package/dist/surface/tools/agent/notices.d.ts +50 -0
  377. package/dist/surface/tools/agent/notices.js +152 -0
  378. package/dist/surface/tools/agent/reteach.d.ts +11 -0
  379. package/dist/surface/tools/agent/reteach.js +50 -0
  380. package/dist/surface/tools/args/alias-args.d.ts +5 -0
  381. package/dist/surface/tools/args/alias-args.js +10 -0
  382. package/dist/surface/tools/args/confirm-dangerous-arg.d.ts +6 -0
  383. package/dist/surface/tools/args/confirm-dangerous-arg.js +6 -0
  384. package/dist/surface/tools/assert/assert-source.d.ts +15 -0
  385. package/dist/surface/tools/assert/assert-source.js +40 -0
  386. package/dist/surface/tools/assert/assert-verdict.js +25 -15
  387. package/dist/surface/tools/browser-tools.js +43 -1
  388. package/dist/surface/tools/chat-drives.d.ts +75 -0
  389. package/dist/surface/tools/chat-drives.js +265 -21
  390. package/dist/surface/tools/coverage-tools.d.ts +2 -10
  391. package/dist/surface/tools/coverage-tools.js +2 -53
  392. package/dist/surface/tools/dynamic-tools.js +29 -1
  393. package/dist/surface/tools/empty-session-list.d.ts +10 -0
  394. package/dist/surface/tools/empty-session-list.js +45 -5
  395. package/dist/surface/tools/error-recovery.d.ts +8 -0
  396. package/dist/surface/tools/error-recovery.js +69 -5
  397. package/dist/surface/tools/explore-tools.d.ts +23 -2
  398. package/dist/surface/tools/explore-tools.js +377 -74
  399. package/dist/surface/tools/feedback-tools.d.ts +2 -3
  400. package/dist/surface/tools/feedback-tools.js +4 -3
  401. package/dist/surface/tools/gap-novelty.d.ts +3 -1
  402. package/dist/surface/tools/gap-novelty.js +8 -1
  403. package/dist/surface/tools/harness-explore.d.ts +52 -73
  404. package/dist/surface/tools/harness-explore.js +177 -146
  405. package/dist/surface/tools/harness-gate.d.ts +88 -0
  406. package/dist/surface/tools/harness-gate.js +235 -0
  407. package/dist/surface/tools/harness-hunt.d.ts +43 -0
  408. package/dist/surface/tools/harness-hunt.js +215 -0
  409. package/dist/surface/tools/harness-plan.d.ts +5 -0
  410. package/dist/surface/tools/harness-plan.js +7 -0
  411. package/dist/surface/tools/harness-script.d.ts +22 -0
  412. package/dist/surface/tools/harness-script.js +256 -38
  413. package/dist/surface/tools/harness-tab-guard.d.ts +5 -0
  414. package/dist/surface/tools/harness-tab-guard.js +27 -0
  415. package/dist/surface/tools/harness-toolset.d.ts +8 -0
  416. package/dist/surface/tools/harness-toolset.js +27 -4
  417. package/dist/surface/tools/human-notes.d.ts +16 -0
  418. package/dist/surface/tools/human-notes.js +27 -0
  419. package/dist/surface/tools/invoke-tool.d.ts +5 -2
  420. package/dist/surface/tools/invoke-tool.js +220 -93
  421. package/dist/surface/tools/lease-hint.js +26 -5
  422. package/dist/surface/tools/lease-permissions.d.ts +33 -0
  423. package/dist/surface/tools/lease-permissions.js +73 -0
  424. package/dist/surface/tools/lease-readiness.d.ts +38 -0
  425. package/dist/surface/tools/lease-readiness.js +57 -0
  426. package/dist/surface/tools/lease-seed.d.ts +20 -0
  427. package/dist/surface/tools/lease-seed.js +45 -1
  428. package/dist/surface/tools/lease-tools.d.ts +10 -1
  429. package/dist/surface/tools/lease-tools.js +119 -69
  430. package/dist/surface/tools/live-call-text.js +2 -2
  431. package/dist/surface/tools/merge-tools.js +42 -2
  432. package/dist/surface/tools/merged-name-redirect.js +4 -0
  433. package/dist/surface/tools/next-step.d.ts +11 -1
  434. package/dist/surface/tools/next-step.js +73 -18
  435. package/dist/surface/tools/observe-tools.js +43 -5
  436. package/dist/surface/tools/platform-moment.d.ts +60 -0
  437. package/dist/surface/tools/platform-moment.js +132 -4
  438. package/dist/surface/tools/read-tools.js +65 -14
  439. package/dist/surface/tools/reticle-result.d.ts +120 -0
  440. package/dist/surface/tools/reticle-result.js +364 -0
  441. package/dist/surface/tools/tool-kit.d.ts +68 -2
  442. package/dist/surface/tools/tool-kit.js +73 -1
  443. package/dist/surface/tools/tools.js +25 -13
  444. package/dist/telemetry/account-envelope.d.ts +7 -0
  445. package/dist/telemetry/account-envelope.js +61 -0
  446. package/dist/telemetry/agent-client.d.ts +15 -0
  447. package/dist/telemetry/agent-client.js +57 -0
  448. package/dist/telemetry/app-instrumented.js +9 -2
  449. package/dist/telemetry/argument-shape.d.ts +7 -0
  450. package/dist/telemetry/argument-shape.js +86 -1
  451. package/dist/telemetry/automation-hint.d.ts +2 -3
  452. package/dist/telemetry/automation-hint.js +33 -8
  453. package/dist/telemetry/cli-telemetry.js +7 -2
  454. package/dist/telemetry/daemon-telemetry.js +3 -0
  455. package/dist/telemetry/error-fingerprint.d.ts +10 -1
  456. package/dist/telemetry/error-fingerprint.js +61 -5
  457. package/dist/telemetry/feedback-cli.d.ts +0 -13
  458. package/dist/telemetry/feedback-cli.js +0 -77
  459. package/dist/telemetry/feedback.d.ts +13 -0
  460. package/dist/telemetry/feedback.js +183 -17
  461. package/dist/telemetry/harness-run.d.ts +18 -0
  462. package/dist/telemetry/harness-run.js +80 -0
  463. package/dist/telemetry/hud-events.d.ts +16 -0
  464. package/dist/telemetry/hud-events.js +27 -0
  465. package/dist/telemetry/hud-metrics.d.ts +27 -6
  466. package/dist/telemetry/hud-metrics.js +99 -25
  467. package/dist/telemetry/init-telemetry.js +2 -2
  468. package/dist/telemetry/install-source.d.ts +13 -25
  469. package/dist/telemetry/install-source.js +44 -3
  470. package/dist/telemetry/mcp-connection.d.ts +0 -14
  471. package/dist/telemetry/mcp-connection.js +5 -1
  472. package/dist/telemetry/onboarding-firsts.d.ts +32 -0
  473. package/dist/telemetry/onboarding-firsts.js +81 -6
  474. package/dist/telemetry/platform-linked.d.ts +5 -0
  475. package/dist/telemetry/platform-linked.js +32 -0
  476. package/dist/telemetry/project-profile.js +5 -3
  477. package/dist/telemetry/proxy-telemetry.js +4 -1
  478. package/dist/telemetry/session-metrics.d.ts +15 -4
  479. package/dist/telemetry/session-metrics.js +88 -52
  480. package/dist/telemetry/telemetry.d.ts +26 -2
  481. package/dist/telemetry/telemetry.js +102 -21
  482. package/dist/telemetry/verification-of.d.ts +3 -1
  483. package/dist/telemetry/verification-of.js +12 -4
  484. package/dist/wire-journal.d.ts +2 -2
  485. package/dist/wire-journal.js +16 -5
  486. package/docs/README.md +2 -2
  487. package/docs/actions.mdx +6 -3
  488. package/docs/adapters.md +1 -1
  489. package/docs/agent-cheatsheet.md +24 -27
  490. package/docs/architecture.md +5 -5
  491. package/docs/autodrive.md +13 -12
  492. package/docs/benchmarks.md +5 -5
  493. package/docs/best-practices.mdx +27 -9
  494. package/docs/capabilities.mdx +14 -16
  495. package/docs/cli/affected.mdx +1 -1
  496. package/docs/cli/cloud.mdx +54 -75
  497. package/docs/cli/doctor.mdx +8 -3
  498. package/docs/cli/drive.mdx +12 -12
  499. package/docs/cli/feedback.mdx +3 -3
  500. package/docs/cli/gate.mdx +7 -2
  501. package/docs/cli/help.mdx +50 -55
  502. package/docs/cli/init.mdx +32 -15
  503. package/docs/cli/license.mdx +12 -8
  504. package/docs/cli/mcp.mdx +4 -4
  505. package/docs/cli/open.mdx +3 -3
  506. package/docs/cli/report.mdx +4 -2
  507. package/docs/cli/restart.mdx +2 -2
  508. package/docs/cli/rollback.mdx +14 -8
  509. package/docs/cli/serve.mdx +4 -4
  510. package/docs/cli/setup.mdx +23 -0
  511. package/docs/cli/status.mdx +13 -4
  512. package/docs/cli/stop.mdx +67 -8
  513. package/docs/cli/try.mdx +62 -0
  514. package/docs/cli/update.mdx +4 -3
  515. package/docs/cli/verify.mdx +17 -6
  516. package/docs/cli/version.mdx +3 -2
  517. package/docs/cli.mdx +110 -41
  518. package/docs/debugging.md +3 -3
  519. package/docs/deploy-checks.md +1 -1
  520. package/docs/desktop.mdx +5 -3
  521. package/docs/enterprise.md +11 -10
  522. package/docs/environment.mdx +5 -2
  523. package/docs/faq.mdx +3 -3
  524. package/docs/first-drive.md +5 -4
  525. package/docs/flows.md +35 -27
  526. package/docs/for-agents.md +4 -5
  527. package/docs/frameworks.mdx +32 -21
  528. package/docs/getting-started.md +66 -64
  529. package/docs/human-control.md +15 -14
  530. package/docs/index.mdx +15 -43
  531. package/docs/install-agentic.mdx +22 -37
  532. package/docs/install-manual.mdx +22 -12
  533. package/docs/instrumentation.mdx +5 -3
  534. package/docs/integration-patterns.md +7 -7
  535. package/docs/license-activation.mdx +1 -1
  536. package/docs/multi-agent-testing.md +24 -6
  537. package/docs/packages/babel-plugin.mdx +4 -2
  538. package/docs/packages/browser.mdx +16 -10
  539. package/docs/packages/core.mdx +12 -5
  540. package/docs/packages/electron.mdx +3 -2
  541. package/docs/packages/engine.mdx +1 -1
  542. package/docs/packages/eslint-plugin.mdx +18 -12
  543. package/docs/packages/next.mdx +8 -7
  544. package/docs/packages/open-verification.mdx +1 -1
  545. package/docs/packages/server.mdx +5 -5
  546. package/docs/packages/tauri.mdx +8 -8
  547. package/docs/packages/test.mdx +4 -10
  548. package/docs/packages/vite-plugin.mdx +11 -4
  549. package/docs/packages.mdx +11 -15
  550. package/docs/platform-integration.md +6 -5
  551. package/docs/predicates.mdx +40 -24
  552. package/docs/quickstart.mdx +58 -29
  553. package/docs/required-checks.md +8 -7
  554. package/docs/reticle-manual.md +15 -5
  555. package/docs/skill-file.mdx +17 -79
  556. package/docs/skill-setup.md +9 -9
  557. package/docs/skill.md +200 -0
  558. package/docs/system-map.md +7 -7
  559. package/docs/telemetry.md +22 -24
  560. package/docs/testing.md +4 -4
  561. package/docs/token-efficiency.md +12 -12
  562. package/docs/tools/act-and-wait.mdx +9 -2
  563. package/docs/tools/act-sequence.mdx +6 -7
  564. package/docs/tools/act.mdx +2 -2
  565. package/docs/tools/assert.mdx +18 -17
  566. package/docs/tools/console.mdx +9 -9
  567. package/docs/tools/inspect.mdx +16 -7
  568. package/docs/tools/look.mdx +24 -0
  569. package/docs/tools/navigate.mdx +5 -3
  570. package/docs/tools/network.mdx +2 -2
  571. package/docs/tools/observe.mdx +6 -6
  572. package/docs/tools/overview.mdx +34 -33
  573. package/docs/tools/query.mdx +5 -5
  574. package/docs/tools/session-and-feedback.mdx +13 -4
  575. package/docs/tools/sessions.mdx +8 -8
  576. package/docs/tools/snapshot.mdx +6 -5
  577. package/docs/tools/state.mdx +9 -9
  578. package/docs/tools/tools-and-run.mdx +26 -24
  579. package/docs/tools/verify.mdx +28 -0
  580. package/docs/tools/wait-for.mdx +8 -4
  581. package/docs/troubleshooting.mdx +21 -6
  582. package/docs/usage.md +51 -45
  583. package/docs/use-cases.mdx +3 -3
  584. package/docs/vs-chrome-devtools-mcp.mdx +9 -6
  585. package/docs/vs-playwright-mcp.mdx +3 -1
  586. package/docs/what-is-recorded.md +7 -5
  587. package/docs/what-is-reticle.mdx +2 -2
  588. package/docs/why-reticle.mdx +1 -1
  589. package/package.json +6 -5
  590. package/dist/command/cli/demo/demo-page.d.ts +0 -78
  591. package/dist/command/cli/demo/demo-page.js +0 -249
  592. package/dist/command/cli/demo/demo-run.d.ts +0 -38
  593. package/dist/command/cli/demo/demo-run.js +0 -138
  594. package/dist/judgement/hunt/hunt-report.d.ts +0 -49
  595. package/dist/judgement/hunt/hunt-report.js +0 -84
  596. package/dist/language/flows/buddy-status.d.ts +0 -25
  597. package/dist/language/flows/buddy-status.js +0 -32
  598. package/dist/language/flows/change/watch-batcher.d.ts +0 -18
  599. package/dist/language/flows/change/watch-batcher.js +0 -19
  600. package/dist/memory/cloud/harness-offer.d.ts +0 -44
  601. package/dist/memory/cloud/harness-offer.js +0 -145
  602. package/dist/surface/tools/feature-capture.d.ts +0 -151
  603. package/dist/surface/tools/feature-capture.js +0 -235
  604. package/dist/surface/tools/tool-hit-rate.d.ts +0 -87
  605. package/dist/surface/tools/tool-hit-rate.js +0 -90
  606. package/dist/telemetry/harness-drive.d.ts +0 -4
  607. package/dist/telemetry/harness-drive.js +0 -35
  608. package/dist/telemetry/identify.d.ts +0 -22
  609. package/dist/telemetry/identify.js +0 -73
  610. package/docs/cli/capsules.mdx +0 -70
  611. package/docs/cli/hunt.mdx +0 -73
  612. package/docs/cli/identify.mdx +0 -76
  613. package/docs/cli/kill.mdx +0 -91
  614. package/docs/cli/watch.mdx +0 -62
@@ -0,0 +1,97 @@
1
+ import type { InboxMessage } from './human/live-control.js';
2
+ import { type Coverage, CoverageCapability, type ImpactSnapshot } from '@reticlehq/core';
3
+ export interface RecordedGap {
4
+ kind: string;
5
+ missing: string;
6
+ fix: string;
7
+ seenAt: number;
8
+ cost?: string;
9
+ ref?: string;
10
+ source?: string;
11
+ }
12
+ /** Remember gaps a verdict on this session just reported. Malformed entries are skipped. */
13
+ export declare function recordGaps(sessionId: string, gaps: readonly object[], now: number): void;
14
+ /** A tab as the notes below key it: its session, and the app it shows. */
15
+ export interface NotedTab {
16
+ readonly id: string;
17
+ readonly projectId?: string | undefined;
18
+ readonly url?: string | undefined;
19
+ }
20
+ /** A verdict on this tab named a file:line: source mapping is seen, whatever else lacks one. */
21
+ export declare function noteSourceSeen(tab: NotedTab, source: string | undefined): void;
22
+ /** An acted element carried a test id: the app uses them, whatever one control lacks. */
23
+ export declare function noteTestidSeen(tab: NotedTab, testid: string | undefined): void;
24
+ /** What an act result says about the element it reached: its test id and its source stamp. */
25
+ export declare function noteActedElement(tab: NotedTab, result: unknown): void;
26
+ /**
27
+ * An act's result, passed through after noting what it says about the element it reached. Every act
28
+ * dispatches through one function, so coverage sees test ids and source stamps from the first
29
+ * control acted on rather than only from a verdict.
30
+ */
31
+ export declare function notedAct<T extends {
32
+ ok: boolean;
33
+ result?: unknown;
34
+ }>(tab: NotedTab, done: T): T;
35
+ /** A tab the daemon can ask. Absent `command`: a test double or a tab with no page to ask. */
36
+ export interface ProbedTab extends NotedTab {
37
+ command?(name: string, args?: Record<string, unknown>, timeoutMs?: number): Promise<{
38
+ ok: boolean;
39
+ result?: unknown;
40
+ }>;
41
+ }
42
+ /**
43
+ * Ask each page whose app has not shown both markers yet what it carries. What an act happens to
44
+ * reach decides nothing then: an app with test ids is seen to have them before anything acted, and a
45
+ * hidden tab of it says the same. A page that cannot answer (an older SDK, a closed tab) is skipped.
46
+ * True when a page showed something not known before.
47
+ */
48
+ export declare function probeMarkers(tabs: readonly ProbedTab[]): Promise<boolean>;
49
+ /** What this session's verdicts recorded, newest first. */
50
+ export declare function recordedGaps(sessionId: string): readonly RecordedGap[];
51
+ /** Forget a session that ended. What its app has shown is kept: it is still that app's. */
52
+ export declare function forgetRecordedGaps(sessionId: string): void;
53
+ /** Forget everything, apps included. For tests. */
54
+ export declare function forgetAllRecordedGaps(): void;
55
+ /** What instrumentation coverage reads off a connected tab. */
56
+ export interface InstrumentedTab extends NotedTab {
57
+ readonly channels?: readonly string[] | undefined;
58
+ readonly sourceMapping?: boolean | undefined;
59
+ /** What the person said to the agent from this tab. Absent on a test double. */
60
+ inboxHistory?(): readonly InboxMessage[];
61
+ }
62
+ /**
63
+ * The tab's HELLO channels, plus the `source` marker when an act or verdict mapped a control to
64
+ * its file:line (seen anywhere is seen) or its page said it carries source mapping, and the
65
+ * `testid` marker once an acted element carried one — the list the platform report sends and
66
+ * coverage reads. A build that turned the stamp off has no source marker, whatever was seen.
67
+ */
68
+ export declare function announcedChannels(tab: InstrumentedTab): string[];
69
+ /**
70
+ * The coverage capabilities that do not apply to this tab's app, excluded from both sides of the
71
+ * score: file:line on a page that said it cannot apply there (plain HTML), until a stamp shows up.
72
+ * The platform reads the same list from the local-apps report, so both sides move together.
73
+ */
74
+ export declare function notApplicableOf(tab: NotedTab): CoverageCapability[];
75
+ /** Whether the Harness may drive this tab's app (see core's `instrumentation-coverage.ts`), as pushed. */
76
+ export interface TabHarnessGate {
77
+ percent: number;
78
+ unlocked: boolean;
79
+ reason?: string;
80
+ }
81
+ /**
82
+ * This tab's coverage and its Harness gate, with the coding-agent prompt when its verdicts recorded
83
+ * any gap or the gate is shut: below the gate the prompt names every unseen capability, so there is
84
+ * always something to hand the agent.
85
+ */
86
+ export declare function instrumentationOf(tab: InstrumentedTab,
87
+ /** The app's other tabs: what any of them has seen or recorded counts, as on the platform. */
88
+ siblings?: readonly InstrumentedTab[]): Coverage & {
89
+ prompt?: string;
90
+ harnessGate: TabHarnessGate;
91
+ };
92
+ /**
93
+ * The impact snapshot a tab is pushed, carrying that tab's own coverage, running drive and agent
94
+ * link (who is attached, and this tab's notes to them). Every
95
+ * push needs the drive: one without it reads as "no drive", and the drive's own tool calls push.
96
+ */
97
+ export declare function withInstrumentation(tab: InstrumentedTab, snapshot: ImpactSnapshot): ImpactSnapshot;
@@ -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
+ }
@@ -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.
@@ -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).';
@@ -49,7 +49,8 @@ export function buildSessionInfo(session) {
49
49
  base.unresponsive = true;
50
50
  base.unresponsive_suggestion =
51
51
  'This tab is connected but has stopped answering commands, so every call against it will time ' +
52
- '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>` ' +
53
54
  'to get a fresh one — it will no longer hand this tab back.';
54
55
  }
55
56
  // Surface human bug reports in reticle_sessions (only when > 0, so a clean session adds nothing).
@@ -68,6 +68,13 @@ export declare class SessionManager {
68
68
  attachmentOf(sessionId: string): ReturnType<AttachmentHistory['of']>;
69
69
  /** Every connected session — used by the liveness reaper to sweep for idle/disconnected ones. */
70
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[];
71
78
  count(): number;
72
79
  /** Wire the diagnosis provider (daemon boot). Absent ⇒ the plain, static message. */
73
80
  setNoSessionHint(hint: (() => string | undefined) | undefined): void;
@@ -89,6 +96,8 @@ export declare class SessionManager {
89
96
  setNoSessionNextAction(next: (() => NoSessionNextAction | undefined) | undefined): void;
90
97
  noSessionNextAction(): NoSessionNextAction | undefined;
91
98
  everConnected(): boolean;
99
+ /** Whether a session for this project has registered since boot. An unknown id has not. */
100
+ everConnectedTo(projectId: string): boolean;
92
101
  /**
93
102
  * Record a bridge-initiated close so `resolve` can explain a session that vanished.
94
103
  *
@@ -120,6 +129,15 @@ export declare class SessionManager {
120
129
  * a connected tab is in `list()`, not here.
121
130
  */
122
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[];
123
141
  resolve(sessionId?: string, scope?: ResolveScope): Session;
124
142
  }
125
143
  export {};
@@ -3,7 +3,7 @@ import { notePendingNoSessionReason } from '../../telemetry/tool-refused.js';
3
3
  import { declareDrivenRedactionKeys, forgetDrivenRedactionKeys, } from '../input/driven-redaction.js';
4
4
  import { Session } from './session.js';
5
5
  import { AttachmentHistory } from './presence/attachment-history.js';
6
- import { openedBeforeDeparture, pickDocumentSuccessor, } from './session-successor.js';
6
+ import { claimedSessionOf, openedBeforeDeparture, pickDocumentSuccessor, } from './session-successor.js';
7
7
  import { SESSION_DISCONNECTED_REASON, SESSION_PARKED_REASON } from './facts/session-replaced.js';
8
8
  import { isErrorDocument } from './session-info.js';
9
9
  /** The scheme://host:port of a URL, or undefined if it can't be parsed. Used to compare origins. */
@@ -85,6 +85,8 @@ const MAX_REMEMBERED_CLOSURES = 5;
85
85
  * Bounded so a long-lived daemon cannot accumulate one record per tab forever.
86
86
  */
87
87
  const MAX_TOMBSTONES = 32;
88
+ /** How a leased tab's id begins (`lease-tools.ts` mints them). */
89
+ const LEASE_ID_PREFIX = 'lease-';
88
90
  export class SessionManager {
89
91
  #sessions = new Map();
90
92
  /**
@@ -125,6 +127,8 @@ export class SessionManager {
125
127
  }
126
128
  add(session) {
127
129
  this.#everConnected = true;
130
+ if (session.projectId !== undefined)
131
+ this.#connectedProjects.add(session.projectId);
128
132
  // Ordering, not lifetime: this is what makes a remembered refusal distinguishable from a live
129
133
  // one. Here for the same reason `#everConnected` is — `add` is the one method every path that
130
134
  // registers a session goes through.
@@ -256,6 +260,15 @@ export class SessionManager {
256
260
  all() {
257
261
  return [...this.#sessions.values()];
258
262
  }
263
+ /**
264
+ * The connected sessions an id-less call may consider: the active project's, when one is set.
265
+ *
266
+ * The same set `resolve()` chooses from, so a caller that falls back from a refused resolution
267
+ * (an id-less yield) never reaches a tab the project scope would never have handed it.
268
+ */
269
+ inScope() {
270
+ return scopeSessions(this.all(), this.#defaultScope);
271
+ }
259
272
  count() {
260
273
  return this.#sessions.size;
261
274
  }
@@ -356,9 +369,20 @@ export class SessionManager {
356
369
  }
357
370
  /** Whether any session has connected since this daemon booted — half the diagnosis. */
358
371
  #everConnected = false;
372
+ /**
373
+ * Which projects have registered a session in this process.
374
+ *
375
+ * `#everConnected` is one bit for the whole daemon. A second project asking "has anything
376
+ * connected" was answered about the first. The set is the same fact, per project.
377
+ */
378
+ #connectedProjects = new Set();
359
379
  everConnected() {
360
380
  return this.#everConnected;
361
381
  }
382
+ /** Whether a session for this project has registered since boot. An unknown id has not. */
383
+ everConnectedTo(projectId) {
384
+ return this.#connectedProjects.has(projectId);
385
+ }
362
386
  /**
363
387
  * Record a bridge-initiated close so `resolve` can explain a session that vanished.
364
388
  *
@@ -419,6 +443,24 @@ export class SessionManager {
419
443
  last = record;
420
444
  return last;
421
445
  }
446
+ /**
447
+ * The most recent departed session for one project.
448
+ *
449
+ * `lastKnown` is the newest tombstone of any project. A shared daemon that quoted it to every
450
+ * caller told the second project to reopen the first project's tab.
451
+ */
452
+ lastKnownFor(projectId) {
453
+ let last;
454
+ for (const record of this.#tombstones.values()) {
455
+ if (record.projectId === projectId)
456
+ last = record;
457
+ }
458
+ return last;
459
+ }
460
+ /** Every departed session's URL, oldest first. The port scan has to see all of them, not only the newest. */
461
+ tombstoneUrls() {
462
+ return [...this.#tombstones.values()].map((record) => record.url);
463
+ }
422
464
  /**
423
465
  * A dead `sessionId`, answered with what the caller needs to recover — not with an errand.
424
466
  *
@@ -444,8 +486,17 @@ export class SessionManager {
444
486
  ' The app is not dialling this daemon; call ' +
445
487
  'reticle_sessions for the diagnosis rather than retrying this call.');
446
488
  }
447
- const named = live.map((s) => `'${s.id}' (${s.url})`).join(', ');
448
- return (`no connected session with id '${sessionId}'. Connected right now: ${named}. ` +
489
+ // A leased tab belongs to whoever holds the lease: naming it, and the page it is on, told one
490
+ // agent what every other agent on this daemon was doing. Only the app's own tabs are offered.
491
+ const own = live.filter((s) => claimedSessionOf(s.url) === undefined);
492
+ const ended = sessionId.startsWith(LEASE_ID_PREFIX)
493
+ ? ` Lease '${sessionId}' has ended (it expired or was released); lease a new tab to go on.`
494
+ : '';
495
+ if (0 === own.length)
496
+ return (`no connected session with id '${sessionId}'.${ended} ` +
497
+ 'Omit sessionId to let Reticle scope to your project, or lease a tab of your own.');
498
+ const named = own.map((s) => `'${s.id}' (${s.url})`).join(', ');
499
+ return (`no connected session with id '${sessionId}'.${ended} Your app's tabs: ${named}. ` +
449
500
  'Retry with one of those, or omit sessionId entirely and let Reticle scope to your project.');
450
501
  }
451
502
  resolve(sessionId, scope) {
@@ -24,6 +24,14 @@ export interface SuccessorClock {
24
24
  now: () => number;
25
25
  sleep: (ms: number) => Promise<void>;
26
26
  }
27
+ /**
28
+ * The session a URL explicitly CLAIMS to be, via `__reticle_session`.
29
+ *
30
+ * A leased tab carries this marker so the pool can find the context it opened, and an app can set it
31
+ * deliberately so a battery addresses a known id. Either way it is a claim of identity, not a
32
+ * coincidence of origin — which is what makes it the right thing to gate succession on.
33
+ */
34
+ export declare function claimedSessionOf(url: string): string | undefined;
27
35
  /**
28
36
  * The one live session that can honestly take over from `departed`, or undefined when none or more
29
37
  * than one could.
@@ -30,7 +30,7 @@ function originOf(url) {
30
30
  * deliberately so a battery addresses a known id. Either way it is a claim of identity, not a
31
31
  * coincidence of origin — which is what makes it the right thing to gate succession on.
32
32
  */
33
- function claimedSessionOf(url) {
33
+ export function claimedSessionOf(url) {
34
34
  try {
35
35
  return new URL(url).searchParams.get(RETICLE_URL_PARAM.SESSION) ?? undefined;
36
36
  }