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,30 +1,10 @@
1
1
  import type { Page } from "@playwright/test";
2
- import type { MemPage, MemKey } from "./mem-page.js";
3
- import type { Trait } from "./trait.js";
4
- import type { HighlightStubPhaseOrFn, WaygraphHighlight, WaygraphSlidesOrFn } from "./highlights.js";
5
- export type { WaygraphHighlight } from "./highlights.js";
6
- /**
7
- * A Checkpoint is identified solely by its string tag - a phantom marker with no
8
- * embedded data. Two Checkpoints with the same tag are the same state everywhere.
9
- */
10
- export type Checkpoint<Tag extends string> = {
11
- readonly __state: Tag;
12
- };
13
- /**
14
- * Builds a Checkpoint - spells `__state` for you so no call site does it by hand.
15
- * @example resolve: () => checkpoint("LoggedIn")
16
- */
17
- export declare function checkpoint<Tag extends string>(tag: Tag): Checkpoint<Tag>;
18
- /**
19
- * The type every entry Block's `In` must be - `runGraph` always seeds a fresh
20
- * run with `checkpoint("__start__")` as the fake initial input, so a Block
21
- * meant to lead off a Flow needs exactly this type. Exported so no project
22
- * has to know or hand-type the `"__start__"` literal itself - the same reason
23
- * `checkpoint()` exists instead of every call site spelling `{ __state: tag }`
24
- * by hand.
25
- * @example export const LoginBlock: Block<Start, LoggedIn> = { ... }
26
- */
27
- export type Start = Checkpoint<"__start__">;
2
+ import type { Checkpoint } from "../checkpoint/checkpoint.js";
3
+ import type { StubLifecycleFn } from "../stub/stub.js";
4
+ import type { WaygraphSlidesOrFn } from "../stub/ring.js";
5
+ import { MemPage } from "../mem/mem.js";
6
+ import type { MemKey } from "../mem/mem.js";
7
+ import type { Trait } from "../trait/trait.js";
28
8
  /**
29
9
  * The `page` a regular Block's `act()` is typed against via `defineBlock` -
30
10
  * structurally identical to Playwright's own `Page` (the same real object is
@@ -90,36 +70,14 @@ export interface Instruction<In extends Checkpoint<string>, Out extends Checkpoi
90
70
  */
91
71
  verify?: Trait[] | ((out: Out) => Trait[]);
92
72
  /**
93
- * Open block lifecycle **before / during** `act` (demo rings + fixtures).
94
- * Prefer `stubBefore(ctx) { ctx.todos(...); ctx.ring(...) }` — not a closed
95
- * slot object. Object map `{ email: { selector, label } }` remains a shorthand.
96
- * Flow {@link HighlightFixtureMap} still overrides ring labels.
97
- * @example stubBefore: (ctx) => {
98
- * ctx.todos(["Email", "Password", "Submit"]);
99
- * ctx.todoIndex(0);
100
- * ctx.highlights({ email: { selector: "#email", label: "Email" } });
101
- * }
102
- */
103
- stubBefore?: HighlightStubPhaseOrFn<Out>;
104
- /**
105
- * Open block lifecycle **after** resolve (step panel rings + fixtures).
106
- * Prefer `stubAfter(ctx) { ... }`. Object map shorthand still works.
107
- * Prefer this over legacy {@link Instruction.highlights}.
108
- * @example stubAfter: (ctx) => {
109
- * ctx.todoIndex(2);
110
- * ctx.ring("badge", { selector: ".cart", label: "Cart updated" });
111
- * }
73
+ * The demo's narration before the step, written by `Block.stubBefore((ctx) => ...)` where a flow uses the Block (stubs
74
+ * chained there add up). Not something to set in a Block's definition: Blocks carry no narration.
112
75
  */
113
- stubAfter?: HighlightStubPhaseOrFn<Out>;
114
- /**
115
- * Open block lifecycle when a **step throws** (failed verify / act error) -
116
- * before the error panel. Success-only {@link Instruction.stubAfter} never runs
117
- * here. Prefer `stubOnError(ctx) { ... }`.
118
- * @example stubOnError: (ctx) => {
119
- * ctx.ring("card", { selector: ".alt-1", label: "Card at failure", tag: "BUG" });
120
- * }
121
- */
122
- stubOnError?: HighlightStubPhaseOrFn<Out>;
76
+ stubBefore?: StubLifecycleFn<Out>;
77
+ /** After the step lands; written by `Block.stubAfter((ctx) => ...)`. */
78
+ stubAfter?: StubLifecycleFn<Out>;
79
+ /** When the step fails, before the failure panel; written by `Block.stubOnError((ctx) => ...)`. */
80
+ stubOnError?: StubLifecycleFn<Out>;
123
81
  /**
124
82
  * Multi-step demo captions ("yap" slides) with Next between each -
125
83
  * not block lifecycle. Explains a long process; optional `selector` rings
@@ -130,11 +88,6 @@ export interface Instruction<In extends Checkpoint<string>, Out extends Checkpoi
130
88
  * ]
131
89
  */
