@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
@@ -10,6 +10,12 @@ import type { ToolDeps } from '../../surface/tools/tool-kit.js';
10
10
  * is a false accusation rather than an error.
11
11
  */
12
12
  export declare function openSessionIntents(deps: ToolDeps, sessionId: string | undefined): Promise<Intent[]>;
13
+ /**
14
+ * A reader of the same ledger, its root resolved NOW. For a verdict drawn after its tab may have
15
+ * left: a checkout click that takes the page to another origin closes the session, and resolving the
16
+ * root then refused the whole call with "names no session" instead of grading what was seen.
17
+ */
18
+ export declare function ledgerFor(deps: ToolDeps, sessionId: string | undefined): () => Promise<Intent[]>;
13
19
  /**
14
20
  * EVERY intent in the ledger, proved ones included — the denominator the open list is a subset of.
15
21
  *
@@ -10,7 +10,16 @@ import { sessionRoot } from '../project/session-root.js';
10
10
  * is a false accusation rather than an error.
11
11
  */
12
12
  export async function openSessionIntents(deps, sessionId) {
13
- return new IntentStore(deps.fs, sessionRoot(deps, sessionId), { now: deps.now }).open();
13
+ return ledgerFor(deps, sessionId)();
14
+ }
15
+ /**
16
+ * A reader of the same ledger, its root resolved NOW. For a verdict drawn after its tab may have
17
+ * left: a checkout click that takes the page to another origin closes the session, and resolving the
18
+ * root then refused the whole call with "names no session" instead of grading what was seen.
19
+ */
20
+ export function ledgerFor(deps, sessionId) {
21
+ const root = sessionRoot(deps, sessionId);
22
+ return () => new IntentStore(deps.fs, root, { now: deps.now }).open();
14
23
  }
