@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,50 @@
1
+ /**
2
+ * Re-teach on a mistake the primer covers: ONE line, once per rule per agent session.
3
+ *
4
+ * After a compaction the agent keeps calling, but the rules it read at the start are gone. The daemon
5
+ * still knows it is the same agent (same MCP connection), and it can see the mistake in the call it
6
+ * just answered. So the answer carries the one rule that call broke — and costs nothing when the
7
+ * agent behaves. Deduplication is `foldNotices`' once-per-session rule.
8
+ *
9
+ * Advice only: computed from a result that is already decided, returned as a sentence.
10
+ */
11
+ import { ReticleTool, Verified, asRecord } from '@reticlehq/core';
12
+ export const ReteachLine = {
13
+ NO_UNTIL: 'Rule: name the consequence in `until` BEFORE acting — without it the result is "no-fault", which proves nothing.',
14
+ ALIAS: 'Rule: write predicates in their canonical spelling (see `normalized`); aliases are a courtesy, not the API.',
15
+ CASE: 'Rule: text checks are exact-case — use ignoreCase: true only when the case truly does not matter.',
16
+ RELIST: 'Rule: you already have this tab — reuse its sessionId (or omit it) instead of listing sessions again.',
17
+ COMPACTED: 'Lost track (context compacted)? reticle_run { tool: "reticle_context", args: { compact: true } } returns what this session proved, failed and still owes.',
18
+ };
19
+ const listCounts = new Map();
20
+ /** Tests only. */
21
+ export function resetReteach() {
22
+ listCounts.clear();
23
+ }
24
+ /** The rule this call broke, if any. */
25
+ export function reteachFor(session, tool, args, result) {
26
+ const lines = [];
27
+ if (ReticleTool.ACT_AND_WAIT === tool &&
28
+ args['until'] === undefined &&
29
+ args['predicate'] === undefined) {
30
+ if (Verified.NO_FAULT === result['verified'])
31
+ lines.push(ReteachLine.NO_UNTIL);
32
+ }
33
+ if (Array.isArray(result['normalized']) && result['normalized'].length > 0)
34
+ lines.push(ReteachLine.ALIAS);
35
+ const verdict = 'object' === typeof result['verdict'] && null !== result['verdict']
36
+ ? asRecord(result['verdict'])
37
+ : result;
38
+ if (true === verdict['caseOnlyMiss'])
39
+ lines.push(ReteachLine.CASE);
40
+ const listing = ReticleTool.SESSIONS === tool ||
41
+ (ReticleTool.SESSION === tool && (args['action'] === undefined || 'list' === args['action']));
42
+ if (listing && Array.isArray(result['sessions']) && result['sessions'].length > 0) {
43
+ const seen = (listCounts.get(session) ?? 0) + 1;
44
+ listCounts.set(session, seen);
45
+ // The third listing in one session: the first two are orientation, a third is a lost thread.
46
+ if (seen >= 3)
47
+ lines.push(ReteachLine.RELIST, ReteachLine.COMPACTED);
48
+ }
49
+ return lines;
50
+ }
@@ -15,3 +15,8 @@
15
15
  * missing instead of being replaced by a guess.
16
16
  */
17
17
  export declare function aliasParam(args: Record<string, unknown>, canonical: string, aliases: readonly string[]): Record<string, unknown>;
18
+ /**
19
+ * The alias a call used for `canonical`, named the way a verdict tool names a normalised predicate
20
+ * (`normalized: ["name → flowName"]`): accepted, and said, so the agent learns the real spelling.
21
+ */
22
+ export declare function aliasUsed(args: Record<string, unknown>, canonical: string, aliases: readonly string[]): string[];
@@ -23,3 +23,13 @@ export function aliasParam(args, canonical, aliases) {
23
23
  }
24
24
  return args;
25
25
  }
