@reticlehq/server 3.5.0 → 3.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (721) hide show
  1. package/README.md +1 -1
  2. package/SKILL.md +123 -116
  3. package/dist/chromium-launch-options.d.ts +3 -1
  4. package/dist/chromium-launch-options.js +2 -1
  5. package/dist/command/cli/adhoc-suite.d.ts +14 -0
  6. package/dist/command/cli/adhoc-suite.js +42 -7
  7. package/dist/command/cli/adhoc-verdict.d.ts +19 -2
  8. package/dist/command/cli/adhoc-verdict.js +76 -9
  9. package/dist/command/cli/answers/gate-exit.d.ts +23 -0
  10. package/dist/command/cli/answers/gate-exit.js +45 -0
  11. package/dist/command/cli/answers/gate-hook-message.d.ts +2 -0
  12. package/dist/command/cli/answers/gate-hook-message.js +3 -1
  13. package/dist/command/cli/answers/open-note.d.ts +2 -0
  14. package/dist/command/cli/answers/open-note.js +22 -0
  15. package/dist/command/cli/auth/device-flow.d.ts +13 -2
  16. package/dist/command/cli/auth/device-flow.js +17 -0
  17. package/dist/command/cli/cli-doctor.js +14 -0
  18. package/dist/command/cli/cli-flow-commands.d.ts +0 -11
  19. package/dist/command/cli/cli-flow-commands.js +31 -112
  20. package/dist/command/cli/cli-kill.js +3 -2
  21. package/dist/command/cli/cli-parse-grammar.d.ts +24 -0
  22. package/dist/command/cli/cli-parse-grammar.js +75 -0
  23. package/dist/command/cli/cli-parse-verify.d.ts +2 -0
  24. package/dist/command/cli/cli-parse-verify.js +18 -0
  25. package/dist/command/cli/cli-parse.d.ts +19 -28
  26. package/dist/command/cli/cli-parse.js +82 -182
  27. package/dist/command/cli/cli-update-commands.d.ts +1 -1
  28. package/dist/command/cli/cli-update-commands.js +61 -9
  29. package/dist/command/cli/cli-usage.d.ts +33 -0
  30. package/dist/command/cli/cli-usage.js +287 -0
  31. package/dist/command/cli/cli-verify.d.ts +35 -5
  32. package/dist/command/cli/cli-verify.js +114 -35
  33. package/dist/command/cli/cloud-cli.d.ts +13 -0
  34. package/dist/command/cli/cloud-cli.js +192 -341
  35. package/dist/command/cli/cloud-kit.d.ts +12 -0
  36. package/dist/command/cli/cloud-kit.js +41 -2
  37. package/dist/command/cli/cloud-link.d.ts +57 -0
  38. package/dist/command/cli/cloud-link.js +308 -0
  39. package/dist/command/cli/cloud-login.d.ts +22 -0
  40. package/dist/command/cli/cloud-login.js +96 -8
  41. package/dist/command/cli/context-command.d.ts +1 -0
  42. package/dist/command/cli/context-command.js +33 -0
  43. package/dist/command/cli/daemon-start-options.d.ts +3 -0
  44. package/dist/command/cli/daemon-start-options.js +24 -3
  45. package/dist/command/cli/doctor/browser/chromium-hint.d.ts +46 -0
  46. package/dist/command/cli/doctor/browser/chromium-hint.js +99 -1
  47. package/dist/command/cli/doctor/doctor-coverage-line.d.ts +2 -0
  48. package/dist/command/cli/doctor/doctor-coverage-line.js +47 -0
  49. package/dist/command/cli/doctor/doctor-project-line.d.ts +0 -12
  50. package/dist/command/cli/doctor/doctor-project-line.js +5 -4
  51. package/dist/command/cli/doctor/doctor-rows.d.ts +6 -0
  52. package/dist/command/cli/doctor/doctor-rows.js +6 -0
  53. package/dist/command/cli/doctor/doctor-signing-line.d.ts +38 -0
  54. package/dist/command/cli/doctor/doctor-signing-line.js +114 -0
  55. package/dist/command/cli/drive/drive-attach.d.ts +27 -2
  56. package/dist/command/cli/drive/drive-attach.js +71 -4
  57. package/dist/command/cli/drive/drive-command.d.ts +2 -1
  58. package/dist/command/cli/drive/drive-command.js +13 -7
  59. package/dist/command/cli/known-regression.d.ts +13 -0
  60. package/dist/command/cli/known-regression.js +34 -0
  61. package/dist/command/cli/launch/sdk-version-match.d.ts +12 -0
  62. package/dist/command/cli/launch/sdk-version-match.js +25 -0
  63. package/dist/command/cli/lifecycle/daemon-lifecycle.js +15 -3
  64. package/dist/command/cli/mcp-command.d.ts +6 -0
  65. package/dist/command/cli/mcp-command.js +13 -5
  66. package/dist/command/cli/ports/port-holder.d.ts +10 -0
  67. package/dist/command/cli/ports/port-holder.js +25 -1
  68. package/dist/command/cli/project-name.d.ts +29 -1
  69. package/dist/command/cli/project-name.js +107 -2
  70. package/dist/command/cli/setup-mcp-cli.d.ts +17 -1
  71. package/dist/command/cli/setup-mcp-cli.js +35 -12
  72. package/dist/command/cli/status/status-lines.d.ts +1 -0
  73. package/dist/command/cli/status/status-lines.js +47 -2
  74. package/dist/command/cli/status/workspace-links.d.ts +10 -0
  75. package/dist/command/cli/status/workspace-links.js +29 -0
  76. package/dist/command/cli/try-command.d.ts +96 -0
  77. package/dist/command/cli/try-command.js +362 -0
  78. package/dist/command/cli/tutorial.d.ts +0 -100
  79. package/dist/command/cli/tutorial.js +0 -181
  80. package/dist/command/cli/verify-results.d.ts +19 -0
  81. package/dist/command/cli/verify-results.js +29 -0
  82. package/dist/command/cli-onboarding.d.ts +0 -11
  83. package/dist/command/cli-onboarding.js +0 -15
  84. package/dist/command/cli.d.ts +20 -0
  85. package/dist/command/cli.js +130 -104
  86. package/dist/command/daemon/binding/daemon-status-probe.d.ts +2 -0
  87. package/dist/command/daemon/binding/daemon-status-probe.js +1 -0
  88. package/dist/command/daemon/daemon-resilience.js +4 -4
  89. package/dist/command/daemon/daemon-resolve.d.ts +23 -1
  90. package/dist/command/daemon/daemon-resolve.js +79 -9
  91. package/dist/command/setup/agent-writer.d.ts +1 -1
  92. package/dist/command/setup/agent-writer.js +3 -2
  93. package/dist/command/setup/bringup/bridge-port.d.ts +3 -1
  94. package/dist/command/setup/bringup/bridge-port.js +13 -3
  95. package/dist/command/setup/bringup/connect-lease.d.ts +1 -0
  96. package/dist/command/setup/bringup/connect-lease.js +1 -0
  97. package/dist/command/setup/bringup/dev-server-log-cap.js +2 -0
  98. package/dist/command/setup/bringup/dev-server-wait.d.ts +8 -0
  99. package/dist/command/setup/bringup/dev-server-wait.js +19 -0
  100. package/dist/command/setup/bringup/ensure-daemon.js +9 -2
  101. package/dist/command/setup/init/agent-restart.d.ts +23 -0
  102. package/dist/command/setup/init/agent-restart.js +28 -0
  103. package/dist/command/setup/init/init-port.d.ts +14 -1
  104. package/dist/command/setup/init/init-port.js +32 -2
  105. package/dist/command/setup/init/init-runtime.d.ts +22 -2
  106. package/dist/command/setup/init/init-runtime.js +114 -38
  107. package/dist/command/setup/node-effects.d.ts +2 -0
  108. package/dist/command/setup/node-effects.js +38 -9
  109. package/dist/command/setup/probe/existing-app.d.ts +12 -0
  110. package/dist/command/setup/probe/existing-app.js +14 -0
  111. package/dist/command/setup/remaining-steps.js +2 -1
  112. package/dist/command/setup/run-setup.d.ts +34 -9
  113. package/dist/command/setup/run-setup.js +65 -51
  114. package/dist/command/setup/setup-command.d.ts +25 -1
  115. package/dist/command/setup/setup-command.js +59 -4
  116. package/dist/command/setup/setup-mcp.js +25 -2
  117. package/dist/command/setup/tauri-signing.d.ts +19 -0
  118. package/dist/command/setup/tauri-signing.js +79 -0
  119. package/dist/command/setup/terminal/listeners.d.ts +10 -1
  120. package/dist/command/setup/terminal/listeners.js +37 -6
  121. package/dist/command/update/update-nudge.d.ts +9 -0
  122. package/dist/command/update/update-nudge.js +1 -1
  123. package/dist/command/update/updater.js +11 -15
  124. package/dist/command/version/version-nudge.js +3 -0
  125. package/dist/command/version/version-skew.d.ts +20 -1
  126. package/dist/command/version/version-skew.js +49 -4
  127. package/dist/features/crawl/crawl-tools.js +4 -0
  128. package/dist/features/crawl/crawl.d.ts +6 -0
  129. package/dist/features/crawl/crawl.js +23 -2
  130. package/dist/features/exhaust/ledger.d.ts +21 -14
  131. package/dist/features/exhaust/ledger.js +35 -9
  132. package/dist/features/harness/app-findings.d.ts +2 -0
  133. package/dist/features/harness/app-findings.js +52 -0
  134. package/dist/features/harness/drive-report.d.ts +61 -1
  135. package/dist/features/harness/drive-report.js +394 -26
  136. package/dist/features/harness/drive-runs.d.ts +120 -0
  137. package/dist/features/harness/drive-runs.js +289 -0
  138. package/dist/features/harness/drivers.d.ts +10 -14
  139. package/dist/features/harness/drivers.js +10 -14
  140. package/dist/features/harness/explore/console-pages.d.ts +15 -0
  141. package/dist/features/harness/explore/console-pages.js +146 -0
  142. package/dist/features/harness/explore/disparity.d.ts +19 -0
  143. package/dist/features/harness/explore/disparity.js +71 -0
  144. package/dist/features/harness/explore/fake-app.d.ts +16 -0
  145. package/dist/features/harness/explore/fake-app.js +49 -0
  146. package/dist/features/harness/explore/goal-search.d.ts +26 -0
  147. package/dist/features/harness/explore/goal-search.js +144 -0
  148. package/dist/features/harness/explore/page-tree.d.ts +49 -0
  149. package/dist/features/harness/explore/page-tree.js +148 -0
  150. package/dist/features/harness/explore/site-map.d.ts +34 -0
  151. package/dist/features/harness/explore/site-map.js +150 -0
  152. package/dist/features/harness/fill-values.d.ts +3 -73
  153. package/dist/features/harness/fill-values.js +3 -169
  154. package/dist/features/harness/goals.d.ts +82 -0
  155. package/dist/features/harness/goals.js +330 -0
  156. package/dist/features/harness/harness.d.ts +51 -1
  157. package/dist/features/harness/harness.js +207 -6
  158. package/dist/features/harness/platform/drive-target.d.ts +30 -0
  159. package/dist/features/harness/platform/drive-target.js +81 -0
  160. package/dist/features/harness/platform/local-apps.d.ts +127 -0
  161. package/dist/features/harness/platform/local-apps.js +280 -0
  162. package/dist/features/harness/platform/persona-credentials.d.ts +20 -0
  163. package/dist/features/harness/platform/persona-credentials.js +69 -0
  164. package/dist/features/harness/platform/platform-drives.d.ts +61 -0
  165. package/dist/features/harness/platform/platform-drives.js +114 -0
  166. package/dist/features/harness/platform/refusal.d.ts +52 -0
  167. package/dist/features/harness/platform/refusal.js +71 -0
  168. package/dist/features/harness/platform/remote-drive.d.ts +186 -0
  169. package/dist/features/harness/platform/remote-drive.js +378 -0
  170. package/dist/features/harness/platform/script.d.ts +94 -0
  171. package/dist/features/harness/platform/script.js +260 -0
  172. package/dist/features/harness/platform/server-driver.d.ts +54 -0
  173. package/dist/features/harness/platform/server-driver.js +182 -0
  174. package/dist/features/harness/platform-config.d.ts +41 -1
  175. package/dist/features/harness/platform-config.js +106 -9
  176. package/dist/features/harness/route-guess.d.ts +13 -0
  177. package/dist/features/harness/route-guess.js +49 -0
  178. package/dist/features/harness/script/app-controls.d.ts +5 -0
  179. package/dist/features/harness/script/app-controls.js +40 -0
  180. package/dist/features/harness/script/lane-ids.d.ts +14 -0
  181. package/dist/features/harness/script/lane-ids.js +16 -0
  182. package/dist/features/harness/script/script-run.d.ts +70 -0
  183. package/dist/features/harness/script/script-run.js +606 -0
  184. package/dist/features/license/license.d.ts +2 -2
  185. package/dist/features/visual/step-shots.d.ts +31 -0
  186. package/dist/features/visual/step-shots.js +231 -0
  187. package/dist/features/visual/visual-tools.d.ts +10 -1
  188. package/dist/features/visual/visual-tools.js +62 -17
  189. package/dist/hooks/client-directory.d.ts +18 -0
  190. package/dist/hooks/client-directory.js +57 -0
  191. package/dist/hooks/coding-agents.d.ts +34 -0
  192. package/dist/hooks/coding-agents.js +117 -0
  193. package/dist/hooks/driven-by.d.ts +23 -0
  194. package/dist/hooks/driven-by.js +56 -0
  195. package/dist/hooks/hook-bus.d.ts +4 -0
  196. package/dist/hooks/hook-bus.js +18 -0
  197. package/dist/hooks/hook-commands.js +15 -4
  198. package/dist/hooks/tool-log.d.ts +9 -0
  199. package/dist/hooks/tool-log.js +29 -0
  200. package/dist/index.d.ts +2 -0
  201. package/dist/index.js +80 -243
  202. package/dist/judgement/capsule/capsule-store.d.ts +2 -2
  203. package/dist/judgement/capsule/causal-summary.d.ts +15 -1
  204. package/dist/judgement/capsule/causal-summary.js +33 -0
  205. package/dist/judgement/runs/artifact/build-verification-run.d.ts +1 -1
  206. package/dist/judgement/runs/artifact/build-verification-run.js +25 -3
  207. package/dist/judgement/runs/artifact/gap-summary.d.ts +0 -18
  208. package/dist/judgement/runs/artifact/gap-summary.js +12 -3
  209. package/dist/judgement/runs/artifact/replay-mapping.d.ts +1 -1
  210. package/dist/judgement/runs/artifact/replay-mapping.js +37 -11
  211. package/dist/judgement/runs/artifact/run-store.d.ts +14 -2
  212. package/dist/judgement/runs/artifact/run-store.js +195 -3
  213. package/dist/judgement/runs/context-tools.js +59 -1
  214. package/dist/judgement/runs/default-run-id.d.ts +3 -0
  215. package/dist/judgement/runs/default-run-id.js +16 -0
  216. package/dist/judgement/runs/drive-run.d.ts +71 -1
  217. package/dist/judgement/runs/drive-run.js +317 -5
  218. package/dist/judgement/runs/repair-prompt.js +1 -1
  219. package/dist/judgement/runs/resume.d.ts +44 -0
  220. package/dist/judgement/runs/resume.js +137 -0
  221. package/dist/judgement/runs/reticle-runner.js +13 -3
  222. package/dist/judgement/runs/runner-port.d.ts +5 -1
  223. package/dist/judgement/runs/runner-port.js +8 -2
  224. package/dist/judgement/runs/verification-sync.d.ts +5 -2
  225. package/dist/judgement/runs/verification-sync.js +40 -18
  226. package/dist/language/flows/change/gate.d.ts +10 -0
  227. package/dist/language/flows/change/gate.js +22 -0
  228. package/dist/language/flows/decision.js +36 -1
  229. package/dist/language/flows/fields/flow-secret-field.d.ts +12 -0
  230. package/dist/language/flows/fields/flow-secret-field.js +25 -2
  231. package/dist/language/flows/flow-anchor.d.ts +61 -10
  232. package/dist/language/flows/flow-anchor.js +98 -6
  233. package/dist/language/flows/flow-cross-step.d.ts +15 -0
  234. package/dist/language/flows/flow-cross-step.js +21 -0
  235. package/dist/language/flows/flow-intent.d.ts +1 -0
  236. package/dist/language/flows/flow-journey.d.ts +6 -0
  237. package/dist/language/flows/flow-journey.js +20 -0
  238. package/dist/language/flows/flow-learning.d.ts +4 -0
  239. package/dist/language/flows/flow-learning.js +45 -14
  240. package/dist/language/flows/flow-mutate-tools.js +5 -3
  241. package/dist/language/flows/flow-replay-run.d.ts +23 -9
  242. package/dist/language/flows/flow-replay-run.js +115 -110
  243. package/dist/language/flows/flow-replay-types.d.ts +1 -1
  244. package/dist/language/flows/flow-replay.d.ts +40 -1
  245. package/dist/language/flows/flow-replay.js +110 -22
  246. package/dist/language/flows/flow-result.d.ts +22 -1
  247. package/dist/language/flows/flow-result.js +47 -2
  248. package/dist/language/flows/flow-scope.js +5 -1
  249. package/dist/language/flows/flow-step-runners.d.ts +22 -2
  250. package/dist/language/flows/flow-step-runners.js +247 -47
  251. package/dist/language/flows/flow-store-for-session.d.ts +2 -2
  252. package/dist/language/flows/flow-store-for-session.js +7 -3
  253. package/dist/language/flows/flow-tools.d.ts +10 -0
  254. package/dist/language/flows/flow-tools.js +112 -89
  255. package/dist/language/flows/flows.d.ts +16 -1
  256. package/dist/language/flows/flows.js +74 -12
  257. package/dist/language/flows/heal-run.js +6 -4
  258. package/dist/language/flows/narrow-write.d.ts +7 -0
  259. package/dist/language/flows/narrow-write.js +36 -1
  260. package/dist/language/flows/recording/flake.d.ts +2 -2
  261. package/dist/language/flows/recording/recording-backtrack.js +14 -1
  262. package/dist/language/flows/recording/tape/recordings.d.ts +58 -4
  263. package/dist/language/flows/recording/tape/recordings.js +95 -13
  264. package/dist/language/flows/replay-from-hud.d.ts +20 -0
  265. package/dist/language/flows/replay-from-hud.js +51 -0
  266. package/dist/language/flows/replay.d.ts +9 -5
  267. package/dist/language/flows/replay.js +56 -15
  268. package/dist/language/flows/single-replay.d.ts +7 -0
  269. package/dist/language/flows/single-replay.js +26 -0
  270. package/dist/language/flows/suite/suite-flakes.js +2 -0
  271. package/dist/language/flows/suite-selection.d.ts +2 -15
  272. package/dist/language/flows/suite-selection.js +4 -3
  273. package/dist/language/flows/verify-change-tools.d.ts +1 -0
  274. package/dist/language/flows/verify-change-tools.js +202 -191
  275. package/dist/launch-chromium.d.ts +27 -5
  276. package/dist/launch-chromium.js +38 -8
  277. package/dist/memory/cloud/cloud-config.d.ts +22 -1
  278. package/dist/memory/cloud/cloud-config.js +34 -5
  279. package/dist/memory/cloud/cloud-sync.d.ts +17 -14
  280. package/dist/memory/cloud/cloud-sync.js +15 -4
  281. package/dist/memory/cloud/harness-config.d.ts +75 -1
  282. package/dist/memory/cloud/harness-config.js +115 -24
  283. package/dist/memory/cloud/hud-notices-source.d.ts +21 -0
  284. package/dist/memory/cloud/hud-notices-source.js +128 -0
  285. package/dist/memory/cloud/memory-scope.d.ts +161 -0
  286. package/dist/memory/cloud/memory-scope.js +227 -0
  287. package/dist/memory/cloud/sync-cycle.d.ts +44 -7
  288. package/dist/memory/cloud/sync-cycle.js +129 -15
  289. package/dist/memory/cloud/sync-daemon.d.ts +11 -0
  290. package/dist/memory/cloud/sync-daemon.js +121 -9
  291. package/dist/memory/cloud/sync-disk.d.ts +1 -1
  292. package/dist/memory/cloud/sync-disk.js +31 -10
  293. package/dist/memory/cloud/sync-screenshots.d.ts +32 -0
  294. package/dist/memory/cloud/sync-screenshots.js +105 -0
  295. package/dist/memory/cloud/unsynced-roots.d.ts +47 -0
  296. package/dist/memory/cloud/unsynced-roots.js +166 -0
  297. package/dist/memory/impact/account-watch.d.ts +34 -0
  298. package/dist/memory/impact/account-watch.js +59 -0
  299. package/dist/memory/impact/impact-recorder.d.ts +8 -0
  300. package/dist/memory/impact/impact-recorder.js +12 -2
  301. package/dist/memory/impact/impact-store.d.ts +17 -4
  302. package/dist/memory/impact/impact-store.js +169 -63
  303. package/dist/memory/intent/inline-intent.d.ts +1 -0
  304. package/dist/memory/intent/intent-shard-store.js +16 -4
  305. package/dist/memory/intent/intent-shard.d.ts +14 -2
  306. package/dist/memory/intent/intent-store.d.ts +1 -0
  307. package/dist/memory/intent/intent-tools.js +122 -4
  308. package/dist/memory/intent/open-intents.d.ts +6 -0
  309. package/dist/memory/intent/open-intents.js +10 -1
  310. package/dist/memory/intent/settled-words.d.ts +24 -0
  311. package/dist/memory/intent/settled-words.js +130 -0
  312. package/dist/memory/journal/drive-flow.d.ts +16 -0
  313. package/dist/memory/journal/drive-flow.js +34 -2
  314. package/dist/memory/journal/drive-run-flush.d.ts +2 -0
  315. package/dist/memory/journal/drive-run-flush.js +20 -5
  316. package/dist/memory/journal/envelope.d.ts +8 -8
  317. package/dist/memory/journal/journal-recorder.js +52 -3
  318. package/dist/memory/journal/on-disk/retention.d.ts +8 -0
  319. package/dist/memory/journal/on-disk/retention.js +32 -2
  320. package/dist/memory/journal/on-disk/startup-maintenance.js +3 -1
  321. package/dist/memory/journal/on-disk/workspace-tiers.js +9 -4
  322. package/dist/memory/journal/session-end.d.ts +15 -1
  323. package/dist/memory/journal/session-end.js +42 -9
  324. package/dist/memory/project/artifact-root-resolver.d.ts +26 -1
  325. package/dist/memory/project/artifact-root-resolver.js +125 -16
  326. package/dist/memory/project/artifact-root.d.ts +46 -8
  327. package/dist/memory/project/artifact-root.js +89 -10
  328. package/dist/memory/project/dir/reticle-dir.d.ts +18 -2
  329. package/dist/memory/project/dir/reticle-dir.js +26 -3
  330. package/dist/memory/project/link-directory.d.ts +15 -0
  331. package/dist/memory/project/link-directory.js +44 -0
  332. package/dist/memory/project/project-tools.js +22 -3
  333. package/dist/memory/project/root-claims.d.ts +6 -0
  334. package/dist/memory/project/root-claims.js +39 -0
  335. package/dist/memory/project/session-root.d.ts +26 -1
  336. package/dist/memory/project/session-root.js +49 -5
  337. package/dist/memory/project/sync-status.d.ts +85 -0
  338. package/dist/memory/project/sync-status.js +224 -0
  339. package/dist/memory/recall/memory-tools.js +47 -2
  340. package/dist/memory/recall/platform-memory.d.ts +34 -0
  341. package/dist/memory/recall/platform-memory.js +139 -0
  342. package/dist/memory/recall/project-memory.d.ts +19 -0
  343. package/dist/memory/recall/project-memory.js +80 -13
  344. package/dist/portal/bridge/bridge.d.ts +9 -3
  345. package/dist/portal/bridge/bridge.js +82 -22
  346. package/dist/portal/bridge/harness-request.d.ts +23 -0
  347. package/dist/portal/bridge/harness-request.js +27 -0
  348. package/dist/portal/bridge/pairing-token.d.ts +9 -0
  349. package/dist/portal/bridge/pairing-token.js +17 -0
  350. package/dist/portal/bridge/wrong-path.d.ts +17 -0
  351. package/dist/portal/bridge/wrong-path.js +35 -0
  352. package/dist/portal/input/network-mock-tools.js +11 -2
  353. package/dist/portal/input/real-input.d.ts +83 -10
  354. package/dist/portal/input/real-input.js +218 -30
  355. package/dist/portal/input/viewport-tools.js +3 -3
  356. package/dist/portal/pool/browser-pool.d.ts +70 -9
  357. package/dist/portal/pool/browser-pool.js +190 -37
  358. package/dist/portal/pool/context-permissions.d.ts +33 -0
  359. package/dist/portal/pool/context-permissions.js +33 -0
  360. package/dist/portal/pool/lease-marker-stamp.d.ts +23 -0
  361. package/dist/portal/pool/lease-marker-stamp.js +49 -0
  362. package/dist/portal/pool/playwright-launcher.d.ts +35 -0
  363. package/dist/portal/pool/playwright-launcher.js +64 -3
  364. package/dist/portal/pool/pool-contract.d.ts +28 -5
  365. package/dist/portal/session/agent-link.d.ts +8 -0
  366. package/dist/portal/session/agent-link.js +17 -0
  367. package/dist/portal/session/command-payload.d.ts +8 -0
  368. package/dist/portal/session/command-payload.js +24 -0
  369. package/dist/portal/session/daemon-answers.d.ts +3 -3
  370. package/dist/portal/session/daemon-answers.js +4 -2
  371. package/dist/portal/session/dev-server/dev-command.d.ts +21 -0
  372. package/dist/portal/session/dev-server/dev-command.js +87 -12
  373. package/dist/portal/session/facts/departure-note.d.ts +22 -0
  374. package/dist/portal/session/facts/departure-note.js +47 -0
  375. package/dist/portal/session/facts/observed-state.d.ts +16 -18
  376. package/dist/portal/session/facts/observed-state.js +46 -3
  377. package/dist/portal/session/facts/session-replaced.d.ts +5 -0
  378. package/dist/portal/session/facts/session-replaced.js +5 -0
  379. package/dist/portal/session/first-run-wiring.d.ts +42 -0
  380. package/dist/portal/session/first-run-wiring.js +132 -0
  381. package/dist/portal/session/human/live-control.d.ts +9 -2
  382. package/dist/portal/session/human/live-control.js +12 -3
  383. package/dist/portal/session/human/notes-ledger.d.ts +20 -0
  384. package/dist/portal/session/human/notes-ledger.js +55 -0
  385. package/dist/portal/session/human/review-store.d.ts +12 -0
  386. package/dist/portal/session/human/review-store.js +18 -10
  387. package/dist/portal/session/live-control-tools.d.ts +0 -13
  388. package/dist/portal/session/live-control-tools.js +107 -13
  389. package/dist/portal/session/narration-args.d.ts +5 -0
  390. package/dist/portal/session/narration-args.js +17 -0
  391. package/dist/portal/session/no-session-diagnosis.d.ts +8 -1
  392. package/dist/portal/session/no-session-diagnosis.js +46 -9
  393. package/dist/portal/session/no-session-next-action.d.ts +31 -0
  394. package/dist/portal/session/no-session-next-action.js +159 -60
  395. package/dist/portal/session/no-session-watch.d.ts +14 -1
  396. package/dist/portal/session/no-session-watch.js +227 -17
  397. package/dist/portal/session/presence/session-lease.js +1 -1
  398. package/dist/portal/session/presence/session-mirror.js +3 -0
  399. package/dist/portal/session/recorded-gaps.d.ts +97 -0
  400. package/dist/portal/session/recorded-gaps.js +251 -0
  401. package/dist/portal/session/serving-directory.d.ts +27 -0
  402. package/dist/portal/session/serving-directory.js +45 -0
  403. package/dist/portal/session/session-health.d.ts +18 -0
  404. package/dist/portal/session/session-health.js +9 -1
  405. package/dist/portal/session/session-info.d.ts +8 -1
  406. package/dist/portal/session/session-info.js +8 -1
  407. package/dist/portal/session/session-manager.d.ts +39 -0
  408. package/dist/portal/session/session-manager.js +98 -11
  409. package/dist/portal/session/session-reaper.js +4 -1
  410. package/dist/portal/session/session-successor.d.ts +13 -0
  411. package/dist/portal/session/session-successor.js +1 -1
  412. package/dist/portal/session/session-tools.js +26 -3
  413. package/dist/portal/session/session.d.ts +22 -30
  414. package/dist/portal/session/session.js +81 -79
  415. package/dist/portal/session/timing/command-timeout.js +25 -1
  416. package/dist/portal/session/timing/wall-clock.d.ts +1 -1
  417. package/dist/portal/session/timing/wall-clock.js +1 -1
  418. package/dist/portal/session/zero-install-first-call.d.ts +31 -0
  419. package/dist/portal/session/zero-install-first-call.js +88 -0
  420. package/dist/start-options.d.ts +12 -0
  421. package/dist/start-wiring.d.ts +63 -0
  422. package/dist/start-wiring.js +169 -0
  423. package/dist/status-payload.d.ts +23 -1
  424. package/dist/status-payload.js +36 -1
  425. package/dist/surface/http-server.js +18 -2
  426. package/dist/surface/mcp/attach-memory.d.ts +1 -0
  427. package/dist/surface/mcp/attach-memory.js +12 -1
  428. package/dist/surface/mcp/mcp-proxy.d.ts +9 -0
  429. package/dist/surface/mcp/mcp-proxy.js +65 -13
  430. package/dist/surface/mcp/mcp.d.ts +34 -6
  431. package/dist/surface/mcp/mcp.js +61 -17
  432. package/dist/surface/mcp/proxy/drive-calls.d.ts +10 -0
  433. package/dist/surface/mcp/proxy/drive-calls.js +27 -0
  434. package/dist/surface/mcp/proxy/mcp-post-transport.js +5 -0
  435. package/dist/surface/mcp/server-instructions.d.ts +4 -2
  436. package/dist/surface/mcp/server-instructions.js +32 -14
  437. package/dist/surface/mcp/shared-params.js +2 -2
  438. package/dist/surface/mcp/surface-vocabulary.d.ts +2 -0
  439. package/dist/surface/mcp/surface-vocabulary.js +1 -0
  440. package/dist/surface/tools/account-tool.d.ts +22 -0
  441. package/dist/surface/tools/account-tool.js +157 -0
  442. package/dist/surface/tools/act/act-danger.d.ts +11 -0
  443. package/dist/surface/tools/act/act-danger.js +38 -1
  444. package/dist/surface/tools/act/act-observation.d.ts +33 -0
  445. package/dist/surface/tools/act/act-observation.js +57 -0
  446. package/dist/surface/tools/act/act-preflight.js +25 -2
  447. package/dist/surface/tools/act/act-target.js +8 -3
  448. package/dist/surface/tools/act/navigation/navigate-arrival.d.ts +8 -0
  449. package/dist/surface/tools/act/navigation/navigate-arrival.js +56 -2
  450. package/dist/surface/tools/act/resolve-target.d.ts +1 -1
  451. package/dist/surface/tools/act/resolve-target.js +18 -3
  452. package/dist/surface/tools/act/screen-request.d.ts +34 -0
  453. package/dist/surface/tools/act/screen-request.js +113 -0
  454. package/dist/surface/tools/act/sequence-grade.d.ts +8 -0
  455. package/dist/surface/tools/act/sequence-grade.js +13 -2
  456. package/dist/surface/tools/act/settle-in-flight.js +25 -3
  457. package/dist/surface/tools/act-sequence-tool.js +138 -29
  458. package/dist/surface/tools/act-tools.d.ts +0 -9
  459. package/dist/surface/tools/act-tools.js +71 -41
  460. package/dist/surface/tools/agent/app-notes-learning.d.ts +7 -0
  461. package/dist/surface/tools/agent/app-notes-learning.js +80 -0
  462. package/dist/surface/tools/agent/app-notes.d.ts +4 -0
  463. package/dist/surface/tools/agent/app-notes.js +48 -0
  464. package/dist/surface/tools/agent/build-staleness.d.ts +7 -0
  465. package/dist/surface/tools/agent/build-staleness.js +62 -0
  466. package/dist/surface/tools/agent/compact-envelope.d.ts +80 -0
  467. package/dist/surface/tools/agent/compact-envelope.js +374 -0
  468. package/dist/surface/tools/agent/for-the-agent.d.ts +12 -0
  469. package/dist/surface/tools/agent/for-the-agent.js +44 -0
  470. package/dist/surface/tools/agent/notices.d.ts +50 -0
  471. package/dist/surface/tools/agent/notices.js +152 -0
  472. package/dist/surface/tools/agent/reteach.d.ts +11 -0
  473. package/dist/surface/tools/agent/reteach.js +50 -0
  474. package/dist/surface/tools/args/alias-args.d.ts +5 -0
  475. package/dist/surface/tools/args/alias-args.js +10 -0
  476. package/dist/surface/tools/args/confirm-dangerous-arg.d.ts +6 -0
  477. package/dist/surface/tools/args/confirm-dangerous-arg.js +6 -0
  478. package/dist/surface/tools/assert/assert-source.d.ts +15 -0
  479. package/dist/surface/tools/assert/assert-source.js +40 -0
  480. package/dist/surface/tools/assert/assert-verdict.d.ts +1 -1
  481. package/dist/surface/tools/assert/assert-verdict.js +42 -17
  482. package/dist/surface/tools/browser-tools.js +51 -2
  483. package/dist/surface/tools/chat-drives.d.ts +101 -0
  484. package/dist/surface/tools/chat-drives.js +409 -0
  485. package/dist/surface/tools/coverage-tools.d.ts +2 -10
  486. package/dist/surface/tools/coverage-tools.js +2 -53
  487. package/dist/surface/tools/dynamic-tools.js +29 -1
  488. package/dist/surface/tools/empty-session-list.d.ts +51 -0
  489. package/dist/surface/tools/empty-session-list.js +120 -0
  490. package/dist/surface/tools/error-recovery.d.ts +14 -0
  491. package/dist/surface/tools/error-recovery.js +105 -8
  492. package/dist/surface/tools/explore-tools.d.ts +31 -1
  493. package/dist/surface/tools/explore-tools.js +438 -66
  494. package/dist/surface/tools/feedback-tools.d.ts +2 -3
  495. package/dist/surface/tools/feedback-tools.js +18 -3
  496. package/dist/surface/tools/gap-novelty.d.ts +3 -1
  497. package/dist/surface/tools/gap-novelty.js +8 -1
  498. package/dist/surface/tools/harness-explore.d.ts +118 -57
  499. package/dist/surface/tools/harness-explore.js +344 -292
  500. package/dist/surface/tools/harness-gate.d.ts +88 -0
  501. package/dist/surface/tools/harness-gate.js +235 -0
  502. package/dist/surface/tools/harness-hunt.d.ts +43 -0
  503. package/dist/surface/tools/harness-hunt.js +215 -0
  504. package/dist/surface/tools/harness-plan.d.ts +17 -0
  505. package/dist/surface/tools/harness-plan.js +38 -0
  506. package/dist/surface/tools/harness-script.d.ts +30 -0
  507. package/dist/surface/tools/harness-script.js +560 -0
  508. package/dist/surface/tools/harness-tab-guard.d.ts +5 -0
  509. package/dist/surface/tools/harness-tab-guard.js +27 -0
  510. package/dist/surface/tools/harness-toolset.d.ts +22 -1
  511. package/dist/surface/tools/harness-toolset.js +101 -7
  512. package/dist/surface/tools/human-notes.d.ts +16 -0
  513. package/dist/surface/tools/human-notes.js +27 -0
  514. package/dist/surface/tools/invoke-tool.d.ts +5 -2
  515. package/dist/surface/tools/invoke-tool.js +263 -85
  516. package/dist/surface/tools/lease-hint.js +26 -5
  517. package/dist/surface/tools/lease-permissions.d.ts +33 -0
  518. package/dist/surface/tools/lease-permissions.js +73 -0
  519. package/dist/surface/tools/lease-readiness.d.ts +38 -0
  520. package/dist/surface/tools/lease-readiness.js +57 -0
  521. package/dist/surface/tools/lease-seed.d.ts +49 -0
  522. package/dist/surface/tools/lease-seed.js +167 -0
  523. package/dist/surface/tools/lease-tools.d.ts +13 -24
  524. package/dist/surface/tools/lease-tools.js +146 -197
  525. package/dist/surface/tools/live-call-text.js +4 -4
  526. package/dist/surface/tools/merge-tools.js +42 -2
  527. package/dist/surface/tools/merged-name-redirect.js +4 -0
  528. package/dist/surface/tools/next-step.d.ts +29 -0
  529. package/dist/surface/tools/next-step.js +214 -0
  530. package/dist/surface/tools/observe-tools.js +45 -9
  531. package/dist/surface/tools/platform-moment.d.ts +72 -0
  532. package/dist/surface/tools/platform-moment.js +296 -0
  533. package/dist/surface/tools/query-hint-schema.d.ts +7 -0
  534. package/dist/surface/tools/query-hint-schema.js +10 -0
  535. package/dist/surface/tools/read-tools.js +71 -14
  536. package/dist/surface/tools/real-input-attempt.js +96 -13
  537. package/dist/surface/tools/reticle-result.d.ts +120 -0
  538. package/dist/surface/tools/reticle-result.js +364 -0
  539. package/dist/surface/tools/tool-kit.d.ts +83 -3
  540. package/dist/surface/tools/tool-kit.js +77 -7
  541. package/dist/surface/tools/tools.js +43 -59
  542. package/dist/telemetry/account-envelope.d.ts +7 -0
  543. package/dist/telemetry/account-envelope.js +61 -0
  544. package/dist/telemetry/agent-client.d.ts +15 -0
  545. package/dist/telemetry/agent-client.js +57 -0
  546. package/dist/telemetry/app-instrumented.js +9 -2
  547. package/dist/telemetry/argument-shape.d.ts +7 -0
  548. package/dist/telemetry/argument-shape.js +86 -1
  549. package/dist/telemetry/automation-hint.d.ts +2 -3
  550. package/dist/telemetry/automation-hint.js +33 -8
  551. package/dist/telemetry/cli-telemetry.js +7 -2
  552. package/dist/telemetry/daemon-telemetry.js +3 -0
  553. package/dist/telemetry/error-fingerprint.d.ts +10 -1
  554. package/dist/telemetry/error-fingerprint.js +61 -5
  555. package/dist/telemetry/feedback-cli.d.ts +0 -13
  556. package/dist/telemetry/feedback-cli.js +0 -77
  557. package/dist/telemetry/feedback.d.ts +13 -0
  558. package/dist/telemetry/feedback.js +183 -17
  559. package/dist/telemetry/harness-run.d.ts +18 -0
  560. package/dist/telemetry/harness-run.js +80 -0
  561. package/dist/telemetry/hud-events.d.ts +16 -0
  562. package/dist/telemetry/hud-events.js +27 -0
  563. package/dist/telemetry/hud-metrics.d.ts +29 -6
  564. package/dist/telemetry/hud-metrics.js +116 -25
  565. package/dist/telemetry/init-telemetry.js +2 -2
  566. package/dist/telemetry/install-source.d.ts +13 -25
  567. package/dist/telemetry/install-source.js +44 -3
  568. package/dist/telemetry/mcp-connection.d.ts +0 -14
  569. package/dist/telemetry/mcp-connection.js +5 -1
  570. package/dist/telemetry/onboarding-firsts.d.ts +32 -0
  571. package/dist/telemetry/onboarding-firsts.js +81 -6
  572. package/dist/telemetry/platform-linked.d.ts +5 -0
  573. package/dist/telemetry/platform-linked.js +32 -0
  574. package/dist/telemetry/project-profile.js +5 -3
  575. package/dist/telemetry/proxy-telemetry.js +4 -1
  576. package/dist/telemetry/session-metrics.d.ts +15 -4
  577. package/dist/telemetry/session-metrics.js +88 -52
  578. package/dist/telemetry/telemetry.d.ts +38 -2
  579. package/dist/telemetry/telemetry.js +144 -34
  580. package/dist/telemetry/verification-of.d.ts +3 -1
  581. package/dist/telemetry/verification-of.js +13 -4
  582. package/dist/wire-journal.d.ts +2 -2
  583. package/dist/wire-journal.js +20 -6
  584. package/docs/README.md +3 -3
  585. package/docs/actions.mdx +6 -3
  586. package/docs/adapters.md +1 -1
  587. package/docs/agent-cheatsheet.md +25 -28
  588. package/docs/architecture.md +5 -5
  589. package/docs/autodrive.md +33 -28
  590. package/docs/benchmarks.md +5 -5
  591. package/docs/best-practices.mdx +27 -9
  592. package/docs/capabilities.mdx +14 -16
  593. package/docs/cli/affected.mdx +1 -1
  594. package/docs/cli/cloud.mdx +54 -75
  595. package/docs/cli/doctor.mdx +14 -3
  596. package/docs/cli/drive.mdx +20 -14
  597. package/docs/cli/feedback.mdx +3 -3
  598. package/docs/cli/gate.mdx +7 -2
  599. package/docs/cli/help.mdx +50 -55
  600. package/docs/cli/init.mdx +43 -28
  601. package/docs/cli/license.mdx +12 -8
  602. package/docs/cli/mcp.mdx +4 -4
  603. package/docs/cli/open.mdx +3 -3
  604. package/docs/cli/report.mdx +4 -2
  605. package/docs/cli/restart.mdx +2 -2
  606. package/docs/cli/rollback.mdx +14 -8
  607. package/docs/cli/serve.mdx +4 -4
  608. package/docs/cli/setup.mdx +23 -0
  609. package/docs/cli/status.mdx +18 -5
  610. package/docs/cli/stop.mdx +67 -8
  611. package/docs/cli/try.mdx +62 -0
  612. package/docs/cli/update.mdx +4 -3
  613. package/docs/cli/verify.mdx +17 -6
  614. package/docs/cli/version.mdx +5 -4
  615. package/docs/cli.mdx +111 -42
  616. package/docs/debugging.md +3 -3
  617. package/docs/deploy-checks.md +1 -1
  618. package/docs/desktop.mdx +9 -3
  619. package/docs/enterprise.md +11 -10
  620. package/docs/environment.mdx +7 -8
  621. package/docs/faq.mdx +3 -3
  622. package/docs/first-drive.md +5 -4
  623. package/docs/flows.md +35 -27
  624. package/docs/for-agents.md +4 -5
  625. package/docs/frameworks.mdx +32 -21
  626. package/docs/getting-started.md +65 -61
  627. package/docs/human-control.md +16 -16
  628. package/docs/index.mdx +15 -42
  629. package/docs/install-agentic.mdx +22 -37
  630. package/docs/install-manual.mdx +23 -13
  631. package/docs/instrumentation.mdx +5 -3
  632. package/docs/integration-patterns.md +7 -7
  633. package/docs/license-activation.mdx +1 -1
  634. package/docs/multi-agent-testing.md +24 -6
  635. package/docs/packages/babel-plugin.mdx +4 -2
  636. package/docs/packages/browser.mdx +16 -10
  637. package/docs/packages/core.mdx +12 -5
  638. package/docs/packages/electron.mdx +3 -2
  639. package/docs/packages/engine.mdx +1 -1
  640. package/docs/packages/eslint-plugin.mdx +18 -12
  641. package/docs/packages/next.mdx +8 -7
  642. package/docs/packages/open-verification.mdx +1 -1
  643. package/docs/packages/server.mdx +5 -5
  644. package/docs/packages/tauri.mdx +9 -9
  645. package/docs/packages/test.mdx +4 -10
  646. package/docs/packages/vite-plugin.mdx +32 -4
  647. package/docs/packages.mdx +11 -15
  648. package/docs/platform-integration.md +6 -5
  649. package/docs/predicates.mdx +40 -24
  650. package/docs/quickstart.mdx +69 -30
  651. package/docs/required-checks.md +8 -7
  652. package/docs/reticle-manual.md +15 -5
  653. package/docs/skill-file.mdx +17 -79
  654. package/docs/skill-setup.md +9 -9
  655. package/docs/skill.md +200 -0
  656. package/docs/system-map.md +7 -7
  657. package/docs/telemetry.md +23 -25
  658. package/docs/testing.md +4 -4
  659. package/docs/token-efficiency.md +12 -12
  660. package/docs/tools/act-and-wait.mdx +9 -2
  661. package/docs/tools/act-sequence.mdx +6 -7
  662. package/docs/tools/act.mdx +2 -2
  663. package/docs/tools/assert.mdx +18 -17
  664. package/docs/tools/console.mdx +9 -9
  665. package/docs/tools/inspect.mdx +16 -7
  666. package/docs/tools/look.mdx +24 -0
  667. package/docs/tools/navigate.mdx +5 -3
  668. package/docs/tools/network.mdx +2 -2
  669. package/docs/tools/observe.mdx +6 -6
  670. package/docs/tools/overview.mdx +34 -33
  671. package/docs/tools/query.mdx +5 -5
  672. package/docs/tools/session-and-feedback.mdx +22 -13
  673. package/docs/tools/sessions.mdx +8 -8
  674. package/docs/tools/snapshot.mdx +6 -5
  675. package/docs/tools/state.mdx +9 -9
  676. package/docs/tools/tools-and-run.mdx +26 -24
  677. package/docs/tools/verify.mdx +28 -0
  678. package/docs/tools/wait-for.mdx +8 -4
  679. package/docs/troubleshooting.mdx +21 -6
  680. package/docs/usage.md +55 -46
  681. package/docs/use-cases.mdx +3 -3
  682. package/docs/vs-chrome-devtools-mcp.mdx +9 -6
  683. package/docs/vs-playwright-mcp.mdx +3 -1
  684. package/docs/what-is-recorded.md +17 -5
  685. package/docs/what-is-reticle.mdx +5 -3
  686. package/docs/why-reticle.mdx +1 -1
  687. package/package.json +9 -12
  688. package/dist/command/cli/demo/demo-page.d.ts +0 -78
  689. package/dist/command/cli/demo/demo-page.js +0 -241
  690. package/dist/command/cli/demo/demo-run.d.ts +0 -38
  691. package/dist/command/cli/demo/demo-run.js +0 -138
  692. package/dist/features/harness/driver.d.ts +0 -50
  693. package/dist/features/harness/driver.js +0 -236
  694. package/dist/features/harness/jev-driver.d.ts +0 -188
  695. package/dist/features/harness/jev-driver.js +0 -678
  696. package/dist/features/harness/openai-driver.d.ts +0 -58
  697. package/dist/features/harness/openai-driver.js +0 -206
  698. package/dist/judgement/hunt/hunt-report.d.ts +0 -49
  699. package/dist/judgement/hunt/hunt-report.js +0 -84
  700. package/dist/language/flows/buddy-status.d.ts +0 -25
  701. package/dist/language/flows/buddy-status.js +0 -32
  702. package/dist/language/flows/change/watch-batcher.d.ts +0 -18
  703. package/dist/language/flows/change/watch-batcher.js +0 -19
  704. package/dist/memory/cloud/harness-offer.d.ts +0 -44
  705. package/dist/memory/cloud/harness-offer.js +0 -145
  706. package/dist/memory/project/dir/fill-value-store.d.ts +0 -32
  707. package/dist/memory/project/dir/fill-value-store.js +0 -88
  708. package/dist/surface/tools/feature-capture.d.ts +0 -151
  709. package/dist/surface/tools/feature-capture.js +0 -235
  710. package/dist/surface/tools/tool-hit-rate.d.ts +0 -87
  711. package/dist/surface/tools/tool-hit-rate.js +0 -90
  712. package/dist/telemetry/harness-drive.d.ts +0 -4
  713. package/dist/telemetry/harness-drive.js +0 -35
  714. package/dist/telemetry/identify.d.ts +0 -22
  715. package/dist/telemetry/identify.js +0 -73
  716. package/docs/cli/capsules.mdx +0 -70
  717. package/docs/cli/hunt.mdx +0 -73
  718. package/docs/cli/identify.mdx +0 -76
  719. package/docs/cli/kill.mdx +0 -91
  720. package/docs/cli/watch.mdx +0 -62
  721. package/docs/local-registry.md +0 -143
