@reticlehq/server 2.0.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 (483) hide show
  1. package/LICENSE +105 -0
  2. package/README.md +17 -0
  3. package/dist/bridge-security.d.ts +23 -0
  4. package/dist/bridge-security.d.ts.map +1 -0
  5. package/dist/bridge-security.js +44 -0
  6. package/dist/bridge-security.js.map +1 -0
  7. package/dist/bridge.d.ts +42 -0
  8. package/dist/bridge.d.ts.map +1 -0
  9. package/dist/bridge.js +281 -0
  10. package/dist/bridge.js.map +1 -0
  11. package/dist/bridge.test-harness.d.ts +42 -0
  12. package/dist/bridge.test-harness.d.ts.map +1 -0
  13. package/dist/bridge.test-harness.js +192 -0
  14. package/dist/bridge.test-harness.js.map +1 -0
  15. package/dist/cli-launch.d.ts +53 -0
  16. package/dist/cli-launch.d.ts.map +1 -0
  17. package/dist/cli-launch.js +109 -0
  18. package/dist/cli-launch.js.map +1 -0
  19. package/dist/cli-parse.d.ts +74 -0
  20. package/dist/cli-parse.d.ts.map +1 -0
  21. package/dist/cli-parse.js +321 -0
  22. package/dist/cli-parse.js.map +1 -0
  23. package/dist/cli-port.d.ts +26 -0
  24. package/dist/cli-port.d.ts.map +1 -0
  25. package/dist/cli-port.js +57 -0
  26. package/dist/cli-port.js.map +1 -0
  27. package/dist/cli-verify.d.ts +46 -0
  28. package/dist/cli-verify.d.ts.map +1 -0
  29. package/dist/cli-verify.js +181 -0
  30. package/dist/cli-verify.js.map +1 -0
  31. package/dist/cli.d.ts +6 -0
  32. package/dist/cli.d.ts.map +1 -0
  33. package/dist/cli.js +337 -0
  34. package/dist/cli.js.map +1 -0
  35. package/dist/cloud/cloud-sync.d.ts +50 -0
  36. package/dist/cloud/cloud-sync.d.ts.map +1 -0
  37. package/dist/cloud/cloud-sync.js +47 -0
  38. package/dist/cloud/cloud-sync.js.map +1 -0
  39. package/dist/crawl/crawl-tools.d.ts +8 -0
  40. package/dist/crawl/crawl-tools.d.ts.map +1 -0
  41. package/dist/crawl/crawl-tools.js +61 -0
  42. package/dist/crawl/crawl-tools.js.map +1 -0
  43. package/dist/crawl/crawl.d.ts +45 -0
  44. package/dist/crawl/crawl.d.ts.map +1 -0
  45. package/dist/crawl/crawl.js +106 -0
  46. package/dist/crawl/crawl.js.map +1 -0
  47. package/dist/daemon-resilience.d.ts +17 -0
  48. package/dist/daemon-resilience.d.ts.map +1 -0
  49. package/dist/daemon-resilience.js +23 -0
  50. package/dist/daemon-resilience.js.map +1 -0
  51. package/dist/daemon.d.ts +26 -0
  52. package/dist/daemon.d.ts.map +1 -0
  53. package/dist/daemon.js +122 -0
  54. package/dist/daemon.js.map +1 -0
  55. package/dist/domain/domain-model.d.ts +64 -0
  56. package/dist/domain/domain-model.d.ts.map +1 -0
  57. package/dist/domain/domain-model.js +127 -0
  58. package/dist/domain/domain-model.js.map +1 -0
  59. package/dist/domain/domain-tools.d.ts +9 -0
  60. package/dist/domain/domain-tools.d.ts.map +1 -0
  61. package/dist/domain/domain-tools.js +66 -0
  62. package/dist/domain/domain-tools.js.map +1 -0
  63. package/dist/domain/flow-risk.d.ts +34 -0
  64. package/dist/domain/flow-risk.d.ts.map +1 -0
  65. package/dist/domain/flow-risk.js +81 -0
  66. package/dist/domain/flow-risk.js.map +1 -0
  67. package/dist/ee/audit-log.d.ts +15 -0
  68. package/dist/ee/audit-log.d.ts.map +1 -0
  69. package/dist/ee/audit-log.js +12 -0
  70. package/dist/ee/audit-log.js.map +1 -0
  71. package/dist/events/event-filters.d.ts +65 -0
  72. package/dist/events/event-filters.d.ts.map +1 -0
  73. package/dist/events/event-filters.js +98 -0
  74. package/dist/events/event-filters.js.map +1 -0
  75. package/dist/events/predicate-eval.d.ts +91 -0
  76. package/dist/events/predicate-eval.d.ts.map +1 -0
  77. package/dist/events/predicate-eval.js +299 -0
  78. package/dist/events/predicate-eval.js.map +1 -0
  79. package/dist/events/predicate.d.ts +19 -0
  80. package/dist/events/predicate.d.ts.map +1 -0
  81. package/dist/events/predicate.js +188 -0
  82. package/dist/events/predicate.js.map +1 -0
  83. package/dist/events/reaction.d.ts +34 -0
  84. package/dist/events/reaction.d.ts.map +1 -0
  85. package/dist/events/reaction.js +60 -0
  86. package/dist/events/reaction.js.map +1 -0
  87. package/dist/events/ring-buffer.d.ts +32 -0
  88. package/dist/events/ring-buffer.d.ts.map +1 -0
  89. package/dist/events/ring-buffer.js +75 -0
  90. package/dist/events/ring-buffer.js.map +1 -0
  91. package/dist/flows/annotate-tools.d.ts +16 -0
  92. package/dist/flows/annotate-tools.d.ts.map +1 -0
  93. package/dist/flows/annotate-tools.js +136 -0
  94. package/dist/flows/annotate-tools.js.map +1 -0
  95. package/dist/flows/annotate.d.ts +22 -0
  96. package/dist/flows/annotate.d.ts.map +1 -0
  97. package/dist/flows/annotate.js +134 -0
  98. package/dist/flows/annotate.js.map +1 -0
  99. package/dist/flows/annotation-store.d.ts +23 -0
  100. package/dist/flows/annotation-store.d.ts.map +1 -0
  101. package/dist/flows/annotation-store.js +51 -0
  102. package/dist/flows/annotation-store.js.map +1 -0
  103. package/dist/flows/decision.d.ts +13 -0
  104. package/dist/flows/decision.d.ts.map +1 -0
  105. package/dist/flows/decision.js +111 -0
  106. package/dist/flows/decision.js.map +1 -0
  107. package/dist/flows/flow-classify.d.ts +52 -0
  108. package/dist/flows/flow-classify.d.ts.map +1 -0
  109. package/dist/flows/flow-classify.js +99 -0
  110. package/dist/flows/flow-classify.js.map +1 -0
  111. package/dist/flows/flow-replay-run.d.ts +15 -0
  112. package/dist/flows/flow-replay-run.d.ts.map +1 -0
  113. package/dist/flows/flow-replay-run.js +120 -0
  114. package/dist/flows/flow-replay-run.js.map +1 -0
  115. package/dist/flows/flow-replay.d.ts +49 -0
  116. package/dist/flows/flow-replay.d.ts.map +1 -0
  117. package/dist/flows/flow-replay.js +391 -0
  118. package/dist/flows/flow-replay.js.map +1 -0
  119. package/dist/flows/flow-report.d.ts +23 -0
  120. package/dist/flows/flow-report.d.ts.map +1 -0
  121. package/dist/flows/flow-report.js +106 -0
  122. package/dist/flows/flow-report.js.map +1 -0
  123. package/dist/flows/flow-scope.d.ts +25 -0
  124. package/dist/flows/flow-scope.d.ts.map +1 -0
  125. package/dist/flows/flow-scope.js +32 -0
  126. package/dist/flows/flow-scope.js.map +1 -0
  127. package/dist/flows/flow-success.d.ts +33 -0
  128. package/dist/flows/flow-success.d.ts.map +1 -0
  129. package/dist/flows/flow-success.js +131 -0
  130. package/dist/flows/flow-success.js.map +1 -0
  131. package/dist/flows/flow-tools.d.ts +4 -0
  132. package/dist/flows/flow-tools.d.ts.map +1 -0
  133. package/dist/flows/flow-tools.js +460 -0
  134. package/dist/flows/flow-tools.js.map +1 -0
  135. package/dist/flows/flows.d.ts +86 -0
  136. package/dist/flows/flows.d.ts.map +1 -0
  137. package/dist/flows/flows.js +319 -0
  138. package/dist/flows/flows.js.map +1 -0
  139. package/dist/flows/heal.d.ts +43 -0
  140. package/dist/flows/heal.d.ts.map +1 -0
  141. package/dist/flows/heal.js +98 -0
  142. package/dist/flows/heal.js.map +1 -0
  143. package/dist/flows/recordings.d.ts +46 -0
  144. package/dist/flows/recordings.d.ts.map +1 -0
  145. package/dist/flows/recordings.js +43 -0
  146. package/dist/flows/recordings.js.map +1 -0
  147. package/dist/flows/replay.d.ts +23 -0
  148. package/dist/flows/replay.d.ts.map +1 -0
  149. package/dist/flows/replay.js +160 -0
  150. package/dist/flows/replay.js.map +1 -0
  151. package/dist/http-server.d.ts +39 -0
  152. package/dist/http-server.d.ts.map +1 -0
  153. package/dist/http-server.js +145 -0
  154. package/dist/http-server.js.map +1 -0
  155. package/dist/idle-shutdown.d.ts +34 -0
  156. package/dist/idle-shutdown.d.ts.map +1 -0
  157. package/dist/idle-shutdown.js +68 -0
  158. package/dist/idle-shutdown.js.map +1 -0
  159. package/dist/index.d.ts +135 -0
  160. package/dist/index.d.ts.map +1 -0
  161. package/dist/index.js +371 -0
  162. package/dist/index.js.map +1 -0
  163. package/dist/init/cursor.d.ts +25 -0
  164. package/dist/init/cursor.d.ts.map +1 -0
  165. package/dist/init/cursor.js +49 -0
  166. package/dist/init/cursor.js.map +1 -0
  167. package/dist/init/detect.d.ts +49 -0
  168. package/dist/init/detect.d.ts.map +1 -0
  169. package/dist/init/detect.js +84 -0
  170. package/dist/init/detect.js.map +1 -0
  171. package/dist/init/mcp.d.ts +40 -0
  172. package/dist/init/mcp.d.ts.map +1 -0
  173. package/dist/init/mcp.js +55 -0
  174. package/dist/init/mcp.js.map +1 -0
  175. package/dist/init/node-io.d.ts +8 -0
  176. package/dist/init/node-io.d.ts.map +1 -0
  177. package/dist/init/node-io.js +57 -0
  178. package/dist/init/node-io.js.map +1 -0
  179. package/dist/init/plan.d.ts +72 -0
  180. package/dist/init/plan.d.ts.map +1 -0
  181. package/dist/init/plan.js +280 -0
  182. package/dist/init/plan.js.map +1 -0
  183. package/dist/init/project-id.d.ts +17 -0
  184. package/dist/init/project-id.d.ts.map +1 -0
  185. package/dist/init/project-id.js +38 -0
  186. package/dist/init/project-id.js.map +1 -0
  187. package/dist/init/run.d.ts +42 -0
  188. package/dist/init/run.d.ts.map +1 -0
  189. package/dist/init/run.js +171 -0
  190. package/dist/init/run.js.map +1 -0
  191. package/dist/init/snippets.d.ts +33 -0
  192. package/dist/init/snippets.d.ts.map +1 -0
  193. package/dist/init/snippets.js +117 -0
  194. package/dist/init/snippets.js.map +1 -0
  195. package/dist/init/vite-config.d.ts +25 -0
  196. package/dist/init/vite-config.d.ts.map +1 -0
  197. package/dist/init/vite-config.js +45 -0
  198. package/dist/init/vite-config.js.map +1 -0
  199. package/dist/input/network-mock-tools.d.ts +3 -0
  200. package/dist/input/network-mock-tools.d.ts.map +1 -0
  201. package/dist/input/network-mock-tools.js +94 -0
  202. package/dist/input/network-mock-tools.js.map +1 -0
  203. package/dist/input/network-mock.d.ts +55 -0
  204. package/dist/input/network-mock.d.ts.map +1 -0
  205. package/dist/input/network-mock.js +62 -0
  206. package/dist/input/network-mock.js.map +1 -0
  207. package/dist/input/real-input.d.ts +174 -0
  208. package/dist/input/real-input.d.ts.map +1 -0
  209. package/dist/input/real-input.js +289 -0
  210. package/dist/input/real-input.js.map +1 -0
  211. package/dist/input/scroll-find.d.ts +41 -0
  212. package/dist/input/scroll-find.d.ts.map +1 -0
  213. package/dist/input/scroll-find.js +59 -0
  214. package/dist/input/scroll-find.js.map +1 -0
  215. package/dist/input/scroll-tools.d.ts +8 -0
  216. package/dist/input/scroll-tools.d.ts.map +1 -0
  217. package/dist/input/scroll-tools.js +68 -0
  218. package/dist/input/scroll-tools.js.map +1 -0
  219. package/dist/input/viewport-tools.d.ts +3 -0
  220. package/dist/input/viewport-tools.d.ts.map +1 -0
  221. package/dist/input/viewport-tools.js +65 -0
  222. package/dist/input/viewport-tools.js.map +1 -0
  223. package/dist/license/license.d.ts +108 -0
  224. package/dist/license/license.d.ts.map +1 -0
  225. package/dist/license/license.js +203 -0
  226. package/dist/license/license.js.map +1 -0
  227. package/dist/log.d.ts +6 -0
  228. package/dist/log.d.ts.map +1 -0
  229. package/dist/log.js +9 -0
  230. package/dist/log.js.map +1 -0
  231. package/dist/mcp-proxy.d.ts +16 -0
  232. package/dist/mcp-proxy.d.ts.map +1 -0
  233. package/dist/mcp-proxy.js +168 -0
  234. package/dist/mcp-proxy.js.map +1 -0
  235. package/dist/mcp.d.ts +14 -0
  236. package/dist/mcp.d.ts.map +1 -0
  237. package/dist/mcp.js +101 -0
  238. package/dist/mcp.js.map +1 -0
  239. package/dist/pairing-token.d.ts +28 -0
  240. package/dist/pairing-token.d.ts.map +1 -0
  241. package/dist/pairing-token.js +62 -0
  242. package/dist/pairing-token.js.map +1 -0
  243. package/dist/pool/browser-pool.d.ts +90 -0
  244. package/dist/pool/browser-pool.d.ts.map +1 -0
  245. package/dist/pool/browser-pool.js +221 -0
  246. package/dist/pool/browser-pool.js.map +1 -0
  247. package/dist/pool/lease-reaper.d.ts +16 -0
  248. package/dist/pool/lease-reaper.d.ts.map +1 -0
  249. package/dist/pool/lease-reaper.js +41 -0
  250. package/dist/pool/lease-reaper.js.map +1 -0
  251. package/dist/pool/playwright-launcher.d.ts +19 -0
  252. package/dist/pool/playwright-launcher.d.ts.map +1 -0
  253. package/dist/pool/playwright-launcher.js +51 -0
  254. package/dist/pool/playwright-launcher.js.map +1 -0
  255. package/dist/project/baselines.d.ts +22 -0
  256. package/dist/project/baselines.d.ts.map +1 -0
  257. package/dist/project/baselines.js +45 -0
  258. package/dist/project/baselines.js.map +1 -0
  259. package/dist/project/fs-port.d.ts +27 -0
  260. package/dist/project/fs-port.d.ts.map +1 -0
  261. package/dist/project/fs-port.js +32 -0
  262. package/dist/project/fs-port.js.map +1 -0
  263. package/dist/project/project-store.d.ts +32 -0
  264. package/dist/project/project-store.d.ts.map +1 -0
  265. package/dist/project/project-store.js +127 -0
  266. package/dist/project/project-store.js.map +1 -0
  267. package/dist/project/project-tools.d.ts +9 -0
  268. package/dist/project/project-tools.d.ts.map +1 -0
  269. package/dist/project/project-tools.js +118 -0
  270. package/dist/project/project-tools.js.map +1 -0
  271. package/dist/project/reticle-dir.d.ts +61 -0
  272. package/dist/project/reticle-dir.d.ts.map +1 -0
  273. package/dist/project/reticle-dir.js +144 -0
  274. package/dist/project/reticle-dir.js.map +1 -0
  275. package/dist/runs/build-verification-run.d.ts +30 -0
  276. package/dist/runs/build-verification-run.d.ts.map +1 -0
  277. package/dist/runs/build-verification-run.js +71 -0
  278. package/dist/runs/build-verification-run.js.map +1 -0
  279. package/dist/runs/profile-redact.d.ts +16 -0
  280. package/dist/runs/profile-redact.d.ts.map +1 -0
  281. package/dist/runs/profile-redact.js +32 -0
  282. package/dist/runs/profile-redact.js.map +1 -0
  283. package/dist/runs/render-report.d.ts +9 -0
  284. package/dist/runs/render-report.d.ts.map +1 -0
  285. package/dist/runs/render-report.js +70 -0
  286. package/dist/runs/render-report.js.map +1 -0
  287. package/dist/runs/repair-prompt.d.ts +15 -0
  288. package/dist/runs/repair-prompt.d.ts.map +1 -0
  289. package/dist/runs/repair-prompt.js +59 -0
  290. package/dist/runs/repair-prompt.js.map +1 -0
  291. package/dist/runs/replay-mapping.d.ts +12 -0
  292. package/dist/runs/replay-mapping.d.ts.map +1 -0
  293. package/dist/runs/replay-mapping.js +35 -0
  294. package/dist/runs/replay-mapping.js.map +1 -0
  295. package/dist/runs/reticle-runner.d.ts +48 -0
  296. package/dist/runs/reticle-runner.d.ts.map +1 -0
  297. package/dist/runs/reticle-runner.js +56 -0
  298. package/dist/runs/reticle-runner.js.map +1 -0
  299. package/dist/runs/risk-classify.d.ts +27 -0
  300. package/dist/runs/risk-classify.d.ts.map +1 -0
  301. package/dist/runs/risk-classify.js +76 -0
  302. package/dist/runs/risk-classify.js.map +1 -0
  303. package/dist/runs/run-store.d.ts +40 -0
  304. package/dist/runs/run-store.d.ts.map +1 -0
  305. package/dist/runs/run-store.js +118 -0
  306. package/dist/runs/run-store.js.map +1 -0
  307. package/dist/runs/run-tools.d.ts +10 -0
  308. package/dist/runs/run-tools.d.ts.map +1 -0
  309. package/dist/runs/run-tools.js +69 -0
  310. package/dist/runs/run-tools.js.map +1 -0
  311. package/dist/runs/runner-port.d.ts +14 -0
  312. package/dist/runs/runner-port.d.ts.map +1 -0
  313. package/dist/runs/runner-port.js +23 -0
  314. package/dist/runs/runner-port.js.map +1 -0
  315. package/dist/runs/verify-http.d.ts +34 -0
  316. package/dist/runs/verify-http.d.ts.map +1 -0
  317. package/dist/runs/verify-http.js +102 -0
  318. package/dist/runs/verify-http.js.map +1 -0
  319. package/dist/runs/verify-server.d.ts +26 -0
  320. package/dist/runs/verify-server.d.ts.map +1 -0
  321. package/dist/runs/verify-server.js +99 -0
  322. package/dist/runs/verify-server.js.map +1 -0
  323. package/dist/server-version.d.ts +3 -0
  324. package/dist/server-version.d.ts.map +1 -0
  325. package/dist/server-version.js +5 -0
  326. package/dist/server-version.js.map +1 -0
  327. package/dist/session/control-envelope.d.ts +49 -0
  328. package/dist/session/control-envelope.d.ts.map +1 -0
  329. package/dist/session/control-envelope.js +44 -0
  330. package/dist/session/control-envelope.js.map +1 -0
  331. package/dist/session/live-control-tools.d.ts +16 -0
  332. package/dist/session/live-control-tools.d.ts.map +1 -0
  333. package/dist/session/live-control-tools.js +204 -0
  334. package/dist/session/live-control-tools.js.map +1 -0
  335. package/dist/session/output-budget.d.ts +41 -0
  336. package/dist/session/output-budget.d.ts.map +1 -0
  337. package/dist/session/output-budget.js +54 -0
  338. package/dist/session/output-budget.js.map +1 -0
  339. package/dist/session/presenter-args.d.ts +8 -0
  340. package/dist/session/presenter-args.d.ts.map +1 -0
  341. package/dist/session/presenter-args.js +15 -0
  342. package/dist/session/presenter-args.js.map +1 -0
  343. package/dist/session/review-store.d.ts +40 -0
  344. package/dist/session/review-store.d.ts.map +1 -0
  345. package/dist/session/review-store.js +61 -0
  346. package/dist/session/review-store.js.map +1 -0
  347. package/dist/session/session-health.d.ts +22 -0
  348. package/dist/session/session-health.d.ts.map +1 -0
  349. package/dist/session/session-health.js +26 -0
  350. package/dist/session/session-health.js.map +1 -0
  351. package/dist/session/session-manager.d.ts +43 -0
  352. package/dist/session/session-manager.d.ts.map +1 -0
  353. package/dist/session/session-manager.js +155 -0
  354. package/dist/session/session-manager.js.map +1 -0
  355. package/dist/session/session-readiness.d.ts +35 -0
  356. package/dist/session/session-readiness.d.ts.map +1 -0
  357. package/dist/session/session-readiness.js +32 -0
  358. package/dist/session/session-readiness.js.map +1 -0
  359. package/dist/session/session-reaper.d.ts +37 -0
  360. package/dist/session/session-reaper.d.ts.map +1 -0
  361. package/dist/session/session-reaper.js +94 -0
  362. package/dist/session/session-reaper.js.map +1 -0
  363. package/dist/session/session-recommendation.d.ts +18 -0
  364. package/dist/session/session-recommendation.d.ts.map +1 -0
  365. package/dist/session/session-recommendation.js +14 -0
  366. package/dist/session/session-recommendation.js.map +1 -0
  367. package/dist/session/session-tools.d.ts +9 -0
  368. package/dist/session/session-tools.d.ts.map +1 -0
  369. package/dist/session/session-tools.js +43 -0
  370. package/dist/session/session-tools.js.map +1 -0
  371. package/dist/session/session.d.ts +166 -0
  372. package/dist/session/session.d.ts.map +1 -0
  373. package/dist/session/session.js +408 -0
  374. package/dist/session/session.js.map +1 -0
  375. package/dist/session/state-select.d.ts +8 -0
  376. package/dist/session/state-select.d.ts.map +1 -0
  377. package/dist/session/state-select.js +8 -0
  378. package/dist/session/state-select.js.map +1 -0
  379. package/dist/token-auth.d.ts +24 -0
  380. package/dist/token-auth.d.ts.map +1 -0
  381. package/dist/token-auth.js +71 -0
  382. package/dist/token-auth.js.map +1 -0
  383. package/dist/tools/act-tools.d.ts +3 -0
  384. package/dist/tools/act-tools.d.ts.map +1 -0
  385. package/dist/tools/act-tools.js +327 -0
  386. package/dist/tools/act-tools.js.map +1 -0
  387. package/dist/tools/act-view.d.ts +19 -0
  388. package/dist/tools/act-view.d.ts.map +1 -0
  389. package/dist/tools/act-view.js +46 -0
  390. package/dist/tools/act-view.js.map +1 -0
  391. package/dist/tools/assert-grade.d.ts +21 -0
  392. package/dist/tools/assert-grade.d.ts.map +1 -0
  393. package/dist/tools/assert-grade.js +52 -0
  394. package/dist/tools/assert-grade.js.map +1 -0
  395. package/dist/tools/browser-tools.d.ts +3 -0
  396. package/dist/tools/browser-tools.d.ts.map +1 -0
  397. package/dist/tools/browser-tools.js +52 -0
  398. package/dist/tools/browser-tools.js.map +1 -0
  399. package/dist/tools/contract-tools.d.ts +8 -0
  400. package/dist/tools/contract-tools.d.ts.map +1 -0
  401. package/dist/tools/contract-tools.js +62 -0
  402. package/dist/tools/contract-tools.js.map +1 -0
  403. package/dist/tools/dynamic-tools.d.ts +7 -0
  404. package/dist/tools/dynamic-tools.d.ts.map +1 -0
  405. package/dist/tools/dynamic-tools.js +103 -0
  406. package/dist/tools/dynamic-tools.js.map +1 -0
  407. package/dist/tools/error-recovery.d.ts +31 -0
  408. package/dist/tools/error-recovery.d.ts.map +1 -0
  409. package/dist/tools/error-recovery.js +52 -0
  410. package/dist/tools/error-recovery.js.map +1 -0
  411. package/dist/tools/invoke-tool.d.ts +23 -0
  412. package/dist/tools/invoke-tool.d.ts.map +1 -0
  413. package/dist/tools/invoke-tool.js +99 -0
  414. package/dist/tools/invoke-tool.js.map +1 -0
  415. package/dist/tools/lease-tools.d.ts +31 -0
  416. package/dist/tools/lease-tools.d.ts.map +1 -0
  417. package/dist/tools/lease-tools.js +164 -0
  418. package/dist/tools/lease-tools.js.map +1 -0
  419. package/dist/tools/observe-tools.d.ts +3 -0
  420. package/dist/tools/observe-tools.d.ts.map +1 -0
  421. package/dist/tools/observe-tools.js +259 -0
  422. package/dist/tools/observe-tools.js.map +1 -0
  423. package/dist/tools/profiles.d.ts +33 -0
  424. package/dist/tools/profiles.d.ts.map +1 -0
  425. package/dist/tools/profiles.js +105 -0
  426. package/dist/tools/profiles.js.map +1 -0
  427. package/dist/tools/query-paginate.d.ts +15 -0
  428. package/dist/tools/query-paginate.d.ts.map +1 -0
  429. package/dist/tools/query-paginate.js +31 -0
  430. package/dist/tools/query-paginate.js.map +1 -0
  431. package/dist/tools/read-tools.d.ts +3 -0
  432. package/dist/tools/read-tools.d.ts.map +1 -0
  433. package/dist/tools/read-tools.js +329 -0
  434. package/dist/tools/read-tools.js.map +1 -0
  435. package/dist/tools/snapshot-delta.d.ts +59 -0
  436. package/dist/tools/snapshot-delta.d.ts.map +1 -0
  437. package/dist/tools/snapshot-delta.js +0 -0
  438. package/dist/tools/snapshot-delta.js.map +1 -0
  439. package/dist/tools/tool-invoker.d.ts +15 -0
  440. package/dist/tools/tool-invoker.d.ts.map +1 -0
  441. package/dist/tools/tool-invoker.js +20 -0
  442. package/dist/tools/tool-invoker.js.map +1 -0
  443. package/dist/tools/tool-kit.d.ts +60 -0
  444. package/dist/tools/tool-kit.d.ts.map +1 -0
  445. package/dist/tools/tool-kit.js +33 -0
  446. package/dist/tools/tool-kit.js.map +1 -0
  447. package/dist/tools/tool-names.d.ts +89 -0
  448. package/dist/tools/tool-names.d.ts.map +1 -0
  449. package/dist/tools/tool-names.js +88 -0
  450. package/dist/tools/tool-names.js.map +1 -0
  451. package/dist/tools/tools-helpers.d.ts +12 -0
  452. package/dist/tools/tools-helpers.d.ts.map +1 -0
  453. package/dist/tools/tools-helpers.js +22 -0
  454. package/dist/tools/tools-helpers.js.map +1 -0
  455. package/dist/tools/tools.d.ts +4 -0
  456. package/dist/tools/tools.d.ts.map +1 -0
  457. package/dist/tools/tools.js +268 -0
  458. package/dist/tools/tools.js.map +1 -0
  459. package/dist/update/update-checker.d.ts +20 -0
  460. package/dist/update/update-checker.d.ts.map +1 -0
  461. package/dist/update/update-checker.js +94 -0
  462. package/dist/update/update-checker.js.map +1 -0
  463. package/dist/update/update-tools.d.ts +3 -0
  464. package/dist/update/update-tools.d.ts.map +1 -0
  465. package/dist/update/update-tools.js +94 -0
  466. package/dist/update/update-tools.js.map +1 -0
  467. package/dist/update/updater.d.ts +31 -0
  468. package/dist/update/updater.d.ts.map +1 -0
  469. package/dist/update/updater.js +120 -0
  470. package/dist/update/updater.js.map +1 -0
  471. package/dist/visual/visual-diff.d.ts +46 -0
  472. package/dist/visual/visual-diff.d.ts.map +1 -0
  473. package/dist/visual/visual-diff.js +100 -0
  474. package/dist/visual/visual-diff.js.map +1 -0
  475. package/dist/visual/visual-store.d.ts +22 -0
  476. package/dist/visual/visual-store.d.ts.map +1 -0
  477. package/dist/visual/visual-store.js +60 -0
  478. package/dist/visual/visual-store.js.map +1 -0
  479. package/dist/visual/visual-tools.d.ts +9 -0
  480. package/dist/visual/visual-tools.d.ts.map +1 -0
  481. package/dist/visual/visual-tools.js +182 -0
  482. package/dist/visual/visual-tools.js.map +1 -0
  483. package/package.json +68 -0
