@reticlehq/server 3.7.0 → 3.8.1

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 (578) hide show
  1. package/SKILL.md +59 -68
  2. package/bin/reticle.js +9 -2
  3. package/dist/command/cli/adhoc-suite.js +1 -1
  4. package/dist/command/cli/adhoc-verdict.d.ts +12 -0
  5. package/dist/command/cli/adhoc-verdict.js +62 -4
  6. package/dist/command/cli/answers/gate-hook-message.d.ts +2 -0
  7. package/dist/command/cli/answers/gate-hook-message.js +5 -1
  8. package/dist/command/cli/auth/cloud-session.d.ts +11 -19
  9. package/dist/command/cli/auth/cloud-session.js +23 -0
  10. package/dist/command/cli/auth/device-flow.d.ts +3 -37
  11. package/dist/command/cli/cli-doctor.js +66 -21
  12. package/dist/command/cli/cli-flow-commands.js +53 -11
  13. package/dist/command/cli/cli-kill.d.ts +8 -0
  14. package/dist/command/cli/cli-kill.js +43 -3
  15. package/dist/command/cli/cli-parse-feedback.d.ts +4 -0
  16. package/dist/command/cli/cli-parse-feedback.js +13 -1
  17. package/dist/command/cli/cli-parse-grammar.d.ts +1 -2
  18. package/dist/command/cli/cli-parse-grammar.js +1 -6
  19. package/dist/command/cli/cli-parse-serve.d.ts +24 -0
  20. package/dist/command/cli/cli-parse-serve.js +124 -0
  21. package/dist/command/cli/cli-parse.d.ts +12 -11
  22. package/dist/command/cli/cli-parse.js +100 -123
  23. package/dist/command/cli/cli-usage.d.ts +0 -11
  24. package/dist/command/cli/cli-usage.js +43 -16
  25. package/dist/command/cli/cli-verify.d.ts +1 -1
  26. package/dist/command/cli/cli-verify.js +29 -14
  27. package/dist/command/cli/cloud-cli.js +27 -9
  28. package/dist/command/cli/cloud-kit.js +3 -3
  29. package/dist/command/cli/cloud-link.d.ts +1 -20
  30. package/dist/command/cli/cloud-link.js +2 -0
  31. package/dist/command/cli/cloud-login.d.ts +6 -2
  32. package/dist/command/cli/cloud-login.js +13 -41
  33. package/dist/command/cli/config/checkout.d.ts +10 -0
  34. package/dist/command/cli/config/checkout.js +78 -0
  35. package/dist/command/cli/doctor/doctor-agent-link.d.ts +23 -0
  36. package/dist/command/cli/doctor/doctor-agent-link.js +28 -0
  37. package/dist/command/cli/doctor/doctor-coverage-line.js +1 -7
  38. package/dist/command/cli/doctor/doctor-rows.d.ts +4 -0
  39. package/dist/command/cli/doctor/doctor-rows.js +4 -0
  40. package/dist/command/cli/drive/drive-attach.d.ts +5 -0
  41. package/dist/command/cli/drive/drive-attach.js +21 -1
  42. package/dist/command/cli/hook/codex-transcript.d.ts +20 -0
  43. package/dist/command/cli/hook/codex-transcript.js +224 -0
  44. package/dist/command/cli/hook/episode-structure.d.ts +24 -0
  45. package/dist/command/cli/hook/episode-structure.js +138 -0
  46. package/dist/command/cli/hook/hook-command.d.ts +9 -0
  47. package/dist/command/cli/hook/hook-command.js +211 -0
  48. package/dist/command/cli/hook/hook-fast.d.ts +31 -0
  49. package/dist/command/cli/hook/hook-fast.js +136 -0
  50. package/dist/command/cli/hook/prompt-hook.d.ts +30 -0
  51. package/dist/command/cli/hook/prompt-hook.js +199 -0
  52. package/dist/command/cli/hook/tool-hook.d.ts +21 -0
  53. package/dist/command/cli/hook/tool-hook.js +259 -0
  54. package/dist/command/cli/launch/cli-launch.d.ts +2 -0
  55. package/dist/command/cli/launch/cli-launch.js +22 -2
  56. package/dist/command/cli/lifecycle/daemon-lifecycle.js +28 -2
  57. package/dist/command/cli/mcp-command.d.ts +9 -0
  58. package/dist/command/cli/mcp-command.js +127 -41
  59. package/dist/command/cli/open-navigate.d.ts +43 -0
  60. package/dist/command/cli/open-navigate.js +85 -0
  61. package/dist/command/cli/ports/port-holder.d.ts +16 -4
  62. package/dist/command/cli/ports/port-holder.js +58 -12
  63. package/dist/command/cli/ports/resolve/cli-port.js +18 -2
  64. package/dist/command/cli/project-name.d.ts +1 -7
  65. package/dist/command/cli/project-name.js +1 -0
  66. package/dist/command/cli/report-command.d.ts +8 -2
  67. package/dist/command/cli/report-command.js +95 -18
  68. package/dist/command/cli/status-fields.d.ts +9 -2
  69. package/dist/command/cli/status-fields.js +148 -4
  70. package/dist/command/cli/try-command.d.ts +3 -4
  71. package/dist/command/cli/try-command.js +6 -11
  72. package/dist/command/cli/verify-results.d.ts +4 -1
  73. package/dist/command/cli/verify-results.js +3 -1
  74. package/dist/command/cli.d.ts +1 -7
  75. package/dist/command/cli.js +79 -160
  76. package/dist/command/daemon/daemon-resilience.d.ts +6 -1
  77. package/dist/command/daemon/daemon-resilience.js +31 -18
  78. package/dist/command/daemon/daemon.d.ts +11 -0
  79. package/dist/command/daemon/daemon.js +70 -2
  80. package/dist/command/daemon/lifetime/daemon-usefulness.d.ts +2 -0
  81. package/dist/command/daemon/lifetime/daemon-usefulness.js +13 -2
  82. package/dist/command/daemon/wake-decision.js +4 -2
  83. package/dist/command/daemon/win32-escape.d.ts +32 -0
  84. package/dist/command/daemon/win32-escape.js +119 -0
  85. package/dist/command/setup/agent-configs.d.ts +9 -0
  86. package/dist/command/setup/agent-configs.js +9 -0
  87. package/dist/command/setup/auto-approve.d.ts +10 -3
  88. package/dist/command/setup/auto-approve.js +51 -3
  89. package/dist/command/setup/bringup/dev-server-files.d.ts +1 -9
  90. package/dist/command/setup/bringup/dev-server-wait.js +5 -1
  91. package/dist/command/setup/bringup/ensure-daemon.js +4 -7
  92. package/dist/command/setup/init/init-host.js +6 -0
  93. package/dist/command/setup/init/init-port.js +5 -4
  94. package/dist/command/setup/init/init-runtime.js +7 -1
  95. package/dist/command/setup/node-effects.d.ts +8 -0
  96. package/dist/command/setup/node-effects.js +36 -4
  97. package/dist/command/setup/probe/dev-port.d.ts +26 -0
  98. package/dist/command/setup/probe/dev-port.js +117 -0
  99. package/dist/command/setup/probe/page-probe.d.ts +1 -1
  100. package/dist/command/setup/probe/page-probe.js +11 -3
  101. package/dist/command/setup/remaining-steps.d.ts +0 -7
  102. package/dist/command/setup/remaining-steps.js +3 -2
  103. package/dist/command/setup/run-setup.d.ts +11 -0
  104. package/dist/command/setup/run-setup.js +33 -5
  105. package/dist/command/setup/setup-command.d.ts +2 -0
  106. package/dist/command/setup/setup-command.js +22 -4
  107. package/dist/command/update/updater.d.ts +1 -6
  108. package/dist/command/update/updater.js +4 -5
  109. package/dist/command/update/version-seen.d.ts +24 -0
  110. package/dist/command/update/version-seen.js +65 -0
  111. package/dist/command/version/peer-announce.d.ts +9 -1
  112. package/dist/command/version/peer-announce.js +25 -2
  113. package/dist/command/version/sdk-fix.d.ts +5 -6
  114. package/dist/command/version/sdk-fix.js +17 -32
  115. package/dist/command/version/version-skew.d.ts +16 -1
  116. package/dist/command/version/version-skew.js +84 -10
  117. package/dist/features/crawl/crawl-tools.js +2 -2
  118. package/dist/features/crawl/crawl.js +2 -0
  119. package/dist/features/exhaust/ledger.d.ts +15 -96
  120. package/dist/features/exhaust/ledger.js +3 -3
  121. package/dist/features/harness/drive-runs.d.ts +28 -4
  122. package/dist/features/harness/drive-runs.js +99 -7
  123. package/dist/features/harness/drivers.d.ts +1 -1
  124. package/dist/features/harness/drivers.js +1 -1
  125. package/dist/features/harness/harness.d.ts +5 -0
  126. package/dist/features/harness/harness.js +24 -12
  127. package/dist/features/harness/platform/platform-drives.d.ts +7 -1
  128. package/dist/features/harness/platform/platform-drives.js +12 -7
  129. package/dist/features/harness/platform/refusal.d.ts +1 -1
  130. package/dist/features/harness/platform/refusal.js +4 -4
  131. package/dist/features/harness/platform/remote-drive.js +70 -28
  132. package/dist/features/harness/platform/server-driver.js +22 -1
  133. package/dist/features/harness/platform-config.d.ts +1 -10
  134. package/dist/features/harness/platform-config.js +0 -20
  135. package/dist/features/license/license.d.ts +2 -14
  136. package/dist/features/visual/step-shots.d.ts +33 -1
  137. package/dist/features/visual/step-shots.js +155 -1
  138. package/dist/features/visual/visual-tools.js +12 -4
  139. package/dist/hooks/coding-agents.d.ts +6 -0
  140. package/dist/hooks/coding-agents.js +24 -3
  141. package/dist/hooks/episode-stamp.d.ts +32 -0
  142. package/dist/hooks/episode-stamp.js +61 -0
  143. package/dist/hooks/hook-commands.js +19 -9
  144. package/dist/index.d.ts +5 -1
  145. package/dist/index.js +66 -24
  146. package/dist/judgement/app-graph/journal-steps.d.ts +8 -0
  147. package/dist/judgement/app-graph/journal-steps.js +92 -0
  148. package/dist/judgement/capsule/capsule-store.d.ts +2 -39
  149. package/dist/judgement/domain/domain-model.js +1 -10
  150. package/dist/judgement/domain/domain-tools.js +4 -2
  151. package/dist/judgement/runs/artifact/run-store.d.ts +28 -8
  152. package/dist/judgement/runs/artifact/run-store.js +153 -28
  153. package/dist/judgement/runs/default-run-id.d.ts +3 -1
  154. package/dist/judgement/runs/default-run-id.js +15 -3
  155. package/dist/judgement/runs/drive-run.d.ts +3 -3
  156. package/dist/judgement/runs/drive-run.js +11 -7
  157. package/dist/judgement/runs/run-ledger.d.ts +21 -0
  158. package/dist/judgement/runs/run-ledger.js +143 -0
  159. package/dist/judgement/runs/runner-port.d.ts +1 -1
  160. package/dist/judgement/runs/runner-port.js +8 -2
  161. package/dist/judgement/runs/verification-sync.d.ts +4 -3
  162. package/dist/judgement/runs/verification-sync.js +27 -5
  163. package/dist/language/flows/affected-tools.js +2 -1
  164. package/dist/language/flows/annotate-notes/annotate.js +8 -3
  165. package/dist/language/flows/annotate-tools.js +1 -1
  166. package/dist/language/flows/change/affected.d.ts +8 -0
  167. package/dist/language/flows/change/affected.js +20 -7
  168. package/dist/language/flows/decision.js +19 -4
  169. package/dist/language/flows/fields/flow-secret-field.d.ts +9 -0
  170. package/dist/language/flows/fields/flow-secret-field.js +67 -5
  171. package/dist/language/flows/flow-anchor.d.ts +5 -0
  172. package/dist/language/flows/flow-anchor.js +4 -0
  173. package/dist/language/flows/flow-cross-step.d.ts +7 -1
  174. package/dist/language/flows/flow-cross-step.js +9 -0
  175. package/dist/language/flows/flow-expect-grammar.js +15 -10
  176. package/dist/language/flows/flow-intent.js +6 -1
  177. package/dist/language/flows/flow-journey.d.ts +8 -0
  178. package/dist/language/flows/flow-journey.js +13 -0
  179. package/dist/language/flows/flow-lease.d.ts +27 -0
  180. package/dist/language/flows/flow-lease.js +59 -0
  181. package/dist/language/flows/flow-replay-run.d.ts +1 -87
  182. package/dist/language/flows/flow-replay-run.js +111 -310
  183. package/dist/language/flows/flow-replay.js +21 -19
  184. package/dist/language/flows/flow-replayable.d.ts +38 -0
  185. package/dist/language/flows/flow-replayable.js +179 -0
  186. package/dist/language/flows/flow-start-path.d.ts +108 -0
  187. package/dist/language/flows/flow-start-path.js +313 -0
  188. package/dist/language/flows/flow-step-runners.d.ts +23 -2
  189. package/dist/language/flows/flow-step-runners.js +191 -32
  190. package/dist/language/flows/flow-store-for-session.d.ts +8 -1
  191. package/dist/language/flows/flow-store-for-session.js +6 -0
  192. package/dist/language/flows/flow-tools.d.ts +2 -23
  193. package/dist/language/flows/flow-tools.js +63 -113
  194. package/dist/language/flows/flows.d.ts +4 -6
  195. package/dist/language/flows/flows.js +90 -15
  196. package/dist/language/flows/heal-run.d.ts +10 -4
  197. package/dist/language/flows/heal-run.js +26 -9
  198. package/dist/language/flows/recording/flake.d.ts +3 -27
  199. package/dist/language/flows/recording/flake.js +1 -1
  200. package/dist/language/flows/recording/recording-backtrack.js +1 -4
  201. package/dist/language/flows/recording/tape/recordings.d.ts +11 -1
  202. package/dist/language/flows/recording/tape/recordings.js +9 -3
  203. package/dist/language/flows/replay.d.ts +25 -5
  204. package/dist/language/flows/replay.js +83 -16
  205. package/dist/language/flows/stores/assertion-tiers-store.js +1 -1
  206. package/dist/language/flows/suite/coverage.d.ts +9 -0
  207. package/dist/language/flows/suite/coverage.js +12 -1
  208. package/dist/language/flows/suite-selection.d.ts +25 -0
  209. package/dist/language/flows/suite-selection.js +41 -9
  210. package/dist/machine/git-tracks.d.ts +6 -0
  211. package/dist/machine/git-tracks.js +36 -0
  212. package/dist/memory/cloud/background-sync.d.ts +25 -0
  213. package/dist/memory/cloud/background-sync.js +79 -0
  214. package/dist/memory/cloud/cloud-config.d.ts +12 -1
  215. package/dist/memory/cloud/cloud-config.js +39 -13
  216. package/dist/memory/cloud/cloud-sync.d.ts +3 -24
  217. package/dist/memory/cloud/cloud-sync.js +5 -2
  218. package/dist/memory/cloud/harness-config.d.ts +0 -7
  219. package/dist/memory/cloud/memory-scope.d.ts +19 -0
  220. package/dist/memory/cloud/memory-scope.js +48 -0
  221. package/dist/memory/cloud/sync-answer.d.ts +43 -0
  222. package/dist/memory/cloud/sync-answer.js +42 -0
  223. package/dist/memory/cloud/sync-cycle.d.ts +40 -10
  224. package/dist/memory/cloud/sync-cycle.js +97 -144
  225. package/dist/memory/cloud/sync-daemon.d.ts +50 -3
  226. package/dist/memory/cloud/sync-daemon.js +473 -83
  227. package/dist/memory/cloud/sync-describe.d.ts +28 -0
  228. package/dist/memory/cloud/sync-describe.js +92 -0
  229. package/dist/memory/cloud/sync-disk.d.ts +9 -1
  230. package/dist/memory/cloud/sync-disk.js +137 -33
  231. package/dist/memory/cloud/sync-flow-versions.d.ts +26 -0
  232. package/dist/memory/cloud/sync-flow-versions.js +42 -0
  233. package/dist/memory/impact/impact-store.js +32 -15
  234. package/dist/memory/intent/intent-shard.d.ts +41 -266
  235. package/dist/memory/intent/intent-tools.js +20 -61
  236. package/dist/memory/intent/record-request.d.ts +27 -0
  237. package/dist/memory/intent/record-request.js +88 -0
  238. package/dist/memory/intent/settled-words.js +9 -1
  239. package/dist/memory/journal/drive-flow.d.ts +3 -0
  240. package/dist/memory/journal/drive-flow.js +11 -41
  241. package/dist/memory/journal/envelope-store.js +1 -1
  242. package/dist/memory/journal/envelope.d.ts +6 -154
  243. package/dist/memory/journal/episode-log.d.ts +107 -0
  244. package/dist/memory/journal/episode-log.js +302 -0
  245. package/dist/memory/journal/journal-recorder.d.ts +7 -0
  246. package/dist/memory/journal/journal-recorder.js +22 -9
  247. package/dist/memory/journal/on-disk/ambient-file.d.ts +1 -7
  248. package/dist/memory/journal/on-disk/ambient-file.js +1 -1
  249. package/dist/memory/journal/on-disk/workspace-gitignore.d.ts +24 -3
  250. package/dist/memory/journal/on-disk/workspace-gitignore.js +38 -7
  251. package/dist/memory/journal/on-disk/workspace-tiers.js +7 -0
  252. package/dist/memory/journal/self-observation.js +3 -1
  253. package/dist/memory/journal/session-end.js +23 -9
  254. package/dist/memory/journal/session-journal.js +39 -20
  255. package/dist/memory/project/artifact-root-resolver.d.ts +14 -1
  256. package/dist/memory/project/artifact-root-resolver.js +68 -23
  257. package/dist/memory/project/artifact-root.d.ts +17 -3
  258. package/dist/memory/project/artifact-root.js +47 -9
  259. package/dist/memory/project/fs/fs-port.d.ts +5 -0
  260. package/dist/memory/project/fs/fs-port.js +13 -0
  261. package/dist/memory/project/learned-routes.d.ts +3 -4
  262. package/dist/memory/project/learned-routes.js +3 -11
  263. package/dist/memory/project/link-directory.js +5 -2
  264. package/dist/memory/project/root-claims.d.ts +3 -1
  265. package/dist/memory/project/root-claims.js +41 -7
  266. package/dist/memory/project/session-root.d.ts +1 -1
  267. package/dist/memory/project/session-root.js +1 -15
  268. package/dist/memory/project/sync-status.js +5 -6
  269. package/dist/memory/recall/memory-tools.js +2 -2
  270. package/dist/memory/recall/platform-memory.d.ts +3 -1
  271. package/dist/memory/recall/platform-memory.js +9 -1
  272. package/dist/memory/recall/project-memory.js +15 -19
  273. package/dist/portal/bridge/auth-failure-reason.d.ts +13 -0
  274. package/dist/portal/bridge/auth-failure-reason.js +19 -0
  275. package/dist/portal/bridge/bridge.d.ts +19 -4
  276. package/dist/portal/bridge/bridge.js +150 -177
  277. package/dist/portal/bridge/harness-request.d.ts +15 -0
  278. package/dist/portal/bridge/harness-request.js +19 -0
  279. package/dist/portal/bridge/origin/origin-follow.d.ts +46 -0
  280. package/dist/portal/bridge/origin/origin-follow.js +110 -0
  281. package/dist/portal/bridge/pairing-token.d.ts +6 -0
  282. package/dist/portal/bridge/pairing-token.js +47 -16
  283. package/dist/portal/bridge/protocol-skew.d.ts +27 -2
  284. package/dist/portal/bridge/protocol-skew.js +66 -2
  285. package/dist/portal/bridge/session-nonces.d.ts +46 -0
  286. package/dist/portal/bridge/session-nonces.js +72 -0
  287. package/dist/portal/input/viewport-tools.d.ts +31 -0
  288. package/dist/portal/input/viewport-tools.js +106 -15
  289. package/dist/portal/pool/bounded-close.d.ts +23 -0
  290. package/dist/portal/pool/bounded-close.js +38 -0
  291. package/dist/portal/pool/browser-pool.d.ts +44 -39
  292. package/dist/portal/pool/browser-pool.js +247 -95
  293. package/dist/portal/pool/context-permissions.d.ts +9 -1
  294. package/dist/portal/pool/context-permissions.js +26 -0
  295. package/dist/portal/pool/lease-emulation.d.ts +37 -0
  296. package/dist/portal/pool/lease-emulation.js +29 -0
  297. package/dist/portal/pool/playwright-launcher.d.ts +6 -0
  298. package/dist/portal/pool/playwright-launcher.js +74 -7
  299. package/dist/portal/pool/pool-contract.d.ts +23 -1
  300. package/dist/portal/pool/pool-lease.d.ts +128 -0
  301. package/dist/portal/pool/pool-lease.js +49 -0
  302. package/dist/portal/pool/zero-install.d.ts +8 -1
  303. package/dist/portal/pool/zero-install.js +24 -2
  304. package/dist/portal/production/production-activation.d.ts +136 -0
  305. package/dist/portal/production/production-activation.js +173 -0
  306. package/dist/portal/production/production-drive.d.ts +52 -0
  307. package/dist/portal/production/production-drive.js +301 -0
  308. package/dist/portal/production/production-hello.d.ts +23 -0
  309. package/dist/portal/production/production-hello.js +23 -0
  310. package/dist/portal/realm/web-realm.js +42 -15
  311. package/dist/portal/session/control-envelope.d.ts +1 -1
  312. package/dist/portal/session/dev-server/served-document.d.ts +0 -5
  313. package/dist/portal/session/dev-server/served-document.js +6 -8
  314. package/dist/portal/session/facts/handshake-facts.d.ts +8 -1
  315. package/dist/portal/session/first-run-wiring.d.ts +3 -36
  316. package/dist/portal/session/first-run-wiring.js +10 -103
  317. package/dist/portal/session/live-control-tools.js +61 -19
  318. package/dist/portal/session/no-session-next-action.d.ts +11 -0
  319. package/dist/portal/session/no-session-next-action.js +40 -15
  320. package/dist/portal/session/no-session-watch.d.ts +7 -0
  321. package/dist/portal/session/no-session-watch.js +67 -23
  322. package/dist/portal/session/output-budget.d.ts +10 -0
  323. package/dist/portal/session/output-budget.js +16 -0
  324. package/dist/portal/session/presence/session-lease.d.ts +2 -0
  325. package/dist/portal/session/presence/session-lease.js +8 -0
  326. package/dist/portal/session/recorded-gaps.d.ts +15 -11
  327. package/dist/portal/session/recorded-gaps.js +39 -18
  328. package/dist/portal/session/serving-directory.d.ts +24 -2
  329. package/dist/portal/session/serving-directory.js +93 -5
  330. package/dist/portal/session/session-info.d.ts +26 -0
  331. package/dist/portal/session/session-info.js +20 -0
  332. package/dist/portal/session/session-manager.d.ts +35 -3
  333. package/dist/portal/session/session-manager.js +69 -14
  334. package/dist/portal/session/session-successor.js +1 -9
  335. package/dist/portal/session/session-tools.js +22 -4
  336. package/dist/portal/session/session.d.ts +10 -10
  337. package/dist/portal/session/session.js +37 -29
  338. package/dist/portal/session/zero-install-first-call.d.ts +7 -2
  339. package/dist/portal/session/zero-install-first-call.js +43 -20
  340. package/dist/start-wiring.d.ts +2 -2
  341. package/dist/start-wiring.js +17 -3
  342. package/dist/status-payload.d.ts +11 -1
  343. package/dist/status-payload.js +7 -1
  344. package/dist/surface/agent-presence-grace.d.ts +11 -0
  345. package/dist/surface/agent-presence-grace.js +34 -0
  346. package/dist/surface/http-server.d.ts +12 -1
  347. package/dist/surface/http-server.js +64 -15
  348. package/dist/surface/mcp/faults/mcp-outage.d.ts +12 -2
  349. package/dist/surface/mcp/faults/mcp-outage.js +19 -1
  350. package/dist/surface/mcp/mcp-proxy.d.ts +17 -74
  351. package/dist/surface/mcp/mcp-proxy.js +194 -267
  352. package/dist/surface/mcp/mcp.d.ts +20 -3
  353. package/dist/surface/mcp/mcp.js +88 -25
  354. package/dist/surface/mcp/proxy/drive-calls.d.ts +44 -0
  355. package/dist/surface/mcp/proxy/drive-calls.js +114 -5
  356. package/dist/surface/mcp/proxy/proxy-boot.d.ts +11 -0
  357. package/dist/surface/mcp/proxy/proxy-boot.js +1 -0
  358. package/dist/surface/mcp/proxy/proxy-daemon-probe.d.ts +6 -0
  359. package/dist/surface/mcp/proxy/proxy-daemon-probe.js +14 -1
  360. package/dist/surface/mcp/proxy/proxy-handshake.d.ts +34 -2
  361. package/dist/surface/mcp/proxy/proxy-handshake.js +76 -8
  362. package/dist/surface/mcp/server-instructions.js +35 -16
  363. package/dist/surface/mcp/shared-params.d.ts +8 -0
  364. package/dist/surface/mcp/shared-params.js +15 -1
  365. package/dist/surface/mcp/sse-frame-parser.d.ts +11 -0
  366. package/dist/surface/mcp/sse-frame-parser.js +18 -0
  367. package/dist/surface/mcp/surface-vocabulary.d.ts +2 -0
  368. package/dist/surface/mcp/surface-vocabulary.js +13 -0
  369. package/dist/surface/mcp/tool-catalog-cache.d.ts +2 -0
  370. package/dist/surface/mcp/tool-catalog-cache.js +14 -4
  371. package/dist/surface/tools/account-tool.d.ts +4 -3
  372. package/dist/surface/tools/account-tool.js +20 -31
  373. package/dist/surface/tools/act/act-danger.d.ts +2 -0
  374. package/dist/surface/tools/act/act-danger.js +41 -14
  375. package/dist/surface/tools/act/act-observation.d.ts +11 -0
  376. package/dist/surface/tools/act/act-observation.js +33 -0
  377. package/dist/surface/tools/act/act-preflight.js +10 -3
  378. package/dist/surface/tools/act/act-sequence-retry.js +2 -1
  379. package/dist/surface/tools/act/act-target.js +19 -5
  380. package/dist/surface/tools/act/durable.js +1 -1
  381. package/dist/surface/tools/act/navigation/navigate-arrival.d.ts +9 -7
  382. package/dist/surface/tools/act/navigation/navigate-arrival.js +11 -14
  383. package/dist/surface/tools/act/unsettled-find.d.ts +36 -0
  384. package/dist/surface/tools/act/unsettled-find.js +71 -0
  385. package/dist/surface/tools/act-sequence-tool.js +53 -24
  386. package/dist/surface/tools/act-tools.d.ts +2 -3
  387. package/dist/surface/tools/act-tools.js +49 -47
  388. package/dist/surface/tools/agent/compact-envelope.d.ts +2 -2
  389. package/dist/surface/tools/agent/for-the-agent.js +41 -3
  390. package/dist/surface/tools/assert/assert-grade.js +8 -3
  391. package/dist/surface/tools/assert/assert-verdict.js +4 -2
  392. package/dist/surface/tools/browser-tools.js +7 -4
  393. package/dist/surface/tools/chat-drives.js +50 -25
  394. package/dist/surface/tools/coverage-tools.js +1 -1
  395. package/dist/surface/tools/dynamic-tools.d.ts +8 -0
  396. package/dist/surface/tools/dynamic-tools.js +89 -34
  397. package/dist/surface/tools/empty-session-list.d.ts +18 -25
  398. package/dist/surface/tools/empty-session-list.js +67 -38
  399. package/dist/surface/tools/error-recovery.d.ts +17 -7
  400. package/dist/surface/tools/error-recovery.js +53 -20
  401. package/dist/surface/tools/explore-tools.d.ts +10 -0
  402. package/dist/surface/tools/explore-tools.js +72 -19
  403. package/dist/surface/tools/feedback-tools.js +23 -2
  404. package/dist/surface/tools/gap-novelty.d.ts +6 -0
  405. package/dist/surface/tools/gap-novelty.js +9 -0
  406. package/dist/surface/tools/gaps/capability-absences.js +4 -3
  407. package/dist/surface/tools/harness-explore.d.ts +1 -1
  408. package/dist/surface/tools/harness-explore.js +6 -4
  409. package/dist/surface/tools/harness-gate.d.ts +43 -21
  410. package/dist/surface/tools/harness-gate.js +55 -81
  411. package/dist/surface/tools/harness-script.d.ts +2 -0
  412. package/dist/surface/tools/harness-script.js +11 -6
  413. package/dist/surface/tools/harness-toolset.js +3 -4
  414. package/dist/surface/tools/invoke-tool.d.ts +0 -8
  415. package/dist/surface/tools/invoke-tool.js +164 -178
  416. package/dist/surface/tools/lease-hint.d.ts +9 -0
  417. package/dist/surface/tools/lease-hint.js +22 -3
  418. package/dist/surface/tools/lease-permissions.d.ts +1 -1
  419. package/dist/surface/tools/lease-readiness.d.ts +55 -0
  420. package/dist/surface/tools/lease-readiness.js +150 -2
  421. package/dist/surface/tools/lease-tools.d.ts +3 -75
  422. package/dist/surface/tools/lease-tools.js +124 -188
  423. package/dist/surface/tools/map-tools.d.ts +20 -0
  424. package/dist/surface/tools/map-tools.js +145 -0
  425. package/dist/surface/tools/merge-tools.js +11 -7
  426. package/dist/surface/tools/next-step.js +6 -3
  427. package/dist/surface/tools/observe-tools.js +46 -35
  428. package/dist/surface/tools/platform-moment.d.ts +3 -12
  429. package/dist/surface/tools/platform-moment.js +12 -24
  430. package/dist/surface/tools/read/complete-snapshot.d.ts +7 -1
  431. package/dist/surface/tools/read/complete-snapshot.js +13 -2
  432. package/dist/surface/tools/read/query-paginate.js +6 -0
  433. package/dist/surface/tools/read/query-shape.d.ts +9 -0
  434. package/dist/surface/tools/read/query-shape.js +15 -0
  435. package/dist/surface/tools/read/snapshot-unmounted-note.d.ts +1 -0
  436. package/dist/surface/tools/read/snapshot-unmounted-note.js +73 -0
  437. package/dist/surface/tools/read-tools.js +5 -5
  438. package/dist/surface/tools/real-input-attempt.d.ts +11 -0
  439. package/dist/surface/tools/real-input-attempt.js +206 -38
  440. package/dist/surface/tools/reconcile-tools.js +21 -8
  441. package/dist/surface/tools/reticle-result.d.ts +3 -0
  442. package/dist/surface/tools/reticle-result.js +8 -1
  443. package/dist/surface/tools/run-report.d.ts +22 -0
  444. package/dist/surface/tools/run-report.js +141 -0
  445. package/dist/surface/tools/session-ports.d.ts +57 -0
  446. package/dist/surface/tools/session-ports.js +102 -0
  447. package/dist/surface/tools/tool-kit.d.ts +58 -4
  448. package/dist/surface/tools/tool-kit.js +140 -6
  449. package/dist/surface/tools/tool-surface.d.ts +2 -0
  450. package/dist/surface/tools/tool-surface.js +45 -0
  451. package/dist/surface/tools/tools.js +49 -87
  452. package/dist/telemetry/automation-hint.d.ts +5 -0
  453. package/dist/telemetry/automation-hint.js +7 -0
  454. package/dist/telemetry/cli-telemetry.d.ts +22 -0
  455. package/dist/telemetry/cli-telemetry.js +80 -11
  456. package/dist/telemetry/daemon-telemetry.d.ts +3 -1
  457. package/dist/telemetry/daemon-telemetry.js +9 -2
  458. package/dist/telemetry/feedback-cli.d.ts +1 -1
  459. package/dist/telemetry/feedback-cli.js +8 -3
  460. package/dist/telemetry/feedback.d.ts +1 -1
  461. package/dist/telemetry/feedback.js +51 -4
  462. package/dist/telemetry/harness-run.d.ts +3 -3
  463. package/dist/telemetry/harness-run.js +18 -7
  464. package/dist/telemetry/hud-events.d.ts +1 -1
  465. package/dist/telemetry/hud-metrics.d.ts +6 -3
  466. package/dist/telemetry/hud-metrics.js +20 -8
  467. package/dist/telemetry/install-source.js +1 -1
  468. package/dist/telemetry/mcp-connection.d.ts +1 -1
  469. package/dist/telemetry/mcp-connection.js +21 -2
  470. package/dist/telemetry/onboarding-firsts.d.ts +6 -1
  471. package/dist/telemetry/onboarding-firsts.js +41 -1
  472. package/dist/telemetry/proxy-telemetry.d.ts +42 -0
  473. package/dist/telemetry/proxy-telemetry.js +70 -1
  474. package/dist/telemetry/session-metrics.d.ts +1 -3
  475. package/dist/telemetry/session-metrics.js +16 -12
  476. package/dist/telemetry/telemetry.d.ts +9 -1
  477. package/dist/telemetry/telemetry.js +16 -1
  478. package/dist/telemetry/verification-of.d.ts +3 -1
  479. package/dist/telemetry/verification-of.js +7 -1
  480. package/dist/wire-journal.js +12 -2
  481. package/docs/README.md +4 -2
  482. package/docs/actions.mdx +7 -6
  483. package/docs/adapters.md +2 -1
  484. package/docs/agent-cheatsheet.md +19 -5
  485. package/docs/architecture.md +13 -10
  486. package/docs/autodrive.md +6 -5
  487. package/docs/benchmarks.md +2 -2
  488. package/docs/capabilities.mdx +1 -1
  489. package/docs/cli/affected.mdx +1 -1
  490. package/docs/cli/cloud.mdx +6 -6
  491. package/docs/cli/doctor.mdx +3 -1
  492. package/docs/cli/feedback.mdx +11 -7
  493. package/docs/cli/gate.mdx +1 -1
  494. package/docs/cli/help.mdx +1 -1
  495. package/docs/cli/init.mdx +20 -16
  496. package/docs/cli/mcp.mdx +5 -2
  497. package/docs/cli/open.mdx +5 -2
  498. package/docs/cli/report.mdx +1 -1
  499. package/docs/cli/restart.mdx +1 -1
  500. package/docs/cli/rollback.mdx +4 -4
  501. package/docs/cli/serve.mdx +7 -5
  502. package/docs/cli/setup.mdx +1 -1
  503. package/docs/cli/status.mdx +6 -2
  504. package/docs/cli/stop.mdx +3 -3
  505. package/docs/cli/telemetry.mdx +5 -1
  506. package/docs/cli/try.mdx +8 -8
  507. package/docs/cli/update.mdx +8 -5
  508. package/docs/cli/verify.mdx +12 -5
  509. package/docs/cli/version.mdx +1 -1
  510. package/docs/cli.mdx +10 -6
  511. package/docs/debugging.md +1 -1
  512. package/docs/deploy-checks.md +8 -6
  513. package/docs/desktop.mdx +14 -18
  514. package/docs/enterprise.md +6 -6
  515. package/docs/environment.mdx +5 -3
  516. package/docs/faq.mdx +9 -6
  517. package/docs/first-drive.md +19 -9
  518. package/docs/flows.md +3 -4
  519. package/docs/for-agents.md +1 -1
  520. package/docs/frameworks.mdx +34 -11
  521. package/docs/getting-started.md +46 -29
  522. package/docs/http-transport.md +2 -2
  523. package/docs/human-control.md +8 -8
  524. package/docs/index.mdx +2 -2
  525. package/docs/install-agentic.mdx +18 -19
  526. package/docs/install-manual.mdx +8 -4
  527. package/docs/integration-patterns.md +5 -5
  528. package/docs/multi-agent-testing.md +7 -5
  529. package/docs/packages/browser.mdx +34 -2
  530. package/docs/packages/core.mdx +2 -1
  531. package/docs/packages/electron.mdx +15 -3
  532. package/docs/packages/eslint-plugin.mdx +1 -1
  533. package/docs/packages/next.mdx +17 -5
  534. package/docs/packages/react.mdx +8 -1
  535. package/docs/packages/server.mdx +3 -3
  536. package/docs/packages/tauri.mdx +3 -3
  537. package/docs/packages/vite-plugin.mdx +1 -1
  538. package/docs/packages.mdx +19 -6
  539. package/docs/platform-integration.md +12 -4
  540. package/docs/predicates.mdx +18 -7
  541. package/docs/production-mode.md +108 -0
  542. package/docs/prompt-capture.md +99 -0
  543. package/docs/quickstart.mdx +14 -12
  544. package/docs/recipes.mdx +9 -8
  545. package/docs/required-checks.md +3 -2
  546. package/docs/skill-file.mdx +4 -3
  547. package/docs/skill-setup.md +2 -2
  548. package/docs/skill.md +62 -70
  549. package/docs/state-files.md +1 -0
  550. package/docs/state-management.mdx +11 -9
  551. package/docs/system-map.md +14 -13
  552. package/docs/telemetry.md +32 -24
  553. package/docs/testing.md +9 -5
  554. package/docs/tools/act-and-wait.mdx +17 -13
  555. package/docs/tools/act-sequence.mdx +40 -66
  556. package/docs/tools/act.mdx +7 -5
  557. package/docs/tools/assert.mdx +1 -1
  558. package/docs/tools/look.mdx +1 -1
  559. package/docs/tools/navigate.mdx +1 -1
  560. package/docs/tools/network.mdx +13 -11
  561. package/docs/tools/overview.mdx +3 -3
  562. package/docs/tools/query.mdx +3 -3
  563. package/docs/tools/session-and-feedback.mdx +9 -6
  564. package/docs/tools/sessions.mdx +7 -0
  565. package/docs/tools/snapshot.mdx +9 -7
  566. package/docs/tools/tools-and-run.mdx +11 -10
  567. package/docs/tools/verify.mdx +1 -1
  568. package/docs/troubleshooting.mdx +21 -9
  569. package/docs/usage.md +58 -43
  570. package/docs/use-cases.mdx +2 -2
  571. package/docs/vs-chrome-devtools-mcp.mdx +5 -5
  572. package/docs/vs-playwright-mcp.mdx +5 -4
  573. package/docs/what-is-recorded.md +12 -7
  574. package/docs/what-is-reticle.mdx +2 -2
  575. package/docs/why-reticle.mdx +1 -1
  576. package/package.json +9 -12
  577. package/dist/command/dev/stale-issue-guard.d.ts +0 -34
  578. package/dist/command/dev/stale-issue-guard.js +0 -69