26
+ /**
27
+ * The alias a call used for `canonical`, named the way a verdict tool names a normalised predicate
28
+ * (`normalized: ["name → flowName"]`): accepted, and said, so the agent learns the real spelling.
29
+ */
30
+ export function aliasUsed(args, canonical, aliases) {
31
+ if (args[canonical] !== undefined)
32
+ return [];
33
+ const alias = aliases.find((name) => args[name] !== undefined);
34
+ return alias === undefined ? [] : [`${alias} → ${canonical}`];
35
+ }
@@ -0,0 +1,6 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * The per-call acknowledgement of steps the replay guard holds as destructive. Never persisted into
4
+ * a flow: a destructive confirmation is a decision made for one run.
5
+ */
6
+ export declare const confirmDangerousArg: (scope: string) => z.ZodOptional<z.ZodBoolean>;
@@ -0,0 +1,6 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * The per-call acknowledgement of steps the replay guard holds as destructive. Never persisted into
4
+ * a flow: a destructive confirmation is a decision made for one run.
5
+ */
6
+ export const confirmDangerousArg = (scope) => z.boolean().optional().describe(`Set true to allow destructive controls during ${scope} only.`);
@@ -1,5 +1,20 @@
1
1
  import type { Predicate } from '@reticlehq/engine/question/predicate/predicate-schema.js';
2
2
  import type { Session } from '../../../portal/session/session.js';