@@ -1,9 +1,12 @@
1
1
  import { asProjectId } from '@reticlehq/core';
2
+ import { narrationArgs } from './narration-args.js';
2
3
  import { refusedResult } from './page-commands/undeclared-command.js';
3
- import { recordImpact } from '../../memory/impact/impact-recorder.js';
4
+ import { impactSnapshot, recordImpact } from '../../memory/impact/impact-recorder.js';
5
+ import { callingAgent } from '../../hooks/coding-agents.js';
6
+ import { recordNotes } from './human/notes-ledger.js';
7
+ import { commandPayload } from './command-payload.js';
4
8
  import { LastAct } from './last-act.js';
5
9
  import { GapLedger } from '@reticlehq/engine/evidence/gap-ledger.js';
6
- import { CaptureLedger } from '../../surface/tools/feature-capture.js';
7
10
  import { commandTimeoutMessage } from './timing/command-timeout.js';
8
11
  import { readHealthEvent, healthNotices } from './session-health.js';
9
12
  import { MIRRORED_COMMANDS, mirroredNarration } from './presence/session-mirror.js';
@@ -12,18 +15,21 @@ const IMPACT_PUSH_DEBOUNCE_MS = 700;
12
15
  import { PendingCommands, CommandTimeoutError } from './page-commands/pending-commands.js';
