@reticlehq/server 3.5.0 → 3.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (721) hide show
  1. package/README.md +1 -1
  2. package/SKILL.md +123 -116
  3. package/dist/chromium-launch-options.d.ts +3 -1
  4. package/dist/chromium-launch-options.js +2 -1
  5. package/dist/command/cli/adhoc-suite.d.ts +14 -0
  6. package/dist/command/cli/adhoc-suite.js +42 -7
  7. package/dist/command/cli/adhoc-verdict.d.ts +19 -2
  8. package/dist/command/cli/adhoc-verdict.js +76 -9
  9. package/dist/command/cli/answers/gate-exit.d.ts +23 -0
  10. package/dist/command/cli/answers/gate-exit.js +45 -0
  11. package/dist/command/cli/answers/gate-hook-message.d.ts +2 -0
  12. package/dist/command/cli/answers/gate-hook-message.js +3 -1
  13. package/dist/command/cli/answers/open-note.d.ts +2 -0
  14. package/dist/command/cli/answers/open-note.js +22 -0
  15. package/dist/command/cli/auth/device-flow.d.ts +13 -2
  16. package/dist/command/cli/auth/device-flow.js +17 -0
  17. package/dist/command/cli/cli-doctor.js +14 -0
  18. package/dist/command/cli/cli-flow-commands.d.ts +0 -11
  19. package/dist/command/cli/cli-flow-commands.js +31 -112
  20. package/dist/command/cli/cli-kill.js +3 -2
  21. package/dist/command/cli/cli-parse-grammar.d.ts +24 -0
  22. package/dist/command/cli/cli-parse-grammar.js +75 -0
  23. package/dist/command/cli/cli-parse-verify.d.ts +2 -0
  24. package/dist/command/cli/cli-parse-verify.js +18 -0
  25. package/dist/command/cli/cli-parse.d.ts +19 -28
  26. package/dist/command/cli/cli-parse.js +82 -182
  27. package/dist/command/cli/cli-update-commands.d.ts +1 -1
  28. package/dist/command/cli/cli-update-commands.js +61 -9
  29. package/dist/command/cli/cli-usage.d.ts +33 -0
  30. package/dist/command/cli/cli-usage.js +287 -0
  31. package/dist/command/cli/cli-verify.d.ts +35 -5
  32. package/dist/command/cli/cli-verify.js +114 -35
  33. package/dist/command/cli/cloud-cli.d.ts +13 -0
  34. package/dist/command/cli/cloud-cli.js +192 -341
  35. package/dist/command/cli/cloud-kit.d.ts +12 -0
  36. package/dist/command/cli/cloud-kit.js +41 -2
  37. package/dist/command/cli/cloud-link.d.ts +57 -0
  38. package/dist/command/cli/cloud-link.js +308 -0
  39. package/dist/command/cli/cloud-login.d.ts +22 -0
  40. package/dist/command/cli/cloud-login.js +96 -8
  41. package/dist/command/cli/context-command.d.ts +1 -0
  42. package/dist/command/cli/context-command.js +33 -0
  43. package/dist/command/cli/daemon-start-options.d.ts +3 -0
  44. package/dist/command/cli/daemon-start-options.js +24 -3
  45. package/dist/command/cli/doctor/browser/chromium-hint.d.ts +46 -0
  46. package/dist/command/cli/doctor/browser/chromium-hint.js +99 -1
  47. package/dist/command/cli/doctor/doctor-coverage-line.d.ts +2 -0
  48. package/dist/command/cli/doctor/doctor-coverage-line.js +47 -0
  49. package/dist/command/cli/doctor/doctor-project-line.d.ts +0 -12
  50. package/dist/command/cli/doctor/doctor-project-line.js +5 -4
  51. package/dist/command/cli/doctor/doctor-rows.d.ts +6 -0
  52. package/dist/command/cli/doctor/doctor-rows.js +6 -0
  53. package/dist/command/cli/doctor/doctor-signing-line.d.ts +38 -0
  54. package/dist/command/cli/doctor/doctor-signing-line.js +114 -0
  55. package/dist/command/cli/drive/drive-attach.d.ts +27 -2
  56. package/dist/command/cli/drive/drive-attach.js +71 -4
  57. package/dist/command/cli/drive/drive-command.d.ts +2 -1
  58. package/dist/command/cli/drive/drive-command.js +13 -7
  59. package/dist/command/cli/known-regression.d.ts +13 -0
  60. package/dist/command/cli/known-regression.js +34 -0
  61. package/dist/command/cli/launch/sdk-version-match.d.ts +12 -0
  62. package/dist/command/cli/launch/sdk-version-match.js +25 -0
  63. package/dist/command/cli/lifecycle/daemon-lifecycle.js +15 -3
  64. package/dist/command/cli/mcp-command.d.ts +6 -0
  65. package/dist/command/cli/mcp-command.js +13 -5
  66. package/dist/command/cli/ports/port-holder.d.ts +10 -0
  67. package/dist/command/cli/ports/port-holder.js +25 -1
  68. package/dist/command/cli/project-name.d.ts +29 -1
  69. package/dist/command/cli/project-name.js +107 -2
  70. package/dist/command/cli/setup-mcp-cli.d.ts +17 -1
  71. package/dist/command/cli/setup-mcp-cli.js +35 -12
  72. package/dist/command/cli/status/status-lines.d.ts +1 -0
  73. package/dist/command/cli/status/status-lines.js +47 -2
  74. package/dist/command/cli/status/workspace-links.d.ts +10 -0
  75. package/dist/command/cli/status/workspace-links.js +29 -0
  76. package/dist/command/cli/try-command.d.ts +96 -0
  77. package/dist/command/cli/try-command.js +362 -0
  78. package/dist/command/cli/tutorial.d.ts +0 -100
  79. package/dist/command/cli/tutorial.js +0 -181
  80. package/dist/command/cli/verify-results.d.ts +19 -0
  81. package/dist/command/cli/verify-results.js +29 -0
  82. package/dist/command/cli-onboarding.d.ts +0 -11
  83. package/dist/command/cli-onboarding.js +0 -15
  84. package/dist/command/cli.d.ts +20 -0
  85. package/dist/command/cli.js +130 -104
  86. package/dist/command/daemon/binding/daemon-status-probe.d.ts +2 -0
  87. package/dist/command/daemon/binding/daemon-status-probe.js +1 -0
  88. package/dist/command/daemon/daemon-resilience.js +4 -4
  89. package/dist/command/daemon/daemon-resolve.d.ts +23 -1
  90. package/dist/command/daemon/daemon-resolve.js +79 -9
  91. package/dist/command/setup/agent-writer.d.ts +1 -1
  92. package/dist/command/setup/agent-writer.js +3 -2
  93. package/dist/command/setup/bringup/bridge-port.d.ts +3 -1
  94. package/dist/command/setup/bringup/bridge-port.js +13 -3
  95. package/dist/command/setup/bringup/connect-lease.d.ts +1 -0
  96. package/dist/command/setup/bringup/connect-lease.js +1 -0
  97. package/dist/command/setup/bringup/dev-server-log-cap.js +2 -0
  98. package/dist/command/setup/bringup/dev-server-wait.d.ts +8 -0
  99. package/dist/command/setup/bringup/dev-server-wait.js +19 -0
  100. package/dist/command/setup/bringup/ensure-daemon.js +9 -2
  101. package/dist/command/setup/init/agent-restart.d.ts +23 -0
  102. package/dist/command/setup/init/agent-restart.js +28 -0
  103. package/dist/command/setup/init/init-port.d.ts +14 -1
  104. package/dist/command/setup/init/init-port.js +32 -2
  105. package/dist/command/setup/init/init-runtime.d.ts +22 -2
  106. package/dist/command/setup/init/init-runtime.js +114 -38
  107. package/dist/command/setup/node-effects.d.ts +2 -0
  108. package/dist/command/setup/node-effects.js +38 -9
  109. package/dist/command/setup/probe/existing-app.d.ts +12 -0
  110. package/dist/command/setup/probe/existing-app.js +14 -0
  111. package/dist/command/setup/remaining-steps.js +2 -1
  112. package/dist/command/setup/run-setup.d.ts +34 -9
  113. package/dist/command/setup/run-setup.js +65 -51
  114. package/dist/command/setup/setup-command.d.ts +25 -1
  115. package/dist/command/setup/setup-command.js +59 -4
  116. package/dist/command/setup/setup-mcp.js +25 -2
  117. package/dist/command/setup/tauri-signing.d.ts +19 -0
  118. package/dist/command/setup/tauri-signing.js +79 -0
  119. package/dist/command/setup/terminal/listeners.d.ts +10 -1
  120. package/dist/command/setup/terminal/listeners.js +37 -6
  121. package/dist/command/update/update-nudge.d.ts +9 -0
  122. package/dist/command/update/update-nudge.js +1 -1
  123. package/dist/command/update/updater.js +11 -15
  124. package/dist/command/version/version-nudge.js +3 -0
  125. package/dist/command/version/version-skew.d.ts +20 -1
  126. package/dist/command/version/version-skew.js +49 -4
  127. package/dist/features/crawl/crawl-tools.js +4 -0
  128. package/dist/features/crawl/crawl.d.ts +6 -0
  129. package/dist/features/crawl/crawl.js +23 -2
  130. package/dist/features/exhaust/ledger.d.ts +21 -14
  131. package/dist/features/exhaust/ledger.js +35 -9
  132. package/dist/features/harness/app-findings.d.ts +2 -0
  133. package/dist/features/harness/app-findings.js +52 -0
  134. package/dist/features/harness/drive-report.d.ts +61 -1
  135. package/dist/features/harness/drive-report.js +394 -26
  136. package/dist/features/harness/drive-runs.d.ts +120 -0
  137. package/dist/features/harness/drive-runs.js +289 -0
  138. package/dist/features/harness/drivers.d.ts +10 -14
  139. package/dist/features/harness/drivers.js +10 -14
  140. package/dist/features/harness/explore/console-pages.d.ts +15 -0
  141. package/dist/features/harness/explore/console-pages.js +146 -0
  142. package/dist/features/harness/explore/disparity.d.ts +19 -0
  143. package/dist/features/harness/explore/disparity.js +71 -0
  144. package/dist/features/harness/explore/fake-app.d.ts +16 -0
  145. package/dist/features/harness/explore/fake-app.js +49 -0
  146. package/dist/features/harness/explore/goal-search.d.ts +26 -0
  147. package/dist/features/harness/explore/goal-search.js +144 -0
  148. package/dist/features/harness/explore/page-tree.d.ts +49 -0
  149. package/dist/features/harness/explore/page-tree.js +148 -0
  150. package/dist/features/harness/explore/site-map.d.ts +34 -0
  151. package/dist/features/harness/explore/site-map.js +150 -0
  152. package/dist/features/harness/fill-values.d.ts +3 -73
  153. package/dist/features/harness/fill-values.js +3 -169
  154. package/dist/features/harness/goals.d.ts +82 -0
  155. package/dist/features/harness/goals.js +330 -0
  156. package/dist/features/harness/harness.d.ts +51 -1
  157. package/dist/features/harness/harness.js +207 -6
  158. package/dist/features/harness/platform/drive-target.d.ts +30 -0
  159. package/dist/features/harness/platform/drive-target.js +81 -0
  160. package/dist/features/harness/platform/local-apps.d.ts +127 -0
  161. package/dist/features/harness/platform/local-apps.js +280 -0
  162. package/dist/features/harness/platform/persona-credentials.d.ts +20 -0
  163. package/dist/features/harness/platform/persona-credentials.js +69 -0
  164. package/dist/features/harness/platform/platform-drives.d.ts +61 -0
  165. package/dist/features/harness/platform/platform-drives.js +114 -0
  166. package/dist/features/harness/platform/refusal.d.ts +52 -0
  167. package/dist/features/harness/platform/refusal.js +71 -0
  168. package/dist/features/harness/platform/remote-drive.d.ts +186 -0
  169. package/dist/features/harness/platform/remote-drive.js +378 -0
  170. package/dist/features/harness/platform/script.d.ts +94 -0
  171. package/dist/features/harness/platform/script.js +260 -0
  172. package/dist/features/harness/platform/server-driver.d.ts +54 -0
  173. package/dist/features/harness/platform/server-driver.js +182 -0
  174. package/dist/features/harness/platform-config.d.ts +41 -1
  175. package/dist/features/harness/platform-config.js +106 -9
  176. package/dist/features/harness/route-guess.d.ts +13 -0
  177. package/dist/features/harness/route-guess.js +49 -0
  178. package/dist/features/harness/script/app-controls.d.ts +5 -0
  179. package/dist/features/harness/script/app-controls.js +40 -0
  180. package/dist/features/harness/script/lane-ids.d.ts +14 -0
  181. package/dist/features/harness/script/lane-ids.js +16 -0
  182. package/dist/features/harness/script/script-run.d.ts +70 -0
  183. package/dist/features/harness/script/script-run.js +606 -0
  184. package/dist/features/license/license.d.ts +2 -2
  185. package/dist/features/visual/step-shots.d.ts +31 -0
  186. package/dist/features/visual/step-shots.js +231 -0
  187. package/dist/features/visual/visual-tools.d.ts +10 -1
  188. package/dist/features/visual/visual-tools.js +62 -17
  189. package/dist/hooks/client-directory.d.ts +18 -0
  190. package/dist/hooks/client-directory.js +57 -0
  191. package/dist/hooks/coding-agents.d.ts +34 -0
  192. package/dist/hooks/coding-agents.js +117 -0
  193. package/dist/hooks/driven-by.d.ts +23 -0
  194. package/dist/hooks/driven-by.js +56 -0
  195. package/dist/hooks/hook-bus.d.ts +4 -0
  196. package/dist/hooks/hook-bus.js +18 -0
  197. package/dist/hooks/hook-commands.js +15 -4
  198. package/dist/hooks/tool-log.d.ts +9 -0
  199. package/dist/hooks/tool-log.js +29 -0
  200. package/dist/index.d.ts +2 -0
  201. package/dist/index.js +80 -243
  202. package/dist/judgement/capsule/capsule-store.d.ts +2 -2
  203. package/dist/judgement/capsule/causal-summary.d.ts +15 -1
  204. package/dist/judgement/capsule/causal-summary.js +33 -0
  205. package/dist/judgement/runs/artifact/build-verification-run.d.ts +1 -1
  206. package/dist/judgement/runs/artifact/build-verification-run.js +25 -3
  207. package/dist/judgement/runs/artifact/gap-summary.d.ts +0 -18
  208. package/dist/judgement/runs/artifact/gap-summary.js +12 -3
  209. package/dist/judgement/runs/artifact/replay-mapping.d.ts +1 -1
  210. package/dist/judgement/runs/artifact/replay-mapping.js +37 -11
  211. package/dist/judgement/runs/artifact/run-store.d.ts +14 -2
  212. package/dist/judgement/runs/artifact/run-store.js +195 -3
  213. package/dist/judgement/runs/context-tools.js +59 -1
  214. package/dist/judgement/runs/default-run-id.d.ts +3 -0
  215. package/dist/judgement/runs/default-run-id.js +16 -0
  216. package/dist/judgement/runs/drive-run.d.ts +71 -1
  217. package/dist/judgement/runs/drive-run.js +317 -5
  218. package/dist/judgement/runs/repair-prompt.js +1 -1
  219. package/dist/judgement/runs/resume.d.ts +44 -0
  220. package/dist/judgement/runs/resume.js +137 -0
  221. package/dist/judgement/runs/reticle-runner.js +13 -3
  222. package/dist/judgement/runs/runner-port.d.ts +5 -1
  223. package/dist/judgement/runs/runner-port.js +8 -2
  224. package/dist/judgement/runs/verification-sync.d.ts +5 -2
  225. package/dist/judgement/runs/verification-sync.js +40 -18
  226. package/dist/language/flows/change/gate.d.ts +10 -0
  227. package/dist/language/flows/change/gate.js +22 -0
  228. package/dist/language/flows/decision.js +36 -1
  229. package/dist/language/flows/fields/flow-secret-field.d.ts +12 -0
  230. package/dist/language/flows/fields/flow-secret-field.js +25 -2
  231. package/dist/language/flows/flow-anchor.d.ts +61 -10
  232. package/dist/language/flows/flow-anchor.js +98 -6
  233. package/dist/language/flows/flow-cross-step.d.ts +15 -0
  234. package/dist/language/flows/flow-cross-step.js +21 -0
  235. package/dist/language/flows/flow-intent.d.ts +1 -0
  236. package/dist/language/flows/flow-journey.d.ts +6 -0
  237. package/dist/language/flows/flow-journey.js +20 -0
  238. package/dist/language/flows/flow-learning.d.ts +4 -0
  239. package/dist/language/flows/flow-learning.js +45 -14
  240. package/dist/language/flows/flow-mutate-tools.js +5 -3
  241. package/dist/language/flows/flow-replay-run.d.ts +23 -9
  242. package/dist/language/flows/flow-replay-run.js +115 -110
  243. package/dist/language/flows/flow-replay-types.d.ts +1 -1
  244. package/dist/language/flows/flow-replay.d.ts +40 -1
  245. package/dist/language/flows/flow-replay.js +110 -22
  246. package/dist/language/flows/flow-result.d.ts +22 -1
  247. package/dist/language/flows/flow-result.js +47 -2
  248. package/dist/language/flows/flow-scope.js +5 -1
  249. package/dist/language/flows/flow-step-runners.d.ts +22 -2
  250. package/dist/language/flows/flow-step-runners.js +247 -47
  251. package/dist/language/flows/flow-store-for-session.d.ts +2 -2
  252. package/dist/language/flows/flow-store-for-session.js +7 -3
  253. package/dist/language/flows/flow-tools.d.ts +10 -0
  254. package/dist/language/flows/flow-tools.js +112 -89
  255. package/dist/language/flows/flows.d.ts +16 -1
  256. package/dist/language/flows/flows.js +74 -12
  257. package/dist/language/flows/heal-run.js +6 -4
  258. package/dist/language/flows/narrow-write.d.ts +7 -0
  259. package/dist/language/flows/narrow-write.js +36 -1
  260. package/dist/language/flows/recording/flake.d.ts +2 -2
  261. package/dist/language/flows/recording/recording-backtrack.js +14 -1
  262. package/dist/language/flows/recording/tape/recordings.d.ts +58 -4
  263. package/dist/language/flows/recording/tape/recordings.js +95 -13
  264. package/dist/language/flows/replay-from-hud.d.ts +20 -0
  265. package/dist/language/flows/replay-from-hud.js +51 -0
  266. package/dist/language/flows/replay.d.ts +9 -5
  267. package/dist/language/flows/replay.js +56 -15
  268. package/dist/language/flows/single-replay.d.ts +7 -0
  269. package/dist/language/flows/single-replay.js +26 -0
  270. package/dist/language/flows/suite/suite-flakes.js +2 -0
  271. package/dist/language/flows/suite-selection.d.ts +2 -15
  272. package/dist/language/flows/suite-selection.js +4 -3
  273. package/dist/language/flows/verify-change-tools.d.ts +1 -0
  274. package/dist/language/flows/verify-change-tools.js +202 -191
  275. package/dist/launch-chromium.d.ts +27 -5
  276. package/dist/launch-chromium.js +38 -8
  277. package/dist/memory/cloud/cloud-config.d.ts +22 -1
  278. package/dist/memory/cloud/cloud-config.js +34 -5
  279. package/dist/memory/cloud/cloud-sync.d.ts +17 -14
  280. package/dist/memory/cloud/cloud-sync.js +15 -4
  281. package/dist/memory/cloud/harness-config.d.ts +75 -1
  282. package/dist/memory/cloud/harness-config.js +115 -24
  283. package/dist/memory/cloud/hud-notices-source.d.ts +21 -0
  284. package/dist/memory/cloud/hud-notices-source.js +128 -0
  285. package/dist/memory/cloud/memory-scope.d.ts +161 -0
  286. package/dist/memory/cloud/memory-scope.js +227 -0
  287. package/dist/memory/cloud/sync-cycle.d.ts +44 -7
  288. package/dist/memory/cloud/sync-cycle.js +129 -15
  289. package/dist/memory/cloud/sync-daemon.d.ts +11 -0
  290. package/dist/memory/cloud/sync-daemon.js +121 -9
  291. package/dist/memory/cloud/sync-disk.d.ts +1 -1
  292. package/dist/memory/cloud/sync-disk.js +31 -10
  293. package/dist/memory/cloud/sync-screenshots.d.ts +32 -0
  294. package/dist/memory/cloud/sync-screenshots.js +105 -0
  295. package/dist/memory/cloud/unsynced-roots.d.ts +47 -0
  296. package/dist/memory/cloud/unsynced-roots.js +166 -0
  297. package/dist/memory/impact/account-watch.d.ts +34 -0
  298. package/dist/memory/impact/account-watch.js +59 -0
  299. package/dist/memory/impact/impact-recorder.d.ts +8 -0
  300. package/dist/memory/impact/impact-recorder.js +12 -2
  301. package/dist/memory/impact/impact-store.d.ts +17 -4
  302. package/dist/memory/impact/impact-store.js +169 -63
  303. package/dist/memory/intent/inline-intent.d.ts +1 -0
  304. package/dist/memory/intent/intent-shard-store.js +16 -4
  305. package/dist/memory/intent/intent-shard.d.ts +14 -2
  306. package/dist/memory/intent/intent-store.d.ts +1 -0
  307. package/dist/memory/intent/intent-tools.js +122 -4
  308. package/dist/memory/intent/open-intents.d.ts +6 -0
  309. package/dist/memory/intent/open-intents.js +10 -1
  310. package/dist/memory/intent/settled-words.d.ts +24 -0
  311. package/dist/memory/intent/settled-words.js +130 -0
  312. package/dist/memory/journal/drive-flow.d.ts +16 -0
  313. package/dist/memory/journal/drive-flow.js +34 -2
  314. package/dist/memory/journal/drive-run-flush.d.ts +2 -0
  315. package/dist/memory/journal/drive-run-flush.js +20 -5
  316. package/dist/memory/journal/envelope.d.ts +8 -8
  317. package/dist/memory/journal/journal-recorder.js +52 -3
  318. package/dist/memory/journal/on-disk/retention.d.ts +8 -0
  319. package/dist/memory/journal/on-disk/retention.js +32 -2
  320. package/dist/memory/journal/on-disk/startup-maintenance.js +3 -1
  321. package/dist/memory/journal/on-disk/workspace-tiers.js +9 -4
  322. package/dist/memory/journal/session-end.d.ts +15 -1
  323. package/dist/memory/journal/session-end.js +42 -9
  324. package/dist/memory/project/artifact-root-resolver.d.ts +26 -1
  325. package/dist/memory/project/artifact-root-resolver.js +125 -16
  326. package/dist/memory/project/artifact-root.d.ts +46 -8
  327. package/dist/memory/project/artifact-root.js +89 -10
  328. package/dist/memory/project/dir/reticle-dir.d.ts +18 -2
  329. package/dist/memory/project/dir/reticle-dir.js +26 -3
  330. package/dist/memory/project/link-directory.d.ts +15 -0
  331. package/dist/memory/project/link-directory.js +44 -0
  332. package/dist/memory/project/project-tools.js +22 -3
  333. package/dist/memory/project/root-claims.d.ts +6 -0
  334. package/dist/memory/project/root-claims.js +39 -0
  335. package/dist/memory/project/session-root.d.ts +26 -1
  336. package/dist/memory/project/session-root.js +49 -5
  337. package/dist/memory/project/sync-status.d.ts +85 -0
  338. package/dist/memory/project/sync-status.js +224 -0
  339. package/dist/memory/recall/memory-tools.js +47 -2
  340. package/dist/memory/recall/platform-memory.d.ts +34 -0
  341. package/dist/memory/recall/platform-memory.js +139 -0
  342. package/dist/memory/recall/project-memory.d.ts +19 -0
  343. package/dist/memory/recall/project-memory.js +80 -13
  344. package/dist/portal/bridge/bridge.d.ts +9 -3
  345. package/dist/portal/bridge/bridge.js +82 -22
  346. package/dist/portal/bridge/harness-request.d.ts +23 -0
  347. package/dist/portal/bridge/harness-request.js +27 -0
  348. package/dist/portal/bridge/pairing-token.d.ts +9 -0
  349. package/dist/portal/bridge/pairing-token.js +17 -0
  350. package/dist/portal/bridge/wrong-path.d.ts +17 -0
  351. package/dist/portal/bridge/wrong-path.js +35 -0
  352. package/dist/portal/input/network-mock-tools.js +11 -2
  353. package/dist/portal/input/real-input.d.ts +83 -10
  354. package/dist/portal/input/real-input.js +218 -30
  355. package/dist/portal/input/viewport-tools.js +3 -3
  356. package/dist/portal/pool/browser-pool.d.ts +70 -9
  357. package/dist/portal/pool/browser-pool.js +190 -37
  358. package/dist/portal/pool/context-permissions.d.ts +33 -0
  359. package/dist/portal/pool/context-permissions.js +33 -0
  360. package/dist/portal/pool/lease-marker-stamp.d.ts +23 -0
  361. package/dist/portal/pool/lease-marker-stamp.js +49 -0
  362. package/dist/portal/pool/playwright-launcher.d.ts +35 -0
  363. package/dist/portal/pool/playwright-launcher.js +64 -3
  364. package/dist/portal/pool/pool-contract.d.ts +28 -5
  365. package/dist/portal/session/agent-link.d.ts +8 -0
  366. package/dist/portal/session/agent-link.js +17 -0
  367. package/dist/portal/session/command-payload.d.ts +8 -0
  368. package/dist/portal/session/command-payload.js +24 -0
  369. package/dist/portal/session/daemon-answers.d.ts +3 -3
  370. package/dist/portal/session/daemon-answers.js +4 -2
  371. package/dist/portal/session/dev-server/dev-command.d.ts +21 -0
  372. package/dist/portal/session/dev-server/dev-command.js +87 -12
  373. package/dist/portal/session/facts/departure-note.d.ts +22 -0
  374. package/dist/portal/session/facts/departure-note.js +47 -0
  375. package/dist/portal/session/facts/observed-state.d.ts +16 -18
  376. package/dist/portal/session/facts/observed-state.js +46 -3
  377. package/dist/portal/session/facts/session-replaced.d.ts +5 -0
  378. package/dist/portal/session/facts/session-replaced.js +5 -0
  379. package/dist/portal/session/first-run-wiring.d.ts +42 -0
  380. package/dist/portal/session/first-run-wiring.js +132 -0
  381. package/dist/portal/session/human/live-control.d.ts +9 -2
  382. package/dist/portal/session/human/live-control.js +12 -3
  383. package/dist/portal/session/human/notes-ledger.d.ts +20 -0
  384. package/dist/portal/session/human/notes-ledger.js +55 -0
  385. package/dist/portal/session/human/review-store.d.ts +12 -0
  386. package/dist/portal/session/human/review-store.js +18 -10
  387. package/dist/portal/session/live-control-tools.d.ts +0 -13
  388. package/dist/portal/session/live-control-tools.js +107 -13
  389. package/dist/portal/session/narration-args.d.ts +5 -0
  390. package/dist/portal/session/narration-args.js +17 -0
  391. package/dist/portal/session/no-session-diagnosis.d.ts +8 -1
  392. package/dist/portal/session/no-session-diagnosis.js +46 -9
  393. package/dist/portal/session/no-session-next-action.d.ts +31 -0
  394. package/dist/portal/session/no-session-next-action.js +159 -60
  395. package/dist/portal/session/no-session-watch.d.ts +14 -1
  396. package/dist/portal/session/no-session-watch.js +227 -17
  397. package/dist/portal/session/presence/session-lease.js +1 -1
  398. package/dist/portal/session/presence/session-mirror.js +3 -0
  399. package/dist/portal/session/recorded-gaps.d.ts +97 -0
  400. package/dist/portal/session/recorded-gaps.js +251 -0
  401. package/dist/portal/session/serving-directory.d.ts +27 -0
  402. package/dist/portal/session/serving-directory.js +45 -0
  403. package/dist/portal/session/session-health.d.ts +18 -0
  404. package/dist/portal/session/session-health.js +9 -1
  405. package/dist/portal/session/session-info.d.ts +8 -1
  406. package/dist/portal/session/session-info.js +8 -1
  407. package/dist/portal/session/session-manager.d.ts +39 -0
  408. package/dist/portal/session/session-manager.js +98 -11
  409. package/dist/portal/session/session-reaper.js +4 -1
  410. package/dist/portal/session/session-successor.d.ts +13 -0
  411. package/dist/portal/session/session-successor.js +1 -1
  412. package/dist/portal/session/session-tools.js +26 -3
  413. package/dist/portal/session/session.d.ts +22 -30
  414. package/dist/portal/session/session.js +81 -79
  415. package/dist/portal/session/timing/command-timeout.js +25 -1
  416. package/dist/portal/session/timing/wall-clock.d.ts +1 -1
  417. package/dist/portal/session/timing/wall-clock.js +1 -1
  418. package/dist/portal/session/zero-install-first-call.d.ts +31 -0
  419. package/dist/portal/session/zero-install-first-call.js +88 -0
  420. package/dist/start-options.d.ts +12 -0
  421. package/dist/start-wiring.d.ts +63 -0
  422. package/dist/start-wiring.js +169 -0
  423. package/dist/status-payload.d.ts +23 -1
  424. package/dist/status-payload.js +36 -1
  425. package/dist/surface/http-server.js +18 -2
  426. package/dist/surface/mcp/attach-memory.d.ts +1 -0
  427. package/dist/surface/mcp/attach-memory.js +12 -1
  428. package/dist/surface/mcp/mcp-proxy.d.ts +9 -0
  429. package/dist/surface/mcp/mcp-proxy.js +65 -13
  430. package/dist/surface/mcp/mcp.d.ts +34 -6
  431. package/dist/surface/mcp/mcp.js +61 -17
  432. package/dist/surface/mcp/proxy/drive-calls.d.ts +10 -0
  433. package/dist/surface/mcp/proxy/drive-calls.js +27 -0
  434. package/dist/surface/mcp/proxy/mcp-post-transport.js +5 -0
  435. package/dist/surface/mcp/server-instructions.d.ts +4 -2
  436. package/dist/surface/mcp/server-instructions.js +32 -14
  437. package/dist/surface/mcp/shared-params.js +2 -2
  438. package/dist/surface/mcp/surface-vocabulary.d.ts +2 -0
  439. package/dist/surface/mcp/surface-vocabulary.js +1 -0
  440. package/dist/surface/tools/account-tool.d.ts +22 -0
  441. package/dist/surface/tools/account-tool.js +157 -0
  442. package/dist/surface/tools/act/act-danger.d.ts +11 -0
  443. package/dist/surface/tools/act/act-danger.js +38 -1
  444. package/dist/surface/tools/act/act-observation.d.ts +33 -0
  445. package/dist/surface/tools/act/act-observation.js +57 -0
  446. package/dist/surface/tools/act/act-preflight.js +25 -2
  447. package/dist/surface/tools/act/act-target.js +8 -3
  448. package/dist/surface/tools/act/navigation/navigate-arrival.d.ts +8 -0
  449. package/dist/surface/tools/act/navigation/navigate-arrival.js +56 -2
  450. package/dist/surface/tools/act/resolve-target.d.ts +1 -1
  451. package/dist/surface/tools/act/resolve-target.js +18 -3
  452. package/dist/surface/tools/act/screen-request.d.ts +34 -0
  453. package/dist/surface/tools/act/screen-request.js +113 -0
  454. package/dist/surface/tools/act/sequence-grade.d.ts +8 -0
  455. package/dist/surface/tools/act/sequence-grade.js +13 -2
  456. package/dist/surface/tools/act/settle-in-flight.js +25 -3
  457. package/dist/surface/tools/act-sequence-tool.js +138 -29
  458. package/dist/surface/tools/act-tools.d.ts +0 -9
  459. package/dist/surface/tools/act-tools.js +71 -41
  460. package/dist/surface/tools/agent/app-notes-learning.d.ts +7 -0
  461. package/dist/surface/tools/agent/app-notes-learning.js +80 -0
  462. package/dist/surface/tools/agent/app-notes.d.ts +4 -0
  463. package/dist/surface/tools/agent/app-notes.js +48 -0
  464. package/dist/surface/tools/agent/build-staleness.d.ts +7 -0
  465. package/dist/surface/tools/agent/build-staleness.js +62 -0
  466. package/dist/surface/tools/agent/compact-envelope.d.ts +80 -0
  467. package/dist/surface/tools/agent/compact-envelope.js +374 -0
  468. package/dist/surface/tools/agent/for-the-agent.d.ts +12 -0
  469. package/dist/surface/tools/agent/for-the-agent.js +44 -0
  470. package/dist/surface/tools/agent/notices.d.ts +50 -0
  471. package/dist/surface/tools/agent/notices.js +152 -0
  472. package/dist/surface/tools/agent/reteach.d.ts +11 -0
  473. package/dist/surface/tools/agent/reteach.js +50 -0
  474. package/dist/surface/tools/args/alias-args.d.ts +5 -0
  475. package/dist/surface/tools/args/alias-args.js +10 -0
  476. package/dist/surface/tools/args/confirm-dangerous-arg.d.ts +6 -0
  477. package/dist/surface/tools/args/confirm-dangerous-arg.js +6 -0
  478. package/dist/surface/tools/assert/assert-source.d.ts +15 -0
  479. package/dist/surface/tools/assert/assert-source.js +40 -0
  480. package/dist/surface/tools/assert/assert-verdict.d.ts +1 -1
  481. package/dist/surface/tools/assert/assert-verdict.js +42 -17
  482. package/dist/surface/tools/browser-tools.js +51 -2
  483. package/dist/surface/tools/chat-drives.d.ts +101 -0
  484. package/dist/surface/tools/chat-drives.js +409 -0
  485. package/dist/surface/tools/coverage-tools.d.ts +2 -10
  486. package/dist/surface/tools/coverage-tools.js +2 -53
  487. package/dist/surface/tools/dynamic-tools.js +29 -1
  488. package/dist/surface/tools/empty-session-list.d.ts +51 -0
  489. package/dist/surface/tools/empty-session-list.js +120 -0
  490. package/dist/surface/tools/error-recovery.d.ts +14 -0
  491. package/dist/surface/tools/error-recovery.js +105 -8
  492. package/dist/surface/tools/explore-tools.d.ts +31 -1
  493. package/dist/surface/tools/explore-tools.js +438 -66
  494. package/dist/surface/tools/feedback-tools.d.ts +2 -3
  495. package/dist/surface/tools/feedback-tools.js +18 -3
  496. package/dist/surface/tools/gap-novelty.d.ts +3 -1
  497. package/dist/surface/tools/gap-novelty.js +8 -1
  498. package/dist/surface/tools/harness-explore.d.ts +118 -57
  499. package/dist/surface/tools/harness-explore.js +344 -292
  500. package/dist/surface/tools/harness-gate.d.ts +88 -0
  501. package/dist/surface/tools/harness-gate.js +235 -0
  502. package/dist/surface/tools/harness-hunt.d.ts +43 -0
  503. package/dist/surface/tools/harness-hunt.js +215 -0
  504. package/dist/surface/tools/harness-plan.d.ts +17 -0
  505. package/dist/surface/tools/harness-plan.js +38 -0
  506. package/dist/surface/tools/harness-script.d.ts +30 -0
  507. package/dist/surface/tools/harness-script.js +560 -0
  508. package/dist/surface/tools/harness-tab-guard.d.ts +5 -0
  509. package/dist/surface/tools/harness-tab-guard.js +27 -0
  510. package/dist/surface/tools/harness-toolset.d.ts +22 -1
  511. package/dist/surface/tools/harness-toolset.js +101 -7
  512. package/dist/surface/tools/human-notes.d.ts +16 -0
  513. package/dist/surface/tools/human-notes.js +27 -0
  514. package/dist/surface/tools/invoke-tool.d.ts +5 -2
  515. package/dist/surface/tools/invoke-tool.js +263 -85
  516. package/dist/surface/tools/lease-hint.js +26 -5
  517. package/dist/surface/tools/lease-permissions.d.ts +33 -0
  518. package/dist/surface/tools/lease-permissions.js +73 -0
  519. package/dist/surface/tools/lease-readiness.d.ts +38 -0
  520. package/dist/surface/tools/lease-readiness.js +57 -0
  521. package/dist/surface/tools/lease-seed.d.ts +49 -0
  522. package/dist/surface/tools/lease-seed.js +167 -0
  523. package/dist/surface/tools/lease-tools.d.ts +13 -24
  524. package/dist/surface/tools/lease-tools.js +146 -197
  525. package/dist/surface/tools/live-call-text.js +4 -4
  526. package/dist/surface/tools/merge-tools.js +42 -2
  527. package/dist/surface/tools/merged-name-redirect.js +4 -0
  528. package/dist/surface/tools/next-step.d.ts +29 -0
  529. package/dist/surface/tools/next-step.js +214 -0
  530. package/dist/surface/tools/observe-tools.js +45 -9
  531. package/dist/surface/tools/platform-moment.d.ts +72 -0
  532. package/dist/surface/tools/platform-moment.js +296 -0
  533. package/dist/surface/tools/query-hint-schema.d.ts +7 -0
  534. package/dist/surface/tools/query-hint-schema.js +10 -0
  535. package/dist/surface/tools/read-tools.js +71 -14
  536. package/dist/surface/tools/real-input-attempt.js +96 -13
  537. package/dist/surface/tools/reticle-result.d.ts +120 -0
  538. package/dist/surface/tools/reticle-result.js +364 -0
  539. package/dist/surface/tools/tool-kit.d.ts +83 -3
  540. package/dist/surface/tools/tool-kit.js +77 -7
  541. package/dist/surface/tools/tools.js +43 -59
  542. package/dist/telemetry/account-envelope.d.ts +7 -0
  543. package/dist/telemetry/account-envelope.js +61 -0
  544. package/dist/telemetry/agent-client.d.ts +15 -0
  545. package/dist/telemetry/agent-client.js +57 -0
  546. package/dist/telemetry/app-instrumented.js +9 -2
  547. package/dist/telemetry/argument-shape.d.ts +7 -0
  548. package/dist/telemetry/argument-shape.js +86 -1
  549. package/dist/telemetry/automation-hint.d.ts +2 -3
  550. package/dist/telemetry/automation-hint.js +33 -8
  551. package/dist/telemetry/cli-telemetry.js +7 -2
  552. package/dist/telemetry/daemon-telemetry.js +3 -0
  553. package/dist/telemetry/error-fingerprint.d.ts +10 -1
  554. package/dist/telemetry/error-fingerprint.js +61 -5
  555. package/dist/telemetry/feedback-cli.d.ts +0 -13
  556. package/dist/telemetry/feedback-cli.js +0 -77
  557. package/dist/telemetry/feedback.d.ts +13 -0
  558. package/dist/telemetry/feedback.js +183 -17
  559. package/dist/telemetry/harness-run.d.ts +18 -0
  560. package/dist/telemetry/harness-run.js +80 -0
  561. package/dist/telemetry/hud-events.d.ts +16 -0
  562. package/dist/telemetry/hud-events.js +27 -0
  563. package/dist/telemetry/hud-metrics.d.ts +29 -6
  564. package/dist/telemetry/hud-metrics.js +116 -25
  565. package/dist/telemetry/init-telemetry.js +2 -2
  566. package/dist/telemetry/install-source.d.ts +13 -25
  567. package/dist/telemetry/install-source.js +44 -3
  568. package/dist/telemetry/mcp-connection.d.ts +0 -14
  569. package/dist/telemetry/mcp-connection.js +5 -1
  570. package/dist/telemetry/onboarding-firsts.d.ts +32 -0
  571. package/dist/telemetry/onboarding-firsts.js +81 -6
  572. package/dist/telemetry/platform-linked.d.ts +5 -0
  573. package/dist/telemetry/platform-linked.js +32 -0
  574. package/dist/telemetry/project-profile.js +5 -3
  575. package/dist/telemetry/proxy-telemetry.js +4 -1
  576. package/dist/telemetry/session-metrics.d.ts +15 -4
  577. package/dist/telemetry/session-metrics.js +88 -52
  578. package/dist/telemetry/telemetry.d.ts +38 -2
  579. package/dist/telemetry/telemetry.js +144 -34
  580. package/dist/telemetry/verification-of.d.ts +3 -1
  581. package/dist/telemetry/verification-of.js +13 -4
  582. package/dist/wire-journal.d.ts +2 -2
  583. package/dist/wire-journal.js +20 -6
  584. package/docs/README.md +3 -3
  585. package/docs/actions.mdx +6 -3
  586. package/docs/adapters.md +1 -1
  587. package/docs/agent-cheatsheet.md +25 -28
  588. package/docs/architecture.md +5 -5
  589. package/docs/autodrive.md +33 -28
  590. package/docs/benchmarks.md +5 -5
  591. package/docs/best-practices.mdx +27 -9
  592. package/docs/capabilities.mdx +14 -16
  593. package/docs/cli/affected.mdx +1 -1
  594. package/docs/cli/cloud.mdx +54 -75
  595. package/docs/cli/doctor.mdx +14 -3
  596. package/docs/cli/drive.mdx +20 -14
  597. package/docs/cli/feedback.mdx +3 -3
  598. package/docs/cli/gate.mdx +7 -2
  599. package/docs/cli/help.mdx +50 -55
  600. package/docs/cli/init.mdx +43 -28
  601. package/docs/cli/license.mdx +12 -8
  602. package/docs/cli/mcp.mdx +4 -4
  603. package/docs/cli/open.mdx +3 -3
  604. package/docs/cli/report.mdx +4 -2
  605. package/docs/cli/restart.mdx +2 -2
  606. package/docs/cli/rollback.mdx +14 -8
  607. package/docs/cli/serve.mdx +4 -4
  608. package/docs/cli/setup.mdx +23 -0
  609. package/docs/cli/status.mdx +18 -5
  610. package/docs/cli/stop.mdx +67 -8
  611. package/docs/cli/try.mdx +62 -0
  612. package/docs/cli/update.mdx +4 -3
  613. package/docs/cli/verify.mdx +17 -6
  614. package/docs/cli/version.mdx +5 -4
  615. package/docs/cli.mdx +111 -42
  616. package/docs/debugging.md +3 -3
  617. package/docs/deploy-checks.md +1 -1
  618. package/docs/desktop.mdx +9 -3
  619. package/docs/enterprise.md +11 -10
  620. package/docs/environment.mdx +7 -8
  621. package/docs/faq.mdx +3 -3
  622. package/docs/first-drive.md +5 -4
  623. package/docs/flows.md +35 -27
  624. package/docs/for-agents.md +4 -5
  625. package/docs/frameworks.mdx +32 -21
  626. package/docs/getting-started.md +65 -61
  627. package/docs/human-control.md +16 -16
  628. package/docs/index.mdx +15 -42
  629. package/docs/install-agentic.mdx +22 -37
  630. package/docs/install-manual.mdx +23 -13
  631. package/docs/instrumentation.mdx +5 -3
  632. package/docs/integration-patterns.md +7 -7
  633. package/docs/license-activation.mdx +1 -1
  634. package/docs/multi-agent-testing.md +24 -6
  635. package/docs/packages/babel-plugin.mdx +4 -2
  636. package/docs/packages/browser.mdx +16 -10
  637. package/docs/packages/core.mdx +12 -5
  638. package/docs/packages/electron.mdx +3 -2
  639. package/docs/packages/engine.mdx +1 -1
  640. package/docs/packages/eslint-plugin.mdx +18 -12
  641. package/docs/packages/next.mdx +8 -7
  642. package/docs/packages/open-verification.mdx +1 -1
  643. package/docs/packages/server.mdx +5 -5
  644. package/docs/packages/tauri.mdx +9 -9
  645. package/docs/packages/test.mdx +4 -10
  646. package/docs/packages/vite-plugin.mdx +32 -4
  647. package/docs/packages.mdx +11 -15
  648. package/docs/platform-integration.md +6 -5
  649. package/docs/predicates.mdx +40 -24
  650. package/docs/quickstart.mdx +69 -30
  651. package/docs/required-checks.md +8 -7
  652. package/docs/reticle-manual.md +15 -5
  653. package/docs/skill-file.mdx +17 -79
  654. package/docs/skill-setup.md +9 -9
  655. package/docs/skill.md +200 -0
  656. package/docs/system-map.md +7 -7
  657. package/docs/telemetry.md +23 -25
  658. package/docs/testing.md +4 -4
  659. package/docs/token-efficiency.md +12 -12
  660. package/docs/tools/act-and-wait.mdx +9 -2
  661. package/docs/tools/act-sequence.mdx +6 -7
  662. package/docs/tools/act.mdx +2 -2
  663. package/docs/tools/assert.mdx +18 -17
  664. package/docs/tools/console.mdx +9 -9
  665. package/docs/tools/inspect.mdx +16 -7
  666. package/docs/tools/look.mdx +24 -0
  667. package/docs/tools/navigate.mdx +5 -3
  668. package/docs/tools/network.mdx +2 -2
  669. package/docs/tools/observe.mdx +6 -6
  670. package/docs/tools/overview.mdx +34 -33
  671. package/docs/tools/query.mdx +5 -5
  672. package/docs/tools/session-and-feedback.mdx +22 -13
  673. package/docs/tools/sessions.mdx +8 -8
  674. package/docs/tools/snapshot.mdx +6 -5
  675. package/docs/tools/state.mdx +9 -9
  676. package/docs/tools/tools-and-run.mdx +26 -24
  677. package/docs/tools/verify.mdx +28 -0
  678. package/docs/tools/wait-for.mdx +8 -4
  679. package/docs/troubleshooting.mdx +21 -6
  680. package/docs/usage.md +55 -46
  681. package/docs/use-cases.mdx +3 -3
  682. package/docs/vs-chrome-devtools-mcp.mdx +9 -6
  683. package/docs/vs-playwright-mcp.mdx +3 -1
  684. package/docs/what-is-recorded.md +17 -5
  685. package/docs/what-is-reticle.mdx +5 -3
  686. package/docs/why-reticle.mdx +1 -1
  687. package/package.json +9 -12
  688. package/dist/command/cli/demo/demo-page.d.ts +0 -78
  689. package/dist/command/cli/demo/demo-page.js +0 -241
  690. package/dist/command/cli/demo/demo-run.d.ts +0 -38
  691. package/dist/command/cli/demo/demo-run.js +0 -138
  692. package/dist/features/harness/driver.d.ts +0 -50
  693. package/dist/features/harness/driver.js +0 -236
  694. package/dist/features/harness/jev-driver.d.ts +0 -188
  695. package/dist/features/harness/jev-driver.js +0 -678
  696. package/dist/features/harness/openai-driver.d.ts +0 -58
  697. package/dist/features/harness/openai-driver.js +0 -206
  698. package/dist/judgement/hunt/hunt-report.d.ts +0 -49
  699. package/dist/judgement/hunt/hunt-report.js +0 -84
  700. package/dist/language/flows/buddy-status.d.ts +0 -25
  701. package/dist/language/flows/buddy-status.js +0 -32
  702. package/dist/language/flows/change/watch-batcher.d.ts +0 -18
  703. package/dist/language/flows/change/watch-batcher.js +0 -19
  704. package/dist/memory/cloud/harness-offer.d.ts +0 -44
  705. package/dist/memory/cloud/harness-offer.js +0 -145
  706. package/dist/memory/project/dir/fill-value-store.d.ts +0 -32
  707. package/dist/memory/project/dir/fill-value-store.js +0 -88
  708. package/dist/surface/tools/feature-capture.d.ts +0 -151
  709. package/dist/surface/tools/feature-capture.js +0 -235
  710. package/dist/surface/tools/tool-hit-rate.d.ts +0 -87
  711. package/dist/surface/tools/tool-hit-rate.js +0 -90
  712. package/dist/telemetry/harness-drive.d.ts +0 -4
  713. package/dist/telemetry/harness-drive.js +0 -35
  714. package/dist/telemetry/identify.d.ts +0 -22
  715. package/dist/telemetry/identify.js +0 -73
  716. package/docs/cli/capsules.mdx +0 -70
  717. package/docs/cli/hunt.mdx +0 -73
  718. package/docs/cli/identify.mdx +0 -76
  719. package/docs/cli/kill.mdx +0 -91
  720. package/docs/cli/watch.mdx +0 -62
  721. package/docs/local-registry.md +0 -143
