waygraph 0.15.54 → 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 (510) 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/{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 +3 -11
  52. package/dist/{highlights → demo/narration}/demo-pace.js +5 -11
  53. package/dist/{highlights → demo/narration}/device.d.ts +2 -2
  54. package/dist/{highlights → demo/narration}/device.js +1 -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/demo/overlay/cursor.d.ts +12 -0
  69. package/dist/demo/overlay/cursor.js +142 -0
  70. package/dist/demo/overlay/device-stage.d.ts +13 -0
  71. package/dist/demo/overlay/device-stage.js +396 -0
  72. package/dist/demo/overlay/inpage/banner.d.ts +1 -0
  73. package/dist/demo/overlay/inpage/banner.js +160 -0
  74. package/dist/demo/overlay/inpage/caption.d.ts +2 -0
  75. package/dist/demo/overlay/inpage/caption.js +24 -0
  76. package/dist/demo/overlay/inpage/core.d.ts +1 -0
  77. package/dist/demo/overlay/inpage/core.js +345 -0
  78. package/dist/demo/overlay/inpage/device-chip.d.ts +1 -0
  79. package/dist/demo/overlay/inpage/device-chip.js +191 -0
  80. package/dist/demo/overlay/inpage/network.d.ts +9 -0
  81. package/dist/demo/overlay/inpage/network.js +200 -0
  82. package/dist/demo/overlay/inpage/panel-chrome.d.ts +1 -0
  83. package/dist/demo/overlay/inpage/panel-chrome.js +203 -0
  84. package/dist/demo/overlay/inpage/stamp.d.ts +1 -0
  85. package/dist/demo/overlay/inpage/stamp.js +46 -0
  86. package/dist/demo/overlay/inpage/swipe-zoom.d.ts +1 -0
  87. package/dist/demo/overlay/inpage/swipe-zoom.js +220 -0
  88. package/dist/demo/overlay/inpage/todos.d.ts +1 -0
  89. package/dist/demo/overlay/inpage/todos.js +294 -0
  90. package/dist/demo/overlay/locator-theater.d.ts +25 -0
  91. package/dist/demo/overlay/locator-theater.js +76 -0
  92. package/dist/demo/overlay/network-capture.d.ts +22 -0
  93. package/dist/demo/overlay/network-capture.js +127 -0
  94. package/dist/demo/overlay/overlay-css.d.ts +3 -0
  95. package/dist/demo/overlay/overlay-css.js +369 -0
  96. package/dist/demo/overlay/overlay-stage.d.ts +23 -0
  97. package/dist/demo/overlay/overlay-stage.js +106 -0
  98. package/dist/demo/overlay/overlay.d.ts +10 -0
  99. package/dist/demo/overlay/overlay.js +89 -0
  100. package/dist/{pilot-overlay/overlay-fixtures.d.ts → demo/overlay/phase-fixtures.d.ts} +2 -2
  101. package/dist/{pilot-overlay/overlay-fixtures.js → demo/overlay/phase-fixtures.js} +2 -2
  102. package/dist/{pilot-overlay/action-ring.js → demo/overlay/pilot/actions.js} +2 -1
  103. package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.d.ts +6 -5
  104. package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.js +19 -18
  105. package/dist/{pilot-overlay → demo/overlay/pilot}/shell.d.ts +2 -2
  106. package/dist/{pilot-overlay → demo/overlay/pilot}/shell.js +13 -22
  107. package/dist/demo/overlay/reattach.d.ts +7 -0
  108. package/dist/demo/overlay/reattach.js +23 -0
  109. package/dist/demo/overlay/rings.d.ts +33 -0
  110. package/dist/demo/overlay/rings.js +448 -0
  111. package/dist/{ui → demo/overlay/ui}/components/ring.js +2 -2
  112. package/dist/{ui → demo/overlay/ui}/overlay.css +4 -4
  113. package/dist/{ui → demo/overlay/ui}/shadow.d.ts +1 -1
  114. package/dist/{ui → demo/overlay/ui}/shadow.js +39 -2
  115. package/dist/demo/stepper/after.d.ts +3 -0
  116. package/dist/demo/stepper/after.js +113 -0
  117. package/dist/demo/stepper/banner-log.d.ts +37 -0
  118. package/dist/demo/stepper/banner-log.js +63 -0
  119. package/dist/demo/stepper/before.d.ts +4 -0
  120. package/dist/demo/stepper/before.js +110 -0
  121. package/dist/demo/stepper/demo-log.d.ts +31 -0
  122. package/dist/demo/stepper/demo-log.js +309 -0
  123. package/dist/demo/stepper/gate.d.ts +11 -0
  124. package/dist/demo/stepper/gate.js +78 -0
  125. package/dist/demo/stepper/interaction-patch.d.ts +3 -0
  126. package/dist/demo/stepper/interaction-patch.js +323 -0
  127. package/dist/demo/stepper/pacing.d.ts +21 -0
  128. package/dist/demo/stepper/pacing.js +23 -0
  129. package/dist/demo/stepper/slides.d.ts +11 -0
  130. package/dist/demo/stepper/slides.js +233 -0
  131. package/dist/demo/stepper/step-panels.d.ts +21 -0
  132. package/dist/demo/stepper/step-panels.js +589 -0
  133. package/dist/demo/stepper/stepper.d.ts +24 -0
  134. package/dist/demo/stepper/stepper.js +122 -0
  135. package/dist/demo/stepper/teardown.d.ts +48 -0
  136. package/dist/demo/stepper/teardown.js +179 -0
  137. package/dist/demo/stepper/todo-advance.d.ts +14 -0
  138. package/dist/demo/stepper/todo-advance.js +110 -0
  139. package/dist/demo/stepper/view.d.ts +68 -0
  140. package/dist/demo/stepper/view.js +31 -0
  141. package/dist/demo/types.d.ts +17 -0
  142. package/dist/demo/verbose-log.js +15 -0
  143. package/dist/{types.d.ts → engine/block/block.d.ts} +106 -91
  144. package/dist/{core → engine/block}/block.js +10 -53
  145. package/dist/{core → engine/block}/compose.d.ts +9 -7
  146. package/dist/{core → engine/block}/compose.js +1 -1
  147. package/dist/{core/blocks → engine/block/kinds}/api.d.ts +16 -12
  148. package/dist/{core/blocks → engine/block/kinds}/api.js +26 -18
  149. package/dist/{core/blocks → engine/block/kinds}/effect.d.ts +13 -18
  150. package/dist/engine/block/kinds/effect.js +17 -0
  151. package/dist/{core/blocks → engine/block/kinds}/method.d.ts +17 -29
  152. package/dist/{core/blocks → engine/block/kinds}/method.js +6 -21
  153. package/dist/{core/blocks → engine/block/kinds}/nav.d.ts +21 -31
  154. package/dist/{core/blocks → engine/block/kinds}/nav.js +6 -12
  155. package/dist/{core/blocks → engine/block/kinds}/page.d.ts +14 -20
  156. package/dist/{core/blocks → engine/block/kinds}/page.js +5 -7
  157. package/dist/engine/checkpoint/checkpoint.d.ts +22 -0
  158. package/dist/engine/checkpoint/checkpoint.js +8 -0
  159. package/dist/engine/checkpoint/route.d.ts +28 -0
  160. package/dist/engine/checkpoint/route.js +28 -0
  161. package/dist/{core → engine}/config.d.ts +7 -2
  162. package/dist/engine/config.js +6 -0
  163. package/dist/engine/engine.d.ts +45 -0
  164. package/dist/{core → engine}/engine.js +6 -10
  165. package/dist/engine/env.d.ts +59 -0
  166. package/dist/engine/env.js +83 -0
  167. package/dist/{errors.d.ts → engine/errors.d.ts} +22 -22
  168. package/dist/{errors.js → engine/errors.js} +22 -22
  169. package/dist/{core → engine/flow}/branch-regression.d.ts +7 -7
  170. package/dist/{core → engine/flow}/branch-regression.js +4 -3
  171. package/dist/engine/flow/flow.d.ts +162 -0
  172. package/dist/engine/flow/flow.js +244 -0
  173. package/dist/{core → engine/flow}/map-builder.d.ts +34 -39
  174. package/dist/{core → engine/flow}/map-builder.js +45 -47
  175. package/dist/{core → engine}/locate.d.ts +1 -1
  176. package/dist/{core → engine}/locate.js +1 -2
  177. package/dist/{mem-stub.d.ts → engine/mem/mem-stub.d.ts} +9 -8
  178. package/dist/{mem-stub.js → engine/mem/mem-stub.js} +2 -2
  179. package/dist/{mem-page.d.ts → engine/mem/mem.d.ts} +1 -1
  180. package/dist/{mem-page.js → engine/mem/mem.js} +2 -1
  181. package/dist/engine/page-gone.d.ts +5 -0
  182. package/dist/engine/page-gone.js +20 -0
  183. package/dist/engine/run/connect.d.ts +28 -0
  184. package/dist/{types.js → engine/run/connect.js} +11 -10
  185. package/dist/engine/run/events.d.ts +67 -0
  186. package/dist/engine/run/events.js +90 -0
  187. package/dist/engine/run/hooks.d.ts +16 -0
  188. package/dist/engine/run/hooks.js +8 -0
  189. package/dist/engine/run/launch.d.ts +13 -0
  190. package/dist/engine/run/launch.js +27 -0
  191. package/dist/{core/run-graph.d.ts → engine/run/run.d.ts} +8 -12
  192. package/dist/{core/run-graph.js → engine/run/run.js} +22 -12
  193. package/dist/engine/stub/pace.d.ts +12 -0
  194. package/dist/engine/stub/pace.js +2 -0
  195. package/dist/engine/stub/ring.d.ts +130 -0
  196. package/dist/engine/stub/ring.js +41 -0
  197. package/dist/engine/stub/stub.d.ts +268 -0
  198. package/dist/engine/stub/stub.js +1 -0
  199. package/dist/engine/stub/todos.d.ts +104 -0
  200. package/dist/engine/stub/todos.js +2 -0
  201. package/dist/engine/stub/viewport.d.ts +26 -0
  202. package/dist/engine/stub/viewport.js +2 -0
  203. package/dist/{trait.d.ts → engine/trait/trait.d.ts} +1 -1
  204. package/dist/index.d.ts +84 -36
  205. package/dist/index.js +44 -19
  206. package/dist/{session/auto-explore-run.d.ts → live/auto/auto.d.ts} +10 -16
  207. package/dist/{session/auto-explore-run.js → live/auto/auto.js} +164 -254
  208. package/dist/{session/auto-explore.d.ts → live/auto/explore.d.ts} +4 -14
  209. package/dist/{session/auto-explore.js → live/auto/explore.js} +21 -127
  210. package/dist/{auto-session/session.d.ts → live/auto-session/auto-session.d.ts} +1 -1
  211. package/dist/{auto-session/session.js → live/auto-session/auto-session.js} +27 -24
  212. package/dist/{auto-session → live/auto-session}/helpers.d.ts +6 -5
  213. package/dist/{auto-session → live/auto-session}/helpers.js +1 -1
  214. package/dist/{session/auto-session-ipc.d.ts → live/auto-session/ipc.d.ts} +7 -5
  215. package/dist/{session/auto-session-ipc.js → live/auto-session/ipc.js} +31 -16
  216. package/dist/{session/browser.d.ts → live/auto-session/start.d.ts} +1 -2
  217. package/dist/{session/browser.js → live/auto-session/start.js} +2 -3
  218. package/dist/{pilot-overlay → live/pilot}/panel.d.ts +1 -1
  219. package/dist/{pilot-overlay → live/pilot}/panel.js +23 -31
  220. package/dist/{session → live/pilot}/pilot.d.ts +3 -3
  221. package/dist/{session → live/pilot}/pilot.js +4 -4
  222. package/dist/{traverse/run.d.ts → live/traverse/traverse.d.ts} +1 -1
  223. package/dist/{traverse/run.js → live/traverse/traverse.js} +26 -43
  224. package/dist/manifest/manifest.d.ts +52 -0
  225. package/dist/manifest/manifest.js +93 -0
  226. package/dist/manifest/map-imports.d.ts +7 -0
  227. package/dist/manifest/map-imports.js +22 -0
  228. package/dist/manifest/maps.d.ts +33 -0
  229. package/dist/manifest/maps.js +62 -0
  230. package/dist/manifest/pack.d.ts +21 -0
  231. package/dist/manifest/pack.js +109 -0
  232. package/dist/manifest/project.d.ts +60 -0
  233. package/dist/manifest/project.js +101 -0
  234. package/dist/{session/block-inject.js → manifest/roots.js} +1 -18
  235. package/dist/manifest/scan.d.ts +19 -0
  236. package/dist/manifest/scan.js +57 -0
  237. package/dist/manifest/source.d.ts +23 -0
  238. package/dist/manifest/source.js +86 -0
  239. package/dist/runner/mode.d.ts +71 -0
  240. package/dist/runner/mode.js +1 -0
  241. package/dist/runner/modes/branches.d.ts +5 -0
  242. package/dist/runner/modes/branches.js +37 -0
  243. package/dist/runner/modes/demo.d.ts +3 -0
  244. package/dist/runner/modes/demo.js +13 -0
  245. package/dist/runner/modes/report.d.ts +2 -0
  246. package/dist/runner/modes/report.js +54 -0
  247. package/dist/runner/modes/run.d.ts +2 -0
  248. package/dist/runner/modes/run.js +3 -0
  249. package/dist/runner/options.d.ts +31 -0
  250. package/dist/runner/options.js +42 -0
  251. package/dist/runner/plan/find.d.ts +18 -0
  252. package/dist/runner/plan/find.js +65 -0
  253. package/dist/runner/plan/plan.d.ts +11 -0
  254. package/dist/runner/plan/plan.js +97 -0
  255. package/dist/runner/plan/seed-mem.d.ts +12 -0
  256. package/dist/runner/plan/seed-mem.js +98 -0
  257. package/dist/runner/plan/spec.d.ts +5 -0
  258. package/dist/runner/plan/spec.js +17 -0
  259. package/dist/runner/play-steps.d.ts +2 -0
  260. package/dist/runner/play-steps.js +59 -0
  261. package/dist/runner/runner.d.ts +4 -0
  262. package/dist/runner/runner.js +64 -0
  263. package/dist/runner/session.d.ts +9 -0
  264. package/dist/runner/session.js +87 -0
  265. package/dist/{browser.js → runtime/browser.js} +4 -2
  266. package/dist/{env-file.js → runtime/env-file.js} +7 -12
  267. package/dist/{extensions.d.ts → runtime/extensions.d.ts} +1 -5
  268. package/dist/{extensions.js → runtime/extensions.js} +2 -1
  269. package/dist/runtime/full-launch.d.ts +1 -0
  270. package/dist/runtime/full-launch.js +34 -0
  271. package/dist/runtime/global-flag.d.ts +5 -0
  272. package/dist/runtime/global-flag.js +18 -0
  273. package/dist/{playwright-config.d.ts → runtime/playwright-config.d.ts} +1 -1
  274. package/dist/{playwright.config.js → runtime/playwright.config.js} +3 -2
  275. package/dist/runtime/run-log.d.ts +2 -0
  276. package/dist/runtime/run-log.js +17 -0
  277. package/dist/{video-dir.js → runtime/video-dir.js} +3 -2
  278. package/dist/{config.d.ts → runtime/waygraph-config.d.ts} +6 -9
  279. package/dist/{config.js → runtime/waygraph-config.js} +21 -51
  280. package/dist/{webserver.js → runtime/webserver.js} +5 -30
  281. package/examples/routed-demo/config/waygraph.config.ts +20 -0
  282. package/examples/routed-demo/package.json +1 -4
  283. package/examples/routed-demo/scripts/fixture-server.mjs +1 -1
  284. package/examples/routed-demo/src/flows/routed-demo-map.flow.ts +2 -4
  285. package/examples/routed-demo/src/flows/routed-demo.flow.ts +1 -2
  286. package/examples/routed-demo/src/map/(app_base)/dashboard/_methods/click-widget.block.ts +5 -4
  287. package/examples/routed-demo/src/map/(app_base)/dashboard/_nav.block.ts +3 -3
  288. package/examples/routed-demo/src/map/(app_base)/dashboard/_page.block.ts +3 -3
  289. package/examples/routed-demo/src/map/(external)/docs/_nav.block.ts +3 -3
  290. package/examples/routed-demo/src/map/(external)/docs/_page.block.ts +3 -3
  291. package/examples/routed-demo/src/states/routed-demo.states.ts +5 -3
  292. package/examples/routed-demo/tests/routed-demo.spec.ts +4 -4
  293. package/examples/routed-demo/tsconfig.json +1 -1
  294. package/examples/saucedemo/docs/CONVENTION.md +4 -5
  295. package/examples/saucedemo/docs/HELPERS.md +11 -11
  296. package/examples/saucedemo/src/blocks/SITE-MAP.md +0 -1
  297. package/examples/saucedemo/src/blocks/saucedemo-web/NAV.md +1 -5
  298. package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -3
  299. package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
  300. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
  301. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
  302. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
  303. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
  304. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +5 -8
  305. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -3
  306. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
  307. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +35 -43
  308. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
  309. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
  310. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
  311. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
  312. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
  313. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
  314. package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -4
  315. package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -4
  316. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +4 -5
  317. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
  318. package/examples/saucedemo/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
  319. package/examples/saucedemo/src/flows/api-demo.flow.ts +12 -10
  320. package/examples/saucedemo/src/states/checkout.states.ts +21 -11
  321. package/examples/saucedemo/src/stubs/device-showcase.ts +8 -10
  322. package/examples/saucedemo/tests/auto-graph.spec.ts +4 -12
  323. package/package.json +10 -6
  324. package/templates/agents/waygraph-planner.agent.md +2 -2
  325. package/templates/quickstart/docs/CONVENTION.md +4 -4
  326. package/templates/quickstart/docs/HELPERS.md +10 -8
  327. package/templates/quickstart/package.json +0 -3
  328. package/templates/quickstart/src/blocks/SITE-MAP.md +0 -1
  329. package/templates/quickstart/src/blocks/saucedemo-web/NAV.md +1 -5
  330. package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -3
  331. package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
  332. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
  333. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
  334. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
  335. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
  336. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +5 -8
  337. package/templates/quickstart/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -3
  338. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
  339. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +35 -43
  340. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
  341. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
  342. package/templates/quickstart/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
  343. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
  344. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
  345. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
  346. package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -4
  347. package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -4
  348. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +4 -5
  349. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
  350. package/templates/quickstart/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
  351. package/templates/quickstart/src/flows/api-demo.flow.ts +12 -10
  352. package/templates/quickstart/src/states/checkout.states.ts +21 -11
  353. package/templates/quickstart/src/stubs/device-showcase.ts +8 -10
  354. package/templates/scaffold/README.md +2 -1
  355. package/templates/scaffold/STRUCTURE.md +5 -4
  356. package/templates/scaffold/config/waygraph.config.ts +1 -0
  357. package/templates/scaffold/gitignore +1 -0
  358. package/templates/scaffold/src/flows/README.md +2 -2
  359. package/templates/scaffold/src/map/(app_base)/docs/_nav.block.ts +3 -3
  360. package/templates/scaffold/src/map/(app_base)/docs/_page.block.ts +3 -3
  361. package/templates/scaffold/src/map/(app_base)/home/_methods/add-item.effect.block.ts +4 -4
  362. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-hello.method.block.ts +3 -3
  363. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-item-added.method.block.ts +3 -3
  364. package/templates/scaffold/src/map/(app_base)/home/_methods/clear-cart.method.block.ts +5 -4
  365. package/templates/scaffold/src/map/(app_base)/home/_methods/remove-item.effect.block.ts +4 -4
  366. package/templates/scaffold/src/map/(app_base)/home/_nav.block.ts +3 -3
  367. package/templates/scaffold/src/map/(app_base)/home/_page.block.ts +3 -3
  368. package/templates/scaffold/src/map/(app_base)/home/nav-verification-link.block.ts +4 -4
  369. package/templates/scaffold/src/map/(external)/hoppscotch/_keys.ts +21 -0
  370. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-body.method.block.ts +4 -4
  371. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-header.method.block.ts +4 -4
  372. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-status.method.block.ts +4 -4
  373. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/pick-extension-interceptor.method.block.ts +5 -4
  374. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-body.method.block.ts +6 -5
  375. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-headers.method.block.ts +6 -5
  376. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/send-request.method.block.ts +5 -4
  377. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-bearer-token.method.block.ts +6 -5
  378. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-headers.method.block.ts +6 -5
  379. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-json-body.method.block.ts +6 -5
  380. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-method.method.block.ts +6 -5
  381. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-query-params.method.block.ts +6 -5
  382. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-url.method.block.ts +6 -5
  383. package/templates/scaffold/src/map/(external)/hoppscotch/_nav.block.ts +3 -3
  384. package/templates/scaffold/src/map/(external)/hoppscotch/_page.block.ts +3 -3
  385. package/templates/scaffold/src/map/(external)/hoppscotch/_states.ts +6 -0
  386. package/templates/scaffold/src/map/(external)/hoppscotch/settings/_nav.block.ts +3 -3
  387. package/templates/scaffold/src/map/(external)/mailpit/_keys.ts +13 -0
  388. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-content.method.block.ts +4 -4
  389. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-received.method.block.ts +4 -4
  390. package/templates/scaffold/src/map/(external)/mailpit/_methods/extract-email-link.method.block.ts +6 -5
  391. package/templates/scaffold/src/map/(external)/mailpit/_methods/open-message.method.block.ts +6 -5
  392. package/templates/scaffold/src/map/(external)/mailpit/_nav.block.ts +3 -3
  393. package/templates/scaffold/src/map/(external)/mailpit/_page.block.ts +3 -3
  394. package/templates/scaffold/src/map/(external)/mailpit/_states.ts +9 -0
  395. package/templates/scaffold/src/map/README.md +7 -0
  396. package/templates/scaffold/src/states/README.md +4 -1
  397. package/templates/scaffold/src/states/demo.mem-keys.ts +1 -29
  398. package/templates/scaffold/src/states/demo.states.ts +14 -20
  399. package/templates/scaffold/tests/hoppscotch.spec.ts +1 -11
  400. package/templates/scaffold/tests/mail-verify.spec.ts +2 -2
  401. package/templates/skills/waygraph-blind-pilot.skill.md +2 -6
  402. package/templates/skills/waygraph-convention.skill.md +23 -14
  403. package/templates/skills/waygraph-pilot.skill.md +7 -4
  404. package/dist/auto-session/verbose-log.js +0 -16
  405. package/dist/auto-session.d.ts +0 -2
  406. package/dist/auto-session.js +0 -3
  407. package/dist/cli/discover.d.ts +0 -40
  408. package/dist/cli/discover.js +0 -148
  409. package/dist/commands/agent-dive.js +0 -52
  410. package/dist/commands/check.js +0 -192
  411. package/dist/commands/map.js +0 -29
  412. package/dist/commands/run.js +0 -104
  413. package/dist/commands/traverse.js +0 -177
  414. package/dist/core/block.d.ts +0 -109
  415. package/dist/core/blocks/effect.js +0 -23
  416. package/dist/core/config.js +0 -17
  417. package/dist/core/engine.d.ts +0 -198
  418. package/dist/core/flow.d.ts +0 -294
  419. package/dist/core/flow.js +0 -432
  420. package/dist/core.d.ts +0 -14
  421. package/dist/core.js +0 -15
  422. package/dist/highlights/merge.d.ts +0 -8
  423. package/dist/highlights/merge.js +0 -173
  424. package/dist/highlights/stub-ctx.d.ts +0 -10
  425. package/dist/highlights/stub-ctx.js +0 -331
  426. package/dist/highlights/types.d.ts +0 -613
  427. package/dist/highlights.d.ts +0 -9
  428. package/dist/highlights.js +0 -10
  429. package/dist/pilot-overlay.d.ts +0 -5
  430. package/dist/pilot-overlay.js +0 -6
  431. package/dist/runner/banner-log.js +0 -63
  432. package/dist/runner/chain-run.js +0 -102
  433. package/dist/runner/cursor.js +0 -140
  434. package/dist/runner/demo-log.js +0 -316
  435. package/dist/runner/device-stage.d.ts +0 -9
  436. package/dist/runner/device-stage.js +0 -420
  437. package/dist/runner/discovery.js +0 -105
  438. package/dist/runner/index.js +0 -2
  439. package/dist/runner/inpage/banner.d.ts +0 -21
  440. package/dist/runner/inpage/banner.js +0 -156
  441. package/dist/runner/inpage/caption.d.ts +0 -3
  442. package/dist/runner/inpage/caption.js +0 -23
  443. package/dist/runner/inpage/core.d.ts +0 -4
  444. package/dist/runner/inpage/core.js +0 -316
  445. package/dist/runner/inpage/device.d.ts +0 -3
  446. package/dist/runner/inpage/device.js +0 -211
  447. package/dist/runner/inpage/network.d.ts +0 -15
  448. package/dist/runner/inpage/network.js +0 -217
  449. package/dist/runner/inpage/panel-chrome.js +0 -192
  450. package/dist/runner/inpage/stamp.js +0 -46
  451. package/dist/runner/inpage/swipe-zoom.js +0 -220
  452. package/dist/runner/inpage/todos.js +0 -337
  453. package/dist/runner/interaction-patch.js +0 -384
  454. package/dist/runner/main.js +0 -469
  455. package/dist/runner/network-capture.d.ts +0 -9
  456. package/dist/runner/network-capture.js +0 -126
  457. package/dist/runner/overlay-css.d.ts +0 -3
  458. package/dist/runner/overlay-css.js +0 -377
  459. package/dist/runner/overlay-install.js +0 -90
  460. package/dist/runner/overlay-stage.js +0 -110
  461. package/dist/runner/rings.js +0 -514
  462. package/dist/runner/seed-mem.js +0 -110
  463. package/dist/runner/slides.js +0 -278
  464. package/dist/runner/step-mode.js +0 -703
  465. package/dist/runner/step-panels.js +0 -729
  466. package/dist/runner/teardown.js +0 -202
  467. package/dist/runner/todo-dock.js +0 -142
  468. package/dist/session/step-overlay.d.ts +0 -37
  469. package/dist/session/step-overlay.js +0 -244
  470. package/examples/routed-demo/playwright.config.ts +0 -21
  471. package/examples/saucedemo/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
  472. package/templates/quickstart/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
  473. /package/dist/{commands → cli/commands}/agent-dive-scaffold.d.ts +0 -0
  474. /package/dist/{commands → cli/commands}/agent-dive.d.ts +0 -0
  475. /package/dist/{commands → cli/commands}/extensions.d.ts +0 -0
  476. /package/dist/{commands → cli/commands}/init.d.ts +0 -0
  477. /package/dist/{commands → cli/commands}/list.d.ts +0 -0
  478. /package/dist/{commands → cli/commands}/map.d.ts +0 -0
  479. /package/dist/{commands → cli/commands}/session.d.ts +0 -0
  480. /package/dist/{commands → cli/commands}/test.d.ts +0 -0
  481. /package/dist/{commands → cli/commands}/traverse.d.ts +0 -0
  482. /package/dist/{commands → cli/commands}/try.d.ts +0 -0
  483. /package/dist/{commands → cli/commands}/upgrade.d.ts +0 -0
  484. /package/dist/{highlights → demo/narration}/shorthand.js +0 -0
  485. /package/dist/{session/overlay-beacon.d.ts → demo/overlay/beacon.d.ts} +0 -0
  486. /package/dist/{session/overlay-beacon.js → demo/overlay/beacon.js} +0 -0
  487. /package/dist/{pilot-overlay/action-ring.d.ts → demo/overlay/pilot/actions.d.ts} +0 -0
  488. /package/dist/{ui → demo/overlay/ui}/components/ring.d.ts +0 -0
  489. /package/dist/{ui → demo/overlay/ui}/stylesheet.d.ts +0 -0
  490. /package/dist/{ui → demo/overlay/ui}/stylesheet.js +0 -0
  491. /package/dist/{ui → demo/overlay/ui}/tokens.d.ts +0 -0
  492. /package/dist/{ui → demo/overlay/ui}/tokens.js +0 -0
  493. /package/dist/{highlights → demo}/types.js +0 -0
  494. /package/dist/{auto-session → demo}/verbose-log.d.ts +0 -0
  495. /package/dist/{selector.d.ts → engine/trait/selector.d.ts} +0 -0
  496. /package/dist/{selector.js → engine/trait/selector.js} +0 -0
  497. /package/dist/{trait.js → engine/trait/trait.js} +0 -0
  498. /package/dist/{traverse → live/traverse}/coverage.d.ts +0 -0
  499. /package/dist/{traverse → live/traverse}/coverage.js +0 -0
  500. /package/dist/{traverse → live/traverse}/lease.d.ts +0 -0
  501. /package/dist/{traverse → live/traverse}/lease.js +0 -0
  502. /package/dist/{session/block-inject.d.ts → manifest/roots.d.ts} +0 -0
  503. /package/dist/{blocks-select.d.ts → manifest/select.d.ts} +0 -0
  504. /package/dist/{blocks-select.js → manifest/select.js} +0 -0
  505. /package/dist/{browser.d.ts → runtime/browser.d.ts} +0 -0
  506. /package/dist/{env-file.d.ts → runtime/env-file.d.ts} +0 -0
  507. /package/dist/{playwright-config.js → runtime/playwright-config.js} +0 -0
  508. /package/dist/{playwright.config.d.ts → runtime/playwright.config.d.ts} +0 -0
  509. /package/dist/{video-dir.d.ts → runtime/video-dir.d.ts} +0 -0
  510. /package/dist/{webserver.d.ts → runtime/webserver.d.ts} +0 -0
@@ -1,48 +1,21 @@
1
- import { getMemStub } from "../mem-stub.js";
1
+ import { getMemStub } from "../../engine/mem/mem-stub.js";
2
2
  import { createInterface } from "node:readline/promises";
3
- import { ensureShadowRoot } from "../ui/shadow.js";
3
+ import { ensureShadowRoot } from "../../demo/overlay/ui/shadow.js";
4
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
- }
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). */
42
18
  export async function detectHere(page, navBlocks) {
43
- const fromUrl = await inferCheckpointFromUrl(page);
44
- if (fromUrl)
45
- return fromUrl;
46
19
  const tags = navBlocks.map((n) => n.block);
47
20
  return locate(page, tags, { timeoutMs: 1500 });
48
21
  }
