@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,391 @@
1
+ import { AnchorKind, DriftReason, EventType, ReticleCommand, QueryBy, } from '@reticlehq/core';
2
+ import { asRecord, asString } from '../tools/tools-helpers.js';
3
+ import { replayActionArgs } from './replay.js';
4
+ /**
5
+ * A single ASCII-ish edit distance (case-insensitive). Small inputs (testids), so O(n*m) is fine.
6
+ * Exported so the heal proposal layer derives its confidence from the SAME distance used to
7
+ * pick `nearest` — no second, divergent heuristic enters the trust boundary.
8
+ */
9
+ export function editDistance(a, b) {
10
+ const s = a.toLowerCase();
11
+ const t = b.toLowerCase();
12
+ const rows = s.length + 1;
13
+ const cols = t.length + 1;
14
+ const prev = new Array(cols);
15
+ const curr = new Array(cols);
16
+ for (let j = 0; j < cols; j++)
17
+ prev[j] = j;
18
+ for (let i = 1; i < rows; i++) {
19
+ curr[0] = i;
20
+ for (let j = 1; j < cols; j++) {
21
+ const cost = s[i - 1] === t[j - 1] ? 0 : 1;
22
+ curr[j] = Math.min((prev[j] ?? 0) + 1, (curr[j - 1] ?? 0) + 1, (prev[j - 1] ?? 0) + cost);
23
+ }
24
+ for (let j = 0; j < cols; j++)
25
+ prev[j] = curr[j] ?? 0;
26
+ }
27
+ return prev[cols - 1] ?? 0;
28
+ }
29
+ /**
30
+ * The closest present testid to a missing one, by case-insensitive edit distance, ties broken
31
+ * by shortest length then lexically. Returns null only when nothing is present — so a drift
32
+ * record always names a fix when one exists ("whose fault is it": here is the closest survivor).
33
+ */
34
+ export function nearestTestid(missing, present) {
35
+ let best = null;
36
+ let bestDistance = Number.POSITIVE_INFINITY;
37
+ for (const candidate of present) {
38
+ const distance = editDistance(missing, candidate);
39
+ if (distance < bestDistance ||
40
+ (distance === bestDistance && best !== null && candidate.length < best.length) ||
41
+ (distance === bestDistance &&
42
+ best !== null &&
43
+ candidate.length === best.length &&
44
+ candidate < best)) {
45
+ best = candidate;
46
+ bestDistance = distance;
47
+ }
48
+ }
49
+ return best;
50
+ }
51
+ /**
52
+ * Bounded settle for anchor re-resolution. A testid step queries the live DOM for the anchor; if a
53
+ * render is still in flight (post-login route swap, modal mount, list paint) the element exists but
54
+ * isn't painted yet, and a single QUERY would read zero and FALSELY drift. We re-query a few times
55
+ * with a short delay before concluding the anchor is gone — a real regression (renamed/removed
56
+ * testid) stays missing across every attempt, so this removes flakiness without masking breaks.
57
+ */
58
+ const ANCHOR_SETTLE_ATTEMPTS = 8;
59
+ const ANCHOR_SETTLE_DELAY_MS = 150;
60
+ const realSleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
61
+ /** Extract the live element refs + the zero-match near-miss hint from a QUERY command result. */
62
+ function readQuery(result) {
63
+ if (!result.ok)
64
+ return { refs: [] };
65
+ const payload = asRecord(result.result);
66
+ const elements = Array.isArray(payload['elements']) ? payload['elements'] : [];
67
+ const refs = elements.map((e) => asString(asRecord(e)['ref']) ?? '').filter((r) => r.length > 0);
68
+ const rawHint = payload['hint'];
69
+ if (typeof rawHint === 'object' && rawHint !== null) {
70
+ const hint = asRecord(rawHint);
71
+ const present = Array.isArray(hint['presentTestids'])
72
+ ? hint['presentTestids'].filter((t) => typeof t === 'string')
73
+ : [];
74
+ return {
75
+ refs,
76
+ hint: {
77
+ route: asString(hint['route']) ?? '',
78
+ presentTestids: present,
79
+ presentRegions: [],
80
+ knownEmptyState: hint['knownEmptyState'] === true,
81
+ },
82
+ };
83
+ }
84
+ return { refs };
85
+ }
86
+ /**
87
+ * True when ≥2 present testids tie at the minimum edit distance to the missing one — `nearest` is
88
+ * then an arbitrary lexical-tiebreak pick, so auto-healing would be a coin-flip between candidates.
89
+ * Such a drift is surfaced (with a nearest) but never auto-healed.
90
+ */
91
+ export function nearestIsAmbiguous(missing, present) {
92
+ if (present.length < 2)
93
+ return false;
94
+ let min = Number.POSITIVE_INFINITY;
95
+ let count = 0;
96
+ for (const candidate of present) {
97
+ const distance = editDistance(missing, candidate);
98
+ if (distance < min) {
99
+ min = distance;
100
+ count = 1;
101
+ }
102
+ else if (distance === min) {
103
+ count += 1;
104
+ }
105
+ }
106
+ return count >= 2;
107
+ }
108
+ /** Build the legible-drift record for a testid anchor that resolved to zero live elements. */
109
+ function testidDrift(value, hint) {
110
+ const present = hint?.presentTestids ?? [];
111
+ const drift = {
112
+ reasonKind: DriftReason.TESTID_NOT_FOUND,
113
+ reason: `testid "${value}" not found`,
114
+ anchor: value,
115
+ nearest: nearestTestid(value, present),
116
+ };
117
+ if (nearestIsAmbiguous(value, present))
118
+ drift.ambiguous = true;
119
+ return drift;
120
+ }
121
+ /**
122
+ * Re-resolve any QUERY against the live DOM, tolerating an in-flight render: QUERY, and while it
123
+ * returns zero refs, sleep and retry up to ANCHOR_SETTLE_ATTEMPTS. Returns as soon as refs appear,
124
+ * so a present anchor costs one query; a genuinely missing one costs the full (bounded) settle and
125
+ * then drifts. The last result's near-miss hint is returned for the drift record.
126
+ */
127
+ async function resolveQuery(session, queryArgs, sleep) {
128
+ let last = readQuery(await session.command(ReticleCommand.QUERY, queryArgs));
129
+ for (let attempt = 1; last.refs.length === 0 && attempt < ANCHOR_SETTLE_ATTEMPTS; attempt += 1) {
130
+ await sleep(ANCHOR_SETTLE_DELAY_MS);
131
+ last = readQuery(await session.command(ReticleCommand.QUERY, queryArgs));
132
+ }
133
+ return last;
134
+ }
135
+ /** Re-resolve a testid anchor. */
136
+ function resolveTestid(session, value, sleep) {
137
+ return resolveQuery(session, { by: QueryBy.TESTID, value }, sleep);
138
+ }
139
+ /**
140
+ * The route (pathname) currently in effect — the page a step runs on. Reads the latest ROUTE_CHANGE
141
+ * from the whole event buffer; mirrors the predicate engine's route field order (pathname → to).
142
+ * Returns undefined when no route has been observed (e.g. a fake session) so `page` stays optional.
143
+ */
144
+ function currentRoute(session) {
145
+ const routes = session.eventsSince(0).filter((e) => e.type === EventType.ROUTE_CHANGE);
146
+ const last = routes.at(-1);
147
+ if (last === undefined)
148
+ return undefined;
149
+ const data = last.data ?? {};
150
+ const pathname = asString(data['pathname']) ?? asString(data['to']);
151
+ return pathname !== undefined && pathname.length > 0 ? pathname : undefined;
152
+ }
153
+ /** Pathname only (drop origin + query) so a net URL stays terse in the journey. */
154
+ function trimUrl(url) {
155
+ try {
156
+ return new URL(url, 'http://x').pathname;
157
+ }
158
+ catch {
159
+ return url.length > 60 ? `${url.slice(0, 59)}…` : url;
160
+ }
161
+ }
162
+ /**
163
+ * A compact "what happened after this step" summary from the post-action event window — the
164
+ * journey's consequence column ("→ /deployments", "signal modal:opened", "GET /api/x 500"). Notable
165
+ * events only (route / domain signal / network / console error), terse and capped to stay token-cheap.
166
+ */
167
+ function summarizeConsequence(events) {
168
+ const parts = [];
169
+ const lastRoute = events.filter((e) => e.type === EventType.ROUTE_CHANGE).at(-1);
170
+ if (lastRoute !== undefined) {
171
+ const data = lastRoute.data ?? {};
172
+ const to = asString(data['pathname']) ?? asString(data['to']);
173
+ if (to !== undefined && to.length > 0)
174
+ parts.push(`→ ${to}`);
175
+ }
176
+ const signals = new Set();
177
+ for (const e of events) {
178
+ if (e.type !== EventType.SIGNAL)
179
+ continue;
180
+ const name = asString((e.data ?? {})['name']);
181
+ if (name !== undefined)
182
+ signals.add(name);
183
+ }
184
+ for (const name of [...signals].slice(0, 2))
185
+ parts.push(`signal ${name}`);
186
+ for (const n of events.filter((e) => e.type === EventType.NET_REQUEST).slice(0, 2)) {
187
+ const data = n.data ?? {};
188
+ const method = asString(data['method']) ?? 'GET';
189
+ const path = trimUrl(asString(data['url']) ?? '');
190
+ const status = typeof data['status'] === 'number' ? ` ${data['status']}` : '';
191
+ parts.push(`${method} ${path}${status}`.trim());
192
+ }
193
+ const errors = events.filter((e) => e.type === EventType.CONSOLE_ERROR || e.type === EventType.ERROR_UNCAUGHT).length;
194
+ if (errors > 0)
195
+ parts.push(`${errors} console error${errors > 1 ? 's' : ''}`);
196
+ return parts.length > 0 ? parts.join('; ') : undefined;
197
+ }
198
+ /** A compact, legible label for a component auto-anchor (component@file:line, or its best part). */
199
+ function componentLabel(anchor) {
200
+ if (anchor.source !== undefined) {
201
+ const base = anchor.source.file.split('/').pop() ?? anchor.source.file;
202
+ const loc = `${base}:${anchor.source.line}`;
203
+ return anchor.component !== undefined ? `${anchor.component}@${loc}` : loc;
204
+ }
205
+ return anchor.component ?? anchor.name ?? anchor.role ?? 'component';
206
+ }
207
+ /** The value of a step's primary anchor, for labelling the result row. */
208
+ function anchorLabel(anchor) {
209
+ if (anchor.kind === AnchorKind.TESTID)
210
+ return anchor.value;
211
+ if (anchor.kind === AnchorKind.SIGNAL)
212
+ return anchor.name;
213
+ if (anchor.kind === AnchorKind.COMPONENT)
214
+ return componentLabel(anchor);
215
+ return anchor.name ?? anchor.role;
216
+ }
217
+ /** QUERY args for a component auto-anchor — source (precise) + component name (coarse) as given. */
218
+ function componentQueryArgs(anchor) {
219
+ const args = { by: QueryBy.COMPONENT };
220
+ if (anchor.component !== undefined)
221
+ args['component'] = anchor.component;
222
+ if (anchor.source !== undefined)
223
+ args['source'] = anchor.source;
224
+ return args;
225
+ }
226
+ /** Run one component-anchored step: re-resolve via QUERY by:'component', ACT on the live ref, else drift. */
227
+ async function runComponentStep(session, step, index, anchor, confirmDangerous, sleep) {
228
+ const label = componentLabel(anchor);
229
+ const { refs } = await resolveQuery(session, componentQueryArgs(anchor), sleep);
230
+ if (refs.length === 0) {
231
+ return {
232
+ step: index,
233
+ tool: step.tool,
234
+ anchor: label,
235
+ ok: false,
236
+ drift: {
237
+ reasonKind: DriftReason.COMPONENT_NOT_FOUND,
238
+ reason: `component anchor "${label}" not found`,
239
+ anchor: label,
240
+ nearest: null,
241
+ },
242
+ };
243
+ }
244
+ const ref = refs[0] ?? '';
245
+ const act = await session.command(ReticleCommand.ACT, {
246
+ ref,
247
+ action: step.action ?? '',
248
+ args: replayActionArgs(step.args, confirmDangerous),
249
+ });
250
+ const result = { step: index, tool: step.tool, anchor: label, ok: act.ok };
251
+ if (!act.ok)
252
+ result.error = act.error ?? 'command failed';
253
+ return result;
254
+ }
255
+ /** Run one testid-anchored step: re-resolve via QUERY, then ACT on the live ref, else drift. */
256
+ async function runTestidStep(session, step, index, value, dynamic, confirmDangerous, sleep) {
257
+ const { refs, hint } = await resolveTestid(session, value, sleep);
258
+ if (refs.length === 0) {
259
+ return {
260
+ step: index,
261
+ tool: step.tool,
262
+ anchor: value,
263
+ ok: false,
264
+ drift: testidDrift(value, hint),
265
+ };
266
+ }
267
+ const ref = refs[0] ?? '';
268
+ const note = refs.length > 1 ? `ambiguous testid '${value}', used first match` : undefined;
269
+ const act = await session.command(ReticleCommand.ACT, {
270
+ ref,
271
+ action: step.action ?? '',
272
+ args: replayActionArgs(step.args, confirmDangerous),
273
+ });
274
+ const result = { step: index, tool: step.tool, anchor: value, ok: act.ok };
275
+ if (!act.ok) {
276
+ result.error = act.error ?? 'command failed';
277
+ if (note !== undefined)
278
+ result.note = note;
279
+ return result;
280
+ }
281
+ // assert the step's expect.element testid is present AFTER the action —
282
+ // unless that testid was marked DYNAMIC (the LLM-output case), in which case its presence/content
283
+ // is NOT asserted (only the action ran). The skip is scoped strictly to the dynamic set.
284
+ const expectTestid = step.expect?.element?.testid;
285
+ if (expectTestid !== undefined && !dynamic.has(expectTestid)) {
286
+ const expectRefs = await resolveTestid(session, expectTestid, sleep);
287
+ if (expectRefs.refs.length === 0) {
288
+ return {
289
+ step: index,
290
+ tool: step.tool,
291
+ anchor: expectTestid,
292
+ ok: false,
293
+ drift: testidDrift(expectTestid, expectRefs.hint),
294
+ };
295
+ }
296
+ }
297
+ if (note !== undefined)
298
+ result.note = note;
299
+ return result;
300
+ }
301
+ /**
302
+ * After a step's anchor resolves + its action runs, an `expect.state` additionally asserts STORE
303
+ * TRUTH — the source of truth no DOM read can reach. Evaluated with the same predicate engine (waits
304
+ * up to the timeout so an async store update can settle); a mismatch is legible drift, not a blind
305
+ * fail. Returns the drift on mismatch, else undefined.
306
+ */
307
+ async function assertStepState(session, state, waitForSignal, timeoutMs, since) {
308
+ const predicate = { kind: 'state', path: state.path };
309
+ if (state.store !== undefined)
310
+ predicate.store = state.store;
311
+ if (state.equals !== undefined)
312
+ predicate.equals = state.equals;
313
+ const verdict = await waitForSignal(session, predicate, timeoutMs, since);
314
+ if (verdict.pass)
315
+ return undefined;
316
+ return {
317
+ reasonKind: DriftReason.STATE_MISMATCH,
318
+ reason: verdict.failureReason ?? `state '${state.path}' did not hold`,
319
+ anchor: `state:${state.path}`,
320
+ nearest: null,
321
+ };
322
+ }
323
+ /** Run one signal-anchored step: wait for the signal predicate, else drift (no nearest for signals). */
324
+ async function runSignalStep(session, step, index, name, waitForSignal, signalTimeoutMs) {
325
+ const verdict = await waitForSignal(session, { kind: 'signal', name }, signalTimeoutMs);
326
+ if (verdict.pass)
327
+ return { step: index, tool: step.tool, anchor: name, ok: true };
328
+ return {
329
+ step: index,
330
+ tool: step.tool,
331
+ anchor: name,
332
+ ok: false,
333
+ drift: {
334
+ reasonKind: DriftReason.SIGNAL_NOT_OBSERVED,
335
+ reason: `signal "${name}" not observed`,
336
+ anchor: name,
337
+ nearest: null,
338
+ },
339
+ };
340
+ }
341
+ /**
342
+ * Replay a loaded flow by RE-RESOLVING every step's semantic anchor against the live DOM — never
343
+ * a stale ref. A testid anchor is re-found by reticle_query; a signal anchor waits on a predicate.
344
+ * On the first anchor MISS the step carries legible drift and replay STOPS, returning the partial
345
+ * results. This is the "whose fault is it" contract, not a blind "command failed".
346
+ */
347
+ export async function replayFlow(session, flow, waitForSignal, signalTimeoutMs, confirmDangerous = false, sleep = realSleep) {
348
+ const results = [];
349
+ // testids whose region is LLM-dynamic — their expect-presence is NOT asserted.
350
+ const dynamic = new Set((flow.dynamic ?? [])
351
+ .filter((a) => a.kind === AnchorKind.TESTID)
352
+ .map((a) => (a.kind === AnchorKind.TESTID ? a.value : '')));
353
+ let index = 0;
354
+ for (const step of flow.steps) {
355
+ const label = anchorLabel(step.anchor);
356
+ // The page this step runs on (the journey's "which page") — captured before the action.
357
+ const page = currentRoute(session);
358
+ // Event-time floor so the consequence reflects only THIS step's aftermath, not prior steps'.
359
+ const cursorBefore = session.elapsed();
360
+ let result;
361
+ if (step.anchor.kind === AnchorKind.SIGNAL) {
362
+ result = await runSignalStep(session, step, index, label, waitForSignal, signalTimeoutMs);
363
+ }
364
+ else if (step.anchor.kind === AnchorKind.COMPONENT) {
365
+ result = await runComponentStep(session, step, index, step.anchor, confirmDangerous, sleep);
366
+ }
367
+ else {
368
+ result = await runTestidStep(session, step, index, label, dynamic, confirmDangerous, sleep);
369
+ }
370
+ // A step may additionally assert STORE TRUTH (expect.state) once its action has run — caught
371
+ // deterministically here, in the same cheap replay loop, with no LLM.
372
+ if (result.ok && result.drift === undefined && step.expect?.state !== undefined) {
373
+ const stateDrift = await assertStepState(session, step.expect.state, waitForSignal, signalTimeoutMs, cursorBefore);
374
+ if (stateDrift !== undefined) {
375
+ result.ok = false;
376
+ result.drift = stateDrift;
377
+ }
378
+ }
379
+ if (page !== undefined)
380
+ result.page = page;
381
+ const consequence = summarizeConsequence(session.eventsSince(cursorBefore).filter((e) => e.t >= cursorBefore));
382
+ if (consequence !== undefined)
383
+ result.consequence = consequence;
384
+ results.push(result);
385
+ if (result.drift !== undefined || !result.ok)
386
+ break;
387
+ index += 1;
388
+ }
389
+ return results;
390
+ }
391
+ //# sourceMappingURL=flow-replay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-replay.js","sourceRoot":"","sources":["../../src/flows/flow-replay.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { type FlowFile, type FlowReplayResult } from '@reticlehq/core';
2
+ /**
3
+ * Render a HUMAN-facing confidence report for a replayed flow — the artifact a developer reads to
4
+ * trust the test without re-running it. It answers the three confidence questions in one page:
5
+ * WHY — the declared business intent (+ whether it is actually asserted).
6
+ * WHAT — the journey: a mermaid flow diagram + a per-step page → action → consequence table.
7
+ * PROOF — the verdict (pass/drift/fail), the observed evidence (signals/network), and the
8
+ * measured cost (deterministic replay tokens vs an LLM re-drive).
9
+ *
10
+ * Pure: no IO, no clock. Markdown out (mermaid is the one place mermaid earns its tokens — a human
11
+ * renders it). Token figures are passed in (measured by the caller), never faked.
12
+ */
13
+ interface FlowReportInput {
14
+ flow: FlowFile;
15
+ replay: FlowReplayResult;
16
+ /** Measured deterministic replay cost (o200k proxy), for the "PROOF / cost" line. Optional. */
17
+ replayTokens?: number;
18
+ /** Measured per-run LLM re-drive cost of a step-driving tool, for the ratio. Optional. */
19
+ competitorTokens?: number;
20
+ }
21
+ export declare function buildFlowReport(input: FlowReportInput): string;
22
+ export {};
23
+ //# sourceMappingURL=flow-report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-report.d.ts","sourceRoot":"","sources":["../../src/flows/flow-report.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,QAAQ,EACb,KAAK,gBAAgB,EAEtB,MAAM,iBAAiB,CAAC;AAGzB;;;;;;;;;;GAUG;AAEH,UAAU,eAAe;IACvB,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,gBAAgB,CAAC;IACzB,+FAA+F;IAC/F,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0FAA0F;IAC1F,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAuED,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAyC9D"}
@@ -0,0 +1,106 @@
1
+ import { ReplayStatus, } from '@reticlehq/core';
2
+ import { classifyFlowAssertions } from './flow-classify.js';
3
+ const VERDICT_GLYPH = {
4
+ [ReplayStatus.OK]: '✅ pass',
5
+ [ReplayStatus.DRIFT]: '⚠️ drift',
6
+ [ReplayStatus.ERROR]: '❌ fail',
7
+ };
8
+ /** A mermaid-safe node id (mermaid ids must be alnum/underscore). */
9
+ function nodeId(index) {
10
+ return `s${index}`;
11
+ }
12
+ /** Escape a label for a mermaid `["..."]` node (quotes/newlines break the parser). */
13
+ function mermaidLabel(text) {
14
+ return text.replace(/"/g, "'").replace(/\n/g, ' ').slice(0, 80);
15
+ }
16
+ /** A short action verb for a step row ("act" is the tool; the anchor carries the target). */
17
+ function stepAction(step) {
18
+ return step.tool === 'success' ? 'assert outcome' : step.anchor;
19
+ }
20
+ /** The mermaid flowchart of the journey: one node per step, page-labelled, consequence on the edge. */
21
+ function mermaidDiagram(steps) {
22
+ const lines = ['```mermaid', 'flowchart TD'];
23
+ steps.forEach((step, i) => {
24
+ const page = step.page !== undefined ? `${step.page} — ` : '';
25
+ const glyph = step.ok ? '' : ' ✗';
26
+ lines.push(` ${nodeId(i)}["${mermaidLabel(`${page}${stepAction(step)}${glyph}`)}"]`);
27
+ if (i > 0) {
28
+ const edge = steps[i - 1]?.consequence;
29
+ const label = edge !== undefined ? `|"${mermaidLabel(edge)}"|` : '';
30
+ lines.push(` ${nodeId(i - 1)} -->${label} ${nodeId(i)}`);
31
+ }
32
+ });
33
+ lines.push('```');
34
+ return lines.join('\n');
35
+ }
36
+ /** The per-step journey table (page → action → consequence → result). */
37
+ function journeyTable(steps) {
38
+ const rows = [
39
+ '| # | page | action | consequence | result |',
40
+ '|---|------|--------|-------------|--------|',
41
+ ];
42
+ for (const step of steps) {
43
+ const page = step.page ?? '—';
44
+ const consequence = step.consequence ?? '—';
45
+ const result = step.ok
46
+ ? 'ok'
47
+ : step.drift !== undefined
48
+ ? `drift (${step.drift.anchor})`
49
+ : 'fail';
50
+ rows.push(`| ${step.step} | ${page} | ${stepAction(step)} | ${consequence} | ${result} |`);
51
+ }
52
+ return rows.join('\n');
53
+ }
54
+ /** Distinct observed consequences across the journey — the evidence the verdict rests on. */
55
+ function evidenceList(steps) {
56
+ const seen = new Set();
57
+ for (const step of steps) {
58
+ if (step.consequence !== undefined) {
59
+ for (const part of step.consequence.split(';'))
60
+ seen.add(part.trim());
61
+ }
62
+ }
63
+ if (seen.size === 0)
64
+ return '_No observable consequence captured._';
65
+ return [...seen].map((e) => `- ${e}`).join('\n');
66
+ }
67
+ export function buildFlowReport(input) {
68
+ const { flow, replay, replayTokens, competitorTokens } = input;
69
+ const grade = classifyFlowAssertions(flow);
70
+ const verdict = VERDICT_GLYPH[replay.status] ?? replay.status;
71
+ const intent = flow.intent ?? '_(no intent declared)_';
72
+ const intentLine = flow.intent !== undefined
73
+ ? grade.intentVerified
74
+ ? `**Intent:** ${flow.intent} — **verified** (an observable outcome is asserted).`
75
+ : `**Intent:** ${flow.intent} — ⚠️ declared but NOT asserted (add a consequence oracle).`
76
+ : `**Intent:** ${intent}`;
77
+ const out = [];
78
+ out.push(`# Flow report — \`${flow.name}\``);
79
+ out.push('');
80
+ out.push(intentLine);
81
+ out.push(`**Verdict:** ${verdict} · **steps:** ${replay.steps.length}`);
82
+ if (replayTokens !== undefined) {
83
+ const ratio = competitorTokens !== undefined && replayTokens > 0
84
+ ? ` · **${Math.round(competitorTokens / replayTokens)}×** cheaper than an LLM re-drive`
85
+ : '';
86
+ out.push(`**Cost:** ${replayTokens} tokens (deterministic replay, no LLM)${ratio}`);
87
+ }
88
+ if (replay.decision !== undefined) {
89
+ out.push('');
90
+ out.push(`> **Next action:** ${replay.decision.nextAction}`);
91
+ if (replay.decision.whereInSource !== undefined) {
92
+ out.push(`> **Where:** \`${replay.decision.whereInSource}\``);
93
+ }
94
+ }
95
+ out.push('');
96
+ out.push('## Journey');
97
+ out.push(mermaidDiagram(replay.steps));
98
+ out.push('');
99
+ out.push(journeyTable(replay.steps));
100
+ out.push('');
101
+ out.push('## Evidence');
102
+ out.push(evidenceList(replay.steps));
103
+ out.push('');
104
+ return out.join('\n');
105
+ }
106
+ //# sourceMappingURL=flow-report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-report.js","sourceRoot":"","sources":["../../src/flows/flow-report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Project-scoping for the HUD's replay-flow list. One daemon can serve many apps (they all connect to
3
+ * the same bridge port); its flow store is flat, so without scoping every app's HUD lists every other
4
+ * app's flows. These pure helpers pick the flows that belong on a given session's panel and shape them
5
+ * into replay chips — testable without a bridge or a filesystem.
6
+ */
7
+ import { type FlowFile } from '@reticlehq/core';
8
+ /** A replayable flow as the HUD renders it: a name + an optional page it can start from. */
9
+ export interface FlowChip {
10
+ name: string;
11
+ start?: string;
12
+ }
13
+ /**
14
+ * A flow belongs on a session's HUD when it carries no projectId (legacy/global — visible everywhere
15
+ * for back-compat) OR its projectId matches the connecting session's. A flow stamped for project A
16
+ * never shows on project B's panel.
17
+ */
18
+ export declare function flowInProjectScope(flowProjectId: string | undefined, sessionProjectId: string | undefined): boolean;
19
+ /**
20
+ * Build the project-scoped replay chips for a session. Each in-scope flow becomes a chip whose `start`
21
+ * is its first step's testid anchor (so the panel can show it only on the page it can begin from);
22
+ * flows starting from a non-testid anchor get a chip with no `start` (shown on every page).
23
+ */
24
+ export declare function buildFlowChips(flows: readonly FlowFile[], sessionProjectId: string | undefined): FlowChip[];
25
+ //# sourceMappingURL=flow-scope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-scope.d.ts","sourceRoot":"","sources":["../../src/flows/flow-scope.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE5D,4FAA4F;AAC5F,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,gBAAgB,EAAE,MAAM,GAAG,SAAS,GACnC,OAAO,CAET;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,SAAS,QAAQ,EAAE,EAC1B,gBAAgB,EAAE,MAAM,GAAG,SAAS,GACnC,QAAQ,EAAE,CAUZ"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Project-scoping for the HUD's replay-flow list. One daemon can serve many apps (they all connect to
3
+ * the same bridge port); its flow store is flat, so without scoping every app's HUD lists every other
4
+ * app's flows. These pure helpers pick the flows that belong on a given session's panel and shape them
5
+ * into replay chips — testable without a bridge or a filesystem.
6
+ */
7
+ import { AnchorKind } from '@reticlehq/core';
8
+ /**
9
+ * A flow belongs on a session's HUD when it carries no projectId (legacy/global — visible everywhere
10
+ * for back-compat) OR its projectId matches the connecting session's. A flow stamped for project A
11
+ * never shows on project B's panel.
12
+ */
13
+ export function flowInProjectScope(flowProjectId, sessionProjectId) {
14
+ return flowProjectId === undefined || flowProjectId === sessionProjectId;
15
+ }
16
+ /**
17
+ * Build the project-scoped replay chips for a session. Each in-scope flow becomes a chip whose `start`
18
+ * is its first step's testid anchor (so the panel can show it only on the page it can begin from);
19
+ * flows starting from a non-testid anchor get a chip with no `start` (shown on every page).
20
+ */
21
+ export function buildFlowChips(flows, sessionProjectId) {
22
+ const chips = [];
23
+ for (const flow of flows) {
24
+ if (!flowInProjectScope(flow.projectId, sessionProjectId))
25
+ continue;
26
+ const first = flow.steps[0];
27
+ const start = first !== undefined && first.anchor.kind === AnchorKind.TESTID ? first.anchor.value : undefined;
28
+ chips.push(start === undefined ? { name: flow.name } : { name: flow.name, start });
29
+ }
30
+ return chips;
31
+ }
32
+ //# sourceMappingURL=flow-scope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flow-scope.js","sourceRoot":"","sources":["../../src/flows/flow-scope.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,UAAU,EAAiB,MAAM,iBAAiB,CAAC;AAQ5D;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAChC,aAAiC,EACjC,gBAAoC;IAEpC,OAAO,aAAa,KAAK,SAAS,IAAI,aAAa,KAAK,gBAAgB,CAAC;AAC3E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAC5B,KAA0B,EAC1B,gBAAoC;IAEpC,MAAM,KAAK,GAAe,EAAE,CAAC;IAC7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC;YAAE,SAAS;QACpE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,KAAK,GACT,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QAClG,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACrF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}