15
24
  /**
16
25
  * EVERY intent in the ledger, proved ones included — the denominator the open list is a subset of.
@@ -0,0 +1,24 @@
1
+ import type { IntentShardStore } from './intent-shard-store.js';
2
+ import { IntentStatus } from './intent-shard.js';
3
+ /**
4
+ * One settled disagreement: the words kept, the words set aside, and who chose — or, with no words
5
+ * set aside, the status the team settled on the kept words.
6
+ */
7
+ export interface SettledWords {
8
+ kept: string;
9
+ setAside?: string;
10
+ by?: string;
11
+ status?: IntentStatus;
12
+ /** The file the platform holds for the kept words; a record re-sent without it erased it there. */
13
+ file?: string;
14
+ }
15
+ /** The settled disagreements in the platform's memory entries, read defensively. */
16
+ export declare function settledWordsIn(entries: readonly unknown[]): SettledWords[];
17
+ /** Apply them to the local records; returns how many records changed. */
18
+ export declare function applySettledWords(store: IntentShardStore, settled: readonly SettledWords[]): Promise<number>;
19
+ /**
20
+ * The agent's recorded request, with each statement a decision set aside replaced by the words kept:
21
+ * a run reports it as "What was asked", and the run that proved the kept words showed the rejected
22
+ * ones as its goal. Never throws; no request, nothing to change.
23
+ */
24
+ export declare function keptWordsInRequest(path: string, settled: readonly SettledWords[]): Promise<void>;
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Decisions made on the dashboard, brought down to the record of the person whose words were set
3
+ * aside.
4
+ *
5
+ * A maintainer settled a disagreement by keeping the team's words; the author's own record still
6
+ * said hers, agreed, and her daemon re-sent it every minute, so the same decision was made three
7
+ * times. The platform returns each memory entry with the decisions taken on it; a local record
8
+ * whose statement one of them set aside takes the words that were kept, and says who decided.
9
+ */
10
+ import { readFile, writeFile } from 'node:fs/promises';
11
+ import { asRecord, asString } from '@reticlehq/core';
12
+ import { IntentStatus } from './intent-shard.js';
13
+ /** How settled each status is; a record is only ever raised along it, never lowered. */
14
+ const RANK = {
15
+ [IntentStatus.PROPOSED]: 0,
16
+ [IntentStatus.AGREED]: 1,
17
+ [IntentStatus.PROVED]: 2,
18
+ [IntentStatus.STALE]: 1,
19
+ };
20
+ /** A status the platform settled, read defensively; proposed settles nothing. */
21
+ const settledStatus = (value) => [IntentStatus.AGREED, IntentStatus.PROVED, IntentStatus.STALE].find((s) => s === value);
22
+ const str = (value) => {
23
+ const text = asString(value);
24
+ return text === undefined || 0 === text.length ? undefined : text;
25
+ };
26
+ /** The settled disagreements in the platform's memory entries, read defensively. */
27
+ export function settledWordsIn(entries) {
28
+ return entries.flatMap((raw) => {
29
+ const entry = asRecord(raw);
30
+ const kept = str(entry['statement']);
31
+ const decisions = entry['decisions'];
32
+ const status = settledStatus(entry['status']);
33
+ const file = str(entry['sourceFile']);
34
+ if (kept === undefined)
35
+ return [];
36
+ const settled = status === undefined ? [] : [{ kept, status }];
37
+ if (!Array.isArray(decisions))
38
+ return settled;
39
+ return decisions
40
+ .flatMap((d) => {
41
+ const setAside = str(asRecord(asRecord(d)['setAside'])['statement']);
42
+ const by = str(asRecord(d)['byEmail']);
43
+ return setAside === undefined || setAside === kept
44
+ ? []
45
+ : [
46
+ {
47
+ kept,
48
+ setAside,
49
+ ...(by === undefined ? {} : { by }),
50
+ ...(file === undefined ? {} : { file }),
51
+ },
52
+ ];
53
+ })
54
+ .concat(settled);
55
+ });
56
+ }
57
+ /** Where the record's words now come from. */
58
+ const decidedBy = (by) => `decided on the dashboard${by === undefined ? '' : ` by ${by}`}`;
59
+ /** Apply them to the local records; returns how many records changed. */
60
+ export async function applySettledWords(store, settled) {
61
+ if (0 === settled.length)
62
+ return 0;
63
+ let changed = 0;
64
+ for (const record of await store.all()) {
65
+ // The team settled these very words: the record takes that status, so this machine never
66
+ // re-sends them as proposed and undoes the decision. Raised only, never lowered.
67
+ const status = settled.find((s) => s.status !== undefined && s.kept === record.statement)?.status;
68
+ if (status !== undefined && RANK[status] > RANK[record.status]) {
69
+ const raised = await store.upsert(record.id, (existing) => existing, {
70
+ status,
71
+ source: decidedBy(undefined),
72
+ });
73
+ if (raised?.status === status)
74
+ changed += 1;
75
+ continue;
76
+ }
77
+ const decision = settled.find((s) => s.setAside === record.statement);
78
+ if (decision === undefined)
79
+ continue;
80
+ const next = await store.upsert(record.id, (existing) =>
81
+ // The check bound to the words set aside proves nothing about the words kept.
82
+ existing === undefined
83
+ ? undefined
84
+ : {
85
+ ...withoutBinding(existing),
86
+ statement: decision.kept,
87
+ // The files were the set-aside words'; the kept words carry the platform's.
88
+ surface: {
89
+ ...existing.surface,
90
+ files: decision.file === undefined ? [] : [decision.file],
91
+ },
92
+ }, { source: decidedBy(decision.by) });
93
+ if (next?.statement === decision.kept)
94
+ changed += 1;
95
+ }
96
+ return changed;
97
+ }
98
+ /** A record with its bound check taken off: the words it was bound to were set aside. */
99
+ function withoutBinding(record) {
100
+ const { binding: _dropped, ...rest } = record;
101
+ return rest;
102
+ }
103
+ /**
104
+ * The agent's recorded request, with each statement a decision set aside replaced by the words kept:
105
+ * a run reports it as "What was asked", and the run that proved the kept words showed the rejected
106
+ * ones as its goal. Never throws; no request, nothing to change.
107
+ */
108
+ export async function keptWordsInRequest(path, settled) {
109
+ const decided = settled.filter((s) => s.setAside !== undefined);
110
+ if (0 === decided.length)
111
+ return;
112
+ try {
113
+ const raw = JSON.parse(await readFile(path, 'utf8'));
114
+ const statements = Array.isArray(raw['statements']) ? raw['statements'] : [];
115
+ let changed = false;
116
+ const next = statements.map((s) => {
117
+ const statement = asRecord(s);
118
+ const kept = decided.find((d) => d.setAside === statement['text'])?.kept;
119
+ if (kept === undefined)
120
+ return s;
121
+ changed = true;
122
+ return { ...statement, text: kept };
123
+ });
124
+ if (changed)
125
+ await writeFile(path, `${JSON.stringify({ ...raw, statements: next }, null, 2)}\n`);
126
+ }
127
+ catch {
128
+ // No request recorded, or one this cannot read: nothing to correct.
129
+ }
130
+ }
@@ -19,6 +19,8 @@ export interface TapeStep {
19
19
  endPage?: string;
20
20
  /** The intent the agent declared on this action. The first one names the journey. */
21
21
  intent?: string;
22
+ /** Recorder-internal: network mocks were active when it ran (#1459). Never written to disk. */
23
+ mocked?: true;
22
24
  }