@@ -0,0 +1,321 @@
1
+ /**
2
+ * Pure CLI argument parsing — the command/flag grammar, the CliResult union, and parseCliArgs.
3
+ * Split out of cli.ts (which keeps the side-effecting handlers + dispatch) to stay under the
4
+ * file-size cap and keep the parser pure + unit-testable. Re-exported from cli.ts so existing
5
+ * imports are unchanged.
6
+ */
7
+ export const CLI_USAGE = `usage:
8
+ reticle init [--yes] [--dry-run] [--port N] [--no-mcp] [--no-install] (wire Reticle into the project in this directory)
9
+ reticle serve [--port N] [--drive <url>] [--headed] [--http] [--http-port N] [--http-token T]
10
+ reticle stop [--port N] [--quiet]
11
+ reticle status [--port N]
12
+ reticle open [url] [--port N] (show the app: reuse the connected tab, else open one)
13
+ reticle verify <url> [--headed] [--timeout N] [--storage-state <file>] (one-shot: drive the URL, verify saved flows, exit 0=pass)
14
+ reticle drive <url> [--headed] (foreground mode — for debugging)
15
+ reticle mcp [--port N] [--drive <url>] [--headed] (MCP stdio proxy — auto-starts daemon if needed)
16
+ reticle license (show enterprise license status: active | eval | missing)`;
17
+ const INIT_COMMAND = 'init';
18
+ const SERVE_COMMAND = 'serve';
19
+ const STOP_COMMAND = 'stop';
20
+ const STATUS_COMMAND = 'status';
21
+ const OPEN_COMMAND = 'open';
22
+ const DRIVE_COMMAND = 'drive';
23
+ const VERIFY_COMMAND = 'verify';
24
+ const MCP_COMMAND = 'mcp';
25
+ const LICENSE_COMMAND = 'license';
26
+ const VERSION_COMMAND = 'version';
27
+ export const DAEMON_INNER_COMMAND = '_daemon';
28
+ export const HEADED_FLAG = '--headed';
29
+ export const PORT_FLAG = '--port';
30
+ export const DRIVE_FLAG = '--drive';
31
+ const QUIET_FLAG = '--quiet';
32
+ const DRY_RUN_FLAG = '--dry-run';
33
+ const YES_FLAG = '--yes';
34
+ const NO_MCP_FLAG = '--no-mcp';
35
+ const NO_INSTALL_FLAG = '--no-install';
36
+ export const HTTP_FLAG = '--http';
37
+ export const HTTP_PORT_FLAG = '--http-port';
38
+ export const HTTP_TOKEN_FLAG = '--http-token';
39
+ const TIMEOUT_FLAG = '--timeout';
40
+ const STORAGE_STATE_FLAG = '--storage-state';
41
+ function parseServeFlags(args, defaultPort) {
42
+ let port = defaultPort;
43
+ let driveUrl;
44
+ let headless = true;
45
+ let http = false;
46
+ let httpPort;
47
+ let httpToken;
48
+ let i = 0;
49
+ while (i < args.length) {
50
+ const arg = args[i];
51
+ if (arg === PORT_FLAG) {
52
+ i++;
53
+ const n = args[i];
54
+ if (n === undefined)
55
+ return { kind: 'error', message: CLI_USAGE };
56
+ const parsed = parseInt(n, 10);
57
+ if (isNaN(parsed))
58
+ return { kind: 'error', message: CLI_USAGE };
59
+ port = parsed;
60
+ }
61
+ else if (arg === DRIVE_FLAG) {
62
+ i++;
63
+ driveUrl = args[i];
64
+ if (driveUrl === undefined)
65
+ return { kind: 'error', message: CLI_USAGE };
66
+ }
67
+ else if (arg === HEADED_FLAG) {
68
+ headless = false;
69
+ }
70
+ else if (arg === HTTP_FLAG) {
71
+ http = true;
72
+ }
73
+ else if (arg === HTTP_PORT_FLAG) {
74
+ i++;
75
+ const n = args[i];
76
+ if (n === undefined)
77
+ return { kind: 'error', message: CLI_USAGE };
78
+ const parsed = parseInt(n, 10);
79
+ if (isNaN(parsed))
80
+ return { kind: 'error', message: CLI_USAGE };
81
+ httpPort = parsed;
82
+ }
83
+ else if (arg === HTTP_TOKEN_FLAG) {
84
+ i++;
85
+ httpToken = args[i];
86
+ if (httpToken === undefined)
87
+ return { kind: 'error', message: CLI_USAGE };
88
+ }
89
+ else {
90
+ return { kind: 'error', message: CLI_USAGE };
91
+ }
92
+ i++;
93
+ }
94
+ return {
95
+ kind: 'ok',
96
+ port,
97
+ headless,
98
+ http,
99
+ ...(driveUrl !== undefined ? { driveUrl } : {}),
100
+ ...(httpPort !== undefined ? { httpPort } : {}),
101
+ ...(httpToken !== undefined ? { httpToken } : {}),
102
+ };
103
+ }
104
+ function parsePortFlag(args, defaultPort) {
105
+ const idx = args.indexOf(PORT_FLAG);
106
+ if (idx === -1)
107
+ return defaultPort;
108
+ const n = args[idx + 1];
109
+ if (n === undefined)
110
+ return defaultPort;
111
+ const parsed = parseInt(n, 10);
112
+ return isNaN(parsed) ? defaultPort : parsed;
113
+ }
114
+ function parseDriveSuffix(args, port) {
115
+ let headless = true;
116
+ let driveUrl;
117
+ for (const arg of args) {
118
+ if (arg === HEADED_FLAG) {
119
+ headless = false;
120
+ }
121
+ else if (arg.startsWith('--')) {
122
+ return { kind: 'error', message: CLI_USAGE };
123
+ }
124
+ else if (driveUrl === undefined) {
125
+ driveUrl = arg;
126
+ }
127
+ else {
128
+ return { kind: 'error', message: CLI_USAGE };
129
+ }
130
+ }
131
+ if (driveUrl === undefined)
132
+ return { kind: 'error', message: CLI_USAGE };
133
+ return { kind: 'ok', port, driveUrl, headless };
134
+ }
135
+ /**
136
+ * Parse `verify <url> [--headed] [--timeout N] [--storage-state <file>]`. The first non-flag token is
137
+ * the preview URL.
138
+ */
139
+ function parseVerifySuffix(args) {
140
+ let headless = true;
141
+ let url;
142
+ let timeoutMs;
143
+ let storageState;
144
+ let i = 0;
145
+ while (i < args.length) {
146
+ const arg = args[i];
147
+ if (arg === undefined)
148
+ break;
149
+ if (arg === HEADED_FLAG) {
150
+ headless = false;
151
+ }
152
+ else if (arg === TIMEOUT_FLAG) {
153
+ i++;
154
+ const n = args[i];
155
+ if (n === undefined)
156
+ return { kind: 'error', message: CLI_USAGE };
157
+ const parsed = parseInt(n, 10);
158
+ if (isNaN(parsed))
159
+ return { kind: 'error', message: CLI_USAGE };
160
+ timeoutMs = parsed;
161
+ }
162
+ else if (arg === STORAGE_STATE_FLAG) {
163
+ i++;
164
+ const v = args[i];
165
+ if (v === undefined)
166
+ return { kind: 'error', message: CLI_USAGE };
167
+ storageState = v;
168
+ }
169
+ else if (arg.startsWith('--')) {
170
+ return { kind: 'error', message: CLI_USAGE };
171
+ }
172
+ else if (url === undefined) {
173
+ url = arg;
174
+ }
175
+ else {
176
+ return { kind: 'error', message: CLI_USAGE };
177
+ }
178
+ i++;
179
+ }
180
+ if (url === undefined)
181
+ return { kind: 'error', message: CLI_USAGE };
182
+ return {
183
+ kind: 'ok',
184
+ url,
185
+ headless,
186
+ ...(timeoutMs !== undefined ? { timeoutMs } : {}),
187
+ ...(storageState !== undefined ? { storageState } : {}),
188
+ };
189
+ }
190
+ function parseInitFlags(args) {
191
+ let port;
192
+ let mcp = true;
193
+ let dryRun = false;
194
+ let install = true;
195
+ let i = 0;
196
+ while (i < args.length) {
197
+ const arg = args[i];
198
+ if (arg === PORT_FLAG) {
199
+ i++;
200
+ const n = args[i];
201
+ if (n === undefined)
202
+ return { kind: 'error', message: CLI_USAGE };
203
+ const parsed = parseInt(n, 10);
204
+ if (isNaN(parsed))
205
+ return { kind: 'error', message: CLI_USAGE };
206
+ port = parsed;
207
+ }
208
+ else if (arg === NO_MCP_FLAG) {
209
+ mcp = false;
210
+ }
211
+ else if (arg === NO_INSTALL_FLAG) {
212
+ install = false;
213
+ }
214
+ else if (arg === DRY_RUN_FLAG) {
215
+ dryRun = true;
216
+ }
217
+ else if (arg === YES_FLAG) {
218
+ // Accepted for scripting/CI; init has no interactive prompts today.
219
+ }
220
+ else {
221
+ return { kind: 'error', message: CLI_USAGE };
222
+ }
223
+ i++;
224
+ }
225
+ return { kind: 'ok', port, mcp, dryRun, install };
226
+ }
227
+ /** Pure CLI arg parser — exported for unit tests. argv = process.argv.slice(2). */
228
+ export function parseCliArgs(argv, defaultPort) {
229
+ if (argv.length === 0)
230
+ return { kind: 'serve', port: defaultPort, headless: true, http: false };
231
+ const [cmd, ...rest] = argv;
232
+ // `version` (or the conventional -v/--version flags) prints the running version — the diagnostic the
233
+ // troubleshooting docs lean on to confirm which npx-resolved build is actually executing.
234
+ if (cmd === VERSION_COMMAND || cmd === '--version' || cmd === '-v')
235
+ return { kind: 'version' };
236
+ switch (cmd) {
237
+ case INIT_COMMAND: {
238
+ const r = parseInitFlags(rest);
239
+ if (r.kind === 'error')
240
+ return r;
241
+ return { kind: 'init', port: r.port, mcp: r.mcp, dryRun: r.dryRun, install: r.install };
242
+ }
243
+ case SERVE_COMMAND: {
244
+ const r = parseServeFlags(rest, defaultPort);
245
+ if (r.kind === 'error')
246
+ return r;
247
+ return {
248
+ kind: 'serve',
249
+ port: r.port,
250
+ headless: r.headless,
251
+ http: r.http,
252
+ ...(r.driveUrl !== undefined ? { driveUrl: r.driveUrl } : {}),
253
+ ...(r.httpPort !== undefined ? { httpPort: r.httpPort } : {}),
254
+ ...(r.httpToken !== undefined ? { httpToken: r.httpToken } : {}),
255
+ };
256
+ }
257
+ case STOP_COMMAND: {
258
+ const port = parsePortFlag(rest, defaultPort);
259
+ const quiet = rest.includes(QUIET_FLAG);
260
+ return { kind: 'stop', port, quiet };
261
+ }
262
+ case STATUS_COMMAND: {
263
+ const port = parsePortFlag(rest, defaultPort);
264
+ return { kind: 'status', port };
265
+ }
266
+ case LICENSE_COMMAND:
267
+ return { kind: 'license' };
268
+ case OPEN_COMMAND: {
269
+ const port = parsePortFlag(rest, defaultPort);
270
+ // The first non-flag arg is the url (optional — omitting reuses a connected tab).
271
+ const url = rest.find((a) => !a.startsWith('--') && a !== String(port));
272
+ return url !== undefined ? { kind: 'open', port, url } : { kind: 'open', port };
273
+ }
274
+ case DRIVE_COMMAND: {
275
+ const r = parseDriveSuffix(rest, defaultPort);
276
+ if (r.kind === 'error')
277
+ return r;
278
+ return { kind: 'drive', port: r.port, driveUrl: r.driveUrl, headless: r.headless };
279
+ }
280
+ case DAEMON_INNER_COMMAND: {
281
+ const r = parseServeFlags(rest, defaultPort);
282
+ if (r.kind === 'error')
283
+ return r;
284
+ return {
285
+ kind: '_daemon',
286
+ port: r.port,
287
+ headless: r.headless,
288
+ http: r.http,
289
+ ...(r.driveUrl !== undefined ? { driveUrl: r.driveUrl } : {}),
290
+ ...(r.httpPort !== undefined ? { httpPort: r.httpPort } : {}),
291
+ ...(r.httpToken !== undefined ? { httpToken: r.httpToken } : {}),
292
+ };
293
+ }
294
+ case VERIFY_COMMAND: {
295
+ const r = parseVerifySuffix(rest);
296
+ if (r.kind === 'error')
297
+ return r;
298
+ return {
299
+ kind: 'verify',
300
+ url: r.url,
301
+ headless: r.headless,
302
+ ...(r.timeoutMs !== undefined ? { timeoutMs: r.timeoutMs } : {}),
303
+ ...(r.storageState !== undefined ? { storageState: r.storageState } : {}),
304
+ };
305
+ }
306
+ case MCP_COMMAND: {
307
+ const r = parseServeFlags(rest, defaultPort);
308
+ if (r.kind === 'error')
309
+ return r;
310
+ return {
311
+ kind: 'mcp',
312
+ port: r.port,
313
+ headless: r.headless,
314
+ ...(r.driveUrl !== undefined ? { driveUrl: r.driveUrl } : {}),
315
+ };
316
+ }
317
+ default:
318
+ return { kind: 'error', message: CLI_USAGE };
319
+ }
320
+ }
321
+ //# sourceMappingURL=cli-parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-parse.js","sourceRoot":"","sources":["../src/cli-parse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Port resolution for the reticle CLI. Split out so it can be unit-tested independently.
3
+ *
4
+ * Priority (highest → lowest):
5
+ * 1. --port flag (parsed by parseCliArgs, already overrides defaultPort)
6
+ * 2. RETICLE_PORT env var
7
+ * 3. .reticle.json "port" field in the cwd ← per-project isolation
8
+ * 4. RETICLE_DEFAULT_PORT (4400)
9
+ */
10
+ /**
11
+ * Read the port stored in the project's .reticle.json (written by `reticle init`).
12
+ * Returns undefined if the file is absent, unreadable, or has no valid numeric port.
13
+ */
14
+ export declare function readProjectPort(cwd: string): number | undefined;
15
+ /**
16
+ * Read the stable projectId stored in the project's .reticle.json (written by `reticle init`). The daemon
17
+ * uses it as the default resolve scope so auto-selection stays within the active app. Returns
18
+ * undefined if the file is absent/unreadable or has no non-empty string projectId.
19
+ */
20
+ export declare function readProjectId(cwd: string): string | undefined;
21
+ /**
22
+ * Resolve the daemon port from all available sources in priority order.
23
+ * Pass `portFlag` when the user explicitly supplied --port; pass `undefined` to fall through.
24
+ */
25
+ export declare function resolvePort(portFlag: number | undefined, envPort: number | undefined, projectPort: number | undefined, defaultPort: number): number;
26
+ //# sourceMappingURL=cli-port.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-port.d.ts","sourceRoot":"","sources":["../src/cli-port.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAY/D;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAY7D;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,WAAW,EAAE,MAAM,GAClB,MAAM,CAER"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Port resolution for the reticle CLI. Split out so it can be unit-tested independently.
3
+ *
4
+ * Priority (highest → lowest):
5
+ * 1. --port flag (parsed by parseCliArgs, already overrides defaultPort)
6
+ * 2. RETICLE_PORT env var
7
+ * 3. .reticle.json "port" field in the cwd ← per-project isolation
8
+ * 4. RETICLE_DEFAULT_PORT (4400)
9
+ */
10
+ import { readFileSync } from 'node:fs';
11
+ /**
12
+ * Read the port stored in the project's .reticle.json (written by `reticle init`).
13
+ * Returns undefined if the file is absent, unreadable, or has no valid numeric port.
14
+ */
15
+ export function readProjectPort(cwd) {
16
+ try {
17
+ const raw = readFileSync(`${cwd}/.reticle.json`, 'utf8');
18
+ const config = JSON.parse(raw);
19
+ if (typeof config === 'object' && config !== null) {
20
+ const p = config['port'];
21
+ if (typeof p === 'number' && Number.isInteger(p) && p > 0 && p < 65536)
22
+ return p;
23
+ }
24
+ }
25
+ catch {
26
+ // .reticle.json absent or unreadable — fall through to default
27
+ }
28
+ return undefined;
29
+ }
30
+ /**
31
+ * Read the stable projectId stored in the project's .reticle.json (written by `reticle init`). The daemon
32
+ * uses it as the default resolve scope so auto-selection stays within the active app. Returns
33
+ * undefined if the file is absent/unreadable or has no non-empty string projectId.
34
+ */
35
+ export function readProjectId(cwd) {
36
+ try {
37
+ const raw = readFileSync(`${cwd}/.reticle.json`, 'utf8');
38
+ const config = JSON.parse(raw);
39
+ if (typeof config === 'object' && config !== null) {
40
+ const id = config['projectId'];
41
+ if (typeof id === 'string' && id.length > 0)
42
+ return id;
43
+ }
44
+ }
45
+ catch {
46
+ // .reticle.json absent or unreadable — no default scope
47
+ }
48
+ return undefined;
49
+ }
50
+ /**
51
+ * Resolve the daemon port from all available sources in priority order.
52
+ * Pass `portFlag` when the user explicitly supplied --port; pass `undefined` to fall through.
53
+ */
54
+ export function resolvePort(portFlag, envPort, projectPort, defaultPort) {
55
+ return portFlag ?? envPort ?? projectPort ?? defaultPort;
56
+ }
57
+ //# sourceMappingURL=cli-port.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-port.js","sourceRoot":"","sources":["../src/cli-port.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,GAAG,gBAAgB,EAAE,MAAM,CAAC,CAAC;QACzD,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YAClD,MAAM,CAAC,GAAI,MAAkC,CAAC,MAAM,CAAC,CAAC;YACtD,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK;gBAAE,OAAO,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,+DAA+D;IACjE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,GAAG,gBAAgB,EAAE,MAAM,CAAC,CAAC;QACzD,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YAClD,MAAM,EAAE,GAAI,MAAkC,CAAC,WAAW,CAAC,CAAC;YAC5D,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,EAAE,CAAC;QACzD,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,wDAAwD;IAC1D,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CACzB,QAA4B,EAC5B,OAA2B,EAC3B,WAA+B,EAC/B,WAAmB;IAEnB,OAAO,QAAQ,IAAI,OAAO,IAAI,WAAW,IAAI,WAAW,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * `reticle verify <url>` — one-shot, non-MCP verification. It boots the engine in drive mode (Reticle owns
3
+ * a browser pointed at the preview URL), waits for the in-page SDK to dial back, replays every saved
4
+ * flow, renders the verdict, and exits 0 on pass / 1 otherwise. The same ReticleRunner + verdict the MCP
5
+ * and HTTP paths use — so a platform/CI agent that can only run a shell command (Lovable, Emergent,
6
+ * GitHub Actions) gets a byte-identical artifact without speaking MCP.
7
+ *
8
+ * The orchestration (runVerify) is split from the live wiring (openLiveConnection) behind VerifyPorts,
9
+ * so the decision logic — including the two honesty guards (no session, no flows ⇒ never a green pass)
10
+ * — is unit-tested without launching a real browser.
11
+ */
12
+ import { type ReticleVerificationRun } from '@reticlehq/core';
13
+ /** The live capabilities runVerify needs — faked in tests so the logic runs without a browser. */
14
+ export interface VerifyConnection {
15
+ /** Resolve true once a browser session has connected, or false at timeout. */
16
+ sessionReady(timeoutMs: number): Promise<boolean>;
17
+ listFlows(): Promise<string[]>;
18
+ verify(): Promise<ReticleVerificationRun>;
19
+ close(): Promise<void>;
20
+ }
21
+ export interface VerifyPorts {
22
+ connect: () => Promise<VerifyConnection>;
23
+ out: (line: string) => void;
24
+ fail: (line: string) => void;
25
+ exit: (code: number) => void;
26
+ }
27
+ interface VerifyArgs {
28
+ url: string;
29
+ timeoutMs: number;
30
+ }
31
+ /** Orchestration: boot → wait for a session → replay flows → verdict → exit code. Browser-free. */
32
+ export declare function runVerify(args: VerifyArgs, ports: VerifyPorts): Promise<void>;
33
+ /** Split a drive URL into its origin + whether it's loopback — decides token/injection pairing. */
34
+ export declare function urlParts(url: string): {
35
+ origin?: string;
36
+ loopback: boolean;
37
+ };
38
+ /** CLI entry — wires the live ports and runs the one-shot verification. Exits the process itself. */
39
+ export declare function handleVerify(parsed: {
40
+ url: string;
41
+ headless: boolean;
42
+ timeoutMs?: number;
43
+ storageState?: string;
44
+ }): void;
45
+ export {};
46
+ //# sourceMappingURL=cli-verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-verify.d.ts","sourceRoot":"","sources":["../src/cli-verify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,EAUL,KAAK,sBAAsB,EAC5B,MAAM,iBAAiB,CAAC;AA8BzB,kGAAkG;AAClG,MAAM,WAAW,gBAAgB;IAC/B,8EAA8E;IAC9E,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClD,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/B,MAAM,IAAI,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC1C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACzC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B;AAED,UAAU,UAAU;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CACnB;AAgBD,mGAAmG;AACnG,wBAAsB,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBnF;AA8CD,mGAAmG;AACnG,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAO5E;AA6CD,qGAAqG;AACrG,wBAAgB,YAAY,CAAC,MAAM,EAAE;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG,IAAI,CAsBP"}
@@ -0,0 +1,181 @@
1
+ /**
2
+ * `reticle verify <url>` — one-shot, non-MCP verification. It boots the engine in drive mode (Reticle owns
3
+ * a browser pointed at the preview URL), waits for the in-page SDK to dial back, replays every saved
4
+ * flow, renders the verdict, and exits 0 on pass / 1 otherwise. The same ReticleRunner + verdict the MCP
5
+ * and HTTP paths use — so a platform/CI agent that can only run a shell command (Lovable, Emergent,
6
+ * GitHub Actions) gets a byte-identical artifact without speaking MCP.
7
+ *
8
+ * The orchestration (runVerify) is split from the live wiring (openLiveConnection) behind VerifyPorts,
9
+ * so the decision logic — including the two honesty guards (no session, no flows ⇒ never a green pass)
10
+ * — is unit-tested without launching a real browser.
11
+ */
12
+ import { join, basename } from 'node:path';
13
+ import { randomUUID } from 'node:crypto';
14
+ import { RETICLE_DEFAULT_PORT, RETICLE_WS_PATH, isLoopbackHostname, ReticleDir, RunAgentKind, RunFramework, RunProfile, RunTrigger, VerdictStatus, } from '@reticlehq/core';
15
+ import { start } from './index.js';
16
+ import { ReticleRunner } from './runs/reticle-runner.js';
17
+ import { createRunnerPort } from './runs/runner-port.js';
18
+ import { renderRunReport } from './runs/render-report.js';
19
+ import { BaselineStore } from './project/baselines.js';
20
+ import { RecordingStore } from './flows/recordings.js';
21
+ import { FlowStore } from './flows/flows.js';
22
+ import { ProjectStore } from './project/project-store.js';
23
+ import { AnnotationStore } from './flows/annotation-store.js';
24
+ import { createNodeFileSystem } from './project/fs-port.js';
25
+ const EXIT_PASS = 0;
26
+ const EXIT_FAIL = 1;
27
+ const DEFAULT_SESSION_TIMEOUT_MS = 15_000;
28
+ const SESSION_POLL_MS = 250;
29
+ const DEFAULT_PROJECT_NAME = 'app';
30
+ const VERIFY_AGENT_ID = 'reticle-cli';
31
+ const MSG_NO_SESSION = 'No app connected — Reticle drove the URL but no @reticlehq/browser session dialed back.\n' +
32
+ ' Make sure the SDK is in the build and reticle.connect() runs on the preview page' +
33
+ ' (for a non-localhost preview: allowNonLocalhost + a pairing token).';
34
+ const MSG_NO_FLOWS = 'No saved flows to verify (.reticle/flows is empty) — refusing to report a pass for verifying nothing.\n' +
35
+ ' Record a flow first (reticle_record_start → act → reticle_flow_save), then re-run verify.';
36
+ const MSG_VERIFY_PREFIX = 'verify failed: ';
37
+ function errMessage(error) {
38
+ return error instanceof Error ? error.message : String(error);
39
+ }
40
+ async function openConnection(ports) {
41
+ try {
42
+ return await ports.connect();
43
+ }
44
+ catch (error) {
45
+ ports.fail(MSG_VERIFY_PREFIX + errMessage(error));
46
+ ports.exit(EXIT_FAIL);
47
+ return undefined;
48
+ }
49
+ }
50
+ /** Orchestration: boot → wait for a session → replay flows → verdict → exit code. Browser-free. */
51
+ export async function runVerify(args, ports) {
52
+ const conn = await openConnection(ports);
53
+ if (conn === undefined)
54
+ return;
55
+ try {
56
+ const ready = await conn.sessionReady(args.timeoutMs);
57
+ if (!ready) {
58
+ ports.fail(MSG_NO_SESSION);
59
+ ports.exit(EXIT_FAIL);
60
+ return;
61
+ }
62
+ const names = await conn.listFlows();
63
+ if (names.length === 0) {
64
+ ports.fail(MSG_NO_FLOWS);
65
+ ports.exit(EXIT_FAIL);
66
+ return;
67
+ }
68
+ const run = await conn.verify();
69
+ ports.out(renderRunReport(run));
70
+ ports.exit(run.verdict.status === VerdictStatus.PASS ? EXIT_PASS : EXIT_FAIL);
71
+ }
72
+ catch (error) {
73
+ ports.fail(MSG_VERIFY_PREFIX + errMessage(error));
74
+ ports.exit(EXIT_FAIL);
75
+ }
76
+ finally {
77
+ await conn.close().catch(() => undefined);
78
+ }
79
+ }
80
+ function delay(ms) {
81
+ return new Promise((resolve) => setTimeout(resolve, ms));
82
+ }
83
+ async function waitForSession(sessions, timeoutMs, now) {
84
+ const deadline = now() + timeoutMs;
85
+ while (now() < deadline) {
86
+ if (sessions.count() > 0)
87
+ return true;
88
+ await delay(SESSION_POLL_MS);
89
+ }
90
+ return sessions.count() > 0;
91
+ }
92
+ /** Reconstruct the disk-backed ToolDeps over the live bridge + driven browser the daemon owns. */
93
+ function buildVerifyDeps(running, reticleRoot, now) {
94
+ const fs = createNodeFileSystem();
95
+ const deps = {
96
+ sessions: running.bridge.sessions,
97
+ baselines: new BaselineStore(),
98
+ recordings: new RecordingStore(),
99
+ flows: new FlowStore(fs, reticleRoot, { now }),
100
+ annotations: new AnnotationStore(),
101
+ project: new ProjectStore(fs, reticleRoot, { now }),
102
+ fs,
103
+ reticleRoot,
104
+ now,
105
+ };
106
+ if (running.realInput !== undefined)
107
+ deps.realInput = running.realInput;
108
+ return deps;
109
+ }
110
+ /** Split a drive URL into its origin + whether it's loopback — decides token/injection pairing. */
111
+ export function urlParts(url) {
112
+ try {
113
+ const u = new URL(url);
114
+ return { origin: u.origin, loopback: isLoopbackHostname(u.hostname) };
115
+ }
116
+ catch {
117
+ return { loopback: false };
118
+ }
119
+ }
120
+ async function openLiveConnection(opts) {
121
+ // A localhost preview connects natively (the app's own reticle.connect() is allowed on loopback), so the
122
+ // bridge stays token-free. A HOSTED (non-localhost) preview is blocked by the SDK's connection policy
123
+ // and rejected as a foreign origin — so there we pair via a one-shot token both the bridge and the
124
+ // injected reticle.connect() share, plus the preview's origin on the allow-list. That split is what makes
125
+ // both "verify my dev server" and "verify a live Lovable URL" work from the same command.
126
+ const { origin, loopback } = urlParts(opts.url);
127
+ const pairing = loopback
128
+ ? {}
129
+ : (() => {
130
+ const token = randomUUID();
131
+ const bridgeUrl = `ws://localhost:${String(RETICLE_DEFAULT_PORT)}${RETICLE_WS_PATH}`;
132
+ return {
133
+ token,
134
+ injectConnect: { token, url: bridgeUrl },
135
+ ...(origin !== undefined ? { allowedOrigins: [origin] } : {}),
136
+ };
137
+ })();
138
+ const running = await start({
139
+ driveUrl: opts.url,
140
+ headless: opts.headless,
141
+ mcp: false,
142
+ reticleRoot: opts.reticleRoot,
143
+ now: opts.now,
144
+ ...pairing,
145
+ ...(opts.storageState !== undefined ? { storageState: opts.storageState } : {}),
146
+ });
147
+ const deps = buildVerifyDeps(running, opts.reticleRoot, opts.now);
148
+ const runner = new ReticleRunner(createRunnerPort(deps));
149
+ return {
150
+ sessionReady: (timeoutMs) => waitForSession(deps.sessions, timeoutMs, opts.now),
151
+ listFlows: () => deps.flows.list(),
152
+ verify: () => runner.verify({
153
+ project: { name: opts.projectName, framework: RunFramework.OTHER, previewUrl: opts.url },
154
+ agent: { id: VERIFY_AGENT_ID, kind: RunAgentKind.OEM_PIPELINE },
155
+ trigger: { kind: RunTrigger.OEM },
156
+ profile: RunProfile.PROD_PREVIEW,
157
+ }),
158
+ close: () => running.close(),
159
+ };
160
+ }
161
+ /** CLI entry — wires the live ports and runs the one-shot verification. Exits the process itself. */
162
+ export function handleVerify(parsed) {
163
+ const now = () => Date.now();
164
+ const reticleRoot = join(process.cwd(), ReticleDir.ROOT);
165
+ const projectName = basename(process.cwd()) || DEFAULT_PROJECT_NAME;
166
+ const ports = {
167
+ connect: () => openLiveConnection({
168
+ url: parsed.url,
169
+ headless: parsed.headless,
170
+ reticleRoot,
171
+ projectName,
172
+ now,
173
+ ...(parsed.storageState !== undefined ? { storageState: parsed.storageState } : {}),
174
+ }),
175
+ out: (line) => process.stdout.write(`${line}\n`),
176
+ fail: (line) => process.stderr.write(`${line}\n`),
177
+ exit: (code) => process.exit(code),
178
+ };
179
+ void runVerify({ url: parsed.url, timeoutMs: parsed.timeoutMs ?? DEFAULT_SESSION_TIMEOUT_MS }, ports);
180
+ }
181
+ //# sourceMappingURL=cli-verify.js.map