@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
@@ -6,6 +6,8 @@ import { openSessionIntents } from '../../memory/intent/open-intents.js';
6
6
  import { ReticleTool } from '@reticlehq/core';
7
7
  import { sessionIdShape } from '../../surface/tools/tool-kit.js';
8
8
  import { asString } from '@reticlehq/core';
9
+ import { resumeFromDisk, resumeLines } from './resume.js';
10
+ import { sessionRoot } from '../../memory/project/session-root.js';
9
11
  /**
10
12
  * What this run has established, asked for by the one party that knows when it is needed.
11
13
  *
@@ -19,21 +21,30 @@ import { asString } from '@reticlehq/core';
19
21
  */
20
22
  /** What the run has established, and where each part of it came from. */
21
23
  const CONTEXT_OUTPUT_SCHEMA = {
24
+ resume: z
25
+ .string()
26
+ .optional()
27
+ .describe('Only with `compact: true`: the whole answer in under ~1k tokens — the tab and route, the request, every claim that FAILED or is NOT PROVED (by its latest verdict), what held, open intents, app notes and the rules. Read it after a compaction instead of trusting your summary.'),
22
28
  step: z
23
29
  .number()
30
+ .optional()
24
31
  .describe('How many actions this run has dispatched. Counted off the journal, not a counter of its own.'),
25
32
  established: z
26
33
  .array(z.unknown())
34
+ .optional()
27
35
  .describe('What Reticle OBSERVED, folded and capped, each `{ key, fact, source?, doc?, epoch? }`. `key` is the subject, so re-observing it supersedes rather than appends. Anything seen under a replaced document or a pre-edit epoch is already gone from this list.'),
28
36
  proven: z
29
37
  .array(z.unknown())
38
+ .optional()
30
39
  .describe('Claims a verdict already settled, each `{ claim, verified, source?, doc?, epoch? }`. Read this before re-driving something: re-proving it is slow, and assuming it is a false green.'),
31
40
  gap: z
32
41
  .object({})
33
42
  .passthrough()
43
+ .optional()
34
44
  .describe('The distance between what was claimed and what held, over THIS session: `{ claims, held, failed, undecided, nothingToProve, undecidedBy, falseGreensCaught, failures }`. `undecidedBy` says WHO can act on each unknown — environment (wait), code (fix the app), harness (fix Reticle or the call), could-not-see (look again). Folded from the same journal as everything else here, so it cannot disagree with it.'),
35
45
  remaining: z
36
46
  .array(z.string())
47
+ .optional()
37
48
  .describe('The intents from .reticle/intent/ that no verdict has discharged. Derived from the ledger, never a guess at what you meant to do next.'),
38
49
  };
39
50
  /** The ledger and the live page state this run is folded out of. `[]`/undefined when nothing is connected. */
@@ -59,16 +70,63 @@ async function evidenceFor(deps, sessionId) {
59
70
  };
60
71
  }
61
72
  }