23
25
  /** The compiled shape a flow store accepts. Structural, for the same reason as `TapeStep`. */
24
26
  export interface DriveProgram {
@@ -56,6 +58,13 @@ export declare const DRIVE_FLOW_PREFIX = "drive-";
56
58
  * see FlowStore.saveJourney.
57
59
  */
58
60
  export declare function driveFlowName(route?: string, steps?: readonly TapeStep[]): FlowName;
61
+ /** Why session end saved no flow, as reported on the `flow_recorded` step. */
62
+ export declare const DriveFlowSkipReason: {
63
+ /** The drive declared no consequence, so a saved flow could never go red. */
64
+ readonly NO_DECLARED_CONSEQUENCE: "no_declared_consequence";
65
+ /** What it proved rested on network mocks the flow would not carry (#1459). */
66
+ readonly DRIVEN_UNDER_NETWORK_MOCKS: "driven_under_network_mocks";
67
+ };
59
68
  export interface DriveFlowOutcome {
60
69
  /** The flows that were written — one per journey the session contained. */
61
70
  readonly saved?: readonly string[];
@@ -68,6 +77,13 @@ export interface DriveFlowOutcome {
68
77
  * "the agent drove and proved nothing" stays visible instead of looking like nothing happened.
69
78
  */
70
79
  readonly unprovenSteps?: number;
80
+ /**
81
+ * Steps of journeys that proved something and were NOT saved because they ran while network
82
+ * mocks were active (#1459). Such a journey replays against the real backend, so it either fails
83
+ * for a reason unrelated to the change or passes on data the original check never saw, and the
84
+ * flow file holds no trace of the precondition. Counted, so "not saved" has a reason.
85
+ */
86
+ readonly mockedSteps?: number;
71
87
  }
72
88
  /** A flow per journey, so two journeys in one session are two regression tests rather than one. */
73
89
  export declare function driveFlowsFrom(tape: {
@@ -87,6 +87,13 @@ export function driveFlowName(route, steps = []) {
87
87
  const parts = [lead, ...('' !== why || 0 === leg.length ? [] : [leg])].filter((p) => '' !== p);
88
88
  return asFlowName(`${DRIVE_FLOW_PREFIX}${0 === parts.length ? 'journey' : parts.join('-')}`);
89
89
  }
90
+ /** Why session end saved no flow, as reported on the `flow_recorded` step. */
91
+ export const DriveFlowSkipReason = {
92
+ /** The drive declared no consequence, so a saved flow could never go red. */
93
+ NO_DECLARED_CONSEQUENCE: 'no_declared_consequence',
94
+ /** What it proved rested on network mocks the flow would not carry (#1459). */
95
+ DRIVEN_UNDER_NETWORK_MOCKS: 'driven_under_network_mocks',
96
+ };
90
97
  /**
91
98
  * Turn this session's ambient tape into a flow, when it is worth one.
92
99
  *
@@ -143,24 +150,48 @@ function typesASecret(step) {
143
150
  const field = QueryBy.TESTID === by ? step.args['value'] : step.args['name'];
144
151
  return 'string' === typeof field && defaultIsSensitiveKey(field);
145
152
  }
153
+ /**
154
+ * The tape without the attempts an agent made again. An action that declared nothing, followed at
155
+ * once by the same action on the same control that did, is a retry: saved, the flow clicked sign-in
156
+ * twice, the second click found no form, and every replay of it failed. A step repeated with the
157
+ * same declaration both times (a double submit on purpose) is two steps, and stays two.
158
+ */
159
+ function withoutRetries(steps) {
160
+ return steps.filter((step, i) => {
161
+ const next = steps[i + 1];
162
+ if (next === undefined || step.expect !== undefined || next.expect === undefined)
163
+ return true;
164
+ // Tried again where it was tried: a page later it is a step of the journey, not a retry.
165
+ if (step.route !== next.route || step.page !== next.page || step.mocked !== next.mocked)
166
+ return true;
167
+ const { expect: _declared, ...again } = next.args;
168
+ const { expect: _none, ...first } = step.args;
169
+ return step.tool !== next.tool || JSON.stringify(first) !== JSON.stringify(again);
170
+ });
171
+ }
146
172
  /** A flow per journey, so two journeys in one session are two regression tests rather than one. */
147
173
  export function driveFlowsFrom(tape) {
148
174
  if (tape === undefined || 0 === tape.steps.length)
149
175
  return { programs: [], outcome: {} };
150
176
  const programs = [];
151
177
  let unproven = 0;
152
- for (const segment of segmentsByRoute(tape.steps)) {
178
+ let mocked = 0;
179
+ for (const segment of segmentsByRoute(withoutRetries(tape.steps))) {
153
180
  if (!carriesAnAssertion(segment.steps)) {
154
181
  unproven += segment.steps.length;
155
182
  continue;
156
183
  }
184
+ if (segment.steps.some((step) => true === step.mocked)) {
185
+ mocked += segment.steps.length;
186
+ continue;
187
+ }
157
188
  const startPath = segment.route ?? tape.startPath;
158
189
  programs.push({
159
190
  name: driveFlowName(startPath, segment.steps),
160
191
  version: REPLAY_PROGRAM_VERSION,
161
192
  // The route is recorder-internal and has no business on disk — `startPath` is where the
162
193
  // on-disk flow says the same thing, in the field replay actually reads.
163
- steps: segment.steps.map(({ route: _route, ...step }) => step),
194
+ steps: segment.steps.map(({ route: _route, mocked: _mocked, ...step }) => step),
164
195
  ...(startPath === undefined ? {} : { startPath }),
165
196
  });
166
197
  }
@@ -169,6 +200,7 @@ export function driveFlowsFrom(tape) {
169
200
  outcome: {
170
201
  ...(0 === programs.length ? {} : { saved: programs.map((p) => p.name) }),
171
202
  ...(0 === unproven ? {} : { unprovenSteps: unproven }),
203
+ ...(0 === mocked ? {} : { mockedSteps: mocked }),
172
204
  },
173
205
  };
174
206
  }
@@ -26,6 +26,8 @@ export interface FlushableSession {
26
26
  export interface DriveRunFlushDeps<S extends FlushableSession> {
27
27
  /** Find the live session a verdict came from, or undefined when it has already gone. */
28
28
  resolve: (sessionId: string) => S | undefined;
29
+ /** Every live session: a Harness note rewrites them all, since it does not say which tab drove. */
30
+ all?: () => readonly S[];
29
31
  /** Write this session's run artifact. The same call teardown makes. */
30
32
  write: (session: S) => Promise<void>;
31
33
  /** Injected so the test does not wait three real seconds. */
@@ -20,8 +20,9 @@
20
20
  * the last verdicts of a session are the ones somebody is waiting on.
21
21
  */
22
22
  import { HookEvent } from '@reticlehq/core/hooks';
23
- import { onHook } from '../../hooks/hook-bus.js';
23
+ import { onHook, onPendingWrites } from '../../hooks/hook-bus.js';
24
24
  import { log } from '../../log.js';
25
+ import { onHarnessNoted } from '../../judgement/runs/drive-run.js';
25
26
  /** Long enough to collapse a burst of verdicts, short enough that a human reads it as "live". */
26
27
  const FLUSH_DEBOUNCE_MS = 3_000;
27
28
  /**
@@ -55,10 +56,7 @@ export function attachDriveRunFlush(deps) {
55
56
  log(`drive run flush failed: ${message}`);
56
57
  }
57
58
  };
58
- const off = onHook(HookEvent.VERDICT, (payload) => {
59
- const sessionId = 'sessionId' in payload ? payload.sessionId : undefined;
60
- if (sessionId === undefined)
61
- return;
59
+ const schedule = (sessionId) => {
62
60
  const existing = pending.get(sessionId);
63
61
  if (existing !== undefined)
64
62
  clearTimeout(existing);
@@ -69,11 +67,28 @@ export function attachDriveRunFlush(deps) {
69
67
  // obligation, and holding the process open for it would make `reticle` feel broken on exit.
70
68
  timer.unref?.();
71
69
  pending.set(sessionId, timer);
70
+ };
71
+ const off = onHook(HookEvent.VERDICT, (payload) => {
72
+ const sessionId = 'sessionId' in payload ? payload.sessionId : undefined;
73
+ if (sessionId !== undefined)
74
+ schedule(sessionId);
72
75
  });
76
+ // A Harness drive is graded after its last verdict: rewrite the runs so the grade reaches them.
77
+ // ponytail: every live session, since a note names a drive, not a tab; drives end rarely.
78
+ const offNoted = onHarnessNoted(() => {
79
+ for (const session of deps.all?.() ?? [])
80
+ schedule(session.id);
81
+ });
82
+ const flushAll = async () => {
83
+ await Promise.all([...pending.keys()].map(flush));
84
+ };
85
+ const unregister = onPendingWrites(flushAll);
73
86
  return {
74
87
  flushNow: flush,
75
88
  stop: () => {
76
89
  off();
90
+ unregister();
91
+ offNoted();
77
92
  for (const timer of pending.values())
78
93
  clearTimeout(timer);
79
94
  pending.clear();
@@ -113,13 +113,13 @@ export declare const RouteEnvelopeSchema: z.ZodObject<{
113
113
  m2: number;
114
114
  max: number;
115
115
  };
116
- netErrors: {
116
+ consoleErrors: {
117
117
  count: number;
118
118
  mean: number;
119
119
  m2: number;
120
120
  max: number;
121
121
  };
122
- consoleErrors: {
122
+ netErrors: {
123
123
  count: number;
124
124
  mean: number;
125
125
  m2: number;
@@ -138,13 +138,13 @@ export declare const RouteEnvelopeSchema: z.ZodObject<{
138
138
  m2: number;
139
139
  max: number;
140
140
  };
141
- netErrors: {
141
+ consoleErrors: {
142
142
  count: number;
143
143
  mean: number;
144
144
  m2: number;
145
145
  max: number;
146
146
  };
147
- consoleErrors: {
147
+ netErrors: {
148
148
  count: number;
149
149
  mean: number;
150
150
  m2: number;
@@ -167,13 +167,13 @@ export declare const RouteEnvelopeSchema: z.ZodObject<{
167
167
  m2: number;
168
168
  max: number;
169
169
  };
170
- netErrors: {
170
+ consoleErrors: {
171
171
  count: number;
172
172
  mean: number;
173
173
  m2: number;
174
174
  max: number;
175
175
  };
176
- consoleErrors: {
176
+ netErrors: {
177
177
  count: number;
178
178
  mean: number;
179
179
  m2: number;
@@ -196,13 +196,13 @@ export declare const RouteEnvelopeSchema: z.ZodObject<{
196
196
  m2: number;
197
197
  max: number;
198
198
  };
199
- netErrors: {
199
+ consoleErrors: {
200
200
  count: number;
201
201
  mean: number;
202
202
  m2: number;
203
203
  max: number;
204
204
  };
205
- consoleErrors: {
205
+ netErrors: {
206
206
  count: number;
207
207
  mean: number;
208
208
  m2: number;
@@ -1,5 +1,7 @@
1
- import { EventAttribution, JOURNAL_FILE_VERSION, } from '@reticlehq/core';
1
+ import { ActionType, EventAttribution, REDACTED_VALUE, JOURNAL_FILE_VERSION, } from '@reticlehq/core';
2
2
  import { isSelfObservation } from './self-observation.js';
3
+ import { currentDrivenBy } from '../../hooks/driven-by.js';
4
+ import { callerClientName } from '../../hooks/coding-agents.js';
3
5
  import { log } from '../../log.js';
4
6
  /**
5
7
  * Logged the FIRST time a journal write is lost, and never again for that recorder.
@@ -12,6 +14,36 @@ import { log } from '../../log.js';
12
14
  * produce one line per batch.
13
15
  */
14
16
  const JOURNAL_WRITE_LOST = 'journal_write_lost';
17
+ /** The actions whose arguments carry what was typed. */
18
+ const TYPING_ACTIONS = new Set([ActionType.FILL, ActionType.TYPE]);
19
+ const TYPED_KEYS = ['value', 'text'];
20
+ /**
21
+ * The arguments as the journal keeps them: every typed value replaced, at any depth (a sequence's
22
+ * steps too). A fill's arguments kept a typed password in clear in `actions.jsonl`; the page cannot
23
+ * tell the daemon which field was secret before the call is written, and nothing reads a typed value
24
+ * back from the journal — the run fold reads the ref, the target and the action — so none is kept.
25
+ */
26
+ function withoutTypedInput(args) {
27
+ if (Array.isArray(args))
28
+ return args.map(withoutTypedInput);
29
+ if ('object' !== typeof args || null === args)
30
+ return args;
31
+ const record = args;
32
+ const typing = TYPING_ACTIONS.has(String(record['action']));
33
+ const out = {};
34
+ for (const [key, value] of Object.entries(record)) {
35
+ const typed = typing && TYPED_KEYS.includes(key) && 'string' === typeof value;
36
+ out[key] = typed ? REDACTED_VALUE : withoutTypedInput(value);
37
+ }
38
+ if (typing && 'object' === typeof record['args'] && null !== record['args']) {
39
+ const inner = { ...record['args'] };
40
+ for (const key of TYPED_KEYS)
41
+ if ('string' === typeof inner[key])
42
+ inner[key] = REDACTED_VALUE;
43
+ out['args'] = inner;
44
+ }
45
+ return out;
46
+ }
15
47
  const DEFAULT_FLUSH_AT = 64;
16
48
  /**
17
49
  * Owns action-window attribution and batched, order-preserving journaling — the durable half of the
@@ -65,7 +97,14 @@ export class JournalRecorder {
65
97
  }
66
98
  /** Open an attribution window. One action is active at a time (the agent drives sequentially). */
67
99
  beginAction(actionId, tool, args) {
68
- this.#active = { actionId, tool, args, tStart: this.#now() };
100
+ this.#active = {
101
+ actionId,
102
+ tool,
103
+ args: withoutTypedInput(args),
104
+ tStart: this.#now(),
105
+ drivenBy: currentDrivenBy(),
106
+ agent: callerClientName(),
107
+ };
69
108
  }
70
109
  /** Close the active window: persist its buffered events, then the action record. No-op if none active. */
71
110
  finishAction(effect, settled, settledInMs) {
@@ -86,6 +125,8 @@ export class JournalRecorder {
86
125
  : { from: active.seqFrom, to: active.seqTo },
87
126
  tRange: { from: active.tStart, to: this.#now() },
88
127
  at: active.tStart,
128
+ ...(active.drivenBy === undefined ? {} : { drivenBy: active.drivenBy }),
129
+ ...(active.agent === undefined ? {} : { agent: active.agent }),
89
130
  };
90
131
  this.#enqueueFlush();
91
132
  this.#chain = this.#chain
@@ -115,7 +156,7 @@ export class JournalRecorder {
115
156
  v: JOURNAL_FILE_VERSION,
116
157
  actionId,
117
158
  tool,
118
- args,
159
+ args: withoutTypedInput(args),
119
160
  effect,
120
161
  // No window was opened, so no event carries this id: `seqRange` is omitted rather than
121
162
  // invented, because any range here would claim an attribution that never happened. `tRange` is
@@ -123,6 +164,14 @@ export class JournalRecorder {
123
164
  // of zero, which is exactly how much time this action attributed events over.
124
165
  tRange: { from: at, to: at },
125
166
  at,
167
+ ...(() => {
168
+ const by = currentDrivenBy();
169
+ return by === undefined ? {} : { drivenBy: by };
170
+ })(),
171
+ ...(() => {
172
+ const agent = callerClientName();
173
+ return agent === undefined ? {} : { agent };
174
+ })(),
126
175
  };
127
176
  this.#enqueueFlush();
128
177
  this.#chain = this.#chain
@@ -11,6 +11,13 @@ export declare const DEFAULT_DIFF_RETENTION = 10;
11
11
  * for the one case where delivery was refused and somebody has to file the report by hand.
12
12
  */
13
13
  export declare const DEFAULT_FEEDBACK_RETENTION = 20;
14
+ /** Harness plans kept on disk: the platform keeps every one, this machine the recent ones. */
15
+ export declare const DEFAULT_PLAN_RETENTION = 50;
16
+ /**
17
+ * Keep the step screenshots of at most this many runs. A run's are looked at while it is fresh, or
18
+ * on the platform it was synced to; the byte budget below is what bounds a single long one.
19
+ */
20
+ export declare const DEFAULT_STEP_SHOT_RUN_RETENTION = 50;
14
21
  /**
15
22
  * The TOTAL the evidence tier of one `.reticle/` may occupy, across sessions, runs, overlay diffs
16
23
  * and feedback copies together.
@@ -141,5 +148,6 @@ export declare function pruneEvidenceBudget(fs: FileSystemPort, root: string, bu
141
148
  * Capped from here rather than from the writer, which lives in an area this file does not own. A
142
149
  * retention rule is the same rule whether the directory holds journals, diffs or reports.
143
150
  */
151
+ export declare function prunePlans(fs: FileSystemPort, root: string, retention?: number): Promise<void>;
144
152
  export declare function pruneFeedback(fs: FileSystemPort, root: string, retention?: number): Promise<void>;
145
153
  export {};
@@ -1,5 +1,5 @@
1
1
  import { basename, join } from 'node:path';
2
- import { ReticleDir } from '@reticlehq/core';
2
+ import { ReticleDir, STEP_SCREENSHOT } from '@reticlehq/core';
3
3
  import { reticleDirPaths, visualDir } from '../../project/dir/reticle-dir.js';
4
4
  import { EVIDENCE_DIRS } from './workspace-tiers.js';
5
5
  /** Keep at most this many session journals on disk; older ones are pruned by recency. */
@@ -14,6 +14,13 @@ export const DEFAULT_DIFF_RETENTION = 10;
14
14
  * for the one case where delivery was refused and somebody has to file the report by hand.
15
15
  */
16
16
  export const DEFAULT_FEEDBACK_RETENTION = 20;
17
+ /** Harness plans kept on disk: the platform keeps every one, this machine the recent ones. */
18
+ export const DEFAULT_PLAN_RETENTION = 50;
19
+ /**
20
+ * Keep the step screenshots of at most this many runs. A run's are looked at while it is fresh, or
21
+ * on the platform it was synced to; the byte budget below is what bounds a single long one.
22
+ */
23
+ export const DEFAULT_STEP_SHOT_RUN_RETENTION = 50;
17
24
  const DIFF_SUFFIX = '.diff.png';
18
25
  const PNG_SUFFIX = '.png';
19
26
  /**
@@ -171,7 +178,12 @@ export async function pruneVisualDiffs(fs, root, retention = DEFAULT_DIFF_RETENT
171
178
  for (const dir of await visualDirs(fs, root)) {
172
179
  await pruneByRecency(fs, dir, retention, isDiff);
173
180
  }
181
+ // Step screenshots are evidence of one run each, read in the minutes after it or synced with it;
182
+ // the oldest runs' directories go whole.
183
+ await pruneByRecency(fs, stepShotRunsDir(root), DEFAULT_STEP_SHOT_RUN_RETENTION);
174
184
  }
185
+ /** `visual/runs/`, the parent of every run's step screenshots. */
186
+ const stepShotRunsDir = (root) => join(root, ReticleDir.VISUAL_SUBDIR, STEP_SCREENSHOT.RUNS_DIR);
175
187
  /** `visual/` plus its per-runtime subdirectories. Empty when nothing has been captured yet. */
176
188
  async function visualDirs(fs, root) {
177
189
  const top = visualDir(root);
@@ -179,7 +191,8 @@ async function visualDirs(fs, root) {
179
191
  try {
180
192
  // A per-runtime subdirectory is anything here that is not itself a PNG.
181
193
  for (const entry of await fs.readdir(top)) {
182
- if (!entry.endsWith(PNG_SUFFIX))
194
+ // `runs/` holds step screenshots, not baselines, and is bounded on its own.
195
+ if (!entry.endsWith(PNG_SUFFIX) && STEP_SCREENSHOT.RUNS_DIR !== entry)
183
196
  dirs.push(join(top, entry));
184
197
  }
185
198
  }
@@ -228,6 +241,20 @@ async function collectEvidence(fs, root) {
228
241
  for (const under of EVIDENCE_DIRS) {
229
242
  const isVisual = ReticleDir.VISUAL_SUBDIR === under;
230
243
  const dirs = isVisual ? await visualDirs(fs, root) : [join(root, under)];
244
+ // Each run's step screenshots are one evidence entry, evicted whole, oldest first.
245
+ if (isVisual) {
246
+ const runs = stepShotRunsDir(root);
247
+ for (const name of await fs.readdir(runs).catch(() => [])) {
248
+ const path = join(runs, name);
249
+ try {
250
+ const { mtimeMs } = await fs.stat(path);
251
+ entries.push({ path, under, sizeBytes: await sizeOf(fs, path), mtimeMs });
252
+ }
253
+ catch {
254
+ /* unreadable entry — skip */
255
+ }
256
+ }
257
+ }
231
258
  for (const dir of dirs) {
232
259
  let names;
233
260
  try {
@@ -287,6 +314,9 @@ export async function pruneEvidenceBudget(fs, root, budgetBytes = DEFAULT_EVIDEN
287
314
  * Capped from here rather than from the writer, which lives in an area this file does not own. A
288
315
  * retention rule is the same rule whether the directory holds journals, diffs or reports.
289
316
  */
317
+ export async function prunePlans(fs, root, retention = DEFAULT_PLAN_RETENTION) {
318
+ await pruneByRecency(fs, join(root, ReticleDir.PLANS_SUBDIR), retention);
319
+ }
290
320
  export async function pruneFeedback(fs, root, retention = DEFAULT_FEEDBACK_RETENTION) {
291
321
  await pruneByRecency(fs, join(root, ReticleDir.FEEDBACK_SUBDIR), retention);
292
322
  }
@@ -1,4 +1,4 @@
1
- import { pruneEvidenceBudget, pruneFeedback, pruneSessions, pruneVisualDiffs, } from './retention.js';
1
+ import { pruneEvidenceBudget, pruneFeedback, prunePlans, pruneSessions, pruneVisualDiffs, } from './retention.js';
2
2
  import { DEFAULT_RETAIN } from './retain-policy.js';
3
3
  export async function pruneWorkspace(fs, root, live, options = {}) {
4
4
  const retain = { ...DEFAULT_RETAIN, ...options };
@@ -9,6 +9,8 @@ export async function pruneWorkspace(fs, root, live, options = {}) {
9
9
  await pruneVisualDiffs(fs, root, retain.visual);
10
10
  // Write-only local copies of reports the outbox already carries.
11
11
  await pruneFeedback(fs, root, retain.feedback);
12
+ // The recent plans are what somebody reads back; the platform holds every one.
13
+ await prunePlans(fs, root);
12
14
  // LAST, and the one that was missing: the only bound that limits SIZE rather than count.
13
15
  await pruneEvidenceBudget(fs, root, retain.budgetBytes, live);
14
16
  }
@@ -45,6 +45,8 @@ export const WORKSPACE_TIERS = {
45
45
  [ReticleDir.VISUAL_SUBDIR]: localDir,
46
46
  // Write-only: a local copy of what was already sent. The outbox is the record.
47
47
  [ReticleDir.FEEDBACK_SUBDIR]: localDir,
48
+ // What the Harness planned on this machine, and how it went. The platform keeps the team's copy.
49
+ [ReticleDir.PLANS_SUBDIR]: localDir,
48
50
  [ReticleDir.PROJECT_FILE]: localFile,
49
51
  [ReticleDir.AMBIENT_FILE]: localFile,
50
52
  [ReticleDir.ENVELOPES_FILE]: localFile,
@@ -52,6 +54,13 @@ export const WORKSPACE_TIERS = {
52
54
  // What THIS machine's drives covered, and the best each level reached — the gate's ratchet.
53
55
  [ReticleDir.COVERAGE_FILE]: localFile,
54
56
  [ReticleDir.TIERS_FILE]: localFile,
57
+ // The user's request in their own words: it leaves only with `shareRequests`, never by git push.
58
+ [ReticleDir.REQUEST_FILE]: localFile,
59
+ // How to target this app, learned from corrected failures: a teammate's agent needs it too.
60
+ [ReticleDir.APP_NOTES_FILE]: sharedFile,
61
+ [ReticleDir.PLATFORM_MOMENTS_FILE]: localFile,
62
+ // Notes a human pinned in the HUD: free text about the page. The team reads them on the platform.
63
+ [ReticleDir.NOTES_FILE]: localFile,
55
64
  // The user's own record of what Reticle did for them, on THIS machine.
56
65
  [ReticleDir.IMPACT_FILE]: localFile,
57
66
  // This machine's conversation with the server. Its own doc comment says why committing it is
@@ -72,10 +81,6 @@ export const WORKSPACE_TIERS = {
72
81
  // credential, so it is safe to commit — the same reasoning that puts `cloud.json` here while its
73
82
  // API key stays in ~/.reticle.
74
83
  [ReticleDir.HOOKS_FILE]: sharedFile,
75
- // What a drive types into each labelled field. Committed for two reasons: a replay must send
76
- // exactly what the recording sent or it is not a replay, and a value a model wrote once should be
77
- // reviewable and editable by the team rather than regenerated differently on every machine.
78
- [ReticleDir.FILL_VALUES_FILE]: sharedFile,
79
84
  };
80
85
  function namesWhere(match) {
81
86
  return Object.entries(WORKSPACE_TIERS)