waygraph 0.15.54 → 0.16.1

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 (552) hide show
  1. package/README.md +8 -3
  2. package/bin/waygraph +2 -2
  3. package/dist/analysis/check.d.ts +38 -0
  4. package/dist/analysis/check.js +87 -0
  5. package/dist/analysis/coverage-gap.d.ts +1 -1
  6. package/dist/analysis/coverage-gap.js +14 -37
  7. package/dist/analysis/flow-source.d.ts +9 -0
  8. package/dist/analysis/flow-source.js +25 -0
  9. package/dist/analysis/graph.d.ts +10 -14
  10. package/dist/analysis/graph.js +48 -371
  11. package/dist/analysis/map-check.js +4 -39
  12. package/dist/analysis/practices-check.d.ts +1 -1
  13. package/dist/analysis/practices-check.js +24 -45
  14. package/dist/cli/args.d.ts +23 -0
  15. package/dist/cli/args.js +20 -0
  16. package/dist/{cli.d.ts → cli/cli.d.ts} +0 -1
  17. package/dist/{cli.js → cli/cli.js} +10 -9
  18. package/dist/{commands → cli/commands}/agent-dive-scaffold.js +35 -64
  19. package/dist/cli/commands/agent-dive.js +42 -0
  20. package/dist/cli/commands/browser.d.ts +2 -0
  21. package/dist/cli/commands/browser.js +109 -0
  22. package/dist/{commands → cli/commands}/check.d.ts +0 -1
  23. package/dist/cli/commands/check.js +104 -0
  24. package/dist/cli/commands/codemod-checkpoints.d.ts +18 -0
  25. package/dist/cli/commands/codemod-checkpoints.js +186 -0
  26. package/dist/cli/commands/codemod-flows.d.ts +18 -0
  27. package/dist/cli/commands/codemod-flows.js +284 -0
  28. package/dist/cli/commands/codemod-stubs.d.ts +10 -0
  29. package/dist/cli/commands/codemod-stubs.js +187 -0
  30. package/dist/{commands → cli/commands}/extensions.js +5 -4
  31. package/dist/{commands → cli/commands}/init.js +1 -2
  32. package/dist/{commands → cli/commands}/list.js +9 -7
  33. package/dist/cli/commands/manifest.d.ts +2 -0
  34. package/dist/cli/commands/manifest.js +20 -0
  35. package/dist/cli/commands/map.js +57 -0
  36. package/dist/cli/commands/pilot.d.ts +2 -0
  37. package/dist/cli/commands/pilot.js +102 -0
  38. package/dist/{commands → cli/commands}/run.d.ts +0 -1
  39. package/dist/cli/commands/run.js +64 -0
  40. package/dist/cli/commands/session-ops.d.ts +3 -0
  41. package/dist/cli/commands/session-ops.js +257 -0
  42. package/dist/cli/commands/session.js +132 -0
  43. package/dist/{commands → cli/commands}/test.js +11 -14
  44. package/dist/cli/commands/traverse.js +105 -0
  45. package/dist/{commands → cli/commands}/try.js +29 -25
  46. package/dist/{commands → cli/commands}/upgrade.js +40 -4
  47. package/dist/cli/flags.d.ts +193 -16
  48. package/dist/cli/flags.js +179 -234
  49. package/dist/cli/run-chain.d.ts +1 -0
  50. package/dist/cli/run-chain.js +42 -7
  51. package/dist/cli/usage.d.ts +1 -1
  52. package/dist/cli/usage.js +21 -53
  53. package/dist/cli/util.d.ts +2 -2
  54. package/dist/cli/util.js +2 -3
  55. package/dist/{highlights → demo/narration}/css.d.ts +1 -1
  56. package/dist/{highlights → demo/narration}/css.js +2 -3
  57. package/dist/{highlights → demo/narration}/demo-pace.d.ts +4 -12
  58. package/dist/{highlights → demo/narration}/demo-pace.js +5 -11
  59. package/dist/{highlights → demo/narration}/device.d.ts +4 -4
  60. package/dist/{highlights → demo/narration}/device.js +1 -1
  61. package/dist/demo/narration/merge.d.ts +10 -0
  62. package/dist/demo/narration/merge.js +67 -0
  63. package/dist/demo/narration/narration.d.ts +39 -0
  64. package/dist/{highlights/run-phase.js → demo/narration/narration.js} +25 -94
  65. package/dist/{highlights → demo/narration}/shorthand.d.ts +1 -1
  66. package/dist/demo/narration/stub-ctx.d.ts +8 -0
  67. package/dist/demo/narration/stub-ctx.js +164 -0
  68. package/dist/{highlights → demo/narration}/style.d.ts +1 -7
  69. package/dist/{highlights → demo/narration}/style.js +1 -41
  70. package/dist/{highlights → demo/narration}/todo-dock.d.ts +8 -8
  71. package/dist/{highlights → demo/narration}/todo-dock.js +13 -30
  72. package/dist/demo/overlay/auto-chrome.d.ts +7 -0
  73. package/dist/demo/overlay/auto-chrome.js +97 -0
  74. package/dist/demo/overlay/cursor.d.ts +19 -0
  75. package/dist/demo/overlay/cursor.js +142 -0
  76. package/dist/demo/overlay/device-stage.d.ts +26 -0
  77. package/dist/demo/overlay/device-stage.js +396 -0
  78. package/dist/demo/overlay/inpage/banner.d.ts +2 -0
  79. package/dist/demo/overlay/inpage/banner.js +160 -0
  80. package/dist/demo/overlay/inpage/caption.d.ts +2 -0
  81. package/dist/demo/overlay/inpage/caption.js +24 -0
  82. package/dist/demo/overlay/inpage/core.d.ts +2 -0
  83. package/dist/demo/overlay/inpage/core.js +345 -0
  84. package/dist/demo/overlay/inpage/device-chip.d.ts +1 -0
  85. package/dist/demo/overlay/inpage/device-chip.js +191 -0
  86. package/dist/demo/overlay/inpage/network.d.ts +10 -0
  87. package/dist/demo/overlay/inpage/network.js +189 -0
  88. package/dist/demo/overlay/inpage/panel-chrome.d.ts +1 -0
  89. package/dist/demo/overlay/inpage/panel-chrome.js +203 -0
  90. package/dist/demo/overlay/inpage/stamp.d.ts +1 -0
  91. package/dist/demo/overlay/inpage/stamp.js +46 -0
  92. package/dist/demo/overlay/inpage/swipe-zoom.d.ts +1 -0
  93. package/dist/demo/overlay/inpage/swipe-zoom.js +220 -0
  94. package/dist/demo/overlay/inpage/todos.d.ts +2 -0
  95. package/dist/demo/overlay/inpage/todos.js +293 -0
  96. package/dist/demo/overlay/locator-theater.d.ts +25 -0
  97. package/dist/demo/overlay/locator-theater.js +76 -0
  98. package/dist/demo/overlay/network-capture.d.ts +22 -0
  99. package/dist/demo/overlay/network-capture.js +127 -0
  100. package/dist/demo/overlay/overlay-css.d.ts +3 -0
  101. package/dist/demo/overlay/overlay-css.js +369 -0
  102. package/dist/demo/overlay/overlay-stage.d.ts +31 -0
  103. package/dist/demo/overlay/overlay-stage.js +106 -0
  104. package/dist/demo/overlay/overlay.d.ts +10 -0
  105. package/dist/demo/overlay/overlay.js +89 -0
  106. package/dist/{pilot-overlay/overlay-fixtures.d.ts → demo/overlay/phase-fixtures.d.ts} +2 -2
  107. package/dist/{pilot-overlay/overlay-fixtures.js → demo/overlay/phase-fixtures.js} +2 -2
  108. package/dist/{pilot-overlay/action-ring.js → demo/overlay/pilot/actions.js} +2 -1
  109. package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.d.ts +6 -5
  110. package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.js +19 -18
  111. package/dist/{pilot-overlay → demo/overlay/pilot}/shell.d.ts +2 -2
  112. package/dist/{pilot-overlay → demo/overlay/pilot}/shell.js +13 -22
  113. package/dist/demo/overlay/reattach.d.ts +7 -0
  114. package/dist/demo/overlay/reattach.js +23 -0
  115. package/dist/demo/overlay/rings.d.ts +61 -0
  116. package/dist/demo/overlay/rings.js +422 -0
  117. package/dist/{ui → demo/overlay/ui}/components/ring.js +2 -2
  118. package/dist/{ui → demo/overlay/ui}/overlay.css +4 -4
  119. package/dist/{ui → demo/overlay/ui}/shadow.d.ts +1 -1
  120. package/dist/{ui → demo/overlay/ui}/shadow.js +39 -2
  121. package/dist/demo/stepper/after.d.ts +3 -0
  122. package/dist/demo/stepper/after.js +103 -0
  123. package/dist/demo/stepper/banner-log.d.ts +35 -0
  124. package/dist/demo/stepper/banner-log.js +65 -0
  125. package/dist/demo/stepper/before.d.ts +4 -0
  126. package/dist/demo/stepper/before.js +110 -0
  127. package/dist/demo/stepper/demo-log.d.ts +48 -0
  128. package/dist/demo/stepper/demo-log.js +292 -0
  129. package/dist/demo/stepper/gate.d.ts +11 -0
  130. package/dist/demo/stepper/gate.js +78 -0
  131. package/dist/demo/stepper/interaction-patch.d.ts +4 -0
  132. package/dist/demo/stepper/interaction-patch.js +323 -0
  133. package/dist/demo/stepper/pacing.d.ts +21 -0
  134. package/dist/demo/stepper/pacing.js +23 -0
  135. package/dist/demo/stepper/panel-after.d.ts +17 -0
  136. package/dist/demo/stepper/panel-after.js +166 -0
  137. package/dist/demo/stepper/panel-before.d.ts +12 -0
  138. package/dist/demo/stepper/panel-before.js +241 -0
  139. package/dist/demo/stepper/slides.d.ts +23 -0
  140. package/dist/demo/stepper/slides.js +233 -0
  141. package/dist/demo/stepper/step-panels.d.ts +69 -0
  142. package/dist/demo/stepper/step-panels.js +172 -0
  143. package/dist/demo/stepper/stepper.d.ts +24 -0
  144. package/dist/demo/stepper/stepper.js +122 -0
  145. package/dist/demo/stepper/teardown.d.ts +47 -0
  146. package/dist/demo/stepper/teardown.js +178 -0
  147. package/dist/demo/stepper/todo-advance.d.ts +15 -0
  148. package/dist/demo/stepper/todo-advance.js +110 -0
  149. package/dist/demo/stepper/view.d.ts +58 -0
  150. package/dist/demo/stepper/view.js +31 -0
  151. package/dist/demo/types.d.ts +85 -0
  152. package/dist/demo/verbose-log.js +15 -0
  153. package/dist/engine/block/action-page.d.ts +53 -0
  154. package/dist/engine/block/action-page.js +1 -0
  155. package/dist/{types.d.ts → engine/block/block.d.ts} +102 -142
  156. package/dist/{core → engine/block}/block.js +12 -130
  157. package/dist/engine/block/branch.d.ts +17 -0
  158. package/dist/engine/block/branch.js +40 -0
  159. package/dist/{core → engine/block}/compose.d.ts +9 -7
  160. package/dist/{core → engine/block}/compose.js +1 -1
  161. package/dist/engine/block/dialog.d.ts +13 -0
  162. package/dist/engine/block/dialog.js +37 -0
  163. package/dist/{core/blocks → engine/block/kinds}/api.d.ts +16 -12
  164. package/dist/{core/blocks → engine/block/kinds}/api.js +26 -18
  165. package/dist/{core/blocks → engine/block/kinds}/effect.d.ts +13 -18
  166. package/dist/engine/block/kinds/effect.js +17 -0
  167. package/dist/{core/blocks → engine/block/kinds}/method.d.ts +17 -29
  168. package/dist/{core/blocks → engine/block/kinds}/method.js +6 -21
  169. package/dist/{core/blocks → engine/block/kinds}/nav.d.ts +21 -31
  170. package/dist/{core/blocks → engine/block/kinds}/nav.js +6 -12
  171. package/dist/{core/blocks → engine/block/kinds}/page.d.ts +14 -20
  172. package/dist/{core/blocks → engine/block/kinds}/page.js +5 -7
  173. package/dist/engine/checkpoint/checkpoint.d.ts +22 -0
  174. package/dist/engine/checkpoint/checkpoint.js +8 -0
  175. package/dist/engine/checkpoint/route.d.ts +28 -0
  176. package/dist/engine/checkpoint/route.js +28 -0
  177. package/dist/{core → engine}/config.d.ts +7 -2
  178. package/dist/engine/config.js +6 -0
  179. package/dist/engine/engine.d.ts +45 -0
  180. package/dist/{core → engine}/engine.js +6 -10
  181. package/dist/engine/env.d.ts +59 -0
  182. package/dist/engine/env.js +83 -0
  183. package/dist/{errors.d.ts → engine/errors.d.ts} +22 -22
  184. package/dist/{errors.js → engine/errors.js} +22 -22
  185. package/dist/{core → engine/flow}/branch-regression.d.ts +7 -7
  186. package/dist/{core → engine/flow}/branch-regression.js +4 -3
  187. package/dist/engine/flow/flow.d.ts +162 -0
  188. package/dist/engine/flow/flow.js +244 -0
  189. package/dist/engine/flow/map-branch.d.ts +9 -0
  190. package/dist/engine/flow/map-branch.js +57 -0
  191. package/dist/{core → engine/flow}/map-builder.d.ts +34 -54
  192. package/dist/engine/flow/map-builder.js +242 -0
  193. package/dist/engine/flow/map-steps.d.ts +30 -0
  194. package/dist/engine/flow/map-steps.js +87 -0
  195. package/dist/{core → engine}/locate.d.ts +1 -1
  196. package/dist/{core → engine}/locate.js +1 -2
  197. package/dist/{mem-stub.d.ts → engine/mem/mem-stub.d.ts} +9 -8
  198. package/dist/{mem-stub.js → engine/mem/mem-stub.js} +2 -2
  199. package/dist/{mem-page.d.ts → engine/mem/mem.d.ts} +1 -1
  200. package/dist/{mem-page.js → engine/mem/mem.js} +2 -1
  201. package/dist/engine/page-gone.d.ts +5 -0
  202. package/dist/engine/page-gone.js +20 -0
  203. package/dist/engine/run/connect.d.ts +28 -0
  204. package/dist/{types.js → engine/run/connect.js} +11 -10
  205. package/dist/engine/run/events.d.ts +67 -0
  206. package/dist/engine/run/events.js +90 -0
  207. package/dist/engine/run/hooks.d.ts +16 -0
  208. package/dist/engine/run/hooks.js +8 -0
  209. package/dist/engine/run/launch.d.ts +13 -0
  210. package/dist/engine/run/launch.js +27 -0
  211. package/dist/{core/run-graph.d.ts → engine/run/run.d.ts} +8 -12
  212. package/dist/{core/run-graph.js → engine/run/run.js} +22 -12
  213. package/dist/engine/stub/pace.d.ts +12 -0
  214. package/dist/engine/stub/pace.js +2 -0
  215. package/dist/engine/stub/ring.d.ts +130 -0
  216. package/dist/engine/stub/ring.js +41 -0
  217. package/dist/engine/stub/stub.d.ts +268 -0
  218. package/dist/engine/stub/stub.js +1 -0
  219. package/dist/engine/stub/todos.d.ts +104 -0
  220. package/dist/engine/stub/todos.js +2 -0
  221. package/dist/engine/stub/viewport.d.ts +26 -0
  222. package/dist/engine/stub/viewport.js +2 -0
  223. package/dist/{trait.d.ts → engine/trait/trait.d.ts} +1 -1
  224. package/dist/{trait.js → engine/trait/trait.js} +1 -1
  225. package/dist/index.d.ts +88 -36
  226. package/dist/index.js +46 -19
  227. package/dist/live/auto/auto.d.ts +22 -0
  228. package/dist/live/auto/auto.js +207 -0
  229. package/dist/{session/auto-explore.d.ts → live/auto/explore.d.ts} +4 -14
  230. package/dist/{session/auto-explore.js → live/auto/explore.js} +21 -127
  231. package/dist/live/auto/mem.d.ts +11 -0
  232. package/dist/live/auto/mem.js +85 -0
  233. package/dist/live/auto/menu.d.ts +30 -0
  234. package/dist/live/auto/menu.js +335 -0
  235. package/dist/live/auto-session/auto-session.d.ts +113 -0
  236. package/dist/live/auto-session/auto-session.js +452 -0
  237. package/dist/live/auto-session/console.d.ts +4 -0
  238. package/dist/live/auto-session/console.js +41 -0
  239. package/dist/live/auto-session/files.d.ts +44 -0
  240. package/dist/live/auto-session/files.js +145 -0
  241. package/dist/{auto-session → live/auto-session}/helpers.d.ts +9 -5
  242. package/dist/{auto-session → live/auto-session}/helpers.js +18 -1
  243. package/dist/live/auto-session/inspect.d.ts +4 -0
  244. package/dist/live/auto-session/inspect.js +75 -0
  245. package/dist/{session/auto-session-ipc.d.ts → live/auto-session/ipc.d.ts} +8 -25
  246. package/dist/{session/auto-session-ipc.js → live/auto-session/ipc.js} +36 -161
  247. package/dist/live/auto-session/open-browser.d.ts +6 -0
  248. package/dist/live/auto-session/open-browser.js +47 -0
  249. package/dist/{session/browser.d.ts → live/auto-session/start.d.ts} +1 -2
  250. package/dist/{session/browser.js → live/auto-session/start.js} +2 -3
  251. package/dist/{pilot-overlay → live/pilot}/panel.d.ts +1 -1
  252. package/dist/{pilot-overlay → live/pilot}/panel.js +23 -31
  253. package/dist/{session → live/pilot}/pilot.d.ts +3 -3
  254. package/dist/{session → live/pilot}/pilot.js +5 -4
  255. package/dist/{traverse/run.d.ts → live/traverse/traverse.d.ts} +1 -1
  256. package/dist/live/traverse/traverse.js +212 -0
  257. package/dist/live/traverse/worker.d.ts +37 -0
  258. package/dist/live/traverse/worker.js +200 -0
  259. package/dist/manifest/manifest.d.ts +52 -0
  260. package/dist/manifest/manifest.js +93 -0
  261. package/dist/manifest/map-imports.d.ts +7 -0
  262. package/dist/manifest/map-imports.js +22 -0
  263. package/dist/manifest/maps.d.ts +33 -0
  264. package/dist/manifest/maps.js +62 -0
  265. package/dist/manifest/pack.d.ts +21 -0
  266. package/dist/manifest/pack.js +109 -0
  267. package/dist/manifest/project.d.ts +60 -0
  268. package/dist/manifest/project.js +101 -0
  269. package/dist/{session/block-inject.js → manifest/roots.js} +1 -18
  270. package/dist/manifest/scan.d.ts +19 -0
  271. package/dist/manifest/scan.js +57 -0
  272. package/dist/manifest/source.d.ts +23 -0
  273. package/dist/manifest/source.js +86 -0
  274. package/dist/runner/mode.d.ts +71 -0
  275. package/dist/runner/mode.js +1 -0
  276. package/dist/runner/modes/branches.d.ts +5 -0
  277. package/dist/runner/modes/branches.js +37 -0
  278. package/dist/runner/modes/demo.d.ts +3 -0
  279. package/dist/runner/modes/demo.js +13 -0
  280. package/dist/runner/modes/report.d.ts +2 -0
  281. package/dist/runner/modes/report.js +54 -0
  282. package/dist/runner/modes/run.d.ts +2 -0
  283. package/dist/runner/modes/run.js +3 -0
  284. package/dist/runner/options.d.ts +31 -0
  285. package/dist/runner/options.js +42 -0
  286. package/dist/runner/plan/find.d.ts +18 -0
  287. package/dist/runner/plan/find.js +65 -0
  288. package/dist/runner/plan/plan.d.ts +11 -0
  289. package/dist/runner/plan/plan.js +97 -0
  290. package/dist/runner/plan/seed-mem.d.ts +12 -0
  291. package/dist/runner/plan/seed-mem.js +98 -0
  292. package/dist/runner/plan/spec.d.ts +5 -0
  293. package/dist/runner/plan/spec.js +17 -0
  294. package/dist/runner/play-steps.d.ts +2 -0
  295. package/dist/runner/play-steps.js +59 -0
  296. package/dist/runner/runner.d.ts +4 -0
  297. package/dist/runner/runner.js +64 -0
  298. package/dist/runner/session.d.ts +9 -0
  299. package/dist/runner/session.js +87 -0
  300. package/dist/{browser.js → runtime/browser.js} +4 -2
  301. package/dist/{env-file.js → runtime/env-file.js} +7 -12
  302. package/dist/{extensions.d.ts → runtime/extensions.d.ts} +1 -5
  303. package/dist/{extensions.js → runtime/extensions.js} +2 -1
  304. package/dist/runtime/full-launch.d.ts +1 -0
  305. package/dist/runtime/full-launch.js +34 -0
  306. package/dist/runtime/global-flag.d.ts +5 -0
  307. package/dist/runtime/global-flag.js +18 -0
  308. package/dist/{playwright-config.d.ts → runtime/playwright-config.d.ts} +1 -1
  309. package/dist/{playwright.config.js → runtime/playwright.config.js} +3 -2
  310. package/dist/runtime/run-log.d.ts +2 -0
  311. package/dist/runtime/run-log.js +17 -0
  312. package/dist/{video-dir.js → runtime/video-dir.js} +3 -2
  313. package/dist/{config.d.ts → runtime/waygraph-config.d.ts} +6 -9
  314. package/dist/{config.js → runtime/waygraph-config.js} +21 -51
  315. package/dist/{webserver.js → runtime/webserver.js} +5 -30
  316. package/examples/routed-demo/config/waygraph.config.ts +20 -0
  317. package/examples/routed-demo/package.json +1 -4
  318. package/examples/routed-demo/scripts/fixture-server.mjs +1 -1
  319. package/examples/routed-demo/src/flows/routed-demo-map.flow.ts +2 -4
  320. package/examples/routed-demo/src/flows/routed-demo.flow.ts +1 -2
  321. package/examples/routed-demo/src/map/(app_base)/dashboard/_methods/click-widget.block.ts +5 -4
  322. package/examples/routed-demo/src/map/(app_base)/dashboard/_nav.block.ts +3 -3
  323. package/examples/routed-demo/src/map/(app_base)/dashboard/_page.block.ts +3 -3
  324. package/examples/routed-demo/src/map/(external)/docs/_nav.block.ts +3 -3
  325. package/examples/routed-demo/src/map/(external)/docs/_page.block.ts +3 -3
  326. package/examples/routed-demo/src/states/routed-demo.states.ts +5 -3
  327. package/examples/routed-demo/tests/routed-demo.spec.ts +4 -4
  328. package/examples/routed-demo/tsconfig.json +1 -1
  329. package/examples/saucedemo/docs/CONVENTION.md +4 -5
  330. package/examples/saucedemo/docs/HELPERS.md +11 -11
  331. package/examples/saucedemo/src/blocks/SITE-MAP.md +0 -1
  332. package/examples/saucedemo/src/blocks/saucedemo-web/NAV.md +1 -5
  333. package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -3
  334. package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
  335. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
  336. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
  337. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
  338. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
  339. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +5 -8
  340. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -3
  341. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
  342. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +35 -43
  343. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
  344. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
  345. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
  346. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
  347. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
  348. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
  349. package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -4
  350. package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -4
  351. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +4 -5
  352. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
  353. package/examples/saucedemo/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
  354. package/examples/saucedemo/src/flows/api-demo.flow.ts +12 -10
  355. package/examples/saucedemo/src/states/checkout.states.ts +21 -11
  356. package/examples/saucedemo/src/stubs/device-showcase.ts +8 -10
  357. package/examples/saucedemo/tests/auto-graph.spec.ts +4 -12
  358. package/package.json +14 -6
  359. package/templates/agents/waygraph-planner.agent.md +2 -2
  360. package/templates/quickstart/docs/CONVENTION.md +4 -4
  361. package/templates/quickstart/docs/HELPERS.md +10 -8
  362. package/templates/quickstart/package.json +0 -3
  363. package/templates/quickstart/src/blocks/SITE-MAP.md +0 -1
  364. package/templates/quickstart/src/blocks/saucedemo-web/NAV.md +1 -5
  365. package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -3
  366. package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
  367. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
  368. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
  369. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
  370. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
  371. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +5 -8
  372. package/templates/quickstart/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -3
  373. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
  374. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +35 -43
  375. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
  376. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
  377. package/templates/quickstart/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
  378. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
  379. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
  380. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
  381. package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -4
  382. package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -4
  383. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +4 -5
  384. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
  385. package/templates/quickstart/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
  386. package/templates/quickstart/src/flows/api-demo.flow.ts +12 -10
  387. package/templates/quickstart/src/states/checkout.states.ts +21 -11
  388. package/templates/quickstart/src/stubs/device-showcase.ts +8 -10
  389. package/templates/scaffold/README.md +2 -1
  390. package/templates/scaffold/STRUCTURE.md +5 -4
  391. package/templates/scaffold/config/waygraph.config.ts +1 -0
  392. package/templates/scaffold/gitignore +1 -0
  393. package/templates/scaffold/src/flows/README.md +2 -2
  394. package/templates/scaffold/src/map/(app_base)/docs/_nav.block.ts +3 -3
  395. package/templates/scaffold/src/map/(app_base)/docs/_page.block.ts +3 -3
  396. package/templates/scaffold/src/map/(app_base)/home/_methods/add-item.effect.block.ts +4 -4
  397. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-hello.method.block.ts +3 -3
  398. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-item-added.method.block.ts +3 -3
  399. package/templates/scaffold/src/map/(app_base)/home/_methods/clear-cart.method.block.ts +5 -4
  400. package/templates/scaffold/src/map/(app_base)/home/_methods/remove-item.effect.block.ts +4 -4
  401. package/templates/scaffold/src/map/(app_base)/home/_nav.block.ts +3 -3
  402. package/templates/scaffold/src/map/(app_base)/home/_page.block.ts +3 -3
  403. package/templates/scaffold/src/map/(app_base)/home/nav-verification-link.block.ts +4 -4
  404. package/templates/scaffold/src/map/(external)/hoppscotch/_keys.ts +21 -0
  405. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-body.method.block.ts +4 -4
  406. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-header.method.block.ts +4 -4
  407. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-status.method.block.ts +4 -4
  408. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/pick-extension-interceptor.method.block.ts +5 -4
  409. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-body.method.block.ts +6 -5
  410. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-headers.method.block.ts +6 -5
  411. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/send-request.method.block.ts +5 -4
  412. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-bearer-token.method.block.ts +6 -5
  413. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-headers.method.block.ts +6 -5
  414. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-json-body.method.block.ts +6 -5
  415. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-method.method.block.ts +6 -5
  416. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-query-params.method.block.ts +6 -5
  417. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-url.method.block.ts +6 -5
  418. package/templates/scaffold/src/map/(external)/hoppscotch/_nav.block.ts +3 -3
  419. package/templates/scaffold/src/map/(external)/hoppscotch/_page.block.ts +3 -3
  420. package/templates/scaffold/src/map/(external)/hoppscotch/_states.ts +6 -0
  421. package/templates/scaffold/src/map/(external)/hoppscotch/settings/_nav.block.ts +3 -3
  422. package/templates/scaffold/src/map/(external)/mailpit/_keys.ts +13 -0
  423. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-content.method.block.ts +4 -4
  424. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-received.method.block.ts +4 -4
  425. package/templates/scaffold/src/map/(external)/mailpit/_methods/extract-email-link.method.block.ts +6 -5
  426. package/templates/scaffold/src/map/(external)/mailpit/_methods/open-message.method.block.ts +6 -5
  427. package/templates/scaffold/src/map/(external)/mailpit/_nav.block.ts +3 -3
  428. package/templates/scaffold/src/map/(external)/mailpit/_page.block.ts +3 -3
  429. package/templates/scaffold/src/map/(external)/mailpit/_states.ts +9 -0
  430. package/templates/scaffold/src/map/README.md +7 -0
  431. package/templates/scaffold/src/states/README.md +4 -1
  432. package/templates/scaffold/src/states/demo.mem-keys.ts +1 -29
  433. package/templates/scaffold/src/states/demo.states.ts +14 -20
  434. package/templates/scaffold/tests/hoppscotch.spec.ts +1 -11
  435. package/templates/scaffold/tests/mail-verify.spec.ts +2 -2
  436. package/templates/skills/waygraph-blind-pilot.skill.md +2 -6
  437. package/templates/skills/waygraph-convention.skill.md +23 -14
  438. package/templates/skills/waygraph-pilot.skill.md +7 -4
  439. package/dist/auto-session/session.d.ts +0 -193
  440. package/dist/auto-session/session.js +0 -719
  441. package/dist/auto-session/verbose-log.js +0 -16
  442. package/dist/auto-session.d.ts +0 -2
  443. package/dist/auto-session.js +0 -3
  444. package/dist/cli/discover.d.ts +0 -40
  445. package/dist/cli/discover.js +0 -148
  446. package/dist/commands/agent-dive.js +0 -52
  447. package/dist/commands/check.js +0 -192
  448. package/dist/commands/map.js +0 -29
  449. package/dist/commands/run.js +0 -104
  450. package/dist/commands/session.js +0 -600
  451. package/dist/commands/traverse.js +0 -177
  452. package/dist/core/block.d.ts +0 -109
  453. package/dist/core/blocks/effect.js +0 -23
  454. package/dist/core/config.js +0 -17
  455. package/dist/core/engine.d.ts +0 -198
  456. package/dist/core/flow.d.ts +0 -294
  457. package/dist/core/flow.js +0 -432
  458. package/dist/core/map-builder.js +0 -383
  459. package/dist/core.d.ts +0 -14
  460. package/dist/core.js +0 -15
  461. package/dist/highlights/merge.d.ts +0 -8
  462. package/dist/highlights/merge.js +0 -173
  463. package/dist/highlights/run-phase.d.ts +0 -43
  464. package/dist/highlights/stub-ctx.d.ts +0 -10
  465. package/dist/highlights/stub-ctx.js +0 -331
  466. package/dist/highlights/types.d.ts +0 -613
  467. package/dist/highlights.d.ts +0 -9
  468. package/dist/highlights.js +0 -10
  469. package/dist/pilot-overlay.d.ts +0 -5
  470. package/dist/pilot-overlay.js +0 -6
  471. package/dist/runner/banner-log.js +0 -63
  472. package/dist/runner/chain-run.js +0 -102
  473. package/dist/runner/cursor.js +0 -140
  474. package/dist/runner/demo-log.js +0 -316
  475. package/dist/runner/device-stage.d.ts +0 -9
  476. package/dist/runner/device-stage.js +0 -420
  477. package/dist/runner/discovery.js +0 -105
  478. package/dist/runner/index.js +0 -2
  479. package/dist/runner/inpage/banner.d.ts +0 -21
  480. package/dist/runner/inpage/banner.js +0 -156
  481. package/dist/runner/inpage/caption.d.ts +0 -3
  482. package/dist/runner/inpage/caption.js +0 -23
  483. package/dist/runner/inpage/core.d.ts +0 -4
  484. package/dist/runner/inpage/core.js +0 -316
  485. package/dist/runner/inpage/device.d.ts +0 -3
  486. package/dist/runner/inpage/device.js +0 -211
  487. package/dist/runner/inpage/network.d.ts +0 -15
  488. package/dist/runner/inpage/network.js +0 -217
  489. package/dist/runner/inpage/panel-chrome.js +0 -192
  490. package/dist/runner/inpage/stamp.js +0 -46
  491. package/dist/runner/inpage/swipe-zoom.js +0 -220
  492. package/dist/runner/inpage/todos.js +0 -337
  493. package/dist/runner/interaction-patch.js +0 -384
  494. package/dist/runner/main.js +0 -469
  495. package/dist/runner/network-capture.d.ts +0 -9
  496. package/dist/runner/network-capture.js +0 -126
  497. package/dist/runner/overlay-css.d.ts +0 -3
  498. package/dist/runner/overlay-css.js +0 -377
  499. package/dist/runner/overlay-install.js +0 -90
  500. package/dist/runner/overlay-stage.js +0 -110
  501. package/dist/runner/rings.js +0 -514
  502. package/dist/runner/seed-mem.js +0 -110
  503. package/dist/runner/slides.js +0 -278
  504. package/dist/runner/step-mode.js +0 -703
  505. package/dist/runner/step-panels.js +0 -729
  506. package/dist/runner/teardown.js +0 -202
  507. package/dist/runner/todo-dock.js +0 -142
  508. package/dist/session/auto-explore-run.d.ts +0 -40
  509. package/dist/session/auto-explore-run.js +0 -707
  510. package/dist/session/step-overlay.d.ts +0 -37
  511. package/dist/session/step-overlay.js +0 -244
  512. package/dist/traverse/run.js +0 -423
  513. package/examples/routed-demo/playwright.config.ts +0 -21
  514. package/examples/saucedemo/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
  515. package/templates/quickstart/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
  516. /package/dist/{commands → cli/commands}/agent-dive-scaffold.d.ts +0 -0
  517. /package/dist/{commands → cli/commands}/agent-dive.d.ts +0 -0
  518. /package/dist/{commands → cli/commands}/extensions.d.ts +0 -0
  519. /package/dist/{commands → cli/commands}/init.d.ts +0 -0
  520. /package/dist/{commands → cli/commands}/list.d.ts +0 -0
  521. /package/dist/{commands → cli/commands}/map.d.ts +0 -0
  522. /package/dist/{commands → cli/commands}/session.d.ts +0 -0
  523. /package/dist/{commands → cli/commands}/test.d.ts +0 -0
  524. /package/dist/{commands → cli/commands}/traverse.d.ts +0 -0
  525. /package/dist/{commands → cli/commands}/try.d.ts +0 -0
  526. /package/dist/{commands → cli/commands}/upgrade.d.ts +0 -0
  527. /package/dist/{highlights → demo/narration}/shorthand.js +0 -0
  528. /package/dist/{session/overlay-beacon.d.ts → demo/overlay/beacon.d.ts} +0 -0
  529. /package/dist/{session/overlay-beacon.js → demo/overlay/beacon.js} +0 -0
  530. /package/dist/{pilot-overlay/action-ring.d.ts → demo/overlay/pilot/actions.d.ts} +0 -0
  531. /package/dist/{ui → demo/overlay/ui}/components/ring.d.ts +0 -0
  532. /package/dist/{ui → demo/overlay/ui}/stylesheet.d.ts +0 -0
  533. /package/dist/{ui → demo/overlay/ui}/stylesheet.js +0 -0
  534. /package/dist/{ui → demo/overlay/ui}/tokens.d.ts +0 -0
  535. /package/dist/{ui → demo/overlay/ui}/tokens.js +0 -0
  536. /package/dist/{highlights → demo}/types.js +0 -0
  537. /package/dist/{auto-session → demo}/verbose-log.d.ts +0 -0
  538. /package/dist/{selector.d.ts → engine/trait/selector.d.ts} +0 -0
  539. /package/dist/{selector.js → engine/trait/selector.js} +0 -0
  540. /package/dist/{traverse → live/traverse}/coverage.d.ts +0 -0
  541. /package/dist/{traverse → live/traverse}/coverage.js +0 -0
  542. /package/dist/{traverse → live/traverse}/lease.d.ts +0 -0
  543. /package/dist/{traverse → live/traverse}/lease.js +0 -0
  544. /package/dist/{session/block-inject.d.ts → manifest/roots.d.ts} +0 -0
  545. /package/dist/{blocks-select.d.ts → manifest/select.d.ts} +0 -0
  546. /package/dist/{blocks-select.js → manifest/select.js} +0 -0
  547. /package/dist/{browser.d.ts → runtime/browser.d.ts} +0 -0
  548. /package/dist/{env-file.d.ts → runtime/env-file.d.ts} +0 -0
  549. /package/dist/{playwright-config.js → runtime/playwright-config.js} +0 -0
  550. /package/dist/{playwright.config.d.ts → runtime/playwright.config.d.ts} +0 -0
  551. /package/dist/{video-dir.d.ts → runtime/video-dir.d.ts} +0 -0
  552. /package/dist/{webserver.d.ts → runtime/webserver.d.ts} +0 -0
