waygraph 0.15.53 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (556) hide show
  1. package/README.md +8 -3
  2. package/bin/waygraph +2 -2
  3. package/dist/analysis/check.d.ts +38 -0
  4. package/dist/analysis/check.js +87 -0
  5. package/dist/analysis/coverage-gap.d.ts +1 -1
  6. package/dist/analysis/coverage-gap.js +14 -37
  7. package/dist/analysis/flow-source.d.ts +9 -0
  8. package/dist/analysis/flow-source.js +25 -0
  9. package/dist/analysis/graph.d.ts +13 -14
  10. package/dist/analysis/graph.js +48 -371
  11. package/dist/analysis/map-check.js +4 -39
  12. package/dist/analysis/practices-check.d.ts +1 -1
  13. package/dist/analysis/practices-check.js +24 -45
  14. package/dist/cli/args.d.ts +23 -0
  15. package/dist/cli/args.js +20 -0
  16. package/dist/{cli.d.ts → cli/cli.d.ts} +0 -1
  17. package/dist/{cli.js → cli/cli.js} +10 -9
  18. package/dist/{commands → cli/commands}/agent-dive-scaffold.js +35 -64
  19. package/dist/cli/commands/agent-dive.js +42 -0
  20. package/dist/{commands → cli/commands}/check.d.ts +0 -1
  21. package/dist/cli/commands/check.js +104 -0
  22. package/dist/cli/commands/codemod-checkpoints.d.ts +18 -0
  23. package/dist/cli/commands/codemod-checkpoints.js +186 -0
  24. package/dist/cli/commands/codemod-flows.d.ts +18 -0
  25. package/dist/cli/commands/codemod-flows.js +284 -0
  26. package/dist/cli/commands/codemod-stubs.d.ts +10 -0
  27. package/dist/cli/commands/codemod-stubs.js +187 -0
  28. package/dist/{commands → cli/commands}/extensions.js +5 -4
  29. package/dist/{commands → cli/commands}/init.js +1 -2
  30. package/dist/{commands → cli/commands}/list.js +9 -7
  31. package/dist/cli/commands/manifest.d.ts +2 -0
  32. package/dist/cli/commands/manifest.js +20 -0
  33. package/dist/cli/commands/map.js +57 -0
  34. package/dist/{commands → cli/commands}/run.d.ts +0 -1
  35. package/dist/cli/commands/run.js +64 -0
  36. package/dist/{commands → cli/commands}/session.js +61 -88
  37. package/dist/{commands → cli/commands}/test.js +11 -14
  38. package/dist/cli/commands/traverse.js +105 -0
  39. package/dist/{commands → cli/commands}/try.js +29 -25
  40. package/dist/{commands → cli/commands}/upgrade.js +40 -4
  41. package/dist/cli/flags.d.ts +193 -16
  42. package/dist/cli/flags.js +179 -234
  43. package/dist/cli/run-chain.d.ts +1 -0
  44. package/dist/cli/run-chain.js +42 -7
  45. package/dist/cli/usage.d.ts +1 -1
  46. package/dist/cli/usage.js +21 -53
  47. package/dist/cli/util.d.ts +2 -2
  48. package/dist/cli/util.js +2 -3
  49. package/dist/{highlights → demo/narration}/css.d.ts +1 -1
  50. package/dist/{highlights → demo/narration}/css.js +2 -3
  51. package/dist/{highlights → demo/narration}/demo-pace.d.ts +7 -11
  52. package/dist/{highlights → demo/narration}/demo-pace.js +9 -11
  53. package/dist/{highlights → demo/narration}/device.d.ts +4 -2
  54. package/dist/{highlights → demo/narration}/device.js +3 -1
  55. package/dist/demo/narration/merge.d.ts +8 -0
  56. package/dist/demo/narration/merge.js +71 -0
  57. package/dist/{highlights/run-phase.d.ts → demo/narration/narration.d.ts} +10 -14
  58. package/dist/{highlights/run-phase.js → demo/narration/narration.js} +25 -94
  59. package/dist/{highlights → demo/narration}/shorthand.d.ts +1 -1
  60. package/dist/demo/narration/stub-ctx.d.ts +8 -0
  61. package/dist/demo/narration/stub-ctx.js +164 -0
  62. package/dist/{highlights → demo/narration}/style.d.ts +1 -7
  63. package/dist/{highlights → demo/narration}/style.js +1 -41
  64. package/dist/{highlights → demo/narration}/todo-dock.d.ts +3 -3
  65. package/dist/{highlights → demo/narration}/todo-dock.js +13 -30
  66. package/dist/demo/overlay/auto-chrome.d.ts +7 -0
  67. package/dist/demo/overlay/auto-chrome.js +97 -0
  68. package/dist/{session/overlay-beacon.d.ts → demo/overlay/beacon.d.ts} +7 -0
  69. package/dist/{session/overlay-beacon.js → demo/overlay/beacon.js} +5 -0
  70. package/dist/demo/overlay/cursor.d.ts +12 -0
  71. package/dist/demo/overlay/cursor.js +142 -0
  72. package/dist/demo/overlay/device-stage.d.ts +13 -0
  73. package/dist/demo/overlay/device-stage.js +396 -0
  74. package/dist/demo/overlay/inpage/banner.d.ts +1 -0
  75. package/dist/demo/overlay/inpage/banner.js +160 -0
  76. package/dist/demo/overlay/inpage/caption.d.ts +2 -0
  77. package/dist/demo/overlay/inpage/caption.js +24 -0
  78. package/dist/demo/overlay/inpage/core.d.ts +1 -0
  79. package/dist/demo/overlay/inpage/core.js +345 -0
  80. package/dist/demo/overlay/inpage/device-chip.d.ts +1 -0
  81. package/dist/demo/overlay/inpage/device-chip.js +191 -0
  82. package/dist/demo/overlay/inpage/network.d.ts +9 -0
  83. package/dist/demo/overlay/inpage/network.js +200 -0
  84. package/dist/demo/overlay/inpage/panel-chrome.d.ts +1 -0
  85. package/dist/demo/overlay/inpage/panel-chrome.js +203 -0
  86. package/dist/demo/overlay/inpage/stamp.d.ts +1 -0
  87. package/dist/demo/overlay/inpage/stamp.js +46 -0
  88. package/dist/demo/overlay/inpage/swipe-zoom.d.ts +1 -0
  89. package/dist/demo/overlay/inpage/swipe-zoom.js +220 -0
  90. package/dist/demo/overlay/inpage/todos.d.ts +1 -0
  91. package/dist/demo/overlay/inpage/todos.js +294 -0
  92. package/dist/demo/overlay/locator-theater.d.ts +25 -0
  93. package/dist/demo/overlay/locator-theater.js +76 -0
  94. package/dist/demo/overlay/network-capture.d.ts +22 -0
  95. package/dist/demo/overlay/network-capture.js +127 -0
  96. package/dist/demo/overlay/overlay-css.d.ts +3 -0
  97. package/dist/demo/overlay/overlay-css.js +369 -0
  98. package/dist/demo/overlay/overlay-stage.d.ts +23 -0
  99. package/dist/demo/overlay/overlay-stage.js +106 -0
  100. package/dist/demo/overlay/overlay.d.ts +10 -0
  101. package/dist/demo/overlay/overlay.js +89 -0
  102. package/dist/{pilot-overlay/overlay-fixtures.d.ts → demo/overlay/phase-fixtures.d.ts} +2 -2
  103. package/dist/{pilot-overlay/overlay-fixtures.js → demo/overlay/phase-fixtures.js} +2 -2
  104. package/dist/{pilot-overlay/action-ring.js → demo/overlay/pilot/actions.js} +2 -1
  105. package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.d.ts +6 -5
  106. package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.js +19 -18
  107. package/dist/{pilot-overlay → demo/overlay/pilot}/shell.d.ts +2 -2
  108. package/dist/{pilot-overlay → demo/overlay/pilot}/shell.js +13 -22
  109. package/dist/demo/overlay/reattach.d.ts +7 -0
  110. package/dist/demo/overlay/reattach.js +23 -0
  111. package/dist/demo/overlay/rings.d.ts +33 -0
  112. package/dist/demo/overlay/rings.js +448 -0
  113. package/dist/{ui → demo/overlay/ui}/components/ring.js +2 -2
  114. package/dist/{ui → demo/overlay/ui}/overlay.css +4 -4
  115. package/dist/{ui → demo/overlay/ui}/shadow.d.ts +1 -1
  116. package/dist/{ui → demo/overlay/ui}/shadow.js +39 -2
  117. package/dist/demo/stepper/after.d.ts +3 -0
  118. package/dist/demo/stepper/after.js +113 -0
  119. package/dist/demo/stepper/banner-log.d.ts +37 -0
  120. package/dist/demo/stepper/banner-log.js +63 -0
  121. package/dist/demo/stepper/before.d.ts +4 -0
  122. package/dist/demo/stepper/before.js +110 -0
  123. package/dist/demo/stepper/demo-log.d.ts +31 -0
  124. package/dist/demo/stepper/demo-log.js +309 -0
  125. package/dist/demo/stepper/gate.d.ts +11 -0
  126. package/dist/demo/stepper/gate.js +78 -0
  127. package/dist/demo/stepper/interaction-patch.d.ts +3 -0
  128. package/dist/demo/stepper/interaction-patch.js +323 -0
  129. package/dist/demo/stepper/pacing.d.ts +21 -0
  130. package/dist/demo/stepper/pacing.js +23 -0
  131. package/dist/demo/stepper/slides.d.ts +11 -0
  132. package/dist/demo/stepper/slides.js +233 -0
  133. package/dist/demo/stepper/step-panels.d.ts +21 -0
  134. package/dist/demo/stepper/step-panels.js +589 -0
  135. package/dist/demo/stepper/stepper.d.ts +24 -0
  136. package/dist/demo/stepper/stepper.js +122 -0
  137. package/dist/demo/stepper/teardown.d.ts +48 -0
  138. package/dist/demo/stepper/teardown.js +179 -0
  139. package/dist/demo/stepper/todo-advance.d.ts +14 -0
  140. package/dist/demo/stepper/todo-advance.js +110 -0
  141. package/dist/demo/stepper/view.d.ts +68 -0
  142. package/dist/demo/stepper/view.js +31 -0
  143. package/dist/demo/types.d.ts +17 -0
  144. package/dist/demo/verbose-log.js +15 -0
  145. package/dist/{types.d.ts → engine/block/block.d.ts} +106 -91
  146. package/dist/{core → engine/block}/block.js +10 -53
  147. package/dist/{core → engine/block}/compose.d.ts +10 -7
  148. package/dist/{core → engine/block}/compose.js +1 -1
  149. package/dist/{core/blocks → engine/block/kinds}/api.d.ts +17 -12
  150. package/dist/{core/blocks → engine/block/kinds}/api.js +26 -18
  151. package/dist/{core/blocks → engine/block/kinds}/effect.d.ts +13 -18
  152. package/dist/engine/block/kinds/effect.js +17 -0
  153. package/dist/{core/blocks → engine/block/kinds}/method.d.ts +19 -29
  154. package/dist/{core/blocks → engine/block/kinds}/method.js +7 -21
  155. package/dist/{core/blocks → engine/block/kinds}/nav.d.ts +22 -31
  156. package/dist/{core/blocks → engine/block/kinds}/nav.js +6 -12
  157. package/dist/{core/blocks → engine/block/kinds}/page.d.ts +15 -20
  158. package/dist/{core/blocks → engine/block/kinds}/page.js +5 -7
  159. package/dist/engine/checkpoint/checkpoint.d.ts +22 -0
  160. package/dist/engine/checkpoint/checkpoint.js +8 -0
  161. package/dist/engine/checkpoint/route.d.ts +28 -0
  162. package/dist/engine/checkpoint/route.js +28 -0
  163. package/dist/{core → engine}/config.d.ts +7 -2
  164. package/dist/engine/config.js +6 -0
  165. package/dist/engine/engine.d.ts +45 -0
  166. package/dist/{core → engine}/engine.js +6 -10
  167. package/dist/engine/env.d.ts +59 -0
  168. package/dist/engine/env.js +83 -0
  169. package/dist/{errors.d.ts → engine/errors.d.ts} +23 -22
  170. package/dist/{errors.js → engine/errors.js} +22 -22
  171. package/dist/{core → engine/flow}/branch-regression.d.ts +8 -7
  172. package/dist/{core → engine/flow}/branch-regression.js +4 -3
  173. package/dist/engine/flow/flow.d.ts +162 -0
  174. package/dist/engine/flow/flow.js +244 -0
  175. package/dist/{core → engine/flow}/map-builder.d.ts +42 -40
  176. package/dist/{core → engine/flow}/map-builder.js +46 -48
  177. package/dist/{core → engine}/locate.d.ts +1 -1
  178. package/dist/{core → engine}/locate.js +1 -2
  179. package/dist/{mem-stub.d.ts → engine/mem/mem-stub.d.ts} +9 -8
  180. package/dist/{mem-stub.js → engine/mem/mem-stub.js} +2 -2
  181. package/dist/{mem-page.d.ts → engine/mem/mem.d.ts} +1 -1
  182. package/dist/{mem-page.js → engine/mem/mem.js} +2 -1
  183. package/dist/engine/page-gone.d.ts +5 -0
  184. package/dist/engine/page-gone.js +20 -0
  185. package/dist/engine/run/connect.d.ts +28 -0
  186. package/dist/{types.js → engine/run/connect.js} +11 -10
  187. package/dist/engine/run/events.d.ts +67 -0
  188. package/dist/engine/run/events.js +90 -0
  189. package/dist/engine/run/hooks.d.ts +16 -0
  190. package/dist/engine/run/hooks.js +8 -0
  191. package/dist/engine/run/launch.d.ts +13 -0
  192. package/dist/engine/run/launch.js +27 -0
  193. package/dist/{core/run-graph.d.ts → engine/run/run.d.ts} +9 -11
  194. package/dist/{core/run-graph.js → engine/run/run.js} +22 -11
  195. package/dist/engine/stub/pace.d.ts +12 -0
  196. package/dist/engine/stub/pace.js +2 -0
  197. package/dist/engine/stub/ring.d.ts +130 -0
  198. package/dist/engine/stub/ring.js +41 -0
  199. package/dist/engine/stub/stub.d.ts +268 -0
  200. package/dist/engine/stub/stub.js +1 -0
  201. package/dist/engine/stub/todos.d.ts +104 -0
  202. package/dist/engine/stub/todos.js +2 -0
  203. package/dist/engine/stub/viewport.d.ts +26 -0
  204. package/dist/engine/stub/viewport.js +2 -0
  205. package/dist/{trait.d.ts → engine/trait/trait.d.ts} +1 -1
  206. package/dist/index.d.ts +84 -36
  207. package/dist/index.js +44 -19
  208. package/dist/{session/auto-explore-run.d.ts → live/auto/auto.d.ts} +10 -16
  209. package/dist/{session/auto-explore-run.js → live/auto/auto.js} +164 -248
  210. package/dist/{session/auto-explore.d.ts → live/auto/explore.d.ts} +4 -14
  211. package/dist/{session/auto-explore.js → live/auto/explore.js} +21 -127
  212. package/dist/{auto-session/session.d.ts → live/auto-session/auto-session.d.ts} +1 -1
  213. package/dist/{auto-session/session.js → live/auto-session/auto-session.js} +27 -24
  214. package/dist/{auto-session → live/auto-session}/helpers.d.ts +16 -5
  215. package/dist/{auto-session → live/auto-session}/helpers.js +1 -1
  216. package/dist/{session/auto-session-ipc.d.ts → live/auto-session/ipc.d.ts} +7 -5
  217. package/dist/{session/auto-session-ipc.js → live/auto-session/ipc.js} +31 -16
  218. package/dist/{session/browser.d.ts → live/auto-session/start.d.ts} +1 -2
  219. package/dist/{session/browser.js → live/auto-session/start.js} +2 -3
  220. package/dist/{pilot-overlay → live/pilot}/panel.d.ts +1 -1
  221. package/dist/{pilot-overlay → live/pilot}/panel.js +23 -31
  222. package/dist/{session → live/pilot}/pilot.d.ts +4 -3
  223. package/dist/{session → live/pilot}/pilot.js +4 -4
  224. package/dist/{traverse → live/traverse}/coverage.d.ts +4 -0
  225. package/dist/{traverse → live/traverse}/coverage.js +3 -0
  226. package/dist/{traverse → live/traverse}/lease.d.ts +1 -0
  227. package/dist/{traverse → live/traverse}/lease.js +1 -0
  228. package/dist/{traverse/run.d.ts → live/traverse/traverse.d.ts} +4 -1
  229. package/dist/{traverse/run.js → live/traverse/traverse.js} +26 -43
  230. package/dist/manifest/manifest.d.ts +52 -0
  231. package/dist/manifest/manifest.js +93 -0
  232. package/dist/manifest/map-imports.d.ts +7 -0
  233. package/dist/manifest/map-imports.js +22 -0
  234. package/dist/manifest/maps.d.ts +33 -0
  235. package/dist/manifest/maps.js +62 -0
  236. package/dist/manifest/pack.d.ts +21 -0
  237. package/dist/manifest/pack.js +109 -0
  238. package/dist/manifest/project.d.ts +60 -0
  239. package/dist/manifest/project.js +101 -0
  240. package/dist/{session/block-inject.js → manifest/roots.js} +1 -18
  241. package/dist/manifest/scan.d.ts +19 -0
  242. package/dist/manifest/scan.js +57 -0
  243. package/dist/{blocks-select.d.ts → manifest/select.d.ts} +3 -0
  244. package/dist/{blocks-select.js → manifest/select.js} +2 -0
  245. package/dist/manifest/source.d.ts +23 -0
  246. package/dist/manifest/source.js +86 -0
  247. package/dist/runner/mode.d.ts +71 -0
  248. package/dist/runner/mode.js +1 -0
  249. package/dist/runner/modes/branches.d.ts +5 -0
  250. package/dist/runner/modes/branches.js +37 -0
  251. package/dist/runner/modes/demo.d.ts +3 -0
  252. package/dist/runner/modes/demo.js +13 -0
  253. package/dist/runner/modes/report.d.ts +2 -0
  254. package/dist/runner/modes/report.js +54 -0
  255. package/dist/runner/modes/run.d.ts +2 -0
  256. package/dist/runner/modes/run.js +3 -0
  257. package/dist/runner/options.d.ts +31 -0
  258. package/dist/runner/options.js +42 -0
  259. package/dist/runner/plan/find.d.ts +18 -0
  260. package/dist/runner/plan/find.js +65 -0
  261. package/dist/runner/plan/plan.d.ts +11 -0
  262. package/dist/runner/plan/plan.js +97 -0
  263. package/dist/runner/plan/seed-mem.d.ts +12 -0
  264. package/dist/runner/plan/seed-mem.js +98 -0
  265. package/dist/runner/plan/spec.d.ts +5 -0
  266. package/dist/runner/plan/spec.js +17 -0
  267. package/dist/runner/play-steps.d.ts +2 -0
  268. package/dist/runner/play-steps.js +59 -0
  269. package/dist/runner/runner.d.ts +4 -0
  270. package/dist/runner/runner.js +64 -0
  271. package/dist/runner/session.d.ts +9 -0
  272. package/dist/runner/session.js +87 -0
  273. package/dist/{browser.js → runtime/browser.js} +4 -2
  274. package/dist/{env-file.js → runtime/env-file.js} +7 -12
  275. package/dist/{extensions.d.ts → runtime/extensions.d.ts} +2 -5
  276. package/dist/{extensions.js → runtime/extensions.js} +3 -1
  277. package/dist/runtime/full-launch.d.ts +1 -0
  278. package/dist/runtime/full-launch.js +34 -0
  279. package/dist/runtime/global-flag.d.ts +5 -0
  280. package/dist/runtime/global-flag.js +18 -0
  281. package/dist/{playwright-config.d.ts → runtime/playwright-config.d.ts} +1 -1
  282. package/dist/{playwright.config.js → runtime/playwright.config.js} +3 -2
  283. package/dist/runtime/run-log.d.ts +2 -0
  284. package/dist/runtime/run-log.js +17 -0
  285. package/dist/{video-dir.js → runtime/video-dir.js} +3 -2
  286. package/dist/{config.d.ts → runtime/waygraph-config.d.ts} +8 -9
  287. package/dist/{config.js → runtime/waygraph-config.js} +21 -51
  288. package/dist/{webserver.js → runtime/webserver.js} +5 -30
  289. package/examples/routed-demo/config/waygraph.config.ts +20 -0
  290. package/examples/routed-demo/package.json +1 -4
  291. package/examples/routed-demo/scripts/fixture-server.mjs +1 -1
  292. package/examples/routed-demo/src/flows/routed-demo-map.flow.ts +2 -4
  293. package/examples/routed-demo/src/flows/routed-demo.flow.ts +2 -3
  294. package/examples/routed-demo/src/map/(app_base)/dashboard/_methods/click-widget.block.ts +5 -4
  295. package/examples/routed-demo/src/map/(app_base)/dashboard/_nav.block.ts +3 -3
  296. package/examples/routed-demo/src/map/(app_base)/dashboard/_page.block.ts +3 -3
  297. package/examples/routed-demo/src/map/(external)/docs/_nav.block.ts +3 -3
  298. package/examples/routed-demo/src/map/(external)/docs/_page.block.ts +3 -3
  299. package/examples/routed-demo/src/states/routed-demo.states.ts +5 -3
  300. package/examples/routed-demo/tests/routed-demo.spec.ts +4 -4
  301. package/examples/routed-demo/tsconfig.json +1 -1
  302. package/examples/saucedemo/README.md +11 -12
  303. package/examples/saucedemo/config/waygraph.config.ts +17 -0
  304. package/examples/saucedemo/docs/CONVENTION.md +5 -7
  305. package/examples/saucedemo/docs/HELPERS.md +12 -12
  306. package/examples/saucedemo/package-lock.json +10 -3
  307. package/examples/saucedemo/package.json +12 -29
  308. package/examples/saucedemo/src/blocks/SITE-MAP.md +0 -1
  309. package/examples/saucedemo/src/blocks/saucedemo-web/NAV.md +1 -5
  310. package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -52
  311. package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
  312. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
  313. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
  314. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
  315. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
  316. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +21 -27
  317. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -9
  318. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
  319. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +10 -76
  320. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
  321. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
  322. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
  323. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
  324. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
  325. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
  326. package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -29
  327. package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -48
  328. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +13 -77
  329. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
  330. package/examples/saucedemo/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
  331. package/examples/saucedemo/src/flows/api-demo.flow.ts +26 -18
  332. package/examples/saucedemo/src/flows/cart-bulk.flow.ts +19 -14
  333. package/examples/saucedemo/src/flows/cart-continue.flow.ts +10 -8
  334. package/examples/saucedemo/src/flows/cart-mem.flow.ts +7 -7
  335. package/examples/saucedemo/src/flows/catalog-logout.flow.ts +13 -8
  336. package/examples/saucedemo/src/flows/checkout-then-browse-again.flow.ts +26 -48
  337. package/examples/saucedemo/src/flows/checkout.flow.ts +70 -86
  338. package/examples/saucedemo/src/flows/device-showcase.flow.ts +24 -25
  339. package/examples/saucedemo/src/flows/login.flow.ts +11 -18
  340. package/examples/saucedemo/src/flows/mem-stub-demo.flow.ts +9 -20
  341. package/examples/saucedemo/src/flows/shop.flow.ts +15 -20
  342. package/examples/saucedemo/src/flows/smoke.flow.ts +12 -27
  343. package/examples/saucedemo/src/flows/stub-on-error.flow.ts +24 -43
  344. package/examples/saucedemo/src/flows/viewer-blocked.flow.ts +26 -34
  345. package/examples/saucedemo/src/states/checkout.mem-stubs.ts +11 -0
  346. package/examples/saucedemo/src/states/checkout.states.ts +21 -11
  347. package/examples/saucedemo/src/stubs/device-showcase.ts +191 -0
  348. package/examples/saucedemo/src/stubs/login.ts +37 -0
  349. package/examples/saucedemo/tests/auto-graph.spec.ts +4 -12
  350. package/examples/saucedemo/tests/chain-flow-episodes.spec.ts +7 -9
  351. package/examples/saucedemo/tests/submit-login-branch.spec.ts +18 -5
  352. package/package.json +12 -7
  353. package/templates/agents/waygraph-planner.agent.md +2 -2
  354. package/templates/quickstart/README.md +4 -7
  355. package/templates/quickstart/config/waygraph.config.ts +17 -0
  356. package/templates/quickstart/docs/CONVENTION.md +5 -6
  357. package/templates/quickstart/docs/HELPERS.md +11 -9
  358. package/templates/quickstart/package.json +14 -17
  359. package/templates/quickstart/src/blocks/SITE-MAP.md +13 -3
  360. package/templates/quickstart/src/blocks/saucedemo-web/NAV.md +1 -5
  361. package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -52
  362. package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
  363. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
  364. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
  365. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
  366. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
  367. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +21 -27
  368. package/templates/quickstart/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -9
  369. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
  370. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +10 -76
  371. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
  372. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
  373. package/templates/quickstart/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
  374. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
  375. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
  376. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
  377. package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -29
  378. package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -48
  379. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +13 -77
  380. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
  381. package/templates/quickstart/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
  382. package/templates/quickstart/src/flows/api-demo.flow.ts +45 -0
  383. package/templates/quickstart/src/flows/cart-bulk.flow.ts +19 -14
  384. package/templates/quickstart/src/flows/cart-continue.flow.ts +10 -8
  385. package/templates/quickstart/src/flows/cart-mem.flow.ts +7 -7
  386. package/templates/quickstart/src/flows/catalog-logout.flow.ts +13 -8
  387. package/templates/quickstart/src/flows/checkout-then-browse-again.flow.ts +26 -48
  388. package/templates/quickstart/src/flows/checkout.flow.ts +70 -63
  389. package/templates/quickstart/src/flows/device-showcase.flow.ts +24 -25
  390. package/templates/quickstart/src/flows/login.flow.ts +11 -18
  391. package/templates/quickstart/src/flows/mem-stub-demo.flow.ts +12 -0
  392. package/templates/quickstart/src/flows/shop.flow.ts +15 -20
  393. package/templates/quickstart/src/flows/smoke.flow.ts +12 -27
  394. package/templates/quickstart/src/flows/stub-on-error.flow.ts +31 -0
  395. package/templates/quickstart/src/flows/viewer-blocked.flow.ts +26 -34
  396. package/templates/quickstart/src/states/checkout.mem-stubs.ts +11 -0
  397. package/templates/quickstart/src/states/checkout.states.ts +21 -11
  398. package/templates/quickstart/src/stubs/device-showcase.ts +191 -0
  399. package/templates/quickstart/src/stubs/login.ts +37 -0
  400. package/templates/quickstart/tests/chain-flow.spec.ts +7 -10
  401. package/templates/scaffold/README.md +2 -1
  402. package/templates/scaffold/STRUCTURE.md +5 -4
  403. package/templates/scaffold/config/waygraph.config.ts +1 -0
  404. package/templates/scaffold/gitignore +1 -0
  405. package/templates/scaffold/src/flows/README.md +2 -2
  406. package/templates/scaffold/src/map/(app_base)/docs/_nav.block.ts +3 -3
  407. package/templates/scaffold/src/map/(app_base)/docs/_page.block.ts +3 -3
  408. package/templates/scaffold/src/map/(app_base)/home/_methods/add-item.effect.block.ts +4 -4
  409. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-hello.method.block.ts +3 -3
  410. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-item-added.method.block.ts +3 -3
  411. package/templates/scaffold/src/map/(app_base)/home/_methods/clear-cart.method.block.ts +5 -4
  412. package/templates/scaffold/src/map/(app_base)/home/_methods/remove-item.effect.block.ts +4 -4
  413. package/templates/scaffold/src/map/(app_base)/home/_nav.block.ts +3 -3
  414. package/templates/scaffold/src/map/(app_base)/home/_page.block.ts +3 -3
  415. package/templates/scaffold/src/map/(app_base)/home/nav-verification-link.block.ts +4 -4
  416. package/templates/scaffold/src/map/(external)/hoppscotch/_keys.ts +21 -0
  417. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-body.method.block.ts +4 -4
  418. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-header.method.block.ts +4 -4
  419. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-status.method.block.ts +4 -4
  420. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/pick-extension-interceptor.method.block.ts +5 -4
  421. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-body.method.block.ts +6 -5
  422. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-headers.method.block.ts +6 -5
  423. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/send-request.method.block.ts +5 -4
  424. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-bearer-token.method.block.ts +6 -5
  425. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-headers.method.block.ts +6 -5
  426. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-json-body.method.block.ts +6 -5
  427. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-method.method.block.ts +6 -5
  428. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-query-params.method.block.ts +6 -5
  429. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-url.method.block.ts +6 -5
  430. package/templates/scaffold/src/map/(external)/hoppscotch/_nav.block.ts +3 -3
  431. package/templates/scaffold/src/map/(external)/hoppscotch/_page.block.ts +3 -3
  432. package/templates/scaffold/src/map/(external)/hoppscotch/_states.ts +6 -0
  433. package/templates/scaffold/src/map/(external)/hoppscotch/settings/_nav.block.ts +3 -3
  434. package/templates/scaffold/src/map/(external)/mailpit/_keys.ts +13 -0
  435. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-content.method.block.ts +4 -4
  436. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-received.method.block.ts +4 -4
  437. package/templates/scaffold/src/map/(external)/mailpit/_methods/extract-email-link.method.block.ts +6 -5
  438. package/templates/scaffold/src/map/(external)/mailpit/_methods/open-message.method.block.ts +6 -5
  439. package/templates/scaffold/src/map/(external)/mailpit/_nav.block.ts +3 -3
  440. package/templates/scaffold/src/map/(external)/mailpit/_page.block.ts +3 -3
  441. package/templates/scaffold/src/map/(external)/mailpit/_states.ts +9 -0
  442. package/templates/scaffold/src/map/README.md +7 -0
  443. package/templates/scaffold/src/states/README.md +4 -1
  444. package/templates/scaffold/src/states/demo.mem-keys.ts +1 -29
  445. package/templates/scaffold/src/states/demo.states.ts +14 -20
  446. package/templates/scaffold/tests/hoppscotch.spec.ts +1 -11
  447. package/templates/scaffold/tests/mail-verify.spec.ts +2 -2
  448. package/templates/skills/waygraph-blind-pilot.skill.md +2 -6
  449. package/templates/skills/waygraph-convention.skill.md +23 -14
  450. package/templates/skills/waygraph-pilot.skill.md +7 -4
  451. package/dist/auto-session/verbose-log.js +0 -16
  452. package/dist/auto-session.d.ts +0 -2
  453. package/dist/auto-session.js +0 -3
  454. package/dist/cli/discover.d.ts +0 -40
  455. package/dist/cli/discover.js +0 -148
  456. package/dist/commands/agent-dive.js +0 -52
  457. package/dist/commands/check.js +0 -192
  458. package/dist/commands/map.js +0 -29
  459. package/dist/commands/run.js +0 -104
  460. package/dist/commands/traverse.js +0 -177
  461. package/dist/core/block.d.ts +0 -109
  462. package/dist/core/blocks/effect.js +0 -23
  463. package/dist/core/config.js +0 -17
  464. package/dist/core/engine.d.ts +0 -198
  465. package/dist/core/flow.d.ts +0 -293
  466. package/dist/core/flow.js +0 -432
  467. package/dist/core.d.ts +0 -14
  468. package/dist/core.js +0 -15
  469. package/dist/highlights/merge.d.ts +0 -8
  470. package/dist/highlights/merge.js +0 -173
  471. package/dist/highlights/stub-ctx.d.ts +0 -10
  472. package/dist/highlights/stub-ctx.js +0 -331
  473. package/dist/highlights/types.d.ts +0 -607
  474. package/dist/highlights.d.ts +0 -9
  475. package/dist/highlights.js +0 -10
  476. package/dist/pilot-overlay.d.ts +0 -5
  477. package/dist/pilot-overlay.js +0 -6
  478. package/dist/runner/banner-log.js +0 -63
  479. package/dist/runner/chain-run.js +0 -102
  480. package/dist/runner/cursor.js +0 -140
  481. package/dist/runner/demo-log.js +0 -316
  482. package/dist/runner/device-stage.d.ts +0 -9
  483. package/dist/runner/device-stage.js +0 -420
  484. package/dist/runner/discovery.js +0 -105
  485. package/dist/runner/index.js +0 -2
  486. package/dist/runner/inpage/banner.d.ts +0 -21
  487. package/dist/runner/inpage/banner.js +0 -156
  488. package/dist/runner/inpage/caption.d.ts +0 -3
  489. package/dist/runner/inpage/caption.js +0 -23
  490. package/dist/runner/inpage/core.d.ts +0 -4
  491. package/dist/runner/inpage/core.js +0 -316
  492. package/dist/runner/inpage/device.d.ts +0 -3
  493. package/dist/runner/inpage/device.js +0 -211
  494. package/dist/runner/inpage/network.d.ts +0 -15
  495. package/dist/runner/inpage/network.js +0 -217
  496. package/dist/runner/inpage/panel-chrome.js +0 -192
  497. package/dist/runner/inpage/stamp.js +0 -46
  498. package/dist/runner/inpage/swipe-zoom.js +0 -220
  499. package/dist/runner/inpage/todos.js +0 -337
  500. package/dist/runner/interaction-patch.js +0 -384
  501. package/dist/runner/main.js +0 -469
  502. package/dist/runner/network-capture.d.ts +0 -9
  503. package/dist/runner/network-capture.js +0 -126
  504. package/dist/runner/overlay-css.d.ts +0 -3
  505. package/dist/runner/overlay-css.js +0 -377
  506. package/dist/runner/overlay-install.js +0 -90
  507. package/dist/runner/overlay-stage.js +0 -110
  508. package/dist/runner/rings.js +0 -514
  509. package/dist/runner/seed-mem.js +0 -110
  510. package/dist/runner/slides.js +0 -278
  511. package/dist/runner/step-mode.js +0 -703
  512. package/dist/runner/step-panels.js +0 -729
  513. package/dist/runner/teardown.js +0 -202
  514. package/dist/runner/todo-dock.js +0 -142
  515. package/dist/session/step-overlay.d.ts +0 -37
  516. package/dist/session/step-overlay.js +0 -244
  517. package/examples/routed-demo/playwright.config.ts +0 -21
  518. package/examples/saucedemo/playwright.config.ts +0 -19
  519. package/examples/saucedemo/scripts/drive-auto-cli.mjs +0 -93
  520. package/examples/saucedemo/scripts/prove-add-to-cart-menu.mjs +0 -126
  521. package/examples/saucedemo/scripts/prove-auto-graph.mjs +0 -92
  522. package/examples/saucedemo/scripts/prove-wrong-login-runtime.mjs +0 -63
  523. package/examples/saucedemo/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
  524. package/templates/quickstart/playwright.config.ts +0 -14
  525. package/templates/quickstart/scripts/drive-auto-cli.mjs +0 -93
  526. package/templates/quickstart/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
  527. /package/dist/{commands → cli/commands}/agent-dive-scaffold.d.ts +0 -0
  528. /package/dist/{commands → cli/commands}/agent-dive.d.ts +0 -0
  529. /package/dist/{commands → cli/commands}/extensions.d.ts +0 -0
  530. /package/dist/{commands → cli/commands}/init.d.ts +0 -0
  531. /package/dist/{commands → cli/commands}/list.d.ts +0 -0
  532. /package/dist/{commands → cli/commands}/map.d.ts +0 -0
  533. /package/dist/{commands → cli/commands}/session.d.ts +0 -0
  534. /package/dist/{commands → cli/commands}/test.d.ts +0 -0
  535. /package/dist/{commands → cli/commands}/traverse.d.ts +0 -0
  536. /package/dist/{commands → cli/commands}/try.d.ts +0 -0
  537. /package/dist/{commands → cli/commands}/upgrade.d.ts +0 -0
  538. /package/dist/{highlights → demo/narration}/shorthand.js +0 -0
  539. /package/dist/{pilot-overlay/action-ring.d.ts → demo/overlay/pilot/actions.d.ts} +0 -0
  540. /package/dist/{ui → demo/overlay/ui}/components/ring.d.ts +0 -0
  541. /package/dist/{ui → demo/overlay/ui}/stylesheet.d.ts +0 -0
  542. /package/dist/{ui → demo/overlay/ui}/stylesheet.js +0 -0
  543. /package/dist/{ui → demo/overlay/ui}/tokens.d.ts +0 -0
  544. /package/dist/{ui → demo/overlay/ui}/tokens.js +0 -0
  545. /package/dist/{highlights → demo}/types.js +0 -0
  546. /package/dist/{auto-session → demo}/verbose-log.d.ts +0 -0
  547. /package/dist/{selector.d.ts → engine/trait/selector.d.ts} +0 -0
  548. /package/dist/{selector.js → engine/trait/selector.js} +0 -0
  549. /package/dist/{trait.js → engine/trait/trait.js} +0 -0
  550. /package/dist/{session/block-inject.d.ts → manifest/roots.d.ts} +0 -0
  551. /package/dist/{browser.d.ts → runtime/browser.d.ts} +0 -0
  552. /package/dist/{env-file.d.ts → runtime/env-file.d.ts} +0 -0
  553. /package/dist/{playwright-config.js → runtime/playwright-config.js} +0 -0
  554. /package/dist/{playwright.config.d.ts → runtime/playwright.config.d.ts} +0 -0
  555. /package/dist/{video-dir.d.ts → runtime/video-dir.d.ts} +0 -0
  556. /package/dist/{webserver.d.ts → runtime/webserver.d.ts} +0 -0
