@reticlehq/server 2.11.0 → 2.13.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 (513) hide show
  1. package/SKILL.md +93 -111
  2. package/dist/bridge/auth-failure-reason.d.ts +6 -2
  3. package/dist/bridge/auth-failure-reason.js +15 -8
  4. package/dist/bridge/bridge.d.ts +18 -14
  5. package/dist/bridge/bridge.js +248 -165
  6. package/dist/bridge/bridge.test-harness.d.ts +2 -0
  7. package/dist/bridge/bridge.test-harness.js +8 -1
  8. package/dist/bridge/pairing-token.d.ts +5 -0
  9. package/dist/bridge/pairing-token.js +28 -0
  10. package/dist/bridge/protocol-skew.d.ts +37 -0
  11. package/dist/bridge/protocol-skew.js +45 -0
  12. package/dist/capsule/capsule-store.d.ts +8 -7
  13. package/dist/capsule/capsule-store.js +1 -1
  14. package/dist/capsule/causal-summary.d.ts +2 -2
  15. package/dist/capsule/causal-summary.js +7 -2
  16. package/dist/chromium-launch-options.d.ts +28 -0
  17. package/dist/chromium-launch-options.js +29 -0
  18. package/dist/cli/cli-doctor.js +39 -1
  19. package/dist/cli/cli-flow-commands.d.ts +3 -1
  20. package/dist/cli/cli-flow-commands.js +34 -4
  21. package/dist/cli/cli-kill.d.ts +2 -1
  22. package/dist/cli/cli-launch.d.ts +11 -1
  23. package/dist/cli/cli-launch.js +59 -10
  24. package/dist/cli/cli-parse.d.ts +17 -1
  25. package/dist/cli/cli-parse.js +238 -12
  26. package/dist/cli/cli-update-commands.js +20 -1
  27. package/dist/cli/cli-verify.d.ts +2 -1
  28. package/dist/cli/cli-verify.js +5 -4
  29. package/dist/cli/cloud-cli.js +428 -253
  30. package/dist/cli/cloud-keystore.d.ts +37 -0
  31. package/dist/cli/cloud-keystore.js +97 -0
  32. package/dist/cli/cloud-kit.d.ts +37 -0
  33. package/dist/cli/cloud-kit.js +121 -0
  34. package/dist/cli/cloud-login.d.ts +17 -0
  35. package/dist/cli/cloud-login.js +183 -0
  36. package/dist/cli/cloud-session.d.ts +48 -0
  37. package/dist/cli/cloud-session.js +53 -0
  38. package/dist/cli/config-discovery.d.ts +2 -1
  39. package/dist/cli/config-discovery.js +1 -0
  40. package/dist/cli/daemon-start-options.d.ts +32 -0
  41. package/dist/cli/daemon-start-options.js +38 -0
  42. package/dist/cli/device-flow.d.ts +76 -0
  43. package/dist/cli/device-flow.js +56 -0
  44. package/dist/cli/doctor-rows.d.ts +12 -1
  45. package/dist/cli/doctor-rows.js +12 -1
  46. package/dist/cli/drive-attach.d.ts +13 -0
  47. package/dist/cli/drive-attach.js +18 -0
  48. package/dist/cli/drive-command.js +7 -3
  49. package/dist/cli/gate-exit.d.ts +21 -0
  50. package/dist/cli/gate-exit.js +21 -0
  51. package/dist/cli/gate-hook-message.d.ts +33 -0
  52. package/dist/cli/gate-hook-message.js +46 -0
  53. package/dist/cli/mcp-command.d.ts +25 -0
  54. package/dist/cli/mcp-command.js +174 -0
  55. package/dist/cli/project-name.d.ts +30 -0
  56. package/dist/cli/project-name.js +44 -0
  57. package/dist/cli/sibling-ports.d.ts +37 -0
  58. package/dist/cli/sibling-ports.js +56 -0
  59. package/dist/cli/status-next-action.d.ts +14 -0
  60. package/dist/cli/status-next-action.js +4 -4
  61. package/dist/cli.d.ts +1 -0
  62. package/dist/cli.js +167 -186
  63. package/dist/cloud/cloud-config.d.ts +24 -2
  64. package/dist/cloud/cloud-config.js +64 -5
  65. package/dist/cloud/cloud-sync.d.ts +16 -5
  66. package/dist/cloud/cloud-sync.js +64 -1
  67. package/dist/cloud/sync-cycle.d.ts +110 -0
  68. package/dist/cloud/sync-cycle.js +270 -0
  69. package/dist/cloud/sync-daemon.d.ts +69 -0
  70. package/dist/cloud/sync-daemon.js +260 -0
  71. package/dist/cloud/sync-disk.d.ts +9 -0
  72. package/dist/cloud/sync-disk.js +191 -0
  73. package/dist/cloud/sync-hash.d.ts +2 -0
  74. package/dist/cloud/sync-hash.js +35 -0
  75. package/dist/crawl/crawl-tools.js +5 -3
  76. package/dist/crawl/crawl.d.ts +12 -13
  77. package/dist/crawl/crawl.js +25 -3
  78. package/dist/daemon/daemon-resolve.d.ts +122 -0
  79. package/dist/daemon/daemon-resolve.js +187 -0
  80. package/dist/daemon/dev-servers.d.ts +15 -0
  81. package/dist/daemon/dev-servers.js +68 -0
  82. package/dist/daemon/free-port.d.ts +29 -0
  83. package/dist/daemon/free-port.js +55 -0
  84. package/dist/daemon/heartbeat.d.ts +0 -4
  85. package/dist/daemon/heartbeat.js +2 -2
  86. package/dist/daemon/wake-decision.d.ts +32 -0
  87. package/dist/daemon/wake-decision.js +38 -0
  88. package/dist/dev/stale-issue-guard.d.ts +0 -2
  89. package/dist/dev/stale-issue-guard.js +1 -1
  90. package/dist/domain/domain-tools.js +2 -2
  91. package/dist/events/contradictions.d.ts +59 -0
  92. package/dist/events/contradictions.js +253 -27
  93. package/dist/events/declared.d.ts +17 -0
  94. package/dist/events/declared.js +43 -1
  95. package/dist/events/echo-mismatch.js +65 -1
  96. package/dist/events/event-filters.d.ts +8 -0
  97. package/dist/events/event-filters.js +19 -2
  98. package/dist/events/observed-in-window.d.ts +12 -0
  99. package/dist/events/observed-in-window.js +17 -0
  100. package/dist/events/predicate-asks.d.ts +13 -0
  101. package/dist/events/predicate-asks.js +22 -0
  102. package/dist/events/predicate-eval.js +117 -27
  103. package/dist/events/predicate-parse.d.ts +0 -6
  104. package/dist/events/predicate-parse.js +43 -3
  105. package/dist/events/predicate-precheck.d.ts +8 -0
  106. package/dist/events/predicate-precheck.js +41 -0
  107. package/dist/events/predicate-route.d.ts +14 -0
  108. package/dist/events/predicate-route.js +36 -8
  109. package/dist/events/predicate-schema.d.ts +44 -0
  110. package/dist/events/predicate-schema.js +126 -23
  111. package/dist/events/predicate.d.ts +20 -0
  112. package/dist/events/predicate.js +77 -6
  113. package/dist/events/split-text-miss.d.ts +30 -0
  114. package/dist/events/split-text-miss.js +44 -0
  115. package/dist/flows/coverage.d.ts +0 -8
  116. package/dist/flows/coverage.js +1 -1
  117. package/dist/flows/decision.d.ts +5 -1
  118. package/dist/flows/decision.js +33 -7
  119. package/dist/flows/flake.d.ts +6 -8
  120. package/dist/flows/flake.js +1 -1
  121. package/dist/flows/flow-intent.d.ts +52 -0
  122. package/dist/flows/flow-intent.js +123 -0
  123. package/dist/flows/flow-memory-consult.d.ts +55 -0
  124. package/dist/flows/flow-memory-consult.js +38 -0
  125. package/dist/flows/flow-replay-run.d.ts +18 -7
  126. package/dist/flows/flow-replay-run.js +263 -23
  127. package/dist/flows/flow-replay.js +11 -2
  128. package/dist/flows/flow-step-runners.d.ts +8 -0
  129. package/dist/flows/flow-step-runners.js +8 -2
  130. package/dist/flows/flow-store-for-session.d.ts +31 -0
  131. package/dist/flows/flow-store-for-session.js +33 -0
  132. package/dist/flows/flow-success.js +15 -3
  133. package/dist/flows/flow-tools.js +87 -33
  134. package/dist/flows/flows.d.ts +14 -1
  135. package/dist/flows/flows.js +502 -24
  136. package/dist/flows/heal-run.js +5 -2
  137. package/dist/flows/predicate-to-expect.d.ts +17 -12
  138. package/dist/flows/predicate-to-expect.js +36 -15
  139. package/dist/flows/recordings.d.ts +13 -1
  140. package/dist/flows/recordings.js +17 -2
  141. package/dist/flows/replay.d.ts +22 -2
  142. package/dist/flows/replay.js +28 -2
  143. package/dist/flows/server-verify.js +16 -2
  144. package/dist/flows/verify-change-tools.js +9 -3
  145. package/dist/honesty/blind-spots.d.ts +51 -15
  146. package/dist/honesty/blind-spots.js +64 -4
  147. package/dist/honesty/feature-capture.d.ts +150 -0
  148. package/dist/honesty/feature-capture.js +233 -0
  149. package/dist/honesty/honesty.d.ts +24 -0
  150. package/dist/honesty/honesty.js +25 -1
  151. package/dist/honesty/instrumentation-gaps.d.ts +39 -6
  152. package/dist/honesty/instrumentation-gaps.js +88 -5
  153. package/dist/honesty/tool-hit-rate.d.ts +86 -0
  154. package/dist/honesty/tool-hit-rate.js +90 -0
  155. package/dist/honesty/undeclared-change.d.ts +51 -0
  156. package/dist/honesty/undeclared-change.js +56 -0
  157. package/dist/honesty/verified.d.ts +16 -0
  158. package/dist/honesty/verified.js +84 -5
  159. package/dist/http-server.d.ts +0 -1
  160. package/dist/http-server.js +13 -1
  161. package/dist/hunt/hunt-report.d.ts +0 -2
  162. package/dist/hunt/hunt-report.js +1 -1
  163. package/dist/impact/impact-recorder.d.ts +31 -8
  164. package/dist/impact/impact-recorder.js +104 -21
  165. package/dist/impact/impact-store.d.ts +13 -4
  166. package/dist/impact/impact-store.js +44 -3
  167. package/dist/index.d.ts +4 -1
  168. package/dist/index.js +113 -7
  169. package/dist/init/agent-rules.d.ts +30 -6
  170. package/dist/init/agent-rules.js +54 -13
  171. package/dist/init/astro-patch.d.ts +16 -0
  172. package/dist/init/astro-patch.js +28 -0
  173. package/dist/init/capabilities.d.ts +4 -3
  174. package/dist/init/capabilities.js +23 -3
  175. package/dist/init/closing-hint.d.ts +36 -0
  176. package/dist/init/closing-hint.js +120 -0
  177. package/dist/init/confirm.d.ts +27 -28
  178. package/dist/init/confirm.js +51 -11
  179. package/dist/init/cra.d.ts +34 -5
  180. package/dist/init/cra.js +96 -25
  181. package/dist/init/csp-check.js +17 -2
  182. package/dist/init/csp-doctor.d.ts +8 -1
  183. package/dist/init/csp-doctor.js +8 -3
  184. package/dist/init/dev-script.d.ts +50 -0
  185. package/dist/init/dev-script.js +66 -0
  186. package/dist/init/format-generated.d.ts +18 -0
  187. package/dist/init/format-generated.js +39 -0
  188. package/dist/init/install-hint.d.ts +9 -0
  189. package/dist/init/install-hint.js +29 -0
  190. package/dist/init/mcp-clients.d.ts +7 -0
  191. package/dist/init/mcp-clients.js +7 -0
  192. package/dist/init/mcp.d.ts +17 -6
  193. package/dist/init/mcp.js +27 -11
  194. package/dist/init/node-io.js +11 -1
  195. package/dist/init/plan-framework.d.ts +0 -5
  196. package/dist/init/plan-framework.js +147 -37
  197. package/dist/init/plan.d.ts +30 -37
  198. package/dist/init/plan.js +50 -60
  199. package/dist/init/preflight.d.ts +28 -0
  200. package/dist/init/preflight.js +38 -0
  201. package/dist/init/refresh-rules.d.ts +39 -0
  202. package/dist/init/refresh-rules.js +51 -0
  203. package/dist/init/run.d.ts +32 -35
  204. package/dist/init/run.js +151 -202
  205. package/dist/init/slash-command.d.ts +1 -1
  206. package/dist/init/snippets.js +90 -31
  207. package/dist/init/vite-config.d.ts +1 -1
  208. package/dist/init/vite-config.js +39 -25
  209. package/dist/init/workspace-apps.d.ts +17 -10
  210. package/dist/init/workspace-apps.js +110 -0
  211. package/dist/input/network-mock-tools.js +3 -6
  212. package/dist/input/real-input.d.ts +2 -0
  213. package/dist/input/real-input.js +28 -7
  214. package/dist/input/scroll-find.d.ts +7 -4
  215. package/dist/input/scroll-find.js +63 -25
  216. package/dist/input/scroll-tools.js +4 -6
  217. package/dist/input/viewport-tools.js +5 -4
  218. package/dist/intent/inline-intent.d.ts +37 -0
  219. package/dist/intent/inline-intent.js +193 -0
  220. package/dist/intent/intent-shard-store.d.ts +72 -0
  221. package/dist/intent/intent-shard-store.js +203 -0
  222. package/dist/intent/intent-shard.d.ts +411 -0
  223. package/dist/intent/intent-shard.js +176 -0
  224. package/dist/intent/intent-store.d.ts +49 -0
  225. package/dist/intent/intent-store.js +133 -0
  226. package/dist/intent/intent-subject.d.ts +45 -0
  227. package/dist/intent/intent-subject.js +177 -0
  228. package/dist/intent/intent-tools.d.ts +2 -0
  229. package/dist/intent/intent-tools.js +143 -0
  230. package/dist/intent/open-intents.d.ts +42 -0
  231. package/dist/intent/open-intents.js +40 -0
  232. package/dist/journal/envelope.d.ts +26 -26
  233. package/dist/journal/journal-recorder.d.ts +23 -0
  234. package/dist/journal/journal-recorder.js +35 -0
  235. package/dist/license/license-env.d.ts +29 -0
  236. package/dist/license/license-env.js +148 -0
  237. package/dist/loopback-agent.d.ts +31 -0
  238. package/dist/loopback-agent.js +57 -0
  239. package/dist/mcp/attach-memory.d.ts +83 -0
  240. package/dist/mcp/attach-memory.js +185 -0
  241. package/dist/mcp/client-identity.d.ts +31 -0
  242. package/dist/mcp/client-identity.js +51 -0
  243. package/dist/mcp/mcp-post-transport.d.ts +26 -0
  244. package/dist/mcp/mcp-post-transport.js +109 -0
  245. package/dist/mcp/mcp-proxy.d.ts +2 -8
  246. package/dist/mcp/mcp-proxy.js +64 -62
  247. package/dist/mcp/mcp.d.ts +2 -0
  248. package/dist/mcp/mcp.js +52 -24
  249. package/dist/mcp/proxy-backoff.d.ts +11 -0
  250. package/dist/mcp/proxy-backoff.js +13 -0
  251. package/dist/mcp/proxy-daemon-probe.d.ts +1 -0
  252. package/dist/mcp/proxy-daemon-probe.js +7 -1
  253. package/dist/mcp/proxy-handshake.d.ts +23 -0
  254. package/dist/mcp/proxy-handshake.js +31 -0
  255. package/dist/mcp/server-instructions.js +45 -3
  256. package/dist/mcp/tool-catalog-cache.d.ts +16 -0
  257. package/dist/mcp/tool-catalog-cache.js +22 -0
  258. package/dist/memory/memory-tools.d.ts +2 -0
  259. package/dist/memory/memory-tools.js +82 -0
  260. package/dist/memory/project-memory.d.ts +34 -0
  261. package/dist/memory/project-memory.js +96 -0
  262. package/dist/oracles/flow-instrument-gaps.d.ts +4 -4
  263. package/dist/oracles/flow-instrument-gaps.js +4 -5
  264. package/dist/oracles/propose-consequences.js +12 -3
  265. package/dist/oracles/self-instrument.d.ts +9 -9
  266. package/dist/oracles/self-instrument.js +19 -13
  267. package/dist/pool/browser-pool.d.ts +75 -5
  268. package/dist/pool/browser-pool.js +144 -5
  269. package/dist/pool/playwright-launcher.js +12 -1
  270. package/dist/project/fs-port.d.ts +3 -0
  271. package/dist/project/fs-port.js +3 -2
  272. package/dist/project/memory-fs.js +6 -1
  273. package/dist/project/project-tools.js +6 -35
  274. package/dist/project/reticle-dir.d.ts +17 -2
  275. package/dist/project/reticle-dir.js +22 -4
  276. package/dist/runs/context-tools.d.ts +2 -0
  277. package/dist/runs/context-tools.js +89 -0
  278. package/dist/runs/run-context.d.ts +40 -0
  279. package/dist/runs/run-context.js +158 -0
  280. package/dist/runs/run-diff.d.ts +2 -1
  281. package/dist/runs/run-store.d.ts +10 -0
  282. package/dist/runs/run-store.js +10 -0
  283. package/dist/runs/verification-sync.d.ts +0 -11
  284. package/dist/runs/verification-sync.js +24 -3
  285. package/dist/runs/verify-server.d.ts +8 -1
  286. package/dist/runs/verify-server.js +14 -2
  287. package/dist/session/command-timeout.d.ts +5 -2
  288. package/dist/session/command-timeout.js +5 -4
  289. package/dist/session/dev-server-probe.d.ts +0 -8
  290. package/dist/session/dev-server-probe.js +1 -1
  291. package/dist/session/last-act.d.ts +7 -1
  292. package/dist/session/last-act.js +2 -2
  293. package/dist/session/lease-visibility.d.ts +67 -0
  294. package/dist/session/lease-visibility.js +76 -0
  295. package/dist/session/live-control-tools.js +1 -42
  296. package/dist/session/no-session-diagnosis.d.ts +33 -0
  297. package/dist/session/no-session-diagnosis.js +82 -24
  298. package/dist/session/no-session-next-action.d.ts +12 -0
  299. package/dist/session/no-session-next-action.js +77 -6
  300. package/dist/session/no-session-watch.d.ts +18 -6
  301. package/dist/session/no-session-watch.js +125 -75
  302. package/dist/session/output-budget.js +4 -1
  303. package/dist/session/pending-commands.d.ts +11 -1
  304. package/dist/session/pending-commands.js +12 -2
  305. package/dist/session/resolve-within.d.ts +34 -0
  306. package/dist/session/resolve-within.js +53 -0
  307. package/dist/session/session-health.d.ts +9 -0
  308. package/dist/session/session-health.js +23 -0
  309. package/dist/session/session-info.d.ts +18 -0
  310. package/dist/session/session-info.js +11 -0
  311. package/dist/session/session-manager.d.ts +14 -0
  312. package/dist/session/session-manager.js +111 -4
  313. package/dist/session/session-mirror.d.ts +16 -0
  314. package/dist/session/session-mirror.js +22 -0
  315. package/dist/session/session-recommendation.d.ts +19 -5
  316. package/dist/session/session-recommendation.js +25 -9
  317. package/dist/session/session-successor.d.ts +37 -0
  318. package/dist/session/session-successor.js +113 -0
  319. package/dist/session/session-tools.js +2 -2
  320. package/dist/session/session.d.ts +53 -3
  321. package/dist/session/session.js +162 -9
  322. package/dist/session/wall-clock.d.ts +12 -0
  323. package/dist/session/wall-clock.js +14 -0
  324. package/dist/setup/agent-configs.d.ts +96 -0
  325. package/dist/setup/agent-configs.js +333 -0
  326. package/dist/setup/agent-io.d.ts +9 -0
  327. package/dist/setup/agent-io.js +16 -0
  328. package/dist/setup/agent-writer.d.ts +51 -0
  329. package/dist/setup/agent-writer.js +115 -0
  330. package/dist/setup/approval-migration.d.ts +47 -0
  331. package/dist/setup/approval-migration.js +68 -0
  332. package/dist/setup/auto-approve.d.ts +85 -0
  333. package/dist/setup/auto-approve.js +150 -0
  334. package/dist/setup/bridge-port.d.ts +15 -0
  335. package/dist/setup/bridge-port.js +24 -0
  336. package/dist/setup/desktop-shape.d.ts +57 -0
  337. package/dist/setup/desktop-shape.js +63 -0
  338. package/dist/setup/dev-server-wait.d.ts +60 -0
  339. package/dist/setup/dev-server-wait.js +65 -0
  340. package/dist/setup/drive-agent.d.ts +71 -0
  341. package/dist/setup/drive-agent.js +171 -0
  342. package/dist/setup/drive-plan.d.ts +68 -0
  343. package/dist/setup/drive-plan.js +130 -0
  344. package/dist/setup/ensure-daemon.d.ts +29 -0
  345. package/dist/setup/ensure-daemon.js +58 -0
  346. package/dist/setup/init-runtime.d.ts +47 -0
  347. package/dist/setup/init-runtime.js +160 -0
  348. package/dist/setup/interrupt.d.ts +25 -0
  349. package/dist/setup/interrupt.js +40 -0
  350. package/dist/setup/license-key.d.ts +39 -0
  351. package/dist/setup/license-key.js +72 -0
  352. package/dist/setup/listeners.d.ts +37 -0
  353. package/dist/setup/listeners.js +85 -0
  354. package/dist/setup/node-effects.d.ts +60 -0
  355. package/dist/setup/node-effects.js +210 -0
  356. package/dist/setup/page-probe.d.ts +39 -0
  357. package/dist/setup/page-probe.js +49 -0
  358. package/dist/setup/relaunch.d.ts +36 -0
  359. package/dist/setup/relaunch.js +57 -0
  360. package/dist/setup/remaining-steps.d.ts +19 -0
  361. package/dist/setup/remaining-steps.js +31 -0
  362. package/dist/setup/run-setup.d.ts +99 -0
  363. package/dist/setup/run-setup.js +187 -0
  364. package/dist/setup/session-pick.d.ts +47 -0
  365. package/dist/setup/session-pick.js +51 -0
  366. package/dist/setup/setup-command.d.ts +45 -0
  367. package/dist/setup/setup-command.js +199 -0
  368. package/dist/setup/setup-options.d.ts +74 -0
  369. package/dist/setup/setup-options.js +67 -0
  370. package/dist/setup/transcripts.d.ts +16 -0
  371. package/dist/setup/transcripts.js +43 -0
  372. package/dist/status-payload.d.ts +14 -1
  373. package/dist/status-payload.js +23 -1
  374. package/dist/telemetry/automation-hint.d.ts +2 -1
  375. package/dist/telemetry/daemon-telemetry.d.ts +8 -1
  376. package/dist/telemetry/daemon-telemetry.js +52 -5
  377. package/dist/telemetry/error-class.js +1 -1
  378. package/dist/telemetry/feedback-context.d.ts +9 -1
  379. package/dist/telemetry/feedback-context.js +60 -29
  380. package/dist/telemetry/feedback-local.d.ts +15 -0
  381. package/dist/telemetry/feedback-local.js +56 -0
  382. package/dist/telemetry/feedback-outbox.d.ts +2 -1
  383. package/dist/telemetry/feedback.d.ts +11 -0
  384. package/dist/telemetry/feedback.js +19 -6
  385. package/dist/telemetry/init-telemetry.d.ts +2 -0
  386. package/dist/telemetry/init-telemetry.js +2 -0
  387. package/dist/telemetry/install-source.d.ts +14 -0
  388. package/dist/telemetry/install-source.js +30 -0
  389. package/dist/telemetry/license-activation.d.ts +7 -1
  390. package/dist/telemetry/license-activation.js +9 -5
  391. package/dist/telemetry/mcp-connection.js +7 -0
  392. package/dist/telemetry/project-profile.d.ts +12 -9
  393. package/dist/telemetry/project-profile.js +12 -7
  394. package/dist/telemetry/proxy-telemetry.d.ts +3 -0
  395. package/dist/telemetry/proxy-telemetry.js +21 -0
  396. package/dist/telemetry/run-telemetry.d.ts +0 -2
  397. package/dist/telemetry/run-telemetry.js +1 -1
  398. package/dist/telemetry/session-metrics.d.ts +12 -0
  399. package/dist/telemetry/session-metrics.js +35 -1
  400. package/dist/telemetry/telemetry.js +17 -2
  401. package/dist/telemetry/tool-refused.d.ts +3 -1
  402. package/dist/telemetry/tool-refused.js +34 -2
  403. package/dist/telemetry/verification-of.js +2 -2
  404. package/dist/tools/act-capsule.d.ts +10 -0
  405. package/dist/tools/act-capsule.js +8 -2
  406. package/dist/tools/act-danger.d.ts +2 -1
  407. package/dist/tools/act-danger.js +11 -3
  408. package/dist/tools/act-observation.d.ts +41 -0
  409. package/dist/tools/act-observation.js +36 -0
  410. package/dist/tools/act-preflight.d.ts +20 -0
  411. package/dist/tools/act-preflight.js +98 -0
  412. package/dist/tools/act-sequence-retry.d.ts +45 -0
  413. package/dist/tools/act-sequence-retry.js +58 -0
  414. package/dist/tools/act-sequence-tool.d.ts +13 -0
  415. package/dist/tools/act-sequence-tool.js +135 -0
  416. package/dist/tools/act-target.d.ts +14 -0
  417. package/dist/tools/act-target.js +47 -0
  418. package/dist/tools/act-tools.d.ts +21 -1
  419. package/dist/tools/act-tools.js +196 -204
  420. package/dist/tools/assert-source.d.ts +22 -0
  421. package/dist/tools/assert-source.js +53 -0
  422. package/dist/tools/assert-verdict.d.ts +20 -3
  423. package/dist/tools/assert-verdict.js +58 -20
  424. package/dist/tools/browser-tools.js +6 -22
  425. package/dist/tools/complete-snapshot.d.ts +48 -0
  426. package/dist/tools/complete-snapshot.js +75 -0
  427. package/dist/tools/coverage-tools.d.ts +10 -1
  428. package/dist/tools/coverage-tools.js +123 -69
  429. package/dist/tools/dynamic-tools.js +53 -13
  430. package/dist/tools/error-recovery.d.ts +25 -14
  431. package/dist/tools/error-recovery.js +78 -9
  432. package/dist/tools/feedback-tools.d.ts +1 -1
  433. package/dist/tools/feedback-tools.js +2 -2
  434. package/dist/tools/invoke-tool.js +121 -11
  435. package/dist/tools/lease-hint.d.ts +10 -0
  436. package/dist/tools/lease-hint.js +53 -4
  437. package/dist/tools/lease-tools.d.ts +35 -5
  438. package/dist/tools/lease-tools.js +191 -13
  439. package/dist/tools/merged-name-redirect.d.ts +13 -0
  440. package/dist/tools/merged-name-redirect.js +22 -0
  441. package/dist/tools/navigate-arrival.d.ts +0 -2
  442. package/dist/tools/navigate-arrival.js +1 -1
  443. package/dist/tools/numeric-bounds.d.ts +100 -0
  444. package/dist/tools/numeric-bounds.js +125 -0
  445. package/dist/tools/observe-tools.js +109 -65
  446. package/dist/tools/read-tools.js +31 -8
  447. package/dist/tools/real-input-attempt.d.ts +32 -0
  448. package/dist/tools/real-input-attempt.js +212 -2
  449. package/dist/tools/reconcile-tools.js +22 -8
  450. package/dist/tools/resolve-target.d.ts +0 -7
  451. package/dist/tools/sdk-marker-probe.d.ts +29 -0
  452. package/dist/tools/sdk-marker-probe.js +57 -0
  453. package/dist/tools/snapshot-delta.d.ts +1 -1
  454. package/dist/tools/tool-kit.d.ts +24 -0
  455. package/dist/tools/tool-kit.js +21 -0
  456. package/dist/tools/tool-names.d.ts +5 -0
  457. package/dist/tools/tool-names.js +5 -0
  458. package/dist/tools/tool-surface.d.ts +85 -6
  459. package/dist/tools/tool-surface.js +122 -2
  460. package/dist/tools/tools-helpers.d.ts +19 -0
  461. package/dist/tools/tools-helpers.js +46 -0
  462. package/dist/tools/tools.d.ts +2 -0
  463. package/dist/tools/tools.js +78 -12
  464. package/dist/tools/unadvertised-help.js +4 -4
  465. package/dist/tools/verify-next-baton.d.ts +53 -0
  466. package/dist/tools/verify-next-baton.js +52 -0
  467. package/dist/update/reticle-deps.d.ts +9 -0
  468. package/dist/update/reticle-deps.js +27 -0
  469. package/dist/update/sdk-sync.d.ts +1 -2
  470. package/dist/update/sdk-sync.js +1 -21
  471. package/dist/update/update-nudge.d.ts +25 -10
  472. package/dist/update/update-nudge.js +32 -3
  473. package/dist/update/updater.d.ts +1 -1
  474. package/dist/version/peer-announce.js +4 -2
  475. package/dist/version/sdk-fix.d.ts +47 -0
  476. package/dist/version/sdk-fix.js +127 -0
  477. package/dist/version/version-nudge.d.ts +14 -0
  478. package/dist/version/version-nudge.js +21 -0
  479. package/dist/version/version-skew.d.ts +38 -3
  480. package/dist/version/version-skew.js +83 -7
  481. package/dist/visual/visual-store.d.ts +6 -6
  482. package/dist/visual/visual-store.js +18 -16
  483. package/dist/visual/visual-tools.js +57 -12
  484. package/docs/README.md +2 -1
  485. package/docs/cli/cloud.mdx +1 -1
  486. package/docs/cli/doctor.mdx +2 -0
  487. package/docs/cli/serve.mdx +4 -2
  488. package/docs/cli/verify.mdx +4 -5
  489. package/docs/cli.mdx +7 -3
  490. package/docs/desktop.mdx +1 -1
  491. package/docs/docs.json +2 -2
  492. package/docs/gates.md +1 -1
  493. package/docs/getting-started.md +19 -3
  494. package/docs/index.mdx +9 -6
  495. package/docs/install-agentic.mdx +38 -12
  496. package/docs/install-manual.mdx +1 -1
  497. package/docs/packages/browser.mdx +2 -2
  498. package/docs/packages/server.mdx +1 -1
  499. package/docs/packages.mdx +8 -6
  500. package/docs/platform-integration.md +17 -0
  501. package/docs/predicates.mdx +8 -0
  502. package/docs/reticle-manual.md +106 -0
  503. package/docs/skill-file.mdx +3 -3
  504. package/docs/telemetry-contract.md +108 -4
  505. package/docs/tools-act-sequence.mdx +16 -0
  506. package/docs/tools-tools-and-run.mdx +2 -4
  507. package/docs/troubleshooting.mdx +9 -0
  508. package/docs/usage.md +4 -3
  509. package/package.json +4 -3
  510. package/dist/init/cursor.d.ts +0 -24
  511. package/dist/init/cursor.js +0 -80
  512. package/dist/session/session-readiness.d.ts +0 -34
  513. package/dist/session/session-readiness.js +0 -36