@@ -1,3 +1,13 @@
1
+ /**
2
+ * Action tools — reticle_act and reticle_act_and_wait. Split out of tools.ts to keep that file under
3
+ * the line cap and assembled back into the tool list there via ...ACT_TOOLS; the native-input attempt
4
+ * itself lives in real-input-attempt.ts for the same reason.
5
+ *
6
+ * `reticle_act_sequence` is a sibling file and is assembled by `tools.ts` directly. It used to be
7
+ * re-exported through this list, which made a cycle out of nothing: that file needs `actCommand` from
8
+ * here, and a registry is the right place to collect a definition from.
9
+ */
10
+ import { checkWords, runIdOfCall } from '../../judgement/runs/drive-run.js';
1
11
  import { z } from 'zod';
2
12
  import { aliasParam } from './args/alias-args.js';
3
13
  import { resolveSessionWithin } from '../../portal/session/timing/resolve-within.js';
@@ -18,10 +28,11 @@ import { gapsForAction } from '@reticlehq/engine/evidence/instrumentation-gaps.j
18
28
  import { withGapNovelty } from './gap-novelty.js';
19
29
  import { noteSessionGaps } from '@reticlehq/engine/evidence/gap-ledger.js';
20
30
  import { isChangeUndeclared } from '@reticlehq/engine/evidence/undeclared-change.js';