@@ -5,32 +5,28 @@
5
5
  * because those answers are never actively wrong. When a project directory IS in hand, name the
6
6
  * packages actually in package.json and the manager the lockfile implies.
7
7
  *
8
- * Does not import `init/`. The library path must never reach the installer
9
- * (`library-path-boundary.test.ts`); `reticleDepsOf` lives in `update/` for that reason, and the
10
- * lockfile → manager map is the same evidence `detectPackageManager` reads, kept here so a HELLO
11
- * does not load the install plan.
8
+ * The manager is init's own rule, `detectPackageManager` over `resolveLockfiles`, read through a
9
+ * declared crossing (`library-path-boundary.test.ts`); a copy kept here had fallen behind it.
12
10
  */
13
11
  import { join } from 'node:path';
14
12
  import { readFileSync } from 'node:fs';
13
+ import { detectPackageManager, PackageManager, resolveLockfiles } from '@reticlehq/init';
15
14
  import { reticleDepsOf } from '../../memory/project/reticle-deps.js';
16
- /** Lockfile / marker → manager, same evidence `init/detect.ts` uses. */
17
- export const PackageManagerName = {
18
- PNPM: 'pnpm',
19
- YARN: 'yarn',
20
- BUN: 'bun',
21
- NPM: 'npm',
22
- };
15
+ /** init's manager names, under the name this module exports. */
16
+ export const PackageManagerName = PackageManager;
23
17
  /** Same package a Vue/Nuxt install gets — never the React kit. */
