@reticlehq/server 3.6.0 → 3.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (614) hide show
  1. package/SKILL.md +122 -123
  2. package/dist/command/cli/adhoc-suite.d.ts +14 -0
  3. package/dist/command/cli/adhoc-suite.js +42 -7
  4. package/dist/command/cli/adhoc-verdict.d.ts +18 -2
  5. package/dist/command/cli/adhoc-verdict.js +70 -6
  6. package/dist/command/cli/answers/gate-exit.d.ts +23 -0
  7. package/dist/command/cli/answers/gate-exit.js +45 -0
  8. package/dist/command/cli/answers/gate-hook-message.d.ts +2 -0
  9. package/dist/command/cli/answers/gate-hook-message.js +3 -1
  10. package/dist/command/cli/auth/device-flow.d.ts +13 -2
  11. package/dist/command/cli/auth/device-flow.js +17 -0
  12. package/dist/command/cli/cli-doctor.js +14 -0
  13. package/dist/command/cli/cli-flow-commands.d.ts +0 -11
  14. package/dist/command/cli/cli-flow-commands.js +28 -105
  15. package/dist/command/cli/cli-kill.js +3 -2
  16. package/dist/command/cli/cli-parse-grammar.d.ts +24 -0
  17. package/dist/command/cli/cli-parse-grammar.js +75 -0
  18. package/dist/command/cli/cli-parse-verify.d.ts +2 -0
  19. package/dist/command/cli/cli-parse-verify.js +18 -0
  20. package/dist/command/cli/cli-parse.d.ts +19 -28
  21. package/dist/command/cli/cli-parse.js +82 -182
  22. package/dist/command/cli/cli-update-commands.d.ts +1 -1
  23. package/dist/command/cli/cli-update-commands.js +61 -9
  24. package/dist/command/cli/cli-usage.d.ts +33 -0
  25. package/dist/command/cli/cli-usage.js +287 -0
  26. package/dist/command/cli/cli-verify.d.ts +34 -4
  27. package/dist/command/cli/cli-verify.js +81 -12
  28. package/dist/command/cli/cloud-cli.d.ts +13 -0
  29. package/dist/command/cli/cloud-cli.js +145 -333
  30. package/dist/command/cli/cloud-kit.d.ts +12 -0
  31. package/dist/command/cli/cloud-kit.js +41 -2
  32. package/dist/command/cli/cloud-link.d.ts +57 -0
  33. package/dist/command/cli/cloud-link.js +308 -0
  34. package/dist/command/cli/cloud-login.d.ts +15 -1
  35. package/dist/command/cli/cloud-login.js +67 -13
  36. package/dist/command/cli/context-command.d.ts +1 -0
  37. package/dist/command/cli/context-command.js +33 -0
  38. package/dist/command/cli/daemon-start-options.d.ts +3 -0
  39. package/dist/command/cli/daemon-start-options.js +24 -3
  40. package/dist/command/cli/doctor/doctor-coverage-line.d.ts +2 -0
  41. package/dist/command/cli/doctor/doctor-coverage-line.js +47 -0
  42. package/dist/command/cli/doctor/doctor-project-line.d.ts +0 -12
  43. package/dist/command/cli/doctor/doctor-project-line.js +5 -4
  44. package/dist/command/cli/doctor/doctor-rows.d.ts +6 -0
  45. package/dist/command/cli/doctor/doctor-rows.js +6 -0
  46. package/dist/command/cli/doctor/doctor-signing-line.d.ts +38 -0
  47. package/dist/command/cli/doctor/doctor-signing-line.js +114 -0
  48. package/dist/command/cli/known-regression.d.ts +13 -0
  49. package/dist/command/cli/known-regression.js +34 -0
  50. package/dist/command/cli/launch/sdk-version-match.d.ts +12 -0
  51. package/dist/command/cli/launch/sdk-version-match.js +25 -0
  52. package/dist/command/cli/lifecycle/daemon-lifecycle.js +11 -2
  53. package/dist/command/cli/mcp-command.d.ts +6 -0
  54. package/dist/command/cli/mcp-command.js +13 -5
  55. package/dist/command/cli/ports/port-holder.js +1 -1
  56. package/dist/command/cli/project-name.d.ts +29 -1
  57. package/dist/command/cli/project-name.js +107 -2
  58. package/dist/command/cli/setup-mcp-cli.d.ts +17 -1
  59. package/dist/command/cli/setup-mcp-cli.js +29 -8
  60. package/dist/command/cli/status/status-lines.d.ts +1 -0
  61. package/dist/command/cli/status/status-lines.js +47 -2
  62. package/dist/command/cli/status/workspace-links.d.ts +10 -0
  63. package/dist/command/cli/status/workspace-links.js +29 -0
  64. package/dist/command/cli/try-command.d.ts +96 -0
  65. package/dist/command/cli/try-command.js +362 -0
  66. package/dist/command/cli/tutorial.d.ts +0 -100
  67. package/dist/command/cli/tutorial.js +0 -178
  68. package/dist/command/cli/verify-results.d.ts +19 -0
  69. package/dist/command/cli/verify-results.js +29 -0
  70. package/dist/command/cli-onboarding.d.ts +0 -11
  71. package/dist/command/cli-onboarding.js +0 -15
  72. package/dist/command/cli.d.ts +14 -0
  73. package/dist/command/cli.js +103 -83
  74. package/dist/command/daemon/daemon-resilience.js +4 -4
  75. package/dist/command/daemon/daemon-resolve.d.ts +9 -1
  76. package/dist/command/daemon/daemon-resolve.js +49 -10
  77. package/dist/command/setup/bringup/bridge-port.d.ts +3 -1
  78. package/dist/command/setup/bringup/bridge-port.js +13 -3
  79. package/dist/command/setup/bringup/dev-server-log-cap.js +2 -0
  80. package/dist/command/setup/bringup/ensure-daemon.js +9 -2
  81. package/dist/command/setup/init/agent-restart.d.ts +23 -0
  82. package/dist/command/setup/init/agent-restart.js +28 -0
  83. package/dist/command/setup/init/init-port.d.ts +10 -1
  84. package/dist/command/setup/init/init-port.js +22 -2
  85. package/dist/command/setup/init/init-runtime.d.ts +12 -2
  86. package/dist/command/setup/init/init-runtime.js +96 -37
  87. package/dist/command/setup/node-effects.d.ts +2 -0
  88. package/dist/command/setup/node-effects.js +36 -8
  89. package/dist/command/setup/probe/existing-app.d.ts +12 -0
  90. package/dist/command/setup/probe/existing-app.js +14 -0
  91. package/dist/command/setup/remaining-steps.js +1 -1
  92. package/dist/command/setup/run-setup.d.ts +29 -9
  93. package/dist/command/setup/run-setup.js +34 -28
  94. package/dist/command/setup/setup-command.d.ts +23 -0
  95. package/dist/command/setup/setup-command.js +57 -4
  96. package/dist/command/setup/setup-mcp.js +25 -2
  97. package/dist/command/setup/tauri-signing.d.ts +19 -0
  98. package/dist/command/setup/tauri-signing.js +79 -0
  99. package/dist/command/setup/terminal/listeners.d.ts +10 -1
  100. package/dist/command/setup/terminal/listeners.js +37 -6
  101. package/dist/command/update/update-nudge.d.ts +9 -0
  102. package/dist/command/update/update-nudge.js +1 -1
  103. package/dist/command/update/updater.js +11 -15
  104. package/dist/command/version/version-nudge.js +3 -0
  105. package/dist/command/version/version-skew.d.ts +20 -1
  106. package/dist/command/version/version-skew.js +38 -2
  107. package/dist/features/crawl/crawl.js +14 -1
  108. package/dist/features/exhaust/ledger.d.ts +14 -14
  109. package/dist/features/harness/drive-report.d.ts +39 -5
  110. package/dist/features/harness/drive-report.js +271 -54
  111. package/dist/features/harness/drive-runs.d.ts +120 -0
  112. package/dist/features/harness/drive-runs.js +289 -0
  113. package/dist/features/harness/drivers.d.ts +1 -1
  114. package/dist/features/harness/drivers.js +1 -1
  115. package/dist/features/harness/explore/console-pages.d.ts +15 -0
  116. package/dist/features/harness/explore/console-pages.js +146 -0
  117. package/dist/features/harness/explore/disparity.d.ts +19 -0
  118. package/dist/features/harness/explore/disparity.js +71 -0
  119. package/dist/features/harness/explore/fake-app.d.ts +16 -0
  120. package/dist/features/harness/explore/fake-app.js +49 -0
  121. package/dist/features/harness/explore/goal-search.d.ts +26 -0
  122. package/dist/features/harness/explore/goal-search.js +144 -0
  123. package/dist/features/harness/explore/page-tree.d.ts +49 -0
  124. package/dist/features/harness/explore/page-tree.js +148 -0
  125. package/dist/features/harness/explore/site-map.d.ts +34 -0
  126. package/dist/features/harness/explore/site-map.js +150 -0
  127. package/dist/features/harness/goals.d.ts +68 -7
  128. package/dist/features/harness/goals.js +289 -36
  129. package/dist/features/harness/harness.d.ts +30 -1
  130. package/dist/features/harness/harness.js +141 -7
  131. package/dist/features/harness/platform/local-apps.d.ts +36 -3
  132. package/dist/features/harness/platform/local-apps.js +81 -5
  133. package/dist/features/harness/platform/persona-credentials.d.ts +20 -0
  134. package/dist/features/harness/platform/persona-credentials.js +69 -0
  135. package/dist/features/harness/platform/platform-drives.d.ts +61 -0
  136. package/dist/features/harness/platform/platform-drives.js +114 -0
  137. package/dist/features/harness/platform/refusal.d.ts +52 -0
  138. package/dist/features/harness/platform/refusal.js +71 -0
  139. package/dist/features/harness/platform/remote-drive.d.ts +8 -2
  140. package/dist/features/harness/platform/remote-drive.js +22 -9
  141. package/dist/features/harness/platform/script.d.ts +57 -11
  142. package/dist/features/harness/platform/script.js +144 -12
  143. package/dist/features/harness/platform/server-driver.d.ts +17 -4
  144. package/dist/features/harness/platform/server-driver.js +29 -26
  145. package/dist/features/harness/platform-config.d.ts +38 -5
  146. package/dist/features/harness/platform-config.js +93 -8
  147. package/dist/features/harness/route-guess.d.ts +13 -0
  148. package/dist/features/harness/route-guess.js +49 -0
  149. package/dist/features/harness/script/script-run.d.ts +30 -1
  150. package/dist/features/harness/script/script-run.js +355 -48
  151. package/dist/features/license/license.d.ts +2 -2
  152. package/dist/features/visual/step-shots.d.ts +31 -0
  153. package/dist/features/visual/step-shots.js +231 -0
  154. package/dist/features/visual/visual-tools.js +22 -14
  155. package/dist/hooks/client-directory.d.ts +18 -0
  156. package/dist/hooks/client-directory.js +57 -0
  157. package/dist/hooks/coding-agents.d.ts +34 -0
  158. package/dist/hooks/coding-agents.js +117 -0
  159. package/dist/hooks/driven-by.d.ts +21 -2
  160. package/dist/hooks/driven-by.js +42 -2
  161. package/dist/hooks/hook-bus.d.ts +4 -0
  162. package/dist/hooks/hook-bus.js +18 -0
  163. package/dist/index.d.ts +1 -0
  164. package/dist/index.js +26 -183
  165. package/dist/judgement/capsule/capsule-store.d.ts +2 -2
  166. package/dist/judgement/capsule/causal-summary.d.ts +15 -1
  167. package/dist/judgement/capsule/causal-summary.js +33 -0
  168. package/dist/judgement/runs/artifact/build-verification-run.d.ts +1 -1
  169. package/dist/judgement/runs/artifact/build-verification-run.js +20 -4
  170. package/dist/judgement/runs/artifact/gap-summary.d.ts +0 -18
  171. package/dist/judgement/runs/artifact/gap-summary.js +12 -3
  172. package/dist/judgement/runs/artifact/replay-mapping.js +25 -9
  173. package/dist/judgement/runs/artifact/run-store.d.ts +13 -1
  174. package/dist/judgement/runs/artifact/run-store.js +175 -8
  175. package/dist/judgement/runs/context-tools.js +59 -1
  176. package/dist/judgement/runs/default-run-id.d.ts +3 -0
  177. package/dist/judgement/runs/default-run-id.js +16 -0
  178. package/dist/judgement/runs/drive-run.d.ts +53 -5
  179. package/dist/judgement/runs/drive-run.js +234 -20
  180. package/dist/judgement/runs/resume.d.ts +44 -0
  181. package/dist/judgement/runs/resume.js +137 -0
  182. package/dist/judgement/runs/reticle-runner.js +5 -2
  183. package/dist/judgement/runs/runner-port.d.ts +5 -1
  184. package/dist/judgement/runs/runner-port.js +8 -2
  185. package/dist/judgement/runs/verification-sync.d.ts +2 -0
  186. package/dist/judgement/runs/verification-sync.js +36 -15
  187. package/dist/language/flows/decision.js +2 -1
  188. package/dist/language/flows/fields/flow-secret-field.d.ts +12 -0
  189. package/dist/language/flows/fields/flow-secret-field.js +25 -2
  190. package/dist/language/flows/flow-anchor.d.ts +7 -2
  191. package/dist/language/flows/flow-anchor.js +10 -3
  192. package/dist/language/flows/flow-intent.d.ts +1 -0
  193. package/dist/language/flows/flow-journey.d.ts +6 -0
  194. package/dist/language/flows/flow-journey.js +20 -0
  195. package/dist/language/flows/flow-learning.d.ts +4 -0
  196. package/dist/language/flows/flow-learning.js +37 -3
  197. package/dist/language/flows/flow-replay-run.js +16 -18
  198. package/dist/language/flows/flow-replay-types.d.ts +1 -1
  199. package/dist/language/flows/flow-replay.d.ts +18 -1
  200. package/dist/language/flows/flow-replay.js +22 -7
  201. package/dist/language/flows/flow-result.d.ts +22 -1
  202. package/dist/language/flows/flow-result.js +47 -2
  203. package/dist/language/flows/flow-step-runners.d.ts +2 -0
  204. package/dist/language/flows/flow-step-runners.js +12 -6
  205. package/dist/language/flows/flow-store-for-session.js +5 -1
  206. package/dist/language/flows/flow-tools.d.ts +10 -0
  207. package/dist/language/flows/flow-tools.js +61 -62
  208. package/dist/language/flows/flows.d.ts +16 -1
  209. package/dist/language/flows/flows.js +69 -10
  210. package/dist/language/flows/narrow-write.d.ts +7 -0
  211. package/dist/language/flows/narrow-write.js +36 -1
  212. package/dist/language/flows/recording/recording-backtrack.js +14 -1
  213. package/dist/language/flows/recording/tape/recordings.d.ts +29 -1
  214. package/dist/language/flows/recording/tape/recordings.js +60 -10
  215. package/dist/language/flows/replay.js +29 -6
  216. package/dist/language/flows/single-replay.d.ts +7 -0
  217. package/dist/language/flows/single-replay.js +26 -0
  218. package/dist/language/flows/verify-change-tools.d.ts +1 -0
  219. package/dist/language/flows/verify-change-tools.js +200 -193
  220. package/dist/memory/cloud/cloud-config.d.ts +10 -1
  221. package/dist/memory/cloud/cloud-config.js +19 -5
  222. package/dist/memory/cloud/cloud-sync.js +3 -3
  223. package/dist/memory/cloud/harness-config.d.ts +49 -0
  224. package/dist/memory/cloud/harness-config.js +16 -20
  225. package/dist/memory/cloud/memory-scope.d.ts +17 -0
  226. package/dist/memory/cloud/memory-scope.js +22 -0
  227. package/dist/memory/cloud/sync-cycle.d.ts +32 -4
  228. package/dist/memory/cloud/sync-cycle.js +113 -12
  229. package/dist/memory/cloud/sync-daemon.d.ts +11 -0
  230. package/dist/memory/cloud/sync-daemon.js +114 -4
  231. package/dist/memory/cloud/sync-disk.js +26 -2
  232. package/dist/memory/cloud/sync-screenshots.d.ts +32 -0
  233. package/dist/memory/cloud/sync-screenshots.js +105 -0
  234. package/dist/memory/cloud/unsynced-roots.d.ts +47 -0
  235. package/dist/memory/cloud/unsynced-roots.js +166 -0
  236. package/dist/memory/impact/account-watch.d.ts +16 -1
  237. package/dist/memory/impact/account-watch.js +26 -1
  238. package/dist/memory/impact/impact-store.d.ts +1 -4
  239. package/dist/memory/impact/impact-store.js +32 -42
  240. package/dist/memory/intent/inline-intent.d.ts +1 -0
  241. package/dist/memory/intent/intent-shard-store.js +16 -4
  242. package/dist/memory/intent/intent-shard.d.ts +12 -0
  243. package/dist/memory/intent/intent-store.d.ts +1 -0
  244. package/dist/memory/intent/intent-tools.js +42 -2
  245. package/dist/memory/intent/open-intents.d.ts +6 -0
  246. package/dist/memory/intent/open-intents.js +10 -1
  247. package/dist/memory/intent/settled-words.d.ts +24 -0
  248. package/dist/memory/intent/settled-words.js +130 -0
  249. package/dist/memory/journal/drive-flow.d.ts +16 -0
  250. package/dist/memory/journal/drive-flow.js +34 -2
  251. package/dist/memory/journal/drive-run-flush.d.ts +2 -0
  252. package/dist/memory/journal/drive-run-flush.js +20 -5
  253. package/dist/memory/journal/journal-recorder.js +46 -3
  254. package/dist/memory/journal/on-disk/retention.d.ts +5 -0
  255. package/dist/memory/journal/on-disk/retention.js +27 -2
  256. package/dist/memory/journal/on-disk/workspace-tiers.js +2 -0
  257. package/dist/memory/journal/session-end.d.ts +15 -1
  258. package/dist/memory/journal/session-end.js +38 -7
  259. package/dist/memory/project/artifact-root-resolver.js +33 -5
  260. package/dist/memory/project/artifact-root.d.ts +4 -3
  261. package/dist/memory/project/artifact-root.js +2 -2
  262. package/dist/memory/project/dir/reticle-dir.d.ts +14 -0
  263. package/dist/memory/project/dir/reticle-dir.js +23 -2
  264. package/dist/memory/project/link-directory.d.ts +15 -0
  265. package/dist/memory/project/link-directory.js +44 -0
  266. package/dist/memory/project/root-claims.d.ts +6 -0
  267. package/dist/memory/project/root-claims.js +39 -0
  268. package/dist/memory/project/session-root.d.ts +2 -0
  269. package/dist/memory/project/session-root.js +9 -1
  270. package/dist/memory/project/sync-status.d.ts +46 -0
  271. package/dist/memory/project/sync-status.js +135 -1
  272. package/dist/memory/recall/memory-tools.js +46 -3
  273. package/dist/memory/recall/platform-memory.d.ts +34 -0
  274. package/dist/memory/recall/platform-memory.js +139 -0
  275. package/dist/memory/recall/project-memory.js +36 -8
  276. package/dist/portal/bridge/bridge.d.ts +9 -5
  277. package/dist/portal/bridge/bridge.js +66 -23
  278. package/dist/portal/bridge/harness-request.d.ts +23 -0
  279. package/dist/portal/bridge/harness-request.js +27 -0
  280. package/dist/portal/bridge/wrong-path.d.ts +17 -0
  281. package/dist/portal/bridge/wrong-path.js +35 -0
  282. package/dist/portal/input/network-mock-tools.js +11 -2
  283. package/dist/portal/input/real-input.d.ts +2 -0
  284. package/dist/portal/input/real-input.js +13 -10
  285. package/dist/portal/pool/browser-pool.d.ts +48 -0
  286. package/dist/portal/pool/browser-pool.js +120 -2
  287. package/dist/portal/pool/context-permissions.d.ts +33 -0
  288. package/dist/portal/pool/context-permissions.js +33 -0
  289. package/dist/portal/pool/lease-marker-stamp.d.ts +23 -0
  290. package/dist/portal/pool/lease-marker-stamp.js +49 -0
  291. package/dist/portal/pool/playwright-launcher.d.ts +27 -5
  292. package/dist/portal/pool/playwright-launcher.js +59 -14
  293. package/dist/portal/pool/pool-contract.d.ts +21 -1
  294. package/dist/portal/session/agent-link.d.ts +8 -0
  295. package/dist/portal/session/agent-link.js +17 -0
  296. package/dist/portal/session/command-payload.js +6 -1
  297. package/dist/portal/session/daemon-answers.d.ts +3 -3
  298. package/dist/portal/session/daemon-answers.js +4 -2
  299. package/dist/portal/session/dev-server/dev-command.d.ts +9 -0
  300. package/dist/portal/session/dev-server/dev-command.js +27 -1
  301. package/dist/portal/session/facts/observed-state.d.ts +16 -18
  302. package/dist/portal/session/facts/observed-state.js +46 -3
  303. package/dist/portal/session/human/live-control.d.ts +9 -2
  304. package/dist/portal/session/human/live-control.js +12 -3
  305. package/dist/portal/session/live-control-tools.js +82 -13
  306. package/dist/portal/session/narration-args.d.ts +5 -0
  307. package/dist/portal/session/narration-args.js +17 -0
  308. package/dist/portal/session/no-session-diagnosis.d.ts +1 -1
  309. package/dist/portal/session/no-session-diagnosis.js +31 -9
  310. package/dist/portal/session/no-session-next-action.d.ts +20 -0
  311. package/dist/portal/session/no-session-next-action.js +134 -61
  312. package/dist/portal/session/no-session-watch.js +179 -22
  313. package/dist/portal/session/presence/session-lease.js +1 -1
  314. package/dist/portal/session/recorded-gaps.d.ts +97 -0
  315. package/dist/portal/session/recorded-gaps.js +251 -0
  316. package/dist/portal/session/session-health.d.ts +11 -0
  317. package/dist/portal/session/session-health.js +3 -1
  318. package/dist/portal/session/session-info.js +2 -1
  319. package/dist/portal/session/session-manager.d.ts +18 -0
  320. package/dist/portal/session/session-manager.js +54 -3
  321. package/dist/portal/session/session-successor.d.ts +8 -0
  322. package/dist/portal/session/session-successor.js +1 -1
  323. package/dist/portal/session/session.d.ts +15 -28
  324. package/dist/portal/session/session.js +60 -61
  325. package/dist/portal/session/timing/command-timeout.js +25 -1
  326. package/dist/portal/session/timing/wall-clock.d.ts +1 -1
  327. package/dist/portal/session/timing/wall-clock.js +1 -1
  328. package/dist/portal/session/zero-install-first-call.d.ts +31 -0
  329. package/dist/portal/session/zero-install-first-call.js +88 -0
  330. package/dist/start-options.d.ts +7 -1
  331. package/dist/start-wiring.d.ts +63 -0
  332. package/dist/start-wiring.js +169 -0
  333. package/dist/status-payload.d.ts +13 -1
  334. package/dist/status-payload.js +13 -1
  335. package/dist/surface/http-server.js +7 -1
  336. package/dist/surface/mcp/attach-memory.d.ts +1 -0
  337. package/dist/surface/mcp/attach-memory.js +12 -1
  338. package/dist/surface/mcp/mcp-proxy.d.ts +4 -0
  339. package/dist/surface/mcp/mcp-proxy.js +29 -8
  340. package/dist/surface/mcp/mcp.d.ts +23 -0
  341. package/dist/surface/mcp/mcp.js +34 -4
  342. package/dist/surface/mcp/proxy/drive-calls.d.ts +10 -0
  343. package/dist/surface/mcp/proxy/drive-calls.js +27 -0
  344. package/dist/surface/mcp/proxy/mcp-post-transport.js +5 -0
  345. package/dist/surface/mcp/server-instructions.js +22 -14
  346. package/dist/surface/mcp/shared-params.js +1 -1
  347. package/dist/surface/mcp/surface-vocabulary.d.ts +2 -0
  348. package/dist/surface/mcp/surface-vocabulary.js +1 -0
  349. package/dist/surface/tools/account-tool.d.ts +22 -0
  350. package/dist/surface/tools/account-tool.js +157 -0
  351. package/dist/surface/tools/act/act-danger.d.ts +11 -0
  352. package/dist/surface/tools/act/act-danger.js +38 -1
  353. package/dist/surface/tools/act/act-observation.d.ts +33 -0
  354. package/dist/surface/tools/act/act-observation.js +57 -0
  355. package/dist/surface/tools/act/act-preflight.js +25 -2
  356. package/dist/surface/tools/act/act-target.js +8 -3
  357. package/dist/surface/tools/act/resolve-target.d.ts +1 -1
  358. package/dist/surface/tools/act/resolve-target.js +18 -3
  359. package/dist/surface/tools/act/screen-request.d.ts +34 -0
  360. package/dist/surface/tools/act/screen-request.js +113 -0
  361. package/dist/surface/tools/act/sequence-grade.d.ts +8 -0
  362. package/dist/surface/tools/act/sequence-grade.js +13 -2
  363. package/dist/surface/tools/act-sequence-tool.js +136 -27
  364. package/dist/surface/tools/act-tools.d.ts +0 -9
  365. package/dist/surface/tools/act-tools.js +48 -34
  366. package/dist/surface/tools/agent/app-notes-learning.d.ts +7 -0
  367. package/dist/surface/tools/agent/app-notes-learning.js +80 -0
  368. package/dist/surface/tools/agent/app-notes.d.ts +4 -0
  369. package/dist/surface/tools/agent/app-notes.js +48 -0
  370. package/dist/surface/tools/agent/build-staleness.d.ts +7 -0
  371. package/dist/surface/tools/agent/build-staleness.js +62 -0
  372. package/dist/surface/tools/agent/compact-envelope.d.ts +80 -0
  373. package/dist/surface/tools/agent/compact-envelope.js +374 -0
  374. package/dist/surface/tools/agent/for-the-agent.d.ts +12 -0
  375. package/dist/surface/tools/agent/for-the-agent.js +44 -0
  376. package/dist/surface/tools/agent/notices.d.ts +50 -0
  377. package/dist/surface/tools/agent/notices.js +152 -0
  378. package/dist/surface/tools/agent/reteach.d.ts +11 -0
  379. package/dist/surface/tools/agent/reteach.js +50 -0
  380. package/dist/surface/tools/args/alias-args.d.ts +5 -0
  381. package/dist/surface/tools/args/alias-args.js +10 -0
  382. package/dist/surface/tools/args/confirm-dangerous-arg.d.ts +6 -0
  383. package/dist/surface/tools/args/confirm-dangerous-arg.js +6 -0
  384. package/dist/surface/tools/assert/assert-source.d.ts +15 -0
  385. package/dist/surface/tools/assert/assert-source.js +40 -0
  386. package/dist/surface/tools/assert/assert-verdict.js +25 -15
  387. package/dist/surface/tools/browser-tools.js +43 -1
  388. package/dist/surface/tools/chat-drives.d.ts +75 -0
  389. package/dist/surface/tools/chat-drives.js +265 -21
  390. package/dist/surface/tools/coverage-tools.d.ts +2 -10
  391. package/dist/surface/tools/coverage-tools.js +2 -53
  392. package/dist/surface/tools/dynamic-tools.js +29 -1
  393. package/dist/surface/tools/empty-session-list.d.ts +10 -0
  394. package/dist/surface/tools/empty-session-list.js +45 -5
  395. package/dist/surface/tools/error-recovery.d.ts +8 -0
  396. package/dist/surface/tools/error-recovery.js +69 -5
  397. package/dist/surface/tools/explore-tools.d.ts +23 -2
  398. package/dist/surface/tools/explore-tools.js +377 -74
  399. package/dist/surface/tools/feedback-tools.d.ts +2 -3
  400. package/dist/surface/tools/feedback-tools.js +4 -3
  401. package/dist/surface/tools/gap-novelty.d.ts +3 -1
  402. package/dist/surface/tools/gap-novelty.js +8 -1
  403. package/dist/surface/tools/harness-explore.d.ts +52 -73
  404. package/dist/surface/tools/harness-explore.js +177 -146
  405. package/dist/surface/tools/harness-gate.d.ts +88 -0
  406. package/dist/surface/tools/harness-gate.js +235 -0
  407. package/dist/surface/tools/harness-hunt.d.ts +43 -0
  408. package/dist/surface/tools/harness-hunt.js +215 -0
  409. package/dist/surface/tools/harness-plan.d.ts +5 -0
  410. package/dist/surface/tools/harness-plan.js +7 -0
  411. package/dist/surface/tools/harness-script.d.ts +22 -0
  412. package/dist/surface/tools/harness-script.js +256 -38
  413. package/dist/surface/tools/harness-tab-guard.d.ts +5 -0
  414. package/dist/surface/tools/harness-tab-guard.js +27 -0
  415. package/dist/surface/tools/harness-toolset.d.ts +8 -0
  416. package/dist/surface/tools/harness-toolset.js +27 -4
  417. package/dist/surface/tools/human-notes.d.ts +16 -0
  418. package/dist/surface/tools/human-notes.js +27 -0
  419. package/dist/surface/tools/invoke-tool.d.ts +5 -2
  420. package/dist/surface/tools/invoke-tool.js +220 -93
  421. package/dist/surface/tools/lease-hint.js +26 -5
  422. package/dist/surface/tools/lease-permissions.d.ts +33 -0
  423. package/dist/surface/tools/lease-permissions.js +73 -0
  424. package/dist/surface/tools/lease-readiness.d.ts +38 -0
  425. package/dist/surface/tools/lease-readiness.js +57 -0
  426. package/dist/surface/tools/lease-seed.d.ts +20 -0
  427. package/dist/surface/tools/lease-seed.js +45 -1
  428. package/dist/surface/tools/lease-tools.d.ts +10 -1
  429. package/dist/surface/tools/lease-tools.js +119 -69
  430. package/dist/surface/tools/live-call-text.js +2 -2
  431. package/dist/surface/tools/merge-tools.js +42 -2
  432. package/dist/surface/tools/merged-name-redirect.js +4 -0
  433. package/dist/surface/tools/next-step.d.ts +11 -1
  434. package/dist/surface/tools/next-step.js +73 -18
  435. package/dist/surface/tools/observe-tools.js +43 -5
  436. package/dist/surface/tools/platform-moment.d.ts +60 -0
  437. package/dist/surface/tools/platform-moment.js +132 -4
  438. package/dist/surface/tools/read-tools.js +65 -14
  439. package/dist/surface/tools/reticle-result.d.ts +120 -0
  440. package/dist/surface/tools/reticle-result.js +364 -0
  441. package/dist/surface/tools/tool-kit.d.ts +68 -2
  442. package/dist/surface/tools/tool-kit.js +73 -1
  443. package/dist/surface/tools/tools.js +25 -13
  444. package/dist/telemetry/account-envelope.d.ts +7 -0
  445. package/dist/telemetry/account-envelope.js +61 -0
  446. package/dist/telemetry/agent-client.d.ts +15 -0
  447. package/dist/telemetry/agent-client.js +57 -0
  448. package/dist/telemetry/app-instrumented.js +9 -2
  449. package/dist/telemetry/argument-shape.d.ts +7 -0
  450. package/dist/telemetry/argument-shape.js +86 -1
  451. package/dist/telemetry/automation-hint.d.ts +2 -3
  452. package/dist/telemetry/automation-hint.js +33 -8
  453. package/dist/telemetry/cli-telemetry.js +7 -2
  454. package/dist/telemetry/daemon-telemetry.js +3 -0
  455. package/dist/telemetry/error-fingerprint.d.ts +10 -1
  456. package/dist/telemetry/error-fingerprint.js +61 -5
  457. package/dist/telemetry/feedback-cli.d.ts +0 -13
  458. package/dist/telemetry/feedback-cli.js +0 -77
  459. package/dist/telemetry/feedback.d.ts +13 -0
  460. package/dist/telemetry/feedback.js +183 -17
  461. package/dist/telemetry/harness-run.d.ts +18 -0
  462. package/dist/telemetry/harness-run.js +80 -0
  463. package/dist/telemetry/hud-events.d.ts +16 -0
  464. package/dist/telemetry/hud-events.js +27 -0
  465. package/dist/telemetry/hud-metrics.d.ts +27 -6
  466. package/dist/telemetry/hud-metrics.js +99 -25
  467. package/dist/telemetry/init-telemetry.js +2 -2
  468. package/dist/telemetry/install-source.d.ts +13 -25
  469. package/dist/telemetry/install-source.js +44 -3
  470. package/dist/telemetry/mcp-connection.d.ts +0 -14
  471. package/dist/telemetry/mcp-connection.js +5 -1
  472. package/dist/telemetry/onboarding-firsts.d.ts +32 -0
  473. package/dist/telemetry/onboarding-firsts.js +81 -6
  474. package/dist/telemetry/platform-linked.d.ts +5 -0
  475. package/dist/telemetry/platform-linked.js +32 -0
  476. package/dist/telemetry/project-profile.js +5 -3
  477. package/dist/telemetry/proxy-telemetry.js +4 -1
  478. package/dist/telemetry/session-metrics.d.ts +15 -4
  479. package/dist/telemetry/session-metrics.js +88 -52
  480. package/dist/telemetry/telemetry.d.ts +26 -2
  481. package/dist/telemetry/telemetry.js +102 -21
  482. package/dist/telemetry/verification-of.d.ts +3 -1
  483. package/dist/telemetry/verification-of.js +12 -4
  484. package/dist/wire-journal.d.ts +2 -2
  485. package/dist/wire-journal.js +16 -5
  486. package/docs/README.md +2 -2
  487. package/docs/actions.mdx +6 -3
  488. package/docs/adapters.md +1 -1
  489. package/docs/agent-cheatsheet.md +24 -27
  490. package/docs/architecture.md +5 -5
  491. package/docs/autodrive.md +13 -12
  492. package/docs/benchmarks.md +5 -5
  493. package/docs/best-practices.mdx +27 -9
  494. package/docs/capabilities.mdx +14 -16
  495. package/docs/cli/affected.mdx +1 -1
  496. package/docs/cli/cloud.mdx +54 -75
  497. package/docs/cli/doctor.mdx +8 -3
  498. package/docs/cli/drive.mdx +12 -12
  499. package/docs/cli/feedback.mdx +3 -3
  500. package/docs/cli/gate.mdx +7 -2
  501. package/docs/cli/help.mdx +50 -55
  502. package/docs/cli/init.mdx +32 -15
  503. package/docs/cli/license.mdx +12 -8
  504. package/docs/cli/mcp.mdx +4 -4
  505. package/docs/cli/open.mdx +3 -3
  506. package/docs/cli/report.mdx +4 -2
  507. package/docs/cli/restart.mdx +2 -2
  508. package/docs/cli/rollback.mdx +14 -8
  509. package/docs/cli/serve.mdx +4 -4
  510. package/docs/cli/setup.mdx +23 -0
  511. package/docs/cli/status.mdx +13 -4
  512. package/docs/cli/stop.mdx +67 -8
  513. package/docs/cli/try.mdx +62 -0
  514. package/docs/cli/update.mdx +4 -3
  515. package/docs/cli/verify.mdx +17 -6
  516. package/docs/cli/version.mdx +3 -2
  517. package/docs/cli.mdx +110 -41
  518. package/docs/debugging.md +3 -3
  519. package/docs/deploy-checks.md +1 -1
  520. package/docs/desktop.mdx +5 -3
  521. package/docs/enterprise.md +11 -10
  522. package/docs/environment.mdx +5 -2
  523. package/docs/faq.mdx +3 -3
  524. package/docs/first-drive.md +5 -4
  525. package/docs/flows.md +35 -27
  526. package/docs/for-agents.md +4 -5
  527. package/docs/frameworks.mdx +32 -21
  528. package/docs/getting-started.md +66 -64
  529. package/docs/human-control.md +15 -14
  530. package/docs/index.mdx +15 -43
  531. package/docs/install-agentic.mdx +22 -37
  532. package/docs/install-manual.mdx +22 -12
  533. package/docs/instrumentation.mdx +5 -3
  534. package/docs/integration-patterns.md +7 -7
  535. package/docs/license-activation.mdx +1 -1
  536. package/docs/multi-agent-testing.md +24 -6
  537. package/docs/packages/babel-plugin.mdx +4 -2
  538. package/docs/packages/browser.mdx +16 -10
  539. package/docs/packages/core.mdx +12 -5
  540. package/docs/packages/electron.mdx +3 -2
  541. package/docs/packages/engine.mdx +1 -1
  542. package/docs/packages/eslint-plugin.mdx +18 -12
  543. package/docs/packages/next.mdx +8 -7
  544. package/docs/packages/open-verification.mdx +1 -1
  545. package/docs/packages/server.mdx +5 -5
  546. package/docs/packages/tauri.mdx +8 -8
  547. package/docs/packages/test.mdx +4 -10
  548. package/docs/packages/vite-plugin.mdx +11 -4
  549. package/docs/packages.mdx +11 -15
  550. package/docs/platform-integration.md +6 -5
  551. package/docs/predicates.mdx +40 -24
  552. package/docs/quickstart.mdx +58 -29
  553. package/docs/required-checks.md +8 -7
  554. package/docs/reticle-manual.md +15 -5
  555. package/docs/skill-file.mdx +17 -79
  556. package/docs/skill-setup.md +9 -9
  557. package/docs/skill.md +200 -0
  558. package/docs/system-map.md +7 -7
  559. package/docs/telemetry.md +22 -24
  560. package/docs/testing.md +4 -4
  561. package/docs/token-efficiency.md +12 -12
  562. package/docs/tools/act-and-wait.mdx +9 -2
  563. package/docs/tools/act-sequence.mdx +6 -7
  564. package/docs/tools/act.mdx +2 -2
  565. package/docs/tools/assert.mdx +18 -17
  566. package/docs/tools/console.mdx +9 -9
  567. package/docs/tools/inspect.mdx +16 -7
  568. package/docs/tools/look.mdx +24 -0
  569. package/docs/tools/navigate.mdx +5 -3
  570. package/docs/tools/network.mdx +2 -2
  571. package/docs/tools/observe.mdx +6 -6
  572. package/docs/tools/overview.mdx +34 -33
  573. package/docs/tools/query.mdx +5 -5
  574. package/docs/tools/session-and-feedback.mdx +13 -4
  575. package/docs/tools/sessions.mdx +8 -8
  576. package/docs/tools/snapshot.mdx +6 -5
  577. package/docs/tools/state.mdx +9 -9
  578. package/docs/tools/tools-and-run.mdx +26 -24
  579. package/docs/tools/verify.mdx +28 -0
  580. package/docs/tools/wait-for.mdx +8 -4
  581. package/docs/troubleshooting.mdx +21 -6
  582. package/docs/usage.md +51 -45
  583. package/docs/use-cases.mdx +3 -3
  584. package/docs/vs-chrome-devtools-mcp.mdx +9 -6
  585. package/docs/vs-playwright-mcp.mdx +3 -1
  586. package/docs/what-is-recorded.md +7 -5
  587. package/docs/what-is-reticle.mdx +2 -2
  588. package/docs/why-reticle.mdx +1 -1
  589. package/package.json +6 -5
  590. package/dist/command/cli/demo/demo-page.d.ts +0 -78
  591. package/dist/command/cli/demo/demo-page.js +0 -249
  592. package/dist/command/cli/demo/demo-run.d.ts +0 -38
  593. package/dist/command/cli/demo/demo-run.js +0 -138
  594. package/dist/judgement/hunt/hunt-report.d.ts +0 -49
  595. package/dist/judgement/hunt/hunt-report.js +0 -84
  596. package/dist/language/flows/buddy-status.d.ts +0 -25
  597. package/dist/language/flows/buddy-status.js +0 -32
  598. package/dist/language/flows/change/watch-batcher.d.ts +0 -18
  599. package/dist/language/flows/change/watch-batcher.js +0 -19
  600. package/dist/memory/cloud/harness-offer.d.ts +0 -44
  601. package/dist/memory/cloud/harness-offer.js +0 -145
  602. package/dist/surface/tools/feature-capture.d.ts +0 -151
  603. package/dist/surface/tools/feature-capture.js +0 -235
  604. package/dist/surface/tools/tool-hit-rate.d.ts +0 -87
  605. package/dist/surface/tools/tool-hit-rate.js +0 -90
  606. package/dist/telemetry/harness-drive.d.ts +0 -4
  607. package/dist/telemetry/harness-drive.js +0 -35
  608. package/dist/telemetry/identify.d.ts +0 -22
  609. package/dist/telemetry/identify.js +0 -73
  610. package/docs/cli/capsules.mdx +0 -70
  611. package/docs/cli/hunt.mdx +0 -73
  612. package/docs/cli/identify.mdx +0 -76
  613. package/docs/cli/kill.mdx +0 -91
  614. package/docs/cli/watch.mdx +0 -62