21
- import { intentDebt, openSessionIntents } from '../../memory/intent/open-intents.js';
31
+ import { intentDebt, ledgerFor } from '../../memory/intent/open-intents.js';
22
32
  import { dischargeInlineIntent, inlineVerdictId, linkInlineIntent, } from '../../memory/intent/inline-intent.js';
23
33
  import { declaresState } from '@reticlehq/engine/question/predicate/predicate-asks.js';
24
34
  import { isStateUnwatched } from '@reticlehq/engine/evidence/blind-spots.js';
35
+ import { hiddenMatchNote } from '@reticlehq/engine/evidence/already-true.js';
25
36
  import { inFlightRequestLabels, repeatedRequestLabels } from './act/settle-in-flight.js';
26
37
  import { finishAfterMatch } from './act/after-match.js';
27
38
  import { noteProved } from './act/proved-controls.js';
@@ -42,32 +53,21 @@ import { currentOf, healthEnvelope, refuseIfThrottled } from '../../portal/sessi
42
53
  import { pausedShortCircuit, pausedOutputShape, withControl, PAUSED_NO_VERDICT, } from '../../portal/session/control-envelope.js';
43
54
  import { asNumber, asRecord, asString } from '@reticlehq/core';
44
55
  import { sourceOf } from './tools-helpers.js';
