waygraph 0.15.53 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (556) 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 +13 -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/{commands → cli/commands}/check.d.ts +0 -1
  21. package/dist/cli/commands/check.js +104 -0
  22. package/dist/cli/commands/codemod-checkpoints.d.ts +18 -0
  23. package/dist/cli/commands/codemod-checkpoints.js +186 -0
  24. package/dist/cli/commands/codemod-flows.d.ts +18 -0
  25. package/dist/cli/commands/codemod-flows.js +284 -0
  26. package/dist/cli/commands/codemod-stubs.d.ts +10 -0
  27. package/dist/cli/commands/codemod-stubs.js +187 -0
  28. package/dist/{commands → cli/commands}/extensions.js +5 -4
  29. package/dist/{commands → cli/commands}/init.js +1 -2
  30. package/dist/{commands → cli/commands}/list.js +9 -7
  31. package/dist/cli/commands/manifest.d.ts +2 -0
  32. package/dist/cli/commands/manifest.js +20 -0
  33. package/dist/cli/commands/map.js +57 -0
  34. package/dist/{commands → cli/commands}/run.d.ts +0 -1
  35. package/dist/cli/commands/run.js +64 -0
  36. package/dist/{commands → cli/commands}/session.js +61 -88
  37. package/dist/{commands → cli/commands}/test.js +11 -14
  38. package/dist/cli/commands/traverse.js +105 -0
  39. package/dist/{commands → cli/commands}/try.js +29 -25
  40. package/dist/{commands → cli/commands}/upgrade.js +40 -4
  41. package/dist/cli/flags.d.ts +193 -16
  42. package/dist/cli/flags.js +179 -234
  43. package/dist/cli/run-chain.d.ts +1 -0
  44. package/dist/cli/run-chain.js +42 -7
  45. package/dist/cli/usage.d.ts +1 -1
  46. package/dist/cli/usage.js +21 -53
  47. package/dist/cli/util.d.ts +2 -2
  48. package/dist/cli/util.js +2 -3
  49. package/dist/{highlights → demo/narration}/css.d.ts +1 -1
  50. package/dist/{highlights → demo/narration}/css.js +2 -3
  51. package/dist/{highlights → demo/narration}/demo-pace.d.ts +7 -11
  52. package/dist/{highlights → demo/narration}/demo-pace.js +9 -11
  53. package/dist/{highlights → demo/narration}/device.d.ts +4 -2
  54. package/dist/{highlights → demo/narration}/device.js +3 -1
  55. package/dist/demo/narration/merge.d.ts +8 -0
  56. package/dist/demo/narration/merge.js +71 -0
  57. package/dist/{highlights/run-phase.d.ts → demo/narration/narration.d.ts} +10 -14
  58. package/dist/{highlights/run-phase.js → demo/narration/narration.js} +25 -94
  59. package/dist/{highlights → demo/narration}/shorthand.d.ts +1 -1
  60. package/dist/demo/narration/stub-ctx.d.ts +8 -0
  61. package/dist/demo/narration/stub-ctx.js +164 -0
  62. package/dist/{highlights → demo/narration}/style.d.ts +1 -7
  63. package/dist/{highlights → demo/narration}/style.js +1 -41
  64. package/dist/{highlights → demo/narration}/todo-dock.d.ts +3 -3
  65. package/dist/{highlights → demo/narration}/todo-dock.js +13 -30
  66. package/dist/demo/overlay/auto-chrome.d.ts +7 -0
  67. package/dist/demo/overlay/auto-chrome.js +97 -0
  68. package/dist/{session/overlay-beacon.d.ts → demo/overlay/beacon.d.ts} +7 -0
  69. package/dist/{session/overlay-beacon.js → demo/overlay/beacon.js} +5 -0
  70. package/dist/demo/overlay/cursor.d.ts +12 -0
  71. package/dist/demo/overlay/cursor.js +142 -0
  72. package/dist/demo/overlay/device-stage.d.ts +13 -0
  73. package/dist/demo/overlay/device-stage.js +396 -0
  74. package/dist/demo/overlay/inpage/banner.d.ts +1 -0
  75. package/dist/demo/overlay/inpage/banner.js +160 -0
  76. package/dist/demo/overlay/inpage/caption.d.ts +2 -0
  77. package/dist/demo/overlay/inpage/caption.js +24 -0
  78. package/dist/demo/overlay/inpage/core.d.ts +1 -0
  79. package/dist/demo/overlay/inpage/core.js +345 -0
  80. package/dist/demo/overlay/inpage/device-chip.d.ts +1 -0
  81. package/dist/demo/overlay/inpage/device-chip.js +191 -0
  82. package/dist/demo/overlay/inpage/network.d.ts +9 -0
  83. package/dist/demo/overlay/inpage/network.js +200 -0
  84. package/dist/demo/overlay/inpage/panel-chrome.d.ts +1 -0
  85. package/dist/demo/overlay/inpage/panel-chrome.js +203 -0
  86. package/dist/demo/overlay/inpage/stamp.d.ts +1 -0
  87. package/dist/demo/overlay/inpage/stamp.js +46 -0
  88. package/dist/demo/overlay/inpage/swipe-zoom.d.ts +1 -0
  89. package/dist/demo/overlay/inpage/swipe-zoom.js +220 -0
  90. package/dist/demo/overlay/inpage/todos.d.ts +1 -0
  91. package/dist/demo/overlay/inpage/todos.js +294 -0
  92. package/dist/demo/overlay/locator-theater.d.ts +25 -0
  93. package/dist/demo/overlay/locator-theater.js +76 -0
  94. package/dist/demo/overlay/network-capture.d.ts +22 -0
  95. package/dist/demo/overlay/network-capture.js +127 -0
  96. package/dist/demo/overlay/overlay-css.d.ts +3 -0
  97. package/dist/demo/overlay/overlay-css.js +369 -0
  98. package/dist/demo/overlay/overlay-stage.d.ts +23 -0
  99. package/dist/demo/overlay/overlay-stage.js +106 -0
  100. package/dist/demo/overlay/overlay.d.ts +10 -0
  101. package/dist/demo/overlay/overlay.js +89 -0
  102. package/dist/{pilot-overlay/overlay-fixtures.d.ts → demo/overlay/phase-fixtures.d.ts} +2 -2
  103. package/dist/{pilot-overlay/overlay-fixtures.js → demo/overlay/phase-fixtures.js} +2 -2
  104. package/dist/{pilot-overlay/action-ring.js → demo/overlay/pilot/actions.js} +2 -1
  105. package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.d.ts +6 -5
  106. package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.js +19 -18
  107. package/dist/{pilot-overlay → demo/overlay/pilot}/shell.d.ts +2 -2
  108. package/dist/{pilot-overlay → demo/overlay/pilot}/shell.js +13 -22
  109. package/dist/demo/overlay/reattach.d.ts +7 -0
  110. package/dist/demo/overlay/reattach.js +23 -0
  111. package/dist/demo/overlay/rings.d.ts +33 -0
  112. package/dist/demo/overlay/rings.js +448 -0
  113. package/dist/{ui → demo/overlay/ui}/components/ring.js +2 -2
  114. package/dist/{ui → demo/overlay/ui}/overlay.css +4 -4
  115. package/dist/{ui → demo/overlay/ui}/shadow.d.ts +1 -1
  116. package/dist/{ui → demo/overlay/ui}/shadow.js +39 -2
  117. package/dist/demo/stepper/after.d.ts +3 -0
  118. package/dist/demo/stepper/after.js +113 -0
  119. package/dist/demo/stepper/banner-log.d.ts +37 -0
  120. package/dist/demo/stepper/banner-log.js +63 -0
  121. package/dist/demo/stepper/before.d.ts +4 -0
  122. package/dist/demo/stepper/before.js +110 -0
  123. package/dist/demo/stepper/demo-log.d.ts +31 -0
  124. package/dist/demo/stepper/demo-log.js +309 -0
  125. package/dist/demo/stepper/gate.d.ts +11 -0
  126. package/dist/demo/stepper/gate.js +78 -0
  127. package/dist/demo/stepper/interaction-patch.d.ts +3 -0
  128. package/dist/demo/stepper/interaction-patch.js +323 -0
  129. package/dist/demo/stepper/pacing.d.ts +21 -0
  130. package/dist/demo/stepper/pacing.js +23 -0
  131. package/dist/demo/stepper/slides.d.ts +11 -0
  132. package/dist/demo/stepper/slides.js +233 -0
  133. package/dist/demo/stepper/step-panels.d.ts +21 -0
  134. package/dist/demo/stepper/step-panels.js +589 -0
  135. package/dist/demo/stepper/stepper.d.ts +24 -0
  136. package/dist/demo/stepper/stepper.js +122 -0
  137. package/dist/demo/stepper/teardown.d.ts +48 -0
  138. package/dist/demo/stepper/teardown.js +179 -0
  139. package/dist/demo/stepper/todo-advance.d.ts +14 -0
  140. package/dist/demo/stepper/todo-advance.js +110 -0
  141. package/dist/demo/stepper/view.d.ts +68 -0
  142. package/dist/demo/stepper/view.js +31 -0
  143. package/dist/demo/types.d.ts +17 -0
  144. package/dist/demo/verbose-log.js +15 -0
  145. package/dist/{types.d.ts → engine/block/block.d.ts} +106 -91
  146. package/dist/{core → engine/block}/block.js +10 -53
  147. package/dist/{core → engine/block}/compose.d.ts +10 -7
  148. package/dist/{core → engine/block}/compose.js +1 -1
  149. package/dist/{core/blocks → engine/block/kinds}/api.d.ts +17 -12
  150. package/dist/{core/blocks → engine/block/kinds}/api.js +26 -18
  151. package/dist/{core/blocks → engine/block/kinds}/effect.d.ts +13 -18
  152. package/dist/engine/block/kinds/effect.js +17 -0
  153. package/dist/{core/blocks → engine/block/kinds}/method.d.ts +19 -29
  154. package/dist/{core/blocks → engine/block/kinds}/method.js +7 -21
  155. package/dist/{core/blocks → engine/block/kinds}/nav.d.ts +22 -31
  156. package/dist/{core/blocks → engine/block/kinds}/nav.js +6 -12
  157. package/dist/{core/blocks → engine/block/kinds}/page.d.ts +15 -20
  158. package/dist/{core/blocks → engine/block/kinds}/page.js +5 -7
  159. package/dist/engine/checkpoint/checkpoint.d.ts +22 -0
  160. package/dist/engine/checkpoint/checkpoint.js +8 -0
  161. package/dist/engine/checkpoint/route.d.ts +28 -0
  162. package/dist/engine/checkpoint/route.js +28 -0
  163. package/dist/{core → engine}/config.d.ts +7 -2
  164. package/dist/engine/config.js +6 -0
  165. package/dist/engine/engine.d.ts +45 -0
  166. package/dist/{core → engine}/engine.js +6 -10
  167. package/dist/engine/env.d.ts +59 -0
  168. package/dist/engine/env.js +83 -0
  169. package/dist/{errors.d.ts → engine/errors.d.ts} +23 -22
  170. package/dist/{errors.js → engine/errors.js} +22 -22
  171. package/dist/{core → engine/flow}/branch-regression.d.ts +8 -7
  172. package/dist/{core → engine/flow}/branch-regression.js +4 -3
  173. package/dist/engine/flow/flow.d.ts +162 -0
  174. package/dist/engine/flow/flow.js +244 -0
  175. package/dist/{core → engine/flow}/map-builder.d.ts +42 -40
  176. package/dist/{core → engine/flow}/map-builder.js +46 -48
  177. package/dist/{core → engine}/locate.d.ts +1 -1
  178. package/dist/{core → engine}/locate.js +1 -2
  179. package/dist/{mem-stub.d.ts → engine/mem/mem-stub.d.ts} +9 -8
  180. package/dist/{mem-stub.js → engine/mem/mem-stub.js} +2 -2
  181. package/dist/{mem-page.d.ts → engine/mem/mem.d.ts} +1 -1
  182. package/dist/{mem-page.js → engine/mem/mem.js} +2 -1
  183. package/dist/engine/page-gone.d.ts +5 -0
  184. package/dist/engine/page-gone.js +20 -0
  185. package/dist/engine/run/connect.d.ts +28 -0
  186. package/dist/{types.js → engine/run/connect.js} +11 -10
  187. package/dist/engine/run/events.d.ts +67 -0
  188. package/dist/engine/run/events.js +90 -0
  189. package/dist/engine/run/hooks.d.ts +16 -0
  190. package/dist/engine/run/hooks.js +8 -0
  191. package/dist/engine/run/launch.d.ts +13 -0
  192. package/dist/engine/run/launch.js +27 -0
  193. package/dist/{core/run-graph.d.ts → engine/run/run.d.ts} +9 -11
  194. package/dist/{core/run-graph.js → engine/run/run.js} +22 -11
  195. package/dist/engine/stub/pace.d.ts +12 -0
  196. package/dist/engine/stub/pace.js +2 -0
  197. package/dist/engine/stub/ring.d.ts +130 -0
  198. package/dist/engine/stub/ring.js +41 -0
  199. package/dist/engine/stub/stub.d.ts +268 -0
  200. package/dist/engine/stub/stub.js +1 -0
  201. package/dist/engine/stub/todos.d.ts +104 -0
  202. package/dist/engine/stub/todos.js +2 -0
  203. package/dist/engine/stub/viewport.d.ts +26 -0
  204. package/dist/engine/stub/viewport.js +2 -0
  205. package/dist/{trait.d.ts → engine/trait/trait.d.ts} +1 -1
  206. package/dist/index.d.ts +84 -36
  207. package/dist/index.js +44 -19
  208. package/dist/{session/auto-explore-run.d.ts → live/auto/auto.d.ts} +10 -16
  209. package/dist/{session/auto-explore-run.js → live/auto/auto.js} +164 -248
  210. package/dist/{session/auto-explore.d.ts → live/auto/explore.d.ts} +4 -14
  211. package/dist/{session/auto-explore.js → live/auto/explore.js} +21 -127
  212. package/dist/{auto-session/session.d.ts → live/auto-session/auto-session.d.ts} +1 -1
  213. package/dist/{auto-session/session.js → live/auto-session/auto-session.js} +27 -24
  214. package/dist/{auto-session → live/auto-session}/helpers.d.ts +16 -5
  215. package/dist/{auto-session → live/auto-session}/helpers.js +1 -1
  216. package/dist/{session/auto-session-ipc.d.ts → live/auto-session/ipc.d.ts} +7 -5
  217. package/dist/{session/auto-session-ipc.js → live/auto-session/ipc.js} +31 -16
  218. package/dist/{session/browser.d.ts → live/auto-session/start.d.ts} +1 -2
  219. package/dist/{session/browser.js → live/auto-session/start.js} +2 -3
  220. package/dist/{pilot-overlay → live/pilot}/panel.d.ts +1 -1
  221. package/dist/{pilot-overlay → live/pilot}/panel.js +23 -31
  222. package/dist/{session → live/pilot}/pilot.d.ts +4 -3
  223. package/dist/{session → live/pilot}/pilot.js +4 -4
  224. package/dist/{traverse → live/traverse}/coverage.d.ts +4 -0
  225. package/dist/{traverse → live/traverse}/coverage.js +3 -0
  226. package/dist/{traverse → live/traverse}/lease.d.ts +1 -0
  227. package/dist/{traverse → live/traverse}/lease.js +1 -0
  228. package/dist/{traverse/run.d.ts → live/traverse/traverse.d.ts} +4 -1
  229. package/dist/{traverse/run.js → live/traverse/traverse.js} +26 -43
  230. package/dist/manifest/manifest.d.ts +52 -0
  231. package/dist/manifest/manifest.js +93 -0
  232. package/dist/manifest/map-imports.d.ts +7 -0
  233. package/dist/manifest/map-imports.js +22 -0
  234. package/dist/manifest/maps.d.ts +33 -0
  235. package/dist/manifest/maps.js +62 -0
  236. package/dist/manifest/pack.d.ts +21 -0
  237. package/dist/manifest/pack.js +109 -0
  238. package/dist/manifest/project.d.ts +60 -0
  239. package/dist/manifest/project.js +101 -0
  240. package/dist/{session/block-inject.js → manifest/roots.js} +1 -18
  241. package/dist/manifest/scan.d.ts +19 -0
  242. package/dist/manifest/scan.js +57 -0
  243. package/dist/{blocks-select.d.ts → manifest/select.d.ts} +3 -0
  244. package/dist/{blocks-select.js → manifest/select.js} +2 -0
  245. package/dist/manifest/source.d.ts +23 -0
  246. package/dist/manifest/source.js +86 -0
  247. package/dist/runner/mode.d.ts +71 -0
  248. package/dist/runner/mode.js +1 -0
  249. package/dist/runner/modes/branches.d.ts +5 -0
  250. package/dist/runner/modes/branches.js +37 -0
  251. package/dist/runner/modes/demo.d.ts +3 -0
  252. package/dist/runner/modes/demo.js +13 -0
  253. package/dist/runner/modes/report.d.ts +2 -0
  254. package/dist/runner/modes/report.js +54 -0
  255. package/dist/runner/modes/run.d.ts +2 -0
  256. package/dist/runner/modes/run.js +3 -0
  257. package/dist/runner/options.d.ts +31 -0
  258. package/dist/runner/options.js +42 -0
  259. package/dist/runner/plan/find.d.ts +18 -0
  260. package/dist/runner/plan/find.js +65 -0
  261. package/dist/runner/plan/plan.d.ts +11 -0
  262. package/dist/runner/plan/plan.js +97 -0
  263. package/dist/runner/plan/seed-mem.d.ts +12 -0
  264. package/dist/runner/plan/seed-mem.js +98 -0
  265. package/dist/runner/plan/spec.d.ts +5 -0
  266. package/dist/runner/plan/spec.js +17 -0
  267. package/dist/runner/play-steps.d.ts +2 -0
  268. package/dist/runner/play-steps.js +59 -0
  269. package/dist/runner/runner.d.ts +4 -0
  270. package/dist/runner/runner.js +64 -0
  271. package/dist/runner/session.d.ts +9 -0
  272. package/dist/runner/session.js +87 -0
  273. package/dist/{browser.js → runtime/browser.js} +4 -2
  274. package/dist/{env-file.js → runtime/env-file.js} +7 -12
  275. package/dist/{extensions.d.ts → runtime/extensions.d.ts} +2 -5
  276. package/dist/{extensions.js → runtime/extensions.js} +3 -1
  277. package/dist/runtime/full-launch.d.ts +1 -0
  278. package/dist/runtime/full-launch.js +34 -0
  279. package/dist/runtime/global-flag.d.ts +5 -0
  280. package/dist/runtime/global-flag.js +18 -0
  281. package/dist/{playwright-config.d.ts → runtime/playwright-config.d.ts} +1 -1
  282. package/dist/{playwright.config.js → runtime/playwright.config.js} +3 -2
  283. package/dist/runtime/run-log.d.ts +2 -0
  284. package/dist/runtime/run-log.js +17 -0
  285. package/dist/{video-dir.js → runtime/video-dir.js} +3 -2
  286. package/dist/{config.d.ts → runtime/waygraph-config.d.ts} +8 -9
  287. package/dist/{config.js → runtime/waygraph-config.js} +21 -51
  288. package/dist/{webserver.js → runtime/webserver.js} +5 -30
  289. package/examples/routed-demo/config/waygraph.config.ts +20 -0
  290. package/examples/routed-demo/package.json +1 -4
  291. package/examples/routed-demo/scripts/fixture-server.mjs +1 -1
  292. package/examples/routed-demo/src/flows/routed-demo-map.flow.ts +2 -4
  293. package/examples/routed-demo/src/flows/routed-demo.flow.ts +2 -3
  294. package/examples/routed-demo/src/map/(app_base)/dashboard/_methods/click-widget.block.ts +5 -4
  295. package/examples/routed-demo/src/map/(app_base)/dashboard/_nav.block.ts +3 -3
  296. package/examples/routed-demo/src/map/(app_base)/dashboard/_page.block.ts +3 -3
  297. package/examples/routed-demo/src/map/(external)/docs/_nav.block.ts +3 -3
  298. package/examples/routed-demo/src/map/(external)/docs/_page.block.ts +3 -3
  299. package/examples/routed-demo/src/states/routed-demo.states.ts +5 -3
  300. package/examples/routed-demo/tests/routed-demo.spec.ts +4 -4
  301. package/examples/routed-demo/tsconfig.json +1 -1
  302. package/examples/saucedemo/README.md +11 -12
  303. package/examples/saucedemo/config/waygraph.config.ts +17 -0
  304. package/examples/saucedemo/docs/CONVENTION.md +5 -7
  305. package/examples/saucedemo/docs/HELPERS.md +12 -12
  306. package/examples/saucedemo/package-lock.json +10 -3
  307. package/examples/saucedemo/package.json +12 -29
  308. package/examples/saucedemo/src/blocks/SITE-MAP.md +0 -1
  309. package/examples/saucedemo/src/blocks/saucedemo-web/NAV.md +1 -5
  310. package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -52
  311. package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
  312. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
  313. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
  314. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
  315. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
  316. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +21 -27
  317. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -9
  318. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
  319. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +10 -76
  320. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
  321. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
  322. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
  323. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
  324. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
  325. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
  326. package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -29
  327. package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -48
  328. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +13 -77
  329. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
  330. package/examples/saucedemo/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
  331. package/examples/saucedemo/src/flows/api-demo.flow.ts +26 -18
  332. package/examples/saucedemo/src/flows/cart-bulk.flow.ts +19 -14
  333. package/examples/saucedemo/src/flows/cart-continue.flow.ts +10 -8
  334. package/examples/saucedemo/src/flows/cart-mem.flow.ts +7 -7
  335. package/examples/saucedemo/src/flows/catalog-logout.flow.ts +13 -8
  336. package/examples/saucedemo/src/flows/checkout-then-browse-again.flow.ts +26 -48
  337. package/examples/saucedemo/src/flows/checkout.flow.ts +70 -86
  338. package/examples/saucedemo/src/flows/device-showcase.flow.ts +24 -25
  339. package/examples/saucedemo/src/flows/login.flow.ts +11 -18
  340. package/examples/saucedemo/src/flows/mem-stub-demo.flow.ts +9 -20
  341. package/examples/saucedemo/src/flows/shop.flow.ts +15 -20
  342. package/examples/saucedemo/src/flows/smoke.flow.ts +12 -27
  343. package/examples/saucedemo/src/flows/stub-on-error.flow.ts +24 -43
  344. package/examples/saucedemo/src/flows/viewer-blocked.flow.ts +26 -34
  345. package/examples/saucedemo/src/states/checkout.mem-stubs.ts +11 -0
  346. package/examples/saucedemo/src/states/checkout.states.ts +21 -11
  347. package/examples/saucedemo/src/stubs/device-showcase.ts +191 -0
  348. package/examples/saucedemo/src/stubs/login.ts +37 -0
  349. package/examples/saucedemo/tests/auto-graph.spec.ts +4 -12
  350. package/examples/saucedemo/tests/chain-flow-episodes.spec.ts +7 -9
  351. package/examples/saucedemo/tests/submit-login-branch.spec.ts +18 -5
  352. package/package.json +12 -7
  353. package/templates/agents/waygraph-planner.agent.md +2 -2
  354. package/templates/quickstart/README.md +4 -7
  355. package/templates/quickstart/config/waygraph.config.ts +17 -0
  356. package/templates/quickstart/docs/CONVENTION.md +5 -6
  357. package/templates/quickstart/docs/HELPERS.md +11 -9
  358. package/templates/quickstart/package.json +14 -17
  359. package/templates/quickstart/src/blocks/SITE-MAP.md +13 -3
  360. package/templates/quickstart/src/blocks/saucedemo-web/NAV.md +1 -5
  361. package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -52
  362. package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
  363. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
  364. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
  365. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
  366. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
  367. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +21 -27
  368. package/templates/quickstart/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -9
  369. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
  370. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +10 -76
  371. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
  372. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
  373. package/templates/quickstart/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
  374. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
  375. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
  376. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
  377. package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -29
  378. package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -48
  379. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +13 -77
  380. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
  381. package/templates/quickstart/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
  382. package/templates/quickstart/src/flows/api-demo.flow.ts +45 -0
  383. package/templates/quickstart/src/flows/cart-bulk.flow.ts +19 -14
  384. package/templates/quickstart/src/flows/cart-continue.flow.ts +10 -8
  385. package/templates/quickstart/src/flows/cart-mem.flow.ts +7 -7
  386. package/templates/quickstart/src/flows/catalog-logout.flow.ts +13 -8
  387. package/templates/quickstart/src/flows/checkout-then-browse-again.flow.ts +26 -48
  388. package/templates/quickstart/src/flows/checkout.flow.ts +70 -63
  389. package/templates/quickstart/src/flows/device-showcase.flow.ts +24 -25
  390. package/templates/quickstart/src/flows/login.flow.ts +11 -18
  391. package/templates/quickstart/src/flows/mem-stub-demo.flow.ts +12 -0
  392. package/templates/quickstart/src/flows/shop.flow.ts +15 -20
  393. package/templates/quickstart/src/flows/smoke.flow.ts +12 -27
  394. package/templates/quickstart/src/flows/stub-on-error.flow.ts +31 -0
  395. package/templates/quickstart/src/flows/viewer-blocked.flow.ts +26 -34
  396. package/templates/quickstart/src/states/checkout.mem-stubs.ts +11 -0
  397. package/templates/quickstart/src/states/checkout.states.ts +21 -11
  398. package/templates/quickstart/src/stubs/device-showcase.ts +191 -0
  399. package/templates/quickstart/src/stubs/login.ts +37 -0
  400. package/templates/quickstart/tests/chain-flow.spec.ts +7 -10
  401. package/templates/scaffold/README.md +2 -1
  402. package/templates/scaffold/STRUCTURE.md +5 -4
  403. package/templates/scaffold/config/waygraph.config.ts +1 -0
  404. package/templates/scaffold/gitignore +1 -0
  405. package/templates/scaffold/src/flows/README.md +2 -2
  406. package/templates/scaffold/src/map/(app_base)/docs/_nav.block.ts +3 -3
  407. package/templates/scaffold/src/map/(app_base)/docs/_page.block.ts +3 -3
  408. package/templates/scaffold/src/map/(app_base)/home/_methods/add-item.effect.block.ts +4 -4
  409. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-hello.method.block.ts +3 -3
  410. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-item-added.method.block.ts +3 -3
  411. package/templates/scaffold/src/map/(app_base)/home/_methods/clear-cart.method.block.ts +5 -4
  412. package/templates/scaffold/src/map/(app_base)/home/_methods/remove-item.effect.block.ts +4 -4
  413. package/templates/scaffold/src/map/(app_base)/home/_nav.block.ts +3 -3
  414. package/templates/scaffold/src/map/(app_base)/home/_page.block.ts +3 -3
  415. package/templates/scaffold/src/map/(app_base)/home/nav-verification-link.block.ts +4 -4
  416. package/templates/scaffold/src/map/(external)/hoppscotch/_keys.ts +21 -0
  417. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-body.method.block.ts +4 -4
  418. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-header.method.block.ts +4 -4
  419. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-status.method.block.ts +4 -4
  420. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/pick-extension-interceptor.method.block.ts +5 -4
  421. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-body.method.block.ts +6 -5
  422. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-headers.method.block.ts +6 -5
  423. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/send-request.method.block.ts +5 -4
  424. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-bearer-token.method.block.ts +6 -5
  425. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-headers.method.block.ts +6 -5
  426. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-json-body.method.block.ts +6 -5
  427. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-method.method.block.ts +6 -5
  428. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-query-params.method.block.ts +6 -5
  429. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-url.method.block.ts +6 -5
  430. package/templates/scaffold/src/map/(external)/hoppscotch/_nav.block.ts +3 -3
  431. package/templates/scaffold/src/map/(external)/hoppscotch/_page.block.ts +3 -3
  432. package/templates/scaffold/src/map/(external)/hoppscotch/_states.ts +6 -0
  433. package/templates/scaffold/src/map/(external)/hoppscotch/settings/_nav.block.ts +3 -3
  434. package/templates/scaffold/src/map/(external)/mailpit/_keys.ts +13 -0
  435. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-content.method.block.ts +4 -4
  436. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-received.method.block.ts +4 -4
  437. package/templates/scaffold/src/map/(external)/mailpit/_methods/extract-email-link.method.block.ts +6 -5
  438. package/templates/scaffold/src/map/(external)/mailpit/_methods/open-message.method.block.ts +6 -5
  439. package/templates/scaffold/src/map/(external)/mailpit/_nav.block.ts +3 -3
  440. package/templates/scaffold/src/map/(external)/mailpit/_page.block.ts +3 -3
  441. package/templates/scaffold/src/map/(external)/mailpit/_states.ts +9 -0
  442. package/templates/scaffold/src/map/README.md +7 -0
  443. package/templates/scaffold/src/states/README.md +4 -1
  444. package/templates/scaffold/src/states/demo.mem-keys.ts +1 -29
  445. package/templates/scaffold/src/states/demo.states.ts +14 -20
  446. package/templates/scaffold/tests/hoppscotch.spec.ts +1 -11
  447. package/templates/scaffold/tests/mail-verify.spec.ts +2 -2
  448. package/templates/skills/waygraph-blind-pilot.skill.md +2 -6
  449. package/templates/skills/waygraph-convention.skill.md +23 -14
  450. package/templates/skills/waygraph-pilot.skill.md +7 -4
  451. package/dist/auto-session/verbose-log.js +0 -16
  452. package/dist/auto-session.d.ts +0 -2
  453. package/dist/auto-session.js +0 -3
  454. package/dist/cli/discover.d.ts +0 -40
  455. package/dist/cli/discover.js +0 -148
  456. package/dist/commands/agent-dive.js +0 -52
  457. package/dist/commands/check.js +0 -192
  458. package/dist/commands/map.js +0 -29
  459. package/dist/commands/run.js +0 -104
  460. package/dist/commands/traverse.js +0 -177
  461. package/dist/core/block.d.ts +0 -109
  462. package/dist/core/blocks/effect.js +0 -23
  463. package/dist/core/config.js +0 -17
  464. package/dist/core/engine.d.ts +0 -198
  465. package/dist/core/flow.d.ts +0 -293
  466. package/dist/core/flow.js +0 -432
  467. package/dist/core.d.ts +0 -14
  468. package/dist/core.js +0 -15
  469. package/dist/highlights/merge.d.ts +0 -8
  470. package/dist/highlights/merge.js +0 -173
  471. package/dist/highlights/stub-ctx.d.ts +0 -10
  472. package/dist/highlights/stub-ctx.js +0 -331
  473. package/dist/highlights/types.d.ts +0 -607
  474. package/dist/highlights.d.ts +0 -9
  475. package/dist/highlights.js +0 -10
  476. package/dist/pilot-overlay.d.ts +0 -5
  477. package/dist/pilot-overlay.js +0 -6
  478. package/dist/runner/banner-log.js +0 -63
  479. package/dist/runner/chain-run.js +0 -102
  480. package/dist/runner/cursor.js +0 -140
  481. package/dist/runner/demo-log.js +0 -316
  482. package/dist/runner/device-stage.d.ts +0 -9
  483. package/dist/runner/device-stage.js +0 -420
  484. package/dist/runner/discovery.js +0 -105
  485. package/dist/runner/index.js +0 -2
  486. package/dist/runner/inpage/banner.d.ts +0 -21
  487. package/dist/runner/inpage/banner.js +0 -156
  488. package/dist/runner/inpage/caption.d.ts +0 -3
  489. package/dist/runner/inpage/caption.js +0 -23
  490. package/dist/runner/inpage/core.d.ts +0 -4
  491. package/dist/runner/inpage/core.js +0 -316
  492. package/dist/runner/inpage/device.d.ts +0 -3
  493. package/dist/runner/inpage/device.js +0 -211
  494. package/dist/runner/inpage/network.d.ts +0 -15
  495. package/dist/runner/inpage/network.js +0 -217
  496. package/dist/runner/inpage/panel-chrome.js +0 -192
  497. package/dist/runner/inpage/stamp.js +0 -46
  498. package/dist/runner/inpage/swipe-zoom.js +0 -220
  499. package/dist/runner/inpage/todos.js +0 -337
  500. package/dist/runner/interaction-patch.js +0 -384
  501. package/dist/runner/main.js +0 -469
  502. package/dist/runner/network-capture.d.ts +0 -9
  503. package/dist/runner/network-capture.js +0 -126
  504. package/dist/runner/overlay-css.d.ts +0 -3
  505. package/dist/runner/overlay-css.js +0 -377
  506. package/dist/runner/overlay-install.js +0 -90
  507. package/dist/runner/overlay-stage.js +0 -110
  508. package/dist/runner/rings.js +0 -514
  509. package/dist/runner/seed-mem.js +0 -110
  510. package/dist/runner/slides.js +0 -278
  511. package/dist/runner/step-mode.js +0 -703
  512. package/dist/runner/step-panels.js +0 -729
  513. package/dist/runner/teardown.js +0 -202
  514. package/dist/runner/todo-dock.js +0 -142
  515. package/dist/session/step-overlay.d.ts +0 -37
  516. package/dist/session/step-overlay.js +0 -244
  517. package/examples/routed-demo/playwright.config.ts +0 -21
  518. package/examples/saucedemo/playwright.config.ts +0 -19
  519. package/examples/saucedemo/scripts/drive-auto-cli.mjs +0 -93
  520. package/examples/saucedemo/scripts/prove-add-to-cart-menu.mjs +0 -126
  521. package/examples/saucedemo/scripts/prove-auto-graph.mjs +0 -92
  522. package/examples/saucedemo/scripts/prove-wrong-login-runtime.mjs +0 -63
  523. package/examples/saucedemo/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
  524. package/templates/quickstart/playwright.config.ts +0 -14
  525. package/templates/quickstart/scripts/drive-auto-cli.mjs +0 -93
  526. package/templates/quickstart/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
  527. /package/dist/{commands → cli/commands}/agent-dive-scaffold.d.ts +0 -0
  528. /package/dist/{commands → cli/commands}/agent-dive.d.ts +0 -0
  529. /package/dist/{commands → cli/commands}/extensions.d.ts +0 -0
  530. /package/dist/{commands → cli/commands}/init.d.ts +0 -0
  531. /package/dist/{commands → cli/commands}/list.d.ts +0 -0
  532. /package/dist/{commands → cli/commands}/map.d.ts +0 -0
  533. /package/dist/{commands → cli/commands}/session.d.ts +0 -0
  534. /package/dist/{commands → cli/commands}/test.d.ts +0 -0
  535. /package/dist/{commands → cli/commands}/traverse.d.ts +0 -0
  536. /package/dist/{commands → cli/commands}/try.d.ts +0 -0
  537. /package/dist/{commands → cli/commands}/upgrade.d.ts +0 -0
  538. /package/dist/{highlights → demo/narration}/shorthand.js +0 -0
  539. /package/dist/{pilot-overlay/action-ring.d.ts → demo/overlay/pilot/actions.d.ts} +0 -0
  540. /package/dist/{ui → demo/overlay/ui}/components/ring.d.ts +0 -0
  541. /package/dist/{ui → demo/overlay/ui}/stylesheet.d.ts +0 -0
  542. /package/dist/{ui → demo/overlay/ui}/stylesheet.js +0 -0
  543. /package/dist/{ui → demo/overlay/ui}/tokens.d.ts +0 -0
  544. /package/dist/{ui → demo/overlay/ui}/tokens.js +0 -0
  545. /package/dist/{highlights → demo}/types.js +0 -0
  546. /package/dist/{auto-session → demo}/verbose-log.d.ts +0 -0
  547. /package/dist/{selector.d.ts → engine/trait/selector.d.ts} +0 -0
  548. /package/dist/{selector.js → engine/trait/selector.js} +0 -0
  549. /package/dist/{trait.js → engine/trait/trait.js} +0 -0
  550. /package/dist/{session/block-inject.d.ts → manifest/roots.d.ts} +0 -0
  551. /package/dist/{browser.d.ts → runtime/browser.d.ts} +0 -0
  552. /package/dist/{env-file.d.ts → runtime/env-file.d.ts} +0 -0
  553. /package/dist/{playwright-config.js → runtime/playwright-config.js} +0 -0
  554. /package/dist/{playwright.config.d.ts → runtime/playwright.config.d.ts} +0 -0
  555. /package/dist/{video-dir.d.ts → runtime/video-dir.d.ts} +0 -0
  556. /package/dist/{webserver.d.ts → runtime/webserver.d.ts} +0 -0