24
18
  const FRAMEWORK_NEUTRAL_SDK = '@reticlehq/browser';
25
19
  const PACKAGE_JSON = 'package.json';
26
20
  const NODE_MODULES = 'node_modules';
27
- const LOCKFILE_NAMES = ['pnpm-lock.yaml', 'yarn.lock', 'bun.lockb', 'bun.lock'];
28
- /** Markers each manager leaves inside `node_modules` — stronger than an uncommitted lockfile. */
29
- const NODE_MODULES_MARKERS = [
30
- ['.modules.yaml', PackageManagerName.PNPM],
31
- ['.yarn-state.yml', PackageManagerName.YARN],
32
- ['.package-lock.json', PackageManagerName.NPM],
21
+ /** The files init's rule reads, probed one by one because this module is handed a file reader. */
22
+ const LOCKFILE_NAMES = [
23
+ 'pnpm-lock.yaml',
24
+ 'yarn.lock',
25
+ 'bun.lockb',
26
+ 'bun.lock',
27
+ 'package-lock.json',
33
28
  ];
29
+ const NODE_MODULES_MARKERS = ['.modules.yaml', '.yarn-state.yml', '.package-lock.json'];
34
30
  const INSTALL_FLAGS = {
35
31
  [PackageManagerName.PNPM]: ['add', '-D'],
36
32
  [PackageManagerName.YARN]: ['add', '-D'],
@@ -42,19 +38,6 @@ function packagesFor(ctx) {
42
38
  return ctx.packages;
43
39
  return [FRAMEWORK_NEUTRAL_SDK];
44
40
  }
45
- function managerOf(lockfiles, nodeModulesMarkers) {
46
- if (lockfiles.has('pnpm-lock.yaml'))
47
- return PackageManagerName.PNPM;
48
- if (lockfiles.has('yarn.lock'))
49
- return PackageManagerName.YARN;
50
- if (lockfiles.has('bun.lockb') || lockfiles.has('bun.lock'))
51
- return PackageManagerName.BUN;
52
- for (const [name, pm] of NODE_MODULES_MARKERS) {
53
- if (nodeModulesMarkers.has(name))
54
- return pm;
55
- }
56
- return PackageManagerName.NPM;
57
- }
58
41
  function installLine(pm, pkgs) {
59
42
  return `${pm} ${[...INSTALL_FLAGS[pm], ...pkgs].join(' ')}`;
60
43
  }
@@ -86,7 +69,7 @@ export function sdkFixContextOf(pkgJson, lockfiles, nodeModulesMarkers = new Set
86
69
  return undefined;
87
70
  return {
88
71
  packages: reticleDepsOf(pkgJson),
89
- packageManager: managerOf(lockfiles, nodeModulesMarkers),
72
+ packageManager: detectPackageManager(lockfiles, nodeModulesMarkers, pkgJson),
90
73
  };
91
74
  }
92
75
  /** Reads a file, or undefined if it is not there / not readable. */
@@ -122,6 +105,8 @@ function present(directory, names, read, extra = '') {
122
105
  * `read` is injected so the decision is testable without a filesystem; the daemon uses the default.
123
106
  */
124
107
  export function sdkFixForDirectory(daemonVersion, directory, read = readTextFile) {
125
- const ctx = sdkFixContextOf(parseJson(read(join(directory, PACKAGE_JSON))), present(directory, LOCKFILE_NAMES, read), present(directory, NODE_MODULES_MARKERS.map(([name]) => name), read, NODE_MODULES));
108
+ const markers = present(directory, NODE_MODULES_MARKERS, read, NODE_MODULES);
109
+ const exists = (path) => read(path) !== undefined;
110
+ const ctx = sdkFixContextOf(parseJson(read(join(directory, PACKAGE_JSON))), resolveLockfiles(present(directory, LOCKFILE_NAMES, read), directory, { exists }, markers), markers);
126
111
  return resolveSdkFix(daemonVersion, ctx);
127
112
  }
@@ -67,6 +67,8 @@ interface SelfIdentity {
67
67
  contract: string;
68
68
  contractParts?: ContractParts | undefined;
69
69
  }
70
+ /** The one line that converges every piece, after the detailed fix. Not said for one version. */
71
+ export declare const SKEW_CONVERGE: string;
70
72
  /**
71
73
  * The one sentence to tell the agent, or undefined when the pair agrees.
72
74
  *
@@ -94,6 +96,14 @@ export declare function describeSkew(given: PeerIdentity, self: SelfIdentity): s
94
96
  * `@reticlehq/react` and told Vue projects to install a React package (#618).
95
97
  */
96
98
  export declare function sdkFix(daemonVersion: string): string;
99
+ /**
100
+ * Compare two of our own version strings. Numeric dotted compare, prerelease tags ignored: both
101
+ * sides are Reticle package versions, so this never sees a range or build metadata. Undefined when
102
+ * either side does not parse, so the caller can decline to guess a direction.
103
+ */
104
+ export declare function compareVersions(a: string | undefined, b: string): number | undefined;
105
+ /** True when the page SDK is a minor release or more behind the daemon. A patch is not behind. */
106
+ export declare function sdkIsBehind(sdk: string | undefined, daemon: string): boolean;
97
107
  /** The same fact for the person looking at the page, on its overlay. */
98
108
  export declare const SDK_BEHIND_NARRATION: (sdk: string, daemon: string) => string;
99
109
  /**
@@ -117,11 +127,16 @@ export declare function describeSdkBehind(sdk: string | undefined, daemon: strin
117
127
  * contract hashes with the roles unchanged. Nothing the agent can do converges that, so say so and
118
128
  * ask for the one thing that does, exactly as the SDK branch already does when the page is stale.
119
129
  *
130
+ * It also branches on the connected pages' SDK versions (#1709). When the daemon is the older half
131
+ * and every connected page runs that same version, a restart replaces one mismatch with a wider
132
+ * one: the new daemon and every page. Name the SDK update instead. No pages, or pages already on
133
+ * the agent's version, still restart the daemon.
134
+ *
120
135
  * Both versions are named by ROLE, not by which side is calling: this is read from both ends — a
121
136
  * CLI judging the daemon it attached to, and the daemon judging an agent that announced itself —
122
137
  * and the advice depends on which piece is behind, not on who noticed.
123
138
  */
124
- export declare function daemonFix(daemonVersion: string | undefined, agentVersion: string | undefined): string;
139
+ export declare function daemonFix(daemonVersion: string | undefined, agentVersion: string | undefined, pageSdkVersions?: readonly (string | undefined)[]): string;
125
140
  /** True when `error` is Playwright's closed-target class — not proof the tab is gone. */
126
141
  export declare function isPlaywrightClosedError(error: unknown): boolean;
127
142
  /**
@@ -56,6 +56,9 @@ function namesWeDoNotKnow(peer, self) {
56
56
  ].filter((name) => !RETIRED_WIRE_NAMES.includes(name));
57
57
  return [...new Set(unknown)].sort();
58
58
  }
59
+ /** The one line that converges every piece, after the detailed fix. Not said for one version. */
60
+ export const SKEW_CONVERGE = "To put every piece on one version, update the CLI and the app SDK (`reticle update` in the app's " +
61
+ 'folder does both), then restart the MCP host.';
59
62
  /** The fix for two builds of one version. */
60
63
  const SAME_VERSION_FIX = 'Both say the same version, so one of them is an older build of it: run `reticle restart`, then ' +
61
64
  'reload the page so it loads the SDK the dev server serves now.';
@@ -87,6 +90,7 @@ export function describeSkew(given, self) {
87
90
  // One version, two builds (a daemon running code older than its install, a cached page bundle):
88
91
  // installing that version again changes nothing, so the fix is the restart and the reload.
89
92
  const peer = given.version === self.version ? { ...given, fix: SAME_VERSION_FIX } : given;
93
+ const converge = given.version === self.version ? '' : ` ${SKEW_CONVERGE}`;
90
94
  // Both sides said which names they speak, so compare the names rather than a hash over them.
91
95
  if (peer.contractParts !== undefined && self.contractParts !== undefined) {
92
96
  const unknown = namesWeDoNotKnow(peer.contractParts, self.contractParts);
@@ -100,14 +104,14 @@ export function describeSkew(given, self) {
100
104
  : 'so it was built against a newer contract than this one';
101
105
  return (`version skew: ${versionPhrase(peer, self)}, and ${peer.what} speaks names this daemon does ` +
102
106
  `not know (${unknown.join(', ')}) — ${why}. ` +
103
- `Tools will behave in ways neither side reports. ${peer.fix}`);
107
+ `Tools will behave in ways neither side reports. ${peer.fix}${converge}`);
104
108
  }
105
109
  if (peer.contract === undefined) {
106
110
  if (peer.version === undefined || peer.version === self.version)
107
111
  return undefined;
108
112
  return (`version skew: ${versionPhrase(peer, self)}, and it is too old to report which wire contract ` +
109
113
  `it speaks. They connect anyway and then disagree about behaviour, which usually surfaces as ` +
110
- `a bare -32000 with nothing naming a version. ${peer.fix}`);
114
+ `a bare -32000 with nothing naming a version. ${peer.fix}${converge}`);
111
115
  }
112
116
  /*
113
117
  * A fingerprint alone cannot tell an ADDITION from a RENAME, so this sentence must not claim it can.
@@ -125,7 +129,7 @@ export function describeSkew(given, self) {
125
129
  return (`version skew: ${versionPhrase(peer, self)}, and they were built against different wire ` +
126
130
  `contracts (${peer.contract} vs ${self.contract}). ${peer.what} is too old to say WHICH names ` +
127
131
  `it speaks, so this cannot tell an added name — which breaks nothing — from a renamed one, ` +
128
- `which breaks the call that uses it. Update it and the question goes away. ${peer.fix}`);
132
+ `which breaks the call that uses it. Update it and the question goes away. ${peer.fix}${converge}`);
129
133
  }
130
134
  /**
131
135
  * The fix line for a page whose SDK disagrees with this daemon, with no project to read.
@@ -143,7 +147,7 @@ export function sdkFix(daemonVersion) {
143
147
  * sides are Reticle package versions, so this never sees a range or build metadata. Undefined when
144
148
  * either side does not parse, so the caller can decline to guess a direction.
145
149
  */
146
- function compareVersions(a, b) {
150
+ export function compareVersions(a, b) {
147
151
  const parts = (v) => {
148
152
  const head = v.split('-')[0];
149
153
  if (head === undefined)
@@ -164,6 +168,15 @@ function compareVersions(a, b) {
164
168
  }
165
169
  return 0;
166
170
  }
171
+ /** True when the page SDK is a minor release or more behind the daemon. A patch is not behind. */
172
+ export function sdkIsBehind(sdk, daemon) {
173
+ const minorOf = (v) => v.split('-')[0]?.split('.').slice(0, 2).join('.') ?? v;
174
+ if (sdk === undefined) {
175
+ return false;
176
+ }
177
+ const order = compareVersions(minorOf(sdk), minorOf(daemon));
178
+ return order !== undefined && order < 0;
179
+ }
167
180
  /** The same fact for the person looking at the page, on its overlay. */
168
181
  export const SDK_BEHIND_NARRATION = (sdk, daemon) => `This app runs Reticle SDK ${sdk}, older than Reticle ${daemon}. Run \`reticle update\` in the ` +
169
182
  "app's folder, then restart its dev server.";
@@ -178,16 +191,61 @@ export const SDK_BEHIND_NARRATION = (sdk, daemon) => `This app runs Reticle SDK
178
191
  * because reading the project's manifest is only worth it when the page IS behind.
179
192
  */
180
193
  export function describeSdkBehind(sdk, daemon, fix) {
181
- const minorOf = (v) => v.split('-')[0]?.split('.').slice(0, 2).join('.') ?? v;
182
- if (sdk === undefined)
183
- return undefined;
184
- const order = compareVersions(minorOf(sdk), minorOf(daemon));
185
- if (order === undefined || order >= 0)
194
+ if (sdk === undefined || !sdkIsBehind(sdk, daemon))
186
195
  return undefined;
187
196
  return (`This page runs Reticle SDK ${sdk}, older than Reticle ${daemon}. It connects and verifies, ` +
188
197
  `but everything added since is missing from the page, the overlay's newer controls included. ` +
189
198
  fix());
190
199
  }
200
+ /**
201
+ * True when every connected page reported the daemon's SDK version.
202
+ *
203
+ * An empty list is not a match: `Array.every` is true for no pages, and no pages is the case that
204
+ * still restarts the daemon. A page that did not report a version does not match.
205
+ */
206
+ function pagesMatchDaemon(pageSdkVersions, daemonVersion) {
207
+ if (0 === pageSdkVersions.length)
208
+ return false;
209
+ return pageSdkVersions.every((version) => 0 === compareVersions(version, daemonVersion));
210
+ }
211
+ /**
212
+ * Pages sit on the older daemon. Restarting it now moves the daemon to the agent and skews every
213
+ * page (#1709). The SDK update is the step that puts all three on one version.
214
+ */
215
+ function sdkUpdateConverges(daemonVersion, agentVersion) {
216
+ return (`The connected pages run SDK ${daemonVersion}, the same version as this daemon. ` +
217
+ `\`reticle stop\` starts a daemon at ${agentVersion} and skews every page. ` +
218
+ `${sdkFix(agentVersion)} ` +
219
+ `That SDK update puts the pages, the daemon and the agent on one version. ` +
220
+ 'Restart the daemon only after the pages load the new SDK.');
221
+ }
222
+ /**
223
+ * The newest page SDK version that is newer than `agentVersion`, or undefined when no page is.
224
+ *
225
+ * The agent's MCP server starts the daemon. When a page is newer than it, `reticle stop` only
226
+ * starts a daemon at the same old version again, and the advice loops.
227
+ */
228
+ function newestPageAhead(pageSdkVersions, agentVersion) {
229
+ let newest;
230
+ for (const version of pageSdkVersions) {
231
+ const ahead = compareVersions(version, agentVersion);
232
+ if (version === undefined || ahead === undefined || ahead <= 0) {
233
+ continue;
234
+ }
235
+ const order = newest === undefined ? 1 : compareVersions(version, newest);
236
+ if (order !== undefined && order > 0) {
237
+ newest = version;
238
+ }
239
+ }
240
+ return newest;
241
+ }
242
+ /** The MCP server is the old part: a daemon restart comes back at its version. */
243
+ function mcpServerIsOld(agentVersion, pageVersion) {
244
+ return (`The connected pages run SDK ${pageVersion}, but the agent's MCP server is ${agentVersion}. ` +
245
+ `The MCP server starts the daemon, so \`reticle stop\` starts a ${agentVersion} daemon again. ` +
246
+ 'Do not stop the daemon. Tell the human to update the MCP entry (or the Reticle plugin) to ' +
247
+ `@reticlehq/server@${pageVersion} or later, clear a cached npx copy, and restart the agent.`);
248
+ }
191
249
  /**
192
250
  * The fix line for another Reticle process that disagrees with the daemon it attached to.
193
251
  *
@@ -198,17 +256,33 @@ export function describeSdkBehind(sdk, daemon, fix) {
198
256
  * contract hashes with the roles unchanged. Nothing the agent can do converges that, so say so and
199
257
  * ask for the one thing that does, exactly as the SDK branch already does when the page is stale.
200
258
  *
259
+ * It also branches on the connected pages' SDK versions (#1709). When the daemon is the older half
260
+ * and every connected page runs that same version, a restart replaces one mismatch with a wider
261
+ * one: the new daemon and every page. Name the SDK update instead. No pages, or pages already on
262
+ * the agent's version, still restart the daemon.
263
+ *
201
264
  * Both versions are named by ROLE, not by which side is calling: this is read from both ends — a
202
265
  * CLI judging the daemon it attached to, and the daemon judging an agent that announced itself —
203
266
  * and the advice depends on which piece is behind, not on who noticed.
204
267
  */
205
- export function daemonFix(daemonVersion, agentVersion) {
268
+ export function daemonFix(daemonVersion, agentVersion, pageSdkVersions = []) {
206
269
  const order = agentVersion === undefined ? undefined : compareVersions(daemonVersion, agentVersion);
207
270
  if (order !== undefined && order > 0) {
208
271
  return ('The daemon is NEWER than this process, so `reticle stop` will not converge them — it would ' +
209
272
  'replace it with another newer daemon and leave the same mismatch. Tell the human to restart ' +
210
273
  'the agent so it spawns a current MCP server (or update the package it spawns), then retry.');
211
274
  }
275
+ const pageAhead = agentVersion === undefined ? undefined : newestPageAhead(pageSdkVersions, agentVersion);
276
+ if (agentVersion !== undefined && pageAhead !== undefined) {
277
+ return mcpServerIsOld(agentVersion, pageAhead);
278
+ }
279
+ if (order !== undefined &&
280
+ order < 0 &&
281
+ daemonVersion !== undefined &&
282
+ agentVersion !== undefined &&
283
+ pagesMatchDaemon(pageSdkVersions, daemonVersion)) {
284
+ return sdkUpdateConverges(daemonVersion, agentVersion);
285
+ }
212
286
  return ('A daemon outlives the agents attached to it, so it keeps serving its OWN code until it restarts ' +
213
287
  '— anything fixed in the newer package is simply absent. Run `reticle stop` and retry to replace ' +
214
288
  'it (other agents on that daemon will need to reconnect).');
@@ -80,7 +80,7 @@ export const CRAWL_TOOLS = [
80
80
  .optional()
81
81
  .describe('Where the fault is written, as `file:line`; console errors prefer their own stack and fall back to the clicked control.'),
82
82
  })),
83
- counts: z.record(z.number()),
83
+ counts: z.record(z.string(), z.number()),
84
84
  visited: z.array(z.string()).describe('The controls actually clicked, in order.'),
85
85
  coverageNote: z
86
86
  .string()
@@ -92,7 +92,7 @@ export const CRAWL_TOOLS = [
92
92
  .optional()
93
93
  .describe('Controls clicked whose silence could not be judged, e.g. on a background tab. They are NOT reported as dead, and they are not known to work either.'),
94
94
  // Only on `exhaustive` — see features/exhaust/exhaust-run.ts. Loose: it carries the levels.
95
- exhaustive: z.record(z.unknown()).optional(),
95
+ exhaustive: z.record(z.string(), z.unknown()).optional(),
96
96
  },
97
97
  handler: async (deps, args) => {
98
98
  const session = deps.sessions.resolve(asString(args['sessionId']));
@@ -375,6 +375,8 @@ export async function crawl(session, opts, sleep) {
375
375
  // need — without it a crawl would report nothing about the UI moving, which is most of what a
376
376
  // crawl is for.
377
377
  actionSince: since,
378
+ // The control clicked, so a failed write is judged by what became of it.
379
+ ref: item.ref,
378
380
  })) {
379
381
  counts.contradictions += 1;
380
382
  anomalies.push({
@@ -32,110 +32,29 @@ export declare const CoverageLevel: {
32
32
  export type CoverageLevel = (typeof CoverageLevel)[keyof typeof CoverageLevel];
33
33
  declare const LedgerSchema: z.ZodObject<{
34
34
  routes: z.ZodObject<{
35
- discovered: z.ZodArray<z.ZodString, "many">;
36
- reached: z.ZodArray<z.ZodString, "many">;
37
- }, "strip", z.ZodTypeAny, {
38
- reached: string[];
39
- discovered: string[];
40
- }, {
41
- reached: string[];
42
- discovered: string[];
43
- }>;
35
+ discovered: z.ZodArray<z.ZodString>;
36
+ reached: z.ZodArray<z.ZodString>;
37
+ }, z.core.$strip>;
44
38
  controls: z.ZodObject<{
45
- seen: z.ZodArray<z.ZodString, "many">;
46
- touched: z.ZodArray<z.ZodString, "many">;
47
- proved: z.ZodArray<z.ZodString, "many">;
48
- }, "strip", z.ZodTypeAny, {
49
- proved: string[];
50
- seen: string[];
51
- touched: string[];
52
- }, {
53
- proved: string[];
54
- seen: string[];
55
- touched: string[];
56
- }>;
39
+ seen: z.ZodArray<z.ZodString>;
40
+ touched: z.ZodArray<z.ZodString>;
41
+ proved: z.ZodArray<z.ZodString>;
42
+ }, z.core.$strip>;
57
43
  journeys: z.ZodObject<{
58
- completed: z.ZodArray<z.ZodString, "many">;
59
- }, "strip", z.ZodTypeAny, {
60
- completed: string[];
61
- }, {
62
- completed: string[];
63
- }>;
44
+ completed: z.ZodArray<z.ZodString>;
45
+ }, z.core.$strip>;
64
46
  writes: z.ZodObject<{
65
- seen: z.ZodArray<z.ZodString, "many">;
66
- branched: z.ZodArray<z.ZodString, "many">;
67
- unhandled: z.ZodArray<z.ZodString, "many">;
68
- }, "strip", z.ZodTypeAny, {
69
- seen: string[];
70
- branched: string[];
71
- unhandled: string[];
72
- }, {
73
- seen: string[];
74
- branched: string[];
75
- unhandled: string[];
76
- }>;
47
+ seen: z.ZodArray<z.ZodString>;
48
+ branched: z.ZodArray<z.ZodString>;
49
+ unhandled: z.ZodArray<z.ZodString>;
50
+ }, z.core.$strip>;
77
51
  code: z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodObject<{
78
52
  name: z.ZodString;
79
53
  executed: z.ZodBoolean;
80
- }, "strip", z.ZodTypeAny, {
81
- name: string;
82
- executed: boolean;
83
- }, {
84
- name: string;
85
- executed: boolean;
86
- }>>>;
87
- /** Per file, when its code coverage was last taken. Absent in a ledger from before it existed. */
54
+ }, z.core.$strip>>>;
88
55
  codeTaken: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodNumber>>;
89
56
  best: z.ZodRecord<z.ZodString, z.ZodNumber>;
90
- }, "strip", z.ZodTypeAny, {
91
- code: Record<string, Record<string, {
92
- name: string;
93
- executed: boolean;
94
- }>>;
95
- journeys: {
96
- completed: string[];
97
- };
98
- best: Record<string, number>;
99
- routes: {
100
- reached: string[];
101
- discovered: string[];
102
- };
103
- controls: {
104
- proved: string[];
105
- seen: string[];
106
- touched: string[];
107
- };
108
- writes: {
109
- seen: string[];
110
- branched: string[];
111
- unhandled: string[];
112
- };
113
- codeTaken: Record<string, number>;
114
- }, {
115
- code: Record<string, Record<string, {
116
- name: string;
117
- executed: boolean;
118
- }>>;
119
- journeys: {
120
- completed: string[];
121
- };
122
- best: Record<string, number>;
123
- routes: {
124
- reached: string[];
125
- discovered: string[];
126
- };
127
- controls: {
128
- proved: string[];
129
- seen: string[];
130
- touched: string[];
131
- };
132
- writes: {
133
- seen: string[];
134
- branched: string[];
135
- unhandled: string[];
136
- };
137
- codeTaken?: Record<string, number> | undefined;
138
- }>;
57
+ }, z.core.$strip>;
139
58
  export type AppLedger = z.infer<typeof LedgerSchema>;
