@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
@@ -0,0 +1,364 @@
1
+ /**
2
+ * The "Reticle result" block: what an agent pastes, verbatim, when it finishes verifying.
3
+ *
4
+ * Built by the server from facts it already holds, so the wording of a verdict is ours and not the
5
+ * agent's: an agent asked to summarise an `unknown` tends to summarise it into a pass. Three verdict
6
+ * words only — proved, not proved, failed — and an undecided check is never proved.
7
+ *
8
+ * The last line is the platform line, said once per result and never as a prompt: linked, where the
9
+ * run is on the dashboard; not linked, what the platform adds and the one command. Nothing here is
10
+ * measured that was not measured: a metric with no number is left out, never printed as a zero.
11
+ */
12
+ import { existsSync, readdirSync } from 'node:fs';
13
+ import { dirname, join } from 'node:path';
14
+ import { JournalVerdictEffectSchema, ReticleDir, ReticleTool, RunFlowStatus, Verified, VerdictStatus, apiKeyFrom, } from '@reticlehq/core';
15
+ import { JourneyBy } from '@reticlehq/core/artifacts';
16
+ import { runVerdict } from '../../features/harness/drive-report.js';
17
+ import { mapReplayToFlowResult } from '../../judgement/runs/artifact/replay-mapping.js';
18
+ import { gapSummary } from '../../judgement/runs/artifact/gap-summary.js';
19
+ import { driveRunFrom, driveRunId, endAgentSession } from '../../judgement/runs/drive-run.js';
20
+ import { computeVerdict } from '../../judgement/runs/artifact/build-verification-run.js';
21
+ import { stepShotDir } from '../../memory/project/dir/reticle-dir.js';
22
+ import { TRIAL_OFFER } from '@reticlehq/core/hud';
23
+ import { KEY_REFUSED, dashboardRunUrl, keyRefusalAtLastSync, readDashboardUrl, } from '../../memory/project/sync-status.js';
24
+ import { CONNECT } from './platform-moment.js';
25
+ import { sessionRoot } from '../../memory/project/session-root.js';
26
+ export const ResultWord = {
27
+ PROVED: 'proved',
28
+ NOT_PROVED: 'not proved',
29
+ FAILED: 'failed',
30
+ };
31
+ /** The output field every result that ends a verification carries. */
32
+ export const RESULT_FIELD = 'reticleResult';
33
+ /** Paths shown before the rest are counted: enough to open one, not enough to flood a reply. */
34
+ const EVIDENCE_SHOWN = 3;
35
+ const SEP = ' · ';
36
+ const HEAD = '**Reticle result: ';
37
+ const Said = {
38
+ NOTHING_CHECKED: 'nothing was checked',
39
+ CHECKS: 'Checks',
40
+ COVERED: 'Covered',
41
+ DID_NOT_HOLD: 'Did not hold',
42
+ METRICS: 'Metrics',
43
+ EVIDENCE: 'Evidence',
44
+ RUN_LINK: 'Run on the dashboard',
45
+ DASHBOARD: 'On the dashboard',
46
+ SYNCED: 'Saved: the daemon syncs this run to the Reticle platform',
47
+ PITCH: 'Kept on this machine only. The Reticle platform adds run history, your team and Reticle Harness',
48
+ };
49
+ const plural = (n, word) => `${String(n)} ${word}${1 === n ? '' : 's'}`;
50
+ const seconds = (ms) => ms < 60_000
51
+ ? `${(ms / 1000).toFixed(1)}s`
52
+ : `${String(Math.floor(ms / 60_000))}m ${String(Math.round((ms % 60_000) / 1000))}s`;
53
+ function headline(f) {
54
+ const total = f.yes + f.no + f.undecided;
55
+ if (0 < f.no)
56
+ return `${HEAD}${ResultWord.FAILED}**${SEP}${String(f.no)} of ${plural(total, 'check')} did not hold`;
57
+ if (0 === total)
58
+ return `${HEAD}${ResultWord.NOT_PROVED}**${SEP}${Said.NOTHING_CHECKED}`;
59
+ if (0 < f.undecided)
60
+ return `${HEAD}${ResultWord.NOT_PROVED}**${SEP}${String(f.undecided)} of ${plural(total, 'check')} undecided`;
61
+ return `${HEAD}${ResultWord.PROVED}**${SEP}${String(f.yes)} of ${plural(total, 'check')} held`;
62
+ }
63
+ /**
64
+ * The evidence line. Screenshots filed under one run share one folder, so the folder is named once
65
+ * with the count: three long paths cost a single replay more tokens than its verdict, and its answer
66
+ * already lists each step's own path.
67
+ */
68
+ function evidenceLine(shots) {
69
+ if (0 === shots.length)
70
+ return [];
71
+ const dirs = new Set(shots.map((s) => dirname(s)));
72
+ const [dir] = dirs;
73
+ if (1 < shots.length && 1 === dirs.size && dir !== undefined)
74
+ return [`- ${Said.EVIDENCE}: ${plural(shots.length, 'screenshot')} in ${dir}`];
75
+ const more = shots.length - EVIDENCE_SHOWN;
76
+ return [
77
+ `- ${Said.EVIDENCE}: ${shots.slice(0, EVIDENCE_SHOWN).join(', ')}${0 < more ? ` (+${String(more)} more)` : ''}`,
78
+ ];
79
+ }
80
+ /**
81
+ * Each fact once. The headline carries the check count, so the metrics do not repeat it; with one
82
+ * check the headline is the whole tally, so the per-word count line is left out.
83
+ */
84
+ export function buildReticleResult(f) {
85
+ const total = f.yes + f.no + f.undecided;
86
+ const metrics = [
87
+ ...(f.flowsReplayed === undefined ? [] : [`${plural(f.flowsReplayed, 'flow')} replayed`]),
88
+ ...(f.journeysReplayed === undefined
89
+ ? []
90
+ : [`${plural(f.journeysReplayed, 'journey')} replayed`]),
91
+ ...(f.journeysDriven === undefined ? [] : [`${plural(f.journeysDriven, 'journey')} driven`]),
92
+ ...(f.wallMs === undefined ? [] : [seconds(f.wallMs)]),
93
+ ];
94
+ return [
95
+ headline(f),
96
+ ...(1 < total
97
+ ? [
98
+ `- ${Said.CHECKS}: ${String(f.yes)} yes${SEP}${String(f.no)} no${SEP}${String(f.undecided)} undecided`,
99
+ ]
100
+ : []),
101
+ ...(0 < (f.covered?.length ?? 0) ? [`- ${Said.COVERED}: ${(f.covered ?? []).join(', ')}`] : []),
102
+ ...(0 < (f.failed?.length ?? 0)
103
+ ? [`- ${Said.DID_NOT_HOLD}: ${(f.failed ?? []).join(', ')}`]
104
+ : []),
105
+ ...(0 === metrics.length ? [] : [`- ${Said.METRICS}: ${metrics.join(SEP)}`]),
106
+ ...evidenceLine(f.screenshots ?? []),
107
+ f.platform,
108
+ ].join('\n');
109
+ }
110
+ const WORD_FOR = {
111
+ [Verified.YES]: ResultWord.PROVED,
112
+ [Verified.NO]: ResultWord.FAILED,
113
+ [Verified.UNKNOWN]: ResultWord.NOT_PROVED,
114
+ [Verified.NO_FAULT]: ResultWord.NOT_PROVED,
115
+ };
116
+ /**
117
+ * The same block under a verdict decided above the counts: `reticle_verify { change }` can turn a
118
+ * green suite into `no` (a channel disagreed) or `unknown` (the flows do not cover the files).
119
+ */
120
+ export function retitleResult(block, verified, because) {
121
+ const [, ...rest] = block.split('\n');
122
+ return [`${HEAD}${WORD_FOR[verified]}**${SEP}${because}`, ...rest].join('\n');
123
+ }
124
+ /** The platform line when the key was refused: one true sentence, and the fix. */
125
+ export const KEY_REFUSED_HEAD = 'Not on the platform: ';
126
+ const keyRefusedLine = (why) => `${KEY_REFUSED_HEAD}${why.replace(/\.$/, '')}. Mint a new key in Settings → API keys; the run is kept on this machine`;
127
+ /** The line for a key refused for no reason the platform named. */
128
+ export const KEY_REFUSED_LINE = keyRefusedLine(KEY_REFUSED);
129
+ /** The platform line: where the run lives when linked, what linking adds when not. One line. */
130
+ export function platformLine(root, env, runId) {
131
+ // Before any link: a run the platform will refuse is not "saved" and not "on the dashboard".
132
+ const refusal = keyRefusalAtLastSync(root);
133
+ if (refusal !== undefined)
134
+ return `- ${keyRefusedLine(refusal)}`;
135
+ const dashboard = readDashboardUrl(root);
136
+ if (dashboard !== undefined)
137
+ return runId === undefined
138
+ ? `- ${Said.DASHBOARD}: ${dashboard}`
139
+ : `- ${Said.RUN_LINK}: ${dashboardRunUrl(dashboard, runId)}`;
140
+ if (existsSync(join(root, ReticleDir.CLOUD_LINK_FILE)) || apiKeyFrom(env) !== undefined)
141
+ return `- ${Said.SYNCED}.`;
142
+ return `- ${Said.PITCH} (${TRIAL_OFFER}): ${CONNECT}.`;
143
+ }
144
+ /** Screenshot paths a replay filed, in step order. */
145
+ const replayShots = (replay) => replay.steps.flatMap((s) => s.screenshot !== undefined && 'path' in s.screenshot ? [s.screenshot.path] : []);
146
+ /**
147
+ * The block for a replayed suite: the flows are the journeys, each flow's verdict one check, decided
148
+ * as the run decides it (`mapReplayToFlowResult`): a green a channel contradicted is undecided, as
149
+ * the suite's `unverifiable` status says, never held.
150
+ */
151
+ export function suiteResult(root, verdict, timed, runId) {
152
+ const statuses = timed.map((t) => mapReplayToFlowResult(t.replay, t.durationMs).status);
153
+ const count = (s) => statuses.filter((each) => s === each).length;
154
+ return buildReticleResult({
155
+ yes: count(RunFlowStatus.PASS),
156
+ no: count(RunFlowStatus.FAIL),
157
+ undecided: statuses.length - count(RunFlowStatus.PASS) - count(RunFlowStatus.FAIL),
158
+ covered: timed.map((t) => t.replay.name),
159
+ failed: verdict.failures.map((f) => f.flow),
160
+ flowsReplayed: timed.length,
161
+ wallMs: timed.reduce((sum, t) => sum + t.durationMs, 0),
162
+ screenshots: timed.flatMap((t) => replayShots(t.replay)),
163
+ platform: platformLine(root, process.env, runId),
164
+ });
165
+ }
166
+ /**
167
+ * `reticle_verify { change }`'s answer with the block on it. Its verdict is decided ABOVE the suite
168
+ * (uncovered files, a disagreeing channel), so the suite's own block is retitled with that verdict
169
+ * and moved to the top level: a nested block saying "proved" under an outer `no` is a false green.
170
+ */
171
+ export function changeResult(root, out) {
172
+ if (null === out || 'object' !== typeof out)
173
+ return out;
174
+ const answer = out;
175
+ const verified = answer['verified'];
176
+ if (!Object.values(Verified).includes(verified))
177
+ return out;
178
+ const suite = answer['suite'];
179
+ const inner = null !== suite && 'object' === typeof suite
180
+ ? suite[RESULT_FIELD]
181
+ : undefined;
182
+ const block = 'string' === typeof inner
183
+ ? inner
184
+ : buildReticleResult({
185
+ yes: 0,
186
+ no: 0,
187
+ undecided: 0,
188
+ platform: platformLine(root, process.env),
189
+ });
190
+ const because = 'string' === typeof answer['because'] ? answer['because'] : '';
191
+ return {
192
+ ...answer,
193
+ ...('string' === typeof inner
194
+ ? {
195
+ suite: Object.fromEntries(Object.entries(suite).filter(([k]) => RESULT_FIELD !== k)),
196
+ }
197
+ : {}),
198
+ [RESULT_FIELD]: retitleResult(block, verified, because),
199
+ };
200
+ }
201
+ /** Claims named before the rest are counted: a session can hold dozens. */
202
+ const COVERED_SHOWN = 5;
203
+ const capped = (items, shown) => items.length <= shown
204
+ ? [...items]
205
+ : [...items.slice(0, shown), `(+${String(items.length - shown)} more)`];
206
+ /** The step screenshots a drive filed under its run, or none: evidence is listed, never assumed. */
207
+ function shotsOf(root, runId) {
208
+ try {
209
+ const dir = stepShotDir(root, runId);
210
+ return readdirSync(dir)
211
+ .sort()
212
+ .map((f) => join(dir, f));
213
+ }
214
+ catch {
215
+ return [];
216
+ }
217
+ }
218
+ /**
219
+ * The block for one replayed flow: one check, decided as the synced run decides it — a pass whose
220
+ * flow asserts nothing, or whose channels disagreed, is undecided, never held.
221
+ */
222
+ export function replayResult(root, replay, durationMs, runId) {
223
+ const status = mapReplayToFlowResult(replay, durationMs).status;
224
+ const held = RunFlowStatus.PASS === status;
225
+ const failed = RunFlowStatus.FAIL === status;
226
+ return buildReticleResult({
227
+ yes: held ? 1 : 0,
228
+ no: failed ? 1 : 0,
229
+ undecided: held || failed ? 0 : 1,
230
+ covered: [replay.name],
231
+ ...(failed ? { failed: [replay.name] } : {}),
232
+ flowsReplayed: 1,
233
+ wallMs: durationMs,
234
+ screenshots: replayShots(replay),
235
+ platform: platformLine(root, process.env, runId),
236
+ });
237
+ }
238
+ const MSG_GOAL_NOT_REACHED = 'the drive did not reach its goal';
239
+ /**
240
+ * The block for a Harness drive: its checks and its graded goals are the checks; a plan's journeys
241
+ * are what it covered, with how many were replayed and how many the model drove. Checks that held
242
+ * over a goal the drive did not reach are not proved, as the answer's own `proved` says.
243
+ */
244
+ export function exploreResult(root, drive) {
245
+ // The checks, counted once and as the run's own summary counts them: the graded goals decide
246
+ // `goalMet` (and the headline below) and were added on top, so one run read "2 of 2 check(s)
247
+ // held" in its summary and "3 of 3" here.
248
+ const yes = drive.checks.held;
249
+ const no = drive.checks.failed;
250
+ const undecided = drive.checks.undecided;
251
+ const journeys = drive.journeys ?? [];
252
+ const by = (b) => journeys.filter((j) => b === j.by).length;
253
+ const answered = journeys.some((j) => j.by !== undefined);
254
+ const block = buildReticleResult({
255
+ yes,
256
+ no,
257
+ undecided,
258
+ ...(0 === journeys.length
259
+ ? {}
260
+ : {
261
+ covered: capped(journeys.map((j) => j.title), COVERED_SHOWN),
262
+ failed: journeys.filter((j) => 'failed' === j.status).map((j) => j.title),
263
+ }),
264
+ ...(answered
265
+ ? { journeysReplayed: by(JourneyBy.REPLAY), journeysDriven: by(JourneyBy.MODEL) }
266
+ : {}),
267
+ screenshots: (drive.runIds ?? []).flatMap((id) => shotsOf(root, id)),
268
+ platform: platformLine(root, process.env, drive.runIds?.[0]),
269
+ });
270
+ // A plan's verdict is its journeys' (the same line the run ends on), never a count beside it.
271
+ if (0 < journeys.length) {
272
+ const { verified: word, line } = runVerdict(drive.checks, drive.goalMet, journeys);
273
+ return WORD_FOR[word] === headWord(block)
274
+ ? block
275
+ : retitleResult(block, word, (line.split(' — ')[1] ?? line).replace(/\.$/, ''));
276
+ }
277
+ return 0 === no && 0 === undecided && 0 < yes && false === drive.goalMet
278
+ ? retitleResult(block, Verified.UNKNOWN, MSG_GOAL_NOT_REACHED)
279
+ : block;
280
+ }
281
+ /** The verdict word a block's headline carries. */
282
+ function headWord(block) {
283
+ return block.slice(HEAD.length).split('**')[0];
284
+ }
285
+ /**
286
+ * The block for a session ending: every verdict the journal holds is one check. `no-fault` (nothing
287
+ * declared) counts as undecided, never as held — a session that proved nothing must not read as one
288
+ * that proved something.
289
+ */
290
+ export function sessionResult(deps, sessionId, actions, wallMs, runId = driveRunId(sessionId)) {
291
+ const gap = gapSummary(actions);
292
+ const held = [
293
+ ...new Set(actions.flatMap((a) => {
294
+ const v = JournalVerdictEffectSchema.safeParse(a.effect);
295
+ return v.success && Verified.YES === v.data.verified ? [v.data.claim] : [];
296
+ })),
297
+ ];
298
+ // The session's project, never wherever the daemon was launched.
299
+ const root = sessionRoot(deps, sessionId);
300
+ return buildReticleResult({
301
+ yes: gap.held,
302
+ no: gap.failed,
303
+ undecided: gap.undecided + gap.nothingToProve,
304
+ covered: capped(held, COVERED_SHOWN),
305
+ failed: capped(gap.failures.map((f) => f.claim), COVERED_SHOWN),
306
+ ...(wallMs === undefined ? {} : { wallMs }),
307
+ screenshots: shotsOf(root, runId),
308
+ platform: platformLine(root, process.env, 0 < gap.claims ? runId : undefined),
309
+ });
310
+ }
311
+ /**
312
+ * What an ending agent session reports: its own calls since its previous end in the tab, never the
313
+ * Harness drives the tab also holds, and the run they are kept under.
314
+ */
315
+ export function endedAgentSession(sessionId, actions, at, claim) {
316
+ return endAgentSession(sessionId, actions, at, claim);
317
+ }
318
+ /**
319
+ * The agent's own claim beside what grading the session's checks gave: the comparison a dashboard
320
+ * makes, said where the agent can read it. The claim never becomes the verdict.
321
+ */
322
+ export function claimAgainstGrade(claim, actions) {
323
+ const run = driveRunFrom(actions, { runId: 'claim' });
324
+ // computeVerdict decides it, once: a failed check beside a passed one is a fail there too.
325
+ const graded = run === undefined ? VerdictStatus.UNKNOWN : computeVerdict(run).status;
326
+ return { claimed: claim, graded, agrees: claim === graded };
327
+ }
328
+ /** The tools whose verdicts an agent session's block counts: each one is one of its checks. */
329
+ const SESSION_VERDICT_TOOLS = new Set([
330
+ ReticleTool.ACT_AND_WAIT,
331
+ // `reticle_act { steps }` dispatches under ACT's name: a journey still grading is waited for too.
332
+ ReticleTool.ACT,
333
+ ReticleTool.ACT_SEQUENCE,
334
+ ReticleTool.ASSERT,
335
+ ReticleTool.WAIT_FOR,
336
+ ]);
337
+ /** Verdicts being decided right now. ponytail: daemon-wide, not per tab; an end waits for all. */
338
+ const inFlight = new Set();
339
+ /**
340
+ * A verdict tool's call, remembered until it settles, so a session that ends meanwhile counts it.
341
+ * An agent ended its session while a `reticle_assert { wait }` was still waiting: the end folded
342
+ * first ("proved · 1 of 1"), a PASS on the dashboard, and the failure landed in the next run.
343
+ */
344
+ export function trackVerdict(tool, call) {
345
+ if (!SESSION_VERDICT_TOOLS.has(tool))
346
+ return call;
347
+ const settled = call.then(() => undefined, () => undefined);
348
+ inFlight.add(settled);
349
+ void settled.then(() => inFlight.delete(settled));
350
+ return call;
351
+ }
352
+ /** Resolves once every verdict in flight now has been decided (and journaled). */
353
+ export async function verdictsSettled() {
354
+ await Promise.all([...inFlight]);
355
+ }
356
+ /** The block as a field, or no field: the block is advice, never the reason a result throws. */
357
+ export function resultField(build) {
358
+ try {
359
+ return { [RESULT_FIELD]: build() };
360
+ }
361
+ catch {
362
+ return {};
363
+ }
364
+ }
@@ -44,8 +44,9 @@ export interface ToolDeps<Ext = unknown> {
44
44
  * to: this is a port, and the daemon already resolves exactly this for cloud sync.
45
45
  *
46
46
  * Absent ⇒ nothing is linked, or the caller is an embedder with no filesystem. Never an error.
47
+ * `root` is the `.reticle` whose link is asked for; absent, the daemon's own.
47
48
  */
48
- linkedCloud?: () => Promise<{
49
+ linkedCloud?: (root?: string) => Promise<{
49
50
  url: string;
50
51
  apiKey: string;
51
52
  } | null>;
@@ -79,6 +80,14 @@ export interface ToolDeps<Ext = unknown> {
79
80
  syncNow?: () => Promise<unknown>;
80
81
  /** Wires the app on the agent's first use, instead of at installation. Absent: tell, do not wire. */
81
82
  firstRun?: FirstRunWiring;
83
+ /**
84
+ * On the first page-needing call with nothing connected, opens this caller's UNWIRED app in a
85
+ * lease that supplies the SDK (see zero-install-first-call.ts). Absent: answer no-session as before.
86
+ */
87
+ openUnwiredApp?: () => Promise<{
88
+ url: string;
89
+ notice: string;
90
+ } | undefined>;
82
91
  /** cross-run outcome memory (.reticle/project.json). */
83
92
  project: ProjectStore;
84
93
  /** optional native-input provider. undefined ⇒ everything stays synthetic. */
@@ -185,7 +194,17 @@ export interface ToolDef<Ext = unknown> {
185
194
  * handed a bag carrying no `ext` at all. That costs nothing here, because `ext` is optional by
186
195
  * design: any handler reading it already has to survive `undefined`.
187
196
  */
188
- handler(deps: ToolDeps<Ext>, args: Record<string, unknown>): Promise<unknown>;
197
+ handler(deps: ToolDeps<Ext>, args: Record<string, unknown>, call?: ToolCall): Promise<unknown>;
198
+ }
199
+ /**
200
+ * What the MCP request itself offers a handler: its cancellation, and a way to say it is still
201
+ * working. Absent off the MCP path (the Harness's own calls, the CLI, tests).
202
+ */
203
+ export interface ToolCall {
204
+ /** Aborts when the client cancels or the connection drops. */
205
+ signal?: AbortSignal;
206
+ /** Present when the client asked for progress: tells it the call is alive, and how far along. */
207
+ progress?: (progress: number, message: string) => void;
189
208
  }
190
209
  /**
191
210
  * The optional inline intent, on every tool that draws a verdict.
@@ -253,10 +272,43 @@ export declare const EnvelopeKey: {
253
272
  readonly FEEDBACK_UNDELIVERED: "feedback_undelivered";
254
273
  /** Once per project: verified runs exist only on this machine. See platform-moment.ts. */
255
274
  readonly PLATFORM: "platform";
275
+ /**
276
+ * This leased tab runs a STUB of the bindings a desktop shell injects (`reticle_lease acquire`'s
277
+ * `initScript`), so a verdict here is about the app's view logic and not about the real shell.
278
+ */
279
+ readonly HOST_STUB: "host_stub";
256
280
  /** The one thing to do next: declare the request, yield, fix sync, connect. See next-step.ts. */
257
281
  readonly NEXT: "next";
282
+ /** One-shot: a Harness drive started or finished, from any origin, and how to read it. */
283
+ readonly HARNESS: "harness";
284
+ /** Where this step's screenshot is (`{ path, source }`), or why there is none. See step-shots.ts. */
285
+ readonly SCREENSHOT: "screenshot";
286
+ /**
287
+ * One-shot: this call's tab was opened by Reticle on an app nobody wired, with the SDK supplied —
288
+ * what it cannot see, and the command that wires the app for good. See zero-install-first-call.ts.
289
+ */
290
+ readonly ZERO_INSTALL: "zero_install";
291
+ /** Once-per-session advisory lines an agent's own call carries. See agent/notices.ts. */
292
+ readonly NOTICES: "notices";
258
293
  };
259
294
  export type EnvelopeKey = (typeof EnvelopeKey)[keyof typeof EnvelopeKey];
295
+ /**
296
+ * The sentence every session-bound result carries while its leased tab runs on a stubbed shell.
297
+ *
298
+ * Spliced wherever the tab's health is spliced, because the fact matters to exactly the same
299
+ * readings: a green from a tab whose `window.go` Reticle faked is not evidence about the real shell,
300
+ * and nothing else in the result would say so.
301
+ */
302
+ export declare const HOST_STUB_NOTE: string;
303
+ /**
304
+ * The tools whose every answer leaves a screenshot of the page. A sequence (`reticle_act` with
305
+ * `steps`) takes one per step, inside the sequence, rather than one for the whole call.
306
+ */
307
+ export declare const STEP_SHOT_TOOLS: ReadonlySet<string>;
308
+ /** A step-screenshot tool, with the one sentence about its screenshot on the end of its description. */
309
+ export declare function withScreenshotDoc(tool: ToolDef): ToolDef;
310
+ /** The one sentence every tool that takes a step screenshot says about it. */
311
+ export declare const SCREENSHOT_DOC = " `screenshot.path` is a picture of the page at the outcome: open it when the look of the page matters; reading it is your choice.";
260
312
  /**
261
313
  * Fields that `runTool` / `withControl` splice onto EVERY session-bound tool result at runtime.
262
314
  * Merged into each session-bound tool's outputSchema so a schema-strict client (structuredContent
@@ -281,3 +333,17 @@ export declare function snapshotTree(deps: ToolDeps, sessionId: string | undefin
281
333
  * imports. See `ToolDeps.snapshots` for why a daemon-wide store cannot be correct.
282
334
  */
283
335
  export declare const newSnapshotCache: () => SnapshotCache;
336
+ /** The argument a replay takes its redacted fields' values in, for that call only. */
337
+ export declare const CALL_SECRETS_ARG = "secrets";
338
+ /** The secrets the current call supplied, keyed as given (a field, or its variable name). */
339
+ export declare function callSecrets(): Readonly<Record<string, string>> | undefined;
340
+ /**
341
+ * Take the call's secrets out of its arguments, so nothing downstream — the tool log, the journal,
342
+ * telemetry — ever sees them.
343
+ */
344
+ export declare function takeCallSecrets(args: Record<string, unknown>): {
345
+ secrets: Record<string, string> | undefined;
346
+ rest: Record<string, unknown>;
347
+ };
348
+ /** Run `fn` with these secrets supplied for it alone. */
349
+ export declare function withCallSecrets<T>(secrets: Readonly<Record<string, string>> | undefined, fn: () => Promise<T>): Promise<T>;
@@ -1,5 +1,6 @@
1
1
  import { z } from 'zod';
2
- import { ReticleCommand, SnapshotMode } from '@reticlehq/core';
2
+ import { AsyncLocalStorage } from 'node:async_hooks';
3
+ import { asRecord, asString, ReticleCommand, ReticleTool, SnapshotMode, } from '@reticlehq/core';
3
4
  import { normalizeLines } from '../../memory/project/baselines.js';
4
5
  import { SnapshotCache } from './read/snapshot-delta.js';
5
6
  /**
@@ -80,9 +81,52 @@ export const EnvelopeKey = {
80
81
  FEEDBACK_UNDELIVERED: 'feedback_undelivered',
81
82
  /** Once per project: verified runs exist only on this machine. See platform-moment.ts. */
82
83
  PLATFORM: 'platform',
84
+ /**
85
+ * This leased tab runs a STUB of the bindings a desktop shell injects (`reticle_lease acquire`'s
86
+ * `initScript`), so a verdict here is about the app's view logic and not about the real shell.
87
+ */
88
+ HOST_STUB: 'host_stub',
83
89
  /** The one thing to do next: declare the request, yield, fix sync, connect. See next-step.ts. */
84
90
  NEXT: 'next',
91
+ /** One-shot: a Harness drive started or finished, from any origin, and how to read it. */
92
+ HARNESS: 'harness',
93
+ /** Where this step's screenshot is (`{ path, source }`), or why there is none. See step-shots.ts. */
94
+ SCREENSHOT: 'screenshot',
95
+ /**
96
+ * One-shot: this call's tab was opened by Reticle on an app nobody wired, with the SDK supplied —
97
+ * what it cannot see, and the command that wires the app for good. See zero-install-first-call.ts.
98
+ */
99
+ ZERO_INSTALL: 'zero_install',
100
+ /** Once-per-session advisory lines an agent's own call carries. See agent/notices.ts. */
101
+ NOTICES: 'notices',
85
102
  };
103
+ /**
104
+ * The sentence every session-bound result carries while its leased tab runs on a stubbed shell.
105
+ *
106
+ * Spliced wherever the tab's health is spliced, because the fact matters to exactly the same
107
+ * readings: a green from a tab whose `window.go` Reticle faked is not evidence about the real shell,
108
+ * and nothing else in the result would say so.
109
+ */
110
+ export const HOST_STUB_NOTE = 'a stub for the bindings a desktop shell injects was installed in this tab before its scripts ' +
111
+ 'ran, so a green here is not a verdict against the real shell.';
112
+ /**
113
+ * The tools whose every answer leaves a screenshot of the page. A sequence (`reticle_act` with
114
+ * `steps`) takes one per step, inside the sequence, rather than one for the whole call.
115
+ */
116
+ export const STEP_SHOT_TOOLS = new Set([
117
+ ReticleTool.ACT,
118
+ ReticleTool.ACT_AND_WAIT,
119
+ ReticleTool.NAVIGATE,
120
+ ReticleTool.ASSERT,
121
+ ]);
122
+ /** A step-screenshot tool, with the one sentence about its screenshot on the end of its description. */
123
+ export function withScreenshotDoc(tool) {
124
+ return STEP_SHOT_TOOLS.has(tool.name)
125
+ ? { ...tool, description: `${tool.description}${SCREENSHOT_DOC}` }
126
+ : tool;
127
+ }
128
+ /** The one sentence every tool that takes a step screenshot says about it. */
129
+ export const SCREENSHOT_DOC = ' `screenshot.path` is a picture of the page at the outcome: open it when the look of the page matters; reading it is your choice.';
86
130
  /**
87
131
  * Fields that `runTool` / `withControl` splice onto EVERY session-bound tool result at runtime.
88
132
  * Merged into each session-bound tool's outputSchema so a schema-strict client (structuredContent
@@ -124,3 +168,31 @@ export async function snapshotTree(deps, sessionId) {
124
168
  * imports. See `ToolDeps.snapshots` for why a daemon-wide store cannot be correct.
125
169
  */
126
170
  export const newSnapshotCache = () => new SnapshotCache();
171
+ /** The argument a replay takes its redacted fields' values in, for that call only. */
172
+ export const CALL_SECRETS_ARG = 'secrets';
173
+ /** Secrets a call supplied; never written anywhere, gone when the call ends. */
174
+ const callSecretStore = new AsyncLocalStorage();
175
+ /** The secrets the current call supplied, keyed as given (a field, or its variable name). */
176
+ export function callSecrets() {
177
+ return callSecretStore.getStore();
178
+ }
179
+ /**
180
+ * Take the call's secrets out of its arguments, so nothing downstream — the tool log, the journal,
181
+ * telemetry — ever sees them.
182
+ */
183
+ export function takeCallSecrets(args) {
184
+ if (!(CALL_SECRETS_ARG in args))
185
+ return { secrets: undefined, rest: args };
186
+ const { [CALL_SECRETS_ARG]: raw, ...rest } = args;
187
+ const secrets = {};
188
+ for (const [key, value] of Object.entries(asRecord(raw))) {
189
+ const text = asString(value);
190
+ if (text !== undefined && 0 < text.length)
191
+ secrets[key] = text;
192
+ }
193
+ return { secrets, rest };
194
+ }
195
+ /** Run `fn` with these secrets supplied for it alone. */
196
+ export function withCallSecrets(secrets, fn) {
197
+ return secrets === undefined ? fn() : callSecretStore.run(secrets, fn);
198
+ }