waygraph 0.15.47 → 0.15.49

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 (345) hide show
  1. package/dist/analysis/graph.js +2 -2
  2. package/dist/auto-session/session.js +2 -2
  3. package/dist/cli/discover.d.ts +1 -1
  4. package/dist/cli/discover.js +1 -1
  5. package/dist/cli.js +1 -1
  6. package/dist/{agent-dive.js → commands/agent-dive-scaffold.js} +2 -2
  7. package/dist/commands/agent-dive.js +1 -1
  8. package/dist/{engine/core.js → core/block.js} +6 -6
  9. package/dist/core/blocks/api.d.ts +54 -0
  10. package/dist/core/blocks/api.js +75 -0
  11. package/dist/{engine → core}/blocks/effect.d.ts +1 -1
  12. package/dist/{engine → core}/blocks/effect.js +1 -1
  13. package/dist/{engine → core}/blocks/method.d.ts +1 -1
  14. package/dist/{engine → core}/blocks/method.js +1 -1
  15. package/dist/{engine → core}/blocks/nav.js +1 -1
  16. package/dist/{engine → core}/blocks/page.js +1 -1
  17. package/dist/{engine → core}/branch-regression.js +2 -3
  18. package/dist/{engine → core}/compose.js +4 -4
  19. package/dist/{engine/engine-class.d.ts → core/engine.d.ts} +2 -133
  20. package/dist/core/engine.js +50 -0
  21. package/dist/{engine → core}/flow.js +5 -5
  22. package/dist/core/map-builder.d.ts +171 -0
  23. package/dist/{engine/engine-class.js → core/map-builder.js} +82 -98
  24. package/dist/{engine → core}/run-graph.js +4 -6
  25. package/dist/core.d.ts +14 -0
  26. package/dist/core.js +15 -0
  27. package/dist/errors.d.ts +54 -20
  28. package/dist/errors.js +67 -20
  29. package/dist/highlights/run-phase.js +15 -2
  30. package/dist/highlights/stub-ctx.js +16 -0
  31. package/dist/highlights/types.d.ts +38 -0
  32. package/dist/index.d.ts +5 -3
  33. package/dist/index.js +1 -1
  34. package/dist/mem-page.js +2 -2
  35. package/dist/mem-stub.d.ts +1 -1
  36. package/dist/pilot-overlay/fixtures.js +42 -10
  37. package/dist/pilot-overlay/shell.js +23 -10
  38. package/dist/runner/banner-log.js +1 -0
  39. package/dist/runner/device-stage.js +35 -15
  40. package/dist/runner/inpage/banner.d.ts +9 -1
  41. package/dist/runner/inpage/banner.js +27 -2
  42. package/dist/runner/inpage/caption.d.ts +3 -0
  43. package/dist/runner/inpage/caption.js +23 -0
  44. package/dist/runner/inpage/core.js +32 -9
  45. package/dist/runner/inpage/network.d.ts +15 -0
  46. package/dist/runner/inpage/network.js +217 -0
  47. package/dist/runner/inpage/panel-chrome.js +41 -1
  48. package/dist/runner/inpage/swipe-zoom.js +1 -1
  49. package/dist/runner/inpage/todos.js +6 -1
  50. package/dist/runner/main.js +9 -2
  51. package/dist/runner/network-capture.d.ts +9 -0
  52. package/dist/runner/network-capture.js +126 -0
  53. package/dist/runner/overlay-css.js +71 -7
  54. package/dist/runner/overlay-install.js +39 -2
  55. package/dist/runner/overlay-stage.js +5 -0
  56. package/dist/runner/rings.js +69 -45
  57. package/dist/runner/slides.js +14 -8
  58. package/dist/runner/step-mode.js +12 -0
  59. package/dist/runner/step-panels.js +9 -3
  60. package/dist/runner/teardown.js +16 -9
  61. package/dist/session/auto-explore-run.d.ts +1 -1
  62. package/dist/session/auto-explore-run.js +47 -10
  63. package/dist/{step-overlay.d.ts → session/step-overlay.d.ts} +1 -1
  64. package/dist/{step-overlay.js → session/step-overlay.js} +1 -1
  65. package/dist/trait.d.ts +1 -0
  66. package/dist/trait.js +15 -0
  67. package/dist/traverse/run.js +1 -1
  68. package/dist/ui/components/ring.js +4 -2
  69. package/dist/ui/overlay.css +36 -3
  70. package/examples/saucedemo/.waygraph-auto/00d147d1.log +21 -0
  71. package/examples/saucedemo/.waygraph-auto/0402cfcf.log +6 -0
  72. package/examples/saucedemo/.waygraph-auto/062b581f.log +20 -0
  73. package/examples/saucedemo/.waygraph-auto/0681582b.log +6 -0
  74. package/examples/saucedemo/.waygraph-auto/07f3e964.log +6 -0
  75. package/examples/saucedemo/.waygraph-auto/0868ae4d.log +0 -0
  76. package/examples/saucedemo/.waygraph-auto/0924ddaa.log +22 -0
  77. package/examples/saucedemo/.waygraph-auto/092d6173.log +5 -0
  78. package/examples/saucedemo/.waygraph-auto/09924510.log +0 -0
  79. package/examples/saucedemo/.waygraph-auto/0998c941.log +21 -0
  80. package/examples/saucedemo/.waygraph-auto/0bf74300.log +21 -0
  81. package/examples/saucedemo/.waygraph-auto/0c01fd29.log +4 -0
  82. package/examples/saucedemo/.waygraph-auto/0c302590.log +0 -0
  83. package/examples/saucedemo/.waygraph-auto/0dee62d6.log +5 -0
  84. package/examples/saucedemo/.waygraph-auto/0eb4c081.log +5 -0
  85. package/examples/saucedemo/.waygraph-auto/10fd431c.log +0 -0
  86. package/examples/saucedemo/.waygraph-auto/13c6fe3c.log +0 -0
  87. package/examples/saucedemo/.waygraph-auto/1581b677.log +0 -0
  88. package/examples/saucedemo/.waygraph-auto/164761a5.log +6 -0
  89. package/examples/saucedemo/.waygraph-auto/1905ceb2.log +0 -0
  90. package/examples/saucedemo/.waygraph-auto/1b1d55c6.log +0 -0
  91. package/examples/saucedemo/.waygraph-auto/1b80fd24.log +6 -0
  92. package/examples/saucedemo/.waygraph-auto/1c30a3c2.log +0 -0
  93. package/examples/saucedemo/.waygraph-auto/1d90aa9a.log +0 -0
  94. package/examples/saucedemo/.waygraph-auto/1de7d889.log +0 -0
  95. package/examples/saucedemo/.waygraph-auto/1f233a4c.log +6 -0
  96. package/examples/saucedemo/.waygraph-auto/20e66801.log +0 -0
  97. package/examples/saucedemo/.waygraph-auto/20ffdb77.log +0 -0
  98. package/examples/saucedemo/.waygraph-auto/22f1a704.log +5 -0
  99. package/examples/saucedemo/.waygraph-auto/239cced3.log +20 -0
  100. package/examples/saucedemo/.waygraph-auto/25204b46.log +4 -0
  101. package/examples/saucedemo/.waygraph-auto/25e2e90f.log +0 -0
  102. package/examples/saucedemo/.waygraph-auto/2708455e.log +22 -0
  103. package/examples/saucedemo/.waygraph-auto/272a96fd.log +20 -0
  104. package/examples/saucedemo/.waygraph-auto/28d7be5d.log +0 -0
  105. package/examples/saucedemo/.waygraph-auto/2a6a8266.log +6 -0
  106. package/examples/saucedemo/.waygraph-auto/2b3401cf.log +20 -0
  107. package/examples/saucedemo/.waygraph-auto/2ceccd6d.log +0 -0
  108. package/examples/saucedemo/.waygraph-auto/2f1b0c13.log +6 -0
  109. package/examples/saucedemo/.waygraph-auto/2f8d4073.log +6 -0
  110. package/examples/saucedemo/.waygraph-auto/30739278.log +6 -0
  111. package/examples/saucedemo/.waygraph-auto/31cb2e80.log +0 -0
  112. package/examples/saucedemo/.waygraph-auto/322d63cd.log +0 -0
  113. package/examples/saucedemo/.waygraph-auto/3239aa8a.log +6 -0
  114. package/examples/saucedemo/.waygraph-auto/326d87b7.log +6 -0
  115. package/examples/saucedemo/.waygraph-auto/3351c0b6.log +0 -0
  116. package/examples/saucedemo/.waygraph-auto/33df0770.log +0 -0
  117. package/examples/saucedemo/.waygraph-auto/340d624d.log +0 -0
  118. package/examples/saucedemo/.waygraph-auto/36367ccf.log +0 -0
  119. package/examples/saucedemo/.waygraph-auto/372536a5.log +6 -0
  120. package/examples/saucedemo/.waygraph-auto/3a412f3c.log +0 -0
  121. package/examples/saucedemo/.waygraph-auto/3a859bd7.log +0 -0
  122. package/examples/saucedemo/.waygraph-auto/3cb0add7.log +0 -0
  123. package/examples/saucedemo/.waygraph-auto/3e42f0d8.log +0 -0
  124. package/examples/saucedemo/.waygraph-auto/4144071d.log +0 -0
  125. package/examples/saucedemo/.waygraph-auto/4176a3c6.log +0 -0
  126. package/examples/saucedemo/.waygraph-auto/41d0793d.log +4 -0
  127. package/examples/saucedemo/.waygraph-auto/424b4d5d.log +0 -0
  128. package/examples/saucedemo/.waygraph-auto/43253aba.log +0 -0
  129. package/examples/saucedemo/.waygraph-auto/438c6c53.log +22 -0
  130. package/examples/saucedemo/.waygraph-auto/4477db12.log +0 -0
  131. package/examples/saucedemo/.waygraph-auto/4a1258b7.log +0 -0
  132. package/examples/saucedemo/.waygraph-auto/4adcd179.log +20 -0
  133. package/examples/saucedemo/.waygraph-auto/4c9d9b16.log +21 -0
  134. package/examples/saucedemo/.waygraph-auto/4da39c36.log +6 -0
  135. package/examples/saucedemo/.waygraph-auto/4dbefa7e.log +5 -0
  136. package/examples/saucedemo/.waygraph-auto/4efa7035.log +6 -0
  137. package/examples/saucedemo/.waygraph-auto/505affdc.log +4 -0
  138. package/examples/saucedemo/.waygraph-auto/51bcb60a.log +0 -0
  139. package/examples/saucedemo/.waygraph-auto/5291bc78.log +22 -0
  140. package/examples/saucedemo/.waygraph-auto/54274c39.log +5 -0
  141. package/examples/saucedemo/.waygraph-auto/5440ce7e.log +0 -0
  142. package/examples/saucedemo/.waygraph-auto/5738175f.log +22 -0
  143. package/examples/saucedemo/.waygraph-auto/57ce5643.log +22 -0
  144. package/examples/saucedemo/.waygraph-auto/5984426b.log +6 -0
  145. package/examples/saucedemo/.waygraph-auto/5a682e7c.log +22 -0
  146. package/examples/saucedemo/.waygraph-auto/5b79320c.log +21 -0
  147. package/examples/saucedemo/.waygraph-auto/5c55aaac.log +21 -0
  148. package/examples/saucedemo/.waygraph-auto/5ed00b16.log +4 -0
  149. package/examples/saucedemo/.waygraph-auto/60b9c066.log +6 -0
  150. package/examples/saucedemo/.waygraph-auto/610dd127.log +0 -0
  151. package/examples/saucedemo/.waygraph-auto/61105500.log +5 -0
  152. package/examples/saucedemo/.waygraph-auto/6134afe8.log +20 -0
  153. package/examples/saucedemo/.waygraph-auto/62a0bdc9.log +22 -0
  154. package/examples/saucedemo/.waygraph-auto/6376fc15.log +0 -0
  155. package/examples/saucedemo/.waygraph-auto/6599cbca.log +22 -0
  156. package/examples/saucedemo/.waygraph-auto/67aaca30.log +0 -0
  157. package/examples/saucedemo/.waygraph-auto/68b10298.log +0 -0
  158. package/examples/saucedemo/.waygraph-auto/68be5e12.log +0 -0
  159. package/examples/saucedemo/.waygraph-auto/68df05a6.log +22 -0
  160. package/examples/saucedemo/.waygraph-auto/693f67c4.log +20 -0
  161. package/examples/saucedemo/.waygraph-auto/69ae030a.log +6 -0
  162. package/examples/saucedemo/.waygraph-auto/69e73f35.log +6 -0
  163. package/examples/saucedemo/.waygraph-auto/6b2333b0.log +5 -0
  164. package/examples/saucedemo/.waygraph-auto/6c4c3817.log +0 -0
  165. package/examples/saucedemo/.waygraph-auto/6c954911.log +0 -0
  166. package/examples/saucedemo/.waygraph-auto/6d65a439.log +5 -0
  167. package/examples/saucedemo/.waygraph-auto/6d700055.log +0 -0
  168. package/examples/saucedemo/.waygraph-auto/6ead848f.log +0 -0
  169. package/examples/saucedemo/.waygraph-auto/72675b2d.log +6 -0
  170. package/examples/saucedemo/.waygraph-auto/733dd260.log +5 -0
  171. package/examples/saucedemo/.waygraph-auto/75016486.log +0 -0
  172. package/examples/saucedemo/.waygraph-auto/752b01c6.log +22 -0
  173. package/examples/saucedemo/.waygraph-auto/75675227.log +6 -0
  174. package/examples/saucedemo/.waygraph-auto/75e2e658.log +0 -0
  175. package/examples/saucedemo/.waygraph-auto/76ac1a86.log +0 -0
  176. package/examples/saucedemo/.waygraph-auto/77605295.log +0 -0
  177. package/examples/saucedemo/.waygraph-auto/792671f4.log +22 -0
  178. package/examples/saucedemo/.waygraph-auto/79915adb.log +20 -0
  179. package/examples/saucedemo/.waygraph-auto/7a398774.log +6 -0
  180. package/examples/saucedemo/.waygraph-auto/7a72f66e.log +6 -0
  181. package/examples/saucedemo/.waygraph-auto/7a984334.log +4 -0
  182. package/examples/saucedemo/.waygraph-auto/7c6ee793.log +20 -0
  183. package/examples/saucedemo/.waygraph-auto/7c726dc4.log +22 -0
  184. package/examples/saucedemo/.waygraph-auto/7c72e8a5.log +4 -0
  185. package/examples/saucedemo/.waygraph-auto/7dbee625.log +22 -0
  186. package/examples/saucedemo/.waygraph-auto/7df66956.log +0 -0
  187. package/examples/saucedemo/.waygraph-auto/7e053160.log +0 -0
  188. package/examples/saucedemo/.waygraph-auto/802a0b5b.log +0 -0
  189. package/examples/saucedemo/.waygraph-auto/80322e0b.log +0 -0
  190. package/examples/saucedemo/.waygraph-auto/80a4978e.log +6 -0
  191. package/examples/saucedemo/.waygraph-auto/81cfe480.log +22 -0
  192. package/examples/saucedemo/.waygraph-auto/832f5add.log +0 -0
  193. package/examples/saucedemo/.waygraph-auto/8337b6ad.log +0 -0
  194. package/examples/saucedemo/.waygraph-auto/8493928e.log +0 -0
  195. package/examples/saucedemo/.waygraph-auto/853bde43.log +0 -0
  196. package/examples/saucedemo/.waygraph-auto/86350ea6.log +22 -0
  197. package/examples/saucedemo/.waygraph-auto/86bb598a.log +0 -0
  198. package/examples/saucedemo/.waygraph-auto/86d09876.log +22 -0
  199. package/examples/saucedemo/.waygraph-auto/878ad01b.log +4 -0
  200. package/examples/saucedemo/.waygraph-auto/87c88ba5.log +0 -0
  201. package/examples/saucedemo/.waygraph-auto/87cb80ff.log +0 -0
  202. package/examples/saucedemo/.waygraph-auto/880b2e78.log +6 -0
  203. package/examples/saucedemo/.waygraph-auto/88527936.log +5 -0
  204. package/examples/saucedemo/.waygraph-auto/893023ea.log +5 -0
  205. package/examples/saucedemo/.waygraph-auto/89416718.log +0 -0
  206. package/examples/saucedemo/.waygraph-auto/8996a857.log +6 -0
  207. package/examples/saucedemo/.waygraph-auto/8a64ba0f.log +6 -0
  208. package/examples/saucedemo/.waygraph-auto/8b1cc2aa.log +6 -0
  209. package/examples/saucedemo/.waygraph-auto/8b73d13e.log +6 -0
  210. package/examples/saucedemo/.waygraph-auto/8d9e5cd2.log +21 -0
  211. package/examples/saucedemo/.waygraph-auto/8ec7d260.log +0 -0
  212. package/examples/saucedemo/.waygraph-auto/8ed43279.log +0 -0
  213. package/examples/saucedemo/.waygraph-auto/93acae32.log +5 -0
  214. package/examples/saucedemo/.waygraph-auto/96321a08.log +0 -0
  215. package/examples/saucedemo/.waygraph-auto/9742b6c2.log +6 -0
  216. package/examples/saucedemo/.waygraph-auto/99cc93eb.log +6 -0
  217. package/examples/saucedemo/.waygraph-auto/9cbfbedc.log +0 -0
  218. package/examples/saucedemo/.waygraph-auto/9dc147d2.log +22 -0
  219. package/examples/saucedemo/.waygraph-auto/a215a395.log +22 -0
  220. package/examples/saucedemo/.waygraph-auto/a23b7086.log +4 -0
  221. package/examples/saucedemo/.waygraph-auto/a35bd5ec.log +0 -0
  222. package/examples/saucedemo/.waygraph-auto/a68995e9.log +22 -0
  223. package/examples/saucedemo/.waygraph-auto/a6e4f936.log +22 -0
  224. package/examples/saucedemo/.waygraph-auto/a7da862b.log +0 -0
  225. package/examples/saucedemo/.waygraph-auto/a82e2a48.log +0 -0
  226. package/examples/saucedemo/.waygraph-auto/a952eb91.log +0 -0
  227. package/examples/saucedemo/.waygraph-auto/a9559653.log +5 -0
  228. package/examples/saucedemo/.waygraph-auto/aa478de2.log +0 -0
  229. package/examples/saucedemo/.waygraph-auto/ac350fc7.log +20 -0
  230. package/examples/saucedemo/.waygraph-auto/acc1b63a.log +0 -0
  231. package/examples/saucedemo/.waygraph-auto/ad12d191.log +0 -0
  232. package/examples/saucedemo/.waygraph-auto/b04638f4.log +6 -0
  233. package/examples/saucedemo/.waygraph-auto/b48863e5.log +22 -0
  234. package/examples/saucedemo/.waygraph-auto/b56968e1.log +6 -0
  235. package/examples/saucedemo/.waygraph-auto/b64e0620.log +20 -0
  236. package/examples/saucedemo/.waygraph-auto/b86a6218.log +6 -0
  237. package/examples/saucedemo/.waygraph-auto/b8e9e956.log +22 -0
  238. package/examples/saucedemo/.waygraph-auto/b9b310ff.log +21 -0
  239. package/examples/saucedemo/.waygraph-auto/bc111745.log +22 -0
  240. package/examples/saucedemo/.waygraph-auto/bf7a77a2.log +0 -0
  241. package/examples/saucedemo/.waygraph-auto/c0d6f353.log +21 -0
  242. package/examples/saucedemo/.waygraph-auto/c0febcf2.log +20 -0
  243. package/examples/saucedemo/.waygraph-auto/c4c52998.log +6 -0
  244. package/examples/saucedemo/.waygraph-auto/c809ceb4.log +22 -0
  245. package/examples/saucedemo/.waygraph-auto/ca6de7e7.log +0 -0
  246. package/examples/saucedemo/.waygraph-auto/ca8561bc.log +0 -0
  247. package/examples/saucedemo/.waygraph-auto/cb86d45b.log +0 -0
  248. package/examples/saucedemo/.waygraph-auto/cb9a1978.log +6 -0
  249. package/examples/saucedemo/.waygraph-auto/cbbc689c.log +6 -0
  250. package/examples/saucedemo/.waygraph-auto/cd88364b.log +0 -0
  251. package/examples/saucedemo/.waygraph-auto/cd919e1d.log +0 -0
  252. package/examples/saucedemo/.waygraph-auto/cfff9eef.log +20 -0
  253. package/examples/saucedemo/.waygraph-auto/d0f59b21.log +4 -0
  254. package/examples/saucedemo/.waygraph-auto/d1195079.log +20 -0
  255. package/examples/saucedemo/.waygraph-auto/d2ef067a.log +5 -0
  256. package/examples/saucedemo/.waygraph-auto/d425471f.log +6 -0
  257. package/examples/saucedemo/.waygraph-auto/d5293921.log +0 -0
  258. package/examples/saucedemo/.waygraph-auto/d62a22c2.log +21 -0
  259. package/examples/saucedemo/.waygraph-auto/d6d1761f.log +22 -0
  260. package/examples/saucedemo/.waygraph-auto/d6d5f411.log +22 -0
  261. package/examples/saucedemo/.waygraph-auto/d6df2771.log +6 -0
  262. package/examples/saucedemo/.waygraph-auto/d7075012.log +21 -0
  263. package/examples/saucedemo/.waygraph-auto/d9ddc297.log +0 -0
  264. package/examples/saucedemo/.waygraph-auto/db4ac845.log +0 -0
  265. package/examples/saucedemo/.waygraph-auto/db6d7774.log +0 -0
  266. package/examples/saucedemo/.waygraph-auto/db839827.log +5 -0
  267. package/examples/saucedemo/.waygraph-auto/dde5e859.log +22 -0
  268. package/examples/saucedemo/.waygraph-auto/de8cac58.log +0 -0
  269. package/examples/saucedemo/.waygraph-auto/dedfcb18.log +0 -0
  270. package/examples/saucedemo/.waygraph-auto/def4d9b1.log +0 -0
  271. package/examples/saucedemo/.waygraph-auto/e1549e40.log +0 -0
  272. package/examples/saucedemo/.waygraph-auto/e1b0676d.log +21 -0
  273. package/examples/saucedemo/.waygraph-auto/e5111463.log +0 -0
  274. package/examples/saucedemo/.waygraph-auto/e5fc1d7c.log +5 -0
  275. package/examples/saucedemo/.waygraph-auto/e6fd2202.log +0 -0
  276. package/examples/saucedemo/.waygraph-auto/edaa806d.log +0 -0
  277. package/examples/saucedemo/.waygraph-auto/edaf33de.log +0 -0
  278. package/examples/saucedemo/.waygraph-auto/edd40cbb.log +20 -0
  279. package/examples/saucedemo/.waygraph-auto/eddfbffc.log +6 -0
  280. package/examples/saucedemo/.waygraph-auto/ee9fa1ad.log +5 -0
  281. package/examples/saucedemo/.waygraph-auto/ef319474.log +22 -0
  282. package/examples/saucedemo/.waygraph-auto/f28eee8d.log +0 -0
  283. package/examples/saucedemo/.waygraph-auto/f33bde90.log +0 -0
  284. package/examples/saucedemo/.waygraph-auto/f6ba7cb4.log +6 -0
  285. package/examples/saucedemo/.waygraph-auto/f7ac4d62.log +20 -0
  286. package/examples/saucedemo/.waygraph-auto/f929bb79.log +0 -0
  287. package/examples/saucedemo/.waygraph-auto/f92d4c6c.log +22 -0
  288. package/examples/saucedemo/.waygraph-auto/f92faf40.log +5 -0
  289. package/examples/saucedemo/.waygraph-auto/fa784369.log +21 -0
  290. package/examples/saucedemo/.waygraph-auto/fb55f723.log +20 -0
  291. package/examples/saucedemo/.waygraph-auto/fba3b738.log +0 -0
  292. package/examples/saucedemo/.waygraph-auto/ffdf2854.log +6 -0
  293. package/examples/saucedemo/README.md +13 -2
  294. package/examples/saucedemo/package.json +4 -0
  295. package/examples/saucedemo/src/flows/api-demo.flow.ts +37 -0
  296. package/examples/saucedemo/src/flows/checkout.flow.ts +34 -11
  297. package/package.json +5 -3
  298. package/dist/auto-explore-run.d.ts +0 -37
  299. package/dist/auto-explore-run.js +0 -670
  300. package/dist/auto-explore.d.ts +0 -57
  301. package/dist/auto-explore.js +0 -376
  302. package/dist/auto-session-ipc.d.ts +0 -150
  303. package/dist/auto-session-ipc.js +0 -497
  304. package/dist/block-inject.d.ts +0 -15
  305. package/dist/block-inject.js +0 -91
  306. package/dist/browser.d.ts +0 -15
  307. package/dist/browser.js +0 -29
  308. package/dist/coverage-gap.d.ts +0 -11
  309. package/dist/coverage-gap.js +0 -119
  310. package/dist/engine.d.ts +0 -12
  311. package/dist/engine.js +0 -13
  312. package/dist/graph.d.ts +0 -92
  313. package/dist/graph.js +0 -467
  314. package/dist/highlight-shorthand.d.ts +0 -24
  315. package/dist/highlight-shorthand.js +0 -30
  316. package/dist/map-check.d.ts +0 -18
  317. package/dist/map-check.js +0 -140
  318. package/dist/overlay-beacon.d.ts +0 -44
  319. package/dist/overlay-beacon.js +0 -85
  320. package/dist/pilot.d.ts +0 -54
  321. package/dist/pilot.js +0 -80
  322. package/dist/practices-check.d.ts +0 -14
  323. package/dist/practices-check.js +0 -195
  324. package/dist/traverse-coverage.d.ts +0 -59
  325. package/dist/traverse-coverage.js +0 -127
  326. package/dist/traverse-lease.d.ts +0 -18
  327. package/dist/traverse-lease.js +0 -62
  328. package/dist/traverse-run.d.ts +0 -47
  329. package/dist/traverse-run.js +0 -439
  330. package/dist/ui/compose.d.ts +0 -4
  331. package/dist/ui/compose.js +0 -7
  332. /package/dist/{verbose-log.d.ts → auto-session/verbose-log.d.ts} +0 -0
  333. /package/dist/{verbose-log.js → auto-session/verbose-log.js} +0 -0
  334. /package/dist/{agent-dive.d.ts → commands/agent-dive-scaffold.d.ts} +0 -0
  335. /package/dist/{engine/core.d.ts → core/block.d.ts} +0 -0
  336. /package/dist/{engine → core}/blocks/nav.d.ts +0 -0
  337. /package/dist/{engine → core}/blocks/page.d.ts +0 -0
  338. /package/dist/{engine → core}/branch-regression.d.ts +0 -0
  339. /package/dist/{engine → core}/compose.d.ts +0 -0
  340. /package/dist/{engine → core}/config.d.ts +0 -0
  341. /package/dist/{engine → core}/config.js +0 -0
  342. /package/dist/{engine → core}/flow.d.ts +0 -0
  343. /package/dist/{engine → core}/locate.d.ts +0 -0
  344. /package/dist/{engine → core}/locate.js +0 -0
  345. /package/dist/{engine → core}/run-graph.d.ts +0 -0