56
+ import { confirmedByDeclaration } from './act/act-danger.js';
45
57
  import { dispatchAct, preflightAct } from './act/act-preflight.js';
46
- import { followLostObservation } from './act/act-observation.js';
58
+ import { checkNet, disabledTargetNote, followLostObservation } from './act/act-observation.js';
47
59
  import { intentArg, sessionIdShape } from './tool-kit.js';
48
60
  import { verdictIntentGap } from '@reticlehq/engine/evidence/verdict-intent-gap.js';
49
61
  import { asActionType, gradeOf } from './act/act-helpers.js';
50
62
  import { resolveActTarget } from './act/act-target.js';
63
+ import { screenRequestFindings, withAdvisories } from './act/screen-request.js';
51
64
  import { tryRealInput, rewriteUploadArgs, HOVER_NEEDS_POINTER_MSG } from './real-input-attempt.js';
52
65
  import { gradeOfPredicate } from './assert/assert-grade.js';
53
66
  import { readAlreadyTrue } from './act/already-true.js';
67
+ import { noteSourceSeen } from '../../portal/session/recorded-gaps.js';
54
68
  /**
55
- * Narrow the wire's `action` to a real ActionType, or undefined.
56
- *
57
- * It used to be `asString(args['action']) ?? ''`, so an unknown or missing action became the empty
58
- * string and travelled on — reaching the browser as a command it could not perform, and reported back
59
- * as a generic failure rather than "that is not an action". Validate at the boundary, per the project's
60
- * unknown-plus-narrowing rule, so a typo is rejected where it can still be explained.
61
- */
62
- /**
63
- * The action vocabulary, derived from ActionType — never retyped.
64
- *
65
- * The description used to omit callable actions such as blur, upload and drag,
66
- * because a hand-copied list drifts the moment
67
- * someone adds an arm. Deriving both the schema and the prose from the enum makes that impossible.
68
- *
69
- * The handler already refused an unknown action with a good message; the schema now refuses it
70
- * one layer earlier, before any session is resolved or any work is done.
69
+ * The action vocabulary, derived from ActionType — never retyped: a hand-copied list once omitted
70
+ * blur, upload and drag. The schema refuses an unknown action before any session is resolved.
71
71
  */