132
90
  slides?: WaygraphSlidesOrFn<Out>;
133
- /**
134
- * @deprecated Prefer {@link Instruction.stubAfter}. Shimmed to stubAfter keys
135
- * `"0"`, `"1"`, … when stubAfter is empty.
136
- */
137
- highlights?: readonly WaygraphHighlight[] | ((out: Out) => readonly WaygraphHighlight[]);
138
91
  }
139
92
  /**
140
93
  * One selectable option for a Block whose real choices depend on the live
@@ -200,7 +153,7 @@ export interface Block<In extends Checkpoint<string>, Out extends Checkpoint<str
200
153
  * Block, meaning "terminal after one step". Returning the Block itself is a
201
154
  * self-loop - see `runGraph`'s `maxSteps` for the safety net that needs.
202
155
  */
203
- next?(checkpoint: Out): Block<any, any> | null | undefined;
156
+ next?(checkpoint: Out): SomeBlock | null | undefined;
204
157
  /**
205
158
  * `branch()`'s routing table as plain, readable data - Checkpoint tag ->
206
159
  * target Block's `.name` (`null` for a terminal tag) - alongside {@link next}
@@ -220,12 +173,12 @@ export interface Block<In extends Checkpoint<string>, Out extends Checkpoint<str
220
173
  * `act`.
221
174
  * @example requires: [LoginCreds.key]
222
175
  */
223
- requires?: readonly MemKey<any>[];
176
+ requires?: readonly MemKey<unknown>[];
224
177
  /**
225
- * Demo pacing for this Block or compose group (`withBlockPace`).
178
+ * Demo pacing for this Block (the `{ pace }` step option).
226
179
  * Demo/step only - `runGraph` ignores. Prefer `fastForwardComposeBlock` for blitz.
227
180
  */
228
- demoPace?: import("./highlights.js").DemoPace;
181
+ demoPace?: import("../stub/pace.js").DemoPace;
229
182
  /**
230
183
  * Optional. When this Block's real choices depend on the live page
231
184
  * (which of several items to add to cart, which of several rows to
@@ -282,39 +235,101 @@ export type DefinedBlock<In extends Checkpoint<string>, Out extends Checkpoint<s
282
235
  * Overloads keep `ctx` typed when the author passes a lifecycle function
283
236
  * (a single union parameter would make the callback param `any`).
284
237
  */
285
- stubBefore(stub: import("./highlights.js").HighlightStubPhase): DefinedBlock<In, Out>;
286
- stubBefore(stub: import("./highlights.js").StubLifecycleFn<Out>): DefinedBlock<In, Out>;
238
+ stubBefore(stub: import("../stub/stub.js").StubLifecycleFn<Out>): DefinedBlock<In, Out>;
287
239
  /** Demo narration after resolve. Prefer ctx callbacks over slot-map objects. */
288
- stubAfter(stub: import("./highlights.js").HighlightStubPhase): DefinedBlock<In, Out>;
289
- stubAfter(stub: import("./highlights.js").StubLifecycleFn<Out>): DefinedBlock<In, Out>;
240
+ stubAfter(stub: import("../stub/stub.js").StubLifecycleFn<Out>): DefinedBlock<In, Out>;
290
241
  /** Demo narration when the step fails / expected-failure path. */
291
- stubOnError(stub: import("./highlights.js").HighlightStubPhase): DefinedBlock<In, Out>;
292
- stubOnError(stub: import("./highlights.js").StubLifecycleFn<Out>): DefinedBlock<In, Out>;
242
+ stubOnError(stub: import("../stub/stub.js").StubLifecycleFn<Out>): DefinedBlock<In, Out>;
293
243
  };
294
244
  /**
295
- * Structural (not imported) twin of `engine.ts`'s `Layout` - `types.ts` sits
296
- * below `engine.ts` in the module graph, so it can't import `Layout` without
297
- * a cycle. Same shape, matched by TypeScript's structural typing: any real
298
- * `Layout` satisfies this with no cast needed at the `connect()` call site.
245
+ * Any Block, whatever its route. A Block takes its `In` Checkpoint as a callback argument, so it is contravariant in `In`
246
+ * and no one Checkpoint type covers every Block: `any` is that "some Block", written once here.
247
+ */
248
+ export type SomeBlock = Block<any, any>;
249
+ /** Any {@link DefinedBlock} (see {@link SomeBlock}). */
250
+ export type SomeDefinedBlock = DefinedBlock<any, any>;
251
+ export declare function findBlockIndex(middle: readonly SomeBlock[], block: SomeBlock | string | number): number;
252
+ /**
253
+ * Attaches routing to `block` without touching its act/observe/resolve/verify -
254
+ * `routes` must cover every tag of `block`'s output (a missing route is a compile
255
+ * error), and the returned Block runs exactly as `block` always did, just followed
256
+ * by whichever next Block the resolved tag routes to. `null` for a tag means that
257
+ * tag is terminal - the run stops there, same as a Block with no routing at all.
258
+ * A route pointing back at `block` itself is a self-loop; see `runGraph`'s
259
+ * `maxSteps` for its safety net. The return type is deliberately `Block<In, any>` -
260
+ * a route can lead anywhere, including back through itself, so there is no fixed
261
+ * Out type to express; state the expected outcomes to `runGraph` via `terminals`
262
+ * instead.
299
263
  */