@@ -1,670 +0,0 @@
1
- import { createInterface } from "node:readline/promises";
2
- import { ensureShadowRoot } from "./ui/shadow.js";
3
- import { stdin as input, stdout as output } from "node:process";
4
- import { existsSync, readFileSync } from "node:fs";
5
- import { join } from "node:path";
6
- import { Engine, start, end, locate } from "./engine.js";
7
- import { MemPage } from "./mem-page.js";
8
- import { buildExploreContext, buildExploreMenu, } from "./auto-explore.js";
9
- import { installDemoChrome, instrumentInteractionHighlighting } from "./step-overlay.js";
10
- export function resolveBaseUrl(projectDir) {
11
- const pkgPath = join(projectDir, "package.json");
12
- if (existsSync(pkgPath)) {
13
- try {
14
- const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
15
- const fromPkg = pkg.waygraph?.baseUrl ?? pkg.waygraph?.baseURL;
16
- if (typeof fromPkg === "string" && fromPkg.trim())
17
- return fromPkg.trim();
18
- }
19
- catch {
20
- /* ignore */
21
- }
22
- }
23
- for (const name of ["playwright.config.ts", "playwright.config.mts", "playwright.config.js"]) {
24
- const p = join(projectDir, name);
25
- if (!existsSync(p))
26
- continue;
27
- const m = readFileSync(p, "utf-8").match(/baseURL\s*:\s*["']([^"']+)["']/);
28
- if (m?.[1])
29
- return m[1];
30
- }
31
- return undefined;
32
- }
33
- /** URL-first - several Checkpoints share nav verify traits (e.g. LoggedIn = /inventory.html). */
34
- async function inferCheckpointFromUrl(page) {
35
- try {
36
- const path = new URL(page.url()).pathname;
37
- if (path.includes("inventory-item.html"))
38
- return "ItemDetailPage";
39
- if (path.includes("inventory.html"))
40
- return "LoggedIn";
41
- if (path.includes("cart.html"))
42
- return "CartPage";
43
- if (path.includes("checkout-step-one.html"))
44
- return "CheckoutInfoPage";
45
- if (path.includes("checkout-step-two.html"))
46
- return "CheckoutOverviewPage";
47
- if (path.includes("checkout-complete.html"))
48
- return "OrderComplete";
49
- if (path === "/" || path === "") {
50
- if (await page.locator("#login-button").isVisible({ timeout: 500 }).catch(() => false)) {
51
- return "LoginPage";
52
- }
53
- }
54
- }
55
- catch {
56
- /* ignore */
57
- }
58
- return null;
59
- }
60
- export async function detectHere(page, navBlocks) {
61
- const fromUrl = await inferCheckpointFromUrl(page);
62
- if (fromUrl)
63
- return fromUrl;
64
- const tags = navBlocks.map((n) => n.block);
65
- return locate(page, tags, { timeoutMs: 1500 });
66
- }
67
- export async function ensureLivePage(context, page, startUrl) {
68
- if (!page.isClosed())
69
- return page;
70
- const fresh = await context.newPage();
71
- if (startUrl) {
72
- await fresh.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(() => { });
73
- await fresh.waitForLoadState("load").catch(() => { });
74
- }
75
- return fresh;
76
- }
77
- function missingMemKeys(entry, mem) {
78
- const requires = entry.block.requires ?? [];
79
- return requires.filter((k) => !mem.has(k));
80
- }
81
- const DEFAULT_CREDENTIALS = { username: "standard_user", password: "secret_sauce" };
82
- /**
83
- * Saucedemo-only defaults. Exact key names only — never substring `"login"`.
84
- * A consumer's own `key<string>("login-email")` must stay unset here, or it
85
- * silently gets a saucedemo credentials object instead of its own default.
86
- */
87
- export function defaultMemValueForKey(keyName) {
88
- if (keyName === "login-credentials" ||
89
- keyName === "credentials" ||
90
- keyName === "saucedemo.credentials") {
91
- return DEFAULT_CREDENTIALS;
92
- }
93
- return undefined;
94
- }
95
- function defaultMemJsonPrompt(keyName) {
96
- const def = defaultMemValueForKey(keyName);
97
- if (def !== undefined)
98
- return JSON.stringify(def);
99
- return "{}";
100
- }
101
- function seedMemFromEnv(mem, entry) {
102
- const raw = process.env.WAYGRAPH_DATA ?? process.env.WAYGRAPH_AUTO_MEM;
103
- if (!raw)
104
- return false;
105
- try {
106
- const parsed = JSON.parse(raw);
107
- for (const k of entry.block.requires ?? []) {
108
- if (k.name in parsed)
109
- mem.set(k, parsed[k.name]);
110
- }
111
- return missingMemKeys(entry, mem).length === 0;
112
- }
113
- catch {
114
- return false;
115
- }
116
- }
117
- /** Pre-seed known demo keys (saucedemo creds) so headful/cli do not stop for mem forms. */
118
- export function seedDefaultMem(library, mem) {
119
- const raw = process.env.WAYGRAPH_DATA ?? process.env.WAYGRAPH_AUTO_MEM;
120
- let envParsed = {};
121
- if (raw) {
122
- try {
123
- envParsed = JSON.parse(raw);
124
- }
125
- catch {
126
- /* ignore */
127
- }
128
- }
129
- for (const entry of library.values()) {
130
- for (const k of entry.block.requires ?? []) {
131
- if (mem.has(k))
132
- continue;
133
- if (k.name in envParsed) {
134
- mem.set(k, envParsed[k.name]);
135
- continue;
136
- }
137
- const def = defaultMemValueForKey(k.name);
138
- if (def !== undefined)
139
- mem.set(k, def);
140
- }
141
- }
142
- }
143
- async function promptMemCli(entry, mem) {
144
- const rl = createInterface({ input, output });
145
- try {
146
- for (const k of missingMemKeys(entry, mem)) {
147
- const def = defaultMemJsonPrompt(k.name);
148
- const line = await rl.question(` ${k.name} JSON [${def}]: `);
149
- const json = line.trim() || def;
150
- mem.set(k, JSON.parse(json));
151
- }
152
- }
153
- finally {
154
- rl.close();
155
- }
156
- }
157
- export async function ensureMem(entry, mem, cli) {
158
- if (missingMemKeys(entry, mem).length === 0)
159
- return;
160
- if (seedMemFromEnv(mem, entry))
161
- return;
162
- if (cli) {
163
- console.log(`\nBlock "${entry.block.name}" needs MemPage keys:`);
164
- await promptMemCli(entry, mem);
165
- return;
166
- }
167
- throw new Error(`Block "${entry.block.name}" needs MemPage keys - pass --data '{...}' / WAYGRAPH_DATA (or WAYGRAPH_AUTO_MEM), or enter values in --cli`);
168
- }
169
- async function setAutoPanelRunning(page, label) {
170
- await page
171
- .evaluate((label) => {
172
- const panel = __wgById("wg-auto-panel");
173
- if (!panel)
174
- return;
175
- const body = "<h3>waygraph auto</h3><div style='padding:12px 0;color:#c9a6ff'>" +
176
- "Running: <strong>" +
177
- label +
178
- "</strong></div>";
179
- panel.innerHTML = body;
180
- if (typeof window.__wgWirePanelChrome === "function") {
181
- window.__wgWirePanelChrome(panel, "wg-auto-panel-hidden", "waygraph auto");
182
- }
183
- if (typeof window.__wgStampModal === "function") {
184
- window.__wgStampModal(panel, "auto-panel", {
185
- phase: "running",
186
- block: label,
187
- ready: true,
188
- });
189
- }
190
- else {
191
- panel.setAttribute("data-wg-ui", "1");
192
- panel.setAttribute("data-wg-modal", "auto-panel");
193
- panel.setAttribute("data-wg-phase", "running");
194
- panel.setAttribute("data-wg-ready", "1");
195
- }
196
- }, label)
197
- .catch(() => { });
198
- }
199
- export async function runOneBlock(engine, entry, context, page, mem, headful) {
200
- const navClick = entry.block.__waygraphNavClick;
201
- if (entry.kind === "nav" && navClick !== undefined) {
202
- await page
203
- .evaluate((label) => {
204
- window.__wgPendingNavClickLabel = label;
205
- }, `nav: ${entry.block.name}`)
206
- .catch(() => { });
207
- }
208
- if (headful)
209
- await setAutoPanelRunning(page, entry.block.name);
210
- const flow = engine.defineFlow([start, entry.block, end]);
211
- const BLOCK_TIMEOUT_MS = 45_000;
212
- let timer;
213
- let result;
214
- try {
215
- const ran = await Promise.race([
216
- flow.run(context, mem, { page, closeOnFinish: false }),
217
- new Promise((_, reject) => {
218
- timer = setTimeout(() => reject(new Error(`Block "${entry.block.name}" timed out after ${BLOCK_TIMEOUT_MS / 1000}s - ` +
219
- "click Quit and retry, or check network / mem credentials")), BLOCK_TIMEOUT_MS);
220
- }),
221
- ]);
222
- result = ran.result;
223
- }
224
- finally {
225
- if (timer)
226
- clearTimeout(timer);
227
- }
228
- await page.evaluate("delete window.__wgPendingNavClickLabel").catch(() => { });
229
- return result;
230
- }
231
- const PANEL_CSS = "#wg-auto-panel{position:fixed;z-index:2147483647;left:50%;bottom:12px;transform:translateX(-50%);" +
232
- "max-width:min(92vw,720px);max-height:calc(100vh - 24px);overflow-y:auto;box-sizing:border-box;" +
233
- "background:rgba(20,10,40,.94);color:#fff;border-radius:14px;padding:16px 20px;" +
234
- "font:14px/1.4 system-ui,sans-serif;box-shadow:0 12px 30px rgba(0,0,0,.35);}" +
235
- "#wg-auto-panel h3{margin:0 0 10px;font-size:16px;}" +
236
- "#wg-auto-panel .wg-here{color:#c9a6ff;margin-bottom:12px;}" +
237
- "#wg-auto-panel .wg-actions{display:flex;flex-direction:column;gap:8px;}" +
238
- "#wg-auto-panel button.wg-act{text-align:left;padding:10px 12px;border-radius:10px;border:1px solid #5b3aa8;" +
239
- "background:#2a1450;color:#fff;font:13px/1.3 system-ui,sans-serif;cursor:pointer;}" +
240
- "#wg-auto-panel button.wg-act:hover{background:#3a1d70;}" +
241
- "#wg-auto-panel button.wg-act .wg-kind{color:#a78bfa;font-size:11px;text-transform:uppercase;}" +
242
- "#wg-auto-panel button.wg-quit{margin-top:12px;background:#3a1a1a;border-color:#7f1d1d;}" +
243
- "#wg-auto-panel textarea{width:100%;box-sizing:border-box;margin:6px 0 10px;background:#1a1030;color:#fff;" +
244
- "border:1px solid #5b3aa8;border-radius:8px;padding:8px;font:12px/1.3 monospace;}" +
245
- "#wg-auto-panel label.wg-mem{display:block;margin-top:8px;font-size:12px;color:#ddd;}" +
246
- "#wg-auto-panel .wg-section{margin:12px 0 6px;font-size:11px;font-weight:700;color:#a78bfa;text-transform:uppercase;letter-spacing:.04em;}" +
247
- "#wg-auto-panel .wg-map{margin:8px 0 12px;padding:8px 10px;border-radius:8px;background:rgba(0,0,0,.25);font-size:11px;line-height:1.5;}" +
248
- "#wg-auto-panel .wg-map .wg-cp{opacity:.55;}#wg-auto-panel .wg-map .wg-cp-here{color:#fff;opacity:1;font-weight:700;}" +
249
- "#wg-auto-panel .wg-chrome{display:flex;align-items:center;justify-content:space-between;gap:8px;margin:0 0 8px;}" +
250
- "#wg-auto-panel .wg-chrome-title{font:700 11px/1.2 system-ui,sans-serif;color:#c9a6ff;" +
251
- "letter-spacing:.04em;text-transform:uppercase;}" +
252
- "#wg-auto-panel button.wg-hide-btn{margin:0;padding:4px 10px;font:600 11px system-ui,sans-serif;" +
253
- "background:#3a2a60;color:#e8dcff;border:1px solid #5b3aa8;border-radius:6px;cursor:pointer;}" +
254
- "#wg-auto-panel button.wg-hide-btn:hover{background:#4b2a80;}" +
255
- "#wg-auto-panel.wg-collapsed{width:auto;max-width:90vw;padding:8px 12px;max-height:none;overflow:hidden;}" +
256
- "#wg-auto-panel.wg-collapsed .wg-body{display:none;}" +
257
- "#wg-auto-panel.wg-collapsed .wg-chrome{margin:0;}" +
258
- "@media (max-width:640px){" +
259
- "#wg-auto-panel{left:8px;right:8px;bottom:8px;transform:none;max-width:none;width:auto;" +
260
- "max-height:min(55vh,calc(100vh - 16px));padding:12px 14px;border-radius:12px;}" +
261
- "#wg-auto-panel.wg-collapsed{left:50%;right:auto;transform:translateX(-50%);width:auto;}" +
262
- "#wg-auto-panel button.wg-act{padding:12px;font-size:14px;}" +
263
- "}";
264
- function esc(s) {
265
- return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/"/g, "&quot;");
266
- }
267
- /** Shown in the headful panel after each Block run. */
268
- let lastRunNote = null;
269
- /**
270
- * Mem keys any Block on the current menu might read this turn - minus keys a
271
- * dynamic `instanceOptions` row already answers by picking it (e.g. "which
272
- * item to add to cart" comes from the menu row itself, not a hand-typed JSON
273
- * textarea).
274
- */
275
- function memKeysForMenu(menu, library) {
276
- const instanceKeys = new Set();
277
- for (const edge of menu.flat) {
278
- if (edge.instanceOption)
279
- instanceKeys.add(edge.instanceOption.key);
280
- }
281
- const keys = new Map();
282
- for (const edge of menu.flat) {
283
- const entry = library.get(edge.block);
284
- for (const k of entry?.block.requires ?? []) {
285
- if (instanceKeys.has(k))
286
- continue;
287
- keys.set(k.name, k);
288
- }
289
- }
290
- return [...keys.values()];
291
- }
292
- async function syncPanelMem(page, mem, keys) {
293
- if (keys.length === 0)
294
- return;
295
- await ensureShadowRoot(page);
296
- const edits = (await page.evaluate(() => {
297
- const out = {};
298
- __wgQA("textarea.wg-mem-input").forEach((ta) => {
299
- const key = ta.getAttribute("data-mem-key");
300
- if (key)
301
- out[key] = ta.value;
302
- });
303
- return out;
304
- }));
305
- for (const k of keys) {
306
- const raw = edits[k.name];
307
- if (raw === undefined)
308
- continue;
309
- try {
310
- mem.set(k, JSON.parse(raw));
311
- }
312
- catch (err) {
313
- throw new Error(`Invalid JSON for mem key "${k.name}": ${err instanceof Error ? err.message : String(err)}`);
314
- }
315
- }
316
- }
317
- function armPickWait() {
318
- let resolve;
319
- const promise = new Promise((res) => {
320
- resolve = res;
321
- });
322
- return { promise, resolve };
323
- }
324
- async function headfulPick(page, menu, library, mem, waitPick) {
325
- const here = menu.here;
326
- const hereLabel = here ?? (menu.flat.length > 0 ? "Unknown - pick Start here" : "Unknown - no moves available");
327
- const menuMemKeys = memKeysForMenu(menu, library);
328
- let html = `<style id="wg-auto-style">${PANEL_CSS}</style><div id="wg-auto-panel">` +
329
- `<h3>waygraph auto</h3>`;
330
- if (lastRunNote) {
331
- html += `<div style="margin-bottom:8px;font-size:12px;color:#a7f3d0">${esc(lastRunNote)}</div>`;
332
- }
333
- html += `<div class="wg-here">You are here: <strong>${esc(hereLabel)}</strong></div>`;
334
- if (menuMemKeys.length > 0) {
335
- html +=
336
- `<div class="wg-section">Mem - edit credentials, then click a block below</div>`;
337
- let memIdx = 0;
338
- for (const k of menuMemKeys) {
339
- let value = "{}";
340
- try {
341
- if (mem.has(k))
342
- value = JSON.stringify(mem.get(k), null, 2);
343
- else {
344
- const def = defaultMemValueForKey(k.name);
345
- if (def !== undefined)
346
- value = JSON.stringify(def, null, 2);
347
- }
348
- }
349
- catch {
350
- /* ignore */
351
- }
352
- html +=
353
- `<label class="wg-mem">${esc(k.name)}</label>` +
354
- `<textarea class="wg-mem-input" data-mem-key="${esc(k.name)}" id="wg-mem-${memIdx}" rows="4">${esc(value)}</textarea>`;
355
- memIdx++;
356
- }
357
- }
358
- html += `<div class="wg-actions">`;
359
- let idx = 0;
360
- if (menu.sections.length === 0) {
361
- html += `<div style="opacity:.85;padding:8px 0">No moves from this screen right now.</div>`;
362
- }
363
- for (const section of menu.sections) {
364
- html += `<div class="wg-section">${esc(section.title)}</div>`;
365
- for (const c of section.edges) {
366
- const entry = library.get(c.block);
367
- const navClick = entry?.block?.__waygraphNavClick;
368
- const hl = c.instanceOption?.highlight ?? (typeof navClick === "string" ? navClick : undefined);
369
- const hlAttr = hl ? ` data-hl="${esc(hl)}"` : "";
370
- if (c.label) {
371
- html += `<button class="wg-act" data-idx="${idx}"${hlAttr}>${esc(c.label)}</button>`;
372
- }
373
- else {
374
- const desc = entry?.description ? `<br><span style="opacity:.85">${esc(entry.description)}</span>` : "";
375
- html +=
376
- `<button class="wg-act" data-idx="${idx}"${hlAttr}><span class="wg-kind">${esc(c.kind)}</span> ` +
377
- `<strong>${esc(c.block)}</strong> -> ${esc(c.to)}${desc}</button>`;
378
- }
379
- idx++;
380
- }
381
- }
382
- html += `</div><button class="wg-act wg-quit" data-quit="1">Quit</button></div>`;
383
- // Wrap body; chrome + Hide/Show wired in page (shared with stepper).
384
- html =
385
- `<style id="wg-auto-style">${PANEL_CSS}</style><div id="wg-auto-panel">` +
386
- html.slice(html.indexOf("<h3>"));
387
- await ensureShadowRoot(page);
388
- await page.evaluate(`((inner) => {
389
- let panel = __wgById("wg-auto-panel");
390
- if (!panel) {
391
- panel = document.createElement("div");
392
- __wgAdd(panel);
393
- }
394
- panel.outerHTML = inner;
395
- const root = __wgById("wg-auto-panel");
396
- if (!root) return;
397
- window.__wgWirePanelChrome = (el, storageKey, chromeTitle) => {
398
- if (!el) return;
399
- if (!el.querySelector(":scope > .wg-chrome")) {
400
- const body = document.createElement("div");
401
- body.className = "wg-body";
402
- while (el.firstChild) body.appendChild(el.firstChild);
403
- const chrome = document.createElement("div");
404
- chrome.className = "wg-chrome";
405
- const titleEl = document.createElement("span");
406
- titleEl.className = "wg-chrome-title";
407
- titleEl.textContent = chromeTitle || "waygraph auto";
408
- const btn = document.createElement("button");
409
- btn.type = "button";
410
- btn.className = "wg-hide-btn";
411
- btn.setAttribute("data-wg-toggle", "1");
412
- btn.textContent = "Hide";
413
- chrome.appendChild(titleEl);
414
- chrome.appendChild(btn);
415
- el.appendChild(chrome);
416
- el.appendChild(body);
417
- }
418
- const apply = (hidden) => {
419
- el.classList.toggle("wg-collapsed", hidden);
420
- el.setAttribute("data-wg-collapsed", hidden ? "1" : "0");
421
- const t = el.querySelector("[data-wg-toggle]");
422
- if (t) t.textContent = hidden ? "Show" : "Hide";
423
- try { localStorage.setItem(storageKey, hidden ? "1" : "0"); } catch {}
424
- };
425
- let hidden = false;
426
- try { hidden = localStorage.getItem(storageKey) === "1"; } catch {}
427
- apply(hidden);
428
- const toggle = el.querySelector("[data-wg-toggle]");
429
- if (toggle && !toggle.dataset.wgWired) {
430
- toggle.dataset.wgWired = "1";
431
- toggle.addEventListener("click", (e) => {
432
- e.stopPropagation();
433
- apply(!el.classList.contains("wg-collapsed"));
434
- });
435
- }
436
- };
437
- window.__wgWirePanelChrome(root, "wg-auto-panel-hidden", "waygraph auto");
438
- if (typeof window.__wgStampModal === "function") {
439
- window.__wgStampModal(root, "auto-panel", { phase: "pick", ready: true });
440
- } else {
441
- root.setAttribute("data-wg-ui", "1");
442
- root.setAttribute("data-wg-modal", "auto-panel");
443
- root.setAttribute("data-wg-phase", "pick");
444
- root.setAttribute(
445
- "data-wg-collapsed",
446
- root.classList.contains("wg-collapsed") ? "1" : "0",
447
- );
448
- root.setAttribute("data-wg-ready", "1");
449
- window.__wgOverlayBeacon =
450
- window.__wgOverlayBeacon ||
451
- (() =>
452
- Array.from(__wgQA('[data-wg-ui="1"]')).map((el) => {
453
- const r = el.getBoundingClientRect();
454
- const st = getComputedStyle(el);
455
- return {
456
- id: el.id || null,
457
- modal: el.getAttribute("data-wg-modal"),
458
- ready: el.getAttribute("data-wg-ready") === "1",
459
- phase: el.getAttribute("data-wg-phase"),
460
- step: el.getAttribute("data-wg-step"),
461
- block: el.getAttribute("data-wg-block"),
462
- collapsed:
463
- el.getAttribute("data-wg-collapsed") === "1" ||
464
- el.classList.contains("wg-collapsed"),
465
- opacity: st.opacity,
466
- textLen: (el.innerText || "").trim().length,
467
- w: Math.round(r.width),
468
- h: Math.round(r.height),
469
- visible: r.width > 0 && r.height > 0 && Number(st.opacity) > 0.05,
470
- };
471
- }));
472
- }
473
- root.querySelectorAll("button[data-idx]").forEach((btn) => {
474
- btn.addEventListener("click", () => {
475
- const idx = Number(btn.getAttribute("data-idx"));
476
- window.__wgAutoPick?.(idx);
477
- });
478
- btn.addEventListener("mouseenter", () => {
479
- const sel = btn.getAttribute("data-hl");
480
- if (!sel) return;
481
- const el = document.querySelector(sel);
482
- if (!el || typeof window.__wgPositionRing !== "function") return;
483
- const r = el.getBoundingClientRect();
484
- if (r.width < 1 && r.height < 1) return;
485
- window.__wgPositionRing(
486
- { x: r.x, y: r.y, width: r.width, height: r.height },
487
- btn.textContent?.trim()?.slice(0, 80) || "target",
488
- "auto",
489
- );
490
- });
491
- btn.addEventListener("mouseleave", () => {
492
- window.__wgHideRing?.();
493
- });
494
- });
495
- const quit = root.querySelector("[data-quit]");
496
- if (quit) quit.addEventListener("click", () => window.__wgAutoQuit?.());
497
- })(${JSON.stringify(html)})`);
498
- return waitPick();
499
- }
500
- function printCliMenu(menu, library) {
501
- console.log("");
502
- console.log(`You are here: ${menu.here ?? "Unknown (pick Start here)"}`);
503
- console.log("");
504
- if (menu.flat.length === 0) {
505
- console.log(" (no moves available on this page)");
506
- }
507
- let n = 0;
508
- for (const section of menu.sections) {
509
- console.log(` -- ${section.title} --`);
510
- for (const c of section.edges) {
511
- const entry = library.get(c.block);
512
- n++;
513
- if (c.label) {
514
- console.log(` [${n}] ${c.label}`);
515
- }
516
- else {
517
- const desc = entry?.description ? ` - ${entry.description}` : "";
518
- console.log(` [${n}] ${c.block} (${c.kind}) -> ${c.to}${desc}`);
519
- }
520
- }
521
- }
522
- console.log(" [q] quit");
523
- console.log("");
524
- }
525
- async function cliPick(menu, rl) {
526
- while (true) {
527
- const ans = (await rl.question("Choose: ")).trim().toLowerCase();
528
- if (ans === "q" || ans === "quit")
529
- return { type: "quit" };
530
- const n = Number(ans);
531
- if (Number.isInteger(n) && n >= 1 && n <= menu.flat.length) {
532
- return { type: "pick", index: n - 1 };
533
- }
534
- console.log("Enter a number from the list, or q to quit.");
535
- }
536
- }
537
- /**
538
- * Interactive waygraph auto: locate current Checkpoint, list runnable Blocks, pick one, repeat.
539
- */
540
- export async function runAutoExplore(projectDir, options = {}) {
541
- lastRunNote = null;
542
- const cli = options.cli === true;
543
- const baseURL = options.baseURL ?? resolveBaseUrl(projectDir) ?? process.env.WAYGRAPH_BASE_URL;
544
- const startUrl = options.startUrl ?? baseURL;
545
- const { graph, library } = await buildExploreContext(projectDir, options.blocksSelect ? { blocksSelect: options.blocksSelect } : undefined);
546
- if (options.blocksSelect) {
547
- console.error(`waygraph auto: --blocks ${options.blocksSelect.raw} → ` +
548
- `${library.byName.size} block(s), ${graph.edges.length} edge(s)`);
549
- }
550
- const mem = new MemPage();
551
- seedDefaultMem(library.byName, mem);
552
- const engine = cli ? new Engine({ headless: true }) : new Engine({ headless: false, slowMo: 250 });
553
- const { chromium } = await import("@playwright/test");
554
- const executablePath = process.env.CHROME_PATH || process.env.CHROMIUM_PATH;
555
- const launchOpts = {
556
- headless: cli,
557
- args: cli ? [] : ["--start-maximized"],
558
- };
559
- if (!cli)
560
- launchOpts.slowMo = 250;
561
- if (executablePath)
562
- launchOpts.executablePath = executablePath;
563
- const browser = await chromium.launch(launchOpts);
564
- const contextOpts = cli
565
- ? { viewport: { width: 1280, height: 720 } }
566
- : { viewport: null };
567
- if (baseURL)
568
- contextOpts.baseURL = baseURL;
569
- const context = await browser.newContext(contextOpts);
570
- let page = await context.newPage();
571
- if (startUrl) {
572
- await page.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(() => { });
573
- await page.waitForLoadState("load").catch(() => { });
574
- }
575
- console.error(`waygraph auto: ${graph.nodes.length} checkpoint(s), ${graph.edges.length} edge(s) - ` +
576
- (cli ? "CLI picker (terminal menu)" : "headful picker (browser panel)"));
577
- const pickSlot = { resolve: null };
578
- let wiredPage = null;
579
- async function wirePage(target) {
580
- if (wiredPage === target)
581
- return;
582
- await target.exposeFunction("__wgAutoPick", (index) => {
583
- pickSlot.resolve?.({ type: "pick", index });
584
- });
585
- await target.exposeFunction("__wgAutoQuit", () => {
586
- pickSlot.resolve?.({ type: "quit" });
587
- });
588
- if (!cli) {
589
- await installDemoChrome(target, "", { banner: false });
590
- instrumentInteractionHighlighting(target, mem, 250);
591
- }
592
- wiredPage = target;
593
- }
594
- let here = null;
595
- const cliRl = cli ? createInterface({ input, output }) : null;
596
- try {
597
- for (;;) {
598
- page = await ensureLivePage(context, page, startUrl);
599
- await wirePage(page);
600
- const pickWait = armPickWait();
601
- pickSlot.resolve = pickWait.resolve;
602
- if (here === null) {
603
- here = await detectHere(page, library.navBlocks);
604
- }
605
- if (cli)
606
- console.error("waygraph auto: scanning page for moves ...");
607
- const menu = await buildExploreMenu(page, graph, library, here);
608
- if (cli)
609
- console.error(`waygraph auto: ${menu.flat.length} move(s) available`);
610
- if (menu.flat.length === 0) {
611
- const fromHere = graph.edges.filter((e) => e.from === here).map((e) => e.block);
612
- const missing = [...new Set(fromHere)].filter((b) => !library.byName.has(b));
613
- console.error(here
614
- ? `waygraph auto: no runnable Blocks on "${here}"` +
615
- (fromHere.length
616
- ? ` (graph has: ${[...new Set(fromHere)].join(", ")}${missing.length ? `; not loaded: ${missing.join(", ")}` : ""})`
617
- : " - nothing on this page matches the graph.") +
618
- (cli ? "" : " Tip: waygraph auto --cli")
619
- : "waygraph auto: location unknown - pick nav-login (Start here) if shown.");
620
- if (cli)
621
- break;
622
- }
623
- let pick;
624
- if (cli && cliRl) {
625
- printCliMenu(menu, library.byName);
626
- pick = await cliPick(menu, cliRl);
627
- }
628
- else {
629
- pick = await headfulPick(page, menu, library.byName, mem, () => pickWait.promise);
630
- }
631
- if (pick.type === "quit")
632
- break;
633
- if (pick.index < 0 || pick.index >= menu.flat.length)
634
- continue;
635
- const edge = menu.flat[pick.index];
636
- const entry = library.byName.get(edge.block);
637
- if (!entry) {
638
- console.error(`waygraph auto: Block "${edge.block}" not loaded - skipped`);
639
- continue;
640
- }
641
- try {
642
- if (edge.instanceOption) {
643
- mem.set(edge.instanceOption.key, edge.instanceOption.value);
644
- }
645
- if (!cli && (entry.block.requires?.length ?? 0) > 0) {
646
- await syncPanelMem(page, mem, entry.block.requires ?? []);
647
- }
648
- else {
649
- await ensureMem(entry, mem, cli);
650
- }
651
- const pickLabel = edge.label ?? entry.block.name;
652
- console.error(`waygraph auto: running [${pick.index + 1}] ${pickLabel} ...`);
653
- const result = await runOneBlock(engine, entry, context, page, mem, !cli);
654
- // Trust block output over locate() - nav verify traits collide on /dashboard.
655
- here = result.__state ?? edge.to;
656
- lastRunNote = `${entry.block.name} -> ${here}`;
657
- console.error(`waygraph auto: ran ${entry.block.name} -> ${here}`);
658
- }
659
- catch (err) {
660
- lastRunNote = `${entry.block.name} failed`;
661
- console.error(`waygraph auto: ${entry.block.name} failed - ${err instanceof Error ? err.message : String(err)}`);
662
- }
663
- }
664
- }
665
- finally {
666
- cliRl?.close();
667
- await context.close();
668
- await browser.close();
669
- }
670
- }