72
72
  const ACTION_TYPE_VALUES = Object.values(ActionType);
73
73
  const actionTypeEnum = z.enum(ACTION_TYPE_VALUES);
@@ -102,9 +102,8 @@ export async function actCommand(deps, session, actArgs, timeoutMs) {
102
102
  };
103
103
  }
104
104
  const bridgeArgs = { ...actArgs, args: rewritten };
105
- return timeoutMs !== undefined
106
- ? session.command(ReticleCommand.ACT, bridgeArgs, timeoutMs)
107
- : session.command(ReticleCommand.ACT, bridgeArgs);
105
+ // What the acted element shows (test id, source) is noted in `Session.command`, Harness acts too.
106
+ return session.command(ReticleCommand.ACT, bridgeArgs, timeoutMs);
108
107
  }
109
108
  export const ACT_TOOLS = [
110
109
  {
@@ -124,7 +123,7 @@ export const ACT_TOOLS = [
124
123
  args: z
125
124
  .record(z.unknown())
126
125
  .optional()
127
- .describe('Action-specific arguments: { value } for fill/select, { text } for type/press (the key NAME, e.g. Escape or Tab), { modifiers: ["Meta","Shift"] } for a press shortcut (Meta/Control/Shift/Alt — a Cmd+K), { toRef } for drag (the ref to drop ON — without it the drag lands nowhere), { native: true } to force a trusted native click, { holdMs: N } to keep the pointer DOWN for N ms (hold-to-confirm controls; effect.heldMs reports what was achieved), { confirmDangerous: true } to allow a potentially destructive control — a permission gate, NOT a duration. For upload: { path } is a path on disk (absolute or relative to the project root; the daemon reads the file and delivers real bytes to the file picker — this is the way to verify document-ingestion flows); or { name, content?, type? } to supply inline bytes directly.'),
126
+ .describe('Action-specific arguments: { value } for fill/select, { text } for type/press (the key NAME, e.g. Escape or Tab), { modifiers: ["Meta","Shift"] } for a press shortcut (Meta/Control/Shift/Alt — a Cmd+K), { toRef } for drag (the ref to drop ON — without it the drag lands nowhere), { native: true } to force a trusted native click, { holdMs: N } to keep the pointer or the key DOWN for N ms (hold-to-confirm controls; effect.heldMs reports what was achieved), { confirmDangerous: true } to allow a potentially destructive control — a permission gate, NOT a duration. For press: { keys: ["Control","k"] } holds several keys down TOGETHER (pressed in order, released in reverse) and { code } names the physical key — both stay on the in-page dispatcher, the only path that can express them. For upload: { path } is a path on disk (absolute or relative to the project root; the daemon reads the file and delivers real bytes to the file picker — this is the way to verify document-ingestion flows); or { name, content?, type? } to supply inline bytes directly.'),
128
127
  refuseWhenThrottled: z
129
128
  .boolean()
130
129
  .optional()
@@ -193,7 +192,7 @@ export const ACT_TOOLS = [
193
192
  // drive native pointer input when a provider is available; otherwise fall back.
194
193
  const real = await tryRealInput(deps, session, ref, action, args);
195
194
  if (real.result !== undefined) {
196
- captureAct(deps.recordings, args, real.result, routeBefore);
195
+ captureAct(deps.recordings, args, real.result, routeBefore, session.id);
197
196
  settledOutcome = real.settled ?? undefined;
198
197
  // Native input reports no synthetic effect block, so nothing measured in-target: undefined
199
198
  // (the weaker empty-window test), never a fabricated zero.
@@ -217,7 +216,7 @@ export const ACT_TOOLS = [
217
216
  });
218
217
  if (!result.ok)
219
218
  throw new Error(result.error ?? 'act failed');
220
- captureAct(deps.recordings, args, result.result, routeBefore);
219
+ captureAct(deps.recordings, args, result.result, routeBefore, session.id);
221
220
  // lift dispatch/settle status to the envelope (a settle timeout is NOT a failure).
222
221
  const r = asRecord(result.result);
223
222
  if ('boolean' === typeof r['settled'])
@@ -240,7 +239,7 @@ export const ACT_TOOLS = [
240
239
  });
241
240
  }
242
241
  finally {
243
- deps.recordings.markEnded(pathOf(session.url));
242
+ deps.recordings.markEnded(pathOf(session.url), session.id);
244
243
  // Close the window on every exit (settle or throw), recording the action + settle outcome.
245
244
  session.finishAction(undefined, settledOutcome, true === settledOutcome ? session.elapsed() - since : undefined);
246
245
  }
@@ -312,6 +311,8 @@ export const ACT_TOOLS = [
312
311
  observed: z.string().optional(),
313
312
  expected: z.string().optional(),
314
313
  assertion: z.string().optional(),
314
+ caseOnlyMiss: z.boolean().optional(),
315
+ wouldHold: z.string().optional(),
315
316
  }),
316
317
  trace: z
317
318
  .unknown()
@@ -387,7 +388,9 @@ export const ACT_TOOLS = [
387
388
  // Omitting `until` waits for the page to settle (idle) — the deterministic default vs a sleep.
388
389
  // `predicate` is what reticle_assert / reticle_wait_for call this — see alias-args.ts.
389
390
  const withUntil = aliasParam(args, 'until', ['predicate']);
390
- const until = withUntil['until'] !== undefined
391
+ // Declared: the consequence is named, which also confirms a named dangerous control.
392
+ const untilNamed = withUntil['until'] !== undefined;
393
+ const until = untilNamed
391
394
  ? parsePredicate(withUntil['until'])
392
395
  : { kind: PredicateKind.SETTLED };
393
396
  // BEFORE the action. A body clause this session cannot answer would fail whatever the app
@@ -400,6 +403,8 @@ export const ACT_TOOLS = [
400
403
  // the undeclared-change gap silent on THIS verdict rather than the next one: it reads the
401
404
  // ledger below and finds something open. The discharge comes after that read.
402
405
  const intentId = await linkInlineIntent(deps, asString(args['sessionId']), asString(args['intent']), PredicateKind.SETTLED === until.kind ? undefined : until);
406
+ // Bound while the session is live: the action may take the tab off the app's origin.
407
+ const readLedger = ledgerFor(deps, asString(args['sessionId']));
403
408
  // Everything refusable without touching the page — see act-preflight.ts.
404
409
  preflightAct(asRecord(args['args']), until);
405
410
  // Resolve `target` to a ref BEFORE the action window opens, so the lookup is not attributed to
@@ -437,7 +442,7 @@ export const ACT_TOOLS = [
437
442
  const actResult = await dispatchAct(() => actCommand(deps, session, {
438
443
  ref: resolved.ref,
439
444
  action: args['action'],
440
- args: args['args'] ?? {},
445
+ args: confirmedByDeclaration(asRecord(args['args']), args['target'], untilNamed),
441
446
  }));
442
447
  if (actResult !== null) {
443
448
  if (!actResult.ok)
@@ -478,13 +483,13 @@ export const ACT_TOOLS = [
478
483
  const r = asRecord(actResult?.result);
479
484
  if ('boolean' === typeof r['settled'])
480
485
  settledOutcome = r['settled'];
481
- // Where the acted element is written. Captured at act time alongside the anchor, so it is
482
- // available even when the action unmounted its own target.
486
+ // Where the acted element is written, captured at act time even if the action unmounted it.
483
487
  const actedSource = sourceOf(r['source']);
484
- // Remembered on the session so a LATER assertion can name a file even when its failure has no
485
- // element to point at — a signal that never fired, a request that was never made.
488
+ // Remembered so a LATER assertion can name a file with no element to point at, and so the
489
+ // app's coverage counts source mapping as seen.
486
490
  const actedSourceLabel = actedSource === undefined ? undefined : `${actedSource.file}:${String(actedSource.line)}`;
487
491
  session.lastAct.markSource(actedSourceLabel);
492
+ noteSourceSeen(session, actedSourceLabel);
488
493
  const windowEvents = session.eventsSince(since);
489
494
  const trace = summarizeReaction(buildReactionReport(windowEvents, session.elapsed() - since));
490
495
  // The bounded Tier-1 causal summary — net/console/state/storage diffs the trace's counts miss.
@@ -522,15 +527,21 @@ export const ACT_TOOLS = [
522
527
  // Coverage: cross-origin frames / other blind spots the SDK reported during this window mean the
523
528
  // verdict didn't see everything — say so, never imply full coverage.
524
529
  const spots = blindSpotsFromState(session.blindSpots(), session.runtime);
525
- const coverage = buildCoverageStatement(spots);
530
+ // The window's own counts, so sampling before it is not described as this window's (#1414).
531
+ const windowSpots = blindSpotsFromState(session.blindSpots(since), session.runtime);
532
+ const coverage = buildCoverageStatement(spots, windowSpots);
526
533
  const absenceBlindSpot = absenceBlindSpotNote(until, spots);
534
+ // A green resting on hidden matches says the node exists, not that it shows (#1408).
535
+ const hiddenMatch = hiddenMatchNote(until, verdict.evidence);
527
536
  // Nothing subscribed ⇒ the state channel is dark, and the summary must say so rather than
528
537
  // report an empty diff list that reads like a fact about the app. See CausalSummary.
529
538
  const stateUnwatched = isStateUnwatched(spots);
530
539
  // Only a spot that IMPEACHES the capture belongs in integrity — see impeachesCapture. A
531
540
  // structural boundary (virtualized rows, a cross-origin frame) is reported as coverage and
532
541
  // must not downgrade a verdict about what WAS observed.
533
- const impeaching = buildCoverageStatement(spots.filter((s) => impeachesCapture(s.kind)));
542
+ const impeaching = buildCoverageStatement(
543
+ // The WINDOW's blind spots: sampling before it is a coverage fact, not this verdict's gap (#1414).
544
+ windowSpots.filter((s) => impeachesCapture(s.kind)));
534
545
  // Same rule as reticle_assert: a browser-side transport gap means part of this window was
535
546
  // never seen, which is what `blindSpots` exists to say. `truncated` above covers the SERVER
536
547
  // ring buffer evicting; this covers the BROWSER queue overflowing, and they are not the same
@@ -569,6 +580,10 @@ export const ACT_TOOLS = [
569
580
  ...(0 === impeachingNotes.length ? {} : { blindSpots: impeachingNotes }),
570
581
  losses,
571
582
  });
583
+ // A refuted expectation must not ride into a regression flow cut from the ambient tape; it is
584
+ // kept as the capsule below instead. See RecordingStore.unassertLast.
585
+ if (!verdict.pass && actResult !== null)
586
+ deps.recordings.unassertLast();
572
587
  const capsuleSaved = await saveFailedAssertCapsule({
573
588
  deps,
574
589
  verdict,
@@ -606,6 +621,8 @@ export const ACT_TOOLS = [
606
621
  prior,
607
622
  actionSince: since,
608
623
  expectedFailures: declared.netFailures,
624
+ namedNetUrls: declared.netUrls,
625
+ repeatableNetUrls: declared.repeatableNetUrls,
609
626
  // A consequence that was already true before the action proves nothing about it, so it is
610
627
  // not evidence the destination rendered either — `alreadyTrue` decides that, once.
611
628
  renderProved: verdict.pass && !alreadyTrue && declared.rendersContent,
@@ -617,9 +634,18 @@ export const ACT_TOOLS = [
617
634
  });
618
635
  // The single field an agent reads. Everything below it is the evidence it was derived from;
619
636
  // this is the only one that has to be interpreted, and now it interprets itself.
620
- const outcomePending = acceptedWriteLabels(windowEvents);
637
+ // Same routing as the assert path (#1120), fed by the links this verdict PROVED. On red,
638
+ // `gradedLinks` is the declared surface (every anyOf branch), which must not exempt a 202
639
+ // the verdict never rested on — so only a green passes it through.
640
+ const outcomePending = acceptedWriteLabels(windowEvents, {
641
+ appUrl: session.url,
642
+ background: session.background,
643
+ asserted: verdict.pass ? gradedLinks : [],
644
+ });
621
645
  const outcomeUnread = unreadWriteLabels(windowEvents);
622
646
  const stillInFlight = inFlightRequestLabels(windowEvents, session.url, session.background);
647
+ // A click on a disabled control cannot cause anything: a miss there is not the app's.
648
+ const inconclusive = verdict.inconclusive ?? disabledTargetNote(verdict.pass, actResult?.result);
623
649
  const { decision, durable } = await withDurability(args['durable'], until, decideVerified({
624
650
  pass: verdict.pass,
625
651
  // Threaded rather than looked up: decideVerified is pure and has no session.
@@ -635,7 +661,7 @@ export const ACT_TOOLS = [
635
661
  ...(alreadyTrue ? { alreadyTrue } : {}),
636
662
  ...(alreadyTrueHiddenMatch ? { alreadyTrueHiddenMatch } : {}),
637
663
  // An assertion nobody could evaluate must not be reported as one the app failed.
638
- ...(verdict.inconclusive === undefined ? {} : { inconclusive: verdict.inconclusive }),
664
+ ...(inconclusive === undefined ? {} : { inconclusive }),
639
665
  // Nor must one nobody could OBSERVE. This is the act path, so it is the one that produced
640
666
  // the measured false red: a reload mid-wait, graded assertion_failed at the clicked
641
667
  // component's own file and line.
@@ -643,6 +669,7 @@ export const ACT_TOOLS = [
643
669
  ? { observationLost: true, lastUrl: session.url }
644
670
  : {}),
645
671
  ...(absenceBlindSpot === undefined ? {} : { absenceBlindSpot }),
672
+ ...(hiddenMatch === undefined ? {} : { hiddenMatch }),
646
673
  honesty,
647
674
  contradictions,
648
675
  ...(0 === outcomePending.length ? {} : { outcomePending }),
@@ -674,7 +701,7 @@ export const ACT_TOOLS = [
674
701
  // Read ONCE and used twice: `changeUndeclared` asks whether the ledger is empty, and the
675
702
  // undischarged-intent gap asks how much it still holds. Two reads would be two chances for
676
703
  // them to disagree about the same file.
677
- const openIntents = await openSessionIntents(deps, asString(args['sessionId']));
704
+ const openIntents = await readLedger();
678
705
  const changeUndeclared = await isChangeUndeclared(session.currentEditEpoch, () => Promise.resolve(openIntents));
679
706
  const intentGap = verdictIntentGap({
680
707
  verified: decision.verified,
@@ -716,6 +743,7 @@ export const ACT_TOOLS = [
716
743
  verdictId: inlineVerdictId(ReticleTool.ACT_AND_WAIT, deps.now()),
717
744
  grade,
718
745
  at: deps.now(),
746
+ runId: runIdOfCall(session.id), // the run it lands in: linked by id, never by time
719
747
  },
720
748
  // Where the acted element is written, so the record can name a file somebody would open
721
749
  // to change the thing it describes.
@@ -725,14 +753,15 @@ export const ACT_TOOLS = [
725
753
  claim: describeWaitTarget(until),
726
754
  verified: decision.verified,
727
755
  ...(actedSourceLabel === undefined ? {} : { source: actedSourceLabel }),
756
+ ...checkWords(verdict),
728
757
  // TRUE here, and false on the `assert` path, and the difference is the point. This tool
729
758
  // takes `until` BEFORE it acts: the consequence is named in advance and can then only be
730
759
  // met or missed. A claim written after the fact can be shaped to fit whatever happened,
731
760
  // which is why the two are recorded apart rather than assumed alike.
732
761
  declaredBeforeActing: true,
762
+ ...checkNet(verdict, windowEvents), // the calls that explain a miss, or the one that held
733
763
  grade: gradeOfPredicate(until),
734
- // What the declared consequence READ. The run fold has only the journal, so a kind absent
735
- // here was being invented there as `element`. Same field, same reason, on the assert path.
764
+ // What the declared consequence READ: a kind absent here was invented by the run fold.
736
765
  kind: until.kind,
737
766
  // The deciding clause, kept — and it was NOT, on this path, the commonest one. `unknown`
738
767
  // alone cannot tell an outcome that has not arrived from a capture that could not be
@@ -789,7 +818,8 @@ export const ACT_TOOLS = [
789
818
  // whole point is catching what NOBODY suspected. It now travels with the action, so an
790
819
  // agent cannot miss it by not asking. Omitted entirely when clean, so a healthy action
791
820
  // pays nothing.
792
- ...(contradictions.length > 0 ? { contradictions } : {}),
821
+ // + the opt-in, advisory screen/request check, appended AFTER the verdict (act/screen-request.ts).
822
+ ...withAdvisories(contradictions, await screenRequestFindings(session, windowEvents)),
793
823
  ...(durable === undefined ? {} : { durable }),
794
824
  honesty: honestyForVerdict(String(decision.verified), honesty),
795
825
  // Without its summary: it is byte-identical to `summary` two fields up. See wireCapsule.
@@ -802,8 +832,8 @@ export const ACT_TOOLS = [
802
832
  }
803
833
  finally {
804
834
  if (dispatched !== undefined)
805
- captureVerdictedAct(deps.recordings, args, dispatched.result, routeBeforeWait, recordedVerdict);
806
- deps.recordings.markEnded(pathOf(currentOf(deps.sessions, session).url));
835
+ captureVerdictedAct(deps.recordings, args, dispatched.result, routeBeforeWait, recordedVerdict, session.id);
836
+ deps.recordings.markEnded(pathOf(currentOf(deps.sessions, session).url), session.id);
807
837
  acted.finishAction(verdictEffect, settledOutcome, true === settledOutcome ? acted.elapsed() - actedSince : undefined);
808
838
  }
809
839
  },
@@ -0,0 +1,7 @@
1
+ /** Tests only. */
2
+ export declare function resetAppNoteLearning(): void;
3
+ /**
4
+ * Read one verdict result. Returns a CONFIRMED note to persist, if this call confirmed one.
5
+ * `session` is the agent session (MCP connection); undefined does nothing.
6
+ */
7
+ export declare function learnFromVerdict(session: string | undefined, args: Record<string, unknown>, result: unknown): string | undefined;
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Learning an app note from a corrected failure. Pure: the dispatcher does the disk write.
3
+ *
4
+ * A failed verdict whose diagnosis names the fix — the text is there in another case, the name is on
5
+ * a control with another role — is a CANDIDATE. It becomes a note only when a later passing verdict
6
+ * in the same agent session used that fix. So a note records what worked, never what was guessed.
7
+ *
8
+ * Nothing here can change a verdict: it reads results after they are decided, and its only output
9
+ * is a sentence. See app-notes.ts.
10
+ */
11
+ import { Verified, asRecord } from '@reticlehq/core';
12
+ const MAX_PENDING = 10;
13
+ const pendingBySession = new Map();
14
+ /** Tests only. */
15
+ export function resetAppNoteLearning() {
16
+ pendingBySession.clear();
17
+ }
18
+ /** The verdict block, wherever this tool keeps it (nested on act_and_wait, spread on assert). */
19
+ function verdictOf(result) {
20
+ return 'object' === typeof result['verdict'] && null !== result['verdict']
21
+ ? asRecord(result['verdict'])
22
+ : result;
23
+ }
24
+ function candidatesIn(result) {
25
+ const verdict = verdictOf(result);
26
+ const evidence = asRecord(verdict['evidence']);
27
+ const out = [];
28
+ const shown = evidence['caseMiss'];
29
+ if (true === verdict['caseOnlyMiss'] && 'string' === typeof shown && shown.length > 0) {
30
+ out.push({
31
+ usedWhen: [JSON.stringify(shown).slice(1, -1), '"ignoreCase":true'],
32
+ note: `this app writes "${shown}" — match that case exactly, or use ignoreCase: true where case does not matter`,
33
+ });
34
+ }
35
+ const nearest = evidence['nearestByName'];
36
+ if (Array.isArray(nearest) && nearest.length > 0) {
37
+ const first = asRecord(nearest[0]);
38
+ const name = first['name'];
39
+ const role = first['role'];
40
+ if ('string' === typeof name && name.length > 0) {
41
+ const kind = 'string' === typeof role && role.length > 0 ? `a ${role}` : 'an element with no role';
42
+ out.push({
43
+ usedWhen: [
44
+ `"label":"${name}"`,
45
+ ...('string' === typeof role && role.length > 0 ? [`"role":"${role}"`] : []),
46
+ ],
47
+ note: `"${name}" is ${kind} here — target it by { label: "${name}" }, not by a guessed role`,
48
+ });
49
+ }
50
+ }
51
+ return out;
52
+ }
53
+ /**
54
+ * Read one verdict result. Returns a CONFIRMED note to persist, if this call confirmed one.
55
+ * `session` is the agent session (MCP connection); undefined does nothing.
56
+ */
57
+ export function learnFromVerdict(session, args, result) {
58
+ if (session === undefined || 'object' !== typeof result || null === result)
59
+ return undefined;
60
+ const r = result;
61
+ if (Verified.NO === r['verified']) {
62
+ const found = candidatesIn(r);
63
+ if (found.length > 0) {
64
+ const pending = pendingBySession.get(session) ?? [];
65
+ pendingBySession.set(session, [...pending, ...found].slice(-MAX_PENDING));
66
+ }
67
+ return undefined;
68
+ }
69
+ if (Verified.YES !== r['verified'])
70
+ return undefined;
71
+ const pending = pendingBySession.get(session);
72
+ if (pending === undefined || 0 === pending.length)
73
+ return undefined;
74
+ const written = JSON.stringify(args);
75
+ const used = pending.find((c) => c.usedWhen.some((needle) => written.includes(needle)));
76
+ if (used === undefined)
77
+ return undefined;
78
+ pendingBySession.set(session, pending.filter((c) => c !== used));
79
+ return used.note;
80
+ }
@@ -0,0 +1,4 @@
1
+ /** The notes for the project at `root` (its `.reticle` directory). Never throws. */
2
+ export declare function readAppNotes(root: string): string[];
3
+ /** Add a confirmed note; true when it was new. Never throws: a note is never why a call fails. */
4
+ export declare function addAppNote(root: string, note: string): boolean;
@@ -0,0 +1,48 @@
1
+ /**
2
+ * App notes: what an agent learned about TARGETING this app, kept for the next session.
3
+ *
4
+ * "The composer is a contenteditable labelled 'Ask a question'", "this app writes 'Trial' capitalised"
5
+ * — facts an agent pays one failed verdict to learn, and the next agent on the same app pays again.
6
+ * A note is written only after it was CONFIRMED (a later verdict that used it passed), so a guess
7
+ * never becomes lore.
8
+ *
9
+ * Hints, never evidence. Nothing that decides a verdict reads this file; it is surfaced to the agent
10
+ * in its first notices and in `reticle_context`, and an agent may use it to aim a check, never to
11
+ * pass one. Local to `.reticle/` (checked in with the project, so a team shares it through git).
12
+ */
13
+ import { existsSync, readFileSync, writeFileSync } from 'node:fs';
14
+ import { join } from 'node:path';
15
+ import { ReticleDir } from '@reticlehq/core';
16
+ /** Most notes kept: the oldest drop first. A notebook, not a database. */
17
+ const MAX_NOTES = 30;
18
+ function pathOf(root) {
19
+ return join(root, ReticleDir.APP_NOTES_FILE);
20
+ }
21
+ /** The notes for the project at `root` (its `.reticle` directory). Never throws. */
22
+ export function readAppNotes(root) {
23
+ try {
24
+ const path = pathOf(root);
25
+ if (!existsSync(path))
26
+ return [];
27
+ const parsed = JSON.parse(readFileSync(path, 'utf8'));
28
+ const notes = 'object' === typeof parsed && null !== parsed ? parsed.notes : [];
29
+ return Array.isArray(notes) ? notes.filter((n) => 'string' === typeof n) : [];
30
+ }
31
+ catch {
32
+ return [];
33
+ }
34
+ }
35
+ /** Add a confirmed note; true when it was new. Never throws: a note is never why a call fails. */
36
+ export function addAppNote(root, note) {
37
+ try {
38
+ const notes = readAppNotes(root);
39
+ if (notes.includes(note) || !existsSync(root))
40
+ return false;
41
+ const kept = [...notes, note].slice(-MAX_NOTES);
42
+ writeFileSync(pathOf(root), `${JSON.stringify({ notes: kept }, null, 2)}\n`);
43
+ return true;
44
+ }
45
+ catch {
46
+ return false;
47
+ }
48
+ }
@@ -0,0 +1,7 @@
1
+ export declare const STALE_BUILD_NOTICE = "Reticle's code on disk changed after this daemon started, so it is still running the old build. Restart it (`npx @reticlehq/server restart`) and retry before trusting a fix to Reticle itself.";
2
+ /** Newest `.js` mtime under `dir`, or 0 when it cannot be read. */
3
+ export declare function newestJsMtime(dir: string): number;
4
+ /** A watcher over one directory, started now. Exported for tests; the daemon uses the default. */
5
+ export declare function buildWatcher(dir: string, clock: () => number): (now?: number) => string | undefined;
6
+ /** The running daemon's watcher, started when this module is first loaded (daemon start). */
7
+ export declare const staleBuildNotice: (now?: number) => string | undefined;
@@ -0,0 +1,62 @@
1
+ /**
2
+ * "The daemon is running an older build than the one on disk."
3
+ *
4
+ * A daemon loads its code once. Rebuild Reticle (or update it in place) while one is running and
5
+ * every tool keeps answering from the old code — measured as most of a lost afternoon: fixes that
6
+ * "did not work" because the process serving them predated them. Nothing said so.
7
+ *
8
+ * So the newest `.js` mtime under this package's `dist` is read when the daemon starts, and again
9
+ * (at most every CHECK_EVERY_MS, on a tool call) to say once, in notices, that a restart is needed.
10
+ * A fact about the process, never about the app: no verdict reads it.
11
+ */
12
+ import { readdirSync, statSync } from 'node:fs';
13
+ import { dirname, join, resolve } from 'node:path';
14
+ import { fileURLToPath } from 'node:url';
15
+ /** How often the walk may run. A few hundred stats, so cheap, but not on every call. */
16
+ const CHECK_EVERY_MS = 30_000;
17
+ export const STALE_BUILD_NOTICE = "Reticle's code on disk changed after this daemon started, so it is still running the old build. Restart it (`npx @reticlehq/server restart`) and retry before trusting a fix to Reticle itself.";
18
+ /** `dist/` of this package: this file sits at dist/surface/tools/agent/. */
19
+ const DIST_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), '..', '..', '..');
20
+ /** Newest `.js` mtime under `dir`, or 0 when it cannot be read. */
21
+ export function newestJsMtime(dir) {
22
+ let newest = 0;
23
+ const walk = (at) => {
24
+ let entries;
25
+ try {
26
+ entries = readdirSync(at, { withFileTypes: true });
27
+ }
28
+ catch {
29
+ return;
30
+ }
31
+ for (const entry of entries) {
32
+ const path = join(at, entry.name);
33
+ if (entry.isDirectory())
34
+ walk(path);
35
+ else if (entry.name.endsWith('.js')) {
36
+ try {
37
+ newest = Math.max(newest, statSync(path).mtimeMs);
38
+ }
39
+ catch {
40
+ /* removed mid-walk: a build in progress, read again next time */
41
+ }
42
+ }
43
+ }
44
+ };
45
+ walk(dir);
46
+ return newest;
47
+ }
48
+ /** A watcher over one directory, started now. Exported for tests; the daemon uses the default. */
49
+ export function buildWatcher(dir, clock) {
50
+ const atStart = newestJsMtime(dir);
51
+ let checkedAt = clock();
52
+ let stale = false;
53
+ return (now = clock()) => {
54
+ if (!stale && now - checkedAt >= CHECK_EVERY_MS) {
55
+ checkedAt = now;
56
+ stale = atStart > 0 && newestJsMtime(dir) > atStart;
57
+ }
58
+ return stale ? STALE_BUILD_NOTICE : undefined;
59
+ };
60
+ }
61
+ /** The running daemon's watcher, started when this module is first loaded (daemon start). */
62
+ export const staleBuildNotice = buildWatcher(DIST_ROOT, () => Date.now());
@@ -0,0 +1,80 @@
1
+ /**
2
+ * The compact envelope: what a verdict result carries by default, and what waits behind
3
+ * `detail: "full"`.
4
+ *
5
+ * The rule (plan: "the middle ground — what a result carries"): answer the question, include what
6
+ * decides the next move, and give a cursor for the rest. A click on a cache-backed page used to
7
+ * return several thousand tokens, most of it store snapshots and counters, and the verdict was a
8
+ * field among them. Compaction never touches a decisive key — `verified`, `because`, the verdict's
9
+ * expected/observed/evidence, contradictions, capture integrity, failed requests, console errors,
10
+ * the acted element's source — and `compact-envelope.contract.test.ts` fails the build if it ever
11
+ * does. What it drops is redundant (identity fields the agent sent), restated (counts the `changed`
12
+ * line already says) or always one `reticle_observe { since }` away.
13
+ *
14
+ * It works by DROPPING named keys, never by allow-listing: a field added to a result later survives
15
+ * compaction until somebody decides it should not. The accurate direction to fail in.
16
+ *
17
+ * Applied once, at the dispatch chokepoint, to an agent's own calls. The Harness and the HUD read
18
+ * the full result; so does telemetry, which runs before this.
19
+ */
20
+ import { z } from 'zod';
21
+ /** The argument that asks for today's full envelope. */
22
+ export declare const DETAIL_ARG = "detail";
23
+ export declare const Detail: {
24
+ readonly COMPACT: "compact";
25
+ readonly FULL: "full";
26
+ };
27
+ export type Detail = (typeof Detail)[keyof typeof Detail];
28
+ /**
29
+ * The A/B control: `RETICLE_RESULT_DETAIL=full` makes every agent call answer as if it had passed
30
+ * `detail: "full"`, so the agent-loop benchmark can run compact against full on the same build with
31
+ * nothing else different — the measurement CLAUDE.md requires beside any token optimisation.
32
+ */
33
+ export declare const RESULT_DETAIL_ENV = "RETICLE_RESULT_DETAIL";
34
+ /**
35
+ * Did this call (or the daemon's environment) ask for the full envelope AND nothing else — no
36
+ * notices, no re-teach? Only an explicit ask: the A/B control arm, and an agent that said so.
37
+ */
38
+ export declare function wantsFull(args: Record<string, unknown>): boolean;
39
+ /**
40
+ * Did this call (or the daemon) ask for the compact envelope? Compaction is opt-in: in the
41
+ * agent-loop A/B the compact arm saved little per task and missed one failure the full arm caught,
42
+ * and a token saving ships only beside a correctness measurement that is at least as good.
43
+ */
44
+ export declare function wantsCompact(args: Record<string, unknown>): boolean;
45
+ /** The tools whose results are compacted. Each one's full shape stays one argument away. */
46
+ export declare const COMPACTED_TOOLS: ReadonlySet<string>;
47
+ /** Short enough for the per-turn surface; the reasoning lives in this file and the instructions. */
48
+ export declare const DETAIL_ARG_DESCRIPTION = "\"compact\" keeps only the deciding fields.";
49
+ /** Where the aliases a predicate was normalised from are named. */
50
+ export declare const NORMALIZED_KEY = "normalized";
51
+ /** The key the one-line "what changed" summary travels under. */
52
+ export declare const CHANGED_KEY = "changed";
53
+ /** Evidence with transport detail removed, recursively, keeping every deciding field. */
54
+ export declare function trimEvidence(value: unknown, depth?: number): unknown;
55
+ /**
56
+ * One line naming what moved: the route, the requests, the MEANINGFUL state paths (cache
57
+ * bookkeeping is already filtered out upstream), storage keys, fields and signals.
58
+ */
59
+ export declare function changedLine(summary: Record<string, unknown>): string | undefined;
60
+ /** One verdict result (act_and_wait, assert, wait_for), compacted. Idempotent. */
61
+ export declare function compactVerdict(result: Record<string, unknown>): Record<string, unknown>;
62
+ /** A sequence result, compacted per step. Idempotent. */
63
+ export declare function compactSequence(result: Record<string, unknown>): Record<string, unknown>;
64
+ /**
65
+ * The result as an agent receives it: full unless it asked for `detail: "compact"`.
66
+ *
67
+ * `agentCall` is the dispatcher's own judgement (an MCP connection, not the Harness or the HUD).
68
+ */
69
+ export declare function shapeForAgent(tool: string, args: Record<string, unknown>, result: unknown, agentCall: boolean): unknown;
70
+ /**
71
+ * The compacted tools, with `detail` accepted and the compact-only keys declared.
72
+ *
73
+ * Declared because a schema-strict client validates `structuredContent` against `outputSchema` and
74
+ * drops what is not there: `changed`, `ref` and `source` would be built and silently thrown away.
75
+ */
76
+ export declare function withCompactEnvelope<T extends {
77
+ name: string;
78
+ inputSchema: z.ZodRawShape;
79
+ outputSchema?: z.ZodRawShape;
80
+ }>(tools: T[]): T[];