waygraph 0.15.54 → 0.16.1

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 (552) 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/cli/commands/browser.d.ts +2 -0
  21. package/dist/cli/commands/browser.js +109 -0
  22. package/dist/{commands → cli/commands}/check.d.ts +0 -1
  23. package/dist/cli/commands/check.js +104 -0
  24. package/dist/cli/commands/codemod-checkpoints.d.ts +18 -0
  25. package/dist/cli/commands/codemod-checkpoints.js +186 -0
  26. package/dist/cli/commands/codemod-flows.d.ts +18 -0
  27. package/dist/cli/commands/codemod-flows.js +284 -0
  28. package/dist/cli/commands/codemod-stubs.d.ts +10 -0
  29. package/dist/cli/commands/codemod-stubs.js +187 -0
  30. package/dist/{commands → cli/commands}/extensions.js +5 -4
  31. package/dist/{commands → cli/commands}/init.js +1 -2
  32. package/dist/{commands → cli/commands}/list.js +9 -7
  33. package/dist/cli/commands/manifest.d.ts +2 -0
  34. package/dist/cli/commands/manifest.js +20 -0
  35. package/dist/cli/commands/map.js +57 -0
  36. package/dist/cli/commands/pilot.d.ts +2 -0
  37. package/dist/cli/commands/pilot.js +102 -0
  38. package/dist/{commands → cli/commands}/run.d.ts +0 -1
  39. package/dist/cli/commands/run.js +64 -0
  40. package/dist/cli/commands/session-ops.d.ts +3 -0
  41. package/dist/cli/commands/session-ops.js +257 -0
  42. package/dist/cli/commands/session.js +132 -0
  43. package/dist/{commands → cli/commands}/test.js +11 -14
  44. package/dist/cli/commands/traverse.js +105 -0
  45. package/dist/{commands → cli/commands}/try.js +29 -25
  46. package/dist/{commands → cli/commands}/upgrade.js +40 -4
  47. package/dist/cli/flags.d.ts +193 -16
  48. package/dist/cli/flags.js +179 -234
  49. package/dist/cli/run-chain.d.ts +1 -0
  50. package/dist/cli/run-chain.js +42 -7
  51. package/dist/cli/usage.d.ts +1 -1
  52. package/dist/cli/usage.js +21 -53
  53. package/dist/cli/util.d.ts +2 -2
  54. package/dist/cli/util.js +2 -3
  55. package/dist/{highlights → demo/narration}/css.d.ts +1 -1
  56. package/dist/{highlights → demo/narration}/css.js +2 -3
  57. package/dist/{highlights → demo/narration}/demo-pace.d.ts +4 -12
  58. package/dist/{highlights → demo/narration}/demo-pace.js +5 -11
  59. package/dist/{highlights → demo/narration}/device.d.ts +4 -4
  60. package/dist/{highlights → demo/narration}/device.js +1 -1
  61. package/dist/demo/narration/merge.d.ts +10 -0
  62. package/dist/demo/narration/merge.js +67 -0
  63. package/dist/demo/narration/narration.d.ts +39 -0
  64. package/dist/{highlights/run-phase.js → demo/narration/narration.js} +25 -94
  65. package/dist/{highlights → demo/narration}/shorthand.d.ts +1 -1
  66. package/dist/demo/narration/stub-ctx.d.ts +8 -0
  67. package/dist/demo/narration/stub-ctx.js +164 -0
  68. package/dist/{highlights → demo/narration}/style.d.ts +1 -7
  69. package/dist/{highlights → demo/narration}/style.js +1 -41
  70. package/dist/{highlights → demo/narration}/todo-dock.d.ts +8 -8
  71. package/dist/{highlights → demo/narration}/todo-dock.js +13 -30
  72. package/dist/demo/overlay/auto-chrome.d.ts +7 -0
  73. package/dist/demo/overlay/auto-chrome.js +97 -0
  74. package/dist/demo/overlay/cursor.d.ts +19 -0
  75. package/dist/demo/overlay/cursor.js +142 -0
  76. package/dist/demo/overlay/device-stage.d.ts +26 -0
  77. package/dist/demo/overlay/device-stage.js +396 -0
  78. package/dist/demo/overlay/inpage/banner.d.ts +2 -0
  79. package/dist/demo/overlay/inpage/banner.js +160 -0
  80. package/dist/demo/overlay/inpage/caption.d.ts +2 -0
  81. package/dist/demo/overlay/inpage/caption.js +24 -0
  82. package/dist/demo/overlay/inpage/core.d.ts +2 -0
  83. package/dist/demo/overlay/inpage/core.js +345 -0
  84. package/dist/demo/overlay/inpage/device-chip.d.ts +1 -0
  85. package/dist/demo/overlay/inpage/device-chip.js +191 -0
  86. package/dist/demo/overlay/inpage/network.d.ts +10 -0
  87. package/dist/demo/overlay/inpage/network.js +189 -0
  88. package/dist/demo/overlay/inpage/panel-chrome.d.ts +1 -0
  89. package/dist/demo/overlay/inpage/panel-chrome.js +203 -0
  90. package/dist/demo/overlay/inpage/stamp.d.ts +1 -0
  91. package/dist/demo/overlay/inpage/stamp.js +46 -0
  92. package/dist/demo/overlay/inpage/swipe-zoom.d.ts +1 -0
  93. package/dist/demo/overlay/inpage/swipe-zoom.js +220 -0
  94. package/dist/demo/overlay/inpage/todos.d.ts +2 -0
  95. package/dist/demo/overlay/inpage/todos.js +293 -0
  96. package/dist/demo/overlay/locator-theater.d.ts +25 -0
  97. package/dist/demo/overlay/locator-theater.js +76 -0
  98. package/dist/demo/overlay/network-capture.d.ts +22 -0
  99. package/dist/demo/overlay/network-capture.js +127 -0
  100. package/dist/demo/overlay/overlay-css.d.ts +3 -0
  101. package/dist/demo/overlay/overlay-css.js +369 -0
  102. package/dist/demo/overlay/overlay-stage.d.ts +31 -0
  103. package/dist/demo/overlay/overlay-stage.js +106 -0
  104. package/dist/demo/overlay/overlay.d.ts +10 -0
  105. package/dist/demo/overlay/overlay.js +89 -0
  106. package/dist/{pilot-overlay/overlay-fixtures.d.ts → demo/overlay/phase-fixtures.d.ts} +2 -2
  107. package/dist/{pilot-overlay/overlay-fixtures.js → demo/overlay/phase-fixtures.js} +2 -2
  108. package/dist/{pilot-overlay/action-ring.js → demo/overlay/pilot/actions.js} +2 -1
  109. package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.d.ts +6 -5
  110. package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.js +19 -18
  111. package/dist/{pilot-overlay → demo/overlay/pilot}/shell.d.ts +2 -2
  112. package/dist/{pilot-overlay → demo/overlay/pilot}/shell.js +13 -22
  113. package/dist/demo/overlay/reattach.d.ts +7 -0
  114. package/dist/demo/overlay/reattach.js +23 -0
  115. package/dist/demo/overlay/rings.d.ts +61 -0
  116. package/dist/demo/overlay/rings.js +422 -0
  117. package/dist/{ui → demo/overlay/ui}/components/ring.js +2 -2
  118. package/dist/{ui → demo/overlay/ui}/overlay.css +4 -4
  119. package/dist/{ui → demo/overlay/ui}/shadow.d.ts +1 -1
  120. package/dist/{ui → demo/overlay/ui}/shadow.js +39 -2
  121. package/dist/demo/stepper/after.d.ts +3 -0
  122. package/dist/demo/stepper/after.js +103 -0
  123. package/dist/demo/stepper/banner-log.d.ts +35 -0
  124. package/dist/demo/stepper/banner-log.js +65 -0
  125. package/dist/demo/stepper/before.d.ts +4 -0
  126. package/dist/demo/stepper/before.js +110 -0
  127. package/dist/demo/stepper/demo-log.d.ts +48 -0
  128. package/dist/demo/stepper/demo-log.js +292 -0
  129. package/dist/demo/stepper/gate.d.ts +11 -0
  130. package/dist/demo/stepper/gate.js +78 -0
  131. package/dist/demo/stepper/interaction-patch.d.ts +4 -0
  132. package/dist/demo/stepper/interaction-patch.js +323 -0
  133. package/dist/demo/stepper/pacing.d.ts +21 -0
  134. package/dist/demo/stepper/pacing.js +23 -0
  135. package/dist/demo/stepper/panel-after.d.ts +17 -0
  136. package/dist/demo/stepper/panel-after.js +166 -0
  137. package/dist/demo/stepper/panel-before.d.ts +12 -0
  138. package/dist/demo/stepper/panel-before.js +241 -0
  139. package/dist/demo/stepper/slides.d.ts +23 -0
  140. package/dist/demo/stepper/slides.js +233 -0
  141. package/dist/demo/stepper/step-panels.d.ts +69 -0
  142. package/dist/demo/stepper/step-panels.js +172 -0
  143. package/dist/demo/stepper/stepper.d.ts +24 -0
  144. package/dist/demo/stepper/stepper.js +122 -0
  145. package/dist/demo/stepper/teardown.d.ts +47 -0
  146. package/dist/demo/stepper/teardown.js +178 -0
  147. package/dist/demo/stepper/todo-advance.d.ts +15 -0
  148. package/dist/demo/stepper/todo-advance.js +110 -0
  149. package/dist/demo/stepper/view.d.ts +58 -0
  150. package/dist/demo/stepper/view.js +31 -0
  151. package/dist/demo/types.d.ts +85 -0
  152. package/dist/demo/verbose-log.js +15 -0
  153. package/dist/engine/block/action-page.d.ts +53 -0
  154. package/dist/engine/block/action-page.js +1 -0
  155. package/dist/{types.d.ts → engine/block/block.d.ts} +102 -142
  156. package/dist/{core → engine/block}/block.js +12 -130
  157. package/dist/engine/block/branch.d.ts +17 -0
  158. package/dist/engine/block/branch.js +40 -0
  159. package/dist/{core → engine/block}/compose.d.ts +9 -7
  160. package/dist/{core → engine/block}/compose.js +1 -1
  161. package/dist/engine/block/dialog.d.ts +13 -0
  162. package/dist/engine/block/dialog.js +37 -0
  163. package/dist/{core/blocks → engine/block/kinds}/api.d.ts +16 -12
  164. package/dist/{core/blocks → engine/block/kinds}/api.js +26 -18
  165. package/dist/{core/blocks → engine/block/kinds}/effect.d.ts +13 -18
  166. package/dist/engine/block/kinds/effect.js +17 -0
  167. package/dist/{core/blocks → engine/block/kinds}/method.d.ts +17 -29
  168. package/dist/{core/blocks → engine/block/kinds}/method.js +6 -21
  169. package/dist/{core/blocks → engine/block/kinds}/nav.d.ts +21 -31
  170. package/dist/{core/blocks → engine/block/kinds}/nav.js +6 -12
  171. package/dist/{core/blocks → engine/block/kinds}/page.d.ts +14 -20
  172. package/dist/{core/blocks → engine/block/kinds}/page.js +5 -7
  173. package/dist/engine/checkpoint/checkpoint.d.ts +22 -0
  174. package/dist/engine/checkpoint/checkpoint.js +8 -0
  175. package/dist/engine/checkpoint/route.d.ts +28 -0
  176. package/dist/engine/checkpoint/route.js +28 -0
  177. package/dist/{core → engine}/config.d.ts +7 -2
  178. package/dist/engine/config.js +6 -0
  179. package/dist/engine/engine.d.ts +45 -0
  180. package/dist/{core → engine}/engine.js +6 -10
  181. package/dist/engine/env.d.ts +59 -0
  182. package/dist/engine/env.js +83 -0
  183. package/dist/{errors.d.ts → engine/errors.d.ts} +22 -22
  184. package/dist/{errors.js → engine/errors.js} +22 -22
  185. package/dist/{core → engine/flow}/branch-regression.d.ts +7 -7
  186. package/dist/{core → engine/flow}/branch-regression.js +4 -3
  187. package/dist/engine/flow/flow.d.ts +162 -0
  188. package/dist/engine/flow/flow.js +244 -0
  189. package/dist/engine/flow/map-branch.d.ts +9 -0
  190. package/dist/engine/flow/map-branch.js +57 -0
  191. package/dist/{core → engine/flow}/map-builder.d.ts +34 -54
  192. package/dist/engine/flow/map-builder.js +242 -0
  193. package/dist/engine/flow/map-steps.d.ts +30 -0
  194. package/dist/engine/flow/map-steps.js +87 -0
  195. package/dist/{core → engine}/locate.d.ts +1 -1
  196. package/dist/{core → engine}/locate.js +1 -2
  197. package/dist/{mem-stub.d.ts → engine/mem/mem-stub.d.ts} +9 -8
  198. package/dist/{mem-stub.js → engine/mem/mem-stub.js} +2 -2
  199. package/dist/{mem-page.d.ts → engine/mem/mem.d.ts} +1 -1
  200. package/dist/{mem-page.js → engine/mem/mem.js} +2 -1
  201. package/dist/engine/page-gone.d.ts +5 -0
  202. package/dist/engine/page-gone.js +20 -0
  203. package/dist/engine/run/connect.d.ts +28 -0
  204. package/dist/{types.js → engine/run/connect.js} +11 -10
  205. package/dist/engine/run/events.d.ts +67 -0
  206. package/dist/engine/run/events.js +90 -0
  207. package/dist/engine/run/hooks.d.ts +16 -0
  208. package/dist/engine/run/hooks.js +8 -0
  209. package/dist/engine/run/launch.d.ts +13 -0
  210. package/dist/engine/run/launch.js +27 -0
  211. package/dist/{core/run-graph.d.ts → engine/run/run.d.ts} +8 -12
  212. package/dist/{core/run-graph.js → engine/run/run.js} +22 -12
  213. package/dist/engine/stub/pace.d.ts +12 -0
  214. package/dist/engine/stub/pace.js +2 -0
  215. package/dist/engine/stub/ring.d.ts +130 -0
  216. package/dist/engine/stub/ring.js +41 -0
  217. package/dist/engine/stub/stub.d.ts +268 -0
  218. package/dist/engine/stub/stub.js +1 -0
  219. package/dist/engine/stub/todos.d.ts +104 -0
  220. package/dist/engine/stub/todos.js +2 -0
  221. package/dist/engine/stub/viewport.d.ts +26 -0
  222. package/dist/engine/stub/viewport.js +2 -0
  223. package/dist/{trait.d.ts → engine/trait/trait.d.ts} +1 -1
  224. package/dist/{trait.js → engine/trait/trait.js} +1 -1
  225. package/dist/index.d.ts +88 -36
  226. package/dist/index.js +46 -19
  227. package/dist/live/auto/auto.d.ts +22 -0
  228. package/dist/live/auto/auto.js +207 -0
  229. package/dist/{session/auto-explore.d.ts → live/auto/explore.d.ts} +4 -14
  230. package/dist/{session/auto-explore.js → live/auto/explore.js} +21 -127
  231. package/dist/live/auto/mem.d.ts +11 -0
  232. package/dist/live/auto/mem.js +85 -0
  233. package/dist/live/auto/menu.d.ts +30 -0
  234. package/dist/live/auto/menu.js +335 -0
  235. package/dist/live/auto-session/auto-session.d.ts +113 -0
  236. package/dist/live/auto-session/auto-session.js +452 -0
  237. package/dist/live/auto-session/console.d.ts +4 -0
  238. package/dist/live/auto-session/console.js +41 -0
  239. package/dist/live/auto-session/files.d.ts +44 -0
  240. package/dist/live/auto-session/files.js +145 -0
  241. package/dist/{auto-session → live/auto-session}/helpers.d.ts +9 -5
  242. package/dist/{auto-session → live/auto-session}/helpers.js +18 -1
  243. package/dist/live/auto-session/inspect.d.ts +4 -0
  244. package/dist/live/auto-session/inspect.js +75 -0
  245. package/dist/{session/auto-session-ipc.d.ts → live/auto-session/ipc.d.ts} +8 -25
  246. package/dist/{session/auto-session-ipc.js → live/auto-session/ipc.js} +36 -161
  247. package/dist/live/auto-session/open-browser.d.ts +6 -0
  248. package/dist/live/auto-session/open-browser.js +47 -0
  249. package/dist/{session/browser.d.ts → live/auto-session/start.d.ts} +1 -2
  250. package/dist/{session/browser.js → live/auto-session/start.js} +2 -3
  251. package/dist/{pilot-overlay → live/pilot}/panel.d.ts +1 -1
  252. package/dist/{pilot-overlay → live/pilot}/panel.js +23 -31
  253. package/dist/{session → live/pilot}/pilot.d.ts +3 -3
  254. package/dist/{session → live/pilot}/pilot.js +5 -4
  255. package/dist/{traverse/run.d.ts → live/traverse/traverse.d.ts} +1 -1
  256. package/dist/live/traverse/traverse.js +212 -0
  257. package/dist/live/traverse/worker.d.ts +37 -0
  258. package/dist/live/traverse/worker.js +200 -0
  259. package/dist/manifest/manifest.d.ts +52 -0
  260. package/dist/manifest/manifest.js +93 -0
  261. package/dist/manifest/map-imports.d.ts +7 -0
  262. package/dist/manifest/map-imports.js +22 -0
  263. package/dist/manifest/maps.d.ts +33 -0
  264. package/dist/manifest/maps.js +62 -0
  265. package/dist/manifest/pack.d.ts +21 -0
  266. package/dist/manifest/pack.js +109 -0
  267. package/dist/manifest/project.d.ts +60 -0
  268. package/dist/manifest/project.js +101 -0
  269. package/dist/{session/block-inject.js → manifest/roots.js} +1 -18
  270. package/dist/manifest/scan.d.ts +19 -0
  271. package/dist/manifest/scan.js +57 -0
  272. package/dist/manifest/source.d.ts +23 -0
  273. package/dist/manifest/source.js +86 -0
  274. package/dist/runner/mode.d.ts +71 -0
  275. package/dist/runner/mode.js +1 -0
  276. package/dist/runner/modes/branches.d.ts +5 -0
  277. package/dist/runner/modes/branches.js +37 -0
  278. package/dist/runner/modes/demo.d.ts +3 -0
  279. package/dist/runner/modes/demo.js +13 -0
  280. package/dist/runner/modes/report.d.ts +2 -0
  281. package/dist/runner/modes/report.js +54 -0
  282. package/dist/runner/modes/run.d.ts +2 -0
  283. package/dist/runner/modes/run.js +3 -0
  284. package/dist/runner/options.d.ts +31 -0
  285. package/dist/runner/options.js +42 -0
  286. package/dist/runner/plan/find.d.ts +18 -0
  287. package/dist/runner/plan/find.js +65 -0
  288. package/dist/runner/plan/plan.d.ts +11 -0
  289. package/dist/runner/plan/plan.js +97 -0
  290. package/dist/runner/plan/seed-mem.d.ts +12 -0
  291. package/dist/runner/plan/seed-mem.js +98 -0
  292. package/dist/runner/plan/spec.d.ts +5 -0
  293. package/dist/runner/plan/spec.js +17 -0
  294. package/dist/runner/play-steps.d.ts +2 -0
  295. package/dist/runner/play-steps.js +59 -0
  296. package/dist/runner/runner.d.ts +4 -0
  297. package/dist/runner/runner.js +64 -0
  298. package/dist/runner/session.d.ts +9 -0
  299. package/dist/runner/session.js +87 -0
  300. package/dist/{browser.js → runtime/browser.js} +4 -2
  301. package/dist/{env-file.js → runtime/env-file.js} +7 -12
  302. package/dist/{extensions.d.ts → runtime/extensions.d.ts} +1 -5
  303. package/dist/{extensions.js → runtime/extensions.js} +2 -1
  304. package/dist/runtime/full-launch.d.ts +1 -0
  305. package/dist/runtime/full-launch.js +34 -0
  306. package/dist/runtime/global-flag.d.ts +5 -0
  307. package/dist/runtime/global-flag.js +18 -0
  308. package/dist/{playwright-config.d.ts → runtime/playwright-config.d.ts} +1 -1
  309. package/dist/{playwright.config.js → runtime/playwright.config.js} +3 -2
  310. package/dist/runtime/run-log.d.ts +2 -0
  311. package/dist/runtime/run-log.js +17 -0
  312. package/dist/{video-dir.js → runtime/video-dir.js} +3 -2
  313. package/dist/{config.d.ts → runtime/waygraph-config.d.ts} +6 -9
  314. package/dist/{config.js → runtime/waygraph-config.js} +21 -51
  315. package/dist/{webserver.js → runtime/webserver.js} +5 -30
  316. package/examples/routed-demo/config/waygraph.config.ts +20 -0
  317. package/examples/routed-demo/package.json +1 -4
  318. package/examples/routed-demo/scripts/fixture-server.mjs +1 -1
  319. package/examples/routed-demo/src/flows/routed-demo-map.flow.ts +2 -4
  320. package/examples/routed-demo/src/flows/routed-demo.flow.ts +1 -2
  321. package/examples/routed-demo/src/map/(app_base)/dashboard/_methods/click-widget.block.ts +5 -4
  322. package/examples/routed-demo/src/map/(app_base)/dashboard/_nav.block.ts +3 -3
  323. package/examples/routed-demo/src/map/(app_base)/dashboard/_page.block.ts +3 -3
  324. package/examples/routed-demo/src/map/(external)/docs/_nav.block.ts +3 -3
  325. package/examples/routed-demo/src/map/(external)/docs/_page.block.ts +3 -3
  326. package/examples/routed-demo/src/states/routed-demo.states.ts +5 -3
  327. package/examples/routed-demo/tests/routed-demo.spec.ts +4 -4
  328. package/examples/routed-demo/tsconfig.json +1 -1
  329. package/examples/saucedemo/docs/CONVENTION.md +4 -5
  330. package/examples/saucedemo/docs/HELPERS.md +11 -11
  331. package/examples/saucedemo/src/blocks/SITE-MAP.md +0 -1
  332. package/examples/saucedemo/src/blocks/saucedemo-web/NAV.md +1 -5
  333. package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -3
  334. package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
  335. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
  336. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
  337. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
  338. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
  339. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +5 -8
  340. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -3
  341. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
  342. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +35 -43
  343. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
  344. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
  345. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
  346. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
  347. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
  348. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
  349. package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -4
  350. package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -4
  351. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +4 -5
  352. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
  353. package/examples/saucedemo/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
  354. package/examples/saucedemo/src/flows/api-demo.flow.ts +12 -10
  355. package/examples/saucedemo/src/states/checkout.states.ts +21 -11
  356. package/examples/saucedemo/src/stubs/device-showcase.ts +8 -10
  357. package/examples/saucedemo/tests/auto-graph.spec.ts +4 -12
  358. package/package.json +14 -6
  359. package/templates/agents/waygraph-planner.agent.md +2 -2
  360. package/templates/quickstart/docs/CONVENTION.md +4 -4
  361. package/templates/quickstart/docs/HELPERS.md +10 -8
  362. package/templates/quickstart/package.json +0 -3
  363. package/templates/quickstart/src/blocks/SITE-MAP.md +0 -1
  364. package/templates/quickstart/src/blocks/saucedemo-web/NAV.md +1 -5
  365. package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -3
  366. package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
  367. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
  368. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
  369. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
  370. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
  371. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +5 -8
  372. package/templates/quickstart/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -3
  373. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
  374. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +35 -43
  375. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
  376. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
  377. package/templates/quickstart/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
  378. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
  379. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
  380. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
  381. package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -4
  382. package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -4
  383. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +4 -5
  384. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
  385. package/templates/quickstart/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
  386. package/templates/quickstart/src/flows/api-demo.flow.ts +12 -10
  387. package/templates/quickstart/src/states/checkout.states.ts +21 -11
  388. package/templates/quickstart/src/stubs/device-showcase.ts +8 -10
  389. package/templates/scaffold/README.md +2 -1
  390. package/templates/scaffold/STRUCTURE.md +5 -4
  391. package/templates/scaffold/config/waygraph.config.ts +1 -0
  392. package/templates/scaffold/gitignore +1 -0
  393. package/templates/scaffold/src/flows/README.md +2 -2
  394. package/templates/scaffold/src/map/(app_base)/docs/_nav.block.ts +3 -3
  395. package/templates/scaffold/src/map/(app_base)/docs/_page.block.ts +3 -3
  396. package/templates/scaffold/src/map/(app_base)/home/_methods/add-item.effect.block.ts +4 -4
  397. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-hello.method.block.ts +3 -3
  398. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-item-added.method.block.ts +3 -3
  399. package/templates/scaffold/src/map/(app_base)/home/_methods/clear-cart.method.block.ts +5 -4
  400. package/templates/scaffold/src/map/(app_base)/home/_methods/remove-item.effect.block.ts +4 -4
  401. package/templates/scaffold/src/map/(app_base)/home/_nav.block.ts +3 -3
  402. package/templates/scaffold/src/map/(app_base)/home/_page.block.ts +3 -3
  403. package/templates/scaffold/src/map/(app_base)/home/nav-verification-link.block.ts +4 -4
  404. package/templates/scaffold/src/map/(external)/hoppscotch/_keys.ts +21 -0
  405. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-body.method.block.ts +4 -4
  406. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-header.method.block.ts +4 -4
  407. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-status.method.block.ts +4 -4
  408. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/pick-extension-interceptor.method.block.ts +5 -4
  409. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-body.method.block.ts +6 -5
  410. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-headers.method.block.ts +6 -5
  411. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/send-request.method.block.ts +5 -4
  412. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-bearer-token.method.block.ts +6 -5
  413. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-headers.method.block.ts +6 -5
  414. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-json-body.method.block.ts +6 -5
  415. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-method.method.block.ts +6 -5
  416. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-query-params.method.block.ts +6 -5
  417. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-url.method.block.ts +6 -5
  418. package/templates/scaffold/src/map/(external)/hoppscotch/_nav.block.ts +3 -3
  419. package/templates/scaffold/src/map/(external)/hoppscotch/_page.block.ts +3 -3
  420. package/templates/scaffold/src/map/(external)/hoppscotch/_states.ts +6 -0
  421. package/templates/scaffold/src/map/(external)/hoppscotch/settings/_nav.block.ts +3 -3
  422. package/templates/scaffold/src/map/(external)/mailpit/_keys.ts +13 -0
  423. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-content.method.block.ts +4 -4
  424. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-received.method.block.ts +4 -4
  425. package/templates/scaffold/src/map/(external)/mailpit/_methods/extract-email-link.method.block.ts +6 -5
  426. package/templates/scaffold/src/map/(external)/mailpit/_methods/open-message.method.block.ts +6 -5
  427. package/templates/scaffold/src/map/(external)/mailpit/_nav.block.ts +3 -3
  428. package/templates/scaffold/src/map/(external)/mailpit/_page.block.ts +3 -3
  429. package/templates/scaffold/src/map/(external)/mailpit/_states.ts +9 -0
  430. package/templates/scaffold/src/map/README.md +7 -0
  431. package/templates/scaffold/src/states/README.md +4 -1
  432. package/templates/scaffold/src/states/demo.mem-keys.ts +1 -29
  433. package/templates/scaffold/src/states/demo.states.ts +14 -20
  434. package/templates/scaffold/tests/hoppscotch.spec.ts +1 -11
  435. package/templates/scaffold/tests/mail-verify.spec.ts +2 -2
  436. package/templates/skills/waygraph-blind-pilot.skill.md +2 -6
  437. package/templates/skills/waygraph-convention.skill.md +23 -14
  438. package/templates/skills/waygraph-pilot.skill.md +7 -4
  439. package/dist/auto-session/session.d.ts +0 -193
  440. package/dist/auto-session/session.js +0 -719
  441. package/dist/auto-session/verbose-log.js +0 -16
  442. package/dist/auto-session.d.ts +0 -2
  443. package/dist/auto-session.js +0 -3
  444. package/dist/cli/discover.d.ts +0 -40
  445. package/dist/cli/discover.js +0 -148
  446. package/dist/commands/agent-dive.js +0 -52
  447. package/dist/commands/check.js +0 -192
  448. package/dist/commands/map.js +0 -29
  449. package/dist/commands/run.js +0 -104
  450. package/dist/commands/session.js +0 -600
  451. package/dist/commands/traverse.js +0 -177
  452. package/dist/core/block.d.ts +0 -109
  453. package/dist/core/blocks/effect.js +0 -23
  454. package/dist/core/config.js +0 -17
  455. package/dist/core/engine.d.ts +0 -198
  456. package/dist/core/flow.d.ts +0 -294
  457. package/dist/core/flow.js +0 -432
  458. package/dist/core/map-builder.js +0 -383
  459. package/dist/core.d.ts +0 -14
  460. package/dist/core.js +0 -15
  461. package/dist/highlights/merge.d.ts +0 -8
  462. package/dist/highlights/merge.js +0 -173
  463. package/dist/highlights/run-phase.d.ts +0 -43
  464. package/dist/highlights/stub-ctx.d.ts +0 -10
  465. package/dist/highlights/stub-ctx.js +0 -331
  466. package/dist/highlights/types.d.ts +0 -613
  467. package/dist/highlights.d.ts +0 -9
  468. package/dist/highlights.js +0 -10
  469. package/dist/pilot-overlay.d.ts +0 -5
  470. package/dist/pilot-overlay.js +0 -6
  471. package/dist/runner/banner-log.js +0 -63
  472. package/dist/runner/chain-run.js +0 -102
  473. package/dist/runner/cursor.js +0 -140
  474. package/dist/runner/demo-log.js +0 -316
  475. package/dist/runner/device-stage.d.ts +0 -9
  476. package/dist/runner/device-stage.js +0 -420
  477. package/dist/runner/discovery.js +0 -105
  478. package/dist/runner/index.js +0 -2
  479. package/dist/runner/inpage/banner.d.ts +0 -21
  480. package/dist/runner/inpage/banner.js +0 -156
  481. package/dist/runner/inpage/caption.d.ts +0 -3
  482. package/dist/runner/inpage/caption.js +0 -23
  483. package/dist/runner/inpage/core.d.ts +0 -4
  484. package/dist/runner/inpage/core.js +0 -316
  485. package/dist/runner/inpage/device.d.ts +0 -3
  486. package/dist/runner/inpage/device.js +0 -211
  487. package/dist/runner/inpage/network.d.ts +0 -15
  488. package/dist/runner/inpage/network.js +0 -217
  489. package/dist/runner/inpage/panel-chrome.js +0 -192
  490. package/dist/runner/inpage/stamp.js +0 -46
  491. package/dist/runner/inpage/swipe-zoom.js +0 -220
  492. package/dist/runner/inpage/todos.js +0 -337
  493. package/dist/runner/interaction-patch.js +0 -384
  494. package/dist/runner/main.js +0 -469
  495. package/dist/runner/network-capture.d.ts +0 -9
  496. package/dist/runner/network-capture.js +0 -126
  497. package/dist/runner/overlay-css.d.ts +0 -3
  498. package/dist/runner/overlay-css.js +0 -377
  499. package/dist/runner/overlay-install.js +0 -90
  500. package/dist/runner/overlay-stage.js +0 -110
  501. package/dist/runner/rings.js +0 -514
  502. package/dist/runner/seed-mem.js +0 -110
  503. package/dist/runner/slides.js +0 -278
  504. package/dist/runner/step-mode.js +0 -703
  505. package/dist/runner/step-panels.js +0 -729
  506. package/dist/runner/teardown.js +0 -202
  507. package/dist/runner/todo-dock.js +0 -142
  508. package/dist/session/auto-explore-run.d.ts +0 -40
  509. package/dist/session/auto-explore-run.js +0 -707
  510. package/dist/session/step-overlay.d.ts +0 -37
  511. package/dist/session/step-overlay.js +0 -244
  512. package/dist/traverse/run.js +0 -423
  513. package/examples/routed-demo/playwright.config.ts +0 -21
  514. package/examples/saucedemo/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
  515. package/templates/quickstart/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
  516. /package/dist/{commands → cli/commands}/agent-dive-scaffold.d.ts +0 -0
  517. /package/dist/{commands → cli/commands}/agent-dive.d.ts +0 -0
  518. /package/dist/{commands → cli/commands}/extensions.d.ts +0 -0
  519. /package/dist/{commands → cli/commands}/init.d.ts +0 -0
  520. /package/dist/{commands → cli/commands}/list.d.ts +0 -0
  521. /package/dist/{commands → cli/commands}/map.d.ts +0 -0
  522. /package/dist/{commands → cli/commands}/session.d.ts +0 -0
  523. /package/dist/{commands → cli/commands}/test.d.ts +0 -0
  524. /package/dist/{commands → cli/commands}/traverse.d.ts +0 -0
  525. /package/dist/{commands → cli/commands}/try.d.ts +0 -0
  526. /package/dist/{commands → cli/commands}/upgrade.d.ts +0 -0
  527. /package/dist/{highlights → demo/narration}/shorthand.js +0 -0
  528. /package/dist/{session/overlay-beacon.d.ts → demo/overlay/beacon.d.ts} +0 -0
  529. /package/dist/{session/overlay-beacon.js → demo/overlay/beacon.js} +0 -0
  530. /package/dist/{pilot-overlay/action-ring.d.ts → demo/overlay/pilot/actions.d.ts} +0 -0
  531. /package/dist/{ui → demo/overlay/ui}/components/ring.d.ts +0 -0
  532. /package/dist/{ui → demo/overlay/ui}/stylesheet.d.ts +0 -0
  533. /package/dist/{ui → demo/overlay/ui}/stylesheet.js +0 -0
  534. /package/dist/{ui → demo/overlay/ui}/tokens.d.ts +0 -0
  535. /package/dist/{ui → demo/overlay/ui}/tokens.js +0 -0
  536. /package/dist/{highlights → demo}/types.js +0 -0
  537. /package/dist/{auto-session → demo}/verbose-log.d.ts +0 -0
  538. /package/dist/{selector.d.ts → engine/trait/selector.d.ts} +0 -0
  539. /package/dist/{selector.js → engine/trait/selector.js} +0 -0
  540. /package/dist/{traverse → live/traverse}/coverage.d.ts +0 -0
  541. /package/dist/{traverse → live/traverse}/coverage.js +0 -0
  542. /package/dist/{traverse → live/traverse}/lease.d.ts +0 -0
  543. /package/dist/{traverse → live/traverse}/lease.js +0 -0
  544. /package/dist/{session/block-inject.d.ts → manifest/roots.d.ts} +0 -0
  545. /package/dist/{blocks-select.d.ts → manifest/select.d.ts} +0 -0
  546. /package/dist/{blocks-select.js → manifest/select.js} +0 -0
  547. /package/dist/{browser.d.ts → runtime/browser.d.ts} +0 -0
  548. /package/dist/{env-file.d.ts → runtime/env-file.d.ts} +0 -0
  549. /package/dist/{playwright-config.js → runtime/playwright-config.js} +0 -0
  550. /package/dist/{playwright.config.d.ts → runtime/playwright.config.d.ts} +0 -0
  551. /package/dist/{video-dir.d.ts → runtime/video-dir.d.ts} +0 -0
  552. /package/dist/{webserver.d.ts → runtime/webserver.d.ts} +0 -0