300
- export interface ConnectLayout {
264
+ export declare function branch<In extends Checkpoint<string>, Out extends Checkpoint<string>>(block: Block<In, Out>, routes: {
265
+ [K in Out["__state"]]: Block<Extract<Out, Checkpoint<K>>, any> | null;
266
+ }): DefinedBlock<In, any>;
267
+ /** Copy non-enumerable waygraph markers so decorate/withVerify keep map() kind checks. */
268
+ export declare function copyWaygraphRuntime(from: object, to: object): void;
269
+ /**
270
+ * Builds a Block with `withVerify`/`modVerify`/`modVerifyAll` attached as
271
+ * methods - `LoginBlock.withVerify([...])`, discoverable by typing
272
+ * `LoginBlock.` in an editor, not just callable as `withVerify(LoginBlock, ...)`
273
+ * if you already know it exists. A raw object literal is still a perfectly
274
+ * valid Block (every test fixture in this codebase is one) - it just won't have
275
+ * these attached. The methods are thin: they delegate to the identically-named
276
+ * free functions, which remain the one place this logic actually lives.
277
+ */
278
+ export declare function defineBlock<In extends Checkpoint<string>, Out extends Checkpoint<string>>(base: {
301
279
  name: string;
302
- appliesTo: (tag: string) => boolean;
303
- verify: Trait[] | ((out: any) => Trait[]);
304
- }
280
+ description?: Block<In, Out>["description"];
281
+ instruction: Omit<Instruction<In, Out, any>, "act"> & {
282
+ act(page: ActionPage, input: In, mem: MemPage): Promise<void>;
283
+ };
284
+ next?: Block<In, Out>["next"];
285
+ requires?: Block<In, Out>["requires"];
286
+ routes?: Block<In, Out>["routes"];
287
+ instanceOptions?: Block<In, Out>["instanceOptions"];
288
+ }): DefinedBlock<In, Out>;
305
289
  /**
306
- * Composes two Blocks into one, typechecked so this only compiles when A's output
307
- * tag equals B's input tag. The composed Block's act runs A's full instruction
308
- * (act -> observe? -> resolve) then hands the resulting Checkpoint into B's act;
309
- * its own observe/resolve are simply B's, since B is what decides the final Out.
290
+ * Returns a new Block that runs exactly like `block` - same act/observe/resolve,
291
+ * same routing - but with `verify` replaced. For giving one flow stricter (or
292
+ * looser, or just different) confirmation on a Block it didn't author, without
293
+ * that Block needing to have been written as a parameterized factory in
294
+ * anticipation. Same move as `branch()`: decorate an existing Block, don't ask
295
+ * every Block to pre-build its own override mechanism.
310
296
  *
311
- * `layouts`, if given, also runs against the intermediate Checkpoint (A's
312
- * resolved output, right before B's act) - the same enforcement `runGraph`'s
313
- * own loop already applies to a chain's FINAL Checkpoint, but a
314
- * `defineFlow`-built Flow never reaches that loop per-hop: `buildFlow`
315
- * reduces the whole Block array into one `connect()`-composed super-Block, so
316
- * every intermediate hop's verify (and now layout) has to run HERE, inside
317
- * this recursive `act`, not in `runGraph`'s loop, which only ever sees the
318
- * one composed Block run start to finish.
297
+ * Wrap the one Block you want to change, in place, where a flow uses it:
298
+ * `map().gotoPage(NavLoginBlock).method(withVerify(AddToCartBlock, [...]))`.
299
+ */
300
+ export declare function withVerify<B extends SomeBlock>(block: B, verify: Trait[] | ((out: any) => Trait[])): B;
301
+ /**
302
+ * Answers the browser's own dialog (`confirm`, `alert`, `prompt`, `beforeunload`) that this Block's action
303
+ * triggers. A dialog freezes the page until it is answered, so the answer has to be armed before the click -
304
+ * this does that without folding it into the Block's own `act`. The dialog's text can be kept in mem.
305
+ * @example withDialog(CancelBlock, { accept: true, into: LeaveWarning })
306
+ */
307
+ export declare function withDialog<B extends SomeBlock>(block: B, options?: {
308
+ accept?: boolean;
309
+ into?: MemKey<string>;
310
+ promptText?: string;
311
+ }): B;
312
+ /**
313
+ * Replaces one Trait inside `block`'s verify list, leaving every other check
314
+ * untouched - the v1/v2/legacy-variant case, where one check needs a different
315
+ * selector or URL pattern but the rest of the Block is identical. Addressed by
316
+ * the Trait's own `name` (recommended - inserting or reordering other checks
317
+ * can't silently retarget it) or, if you genuinely know the position and don't
318
+ * need that safety, a numeric index. Either way a bad address fails loud
319
+ * immediately instead of quietly doing nothing. `newCheck` can be a bare
320
+ * `check` function (keeps the existing name) or a full `Trait` (to rename too).
321
+ * Only works on a flat `verify` array - a function-form `verify` (from
322
+ * `verify: (out) => Trait[]`) has no fixed list to address into, so this
323
+ * throws rather than guess; use `withVerify` to replace it wholesale instead.
324
+ */
325
+ export declare function modVerify<In extends Checkpoint<string>, Out extends Checkpoint<string>>(block: Block<In, Out>, nameOrIndex: string | number, newCheck: Trait["check"] | Trait): DefinedBlock<In, Out>;
326
+ /**
327
+ * `modVerify`, but for several named checks in one call - a v2 variant that
328
+ * differs in five ways from v1 shouldn't need five nested `modVerify(modVerify(
329
+ * modVerify(...)))` calls to track by eye. `patches` keys are plain strings (a
330
+ * Trait's `name`, not a `MemKey` instance), so an ordinary object literal is
331
+ * fine here - unlike `MemPage`, there's no identity-collision reason to need
332
+ * `[name, check]` pairs. Applies each patch in turn via `modVerify`, so the
333
+ * same fail-loud-on-unknown-name behavior holds for every entry.
319
334
  */