@@ -1,9 +1,9 @@
1
+ import type { BlockEntry } from "../../manifest/project.js";
1
2
  import type { Page, BrowserContext } from "@playwright/test";
2
- import { Engine } from "../core.js";
3
- import { MemPage } from "../mem-page.js";
4
- import { type BlockEntry } from "./auto-explore.js";
5
- import type { Checkpoint } from "../types.js";
6
- import { resolveBaseUrl } from "../config.js";
3
+ import { Engine } from "../../engine/engine.js";
4
+ import { MemPage } from "../../engine/mem/mem.js";
5
+ import type { MemKey } from "../../engine/mem/mem.js";
6
+ import type { Checkpoint } from "../../engine/checkpoint/checkpoint.js";
7
7
  export interface AutoExploreOptions {
8
8
  /** Terminal menu (browser still runs for act()). Default false = headful picker panel. */
9
9
  cli?: boolean;
@@ -11,20 +11,14 @@ export interface AutoExploreOptions {
11
11
  /** Initial URL when the page is blank (defaults to baseURL). */
12
12
  startUrl?: string;
13
13
  /** Phase C: glob / regex / bare `--blocks` file select for discovery. */
14
- blocksSelect?: import("../blocks-select.js").BlocksSelect;
14
+ blocksSelect?: import("../../manifest/select.js").BlocksSelect;
15
15
  }
16
- /** See `../config.js`'s own `resolveBaseUrl` - re-exported so existing importers of this module
17
- * don't need to change their import path. */
18
- export { resolveBaseUrl };
16
+ /** Which Checkpoint the page is on, asked of the project's own Nav / Page Blocks (their verify). */
19
17
  export declare function detectHere(page: Page, navBlocks: BlockEntry[]): Promise<string | null>;
20
18
  export declare function ensureLivePage(context: BrowserContext, page: Page, startUrl: string | undefined): Promise<Page>;
21
- /**
22
- * Saucedemo-only defaults. Exact key names only — never substring `"login"`.
23
- * A consumer's own `key<string>("login-email")` must stay unset here, or it
24
- * silently gets a saucedemo credentials object instead of its own default.
25
- */
26
- export declare function defaultMemValueForKey(keyName: string): unknown | undefined;
27
- /** Pre-seed known demo keys (saucedemo creds) so headful/cli do not stop for mem forms. */
19
+ /** The project's own default for a key: its `registerMemStub` fake (live sessions load every `*.mem-stubs.ts`). */
20
+ export declare function memStubValue(key: MemKey<unknown>): unknown | undefined;
21
+ /** Pre-seeds required keys from WAYGRAPH_DATA and the project's mem stubs, so a session does not stop for mem forms. */
28
22
  export declare function seedDefaultMem(library: Map<string, BlockEntry>, mem: MemPage): void;
29
23
  export declare function ensureMem(entry: BlockEntry, mem: MemPage, cli: boolean): Promise<void>;
30
24
  export declare function runOneBlock(engine: Engine, entry: BlockEntry, context: BrowserContext, page: Page, mem: MemPage, headful: boolean): Promise<Checkpoint<string>>;
@@ -1,47 +1,21 @@
1
+ import { getMemStub } from "../../engine/mem/mem-stub.js";
1
2
  import { createInterface } from "node:readline/promises";
2
- import { ensureShadowRoot } from "../ui/shadow.js";
3
+ import { ensureShadowRoot } from "../../demo/overlay/ui/shadow.js";
3
4
  import { stdin as input, stdout as output } from "node:process";
4
- import { Engine, start, end, locate } from "../core.js";
5
- import { MemPage } from "../mem-page.js";
6
- import { buildExploreContext, buildExploreMenu, } from "./auto-explore.js";
7
- import { installDemoChrome, instrumentInteractionHighlighting } from "./step-overlay.js";
8
- import { configuredExtensions, resolveBaseUrl } from "../config.js";
9
- import { withWebServer } from "../webserver.js";
10
- import { chromiumExecutablePath, launchContext } from "../browser.js";
11
- /** See `../config.js`'s own `resolveBaseUrl` - re-exported so existing importers of this module
12
- * don't need to change their import path. */
13
- export { resolveBaseUrl };
14
- /** URL-first - several Checkpoints share nav verify traits (e.g. LoggedIn = /inventory.html). */
15
- async function inferCheckpointFromUrl(page) {
16
- try {
17
- const path = new URL(page.url()).pathname;
18
- if (path.includes("inventory-item.html"))
19
- return "ItemDetailPage";
20
- if (path.includes("inventory.html"))
21
- return "LoggedIn";
22
- if (path.includes("cart.html"))
23
- return "CartPage";
24
- if (path.includes("checkout-step-one.html"))
25
- return "CheckoutInfoPage";
26
- if (path.includes("checkout-step-two.html"))
27
- return "CheckoutOverviewPage";
28
- if (path.includes("checkout-complete.html"))
29
- return "OrderComplete";
30
- if (path === "/" || path === "") {
31
- if (await page.locator("#login-button").isVisible({ timeout: 500 }).catch(() => false)) {
32
- return "LoginPage";
33
- }
34
- }
35
- }
36
- catch {
37
- /* ignore */
38
- }
39
- return null;
40
- }
5
+ import { Engine } from "../../engine/engine.js";
6
+ import { buildFlow } from "../../engine/flow/flow.js";
7
+ import { locate } from "../../engine/locate.js";
8
+ import { MemPage } from "../../engine/mem/mem.js";
9
+ import { buildExploreContext, buildExploreMenu, } from "./explore.js";
10
+ import { installDemoChrome, instrumentAutoInteractions } from "../../demo/overlay/auto-chrome.js";
11
+ import { keepOverlayOnNavigation } from "../../demo/overlay/reattach.js";
12
+ import { configuredExtensions, resolveBaseUrl } from "../../runtime/waygraph-config.js";
13
+ import { withWebServer } from "../../runtime/webserver.js";
14
+ import { chromiumExecutablePath, launchContext } from "../../runtime/browser.js";
15
+ import { envString } from "../../engine/env.js";
16
+ import { ignorePageGone, ignoreTimeout } from "../../engine/page-gone.js";
17
+ /** Which Checkpoint the page is on, asked of the project's own Nav / Page Blocks (their verify). */
41
18
  export async function detectHere(page, navBlocks) {
42
- const fromUrl = await inferCheckpointFromUrl(page);
43
- if (fromUrl)
44
- return fromUrl;
45
19
  const tags = navBlocks.map((n) => n.block);
46
20
  return locate(page, tags, { timeoutMs: 1500 });
47
21
  }
@@ -50,8 +24,8 @@ export async function ensureLivePage(context, page, startUrl) {
50
24
  return page;
51
25
  const fresh = await context.newPage();
52
26
  if (startUrl) {
53
- await fresh.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(() => { });
54
- await fresh.waitForLoadState("load").catch(() => { });
27
+ await fresh.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(ignorePageGone);
28
+ await fresh.waitForLoadState("load").catch(ignoreTimeout);
55
29
  }
56
30
  return fresh;
57
31
  }
@@ -59,28 +33,16 @@ function missingMemKeys(entry, mem) {
59
33
  const requires = entry.block.requires ?? [];
60
34
  return requires.filter((k) => !mem.has(k));
61
35
  }
62
- const DEFAULT_CREDENTIALS = { username: "standard_user", password: "secret_sauce" };
63
- /**
64
- * Saucedemo-only defaults. Exact key names only — never substring `"login"`.
65
- * A consumer's own `key<string>("login-email")` must stay unset here, or it
66
- * silently gets a saucedemo credentials object instead of its own default.
67
- */
68
- export function defaultMemValueForKey(keyName) {
69
- if (keyName === "login-credentials" ||
70
- keyName === "credentials" ||
71
- keyName === "saucedemo.credentials") {
72
- return DEFAULT_CREDENTIALS;
73
- }
74
- return undefined;
36
+ /** The project's own default for a key: its `registerMemStub` fake (live sessions load every `*.mem-stubs.ts`). */
37
+ export function memStubValue(key) {
38
+ return getMemStub(key)?.();
75
39
  }
76
- function defaultMemJsonPrompt(keyName) {
77
- const def = defaultMemValueForKey(keyName);
78
- if (def !== undefined)
79
- return JSON.stringify(def);
80
- return "{}";
40
+ function defaultMemJsonPrompt(key) {
41
+ const def = memStubValue(key);
42
+ return def === undefined ? "{}" : JSON.stringify(def);
81
43
  }
82
44
  function seedMemFromEnv(mem, entry) {
83
- const raw = process.env.WAYGRAPH_DATA ?? process.env.WAYGRAPH_AUTO_MEM;
45
+ const raw = envString("WAYGRAPH_DATA") ?? envString("WAYGRAPH_AUTO_MEM");
84
46
  if (!raw)
85
47
  return false;
86
48
  try {
@@ -95,16 +57,16 @@ function seedMemFromEnv(mem, entry) {
95
57
  return false;
96
58
  }
97
59
  }
98
- /** Pre-seed known demo keys (saucedemo creds) so headful/cli do not stop for mem forms. */
60
+ /** Pre-seeds required keys from WAYGRAPH_DATA and the project's mem stubs, so a session does not stop for mem forms. */
99
61
  export function seedDefaultMem(library, mem) {
100
- const raw = process.env.WAYGRAPH_DATA ?? process.env.WAYGRAPH_AUTO_MEM;
62
+ const raw = envString("WAYGRAPH_DATA") ?? envString("WAYGRAPH_AUTO_MEM");
101
63
  let envParsed = {};
102
64
  if (raw) {
103
65
  try {
104
66
  envParsed = JSON.parse(raw);
105
67
  }
106
- catch {
107
- /* ignore */
68
+ catch (err) {
69
+ throw new Error(`waygraph: --data / WAYGRAPH_DATA is not valid JSON: ${err instanceof Error ? err.message : String(err)}`);
108
70
  }
109
71
  }
110
72
  for (const entry of library.values()) {
@@ -115,7 +77,7 @@ export function seedDefaultMem(library, mem) {
115
77
  mem.set(k, envParsed[k.name]);
116
78
  continue;
117
79
  }
118
- const def = defaultMemValueForKey(k.name);
80
+ const def = memStubValue(k);
119
81
  if (def !== undefined)
120
82
  mem.set(k, def);
121
83
  }
@@ -125,7 +87,7 @@ async function promptMemCli(entry, mem) {
125
87
  const rl = createInterface({ input, output });
126
88
  try {
127
89
  for (const k of missingMemKeys(entry, mem)) {
128
- const def = defaultMemJsonPrompt(k.name);
90
+ const def = defaultMemJsonPrompt(k);
129
91
  const line = await rl.question(` ${k.name} JSON [${def}]: `);
130
92
  const json = line.trim() || def;
131
93
  mem.set(k, JSON.parse(json));
@@ -153,11 +115,7 @@ async function setAutoPanelRunning(page, label) {
153
115
  const panel = __wgById("wg-auto-panel");
154
116
  if (!panel)
155
117
  return;
156
- const body = "<h3>waygraph auto</h3><div style='padding:12px 0;color:#c9a6ff'>" +
157
- "Running: <strong>" +
158
- label +
159
- "</strong></div>";
160
- panel.innerHTML = body;
118
+ __wgSet(panel, __wgEl("h3", null, "waygraph auto"), __wgEl("div", { style: "padding:12px 0;color:#c9a6ff" }, "Running: ", __wgEl("strong", null, label)));
161
119
  if (typeof window.__wgWirePanelChrome === "function") {
162
120
  window.__wgWirePanelChrome(panel, "wg-auto-panel-hidden", "waygraph auto");
163
121
  }
@@ -175,7 +133,7 @@ async function setAutoPanelRunning(page, label) {
175
133
  panel.setAttribute("data-wg-ready", "1");
176
134
  }
177
135
  }, label)
178
- .catch(() => { });
136
+ .catch(ignorePageGone);
179
137
  }
180
138
  export async function runOneBlock(engine, entry, context, page, mem, headful) {
181
139
  const navClick = entry.block.__waygraphNavClick;
@@ -184,11 +142,11 @@ export async function runOneBlock(engine, entry, context, page, mem, headful) {
184
142
  .evaluate((label) => {
185
143
  window.__wgPendingNavClickLabel = label;
186
144
  }, `nav: ${entry.block.name}`)
187
- .catch(() => { });
145
+ .catch(ignorePageGone);
188
146
  }
189
147
  if (headful)
190
148
  await setAutoPanelRunning(page, entry.block.name);
191
- const flow = engine.defineFlow([start, entry.block, end]);
149
+ const flow = buildFlow([entry.block], engine.config);
192
150
  const BLOCK_TIMEOUT_MS = 45_000;
193
151
  let timer;
194
152
  let result;
@@ -206,7 +164,7 @@ export async function runOneBlock(engine, entry, context, page, mem, headful) {
206
164
  if (timer)
207
165
  clearTimeout(timer);
208
166
  }
209
- await page.evaluate("delete window.__wgPendingNavClickLabel").catch(() => { });
167
+ await page.evaluate("delete window.__wgPendingNavClickLabel").catch(ignorePageGone);
210
168
  return result;
211
169
  }
212
170
  const PANEL_CSS = "#wg-auto-panel{position:fixed;z-index:2147483647;left:50%;bottom:12px;transform:translateX(-50%);" +
@@ -242,9 +200,6 @@ const PANEL_CSS = "#wg-auto-panel{position:fixed;z-index:2147483647;left:50%;bot
242
200
  "#wg-auto-panel.wg-collapsed{left:50%;right:auto;transform:translateX(-50%);width:auto;}" +
243
201
  "#wg-auto-panel button.wg-act{padding:12px;font-size:14px;}" +
244
202
  "}";
245
- function esc(s) {
246
- return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/"/g, "&quot;");
247
- }
248
203
  /** Shown in the headful panel after each Block run. */
249
204
  let lastRunNote = null;
250
205
  /**
@@ -306,36 +261,22 @@ async function headfulPick(page, menu, library, mem, waitPick) {
306
261
  const here = menu.here;
307
262
  const hereLabel = here ?? (menu.flat.length > 0 ? "Unknown - pick Start here" : "Unknown - no moves available");
308
263
  const menuMemKeys = memKeysForMenu(menu, library);
309
- let html = `<style id="wg-auto-style">${PANEL_CSS}</style><div id="wg-auto-panel">` +
310
- `<h3>waygraph auto</h3>`;
311
- if (lastRunNote) {
312
- html += `<div style="margin-bottom:8px;font-size:12px;color:#a7f3d0">${esc(lastRunNote)}</div>`;
313
- }
314
- html += `<div class="wg-here">You are here: <strong>${esc(hereLabel)}</strong></div>`;
315
- if (menuMemKeys.length > 0) {
316
- html +=
317
- `<div class="wg-section">Mem - edit credentials, then click a block below</div>`;
318
- let memIdx = 0;
319
- for (const k of menuMemKeys) {
320
- let value = "{}";
321
- try {
322
- if (mem.has(k))
323
- value = JSON.stringify(mem.get(k), null, 2);
324
- else {
325
- const def = defaultMemValueForKey(k.name);
326
- if (def !== undefined)
327
- value = JSON.stringify(def, null, 2);
328
- }
329
- }
330
- catch {
331
- /* ignore */
264
+ const memFields = menuMemKeys.map((k) => {
265
+ let value = "{}";
266
+ try {
267
+ if (mem.has(k))
268
+ value = JSON.stringify(mem.get(k), null, 2);
269
+ else {
270
+ const def = memStubValue(k);
271
+ if (def !== undefined)
272
+ value = JSON.stringify(def, null, 2);
332
273
  }
333
- html +=
334
- `<label class="wg-mem">${esc(k.name)}</label>` +
335
- `<textarea class="wg-mem-input" data-mem-key="${esc(k.name)}" id="wg-mem-${memIdx}" rows="4">${esc(value)}</textarea>`;
336
- memIdx++;
337
274
  }
338
- }
275
+ catch {
276
+ /* a value JSON can't encode shows as {} for the person to fill in */
277
+ }
278
+ return { name: k.name, value };
279
+ });
339
280
  // Pre-resolve every candidate's hover-preview box THROUGH Playwright's own locator (>>
340
281
  // piercing / :has-text() / :visible support), once, here on the Node side - not a raw selector
341
282
  // string handed to the page for a per-mouseenter document.querySelector to fail silently on
@@ -367,152 +308,126 @@ async function headfulPick(page, menu, library, mem, waitPick) {
367
308
  : null;
368
309
  hlBoxes.set(sel, box);
369
310
  }));
370
- html += `<div class="wg-actions">`;
371
311
  let idx = 0;
372
- if (menu.sections.length === 0) {
373
- html += `<div style="opacity:.85;padding:8px 0">No moves from this screen right now.</div>`;
374
- }
375
- for (const section of menu.sections) {
376
- html += `<div class="wg-section">${esc(section.title)}</div>`;
377
- for (const c of section.edges) {
312
+ const sections = menu.sections.map((section) => ({
313
+ title: section.title,
314
+ buttons: section.edges.map((c) => {
378
315
  const entry = library.get(c.block);
379
316
  const navClick = entry?.block?.__waygraphNavClick;
380
317
  const hl = c.instanceOption?.highlight ?? (typeof navClick === "string" ? navClick : undefined);
381
318
  const hlBox = hl ? hlBoxes.get(hl) : null;
382
- const hlAttr = hlBox ? ` data-hl-box='${esc(JSON.stringify(hlBox))}'` : "";
383
- if (c.label) {
384
- html += `<button class="wg-act" data-idx="${idx}"${hlAttr}>${esc(c.label)}</button>`;
319
+ const base = { idx: idx++, hlBox: hlBox ? JSON.stringify(hlBox) : undefined };
320
+ if (c.label)
321
+ return { ...base, label: c.label };
322
+ return { ...base, kind: c.kind, block: c.block, to: c.to, ...(entry?.description ? { description: entry.description } : {}) };
323
+ }),
324
+ }));
325
+ await ensureShadowRoot(page);
326
+ await page.evaluate(({ css, note, hereLabel, memFields, sections }) => {
327
+ __wgCss(css, "wg-auto-style");
328
+ __wgById("wg-auto-panel")?.remove();
329
+ const root = __wgEl("div", { id: "wg-auto-panel" }, __wgEl("h3", null, "waygraph auto"), note ? __wgEl("div", { style: "margin-bottom:8px;font-size:12px;color:#a7f3d0" }, note) : null, __wgEl("div", { class: "wg-here" }, "You are here: ", __wgEl("strong", null, hereLabel)), memFields.length ? __wgEl("div", { class: "wg-section" }, "Mem - edit credentials, then click a block below") : null, memFields.map((f, i) => {
330
+ const field = __wgEl("textarea", { class: "wg-mem-input", id: "wg-mem-" + i, data: { memKey: f.name }, attrs: { rows: 4 } });
331
+ field.value = f.value;
332
+ return [__wgEl("label", { class: "wg-mem" }, f.name), field];
333
+ }), __wgEl("div", { class: "wg-actions" }, sections.length === 0 ? __wgEl("div", { style: "opacity:.85;padding:8px 0" }, "No moves from this screen right now.") : null, sections.map((section) => [
334
+ __wgEl("div", { class: "wg-section" }, section.title),
335
+ section.buttons.map((b) => __wgEl("button", { class: "wg-act", data: { idx: b.idx, hlBox: b.hlBox } }, b.label !== undefined
336
+ ? b.label
337
+ : [
338
+ __wgEl("span", { class: "wg-kind" }, b.kind ?? ""),
339
+ " ",
340
+ __wgEl("strong", null, b.block ?? ""),
341
+ " -> " + (b.to ?? ""),
342
+ b.description ? [__wgEl("br"), __wgEl("span", { style: "opacity:.85" }, b.description)] : null,
343
+ ])),
344
+ ])), __wgEl("button", { class: "wg-act wg-quit", data: { quit: "1" } }, "Quit"));
345
+ __wgAdd(root);
346
+ // Chrome + Hide/Show, shared with setAutoPanelRunning.
347
+ window.__wgWirePanelChrome = (el, storageKey, chromeTitle) => {
348
+ if (!el)
349
+ return;
350
+ if (!el.querySelector(":scope > .wg-chrome")) {
351
+ const body = __wgEl("div", { class: "wg-body" }, Array.from(el.childNodes));
352
+ const chrome = __wgEl("div", { class: "wg-chrome" }, __wgEl("span", { class: "wg-chrome-title" }, chromeTitle || "waygraph auto"), __wgEl("button", { class: "wg-hide-btn", data: { wgToggle: "1" }, attrs: { type: "button" } }, "Hide"));
353
+ el.append(chrome, body);
385
354
  }
386
- else {
387
- const desc = entry?.description ? `<br><span style="opacity:.85">${esc(entry.description)}</span>` : "";
388
- html +=
389
- `<button class="wg-act" data-idx="${idx}"${hlAttr}><span class="wg-kind">${esc(c.kind)}</span> ` +
390
- `<strong>${esc(c.block)}</strong> -> ${esc(c.to)}${desc}</button>`;
355
+ const apply = (hidden) => {
356
+ el.classList.toggle("wg-collapsed", hidden);
357
+ el.setAttribute("data-wg-collapsed", hidden ? "1" : "0");
358
+ const t = el.querySelector("[data-wg-toggle]");
359
+ if (t)
360
+ t.textContent = hidden ? "Show" : "Hide";
361
+ try {
362
+ localStorage.setItem(storageKey, hidden ? "1" : "0");
363
+ }
364
+ catch {
365
+ /* blocked storage: Hide still works for this page */
366
+ }
367
+ };
368
+ let hidden = false;
369
+ try {
370
+ hidden = localStorage.getItem(storageKey) === "1";
371
+ }
372
+ catch {
373
+ /* blocked storage: starts shown */
374
+ }
375
+ apply(hidden);
376
+ const toggle = el.querySelector("[data-wg-toggle]");
377
+ if (toggle && !toggle.dataset.wgWired) {
378
+ toggle.dataset.wgWired = "1";
379
+ toggle.addEventListener("click", (e) => {
380
+ e.stopPropagation();
381
+ apply(!el.classList.contains("wg-collapsed"));
382
+ });
391
383
  }
392
- idx++;
393
- }
394
- }
395
- html += `</div><button class="wg-act wg-quit" data-quit="1">Quit</button></div>`;
396
- // Wrap body; chrome + Hide/Show wired in page (shared with stepper).
397
- html =
398
- `<style id="wg-auto-style">${PANEL_CSS}</style><div id="wg-auto-panel">` +
399
- html.slice(html.indexOf("<h3>"));
400
- await ensureShadowRoot(page);
401
- await page.evaluate(`((inner) => {
402
- let panel = __wgById("wg-auto-panel");
403
- if (!panel) {
404
- panel = document.createElement("div");
405
- __wgAdd(panel);
406
- }
407
- panel.outerHTML = inner;
408
- const root = __wgById("wg-auto-panel");
409
- if (!root) return;
410
- window.__wgWirePanelChrome = (el, storageKey, chromeTitle) => {
411
- if (!el) return;
412
- if (!el.querySelector(":scope > .wg-chrome")) {
413
- const body = document.createElement("div");
414
- body.className = "wg-body";
415
- while (el.firstChild) body.appendChild(el.firstChild);
416
- const chrome = document.createElement("div");
417
- chrome.className = "wg-chrome";
418
- const titleEl = document.createElement("span");
419
- titleEl.className = "wg-chrome-title";
420
- titleEl.textContent = chromeTitle || "waygraph auto";
421
- const btn = document.createElement("button");
422
- btn.type = "button";
423
- btn.className = "wg-hide-btn";
424
- btn.setAttribute("data-wg-toggle", "1");
425
- btn.textContent = "Hide";
426
- chrome.appendChild(titleEl);
427
- chrome.appendChild(btn);
428
- el.appendChild(chrome);
429
- el.appendChild(body);
430
- }
431
- const apply = (hidden) => {
432
- el.classList.toggle("wg-collapsed", hidden);
433
- el.setAttribute("data-wg-collapsed", hidden ? "1" : "0");
434
- const t = el.querySelector("[data-wg-toggle]");
435
- if (t) t.textContent = hidden ? "Show" : "Hide";
436
- try { localStorage.setItem(storageKey, hidden ? "1" : "0"); } catch {}
437
384
  };
438
- let hidden = false;
439
- try { hidden = localStorage.getItem(storageKey) === "1"; } catch {}
440
- apply(hidden);
441
- const toggle = el.querySelector("[data-wg-toggle]");
442
- if (toggle && !toggle.dataset.wgWired) {
443
- toggle.dataset.wgWired = "1";
444
- toggle.addEventListener("click", (e) => {
445
- e.stopPropagation();
446
- apply(!el.classList.contains("wg-collapsed"));
447
- });
385
+ window.__wgWirePanelChrome(root, "wg-auto-panel-hidden", "waygraph auto");
386
+ if (typeof window.__wgStampModal === "function") {
387
+ window.__wgStampModal(root, "auto-panel", { phase: "pick", ready: true });
448
388
  }
449
- };
450
- window.__wgWirePanelChrome(root, "wg-auto-panel-hidden", "waygraph auto");
451
- if (typeof window.__wgStampModal === "function") {
452
- window.__wgStampModal(root, "auto-panel", { phase: "pick", ready: true });
453
- } else {
454
- root.setAttribute("data-wg-ui", "1");
455
- root.setAttribute("data-wg-modal", "auto-panel");
456
- root.setAttribute("data-wg-phase", "pick");
457
- root.setAttribute(
458
- "data-wg-collapsed",
459
- root.classList.contains("wg-collapsed") ? "1" : "0",
460
- );
461
- root.setAttribute("data-wg-ready", "1");
462
- window.__wgOverlayBeacon =
463
- window.__wgOverlayBeacon ||
464
- (() =>
465
- Array.from(__wgQA('[data-wg-ui="1"]')).map((el) => {
466
- const r = el.getBoundingClientRect();
467
- const st = getComputedStyle(el);
468
- return {
469
- id: el.id || null,
470
- modal: el.getAttribute("data-wg-modal"),
471
- ready: el.getAttribute("data-wg-ready") === "1",
472
- phase: el.getAttribute("data-wg-phase"),
473
- step: el.getAttribute("data-wg-step"),
474
- block: el.getAttribute("data-wg-block"),
475
- collapsed:
476
- el.getAttribute("data-wg-collapsed") === "1" ||
477
- el.classList.contains("wg-collapsed"),
478
- opacity: st.opacity,
479
- textLen: (el.innerText || "").trim().length,
480
- w: Math.round(r.width),
481
- h: Math.round(r.height),
482
- visible: r.width > 0 && r.height > 0 && Number(st.opacity) > 0.05,
483
- };
484
- }));
485
- }
486
- root.querySelectorAll("button[data-idx]").forEach((btn) => {
487
- btn.addEventListener("click", () => {
488
- const idx = Number(btn.getAttribute("data-idx"));
489
- window.__wgAutoPick?.(idx);
490
- });
491
- btn.addEventListener("mouseenter", () => {
492
- // Pre-resolved on the Node side via Playwright's own locator (>> piercing / :has-text()
493
- // support) when this menu was built - see headfulPick's own comment for why a
494
- // mouseenter handler can't itself round-trip to a Node-side locator per hover.
495
- const raw = btn.getAttribute("data-hl-box");
496
- if (!raw || typeof window.__wgPositionRing !== "function") return;
497
- let box;
498
- try {
499
- box = JSON.parse(raw);
500
- } catch {
501
- return;
502
- }
503
- window.__wgPositionRing(
504
- box,
505
- btn.textContent?.trim()?.slice(0, 80) || "target",
506
- "auto",
507
- );
508
- });
509
- btn.addEventListener("mouseleave", () => {
510
- window.__wgHideRing?.();
389
+ else {
390
+ root.setAttribute("data-wg-ui", "1");
391
+ root.setAttribute("data-wg-modal", "auto-panel");
392
+ root.setAttribute("data-wg-phase", "pick");
393
+ root.setAttribute("data-wg-collapsed", root.classList.contains("wg-collapsed") ? "1" : "0");
394
+ root.setAttribute("data-wg-ready", "1");
395
+ window.__wgOverlayBeacon =
396
+ window.__wgOverlayBeacon ||
397
+ (() => Array.from(__wgQA('[data-wg-ui="1"]')).map((el) => {
398
+ const r = el.getBoundingClientRect();
399
+ const st = getComputedStyle(el);
400
+ return {
401
+ id: el.id || null,
402
+ modal: el.getAttribute("data-wg-modal"),
403
+ ready: el.getAttribute("data-wg-ready") === "1",
404
+ phase: el.getAttribute("data-wg-phase"),
405
+ step: el.getAttribute("data-wg-step"),
406
+ block: el.getAttribute("data-wg-block"),
407
+ collapsed: el.getAttribute("data-wg-collapsed") === "1" || el.classList.contains("wg-collapsed"),
408
+ opacity: st.opacity,
409
+ textLen: (el.innerText || "").trim().length,
410
+ w: Math.round(r.width),
411
+ h: Math.round(r.height),
412
+ visible: r.width > 0 && r.height > 0 && Number(st.opacity) > 0.05,
413
+ };
414
+ }));
415
+ }
416
+ root.querySelectorAll("button[data-idx]").forEach((btn) => {
417
+ btn.addEventListener("click", () => window.__wgAutoPick?.(Number(btn.dataset.idx)));
418
+ btn.addEventListener("mouseenter", () => {
419
+ // Pre-resolved on the Node side via Playwright's own locator (>> piercing / :has-text()
420
+ // support) when this menu was built - see headfulPick's own comment for why a
421
+ // mouseenter handler can't itself round-trip to a Node-side locator per hover.
422
+ const raw = btn.dataset.hlBox;
423
+ if (!raw || typeof window.__wgPositionRing !== "function")
424
+ return;
425
+ window.__wgPositionRing(JSON.parse(raw), btn.textContent?.trim()?.slice(0, 80) || "target", "auto");
426
+ });
427
+ btn.addEventListener("mouseleave", () => window.__wgHideRing?.());
511
428
  });
512
- });
513
- const quit = root.querySelector("[data-quit]");
514
- if (quit) quit.addEventListener("click", () => window.__wgAutoQuit?.());
515
- })(${JSON.stringify(html)})`);
429
+ root.querySelector("[data-quit]")?.addEventListener("click", () => window.__wgAutoQuit?.());
430
+ }, { css: PANEL_CSS, note: lastRunNote, hereLabel, memFields, sections });
516
431
  return waitPick();
517
432
  }
518
433
  function printCliMenu(menu, library) {
@@ -567,7 +482,7 @@ export async function runAutoExplore(projectDir, options = {}) {
567
482
  async function runAutoExploreCore(projectDir, options = {}) {
568
483
  lastRunNote = null;
569
484
  const cli = options.cli === true;
570
- const baseURL = options.baseURL ?? (await resolveBaseUrl(projectDir)) ?? process.env.WAYGRAPH_BASE_URL;
485
+ const baseURL = options.baseURL ?? (await resolveBaseUrl(projectDir)) ?? envString("WAYGRAPH_BASE_URL");
571
486
  const startUrl = options.startUrl ?? baseURL;
572
487
  const { graph, library } = await buildExploreContext(projectDir, options.blocksSelect ? { blocksSelect: options.blocksSelect } : undefined);
573
488
  if (options.blocksSelect) {
@@ -600,8 +515,8 @@ async function runAutoExploreCore(projectDir, options = {}) {
600
515
  });
601
516
  let page = await context.newPage();
602
517
  if (startUrl) {
603
- await page.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(() => { });
604
- await page.waitForLoadState("load").catch(() => { });
518
+ await page.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(ignorePageGone);
519
+ await page.waitForLoadState("load").catch(ignoreTimeout);
605
520
  }
606
521
  console.error(`waygraph auto: ${graph.nodes.length} checkpoint(s), ${graph.edges.length} edge(s) - ` +
607
522
  (cli ? "CLI picker (terminal menu)" : "headful picker (browser panel)"));
@@ -618,7 +533,8 @@ async function runAutoExploreCore(projectDir, options = {}) {
618
533
  });
619
534
  if (!cli) {
620
535
  await installDemoChrome(target, "", { banner: false });
621
- instrumentInteractionHighlighting(target, mem, 250);
536
+ keepOverlayOnNavigation(target, () => installDemoChrome(target, "", { banner: false }));
537
+ instrumentAutoInteractions(target, mem, 250);
622
538
  }
623
539
  wiredPage = target;
624
540
  }
@@ -1,18 +1,12 @@
1
1
  import type { Page } from "@playwright/test";
2
- import type { Block, Checkpoint, WaygraphInstanceOption } from "../types.js";
3
- import { type WaygraphGraph, type WaygraphEdge } from "../analysis/graph.js";
2
+ import type { WaygraphInstanceOption } from "../../engine/block/block.js";
3
+ import { type WaygraphGraph, type WaygraphEdge } from "../../analysis/graph.js";
4
4
  export interface ExploreContextOpts {
5
- blocksSelect?: import("../blocks-select.js").BlocksSelect;
5
+ blocksSelect?: import("../../manifest/select.js").BlocksSelect;
6
6
  /** Absolute paths of extra Block trees to merge (host projectDir is always first). */
7
7
  inject?: string[];
8
8
  }
9
- export interface BlockEntry {
10
- block: Block<Checkpoint<string>, Checkpoint<string>>;
11
- exportName: string;
12
- file: string;
13
- kind: "nav" | "action";
14
- description: string;
15
- }
9
+ import type { BlockEntry } from "../../manifest/project.js";
16
10
  /**
17
11
  * One menu row. Usually just a `WaygraphEdge` as discovered statically; when
18
12
  * a Block declares `instanceOptions`, one `ExploreEdge` is produced per live
@@ -41,10 +35,6 @@ export declare function loadBlockLibrary(projectDir: string, opts?: ExploreConte
41
35
  byName: Map<string, BlockEntry>;
42
36
  navBlocks: BlockEntry[];
43
37
  }>;
44
- /**
45
- * @deprecated Use {@link buildExploreMenu} — kept for unit tests.
46
- */
47
- export declare function exploreChoices(graph: WaygraphGraph, here: string | null): WaygraphEdge[];
48
38
  /**
49
39
  * Runtime-filtered menu: only Blocks that can run on the live page, grouped forward/back.
50
40
  */