waygraph 0.15.54 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (510) hide show
  1. package/README.md +8 -3
  2. package/bin/waygraph +2 -2
  3. package/dist/analysis/check.d.ts +38 -0
  4. package/dist/analysis/check.js +87 -0
  5. package/dist/analysis/coverage-gap.d.ts +1 -1
  6. package/dist/analysis/coverage-gap.js +14 -37
  7. package/dist/analysis/flow-source.d.ts +9 -0
  8. package/dist/analysis/flow-source.js +25 -0
  9. package/dist/analysis/graph.d.ts +10 -14
  10. package/dist/analysis/graph.js +48 -371
  11. package/dist/analysis/map-check.js +4 -39
  12. package/dist/analysis/practices-check.d.ts +1 -1
  13. package/dist/analysis/practices-check.js +24 -45
  14. package/dist/cli/args.d.ts +23 -0
  15. package/dist/cli/args.js +20 -0
  16. package/dist/{cli.d.ts → cli/cli.d.ts} +0 -1
  17. package/dist/{cli.js → cli/cli.js} +10 -9
  18. package/dist/{commands → cli/commands}/agent-dive-scaffold.js +35 -64
  19. package/dist/cli/commands/agent-dive.js +42 -0
  20. package/dist/{commands → cli/commands}/check.d.ts +0 -1
  21. package/dist/cli/commands/check.js +104 -0
  22. package/dist/cli/commands/codemod-checkpoints.d.ts +18 -0
  23. package/dist/cli/commands/codemod-checkpoints.js +186 -0
  24. package/dist/cli/commands/codemod-flows.d.ts +18 -0
  25. package/dist/cli/commands/codemod-flows.js +284 -0
  26. package/dist/cli/commands/codemod-stubs.d.ts +10 -0
  27. package/dist/cli/commands/codemod-stubs.js +187 -0
  28. package/dist/{commands → cli/commands}/extensions.js +5 -4
  29. package/dist/{commands → cli/commands}/init.js +1 -2
  30. package/dist/{commands → cli/commands}/list.js +9 -7
  31. package/dist/cli/commands/manifest.d.ts +2 -0
  32. package/dist/cli/commands/manifest.js +20 -0
  33. package/dist/cli/commands/map.js +57 -0
  34. package/dist/{commands → cli/commands}/run.d.ts +0 -1
  35. package/dist/cli/commands/run.js +64 -0
  36. package/dist/{commands → cli/commands}/session.js +61 -88
  37. package/dist/{commands → cli/commands}/test.js +11 -14
  38. package/dist/cli/commands/traverse.js +105 -0
  39. package/dist/{commands → cli/commands}/try.js +29 -25
  40. package/dist/{commands → cli/commands}/upgrade.js +40 -4
  41. package/dist/cli/flags.d.ts +193 -16
  42. package/dist/cli/flags.js +179 -234
  43. package/dist/cli/run-chain.d.ts +1 -0
  44. package/dist/cli/run-chain.js +42 -7
  45. package/dist/cli/usage.d.ts +1 -1
  46. package/dist/cli/usage.js +21 -53
  47. package/dist/cli/util.d.ts +2 -2
  48. package/dist/cli/util.js +2 -3
  49. package/dist/{highlights → demo/narration}/css.d.ts +1 -1
  50. package/dist/{highlights → demo/narration}/css.js +2 -3
  51. package/dist/{highlights → demo/narration}/demo-pace.d.ts +3 -11
  52. package/dist/{highlights → demo/narration}/demo-pace.js +5 -11
  53. package/dist/{highlights → demo/narration}/device.d.ts +2 -2
  54. package/dist/{highlights → demo/narration}/device.js +1 -1
  55. package/dist/demo/narration/merge.d.ts +8 -0
  56. package/dist/demo/narration/merge.js +71 -0
  57. package/dist/{highlights/run-phase.d.ts → demo/narration/narration.d.ts} +10 -14
  58. package/dist/{highlights/run-phase.js → demo/narration/narration.js} +25 -94
  59. package/dist/{highlights → demo/narration}/shorthand.d.ts +1 -1
  60. package/dist/demo/narration/stub-ctx.d.ts +8 -0
  61. package/dist/demo/narration/stub-ctx.js +164 -0
  62. package/dist/{highlights → demo/narration}/style.d.ts +1 -7
  63. package/dist/{highlights → demo/narration}/style.js +1 -41
  64. package/dist/{highlights → demo/narration}/todo-dock.d.ts +3 -3
  65. package/dist/{highlights → demo/narration}/todo-dock.js +13 -30
  66. package/dist/demo/overlay/auto-chrome.d.ts +7 -0
  67. package/dist/demo/overlay/auto-chrome.js +97 -0
  68. package/dist/demo/overlay/cursor.d.ts +12 -0
  69. package/dist/demo/overlay/cursor.js +142 -0
  70. package/dist/demo/overlay/device-stage.d.ts +13 -0
  71. package/dist/demo/overlay/device-stage.js +396 -0
  72. package/dist/demo/overlay/inpage/banner.d.ts +1 -0
  73. package/dist/demo/overlay/inpage/banner.js +160 -0
  74. package/dist/demo/overlay/inpage/caption.d.ts +2 -0
  75. package/dist/demo/overlay/inpage/caption.js +24 -0
  76. package/dist/demo/overlay/inpage/core.d.ts +1 -0
  77. package/dist/demo/overlay/inpage/core.js +345 -0
  78. package/dist/demo/overlay/inpage/device-chip.d.ts +1 -0
  79. package/dist/demo/overlay/inpage/device-chip.js +191 -0
  80. package/dist/demo/overlay/inpage/network.d.ts +9 -0
  81. package/dist/demo/overlay/inpage/network.js +200 -0
  82. package/dist/demo/overlay/inpage/panel-chrome.d.ts +1 -0
  83. package/dist/demo/overlay/inpage/panel-chrome.js +203 -0
  84. package/dist/demo/overlay/inpage/stamp.d.ts +1 -0
  85. package/dist/demo/overlay/inpage/stamp.js +46 -0
  86. package/dist/demo/overlay/inpage/swipe-zoom.d.ts +1 -0
  87. package/dist/demo/overlay/inpage/swipe-zoom.js +220 -0
  88. package/dist/demo/overlay/inpage/todos.d.ts +1 -0
  89. package/dist/demo/overlay/inpage/todos.js +294 -0
  90. package/dist/demo/overlay/locator-theater.d.ts +25 -0
  91. package/dist/demo/overlay/locator-theater.js +76 -0
  92. package/dist/demo/overlay/network-capture.d.ts +22 -0
  93. package/dist/demo/overlay/network-capture.js +127 -0
  94. package/dist/demo/overlay/overlay-css.d.ts +3 -0
  95. package/dist/demo/overlay/overlay-css.js +369 -0
  96. package/dist/demo/overlay/overlay-stage.d.ts +23 -0
  97. package/dist/demo/overlay/overlay-stage.js +106 -0
  98. package/dist/demo/overlay/overlay.d.ts +10 -0
  99. package/dist/demo/overlay/overlay.js +89 -0
  100. package/dist/{pilot-overlay/overlay-fixtures.d.ts → demo/overlay/phase-fixtures.d.ts} +2 -2
  101. package/dist/{pilot-overlay/overlay-fixtures.js → demo/overlay/phase-fixtures.js} +2 -2
  102. package/dist/{pilot-overlay/action-ring.js → demo/overlay/pilot/actions.js} +2 -1
  103. package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.d.ts +6 -5
  104. package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.js +19 -18
  105. package/dist/{pilot-overlay → demo/overlay/pilot}/shell.d.ts +2 -2
  106. package/dist/{pilot-overlay → demo/overlay/pilot}/shell.js +13 -22
  107. package/dist/demo/overlay/reattach.d.ts +7 -0
  108. package/dist/demo/overlay/reattach.js +23 -0
  109. package/dist/demo/overlay/rings.d.ts +33 -0
  110. package/dist/demo/overlay/rings.js +448 -0
  111. package/dist/{ui → demo/overlay/ui}/components/ring.js +2 -2
  112. package/dist/{ui → demo/overlay/ui}/overlay.css +4 -4
  113. package/dist/{ui → demo/overlay/ui}/shadow.d.ts +1 -1
  114. package/dist/{ui → demo/overlay/ui}/shadow.js +39 -2
  115. package/dist/demo/stepper/after.d.ts +3 -0
  116. package/dist/demo/stepper/after.js +113 -0
  117. package/dist/demo/stepper/banner-log.d.ts +37 -0
  118. package/dist/demo/stepper/banner-log.js +63 -0
  119. package/dist/demo/stepper/before.d.ts +4 -0
  120. package/dist/demo/stepper/before.js +110 -0
  121. package/dist/demo/stepper/demo-log.d.ts +31 -0
  122. package/dist/demo/stepper/demo-log.js +309 -0
  123. package/dist/demo/stepper/gate.d.ts +11 -0
  124. package/dist/demo/stepper/gate.js +78 -0
  125. package/dist/demo/stepper/interaction-patch.d.ts +3 -0
  126. package/dist/demo/stepper/interaction-patch.js +323 -0
  127. package/dist/demo/stepper/pacing.d.ts +21 -0
  128. package/dist/demo/stepper/pacing.js +23 -0
  129. package/dist/demo/stepper/slides.d.ts +11 -0
  130. package/dist/demo/stepper/slides.js +233 -0
  131. package/dist/demo/stepper/step-panels.d.ts +21 -0
  132. package/dist/demo/stepper/step-panels.js +589 -0
  133. package/dist/demo/stepper/stepper.d.ts +24 -0
  134. package/dist/demo/stepper/stepper.js +122 -0
  135. package/dist/demo/stepper/teardown.d.ts +48 -0
  136. package/dist/demo/stepper/teardown.js +179 -0
  137. package/dist/demo/stepper/todo-advance.d.ts +14 -0
  138. package/dist/demo/stepper/todo-advance.js +110 -0
  139. package/dist/demo/stepper/view.d.ts +68 -0
  140. package/dist/demo/stepper/view.js +31 -0
  141. package/dist/demo/types.d.ts +17 -0
  142. package/dist/demo/verbose-log.js +15 -0
  143. package/dist/{types.d.ts → engine/block/block.d.ts} +106 -91
  144. package/dist/{core → engine/block}/block.js +10 -53
  145. package/dist/{core → engine/block}/compose.d.ts +9 -7
  146. package/dist/{core → engine/block}/compose.js +1 -1
  147. package/dist/{core/blocks → engine/block/kinds}/api.d.ts +16 -12
  148. package/dist/{core/blocks → engine/block/kinds}/api.js +26 -18
  149. package/dist/{core/blocks → engine/block/kinds}/effect.d.ts +13 -18
  150. package/dist/engine/block/kinds/effect.js +17 -0
  151. package/dist/{core/blocks → engine/block/kinds}/method.d.ts +17 -29
  152. package/dist/{core/blocks → engine/block/kinds}/method.js +6 -21
  153. package/dist/{core/blocks → engine/block/kinds}/nav.d.ts +21 -31
  154. package/dist/{core/blocks → engine/block/kinds}/nav.js +6 -12
  155. package/dist/{core/blocks → engine/block/kinds}/page.d.ts +14 -20
  156. package/dist/{core/blocks → engine/block/kinds}/page.js +5 -7
  157. package/dist/engine/checkpoint/checkpoint.d.ts +22 -0
  158. package/dist/engine/checkpoint/checkpoint.js +8 -0
  159. package/dist/engine/checkpoint/route.d.ts +28 -0
  160. package/dist/engine/checkpoint/route.js +28 -0
  161. package/dist/{core → engine}/config.d.ts +7 -2
  162. package/dist/engine/config.js +6 -0
  163. package/dist/engine/engine.d.ts +45 -0
  164. package/dist/{core → engine}/engine.js +6 -10
  165. package/dist/engine/env.d.ts +59 -0
  166. package/dist/engine/env.js +83 -0
  167. package/dist/{errors.d.ts → engine/errors.d.ts} +22 -22
  168. package/dist/{errors.js → engine/errors.js} +22 -22
  169. package/dist/{core → engine/flow}/branch-regression.d.ts +7 -7
  170. package/dist/{core → engine/flow}/branch-regression.js +4 -3
  171. package/dist/engine/flow/flow.d.ts +162 -0
  172. package/dist/engine/flow/flow.js +244 -0
  173. package/dist/{core → engine/flow}/map-builder.d.ts +34 -39
  174. package/dist/{core → engine/flow}/map-builder.js +45 -47
  175. package/dist/{core → engine}/locate.d.ts +1 -1
  176. package/dist/{core → engine}/locate.js +1 -2
  177. package/dist/{mem-stub.d.ts → engine/mem/mem-stub.d.ts} +9 -8
  178. package/dist/{mem-stub.js → engine/mem/mem-stub.js} +2 -2
  179. package/dist/{mem-page.d.ts → engine/mem/mem.d.ts} +1 -1
  180. package/dist/{mem-page.js → engine/mem/mem.js} +2 -1
  181. package/dist/engine/page-gone.d.ts +5 -0
  182. package/dist/engine/page-gone.js +20 -0
  183. package/dist/engine/run/connect.d.ts +28 -0
  184. package/dist/{types.js → engine/run/connect.js} +11 -10
  185. package/dist/engine/run/events.d.ts +67 -0
  186. package/dist/engine/run/events.js +90 -0
  187. package/dist/engine/run/hooks.d.ts +16 -0
  188. package/dist/engine/run/hooks.js +8 -0
  189. package/dist/engine/run/launch.d.ts +13 -0
  190. package/dist/engine/run/launch.js +27 -0
  191. package/dist/{core/run-graph.d.ts → engine/run/run.d.ts} +8 -12
  192. package/dist/{core/run-graph.js → engine/run/run.js} +22 -12
  193. package/dist/engine/stub/pace.d.ts +12 -0
  194. package/dist/engine/stub/pace.js +2 -0
  195. package/dist/engine/stub/ring.d.ts +130 -0
  196. package/dist/engine/stub/ring.js +41 -0
  197. package/dist/engine/stub/stub.d.ts +268 -0
  198. package/dist/engine/stub/stub.js +1 -0
  199. package/dist/engine/stub/todos.d.ts +104 -0
  200. package/dist/engine/stub/todos.js +2 -0
  201. package/dist/engine/stub/viewport.d.ts +26 -0
  202. package/dist/engine/stub/viewport.js +2 -0
  203. package/dist/{trait.d.ts → engine/trait/trait.d.ts} +1 -1
  204. package/dist/index.d.ts +84 -36
  205. package/dist/index.js +44 -19
  206. package/dist/{session/auto-explore-run.d.ts → live/auto/auto.d.ts} +10 -16
  207. package/dist/{session/auto-explore-run.js → live/auto/auto.js} +164 -254
  208. package/dist/{session/auto-explore.d.ts → live/auto/explore.d.ts} +4 -14
  209. package/dist/{session/auto-explore.js → live/auto/explore.js} +21 -127
  210. package/dist/{auto-session/session.d.ts → live/auto-session/auto-session.d.ts} +1 -1
  211. package/dist/{auto-session/session.js → live/auto-session/auto-session.js} +27 -24
  212. package/dist/{auto-session → live/auto-session}/helpers.d.ts +6 -5
  213. package/dist/{auto-session → live/auto-session}/helpers.js +1 -1
  214. package/dist/{session/auto-session-ipc.d.ts → live/auto-session/ipc.d.ts} +7 -5
  215. package/dist/{session/auto-session-ipc.js → live/auto-session/ipc.js} +31 -16
  216. package/dist/{session/browser.d.ts → live/auto-session/start.d.ts} +1 -2
  217. package/dist/{session/browser.js → live/auto-session/start.js} +2 -3
  218. package/dist/{pilot-overlay → live/pilot}/panel.d.ts +1 -1
  219. package/dist/{pilot-overlay → live/pilot}/panel.js +23 -31
  220. package/dist/{session → live/pilot}/pilot.d.ts +3 -3
  221. package/dist/{session → live/pilot}/pilot.js +4 -4
  222. package/dist/{traverse/run.d.ts → live/traverse/traverse.d.ts} +1 -1
  223. package/dist/{traverse/run.js → live/traverse/traverse.js} +26 -43
  224. package/dist/manifest/manifest.d.ts +52 -0
  225. package/dist/manifest/manifest.js +93 -0
  226. package/dist/manifest/map-imports.d.ts +7 -0
  227. package/dist/manifest/map-imports.js +22 -0
  228. package/dist/manifest/maps.d.ts +33 -0
  229. package/dist/manifest/maps.js +62 -0
  230. package/dist/manifest/pack.d.ts +21 -0
  231. package/dist/manifest/pack.js +109 -0
  232. package/dist/manifest/project.d.ts +60 -0
  233. package/dist/manifest/project.js +101 -0
  234. package/dist/{session/block-inject.js → manifest/roots.js} +1 -18
  235. package/dist/manifest/scan.d.ts +19 -0
  236. package/dist/manifest/scan.js +57 -0
  237. package/dist/manifest/source.d.ts +23 -0
  238. package/dist/manifest/source.js +86 -0
  239. package/dist/runner/mode.d.ts +71 -0
  240. package/dist/runner/mode.js +1 -0
  241. package/dist/runner/modes/branches.d.ts +5 -0
  242. package/dist/runner/modes/branches.js +37 -0
  243. package/dist/runner/modes/demo.d.ts +3 -0
  244. package/dist/runner/modes/demo.js +13 -0
  245. package/dist/runner/modes/report.d.ts +2 -0
  246. package/dist/runner/modes/report.js +54 -0
  247. package/dist/runner/modes/run.d.ts +2 -0
  248. package/dist/runner/modes/run.js +3 -0
  249. package/dist/runner/options.d.ts +31 -0
  250. package/dist/runner/options.js +42 -0
  251. package/dist/runner/plan/find.d.ts +18 -0
  252. package/dist/runner/plan/find.js +65 -0
  253. package/dist/runner/plan/plan.d.ts +11 -0
  254. package/dist/runner/plan/plan.js +97 -0
  255. package/dist/runner/plan/seed-mem.d.ts +12 -0
  256. package/dist/runner/plan/seed-mem.js +98 -0
  257. package/dist/runner/plan/spec.d.ts +5 -0
  258. package/dist/runner/plan/spec.js +17 -0
  259. package/dist/runner/play-steps.d.ts +2 -0
  260. package/dist/runner/play-steps.js +59 -0
  261. package/dist/runner/runner.d.ts +4 -0
  262. package/dist/runner/runner.js +64 -0
  263. package/dist/runner/session.d.ts +9 -0
  264. package/dist/runner/session.js +87 -0
  265. package/dist/{browser.js → runtime/browser.js} +4 -2
  266. package/dist/{env-file.js → runtime/env-file.js} +7 -12
  267. package/dist/{extensions.d.ts → runtime/extensions.d.ts} +1 -5
  268. package/dist/{extensions.js → runtime/extensions.js} +2 -1
  269. package/dist/runtime/full-launch.d.ts +1 -0
  270. package/dist/runtime/full-launch.js +34 -0
  271. package/dist/runtime/global-flag.d.ts +5 -0
  272. package/dist/runtime/global-flag.js +18 -0
  273. package/dist/{playwright-config.d.ts → runtime/playwright-config.d.ts} +1 -1
  274. package/dist/{playwright.config.js → runtime/playwright.config.js} +3 -2
  275. package/dist/runtime/run-log.d.ts +2 -0
  276. package/dist/runtime/run-log.js +17 -0
  277. package/dist/{video-dir.js → runtime/video-dir.js} +3 -2
  278. package/dist/{config.d.ts → runtime/waygraph-config.d.ts} +6 -9
  279. package/dist/{config.js → runtime/waygraph-config.js} +21 -51
  280. package/dist/{webserver.js → runtime/webserver.js} +5 -30
  281. package/examples/routed-demo/config/waygraph.config.ts +20 -0
  282. package/examples/routed-demo/package.json +1 -4
  283. package/examples/routed-demo/scripts/fixture-server.mjs +1 -1
  284. package/examples/routed-demo/src/flows/routed-demo-map.flow.ts +2 -4
  285. package/examples/routed-demo/src/flows/routed-demo.flow.ts +1 -2
  286. package/examples/routed-demo/src/map/(app_base)/dashboard/_methods/click-widget.block.ts +5 -4
  287. package/examples/routed-demo/src/map/(app_base)/dashboard/_nav.block.ts +3 -3
  288. package/examples/routed-demo/src/map/(app_base)/dashboard/_page.block.ts +3 -3
  289. package/examples/routed-demo/src/map/(external)/docs/_nav.block.ts +3 -3
  290. package/examples/routed-demo/src/map/(external)/docs/_page.block.ts +3 -3
  291. package/examples/routed-demo/src/states/routed-demo.states.ts +5 -3
  292. package/examples/routed-demo/tests/routed-demo.spec.ts +4 -4
  293. package/examples/routed-demo/tsconfig.json +1 -1
  294. package/examples/saucedemo/docs/CONVENTION.md +4 -5
  295. package/examples/saucedemo/docs/HELPERS.md +11 -11
  296. package/examples/saucedemo/src/blocks/SITE-MAP.md +0 -1
  297. package/examples/saucedemo/src/blocks/saucedemo-web/NAV.md +1 -5
  298. package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -3
  299. package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
  300. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
  301. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
  302. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
  303. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
  304. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +5 -8
  305. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -3
  306. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
  307. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +35 -43
  308. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
  309. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
  310. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
  311. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
  312. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
  313. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
  314. package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -4
  315. package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -4
  316. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +4 -5
  317. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
  318. package/examples/saucedemo/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
  319. package/examples/saucedemo/src/flows/api-demo.flow.ts +12 -10
  320. package/examples/saucedemo/src/states/checkout.states.ts +21 -11
  321. package/examples/saucedemo/src/stubs/device-showcase.ts +8 -10
  322. package/examples/saucedemo/tests/auto-graph.spec.ts +4 -12
  323. package/package.json +10 -6
  324. package/templates/agents/waygraph-planner.agent.md +2 -2
  325. package/templates/quickstart/docs/CONVENTION.md +4 -4
  326. package/templates/quickstart/docs/HELPERS.md +10 -8
  327. package/templates/quickstart/package.json +0 -3
  328. package/templates/quickstart/src/blocks/SITE-MAP.md +0 -1
  329. package/templates/quickstart/src/blocks/saucedemo-web/NAV.md +1 -5
  330. package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -3
  331. package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
  332. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
  333. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
  334. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
  335. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
  336. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +5 -8
  337. package/templates/quickstart/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -3
  338. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
  339. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +35 -43
  340. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
  341. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
  342. package/templates/quickstart/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
  343. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
  344. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
  345. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
  346. package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -4
  347. package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -4
  348. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +4 -5
  349. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
  350. package/templates/quickstart/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
  351. package/templates/quickstart/src/flows/api-demo.flow.ts +12 -10
  352. package/templates/quickstart/src/states/checkout.states.ts +21 -11
  353. package/templates/quickstart/src/stubs/device-showcase.ts +8 -10
  354. package/templates/scaffold/README.md +2 -1
  355. package/templates/scaffold/STRUCTURE.md +5 -4
  356. package/templates/scaffold/config/waygraph.config.ts +1 -0
  357. package/templates/scaffold/gitignore +1 -0
  358. package/templates/scaffold/src/flows/README.md +2 -2
  359. package/templates/scaffold/src/map/(app_base)/docs/_nav.block.ts +3 -3
  360. package/templates/scaffold/src/map/(app_base)/docs/_page.block.ts +3 -3
  361. package/templates/scaffold/src/map/(app_base)/home/_methods/add-item.effect.block.ts +4 -4
  362. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-hello.method.block.ts +3 -3
  363. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-item-added.method.block.ts +3 -3
  364. package/templates/scaffold/src/map/(app_base)/home/_methods/clear-cart.method.block.ts +5 -4
  365. package/templates/scaffold/src/map/(app_base)/home/_methods/remove-item.effect.block.ts +4 -4
  366. package/templates/scaffold/src/map/(app_base)/home/_nav.block.ts +3 -3
  367. package/templates/scaffold/src/map/(app_base)/home/_page.block.ts +3 -3
  368. package/templates/scaffold/src/map/(app_base)/home/nav-verification-link.block.ts +4 -4
  369. package/templates/scaffold/src/map/(external)/hoppscotch/_keys.ts +21 -0
  370. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-body.method.block.ts +4 -4
  371. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-header.method.block.ts +4 -4
  372. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-status.method.block.ts +4 -4
  373. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/pick-extension-interceptor.method.block.ts +5 -4
  374. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-body.method.block.ts +6 -5
  375. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-headers.method.block.ts +6 -5
  376. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/send-request.method.block.ts +5 -4
  377. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-bearer-token.method.block.ts +6 -5
  378. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-headers.method.block.ts +6 -5
  379. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-json-body.method.block.ts +6 -5
  380. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-method.method.block.ts +6 -5
  381. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-query-params.method.block.ts +6 -5
  382. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-url.method.block.ts +6 -5
  383. package/templates/scaffold/src/map/(external)/hoppscotch/_nav.block.ts +3 -3
  384. package/templates/scaffold/src/map/(external)/hoppscotch/_page.block.ts +3 -3
  385. package/templates/scaffold/src/map/(external)/hoppscotch/_states.ts +6 -0
  386. package/templates/scaffold/src/map/(external)/hoppscotch/settings/_nav.block.ts +3 -3
  387. package/templates/scaffold/src/map/(external)/mailpit/_keys.ts +13 -0
  388. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-content.method.block.ts +4 -4
  389. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-received.method.block.ts +4 -4
  390. package/templates/scaffold/src/map/(external)/mailpit/_methods/extract-email-link.method.block.ts +6 -5
  391. package/templates/scaffold/src/map/(external)/mailpit/_methods/open-message.method.block.ts +6 -5
  392. package/templates/scaffold/src/map/(external)/mailpit/_nav.block.ts +3 -3
  393. package/templates/scaffold/src/map/(external)/mailpit/_page.block.ts +3 -3
  394. package/templates/scaffold/src/map/(external)/mailpit/_states.ts +9 -0
  395. package/templates/scaffold/src/map/README.md +7 -0
  396. package/templates/scaffold/src/states/README.md +4 -1
  397. package/templates/scaffold/src/states/demo.mem-keys.ts +1 -29
  398. package/templates/scaffold/src/states/demo.states.ts +14 -20
  399. package/templates/scaffold/tests/hoppscotch.spec.ts +1 -11
  400. package/templates/scaffold/tests/mail-verify.spec.ts +2 -2
  401. package/templates/skills/waygraph-blind-pilot.skill.md +2 -6
  402. package/templates/skills/waygraph-convention.skill.md +23 -14
  403. package/templates/skills/waygraph-pilot.skill.md +7 -4
  404. package/dist/auto-session/verbose-log.js +0 -16
  405. package/dist/auto-session.d.ts +0 -2
  406. package/dist/auto-session.js +0 -3
  407. package/dist/cli/discover.d.ts +0 -40
  408. package/dist/cli/discover.js +0 -148
  409. package/dist/commands/agent-dive.js +0 -52
  410. package/dist/commands/check.js +0 -192
  411. package/dist/commands/map.js +0 -29
  412. package/dist/commands/run.js +0 -104
  413. package/dist/commands/traverse.js +0 -177
  414. package/dist/core/block.d.ts +0 -109
  415. package/dist/core/blocks/effect.js +0 -23
  416. package/dist/core/config.js +0 -17
  417. package/dist/core/engine.d.ts +0 -198
  418. package/dist/core/flow.d.ts +0 -294
  419. package/dist/core/flow.js +0 -432
  420. package/dist/core.d.ts +0 -14
  421. package/dist/core.js +0 -15
  422. package/dist/highlights/merge.d.ts +0 -8
  423. package/dist/highlights/merge.js +0 -173
  424. package/dist/highlights/stub-ctx.d.ts +0 -10
  425. package/dist/highlights/stub-ctx.js +0 -331
  426. package/dist/highlights/types.d.ts +0 -613
  427. package/dist/highlights.d.ts +0 -9
  428. package/dist/highlights.js +0 -10
  429. package/dist/pilot-overlay.d.ts +0 -5
  430. package/dist/pilot-overlay.js +0 -6
  431. package/dist/runner/banner-log.js +0 -63
  432. package/dist/runner/chain-run.js +0 -102
  433. package/dist/runner/cursor.js +0 -140
  434. package/dist/runner/demo-log.js +0 -316
  435. package/dist/runner/device-stage.d.ts +0 -9
  436. package/dist/runner/device-stage.js +0 -420
  437. package/dist/runner/discovery.js +0 -105
  438. package/dist/runner/index.js +0 -2
  439. package/dist/runner/inpage/banner.d.ts +0 -21
  440. package/dist/runner/inpage/banner.js +0 -156
  441. package/dist/runner/inpage/caption.d.ts +0 -3
  442. package/dist/runner/inpage/caption.js +0 -23
  443. package/dist/runner/inpage/core.d.ts +0 -4
  444. package/dist/runner/inpage/core.js +0 -316
  445. package/dist/runner/inpage/device.d.ts +0 -3
  446. package/dist/runner/inpage/device.js +0 -211
  447. package/dist/runner/inpage/network.d.ts +0 -15
  448. package/dist/runner/inpage/network.js +0 -217
  449. package/dist/runner/inpage/panel-chrome.js +0 -192
  450. package/dist/runner/inpage/stamp.js +0 -46
  451. package/dist/runner/inpage/swipe-zoom.js +0 -220
  452. package/dist/runner/inpage/todos.js +0 -337
  453. package/dist/runner/interaction-patch.js +0 -384
  454. package/dist/runner/main.js +0 -469
  455. package/dist/runner/network-capture.d.ts +0 -9
  456. package/dist/runner/network-capture.js +0 -126
  457. package/dist/runner/overlay-css.d.ts +0 -3
  458. package/dist/runner/overlay-css.js +0 -377
  459. package/dist/runner/overlay-install.js +0 -90
  460. package/dist/runner/overlay-stage.js +0 -110
  461. package/dist/runner/rings.js +0 -514
  462. package/dist/runner/seed-mem.js +0 -110
  463. package/dist/runner/slides.js +0 -278
  464. package/dist/runner/step-mode.js +0 -703
  465. package/dist/runner/step-panels.js +0 -729
  466. package/dist/runner/teardown.js +0 -202
  467. package/dist/runner/todo-dock.js +0 -142
  468. package/dist/session/step-overlay.d.ts +0 -37
  469. package/dist/session/step-overlay.js +0 -244
  470. package/examples/routed-demo/playwright.config.ts +0 -21
  471. package/examples/saucedemo/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
  472. package/templates/quickstart/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
  473. /package/dist/{commands → cli/commands}/agent-dive-scaffold.d.ts +0 -0
  474. /package/dist/{commands → cli/commands}/agent-dive.d.ts +0 -0
  475. /package/dist/{commands → cli/commands}/extensions.d.ts +0 -0
  476. /package/dist/{commands → cli/commands}/init.d.ts +0 -0
  477. /package/dist/{commands → cli/commands}/list.d.ts +0 -0
  478. /package/dist/{commands → cli/commands}/map.d.ts +0 -0
  479. /package/dist/{commands → cli/commands}/session.d.ts +0 -0
  480. /package/dist/{commands → cli/commands}/test.d.ts +0 -0
  481. /package/dist/{commands → cli/commands}/traverse.d.ts +0 -0
  482. /package/dist/{commands → cli/commands}/try.d.ts +0 -0
  483. /package/dist/{commands → cli/commands}/upgrade.d.ts +0 -0
  484. /package/dist/{highlights → demo/narration}/shorthand.js +0 -0
  485. /package/dist/{session/overlay-beacon.d.ts → demo/overlay/beacon.d.ts} +0 -0
  486. /package/dist/{session/overlay-beacon.js → demo/overlay/beacon.js} +0 -0
  487. /package/dist/{pilot-overlay/action-ring.d.ts → demo/overlay/pilot/actions.d.ts} +0 -0
  488. /package/dist/{ui → demo/overlay/ui}/components/ring.d.ts +0 -0
  489. /package/dist/{ui → demo/overlay/ui}/stylesheet.d.ts +0 -0
  490. /package/dist/{ui → demo/overlay/ui}/stylesheet.js +0 -0
  491. /package/dist/{ui → demo/overlay/ui}/tokens.d.ts +0 -0
  492. /package/dist/{ui → demo/overlay/ui}/tokens.js +0 -0
  493. /package/dist/{highlights → demo}/types.js +0 -0
  494. /package/dist/{auto-session → demo}/verbose-log.d.ts +0 -0
  495. /package/dist/{selector.d.ts → engine/trait/selector.d.ts} +0 -0
  496. /package/dist/{selector.js → engine/trait/selector.js} +0 -0
  497. /package/dist/{trait.js → engine/trait/trait.js} +0 -0
  498. /package/dist/{traverse → live/traverse}/coverage.d.ts +0 -0
  499. /package/dist/{traverse → live/traverse}/coverage.js +0 -0
  500. /package/dist/{traverse → live/traverse}/lease.d.ts +0 -0
  501. /package/dist/{traverse → live/traverse}/lease.js +0 -0
  502. /package/dist/{session/block-inject.d.ts → manifest/roots.d.ts} +0 -0
  503. /package/dist/{blocks-select.d.ts → manifest/select.d.ts} +0 -0
  504. /package/dist/{blocks-select.js → manifest/select.js} +0 -0
  505. /package/dist/{browser.d.ts → runtime/browser.d.ts} +0 -0
  506. /package/dist/{env-file.d.ts → runtime/env-file.d.ts} +0 -0
  507. /package/dist/{playwright-config.js → runtime/playwright-config.js} +0 -0
  508. /package/dist/{playwright.config.d.ts → runtime/playwright.config.d.ts} +0 -0
  509. /package/dist/{video-dir.d.ts → runtime/video-dir.d.ts} +0 -0
  510. /package/dist/{webserver.d.ts → runtime/webserver.d.ts} +0 -0
