@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,144 @@
1
+ import { join } from 'node:path';
2
+ import { CONTRACT_FILE_VERSION, ContractFileSchema, ContractReadError, FLOW_NAME_PATTERN, ReticleDir, } from '@reticlehq/core';
3
+ export function reticleDirPaths(root) {
4
+ return {
5
+ root,
6
+ contract: join(root, ReticleDir.CONTRACT_FILE),
7
+ flows: join(root, ReticleDir.FLOWS_SUBDIR),
8
+ baselines: join(root, ReticleDir.BASELINES_SUBDIR),
9
+ project: join(root, ReticleDir.PROJECT_FILE),
10
+ visual: join(root, ReticleDir.VISUAL_SUBDIR),
11
+ runs: join(root, ReticleDir.RUNS_SUBDIR),
12
+ };
13
+ }
14
+ /** The verification-run artifact path for `runId` (.reticle/runs/<runId>.json). */
15
+ export function runPath(root, runId) {
16
+ return join(root, ReticleDir.RUNS_SUBDIR, `${runId}.json`);
17
+ }
18
+ /**
19
+ * A runId must be a single safe path segment — same guard as flow names (rejects '../', '/', '\\',
20
+ * absolute, dotfiles). uuid-style ids (hyphens/underscores) pass. Guards every disk op before join.
21
+ */
22
+ export function isValidRunId(runId) {
23
+ return FLOW_NAME_PATTERN.test(runId) && !runId.includes('..');
24
+ }
25
+ /** The PNG baseline path for `name` (.reticle/visual/<name>.png). */
26
+ export function visualPath(root, name) {
27
+ return join(root, ReticleDir.VISUAL_SUBDIR, `${name}.png`);
28
+ }
29
+ /** The overlay-diff PNG path for `name` (.reticle/visual/<name>.diff.png). */
30
+ export function visualDiffPath(root, name) {
31
+ return join(root, ReticleDir.VISUAL_SUBDIR, `${name}.diff.png`);
32
+ }
33
+ /**
34
+ * Path to a flow file. With a `projectId`, the flow lives in a per-project subdir
35
+ * (`.reticle/flows/<projectId>/<name>.json`) so a shared daemon serving many apps can't collide two
36
+ * apps' flows of the same name; without one it's the flat legacy path (`.reticle/flows/<name>.json`),
37
+ * which is also where pre-existing (untagged) flows stay. Callers pass ONLY a validated projectId.
38
+ */
39
+ export function flowPath(root, name, projectId) {
40
+ const flowsDir = join(root, ReticleDir.FLOWS_SUBDIR);
41
+ return projectId === undefined
42
+ ? join(flowsDir, `${name}.json`)
43
+ : join(flowsDir, projectId, `${name}.json`);
44
+ }
45
+ /** The directory a flow write targets: the per-project subdir, or the flat flows root for global. */
46
+ export function flowDir(root, projectId) {
47
+ const flowsDir = join(root, ReticleDir.FLOWS_SUBDIR);
48
+ return projectId === undefined ? flowsDir : join(flowsDir, projectId);
49
+ }
50
+ /**
51
+ * A flow name must be a single safe path segment — rejects '../', '/', '\\', absolute, dotfiles.
52
+ * Guards every disk op before a path is ever joined, so a traversal name never escapes .reticle/.
53
+ */
54
+ export function isValidFlowName(name) {
55
+ return FLOW_NAME_PATTERN.test(name) && !name.includes('..');
56
+ }
57
+ export function baselinePath(root, name) {
58
+ return join(root, ReticleDir.BASELINES_SUBDIR, `${name}.json`);
59
+ }
60
+ /** Idempotent: creates .reticle/, .reticle/flows/, .reticle/baselines/ (recursive mkdir → safe to re-run). */
61
+ export async function ensureReticleDir(fs, root) {
62
+ const p = reticleDirPaths(root);
63
+ await fs.mkdir(p.root);
64
+ await fs.mkdir(p.flows);
65
+ await fs.mkdir(p.baselines);
66
+ }
67
+ const JSON_INDENT = 2;
68
+ /**
69
+ * Serialize capabilities into a byte-stable, diffable string: arrays sorted lexicographically,
70
+ * flows sorted by name, object keys emitted in a fixed declared order (NOT insertion order),
71
+ * 2-space indent, trailing newline. Two semantically-equal registries → identical bytes.
72
+ */
73
+ function stableSerialize(capabilities, generatedAt) {
74
+ const envelope = {
75
+ version: CONTRACT_FILE_VERSION,
76
+ generatedAt,
77
+ capabilities: {
78
+ testids: [...capabilities.testids].sort(),
79
+ signals: [...capabilities.signals].sort(),
80
+ stores: [...capabilities.stores].sort(),
81
+ flows: [...capabilities.flows]
82
+ .map((f) => ({ name: f.name, steps: [...f.steps] }))
83
+ .sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0)),
84
+ ...(capabilities.governance !== undefined
85
+ ? { governance: serializeGovernance(capabilities.governance) }
86
+ : {}),
87
+ },
88
+ };
89
+ return `${JSON.stringify(envelope, null, JSON_INDENT)}\n`;
90
+ }
91
+ /** Field-ordered, sorted rebuild of declared governance for byte-stable serialization. */
92
+ function serializeGovernance(g) {
93
+ return {
94
+ ...(g.owner !== undefined ? { owner: g.owner } : {}),
95
+ ...(g.safety !== undefined ? { safety: [...g.safety].sort() } : {}),
96
+ ...(g.scope !== undefined ? { scope: [...g.scope].sort() } : {}),
97
+ ...(g.redact !== undefined ? { redact: [...g.redact].sort() } : {}),
98
+ ...(g.risk !== undefined
99
+ ? {
100
+ risk: [...g.risk]
101
+ .map((z) => ({
102
+ surface: z.surface,
103
+ ...(z.paths !== undefined ? { paths: [...z.paths].sort() } : {}),
104
+ ...(z.note !== undefined ? { note: z.note } : {}),
105
+ }))
106
+ .sort((a, b) => (a.surface < b.surface ? -1 : a.surface > b.surface ? 1 : 0)),
107
+ }
108
+ : {}),
109
+ };
110
+ }
111
+ /** Write the contract to .reticle/contract.json (auto-creating .reticle/ first). */
112
+ export async function writeContract(fs, root, capabilities, now) {
113
+ await ensureReticleDir(fs, root);
114
+ await fs.writeFile(reticleDirPaths(root).contract, stableSerialize(capabilities, now()));
115
+ }
116
+ /** Never throws. Missing → MISSING. Bad JSON / failed schema → MALFORMED. */
117
+ export async function readContract(fs, root) {
118
+ const path = reticleDirPaths(root).contract;
119
+ if (!(await fs.exists(path)))
120
+ return { ok: false, reason: ContractReadError.MISSING };
121
+ let text;
122
+ try {
123
+ text = await fs.readFile(path);
124
+ }
125
+ catch (error) {
126
+ // Handles the exists/read TOCTOU race: a vanished file reads as MISSING, anything else MALFORMED.
127
+ return {
128
+ ok: false,
129
+ reason: fs.isNotFound(error) ? ContractReadError.MISSING : ContractReadError.MALFORMED,
130
+ };
131
+ }
132
+ let parsed;
133
+ try {
134
+ parsed = JSON.parse(text);
135
+ }
136
+ catch {
137
+ return { ok: false, reason: ContractReadError.MALFORMED };
138
+ }
139
+ const result = ContractFileSchema.safeParse(parsed);
140
+ if (!result.success)
141
+ return { ok: false, reason: ContractReadError.MALFORMED };
142
+ return { ok: true, capabilities: result.data.capabilities, generatedAt: result.data.generatedAt };
143
+ }
144
+ //# sourceMappingURL=reticle-dir.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reticle-dir.js","sourceRoot":"","sources":["../../src/project/reticle-dir.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * The verification-run assembler. A PURE mapping from already-produced verification results
3
+ * (flow-replay outcomes, standalone checks, risks, evidence, repair packets) into the stable
4
+ * ReticleVerificationRun artifact, with a deterministic verdict computed here. The clock is injected
5
+ * (the single `createdAt` site — never Date.now() in logic, per rule 7). Gathering the inputs from a
6
+ * live session is a separate adapter concern; this file owns the shape + the verdict rules so both
7
+ * the MCP path and the programmatic Replay/Verify API produce byte-identical verdicts.
8
+ */
9
+ import { type ReticleVerificationRun, type RunVerdict } from '@reticlehq/core';
10
+ /**
11
+ * Everything a caller supplies; schemaVersion/createdAt/verdict are filled/computed by the builder.
12
+ * runId is a plain string here (string in) — the schema brands it to RunId on the way out (branded out),
13
+ * so construction sites stay ergonomic while consumers get the nominal type.
14
+ */
15
+ export type VerificationRunInput = Omit<ReticleVerificationRun, 'schemaVersion' | 'createdAt' | 'verdict' | 'runId'> & {
16
+ runId: string;
17
+ };
18
+ /**
19
+ * Compute the verdict deterministically from the run's flows, checks, and risks.
20
+ * Rules (in order): a gated risk blocks → FAIL; mixed pass+fail → PARTIAL; any fail → FAIL; else PASS.
21
+ * Confidence: nothing ran → LOW; an oracle-backed flow or any check ran → HIGH; only smoke → MEDIUM.
22
+ */
23
+ export declare function computeVerdict(input: VerificationRunInput): RunVerdict;
24
+ /**
25
+ * Assemble the final, schema-valid ReticleVerificationRun. Stamps schemaVersion + createdAt (injected
26
+ * clock) and computes the verdict; the result is parsed through the protocol schema so a malformed
27
+ * input can never escape as an "artifact".
28
+ */
29
+ export declare function buildVerificationRun(input: VerificationRunInput, now: () => number): ReticleVerificationRun;
30
+ //# sourceMappingURL=build-verification-run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-verification-run.d.ts","sourceRoot":"","sources":["../../src/runs/build-verification-run.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAOL,KAAK,sBAAsB,EAC3B,KAAK,UAAU,EAChB,MAAM,iBAAiB,CAAC;AAGzB;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAAG,IAAI,CACrC,sBAAsB,EACtB,eAAe,GAAG,WAAW,GAAG,SAAS,GAAG,OAAO,CACpD,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtB;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,oBAAoB,GAAG,UAAU,CAwCtE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,oBAAoB,EAC3B,GAAG,EAAE,MAAM,MAAM,GAChB,sBAAsB,CAQxB"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * The verification-run assembler. A PURE mapping from already-produced verification results
3
+ * (flow-replay outcomes, standalone checks, risks, evidence, repair packets) into the stable
4
+ * ReticleVerificationRun artifact, with a deterministic verdict computed here. The clock is injected
5
+ * (the single `createdAt` site — never Date.now() in logic, per rule 7). Gathering the inputs from a
6
+ * live session is a separate adapter concern; this file owns the shape + the verdict rules so both
7
+ * the MCP path and the programmatic Replay/Verify API produce byte-identical verdicts.
8
+ */
9
+ import { ReticleVerificationRunSchema, RUN_FILE_VERSION, RunCheckStatus, RunConfidence, RunFlowStatus, VerdictStatus, } from '@reticlehq/core';
10
+ import { redactForProfile } from './profile-redact.js';
11
+ /**
12
+ * Compute the verdict deterministically from the run's flows, checks, and risks.
13
+ * Rules (in order): a gated risk blocks → FAIL; mixed pass+fail → PARTIAL; any fail → FAIL; else PASS.
14
+ * Confidence: nothing ran → LOW; an oracle-backed flow or any check ran → HIGH; only smoke → MEDIUM.
15
+ */
16
+ export function computeVerdict(input) {
17
+ const passes = input.flows.filter((f) => f.status === RunFlowStatus.PASS || f.status === RunFlowStatus.HEALED)
18
+ .length + input.checks.filter((c) => c.status === RunCheckStatus.PASS).length;
19
+ const fails = input.flows.filter((f) => f.status === RunFlowStatus.FAIL).length +
20
+ input.checks.filter((c) => c.status === RunCheckStatus.FAIL).length;
21
+ const blockingRisks = input.risks.filter((r) => r.gated).length;
22
+ const reasons = [];
23
+ for (const f of input.flows) {
24
+ if (f.status === RunFlowStatus.FAIL) {
25
+ reasons.push(f.failureReason !== undefined
26
+ ? `flow ${f.name}: ${f.failureReason}`
27
+ : `flow ${f.name} failed`);
28
+ }
29
+ }
30
+ for (const c of input.checks) {
31
+ if (c.status === RunCheckStatus.FAIL)
32
+ reasons.push(`check failed: ${c.predicate}`);
33
+ }
34
+ for (const r of input.risks) {
35
+ if (r.gated)
36
+ reasons.push(`blocked: ${r.surface} risk — ${r.detail}`);
37
+ }
38
+ let status;
39
+ if (blockingRisks > 0)
40
+ status = VerdictStatus.FAIL;
41
+ else if (fails > 0 && passes > 0)
42
+ status = VerdictStatus.PARTIAL;
43
+ else if (fails > 0)
44
+ status = VerdictStatus.FAIL;
45
+ else
46
+ status = VerdictStatus.PASS;
47
+ const ran = input.flows.length + input.checks.length;
48
+ let confidence;
49
+ if (ran === 0)
50
+ confidence = RunConfidence.LOW;
51
+ else if (input.flows.some((f) => f.oracle !== undefined) || input.checks.length > 0)
52
+ confidence = RunConfidence.HIGH;
53
+ else
54
+ confidence = RunConfidence.MEDIUM;
55
+ return { status, reasons, confidence, blockingRisks };
56
+ }
57
+ /**
58
+ * Assemble the final, schema-valid ReticleVerificationRun. Stamps schemaVersion + createdAt (injected
59
+ * clock) and computes the verdict; the result is parsed through the protocol schema so a malformed
60
+ * input can never escape as an "artifact".
61
+ */
62
+ export function buildVerificationRun(input, now) {
63
+ const run = {
64
+ schemaVersion: RUN_FILE_VERSION,
65
+ createdAt: now(),
66
+ verdict: computeVerdict(input),
67
+ ...input,
68
+ };
69
+ return redactForProfile(ReticleVerificationRunSchema.parse(run));
70
+ }
71
+ //# sourceMappingURL=build-verification-run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-verification-run.js","sourceRoot":"","sources":["../../src/runs/build-verification-run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Profile gating for the verification-run artifact. A DEV run keeps everything (it stays on the
3
+ * developer's machine). A PROD_PREVIEW run is one a host may surface downstream (attach to a deploy,
4
+ * show an end customer), so it must not leak the app's internals: the repair packets (which name
5
+ * source files + carry fix instructions) are dropped, and app-state assertion values are redacted.
6
+ * The trustworthy summary — verdict, flows, risks, counts — is preserved. Pure; keyed on run.profile.
7
+ */
8
+ import { type ReticleVerificationRun } from '@reticlehq/core';
9
+ /** Marker left in place of a redacted value so a consumer can tell it was withheld, not absent. */
10
+ export declare const REDACTED = "[redacted:prod-preview]";
11
+ /**
12
+ * Return the run unchanged for DEV; for PROD_PREVIEW return a copy with dev-only fields removed:
13
+ * the repair block (source-naming) is dropped and stateAssertion values are redacted.
14
+ */
15
+ export declare function redactForProfile(run: ReticleVerificationRun): ReticleVerificationRun;
16
+ //# sourceMappingURL=profile-redact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-redact.d.ts","sourceRoot":"","sources":["../../src/runs/profile-redact.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAc,KAAK,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAE1E,mGAAmG;AACnG,eAAO,MAAM,QAAQ,4BAA4B,CAAC;AAElD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,sBAAsB,GAAG,sBAAsB,CAiBpF"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Profile gating for the verification-run artifact. A DEV run keeps everything (it stays on the
3
+ * developer's machine). A PROD_PREVIEW run is one a host may surface downstream (attach to a deploy,
4
+ * show an end customer), so it must not leak the app's internals: the repair packets (which name
5
+ * source files + carry fix instructions) are dropped, and app-state assertion values are redacted.
6
+ * The trustworthy summary — verdict, flows, risks, counts — is preserved. Pure; keyed on run.profile.
7
+ */
8
+ import { RunProfile } from '@reticlehq/core';
9
+ /** Marker left in place of a redacted value so a consumer can tell it was withheld, not absent. */
10
+ export const REDACTED = '[redacted:prod-preview]';
11
+ /**
12
+ * Return the run unchanged for DEV; for PROD_PREVIEW return a copy with dev-only fields removed:
13
+ * the repair block (source-naming) is dropped and stateAssertion values are redacted.
14
+ */
15
+ export function redactForProfile(run) {
16
+ if (run.profile !== RunProfile.PROD_PREVIEW)
17
+ return run;
18
+ const evidence = {
19
+ ...run.evidence,
20
+ stateAssertions: run.evidence.stateAssertions.map((s) => ({
21
+ store: s.store,
22
+ path: s.path,
23
+ expected: REDACTED,
24
+ actual: REDACTED,
25
+ ok: s.ok,
26
+ })),
27
+ };
28
+ const { repair, ...rest } = run;
29
+ void repair; // intentionally dropped — fix instructions name source files
30
+ return { ...rest, evidence };
31
+ }
32
+ //# sourceMappingURL=profile-redact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-redact.js","sourceRoot":"","sources":["../../src/runs/profile-redact.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAA+B,MAAM,iBAAiB,CAAC;AAE1E,mGAAmG;AACnG,MAAM,CAAC,MAAM,QAAQ,GAAG,yBAAyB,CAAC;AAElD;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAA2B;IAC1D,IAAI,GAAG,CAAC,OAAO,KAAK,UAAU,CAAC,YAAY;QAAE,OAAO,GAAG,CAAC;IAExD,MAAM,QAAQ,GAAG;QACf,GAAG,GAAG,CAAC,QAAQ;QACf,eAAe,EAAE,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACxD,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,QAAQ,EAAE,QAAQ;YAClB,MAAM,EAAE,QAAQ;YAChB,EAAE,EAAE,CAAC,CAAC,EAAE;SACT,CAAC,CAAC;KACJ,CAAC;IAEF,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,CAAC;IAChC,KAAK,MAAM,CAAC,CAAC,6DAA6D;IAC1E,OAAO,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Render an ReticleVerificationRun into a legible human/agent-facing report — the "is this actually
3
+ * useful?" moment. Pure + deterministic (no clock, no IO): the same run renders the same text, so it's
4
+ * safe in CI and as a partner-facing artifact. Raw JSON is the contract; this is the read.
5
+ */
6
+ import { type ReticleVerificationRun } from '@reticlehq/core';
7
+ /** Render the run as a plain-text report. Sections with no content are omitted. */
8
+ export declare function renderRunReport(run: ReticleVerificationRun): string;
9
+ //# sourceMappingURL=render-report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-report.d.ts","sourceRoot":"","sources":["../../src/runs/render-report.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAIL,KAAK,sBAAsB,EAI5B,MAAM,iBAAiB,CAAC;AA+BzB,mFAAmF;AACnF,wBAAgB,eAAe,CAAC,GAAG,EAAE,sBAAsB,GAAG,MAAM,CA6CnE"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Render an ReticleVerificationRun into a legible human/agent-facing report — the "is this actually
3
+ * useful?" moment. Pure + deterministic (no clock, no IO): the same run renders the same text, so it's
4
+ * safe in CI and as a partner-facing artifact. Raw JSON is the contract; this is the read.
5
+ */
6
+ import { RunCheckStatus, RunFlowStatus, VerdictStatus, } from '@reticlehq/core';
7
+ const VERDICT_GLYPH = {
8
+ [VerdictStatus.PASS]: '✓ PASS',
9
+ [VerdictStatus.FAIL]: '✗ FAIL',
10
+ [VerdictStatus.PARTIAL]: '◑ PARTIAL',
11
+ };
12
+ const flowGlyph = (s) => s === RunFlowStatus.PASS
13
+ ? '✓'
14
+ : s === RunFlowStatus.HEALED
15
+ ? '✓~'
16
+ : s === RunFlowStatus.SKIPPED
17
+ ? '–'
18
+ : '✗';
19
+ function flowLine(f) {
20
+ const head = ` ${flowGlyph(f.status)} ${f.name} (${f.steps} steps, ${f.durationMs}ms)`;
21
+ return f.failureReason !== undefined ? `${head} — ${f.failureReason}` : head;
22
+ }
23
+ function checkLine(c) {
24
+ const glyph = c.status === RunCheckStatus.PASS ? '✓' : '✗';
25
+ return ` ${glyph} ${c.kind}: ${c.predicate}`;
26
+ }
27
+ function riskLine(r) {
28
+ return ` ⚠ ${r.surface} (${r.severity})${r.gated ? ' [GATED]' : ''} — ${r.detail}`;
29
+ }
30
+ /** Render the run as a plain-text report. Sections with no content are omitted. */
31
+ export function renderRunReport(run) {
32
+ const out = [];
33
+ out.push(`Reticle verification — ${run.project.name} [${run.profile}]`);
34
+ out.push(`Verdict: ${VERDICT_GLYPH[run.verdict.status]} · confidence: ${run.verdict.confidence}` +
35
+ (run.verdict.blockingRisks > 0 ? ` · ${run.verdict.blockingRisks} blocking risk(s)` : ''));
36
+ if (run.flows.length > 0) {
37
+ const passed = run.flows.filter((f) => f.status === RunFlowStatus.PASS || f.status === RunFlowStatus.HEALED).length;
38
+ out.push('', `Flows: ${passed}/${run.flows.length} passed`);
39
+ for (const f of run.flows)
40
+ out.push(flowLine(f));
41
+ }
42
+ const failedChecks = run.checks.filter((c) => c.status === RunCheckStatus.FAIL);
43
+ if (run.checks.length > 0) {
44
+ out.push('', `Checks: ${run.checks.length - failedChecks.length}/${run.checks.length} passed`);
45
+ for (const c of run.checks)
46
+ out.push(checkLine(c));
47
+ }
48
+ if (run.risks.length > 0) {
49
+ out.push('', 'Risks:');
50
+ for (const r of run.risks)
51
+ out.push(riskLine(r));
52
+ }
53
+ const packets = run.repair?.failurePackets ?? [];
54
+ if (packets.length > 0) {
55
+ out.push('', 'How to fix:');
56
+ for (const p of packets) {
57
+ const where = p.sourceLocation !== undefined
58
+ ? ` (${p.sourceLocation.file}${p.sourceLocation.line !== undefined ? `:${p.sourceLocation.line}` : ''})`
59
+ : '';
60
+ out.push(` → ${p.flow ?? 'check'}${where}: ${p.suggestedPrompt}`);
61
+ }
62
+ }
63
+ if (run.verdict.status !== VerdictStatus.PASS && run.verdict.reasons.length > 0) {
64
+ out.push('', 'Why it failed:');
65
+ for (const reason of run.verdict.reasons)
66
+ out.push(` - ${reason}`);
67
+ }
68
+ return out.join('\n');
69
+ }
70
+ //# sourceMappingURL=render-report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-report.js","sourceRoot":"","sources":["../../src/runs/render-report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Repair-packet generation — turn a failed flow replay into a concise, paste-ready instruction the
3
+ * host's coding agent can act on to close its own loop. Pure + deterministic (no LLM): it lifts the
4
+ * already-computed decision envelope (whatChanged / whereInSource / nextAction) into the artifact's
5
+ * RepairPacket shape. This is the OEM self-heal value — a verdict that also says how to fix.
6
+ */
7
+ import { type FlowReplayResult, type RepairPacket } from '@reticlehq/core';
8
+ /**
9
+ * Build a repair packet for a failed replay, or undefined when the flow passed. The actual cause is
10
+ * the decision's whatChanged, falling back to the replay error or a generic message.
11
+ */
12
+ export declare function buildRepairPacket(replay: FlowReplayResult): RepairPacket | undefined;
13
+ /** Build the repair packets for a set of replays (failed ones only). */
14
+ export declare function buildRepairPackets(replays: ReadonlyArray<FlowReplayResult>): RepairPacket[];
15
+ //# sourceMappingURL=repair-prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repair-prompt.d.ts","sourceRoot":"","sources":["../../src/runs/repair-prompt.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAEL,KAAK,gBAAgB,EAErB,KAAK,YAAY,EAElB,MAAM,iBAAiB,CAAC;AAgCzB;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,GAAG,YAAY,GAAG,SAAS,CAiBpF;AAED,wEAAwE;AACxE,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,aAAa,CAAC,gBAAgB,CAAC,GAAG,YAAY,EAAE,CAE3F"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Repair-packet generation — turn a failed flow replay into a concise, paste-ready instruction the
3
+ * host's coding agent can act on to close its own loop. Pure + deterministic (no LLM): it lifts the
4
+ * already-computed decision envelope (whatChanged / whereInSource / nextAction) into the artifact's
5
+ * RepairPacket shape. This is the OEM self-heal value — a verdict that also says how to fix.
6
+ */
7
+ import { ReplayStatus, } from '@reticlehq/core';
8
+ /** The step a replay broke at — drift takes precedence (the legible cause), else first non-ok step. */
9
+ function failingStepNumber(steps) {
10
+ const drifted = steps.find((s) => s.drift !== undefined);
11
+ if (drifted !== undefined)
12
+ return drifted.step;
13
+ return steps.find((s) => !s.ok)?.step;
14
+ }
15
+ /** Parse a "file:line" source coordinate. Skips page URLs (which also contain colons). */
16
+ function parseSource(where) {
17
+ if (where === undefined || where.includes('://'))
18
+ return undefined;
19
+ const match = /^(.*):(\d+)$/.exec(where);
20
+ if (match !== null && match[1] !== undefined && match[2] !== undefined) {
21
+ return { file: match[1], line: Number(match[2]) };
22
+ }
23
+ return { file: where };
24
+ }
25
+ /** Compose the paste-ready fix instruction from the decision envelope. */
26
+ function suggestedPrompt(name, actual, where, nextAction) {
27
+ const parts = [`Fix the "${name}" flow.`, actual.endsWith('.') ? actual : `${actual}.`];
28
+ if (where !== undefined)
29
+ parts.push(`Look at ${where}.`);
30
+ if (nextAction !== undefined)
31
+ parts.push(nextAction);
32
+ return parts.join(' ');
33
+ }
34
+ /**
35
+ * Build a repair packet for a failed replay, or undefined when the flow passed. The actual cause is
36
+ * the decision's whatChanged, falling back to the replay error or a generic message.
37
+ */
38
+ export function buildRepairPacket(replay) {
39
+ if (replay.status === ReplayStatus.OK)
40
+ return undefined;
41
+ const decision = replay.decision;
42
+ const actual = decision?.whatChanged ?? replay.error?.message ?? 'the flow failed';
43
+ const where = decision?.whereInSource;
44
+ const sourceLocation = parseSource(where);
45
+ const step = failingStepNumber(replay.steps);
46
+ return {
47
+ flow: replay.name,
48
+ ...(step !== undefined ? { step } : {}),
49
+ expected: `the "${replay.name}" flow holds (its steps run and its success consequence fires)`,
50
+ actual,
51
+ ...(sourceLocation !== undefined ? { sourceLocation } : {}),
52
+ suggestedPrompt: suggestedPrompt(replay.name, actual, where, decision?.nextAction),
53
+ };
54
+ }
55
+ /** Build the repair packets for a set of replays (failed ones only). */
56
+ export function buildRepairPackets(replays) {
57
+ return replays.map(buildRepairPacket).filter((p) => p !== undefined);
58
+ }
59
+ //# sourceMappingURL=repair-prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repair-prompt.js","sourceRoot":"","sources":["../../src/runs/repair-prompt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Pure mapping from a flow-replay outcome (the existing reticle_flow_verify machinery) into the
3
+ * verification-run artifact's per-flow shape. DRIFT and ERROR both collapse to FAIL — from a host's
4
+ * perspective a flow that drifted no longer behaves, so it must not read as green. The actionable
5
+ * "why" is lifted from the replay's decision envelope (or its error) into failureReason.
6
+ */
7
+ import { ReplayStatus, RunFlowStatus, type FlowReplayResult, type RunFlowResult } from '@reticlehq/core';
8
+ /** OK → PASS; DRIFT/ERROR → FAIL (a healed flow is produced by the heal path, not plain replay). */
9
+ export declare function runFlowStatusOf(status: ReplayStatus): RunFlowStatus;
10
+ /** Map one replay (plus its measured duration) into a RunFlowResult for the artifact's flows[]. */
11
+ export declare function mapReplayToFlowResult(replay: FlowReplayResult, durationMs: number): RunFlowResult;
12
+ //# sourceMappingURL=replay-mapping.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay-mapping.d.ts","sourceRoot":"","sources":["../../src/runs/replay-mapping.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,YAAY,EACZ,aAAa,EACb,KAAK,gBAAgB,EACrB,KAAK,aAAa,EACnB,MAAM,iBAAiB,CAAC;AAGzB,oGAAoG;AACpG,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,aAAa,CAEnE;AAED,mGAAmG;AACnG,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,GAAG,aAAa,CAqBjG"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Pure mapping from a flow-replay outcome (the existing reticle_flow_verify machinery) into the
3
+ * verification-run artifact's per-flow shape. DRIFT and ERROR both collapse to FAIL — from a host's
4
+ * perspective a flow that drifted no longer behaves, so it must not read as green. The actionable
5
+ * "why" is lifted from the replay's decision envelope (or its error) into failureReason.
6
+ */
7
+ import { ReplayStatus, RunFlowStatus, } from '@reticlehq/core';
8
+ import { SUCCESS_STEP_TOOL } from '../flows/flow-success.js';
9
+ /** OK → PASS; DRIFT/ERROR → FAIL (a healed flow is produced by the heal path, not plain replay). */
10
+ export function runFlowStatusOf(status) {
11
+ return status === ReplayStatus.OK ? RunFlowStatus.PASS : RunFlowStatus.FAIL;
12
+ }
13
+ /** Map one replay (plus its measured duration) into a RunFlowResult for the artifact's flows[]. */
14
+ export function mapReplayToFlowResult(replay, durationMs) {
15
+ const status = runFlowStatusOf(replay.status);
16
+ const failureReason = status === RunFlowStatus.FAIL
17
+ ? (replay.decision?.whatChanged ??
18
+ replay.decision?.summary ??
19
+ replay.error?.message ??
20
+ 'flow failed')
21
+ : undefined;
22
+ // A flow with a success oracle gets a synthetic 'success' step appended by replay; surface its label
23
+ // as the run's `oracle` so the verdict counts this flow as consequence-backed (→ HIGH confidence),
24
+ // not a bare smoke click. Without this, an oracle-backed pass reads as MEDIUM and undersells itself.
25
+ const oracle = replay.steps.find((s) => s.tool === SUCCESS_STEP_TOOL)?.anchor;
26
+ return {
27
+ name: replay.name,
28
+ status,
29
+ steps: replay.steps.length,
30
+ durationMs,
31
+ ...(oracle !== undefined ? { oracle } : {}),
32
+ ...(failureReason !== undefined ? { failureReason } : {}),
33
+ };
34
+ }
35
+ //# sourceMappingURL=replay-mapping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay-mapping.js","sourceRoot":"","sources":["../../src/runs/replay-mapping.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,YAAY,EACZ,aAAa,GAGd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,oGAAoG;AACpG,MAAM,UAAU,eAAe,CAAC,MAAoB;IAClD,OAAO,MAAM,KAAK,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC;AAC9E,CAAC;AAED,mGAAmG;AACnG,MAAM,UAAU,qBAAqB,CAAC,MAAwB,EAAE,UAAkB;IAChF,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,aAAa,GACjB,MAAM,KAAK,aAAa,CAAC,IAAI;QAC3B,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW;YAC7B,MAAM,CAAC,QAAQ,EAAE,OAAO;YACxB,MAAM,CAAC,KAAK,EAAE,OAAO;YACrB,aAAa,CAAC;QAChB,CAAC,CAAC,SAAS,CAAC;IAChB,qGAAqG;IACrG,mGAAmG;IACnG,qGAAqG;IACrG,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC9E,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,MAAM;QACN,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM;QAC1B,UAAU;QACV,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1D,CAAC;AACJ,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * ReticleRunner — the programmatic Replay/Verify API a host platform (OEM/design partner) or CI drives
3
+ * from its own pipeline, with no MCP stdio and no human. It reuses the existing flow-replay machinery
4
+ * and the verification-run assembler, returning a stable ReticleVerificationRun.
5
+ *
6
+ * Everything it needs from the live world is injected through RunnerPort, so the core orchestration is
7
+ * fully testable without a CDP browser. The live adapter (wrapping ToolDeps: replayNamedFlow,
8
+ * flows.list, the drive/CDP preview boot) and the token-guarded HTTP endpoint are thin layers built on
9
+ * top of this — the orchestration and the verdict live here so the MCP path and the API produce the
10
+ * same artifact byte-for-byte.
11
+ */
12
+ import type { FlowReplayResult, ReticleVerificationRun, RunId } from '@reticlehq/core';
13
+ import { type VerificationRunInput } from './build-verification-run.js';
14
+ import { type ChangedFileInput, type RiskPolicy } from './risk-classify.js';
15
+ /** The live capabilities ReticleRunner needs. Injected so tests pass fakes (no CDP, no session). */
16
+ export interface RunnerPort {
17
+ /** Saved flow names to verify when the caller doesn't pass an explicit subset. */
18
+ listFlows(): Promise<string[]>;
19
+ /** Replay one saved flow against the live/preview app, returning the existing replay contract. */
20
+ replayFlow(name: string): Promise<FlowReplayResult>;
21
+ /** Injected clock — the single time source (no Date.now in logic, rule 7). */
22
+ now(): number;
23
+ /** Injected run-id generator (no Math.random in logic) — the live adapter supplies a branded uuid. */
24
+ newRunId(): RunId;
25
+ }
26
+ /** Run metadata the caller supplies; flows + verdict are produced by verify(). */
27
+ export interface VerifyOptions {
28
+ names?: string[];
29
+ project: VerificationRunInput['project'];
30
+ agent: VerificationRunInput['agent'];
31
+ trigger: VerificationRunInput['trigger'];
32
+ profile: VerificationRunInput['profile'];
33
+ /** The change set under test — classified into risk surfaces (auth/payment/db/…). */
34
+ changedFiles?: ChangedFileInput[];
35
+ /** Which touched surfaces block the verdict (require human confirmation). */
36
+ policy?: RiskPolicy;
37
+ }
38
+ export declare class ReticleRunner {
39
+ #private;
40
+ constructor(port: RunnerPort);
41
+ /**
42
+ * Replay the named flows (or every saved flow), map each outcome into the artifact, and assemble a
43
+ * verdict. Sequential by design — flows share the one live app and parallel replay would race the
44
+ * DOM (the same reason reticle_flow_verify is sequential).
45
+ */
46
+ verify(opts: VerifyOptions): Promise<ReticleVerificationRun>;
47
+ }
48
+ //# sourceMappingURL=reticle-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reticle-runner.d.ts","sourceRoot":"","sources":["../../src/runs/reticle-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACvF,OAAO,EAAwB,KAAK,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAG9F,OAAO,EAGL,KAAK,gBAAgB,EACrB,KAAK,UAAU,EAChB,MAAM,oBAAoB,CAAC;AAE5B,oGAAoG;AACpG,MAAM,WAAW,UAAU;IACzB,kFAAkF;IAClF,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/B,kGAAkG;IAClG,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACpD,8EAA8E;IAC9E,GAAG,IAAI,MAAM,CAAC;IACd,sGAAsG;IACtG,QAAQ,IAAI,KAAK,CAAC;CACnB;AAED,kFAAkF;AAClF,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,oBAAoB,CAAC,SAAS,CAAC,CAAC;IACzC,KAAK,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;IACrC,OAAO,EAAE,oBAAoB,CAAC,SAAS,CAAC,CAAC;IACzC,OAAO,EAAE,oBAAoB,CAAC,SAAS,CAAC,CAAC;IACzC,qFAAqF;IACrF,YAAY,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAClC,6EAA6E;IAC7E,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB;AAED,qBAAa,aAAa;;gBAGZ,IAAI,EAAE,UAAU;IAI5B;;;;OAIG;IACG,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,sBAAsB,CAAC;CA+BnE"}