@@ -1,707 +0,0 @@
1
- import { getMemStub } from "../mem-stub.js";
2
- import { createInterface } from "node:readline/promises";
3
- import { ensureShadowRoot } from "../ui/shadow.js";
4
- import { stdin as input, stdout as output } from "node:process";
5
- import { Engine, start, end, locate } from "../core.js";
6
- import { MemPage } from "../mem-page.js";
7
- import { buildExploreContext, buildExploreMenu, } from "./auto-explore.js";
8
- import { installDemoChrome, instrumentInteractionHighlighting } from "./step-overlay.js";
9
- import { configuredExtensions, resolveBaseUrl } from "../config.js";
10
- import { withWebServer } from "../webserver.js";
11
- import { chromiumExecutablePath, launchContext } from "../browser.js";
12
- /** See `../config.js`'s own `resolveBaseUrl` - re-exported so existing importers of this module
13
- * don't need to change their import path. */
14
- export { resolveBaseUrl };
15
- /** URL-first - several Checkpoints share nav verify traits (e.g. LoggedIn = /inventory.html). */
16
- async function inferCheckpointFromUrl(page) {
17
- try {
18
- const path = new URL(page.url()).pathname;
19
- if (path.includes("inventory-item.html"))
20
- return "ItemDetailPage";
21
- if (path.includes("inventory.html"))
22
- return "LoggedIn";
23
- if (path.includes("cart.html"))
24
- return "CartPage";
25
- if (path.includes("checkout-step-one.html"))
26
- return "CheckoutInfoPage";
27
- if (path.includes("checkout-step-two.html"))
28
- return "CheckoutOverviewPage";
29
- if (path.includes("checkout-complete.html"))
30
- return "OrderComplete";
31
- if (path === "/" || path === "") {
32
- if (await page.locator("#login-button").isVisible({ timeout: 500 }).catch(() => false)) {
33
- return "LoginPage";
34
- }
35
- }
36
- }
37
- catch {
38
- /* ignore */
39
- }
40
- return null;
41
- }
42
- export async function detectHere(page, navBlocks) {
43
- const fromUrl = await inferCheckpointFromUrl(page);
44
- if (fromUrl)
45
- return fromUrl;
46
- const tags = navBlocks.map((n) => n.block);
47
- return locate(page, tags, { timeoutMs: 1500 });
48
- }
49
- export async function ensureLivePage(context, page, startUrl) {
50
- if (!page.isClosed())
51
- return page;
52
- const fresh = await context.newPage();
53
- if (startUrl) {
54
- await fresh.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(() => { });
55
- await fresh.waitForLoadState("load").catch(() => { });
56
- }
57
- return fresh;
58
- }
59
- function missingMemKeys(entry, mem) {
60
- const requires = entry.block.requires ?? [];
61
- return requires.filter((k) => !mem.has(k));
62
- }
63
- const DEFAULT_CREDENTIALS = { username: "standard_user", password: "secret_sauce" };
64
- /**
65
- * Saucedemo-only defaults. Exact key names only — never substring `"login"`.
66
- * A consumer's own `key<string>("login-email")` must stay unset here, or it
67
- * silently gets a saucedemo credentials object instead of its own default.
68
- */
69
- export function defaultMemValueForKey(keyName) {
70
- if (keyName === "login-credentials" ||
71
- keyName === "credentials" ||
72
- keyName === "saucedemo.credentials") {
73
- return DEFAULT_CREDENTIALS;
74
- }
75
- return undefined;
76
- }
77
- function defaultMemJsonPrompt(keyName) {
78
- const def = defaultMemValueForKey(keyName);
79
- if (def !== undefined)
80
- return JSON.stringify(def);
81
- return "{}";
82
- }
83
- function seedMemFromEnv(mem, entry) {
84
- const raw = process.env.WAYGRAPH_DATA ?? process.env.WAYGRAPH_AUTO_MEM;
85
- if (!raw)
86
- return false;
87
- try {
88
- const parsed = JSON.parse(raw);
89
- for (const k of entry.block.requires ?? []) {
90
- if (k.name in parsed)
91
- mem.set(k, parsed[k.name]);
92
- }
93
- return missingMemKeys(entry, mem).length === 0;
94
- }
95
- catch {
96
- return false;
97
- }
98
- }
99
- /** Pre-seed known demo keys (saucedemo creds) so headful/cli do not stop for mem forms. */
100
- export function seedDefaultMem(library, mem) {
101
- const raw = process.env.WAYGRAPH_DATA ?? process.env.WAYGRAPH_AUTO_MEM;
102
- let envParsed = {};
103
- if (raw) {
104
- try {
105
- envParsed = JSON.parse(raw);
106
- }
107
- catch {
108
- /* ignore */
109
- }
110
- }
111
- for (const entry of library.values()) {
112
- for (const k of entry.block.requires ?? []) {
113
- if (mem.has(k))
114
- continue;
115
- if (k.name in envParsed) {
116
- mem.set(k, envParsed[k.name]);
117
- continue;
118
- }
119
- const stub = getMemStub(k);
120
- if (stub) {
121
- mem.set(k, stub());
122
- continue;
123
- }
124
- const def = defaultMemValueForKey(k.name);
125
- if (def !== undefined)
126
- mem.set(k, def);
127
- }
128
- }
129
- }
130
- async function promptMemCli(entry, mem) {
131
- const rl = createInterface({ input, output });
132
- try {
133
- for (const k of missingMemKeys(entry, mem)) {
134
- const def = defaultMemJsonPrompt(k.name);
135
- const line = await rl.question(` ${k.name} JSON [${def}]: `);
136
- const json = line.trim() || def;
137
- mem.set(k, JSON.parse(json));
138
- }
139
- }
140
- finally {
141
- rl.close();
142
- }
143
- }
144
- export async function ensureMem(entry, mem, cli) {
145
- if (missingMemKeys(entry, mem).length === 0)
146
- return;
147
- if (seedMemFromEnv(mem, entry))
148
- return;
149
- if (cli) {
150
- console.log(`\nBlock "${entry.block.name}" needs MemPage keys:`);
151
- await promptMemCli(entry, mem);
152
- return;
153
- }
154
- throw new Error(`Block "${entry.block.name}" needs MemPage keys - pass --data '{...}' / WAYGRAPH_DATA (or WAYGRAPH_AUTO_MEM), or enter values in --cli`);
155
- }
156
- async function setAutoPanelRunning(page, label) {
157
- await page
158
- .evaluate((label) => {
159
- const panel = __wgById("wg-auto-panel");
160
- if (!panel)
161
- return;
162
- const body = "<h3>waygraph auto</h3><div style='padding:12px 0;color:#c9a6ff'>" +
163
- "Running: <strong>" +
164
- label +
165
- "</strong></div>";
166
- panel.innerHTML = body;
167
- if (typeof window.__wgWirePanelChrome === "function") {
168
- window.__wgWirePanelChrome(panel, "wg-auto-panel-hidden", "waygraph auto");
169
- }
170
- if (typeof window.__wgStampModal === "function") {
171
- window.__wgStampModal(panel, "auto-panel", {
172
- phase: "running",
173
- block: label,
174
- ready: true,
175
- });
176
- }
177
- else {
178
- panel.setAttribute("data-wg-ui", "1");
179
- panel.setAttribute("data-wg-modal", "auto-panel");
180
- panel.setAttribute("data-wg-phase", "running");
181
- panel.setAttribute("data-wg-ready", "1");
182
- }
183
- }, label)
184
- .catch(() => { });
185
- }
186
- export async function runOneBlock(engine, entry, context, page, mem, headful) {
187
- const navClick = entry.block.__waygraphNavClick;
188
- if (entry.kind === "nav" && navClick !== undefined) {
189
- await page
190
- .evaluate((label) => {
191
- window.__wgPendingNavClickLabel = label;
192
- }, `nav: ${entry.block.name}`)
193
- .catch(() => { });
194
- }
195
- if (headful)
196
- await setAutoPanelRunning(page, entry.block.name);
197
- const flow = engine.defineFlow([start, entry.block, end]);
198
- const BLOCK_TIMEOUT_MS = 45_000;
199
- let timer;
200
- let result;
201
- try {
202
- const ran = await Promise.race([
203
- flow.run(context, mem, { page, closeOnFinish: false }),
204
- new Promise((_, reject) => {
205
- timer = setTimeout(() => reject(new Error(`Block "${entry.block.name}" timed out after ${BLOCK_TIMEOUT_MS / 1000}s - ` +
206
- "click Quit and retry, or check network / mem credentials")), BLOCK_TIMEOUT_MS);
207
- }),
208
- ]);
209
- result = ran.result;
210
- }
211
- finally {
212
- if (timer)
213
- clearTimeout(timer);
214
- }
215
- await page.evaluate("delete window.__wgPendingNavClickLabel").catch(() => { });
216
- return result;
217
- }
218
- const PANEL_CSS = "#wg-auto-panel{position:fixed;z-index:2147483647;left:50%;bottom:12px;transform:translateX(-50%);" +
219
- "max-width:min(92vw,720px);max-height:calc(100vh - 24px);overflow-y:auto;box-sizing:border-box;" +
220
- "background:rgba(20,10,40,.94);color:#fff;border-radius:14px;padding:16px 20px;" +
221
- "font:14px/1.4 system-ui,sans-serif;box-shadow:0 12px 30px rgba(0,0,0,.35);}" +
222
- "#wg-auto-panel h3{margin:0 0 10px;font-size:16px;}" +
223
- "#wg-auto-panel .wg-here{color:#c9a6ff;margin-bottom:12px;}" +
224
- "#wg-auto-panel .wg-actions{display:flex;flex-direction:column;gap:8px;}" +
225
- "#wg-auto-panel button.wg-act{text-align:left;padding:10px 12px;border-radius:10px;border:1px solid #5b3aa8;" +
226
- "background:#2a1450;color:#fff;font:13px/1.3 system-ui,sans-serif;cursor:pointer;}" +
227
- "#wg-auto-panel button.wg-act:hover{background:#3a1d70;}" +
228
- "#wg-auto-panel button.wg-act .wg-kind{color:#a78bfa;font-size:11px;text-transform:uppercase;}" +
229
- "#wg-auto-panel button.wg-quit{margin-top:12px;background:#3a1a1a;border-color:#7f1d1d;}" +
230
- "#wg-auto-panel textarea{width:100%;box-sizing:border-box;margin:6px 0 10px;background:#1a1030;color:#fff;" +
231
- "border:1px solid #5b3aa8;border-radius:8px;padding:8px;font:12px/1.3 monospace;}" +
232
- "#wg-auto-panel label.wg-mem{display:block;margin-top:8px;font-size:12px;color:#ddd;}" +
233
- "#wg-auto-panel .wg-section{margin:12px 0 6px;font-size:11px;font-weight:700;color:#a78bfa;text-transform:uppercase;letter-spacing:.04em;}" +
234
- "#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;}" +
235
- "#wg-auto-panel .wg-map .wg-cp{opacity:.55;}#wg-auto-panel .wg-map .wg-cp-here{color:#fff;opacity:1;font-weight:700;}" +
236
- "#wg-auto-panel .wg-chrome{display:flex;align-items:center;justify-content:space-between;gap:8px;margin:0 0 8px;}" +
237
- "#wg-auto-panel .wg-chrome-title{font:700 11px/1.2 system-ui,sans-serif;color:#c9a6ff;" +
238
- "letter-spacing:.04em;text-transform:uppercase;}" +
239
- "#wg-auto-panel button.wg-hide-btn{margin:0;padding:4px 10px;font:600 11px system-ui,sans-serif;" +
240
- "background:#3a2a60;color:#e8dcff;border:1px solid #5b3aa8;border-radius:6px;cursor:pointer;}" +
241
- "#wg-auto-panel button.wg-hide-btn:hover{background:#4b2a80;}" +
242
- "#wg-auto-panel.wg-collapsed{width:auto;max-width:90vw;padding:8px 12px;max-height:none;overflow:hidden;}" +
243
- "#wg-auto-panel.wg-collapsed .wg-body{display:none;}" +
244
- "#wg-auto-panel.wg-collapsed .wg-chrome{margin:0;}" +
245
- "@media (max-width:640px){" +
246
- "#wg-auto-panel{left:8px;right:8px;bottom:8px;transform:none;max-width:none;width:auto;" +
247
- "max-height:min(55vh,calc(100vh - 16px));padding:12px 14px;border-radius:12px;}" +
248
- "#wg-auto-panel.wg-collapsed{left:50%;right:auto;transform:translateX(-50%);width:auto;}" +
249
- "#wg-auto-panel button.wg-act{padding:12px;font-size:14px;}" +
250
- "}";
251
- function esc(s) {
252
- return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/"/g, "&quot;");
253
- }
254
- /** Shown in the headful panel after each Block run. */
255
- let lastRunNote = null;
256
- /**
257
- * Mem keys any Block on the current menu might read this turn - minus keys a
258
- * dynamic `instanceOptions` row already answers by picking it (e.g. "which
259
- * item to add to cart" comes from the menu row itself, not a hand-typed JSON
260
- * textarea).
261
- */
262
- function memKeysForMenu(menu, library) {
263
- const instanceKeys = new Set();
264
- for (const edge of menu.flat) {
265
- if (edge.instanceOption)
266
- instanceKeys.add(edge.instanceOption.key);
267
- }
268
- const keys = new Map();
269
- for (const edge of menu.flat) {
270
- const entry = library.get(edge.block);
271
- for (const k of entry?.block.requires ?? []) {
272
- if (instanceKeys.has(k))
273
- continue;
274
- keys.set(k.name, k);
275
- }
276
- }
277
- return [...keys.values()];
278
- }
279
- async function syncPanelMem(page, mem, keys) {
280
- if (keys.length === 0)
281
- return;
282
- await ensureShadowRoot(page);
283
- const edits = (await page.evaluate(() => {
284
- const out = {};
285
- __wgQA("textarea.wg-mem-input").forEach((ta) => {
286
- const key = ta.getAttribute("data-mem-key");
287
- if (key)
288
- out[key] = ta.value;
289
- });
290
- return out;
291
- }));
292
- for (const k of keys) {
293
- const raw = edits[k.name];
294
- if (raw === undefined)
295
- continue;
296
- try {
297
- mem.set(k, JSON.parse(raw));
298
- }
299
- catch (err) {
300
- throw new Error(`Invalid JSON for mem key "${k.name}": ${err instanceof Error ? err.message : String(err)}`);
301
- }
302
- }
303
- }
304
- function armPickWait() {
305
- let resolve;
306
- const promise = new Promise((res) => {
307
- resolve = res;
308
- });
309
- return { promise, resolve };
310
- }
311
- async function headfulPick(page, menu, library, mem, waitPick) {
312
- const here = menu.here;
313
- const hereLabel = here ?? (menu.flat.length > 0 ? "Unknown - pick Start here" : "Unknown - no moves available");
314
- const menuMemKeys = memKeysForMenu(menu, library);
315
- let html = `<style id="wg-auto-style">${PANEL_CSS}</style><div id="wg-auto-panel">` +
316
- `<h3>waygraph auto</h3>`;
317
- if (lastRunNote) {
318
- html += `<div style="margin-bottom:8px;font-size:12px;color:#a7f3d0">${esc(lastRunNote)}</div>`;
319
- }
320
- html += `<div class="wg-here">You are here: <strong>${esc(hereLabel)}</strong></div>`;
321
- if (menuMemKeys.length > 0) {
322
- html +=
323
- `<div class="wg-section">Mem - edit credentials, then click a block below</div>`;
324
- let memIdx = 0;
325
- for (const k of menuMemKeys) {
326
- let value = "{}";
327
- try {
328
- if (mem.has(k))
329
- value = JSON.stringify(mem.get(k), null, 2);
330
- else {
331
- const def = defaultMemValueForKey(k.name);
332
- if (def !== undefined)
333
- value = JSON.stringify(def, null, 2);
334
- }
335
- }
336
- catch {
337
- /* ignore */
338
- }
339
- html +=
340
- `<label class="wg-mem">${esc(k.name)}</label>` +
341
- `<textarea class="wg-mem-input" data-mem-key="${esc(k.name)}" id="wg-mem-${memIdx}" rows="4">${esc(value)}</textarea>`;
342
- memIdx++;
343
- }
344
- }
345
- // Pre-resolve every candidate's hover-preview box THROUGH Playwright's own locator (>>
346
- // piercing / :has-text() / :visible support), once, here on the Node side - not a raw selector
347
- // string handed to the page for a per-mouseenter document.querySelector to fail silently on
348
- // (same class of bug as rings.js's showRing; see its own comment for the full story). A
349
- // mouseenter handler can't itself await a Node-side locator without visible hover lag, so the
350
- // box is embedded as a data attribute instead and the in-page handler just reads it.
351
- const hlSelectors = new Set();
352
- for (const section of menu.sections) {
353
- for (const c of section.edges) {
354
- const entry = library.get(c.block);
355
- const navClick = entry?.block?.__waygraphNavClick;
356
- const hl = c.instanceOption?.highlight ?? (typeof navClick === "string" ? navClick : undefined);
357
- if (hl)
358
- hlSelectors.add(hl);
359
- }
360
- }
361
- const hlBoxes = new Map();
362
- await Promise.all([...hlSelectors].map(async (sel) => {
363
- const loc = page.locator(sel).first();
364
- const box = (await loc.count().catch(() => 0)) > 0
365
- ? await loc
366
- .evaluate((el) => {
367
- const r = el.getBoundingClientRect();
368
- if (r.width < 1 && r.height < 1)
369
- return null;
370
- return { x: r.x, y: r.y, width: r.width, height: r.height };
371
- })
372
- .catch(() => null)
373
- : null;
374
- hlBoxes.set(sel, box);
375
- }));
376
- html += `<div class="wg-actions">`;
377
- let idx = 0;
378
- if (menu.sections.length === 0) {
379
- html += `<div style="opacity:.85;padding:8px 0">No moves from this screen right now.</div>`;
380
- }
381
- for (const section of menu.sections) {
382
- html += `<div class="wg-section">${esc(section.title)}</div>`;
383
- for (const c of section.edges) {
384
- const entry = library.get(c.block);
385
- const navClick = entry?.block?.__waygraphNavClick;
386
- const hl = c.instanceOption?.highlight ?? (typeof navClick === "string" ? navClick : undefined);
387
- const hlBox = hl ? hlBoxes.get(hl) : null;
388
- const hlAttr = hlBox ? ` data-hl-box='${esc(JSON.stringify(hlBox))}'` : "";
389
- if (c.label) {
390
- html += `<button class="wg-act" data-idx="${idx}"${hlAttr}>${esc(c.label)}</button>`;
391
- }
392
- else {
393
- const desc = entry?.description ? `<br><span style="opacity:.85">${esc(entry.description)}</span>` : "";
394
- html +=
395
- `<button class="wg-act" data-idx="${idx}"${hlAttr}><span class="wg-kind">${esc(c.kind)}</span> ` +
396
- `<strong>${esc(c.block)}</strong> -> ${esc(c.to)}${desc}</button>`;
397
- }
398
- idx++;
399
- }
400
- }
401
- html += `</div><button class="wg-act wg-quit" data-quit="1">Quit</button></div>`;
402
- // Wrap body; chrome + Hide/Show wired in page (shared with stepper).
403
- html =
404
- `<style id="wg-auto-style">${PANEL_CSS}</style><div id="wg-auto-panel">` +
405
- html.slice(html.indexOf("<h3>"));
406
- await ensureShadowRoot(page);
407
- await page.evaluate(`((inner) => {
408
- let panel = __wgById("wg-auto-panel");
409
- if (!panel) {
410
- panel = document.createElement("div");
411
- __wgAdd(panel);
412
- }
413
- panel.outerHTML = inner;
414
- const root = __wgById("wg-auto-panel");
415
- if (!root) return;
416
- window.__wgWirePanelChrome = (el, storageKey, chromeTitle) => {
417
- if (!el) return;
418
- if (!el.querySelector(":scope > .wg-chrome")) {
419
- const body = document.createElement("div");
420
- body.className = "wg-body";
421
- while (el.firstChild) body.appendChild(el.firstChild);
422
- const chrome = document.createElement("div");
423
- chrome.className = "wg-chrome";
424
- const titleEl = document.createElement("span");
425
- titleEl.className = "wg-chrome-title";
426
- titleEl.textContent = chromeTitle || "waygraph auto";
427
- const btn = document.createElement("button");
428
- btn.type = "button";
429
- btn.className = "wg-hide-btn";
430
- btn.setAttribute("data-wg-toggle", "1");
431
- btn.textContent = "Hide";
432
- chrome.appendChild(titleEl);
433
- chrome.appendChild(btn);
434
- el.appendChild(chrome);
435
- el.appendChild(body);
436
- }
437
- const apply = (hidden) => {
438
- el.classList.toggle("wg-collapsed", hidden);
439
- el.setAttribute("data-wg-collapsed", hidden ? "1" : "0");
440
- const t = el.querySelector("[data-wg-toggle]");
441
- if (t) t.textContent = hidden ? "Show" : "Hide";
442
- try { localStorage.setItem(storageKey, hidden ? "1" : "0"); } catch {}
443
- };
444
- let hidden = false;
445
- try { hidden = localStorage.getItem(storageKey) === "1"; } catch {}
446
- apply(hidden);
447
- const toggle = el.querySelector("[data-wg-toggle]");
448
- if (toggle && !toggle.dataset.wgWired) {
449
- toggle.dataset.wgWired = "1";
450
- toggle.addEventListener("click", (e) => {
451
- e.stopPropagation();
452
- apply(!el.classList.contains("wg-collapsed"));
453
- });
454
- }
455
- };
456
- window.__wgWirePanelChrome(root, "wg-auto-panel-hidden", "waygraph auto");
457
- if (typeof window.__wgStampModal === "function") {
458
- window.__wgStampModal(root, "auto-panel", { phase: "pick", ready: true });
459
- } else {
460
- root.setAttribute("data-wg-ui", "1");
461
- root.setAttribute("data-wg-modal", "auto-panel");
462
- root.setAttribute("data-wg-phase", "pick");
463
- root.setAttribute(
464
- "data-wg-collapsed",
465
- root.classList.contains("wg-collapsed") ? "1" : "0",
466
- );
467
- root.setAttribute("data-wg-ready", "1");
468
- window.__wgOverlayBeacon =
469
- window.__wgOverlayBeacon ||
470
- (() =>
471
- Array.from(__wgQA('[data-wg-ui="1"]')).map((el) => {
472
- const r = el.getBoundingClientRect();
473
- const st = getComputedStyle(el);
474
- return {
475
- id: el.id || null,
476
- modal: el.getAttribute("data-wg-modal"),
477
- ready: el.getAttribute("data-wg-ready") === "1",
478
- phase: el.getAttribute("data-wg-phase"),
479
- step: el.getAttribute("data-wg-step"),
480
- block: el.getAttribute("data-wg-block"),
481
- collapsed:
482
- el.getAttribute("data-wg-collapsed") === "1" ||
483
- el.classList.contains("wg-collapsed"),
484
- opacity: st.opacity,
485
- textLen: (el.innerText || "").trim().length,
486
- w: Math.round(r.width),
487
- h: Math.round(r.height),
488
- visible: r.width > 0 && r.height > 0 && Number(st.opacity) > 0.05,
489
- };
490
- }));
491
- }
492
- root.querySelectorAll("button[data-idx]").forEach((btn) => {
493
- btn.addEventListener("click", () => {
494
- const idx = Number(btn.getAttribute("data-idx"));
495
- window.__wgAutoPick?.(idx);
496
- });
497
- btn.addEventListener("mouseenter", () => {
498
- // Pre-resolved on the Node side via Playwright's own locator (>> piercing / :has-text()
499
- // support) when this menu was built - see headfulPick's own comment for why a
500
- // mouseenter handler can't itself round-trip to a Node-side locator per hover.
501
- const raw = btn.getAttribute("data-hl-box");
502
- if (!raw || typeof window.__wgPositionRing !== "function") return;
503
- let box;
504
- try {
505
- box = JSON.parse(raw);
506
- } catch {
507
- return;
508
- }
509
- window.__wgPositionRing(
510
- box,
511
- btn.textContent?.trim()?.slice(0, 80) || "target",
512
- "auto",
513
- );
514
- });
515
- btn.addEventListener("mouseleave", () => {
516
- window.__wgHideRing?.();
517
- });
518
- });
519
- const quit = root.querySelector("[data-quit]");
520
- if (quit) quit.addEventListener("click", () => window.__wgAutoQuit?.());
521
- })(${JSON.stringify(html)})`);
522
- return waitPick();
523
- }
524
- function printCliMenu(menu, library) {
525
- console.log("");
526
- console.log(`You are here: ${menu.here ?? "Unknown (pick Start here)"}`);
527
- console.log("");
528
- if (menu.flat.length === 0) {
529
- console.log(" (no moves available on this page)");
530
- }
531
- let n = 0;
532
- for (const section of menu.sections) {
533
- console.log(` -- ${section.title} --`);
534
- for (const c of section.edges) {
535
- const entry = library.get(c.block);
536
- n++;
537
- if (c.label) {
538
- console.log(` [${n}] ${c.label}`);
539
- }
540
- else {
541
- const desc = entry?.description ? ` - ${entry.description}` : "";
542
- console.log(` [${n}] ${c.block} (${c.kind}) -> ${c.to}${desc}`);
543
- }
544
- }
545
- }
546
- console.log(" [q] quit");
547
- console.log("");
548
- }
549
- async function cliPick(menu, rl) {
550
- while (true) {
551
- let ans;
552
- try {
553
- ans = (await rl.question("Choose: ")).trim().toLowerCase();
554
- }
555
- catch {
556
- return { type: "quit" }; // stdin ended (piped / Ctrl-D) - same as q
557
- }
558
- if (ans === "q" || ans === "quit")
559
- return { type: "quit" };
560
- const n = Number(ans);
561
- if (Number.isInteger(n) && n >= 1 && n <= menu.flat.length) {
562
- return { type: "pick", index: n - 1 };
563
- }
564
- console.log("Enter a number from the list, or q to quit.");
565
- }
566
- }
567
- /**
568
- * Interactive waygraph auto: locate current Checkpoint, list runnable Blocks, pick one, repeat.
569
- */
570
- export async function runAutoExplore(projectDir, options = {}) {
571
- await withWebServer(projectDir, () => runAutoExploreCore(projectDir, options));
572
- }
573
- async function runAutoExploreCore(projectDir, options = {}) {
574
- lastRunNote = null;
575
- const cli = options.cli === true;
576
- const baseURL = options.baseURL ?? (await resolveBaseUrl(projectDir)) ?? process.env.WAYGRAPH_BASE_URL;
577
- const startUrl = options.startUrl ?? baseURL;
578
- const { graph, library } = await buildExploreContext(projectDir, options.blocksSelect ? { blocksSelect: options.blocksSelect } : undefined);
579
- if (options.blocksSelect) {
580
- console.error(`waygraph auto: --blocks ${options.blocksSelect.raw} → ` +
581
- `${library.byName.size} block(s), ${graph.edges.length} edge(s)`);
582
- }
583
- const mem = new MemPage();
584
- seedDefaultMem(library.byName, mem);
585
- const engine = cli ? new Engine({ headless: true }) : new Engine({ headless: false, slowMo: 250 });
586
- const { chromium } = await import("@playwright/test");
587
- const executablePath = chromiumExecutablePath();
588
- const launchOpts = {
589
- headless: cli,
590
- args: cli ? [] : ["--start-maximized"],
591
- };
592
- if (!cli)
593
- launchOpts.slowMo = 250;
594
- if (executablePath)
595
- launchOpts.executablePath = executablePath;
596
- const contextOpts = cli
597
- ? { viewport: { width: 1280, height: 720 } }
598
- : { viewport: null };
599
- if (baseURL)
600
- contextOpts.baseURL = baseURL;
601
- const { close: closeBrowser, context } = await launchContext({
602
- launcher: chromium,
603
- launch: launchOpts,
604
- context: contextOpts,
605
- extensions: await configuredExtensions(projectDir),
606
- });
607
- let page = await context.newPage();
608
- if (startUrl) {
609
- await page.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(() => { });
610
- await page.waitForLoadState("load").catch(() => { });
611
- }
612
- console.error(`waygraph auto: ${graph.nodes.length} checkpoint(s), ${graph.edges.length} edge(s) - ` +
613
- (cli ? "CLI picker (terminal menu)" : "headful picker (browser panel)"));
614
- const pickSlot = { resolve: null };
615
- let wiredPage = null;
616
- async function wirePage(target) {
617
- if (wiredPage === target)
618
- return;
619
- await target.exposeFunction("__wgAutoPick", (index) => {
620
- pickSlot.resolve?.({ type: "pick", index });
621
- });
622
- await target.exposeFunction("__wgAutoQuit", () => {
623
- pickSlot.resolve?.({ type: "quit" });
624
- });
625
- if (!cli) {
626
- await installDemoChrome(target, "", { banner: false });
627
- instrumentInteractionHighlighting(target, mem, 250);
628
- }
629
- wiredPage = target;
630
- }
631
- let here = null;
632
- const cliRl = cli ? createInterface({ input, output }) : null;
633
- try {
634
- for (;;) {
635
- page = await ensureLivePage(context, page, startUrl);
636
- await wirePage(page);
637
- const pickWait = armPickWait();
638
- pickSlot.resolve = pickWait.resolve;
639
- if (here === null) {
640
- here = await detectHere(page, library.navBlocks);
641
- }
642
- if (cli)
643
- console.error("waygraph auto: scanning page for moves ...");
644
- const menu = await buildExploreMenu(page, graph, library, here);
645
- if (cli)
646
- console.error(`waygraph auto: ${menu.flat.length} move(s) available`);
647
- if (menu.flat.length === 0) {
648
- const fromHere = graph.edges.filter((e) => e.from === here).map((e) => e.block);
649
- const missing = [...new Set(fromHere)].filter((b) => !library.byName.has(b));
650
- console.error(here
651
- ? `waygraph auto: no runnable Blocks on "${here}"` +
652
- (fromHere.length
653
- ? ` (graph has: ${[...new Set(fromHere)].join(", ")}${missing.length ? `; not loaded: ${missing.join(", ")}` : ""})`
654
- : " - nothing on this page matches the graph.") +
655
- (cli ? "" : " Tip: waygraph auto --cli")
656
- : "waygraph auto: location unknown - pick nav-login (Start here) if shown.");
657
- if (cli)
658
- break;
659
- }
660
- let pick;
661
- if (cli && cliRl) {
662
- printCliMenu(menu, library.byName);
663
- pick = await cliPick(menu, cliRl);
664
- }
665
- else {
666
- pick = await headfulPick(page, menu, library.byName, mem, () => pickWait.promise);
667
- }
668
- if (pick.type === "quit")
669
- break;
670
- if (pick.index < 0 || pick.index >= menu.flat.length)
671
- continue;
672
- const edge = menu.flat[pick.index];
673
- const entry = library.byName.get(edge.block);
674
- if (!entry) {
675
- console.error(`waygraph auto: Block "${edge.block}" not loaded - skipped`);
676
- continue;
677
- }
678
- try {
679
- if (edge.instanceOption) {
680
- mem.set(edge.instanceOption.key, edge.instanceOption.value);
681
- }
682
- if (!cli && (entry.block.requires?.length ?? 0) > 0) {
683
- await syncPanelMem(page, mem, entry.block.requires ?? []);
684
- }
685
- else {
686
- await ensureMem(entry, mem, cli);
687
- }
688
- const pickLabel = edge.label ?? entry.block.name;
689
- console.error(`waygraph auto: running [${pick.index + 1}] ${pickLabel} ...`);
690
- const result = await runOneBlock(engine, entry, context, page, mem, !cli);
691
- // Trust block output over locate() - nav verify traits collide on /dashboard.
692
- here = result.__state ?? edge.to;
693
- lastRunNote = `${entry.block.name} -> ${here}`;
694
- console.error(`waygraph auto: ran ${entry.block.name} -> ${here}`);
695
- }
696
- catch (err) {
697
- lastRunNote = `${entry.block.name} failed`;
698
- console.error(`waygraph auto: ${entry.block.name} failed - ${err instanceof Error ? err.message : String(err)}`);
699
- }
700
- }
701
- }
702
- finally {
703
- cliRl?.close();
704
- await context.close();
705
- await closeBrowser();
706
- }
707
- }