@@ -17,8 +17,21 @@ export { AGENT_FLAG, BUG_FLAG, FEEDBACK_KINDS, KIND_FLAG, RATING_FLAG, } from '.
17
17
  */
18
18
  export const CLI_USAGE = `usage: npx @reticlehq/server <command> (or \`reticle <command>\` once the bin is on your PATH)
19
19
 
20
- reticle init [--dry-run] [--port N] [--no-mcp] [--no-install] [--app <dir>] (wire Reticle into the project in this directory)
20
+ reticle init [--dry-run] [--port N] [--no-mcp] [--no-install] [--app <dir>]
21
+ [--flow "<what to drive>"] [--env KEY=VALUE]... [--files-only] (wire Reticle into the project in this directory)
21
22
  --app picks WHICH app in a monorepo, when several are found
23
+ --flow names the journey worth proving, in your own words. Only you know
24
+ which one matters, and naming it is the difference between a drive that
25
+ finishes and one that spends its budget looking for something to do
26
+ --env is what the app needs to reach a usable state: the key from
27
+ .env.example, the mock backend, the variable that skips an auth wall.
28
+ Repeatable, and a value may contain spaces and equals signs
29
+ --files-only writes the files and stops, which is what init did before it
30
+ learned to boot the app and prove the install works
31
+ --license writes the key to .env and keeps .env out of git
32
+ --json puts the result on stdout, so an agent reads one object
33
+ --no-drive / --no-open / --no-agents / --url / --timeout / --drive-model
34
+ are the runtime dials: CI, a headless box, or an app you already run
22
35
  --no-mcp skips MORE than the server registration: also the agent rule files
23
36
  (CLAUDE.md / AGENTS.md / .cursor) and the /reticle command, because all three
24
37
  only make sense once the tools are reachable.
@@ -29,7 +42,7 @@ export const CLI_USAGE = `usage: npx @reticlehq/server <command> (or \`reticl
29
42
  reticle status [--port N]
30
43
  reticle doctor [--port N] (one command to diagnose setup: Chromium, daemon, port)
31
44
  reticle open [url] [--port N] (show the app: reuse the connected tab, else open one)
32
- reticle verify <url> [--headed] [--timeout N] [--storage-state <file>] (one-shot: drive the URL, verify saved flows, exit 0=pass)
45
+ reticle verify <url> [--port N] [--headed] [--timeout N] [--storage-state <file>] [--session-id <id>] (one-shot: drive the URL, verify saved flows, exit 0=pass)
33
46
  reticle affected [--since <ref>] [file...] (which saved flows must re-verify for the changed files)
34
47
  reticle gate [--since <ref>] [file...] (exit non-zero unless passing artifacts cover the affected flows)
35
48
  reticle watch [url] (on save, report which saved flows must re-verify)
@@ -45,13 +58,15 @@ export const CLI_USAGE = `usage: npx @reticlehq/server <command> (or \`reticl
45
58
  reticle identify --context company|side_project|open_source|learning [--company N] [--email E] [--forget]
46
59
  (OPT-IN: tell us who you are, e.g. for support or an enterprise trial)
47
60
 
48
- Cloud (link this project to Reticle Cloud; runs/flows recorded on the dashboard):
49
- reticle login --email <e> [--code <c>] [--org <n>] (sign in: mails a code, then exchanges it)
61
+ Cloud (link this project to Reticle; runs/flows recorded on the dashboard):
62
+ reticle login [--url <u>] [--email <e>] [--code <c>] [--org <n>]
63
+ (browser device flow by default; --email mails a code)
64
+ reticle logout [--url <u>] (sign out of ONE host; others stay signed in)
50
65
  reticle link [--project <name|id>] (bind this repo: mints a scoped key, writes .reticle/cloud.json)
51
66
  reticle whoami (who am I signed in as, and is this repo attached?)
52
67
  reticle project <ls|create <name>> (list or create cloud projects)
53
68
  reticle config [--runs on|off] [--memory on|off] [--flows on|off] [--verify local|server]
54
- reticle push (send local run artifacts to the dashboard)
69
+ reticle push | sync [--watch] (one sync cycle: send the difference, collect decisions)
55
70
  reticle runs | regression | share <runId> (read cloud state; regression exits 3 if any flow broke)
56
71
 
57
72
  'drive' shows the browser; everything else is hidden (serve/mcp own the pool behind leases, replay
@@ -69,6 +84,8 @@ const AFFECTED_COMMAND = 'affected';
69
84
  const HUNT_COMMAND = 'hunt';
70
85
  const CAPSULES_COMMAND = 'capsules';
71
86
  const GATE_COMMAND = 'gate';
87
+ /** Hook mode: prose a human can read, and silence when there was simply nothing to check. */
88
+ const HOOK_FLAG = '--hook';
72
89
  const WATCH_COMMAND = 'watch';
73
90
  const UPDATE_COMMAND = 'update';
74
91
  const ROLLBACK_COMMAND = 'rollback';
@@ -132,6 +149,8 @@ const KNOWN_COMMANDS = new Set([
132
149
  'config',
133
150
  'push',
134
151
  'runs',
152
+ 'issues',
153
+ 'memory',
135
154
  'regression',
136
155
  'share',
137
156
  'doctor',
@@ -157,12 +176,64 @@ const DRY_RUN_FLAG = '--dry-run';
157
176
  const YES_FLAG = '--yes';
158
177
  const NO_MCP_FLAG = '--no-mcp';
159
178
  const APP_FLAG = '--app';
179
+ /**
180
+ * What only the caller can know, and what it may switch off.
181
+ *
182
+ * `--flow`, `--env` and `--app` are an AGENT's answers: which journey proves the thing the user
183
+ * cares about, what the app needs to reach a usable state, and which app in a monorepo. None is
184
+ * inferable from the repository alone, and a run without them either guesses or stops.
185
+ *
186
+ * `--files-only` is the escape hatch for a caller that wants what init used to do and nothing more.
187
+ */
188
+ const FLOW_FLAG = '--flow';
189
+ const ENV_FLAG = '--env';
190
+ const FILES_ONLY_FLAG = '--files-only';
191
+ /**
192
+ * Write `captureNetworkBodies: true` into the app's config. OFF unless asked (#705).
193
+ *
194
+ * Body capture is what makes a 2xx write's OUTCOME readable rather than just its transport, so it
195
+ * is worth having — but a body is the one part of a request that routinely carries personal data,
196
+ * and `init` runs unattended. Whoever passes this has decided; nothing decides it for them.
197
+ */
198
+ const CAPTURE_BODIES_FLAG = '--capture-bodies';
199
+ /**
200
+ * The rest of the runtime surface.
201
+ *
202
+ * `--json` is not a convenience: SKILL.md tells an agent to read the result and act on `agentTodo`,
203
+ * and reading one object is one turn where interpreting a report is several. The three opt-outs are
204
+ * what a machine without a browser, or a caller already running their app, actually needs.
205
+ */
206
+ const JSON_FLAG = '--json';
207
+ const NO_DRIVE_FLAG = '--no-drive';
208
+ const NO_OPEN_FLAG = '--no-open';
209
+ const NO_AGENTS_FLAG = '--no-agents';
210
+ /**
211
+ * Restart the calling client so IT gets the tools.
212
+ *
213
+ * The flag was accepted by the prototype and not by `init`, so passing it printed the whole usage
214
+ * text. `init` decides what a restart should do — including refusing an id with no transcript, which
215
+ * is the case that looks exactly like success — and prints it; performing the restart is the
216
+ * caller's, because opening a terminal is not something a one-shot command should do behind a flag.
217
+ */
218
+ const RELAUNCH_FLAG = '--relaunch';
219
+ const URL_FLAG = '--url';
220
+ const TIMEOUT_FLAG_INIT = '--timeout';
221
+ const DRIVE_MODEL_FLAG = '--drive-model';
222
+ /**
223
+ * The key, written to .env by the command rather than by hand.
224
+ *
225
+ * The instructions used to ask an agent for three steps: append to .env, check .gitignore, confirm.
226
+ * All three are deterministic, and the second is the one that costs something when skipped, because
227
+ * a key committed to git is leaked and stays leaked after the file is removed.
228
+ */
229
+ const LICENSE_FLAG = '--license';
160
230
  const NO_INSTALL_FLAG = '--no-install';
161
231
  export const HTTP_FLAG = '--http';
162
232
  export const HTTP_PORT_FLAG = '--http-port';
163
233
  export const HTTP_TOKEN_FLAG = '--http-token';
164
234
  const TIMEOUT_FLAG = '--timeout';
165
235
  const STORAGE_STATE_FLAG = '--storage-state';
236
+ const SESSION_ID_FLAG = '--session-id';
166
237
  const unknownArgument = (arg) => ({
167
238
  kind: 'error',
168
239
  message: `unknown argument '${arg}'`,
@@ -179,6 +250,10 @@ const missingOperand = (command, what) => ({
179
250
  kind: 'error',
180
251
  message: `${command} needs ${what}`,
181
252
  });
253
+ const requiresHttp = (flag) => ({
254
+ kind: 'error',
255
+ message: `${flag} requires ${HTTP_FLAG} — it configures the verify endpoint ${HTTP_FLAG} starts`,
256
+ });
182
257
  const unknownCommand = (command) => ({
183
258
  kind: 'error',
184
259
  message: `unknown command '${command}'`,
@@ -243,6 +318,13 @@ function parseServeFlags(args, defaultPort, _defaultHeadless) {
243
318
  }
244
319
  i++;
245
320
  }
321
+ // Without `--http` these flags configure an endpoint nothing starts, and they were accepted and
322
+ // silently ignored — worse than being rejected, because the whole reason to pass them is to be
323
+ // honoured (#687).
324
+ if (!http && httpPort !== undefined)
325
+ return requiresHttp(HTTP_PORT_FLAG);
326
+ if (!http && httpToken !== undefined)
327
+ return requiresHttp(HTTP_TOKEN_FLAG);
246
328
  return {
247
329
  kind: 'ok',
248
330
  port,
@@ -288,14 +370,17 @@ function parseDriveSuffix(args, port, defaultHeadless) {
288
370
  return { kind: 'ok', port, driveUrl, headless };
289
371
  }
290
372
  /**
291
- * Parse `verify <url> [--headed] [--timeout N] [--storage-state <file>]`. The first non-flag token is
292
- * the preview URL.
373
+ * Parse `verify <url> [--port N] [--headed] [--timeout N] [--storage-state <file>]
374
+ * [--session-id <id>]`. The first non-flag token is the preview URL. `defaultPort` is already
375
+ * env + `.reticle.json` + 4400.
293
376
  */
294
- function parseVerifySuffix(args) {
377
+ function parseVerifySuffix(args, defaultPort) {
295
378
  let headless = true;
296
379
  let url;
297
380
  let timeoutMs;
298
381
  let storageState;
382
+ let sessionId;
383
+ let port = defaultPort;
299
384
  let i = 0;
300
385
  while (i < args.length) {
301
386
  const arg = args[i];
@@ -304,6 +389,16 @@ function parseVerifySuffix(args) {
304
389
  if (arg === HEADED_FLAG) {
305
390
  headless = false;
306
391
  }
392
+ else if (arg === PORT_FLAG) {
393
+ i++;
394
+ const n = args[i];
395
+ if (n === undefined)
396
+ return missingValue(PORT_FLAG);
397
+ const parsed = parseInt(n, 10);
398
+ if (isNaN(parsed))
399
+ return notANumber(PORT_FLAG, n);
400
+ port = parsed;
401
+ }
307
402
  else if (arg === TIMEOUT_FLAG) {
308
403
  i++;
309
404
  const n = args[i];
@@ -321,6 +416,13 @@ function parseVerifySuffix(args) {
321
416
  return missingValue(STORAGE_STATE_FLAG);
322
417
  storageState = v;
323
418
  }
419
+ else if (arg === SESSION_ID_FLAG) {
420
+ i++;
421
+ const v = args[i];
422
+ if (v === undefined)
423
+ return missingValue(SESSION_ID_FLAG);
424
+ sessionId = v;
425
+ }
324
426
  else if (arg.startsWith('--')) {
325
427
  return unknownArgument(arg);
326
428
  }
@@ -338,8 +440,10 @@ function parseVerifySuffix(args) {
338
440
  kind: 'ok',
339
441
  url,
340
442
  headless,
443
+ port,
341
444
  ...(timeoutMs !== undefined ? { timeoutMs } : {}),
342
445
  ...(storageState !== undefined ? { storageState } : {}),
446
+ ...(sessionId !== undefined ? { sessionId } : {}),
343
447
  };
344
448
  }
345
449
  function parseInitFlags(args) {
@@ -348,6 +452,20 @@ function parseInitFlags(args) {
348
452
  let dryRun = false;
349
453
  let install = true;
350
454
  let app;
455
+ let flow;
456
+ // Repeatable: one variable per flag, so a value containing spaces or `=` needs no quoting rules.
457
+ const env = [];
458
+ let filesOnly = false;
459
+ let captureBodies = false;
460
+ let json = false;
461
+ let drive = true;
462
+ let open = true;
463
+ let relaunch = false;
464
+ let agents = true;
465
+ let url;
466
+ let timeoutSeconds;
467
+ let driveModel;
468
+ let licenseKey;
351
469
  let i = 0;
352
470
  while (i < args.length) {
353
471
  const arg = args[i];
@@ -372,6 +490,72 @@ function parseInitFlags(args) {
372
490
  return missingValue(APP_FLAG);
373
491
  app = value;
374
492
  }
493
+ else if (arg === FLOW_FLAG) {
494
+ i++;
495
+ const value = args[i];
496
+ if (value === undefined)
497
+ return missingValue(FLOW_FLAG);
498
+ flow = value;
499
+ }
500
+ else if (arg === ENV_FLAG) {
501
+ i++;
502
+ const value = args[i];
503
+ if (value === undefined)
504
+ return missingValue(ENV_FLAG);
505
+ env.push(value);
506
+ }
507
+ else if (arg === FILES_ONLY_FLAG) {
508
+ filesOnly = true;
509
+ }
510
+ else if (arg === CAPTURE_BODIES_FLAG) {
511
+ captureBodies = true;
512
+ }
513
+ else if (arg === JSON_FLAG) {
514
+ json = true;
515
+ }
516
+ else if (arg === NO_DRIVE_FLAG) {
517
+ drive = false;
518
+ }
519
+ else if (arg === NO_OPEN_FLAG) {
520
+ open = false;
521
+ }
522
+ else if (arg === RELAUNCH_FLAG) {
523
+ relaunch = true;
524
+ }
525
+ else if (arg === NO_AGENTS_FLAG) {
526
+ agents = false;
527
+ }
528
+ else if (arg === URL_FLAG) {
529
+ i++;
530
+ const value = args[i];
531
+ if (value === undefined)
532
+ return missingValue(URL_FLAG);
533
+ url = value;
534
+ }
535
+ else if (arg === LICENSE_FLAG) {
536
+ i++;
537
+ const value = args[i];
538
+ if (value === undefined)
539
+ return missingValue(LICENSE_FLAG);
540
+ licenseKey = value;
541
+ }
542
+ else if (arg === DRIVE_MODEL_FLAG) {
543
+ i++;
544
+ const value = args[i];
545
+ if (value === undefined)
546
+ return missingValue(DRIVE_MODEL_FLAG);
547
+ driveModel = value;
548
+ }
549
+ else if (arg === TIMEOUT_FLAG_INIT) {
550
+ i++;
551
+ const value = args[i];
552
+ if (value === undefined)
553
+ return missingValue(TIMEOUT_FLAG_INIT);
554
+ const seconds = parseInt(value, 10);
555
+ if (isNaN(seconds))
556
+ return notANumber(TIMEOUT_FLAG_INIT, value);
557
+ timeoutSeconds = seconds;
558
+ }
375
559
  else if (arg === NO_MCP_FLAG) {
376
560
  mcp = false;
377
561
  }
@@ -389,7 +573,27 @@ function parseInitFlags(args) {
389
573
  }
390
574
  i++;
391
575
  }
392
- return { kind: 'ok', port, mcp, dryRun, install, app };
576
+ return {
577
+ kind: 'ok',
578
+ port,
579
+ mcp,
580
+ dryRun,
581
+ install,
582
+ app,
583
+ flow,
584
+ env,
585
+ filesOnly,
586
+ captureBodies,
587
+ json,
588
+ drive,
589
+ open,
590
+ relaunch,
591
+ agents,
592
+ url,
593
+ timeoutSeconds,
594
+ driveModel,
595
+ licenseKey,
596
+ };
393
597
  }
394
598
  /** Pure CLI arg parser — exported for unit tests. argv = process.argv.slice(2). */
395
599
  const SINCE_FLAG = '--since';
@@ -457,6 +661,19 @@ export function parseCliArgs(argv, defaultPort, defaultHeadless = false) {
457
661
  dryRun: r.dryRun,
458
662
  install: r.install,
459
663
  app: r.app,
664
+ flow: r.flow,
665
+ env: r.env,
666
+ filesOnly: r.filesOnly,
667
+ captureBodies: r.captureBodies,
668
+ json: r.json,
669
+ drive: r.drive,
670
+ open: r.open,
671
+ relaunch: r.relaunch,
672
+ agents: r.agents,
673
+ url: r.url,
674
+ timeoutSeconds: r.timeoutSeconds,
675
+ driveModel: r.driveModel,
676
+ licenseKey: r.licenseKey,
460
677
  };
461
678
  }
462
679
  case SERVE_COMMAND: {
@@ -550,15 +767,17 @@ export function parseCliArgs(argv, defaultPort, defaultHeadless = false) {
550
767
  };
551
768
  }
552
769
  case VERIFY_COMMAND: {
553
- const r = parseVerifySuffix(rest);
770
+ const r = parseVerifySuffix(rest, defaultPort);
554
771
  if ('error' === r.kind)
555
772
  return r;
556
773
  return {
557
774
  kind: 'verify',
558
775
  url: r.url,
559
776
  headless: r.headless,
777
+ port: r.port,
560
778
  ...(r.timeoutMs !== undefined ? { timeoutMs: r.timeoutMs } : {}),
561
779
  ...(r.storageState !== undefined ? { storageState: r.storageState } : {}),
780
+ ...(r.sessionId !== undefined ? { sessionId: r.sessionId } : {}),
562
781
  };
563
782
  }
564
783
  case CAPSULES_COMMAND:
@@ -575,9 +794,16 @@ export function parseCliArgs(argv, defaultPort, defaultHeadless = false) {
575
794
  return { kind: 'affected', files: t.files, ...(since === undefined ? {} : { since }) };
576
795
  }
577
796
  case GATE_COMMAND: {
578
- const t = parseTargetArgs(rest);
797
+ // `--hook` is stripped before target parsing, which would reject it as an unknown flag.
798
+ const hook = rest.includes(HOOK_FLAG);
799
+ const t = parseTargetArgs(rest.filter((a) => a !== HOOK_FLAG));
579
800
  const since = t.since ?? implicitSince(t.files);
580
- return { kind: 'gate', files: t.files, ...(since === undefined ? {} : { since }) };
801
+ return {
802
+ kind: 'gate',
803
+ files: t.files,
804
+ ...(since === undefined ? {} : { since }),
805
+ ...(hook ? { hook: true } : {}),
806
+ };
581
807
  }
582
808
  case WATCH_COMMAND: {
583
809
  // `reticle watch [url]` — on file save, report which saved flows must re-verify.
@@ -8,9 +8,10 @@
8
8
  import { checkForUpdate } from '../update/update-checker.js';
9
9
  import { updateTarget } from '../update/update-nudge.js';
10
10
  import { applyUpdate, rollback } from '../update/updater.js';
11
+ import { refreshAgentRules } from '../init/refresh-rules.js';
11
12
  import { SERVER_VERSION } from '../version/server-version.js';
12
13
  import { log } from '../log.js';
13
- import { readFileSync } from 'node:fs';
14
+ import { readFileSync, writeFileSync, existsSync } from 'node:fs';
14
15
  import { join } from 'node:path';
15
16
  import { reticleDepsOf, sdkSyncCommand } from '../update/sdk-sync.js';
16
17
  import { detectPackageManager } from '../init/detect.js';
@@ -64,6 +65,24 @@ export async function handleUpdate() {
64
65
  return;
65
66
  }
66
67
  log('reticle_update', { ok: true, from: SERVER_VERSION, to: target });
68
+ // Bring this project's agent rules up with the version.
69
+ //
70
+ // The managed block has always been updatable — marker-delimited, idempotent by comparing
71
+ // content — and nothing called it after the first install. `mergeMarkedInstruction` is reachable
72
+ // from `buildPlan` alone, so a project set up on an older release kept that release's
73
+ // instructions forever and every improvement to them reached new projects only.
74
+ //
75
+ // That is backwards: the people who most need better instructions are the ones already
76
+ // installed and not getting value, and this is the moment they are touching the install anyway.
77
+ // Only files that ALREADY carry the block are touched, and only inside the markers.
78
+ const refreshed = refreshAgentRules(process.cwd(), {
79
+ read: (path) => (existsSync(path) ? readFileSync(path, 'utf8') : null),
80
+ write: (path, content) => {
81
+ writeFileSync(path, content, 'utf8');
82
+ },
83
+ });
84
+ if (0 !== refreshed.updated.length)
85
+ log('reticle_rules_refreshed', { files: refreshed.updated, to: target });
67
86
  // The app's SDK FIRST, then the CLI. `reticle update` used to swap only the CLI, so the command
68
87
  // whose job is keeping an install current was itself a way to produce a version-skewed pair —
69
88
  // and the skew message told people to run it to fix an outdated SDK, which it could not do.
@@ -62,7 +62,8 @@ export declare function handleVerify(parsed: {
62
62
  headless: boolean;
63
63
  timeoutMs?: number;
64
64
  storageState?: string;
65
+ sessionId?: string;
65
66
  /** Bridge port — parseCliArgs already resolves --port / RETICLE_PORT / .reticle.json into this. */
66
- port?: number;
67
+ port: number;
67
68
  }): void;
68
69
  export {};
@@ -16,7 +16,7 @@ import { start } from '../index.js';
16
16
  import { probePresence, PortPresence } from '../daemon/port-presence.js';
17
17
  import { probeDaemon } from '../mcp/mcp-proxy.js';
18
18
  import { fetchStatus } from './cli-launch.js';
19
- import { resolveCloudConfig, syncRunToCloud, SyncOutcome } from '../cloud/cloud-sync.js';
19
+ import { cloudFetch, resolveCloudConfig, syncRunToCloud, SyncOutcome, } from '../cloud/cloud-sync.js';
20
20
  import { ReticleRunner } from '../runs/reticle-runner.js';
21
21
  import { createRunnerPort } from '../runs/runner-port.js';
22
22
  import { RunStore } from '../runs/run-store.js';
@@ -94,9 +94,9 @@ async function pushRunToCloud(run, ports) {
94
94
  const config = resolveCloudConfig(process.env);
95
95
  if (null === config)
96
96
  return;
97
- const result = await syncRunToCloud(run, config, (url, init) => fetch(url, init));
97
+ const result = await syncRunToCloud(run, config, cloudFetch);
98
98
  if (result.outcome === SyncOutcome.SYNCED) {
99
- ports.out(`↑ run ${run.runId} recorded on the Reticle Cloud dashboard`);
99
+ ports.out(`↑ run ${run.runId} recorded on the Reticle dashboard`);
100
100
  }
101
101
  else {
102
102
  ports.fail(`cloud run sync failed (${result.status ?? result.error ?? 'error'}); run kept locally`);
@@ -175,7 +175,7 @@ async function openLiveConnection(opts) {
175
175
  ...(opts.storageState !== undefined ? { storageState: opts.storageState } : {}),
176
176
  });
177
177
  const deps = buildVerifyDeps(running, opts.reticleRoot, opts.now);
178
- const runner = new ReticleRunner(createRunnerPort(deps));
178
+ const runner = new ReticleRunner(createRunnerPort(deps, opts.sessionId));
179
179
  return {
180
180
  sessionReady: (timeoutMs) => waitForSession(deps.sessions, timeoutMs, opts.now),
181
181
  listFlows: () => deps.flows.list(),
@@ -244,6 +244,7 @@ export function handleVerify(parsed) {
244
244
  now,
245
245
  port: parsed.port ?? RETICLE_DEFAULT_PORT,
246
246
  ...(parsed.storageState !== undefined ? { storageState: parsed.storageState } : {}),
247
+ ...(parsed.sessionId !== undefined ? { sessionId: parsed.sessionId } : {}),
247
248
  }),
248
249
  out: (line) => process.stdout.write(`${line}\n`),
249
250
  fail: (line) => process.stderr.write(`${line}\n`),