@@ -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,7 +28,7 @@ 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';
@@ -43,32 +53,21 @@ import { currentOf, healthEnvelope, refuseIfThrottled } from '../../portal/sessi
43
53
  import { pausedShortCircuit, pausedOutputShape, withControl, PAUSED_NO_VERDICT, } from '../../portal/session/control-envelope.js';
44
54
  import { asNumber, asRecord, asString } from '@reticlehq/core';
45
55
  import { sourceOf } from './tools-helpers.js';
56
+ import { confirmedByDeclaration } from './act/act-danger.js';
46
57
  import { dispatchAct, preflightAct } from './act/act-preflight.js';
47
- import { followLostObservation } from './act/act-observation.js';
58
+ import { checkNet, disabledTargetNote, followLostObservation } from './act/act-observation.js';
48
59
  import { intentArg, sessionIdShape } from './tool-kit.js';
49
60
  import { verdictIntentGap } from '@reticlehq/engine/evidence/verdict-intent-gap.js';
50
61
  import { asActionType, gradeOf } from './act/act-helpers.js';
51
62
  import { resolveActTarget } from './act/act-target.js';
63
+ import { screenRequestFindings, withAdvisories } from './act/screen-request.js';
52
64
  import { tryRealInput, rewriteUploadArgs, HOVER_NEEDS_POINTER_MSG } from './real-input-attempt.js';