@@ -1,5 +1,5 @@
1
1
  import { defineAssertBlock, Trait, type Trait as TraitType } from "waygraph";
2
- import type { ItemInCart } from "../../../../states/demo.states.js";
2
+ import { ItemInCart } from "../../../../states/demo.states.js";
3
3
  import { SelectedItem } from "../../../../states/demo.mem-keys.js";
4
4
  import { DemoSel } from "../_sel.js";
5
5
 
@@ -13,9 +13,9 @@ const removeButtonVisibleForSelectedItem: TraitType = {
13
13
  };
14
14
 
15
15
  /** The mem-selected item's own Remove button appeared and the cart count reflects it. */
16
- export const AssertItemAddedBlock = defineAssertBlock<ItemInCart>({
16
+ export const AssertItemAddedBlock = defineAssertBlock({
17
17
  name: "assert-item-added",
18
18
  description: "Confirms the mem-selected item's own Remove button appeared and the cart count reflects it.",
19
- checkpoint: "ItemInCart",
19
+ checkpoint: ItemInCart,
20
20
  verify: [removeButtonVisibleForSelectedItem, Trait.text(DemoSel.cartCount, "1")],
21
21
  });
@@ -1,15 +1,16 @@
1
- import { defineMethodBlock, checkpoint, Trait } from "waygraph";
2
- import type { ItemInCart, CartEmpty } from "../../../../states/demo.states.js";
1
+ import { defineMethodBlock, Trait } from "waygraph";
2
+ import { ItemInCart, CartEmpty } from "../../../../states/demo.states.js";
3
3
  import { DemoSel } from "../_sel.js";
4
4
 
5
- export const ClearCartBlock = defineMethodBlock<ItemInCart, CartEmpty>({
5
+ export const ClearCartBlock = defineMethodBlock({
6
6
  name: "clear-cart",
7
7
  description: "Clears every item via the Clear cart control.",
8
+ from: ItemInCart,
9
+ to: CartEmpty,
8
10
  instruction: {
9
11
  async act(page) {
10
12
  await page.locator(DemoSel.clear).click();
11
13
  },
12
- resolve: () => checkpoint("CartEmpty"),
13
14
  verify: [Trait.text(DemoSel.cartCount, "0")],
14
15
  },
15
16
  });
@@ -1,22 +1,22 @@
1
1
  import {
2
2
  defineEffectBlock,
3
- checkpoint,
4
3
  type WaygraphInstanceOption,
5
4
  } from "waygraph";
6
- import type { CartEmpty, ItemInCart } from "../../../../states/demo.states.js";
5
+ import { CartEmpty, ItemInCart } from "../../../../states/demo.states.js";
7
6
  import { SelectedItem } from "../../../../states/demo.mem-keys.js";
8
7
  import { DemoSel } from "../_sel.js";
9
8
 
10
- export const RemoveItemBlock = defineEffectBlock<ItemInCart, CartEmpty>({
9
+ export const RemoveItemBlock = defineEffectBlock({
11
10
  name: "remove-item",
12
11
  description: "Removes the mem-selected catalog item from the cart.",
12
+ from: ItemInCart,
13
+ to: CartEmpty,
13
14
  requires: [SelectedItem.key],
14
15
  instruction: {
15
16
  async act(page, _input, mem) {
16
17
  const { id } = mem.get(SelectedItem.key);
17
18
  await page.locator(DemoSel.removeBtn(id)).click();
18
19
  },
19
- resolve: () => checkpoint("CartEmpty"),
20
20
  verify: [
21
21
  {
22
22
  name: "item-removed",
@@ -1,11 +1,11 @@
1
1
  import { defineNavBlock, Trait } from "waygraph";
2
- import type { Home } from "../../../states/demo.states.js";
2
+ import { Home } from "../../../states/demo.states.js";
3
3
  import { DemoSel, HOME_URL } from "./_sel.js";
4
4
 
5
- export const NavHomeBlock = defineNavBlock<Home>({
5
+ export const NavHomeBlock = defineNavBlock({
6
6
  name: "nav-home",
7
7
  description: "Opens the offline catalog page (file://, no server).",
8
- checkpoint: "Home",
8
+ checkpoint: Home,
9
9
  url: HOME_URL,
10
10
  verify: [Trait.text(DemoSel.title, "Hello Waygraph"), Trait.visible(DemoSel.catalog)],
11
11
  });
@@ -1,15 +1,15 @@
1
1
  import { definePageBlock, Trait } from "waygraph";
2
- import type { Home } from "../../../states/demo.states.js";
2
+ import { Home } from "../../../states/demo.states.js";
3
3
  import { DemoSel } from "./_sel.js";
4
4
  import { AddItemBlock } from "./_methods/add-item.effect.block.js";
5
5
  import { RemoveItemBlock } from "./_methods/remove-item.effect.block.js";
6
6
  import { ClearCartBlock } from "./_methods/clear-cart.method.block.js";
7
7
  import { AssertHelloBlock } from "./_methods/assert-hello.method.block.js";
8
8
 
9
- export const HomePageBlock = definePageBlock<Home>({
9
+ export const HomePageBlock = definePageBlock({
10
10
  name: "page-home",
11
11
  description: "Offline home hub - add/remove effects, clear, assert-hello.",
12
- checkpoint: "Home",
12
+ checkpoint: Home,
13
13
  verify: [Trait.visible(DemoSel.catalog)],
14
14
  methods: {
15
15
  addItem: () => AddItemBlock,
@@ -1,12 +1,12 @@
1
1
  import { defineNavBlock, Trait } from "waygraph";
2
- import type { HomeVerified } from "../../../states/demo.states.js";
3
- import { EmailLink } from "../../../states/demo.mem-keys.js";
2
+ import { HomeVerified } from "../../../states/demo.states.js";
3
+ import { EmailLink } from "../../(external)/mailpit/_keys.js";
4
4
  import { DemoSel } from "./_sel.js";
5
5
 
6
6
  /** Follows the link `extract-email-link` put in mem. No `requires`: an earlier Block in the chain produces it. */
7
- export const NavVerificationLinkBlock = defineNavBlock<HomeVerified>({
7
+ export const NavVerificationLinkBlock = defineNavBlock({
8
8
  name: "nav-verification-link",
9
- checkpoint: "HomeVerified",
9
+ checkpoint: HomeVerified,
10
10
  url: (mem) => mem.get(EmailLink.key).url,
11
11
  verify: [Trait.visible(DemoSel.verifiedBanner)],
12
12
  });
@@ -0,0 +1,21 @@
1
+ import { key, keyGroup } from "waygraph";
2
+
3
+ export const RequestMethod = key<string>("hoppscotch.requestMethod");
4
+ export const RequestUrl = key<string>("hoppscotch.requestUrl");
5
+ export const RequestHeaders = key<Record<string, string>>("hoppscotch.requestHeaders");
6
+ export const RequestParams = key<Record<string, string>>("hoppscotch.requestParams");
7
+ export const RequestBearerToken = key<string>("hoppscotch.requestBearerToken");
8
+
9
+ /** Raw JSON text typed into the request body editor. */
10
+ export const RequestBody = key<string>("hoppscotch.requestBody");
11
+ export const ExpectedStatus = key<number>("hoppscotch.expectedStatus");
12
+
13
+ /** Substring the response body must contain. */
14
+ export const ExpectedResponseText = key<string>("hoppscotch.expectedResponseText");
15
+
16
+ /** The raw response body, set by read-response-body. */
17
+ export const ResponseBody = key<string>("hoppscotch.responseBody");
18
+
19
+ /** Response headers (lower-cased names), set by read-response-headers. */
20
+ export const ResponseHeaders = key<Record<string, string>>("hoppscotch.responseHeaders");
21
+ export const ExpectedResponseHeader = keyGroup<{ name: string; value: string }>("hoppscotch.expectedResponseHeader");
@@ -1,6 +1,6 @@
1
1
  import { defineAssertBlock, type Trait } from "waygraph";
2
- import type { HoppscotchRest } from "../../../../states/demo.states.js";
3
- import { ExpectedResponseText, ResponseBody } from "../../../../states/demo.mem-keys.js";
2
+ import { HoppscotchRest } from "../_states.js";
3
+ import { ExpectedResponseText, ResponseBody } from "../_keys.js";
4
4
 
5
5
  // Hoppscotch pretty-prints JSON, so compare with whitespace removed from both sides.
6
6
  const squash = (text: string): string => text.replace(/\s+/g, "");
@@ -12,10 +12,10 @@ const bodyContainsExpected: Trait = {
12
12
  },
13
13
  };
14
14
 
15
- export const AssertResponseBodyBlock = defineAssertBlock<HoppscotchRest>({
15
+ export const AssertResponseBodyBlock = defineAssertBlock({
16
16
  name: "assert-response-body",
17
17
  description: "Confirms the response body read earlier contains the mem-supplied text (whitespace ignored).",
18
- checkpoint: "HoppscotchRest",
18
+ checkpoint: HoppscotchRest,
19
19
  requires: [ExpectedResponseText],
20
20
  verify: [bodyContainsExpected],
21
21
  });
@@ -1,6 +1,6 @@
1
1
  import { defineAssertBlock, type Trait } from "waygraph";
2
- import type { HoppscotchRest } from "../../../../states/demo.states.js";
3
- import { ExpectedResponseHeader, ResponseHeaders } from "../../../../states/demo.mem-keys.js";
2
+ import { HoppscotchRest } from "../_states.js";
3
+ import { ExpectedResponseHeader, ResponseHeaders } from "../_keys.js";
4
4
 
5
5
  const headerMatches: Trait = {
6
6
  name: "response-header-matches",
@@ -10,10 +10,10 @@ const headerMatches: Trait = {
10
10
  },
11
11
  };
12
12
 
13
- export const AssertResponseHeaderBlock = defineAssertBlock<HoppscotchRest>({
13
+ export const AssertResponseHeaderBlock = defineAssertBlock({
14
14
  name: "assert-response-header",
15
15
  description: "Confirms a response header read earlier has the mem-supplied value.",
16
- checkpoint: "HoppscotchRest",
16
+ checkpoint: HoppscotchRest,
17
17
  requires: [ExpectedResponseHeader.key],
18
18
  verify: [headerMatches],
19
19
  });
@@ -1,6 +1,6 @@
1
1
  import { defineAssertBlock, type Trait } from "waygraph";
2
- import type { HoppscotchRest } from "../../../../states/demo.states.js";
3
- import { ExpectedStatus } from "../../../../states/demo.mem-keys.js";
2
+ import { HoppscotchRest } from "../_states.js";
3
+ import { ExpectedStatus } from "../_keys.js";
4
4
  import { HoppscotchSel } from "../_sel.js";
5
5
 
6
6
  const statusMatches: Trait = {
@@ -11,10 +11,10 @@ const statusMatches: Trait = {
11
11
  },
12
12
  };
13
13
 
14
- export const AssertStatusBlock = defineAssertBlock<HoppscotchRest>({
14
+ export const AssertStatusBlock = defineAssertBlock({
15
15
  name: "assert-status",
16
16
  description: "Confirms the response status code equals the mem-supplied one.",
17
- checkpoint: "HoppscotchRest",
17
+ checkpoint: HoppscotchRest,
18
18
  requires: [ExpectedStatus],
19
19
  verify: [statusMatches],
20
20
  });
@@ -1,10 +1,12 @@
1
- import { defineMethodBlock, checkpoint } from "waygraph";
2
- import type { HoppscotchSettings } from "../../../../states/demo.states.js";
1
+ import { defineMethodBlock } from "waygraph";
2
+ import { HoppscotchSettings } from "../_states.js";
3
3
  import { HoppscotchSel } from "../_sel.js";
4
4
 
5
- export const PickExtensionInterceptorBlock = defineMethodBlock<HoppscotchSettings, HoppscotchSettings>({
5
+ export const PickExtensionInterceptorBlock = defineMethodBlock({
6
6
  name: "pick-extension-interceptor",
7
7
  description: "Routes Hoppscotch's requests through the browser extension, which skips CORS.",
8
+ from: HoppscotchSettings,
9
+ to: HoppscotchSettings,
8
10
  instruction: {
9
11
  async act(page) {
10
12
  const radio = page.locator(HoppscotchSel.extensionInterceptor);
@@ -13,6 +15,5 @@ export const PickExtensionInterceptorBlock = defineMethodBlock<HoppscotchSetting
13
15
  });
14
16
  await radio.click();
15
17
  },
16
- resolve: () => checkpoint("HoppscotchSettings"),
17
18
  },
18
19
  });
@@ -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
  });