13
16
  import { span } from '../../trace.js';
14
17
  import { keepCallerContextInDaemon, noteToDaemonLog } from './daemon-answers.js';
15
- import { isKnownRealm, EventType, HumanControlDataSchema, HumanControlKind, HumanMarkDataSchema, HudUseDataSchema, ReticleCommand, MessageKind, parseEventPayload, PresenterTone, SESSION_HEALTH, SESSION_LEASE, SESSION_LIFECYCLE, SessionState, } from '@reticlehq/core';
18
+ import { isKnownRealm, EventType, HumanControlDataSchema, HumanControlKind, HumanMarkDataSchema, HudUseDataSchema, ReticleCommand, parseEventPayload, PresenterTone, SESSION_HEALTH, SESSION_LEASE, SESSION_LIFECYCLE, SessionState, } from '@reticlehq/core';
16
19
  import { RingBuffer } from '@reticlehq/engine/window/ring-buffer.js';
17
20
  import { readJournalWriteLoss, readQueryEvents, windowLost, } from '../../memory/journal/journal-query.js';
18
21
  import {} from '@reticlehq/engine/window/ambient.js';
19
22
  import { ObservedState, controlLabelsOf } from './facts/observed-state.js';
20
- import { recordBrowserLatency, recordHudUse, recordSdkFailure, } from '../../telemetry/session-metrics.js';
23
+ import { DepartureNote } from './facts/departure-note.js';
24
+ import { recordBrowserLatency, recordSdkFailure } from '../../telemetry/session-metrics.js';
25
+ import { noteHudTabClosed, noteHudTabHidden, reportHudUse } from '../../telemetry/hud-events.js';
21
26
  import { LiveControl } from './human/live-control.js';