53
65
  import { gradeOfPredicate } from './assert/assert-grade.js';
54
66
  import { readAlreadyTrue } from './act/already-true.js';
67
+ import { noteSourceSeen } from '../../portal/session/recorded-gaps.js';
55
68
  /**
56
- * Narrow the wire's `action` to a real ActionType, or undefined.
57
- *
58
- * It used to be `asString(args['action']) ?? ''`, so an unknown or missing action became the empty
59
- * string and travelled on — reaching the browser as a command it could not perform, and reported back
60
- * as a generic failure rather than "that is not an action". Validate at the boundary, per the project's
61
- * unknown-plus-narrowing rule, so a typo is rejected where it can still be explained.
62
- */
63
- /**
64
- * The action vocabulary, derived from ActionType — never retyped.
65
- *
66
- * The description used to omit callable actions such as blur, upload and drag,
67
- * because a hand-copied list drifts the moment
68
- * someone adds an arm. Deriving both the schema and the prose from the enum makes that impossible.
69
- *
70
- * The handler already refused an unknown action with a good message; the schema now refuses it
71
- * 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.
72
71
  */
73
72
  const ACTION_TYPE_VALUES = Object.values(ActionType);
74
73
  const actionTypeEnum = z.enum(ACTION_TYPE_VALUES);