73
+ /** The resume block for the live session, or the newest one on disk when none is connected. */
74
+ async function resumeFor(deps, sessionId, actions) {
75
+ let live;
76
+ try {
77
+ const session = deps.sessions.resolve(sessionId);
78
+ live = { id: session.id, url: session.url, cursor: session.elapsed() };
79
+ }
80
+ catch {
81
+ live = undefined;
82
+ }
83
+ let root;
84
+ try {
85
+ root = sessionRoot(deps, live?.id);
86
+ }
87
+ catch {
88
+ // No project can be named for this call: the live journal is all there is to fold.
89
+ return resumeLines({ actions, openIntents: [], notes: [] });
90
+ }
91
+ return resumeFromDisk({
92
+ root,
93
+ now: deps.now(),
94
+ fs: deps.fs,
95
+ // The live journal; with nothing connected there is no live one to fold, and the CLI's
96
+ // `reticle context --compact` is the reader for a session that has gone.
97
+ readActions: () => Promise.resolve(actions),
98
+ ...(live === undefined
99
+ ? {}
100
+ : { sessionId: live.id, route: routeOf(live.url), cursor: live.cursor }),
101
+ });
102
+ }
103
+ /** The path of a page URL, or the URL as given. */
104
+ function routeOf(url) {
105
+ try {
106
+ return new URL(url).pathname;
107
+ }
108
+ catch {
109
+ return url;
110
+ }
111
+ }
62
112
  export const CONTEXT_TOOLS = [
63
113
  {
64
114
  name: ReticleTool.CONTEXT,
65
115
  description: 'What THIS run has already established, so you do not rediscover it. Call it when your own copy is gone: right after a compaction, at the top of a fresh sub-agent, or at the start of a turn you did not begin. Returns `established` (what Reticle OBSERVED, with the source file:line where one was reported), `proven` (claims a verdict already settled, so you neither re-prove them nor assume them) and `remaining` (the intents from .reticle/intent/ that nothing has discharged). It is a FOLD over the journal, never a second store, so it cannot disagree with the ledger. Bounded and superseding rather than accumulating, and anything observed under a replaced document or before your last source edit is already dropped rather than presented as current. Only what Reticle observed goes in: it never reports what you intended or believed.',
66
116
  example: {},
67
- inputSchema: { ...sessionIdShape },
117
+ inputSchema: {
118
+ compact: z
119
+ .boolean()
120
+ .optional()
121
+ .describe('After a compaction: one bounded `resume` text instead of the structured fold.'),
122
+ ...sessionIdShape,
123
+ },
68
124
  outputSchema: CONTEXT_OUTPUT_SCHEMA,
69
125
  handler: async (deps, args) => {
70
126
  const sessionId = asString(args['sessionId']);
71
127
  const evidence = await evidenceFor(deps, sessionId);
128
+ if (true === args['compact'])
129
+ return { resume: (await resumeFor(deps, sessionId, evidence.actions)).join('\n') };
72
130
  const context = runContextFor({
73
131
  ...evidence,
74
132
  intents: await openSessionIntents(deps, sessionId),
@@ -6,3 +6,6 @@ import { type RunId } from '@reticlehq/core';
6
6
  * flow-replay stack would be a cycle.
7
7
  */
8
8
  export declare function defaultRunId(): RunId;
9
+ export declare function withShotRun<T>(runId: string, fn: () => Promise<T>): Promise<T>;
10
+ /** The run being replayed now, or undefined outside a verify. */
11
+ export declare function currentShotRun(): string | undefined;
@@ -1,3 +1,4 @@
1
+ import { AsyncLocalStorage } from 'node:async_hooks';
1
2
  import { randomUUID } from 'node:crypto';
2
3
  import { asRunId } from '@reticlehq/core';
3
4
  /**
@@ -9,3 +10,18 @@ import { asRunId } from '@reticlehq/core';
9
10
  export function defaultRunId() {
10
11
  return asRunId(randomUUID());
11
12
  }
13
+ /**
14
+ * The run a replay's step screenshots belong to, carried across every await under it.
15
+ *
16
+ * A suite's run id used to be minted after its flows had replayed, so a screenshot taken during a
17
+ * step had no run to be filed under. The verify paths now mint the id first and run the replays
18
+ * inside it; a capture outside any of them belongs to the session's own drive run.
19
+ */
20
+ const current = new AsyncLocalStorage();
21
+ export function withShotRun(runId, fn) {
22
+ return current.run(runId, fn);
23
+ }
24
+ /** The run being replayed now, or undefined outside a verify. */
25
+ export function currentShotRun() {
26
+ return current.getStore();
27
+ }
@@ -22,9 +22,11 @@
22
22
  * outcome is four-valued now, so all four are recorded, and the run verdict counts an undetermined
23
23
  * check as neither a pass nor a failure -- which is what those words already meant everywhere else.
24
24
  */
25
- import { RunFramework, type JournalAction } from '@reticlehq/core';
25
+ import { RunFramework, type VerdictStatus, type JournalAction, type RunDisparity } from '@reticlehq/core';
26
26
  import type { VerificationRunInput } from './artifact/build-verification-run.js';
27
27
  export interface DriveRunDeps {
28
+ /** The project's folder name, for a tab that reported no project id. */
29
+ projectName?: string | undefined;
28
30
  runId: string;
29
31
  /** The project this session belonged to, for the dashboard's row. */
30
32
  projectId?: string | undefined;
@@ -38,7 +40,24 @@ export interface DriveRunDeps {
38
40
  * Absent when nobody was counting edits, which must not be reported as "the first round".
39
41
  */
40
42
  editEpoch?: number | undefined;
43
+ /** Where each agent session in the tab ended (`agentEndCounts`): each is folded on its own. */
44
+ agentEnds?: readonly number[];
45
+ /** What the agent claimed at each of those ends (`agentEndClaims`), by the same index. */
46
+ agentClaims?: readonly (VerdictStatus | undefined)[];
47
+ /** The agent's own claim for this run, carried beside the graded verdict. */
48
+ agentClaim?: VerdictStatus | undefined;
41
49
  }
50
+ /**
51
+ * What a verdict required and what it saw, as the journal keeps them for its check. One place, so
52
+ * the act and assert paths cannot keep different halves.
53
+ */
54
+ export declare function checkWords(verdict: {
55
+ expected?: string;
56
+ observed?: string;
57
+ }): {
58
+ expected?: string;
59
+ observed?: string;
60
+ };
42
61
  /**
43
62
  * The run id for a session's drive: stable, so the session rewrites its own row.
44
63
  *
@@ -52,6 +71,26 @@ export interface DriveRunDeps {
52
71
  * for that session rather than refusing to record it.
53
72
  */
54
73
  export declare function driveRunId(sessionId: string): string;
74
+ /** The run the agent's session now open in this tab is kept under. */
75
+ export declare function agentRunId(sessionId: string): string;
76
+ /**
77
+ * The run the current call lands in: the flow being replayed, else the Harness drive, else the
78
+ * agent session open in the tab. One answer for a call's screenshot and an intent its check proves.
79
+ */
80
+ export declare function runIdOfCall(sessionId: string): string;
81
+ /** The ends recorded for a tab, as counts of the agent's own actions, for the fold. */
82
+ export declare function agentEndCounts(sessionId: string): number[];
83
+ /** What the agent claimed at each end of a tab, by the index `agentEndCounts` uses. */
84
+ export declare function agentEndClaims(sessionId: string): (VerdictStatus | undefined)[];
85
+ /**
86
+ * An agent session ends: its own actions since the previous end, the run they are kept under, and
87
+ * how long it ran. Recorded, so what the agent drives next is the next session's.
88
+ */
89
+ export declare function endAgentSession(sessionId: string, actions: readonly JournalAction[], at: number | undefined, claim?: VerdictStatus): {
90
+ actions: JournalAction[];
91
+ runId: string;
92
+ wallMs?: number;
93
+ };
55
94
  /**
56
95
  * Fold a session's journal into a run, or return undefined when there is nothing honest to report.
57
96
  *
@@ -59,3 +98,34 @@ export declare function driveRunId(sessionId: string): string;
59
98
  * artifact are the caller's job, which is what keeps the verdict rules testable without a disk.
60
99
  */
61
100
  export declare function driveRunFrom(actions: readonly JournalAction[], deps: DriveRunDeps): VerificationRunInput | undefined;
101
+ /** What a Harness run says drove it, in the dashboard's "Driven by" line. */
102
+ export declare function harnessAgentId(driver: string): string;
103
+ /**
104
+ * The id of the run a Harness drive syncs as, so whoever started the drive can find it again (the
105
+ * platform's chat folds the run into the check it asked for). Undefined for an id no run can carry.
106
+ */
107
+ export declare function harnessRunId(harness: string): string | undefined;
108
+ /**
109
+ * Hear about every Harness note. A drive is graded after its last verdict, and the run that verdict
110
+ * flushed never carried the grade: live, the platform filed a failed check instead of "Hard to find".
111
+ */
112
+ export declare function onHarnessNoted(listener: () => void): () => void;
113
+ /**
114
+ * The drive's own measure of how long it ran. The span of one tab's journal is not it: a lane in a
115
+ * leased browser left only the grade's assert in the tab, and its run read "Took 0 ms".
116
+ */
117
+ export declare function noteHarnessSpan(harness: string, ms: number): void;
118
+ export declare function noteHarnessGoal(harness: string, met: boolean | undefined): void;
119
+ /**
120
+ * Noted when a drive is graded, like its goal: its run artifact carries the comparison, so the
121
+ * platform can file a goal the agent proved and the Harness could not find.
122
+ */
123
+ export declare function noteHarnessDisparity(harness: string, found: readonly RunDisparity[]): void;
124
+ /**
125
+ * Every run a session's journal holds: the connected agent's drive, and one per Harness drive.
126
+ *
127
+ * They used to be one. A Harness drive dispatches through the same tools in the same tab, so its
128
+ * verdicts folded into the agent's run, and the dashboard showed one blended row that credited the
129
+ * agent with what the Harness proved and named neither.
130
+ */
131
+ export declare function driveRunsFrom(actions: readonly JournalAction[], deps: DriveRunDeps): VerificationRunInput[];
@@ -22,19 +22,40 @@
22
22
  * outcome is four-valued now, so all four are recorded, and the run verdict counts an undetermined
23
23
  * check as neither a pass nor a failure -- which is what those words already meant everywhere else.
24
24
  */
25
+ import { supersededChecks } from '@reticlehq/engine/evidence/superseded-checks.js';
25
26
  import { isValidRunId } from '../../memory/project/dir/reticle-dir.js';
26
27
  import { defaultRunId } from './runner-port.js';
27
- import { JournalVerdictEffectSchema, RunAgentKind, RunFramework, RunProfile, RunTrigger, } from '@reticlehq/core';
28
+ import { currentShotRun } from './default-run-id.js';
29
+ import { currentDrivenBy } from '../../hooks/driven-by.js';
30
+ import { JournalVerdictEffectSchema, RunAgentKind, asRecord, asString, RunFramework, RunProfile, RunTrigger, PredicateKind, Verified, VerifiedReason, driveFlowStatus, } from '@reticlehq/core';
28
31
  import { withCorrections } from './late-answer.js';
29
32
  /** The author of record when no MCP peer introduced itself. Mirrors verification-sync's default. */
30
33
  const UNNAMED_AGENT = 'reticle-mcp';
34
+ /**
35
+ * The one MCP client every stamped action came from. Two clients in one tab is undefined, never a
36
+ * pick: crediting either would put the other's verdicts under its name.
37
+ */
38
+ function soleAgent(actions) {
39
+ const named = new Set(actions.flatMap((action) => (action.agent === undefined ? [] : [action.agent])));
40
+ return 1 === named.size ? [...named][0] : undefined;
41
+ }
42
+ /**
43
+ * What a verdict required and what it saw, as the journal keeps them for its check. One place, so
44
+ * the act and assert paths cannot keep different halves.
45
+ */
46
+ export function checkWords(verdict) {
47
+ return {
48
+ ...(verdict.expected === undefined ? {} : { expected: verdict.expected }),
49
+ ...(verdict.observed === undefined ? {} : { observed: verdict.observed }),
50
+ };
51
+ }
31
52
  /** Every verdict a verification tool recorded on this session's actions, in order. */
32
53
  function verdicts(actions) {
33
54
  const out = [];
34
55
  for (const action of actions) {
35
56
  const parsed = JournalVerdictEffectSchema.safeParse(action.effect);
36
57
  if (parsed.success)
37
- out.push(parsed.data);
58
+ out.push({ ...parsed.data, actionId: action.actionId });
38
59
  }
39
60
  return out;
40
61
  }
@@ -66,6 +87,87 @@ export function driveRunId(sessionId) {
66
87
  const candidate = `${DRIVE_RUN_PREFIX}${sessionId}`;
67
88
  return isValidRunId(candidate) ? candidate : defaultRunId();
68
89
  }
90
+ /** The run of the `segment`th agent session in a tab: the tab's id first, then `-2`, `-3`… */
91
+ function segmentRunId(base, segment) {
92
+ if (0 === segment)
93
+ return base;
94
+ const id = `${base}-${String(segment + 1)}`;
95
+ return isValidRunId(id) ? id : base;
96
+ }
97
+ /**
98
+ * Where each agent session in a tab ended: how many of the agent's own actions the tab held then,
99
+ * and the tab's clock. Every agent session in a tab wrote one run id, so a later end overwrote the
100
+ * earlier run on the dashboard.
101
+ * ponytail: daemon memory; a restart forgets the ends and the next fold is one run, as before.
102
+ */
103
+ const agentEnds = new Map();
104
+ /** The agent's own actions: the Harness drives in the same tab are runs of their own. */
105
+ const agentsOwn = (actions) => actions.filter((action) => action.drivenBy === undefined);
106
+ /** The run the agent's session now open in this tab is kept under. */
107
+ export function agentRunId(sessionId) {
108
+ return segmentRunId(driveRunId(sessionId), agentEnds.get(sessionId)?.length ?? 0);
109
+ }
110
+ /**
111
+ * The run the current call lands in: the flow being replayed, else the Harness drive, else the
112
+ * agent session open in the tab. One answer for a call's screenshot and an intent its check proves.
113
+ */
114
+ export function runIdOfCall(sessionId) {
115
+ const scoped = currentShotRun();
116
+ if (scoped !== undefined)
117
+ return scoped;
118
+ const by = currentDrivenBy();
119
+ const harness = by === undefined ? undefined : harnessRunId(by.harness);
120
+ return harness ?? agentRunId(sessionId);
121
+ }
122
+ /** The ends recorded for a tab, as counts of the agent's own actions, for the fold. */
123
+ export function agentEndCounts(sessionId) {
124
+ return (agentEnds.get(sessionId) ?? []).map((end) => end.count);
125
+ }
126
+ /** What the agent claimed at each end of a tab, by the index `agentEndCounts` uses. */
127
+ export function agentEndClaims(sessionId) {
128
+ return (agentEnds.get(sessionId) ?? []).map((end) => end.claim);
129
+ }
130
+ /**
131
+ * An agent session ends: its own actions since the previous end, the run they are kept under, and
132
+ * how long it ran. Recorded, so what the agent drives next is the next session's.
133
+ */
134
+ export function endAgentSession(sessionId, actions, at, claim) {
135
+ const own = agentsOwn(actions);
136
+ const ends = agentEnds.get(sessionId) ?? [];
137
+ const last = ends.at(-1);
138
+ const runId = agentRunId(sessionId);
139
+ ends.push({
140
+ count: own.length,
141
+ at: at ?? last?.at ?? 0,
142
+ ...(claim === undefined ? {} : { claim }),
143
+ });
144
+ agentEnds.set(sessionId, ends);
145
+ // The end splits the tab's runs: written again now, not when the tab disconnects, so the run this
146
+ // end names is on disk (and the dashboard) while the tab stays open.
147
+ tellNoted();
148
+ const mine = own.slice(Math.min(last?.count ?? 0, own.length));
149
+ const wallMs = at === undefined ? undefined : wallOf(mine, last?.at, at);
150
+ return { actions: mine, runId, ...(wallMs === undefined ? {} : { wallMs }) };
151
+ }
152
+ /**
153
+ * How long a session ran, `since` the previous end (else its first action) to `end`, on the tab's
154
+ * clock, which restarts at every page load: an action stamped before the one ahead of it starts a
155
+ * new stretch, and the stretches add up. Measured from the last load alone, a ten-second session
156
+ * that navigated read "1.2s". ponytail: the gap between a reload and the next action is not counted.
157
+ */
158
+ function wallOf(actions, since, end) {
159
+ let start = since ?? actions[0]?.tRange.from ?? end;
160
+ let prev = start;
161
+ let total = 0;
162
+ for (const action of actions) {
163
+ if (action.at < prev) {
164
+ total += prev - start;
165
+ start = action.tRange.from;
166
+ }
167
+ prev = action.at;
168
+ }
169
+ return total + (prev <= end ? end - start : prev - start + end);
170
+ }
69
171
  /**
70
172
  * Fold a session's journal into a run, or return undefined when there is nothing honest to report.
71
173
  *
@@ -74,12 +176,27 @@ export function driveRunId(sessionId) {
74
176
  */
75
177
  export function driveRunFrom(actions, deps) {
76
178
  const found = verdicts(actions);
179
+ const intentOf = new Map(actions.map((a) => [a.actionId, asString(asRecord(a.args)['intent'])]));
77
180
  const checks = [];
78
181
  for (const verdict of found) {
182
+ const intent = intentOf.get(verdict.actionId);
79
183
  checks.push({
80
184
  predicate: verdict.claim,
81
185
  status: verdict.verified,
82
- ...(verdict.source === undefined ? {} : { evidence: { source: verdict.source } }),
186
+ actionId: verdict.actionId,
187
+ ...(intent === undefined || 0 === intent.length ? {} : { intent }),
188
+ // Where it was written, and on a miss the calls of its window: what an issue page shows.
189
+ ...(verdict.source === undefined && verdict.net === undefined
190
+ ? {}
191
+ : {
192
+ evidence: {
193
+ ...(verdict.source === undefined ? {} : { source: verdict.source }),
194
+ ...(verdict.net === undefined ? {} : { net: verdict.net }),
195
+ },
196
+ }),
197
+ // What it required and what it saw, so a failed check can say both on the platform.
198
+ ...(verdict.expected === undefined ? {} : { expected: verdict.expected }),
199
+ ...(verdict.observed === undefined ? {} : { observed: verdict.observed }),
83
200
  // Carried through rather than recomputed. These were established at the moment the verdict
84
201
  // was made and written down then; a run built later cannot know any of them, and inferring
85
202
  // them here would be inventing evidence about evidence.
@@ -114,10 +231,14 @@ export function driveRunFrom(actions, deps) {
114
231
  durationMs: spanOf(actions),
115
232
  profile: RunProfile.DEV,
116
233
  project: {
117
- name: deps.projectId ?? UNNAMED_AGENT,
234
+ // Never the daemon's own name: a tab that reported no project is named by its folder.
235
+ name: deps.projectId ?? deps.projectName ?? UNNAMED_AGENT,
118
236
  framework: deps.framework ?? RunFramework.OTHER,
119
237
  },
120
- agent: { id: deps.agentId ?? UNNAMED_AGENT, kind: RunAgentKind.CODING_AGENT },
238
+ agent: {
239
+ id: deps.agentId ?? soleAgent(actions) ?? UNNAMED_AGENT,
240
+ kind: RunAgentKind.CODING_AGENT,
241
+ },
121
242
  trigger: {
122
243
  kind: RunTrigger.EDIT,
123
244
  note: 'driven live through the Reticle tools',
@@ -131,5 +252,196 @@ export function driveRunFrom(actions, deps) {
131
252
  // about what was WRONG, and a fold that guessed at anomalies would be inventing findings — the
132
253
  // failure this artifact is supposed to make impossible. Checks are the evidence here.
133
254
  evidence: { consoleErrors: [], networkAnomalies: [], stateAssertions: [], timeline: [] },
255
+ ...(deps.agentClaim === undefined ? {} : { agentClaim: deps.agentClaim }),
256
+ };
257
+ }
258
+ /** Marks a run as one Harness drive, so it never collides with the session's own `drive-` run. */
259
+ const HARNESS_RUN_PREFIX = 'harness-';
260
+ /** What a Harness run says drove it, in the dashboard's "Driven by" line. */
261
+ export function harnessAgentId(driver) {
262
+ return 'server' === driver ? 'Reticle Harness (platform)' : `Reticle Harness (${driver})`;
263
+ }
264
+ /**
265
+ * The id of the run a Harness drive syncs as, so whoever started the drive can find it again (the
266
+ * platform's chat folds the run into the check it asked for). Undefined for an id no run can carry.
267
+ */
268
+ export function harnessRunId(harness) {
269
+ const candidate = `${HARNESS_RUN_PREFIX}${harness}`;
270
+ return isValidRunId(candidate) ? candidate : undefined;
271
+ }
272
+ /** The journey a Harness drive was named for, or what it did when nobody named one. */
273
+ // Never "Harness drive": that read as the title of every unnamed drive's flow and finding.
274
+ const UNNAMED_JOURNEY = 'Exploring the app';
275
+ /** Goal verdicts kept for the drives a session has not yet been graded on. */
276
+ const MAX_GOALS_HELD = 200;
277
+ const goalsMissed = new Map();
278
+ /**
279
+ * What the Harness judged of a drive's goal, noted the moment the drive finishes, before its
280
+ * session ends and is graded. A drive whose checks held but whose goal was not reached synced as
281
+ * "Proved"; it is not proved. Unmet once is unmet: a later journey of the same drive reaching its
282
+ * goal does not undo it.
283
+ */
284
+ /** Told when a Harness drive's goal or comparison is noted, or an agent session ends, so its run is written again. */
285
+ const noted = new Set();
286
+ /**
287
+ * Hear about every Harness note. A drive is graded after its last verdict, and the run that verdict
288
+ * flushed never carried the grade: live, the platform filed a failed check instead of "Hard to find".
289
+ */
290
+ export function onHarnessNoted(listener) {
291
+ noted.add(listener);
292
+ return () => noted.delete(listener);
293
+ }
294
+ const tellNoted = () => {
295
+ for (const listener of noted)
296
+ listener();
297
+ };
298
+ /** How long each Harness drive took, timed by the drive on the injected clock. */
299
+ const spans = new Map();
300
+ /**
301
+ * The drive's own measure of how long it ran. The span of one tab's journal is not it: a lane in a
302
+ * leased browser left only the grade's assert in the tab, and its run read "Took 0 ms".
303
+ */
304
+ export function noteHarnessSpan(harness, ms) {
305
+ if (MAX_GOALS_HELD <= spans.size && !spans.has(harness)) {
306
+ const oldest = spans.keys().next().value;
307
+ if (oldest !== undefined)
308
+ spans.delete(oldest);
309
+ }
310
+ spans.set(harness, Math.max(0, ms));
311
+ tellNoted();
312
+ }
313
+ export function noteHarnessGoal(harness, met) {
314
+ if (met === undefined)
315
+ return;
316
+ const before = goalsMissed.get(harness);
317
+ if (false === before)
318
+ return;
319
+ if (MAX_GOALS_HELD <= goalsMissed.size && !goalsMissed.has(harness)) {
320
+ const oldest = goalsMissed.keys().next().value;
321
+ if (oldest !== undefined)
322
+ goalsMissed.delete(oldest);
323
+ }
324
+ goalsMissed.set(harness, met);
325
+ tellNoted();
326
+ }
327
+ /** How each Harness drive's goals compared with the agent's verdicts, until its run is folded. */
328
+ const disparities = new Map();
329
+ /**
330
+ * Noted when a drive is graded, like its goal: its run artifact carries the comparison, so the
331
+ * platform can file a goal the agent proved and the Harness could not find.
332
+ */
333
+ export function noteHarnessDisparity(harness, found) {
334
+ if (0 === found.length)
335
+ return;
336
+ if (MAX_GOALS_HELD <= disparities.size && !disparities.has(harness)) {
337
+ const oldest = disparities.keys().next().value;
338
+ if (oldest !== undefined)
339
+ disparities.delete(oldest);
340
+ }
341
+ disparities.set(harness, found);
342
+ tellNoted();
343
+ }
344
+ /** The phrase `describeWaitTarget` opens a route claim with, as the journal records it. */
345
+ const ROUTE_CLAIM = 'a route change';
346
+ const ABSENCE_OF = 'the absence of ';
347
+ /**
348
+ * Whether a recorded check claimed nothing but a route (or leaving one): the Harness driver's guess
349
+ * about where a click goes, which `harness/route-guess.ts` explains. Kept here because a run fold
350
+ * reads the journal's words, not the predicate.
351
+ */
352
+ function claimsOnlyRoute(claim, kind) {
353
+ if (PredicateKind.ROUTE === kind)
354
+ return true;
355
+ return PredicateKind.NOT === kind && claim.startsWith(`${ABSENCE_OF}${ROUTE_CLAIM}`);
356
+ }
357
+ /**
358
+ * One Harness drive, as its own run: named for the journey it was asked to complete, and credited to
359
+ * the Harness rather than to the agent whose tab it shared. The journey reads as one flow, graded by
360
+ * `driveFlowStatus`: failed only on a check that came back no.
361
+ */
362
+ function harnessRunFrom(by, actions, deps) {
363
+ const input = driveRunFrom(actions, {
364
+ ...deps,
365
+ runId: harnessRunId(by.harness) ?? defaultRunId(),
366
+ });
367
+ if (input === undefined)
368
+ return undefined;
369
+ // The driver's own wrong guess about where a click goes is not a failed check of the app; nor is
370
+ // its second press of a control whose claim already held (Save again on a field the app emptied).
371
+ const refOf = new Map(actions.map((a) => [a.actionId, asString(asRecord(a.args)['ref'])]));
372
+ const heldBefore = new Set();
373
+ const checks = input.checks.map((check) => {
374
+ const ref = check.actionId === undefined ? undefined : refOf.get(check.actionId);
375
+ const key = ref === undefined ? undefined : `${ref}|${check.predicate}`;
376
+ const repress = Verified.NO === check.status && key !== undefined && heldBefore.has(key);
377
+ if (Verified.YES === check.status && key !== undefined)
378
+ heldBefore.add(key);
379
+ return Verified.NO === check.status && (repress || claimsOnlyRoute(check.predicate, check.kind))
380
+ ? { ...check, status: Verified.UNKNOWN, reason: VerifiedReason.INCONCLUSIVE }
381
+ : check;
382
+ });
383
+ // A passive check that read too early is not counted: the one rule (superseded-checks.ts).
384
+ const superseded = supersededChecks(input.checks.map((c) => ({
385
+ key: c.predicate,
386
+ passive: false === c.declaredBeforeActing,
387
+ held: Verified.YES === c.status,
388
+ failed: Verified.NO === c.status,
389
+ })));
390
+ const count = (verified) => checks.filter((check, at) => verified === check.status && !superseded.has(at)).length;
391
+ const status = driveFlowStatus({
392
+ held: count(Verified.YES),
393
+ failed: count(Verified.NO),
394
+ goalMet: goalsMissed.get(by.harness),
395
+ });
396
+ const first = actions.reduce((min, action) => Math.min(min, action.at), Number.MAX_SAFE_INTEGER);
397
+ const durationMs = spans.get(by.harness) ?? Math.max(0, input.durationMs - first);
398
+ return {
399
+ ...input,
400
+ checks,
401
+ ...(disparities.has(by.harness) ? { disparity: [...(disparities.get(by.harness) ?? [])] } : {}),
402
+ durationMs,
403
+ agent: { id: harnessAgentId(by.driver), kind: RunAgentKind.CODING_AGENT },
404
+ trigger: {
405
+ kind: RunTrigger.EDIT,
406
+ note: `driven by the Harness${by.persona === undefined ? '' : `: ${by.persona}`}`,
407
+ },
408
+ flows: [
409
+ {
410
+ name: by.persona ?? UNNAMED_JOURNEY,
411
+ status,
412
+ steps: actions.length,
413
+ durationMs,
414
+ },
415
+ ],
134
416
  };
135
417
  }
418
+ /**
419
+ * Every run a session's journal holds: the connected agent's drive, and one per Harness drive.
420
+ *
421
+ * They used to be one. A Harness drive dispatches through the same tools in the same tab, so its
422
+ * verdicts folded into the agent's run, and the dashboard showed one blended row that credited the
423
+ * agent with what the Harness proved and named neither.
424
+ */
425
+ export function driveRunsFrom(actions, deps) {
426
+ const own = agentsOwn(actions);
427
+ // Each agent session in the tab is its own run: cut at the ends `reticle_session {end}` recorded.
428
+ const cuts = [0, ...(deps.agentEnds ?? []).map((n) => Math.min(n, own.length)), own.length];
429
+ const sessions = cuts.slice(1).map((to, i) => driveRunFrom(own.slice(cuts[i] ?? 0, to), {
430
+ ...deps,
431
+ runId: segmentRunId(deps.runId, i),
432
+ agentClaim: deps.agentClaims?.[i],
433
+ }));
434
+ const drives = new Map();
435
+ for (const action of actions) {
436
+ const by = action.drivenBy;
437
+ if (by === undefined)
438
+ continue;
439
+ const held = drives.get(by.harness) ?? { by, actions: [] };
440
+ held.actions.push(action);
441
+ drives.set(by.harness, held);
442
+ }
443
+ return [
444
+ ...sessions,
445
+ ...[...drives.values()].map((drive) => harnessRunFrom(drive.by, drive.actions, deps)),
446
+ ].filter((run) => run !== undefined);
447
+ }
@@ -46,7 +46,7 @@ function deviationHeadline(deviation) {
46
46
  return undefined;
47
47
  }
48
48
  export function buildRepairPacket(replay) {
49
- if (replay.status === ReplayStatus.OK)
49
+ if (replay.status === ReplayStatus.OK || replay.status === ReplayStatus.UNVERIFIABLE)
50
50
  return undefined;
51
51
  const decision = replay.decision;
52
52
  const baseActual = decision?.whatChanged ?? replay.error?.message ?? 'the flow failed';
@@ -0,0 +1,44 @@
1
+ import { type JournalAction } from '@reticlehq/core';
2
+ import type { ToolDeps } from '../../surface/tools/tool-kit.js';
3
+ /** The primer, short form. The full one lives in the agent's rules file (CLAUDE.md / AGENTS.md). */
4
+ export declare const RESUME_PRIMER: readonly string[];
5
+ export interface ResumeFacts {
6
+ actions: readonly JournalAction[];
7
+ /** Intents the ledger still owes (statements). */
8
+ openIntents: readonly string[];
9
+ /** The user's request as declared with reticle_intent, if one is current. */
10
+ request?: string | undefined;
11
+ /** The tab this was about, and where it is now. */
12
+ sessionId?: string | undefined;
13
+ route?: string | undefined;
14
+ /** The cursor to observe from. */
15
+ cursor?: number | undefined;
16
+ /** What this app's notes say (hints for targeting; never evidence). */
17
+ notes: readonly string[];
18
+ }
19
+ /** Each claim's LATEST verdict, in the order the claims were first made. */
20
+ export declare function latestVerdicts(actions: readonly JournalAction[]): {
21
+ claim: string;
22
+ verified: string;
23
+ observed?: string;
24
+ }[];
25
+ /** The resume block, as lines. */
26
+ export declare function resumeLines(facts: ResumeFacts): string[];
27
+ /** The session whose action ledger was written most recently, if any. */
28
+ export declare function newestSessionId(root: string): string | undefined;
29
+ /** The user's request, when one was declared recently enough to be this session's. */
30
+ export declare function recentRequest(root: string, now: number): string | undefined;
31
+ /**
32
+ * Everything the resume block needs, read from disk — no daemon, which is what a SessionStart hook
33
+ * has the moment after a compaction. The caller supplies the journal reader: the MCP tool holds the
34
+ * live journal, the CLI reads the newest session's ledger.
35
+ */
36
+ export declare function resumeFromDisk(input: {
37
+ root: string;
38
+ now: number;
39
+ fs: ToolDeps['fs'];
40
+ readActions: (sessionId: string) => Promise<readonly JournalAction[]>;
41
+ sessionId?: string | undefined;
42
+ route?: string | undefined;
43
+ cursor?: number | undefined;
44
+ }): Promise<string[]>;