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
@@ -12,19 +12,16 @@ Runtime is always a `Block`. Helpers are TypeScript salt + clear intent.
12
12
  | `defineAssertBlock` | Self-loop assertion, no state change - `verify` only | `*.method.block.ts` under `methods/` |
13
13
  | `defineEffectBlock` | Instance mutate + auto menu rows | `*.effect.block.ts` under `methods/` |
14
14
  | `defineBlock` | Escape hatch: tests, unsure, probes | any |
15
- | `defineActionBlock` | **Deprecated** alias of `defineMethodBlock` | - |
16
15
 
17
- `defineNavBlock({ click })` still works (compat) - prefer `defineNavClickBlock` in app code.
16
+ `defineNavBlock({ click })` and `defineNavClickBlock` build the same Block; app code reads better with `defineNavClickBlock`.
18
17
 
19
18
  **One distinct action per Block.** A Method that fills fields *and* submits is wrong even if
20
19
  it "works" - split it (`fill-username` + `fill-password` + `submit-login`, not one Block).
21
20
  `defineAssertBlock({ name, checkpoint, verify, waitForHeading?, requires? })` is the
22
21
  self-loop-only shape for "assert something on the current page, no state change" - no
23
22
  hand-written `act`/`resolve` to accidentally make do two things. `waygraph check` warns when
24
- a `verify` array inlines a literal selector string instead of a `*Sel` reference. Give it an
25
- explicit type argument (`defineAssertBlock<LoggedIn>({...})`) whenever it is not the last
26
- Block before `end` - otherwise `Out` defaults to wildcard `Checkpoint<string>`, which breaks
27
- `defineFlow`'s tuple typing mid-chain.
23
+ a `verify` array inlines a literal selector string instead of a `*Sel` reference. Its `checkpoint` is a Checkpoint
24
+ value, which types it on both sides, so it sits anywhere in a `map()` chain.
28
25
 
29
26
  ---
30
27
 