@@ -1,5 +1,5 @@
1
- import { defineMethodBlock, checkpoint } from "waygraph";
2
- import type { CheckoutInfoPage } from "../../../../states/checkout.states.js";
1
+ import { defineMethodBlock } from "waygraph";
2
+ import { CheckoutInfoPage } from "../../../../states/checkout.states.js";
3
3
  import { CheckoutInfoSel } from "./checkout-info.sel.js";
4
4
 
5
5
  /**
@@ -9,13 +9,14 @@ import { CheckoutInfoSel } from "./checkout-info.sel.js";
9
9
  *
10
10
  * Fills the postal code field only - self-loop on CheckoutInfoPage.
11
11
  */
12
- export const FillPostalCodeBlock = defineMethodBlock<CheckoutInfoPage, CheckoutInfoPage>({
12
+ export const FillPostalCodeBlock = defineMethodBlock({
13
13
  name: "fill-postal-code",
14
14
  description: "Fills the postal code field on the shipping info form.",
15
+ from: CheckoutInfoPage,
16
+ to: CheckoutInfoPage,
15
17
  instruction: {
16
18
  async act(page) {
17
19
  await page.locator(CheckoutInfoSel.postalCode).fill("1000");
18
20
  },
19
- resolve: () => checkpoint("CheckoutInfoPage"),
20
21
  },
21
22
  });
@@ -1,5 +1,5 @@
1
- import { defineMethodBlock, checkpoint, Trait } from "waygraph";
2
- import type { CheckoutInfoPage, CheckoutOverviewPage } from "../../../../states/checkout.states.js";
1
+ import { defineMethodBlock, Trait } from "waygraph";
2
+ import { CheckoutInfoPage, CheckoutOverviewPage } from "../../../../states/checkout.states.js";
3
3
  import { CheckoutInfoSel } from "./checkout-info.sel.js";
4
4
 
5
5
  /**
@@ -11,14 +11,15 @@ import { CheckoutInfoSel } from "./checkout-info.sel.js";
11
11
  * fill-last-name / fill-postal-code (each its own Block). One Block, one
12
12
  * action: submit.
13
13
  */
14
- export const SubmitCheckoutInfoBlock = defineMethodBlock<CheckoutInfoPage, CheckoutOverviewPage>({
14
+ export const SubmitCheckoutInfoBlock = defineMethodBlock({
15
15
  name: "submit-checkout-info",
16
16
  description: "Continues from the shipping info form to the order overview.",
17
+ from: CheckoutInfoPage,
18
+ to: CheckoutOverviewPage,
17
19
  instruction: {
18
20
  async act(page) {
19
21
  await page.locator(CheckoutInfoSel.continueBtn).click();
20
22
  },
21
- resolve: () => checkpoint("CheckoutOverviewPage"),
22
23
  verify: [Trait.url({ pathname: "/checkout-step-two.html" })],
23
24
  },
24
25
  });
@@ -1,5 +1,5 @@
1
- import { defineMethodBlock, checkpoint, Trait, narrate } from "waygraph";
2
- import type {
1
+ import { defineMethodBlock, Trait, narrate } from "waygraph";
2
+ import {
3
3
  CheckoutOverviewPage,
4
4
  OrderComplete,
5
5
  } from "../../../../states/checkout.states.js";
@@ -11,15 +11,13 @@ import { CheckoutOverviewSel } from "./checkout-overview.sel.js";
11
11
  * Route: saucedemo-web/checkout-step-two/methods/ (= /checkout-step-two.html)
12
12
  *
13
13
  * Places the order on the overview page - form/finish click, not a NavBlock.
14
- * Stubs use open ctx lifecycles (preferred) - not static slot maps.
15
14
  */
16
- export const FinishOrderBlock = defineMethodBlock<
17
- CheckoutOverviewPage,
18
- OrderComplete
19
- >({
15
+ export const FinishOrderBlock = defineMethodBlock({
20
16
  name: "finish-order",
21
17
  description:
22
18
  "Places the order and confirms the 'Thank you for your order!' completion page.",
19
+ from: CheckoutOverviewPage,
20
+ to: OrderComplete,
23
21
  instruction: {
24
22
  async act(page) {
25
23
  const finishButton = page.locator(CheckoutOverviewSel.finishBtn);
@@ -27,7 +25,6 @@ export const FinishOrderBlock = defineMethodBlock<
27
25
  finishButton.click(),
28
26
  );
29
27
  },
30
- resolve: () => checkpoint("OrderComplete"),
31
28
  verify: [
32
29
  Trait.text(
33
30
  CheckoutOverviewSel.completeHeader,
@@ -1,5 +1,5 @@
1
1
  import { definePageBlock, Trait } from "waygraph";
2
- import type { LoggedIn } from "../../../states/checkout.states.js";
2
+ import { LoggedIn } from "../../../states/checkout.states.js";
3
3
  import { AddToCartBlock } from "./methods/add-to-cart.effect.block.js";
4
4
  import { RemoveFromCartBlock } from "./methods/remove-from-cart.effect.block.js";
5
5
  import { AddAllToCartBlock } from "./methods/add-all-to-cart.method.block.js";
@@ -18,11 +18,11 @@ import { InventorySel } from "./methods/inventory-items.js";
18
18
  * to LoggedIn. Cart Effects/Methods use In Checkpoint<string> (from: "*") so
19
19
  * auto still offers them after leave/return - menu follows live DOM buttons.
20
20
  */
21
- export const InventoryPageBlock = definePageBlock<LoggedIn>({
21
+ export const InventoryPageBlock = definePageBlock({
22
22
  name: "page-inventory",
23
23
  description:
24
24
  "Inventory catalog hub - per-item and bulk add/remove, open item detail.",
25
- checkpoint: "LoggedIn",
25
+ checkpoint: LoggedIn,
26
26
  verify: [
27
27
  Trait.url({ pathname: "/inventory.html" }),
28
28
  Trait.visible(InventorySel.list),
@@ -1,5 +1,5 @@
1
- import { defineMethodBlock, checkpoint, type Checkpoint } from "waygraph";
2
- import type { RemoveFromCartOutcome } from "../../../../states/checkout.states.js";
1
+ import { defineMethodBlock, checkpoint } from "waygraph";
2
+ import { RemoveFromCartOutcome } from "../../../../states/checkout.states.js";
3
3
  import { collectAddableItems, InventorySel } from "./inventory-items.js";
4
4
 
5
5
  type BulkObserve = "added" | "nothing";
@@ -14,12 +14,10 @@ type BulkObserve = "added" | "nothing";
14
14
  * leave inventory and return, collectors re-read Add buttons from the DOM.
15
15
  * Out: ItemInCart if the cart has items after; LoggedIn if still empty.
16
16
  */
17
- export const AddAllToCartBlock = defineMethodBlock<
18
- Checkpoint<string>,
19
- RemoveFromCartOutcome
20
- >({
17
+ export const AddAllToCartBlock = defineMethodBlock({
21
18
  name: "add-all-to-cart",
22
19
  description: "Adds every product still showing Add to cart on this page.",
20
+ to: RemoveFromCartOutcome,
23
21
  instruction: {
24
22
  async act(page) {
25
23
  const items = await collectAddableItems(page);
@@ -1,14 +1,8 @@
1
- import {
2
- defineEffectBlock,
3
- checkpoint,
4
- type Checkpoint,
5
- type WaygraphInstanceOption,
6
- } from "waygraph";
7
- import type { ItemInCart } from "../../../../states/checkout.states.js";
1
+ import { defineEffectBlock, type WaygraphInstanceOption } from "waygraph";
2
+ import { ItemInCart } from "../../../../states/checkout.states.js";
8
3
  import { SelectedItem } from "../../../../states/checkout.mem-keys.js";
9
4
  import { collectAddableItems, InventorySel } from "./inventory-items.js";
10
5
 
11
-
12
6
  /**
13
7
  * Kind: Effect
14
8
  * Helper: defineEffectBlock
@@ -17,40 +11,38 @@ import { collectAddableItems, InventorySel } from "./inventory-items.js";
17
11
  * Mutates cart for the mem-picked product. waygraph auto lists one
18
12
  * "Add ..." row per live Add button via instanceOptions.
19
13
  */
20
- export const AddToCartBlock = defineEffectBlock<Checkpoint<string>, ItemInCart>(
21
- {
22
- name: "add-to-cart",
23
- description:
24
- "Adds the item named by mem (saucedemo.selectedItem) to the cart.",
25
- requires: [SelectedItem.key],
26
- instruction: {
27
- async act(page, _input, mem) {
28
- const { id } = mem.get(SelectedItem.key);
29
- await page.locator(InventorySel.addBtn(id)).click();
30
- },
31
- resolve: () => checkpoint("ItemInCart"),
32
- verify: [
33
- {
34
- name: "item-added-to-cart",
35
- async check(page, mem) {
36
- const { id } = mem.get(SelectedItem.key);
37
- return await page
38
- .locator(InventorySel.removeBtn(id))
39
- .first()
40
- .isVisible();
41
- },
42
- },
43
- ],
44
- },
45
- async instanceOptions(page): Promise<readonly WaygraphInstanceOption[]> {
46
- const items = await collectAddableItems(page);
47
- return items.map((item) => ({
48
- id: item.id,
49
- label: `Add "${item.name}" to cart`,
50
- key: SelectedItem.key,
51
- value: item,
52
- highlight: InventorySel.addBtn(item.id),
53
- }));
14
+ export const AddToCartBlock = defineEffectBlock({
15
+ name: "add-to-cart",
16
+ description:
17
+ "Adds the item named by mem (saucedemo.selectedItem) to the cart.",
18
+ to: ItemInCart,
19
+ requires: [SelectedItem.key],
20
+ instruction: {
21
+ async act(page, _input, mem) {
22
+ const { id } = mem.get(SelectedItem.key);
23
+ await page.locator(InventorySel.addBtn(id)).click();
54
24
  },
25
+ verify: [
26
+ {
27
+ name: "item-added-to-cart",
28
+ async check(page, mem) {
29
+ const { id } = mem.get(SelectedItem.key);
30
+ return await page
31
+ .locator(InventorySel.removeBtn(id))
32
+ .first()
33
+ .isVisible();
34
+ },
35
+ },
36
+ ],
37
+ },
38
+ async instanceOptions(page): Promise<readonly WaygraphInstanceOption[]> {
39
+ const items = await collectAddableItems(page);
40
+ return items.map((item) => ({
41
+ id: item.id,
42
+ label: `Add "${item.name}" to cart`,
43
+ key: SelectedItem.key,
44
+ value: item,
45
+ highlight: InventorySel.addBtn(item.id),
46
+ }));
55
47
  },
56
- );
48
+ });
@@ -1,5 +1,5 @@
1
- import { defineMethodBlock, checkpoint, type Checkpoint } from "waygraph";
2
- import type { RemoveFromCartOutcome } from "../../../../states/checkout.states.js";
1
+ import { defineMethodBlock, checkpoint } from "waygraph";
2
+ import { RemoveFromCartOutcome } from "../../../../states/checkout.states.js";
3
3
  import { collectRemovableItems, InventorySel } from "./inventory-items.js";
4
4
 
5
5
  type BulkObserve = "still-has-items" | "cart-empty";
@@ -14,12 +14,10 @@ type BulkObserve = "still-has-items" | "cart-empty";
14
14
  * single-item remove. Out: LoggedIn when cart empty; ItemInCart if anything
15
15
  * remains (partial failure / race).
16
16
  */
17
- export const RemoveAllFromCartBlock = defineMethodBlock<
18
- Checkpoint<string>,
19
- RemoveFromCartOutcome
20
- >({
17
+ export const RemoveAllFromCartBlock = defineMethodBlock({
21
18
  name: "remove-all-from-cart",
22
19
  description: "Removes every product still showing Remove on this page.",
20
+ to: RemoveFromCartOutcome,
23
21
  instruction: {
24
22
  async act(page) {
25
23
  const items = await collectRemovableItems(page);
@@ -1,5 +1,5 @@
1
- import { defineEffectBlock, checkpoint, type Checkpoint, type WaygraphInstanceOption } from "waygraph";
2
- import type { RemoveFromCartOutcome } from "../../../../states/checkout.states.js";
1
+ import { defineEffectBlock, checkpoint, type WaygraphInstanceOption } from "waygraph";
2
+ import { RemoveFromCartOutcome } from "../../../../states/checkout.states.js";
3
3
  import { SelectedItem } from "../../../../states/checkout.mem-keys.js";
4
4
  import { collectRemovableItems, InventorySel } from "./inventory-items.js";
5
5
 
@@ -13,9 +13,10 @@ type RemoveObserve = "still-has-items" | "cart-empty";
13
13
  * Removes the mem-picked product. After Add, waygraph auto shows matching
14
14
  * "Remove ..." rows from live Remove buttons.
15
15
  */
16
- export const RemoveFromCartBlock = defineEffectBlock<Checkpoint<string>, RemoveFromCartOutcome>({
16
+ export const RemoveFromCartBlock = defineEffectBlock({
17
17
  name: "remove-from-cart",
18
18
  description: "Removes the item named by mem (saucedemo.selectedItem) from the cart.",
19
+ to: RemoveFromCartOutcome,
19
20
  requires: [SelectedItem.key],
20
21
  instruction: {
21
22
  async act(page, _input, mem) {
@@ -1,5 +1,5 @@
1
1
  import { defineMemNavBlock, Trait, type WaygraphInstanceOption } from "waygraph";
2
- import type { ItemDetailPage } from "../../../states/checkout.states.js";
2
+ import { ItemDetailPage } from "../../../states/checkout.states.js";
3
3
  import { SelectedItem } from "../../../states/checkout.mem-keys.js";
4
4
  import {
5
5
  collectInventoryItems,
@@ -14,10 +14,10 @@ import {
14
14
  * Opens the mem-picked product detail page. waygraph auto lists one
15
15
  * "Open ... details" row per inventory card via instanceOptions.
16
16
  */
17
- export const NavItemDetailBlock = defineMemNavBlock<ItemDetailPage>({
17
+ export const NavItemDetailBlock = defineMemNavBlock({
18
18
  name: "nav-item-detail",
19
19
  description: "Opens the product named by mem (saucedemo.selectedItem) on its detail page.",
20
- checkpoint: "ItemDetailPage",
20
+ checkpoint: ItemDetailPage,
21
21
  requires: [SelectedItem.key],
22
22
  click: (mem) => InventorySel.title(mem.get(SelectedItem.key).id),
23
23
  verify: [Trait.url({ pathname: "/inventory-item.html" })],
@@ -1,5 +1,5 @@
1
1
  import { defineNavClickBlock, Trait } from "waygraph";
2
- import type { LoggedIn } from "../../../states/checkout.states.js";
2
+ import { LoggedIn } from "../../../states/checkout.states.js";
3
3
  import { ItemDetailSel } from "./item-detail.sel.js";
4
4
 
5
5
  /**
@@ -10,10 +10,10 @@ import { ItemDetailSel } from "./item-detail.sel.js";
10
10
  * click, not url - detail page "Back to products". Separate Block from
11
11
  * nav-back-to-products (different From Checkpoint; atomic convention).
12
12
  */
13
- export const NavBackToInventoryBlock = defineNavClickBlock<LoggedIn>({
13
+ export const NavBackToInventoryBlock = defineNavClickBlock({
14
14
  name: "nav-back-to-inventory",
15
15
  description: "Clicks 'Back to products' on the item detail page.",
16
- checkpoint: "LoggedIn",
16
+ checkpoint: LoggedIn,
17
17
  click: ItemDetailSel.backToProductsBtn,
18
18
  verify: [Trait.url({ pathname: "/inventory.html" })],
19
19
  });
@@ -1,5 +1,5 @@
1
1
  import { defineNavClickBlock, Trait } from "waygraph";
2
- import type { LoggedIn } from "../../../states/checkout.states.js";
2
+ import { LoggedIn } from "../../../states/checkout.states.js";
3
3
  import { ItemDetailSel } from "./item-detail.sel.js";
4
4
 
5
5
  /**
@@ -10,10 +10,10 @@ import { ItemDetailSel } from "./item-detail.sel.js";
10
10
  * click, not url - order-complete "Back Home" proves the button path
11
11
  * (a url NavBlock would teleport without exercising the control).
12
12
  */
13
- export const NavBackToProductsBlock = defineNavClickBlock<LoggedIn>({
13
+ export const NavBackToProductsBlock = defineNavClickBlock({
14
14
  name: "nav-back-to-products",
15
15
  description: "Clicks 'Back Home' on the order confirmation page.",
16
- checkpoint: "LoggedIn",
16
+ checkpoint: LoggedIn,
17
17
  click: ItemDetailSel.backToProductsBtn,
18
18
  verify: [Trait.url({ pathname: "/inventory.html" })],
19
19
  });
@@ -1,5 +1,5 @@
1
1
  import { defineNavClickBlock, Trait } from "waygraph";
2
- import type { LoggedIn } from "../../../states/checkout.states.js";
2
+ import { LoggedIn } from "../../../states/checkout.states.js";
3
3
  import { ItemDetailSel } from "./item-detail.sel.js";
4
4
 
5
5
  /**
@@ -9,10 +9,10 @@ import { ItemDetailSel } from "./item-detail.sel.js";
9
9
  *
10
10
  * click, not url - cart page "Continue Shopping" proves the app's own path.
11
11
  */
12
- export const NavContinueShoppingBlock = defineNavClickBlock<LoggedIn>({
12
+ export const NavContinueShoppingBlock = defineNavClickBlock({
13
13
  name: "nav-continue-shopping",
14
14
  description: "Clicks 'Continue Shopping' on the cart page.",
15
- checkpoint: "LoggedIn",
15
+ checkpoint: LoggedIn,
16
16
  click: ItemDetailSel.continueShoppingBtn,
17
17
  verify: [Trait.url({ pathname: "/inventory.html" })],
18
18
  });
@@ -1,5 +1,5 @@
1
- import { defineMethodBlock, checkpoint } from "waygraph";
2
- import type { LoginPage } from "../../../states/checkout.states.js";
1
+ import { defineMethodBlock } from "waygraph";
2
+ import { LoginPage } from "../../../states/checkout.states.js";
3
3
  import { LoginCreds } from "../../../states/checkout.mem-keys.js";
4
4
  import { LoginSel } from "./login.sel.js";
5
5
 
@@ -11,15 +11,16 @@ import { LoginSel } from "./login.sel.js";
11
11
  * Fills the password field only - self-loop on LoginPage. See
12
12
  * fill-username.method.block.ts for why this is split from submit.
13
13
  */
14
- export const FillPasswordBlock = defineMethodBlock<LoginPage, LoginPage>({
14
+ export const FillPasswordBlock = defineMethodBlock({
15
15
  name: "fill-password",
16
16
  description: "Fills the password field on the login form.",
17
+ from: LoginPage,
18
+ to: LoginPage,
17
19
  requires: [LoginCreds.key],
18
20
  instruction: {
19
21
  async act(page, _input, mem) {
20
22
  const { password } = mem.get(LoginCreds.key);
21
23
  await page.locator(LoginSel.password).fill(password);
22
24
  },
23
- resolve: () => checkpoint("LoginPage"),
24
25
  },
25
26
  });
@@ -1,5 +1,5 @@
1
- import { defineMethodBlock, checkpoint } from "waygraph";
2
- import type { LoginPage } from "../../../states/checkout.states.js";
1
+ import { defineMethodBlock } from "waygraph";
2
+ import { LoginPage } from "../../../states/checkout.states.js";
3
3
  import { LoginCreds } from "../../../states/checkout.mem-keys.js";
4
4
  import { LoginSel } from "./login.sel.js";
5
5
 
@@ -13,15 +13,16 @@ import { LoginSel } from "./login.sel.js";
13
13
  * graph/demo show fill vs submit as real, distinct steps instead of one
14
14
  * Block doing "input username and password and login at the same time".
15
15
  */
16
- export const FillUsernameBlock = defineMethodBlock<LoginPage, LoginPage>({
16
+ export const FillUsernameBlock = defineMethodBlock({
17
17
  name: "fill-username",
18
18
  description: "Fills the username field on the login form.",
19
+ from: LoginPage,
20
+ to: LoginPage,
19
21
  requires: [LoginCreds.key],
20
22
  instruction: {
21
23
  async act(page, _input, mem) {
22
24
  const { username } = mem.get(LoginCreds.key);
23
25
  await page.locator(LoginSel.username).fill(username);
24
26
  },
25
- resolve: () => checkpoint("LoginPage"),
26
27
  },
27
28
  });
@@ -1,5 +1,5 @@
1
1
  import { defineMethodBlock, checkpoint, Trait } from "waygraph";
2
- import type {
2
+ import {
3
3
  LoginPage,
4
4
  LoginSubmitOutcome,
5
5
  } from "../../../states/checkout.states.js";
@@ -17,12 +17,11 @@ type LoginObserve = "success" | "failure";
17
17
  * already did that). One Block, one action: submit.
18
18
  * Branches: good creds -> LoggedIn; bad/locked -> LoginPage with error banner.
19
19
  */
20
- export const SubmitLoginBlock = defineMethodBlock<
21
- LoginPage,
22
- LoginSubmitOutcome
23
- >({
20
+ export const SubmitLoginBlock = defineMethodBlock({
24
21
  name: "submit-login",
25
22
  description: "Submits the login form; stays on LoginPage when auth fails.",
23
+ from: LoginPage,
24
+ to: LoginSubmitOutcome,
26
25
  instruction: {
27
26
  async act(page) {
28
27
  // noWaitAfter: observe owns the inventory URL wait. Default click
@@ -1,5 +1,5 @@
1
- import { defineMethodBlock, checkpoint, Trait } from "waygraph";
2
- import type { LoggedIn, LoginPage } from "../../../states/checkout.states.js";
1
+ import { defineMethodBlock, Trait } from "waygraph";
2
+ import { LoggedIn, LoginPage } from "../../../states/checkout.states.js";
3
3
  import { LoginSel } from "./login.sel.js";
4
4
 
5
5
  /**
@@ -9,15 +9,16 @@ import { LoginSel } from "./login.sel.js";
9
9
  *
10
10
  * Burger menu Logout - real cycle back to LoginPage (same Checkpoint nav-login lands on).
11
11
  */
12
- export const SubmitLogoutBlock = defineMethodBlock<LoggedIn, LoginPage>({
12
+ export const SubmitLogoutBlock = defineMethodBlock({
13
13
  name: "submit-logout",
14
14
  description: "Opens the burger menu and logs out.",
15
+ from: LoggedIn,
16
+ to: LoginPage,
15
17
  instruction: {
16
18
  async act(page) {
17
19
  await page.locator(LoginSel.burgerMenuButton).click();
18
20
  await page.locator(LoginSel.logoutLink).click();
19
21
  },
20
- resolve: () => checkpoint("LoginPage"),
21
22
  verify: [Trait.visible(LoginSel.loginButton)],
22
23
  },
23
24
  });
@@ -1,5 +1,5 @@
1
1
  import { definePageBlock, Trait } from "waygraph";
2
- import type { LoginPage } from "../../states/checkout.states.js";
2
+ import { LoginPage } from "../../states/checkout.states.js";
3
3
  import { FillUsernameBlock } from "./methods/fill-username.method.block.js";
4
4
  import { FillPasswordBlock } from "./methods/fill-password.method.block.js";
5
5
  import { SubmitLoginBlock } from "./methods/submit-login.method.block.js";
@@ -17,10 +17,10 @@ import { LoginSel } from "./methods/login.sel.js";
17
17
  * and submits. Name stays `nav-login` so existing flows / chain specs keep
18
18
  * working.
19
19
  */
20
- export const NavLoginBlock = definePageBlock<LoginPage>({
20
+ export const NavLoginBlock = definePageBlock({
21
21
  name: "nav-login",
22
22
  description: "Goes to the Swag Labs login page.",
23
- checkpoint: "LoginPage",
23
+ checkpoint: LoginPage,
24
24
  url: "/",
25
25
  verify: [Trait.visible(LoginSel.loginButton)],
26
26
  methods: {
@@ -1,5 +1,4 @@
1
1
  import { checkpoint, defineApiBlock } from "waygraph";
2
- import type { Checkpoint, StubCtx } from "waygraph";
3
2
  import { engine } from "../../config/waygraph.config.js";
4
3
  import { loginFlow } from "./login.flow.js";
5
4
 
@@ -15,24 +14,27 @@ import { loginFlow } from "./login.flow.js";
15
14
  * hits a well-known public REST test API (jsonplaceholder) purely to prove
16
15
  * the mechanism - a real project would point `call` at its own backend.
17
16
  */
18
- export type BackendHealthy = Checkpoint<"BackendHealthy">;
19
- export type BackendDown = Checkpoint<"BackendDown">;
17
+ export const BackendHealthy = checkpoint("BackendHealthy");
18
+ export type BackendHealthy = typeof BackendHealthy;
19
+ export const BackendDown = checkpoint("BackendDown");
20
+ export type BackendDown = typeof BackendDown;
20
21
 
21
- const CheckBackendHealth = defineApiBlock<any, BackendHealthy | BackendDown>({
22
+ const CheckBackendHealth = defineApiBlock({
22
23
  name: "check-backend-health",
24
+ to: [BackendHealthy, BackendDown],
23
25
  call: ({ request }) =>
24
26
  request.get("https://jsonplaceholder.typicode.com/todos/1"),
25
- resolve: (result) =>
26
- result.ok ? checkpoint("BackendHealthy") : checkpoint("BackendDown"),
27
- stubBefore: (ctx: StubCtx<BackendHealthy | BackendDown>) => {
28
- ctx.title("Checking backend health · real HTTP request, no browser");
29
- },
27
+ resolve: (result) => (result.ok ? BackendHealthy : BackendDown),
30
28
  });
31
29
 
32
30
  export const apiDemoEpisode = engine
33
31
  .map()
34
32
  .start()
35
- .method(CheckBackendHealth)
33
+ .method(
34
+ CheckBackendHealth.stubBefore((ctx) => {
35
+ ctx.title("Checking backend health · real HTTP request, no browser");
36
+ }),
37
+ )
36
38
  .end();
37
39
 
38
40
  export const apiDemoFlow = engine
@@ -1,19 +1,29 @@
1
- import type { Checkpoint } from "waygraph";
1
+ import { checkpoint } from "waygraph";
2
2
 
3
3
  // One Checkpoint per real state the target app can be in - kept together so the
4
4
  // whole checkout flow's state space reads in one place, the same reason a
5
5
  // backend keeps its models together instead of scattered across handlers.
6
6
  // `Start` is waygraph's own exported type, not redeclared here.
7
7
 
8
- export type LoginPage = Checkpoint<"LoginPage">;
9
- export type LoggedIn = Checkpoint<"LoggedIn">;
8
+ export const LoginPage = checkpoint("LoginPage");
9
+ export type LoginPage = typeof LoginPage;
10
+ export const LoggedIn = checkpoint("LoggedIn");
11
+ export type LoggedIn = typeof LoggedIn;
10
12
  /** submit-login: inventory on success, login form + error banner on auth failure. */
11
- export type LoginSubmitOutcome = LoggedIn | LoginPage;
12
- export type ItemInCart = Checkpoint<"ItemInCart">;
13
+ export const LoginSubmitOutcome = [LoggedIn, LoginPage] as const;
14
+ export type LoginSubmitOutcome = (typeof LoginSubmitOutcome)[number];
15
+ export const ItemInCart = checkpoint("ItemInCart");
16
+ export type ItemInCart = typeof ItemInCart;
13
17
  /** remove-from-cart: still has items → ItemInCart; empty cart → LoggedIn. */
14
- export type RemoveFromCartOutcome = ItemInCart | LoggedIn;
15
- export type CartPage = Checkpoint<"CartPage">;
16
- export type CheckoutInfoPage = Checkpoint<"CheckoutInfoPage">;
17
- export type CheckoutOverviewPage = Checkpoint<"CheckoutOverviewPage">;
18
- export type ItemDetailPage = Checkpoint<"ItemDetailPage">;
19
- export type OrderComplete = Checkpoint<"OrderComplete">;
18
+ export const RemoveFromCartOutcome = [ItemInCart, LoggedIn] as const;
19
+ export type RemoveFromCartOutcome = (typeof RemoveFromCartOutcome)[number];
20
+ export const CartPage = checkpoint("CartPage");
21
+ export type CartPage = typeof CartPage;
22
+ export const CheckoutInfoPage = checkpoint("CheckoutInfoPage");
23
+ export type CheckoutInfoPage = typeof CheckoutInfoPage;
24
+ export const CheckoutOverviewPage = checkpoint("CheckoutOverviewPage");
25
+ export type CheckoutOverviewPage = typeof CheckoutOverviewPage;
26
+ export const ItemDetailPage = checkpoint("ItemDetailPage");
27
+ export type ItemDetailPage = typeof ItemDetailPage;
28
+ export const OrderComplete = checkpoint("OrderComplete");
29
+ export type OrderComplete = typeof OrderComplete;
@@ -40,7 +40,7 @@ export const deviceShowcase = {
40
40
  before: (ctx: StubCtx) => {
41
41
  ctx.title("Signing in · mobile");
42
42
  ctx.device("mobile");
43
- ctx.portrait();
43
+ ctx.orientation("portrait");
44
44
  ctx.todos("saucedemo", ...checklist(0, 0));
45
45
  ctx.zoom(1.35);
46
46
  const fromMem = ctx.mem?.get(LoginCreds.key)?.username;
@@ -93,8 +93,8 @@ export const deviceShowcase = {
93
93
  });
94
94
  },
95
95
  after: (ctx: StubCtx) => {
96
- ctx.banner("Inventory · landscape");
97
- ctx.landscape();
96
+ ctx.title("Inventory · landscape");
97
+ ctx.orientation("landscape");
98
98
  ctx.todos("saucedemo", ...checklist(3, 3));
99
99
  ctx.ring("shelf", {
100
100
  selector: ".inventory_list",
@@ -111,7 +111,7 @@ export const deviceShowcase = {
111
111
  before: (ctx: StubCtx) => {
112
112
  ctx.title("Pick a product · tablet");
113
113
  ctx.device("tablet");
114
- ctx.portrait();
114
+ ctx.orientation("portrait");
115
115
  ctx.todos("saucedemo", ...checklist(3, 3));
116
116
  ctx.zoom(1.35);
117
117
  ctx.zoomOut(false);
@@ -138,7 +138,7 @@ export const deviceShowcase = {
138
138
  });
139
139
  },
140
140
  after: (ctx: StubCtx) => {
141
- ctx.banner("In the cart");
141
+ ctx.title("In the cart");
142
142
  ctx.todos("saucedemo", ...checklist(4, 4));
143
143
  ctx.zoomOut(false);
144
144
  ctx.ring("badge", {
@@ -155,7 +155,7 @@ export const deviceShowcase = {
155
155
  openCart: {
156
156
  before: (ctx: StubCtx) => {
157
157
  ctx.title("Open cart · landscape");
158
- ctx.landscape();
158
+ ctx.orientation("landscape");
159
159
  ctx.todos("saucedemo", ...checklist(5, 5));
160
160
  ctx.zoom(1.4);
161
161
  ctx.zoomOut(false);
@@ -167,15 +167,14 @@ export const deviceShowcase = {
167
167
  tone: "planned",
168
168
  focus: true,
169
169
  zoomOut: false,
170
- followMouse: false,
171
170
  weight: "bold",
172
171
  gesture: "tap",
173
172
  },
174
173
  });
175
174
  },
176
175
  after: (ctx: StubCtx) => {
177
- ctx.banner("Your cart · desktop");
178
- ctx.clearDevice();
176
+ ctx.title("Your cart · desktop");
177
+ ctx.hideDevice();
179
178
  ctx.hideTodos();
180
179
  ctx.zoomOut(true);
181
180
  ctx.ring("items", {
@@ -185,7 +184,6 @@ export const deviceShowcase = {
185
184
  tone: "success",
186
185
  focus: true,
187
186
  zoomOut: true,
188
- followMouse: false,
189
187
  duration: true,
190
188
  });
191
189
  },