@@ -51,8 +24,8 @@ export async function ensureLivePage(context, page, startUrl) {
51
24
  return page;
52
25
  const fresh = await context.newPage();
53
26
  if (startUrl) {
54
- await fresh.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(() => { });
55
- await fresh.waitForLoadState("load").catch(() => { });
27
+ await fresh.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(ignorePageGone);
28
+ await fresh.waitForLoadState("load").catch(ignoreTimeout);
56
29
  }
57
30
  return fresh;
58
31
  }
@@ -60,28 +33,16 @@ function missingMemKeys(entry, mem) {
60
33
  const requires = entry.block.requires ?? [];
61
34
  return requires.filter((k) => !mem.has(k));
62
35
  }
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;
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)?.();
76
39
  }
77
- function defaultMemJsonPrompt(keyName) {
78
- const def = defaultMemValueForKey(keyName);
79
- if (def !== undefined)
80
- return JSON.stringify(def);
81
- return "{}";
40
+ function defaultMemJsonPrompt(key) {
41
+ const def = memStubValue(key);
42
+ return def === undefined ? "{}" : JSON.stringify(def);
82
43
  }
83
44
  function seedMemFromEnv(mem, entry) {
84
- const raw = process.env.WAYGRAPH_DATA ?? process.env.WAYGRAPH_AUTO_MEM;
45
+ const raw = envString("WAYGRAPH_DATA") ?? envString("WAYGRAPH_AUTO_MEM");
85
46
  if (!raw)
86
47
  return false;
87
48
  try {
@@ -96,16 +57,16 @@ function seedMemFromEnv(mem, entry) {
96
57
  return false;
97
58
  }
98
59
  }
99
- /** 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. */
100
61
  export function seedDefaultMem(library, mem) {
101
- const raw = process.env.WAYGRAPH_DATA ?? process.env.WAYGRAPH_AUTO_MEM;
62
+ const raw = envString("WAYGRAPH_DATA") ?? envString("WAYGRAPH_AUTO_MEM");
102
63
  let envParsed = {};
103
64
  if (raw) {
104
65
  try {
105
66
  envParsed = JSON.parse(raw);
106
67
  }
107
- catch {
108
- /* ignore */
68
+ catch (err) {
69
+ throw new Error(`waygraph: --data / WAYGRAPH_DATA is not valid JSON: ${err instanceof Error ? err.message : String(err)}`);
109
70
  }
110
71
  }
111
72
  for (const entry of library.values()) {
@@ -116,12 +77,7 @@ export function seedDefaultMem(library, mem) {
116
77
  mem.set(k, envParsed[k.name]);
117
78
  continue;
118
79
  }
119
- const stub = getMemStub(k);
120
- if (stub) {
121
- mem.set(k, stub());
122
- continue;
123
- }
124
- const def = defaultMemValueForKey(k.name);
80
+ const def = memStubValue(k);
125
81
  if (def !== undefined)
126
82
  mem.set(k, def);
127
83
  }
@@ -131,7 +87,7 @@ async function promptMemCli(entry, mem) {
131
87
  const rl = createInterface({ input, output });
132
88
  try {
133
89
  for (const k of missingMemKeys(entry, mem)) {
134
- const def = defaultMemJsonPrompt(k.name);
90
+ const def = defaultMemJsonPrompt(k);
135
91
  const line = await rl.question(` ${k.name} JSON [${def}]: `);
136
92
  const json = line.trim() || def;
137
93
  mem.set(k, JSON.parse(json));
@@ -159,11 +115,7 @@ async function setAutoPanelRunning(page, label) {
159
115
  const panel = __wgById("wg-auto-panel");
160
116
  if (!panel)
161
117
  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;
118
+ __wgSet(panel, __wgEl("h3", null, "waygraph auto"), __wgEl("div", { style: "padding:12px 0;color:#c9a6ff" }, "Running: ", __wgEl("strong", null, label)));
167
119
  if (typeof window.__wgWirePanelChrome === "function") {
168
120
  window.__wgWirePanelChrome(panel, "wg-auto-panel-hidden", "waygraph auto");
169
121
  }
@@ -181,7 +133,7 @@ async function setAutoPanelRunning(page, label) {
181
133
  panel.setAttribute("data-wg-ready", "1");
182
134
  }
183
135
  }, label)
184
- .catch(() => { });
136
+ .catch(ignorePageGone);
185
137
  }
186
138
  export async function runOneBlock(engine, entry, context, page, mem, headful) {
187
139
  const navClick = entry.block.__waygraphNavClick;
@@ -190,11 +142,11 @@ export async function runOneBlock(engine, entry, context, page, mem, headful) {
190
142
  .evaluate((label) => {
191
143
  window.__wgPendingNavClickLabel = label;
192
144
  }, `nav: ${entry.block.name}`)
193
- .catch(() => { });
145
+ .catch(ignorePageGone);
194
146
  }
195
147
  if (headful)
196
148
  await setAutoPanelRunning(page, entry.block.name);
197
- const flow = engine.defineFlow([start, entry.block, end]);
149
+ const flow = buildFlow([entry.block], engine.config);
198
150
  const BLOCK_TIMEOUT_MS = 45_000;
199
151
  let timer;
200
152
  let result;
@@ -212,7 +164,7 @@ export async function runOneBlock(engine, entry, context, page, mem, headful) {
212
164
  if (timer)
213
165
  clearTimeout(timer);
214
166
  }
215
- await page.evaluate("delete window.__wgPendingNavClickLabel").catch(() => { });
167
+ await page.evaluate("delete window.__wgPendingNavClickLabel").catch(ignorePageGone);
216
168
  return result;
217
169
  }
218
170
  const PANEL_CSS = "#wg-auto-panel{position:fixed;z-index:2147483647;left:50%;bottom:12px;transform:translateX(-50%);" +
@@ -248,9 +200,6 @@ const PANEL_CSS = "#wg-auto-panel{position:fixed;z-index:2147483647;left:50%;bot
248
200
  "#wg-auto-panel.wg-collapsed{left:50%;right:auto;transform:translateX(-50%);width:auto;}" +
249
201
  "#wg-auto-panel button.wg-act{padding:12px;font-size:14px;}" +
250
202
  "}";
251
- function esc(s) {
252
- return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/"/g, "&quot;");
253
- }
254
203
  /** Shown in the headful panel after each Block run. */
255
204
  let lastRunNote = null;
256
205
  /**
@@ -312,36 +261,22 @@ async function headfulPick(page, menu, library, mem, waitPick) {
312
261
  const here = menu.here;
313
262
  const hereLabel = here ?? (menu.flat.length > 0 ? "Unknown - pick Start here" : "Unknown - no moves available");
314
263
  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 */
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);
338
273
  }
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
274
  }
344
- }
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
+ });
345
280
  // Pre-resolve every candidate's hover-preview box THROUGH Playwright's own locator (>>