320
- export declare function connect<A extends Checkpoint<string>, B extends Checkpoint<string>, C extends Checkpoint<string>>(a: Block<A, B>, b: Block<B, C>, layouts?: readonly ConnectLayout[]): Block<A, C>;
335
+ export declare function modVerifyAll<In extends Checkpoint<string>, Out extends Checkpoint<string>>(block: Block<In, Out>, patches: Record<string, Trait["check"] | Trait>): DefinedBlock<In, Out>;
@@ -27,7 +27,6 @@ export function findBlockIndex(middle, block) {
27
27
  */
28
28
  export function branch(block, routes) {
29
29
  const base = stripMethods(block);
30
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
31
30
  let routed;
32
31
  const routesAsData = {};
33
32
  for (const [tag, target] of Object.entries(routes)) {
@@ -62,7 +61,6 @@ export function branch(block, routes) {
62
61
  * `branch()` added routing to afterward, and without this step the result would
63
62
  * silently drop that routing, since the stale closure never knew about it.
64
63
  */
65
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
66
64
  function stripMethods(block) {
67
65
  return {
68
66
  name: block.name,
@@ -82,6 +80,8 @@ export function copyWaygraphRuntime(from, to) {
82
80
  "__waygraphNavUrl",
83
81
  "__waygraphNavClick",
84
82
  "__waygraphNavFrom",
83
+ "__waygraphFrom",
84
+ "__waygraphTo",
85
85
  ]) {
86
86
  const desc = Object.getOwnPropertyDescriptor(from, key);
87
87
  if (!desc)
@@ -131,9 +131,9 @@ export function defineBlock(base) {
131
131
  withVerify: (verify) => withVerify(defined, verify),
132
132
  modVerify: (nameOrIndex, newCheck) => modVerify(defined, nameOrIndex, newCheck),
133
133
  modVerifyAll: (patches) => modVerifyAll(defined, patches),
134
- stubBefore: (stub) => withStubBefore(defined, stub),
135
- stubAfter: (stub) => withStubAfter(defined, stub),
136
- stubOnError: (stub) => withStubOnError(defined, stub),
134
+ stubBefore: (stub) => withStubPhase(defined, "stubBefore", stub),
135
+ stubAfter: (stub) => withStubPhase(defined, "stubAfter", stub),
136
+ stubOnError: (stub) => withStubPhase(defined, "stubOnError", stub),
137
137
  };
138
138
  return defined;
139
139
  }
@@ -145,13 +145,8 @@ export function defineBlock(base) {
145
145
  * anticipation. Same move as `branch()`: decorate an existing Block, don't ask
146
146
  * every Block to pre-build its own override mechanism.
147
147
  *
148
- * Wrap the one Block you want to change, in place, wherever it already sits in
149
- * a `defineFlow([...])` array - every other Block stays untouched:
150
- * `defineFlow([start, LoginBlock, withVerify(AddToCartBlock, [...]), end])`.
151
- * There is no separate positional array to keep in sync and no `null`
152
- * placeholder for "skip this one" - `defineFlow` has no per-slot verify
153
- * argument at all, only whatever `verify` each Block's own `instruction` (or
154
- * a `withVerify(...)` wrapping it) carries with it.
148
+ * Wrap the one Block you want to change, in place, where a flow uses it:
149
+ * `map().gotoPage(NavLoginBlock).method(withVerify(AddToCartBlock, [...]))`.
155
150
  */
156
151
  export function withVerify(block, verify) {
157
152
  const base = stripMethods(block);
@@ -159,29 +154,10 @@ export function withVerify(block, verify) {
159
154
  copyWaygraphRuntime(block, next);
160
155
  return next;
161
156
  }
162
- function isHighlightStubPhase(v) {
163
- return !!v && typeof v === "object" && !Array.isArray(v);
164
- }
165
- /** Run a prior stub (fn or slot map) into an open ctx so decorate can chain. */
157
+ /** Runs a prior stub into the same ctx, so stubs chained on one Block add up. */
166
158
  async function applyStubIntoCtx(raw, ctx) {
167
- if (raw === undefined)
168
- return;
169
- if (typeof raw === "function") {
170
- const ret = await raw(ctx);
171
- if (isHighlightStubPhase(ret)) {
172
- for (const [id, stub] of Object.entries(ret)) {
173
- if (stub)
174
- ctx.ring(id, stub);
175
- }
176
- }
177
- return;
178
- }
179
- if (isHighlightStubPhase(raw)) {
180
- for (const [id, stub] of Object.entries(raw)) {
181
- if (stub)
182
- ctx.ring(id, stub);
183
- }
184
- }
159
+ if (raw !== undefined)
160
+ await raw(ctx);
185
161
  }
186
162
  function withStubPhase(block, phase, stub) {
187
163
  const base = stripMethods(block);
@@ -198,25 +174,6 @@ function withStubPhase(block, phase, stub) {
198
174
  copyWaygraphRuntime(block, next);
199
175
  return next;
200
176
  }
201
- /**
202
- * Attach / chain a stubBefore lifecycle on a Block. Prefer
203
- * `(ctx) => { ctx.ring(...); const x = ctx.mem?.get(Key); }`.
204
- * @example FillUsernameBlock.stubBefore((ctx) => { ctx.ring("username", { ... }) })
205
- * @deprecated Use the chained method: `Block.stubBefore((ctx) => …)`.
206
- */
207
- export function withStubBefore(block, stub) {
208
- return withStubPhase(block, "stubBefore", stub);
209
- }
210
- /** @see {@link withStubBefore} * @deprecated Use the chained method: `Block.stubAfter((ctx) => …)`.
211
- */
212
- export function withStubAfter(block, stub) {
213
- return withStubPhase(block, "stubAfter", stub);
214
- }
215
- /** @see {@link withStubBefore} * @deprecated Use the chained method: `Block.stubOnError((ctx) => …)`.
216
- */
217
- export function withStubOnError(block, stub) {
218
- return withStubPhase(block, "stubOnError", stub);
219
- }
220
177
  /**
221
178
  * Answers the browser's own dialog (`confirm`, `alert`, `prompt`, `beforeunload`) that this Block's action
222
179
  * triggers. A dialog freezes the page until it is answered, so the answer has to be armed before the click -
@@ -1,10 +1,12 @@
1
- import type { BlockInfo } from "./flow.js";
2
- import type { Block, Checkpoint } from "../types.js";
3
- import type { Trait } from "../trait.js";
1
+ import type { BlockInfo } from "../flow/flow.js";
2
+ import type { Block } from "./block.js";
3
+ import type { Checkpoint } from "../checkpoint/checkpoint.js";
4
+ import type { Trait } from "../trait/trait.js";
5
+ import type { SomeBlock } from "./block.js";
4
6
  /**
5
7
  * A Block guaranteed to have `withStepVerify`/`modStepVerify` attached - what
6
8
  * {@link composeBlock} returns. Extends plain `Block`, so it drops straight into
7
- * `defineFlow([start, ..., composed, ..., end])` like any other Block; no special
9
+ * a flow like any other Block; no special
8
10
  * casing needed anywhere that only expects a `Block`.
9
11
  */
10
12
  export interface ComposedBlock<In extends Checkpoint<string>, Out extends Checkpoint<string>> extends Block<In, Out> {
@@ -19,14 +21,14 @@ export interface ComposedBlock<In extends Checkpoint<string>, Out extends Checkp
19
21
  * Block - same rules as {@link withVerify}. Throws if no step matches.
20
22
  * @example GovFormBlock.withStepVerify("step-2-address", [])
21
23
  */
22
- withStepVerify(step: Block<any, any> | string | number, verify: Trait[] | ((out: any) => Trait[])): ComposedBlock<In, Out>;
24
+ withStepVerify(step: SomeBlock | string | number, verify: Trait[] | ((out: any) => Trait[])): ComposedBlock<In, Out>;
23
25
  /**
24
26
  * Replaces one Trait inside one step's verify list - same rules as
25
27
  * {@link modVerify}. Throws if no step matches, or that step has no verify
26
28
  * trait at the given name/index.
27
29
  * @example GovFormBlock.modStepVerify("step-2-address", "zip-visible", Trait.visible("#zip-confirmed"))
28
30
  */
29
- modStepVerify(step: Block<any, any> | string | number, nameOrIndex: string | number, newCheck: Trait["check"] | Trait): ComposedBlock<In, Out>;
31
+ modStepVerify(step: SomeBlock | string | number, nameOrIndex: string | number, newCheck: Trait["check"] | Trait): ComposedBlock<In, Out>;
30
32
  }
31
33
  /**
32
34
  * Chains several Blocks into one named, exported unit - what a naturally
@@ -66,7 +68,7 @@ export interface FastForwardComposedBlock<In extends Checkpoint<string>, Out ext
66
68
  readonly fastForward: true;
67
69
  }
68
70
  /** True when `block` came from {@link fastForwardComposeBlock}. */
69
- export declare function isFastForwardBlock(block: Block<any, any>): block is FastForwardComposedBlock<any, any>;
71
+ export declare function isFastForwardBlock(block: SomeBlock): block is FastForwardComposedBlock<any, any>;
70
72
  /** Like `composeBlock`, but the steps run as one blitz-paced unit in a demo. */
71
73
  export declare function fastForwardComposeBlock<In extends Checkpoint<string>, Out extends Checkpoint<string>>(name: string, steps: readonly [Block<In, Out>]): FastForwardComposedBlock<In, Out>;
72
74
  export declare function fastForwardComposeBlock<In extends Checkpoint<string>, B extends Checkpoint<string>, Out extends Checkpoint<string>>(name: string, steps: readonly [Block<In, B>, Block<B, Out>]): FastForwardComposedBlock<In, Out>;
@@ -1,4 +1,4 @@
1
- import { connect } from "../types.js";
1
+ import { connect } from "../run/connect.js";
2
2
  import { WaygraphError, MSG_COMPOSE_EMPTY, MSG_FASTFORWARD_EMPTY } from "../errors.js";
3
3
  import { findBlockIndex, modVerify, withVerify } from "./block.js";
4
4
  export function composeBlock(name, steps) {
@@ -1,7 +1,8 @@
1
- import type { Checkpoint, DefinedBlock } from "../../types.js";
2
- import type { Trait } from "../../trait.js";
3
- import { MemPage } from "../../mem-page.js";
4
- import type { MemKey } from "../../mem-page.js";
1
+ import type { Checkpoint } from "../../checkpoint/checkpoint.js";
2
+ import type { DefinedBlock } from "../block.js";
3
+ import type { Trait } from "../../trait/trait.js";
4
+ import { MemPage } from "../../mem/mem.js";
5
+ import type { MemKey } from "../../mem/mem.js";
5
6
  import type { APIRequestContext, APIResponse } from "@playwright/test";
6
7
  /** What `resolve`/`verify` see: the response's status and parsed body, nothing Playwright-specific. */
7
8
  export interface ApiCallResult {
@@ -31,13 +32,14 @@ export interface ApiBlockOptions<In extends Checkpoint<string>, Out extends Chec
31
32
  * @example method: "POST"
32
33
  */
33
34
  method?: string;
34
- /** Pure, like every other Block's resolve - classifies the response into a Checkpoint tag. */
35
- resolve: (result: ApiCallResult) => Out;
35
+ /** Where it runs: one Checkpoint value or a list; leave it out for "from anywhere". */
36
+ from?: In | readonly In[];
37
+ /** Where it lands: one Checkpoint value (then `resolve` may be left out) or a list. */
38
+ to: Out | readonly Out[];
39
+ /** Pure, like every other Block's resolve - picks the Checkpoint from the response. Optional when `to` is one Checkpoint. */
40
+ resolve?: (result: ApiCallResult) => Out;
36
41
  verify?: Trait[] | ((out: Out) => Trait[]);
37
- requires?: readonly MemKey<any>[];
38
- stubBefore?: import("../../highlights.js").HighlightStubPhaseOrFn<Out>;
39
- stubAfter?: import("../../highlights.js").HighlightStubPhaseOrFn<Out>;
40
- stubOnError?: import("../../highlights.js").HighlightStubPhaseOrFn<Out>;
42
+ requires?: readonly MemKey<unknown>[];
41
43
  }
42
44
  /**
43
45
  * A Block whose `act()` is a real HTTP request, not a page interaction - lets one Flow narrate a
@@ -45,10 +47,12 @@ export interface ApiBlockOptions<In extends Checkpoint<string>, Out extends Chec
45
47
  * machine, checked by the same Trait/verify system. Runs through `page.request`, so it shares the
46
48
  * browser context's cookies/origin - no separate auth dance for an already-logged-in session.
47
49
  * @example
48
- * const CheckOrderCreated = defineApiBlock<LoggedIn, OrderConfirmed | OrderFailed>({
50
+ * const CheckOrderCreated = defineApiBlock({
49
51
  * name: "check-order-created",
52
+ * from: LoggedIn,
53
+ * to: [OrderConfirmed, OrderFailed],
50
54
  * call: ({ request }) => request.get("/api/orders/latest"),
51
- * resolve: (r) => (r.ok ? checkpoint("OrderConfirmed") : checkpoint("OrderFailed")),
55
+ * resolve: (r) => (r.ok ? OrderConfirmed : OrderFailed),
52
56
  * verify: [Trait.disabled],
53
57
  * });
54
58
  */
@@ -1,5 +1,13 @@
1
+ // New Block kind: a backend/API check, not a page action - proves a Flow can mix a UI step
2
+ // (defineNavBlock/defineMethodBlock) with a real HTTP request in the SAME state machine, verified
3
+ // by the same Trait system everything else uses. Built on Playwright's own `page.request`
4
+ // (APIRequestContext) - no shell-out to curl, no second HTTP client to depend on.
5
+ import { recordApiCall } from "../../run/hooks.js";
6
+ import { checkpoint } from "../../checkpoint/checkpoint.js";
7
+ import { markRouteOf, tagsOf } from "../../checkpoint/route.js";
1
8
  import { defineBlock } from "../block.js";
2
- import { key } from "../../mem-page.js";
9
+ import { key } from "../../mem/mem.js";
10
+ import { ignorePageGone } from "../../page-gone.js";
3
11
  // Internal scratch key threading act()'s result to observe()/resolve() - Instruction has no other
4
12
  // channel for this (resolve is pure, given only what observe returns). Identity-keyed, so this can
5
13
  // never collide with a real author's own MemKey even if names happened to match; safe to share one
@@ -11,14 +19,22 @@ const API_RESULT_SCRATCH = key("__wgApiBlockResult");
11
19
  * machine, checked by the same Trait/verify system. Runs through `page.request`, so it shares the
12
20
  * browser context's cookies/origin - no separate auth dance for an already-logged-in session.
13
21
  * @example
14
- * const CheckOrderCreated = defineApiBlock<LoggedIn, OrderConfirmed | OrderFailed>({
22
+ * const CheckOrderCreated = defineApiBlock({
15
23
  * name: "check-order-created",
24
+ * from: LoggedIn,
25
+ * to: [OrderConfirmed, OrderFailed],
16
26
  * call: ({ request }) => request.get("/api/orders/latest"),
17
- * resolve: (r) => (r.ok ? checkpoint("OrderConfirmed") : checkpoint("OrderFailed")),
27
+ * resolve: (r) => (r.ok ? OrderConfirmed : OrderFailed),
18
28
  * verify: [Trait.disabled],
19
29
  * });
20
30
  */
21
31
  export function defineApiBlock(options) {
32
+ const targets = tagsOf(options.to);
33
+ const pick = options.resolve;
34
+ if (!pick && targets.length !== 1) {
35
+ throw new Error(`waygraph: API Block "${options.name}" lands on several Checkpoints; give it a resolve() that picks one`);
36
+ }
37
+ const resolve = pick ?? (() => checkpoint(targets[0]));
22
38
  const built = defineBlock({
23
39
  name: options.name,
24
40
  ...(options.description ? { description: options.description } : {}),
@@ -33,20 +49,12 @@ export function defineApiBlock(options) {
33
49
  body = await response.json();
34
50
  }
35
51
  catch {
36
- body = await response.text().catch(() => undefined);
52
+ body = await response.text().catch(ignorePageGone);
37
53
  }
38
54
  mem.set(API_RESULT_SCRATCH, { status: response.status(), ok: response.ok(), body });
39
- // Best-effort, demo-only visibility - an API step has no DOM change and no ring of its own,
40
- // so without this it's a silent title flash. No-ops outside a demo/pilot/auto run (see
41
- // addNetworkEntry's own guard) and never fails the Block if painting the panel throws.
42
- // Same network-tab panel real page traffic feeds too (network-capture.js) - this is the
43
- // page.request side of it (a separate APIRequestContext, never seen by page.on('request')).
55
+ // Shown in the demo's network panel when a demo layer registered a recorder; never fails the Block.
44
56
  try {
45
- // recordNetworkEntry, not a bare addNetworkEntry evaluate - it also persists this entry
46
- // to page.__wgNetworkHistory (Node-side, survives navigation), so it isn't lost the
47
- // moment a later step in the same Flow navigates and wipes the panel's DOM.
48
- const { recordNetworkEntry } = await import("../../runner/network-capture.js");
49
- await recordNetworkEntry(page, {
57
+ await recordApiCall(page, {
50
58
  method: options.method || "GET",
51
59
  url: response.url(),
52
60
  status: response.status(),
@@ -63,13 +71,13 @@ export function defineApiBlock(options) {
63
71
  async observe(_page, mem) {
64
72
  return mem.get(API_RESULT_SCRATCH);
65
73
  },
66
- resolve: (observed) => options.resolve(observed),
74
+ resolve: (observed) => resolve(observed),
67
75
  ...(options.verify !== undefined ? { verify: options.verify } : {}),
68
- ...(options.stubBefore !== undefined ? { stubBefore: options.stubBefore } : {}),
69
- ...(options.stubAfter !== undefined ? { stubAfter: options.stubAfter } : {}),
70
- ...(options.stubOnError !== undefined ? { stubOnError: options.stubOnError } : {}),
71
76
  },
72
77
  });
78
+ markRouteOf(built, options);
73
79
  Object.defineProperty(built, "__waygraphKind", { value: "api", enumerable: false, configurable: false });
80
+ // Accepted by map().method(), like a Method: one step that lands on a Checkpoint.
81
+ Object.defineProperty(built, "__waygraphSalt", { value: "api", enumerable: false, configurable: false });
74
82
  return built;
75
83
  }
@@ -1,7 +1,8 @@
1
- import type { Block, Checkpoint, DefinedBlock } from "../../types.js";
2
- import type { MemKey } from "../../mem-page.js";
3
- import type { Trait } from "../../trait.js";
4
- import { defineBlock } from "../block.js";
1
+ import type { Block, DefinedBlock } from "../block.js";
2
+ import type { Checkpoint } from "../../checkpoint/checkpoint.js";
3
+ import type { MemKey } from "../../mem/mem.js";
4
+ import type { Trait } from "../../trait/trait.js";
5
+ import type { RoutedBlockBase } from "../../checkpoint/route.js";
5
6
  /**
6
7
  * TypeScript salt over {@link defineBlock}: same runtime Block, but the type
7
8
  * forces `requires` + `instanceOptions` so `waygraph auto` can list one menu
@@ -10,29 +11,23 @@ import { defineBlock } from "../block.js";
10
11
  */
11
12
  export type EffectBlock<In extends Checkpoint<string>, Out extends Checkpoint<string>> = Omit<DefinedBlock<In, Out>, "withVerify" | "modVerify" | "modVerifyAll" | "stubBefore" | "stubAfter" | "stubOnError"> & {
12
13
  readonly __wgFactory?: "effect";
13
- requires: readonly MemKey<any>[];
14
+ requires: readonly MemKey<unknown>[];
14
15
  instanceOptions: NonNullable<Block<In, Out>["instanceOptions"]>;
15
16
  withVerify(verify: Trait[] | ((out: Out) => Trait[])): EffectBlock<In, Out>;
16
17
  modVerify(nameOrIndex: string | number, newCheck: Trait["check"] | Trait): EffectBlock<In, Out>;
17
18
  modVerifyAll(patches: Record<string, Trait["check"] | Trait>): EffectBlock<In, Out>;
18
- stubBefore(stub: import("../../highlights.js").HighlightStubPhase): EffectBlock<In, Out>;
19
- stubBefore(stub: import("../../highlights.js").StubLifecycleFn<Out>): EffectBlock<In, Out>;
20
- stubAfter(stub: import("../../highlights.js").HighlightStubPhase): EffectBlock<In, Out>;
21
- stubAfter(stub: import("../../highlights.js").StubLifecycleFn<Out>): EffectBlock<In, Out>;
22
- stubOnError(stub: import("../../highlights.js").HighlightStubPhase): EffectBlock<In, Out>;
23
- stubOnError(stub: import("../../highlights.js").StubLifecycleFn<Out>): EffectBlock<In, Out>;
19
+ stubBefore(stub: import("../../stub/stub.js").StubLifecycleFn<Out>): EffectBlock<In, Out>;
20
+ stubAfter(stub: import("../../stub/stub.js").StubLifecycleFn<Out>): EffectBlock<In, Out>;
21
+ stubOnError(stub: import("../../stub/stub.js").StubLifecycleFn<Out>): EffectBlock<In, Out>;
24
22
  };
25
- /** @deprecated Prefer {@link EffectBlock} - same type; Mem* was an early name. */
26
- export type MemEffectBlock<In extends Checkpoint<string>, Out extends Checkpoint<string>> = EffectBlock<In, Out>;
27
23
  /**
28
24
  * {@link defineBlock} constrained for effect-style instance menus: `requires` +
29
25
  * `instanceOptions` are mandatory. Prefer this when the Block adds / removes /
30
26
  * toggles a live instance rather than navigating. Runtime result is an ordinary
31
27
  * Block - the helper is TypeScript salt only.
32
28
  */
33
- export declare function defineEffectBlock<In extends Checkpoint<string>, Out extends Checkpoint<string>>(base: Parameters<typeof defineBlock<In, Out>>[0] & {
34
- requires: readonly MemKey<any>[];
29
+ export type EffectExtras<In extends Checkpoint<string>, Out extends Checkpoint<string>> = {
30
+ requires: readonly MemKey<unknown>[];
35
31
  instanceOptions: NonNullable<Block<In, Out>["instanceOptions"]>;
36
- }): EffectBlock<In, Out>;
37
- /** @deprecated Prefer {@link defineEffectBlock} - identical helper. */
38
- export declare const defineMemEffectBlock: typeof defineEffectBlock;
32
+ };
33
+ export declare function defineEffectBlock<In extends Checkpoint<string>, Out extends Checkpoint<string>>(base: RoutedBlockBase<In, Out> & EffectExtras<In, Out>): EffectBlock<In, Out>;
@@ -0,0 +1,17 @@
1
+ import { defineBlock } from "../block.js";
2
+ import { markRouteOf, routed } from "../../checkpoint/route.js";
3
+ export function defineEffectBlock(base) {
4
+ const built = defineBlock(routed(base));
5
+ markRouteOf(built, base);
6
+ Object.defineProperty(built, "__waygraphMemKind", {
7
+ value: "effect",
8
+ enumerable: false,
9
+ configurable: false,
10
+ });
11
+ Object.defineProperty(built, "__waygraphSalt", {
12
+ value: "effect",
13
+ enumerable: false,
14
+ configurable: false,
15
+ });
16
+ return built;
17
+ }