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,35 +1,19 @@
1
- import type { Block, Checkpoint } from "../types.js";
2
- import type { EndMarker, StartMarker } from "./run-graph.js";
3
- import type { Flow, FlowOptions } from "./flow.js";
4
- import type { DemoPace, HighlightStyleDefaults } from "../highlights.js";
5
- import type { NavBlock } from "./blocks/nav.js";
6
- import type { PageBlock } from "./blocks/page.js";
7
- import type { AssertBlock, MethodBlock } from "./blocks/method.js";
8
- import type { EffectBlock } from "./blocks/effect.js";
1
+ import type { SomeBlock } from "../block/block.js";
2
+ import type { EffectBlock } from "../block/kinds/effect.js";
3
+ import type { AssertBlock, MethodBlock } from "../block/kinds/method.js";
4
+ import type { NavBlock } from "../block/kinds/nav.js";
5
+ import type { PageBlock } from "../block/kinds/page.js";
6
+ import type { Checkpoint } from "../checkpoint/checkpoint.js";
7
+ import type { DemoPace } from "../stub/pace.js";
8
+ import type { HighlightStyleDefaults } from "../stub/ring.js";
9
+ import type { Flow, FlowSettings } from "./flow.js";
10
+ import { MapStepOpts } from "./map-steps.js";
9
11
  type S = Checkpoint<"__start__">;
10
12
  /**
11
- * The one capability MapBuilder needs from Engine - a plain defineFlow-shaped function, not the
12
- * whole Engine class. Depending on Engine-the-type here would make engine.ts and map-builder.ts
13
- * import each other (Engine.map() builds a MapBuilder; MapBuilder.end() calls back into
14
- * defineFlow) - a real cycle check:structure forbids. This type is how that's avoided.
13
+ * The one capability MapBuilder needs from Engine: turn the finished steps into a Flow with the engine's config. A
14
+ * function, not the Engine class, so engine.ts and map-builder.ts don't import each other.
15
15
  */
16
- export type DefineFlowFn = (blocks: readonly [StartMarker, ...Block<any, any>[], EndMarker], options?: FlowOptions) => Flow<any>;
17
- /** Per-step options for the map builder: `ff` fast-forwards the step, `pace` sets its demo pace. */
18
- export interface MapStepOpts {
19
- /**
20
- * Fast-forward just this step, inline - no `.ffStart()/.ffEnd()` bracket needed. Consecutive
21
- * `{ ff: true }` steps merge into ONE fast-forward block, same result as the explicit bracket
22
- * form; a step without the flag closes an auto-opened window first.
23
- * @example map().gotoPage(NavLoginBlock, { ff: true }).method(FillUsernameBlock, { ff: true })
24
- */
25
- ff?: boolean;
26
- /**
27
- * Demo pace for just this step (`"blitz"` skips the typing animation and the pause after the action; `"fast"`, `"slow"`,
28
- * or a number scale the narration gates). The map equivalent of `withBlockPace`, with no wrapper.
29
- * @example map().method(SetBearerTokenBlock, { pace: "blitz" })
30
- */
31
- pace?: DemoPace;
32
- }
16
+ export type BuildFlowFn = (steps: readonly SomeBlock[], settings: FlowSettings) => Flow<Checkpoint<string>>;
33
17
  /** Flow-level settings for `engine.map({ … })`: `memStub`, `sessionReset`, `expectedFailure`, `demoPace`, `highlightStyle`, `homeOrigin`. */
34
18
  export interface MapBuilderOptions {
35
19
  /**
@@ -39,18 +23,18 @@ export interface MapBuilderOptions {
39
23
  * way; only the internal/external origin distinction is opt-in).
40
24
  */
41
25
  homeOrigin?: string;
42
- /** Fill missing `requires` keys from `registerMemStub` when the flow runs (what `withMemStub` did). */
26
+ /** Fill missing `requires` keys from `registerMemStub` when the flow runs. */
43
27
  memStub?: boolean;
44
28
  /**
45
29
  * This flow wants a fresh browser session (cookies and storage cleared) when it runs after another one, in a CLI chain
46
30
  * (`waygraph run "a then b"`) or nested with `.flow(sub)`: a second user signing in, a logged-out check.
47
31
  */
48
32
  sessionReset?: boolean;
49
- /** Marks a flow that is supposed to throw, with the reason shown in the demo (what `withExpectedFailure` did). */
33
+ /** Marks a flow that is supposed to throw, with the reason shown in the demo. */
50
34
  expectedFailure?: string;
51
- /** Default demo pace for the whole flow (what `withDemoPace` did). */
35
+ /** Default demo pace for the whole flow. */
52
36
  demoPace?: DemoPace;
53
- /** Default ring tone, size and weight for the whole flow (what `withHighlightStyle` did). */
37
+ /** Default ring tone, size and weight for the whole flow. */
54
38
  highlightStyle?: HighlightStyleDefaults;
55
39
  }
56
40
  /** What `.flow()` takes for the sub-flow it runs inline. */
@@ -59,7 +43,7 @@ export interface MapFlowOpts {
59
43
  reset?: boolean;
60
44
  }