346
281
  // piercing / :has-text() / :visible support), once, here on the Node side - not a raw selector
347
282
  // string handed to the page for a per-mouseenter document.querySelector to fail silently on
@@ -373,152 +308,126 @@ async function headfulPick(page, menu, library, mem, waitPick) {
373
308
  : null;
374
309
  hlBoxes.set(sel, box);
375
310
  }));
376
- html += `<div class="wg-actions">`;
377
311
  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) {
312
+ const sections = menu.sections.map((section) => ({
313
+ title: section.title,
314
+ buttons: section.edges.map((c) => {
384
315
  const entry = library.get(c.block);
385
316
  const navClick = entry?.block?.__waygraphNavClick;
386
317
  const hl = c.instanceOption?.highlight ?? (typeof navClick === "string" ? navClick : undefined);
387
318
  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>`;
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);
391
354
  }
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>`;
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
+ });
397
383
  }
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
384
  };
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
- });
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 });
454
388
  }
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?.();
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?.());
517
428
  });
518
- });
519
- const quit = root.querySelector("[data-quit]");
520
- if (quit) quit.addEventListener("click", () => window.__wgAutoQuit?.());
521
- })(${JSON.stringify(html)})`);
429
+ root.querySelector("[data-quit]")?.addEventListener("click", () => window.__wgAutoQuit?.());
430
+ }, { css: PANEL_CSS, note: lastRunNote, hereLabel, memFields, sections });
522
431
  return waitPick();
523
432
  }
524
433
  function printCliMenu(menu, library) {
@@ -573,7 +482,7 @@ export async function runAutoExplore(projectDir, options = {}) {
573
482
  async function runAutoExploreCore(projectDir, options = {}) {
574
483
  lastRunNote = null;
575
484
  const cli = options.cli === true;
576
- const baseURL = options.baseURL ?? (await resolveBaseUrl(projectDir)) ?? process.env.WAYGRAPH_BASE_URL;
485
+ const baseURL = options.baseURL ?? (await resolveBaseUrl(projectDir)) ?? envString("WAYGRAPH_BASE_URL");
577
486
  const startUrl = options.startUrl ?? baseURL;
578
487
  const { graph, library } = await buildExploreContext(projectDir, options.blocksSelect ? { blocksSelect: options.blocksSelect } : undefined);
579
488
  if (options.blocksSelect) {
@@ -606,8 +515,8 @@ async function runAutoExploreCore(projectDir, options = {}) {
606
515
  });
607
516
  let page = await context.newPage();
608
517
  if (startUrl) {
609
- await page.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(() => { });
610
- await page.waitForLoadState("load").catch(() => { });
518
+ await page.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(ignorePageGone);
519
+ await page.waitForLoadState("load").catch(ignoreTimeout);
611
520
  }
612
521
  console.error(`waygraph auto: ${graph.nodes.length} checkpoint(s), ${graph.edges.length} edge(s) - ` +
613
522
  (cli ? "CLI picker (terminal menu)" : "headful picker (browser panel)"));
@@ -624,7 +533,8 @@ async function runAutoExploreCore(projectDir, options = {}) {
624
533
  });
625
534
  if (!cli) {
626
535
  await installDemoChrome(target, "", { banner: false });
627
- instrumentInteractionHighlighting(target, mem, 250);
536
+ keepOverlayOnNavigation(target, () => installDemoChrome(target, "", { banner: false }));
537
+ instrumentAutoInteractions(target, mem, 250);
628
538
  }
629
539
  wiredPage = target;
630
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
  */