140
59
  /** What one producer contributes. Every part optional: a drive adds what it saw and nothing else. */
141
60
  export interface LedgerDelta {
@@ -41,10 +41,10 @@ const LedgerSchema = z.object({
41
41
  controls: z.object({ seen: names, touched: names, proved: names }),
42
42
  journeys: z.object({ completed: names }),
43
43
  writes: z.object({ seen: names, branched: names, unhandled: names }),
44
- code: z.record(z.record(z.object({ name: z.string(), executed: z.boolean() }))),
44
+ code: z.record(z.string(), z.record(z.string(), z.object({ name: z.string(), executed: z.boolean() }))),
45
45
  /** Per file, when its code coverage was last taken. Absent in a ledger from before it existed. */
46
- codeTaken: z.record(z.number()).default({}),
47
- best: z.record(z.number()),
46
+ codeTaken: z.record(z.string(), z.number()).default({}),
47
+ best: z.record(z.string(), z.number()),
48
48
  });
49
49
  /** A ledger file's text, or an empty ledger for anything unreadable: coverage never throws. */
50
50
  function parseLedger(text) {
@@ -10,7 +10,8 @@
10
10
  * No I/O and no tool surface: what to run and where to write it arrive as functions, so this stays
11
11
  * a sink the surface hands things to.
12
12
  */
13
- import { type ImpactSnapshot } from '@reticlehq/core';
13
+ import { HarnessRunReason } from '@reticlehq/core/telemetry';
14
+ import { type ImpactSnapshot, type ReticleEvent } from '@reticlehq/core';
14
15
  export declare const DriveStatus: {
15
16
  readonly RUNNING: "running";
16
17
  readonly DONE: "done";
@@ -25,6 +26,11 @@ export type DriveStatus = (typeof DriveStatus)[keyof typeof DriveStatus];
25
26
  * such a run as "broken", which reads as a fault in the Harness; a refusal is a refusal.
26
27
  */
27
28
  export declare class DriveRefusedError extends Error {
29
+ /** Why, as `harness_run` reports it. */
30
+ readonly reason: HarnessRunReason;
31
+ constructor(message: string,
32
+ /** Why, as `harness_run` reports it. */
33
+ reason?: HarnessRunReason);
28
34
  }
29
35
  /** Who asked for the drive. */
30
36
  export declare const DriveOrigin: {
@@ -88,8 +94,23 @@ export declare function runningDrives(): DriveRecord[];
88
94
  * is first. Ending the wait never ends the drive. `onChange` hears every step while waiting.
89
95
  */
90
96
  export declare function awaitDrive(runId: string, ms: number | undefined, signal?: AbortSignal, onChange?: (record: DriveRecord) => void): Promise<void>;
91
- /** Ask a running drive to stop. False when there is no such drive running. */
92
- export declare function stopDrive(runId: string): boolean;
97
+ /**
98
+ * Ask a running drive to stop. False when there is no such drive running. `reason` is said on the
99
+ * Harness page when something other than the person stopped it (the page reloaded).
100
+ */
101
+ export declare function stopDrive(runId: string, reason?: string): boolean;
102
+ /** Why no drive started on this tab (a refusal, the cloud unreachable), for its Harness page. */
103
+ export declare function noteHarnessWord(sessionId: string, said: string): void;
104
+ /** Said on the Harness page when a person reloads the page during a run. */
105
+ export declare const MSG_RELOADED = "The page reloaded, so this run stopped. Run again.";
106
+ /** The daemon asked this tab to reload: the page coming back is not a person reloading it. */
107
+ export declare function noteOwnReload(sessionId: string, at: number): void;
108
+ /**
109
+ * Read each event a tab sends. A document that arrives as a reload the daemon did not ask for is a
110
+ * person reloading the page, and a drive on that tab cannot go on as if the page had not started
111
+ * over: it is stopped, and its Harness page says why. Before, it drove on and ended "failed".
112
+ */
113
+ export declare function notePageLoaded(sessionId: string, event: ReticleEvent, at: number): void;
93
114
  /** Queue text for the driver's next turn. False when there is no such drive running. */
94
115
  export declare function sayToDrive(runId: string, text: string): boolean;
95
116
  /** One tool call a drive made. `harness` may be a lane's id (`<harness>-L2`). */
@@ -116,5 +137,8 @@ export declare const POLL_WAIT_DEFAULT_S = 50;
116
137
  export declare function pollCall(runId: string): string;
117
138
  /** What a poll answering `running` tells the agent to do, so it stays rather than walks away. */
118
139
  export declare function stillRunning(runId: string, steps: number, elapsedS: number): string;
119
- /** The impact snapshot, with the drive running on this tab when there is one. */
140
+ /**
141
+ * The impact snapshot, with the drive running on this tab and its step log when there is one, else
142
+ * how the last one on this tab ended.
143
+ */
120
144
  export declare function withRunningDrive(snapshot: ImpactSnapshot | undefined, sessionId: string): ImpactSnapshot | undefined;