@@ -41,7 +38,7 @@ export const InventorySel = {
41
38
 
42
39
  export const InventoryPageBlock = definePageBlock({
43
40
  name: "page-inventory",
44
- checkpoint: "LoggedIn",
41
+ checkpoint: LoggedIn,
45
42
  verify: [Trait.url({ pathname: "/inventory.html" }), Trait.visible(InventorySel.list)],
46
43
  methods: {
47
44
  addToCart: () => AddToCartBlock,
@@ -84,8 +81,10 @@ Checkpoint = place on the map. `branch()` = which road to take from that place.
84
81
  Conditional Out (no `branch()` needed for auto/graph):
85
82
 
86
83
  ```ts
87
- defineMethodBlock<LoginPage, LoggedIn | LoginPage>({
84
+ defineMethodBlock({
88
85
  name: "submit-login",
86
+ from: LoginPage,
87
+ to: [LoggedIn, LoginPage],
89
88
  instruction: {
90
89
  async act(page) { /* click only - fields were filled by earlier Blocks */ },
91
90
  async observe(page) {
@@ -123,8 +122,9 @@ then run the Block (act reads mem as usual).
123
122
  ### Effect - spawn Method-like rows (Add / Remove)
124
123
 
125
124
  ```ts
126
- defineEffectBlock<Checkpoint<string>, ItemInCart>({
125
+ defineEffectBlock({
127
126
  name: "add-to-cart",
127
+ to: ItemInCart, // no `from`: runs from anywhere
128
128
  requires: [SelectedItem.key],
129
129
  instruction: {
130
130
  async act(page, _in, mem) {
@@ -151,9 +151,9 @@ Auto shows: `Add "Sauce Labs Backpack" to cart`, `Add "Bike Light"…`, …
151
151
  ### MemNav - spawn Nav rows (Open details)
152
152
 
153
153
  ```ts
154
- defineMemNavBlock<ItemDetailPage>({
154
+ defineMemNavBlock({
155
155
  name: "nav-item-detail",
156
- checkpoint: "ItemDetailPage",
156
+ checkpoint: ItemDetailPage,
157
157
  requires: [SelectedItem.key],
158
158
  click: (mem) => InventorySel.title(mem.get(SelectedItem.key).id),
159
159
  verify: [Trait.url({ pathname: "/inventory-item.html" })],
@@ -9,7 +9,6 @@ src/blocks/
9
9
  saucedemo-web/ # URL /
10
10
  NAV.md
11
11
  nav-login.block.ts # Page definePageBlock url:/
12
- ff-owner-auth.block.ts # FFCompose (nav-login + fill-username + fill-password + submit-login)
13
12
  methods/
14
13
  fill-username.method.block.ts # Method defineMethodBlock (self-loop on LoginPage)
15
14
  fill-password.method.block.ts # Method defineMethodBlock (self-loop on LoginPage)
@@ -27,11 +27,7 @@ Fill and submit are three separate Blocks (not one that fills both fields and
27
27
  clicks Login) so the graph/demo show each as its own step - no Block does
28
28
  more than one distinct action.
29
29
 
30
- ## Other
31
-
32
- | File | Kind | Notes |
33
- |------|------|-------|
34
- | `ff-owner-auth.block.ts` | FFCompose | Collapses nav-login + fill-username + fill-password + submit-login into one opaque demo/run step (`--ff-expand` shows all 4 again) |
30
+ A flow that wants to skip watching auth marks those steps `{ ff: true }` (see `src/flows/checkout.flow.ts`).
35
31
 
36
32
  ## Related mem keys / checkpoints
37
33
 
@@ -1,5 +1,5 @@
1
1
  import { defineNavClickBlock, Trait } from "waygraph";
2
- import type { CartPage } from "../../../states/checkout.states.js";
2
+ import { CartPage } from "../../../states/checkout.states.js";
3
3
  import { CartSel } from "./cart.sel.js";
4
4
 
5
5
  /**
@@ -9,10 +9,10 @@ import { CartSel } from "./cart.sel.js";
9
9
  *
10
10
  * click, not url - header cart link from inventory-adjacent pages.
11
11
  */
12
- export const NavCartBlock = defineNavClickBlock<CartPage>({
12
+ export const NavCartBlock = defineNavClickBlock({
13
13
  name: "nav-cart",
14
14
  description: "Clicks the cart link in the header.",
15
- checkpoint: "CartPage",
15
+ checkpoint: CartPage,
16
16
  click: CartSel.cartLink,
17
17
  verify: [Trait.url({ pathname: "/cart.html" })],
18
18
  });
@@ -1,5 +1,5 @@
1
1
  import { defineNavClickBlock, Trait } from "waygraph";
2
- import type { CheckoutInfoPage } from "../../../states/checkout.states.js";
2
+ import { CheckoutInfoPage } from "../../../states/checkout.states.js";
3
3
  import { CartSel } from "./cart.sel.js";
4
4
 
5
5
  /**
@@ -9,10 +9,10 @@ import { CartSel } from "./cart.sel.js";
9
9
  *
10
10
  * Cart page "Checkout" button - owns the nav into step one.
11
11
  */
12
- export const NavCheckoutInfoBlock = defineNavClickBlock<CheckoutInfoPage>({
12
+ export const NavCheckoutInfoBlock = defineNavClickBlock({
13
13
  name: "nav-checkout-info",
14
14
  description: "Clicks 'Checkout' on the cart page.",
15
- checkpoint: "CheckoutInfoPage",
15
+ checkpoint: CheckoutInfoPage,
16
16
  click: CartSel.checkoutBtn,
17
17
  verify: [Trait.url({ pathname: "/checkout-step-one.html" })],
18
18
  });
@@ -1,5 +1,5 @@
1
- import { defineMethodBlock, checkpoint } from "waygraph";
2
- import type { CheckoutInfoPage } from "../../../../states/checkout.states.js";
1
+ import { defineMethodBlock } from "waygraph";
2
+ import { CheckoutInfoPage } from "../../../../states/checkout.states.js";
3
3
  import { CheckoutInfoSel } from "./checkout-info.sel.js";
4
4
 
5
5
  /**
@@ -10,13 +10,14 @@ import { CheckoutInfoSel } from "./checkout-info.sel.js";
10
10
  * Fills the first name field only - self-loop on CheckoutInfoPage. Continue
11
11
  * is its own Block (submit-checkout-info.method.block.ts).
12
12
  */
13
- export const FillFirstNameBlock = defineMethodBlock<CheckoutInfoPage, CheckoutInfoPage>({
13
+ export const FillFirstNameBlock = defineMethodBlock({
14
14
  name: "fill-first-name",
15
15
  description: "Fills the first name field on the shipping info form.",
16
+ from: CheckoutInfoPage,
17
+ to: CheckoutInfoPage,
16
18
  instruction: {
17
19
  async act(page) {
18
20
  await page.locator(CheckoutInfoSel.firstName).fill("Ada");
19
21
  },
20
- resolve: () => checkpoint("CheckoutInfoPage"),
21
22
  },
22
23
  });
@@ -1,5 +1,5 @@
1
- import { defineMethodBlock, checkpoint } from "waygraph";
2
- import type { CheckoutInfoPage } from "../../../../states/checkout.states.js";
1
+ import { defineMethodBlock } from "waygraph";
2
+ import { CheckoutInfoPage } from "../../../../states/checkout.states.js";
3
3
  import { CheckoutInfoSel } from "./checkout-info.sel.js";
4
4
 
5
5
  /**
@@ -9,13 +9,14 @@ import { CheckoutInfoSel } from "./checkout-info.sel.js";
9
9
  *
10
10
  * Fills the last name field only - self-loop on CheckoutInfoPage.
11
11
  */
12
- export const FillLastNameBlock = defineMethodBlock<CheckoutInfoPage, CheckoutInfoPage>({
12
+ export const FillLastNameBlock = defineMethodBlock({
13
13
  name: "fill-last-name",
14
14
  description: "Fills the last name field on the shipping info form.",
15
+ from: CheckoutInfoPage,
16
+ to: CheckoutInfoPage,
15
17
  instruction: {
16
18
  async act(page) {
17
19
  await page.locator(CheckoutInfoSel.lastName).fill("Lovelace");
18
20
  },
19
- resolve: () => checkpoint("CheckoutInfoPage"),
20
21
  },
21
22
  });
@@ -1,5 +1,5 @@
1
- import { defineMethodBlock, checkpoint } from "waygraph";
2
- import type { CheckoutInfoPage } from "../../../../states/checkout.states.js";
1
+ import { defineMethodBlock } from "waygraph";
2
+ import { CheckoutInfoPage } from "../../../../states/checkout.states.js";
3
3
  import { CheckoutInfoSel } from "./checkout-info.sel.js";
4
4
 
5
5
  /**
@@ -9,13 +9,14 @@ import { CheckoutInfoSel } from "./checkout-info.sel.js";
9
9
  *
10
10
  * Fills the postal code field only - self-loop on CheckoutInfoPage.
11
11
  */
12
- export const FillPostalCodeBlock = defineMethodBlock<CheckoutInfoPage, CheckoutInfoPage>({
12
+ export const FillPostalCodeBlock = defineMethodBlock({
13
13
  name: "fill-postal-code",
14
14
  description: "Fills the postal code field on the shipping info form.",
15
+ from: CheckoutInfoPage,
16
+ to: CheckoutInfoPage,
15
17
  instruction: {
16
18
  async act(page) {
17
19
  await page.locator(CheckoutInfoSel.postalCode).fill("1000");
18
20
  },
19
- resolve: () => checkpoint("CheckoutInfoPage"),
20
21
  },
21
22
  });
@@ -1,5 +1,5 @@
1
- import { defineMethodBlock, checkpoint, Trait } from "waygraph";
2
- import type { CheckoutInfoPage, CheckoutOverviewPage } from "../../../../states/checkout.states.js";
1
+ import { defineMethodBlock, Trait } from "waygraph";
2
+ import { CheckoutInfoPage, CheckoutOverviewPage } from "../../../../states/checkout.states.js";
3
3
  import { CheckoutInfoSel } from "./checkout-info.sel.js";
4
4
 
5
5
  /**
@@ -11,14 +11,15 @@ import { CheckoutInfoSel } from "./checkout-info.sel.js";
11
11
  * fill-last-name / fill-postal-code (each its own Block). One Block, one
12
12
  * action: submit.
13
13
  */
14
- export const SubmitCheckoutInfoBlock = defineMethodBlock<CheckoutInfoPage, CheckoutOverviewPage>({
14
+ export const SubmitCheckoutInfoBlock = defineMethodBlock({
15
15
  name: "submit-checkout-info",
16
16
  description: "Continues from the shipping info form to the order overview.",
17
+ from: CheckoutInfoPage,
18
+ to: CheckoutOverviewPage,
17
19
  instruction: {
18
20
  async act(page) {
19
21
  await page.locator(CheckoutInfoSel.continueBtn).click();
20
22
  },
21
- resolve: () => checkpoint("CheckoutOverviewPage"),
22
23
  verify: [Trait.url({ pathname: "/checkout-step-two.html" })],
23
24
  },
24
25
  });
@@ -1,5 +1,5 @@
1
- import { defineMethodBlock, checkpoint, Trait, narrate } from "waygraph";
2
- import type {
1
+ import { defineMethodBlock, Trait, narrate } from "waygraph";
2
+ import {
3
3
  CheckoutOverviewPage,
4
4
  OrderComplete,
5
5
  } from "../../../../states/checkout.states.js";
@@ -11,15 +11,13 @@ import { CheckoutOverviewSel } from "./checkout-overview.sel.js";
11
11
  * Route: saucedemo-web/checkout-step-two/methods/ (= /checkout-step-two.html)
12
12
  *
13
13
  * Places the order on the overview page - form/finish click, not a NavBlock.
14
- * Stubs use open ctx lifecycles (preferred) - not static slot maps.
15
14
  */
16
- export const FinishOrderBlock = defineMethodBlock<
17
- CheckoutOverviewPage,
18
- OrderComplete
19
- >({
15
+ export const FinishOrderBlock = defineMethodBlock({
20
16
  name: "finish-order",
21
17
  description:
22
18
  "Places the order and confirms the 'Thank you for your order!' completion page.",
19
+ from: CheckoutOverviewPage,
20
+ to: OrderComplete,
23
21
  instruction: {
24
22
  async act(page) {
25
23
  const finishButton = page.locator(CheckoutOverviewSel.finishBtn);
@@ -27,7 +25,6 @@ export const FinishOrderBlock = defineMethodBlock<
27
25
  finishButton.click(),
28
26
  );
29
27
  },
30
- resolve: () => checkpoint("OrderComplete"),
31
28
  verify: [
32
29
  Trait.text(
33
30
  CheckoutOverviewSel.completeHeader,
@@ -1,5 +1,5 @@
1
1
  import { definePageBlock, Trait } from "waygraph";
2
- import type { LoggedIn } from "../../../states/checkout.states.js";
2
+ import { LoggedIn } from "../../../states/checkout.states.js";
3
3
  import { AddToCartBlock } from "./methods/add-to-cart.effect.block.js";
4
4
  import { RemoveFromCartBlock } from "./methods/remove-from-cart.effect.block.js";
5
5
  import { AddAllToCartBlock } from "./methods/add-all-to-cart.method.block.js";
@@ -18,11 +18,11 @@ import { InventorySel } from "./methods/inventory-items.js";
18
18
  * to LoggedIn. Cart Effects/Methods use In Checkpoint<string> (from: "*") so
19
19
  * auto still offers them after leave/return - menu follows live DOM buttons.
20
20
  */
21
- export const InventoryPageBlock = definePageBlock<LoggedIn>({
21
+ export const InventoryPageBlock = definePageBlock({
22
22
  name: "page-inventory",
23
23
  description:
24
24
  "Inventory catalog hub - per-item and bulk add/remove, open item detail.",
25
- checkpoint: "LoggedIn",
25
+ checkpoint: LoggedIn,
26
26
  verify: [
27
27
  Trait.url({ pathname: "/inventory.html" }),
28
28
  Trait.visible(InventorySel.list),
@@ -1,5 +1,5 @@
1
- import { defineMethodBlock, checkpoint, type Checkpoint } from "waygraph";
2
- import type { RemoveFromCartOutcome } from "../../../../states/checkout.states.js";
1
+ import { defineMethodBlock, checkpoint } from "waygraph";
2
+ import { RemoveFromCartOutcome } from "../../../../states/checkout.states.js";
3
3
  import { collectAddableItems, InventorySel } from "./inventory-items.js";
4
4
 
5
5
  type BulkObserve = "added" | "nothing";
@@ -14,12 +14,10 @@ type BulkObserve = "added" | "nothing";
14
14
  * leave inventory and return, collectors re-read Add buttons from the DOM.
15
15
  * Out: ItemInCart if the cart has items after; LoggedIn if still empty.
16
16
  */
17
- export const AddAllToCartBlock = defineMethodBlock<
18
- Checkpoint<string>,
19
- RemoveFromCartOutcome
20
- >({
17
+ export const AddAllToCartBlock = defineMethodBlock({
21
18
  name: "add-all-to-cart",
22
19
  description: "Adds every product still showing Add to cart on this page.",
20
+ to: RemoveFromCartOutcome,
23
21
  instruction: {
24
22
  async act(page) {
25
23
  const items = await collectAddableItems(page);
@@ -1,14 +1,8 @@
1
- import {
2
- defineEffectBlock,
3
- checkpoint,
4
- type Checkpoint,
5
- type WaygraphInstanceOption,
6
- } from "waygraph";
7
- import type { ItemInCart } from "../../../../states/checkout.states.js";
1
+ import { defineEffectBlock, type WaygraphInstanceOption } from "waygraph";
2
+ import { ItemInCart } from "../../../../states/checkout.states.js";
8
3
  import { SelectedItem } from "../../../../states/checkout.mem-keys.js";
9
4
  import { collectAddableItems, InventorySel } from "./inventory-items.js";
10
5
 
11
-
12
6
  /**
13
7
  * Kind: Effect
14
8
  * Helper: defineEffectBlock
@@ -17,40 +11,38 @@ import { collectAddableItems, InventorySel } from "./inventory-items.js";
17
11
  * Mutates cart for the mem-picked product. waygraph auto lists one
18
12
  * "Add ..." row per live Add button via instanceOptions.
19
13
  */
20
- export const AddToCartBlock = defineEffectBlock<Checkpoint<string>, ItemInCart>(
21
- {
22
- name: "add-to-cart",
23
- description:
24
- "Adds the item named by mem (saucedemo.selectedItem) to the cart.",
25
- requires: [SelectedItem.key],
26
- instruction: {
27
- async act(page, _input, mem) {
28
- const { id } = mem.get(SelectedItem.key);
29
- await page.locator(InventorySel.addBtn(id)).click();
30
- },
31
- resolve: () => checkpoint("ItemInCart"),
32
- verify: [
33
- {
34
- name: "item-added-to-cart",
35
- async check(page, mem) {
36
- const { id } = mem.get(SelectedItem.key);
37
- return await page
38
- .locator(InventorySel.removeBtn(id))
39
- .first()
40
- .isVisible();
41
- },
42
- },
43
- ],
44
- },
45
- async instanceOptions(page): Promise<readonly WaygraphInstanceOption[]> {
46
- const items = await collectAddableItems(page);
47
- return items.map((item) => ({
48
- id: item.id,
49
- label: `Add "${item.name}" to cart`,
50
- key: SelectedItem.key,
51
- value: item,
52
- highlight: InventorySel.addBtn(item.id),
53
- }));
14
+ export const AddToCartBlock = defineEffectBlock({
15
+ name: "add-to-cart",
16
+ description:
17
+ "Adds the item named by mem (saucedemo.selectedItem) to the cart.",
18
+ to: ItemInCart,
19
+ requires: [SelectedItem.key],
20
+ instruction: {
21
+ async act(page, _input, mem) {
22
+ const { id } = mem.get(SelectedItem.key);
23
+ await page.locator(InventorySel.addBtn(id)).click();
54
24
  },
25
+ verify: [
26
+ {
27
+ name: "item-added-to-cart",
28
+ async check(page, mem) {
29
+ const { id } = mem.get(SelectedItem.key);
30
+ return await page
31
+ .locator(InventorySel.removeBtn(id))
32
+ .first()
33
+ .isVisible();
34
+ },
35
+ },
36
+ ],
37
+ },
38
+ async instanceOptions(page): Promise<readonly WaygraphInstanceOption[]> {
39
+ const items = await collectAddableItems(page);
40
+ return items.map((item) => ({
41
+ id: item.id,
42
+ label: `Add "${item.name}" to cart`,
43
+ key: SelectedItem.key,
44
+ value: item,
45
+ highlight: InventorySel.addBtn(item.id),
46
+ }));
55
47
  },
56
- );
48
+ });
@@ -1,5 +1,5 @@
1
- import { defineMethodBlock, checkpoint, type Checkpoint } from "waygraph";
2
- import type { RemoveFromCartOutcome } from "../../../../states/checkout.states.js";
1
+ import { defineMethodBlock, checkpoint } from "waygraph";
2
+ import { RemoveFromCartOutcome } from "../../../../states/checkout.states.js";
3
3
  import { collectRemovableItems, InventorySel } from "./inventory-items.js";
4
4
 
5
5
  type BulkObserve = "still-has-items" | "cart-empty";
@@ -14,12 +14,10 @@ type BulkObserve = "still-has-items" | "cart-empty";
14
14
  * single-item remove. Out: LoggedIn when cart empty; ItemInCart if anything
15
15
  * remains (partial failure / race).
16
16
  */
17
- export const RemoveAllFromCartBlock = defineMethodBlock<
18
- Checkpoint<string>,
19
- RemoveFromCartOutcome
20
- >({
17
+ export const RemoveAllFromCartBlock = defineMethodBlock({
21
18
  name: "remove-all-from-cart",
22
19
  description: "Removes every product still showing Remove on this page.",
20
+ to: RemoveFromCartOutcome,
23
21
  instruction: {
24
22
  async act(page) {
25
23
  const items = await collectRemovableItems(page);
@@ -1,5 +1,5 @@
1
- import { defineEffectBlock, checkpoint, type Checkpoint, type WaygraphInstanceOption } from "waygraph";
2
- import type { RemoveFromCartOutcome } from "../../../../states/checkout.states.js";
1
+ import { defineEffectBlock, checkpoint, type WaygraphInstanceOption } from "waygraph";
2
+ import { RemoveFromCartOutcome } from "../../../../states/checkout.states.js";
3
3
  import { SelectedItem } from "../../../../states/checkout.mem-keys.js";
4
4
  import { collectRemovableItems, InventorySel } from "./inventory-items.js";
5
5
 
@@ -13,9 +13,10 @@ type RemoveObserve = "still-has-items" | "cart-empty";
13
13
  * Removes the mem-picked product. After Add, waygraph auto shows matching
14
14
  * "Remove ..." rows from live Remove buttons.
15
15
  */
16
- export const RemoveFromCartBlock = defineEffectBlock<Checkpoint<string>, RemoveFromCartOutcome>({
16
+ export const RemoveFromCartBlock = defineEffectBlock({
17
17
  name: "remove-from-cart",
18
18
  description: "Removes the item named by mem (saucedemo.selectedItem) from the cart.",
19
+ to: RemoveFromCartOutcome,
19
20
  requires: [SelectedItem.key],
20
21
  instruction: {
21
22
  async act(page, _input, mem) {
@@ -1,5 +1,5 @@
1
1
  import { defineMemNavBlock, Trait, type WaygraphInstanceOption } from "waygraph";
2
- import type { ItemDetailPage } from "../../../states/checkout.states.js";
2
+ import { ItemDetailPage } from "../../../states/checkout.states.js";
3
3
  import { SelectedItem } from "../../../states/checkout.mem-keys.js";
4
4
  import {
5
5
  collectInventoryItems,
@@ -14,10 +14,10 @@ import {
14
14
  * Opens the mem-picked product detail page. waygraph auto lists one
15
15
  * "Open ... details" row per inventory card via instanceOptions.
16
16
  */
17
- export const NavItemDetailBlock = defineMemNavBlock<ItemDetailPage>({
17
+ export const NavItemDetailBlock = defineMemNavBlock({
18
18
  name: "nav-item-detail",
19
19
  description: "Opens the product named by mem (saucedemo.selectedItem) on its detail page.",
20
- checkpoint: "ItemDetailPage",
20
+ checkpoint: ItemDetailPage,
21
21
  requires: [SelectedItem.key],
22
22
  click: (mem) => InventorySel.title(mem.get(SelectedItem.key).id),
23
23
  verify: [Trait.url({ pathname: "/inventory-item.html" })],
@@ -1,5 +1,5 @@
1
1
  import { defineNavClickBlock, Trait } from "waygraph";
2
- import type { LoggedIn } from "../../../states/checkout.states.js";
2
+ import { LoggedIn } from "../../../states/checkout.states.js";
3
3
  import { ItemDetailSel } from "./item-detail.sel.js";
4
4
 
5
5
  /**
@@ -10,10 +10,10 @@ import { ItemDetailSel } from "./item-detail.sel.js";
10
10
  * click, not url - detail page "Back to products". Separate Block from
11
11
  * nav-back-to-products (different From Checkpoint; atomic convention).
12
12
  */
13
- export const NavBackToInventoryBlock = defineNavClickBlock<LoggedIn>({
13
+ export const NavBackToInventoryBlock = defineNavClickBlock({
14
14
  name: "nav-back-to-inventory",
15
15
  description: "Clicks 'Back to products' on the item detail page.",
16
- checkpoint: "LoggedIn",
16
+ checkpoint: LoggedIn,
17
17
  click: ItemDetailSel.backToProductsBtn,
18
18
  verify: [Trait.url({ pathname: "/inventory.html" })],
19
19
  });
@@ -1,5 +1,5 @@
1
1
  import { defineNavClickBlock, Trait } from "waygraph";
2
- import type { LoggedIn } from "../../../states/checkout.states.js";
2
+ import { LoggedIn } from "../../../states/checkout.states.js";
3
3
  import { ItemDetailSel } from "./item-detail.sel.js";
4
4
 
5
5
  /**
@@ -10,10 +10,10 @@ import { ItemDetailSel } from "./item-detail.sel.js";
10
10
  * click, not url - order-complete "Back Home" proves the button path
11
11
  * (a url NavBlock would teleport without exercising the control).
12
12
  */
13
- export const NavBackToProductsBlock = defineNavClickBlock<LoggedIn>({
13
+ export const NavBackToProductsBlock = defineNavClickBlock({
14
14
  name: "nav-back-to-products",
15
15
  description: "Clicks 'Back Home' on the order confirmation page.",
16
- checkpoint: "LoggedIn",
16
+ checkpoint: LoggedIn,
17
17
  click: ItemDetailSel.backToProductsBtn,
18
18
  verify: [Trait.url({ pathname: "/inventory.html" })],
19
19
  });
@@ -1,5 +1,5 @@
1
1
  import { defineNavClickBlock, Trait } from "waygraph";
2
- import type { LoggedIn } from "../../../states/checkout.states.js";
2
+ import { LoggedIn } from "../../../states/checkout.states.js";
3
3
  import { ItemDetailSel } from "./item-detail.sel.js";
4
4
 
5
5
  /**
@@ -9,10 +9,10 @@ import { ItemDetailSel } from "./item-detail.sel.js";
9
9
  *
10
10
  * click, not url - cart page "Continue Shopping" proves the app's own path.
11
11
  */
12
- export const NavContinueShoppingBlock = defineNavClickBlock<LoggedIn>({
12
+ export const NavContinueShoppingBlock = defineNavClickBlock({
13
13
  name: "nav-continue-shopping",
14
14
  description: "Clicks 'Continue Shopping' on the cart page.",
15
- checkpoint: "LoggedIn",
15
+ checkpoint: LoggedIn,
16
16
  click: ItemDetailSel.continueShoppingBtn,
17
17
  verify: [Trait.url({ pathname: "/inventory.html" })],
18
18
  });
@@ -1,5 +1,5 @@
1
- import { defineMethodBlock, checkpoint } from "waygraph";
2
- import type { LoginPage } from "../../../states/checkout.states.js";
1
+ import { defineMethodBlock } from "waygraph";
2
+ import { LoginPage } from "../../../states/checkout.states.js";
3
3
  import { LoginCreds } from "../../../states/checkout.mem-keys.js";
4
4
  import { LoginSel } from "./login.sel.js";
5
5
 
@@ -11,15 +11,16 @@ import { LoginSel } from "./login.sel.js";
11
11
  * Fills the password field only - self-loop on LoginPage. See
12
12
  * fill-username.method.block.ts for why this is split from submit.
13
13
  */
14
- export const FillPasswordBlock = defineMethodBlock<LoginPage, LoginPage>({
14
+ export const FillPasswordBlock = defineMethodBlock({
15
15
  name: "fill-password",
16
16
  description: "Fills the password field on the login form.",
17
+ from: LoginPage,
18
+ to: LoginPage,
17
19
  requires: [LoginCreds.key],
18
20
  instruction: {
19
21
  async act(page, _input, mem) {
20
22
  const { password } = mem.get(LoginCreds.key);
21
23
  await page.locator(LoginSel.password).fill(password);
22
24
  },
23
- resolve: () => checkpoint("LoginPage"),
24
25
  },
25
26
  });
@@ -1,5 +1,5 @@
1
- import { defineMethodBlock, checkpoint } from "waygraph";
2
- import type { LoginPage } from "../../../states/checkout.states.js";
1
+ import { defineMethodBlock } from "waygraph";
2
+ import { LoginPage } from "../../../states/checkout.states.js";
3
3
  import { LoginCreds } from "../../../states/checkout.mem-keys.js";
4
4
  import { LoginSel } from "./login.sel.js";
5
5
 
@@ -13,15 +13,16 @@ import { LoginSel } from "./login.sel.js";
13
13
  * graph/demo show fill vs submit as real, distinct steps instead of one
14
14
  * Block doing "input username and password and login at the same time".
15
15
  */
16
- export const FillUsernameBlock = defineMethodBlock<LoginPage, LoginPage>({
16
+ export const FillUsernameBlock = defineMethodBlock({
17
17
  name: "fill-username",
18
18
  description: "Fills the username field on the login form.",
19
+ from: LoginPage,
20
+ to: LoginPage,
19
21
  requires: [LoginCreds.key],
20
22
  instruction: {
21
23
  async act(page, _input, mem) {
22
24
  const { username } = mem.get(LoginCreds.key);
23
25
  await page.locator(LoginSel.username).fill(username);
24
26
  },
25
- resolve: () => checkpoint("LoginPage"),
26
27
  },
27
28
  });
@@ -1,5 +1,5 @@
1
1
  import { defineMethodBlock, checkpoint, Trait } from "waygraph";
2
- import type {
2
+ import {
3
3
  LoginPage,
4
4
  LoginSubmitOutcome,
5
5
  } from "../../../states/checkout.states.js";
@@ -17,12 +17,11 @@ type LoginObserve = "success" | "failure";
17
17
  * already did that). One Block, one action: submit.
18
18
  * Branches: good creds -> LoggedIn; bad/locked -> LoginPage with error banner.
19
19
  */
20
- export const SubmitLoginBlock = defineMethodBlock<
21
- LoginPage,
22
- LoginSubmitOutcome
23
- >({
20
+ export const SubmitLoginBlock = defineMethodBlock({
24
21
  name: "submit-login",
25
22
  description: "Submits the login form; stays on LoginPage when auth fails.",
23
+ from: LoginPage,
24
+ to: LoginSubmitOutcome,
26
25
  instruction: {
27
26
  async act(page) {
28
27
  // noWaitAfter: observe owns the inventory URL wait. Default click
@@ -1,5 +1,5 @@
1
- import { defineMethodBlock, checkpoint, Trait } from "waygraph";
2
- import type { LoggedIn, LoginPage } from "../../../states/checkout.states.js";
1
+ import { defineMethodBlock, Trait } from "waygraph";
2
+ import { LoggedIn, LoginPage } from "../../../states/checkout.states.js";
3
3
  import { LoginSel } from "./login.sel.js";
4
4
 
5
5
  /**
@@ -9,15 +9,16 @@ import { LoginSel } from "./login.sel.js";
9
9
  *
10
10
  * Burger menu Logout - real cycle back to LoginPage (same Checkpoint nav-login lands on).
11
11
  */
12
- export const SubmitLogoutBlock = defineMethodBlock<LoggedIn, LoginPage>({
12
+ export const SubmitLogoutBlock = defineMethodBlock({
13
13
  name: "submit-logout",
14
14
  description: "Opens the burger menu and logs out.",
15
+ from: LoggedIn,
16
+ to: LoginPage,
15
17
  instruction: {
16
18
  async act(page) {
17
19
  await page.locator(LoginSel.burgerMenuButton).click();
18
20
  await page.locator(LoginSel.logoutLink).click();
19
21
  },
20
- resolve: () => checkpoint("LoginPage"),
21
22
  verify: [Trait.visible(LoginSel.loginButton)],
22
23
  },
23
24
  });