3
+ /**
4
+ * Any `data-reticle-source` stamp on an ELEMENT anywhere in an assertion's evidence, near misses
5
+ * included.
6
+ *
7
+ * Not a pointer to report: `assertSource` decides that, and it refuses a near miss because that is
8
+ * a different element. This answers a narrower question, the one the `no-source-mapping` gap asks:
9
+ * does this build stamp its elements at all? A near miss that carries `source` proves it does, so a
10
+ * failure whose only located element is a near miss must not tell the agent to install a plugin
11
+ * that is already working (#1422).
12
+ *
13
+ * Only element descriptors count (they carry a `ref` or a `tag`): a console error's `source` is the
14
+ * browser's script URL and says nothing about build stamps. The depth bound is generous enough for
15
+ * nested `allOf`/`anyOf` evidence and exists only because evidence is page-supplied.
16
+ */
17
+ export declare function stampedSourceIn(evidence: unknown, depth?: number): string | undefined;
3
18
  /**
4
19
  * The `file:line` an ASSERTION is entitled to report — its own evidence, or nothing.
5
20
  *
@@ -28,6 +28,46 @@ function evidenceSource(evidence) {
28
28
  }
29
29
  return agreed;
30
30
  }
31
+ /**
32
+ * Any `data-reticle-source` stamp on an ELEMENT anywhere in an assertion's evidence, near misses
33
+ * included.
34
+ *
35
+ * Not a pointer to report: `assertSource` decides that, and it refuses a near miss because that is
36
+ * a different element. This answers a narrower question, the one the `no-source-mapping` gap asks:
37
+ * does this build stamp its elements at all? A near miss that carries `source` proves it does, so a
38
+ * failure whose only located element is a near miss must not tell the agent to install a plugin
39
+ * that is already working (#1422).
40
+ *
41
+ * Only element descriptors count (they carry a `ref` or a `tag`): a console error's `source` is the
42
+ * browser's script URL and says nothing about build stamps. The depth bound is generous enough for
43
+ * nested `allOf`/`anyOf` evidence and exists only because evidence is page-supplied.
44
+ */
45
+ export function stampedSourceIn(evidence, depth = 0) {
46
+ if (depth > MAX_EVIDENCE_DEPTH || 'object' !== typeof evidence || null === evidence) {
47
+ return undefined;
48
+ }
49
+ if (Array.isArray(evidence)) {
50
+ for (const entry of evidence) {
51
+ const found = stampedSourceIn(entry, depth + 1);
52
+ if (found !== undefined)
53
+ return found;
54
+ }
55
+ return undefined;
56
+ }
57
+ const entry = evidence;
58
+ const isElement = 'string' === typeof entry.ref || 'string' === typeof entry.tag;
59
+ if (isElement && 'string' === typeof entry.source && 0 < entry.source.length) {
60
+ return entry.source;
61
+ }
62
+ for (const value of Object.values(evidence)) {
63
+ const found = stampedSourceIn(value, depth + 1);
64
+ if (found !== undefined)
65
+ return found;
66
+ }
67
+ return undefined;
68
+ }
69
+ /** How deep `stampedSourceIn` follows nested evidence: combinators nest, a page could nest forever. */
70
+ const MAX_EVIDENCE_DEPTH = 16;
31
71
  /**
32
72
  * The `file:line` an ASSERTION is entitled to report — its own evidence, or nothing.
33
73
  *
@@ -17,8 +17,9 @@ import { decideVerified } from '@reticlehq/engine/evidence/verified.js';
17
17
  import { describeWaitTarget, namedNetIsInFlight } from '@reticlehq/engine/evidence/unsettled.js';
18
18
  import { inFlightRequestLabels, repeatedRequestLabels, } from '../act/settle-in-flight.js';
19
19
  import { gradeOfPredicate } from './assert-grade.js';
20
- import { assertSource } from './assert-source.js';
20
+ import { assertSource, stampedSourceIn } from './assert-source.js';
21
21
  import { VerdictAttribution, verdictAttributionOf } from '@reticlehq/core';
22
+ import { noteSourceSeen } from '../../../portal/session/recorded-gaps.js';
22
23
  /**
23
24
  * The honesty verdict for a plain `reticle_assert`.
24
25
  *
@@ -58,7 +59,9 @@ changeUndeclared) {
58
59
  // over-warning, which is the correct direction here: the failure this guards against is a green
59
60
  // that implies coverage it never had, and a needless caveat costs the agent a sentence.
60
61
  const spots = blindSpotsFromState(session.blindSpots(), session.runtime);
61
- const statement = buildCoverageStatement(spots);
62
+ // The window's own counts, so sampling before it is not described as this window's (#1414).
63
+ const windowSpots = blindSpotsFromState(session.blindSpots(since), session.runtime);
64
+ const statement = buildCoverageStatement(spots, windowSpots);
62
65
  const absenceBlindSpot = absenceBlindSpotNote(predicate, spots);
63
66
  // A green resting on hidden matches says the node exists, not that it shows (#1408).
64
67
  const hiddenMatch = hiddenMatchNote(predicate, evidence);
@@ -94,12 +97,15 @@ changeUndeclared) {
94
97
  background: session.background,
95
98
  expectedFailures: declared.netFailures,
96
99
  namedNetUrls: declared.netUrls,
100
+ repeatableNetUrls: declared.repeatableNetUrls,
97
101
  renderProved: pass && declared.rendersContent,
98
102
  ...(actCursor !== undefined && actCursor >= since ? { actionSince: actCursor } : {}),
99
103
  });
100
104
  // Only a spot that IMPEACHES the capture downgrades a general verdict. Structural boundaries are
101
105
  // reported as coverage; the narrower absence exception is computed separately above.
102
- const impeaching = buildCoverageStatement(spots.filter((sp) => impeachesCapture(sp.kind)));
106
+ const impeaching = buildCoverageStatement(
107
+ // The WINDOW's blind spots: sampling before it is a coverage fact, not this verdict's gap (#1414).
108
+ windowSpots.filter((sp) => impeachesCapture(sp.kind)));
103
109
  // A gap in the WINDOW, as opposed to a standing limit of the page. Both mean the same thing to the
104
110
  // rule — part of what happened was not seen — so both belong in `blindSpots`, which is the only
105
111
  // input `decideVerified` reads for that.
@@ -207,13 +213,25 @@ changeUndeclared) {
207
213
  repeated: repeatedRequestLabels(windowEvents),
208
214
  },
209
215
  });
216
+ // The one file:line this verdict is entitled to: its own evidence, or — for a failure with no DOM
217
+ // clause to point at — the control last driven. Returned so the RESPONSE can echo the same value
218
+ // the journal keeps; one verdict must never carry two different pointers.
219
+ const source = assertSource({
220
+ predicate,
221
+ evidence,
222
+ pass,
223
+ lastActSource: session.lastAct.source(),
224
+ });
210
225
  // The same rule the act path uses, fed by what THIS path knows. An assertion drives nothing, so
211
- // only two of the four gates can fire here: a red with no remembered source to point at, and a
212
- // state assertion against an app that registers no store.
226
+ // only two of the four gates can fire here: a red with nothing located, and a state assertion
227
+ // against an app that registers no store. "Nothing located" reads the verdict's own source first,
228
+ // then any stamp in its evidence (a near miss carries one), and only then the last act: before,
229
+ // it read only the last act, so a red asked before any act reported `no-source-mapping` while its
230
+ // own near misses carried file:line (#1422).
213
231
  const gaps = gapsForAction({
214
232
  pass,
215
233
  ...(changeUndeclared === undefined ? {} : { changeUndeclared }),
216
- source: session.lastAct.source(),
234
+ source: source ?? stampedSourceIn(evidence) ?? session.lastAct.source(),
217
235
  stateAsked: declaresState(predicate),
218
236
  stateUnwatched: isStateUnwatched(spots),
219
237
  // What the app DECLARED, so an under-instrumented one is told without having to be asked.
@@ -224,16 +242,8 @@ changeUndeclared) {
224
242
  domMutated: false,
225
243
  signalsFired: 0,
226
244
  });
245
+ noteSourceSeen(session, source ?? stampedSourceIn(evidence));
227
246
  noteSessionGaps(session, gaps);
228
- // The one file:line this verdict is entitled to: its own evidence, or — for a failure with no DOM
229
- // clause to point at — the control last driven. Returned so the RESPONSE can echo the same value
230
- // the journal keeps; one verdict must never carry two different pointers.
231
- const source = assertSource({
232
- predicate,
233
- evidence,
234
- pass,
235
- lastActSource: session.lastAct.source(),
236
- });
237
247
  // Who can act on this verdict, derived from the clause that decided it — see `attributedTo` below.
238
248
  const attributedTo = verdictAttributionOf(decision.verifiedReason);
239
249
  return {
@@ -9,6 +9,32 @@ import { ReticleTool } from '@reticlehq/core';
9
9
  import { asNumber, asString } from '@reticlehq/core';
10
10
  import { sessionIdShape, commandOrThrow } from './tool-kit.js';
11
11
  import { timeoutMsSchema } from './args/numeric-bounds.js';
12
+ /** Said when a lease's page now has no Reticle SDK: only the browser can still act on it. */
13
+ const MSG_LEASE_WITHOUT_SDK = 'This page has no Reticle SDK, so only browser-level actions apply here (navigate, screenshot). ' +
14
+ 'The lease is kept: navigate back to the app and it reattaches.';
15
+ /** Navigate a lease through its browser page, and wait for its SDK to come back. */
16
+ async function navigateLease(deps, sessionId, url, args) {
17
+ const timeoutMs = asNumber(args['timeout_ms']) ?? ARRIVAL_TIMEOUT_MS;
18
+ const went = (await deps.pool?.gotoLease(sessionId, url, timeoutMs)) ?? false;
19
+ if (!went)
20
+ return { ok: false, url, reason: 'the leased page did not navigate' };
21
+ const back = await waitForSession(deps, sessionId, timeoutMs);
22
+ return back
23
+ ? { ok: true, url, confirmed: true, sessionId }
24
+ : { ok: true, url, confirmed: false, waitedMs: timeoutMs, note: MSG_LEASE_WITHOUT_SDK };
25
+ }
26
+ /** Whether the session reconnects within the budget. */
27
+ async function waitForSession(deps, sessionId, timeoutMs) {
28
+ const start = deps.now();
29
+ for (;;) {
30
+ if (deps.sessions.get(sessionId) !== undefined)
31
+ return true;
32
+ if (deps.now() - start >= timeoutMs)
33
+ return false;
34
+ await new Promise((resolve) => setTimeout(resolve, LEASE_POLL_MS));
35
+ }
36
+ }
37
+ const LEASE_POLL_MS = 100;
12
38
  export const BROWSER_TOOLS = [
13
39
  {
14
40
  name: ReticleTool.NAVIGATE,
@@ -85,6 +111,16 @@ export const BROWSER_TOOLS = [
85
111
  const requested = asString(args['url']);
86
112
  if (requested === undefined || 0 === requested.length)
87
113
  return { ok: false, reason: 'url required' };
114
+ const named = asString(args['sessionId']);
115
+ // A lease whose page has no SDK right now (it was navigated to an image, a PDF, another site):
116
+ // the page is still the lease's, so it is navigated through the browser and reattaches when it
117
+ // is back on the app, instead of answering "no connected session" for good.
118
+ if (named !== undefined && deps.sessions.get(named) === undefined) {
119
+ const leaseUrl = deps.pool?.leaseUrl(named);
120
+ if (leaseUrl !== undefined) {
121
+ return navigateLease(deps, named, carryReticleIdentity(leaseUrl, requested), args);
122
+ }
123
+ }
88
124
  // Record navigate as an action. Its window is usually empty (the page unloads and the SDK
89
125
  // reconnects), but the action record itself — "navigated to X" — is the causal fact worth keeping.
90
126
  const session = deps.sessions.resolve(asString(args['sessionId']));
@@ -125,7 +161,13 @@ export const BROWSER_TOOLS = [
125
161
  priorIds,
126
162
  }, timeoutMs)
127
163
  : null;
128
- return navigateResult(result, arrival, timeoutMs);
164
+ const answer = navigateResult(result, arrival, timeoutMs);
165
+ // A lease navigated off its app (an image, a PDF) is kept, and says what still works.
166
+ const offApp = null === arrival &&
167
+ true === result.ok &&
168
+ deps.pool?.leaseUrl(session.id) !== undefined &&
169
+ deps.sessions.get(session.id) === undefined;
170
+ return offApp ? { ...answer, note: MSG_LEASE_WITHOUT_SDK } : answer;
129
171
  }
130
172
  finally {
131
173
  session.finishAction();
@@ -2,6 +2,9 @@ import type { SessionInfo } from '../../portal/session/session-info.js';
2
2
  import { LinkCapability, type PresenterTone } from '@reticlehq/core';
3
3
  import type { ToolDeps } from './tool-kit.js';
4
4
  import type { FileSystemPort } from '../../memory/project/fs/fs-port.js';
5
+ import { type ProbedTab } from '../../portal/session/recorded-gaps.js';
6
+ import { type FreeDrive } from '../../features/harness/platform/platform-drives.js';
7
+ import { HumanControlKind, type LinkUnsyncedRoot } from '@reticlehq/core';
5
8
  /** What this daemon does for the platform's chat. Each one is listed only once it is built. */
6
9
  export declare const CHAT_CAPABILITIES: readonly LinkCapability[];
7
10
  /** The slice of the session manager this needs. */
@@ -11,6 +14,16 @@ export interface ChatDriveSessions {
11
14
  get(id: string): {
12
15
  autoEnd(text: string, tone: PresenterTone): void;
13
16
  pushNarration(text: string): void;
17
+ readonly sdkVersion?: string | undefined;
18
+ readonly channels?: readonly string[] | undefined;
19
+ /** Asks the page what it carries (`probeMarkers`). Absent on a test double. */
20
+ command?: ProbedTab['command'];
21
+ readonly sourceMapping?: boolean | undefined;
22
+ } | undefined;
23
+ /** The last page handshake the bridge refused, when there was one. */
24
+ lastClosure?(): {
25
+ at: number;
26
+ reason: string;
14
27
  } | undefined;
15
28
  }
16
29
  export interface ChatDriveCloud {
@@ -20,7 +33,69 @@ export interface ChatDriveCloud {
20
33
  apiKey: string;
21
34
  } | undefined>;
22
35
  version: string;
36
+ /** Folders holding runs the platform never got (the sync daemon's last count). Absolute roots. */
37
+ unsynced?: () => readonly {
38
+ root: string;
39
+ runs: number;
40
+ linked: boolean;
41
+ }[];
23
42
  }
24
43
  export declare function startChatDrives(deps: ToolDeps, sessions: ChatDriveSessions, fs: FileSystemPort, cloud: ChatDriveCloud, log: (line: string) => void): {
25
44
  stop: () => void;
26
45
  };
46
+ /**
47
+ * The panel's Harness controls. The switch is the platform's autonomous mode, unchanged. Run Harness
48
+ * and Stop drive. A run asks the platform for the drive's grant, then starts it
49
+ * through the same explore an agent calls (counted, recorded, polled the same way); its lines and
50
+ * steps reach the HUD log as the drive narrates them. A refused grant says why, and where to start
51
+ * a trial when it wants a card.
52
+ */
53
+ export declare function hudDrive(deps: ToolDeps, sessionId: string,
54
+ /** The panel's control, as the bridge narrowed it (`harness-request.ts`). */
55
+ request: {
56
+ kind: typeof HumanControlKind.HARNESS;
57
+ enabled: boolean;
58
+ } | {
59
+ kind: typeof HumanControlKind.HARNESS_RUN;
60
+ persona?: string;
61
+ } | {
62
+ kind: typeof HumanControlKind.HARNESS_STOP;
63
+ },
64
+ /** The autonomous switch: written through to the platform, which the daemon owns. */
65
+ applySwitch: (enabled: boolean) => void, grant?: (platform: {
66
+ url: string;
67
+ apiKey: string;
68
+ }) => Promise<FreeDrive>): Promise<void>;
69
+ /**
70
+ * The link a panel sign-in makes once it lands: the tab's project, never a page that did not say
71
+ * which project it is (that would bind a hash-named project nothing here reads).
72
+ */
73
+ export declare function projectLinkOnly(link: ((root: string) => Promise<number>) | undefined): ((root: string) => Promise<number>) | undefined;
74
+ /**
75
+ * The panel's Harness controls on a bridge: the switch writes through to the platform, so console
76
+ * and panel cannot disagree; Run and Stop drive, in the project of the tab that asked.
77
+ */
78
+ export declare function attachHudHarness(bridge: {
79
+ attachHarnessRequest(handler: (request: Parameters<typeof hudDrive>[2] | {
80
+ kind: typeof HumanControlKind.HARNESS_LINK;
81
+ }, session: {
82
+ id: string;
83
+ artifactRoot?: string | undefined;
84
+ }) => void): void;
85
+ }, daemon: {
86
+ /** Read when a control arrives: the daemon builds its deps after it wires the bridge. */
87
+ deps: () => ToolDeps;
88
+ /** Where a tab with no project of its own drives. */
89
+ root: string;
90
+ /** Repaint every panel, so a running drive shows its Stop button and a finished one hides it. */
91
+ repaint: () => void;
92
+ }, applySwitch: (root: string, on: boolean) => void,
93
+ /** Link this project: what `reticle connect` does from that folder. Absent: the button says so. */
94
+ link?: (root: string) => Promise<number>): void;
95
+ /**
96
+ * The `unsynced` field of a report. Sent empty too, once this daemon has counted: the platform reads
97
+ * an absent list as "no news" and kept a "never sent" banner for runs that had long been sent.
98
+ */
99
+ export declare function unsyncedReport(unsynced: readonly LinkUnsyncedRoot[] | undefined, home: string): {
100
+ unsynced?: LinkUnsyncedRoot[];
101
+ };