@@ -1,11 +1,13 @@
1
- import { defineMethodBlock, checkpoint } from "waygraph";
2
- import type { HoppscotchRest } from "../../../../states/demo.states.js";
3
- import { ResponseBody } from "../../../../states/demo.mem-keys.js";
1
+ import { defineMethodBlock } from "waygraph";
2
+ import { HoppscotchRest } from "../_states.js";
3
+ import { ResponseBody } from "../_keys.js";
4
4
  import { HoppscotchSel } from "../_sel.js";
5
5
 
6
- export const ReadResponseBodyBlock = defineMethodBlock<HoppscotchRest, HoppscotchRest>({
6
+ export const ReadResponseBodyBlock = defineMethodBlock({
7
7
  name: "read-response-body",
8
8
  description: "Reads the raw response body into mem.",
9
+ from: HoppscotchRest,
10
+ to: HoppscotchRest,
9
11
  instruction: {
10
12
  async act(page, _in, mem) {
11
13
  await page.locator(HoppscotchSel.rawTab).click();
@@ -16,6 +18,5 @@ export const ReadResponseBodyBlock = defineMethodBlock<HoppscotchRest, Hoppscotc
16
18
  const json = page.locator(HoppscotchSel.responseJsonTab);
17
19
  if (await json.count()) await json.click();
18
20
  },
19
- resolve: () => checkpoint("HoppscotchRest"),
20
21
  },
21
22
  });
@@ -1,11 +1,13 @@
1
- import { defineMethodBlock, checkpoint } from "waygraph";
2
- import type { HoppscotchRest } from "../../../../states/demo.states.js";
3
- import { ResponseHeaders } from "../../../../states/demo.mem-keys.js";
1
+ import { defineMethodBlock } from "waygraph";
2
+ import { HoppscotchRest } from "../_states.js";
3
+ import { ResponseHeaders } from "../_keys.js";
4
4
  import { HoppscotchSel } from "../_sel.js";
5
5
 
6
- export const ReadResponseHeadersBlock = defineMethodBlock<HoppscotchRest, HoppscotchRest>({
6
+ export const ReadResponseHeadersBlock = defineMethodBlock({
7
7
  name: "read-response-headers",
8
8
  description: "Reads the response headers (lower-cased names) into mem.",
9
+ from: HoppscotchRest,
10
+ to: HoppscotchRest,
9
11
  instruction: {
10
12
  async act(page, _in, mem) {
11
13
  await page.locator(HoppscotchSel.responseHeadersTab).click();
@@ -16,6 +18,5 @@ export const ReadResponseHeadersBlock = defineMethodBlock<HoppscotchRest, Hoppsc
16
18
  for (let i = 0; i + 1 < texts.length; i += 2) headers[texts[i]!.toLowerCase()] = texts[i + 1]!;
17
19
  mem.set(ResponseHeaders, headers);
18
20
  },
19
- resolve: () => checkpoint("HoppscotchRest"),
20
21
  },
21
22
  });
@@ -1,15 +1,16 @@
1
- import { defineMethodBlock, checkpoint } from "waygraph";
2
- import type { HoppscotchRest } from "../../../../states/demo.states.js";
1
+ import { defineMethodBlock } from "waygraph";
2
+ import { HoppscotchRest } from "../_states.js";
3
3
  import { HoppscotchSel } from "../_sel.js";
4
4
 
5
- export const SendRequestBlock = defineMethodBlock<HoppscotchRest, HoppscotchRest>({
5
+ export const SendRequestBlock = defineMethodBlock({
6
6
  name: "send-request",
7
7
  description: "Sends the request and waits for the response status to appear.",
8
+ from: HoppscotchRest,
9
+ to: HoppscotchRest,
8
10
  instruction: {
9
11
  async act(page) {
10
12
  await page.locator(HoppscotchSel.send).click();
11
13
  await page.locator(HoppscotchSel.status).waitFor({ timeout: 20_000 });
12
14
  },
13
- resolve: () => checkpoint("HoppscotchRest"),
14
15
  },
15
16
  });
@@ -1,11 +1,13 @@
1
- import { defineMethodBlock, checkpoint } from "waygraph";
2
- import type { HoppscotchRest } from "../../../../states/demo.states.js";
3
- import { RequestBearerToken } from "../../../../states/demo.mem-keys.js";
1
+ import { defineMethodBlock } from "waygraph";
2
+ import { HoppscotchRest } from "../_states.js";
3
+ import { RequestBearerToken } from "../_keys.js";
4
4
  import { HoppscotchSel } from "../_sel.js";
5
5
 
6
- export const SetBearerTokenBlock = defineMethodBlock<HoppscotchRest, HoppscotchRest>({
6
+ export const SetBearerTokenBlock = defineMethodBlock({
7
7
  name: "set-bearer-token",
8
8
  description: "Sets the Authorization tab to Bearer and types the mem-supplied token.",
9
+ from: HoppscotchRest,
10
+ to: HoppscotchRest,
9
11
  requires: [RequestBearerToken],
10
12
  instruction: {
11
13
  async act(page, _in, mem) {
@@ -15,6 +17,5 @@ export const SetBearerTokenBlock = defineMethodBlock<HoppscotchRest, HoppscotchR
15
17
  await page.locator(HoppscotchSel.bearerToken).locator(HoppscotchSel.editor).click();
16
18
  await page.keyboard.type(mem.get(RequestBearerToken));
17
19
  },
18
- resolve: () => checkpoint("HoppscotchRest"),
19
20
  },
20
21
  });
@@ -1,11 +1,13 @@
1
- import { defineMethodBlock, checkpoint } from "waygraph";
2
- import type { HoppscotchRest } from "../../../../states/demo.states.js";
3
- import { RequestHeaders } from "../../../../states/demo.mem-keys.js";
1
+ import { defineMethodBlock } from "waygraph";
2
+ import { HoppscotchRest } from "../_states.js";
3
+ import { RequestHeaders } from "../_keys.js";
4
4
  import { HoppscotchSel } from "../_sel.js";
5
5
 
6
- export const SetHeadersBlock = defineMethodBlock<HoppscotchRest, HoppscotchRest>({
6
+ export const SetHeadersBlock = defineMethodBlock({
7
7
  name: "set-headers",
8
8
  description: "Adds each mem-supplied header (name -> value) on the Headers tab.",
9
+ from: HoppscotchRest,
10
+ to: HoppscotchRest,
9
11
  requires: [RequestHeaders],
10
12
  instruction: {
11
13
  async act(page, _in, mem) {
@@ -18,6 +20,5 @@ export const SetHeadersBlock = defineMethodBlock<HoppscotchRest, HoppscotchRest>
18
20
  await page.keyboard.type(value);
19
21
  }
20
22
  },
21
- resolve: () => checkpoint("HoppscotchRest"),
22
23
  },
23
24
  });
@@ -1,6 +1,6 @@
1
- import { defineMethodBlock, checkpoint } from "waygraph";
2
- import type { HoppscotchRest } from "../../../../states/demo.states.js";
3
- import { RequestBody } from "../../../../states/demo.mem-keys.js";
1
+ import { defineMethodBlock } from "waygraph";
2
+ import { HoppscotchRest } from "../_states.js";
3
+ import { RequestBody } from "../_keys.js";
4
4
  import { HoppscotchSel } from "../_sel.js";
5
5
 
6
6
  const spansLines = (text: string): boolean => {
@@ -11,9 +11,11 @@ const spansLines = (text: string): boolean => {
11
11
  }
12
12
  };
13
13
 
14
- export const SetJsonBodyBlock = defineMethodBlock<HoppscotchRest, HoppscotchRest>({
14
+ export const SetJsonBodyBlock = defineMethodBlock({
15
15
  name: "set-json-body",
16
16
  description: "Sets the content type to application/json and types the mem-supplied body, prettified.",
17
+ from: HoppscotchRest,
18
+ to: HoppscotchRest,
17
19
  requires: [RequestBody],
18
20
  instruction: {
19
21
  async act(page, _in, mem) {
@@ -31,6 +33,5 @@ export const SetJsonBodyBlock = defineMethodBlock<HoppscotchRest, HoppscotchRest
31
33
  throw new Error("set-json-body: Hoppscotch's Prettify button was not found, so the body stayed on one line");
32
34
  }
33
35
  },
34
- resolve: () => checkpoint("HoppscotchRest"),
35
36
  },
36
37
  });
@@ -1,17 +1,18 @@
1
- import { defineMethodBlock, checkpoint } from "waygraph";
2
- import type { HoppscotchRest } from "../../../../states/demo.states.js";
3
- import { RequestMethod } from "../../../../states/demo.mem-keys.js";
1
+ import { defineMethodBlock } from "waygraph";
2
+ import { HoppscotchRest } from "../_states.js";
3
+ import { RequestMethod } from "../_keys.js";
4
4
  import { HoppscotchSel } from "../_sel.js";
5
5
 
6
- export const SetMethodBlock = defineMethodBlock<HoppscotchRest, HoppscotchRest>({
6
+ export const SetMethodBlock = defineMethodBlock({
7
7
  name: "set-method",
8
8
  description: "Picks the HTTP method (GET, POST, PUT, PATCH, DELETE, ...) from the request bar.",
9
+ from: HoppscotchRest,
10
+ to: HoppscotchRest,
9
11
  requires: [RequestMethod],
10
12
  instruction: {
11
13
  async act(page, _in, mem) {
12
14
  await page.locator(HoppscotchSel.methodInput).click();
13
15
  await page.locator(HoppscotchSel.menuItem(mem.get(RequestMethod))).click();
14
16
  },
15
- resolve: () => checkpoint("HoppscotchRest"),
16
17
  },
17
18
  });
@@ -1,11 +1,13 @@
1
- import { defineMethodBlock, checkpoint } from "waygraph";
2
- import type { HoppscotchRest } from "../../../../states/demo.states.js";
3
- import { RequestParams } from "../../../../states/demo.mem-keys.js";
1
+ import { defineMethodBlock } from "waygraph";
2
+ import { HoppscotchRest } from "../_states.js";
3
+ import { RequestParams } from "../_keys.js";
4
4
  import { HoppscotchSel } from "../_sel.js";
5
5
 
6
- export const SetQueryParamsBlock = defineMethodBlock<HoppscotchRest, HoppscotchRest>({
6
+ export const SetQueryParamsBlock = defineMethodBlock({
7
7
  name: "set-query-params",
8
8
  description: "Adds each mem-supplied query parameter (name -> value) on the Parameters tab.",
9
+ from: HoppscotchRest,
10
+ to: HoppscotchRest,
9
11
  requires: [RequestParams],
10
12
  instruction: {
11
13
  async act(page, _in, mem) {
@@ -17,6 +19,5 @@ export const SetQueryParamsBlock = defineMethodBlock<HoppscotchRest, HoppscotchR
17
19
  await page.keyboard.type(value);
18
20
  }
19
21
  },
20
- resolve: () => checkpoint("HoppscotchRest"),
21
22
  },
22
23
  });
@@ -1,11 +1,13 @@
1
- import { defineMethodBlock, checkpoint } from "waygraph";
2
- import type { HoppscotchRest } from "../../../../states/demo.states.js";
3
- import { RequestUrl } from "../../../../states/demo.mem-keys.js";
1
+ import { defineMethodBlock } from "waygraph";
2
+ import { HoppscotchRest } from "../_states.js";
3
+ import { RequestUrl } from "../_keys.js";
4
4
  import { HoppscotchSel } from "../_sel.js";
5
5
 
6
- export const SetUrlBlock = defineMethodBlock<HoppscotchRest, HoppscotchRest>({
6
+ export const SetUrlBlock = defineMethodBlock({
7
7
  name: "set-url",
8
8
  description: "Types the request URL into the request bar.",
9
+ from: HoppscotchRest,
10
+ to: HoppscotchRest,
9
11
  requires: [RequestUrl],
10
12
  instruction: {
11
13
  async act(page, _in, mem) {
@@ -13,6 +15,5 @@ export const SetUrlBlock = defineMethodBlock<HoppscotchRest, HoppscotchRest>({
13
15
  await page.keyboard.press("Control+A");
14
16
  await page.keyboard.type(mem.get(RequestUrl));
15
17
  },
16
- resolve: () => checkpoint("HoppscotchRest"),
17
18
  },
18
19
  });
@@ -1,10 +1,10 @@
1
1
  import { defineNavBlock, Trait } from "waygraph";
2
- import type { HoppscotchRest } from "../../../states/demo.states.js";
2
+ import { HoppscotchRest } from "./_states.js";
3
3
  import { HoppscotchSel } from "./_sel.js";
4
4
 
5
- export const NavHoppscotchRestBlock = defineNavBlock<HoppscotchRest>({
5
+ export const NavHoppscotchRestBlock = defineNavBlock({
6
6
  name: "nav-hoppscotch-rest",
7
- checkpoint: "HoppscotchRest",
7
+ checkpoint: HoppscotchRest,
8
8
  // Cross-origin, so a function: the Map folder rule only checks static URLs.
9
9
  url: () => "https://hoppscotch.io/",
10
10
  verify: [Trait.visible(HoppscotchSel.send)],
@@ -1,5 +1,5 @@
1
1
  import { definePageBlock, Trait } from "waygraph";
2
- import type { HoppscotchRest } from "../../../states/demo.states.js";
2
+ import { HoppscotchRest } from "./_states.js";
3
3
  import { SetMethodBlock } from "./_methods/set-method.method.block.js";
4
4
  import { SetUrlBlock } from "./_methods/set-url.method.block.js";
5
5
  import { SetHeadersBlock } from "./_methods/set-headers.method.block.js";
@@ -14,10 +14,10 @@ import { ReadResponseHeadersBlock } from "./_methods/read-response-headers.metho
14
14
  import { AssertResponseHeaderBlock } from "./_methods/assert-response-header.method.block.js";
15
15
  import { HoppscotchSel } from "./_sel.js";
16
16
 
17
- export const HoppscotchRestPageBlock = definePageBlock<HoppscotchRest>({
17
+ export const HoppscotchRestPageBlock = definePageBlock({
18
18
  name: "page-hoppscotch-rest",
19
19
  description: "Hoppscotch REST client - build a request, send it, check the response.",
20
- checkpoint: "HoppscotchRest",
20
+ checkpoint: HoppscotchRest,
21
21
  verify: [Trait.visible(HoppscotchSel.send)],
22
22
  methods: {
23
23
  setMethod: () => SetMethodBlock,
@@ -0,0 +1,6 @@
1
+ import { checkpoint } from "waygraph";
2
+
3
+ export const HoppscotchSettings = checkpoint("HoppscotchSettings");
4
+ export type HoppscotchSettings = typeof HoppscotchSettings;
5
+ export const HoppscotchRest = checkpoint("HoppscotchRest");
6
+ export type HoppscotchRest = typeof HoppscotchRest;
@@ -1,10 +1,10 @@
1
1
  import { defineNavBlock, Trait } from "waygraph";
2
- import type { HoppscotchSettings } from "../../../../states/demo.states.js";
2
+ import { HoppscotchSettings } from "../_states.js";
3
3
  import { HoppscotchSel } from "../_sel.js";
4
4
 
5
- export const NavHoppscotchSettingsBlock = defineNavBlock<HoppscotchSettings>({
5
+ export const NavHoppscotchSettingsBlock = defineNavBlock({
6
6
  name: "nav-hoppscotch-settings",
7
- checkpoint: "HoppscotchSettings",
7
+ checkpoint: HoppscotchSettings,
8
8
  url: () => "https://hoppscotch.io/settings",
9
9
  verify: [Trait.visible(HoppscotchSel.interceptorHeading)],
10
10
  });
@@ -0,0 +1,13 @@
1
+ import { key, keyGroup } from "waygraph";
2
+
3
+ /** The link read out of the opened message - set by extract-email-link. */
4
+ export const EmailLink = keyGroup<{ url: string }>("mailpit.emailLink");
5
+
6
+ /** Matched by email, not inbox position, so one inbox can hold several recipients' mail. */
7
+ export const ExpectedRecipient = keyGroup<{ email: string }>("mailpit.expectedRecipient");
8
+
9
+ /** Substring the link's `href` must contain; mem varies per scenario, the Blocks do not. */
10
+ export const ExpectedLinkPattern = key<string>("mailpit.expectedLinkPattern");
11
+
12
+ /** Substring the open message's body must contain. */
13
+ export const ExpectedEmailContent = key<string>("mailpit.expectedEmailContent");
@@ -1,6 +1,6 @@
1
1
  import { defineAssertBlock, type Trait } from "waygraph";
2
- import type { MailpitMessageOpen } from "../../../../states/demo.states.js";
3
- import { ExpectedEmailContent } from "../../../../states/demo.mem-keys.js";
2
+ import { MailpitMessageOpen } from "../_states.js";
3
+ import { ExpectedEmailContent } from "../_keys.js";
4
4
  import { MailpitSel } from "../_sel.js";
5
5
 
6
6
  // Reads the expected copy from mem, so one Block serves any email template.
@@ -14,10 +14,10 @@ const bodyContainsExpectedText: Trait = {
14
14
  };
15
15
 
16
16
  /** The open message says what the scenario expects (copy comes from mem). */
17
- export const AssertEmailContentBlock = defineAssertBlock<MailpitMessageOpen>({
17
+ export const AssertEmailContentBlock = defineAssertBlock({
18
18
  name: "assert-email-content",
19
19
  description: "Confirms the open message's body contains the mem-supplied expected copy.",
20
- checkpoint: "MailpitMessageOpen",
20
+ checkpoint: MailpitMessageOpen,
21
21
  requires: [ExpectedEmailContent],
22
22
  verify: [bodyContainsExpectedText],
23
23
  });
@@ -1,6 +1,6 @@
1
1
  import { defineAssertBlock, type Trait } from "waygraph";
2
- import type { MailpitInbox } from "../../../../states/demo.states.js";
3
- import { ExpectedRecipient } from "../../../../states/demo.mem-keys.js";
2
+ import { MailpitInbox } from "../_states.js";
3
+ import { ExpectedRecipient } from "../_keys.js";
4
4
  import { MailpitSel } from "../_sel.js";
5
5
 
6
6
  // Mem-aware: which recipient to look for is only known at run time.
@@ -21,10 +21,10 @@ const emailReceived: Trait = {
21
21
  };
22
22
 
23
23
  /** A message for the expected recipient has arrived; nothing is opened or consumed. */
24
- export const AssertEmailReceivedBlock = defineAssertBlock<MailpitInbox>({
24
+ export const AssertEmailReceivedBlock = defineAssertBlock({
25
25
  name: "assert-email-received",
26
26
  description: "Confirms a message addressed to the expected recipient has arrived.",
27
- checkpoint: "MailpitInbox",
27
+ checkpoint: MailpitInbox,
28
28
  requires: [ExpectedRecipient.key],
29
29
  verify: [emailReceived],
30
30
  });
@@ -1,12 +1,14 @@
1
- import { defineMethodBlock, checkpoint } from "waygraph";
2
- import type { MailpitMessageOpen } from "../../../../states/demo.states.js";
3
- import { EmailLink, ExpectedLinkPattern } from "../../../../states/demo.mem-keys.js";
1
+ import { defineMethodBlock } from "waygraph";
2
+ import { MailpitMessageOpen } from "../_states.js";
3
+ import { EmailLink, ExpectedLinkPattern } from "../_keys.js";
4
4
  import { MailpitSel } from "../_sel.js";
5
5
 
6
6
  /** Reads the link matching `ExpectedLinkPattern` out of the preview into mem; going there is a separate Nav. */
7
- export const ExtractEmailLinkBlock = defineMethodBlock<MailpitMessageOpen, MailpitMessageOpen>({
7
+ export const ExtractEmailLinkBlock = defineMethodBlock({
8
8
  name: "extract-email-link",
9
9
  description: "Reads the link matching the mem-supplied pattern out of the open message's preview.",
10
+ from: MailpitMessageOpen,
11
+ to: MailpitMessageOpen,
10
12
  requires: [ExpectedLinkPattern],
11
13
  instruction: {
12
14
  async act(page, _in, mem) {
@@ -18,6 +20,5 @@ export const ExtractEmailLinkBlock = defineMethodBlock<MailpitMessageOpen, Mailp
18
20
  if (!href) throw new Error(`extract-email-link: no link matching "${pattern}" in message preview`);
19
21
  mem.set(EmailLink({ url: href }));
20
22
  },
21
- resolve: () => checkpoint("MailpitMessageOpen"),
22
23
  },
23
24
  });
@@ -1,13 +1,15 @@
1
1
  // waygraph-ignore: empty-verify (confirmed by AssertEmailContentBlock right after it in mail-verify.flow.ts)
2
- import { defineMethodBlock, checkpoint } from "waygraph";
3
- import type { MailpitInbox, MailpitMessageOpen } from "../../../../states/demo.states.js";
4
- import { ExpectedRecipient } from "../../../../states/demo.mem-keys.js";
2
+ import { defineMethodBlock } from "waygraph";
3
+ import { MailpitInbox, MailpitMessageOpen } from "../_states.js";
4
+ import { ExpectedRecipient } from "../_keys.js";
5
5
  import { MailpitSel } from "../_sel.js";
6
6
 
7
7
  /** Opens the newest message for the expected recipient (matched by email, not position). */
8
- export const OpenMessageBlock = defineMethodBlock<MailpitInbox, MailpitMessageOpen>({
8
+ export const OpenMessageBlock = defineMethodBlock({
9
9
  name: "open-message",
10
10
  description: "Opens the newest message addressed to the expected recipient.",
11
+ from: MailpitInbox,
12
+ to: MailpitMessageOpen,
11
13
  requires: [ExpectedRecipient.key],
12
14
  instruction: {
13
15
  async act(page, _in, mem) {
@@ -25,6 +27,5 @@ export const OpenMessageBlock = defineMethodBlock<MailpitInbox, MailpitMessageOp
25
27
  timeout: 15_000,
26
28
  });
27
29
  },
28
- resolve: () => checkpoint("MailpitMessageOpen"),
29
30
  },
30
31
  });
@@ -1,12 +1,12 @@
1
1
  import { defineNavBlock, Trait } from "waygraph";
2
- import type { MailpitInbox } from "../../../states/demo.states.js";
2
+ import { MailpitInbox } from "./_states.js";
3
3
 
4
4
  // Cross-origin, so it lives under (external)/ and the URL is a function.
5
5
  const mailpitUrl = (): string => process.env.WAYGRAPH_MAIL_URL ?? "http://127.0.0.1:8025";
6
6
 
7
- export const NavMailpitInboxBlock = defineNavBlock<MailpitInbox>({
7
+ export const NavMailpitInboxBlock = defineNavBlock({
8
8
  name: "nav-mailpit-inbox",
9
- checkpoint: "MailpitInbox",
9
+ checkpoint: MailpitInbox,
10
10
  url: mailpitUrl,
11
11
  verify: [Trait.url({ pathname: "/" })],
12
12
  });
@@ -1,14 +1,14 @@
1
1
  import { definePageBlock, Trait } from "waygraph";
2
- import type { MailpitInbox } from "../../../states/demo.states.js";
2
+ import { MailpitInbox } from "./_states.js";
3
3
  import { AssertEmailReceivedBlock } from "./_methods/assert-email-received.method.block.js";
4
4
  import { OpenMessageBlock } from "./_methods/open-message.method.block.js";
5
5
  import { AssertEmailContentBlock } from "./_methods/assert-email-content.method.block.js";
6
6
  import { ExtractEmailLinkBlock } from "./_methods/extract-email-link.method.block.js";
7
7
 
8
- export const MailpitInboxPageBlock = definePageBlock<MailpitInbox>({
8
+ export const MailpitInboxPageBlock = definePageBlock({
9
9
  name: "page-mailpit-inbox",
10
10
  description: "Mailpit dev inbox hub - confirm arrival/content, open the expected message, read its link.",
11
- checkpoint: "MailpitInbox",
11
+ checkpoint: MailpitInbox,
12
12
  verify: [Trait.url({ pathname: "/" })],
13
13
  methods: {
14
14
  assertEmailReceived: () => AssertEmailReceivedBlock,
@@ -0,0 +1,9 @@
1
+ import { checkpoint } from "waygraph";
2
+
3
+ /** Mailpit inbox UI reached; message list visible. */
4
+ export const MailpitInbox = checkpoint("MailpitInbox");
5
+ export type MailpitInbox = typeof MailpitInbox;
6
+
7
+ /** The message addressed to the expected recipient is open; preview iframe visible. */
8
+ export const MailpitMessageOpen = checkpoint("MailpitMessageOpen");
9
+ export type MailpitMessageOpen = typeof MailpitMessageOpen;
@@ -24,6 +24,13 @@ real URL. `waygraph map`/`waygraph check` fail loudly if a page folder's real UR
24
24
  matching its own name - that's the point of this layout: drift becomes a build failure, not a
25
25
  silent surprise months later.
26
26
 
27
+ ## A group that owns its states: a map package
28
+
29
+ A folder with its own `_states.ts` (and `_keys.ts`), like `(external)/hoppscotch/`, is a self-contained map: its files
30
+ import only `waygraph` and each other (`waygraph check` warns otherwise). `waygraph map pack hoppscotch` compiles it into
31
+ `.waygraph/packages/hoppscotch` - publish that, `npm i` it in another project, and its Blocks show up there in `graph`,
32
+ `auto`, the manifest and flows (`import { SetUrlBlock } from "waygraph-map-hoppscotch"`).
33
+
27
34
  ## Adding a page
28
35
 
29
36
  Copy an existing page folder, keep the four fixed names, update `_nav`/`_page`/`_sel` for the
@@ -3,7 +3,7 @@
3
3
  Checkpoint types and Mem keys - the typed vocabulary every Block in `src/map/` is written
4
4
  against. Nothing here drives the browser; this is pure data shape.
5
5
 
6
- - `*.states.ts` - `type X = Checkpoint<"X">` declarations. One per real app state
6
+ - `*.states.ts` - Checkpoint values: `export const X = checkpoint("X"); export type X = typeof X;`. One per real app state
7
7
  (`LoginPage`, `LoggedIn`), never `Checkpoint<string>` (a wildcard - `waygraph check` warns
8
8
  on it; a Block should say exactly which states it moves between).
9
9
  - `*.mem-keys.ts` - `key<T>("...")` / `keyGroup<T>("...")` declarations. A Mem key stores a
@@ -13,3 +13,6 @@ against. Nothing here drives the browser; this is pure data shape.
13
13
 
14
14
  Add a new Checkpoint or Mem key here before writing the Block that needs it - Blocks import
15
15
  from this directory, this directory never imports from `src/map/`.
16
+
17
+ A tool on another origin (`src/map/(external)/mailpit/`, `.../hoppscotch/`) keeps its own Checkpoints and keys in its
18
+ folder (`_states.ts`, `_keys.ts`) instead, so the folder can be packed and reused: `waygraph map pack mailpit`.
@@ -1,32 +1,4 @@
1
- import { key, keyGroup } from "waygraph";
1
+ import { keyGroup } from "waygraph";
2
2
 
3
3
  /** The catalog row `add-item` / `remove-item` act on; `waygraph auto` fills it from `instanceOptions`. */
4
4
  export const SelectedItem = keyGroup<{ id: string; name: string }>("demo.selectedItem");
5
-
6
- /** The link read out of the opened message - set by extract-email-link. */
7
- export const EmailLink = keyGroup<{ url: string }>("demo.emailLink");
8
-
9
- /** Matched by email, not inbox position, so one inbox can hold several recipients' mail. */
10
- export const ExpectedRecipient = keyGroup<{ email: string }>("demo.expectedRecipient");
11
-
12
- /** Substring the link's `href` must contain; mem varies per scenario, the Blocks do not. */
13
- export const ExpectedLinkPattern = key<string>("demo.expectedLinkPattern");
14
-
15
- /** Substring the open message's body must contain. */
16
- export const ExpectedEmailContent = key<string>("demo.expectedEmailContent");
17
-
18
- export const RequestMethod = key<string>("demo.requestMethod");
19
- export const RequestUrl = key<string>("demo.requestUrl");
20
- export const RequestHeaders = key<Record<string, string>>("demo.requestHeaders");
21
- export const RequestParams = key<Record<string, string>>("demo.requestParams");
22
- export const RequestBearerToken = key<string>("demo.requestBearerToken");
23
- /** Raw JSON text typed into the request body editor. */
24
- export const RequestBody = key<string>("demo.requestBody");
25
- export const ExpectedStatus = key<number>("demo.expectedStatus");
26
- /** Substring the response body must contain. */
27
- export const ExpectedResponseText = key<string>("demo.expectedResponseText");
28
- /** The raw response body, set by read-response-body. */
29
- export const ResponseBody = key<string>("demo.responseBody");
30
- /** Response headers (lower-cased names), set by read-response-headers. */
31
- export const ResponseHeaders = key<Record<string, string>>("demo.responseHeaders");
32
- export const ExpectedResponseHeader = keyGroup<{ name: string; value: string }>("demo.expectedResponseHeader");
@@ -1,23 +1,17 @@
1
- import type { Checkpoint } from "waygraph";
1
+ import { checkpoint } from "waygraph";
2
2
 
3
- export type Home = Checkpoint<"Home">;
4
- export type HomeVerified = Checkpoint<"HomeVerified">;
5
- export type ItemInCart = Checkpoint<"ItemInCart">;
6
- export type CartEmpty = Checkpoint<"CartEmpty">;
7
- /** Anywhere an item can be added from: fresh on Home, or after the cart was emptied. */
8
- export type CanAddItem = Home | CartEmpty;
9
-
10
- // --- Mailpit (external tool surface, src/map/(external)/mailpit/) ---
11
-
12
- /** Mailpit inbox UI reached; message list visible. */
13
- export type MailpitInbox = Checkpoint<"MailpitInbox">;
3
+ export const Home = checkpoint("Home");
4
+ export type Home = typeof Home;
5
+ export const HomeVerified = checkpoint("HomeVerified");
6
+ export type HomeVerified = typeof HomeVerified;
7
+ export const ItemInCart = checkpoint("ItemInCart");
8
+ export type ItemInCart = typeof ItemInCart;
9
+ export const CartEmpty = checkpoint("CartEmpty");
10
+ export type CartEmpty = typeof CartEmpty;
14
11
 
15
- /** The message addressed to the expected recipient is open; preview iframe visible. */
16
- export type MailpitMessageOpen = Checkpoint<"MailpitMessageOpen">;
17
-
18
- // --- Hoppscotch (external API client, src/map/(external)/hoppscotch/) ---
19
-
20
- export type HoppscotchSettings = Checkpoint<"HoppscotchSettings">;
21
- export type HoppscotchRest = Checkpoint<"HoppscotchRest">;
12
+ /** Anywhere an item can be added from: fresh on Home, or after the cart was emptied. */
13
+ export const CanAddItem = [Home, CartEmpty] as const;
14
+ export type CanAddItem = (typeof CanAddItem)[number];
22
15
 
23
- export type Docs = Checkpoint<"Docs">;
16
+ export const Docs = checkpoint("Docs");
17
+ export type Docs = typeof Docs;
@@ -5,17 +5,7 @@ import config from "../config/waygraph.config.js";
5
5
  import { hoppscotchGetFlow } from "../src/flows/(external)/hoppscotch/get.flow.js";
6
6
  import { hoppscotchAuthFlow } from "../src/flows/(external)/hoppscotch/auth.flow.js";
7
7
  import { hoppscotchPostFlow } from "../src/flows/(external)/hoppscotch/post.flow.js";
8
- import {
9
- ExpectedResponseHeader,
10
- ExpectedResponseText,
11
- ExpectedStatus,
12
- RequestBearerToken,
13
- RequestBody,
14
- RequestHeaders,
15
- RequestMethod,
16
- RequestParams,
17
- RequestUrl,
18
- } from "../src/states/demo.mem-keys.js";
8
+ import { ExpectedResponseHeader, ExpectedResponseText, ExpectedStatus, RequestBearerToken, RequestBody, RequestHeaders, RequestMethod, RequestParams, RequestUrl } from "../src/map/(external)/hoppscotch/_keys.js";
19
9
 
20
10
  // The API under test: no CORS headers, so only the extension can reach it from hoppscotch.io.
21
11
  let server: Server;
@@ -3,7 +3,7 @@ import { spawnSync } from "node:child_process";
3
3
  import net from "node:net";
4
4
  import { MemPage, checkpoint } from "waygraph";
5
5
  import { emailVerificationFlow } from "../src/flows/(user-stories)/email-verification.flow.js";
6
- import { ExpectedRecipient, ExpectedLinkPattern, ExpectedEmailContent } from "../src/states/demo.mem-keys.js";
6
+ import { ExpectedRecipient, ExpectedLinkPattern, ExpectedEmailContent } from "../src/map/(external)/mailpit/_keys.js";
7
7
  import { HOME_URL } from "../src/map/(app_base)/home/_sel.js";
8
8
 
9
9
  // Plays "the app sent a verification email": starts a throwaway Mailpit container, sends a real SMTP message,
@@ -144,7 +144,7 @@ test("assert-email-received fails loud, naming itself, when no email ever arrive
144
144
  mem.set(ExpectedRecipient({ email: "nobody-sent-this-one@example.com" }));
145
145
  mem.set(ExpectedLinkPattern, "verified=1");
146
146
  mem.set(ExpectedEmailContent, VERIFICATION_CONTENT);
147
- // A defineFlow chain's verify-failure error names the whole path taken so
147
+ // A flow's verify-failure error names the whole path taken so
148
148
  // far (each composed Block's own name accumulates through connect()),
149
149
  // not just the leaf Block - real, useful QA context, not a bug - so this
150
150
  // matches the accumulated name ending at assert-email-received, not an
@@ -52,12 +52,8 @@ Session control works as `browser …` or `auto …` with the same `<sessionId>`
52
52
  Block file can simply vanish from the graph with no error printed anywhere obvious - if a
53
53
  Block you just wrote doesn't show up after `browser reload`, check `waygraph graph`'s own
54
54
  `skipped` list and the file's syntax directly, don't assume it just needs more time.
55
- - **`defineAssertBlock` needs no `<In, Out>` generic to type-check** (`checkpoint: "X"` alone
56
- is enough for TypeScript to infer it) - but older/naive static-graph discovery logic may
57
- rely on parsing an explicit generic from source text. If a freshly-written
58
- `defineAssertBlock` Block is missing from `waygraph graph`'s edges (silently, no error),
59
- check whether this package's own `graph.ts` has the matching-marker fix for it, or add an
60
- explicit generic type argument as a workaround.
55
+ - **Pass Checkpoint values** (`checkpoint: X`, `from: X, to: Y`) so a freshly-written Block shows up in the graph from its
56
+ runtime route. The graph reads routes at runtime, never from source text.
61
57
  - **A `<p>`/text-based selector often needs scoping**, not just a class name - a sibling
62
58
  "chat list item" and "message preview" frequently share the exact same CSS classes in real
63
59
  apps, distinguished only by DOM position (first vs second child of a specific wrapper).