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,4 +1,4 @@
1
- import { WaygraphError, MSG_FLOW_BLOCK_NOT_FOUND_BY_INDEX, MSG_FLOW_BLOCK_NOT_FOUND_BY_NAME, MSG_MODVERIFY_FUNCTION_FORM, MSG_MODVERIFY_NOT_FOUND_BY_INDEX, MSG_MODVERIFY_NOT_FOUND_BY_NAME, } from "../errors.js";
1
+ import { MSG_FLOW_BLOCK_NOT_FOUND_BY_INDEX, MSG_FLOW_BLOCK_NOT_FOUND_BY_NAME, MSG_MODVERIFY_FUNCTION_FORM, MSG_MODVERIFY_NOT_FOUND_BY_INDEX, MSG_MODVERIFY_NOT_FOUND_BY_NAME, WaygraphError, } from "../errors.js";
2
2
  export function findBlockIndex(middle, block) {
3
3
  if (typeof block === "number") {
4
4
  if (block < 0 || block >= middle.length) {
@@ -13,46 +13,6 @@ export function findBlockIndex(middle, block) {
13
13
  }
14
14
  return index;
15
15
  }
16
- /**
17
- * Attaches routing to `block` without touching its act/observe/resolve/verify -
18
- * `routes` must cover every tag of `block`'s output (a missing route is a compile
19
- * error), and the returned Block runs exactly as `block` always did, just followed
20
- * by whichever next Block the resolved tag routes to. `null` for a tag means that
21
- * tag is terminal - the run stops there, same as a Block with no routing at all.
22
- * A route pointing back at `block` itself is a self-loop; see `runGraph`'s
23
- * `maxSteps` for its safety net. The return type is deliberately `Block<In, any>` -
24
- * a route can lead anywhere, including back through itself, so there is no fixed
25
- * Out type to express; state the expected outcomes to `runGraph` via `terminals`
26
- * instead.
27
- */
28
- export function branch(block, routes) {
29
- const base = stripMethods(block);
30
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
31
- let routed;
32
- const routesAsData = {};
33
- for (const [tag, target] of Object.entries(routes)) {
34
- routesAsData[tag] = target === null ? null : target === block ? base.name : target.name;
35
- }
36
- routed = defineBlock({
37
- ...base,
38
- next: (checkpoint) => {
39
- const target = routes[checkpoint.__state];
40
- if (target === undefined || target === null)
41
- return undefined;
42
- // A route naming `block` itself (the only self-reference in scope when
43
- // `routes` was written) means "loop back with routing intact" - substitute
44
- // the routed Block, not the original with no `next` of its own.
45
- return target === block ? routed : target;
46
- },
47
- routes: routesAsData,
48
- });
49
- // Without this, branch()'s output carried no __waygraphKind/__waygraphSalt at all (defineBlock
50
- // never stamps them - factories do, after defineBlock returns), so a branched Block could never
51
- // pass MapBuilder's assertMapKind/assertMapSalt checks. Real bug: branching was unusable from the
52
- // Waygraph Map, only from a raw runGraph() call.
53
- copyWaygraphRuntime(block, routed);
54
- return routed;
55
- }
56
16
  /**
57
17
  * Strips `withVerify`/`modVerify`/`modVerifyAll` off a Block, keeping everything
58
18
  * else - `name`, `instruction`, `next`, `requires`. Every function below that
@@ -62,8 +22,7 @@ export function branch(block, routes) {
62
22
  * `branch()` added routing to afterward, and without this step the result would
63
23
  * silently drop that routing, since the stale closure never knew about it.
64
24
  */
65
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
66
- function stripMethods(block) {
25
+ export function stripMethods(block) {
67
26
  return {
68
27
  name: block.name,
69
28
  instruction: block.instruction,
@@ -82,6 +41,8 @@ export function copyWaygraphRuntime(from, to) {
82
41
  "__waygraphNavUrl",
83
42
  "__waygraphNavClick",
84
43
  "__waygraphNavFrom",
44
+ "__waygraphFrom",
45
+ "__waygraphTo",
85
46
  ]) {
86
47
  const desc = Object.getOwnPropertyDescriptor(from, key);
87
48
  if (!desc)
@@ -131,9 +92,9 @@ export function defineBlock(base) {
131
92
  withVerify: (verify) => withVerify(defined, verify),
132
93
  modVerify: (nameOrIndex, newCheck) => modVerify(defined, nameOrIndex, newCheck),
133
94
  modVerifyAll: (patches) => modVerifyAll(defined, patches),
134
- stubBefore: (stub) => withStubBefore(defined, stub),
135
- stubAfter: (stub) => withStubAfter(defined, stub),
136
- stubOnError: (stub) => withStubOnError(defined, stub),
95
+ stubBefore: (stub) => withStubPhase(defined, "stubBefore", stub),
96
+ stubAfter: (stub) => withStubPhase(defined, "stubAfter", stub),
97
+ stubOnError: (stub) => withStubPhase(defined, "stubOnError", stub),
137
98
  };
138
99
  return defined;
139
100
  }
@@ -145,13 +106,8 @@ export function defineBlock(base) {
145
106
  * anticipation. Same move as `branch()`: decorate an existing Block, don't ask
146
107
  * every Block to pre-build its own override mechanism.
147
108
  *
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.
109
+ * Wrap the one Block you want to change, in place, where a flow uses it:
110
+ * `map().gotoPage(NavLoginBlock).method(withVerify(AddToCartBlock, [...]))`.
155
111
  */
156
112
  export function withVerify(block, verify) {
157
113
  const base = stripMethods(block);
@@ -159,29 +115,10 @@ export function withVerify(block, verify) {
159
115
  copyWaygraphRuntime(block, next);
160
116
  return next;
161
117
  }
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. */
118
+ /** Runs a prior stub into the same ctx, so stubs chained on one Block add up. */
166
119
  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
- }
120
+ if (raw !== undefined)
121
+ await raw(ctx);
185
122
  }
186
123
  function withStubPhase(block, phase, stub) {
187
124
  const base = stripMethods(block);
@@ -198,61 +135,6 @@ function withStubPhase(block, phase, stub) {
198
135
  copyWaygraphRuntime(block, next);
199
136
  return next;
200
137
  }
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
- /**
221
- * Answers the browser's own dialog (`confirm`, `alert`, `prompt`, `beforeunload`) that this Block's action
222
- * triggers. A dialog freezes the page until it is answered, so the answer has to be armed before the click -
223
- * this does that without folding it into the Block's own `act`. The dialog's text can be kept in mem.
224
- * @example withDialog(CancelBlock, { accept: true, into: LeaveWarning })
225
- */
226
- export function withDialog(block, options = {}) {
227
- const base = stripMethods(block);
228
- const act = base.instruction.act.bind(base.instruction);
229
- const next = defineBlock({
230
- ...base,
231
- instruction: {
232
- ...base.instruction,
233
- async act(page, input, mem) {
234
- const answer = async (dialog) => {
235
- if (options.into)
236
- mem.set(options.into, dialog.message());
237
- if (options.accept === false)
238
- await dialog.dismiss();
239
- else
240
- await dialog.accept(options.promptText);
241
- };
242
- const raw = page;
243
- raw.once("dialog", answer);
244
- try {
245
- await act(page, input, mem);
246
- }
247
- finally {
248
- raw.off("dialog", answer);
249
- }
250
- },
251
- },
252
- });
253
- copyWaygraphRuntime(block, next);
254
- return next;
255
- }
256
138
  /**
257
139
  * Replaces one Trait inside `block`'s verify list, leaving every other check
258
140
  * untouched - the v1/v2/legacy-variant case, where one check needs a different
@@ -0,0 +1,17 @@
1
+ import type { Checkpoint } from "../checkpoint/checkpoint.js";
2
+ import { Block, DefinedBlock } from "./block.js";
3
+ /**
4
+ * Attaches routing to `block` without touching its act/observe/resolve/verify -
5
+ * `routes` must cover every tag of `block`'s output (a missing route is a compile
6
+ * error), and the returned Block runs exactly as `block` always did, just followed
7
+ * by whichever next Block the resolved tag routes to. `null` for a tag means that
8
+ * tag is terminal - the run stops there, same as a Block with no routing at all.
9
+ * A route pointing back at `block` itself is a self-loop; see `runGraph`'s
10
+ * `maxSteps` for its safety net. The return type is deliberately `Block<In, any>` -
11
+ * a route can lead anywhere, including back through itself, so there is no fixed
12
+ * Out type to express; state the expected outcomes to `runGraph` via `terminals`
13
+ * instead.
14
+ */
15
+ export declare function branch<In extends Checkpoint<string>, Out extends Checkpoint<string>>(block: Block<In, Out>, routes: {
16
+ [K in Out["__state"]]: Block<Extract<Out, Checkpoint<K>>, any> | null;
17
+ }): DefinedBlock<In, any>;
@@ -0,0 +1,40 @@
1
+ import { copyWaygraphRuntime, defineBlock, stripMethods } from "./block.js";
2
+ /**
3
+ * Attaches routing to `block` without touching its act/observe/resolve/verify -
4
+ * `routes` must cover every tag of `block`'s output (a missing route is a compile
5
+ * error), and the returned Block runs exactly as `block` always did, just followed
6
+ * by whichever next Block the resolved tag routes to. `null` for a tag means that
7
+ * tag is terminal - the run stops there, same as a Block with no routing at all.
8
+ * A route pointing back at `block` itself is a self-loop; see `runGraph`'s
9
+ * `maxSteps` for its safety net. The return type is deliberately `Block<In, any>` -
10
+ * a route can lead anywhere, including back through itself, so there is no fixed
11
+ * Out type to express; state the expected outcomes to `runGraph` via `terminals`
12
+ * instead.
13
+ */
14
+ export function branch(block, routes) {
15
+ const base = stripMethods(block);
16
+ let routed;
17
+ const routesAsData = {};
18
+ for (const [tag, target] of Object.entries(routes)) {
19
+ routesAsData[tag] = target === null ? null : target === block ? base.name : target.name;
20
+ }
21
+ routed = defineBlock({
22
+ ...base,
23
+ next: (checkpoint) => {
24
+ const target = routes[checkpoint.__state];
25
+ if (target === undefined || target === null)
26
+ return undefined;
27
+ // A route naming `block` itself (the only self-reference in scope when
28
+ // `routes` was written) means "loop back with routing intact" - substitute
29
+ // the routed Block, not the original with no `next` of its own.
30
+ return target === block ? routed : target;
31
+ },
32
+ routes: routesAsData,
33
+ });
34
+ // Without this, branch()'s output carried no __waygraphKind/__waygraphSalt at all (defineBlock
35
+ // never stamps them - factories do, after defineBlock returns), so a branched Block could never
36
+ // pass MapBuilder's assertMapKind/assertMapSalt checks. Real bug: branching was unusable from the
37
+ // Waygraph Map, only from a raw runGraph() call.
38
+ copyWaygraphRuntime(block, routed);
39
+ return routed;
40
+ }
@@ -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) {
@@ -0,0 +1,13 @@
1
+ import type { MemKey } from "../mem/mem.js";
2
+ import { SomeBlock } from "./block.js";
3
+ /**
4
+ * Answers the browser's own dialog (`confirm`, `alert`, `prompt`, `beforeunload`) that this Block's action
5
+ * triggers. A dialog freezes the page until it is answered, so the answer has to be armed before the click -
6
+ * this does that without folding it into the Block's own `act`. The dialog's text can be kept in mem.
7
+ * @example withDialog(CancelBlock, { accept: true, into: LeaveWarning })
8
+ */
9
+ export declare function withDialog<B extends SomeBlock>(block: B, options?: {
10
+ accept?: boolean;
11
+ into?: MemKey<string>;
12
+ promptText?: string;
13
+ }): B;
@@ -0,0 +1,37 @@
1
+ import { copyWaygraphRuntime, defineBlock, stripMethods } from "./block.js";
2
+ /**
3
+ * Answers the browser's own dialog (`confirm`, `alert`, `prompt`, `beforeunload`) that this Block's action
4
+ * triggers. A dialog freezes the page until it is answered, so the answer has to be armed before the click -
5
+ * this does that without folding it into the Block's own `act`. The dialog's text can be kept in mem.
6
+ * @example withDialog(CancelBlock, { accept: true, into: LeaveWarning })
7
+ */
8
+ export function withDialog(block, options = {}) {
9
+ const base = stripMethods(block);
10
+ const act = base.instruction.act.bind(base.instruction);
11
+ const next = defineBlock({
12
+ ...base,
13
+ instruction: {
14
+ ...base.instruction,
15
+ async act(page, input, mem) {
16
+ const answer = async (dialog) => {
17
+ if (options.into)
18
+ mem.set(options.into, dialog.message());
19
+ if (options.accept === false)
20
+ await dialog.dismiss();
21
+ else
22
+ await dialog.accept(options.promptText);
23
+ };
24
+ const raw = page;
25
+ raw.once("dialog", answer);
26
+ try {
27
+ await act(page, input, mem);
28
+ }
29
+ finally {
30
+ raw.off("dialog", answer);
31
+ }
32
+ },
33
+ },
34
+ });
35
+ copyWaygraphRuntime(block, next);
36
+ return next;
37
+ }
@@ -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
+ }