@@ -103,9 +102,8 @@ export async function actCommand(deps, session, actArgs, timeoutMs) {
103
102
  };
104
103
  }
105
104
  const bridgeArgs = { ...actArgs, args: rewritten };
106
- return timeoutMs !== undefined
107
- ? session.command(ReticleCommand.ACT, bridgeArgs, timeoutMs)
108
- : 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);
109
107
  }
110
108
  export const ACT_TOOLS = [
111
109
  {
@@ -313,6 +311,8 @@ export const ACT_TOOLS = [
313
311
  observed: z.string().optional(),
314
312
  expected: z.string().optional(),
315
313
  assertion: z.string().optional(),
314
+ caseOnlyMiss: z.boolean().optional(),
315
+ wouldHold: z.string().optional(),
316
316
  }),
317
317
  trace: z
318
318
  .unknown()
@@ -388,7 +388,9 @@ export const ACT_TOOLS = [
388
388
  // Omitting `until` waits for the page to settle (idle) — the deterministic default vs a sleep.
389
389
  // `predicate` is what reticle_assert / reticle_wait_for call this — see alias-args.ts.
390
390
  const withUntil = aliasParam(args, 'until', ['predicate']);
391
- 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
392
394
  ? parsePredicate(withUntil['until'])
393
395
  : { kind: PredicateKind.SETTLED };
394
396
  // BEFORE the action. A body clause this session cannot answer would fail whatever the app
@@ -401,6 +403,8 @@ export const ACT_TOOLS = [
401
403
  // the undeclared-change gap silent on THIS verdict rather than the next one: it reads the
402
404
  // ledger below and finds something open. The discharge comes after that read.
403
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']));
404
408
  // Everything refusable without touching the page — see act-preflight.ts.
405
409
  preflightAct(asRecord(args['args']), until);
406
410
  // Resolve `target` to a ref BEFORE the action window opens, so the lookup is not attributed to
@@ -438,7 +442,7 @@ export const ACT_TOOLS = [
438
442
  const actResult = await dispatchAct(() => actCommand(deps, session, {
439
443
  ref: resolved.ref,
440
444
  action: args['action'],
441
- args: args['args'] ?? {},
445
+ args: confirmedByDeclaration(asRecord(args['args']), args['target'], untilNamed),
442
446
  }));
443
447
  if (actResult !== null) {
444
448
  if (!actResult.ok)
@@ -479,13 +483,13 @@ export const ACT_TOOLS = [
479
483
  const r = asRecord(actResult?.result);
480
484
  if ('boolean' === typeof r['settled'])
481
485
  settledOutcome = r['settled'];
482
- // Where the acted element is written. Captured at act time alongside the anchor, so it is
483
- // 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.
484
487
  const actedSource = sourceOf(r['source']);
485
- // Remembered on the session so a LATER assertion can name a file even when its failure has no
486
- // 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.
487
490
  const actedSourceLabel = actedSource === undefined ? undefined : `${actedSource.file}:${String(actedSource.line)}`;
488
491
  session.lastAct.markSource(actedSourceLabel);
492
+ noteSourceSeen(session, actedSourceLabel);
489
493
  const windowEvents = session.eventsSince(since);
490
494
  const trace = summarizeReaction(buildReactionReport(windowEvents, session.elapsed() - since));
491
495
  // The bounded Tier-1 causal summary — net/console/state/storage diffs the trace's counts miss.
@@ -523,7 +527,9 @@ export const ACT_TOOLS = [
523
527
  // Coverage: cross-origin frames / other blind spots the SDK reported during this window mean the
524
528
  // verdict didn't see everything — say so, never imply full coverage.
525
529
  const spots = blindSpotsFromState(session.blindSpots(), session.runtime);
526
- 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);
527
533
  const absenceBlindSpot = absenceBlindSpotNote(until, spots);
528
534
  // A green resting on hidden matches says the node exists, not that it shows (#1408).
529
535
  const hiddenMatch = hiddenMatchNote(until, verdict.evidence);
@@ -533,7 +539,9 @@ export const ACT_TOOLS = [
533
539
  // Only a spot that IMPEACHES the capture belongs in integrity — see impeachesCapture. A
534
540
  // structural boundary (virtualized rows, a cross-origin frame) is reported as coverage and
535
541
  // must not downgrade a verdict about what WAS observed.
536
- 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)));
537
545
  // Same rule as reticle_assert: a browser-side transport gap means part of this window was
538
546
  // never seen, which is what `blindSpots` exists to say. `truncated` above covers the SERVER
539
547
  // ring buffer evicting; this covers the BROWSER queue overflowing, and they are not the same
@@ -614,6 +622,7 @@ export const ACT_TOOLS = [
614
622
  actionSince: since,
615
623
  expectedFailures: declared.netFailures,
616
624
  namedNetUrls: declared.netUrls,
625
+ repeatableNetUrls: declared.repeatableNetUrls,
617
626
  // A consequence that was already true before the action proves nothing about it, so it is
618
627
  // not evidence the destination rendered either — `alreadyTrue` decides that, once.
619
628
  renderProved: verdict.pass && !alreadyTrue && declared.rendersContent,
@@ -635,6 +644,8 @@ export const ACT_TOOLS = [
635
644
  });
636
645
  const outcomeUnread = unreadWriteLabels(windowEvents);
637
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);
638
649
  const { decision, durable } = await withDurability(args['durable'], until, decideVerified({
639
650
  pass: verdict.pass,
640
651
  // Threaded rather than looked up: decideVerified is pure and has no session.
@@ -650,7 +661,7 @@ export const ACT_TOOLS = [
650
661
  ...(alreadyTrue ? { alreadyTrue } : {}),
651
662
  ...(alreadyTrueHiddenMatch ? { alreadyTrueHiddenMatch } : {}),
652
663
  // An assertion nobody could evaluate must not be reported as one the app failed.
653
- ...(verdict.inconclusive === undefined ? {} : { inconclusive: verdict.inconclusive }),
664
+ ...(inconclusive === undefined ? {} : { inconclusive }),
654
665
  // Nor must one nobody could OBSERVE. This is the act path, so it is the one that produced
655
666
  // the measured false red: a reload mid-wait, graded assertion_failed at the clicked
656
667
  // component's own file and line.
@@ -690,7 +701,7 @@ export const ACT_TOOLS = [
690
701
  // Read ONCE and used twice: `changeUndeclared` asks whether the ledger is empty, and the
691
702
  // undischarged-intent gap asks how much it still holds. Two reads would be two chances for
692
703
  // them to disagree about the same file.
693
- const openIntents = await openSessionIntents(deps, asString(args['sessionId']));
704
+ const openIntents = await readLedger();
694
705
  const changeUndeclared = await isChangeUndeclared(session.currentEditEpoch, () => Promise.resolve(openIntents));
695
706
  const intentGap = verdictIntentGap({
696
707
  verified: decision.verified,
@@ -732,6 +743,7 @@ export const ACT_TOOLS = [
732
743
  verdictId: inlineVerdictId(ReticleTool.ACT_AND_WAIT, deps.now()),
733
744
  grade,
734
745
  at: deps.now(),
746
+ runId: runIdOfCall(session.id), // the run it lands in: linked by id, never by time
735
747
  },
736
748
  // Where the acted element is written, so the record can name a file somebody would open
737
749
  // to change the thing it describes.
@@ -741,14 +753,15 @@ export const ACT_TOOLS = [
741
753
  claim: describeWaitTarget(until),
742
754
  verified: decision.verified,
743
755
  ...(actedSourceLabel === undefined ? {} : { source: actedSourceLabel }),
756
+ ...checkWords(verdict),
744
757
  // TRUE here, and false on the `assert` path, and the difference is the point. This tool
745
758
  // takes `until` BEFORE it acts: the consequence is named in advance and can then only be
746
759
  // met or missed. A claim written after the fact can be shaped to fit whatever happened,
747
760
  // which is why the two are recorded apart rather than assumed alike.
748
761
  declaredBeforeActing: true,
762
+ ...checkNet(verdict, windowEvents), // the calls that explain a miss, or the one that held
749
763
  grade: gradeOfPredicate(until),
750
- // What the declared consequence READ. The run fold has only the journal, so a kind absent
751
- // 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.
752
765
  kind: until.kind,
753
766
  // The deciding clause, kept — and it was NOT, on this path, the commonest one. `unknown`
754
767
  // alone cannot tell an outcome that has not arrived from a capture that could not be
@@ -805,7 +818,8 @@ export const ACT_TOOLS = [
805
818
  // whole point is catching what NOBODY suspected. It now travels with the action, so an
806
819
  // agent cannot miss it by not asking. Omitted entirely when clean, so a healthy action
807
820
  // pays nothing.
808
- ...(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)),
809
823
  ...(durable === undefined ? {} : { durable }),
810
824
  honesty: honestyForVerdict(String(decision.verified), honesty),
811
825
  // Without its summary: it is byte-identical to `summary` two fields up. See wireCapsule.
@@ -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[];