22
27
  import { ReviewStore } from './human/review-store.js';
23
28
  import { buildSessionRecommendation } from './presence/session-recommendation.js';
24
29
  import { buildPresenterArgs } from './human/presenter-args.js';
25
30
  import { buildSessionLease } from './presence/session-lease.js';
26
31
  import { buildSessionInfo } from './session-info.js';
32
+ import { notedAct, probeMarkers, withInstrumentation } from './recorded-gaps.js';
27
33
  import { MAX_SUCCESSOR_HOPS, REBINDABLE_COMMANDS } from './rebind.js';
28
34
  const DEFAULT_COMMAND_TIMEOUT_MS = 8000;
29
35
  /** Prefix on correlated command ids (c1, c2, …) — distinguishes them from mark ids. */
@@ -54,13 +60,8 @@ export class Session {
54
60
  projectId;
55
61
  /**
56
62
  * The `.reticle` directory this session's evidence belongs in — impact counters AND capsules.
57
- *
58
- * Stamped once when the session is created, from the project it declared in HELLO, rather than
59
- * resolved per call: the answer cannot change while the tab is connected, and resolving it once
60
- * means every counter that fires for this session agrees about where it goes.
61
- *
62
- * Undefined when nothing could name a project — the caller then falls back to the daemon's own
63
- * root, which is what every counter did unconditionally before this existed.
63
+ * Stamped once, from the project it declared in HELLO, so every counter agrees where it goes.
64
+ * Undefined when nothing could name a project: callers fall back to the daemon's own root.
64
65
  */
65
66
  artifactRoot;
66
67
  /**
@@ -99,6 +100,8 @@ export class Session {
99
100
  /** Which browser the page said it is (chrome/edge/arc/…). Undefined on an SDK too old to report one. */
100
101
  #brand;
101
102
  #focused = true;
103
+ /** The desktop window this is and its document's HTTP status, merged from every PAGE_HEALTH. */
104
+ page = {};
102
105
  /** Liveness: wall-clock of the last AGENT command (distinct from browser chatter / lastSeen). */
103
106
  #lastAgentActivityAt;
104
107
  /** Server-side mirror of the agent-tuned idle window, so the reaper honors reticle_session. */
@@ -107,9 +110,10 @@ export class Session {
107
110
  #autoEnded = false;
108
111
  #live = new LiveControl();
109
112
  /** Human review marks: mistakes the human pinned to elements, for the agent to drain and fix. */
110
- #review = new ReviewStore();
111
- /** Whether the session_lease has already been returned (fire-once per session). */
112
- #firstCommandDone = false;
113
+ #review = new ReviewStore((marks) => recordNotes(this.artifactRoot, marks));
114
+ #firstCommandDone = false; // whether the session_lease has been returned (fire-once)
115
+ /** The newest journal action: a verdict's screenshot names it, so the run pairs it with its check. */
116
+ lastActionId;
113
117
  /** Durable causal-journal recorder; undefined when journaling is off (opt-out or not yet attached). */
114
118
  #journal;
115
119
  #activeActionId; // action window, held independently of the journal
@@ -129,6 +133,7 @@ export class Session {
129
133
  * A hot update advances it inside the same document. An unstamped event never clears it.
130
134
  */
131
135
  #editEpoch;
136
+ #departureNote = new DepartureNote();
132
137
  constructor(hello, socket, clock) {
133
138
  this.id = hello.sessionId;
134
139
  this.projectId = hello.projectId === undefined ? undefined : asProjectId(hello.projectId);
@@ -148,6 +153,9 @@ export class Session {
148
153
  elapsed() {
149
154
  return this.#clock() - this.#startedAt;
150
155
  }
156
+ departedTo() {
157
+ return this.#departureNote.read(this.elapsed());
158
+ }
151
159
  /** Mark that the SDK was just heard from. Called on every inbound message. */
152
160
  touch() {
153
161
  this.#lastSeenAt = this.#clock();
@@ -226,6 +234,7 @@ export class Session {
226
234
  runtime: this.#runtime,
227
235
  versionSkew: this.versionSkew,
228
236
  hidden: this.#hidden,
237
+ page: this.page,
229
238
  health: () => this.health(),
230
239
  staleMs: () => this.staleMs(),
231
240
  pendingMarkCount: () => this.#review.pendingCount(),
@@ -274,7 +283,7 @@ export class Session {
274
283
  if (event.type === EventType.HUD_USED) {
275
284
  const use = HudUseDataSchema.safeParse(event.data);
276
285
  if (use.success)
277
- recordHudUse(use.data);
286
+ reportHudUse(use.data, this.id);
278
287
  return;
279
288
  }
280
289
  if (event.documentId !== undefined)
@@ -283,6 +292,10 @@ export class Session {
283
292
  this.#editEpoch = event.editEpoch;
284
293
  if (event.type === EventType.PAGE_HEALTH) {
285
294
  const r = readHealthEvent(event.data);
295
+ Object.assign(this.page, r.page);
296
+ // A hidden tab's HUD is not being looked at: its time stops until the tab is in front again.
297
+ if (r.hidden !== undefined)
298
+ noteHudTabHidden(this.id, r.hidden);
286
299
  this.applyHealth(r.hidden ?? this.#hidden, r.focused ?? this.#focused, r.runtime, r.engine, r.brand);
287
300
  }
288
301
  // The in-page half of Reticle reporting its own failure — recorded like a tool error
@@ -303,8 +316,7 @@ export class Session {
303
316
  const parsed = HumanMarkDataSchema.safeParse(event.data);
304
317
  if (parsed.success) {
305
318
  this.#review.add(parsed.data, this.elapsed());
306
- // The impact record's `marks` field existed and nothing ever wrote it: the report would
307
- // have shown a permanent zero next to a page covered in pins.
319
+ // Without this the report shows a permanent zero next to a page covered in pins.
308
320
  recordImpact({ marks: 1 }, {}, this.artifactRoot);
309
321
  }
310
322
  }
@@ -316,6 +328,7 @@ export class Session {
316
328
  if ('string' === typeof to && to.length > 0)
317
329
  this.url = to;
318
330
  }
331
+ this.#departureNote.observe(event, this.elapsed());
319
332
  const t = this.elapsed();
320
333
  const stamped = { ...event, t, sessionId: this.id };
321
334
  // The recorder attributes the event to the in-flight action (if any) and journals it durably; the
@@ -371,10 +384,10 @@ export class Session {
371
384
  return this.#observed.actedRefs();
372
385
  }
373
386
  noteRateLimited(dropped) {
374
- this.#observed.noteRateLimited(dropped);
387
+ this.#observed.noteRateLimited(dropped, this.elapsed());
375
388
  }
376
- blindSpots() {
377
- return this.#observed.blindSpots();
389
+ blindSpots(since) {
390
+ return this.#observed.blindSpots(since);
378
391
  }
379
392
  /** Learned ambient-churn counts (PredicateSession hook the settle oracle reads). */
380
393
  ambientCounts() {
@@ -408,10 +421,7 @@ export class Session {
408
421
  async journalWriteLoss() {
409
422
  return readJournalWriteLoss(this.#journalReader, this.#buffer);
410
423
  }
411
- /**
412
- * Open an action-attribution window: events observed until finishAction attribute to the returned
413
- * action id. Ids are minted independently of command correlation ids so the journal is self-contained.
414
- */
424
+ /** Open an attribution window: events until finishAction carry the returned (journal-own) id. */
415
425
  beginAction(tool, args) {
416
426
  const actionId = this.#mintActionId();
417
427
  // Held here, not only in the journal: with the journal off every event was unattributed, and
@@ -431,7 +441,8 @@ export class Session {
431
441
  }
432
442
  #mintActionId() {
433
443
  this.#actionSeq += 1;
434
- return `${ACTION_ID_PREFIX}${String(this.#actionSeq)}`;
444
+ this.lastActionId = `${ACTION_ID_PREFIX}${String(this.#actionSeq)}`;
445
+ return this.lastActionId;
435
446
  }
436
447
  /**
437
448
  * How many actions this session has dispatched.
@@ -479,11 +490,6 @@ export class Session {
479
490
  * end of it.
480
491
  */
481
492
  gaps = new GapLedger();
482
- /**
483
- * The read-only calls the journal does not keep, so "was `reticle_context` ever called" has
484
- * something to fold. See surface/tools/feature-capture.ts — it is the only state that instrument adds.
485
- */
486
- capture = new CaptureLedger();
487
493
  // ── Server-authoritative liveness (immune to browser-tab throttling) ──────────────
488
494
  /**
489
495
  * Stamp the wall-clock of the latest AGENT command (called whenever a tool resolves this session).
@@ -570,13 +576,7 @@ export class Session {
570
576
  if (successor !== undefined)
571
577
  return successor.command(name, args, timeoutMs);
572
578
  const id = this.#pending.nextId(COMMAND_ID_PREFIX);
573
- const payload = JSON.stringify({
574
- kind: MessageKind.COMMAND,
575
- id,
576
- sessionId: this.id,
577
- name,
578
- args,
579
- });
579
+ const payload = commandPayload(id, this.id, name, args);
580
580
  // The timeout message is built LAZILY: health can change while a command is in flight, and the
581
581
  // diagnosis should describe the page as it was when the command actually gave up.
582
582
  const awaited = this.#pending.track(id, timeoutMs, () => commandTimeoutMessage(name, timeoutMs, {
@@ -596,7 +596,7 @@ export class Session {
596
596
  // The label is only knowable from the REPLY — the request carries a ref, and a ref dies with
597
597
  // the next re-render. Recorded here so coverage survives frameworks that replace nodes.
598
598
  if (name === ReticleCommand.ACT)
599
- this.recordActedLabelFrom(result);
599
+ this.recordActedLabelFrom(notedAct(this, result));
600
600
  return result;
601
601
  })
602
602
  .finally(() => recordBrowserLatency(Date.now() - sentAt))
@@ -632,6 +632,7 @@ export class Session {
632
632
  /** Reject everything still in flight — used on disconnect. */
633
633
  rejectAll(reason, replaced = false) {
634
634
  this.#pending.rejectAll(reason, replaced);
635
+ noteHudTabClosed(this.id);
635
636
  for (const listener of this.#disconnectListeners)
636
637
  listener();
637
638
  this.#disconnectListeners.clear();
@@ -653,13 +654,9 @@ export class Session {
653
654
  this.#successor = next;
654
655
  }
655
656
  /**
656
- * The replacement, but only while it can actually answer.
657
- *
658
- * A successor is recorded once and never cleared, so without this a session that was replaced an
659
- * hour ago keeps handing commands to a socket that has since closed — and the caller pays the full
660
- * timeout to learn it, turning an instant "session replaced" into a wait. The point of delegating
661
- * was to save the caller a round trip; delegating to a dead socket costs them more than the error
662
- * did.
657
+ * The replacement, but only while it can actually answer. A successor is never cleared, so without
658
+ * this a session replaced an hour ago hands commands to a closed socket and the caller pays the
659
+ * full timeout to learn it — more than the "session replaced" error it was meant to save.
663
660
  */
664
661
  #liveSuccessor() {
665
662
  // Walked, not just read one hop. Two replacements in quick succession — a page that reloads
@@ -709,13 +706,20 @@ export class Session {
709
706
  this.#live.setState(next);
710
707
  this.pushPresenter(next, text, tone);
711
708
  }
712
- /** Push a human note onto the inbox (see LiveControl). */
709
+ /** Push a human note onto the inbox (see LiveControl); the HUD shows it as sent. */
713
710
  pushMessage(text) {
714
711
  this.#live.push(text, this.elapsed());
712
+ this.#repaintNotes();
715
713
  }
716
- /** Queued human notes, cleared as they are read (delivered-once). */
714
+ /** Queued human notes, cleared as they are read (delivered-once); the HUD shows them as seen. */
717
715
  drainInbox() {
718
- return this.#live.drain();
716
+ const taken = this.#live.drain(callingAgent());
717
+ if (0 < taken.length)
718
+ this.#repaintNotes();
719
+ return taken;
720
+ }
721
+ #repaintNotes() {
722
+ this.pushImpact(() => impactSnapshot(this.artifactRoot), true);
719
723
  }
720
724
  /** Diagnostic read of the inbox depth (does not clear). */
721
725
  inboxSize() {
@@ -755,28 +759,26 @@ export class Session {
755
759
  }
756
760
  }
757
761
  /**
758
- * Push the impact record to this tab's HUD.
759
- *
760
- * Debounced: the record changes on every tool call, and the panel does not need 200 frames to
761
- * show a counter going up. The LAST state always lands, because the timer re-reads the store
762
- * when it fires rather than capturing a snapshot when it was scheduled.
762
+ * Push the impact record to this tab's HUD. Debounced (a counter needs no 200 frames); the LAST
763
+ * state always lands, because the timer re-reads the store when it fires.
763
764
  */
764
765
  pushImpact(read, immediate = false) {
765
- if (immediate) {
766
- // A tab that just connected has nothing to show yet, so its first record goes out at once -
767
- // waiting a debounce here is a report that reads "nothing recorded" over a month of history.
768
- const first = read();
769
- if (first !== undefined)
770
- this.#post(ReticleCommand.IMPACT, { snapshot: first });
771
- return;
772
- }
766
+ const send = () => {
767
+ const snapshot = read();
768
+ if (snapshot === undefined)
769
+ return; // each push carries this tab's own coverage
770
+ const post = () => this.#post(ReticleCommand.IMPACT, { snapshot: withInstrumentation(this, snapshot) });
771
+ post();
772
+ void probeMarkers([this]).then((learned) => learned && post()); // what the page carries
773
+ };
774
+ // A new tab's first record goes out at once: debounced, it reads "nothing recorded" over history.
775
+ if (immediate)
776
+ return send();
773
777
  if (this.#impactTimer !== undefined)
774
778
  return;
775
779
  this.#impactTimer = setTimeout(() => {
776
780
  this.#impactTimer = undefined;
777
- const snapshot = read();
778
- if (snapshot !== undefined)
779
- this.#post(ReticleCommand.IMPACT, { snapshot });
781
+ send();
780
782
  }, IMPACT_PUSH_DEBOUNCE_MS);
781
783
  this.#impactTimer.unref?.();
782
784
  }
@@ -785,8 +787,17 @@ export class Session {
785
787
  }
786
788
  /** Fire-and-forget a narration row to the live panel (so a resolved mark shows "✓ fixed"). */
787
789
  #impactTimer;
788
- pushNarration(text) {
789
- this.#post(ReticleCommand.NARRATE, { text, level: 'info' });
790
+ /** `mirror: false` for a notice about THIS page (its SDK is behind), which every tab says itself. */
791
+ pushNarration(text, mirror = true, by) {
792
+ const args = narrationArgs(text, by);
793
+ if (mirror)
794
+ this.#post(ReticleCommand.NARRATE, args);
795
+ else
796
+ this.#send(ReticleCommand.NARRATE, args);
797
+ }
798
+ /** A HUD replay's progress, or the Harness's drive plan: pictures the HUD redraws as they change. */
799
+ pushView(name, args) {
800
+ this.#post(name, { ...args });
790
801
  }
791
802
  /** The one-time lease block on the first agent command, then undefined forever after. */
792
803
  takeSessionLease() {
@@ -822,12 +833,9 @@ export class Session {
822
833
  this.#viewers = read;
823
834
  }
824
835
  /**
825
- * Fire-and-forget command send — NOT registered in #pending (no correlated result expected).
826
- *
827
- * Mirrored to this project's other tabs, for the two commands that are a REPORT of what happened
828
- * (narration, impact). PRESENTER is deliberately not among them: it is the glow and the lifecycle
829
- * that say "the agent is driving THIS tab", and a viewer that showed it would be claiming
830
- * something untrue about itself.
836
+ * Fire-and-forget command send, NOT registered in #pending. Mirrored to this project's other tabs
837
+ * for the commands that REPORT what happened. PRESENTER is not among them: it says "the agent is
838
+ * driving THIS tab", and a viewer that showed it would be claiming something untrue about itself.
831
839
  */
832
840
  #post(name, args) {
833
841
  this.#send(name, args);
@@ -862,13 +870,7 @@ export class Session {
862
870
  this.recordActedRef(ref);
863
871
  }
864
872
  const id = this.#pending.nextId(COMMAND_ID_PREFIX);
865
- const payload = JSON.stringify({
866
- kind: MessageKind.COMMAND,
867
- id,
868
- sessionId: this.id,
869
- name,
870
- args,
871
- });
873
+ const payload = commandPayload(id, this.id, name, args);
872
874
  try {
873
875
  this.#socket.send(payload);
874
876
  }
@@ -1,4 +1,4 @@
1
- import { realmOf, AppRuntime, isOpaqueOrigin } from '@reticlehq/core';
1
+ import { realmOf, AppRuntime, isOpaqueOrigin, ReticleTool } from '@reticlehq/core';
2
2
  /**
3
3
  * Inbound silence beyond this means the page may genuinely be wedged; inside it, the SDK has spoken
4
4
  * recently enough that "the page is hung" is provably the wrong story. A page that is streaming
@@ -17,6 +17,24 @@ const HIDDEN_ADVICE = 'The page last reported itself hidden, and this is a WKWeb
17
17
  'observed on a hidden macOS WKWebView after a pause, even though capture still works; park it ' +
18
18
  'off-screen rather than calling hide. If neither fits, the page is reachable but not executing, ' +
19
19
  'which is worth reporting.';
20
+ /**
21
+ * A hidden page in an ordinary browser. Its frames and timers are throttled, so a command can time
22
+ * out while the SDK keeps reporting in, which is exactly the state ONE_WAY_ADVICE reads as a
23
+ * transport fault. Sending the agent to debug its own network there costs attempts and finds
24
+ * nothing (#1416): the way out is a tab nobody else is looking at, which a lease is.
25
+ */
26
+ const HIDDEN_TAB_ADVICE = 'The page last reported itself hidden: it is a background tab, and the browser throttles a hidden ' +
27
+ "tab's frames and timers, so commands can time out while the page still reports in. This is not a " +
28
+ `network fault. Bring the tab to the front, or drive a tab Reticle owns: ${ReticleTool.LEASE} ` +
29
+ '{ action: "acquire", url: "%URL%" }.';
30
+ /**
31
+ * True only when the SDK REPORTED an ordinary browser tab. Not guessed from the URL: a Tauri or
32
+ * Electron dev server is http://localhost too, and an older SDK that omits the runtime would turn a
33
+ * hidden desktop window into "bring the tab forward", which addresses nothing there.
34
+ */
35
+ function isWebTab(context) {
36
+ return AppRuntime.WEB === context.runtime;
37
+ }
20
38
  /** True when this session is a WebKit desktop shell — the only runtime that suffers this. */
21
39
  function isWebKitDesktop(context) {
22
40
  if (realmOf(context.runtime).usesWebKit)
@@ -28,6 +46,12 @@ function isWebKitDesktop(context) {
28
46
  }
29
47
  export function commandTimeoutMessage(name, timeoutMs, context) {
30
48
  const base = `command '${name}' timed out after ${String(timeoutMs)}ms`;
49
+ // A hidden WEB tab first, before the recently-heard branch: a background tab keeps reporting in
50
+ // while its throttled frames miss the command, so "heard recently" is expected there and says
51
+ // nothing about the transport. Desktop shells keep the order below unchanged.
52
+ if (context.hidden && isWebTab(context)) {
53
+ return `${base}. ${HIDDEN_TAB_ADVICE.replace('%URL%', context.url)}`;
54
+ }
31
55
  // Checked FIRST, and it overrides the visibility story: a page that was heard from moments ago is
32
56
  // executing JavaScript, so "hidden, hung or never presented" cannot be the explanation whatever
33
57
  // `hidden` says. Deduced from the invariant, not from a measured incident — the Tauri case that
@@ -2,7 +2,7 @@
2
2
  * The real clock, named once.
3
3
  *
4
4
  * The logic that needs a clock takes one as an argument so a test can drive it without waiting
5
- * (CLAUDE.md rule 7). That leaves the production callers each constructing the same pair of
5
+ * (AGENTS.md rule 7). That leaves the production callers each constructing the same pair of
6
6
  * closures, which is how two of them end up with different sleep implementations. One export, one
7
7
  * place to look.
8
8
  */
@@ -2,7 +2,7 @@
2
2
  * The real clock, named once.
3
3
  *
4
4
  * The logic that needs a clock takes one as an argument so a test can drive it without waiting
5
- * (CLAUDE.md rule 7). That leaves the production callers each constructing the same pair of
5
+ * (AGENTS.md rule 7). That leaves the production callers each constructing the same pair of
6
6
  * closures, which is how two of them end up with different sleep implementations. One export, one
7
7
  * place to look.
8
8
  */
@@ -0,0 +1,31 @@
1
+ import { type FirstRunWiring } from './first-run-wiring.js';
2
+ export interface FirstCallIo {
3
+ /** The unwired web app this call is about; undefined when wired, not a web app, or no project. */
4
+ project: () => string | undefined;
5
+ /** Which of these ports serve HTTP right now. */
6
+ serving: (ports: readonly number[]) => Promise<readonly number[]>;
7
+ /** The directory the process serving `url` runs in, when it can be observed. */
8
+ servingDirectory: (url: string) => string | undefined;
9
+ /** Open `url` in a lease — the path that supplies the SDK when the page never dials in. */
10
+ lease: (url: string) => Promise<unknown>;
11
+ /** Whether a session is connected now. */
12
+ connected: () => boolean;
13
+ }
14
+ export interface FirstCallOpened {
15
+ url: string;
16
+ /** One line for the agent: what was opened, what it cannot see, and how to wire it for good. */
17
+ notice: string;
18
+ }
19
+ /** One lease per project for the daemon's life: a failure is reported once, never retried. */
20
+ export declare function firstCallOpener(io: FirstCallIo): () => Promise<FirstCallOpened | undefined>;
21
+ /**
22
+ * The daemon's two answers to an app nobody wired, built together because both ask the same
23
+ * question first — which unwired web app is this caller in. `firstRun` wires it when the agent
24
+ * lists sessions; `openUnwiredApp` opens it zero-install on a page-needing call.
25
+ */
26
+ export declare function agentWiring(port: number, sessions: {
27
+ list(): readonly unknown[];
28
+ }, lease: (url: string) => Promise<unknown>): {
29
+ firstRun: FirstRunWiring;
30
+ openUnwiredApp: () => Promise<FirstCallOpened | undefined>;
31
+ };
@@ -0,0 +1,88 @@
1
+ /**
2
+ * The first call that needs a page, on an app nobody wired: open that app ourselves, zero-install.
3
+ *
4
+ * An install through the MCP server alone (a plugin, a hand-written `npx … mcp` config) never runs
5
+ * `init`, so the app carries no SDK and nothing ever connects. The agent's first page-needing call
6
+ * then answered with a diagnosis, and the agent stopped there. A lease supplies the SDK to a page
7
+ * that never dials in, so the daemon can answer that call with the app itself instead.
8
+ *
9
+ * Only for a call that already asked to drive or read a page, and only on evidence: exactly one dev
10
+ * server whose process runs inside this project's folder. The port scan is machine-wide, and a
11
+ * browser opened on another repo's app produces a confident verdict about code nobody touched. It
12
+ * changes nothing in the repo — wiring it for good stays the agent's call, named in the notice.
13
+ *
14
+ * Where the serving process cannot be observed (no `lsof`, so Windows) nothing is opened and the
15
+ * no-session answer names the lease and the init command instead.
16
+ */
17
+ import { realpathSync } from 'node:fs';
18
+ import { resolve, sep } from 'node:path';
19
+ import { DEV_SERVER_PORTS } from '../../command/cli/ports/resolve/cli-port.js';
20
+ import { callingClientDirectory } from '../../hooks/client-directory.js';
21
+ import { detectDevCommandInProject, initCommandIn } from './dev-server/dev-command.js';
22
+ import { probeDevServerStates } from './dev-server/dev-server-probe.js';
23
+ import { firstRunWiring } from './first-run-wiring.js';
24
+ import { servingDirectoryOf } from './serving-directory.js';
25
+ const LOCALHOST = 'http://localhost';
26
+ /** The path with symlinks resolved when it exists (lsof reports `/private/tmp`, callers `/tmp`). */
27
+ function real(path) {
28
+ try {
29
+ return realpathSync(path);
30
+ }
31
+ catch {
32
+ return resolve(path);
33
+ }
34
+ }
35
+ const inside = (c, p) => c === p || c.startsWith(`${p}${sep}`);
36
+ /** Compared both as written and with links resolved: either spelling may be the one lsof used. */
37
+ function within(child, parent) {
38
+ if (child === undefined)
39
+ return false;
40
+ return inside(resolve(child), resolve(parent)) || inside(real(child), real(parent));
41
+ }
42
+ function openedNotice(url, init) {
43
+ return (`This app is not wired for Reticle, so Reticle opened ${url} in its own browser and supplied ` +
44
+ 'the SDK (zero-install: DOM, network, console and routes; no component state and no source ' +
45
+ `file:line). To wire it for good, run \`${init}\`, then ` +
46
+ 'restart the dev server and reload the page.');
47
+ }
48
+ /** One lease per project for the daemon's life: a failure is reported once, never retried. */
49
+ export function firstCallOpener(io) {
50
+ const tried = new Set();
51
+ return async () => {
52
+ const dir = io.project();
53
+ if (dir === undefined || tried.has(dir))
54
+ return undefined;
55
+ const pinned = detectDevCommandInProject(dir)?.port;
56
+ const candidates = new Set(DEV_SERVER_PORTS);
57
+ if (pinned !== undefined)
58
+ candidates.add(pinned);
59
+ const own = (await io.serving([...candidates]))
60
+ .map((port) => `${LOCALHOST}:${String(port)}`)
61
+ .filter((url) => within(io.servingDirectory(url), dir));
62
+ const [url] = own;
63
+ // ponytail: nothing serving yet is not an attempt, so a later call looks again.
64
+ if (url === undefined || 1 !== own.length)
65
+ return undefined;
66
+ tried.add(dir);
67
+ await io.lease(url).catch(() => undefined);
68
+ if (!io.connected())
69
+ return undefined;
70
+ return { url, notice: openedNotice(url, initCommandIn(dir)) };
71
+ };
72
+ }
73
+ /**
74
+ * The daemon's two answers to an app nobody wired, built together because both ask the same
75
+ * question first — which unwired web app is this caller in. `firstRun` wires it when the agent
76
+ * lists sessions; `openUnwiredApp` opens it zero-install on a page-needing call.
77
+ */
78
+ export function agentWiring(port, sessions, lease) {
79
+ const firstRun = firstRunWiring({ port, cliPath: process.argv[1] ?? '' });
80
+ const openUnwiredApp = firstCallOpener({
81
+ project: () => firstRun.projectDirectory(callingClientDirectory() ?? process.cwd()),
82
+ serving: async (ports) => (await probeDevServerStates(ports)).serving,
83
+ servingDirectory: (url) => servingDirectoryOf(url),
84
+ lease,
85
+ connected: () => 0 < sessions.list().length,
86
+ });
87
+ return { firstRun, openUnwiredApp };
88
+ }
@@ -7,6 +7,18 @@
7
7
  import type { OwnedRealInputProvider } from './portal/input/real-input.js';
8
8
  import type { InjectConnectOptions } from './portal/input/real-input.js';
9
9
  export interface StartOptions {
10
+ /**
11
+ * The panel's Sign in, supplied by the CLI door, which owns install-time code: given a repaint, it
12
+ * answers the handler the bridge runs on each press. An embedder of the library leaves it out, and
13
+ * its panel falls back to copying `reticle login`.
14
+ */
15
+ hudSignIn?: (repaint: () => void,
16
+ /** Links the asking tab's project once the sign-in lands (`hudLink`). */
17
+ link?: (root: string) => Promise<number>) => (from?: {
18
+ artifactRoot?: string | undefined;
19
+ }) => void;
20
+ /** The Harness page's Link this project: link the project in this folder, as `reticle connect` does. */
21
+ hudLink?: (root: string) => Promise<number>;
10
22
  port?: number;
11
23
  /** Bind address. Non-loopback hosts require a token. Defaults to RETICLE_HOST or localhost. */
12
24
  host?: string;
@@ -0,0 +1,63 @@
1
+ import type { NetworkDetail } from './portal/input/network-detail.js';
2
+ import type { StartOptions } from './start-options.js';
3
+ import type { Bridge } from './portal/bridge/bridge.js';
4
+ import type { RealInputProvider } from './portal/input/real-input.js';
5
+ import { BrowserPool } from './portal/pool/browser-pool.js';
6
+ import { type InjectedConnect } from './portal/pool/zero-install.js';
7
+ /**
8
+ * Build the shared browser pool (one headless Chromium, N capped isolated leased contexts). Lazy —
9
+ * no Chromium launches until the first lease — so creating it is free even when never used.
10
+ */
11
+ /** Where the zero-install reader connects: this daemon's own bridge, with its pairing token. */
12
+ export declare function readerConnect(port: number, token: string | undefined): InjectedConnect;
13
+ export declare function createBrowserPool(headless: boolean, reader: InjectedConnect): BrowserPool;
14
+ /**
15
+ * Route CDP-authoritative network detail onto the driven session's journal.
16
+ *
17
+ * The page and the SDK session share an origin, so a NET_DETAIL is pushed to the matching connected
18
+ * session. Shared by both entry points: `startDaemon` previously omitted it entirely, so on the path
19
+ * users actually take, CDP network detail was collected and then dropped on the floor.
20
+ */
21
+ export declare function makeNetworkDetailRouter(bridge: Bridge, driveUrl: string | undefined): (detail: NetworkDetail) => void;
22
+ /**
23
+ * Resolve the drive/real-input provider from options — shared by start and startDaemon so the
24
+ * precedence (driveUrl launch+own → CDP attach → none) and the storageState/injectConnect plumbing
25
+ * live in ONE place. `onNavigateError` is the entrypoint's own cleanup (close the bridge/shared server)
26
+ * so a failed launch never leaks a WS port. A past divergence between the two paths let daemon mode
27
+ * run with a different setup — this removes that risk.
28
+ */
29
+ export declare function resolveRealInput(options: StartOptions, onNavigateError: () => Promise<void>, onNetworkDetail?: (detail: NetworkDetail) => void): Promise<{
30
+ realInput?: RealInputProvider;
31
+ owned?: {
32
+ dispose: () => Promise<void>;
33
+ };
34
+ }>;
35
+ /**
36
+ * The SDK-upgrade sentence for the package.json of the project the page announced, evaluated at
37
+ * each HELLO so a just-edited manifest is what we name. The daemon's cwd only when that project's
38
+ * directory is unknown, and the framework-neutral sensor when that is not an app either (#1135).
39
+ */
40
+ export declare function sdkFixForProject(projectId?: string): string;
41
+ /**
42
+ * Resolve a session's artifact root, from everything this machine knows about where projects live.
43
+ *
44
+ * Built once per daemon and closed over by every tool call. The two sources are read lazily and
45
+ * cheaply on each call rather than snapshotted at startup: `init` can run in another terminal while
46
+ * this daemon is up, and a resolution that used a startup snapshot would keep answering with a map
47
+ * from before the project the agent is now driving existed.
48
+ */
49
+ /**
50
+ * Every `.reticle` root on this machine that sync should consider, from the same two sources the
51
+ * artifact resolver uses.
52
+ *
53
+ * Read on every call rather than snapshotted, for the same reason: `reticle link` can run in
54
+ * another terminal while this daemon is up, and a startup snapshot would keep that repo silent
55
+ * until somebody restarted a process they have no reason to suspect.
56
+ *
57
+ * Returns directories that MIGHT be linked; the caller resolves each and skips the ones that are
58
+ * not. Deciding that here would mean reading every cloud.json on every tick.
59
+ */
60
+ export declare function knownProjectRoots(): string[];
61
+ /** This project's platform credential (stored, else the env key), as the env the platform readers take. */
62
+ export declare const platformEnvFor: (root: string | undefined) => () => Promise<NodeJS.ProcessEnv>;
63
+ export declare const loadHarnessConfig: (root: string) => Promise<import("./features/harness/platform-config.js").PlatformModelConfig | undefined>;