61
45
  /**
62
- * Fluent builder over {@link Engine.defineFlow} - see `map()`'s own doc
46
+ * The flow builder behind `engine.map()` - see `map()`'s own doc
63
47
  * comment for why this exists. Each step method is scoped to exactly the
64
48
  * Block kind its name promises, checked at RUNTIME against the
65
49
  * `__waygraphKind`/`__waygraphSalt` markers `defineNavBlock`/`definePageBlock`/
@@ -67,21 +51,21 @@ export interface MapFlowOpts {
67
51
  * (the same markers `graph.ts` and `map-check.ts` trust) - not just a type
68
52
  * hint, since a hand-rolled object can satisfy the TypeScript `Block<In,Out>`
69
53
  * shape without ever going through a real factory. Each call also
70
- * typechecks the accumulated Checkpoint chain exactly like `defineFlow`'s
71
- * own tuple overloads do (a step's `In` must equal the previous step's
54
+ * typechecks the accumulated Checkpoint chain (a step's `In` must equal the previous step's
72
55
  * `Out`) - this is what "no teleporting" means: there is no method on this
73
56
  * builder that can skip from one Checkpoint to an unrelated one without a
74
57
  * real, kind-correct Block in between.
75
58
  */
76
59
  export declare class MapBuilder<Out extends Checkpoint<string>> {
77
- private readonly defineFlow;
60
+ private readonly build;
61
+ private readonly settings;
78
62
  private readonly steps;
79
63
  private readonly homeOrigin;
80
64
  private readonly ff;
81
65
  private constructor();
82
66
  /** @internal - use `engine.map()` or the standalone `map()` export. */
83
- static begin(defineFlow: DefineFlowFn, homeOrigin: string | undefined): MapBuilder<S>;
84
- /** Readable chain-opener - mirrors `defineFlow`'s leading `start` sentinel. Returns `this` unchanged; entirely optional. */
67
+ static begin(build: BuildFlowFn, settings: FlowSettings, homeOrigin: string | undefined): MapBuilder<S>;
68
+ /** Readable chain-opener. Returns `this` unchanged; entirely optional. */
85
69
  start(): MapBuilder<Out>;
86
70
  /**
87
71
  * Open a fast-forward window - steps until {@link ffEnd} collapse into one
@@ -110,7 +94,7 @@ export declare class MapBuilder<Out extends Checkpoint<string>> {
110
94
  * `defineNavBlock`/`defineMemNavBlock`/`definePageBlock`. Throws if given
111
95
  * anything else, including a `homeOrigin`-mismatched static `url`.
112
96
  * Compile-time: {@link NavBlock} or {@link PageBlock} only (not Assert/Method).
113
- * `{ ff: true }`: fast-forward this one step inline - see {@link appendStep}'s own comment.
97
+ * `{ ff: true }`: fast-forward this one step inline - see `appendStep`'s own comment.
114
98
  */
115
99
  gotoPage<NextOut extends Checkpoint<string>>(block: (NavBlock<NextOut> | PageBlock<NextOut>) & {
116
100
  name: string;
@@ -120,7 +104,7 @@ export declare class MapBuilder<Out extends Checkpoint<string>> {
120
104
  * Blocks in the Waygraph Map convention: mailpit, maildrop.cc) - same
121
105
  * kind requirement as {@link gotoPage}, plus the inverse `homeOrigin` check.
122
106
  * Compile-time: {@link NavBlock} or {@link PageBlock} only.
123
- * `{ ff: true }`: fast-forward this one step inline - see {@link appendStep}'s own comment.
107
+ * `{ ff: true }`: fast-forward this one step inline - see `appendStep`'s own comment.
124
108
  */
125
109
  gotoExternal<NextOut extends Checkpoint<string>>(block: (NavBlock<NextOut> | PageBlock<NextOut>) & {
126
110
  name: string;
@@ -128,7 +112,7 @@ export declare class MapBuilder<Out extends Checkpoint<string>> {
128
112
  /**
129
113
  * Appends a self-loop verification step - requires a Block from
130
114
  * `defineAssertBlock`. Compile-time: {@link AssertBlock} only (not `.method()`).
131
- * `{ ff: true }`: fast-forward this one step inline - see {@link appendStep}'s own comment.
115
+ * `{ ff: true }`: fast-forward this one step inline - see `appendStep`'s own comment.
132
116
  */
133
117
  assert(block: AssertBlock<Out> & {
134
118
  name: string;
@@ -140,7 +124,7 @@ export declare class MapBuilder<Out extends Checkpoint<string>> {
140
124
  * Compile-time: {@link MethodBlock} or {@link EffectBlock} only - Assert
141
125
  * Blocks must use `.assert()`. Runtime also rejects `__waygraphKind =
142
126
  * "assert"` (those still carry method salt from the factory internals).
143
- * `{ ff: true }`: fast-forward this one step inline - see {@link appendStep}'s own comment.
127
+ * `{ ff: true }`: fast-forward this one step inline - see `appendStep`'s own comment.
144
128
  */
145
129
  method<NextOut extends Checkpoint<string>>(block: (MethodBlock<Out, NextOut> | EffectBlock<Out, NextOut>) & {
146
130
  name: string;
@@ -148,7 +132,7 @@ export declare class MapBuilder<Out extends Checkpoint<string>> {
148
132
  /**
149
133
  * Runs another flow's steps inline here, in the same page, browser and `mem`. This is how flows nest:
150
134
  * `map().flow(loginFlow).flow(viewerFlow, { reset: true })`. With `{ reset: true }` cookies and storage are cleared
151
- * right before the sub-flow's first step. Replaces `chainFlow` and `withSessionReset`.
135
+ * right before the sub-flow's first step.
152
136
  */
153
137
  flow<NextOut extends Checkpoint<string>>(sub: Flow<NextOut>, opts?: MapFlowOpts): MapBuilder<NextOut>;
154
138
  /**
@@ -163,7 +147,7 @@ export declare class MapBuilder<Out extends Checkpoint<string>> {
163
147
  * Checkpoint to chain `.method()/.gotoPage()/.assert()/.end()` (or another `.branch()`) off of.
164
148
  *
165
149
  * Real gap this fixes: the plain `branch()` helper's `.next` routing is only ever consulted by
166
- * `runGraph`'s own graph walk - `defineFlow`/`.end()` compose steps pairwise via `connect()`,
150
+ * `runGraph`'s own graph walk - `.end()` composes steps pairwise via `connect()`,
167
151
  * which never looks at `.next` at all, so a Map-built Flow had no way to branch. This method
168
152
  * branches at the Flow level instead: it finalizes the prefix, runs it, and picks the next Flow
169
153
  * itself once the real tag is known - no engine-level routing involved.
@@ -174,7 +158,7 @@ export declare class MapBuilder<Out extends Checkpoint<string>> {
174
158
  *
175
159
  * The route's first Block still sees `input.__state === "__start__"` in `act()`, not the tag that
176
160
  * routed there - `runGraph` seeds every Flow's entry Block that way unconditionally, the same as
177
- * any standalone `defineFlow([start, block, end])` already does. Read `page`/`mem`, not `input`,
161
+ * any single-Block Flow does. Read `page`/`mem`, not `input`,
178
162
  * in `act()` - every real Block in this codebase already follows that convention.
179
163
  *
180
164
  * @example
@@ -184,21 +168,17 @@ export declare class MapBuilder<Out extends Checkpoint<string>> {
184
168
  * });
185
169
  */
186
170
  branch<Routes extends {
187
- [K in Out["__state"]]: ((m: MapBuilder<Extract<Out, Checkpoint<K>>>) => Flow<any>) | null;
171
+ [K in Out["__state"]]: ((m: MapBuilder<Extract<Out, Checkpoint<K>>>) => Flow<Checkpoint<string>>) | null;
188
172
  }>(routes: Routes): Flow<{
189
173
  [K in keyof Routes & string]: Routes[K] extends (m: any) => Flow<infer R> ? R : Extract<Out, Checkpoint<K>>;
190
174
  }[keyof Routes & string]>;
191
175
  /**
192
- * Finalizes this chain into a real, runnable {@link Flow} - same object
193
- * `defineFlow` returns, so `withBlockVerify`/`modBlockVerify` and every
194
- * `withTitle`/`withHighlightFixtures`/etc. decorator still apply exactly
195
- * as they do today; this builder only changes how the chain is assembled,
196
- * never what it produces. Throws if no step was ever added - an empty map
176
+ * Finalizes this chain into a runnable {@link Flow} with the settings given to `map({ ... })`;
177
+ * `withBlockVerify`/`modBlockVerify` work on it. Throws if no step was ever added - an empty map
197
178
  * isn't a flow. An auto-opened `{ ff: true }` window (see {@link MapStepOpts})
198
179
  * left open at `.end()` closes silently; an EXPLICIT `.ffStart()` left open
199
180
  * still throws - the author opened that one and needs to close it themselves.
200
181
  */
201
- /** @param options @deprecated Pass flow settings to `map({ … })` instead. */
202
- end(options?: FlowOptions): Flow<Out>;
182
+ end(): Flow<Out>;
203
183
  }
204
184
  export {};
@@ -0,0 +1,242 @@
1
+ import { fastForwardComposeBlock } from "../block/compose.js";
2
+ import { MSG_MAP_BRANCH_NO_PRIOR_STEP, MSG_MAP_EMPTY, MSG_MAP_FF_ALREADY_OPEN, MSG_MAP_FF_EMPTY, MSG_MAP_FF_NOT_CLOSED, MSG_MAP_FF_NOT_OPEN, MSG_MAP_METHOD_GOT_ASSERT, WaygraphError, } from "../errors.js";
3
+ import { buildBranchedFlow } from "./map-branch.js";
4
+ import { assertMapKind, assertMapOrigin, assertMapSalt, mapKindOf, paced, resetBefore } from "./map-steps.js";
5
+ /**
6
+ * The flow builder behind `engine.map()` - see `map()`'s own doc
7
+ * comment for why this exists. Each step method is scoped to exactly the
8
+ * Block kind its name promises, checked at RUNTIME against the
9
+ * `__waygraphKind`/`__waygraphSalt` markers `defineNavBlock`/`definePageBlock`/
10
+ * `defineAssertBlock`/`defineMethodBlock`/`defineEffectBlock` already set
11
+ * (the same markers `graph.ts` and `map-check.ts` trust) - not just a type
12
+ * hint, since a hand-rolled object can satisfy the TypeScript `Block<In,Out>`
13
+ * shape without ever going through a real factory. Each call also
14
+ * typechecks the accumulated Checkpoint chain (a step's `In` must equal the previous step's
15
+ * `Out`) - this is what "no teleporting" means: there is no method on this
16
+ * builder that can skip from one Checkpoint to an unrelated one without a
17
+ * real, kind-correct Block in between.
18
+ */
19
+ export class MapBuilder {
20
+ build;
21
+ settings;
22
+ steps;
23
+ homeOrigin;
24
+ ff;
25
+ constructor(
26
+ // From Engine.map(): see BuildFlowFn.
27
+ build, settings, steps, homeOrigin,
28
+ // `auto: true` = opened implicitly by a `{ ff: true }` step flag, not an explicit .ffStart() -
29
+ // closes silently at the next non-flagged step (or at .end()/.branch()) instead of demanding a
30
+ // matching .ffEnd(), since the author never opened anything they'd need to remember to close.
31
+ ff = null) {
32
+ this.build = build;
33
+ this.settings = settings;
34
+ this.steps = steps;
35
+ this.homeOrigin = homeOrigin;
36
+ this.ff = ff;
37
+ }
38
+ /** @internal - use `engine.map()` or the standalone `map()` export. */
39
+ static begin(build, settings, homeOrigin) {
40
+ return new MapBuilder(build, settings, [], homeOrigin, null);
41
+ }
42
+ /** Readable chain-opener. Returns `this` unchanged; entirely optional. */
43
+ start() {
44
+ return this;
45
+ }
46
+ /**
47
+ * Open a fast-forward window - steps until {@link ffEnd} collapse into one
48
+ * opaque `fastForwardComposeBlock` (blitz theater). Kind/salt checks still
49
+ * run on each inner step as it is added.
50
+ */
51
+ ffStart(name) {
52
+ if (this.ff) {
53
+ throw new WaygraphError("WG_MAP_FF_ALREADY_OPEN", MSG_MAP_FF_ALREADY_OPEN(this.ff.name));
54
+ }
55
+ const ffName = typeof name === "string" && name.trim()
56
+ ? name.trim()
57
+ : `ff-${this.steps.length + 1}`;
58
+ return new MapBuilder(this.build, this.settings, this.steps, this.homeOrigin, {
59
+ name: ffName,
60
+ buffer: [],
61
+ auto: false,
62
+ });
63
+ }
64
+ /**
65
+ * Close the current fast-forward window and append one FFCompose step.
66
+ * Throws if empty or if {@link ffStart} was never opened.
67
+ */
68
+ ffEnd() {
69
+ if (!this.ff) {
70
+ throw new WaygraphError("WG_MAP_FF_NOT_OPEN", MSG_MAP_FF_NOT_OPEN);
71
+ }
72
+ return this.closeFf();
73
+ }
74
+ /** Shared by the explicit {@link ffEnd} and the implicit close a `{ ff: true }` step flag triggers. */
75
+ closeFf() {
76
+ const ff = this.ff;
77
+ if (!ff)
78
+ return this;
79
+ if (ff.buffer.length === 0) {
80
+ throw new WaygraphError("WG_MAP_FF_EMPTY", MSG_MAP_FF_EMPTY(ff.name));
81
+ }
82
+ const composed = fastForwardComposeBlock(ff.name,
83
+ // The window's steps were typechecked as they were added; the one-step overload takes them as one Block.
84
+ ff.buffer);
85
+ return new MapBuilder(this.build, this.settings, [...this.steps, composed], this.homeOrigin, null);
86
+ }
87
+ /**
88
+ * `ff`: inline fast-forward, no `.ffStart()/.ffEnd()` bracket needed - `.method(X, { ff: true })`
89
+ * marks just that step; consecutive `{ ff: true }` steps merge into ONE fast-forward block (same
90
+ * runtime result as the explicit bracket form), same as if they'd been wrapped in
91
+ * `.ffStart()/.ffEnd()`. A step WITHOUT the flag closes an auto-opened window first, so a plain
92
+ * step is never silently swept into one; an EXPLICIT `.ffStart()` window still behaves as before
93
+ * (stays open until its own `.ffEnd()`, regardless of whether a step passed `{ ff: true }`).
94
+ */
95
+ appendStep(block, ff) {
96
+ if (ff) {
97
+ const win = this.ff ?? { name: `ff-${this.steps.length + 1}`, buffer: [], auto: true };
98
+ return new MapBuilder(this.build, this.settings, this.steps, this.homeOrigin, {
99
+ name: win.name,
100
+ buffer: [...win.buffer, block],
101
+ auto: win.auto,
102
+ });
103
+ }
104
+ if (this.ff && this.ff.auto) {
105
+ return this.closeFf().appendStep(block);
106
+ }
107
+ if (this.ff) {
108
+ // Explicit .ffStart() window still open - absorbs a plain step too, same as always.
109
+ return new MapBuilder(this.build, this.settings, this.steps, this.homeOrigin, {
110
+ name: this.ff.name,
111
+ buffer: [...this.ff.buffer, block],
112
+ auto: false,
113
+ });
114
+ }
115
+ return new MapBuilder(this.build, this.settings, [...this.steps, block], this.homeOrigin, null);
116
+ }
117
+ /**
118
+ * Appends an internal navigation/page-arrival step - requires a Block from
119
+ * `defineNavBlock`/`defineMemNavBlock`/`definePageBlock`. Throws if given
120
+ * anything else, including a `homeOrigin`-mismatched static `url`.
121
+ * Compile-time: {@link NavBlock} or {@link PageBlock} only (not Assert/Method).
122
+ * `{ ff: true }`: fast-forward this one step inline - see `appendStep`'s own comment.
123
+ */
124
+ gotoPage(block, opts) {
125
+ assertMapKind(block, ["nav", "page"], "gotoPage");
126
+ assertMapOrigin(block, this.homeOrigin, "internal", "gotoPage");
127
+ return this.appendStep(paced(block, opts), opts?.ff);
128
+ }
129
+ /**
130
+ * Appends a genuinely cross-origin navigation step (e.g. `(external)/`
131
+ * Blocks in the Waygraph Map convention: mailpit, maildrop.cc) - same
132
+ * kind requirement as {@link gotoPage}, plus the inverse `homeOrigin` check.
133
+ * Compile-time: {@link NavBlock} or {@link PageBlock} only.
134
+ * `{ ff: true }`: fast-forward this one step inline - see `appendStep`'s own comment.
135
+ */
136
+ gotoExternal(block, opts) {
137
+ assertMapKind(block, ["nav", "page"], "gotoExternal");
138
+ assertMapOrigin(block, this.homeOrigin, "external", "gotoExternal");
139
+ return this.appendStep(paced(block, opts), opts?.ff);
140
+ }
141
+ /**
142
+ * Appends a self-loop verification step - requires a Block from
143
+ * `defineAssertBlock`. Compile-time: {@link AssertBlock} only (not `.method()`).
144
+ * `{ ff: true }`: fast-forward this one step inline - see `appendStep`'s own comment.
145
+ */
146
+ assert(block, opts) {
147
+ assertMapKind(block, ["assert"], "assert");
148
+ return this.appendStep(paced(block, opts), opts?.ff);
149
+ }
150
+ /**
151
+ * Appends a non-navigating page action (submit, upload, add/remove an
152
+ * instance) - requires a Block from `defineMethodBlock`/`defineActionBlock`/
153
+ * `defineEffectBlock`/`defineMemEffectBlock`.
154
+ * Compile-time: {@link MethodBlock} or {@link EffectBlock} only - Assert
155
+ * Blocks must use `.assert()`. Runtime also rejects `__waygraphKind =
156
+ * "assert"` (those still carry method salt from the factory internals).
157
+ * `{ ff: true }`: fast-forward this one step inline - see `appendStep`'s own comment.
158
+ */
159
+ method(block, opts) {
160
+ if (mapKindOf(block) === "assert") {
161
+ throw new WaygraphError("WG_MAP_WRONG_KIND", MSG_MAP_METHOD_GOT_ASSERT(block.name));
162
+ }
163
+ assertMapSalt(block, ["method", "effect", "api"], "method");
164
+ return this.appendStep(paced(block, opts), opts?.ff);
165
+ }
166
+ /**
167
+ * Runs another flow's steps inline here, in the same page, browser and `mem`. This is how flows nest:
168
+ * `map().flow(loginFlow).flow(viewerFlow, { reset: true })`. With `{ reset: true }` cookies and storage are cleared
169
+ * right before the sub-flow's first step.
170
+ */
171
+ flow(sub, opts) {
172
+ // The steps' types live in `sub`; at runtime this is one untyped walk, typed again as the sub-flow's last Checkpoint.
173
+ let next = this;
174
+ sub.blocks().forEach((info, i) => {
175
+ const block = i === 0 && (opts?.reset ?? sub.resetSession) ? resetBefore(info.block) : info.block;
176
+ next = next.appendStep(block);
177
+ });
178
+ return next;
179
+ }
180
+ /**
181
+ * Branch: run everything added so far, then continue into whichever `routes[tag]` matches the
182
+ * resolved Checkpoint's tag - same page, same context, same mem. `routes` must cover every tag
183
+ * of `Out` (a missing one is a compile error, matching {@link branch}'s own exhaustiveness);
184
+ * `null` means that tag is terminal (the branched Flow just returns that Checkpoint).
185
+ *
186
+ * Each non-null route is a function, not a ready-made `Flow` - a fresh Flow always starts at the
187
+ * special `S` (start) Checkpoint, but a branch's blocks start from the TAG it routes on (e.g.
188
+ * `LoggedIn`), so the function is handed a brand-new `MapBuilder` already seeded at that exact
189
+ * Checkpoint to chain `.method()/.gotoPage()/.assert()/.end()` (or another `.branch()`) off of.
190
+ *
191
+ * Real gap this fixes: the plain `branch()` helper's `.next` routing is only ever consulted by
192
+ * `runGraph`'s own graph walk - `.end()` composes steps pairwise via `connect()`,
193
+ * which never looks at `.next` at all, so a Map-built Flow had no way to branch. This method
194
+ * branches at the Flow level instead: it finalizes the prefix, runs it, and picks the next Flow
195
+ * itself once the real tag is known - no engine-level routing involved.
196
+ *
197
+ * Only the `run(context, mem[, options])` signature is supported - the page must survive across
198
+ * the branch, and the bare `run(mem, config)` convenience form always closes its own browser
199
+ * before a tag is even known, so it throws instead of silently reopening a fresh (state-losing) page.
200
+ *
201
+ * The route's first Block still sees `input.__state === "__start__"` in `act()`, not the tag that
202
+ * routed there - `runGraph` seeds every Flow's entry Block that way unconditionally, the same as
203
+ * any single-Block Flow does. Read `page`/`mem`, not `input`,
204
+ * in `act()` - every real Block in this codebase already follows that convention.
205
+ *
206
+ * @example
207
+ * map({ homeOrigin }).gotoPage(NavCartBlock).branch({
208
+ * ItemInCart: (m) => m.method(RemoveFromCartBlock).end(),
209
+ * LoggedIn: (m) => m.method(AddToCartBlock).end(),
210
+ * });
211
+ */
212
+ branch(routes) {
213
+ if (this.steps.length === 0) {
214
+ throw new WaygraphError("WG_MAP_BRANCH_NO_PRIOR_STEP", MSG_MAP_BRANCH_NO_PRIOR_STEP);
215
+ }
216
+ const before = this.end();
217
+ const resolvedRoutes = {};
218
+ for (const [tag, fn] of Object.entries(routes)) {
219
+ resolvedRoutes[tag] = fn ? fn(new MapBuilder(this.build, this.settings, [], this.homeOrigin, null)) : null;
220
+ }
221
+ return buildBranchedFlow(before, resolvedRoutes);
222
+ }
223
+ /**
224
+ * Finalizes this chain into a runnable {@link Flow} with the settings given to `map({ ... })`;
225
+ * `withBlockVerify`/`modBlockVerify` work on it. Throws if no step was ever added - an empty map
226
+ * isn't a flow. An auto-opened `{ ff: true }` window (see {@link MapStepOpts})
227
+ * left open at `.end()` closes silently; an EXPLICIT `.ffStart()` left open
228
+ * still throws - the author opened that one and needs to close it themselves.
229
+ */
230
+ end() {
231
+ if (this.ff && !this.ff.auto) {
232
+ throw new WaygraphError("WG_MAP_FF_NOT_CLOSED", MSG_MAP_FF_NOT_CLOSED(this.ff.name));
233
+ }
234
+ if (this.ff && this.ff.auto) {
235
+ return this.closeFf().end();
236
+ }
237
+ if (this.steps.length === 0) {
238
+ throw new WaygraphError("WG_MAP_EMPTY", MSG_MAP_EMPTY);
239
+ }
240
+ return this.build(this.steps, this.settings);
241
+ }
242
+ }
@@ -0,0 +1,30 @@
1
+ import { type SomeBlock, type SomeDefinedBlock } from "../block/block.js";
2
+ import type { DemoPace } from "../stub/pace.js";
3
+ /** The same Block, but it clears cookies and storage before it acts. Keeps the runtime markers. */
4
+ export declare function resetBefore(block: SomeBlock): SomeBlock;
5
+ /** Applies a step's `pace` option, keeping the Block's runtime markers. */
6
+ export declare function paced(block: object, opts: MapStepOpts | undefined): SomeDefinedBlock;
7
+ export declare function mapKindOf(block: unknown): string | undefined;
8
+ export declare function mapSaltOf(block: unknown): string | undefined;
9
+ export declare function mapNavUrlOf(block: unknown): string | undefined;
10
+ export declare function assertMapKind(block: SomeBlock, allowed: readonly string[], method: string): void;
11
+ export declare function assertMapSalt(block: SomeBlock, allowed: readonly string[], method: string): void;
12
+ export declare function assertMapOrigin(block: SomeBlock, homeOrigin: string | undefined, expect: "internal" | "external", method: string): void;
13
+ export declare const MAP_KIND_FACTORY_HINT: Record<string, string>;
14
+ export declare const MAP_SALT_FACTORY_HINT: Record<string, string>;
15
+ /** Per-step options for the map builder: `ff` fast-forwards the step, `pace` sets its demo pace. */
16
+ export interface MapStepOpts {
17
+ /**
18
+ * Fast-forward just this step, inline - no `.ffStart()/.ffEnd()` bracket needed. Consecutive
19
+ * `{ ff: true }` steps merge into ONE fast-forward block, same result as the explicit bracket
20
+ * form; a step without the flag closes an auto-opened window first.
21
+ * @example map().gotoPage(NavLoginBlock, { ff: true }).method(FillUsernameBlock, { ff: true })
22
+ */
23
+ ff?: boolean;
24
+ /**
25
+ * Demo pace for just this step (`"blitz"` skips the typing animation and the pause after the action; `"fast"`, `"slow"`,
26
+ * or a number scale the narration gates).
27
+ * @example map().method(SetBearerTokenBlock, { pace: "blitz" })
28
+ */
29
+ pace?: DemoPace;
30
+ }
@@ -0,0 +1,87 @@
1
+ import { copyWaygraphRuntime } from "../block/block.js";
2
+ import { MSG_MAP_WRONG_KIND, MSG_MAP_WRONG_ORIGIN_EXTERNAL, MSG_MAP_WRONG_ORIGIN_INTERNAL, MSG_MAP_WRONG_SALT, WaygraphError } from "../errors.js";
3
+ import { clearSessionState } from "./flow.js";
4
+ /** The same Block, but it clears cookies and storage before it acts. Keeps the runtime markers. */
5
+ export function resetBefore(block) {
6
+ const act = block.instruction.act.bind(block.instruction);
7
+ const next = {
8
+ ...block,
9
+ instruction: {
10
+ ...block.instruction,
11
+ async act(page, input, mem) {
12
+ await clearSessionState(page.context(), page);
13
+ return act(page, input, mem);
14
+ },
15
+ },
16
+ };
17
+ copyWaygraphRuntime(block, next);
18
+ Object.defineProperty(next, "__waygraphResetBefore", { value: true, enumerable: false, configurable: true });
19
+ return next;
20
+ }
21
+ /** Applies a step's `pace` option, keeping the Block's runtime markers. */
22
+ export function paced(block, opts) {
23
+ if (opts?.pace === undefined)
24
+ return block;
25
+ const next = { ...block, demoPace: opts.pace };
26
+ copyWaygraphRuntime(block, next);
27
+ return next;
28
+ }
29
+ export function mapKindOf(block) {
30
+ return block?.__waygraphKind;
31
+ }
32
+ export function mapSaltOf(block) {
33
+ return block?.__waygraphSalt;
34
+ }
35
+ export function mapNavUrlOf(block) {
36
+ const url = block?.__waygraphNavUrl;
37
+ return typeof url === "string" ? url : undefined;
38
+ }
39
+ export function assertMapKind(block, allowed, method) {
40
+ const kind = mapKindOf(block);
41
+ if (kind !== undefined && allowed.includes(kind))
42
+ return;
43
+ const wanted = allowed.map((k) => MAP_KIND_FACTORY_HINT[k] ?? k).join(" or ");
44
+ const found = kind ? `a Block of kind "${kind}"` : "an object with no waygraph kind marker at all";
45
+ throw new WaygraphError("WG_MAP_WRONG_KIND", MSG_MAP_WRONG_KIND(method, block?.name ?? "?", wanted, found));
46
+ }
47
+ export function assertMapSalt(block, allowed, method) {
48
+ const salt = mapSaltOf(block);
49
+ if (salt !== undefined && allowed.includes(salt))
50
+ return;
51
+ const wanted = allowed.map((s) => MAP_SALT_FACTORY_HINT[s] ?? s).join(" or ");
52
+ const found = salt ? `a Block salted "${salt}"` : "an object with no waygraph salt marker at all";
53
+ throw new WaygraphError("WG_MAP_WRONG_SALT", MSG_MAP_WRONG_SALT(method, block?.name ?? "?", wanted, found));
54
+ }
55
+ export function assertMapOrigin(block, homeOrigin, expect, method) {
56
+ if (!homeOrigin)
57
+ return; // not configured - can't validate, honest no-op
58
+ const navUrl = mapNavUrlOf(block);
59
+ if (navUrl === undefined)
60
+ return; // click-based/dynamic nav - not statically checkable
61
+ let targetOrigin;
62
+ let wantOrigin;
63
+ try {
64
+ targetOrigin = new URL(navUrl, homeOrigin).origin;
65
+ wantOrigin = new URL(homeOrigin).origin;
66
+ }
67
+ catch {
68
+ return; // malformed URL - not this check's job to validate that
69
+ }
70
+ const isExternal = targetOrigin !== wantOrigin;
71
+ if (expect === "internal" && isExternal) {
72
+ throw new WaygraphError("WG_MAP_WRONG_ORIGIN", MSG_MAP_WRONG_ORIGIN_INTERNAL(block.name, targetOrigin, wantOrigin));
73
+ }
74
+ if (expect === "external" && !isExternal) {
75
+ throw new WaygraphError("WG_MAP_WRONG_ORIGIN", MSG_MAP_WRONG_ORIGIN_EXTERNAL(block.name, targetOrigin, wantOrigin));
76
+ }
77
+ }
78
+ export const MAP_KIND_FACTORY_HINT = {
79
+ nav: "defineNavBlock/defineMemNavBlock",
80
+ page: "definePageBlock",
81
+ assert: "defineAssertBlock",
82
+ };
83
+ export const MAP_SALT_FACTORY_HINT = {
84
+ method: "defineMethodBlock",
85
+ effect: "defineEffectBlock",
86
+ api: "defineApiBlock",
87
+ };
@@ -1,4 +1,4 @@
1
- import type { NavBlock } from "./blocks/nav.js";
1
+ import type { NavBlock } from "./block/kinds/nav.js";
2
2
  import type { Page } from "@playwright/test";
3
3
  /**
4
4
  * "Where am I" - reverse-matches a live `page` against every NavBlock /
@@ -1,4 +1,4 @@
1
- import { MemPage } from "../mem-page.js";
1
+ import { MemPage } from "./mem/mem.js";
2
2
  /**
3
3
  * "Where am I" - reverse-matches a live `page` against every NavBlock /
4
4
  * PageBlock in `library`, in order, returning the first one whose own `verify`
@@ -38,7 +38,6 @@ export async function locate(page, library, options) {
38
38
  const traits = typeof verify === "function" ? verify(resolved) : (verify ?? []);
39
39
  let allPass = true;
40
40
  for (const trait of traits) {
41
- // eslint-disable-next-line no-await-in-loop
42
41
  if (!(await trait.check(page, mem))) {
43
42
  allPass = false;
44
43
  break;
@@ -6,18 +6,19 @@
6
6
  *
7
7
  * "Stub" here is unrelated to the other two meanings already in this
8
8
  * codebase: `stubBefore`/`stubAfter`/`stubOnError` (demo narration fixtures,
9
- * see highlights.ts's `runStubPhase`) and `upload`'s `stub: "image"|"pdf"|
9
+ * see demo/narration/index.ts's `runStubPhase`) and `upload`'s `stub: "image"|"pdf"|
10
10
  * "video"` (a placeholder file). This is a third, separate "stub."
11
11
  *
12
- * Opt-in only, per Flow (`withMemStub`, engine.ts) or per-run (`--mem-stub` /
12
+ * Opt-in only, per Flow (`map({ memStub: true })`) or per-run (`--mem-stub` /
13
13
  * WAYGRAPH_MEM_STUB=1) - a required key with no registered generator still
14
14
  * fails preflight exactly as before. Registered per MemKey *instance*
15
15
  * (identity, not `.name`), matching MemPage's own store - two keys sharing a
16
16
  * debug name must never cross-contaminate here either.
17
17
  */
18
- import type { MemKey } from "./mem-page.js";
19
- import type { MemPage } from "./mem-page.js";
20
- import type { Flow } from "./core.js";
18
+ import type { MemKey } from "./mem.js";
19
+ import type { MemPage } from "./mem.js";
20
+ import type { Flow } from "../flow/flow.js";
21
+ import type { Checkpoint } from "../checkpoint/checkpoint.js";
21
22
  /**
22
23
  * Registers a fake-value generator for one required MemKey.
23
24
  * @example registerMemStub(LoginCreds.key, () => ({
@@ -26,16 +27,16 @@ import type { Flow } from "./core.js";
26
27
  * }));
27
28
  */
28
29
  export declare function registerMemStub<T>(key: MemKey<T>, fake: () => T): void;
29
- /** Used by waygraph's own `--mem-stub`-aware CLI seeding and by {@link seedMemStub} - flow authors normally use {@link registerMemStub}/{@link withMemStub} instead. */
30
+ /** Used by waygraph's own `--mem-stub`-aware CLI seeding and by {@link seedMemStub} - flow authors normally use {@link registerMemStub} and `map({ memStub: true })` instead. */
30
31
  export declare function getMemStub<T>(key: MemKey<T>): (() => T) | undefined;
31
32
  /**
32
33
  * For a bare library `flow.run(mem, ...)` call outside the CLI (which has its
33
34
  * own `--mem-stub`-aware seeding) - call this yourself before `run()` when
34
35
  * `flow.memStub` is true, the same way external tooling already reads
35
36
  * `flow.resetSession`/`flow.title`/etc. (`run()` itself never reads Flow
36
- * flags - see the `with*` helpers in engine.ts).
37
+ * flags; the settings come from `map({ ... })`).
37
38
  * @example
38
39
  * if (flow.memStub) seedMemStub(mem, flow);
39
40
  * await flow.run(mem, config);
40
41
  */
41
- export declare function seedMemStub(mem: MemPage, flow: Flow<any>): void;
42
+ export declare function seedMemStub(mem: MemPage, flow: Flow<Checkpoint<string>>): void;
@@ -9,7 +9,7 @@ const registry = new Map();
9
9
  export function registerMemStub(key, fake) {
10
10
  registry.set(key, fake);
11
11
  }
12
- /** Used by waygraph's own `--mem-stub`-aware CLI seeding and by {@link seedMemStub} - flow authors normally use {@link registerMemStub}/{@link withMemStub} instead. */
12
+ /** Used by waygraph's own `--mem-stub`-aware CLI seeding and by {@link seedMemStub} - flow authors normally use {@link registerMemStub} and `map({ memStub: true })` instead. */
13
13
  export function getMemStub(key) {
14
14
  return registry.get(key);
15
15
  }
@@ -18,7 +18,7 @@ export function getMemStub(key) {
18
18
  * own `--mem-stub`-aware seeding) - call this yourself before `run()` when
19
19
  * `flow.memStub` is true, the same way external tooling already reads
20
20
  * `flow.resetSession`/`flow.title`/etc. (`run()` itself never reads Flow
21
- * flags - see the `with*` helpers in engine.ts).
21
+ * flags; the settings come from `map({ ... })`).
22
22
  * @example
23
23
  * if (flow.memStub) seedMemStub(mem, flow);
24
24
  * await flow.run(mem, config);
@@ -55,7 +55,7 @@ export declare class MemPage {
55
55
  * can only have string/symbol property names, not object instances - a `[key,
56
56
  * value]` pair is the shape that keeps that identity-based guarantee.
57
57
  *
58
- * Overloaded per pair count (2-6, same reasoning as `Engine.defineFlow`'s
58
+ * Overloaded per pair count (2-6, per-arity overloads like the old `defineFlow`'s
59
59
  * overloads) rather than one fully-generic variadic signature - each pair binds
60
60
  * its own type parameter independently, which TS checks reliably; a single
61
61
  * self-referential mapped-tuple-over-a-rest-parameter type was tried first and