waygraph 0.15.53 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (556) 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 +13 -14
  10. package/dist/analysis/graph.js +48 -371
  11. package/dist/analysis/map-check.js +4 -39
  12. package/dist/analysis/practices-check.d.ts +1 -1
  13. package/dist/analysis/practices-check.js +24 -45
  14. package/dist/cli/args.d.ts +23 -0
  15. package/dist/cli/args.js +20 -0
  16. package/dist/{cli.d.ts → cli/cli.d.ts} +0 -1
  17. package/dist/{cli.js → cli/cli.js} +10 -9
  18. package/dist/{commands → cli/commands}/agent-dive-scaffold.js +35 -64
  19. package/dist/cli/commands/agent-dive.js +42 -0
  20. package/dist/{commands → cli/commands}/check.d.ts +0 -1
  21. package/dist/cli/commands/check.js +104 -0
  22. package/dist/cli/commands/codemod-checkpoints.d.ts +18 -0
  23. package/dist/cli/commands/codemod-checkpoints.js +186 -0
  24. package/dist/cli/commands/codemod-flows.d.ts +18 -0
  25. package/dist/cli/commands/codemod-flows.js +284 -0
  26. package/dist/cli/commands/codemod-stubs.d.ts +10 -0
  27. package/dist/cli/commands/codemod-stubs.js +187 -0
  28. package/dist/{commands → cli/commands}/extensions.js +5 -4
  29. package/dist/{commands → cli/commands}/init.js +1 -2
  30. package/dist/{commands → cli/commands}/list.js +9 -7
  31. package/dist/cli/commands/manifest.d.ts +2 -0
  32. package/dist/cli/commands/manifest.js +20 -0
  33. package/dist/cli/commands/map.js +57 -0
  34. package/dist/{commands → cli/commands}/run.d.ts +0 -1
  35. package/dist/cli/commands/run.js +64 -0
  36. package/dist/{commands → cli/commands}/session.js +61 -88
  37. package/dist/{commands → cli/commands}/test.js +11 -14
  38. package/dist/cli/commands/traverse.js +105 -0
  39. package/dist/{commands → cli/commands}/try.js +29 -25
  40. package/dist/{commands → cli/commands}/upgrade.js +40 -4
  41. package/dist/cli/flags.d.ts +193 -16
  42. package/dist/cli/flags.js +179 -234
  43. package/dist/cli/run-chain.d.ts +1 -0
  44. package/dist/cli/run-chain.js +42 -7
  45. package/dist/cli/usage.d.ts +1 -1
  46. package/dist/cli/usage.js +21 -53
  47. package/dist/cli/util.d.ts +2 -2
  48. package/dist/cli/util.js +2 -3
  49. package/dist/{highlights → demo/narration}/css.d.ts +1 -1
  50. package/dist/{highlights → demo/narration}/css.js +2 -3
  51. package/dist/{highlights → demo/narration}/demo-pace.d.ts +7 -11
  52. package/dist/{highlights → demo/narration}/demo-pace.js +9 -11
  53. package/dist/{highlights → demo/narration}/device.d.ts +4 -2
  54. package/dist/{highlights → demo/narration}/device.js +3 -1
  55. package/dist/demo/narration/merge.d.ts +8 -0
  56. package/dist/demo/narration/merge.js +71 -0
  57. package/dist/{highlights/run-phase.d.ts → demo/narration/narration.d.ts} +10 -14
  58. package/dist/{highlights/run-phase.js → demo/narration/narration.js} +25 -94
  59. package/dist/{highlights → demo/narration}/shorthand.d.ts +1 -1
  60. package/dist/demo/narration/stub-ctx.d.ts +8 -0
  61. package/dist/demo/narration/stub-ctx.js +164 -0
  62. package/dist/{highlights → demo/narration}/style.d.ts +1 -7
  63. package/dist/{highlights → demo/narration}/style.js +1 -41
  64. package/dist/{highlights → demo/narration}/todo-dock.d.ts +3 -3
  65. package/dist/{highlights → demo/narration}/todo-dock.js +13 -30
  66. package/dist/demo/overlay/auto-chrome.d.ts +7 -0
  67. package/dist/demo/overlay/auto-chrome.js +97 -0
  68. package/dist/{session/overlay-beacon.d.ts → demo/overlay/beacon.d.ts} +7 -0
  69. package/dist/{session/overlay-beacon.js → demo/overlay/beacon.js} +5 -0
  70. package/dist/demo/overlay/cursor.d.ts +12 -0
  71. package/dist/demo/overlay/cursor.js +142 -0
  72. package/dist/demo/overlay/device-stage.d.ts +13 -0
  73. package/dist/demo/overlay/device-stage.js +396 -0
  74. package/dist/demo/overlay/inpage/banner.d.ts +1 -0
  75. package/dist/demo/overlay/inpage/banner.js +160 -0
  76. package/dist/demo/overlay/inpage/caption.d.ts +2 -0
  77. package/dist/demo/overlay/inpage/caption.js +24 -0
  78. package/dist/demo/overlay/inpage/core.d.ts +1 -0
  79. package/dist/demo/overlay/inpage/core.js +345 -0
  80. package/dist/demo/overlay/inpage/device-chip.d.ts +1 -0
  81. package/dist/demo/overlay/inpage/device-chip.js +191 -0
  82. package/dist/demo/overlay/inpage/network.d.ts +9 -0
  83. package/dist/demo/overlay/inpage/network.js +200 -0
  84. package/dist/demo/overlay/inpage/panel-chrome.d.ts +1 -0
  85. package/dist/demo/overlay/inpage/panel-chrome.js +203 -0
  86. package/dist/demo/overlay/inpage/stamp.d.ts +1 -0
  87. package/dist/demo/overlay/inpage/stamp.js +46 -0
  88. package/dist/demo/overlay/inpage/swipe-zoom.d.ts +1 -0
  89. package/dist/demo/overlay/inpage/swipe-zoom.js +220 -0
  90. package/dist/demo/overlay/inpage/todos.d.ts +1 -0
  91. package/dist/demo/overlay/inpage/todos.js +294 -0
  92. package/dist/demo/overlay/locator-theater.d.ts +25 -0
  93. package/dist/demo/overlay/locator-theater.js +76 -0
  94. package/dist/demo/overlay/network-capture.d.ts +22 -0
  95. package/dist/demo/overlay/network-capture.js +127 -0
  96. package/dist/demo/overlay/overlay-css.d.ts +3 -0
  97. package/dist/demo/overlay/overlay-css.js +369 -0
  98. package/dist/demo/overlay/overlay-stage.d.ts +23 -0
  99. package/dist/demo/overlay/overlay-stage.js +106 -0
  100. package/dist/demo/overlay/overlay.d.ts +10 -0
  101. package/dist/demo/overlay/overlay.js +89 -0
  102. package/dist/{pilot-overlay/overlay-fixtures.d.ts → demo/overlay/phase-fixtures.d.ts} +2 -2
  103. package/dist/{pilot-overlay/overlay-fixtures.js → demo/overlay/phase-fixtures.js} +2 -2
  104. package/dist/{pilot-overlay/action-ring.js → demo/overlay/pilot/actions.js} +2 -1
  105. package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.d.ts +6 -5
  106. package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.js +19 -18
  107. package/dist/{pilot-overlay → demo/overlay/pilot}/shell.d.ts +2 -2
  108. package/dist/{pilot-overlay → demo/overlay/pilot}/shell.js +13 -22
  109. package/dist/demo/overlay/reattach.d.ts +7 -0
  110. package/dist/demo/overlay/reattach.js +23 -0
  111. package/dist/demo/overlay/rings.d.ts +33 -0
  112. package/dist/demo/overlay/rings.js +448 -0
  113. package/dist/{ui → demo/overlay/ui}/components/ring.js +2 -2
  114. package/dist/{ui → demo/overlay/ui}/overlay.css +4 -4
  115. package/dist/{ui → demo/overlay/ui}/shadow.d.ts +1 -1
  116. package/dist/{ui → demo/overlay/ui}/shadow.js +39 -2
  117. package/dist/demo/stepper/after.d.ts +3 -0
  118. package/dist/demo/stepper/after.js +113 -0
  119. package/dist/demo/stepper/banner-log.d.ts +37 -0
  120. package/dist/demo/stepper/banner-log.js +63 -0
  121. package/dist/demo/stepper/before.d.ts +4 -0
  122. package/dist/demo/stepper/before.js +110 -0
  123. package/dist/demo/stepper/demo-log.d.ts +31 -0
  124. package/dist/demo/stepper/demo-log.js +309 -0
  125. package/dist/demo/stepper/gate.d.ts +11 -0
  126. package/dist/demo/stepper/gate.js +78 -0
  127. package/dist/demo/stepper/interaction-patch.d.ts +3 -0
  128. package/dist/demo/stepper/interaction-patch.js +323 -0
  129. package/dist/demo/stepper/pacing.d.ts +21 -0
  130. package/dist/demo/stepper/pacing.js +23 -0
  131. package/dist/demo/stepper/slides.d.ts +11 -0
  132. package/dist/demo/stepper/slides.js +233 -0
  133. package/dist/demo/stepper/step-panels.d.ts +21 -0
  134. package/dist/demo/stepper/step-panels.js +589 -0
  135. package/dist/demo/stepper/stepper.d.ts +24 -0
  136. package/dist/demo/stepper/stepper.js +122 -0
  137. package/dist/demo/stepper/teardown.d.ts +48 -0
  138. package/dist/demo/stepper/teardown.js +179 -0
  139. package/dist/demo/stepper/todo-advance.d.ts +14 -0
  140. package/dist/demo/stepper/todo-advance.js +110 -0
  141. package/dist/demo/stepper/view.d.ts +68 -0
  142. package/dist/demo/stepper/view.js +31 -0
  143. package/dist/demo/types.d.ts +17 -0
  144. package/dist/demo/verbose-log.js +15 -0
  145. package/dist/{types.d.ts → engine/block/block.d.ts} +106 -91
  146. package/dist/{core → engine/block}/block.js +10 -53
  147. package/dist/{core → engine/block}/compose.d.ts +10 -7
  148. package/dist/{core → engine/block}/compose.js +1 -1
  149. package/dist/{core/blocks → engine/block/kinds}/api.d.ts +17 -12
  150. package/dist/{core/blocks → engine/block/kinds}/api.js +26 -18
  151. package/dist/{core/blocks → engine/block/kinds}/effect.d.ts +13 -18
  152. package/dist/engine/block/kinds/effect.js +17 -0
  153. package/dist/{core/blocks → engine/block/kinds}/method.d.ts +19 -29
  154. package/dist/{core/blocks → engine/block/kinds}/method.js +7 -21
  155. package/dist/{core/blocks → engine/block/kinds}/nav.d.ts +22 -31
  156. package/dist/{core/blocks → engine/block/kinds}/nav.js +6 -12
  157. package/dist/{core/blocks → engine/block/kinds}/page.d.ts +15 -20
  158. package/dist/{core/blocks → engine/block/kinds}/page.js +5 -7
  159. package/dist/engine/checkpoint/checkpoint.d.ts +22 -0
  160. package/dist/engine/checkpoint/checkpoint.js +8 -0
  161. package/dist/engine/checkpoint/route.d.ts +28 -0
  162. package/dist/engine/checkpoint/route.js +28 -0
  163. package/dist/{core → engine}/config.d.ts +7 -2
  164. package/dist/engine/config.js +6 -0
  165. package/dist/engine/engine.d.ts +45 -0
  166. package/dist/{core → engine}/engine.js +6 -10
  167. package/dist/engine/env.d.ts +59 -0
  168. package/dist/engine/env.js +83 -0
  169. package/dist/{errors.d.ts → engine/errors.d.ts} +23 -22
  170. package/dist/{errors.js → engine/errors.js} +22 -22
  171. package/dist/{core → engine/flow}/branch-regression.d.ts +8 -7
  172. package/dist/{core → engine/flow}/branch-regression.js +4 -3
  173. package/dist/engine/flow/flow.d.ts +162 -0
  174. package/dist/engine/flow/flow.js +244 -0
  175. package/dist/{core → engine/flow}/map-builder.d.ts +42 -40
  176. package/dist/{core → engine/flow}/map-builder.js +46 -48
  177. package/dist/{core → engine}/locate.d.ts +1 -1
  178. package/dist/{core → engine}/locate.js +1 -2
  179. package/dist/{mem-stub.d.ts → engine/mem/mem-stub.d.ts} +9 -8
  180. package/dist/{mem-stub.js → engine/mem/mem-stub.js} +2 -2
  181. package/dist/{mem-page.d.ts → engine/mem/mem.d.ts} +1 -1
  182. package/dist/{mem-page.js → engine/mem/mem.js} +2 -1
  183. package/dist/engine/page-gone.d.ts +5 -0
  184. package/dist/engine/page-gone.js +20 -0
  185. package/dist/engine/run/connect.d.ts +28 -0
  186. package/dist/{types.js → engine/run/connect.js} +11 -10
  187. package/dist/engine/run/events.d.ts +67 -0
  188. package/dist/engine/run/events.js +90 -0
  189. package/dist/engine/run/hooks.d.ts +16 -0
  190. package/dist/engine/run/hooks.js +8 -0
  191. package/dist/engine/run/launch.d.ts +13 -0
  192. package/dist/engine/run/launch.js +27 -0
  193. package/dist/{core/run-graph.d.ts → engine/run/run.d.ts} +9 -11
  194. package/dist/{core/run-graph.js → engine/run/run.js} +22 -11
  195. package/dist/engine/stub/pace.d.ts +12 -0
  196. package/dist/engine/stub/pace.js +2 -0
  197. package/dist/engine/stub/ring.d.ts +130 -0
  198. package/dist/engine/stub/ring.js +41 -0
  199. package/dist/engine/stub/stub.d.ts +268 -0
  200. package/dist/engine/stub/stub.js +1 -0
  201. package/dist/engine/stub/todos.d.ts +104 -0
  202. package/dist/engine/stub/todos.js +2 -0
  203. package/dist/engine/stub/viewport.d.ts +26 -0
  204. package/dist/engine/stub/viewport.js +2 -0
  205. package/dist/{trait.d.ts → engine/trait/trait.d.ts} +1 -1
  206. package/dist/index.d.ts +84 -36
  207. package/dist/index.js +44 -19
  208. package/dist/{session/auto-explore-run.d.ts → live/auto/auto.d.ts} +10 -16
  209. package/dist/{session/auto-explore-run.js → live/auto/auto.js} +164 -248
  210. package/dist/{session/auto-explore.d.ts → live/auto/explore.d.ts} +4 -14
  211. package/dist/{session/auto-explore.js → live/auto/explore.js} +21 -127
  212. package/dist/{auto-session/session.d.ts → live/auto-session/auto-session.d.ts} +1 -1
  213. package/dist/{auto-session/session.js → live/auto-session/auto-session.js} +27 -24
  214. package/dist/{auto-session → live/auto-session}/helpers.d.ts +16 -5
  215. package/dist/{auto-session → live/auto-session}/helpers.js +1 -1
  216. package/dist/{session/auto-session-ipc.d.ts → live/auto-session/ipc.d.ts} +7 -5
  217. package/dist/{session/auto-session-ipc.js → live/auto-session/ipc.js} +31 -16
  218. package/dist/{session/browser.d.ts → live/auto-session/start.d.ts} +1 -2
  219. package/dist/{session/browser.js → live/auto-session/start.js} +2 -3
  220. package/dist/{pilot-overlay → live/pilot}/panel.d.ts +1 -1
  221. package/dist/{pilot-overlay → live/pilot}/panel.js +23 -31
  222. package/dist/{session → live/pilot}/pilot.d.ts +4 -3
  223. package/dist/{session → live/pilot}/pilot.js +4 -4
  224. package/dist/{traverse → live/traverse}/coverage.d.ts +4 -0
  225. package/dist/{traverse → live/traverse}/coverage.js +3 -0
  226. package/dist/{traverse → live/traverse}/lease.d.ts +1 -0
  227. package/dist/{traverse → live/traverse}/lease.js +1 -0
  228. package/dist/{traverse/run.d.ts → live/traverse/traverse.d.ts} +4 -1
  229. package/dist/{traverse/run.js → live/traverse/traverse.js} +26 -43
  230. package/dist/manifest/manifest.d.ts +52 -0
  231. package/dist/manifest/manifest.js +93 -0
  232. package/dist/manifest/map-imports.d.ts +7 -0
  233. package/dist/manifest/map-imports.js +22 -0
  234. package/dist/manifest/maps.d.ts +33 -0
  235. package/dist/manifest/maps.js +62 -0
  236. package/dist/manifest/pack.d.ts +21 -0
  237. package/dist/manifest/pack.js +109 -0
  238. package/dist/manifest/project.d.ts +60 -0
  239. package/dist/manifest/project.js +101 -0
  240. package/dist/{session/block-inject.js → manifest/roots.js} +1 -18
  241. package/dist/manifest/scan.d.ts +19 -0
  242. package/dist/manifest/scan.js +57 -0
  243. package/dist/{blocks-select.d.ts → manifest/select.d.ts} +3 -0
  244. package/dist/{blocks-select.js → manifest/select.js} +2 -0
  245. package/dist/manifest/source.d.ts +23 -0
  246. package/dist/manifest/source.js +86 -0
  247. package/dist/runner/mode.d.ts +71 -0
  248. package/dist/runner/mode.js +1 -0
  249. package/dist/runner/modes/branches.d.ts +5 -0
  250. package/dist/runner/modes/branches.js +37 -0
  251. package/dist/runner/modes/demo.d.ts +3 -0
  252. package/dist/runner/modes/demo.js +13 -0
  253. package/dist/runner/modes/report.d.ts +2 -0
  254. package/dist/runner/modes/report.js +54 -0
  255. package/dist/runner/modes/run.d.ts +2 -0
  256. package/dist/runner/modes/run.js +3 -0
  257. package/dist/runner/options.d.ts +31 -0
  258. package/dist/runner/options.js +42 -0
  259. package/dist/runner/plan/find.d.ts +18 -0
  260. package/dist/runner/plan/find.js +65 -0
  261. package/dist/runner/plan/plan.d.ts +11 -0
  262. package/dist/runner/plan/plan.js +97 -0
  263. package/dist/runner/plan/seed-mem.d.ts +12 -0
  264. package/dist/runner/plan/seed-mem.js +98 -0
  265. package/dist/runner/plan/spec.d.ts +5 -0
  266. package/dist/runner/plan/spec.js +17 -0
  267. package/dist/runner/play-steps.d.ts +2 -0
  268. package/dist/runner/play-steps.js +59 -0
  269. package/dist/runner/runner.d.ts +4 -0
  270. package/dist/runner/runner.js +64 -0
  271. package/dist/runner/session.d.ts +9 -0
  272. package/dist/runner/session.js +87 -0
  273. package/dist/{browser.js → runtime/browser.js} +4 -2
  274. package/dist/{env-file.js → runtime/env-file.js} +7 -12
  275. package/dist/{extensions.d.ts → runtime/extensions.d.ts} +2 -5
  276. package/dist/{extensions.js → runtime/extensions.js} +3 -1
  277. package/dist/runtime/full-launch.d.ts +1 -0
  278. package/dist/runtime/full-launch.js +34 -0
  279. package/dist/runtime/global-flag.d.ts +5 -0
  280. package/dist/runtime/global-flag.js +18 -0
  281. package/dist/{playwright-config.d.ts → runtime/playwright-config.d.ts} +1 -1
  282. package/dist/{playwright.config.js → runtime/playwright.config.js} +3 -2
  283. package/dist/runtime/run-log.d.ts +2 -0
  284. package/dist/runtime/run-log.js +17 -0
  285. package/dist/{video-dir.js → runtime/video-dir.js} +3 -2
  286. package/dist/{config.d.ts → runtime/waygraph-config.d.ts} +8 -9
  287. package/dist/{config.js → runtime/waygraph-config.js} +21 -51
  288. package/dist/{webserver.js → runtime/webserver.js} +5 -30
  289. package/examples/routed-demo/config/waygraph.config.ts +20 -0
  290. package/examples/routed-demo/package.json +1 -4
  291. package/examples/routed-demo/scripts/fixture-server.mjs +1 -1
  292. package/examples/routed-demo/src/flows/routed-demo-map.flow.ts +2 -4
  293. package/examples/routed-demo/src/flows/routed-demo.flow.ts +2 -3
  294. package/examples/routed-demo/src/map/(app_base)/dashboard/_methods/click-widget.block.ts +5 -4
  295. package/examples/routed-demo/src/map/(app_base)/dashboard/_nav.block.ts +3 -3
  296. package/examples/routed-demo/src/map/(app_base)/dashboard/_page.block.ts +3 -3
  297. package/examples/routed-demo/src/map/(external)/docs/_nav.block.ts +3 -3
  298. package/examples/routed-demo/src/map/(external)/docs/_page.block.ts +3 -3
  299. package/examples/routed-demo/src/states/routed-demo.states.ts +5 -3
  300. package/examples/routed-demo/tests/routed-demo.spec.ts +4 -4
  301. package/examples/routed-demo/tsconfig.json +1 -1
  302. package/examples/saucedemo/README.md +11 -12
  303. package/examples/saucedemo/config/waygraph.config.ts +17 -0
  304. package/examples/saucedemo/docs/CONVENTION.md +5 -7
  305. package/examples/saucedemo/docs/HELPERS.md +12 -12
  306. package/examples/saucedemo/package-lock.json +10 -3
  307. package/examples/saucedemo/package.json +12 -29
  308. package/examples/saucedemo/src/blocks/SITE-MAP.md +0 -1
  309. package/examples/saucedemo/src/blocks/saucedemo-web/NAV.md +1 -5
  310. package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -52
  311. package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
  312. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
  313. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
  314. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
  315. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
  316. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +21 -27
  317. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -9
  318. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
  319. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +10 -76
  320. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
  321. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
  322. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
  323. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
  324. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
  325. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
  326. package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -29
  327. package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -48
  328. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +13 -77
  329. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
  330. package/examples/saucedemo/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
  331. package/examples/saucedemo/src/flows/api-demo.flow.ts +26 -18
  332. package/examples/saucedemo/src/flows/cart-bulk.flow.ts +19 -14
  333. package/examples/saucedemo/src/flows/cart-continue.flow.ts +10 -8
  334. package/examples/saucedemo/src/flows/cart-mem.flow.ts +7 -7
  335. package/examples/saucedemo/src/flows/catalog-logout.flow.ts +13 -8
  336. package/examples/saucedemo/src/flows/checkout-then-browse-again.flow.ts +26 -48
  337. package/examples/saucedemo/src/flows/checkout.flow.ts +70 -86
  338. package/examples/saucedemo/src/flows/device-showcase.flow.ts +24 -25
  339. package/examples/saucedemo/src/flows/login.flow.ts +11 -18
  340. package/examples/saucedemo/src/flows/mem-stub-demo.flow.ts +9 -20
  341. package/examples/saucedemo/src/flows/shop.flow.ts +15 -20
  342. package/examples/saucedemo/src/flows/smoke.flow.ts +12 -27
  343. package/examples/saucedemo/src/flows/stub-on-error.flow.ts +24 -43
  344. package/examples/saucedemo/src/flows/viewer-blocked.flow.ts +26 -34
  345. package/examples/saucedemo/src/states/checkout.mem-stubs.ts +11 -0
  346. package/examples/saucedemo/src/states/checkout.states.ts +21 -11
  347. package/examples/saucedemo/src/stubs/device-showcase.ts +191 -0
  348. package/examples/saucedemo/src/stubs/login.ts +37 -0
  349. package/examples/saucedemo/tests/auto-graph.spec.ts +4 -12
  350. package/examples/saucedemo/tests/chain-flow-episodes.spec.ts +7 -9
  351. package/examples/saucedemo/tests/submit-login-branch.spec.ts +18 -5
  352. package/package.json +12 -7
  353. package/templates/agents/waygraph-planner.agent.md +2 -2
  354. package/templates/quickstart/README.md +4 -7
  355. package/templates/quickstart/config/waygraph.config.ts +17 -0
  356. package/templates/quickstart/docs/CONVENTION.md +5 -6
  357. package/templates/quickstart/docs/HELPERS.md +11 -9
  358. package/templates/quickstart/package.json +14 -17
  359. package/templates/quickstart/src/blocks/SITE-MAP.md +13 -3
  360. package/templates/quickstart/src/blocks/saucedemo-web/NAV.md +1 -5
  361. package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -52
  362. package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
  363. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
  364. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
  365. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
  366. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
  367. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +21 -27
  368. package/templates/quickstart/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -9
  369. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
  370. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +10 -76
  371. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
  372. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
  373. package/templates/quickstart/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
  374. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
  375. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
  376. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
  377. package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -29
  378. package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -48
  379. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +13 -77
  380. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
  381. package/templates/quickstart/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
  382. package/templates/quickstart/src/flows/api-demo.flow.ts +45 -0
  383. package/templates/quickstart/src/flows/cart-bulk.flow.ts +19 -14
  384. package/templates/quickstart/src/flows/cart-continue.flow.ts +10 -8
  385. package/templates/quickstart/src/flows/cart-mem.flow.ts +7 -7
  386. package/templates/quickstart/src/flows/catalog-logout.flow.ts +13 -8
  387. package/templates/quickstart/src/flows/checkout-then-browse-again.flow.ts +26 -48
  388. package/templates/quickstart/src/flows/checkout.flow.ts +70 -63
  389. package/templates/quickstart/src/flows/device-showcase.flow.ts +24 -25
  390. package/templates/quickstart/src/flows/login.flow.ts +11 -18
  391. package/templates/quickstart/src/flows/mem-stub-demo.flow.ts +12 -0
  392. package/templates/quickstart/src/flows/shop.flow.ts +15 -20
  393. package/templates/quickstart/src/flows/smoke.flow.ts +12 -27
  394. package/templates/quickstart/src/flows/stub-on-error.flow.ts +31 -0
  395. package/templates/quickstart/src/flows/viewer-blocked.flow.ts +26 -34
  396. package/templates/quickstart/src/states/checkout.mem-stubs.ts +11 -0
  397. package/templates/quickstart/src/states/checkout.states.ts +21 -11
  398. package/templates/quickstart/src/stubs/device-showcase.ts +191 -0
  399. package/templates/quickstart/src/stubs/login.ts +37 -0
  400. package/templates/quickstart/tests/chain-flow.spec.ts +7 -10
  401. package/templates/scaffold/README.md +2 -1
  402. package/templates/scaffold/STRUCTURE.md +5 -4
  403. package/templates/scaffold/config/waygraph.config.ts +1 -0
  404. package/templates/scaffold/gitignore +1 -0
  405. package/templates/scaffold/src/flows/README.md +2 -2
  406. package/templates/scaffold/src/map/(app_base)/docs/_nav.block.ts +3 -3
  407. package/templates/scaffold/src/map/(app_base)/docs/_page.block.ts +3 -3
  408. package/templates/scaffold/src/map/(app_base)/home/_methods/add-item.effect.block.ts +4 -4
  409. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-hello.method.block.ts +3 -3
  410. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-item-added.method.block.ts +3 -3
  411. package/templates/scaffold/src/map/(app_base)/home/_methods/clear-cart.method.block.ts +5 -4
  412. package/templates/scaffold/src/map/(app_base)/home/_methods/remove-item.effect.block.ts +4 -4
  413. package/templates/scaffold/src/map/(app_base)/home/_nav.block.ts +3 -3
  414. package/templates/scaffold/src/map/(app_base)/home/_page.block.ts +3 -3
  415. package/templates/scaffold/src/map/(app_base)/home/nav-verification-link.block.ts +4 -4
  416. package/templates/scaffold/src/map/(external)/hoppscotch/_keys.ts +21 -0
  417. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-body.method.block.ts +4 -4
  418. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-header.method.block.ts +4 -4
  419. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-status.method.block.ts +4 -4
  420. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/pick-extension-interceptor.method.block.ts +5 -4
  421. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-body.method.block.ts +6 -5
  422. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-headers.method.block.ts +6 -5
  423. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/send-request.method.block.ts +5 -4
  424. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-bearer-token.method.block.ts +6 -5
  425. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-headers.method.block.ts +6 -5
  426. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-json-body.method.block.ts +6 -5
  427. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-method.method.block.ts +6 -5
  428. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-query-params.method.block.ts +6 -5
  429. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-url.method.block.ts +6 -5
  430. package/templates/scaffold/src/map/(external)/hoppscotch/_nav.block.ts +3 -3
  431. package/templates/scaffold/src/map/(external)/hoppscotch/_page.block.ts +3 -3
  432. package/templates/scaffold/src/map/(external)/hoppscotch/_states.ts +6 -0
  433. package/templates/scaffold/src/map/(external)/hoppscotch/settings/_nav.block.ts +3 -3
  434. package/templates/scaffold/src/map/(external)/mailpit/_keys.ts +13 -0
  435. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-content.method.block.ts +4 -4
  436. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-received.method.block.ts +4 -4
  437. package/templates/scaffold/src/map/(external)/mailpit/_methods/extract-email-link.method.block.ts +6 -5
  438. package/templates/scaffold/src/map/(external)/mailpit/_methods/open-message.method.block.ts +6 -5
  439. package/templates/scaffold/src/map/(external)/mailpit/_nav.block.ts +3 -3
  440. package/templates/scaffold/src/map/(external)/mailpit/_page.block.ts +3 -3
  441. package/templates/scaffold/src/map/(external)/mailpit/_states.ts +9 -0
  442. package/templates/scaffold/src/map/README.md +7 -0
  443. package/templates/scaffold/src/states/README.md +4 -1
  444. package/templates/scaffold/src/states/demo.mem-keys.ts +1 -29
  445. package/templates/scaffold/src/states/demo.states.ts +14 -20
  446. package/templates/scaffold/tests/hoppscotch.spec.ts +1 -11
  447. package/templates/scaffold/tests/mail-verify.spec.ts +2 -2
  448. package/templates/skills/waygraph-blind-pilot.skill.md +2 -6
  449. package/templates/skills/waygraph-convention.skill.md +23 -14
  450. package/templates/skills/waygraph-pilot.skill.md +7 -4
  451. package/dist/auto-session/verbose-log.js +0 -16
  452. package/dist/auto-session.d.ts +0 -2
  453. package/dist/auto-session.js +0 -3
  454. package/dist/cli/discover.d.ts +0 -40
  455. package/dist/cli/discover.js +0 -148
  456. package/dist/commands/agent-dive.js +0 -52
  457. package/dist/commands/check.js +0 -192
  458. package/dist/commands/map.js +0 -29
  459. package/dist/commands/run.js +0 -104
  460. package/dist/commands/traverse.js +0 -177
  461. package/dist/core/block.d.ts +0 -109
  462. package/dist/core/blocks/effect.js +0 -23
  463. package/dist/core/config.js +0 -17
  464. package/dist/core/engine.d.ts +0 -198
  465. package/dist/core/flow.d.ts +0 -293
  466. package/dist/core/flow.js +0 -432
  467. package/dist/core.d.ts +0 -14
  468. package/dist/core.js +0 -15
  469. package/dist/highlights/merge.d.ts +0 -8
  470. package/dist/highlights/merge.js +0 -173
  471. package/dist/highlights/stub-ctx.d.ts +0 -10
  472. package/dist/highlights/stub-ctx.js +0 -331
  473. package/dist/highlights/types.d.ts +0 -607
  474. package/dist/highlights.d.ts +0 -9
  475. package/dist/highlights.js +0 -10
  476. package/dist/pilot-overlay.d.ts +0 -5
  477. package/dist/pilot-overlay.js +0 -6
  478. package/dist/runner/banner-log.js +0 -63
  479. package/dist/runner/chain-run.js +0 -102
  480. package/dist/runner/cursor.js +0 -140
  481. package/dist/runner/demo-log.js +0 -316
  482. package/dist/runner/device-stage.d.ts +0 -9
  483. package/dist/runner/device-stage.js +0 -420
  484. package/dist/runner/discovery.js +0 -105
  485. package/dist/runner/index.js +0 -2
  486. package/dist/runner/inpage/banner.d.ts +0 -21
  487. package/dist/runner/inpage/banner.js +0 -156
  488. package/dist/runner/inpage/caption.d.ts +0 -3
  489. package/dist/runner/inpage/caption.js +0 -23
  490. package/dist/runner/inpage/core.d.ts +0 -4
  491. package/dist/runner/inpage/core.js +0 -316
  492. package/dist/runner/inpage/device.d.ts +0 -3
  493. package/dist/runner/inpage/device.js +0 -211
  494. package/dist/runner/inpage/network.d.ts +0 -15
  495. package/dist/runner/inpage/network.js +0 -217
  496. package/dist/runner/inpage/panel-chrome.js +0 -192
  497. package/dist/runner/inpage/stamp.js +0 -46
  498. package/dist/runner/inpage/swipe-zoom.js +0 -220
  499. package/dist/runner/inpage/todos.js +0 -337
  500. package/dist/runner/interaction-patch.js +0 -384
  501. package/dist/runner/main.js +0 -469
  502. package/dist/runner/network-capture.d.ts +0 -9
  503. package/dist/runner/network-capture.js +0 -126
  504. package/dist/runner/overlay-css.d.ts +0 -3
  505. package/dist/runner/overlay-css.js +0 -377
  506. package/dist/runner/overlay-install.js +0 -90
  507. package/dist/runner/overlay-stage.js +0 -110
  508. package/dist/runner/rings.js +0 -514
  509. package/dist/runner/seed-mem.js +0 -110
  510. package/dist/runner/slides.js +0 -278
  511. package/dist/runner/step-mode.js +0 -703
  512. package/dist/runner/step-panels.js +0 -729
  513. package/dist/runner/teardown.js +0 -202
  514. package/dist/runner/todo-dock.js +0 -142
  515. package/dist/session/step-overlay.d.ts +0 -37
  516. package/dist/session/step-overlay.js +0 -244
  517. package/examples/routed-demo/playwright.config.ts +0 -21
  518. package/examples/saucedemo/playwright.config.ts +0 -19
  519. package/examples/saucedemo/scripts/drive-auto-cli.mjs +0 -93
  520. package/examples/saucedemo/scripts/prove-add-to-cart-menu.mjs +0 -126
  521. package/examples/saucedemo/scripts/prove-auto-graph.mjs +0 -92
  522. package/examples/saucedemo/scripts/prove-wrong-login-runtime.mjs +0 -63
  523. package/examples/saucedemo/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
  524. package/templates/quickstart/playwright.config.ts +0 -14
  525. package/templates/quickstart/scripts/drive-auto-cli.mjs +0 -93
  526. package/templates/quickstart/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
  527. /package/dist/{commands → cli/commands}/agent-dive-scaffold.d.ts +0 -0
  528. /package/dist/{commands → cli/commands}/agent-dive.d.ts +0 -0
  529. /package/dist/{commands → cli/commands}/extensions.d.ts +0 -0
  530. /package/dist/{commands → cli/commands}/init.d.ts +0 -0
  531. /package/dist/{commands → cli/commands}/list.d.ts +0 -0
  532. /package/dist/{commands → cli/commands}/map.d.ts +0 -0
  533. /package/dist/{commands → cli/commands}/session.d.ts +0 -0
  534. /package/dist/{commands → cli/commands}/test.d.ts +0 -0
  535. /package/dist/{commands → cli/commands}/traverse.d.ts +0 -0
  536. /package/dist/{commands → cli/commands}/try.d.ts +0 -0
  537. /package/dist/{commands → cli/commands}/upgrade.d.ts +0 -0
  538. /package/dist/{highlights → demo/narration}/shorthand.js +0 -0
  539. /package/dist/{pilot-overlay/action-ring.d.ts → demo/overlay/pilot/actions.d.ts} +0 -0
  540. /package/dist/{ui → demo/overlay/ui}/components/ring.d.ts +0 -0
  541. /package/dist/{ui → demo/overlay/ui}/stylesheet.d.ts +0 -0
  542. /package/dist/{ui → demo/overlay/ui}/stylesheet.js +0 -0
  543. /package/dist/{ui → demo/overlay/ui}/tokens.d.ts +0 -0
  544. /package/dist/{ui → demo/overlay/ui}/tokens.js +0 -0
  545. /package/dist/{highlights → demo}/types.js +0 -0
  546. /package/dist/{auto-session → demo}/verbose-log.d.ts +0 -0
  547. /package/dist/{selector.d.ts → engine/trait/selector.d.ts} +0 -0
  548. /package/dist/{selector.js → engine/trait/selector.js} +0 -0
  549. /package/dist/{trait.js → engine/trait/trait.js} +0 -0
  550. /package/dist/{session/block-inject.d.ts → manifest/roots.d.ts} +0 -0
  551. /package/dist/{browser.d.ts → runtime/browser.d.ts} +0 -0
  552. /package/dist/{env-file.d.ts → runtime/env-file.d.ts} +0 -0
  553. /package/dist/{playwright-config.js → runtime/playwright-config.js} +0 -0
  554. /package/dist/{playwright.config.d.ts → runtime/playwright.config.d.ts} +0 -0
  555. /package/dist/{video-dir.d.ts → runtime/video-dir.d.ts} +0 -0
  556. /package/dist/{webserver.d.ts → runtime/webserver.d.ts} +0 -0
@@ -1,7 +1,8 @@
1
- import type { Checkpoint, DefinedBlock } from "../../types.js";
2
- import type { Trait } from "../../trait.js";
3
- import { defineBlock } from "../block.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 type { RoutedBlockBase } from "../../checkpoint/route.js";
5
+ import type { MemKey } from "../../mem/mem.js";
5
6
  /**
6
7
  * TypeScript salt over {@link defineBlock} for one-shot non-nav app steps
7
8
  * (submit, upload, finish, logout) - **methods** on a page. Same runtime Block;
@@ -15,23 +16,18 @@ export type MethodBlock<In extends Checkpoint<string>, Out extends Checkpoint<st
15
16
  withVerify(verify: Trait[] | ((out: Out) => Trait[])): MethodBlock<In, Out>;
16
17
  modVerify(nameOrIndex: string | number, newCheck: Trait["check"] | Trait): MethodBlock<In, Out>;
17
18
  modVerifyAll(patches: Record<string, Trait["check"] | Trait>): MethodBlock<In, Out>;
18
- stubBefore(stub: import("../../highlights.js").HighlightStubPhase): MethodBlock<In, Out>;
19
- stubBefore(stub: import("../../highlights.js").StubLifecycleFn<Out>): MethodBlock<In, Out>;
20
- stubAfter(stub: import("../../highlights.js").HighlightStubPhase): MethodBlock<In, Out>;
21
- stubAfter(stub: import("../../highlights.js").StubLifecycleFn<Out>): MethodBlock<In, Out>;
22
- stubOnError(stub: import("../../highlights.js").HighlightStubPhase): MethodBlock<In, Out>;
23
- stubOnError(stub: import("../../highlights.js").StubLifecycleFn<Out>): MethodBlock<In, Out>;
19
+ stubBefore(stub: import("../../stub/stub.js").StubLifecycleFn<Out>): MethodBlock<In, Out>;
20
+ stubAfter(stub: import("../../stub/stub.js").StubLifecycleFn<Out>): MethodBlock<In, Out>;
21
+ stubOnError(stub: import("../../stub/stub.js").StubLifecycleFn<Out>): MethodBlock<In, Out>;
24
22
  };
25
- /** @deprecated Prefer {@link MethodBlock} - same type; Action was the 0.7 name. */
26
- export type ActionBlock<In extends Checkpoint<string>, Out extends Checkpoint<string>> = MethodBlock<In, Out>;
27
- export declare function defineMethodBlock<In extends Checkpoint<string>, Out extends Checkpoint<string>>(base: Parameters<typeof defineBlock<In, Out>>[0]): MethodBlock<In, Out>;
28
- /** @deprecated Prefer {@link defineMethodBlock} - identical helper (0.7 name). */
29
- export declare const defineActionBlock: typeof defineMethodBlock;
23
+ /** Builds a Block for one page action (fill, submit, click) that does not navigate. */
24
+ export declare function defineMethodBlock<In extends Checkpoint<string>, Out extends Checkpoint<string>>(base: RoutedBlockBase<In, Out>): MethodBlock<In, Out>;
25
+ /** Options for `defineAssertBlock`: a Checkpoint to stay on and the Traits that must hold. */
30
26
  export interface AssertBlockOptions<Out extends Checkpoint<string> = Checkpoint<string>> {
31
27
  name: string;
32
28
  description?: string;
33
- /** Self-loop target - the Checkpoint this assertion runs on and returns to. */
34
- checkpoint: Out["__state"];
29
+ /** The Checkpoint this assertion runs on and returns to: its value (`Home`). */
30
+ checkpoint: Out;
35
31
  /**
36
32
  * Shorthand for the wait-then-assert shape found repeatedly in hand-written
37
33
  * assertion Blocks: waits for a heading with this accessible name before
@@ -42,12 +38,9 @@ export interface AssertBlockOptions<Out extends Checkpoint<string> = Checkpoint<
42
38
  waitForHeading?: string;
43
39
  verify: Trait[] | ((out: Out) => Trait[]);
44
40
  /** Mem keys this assertion's `verify` reads (e.g. a mem-aware Trait) - checked by preflight before the flow runs. */
45
- requires?: readonly MemKey<any>[];
46
- stubBefore?: import("../../highlights.js").HighlightStubPhaseOrFn<Out>;
47
- stubAfter?: import("../../highlights.js").HighlightStubPhaseOrFn<Out>;
48
- stubOnError?: import("../../highlights.js").HighlightStubPhaseOrFn<Out>;
41
+ requires?: readonly MemKey<unknown>[];
49
42
  /** Multi-step yap slides (demo only) - same field `Instruction.slides` exposes elsewhere. */
50
- slides?: import("../../highlights.js").WaygraphSlidesOrFn<Out>;
43
+ slides?: import("../../stub/ring.js").WaygraphSlidesOrFn<Out>;
51
44
  }
52
45
  /**
53
46
  * Sugar for a self-loop-only "pure assertion" Block: no hand-written
@@ -65,7 +58,7 @@ export interface AssertBlockOptions<Out extends Checkpoint<string> = Checkpoint<
65
58
  * verify: [Trait.visible(RawMaterialsSel.reorderBadge)],
66
59
  * });
67
60
  */
68
- export declare function defineAssertBlock<Out extends Checkpoint<string> = Checkpoint<string>>(options: AssertBlockOptions<Out>): AssertBlock<Out>;
61
+ export declare function defineAssertBlock<Out extends Checkpoint<string>>(options: AssertBlockOptions<Out>): AssertBlock<Out>;
69
62
  /**
70
63
  * Self-loop verify Block from {@link defineAssertBlock}. Branded for
71
64
  * {@link MapBuilder.assert} (not accepted by `.method()`).
@@ -75,10 +68,7 @@ export type AssertBlock<Out extends Checkpoint<string>> = Omit<DefinedBlock<Out,
75
68
  withVerify(verify: Trait[] | ((out: Out) => Trait[])): AssertBlock<Out>;
76
69
  modVerify(nameOrIndex: string | number, newCheck: Trait["check"] | Trait): AssertBlock<Out>;
77
70
  modVerifyAll(patches: Record<string, Trait["check"] | Trait>): AssertBlock<Out>;
78
- stubBefore(stub: import("../../highlights.js").HighlightStubPhase): AssertBlock<Out>;
79
- stubBefore(stub: import("../../highlights.js").StubLifecycleFn<Out>): AssertBlock<Out>;
80
- stubAfter(stub: import("../../highlights.js").HighlightStubPhase): AssertBlock<Out>;
81
- stubAfter(stub: import("../../highlights.js").StubLifecycleFn<Out>): AssertBlock<Out>;
82
- stubOnError(stub: import("../../highlights.js").HighlightStubPhase): AssertBlock<Out>;
83
- stubOnError(stub: import("../../highlights.js").StubLifecycleFn<Out>): AssertBlock<Out>;
71
+ stubBefore(stub: import("../../stub/stub.js").StubLifecycleFn<Out>): AssertBlock<Out>;
72
+ stubAfter(stub: import("../../stub/stub.js").StubLifecycleFn<Out>): AssertBlock<Out>;
73
+ stubOnError(stub: import("../../stub/stub.js").StubLifecycleFn<Out>): AssertBlock<Out>;
84
74
  };
@@ -1,8 +1,9 @@
1
- // Split out of the former 2,900-line engine.ts (see src/ARCHITECTURE.md). Behavior unchanged.
2
- import { checkpoint } from "../../types.js";
3
1
  import { defineBlock } from "../block.js";
2
+ import { markRouteOf, routed } from "../../checkpoint/route.js";
3
+ /** Builds a Block for one page action (fill, submit, click) that does not navigate. */
4
4
  export function defineMethodBlock(base) {
5
- const built = defineBlock(base);
5
+ const built = defineBlock(routed(base));
6
+ markRouteOf(built, base);
6
7
  Object.defineProperty(built, "__waygraphSalt", {
7
8
  value: "method",
8
9
  enumerable: false,
@@ -10,8 +11,6 @@ export function defineMethodBlock(base) {
10
11
  });
11
12
  return built;
12
13
  }
13
- /** @deprecated Prefer {@link defineMethodBlock} - identical helper (0.7 name). */
14
- export const defineActionBlock = defineMethodBlock;
15
14
  /**
16
15
  * Sugar for a self-loop-only "pure assertion" Block: no hand-written
17
16
  * `act`/`resolve`, just a name, a `checkpoint` tag, and a `verify` array.
@@ -33,32 +32,19 @@ export function defineAssertBlock(options) {
33
32
  name: options.name,
34
33
  ...(options.description ? { description: options.description } : {}),
35
34
  ...(options.requires ? { requires: options.requires } : {}),
35
+ // An assertion stays where it is: from and to are its one Checkpoint, and resolve lands there.
36
+ from: options.checkpoint,
37
+ to: options.checkpoint,
36
38
  instruction: {
37
39
  async act(page) {
38
40
  if (options.waitForHeading !== undefined) {
39
41
  await page.getByRole("heading", { name: options.waitForHeading }).waitFor();
40
42
  }
41
43
  },
42
- resolve: () => checkpoint(options.checkpoint),
43
44
  verify: options.verify,
44
- ...(options.stubBefore ? { stubBefore: options.stubBefore } : {}),
45
- ...(options.stubAfter ? { stubAfter: options.stubAfter } : {}),
46
- ...(options.stubOnError ? { stubOnError: options.stubOnError } : {}),
47
45
  ...(options.slides ? { slides: options.slides } : {}),
48
46
  },
49
47
  });
50
- // Real bug this closes: `waygraph graph`'s static discovery only knows
51
- // how to read a Block's Checkpoint tags from an EXPLICIT `<In, Out>`
52
- // generic written in the source text (or, for Nav/Page Blocks, by calling
53
- // their own input-independent `resolve()` directly). `defineAssertBlock`'s
54
- // whole point is skipping that generic - called exactly as documented
55
- // (`defineAssertBlock({ name, checkpoint, verify })`, no generics), it was
56
- // silently invisible to both `waygraph graph` and the live Pilot menu
57
- // ("2 Block(s) skipped (Out not resolvable)", confirmed live against a
58
- // real veciro-waygraph session). `resolve()` here is ALSO input-
59
- // independent (always `checkpoint(options.checkpoint)`), so the same
60
- // resolve()-calling path Nav/Page Blocks already use is reused via this
61
- // marker instead of requiring authors to write generics just to be found.
62
48
  Object.defineProperty(built, "__waygraphKind", {
63
49
  value: "assert",
64
50
  enumerable: false,
@@ -1,12 +1,13 @@
1
- import type { Block, Checkpoint, DefinedBlock, WaygraphHighlight } 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 { Block, DefinedBlock } from "../block.js";
2
+ import type { Checkpoint } from "../../checkpoint/checkpoint.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
  /**
6
7
  * A Block whose only possible action is navigating to a URL - built via
7
8
  * {@link defineNavBlock}, never with a hand-authored `act()`. Extends `Block`
8
9
  * (same shape `DefinedBlock`/`ComposedBlock` already use), so it drops into
9
- * `defineFlow([...])`, `connect()`, `composeBlock()` exactly like any other
10
+ * `map()`, `connect()`, `composeBlock()` exactly like any other
10
11
  * Block - no special-casing needed anywhere that only expects a `Block`.
11
12
  * See `openspec/specs/nav-block-and-check/spec.md` for why this exists.
12
13
  *
@@ -20,12 +21,9 @@ export type NavBlock<Out extends Checkpoint<string>> = Omit<DefinedBlock<Checkpo
20
21
  withVerify(verify: Trait[] | ((out: Out) => Trait[])): NavBlock<Out>;
21
22
  modVerify(nameOrIndex: string | number, newCheck: Trait["check"] | Trait): NavBlock<Out>;
22
23
  modVerifyAll(patches: Record<string, Trait["check"] | Trait>): NavBlock<Out>;
23
- stubBefore(stub: import("../../highlights.js").HighlightStubPhase): NavBlock<Out>;
24
- stubBefore(stub: import("../../highlights.js").StubLifecycleFn<Out>): NavBlock<Out>;
25
- stubAfter(stub: import("../../highlights.js").HighlightStubPhase): NavBlock<Out>;
26
- stubAfter(stub: import("../../highlights.js").StubLifecycleFn<Out>): NavBlock<Out>;
27
- stubOnError(stub: import("../../highlights.js").HighlightStubPhase): NavBlock<Out>;
28
- stubOnError(stub: import("../../highlights.js").StubLifecycleFn<Out>): NavBlock<Out>;
24
+ stubBefore(stub: import("../../stub/stub.js").StubLifecycleFn<Out>): NavBlock<Out>;
25
+ stubAfter(stub: import("../../stub/stub.js").StubLifecycleFn<Out>): NavBlock<Out>;
26
+ stubOnError(stub: import("../../stub/stub.js").StubLifecycleFn<Out>): NavBlock<Out>;
29
27
  };
30
28
  /**
31
29
  * `defineNavBlock`'s own options - exactly one of `url`/`click` required,
@@ -38,23 +36,19 @@ export type NavBlock<Out extends Checkpoint<string>> = Omit<DefinedBlock<Checkpo
38
36
  export type NavBlockOptions<Out extends Checkpoint<string>> = {
39
37
  name: string;
40
38
  description?: string;
41
- checkpoint: Out["__state"];
39
+ /** The Checkpoint this Nav lands on: its value (`Home`). */
40
+ checkpoint: Out;
42
41
  /**
43
42
  * Checkpoint tags this Nav can run from. Omit (the default) = reachable from anywhere. Set it for
44
43
  * a page that only exists after something else - e.g. every in-app page after sign-in - so route
45
44
  * finding (`auto --blocks`, `pilot reach`, `traverse`) goes through the sign-in steps instead of
46
45
  * jumping straight there from the login page.
47
- * @example const SIGNED_IN = ["Dashboard", "CommandCenter"] as const; // src/states/
46
+ * @example const SIGNED_IN = [Dashboard, CommandCenter] as const; // src/states/
48
47
  * defineNavBlock({ ..., from: SIGNED_IN })
49
48
  */
50
- from?: readonly string[];
51
- requires?: readonly MemKey<any>[];
49
+ from?: readonly Checkpoint<string>[];
50
+ requires?: readonly MemKey<unknown>[];
52
51
  verify?: Trait[] | ((out: Out) => Trait[]);
53
- stubBefore?: import("../../highlights.js").HighlightStubPhaseOrFn<Out>;
54
- stubAfter?: import("../../highlights.js").HighlightStubPhaseOrFn<Out>;
55
- stubOnError?: import("../../highlights.js").HighlightStubPhaseOrFn<Out>;
56
- /** @deprecated Prefer stubAfter. */
57
- highlights?: readonly WaygraphHighlight[] | ((out: Out) => readonly WaygraphHighlight[]);
58
52
  /**
59
53
  * Live per-instance menu rows for `waygraph auto` (see {@link Block.instanceOptions}).
60
54
  * When set, the explore menu lists one row per option instead of a single
@@ -110,19 +104,16 @@ export declare function defineNavBlock<Out extends Checkpoint<string>>(options:
110
104
  export type NavClickBlockOptions<Out extends Checkpoint<string>> = {
111
105
  name: string;
112
106
  description?: string;
113
- checkpoint: Out["__state"];
107
+ /** The Checkpoint this Nav lands on: its value (`Home`). */
108
+ checkpoint: Out;
114
109
  click: string | ((mem: MemPage) => string);
115
- /** See {@link NavBlockOptions.from}. */
116
- from?: readonly string[];
117
- requires?: readonly MemKey<any>[];
110
+ /** Where the click can start: the Checkpoints whose page shows the link. Leave out for "from anywhere". */
111
+ from?: readonly Checkpoint<string>[];
112
+ requires?: readonly MemKey<unknown>[];
118
113
  verify?: Trait[] | ((out: Out) => Trait[]);
119
- stubBefore?: import("../../highlights.js").HighlightStubPhaseOrFn<Out>;
120
- stubAfter?: import("../../highlights.js").HighlightStubPhaseOrFn<Out>;
121
- stubOnError?: import("../../highlights.js").HighlightStubPhaseOrFn<Out>;
122
- /** @deprecated Prefer stubAfter. */
123
- highlights?: readonly WaygraphHighlight[] | ((out: Out) => readonly WaygraphHighlight[]);
124
114
  instanceOptions?: Block<Checkpoint<string>, Out>["instanceOptions"];
125
115
  };
116
+ /** A Block whose only action is clicking a link; built with `defineNavClickBlock`. */
126
117
  export type NavClickBlock<Out extends Checkpoint<string>> = NavBlock<Out>;
127
118
  /** @see {@link NavClickBlockOptions} */
128
119
  export declare function defineNavClickBlock<Out extends Checkpoint<string>>(options: NavClickBlockOptions<Out>): NavClickBlock<Out>;
@@ -131,7 +122,7 @@ export declare function defineNavClickBlock<Out extends Checkpoint<string>>(opti
131
122
  * (which product row / which request id). Still a NavBlock / Block at runtime.
132
123
  */
133
124
  export type MemNavBlock<Out extends Checkpoint<string>> = NavBlock<Out> & {
134
- requires: readonly MemKey<any>[];
125
+ requires: readonly MemKey<unknown>[];
135
126
  instanceOptions: NonNullable<Block<Checkpoint<string>, Out>["instanceOptions"]>;
136
127
  };
137
128
  /**
@@ -141,6 +132,6 @@ export type MemNavBlock<Out extends Checkpoint<string>> = NavBlock<Out> & {
141
132
  * several live rows/items rather than a fixed nav target. Still a Block.
142
133
  */
143
134
  export declare function defineMemNavBlock<Out extends Checkpoint<string>>(options: NavBlockOptions<Out> & {
144
- requires: readonly MemKey<any>[];
135
+ requires: readonly MemKey<unknown>[];
145
136
  instanceOptions: NonNullable<Block<Checkpoint<string>, Out>["instanceOptions"]>;
146
137
  }): MemNavBlock<Out>;
@@ -1,6 +1,7 @@
1
- // Split out of the former 2,900-line engine.ts (see src/ARCHITECTURE.md). Behavior unchanged.
2
- import { checkpoint } from "../../types.js";
1
+ // A Nav Block: gets to a page, by URL or by clicking a link, and lands on that page's Checkpoint.
2
+ import { checkpoint } from "../../checkpoint/checkpoint.js";
3
3
  import { defineBlock } from "../block.js";
4
+ import { markRoute, tagsOf } from "../../checkpoint/route.js";
4
5
  /**
5
6
  * Builds a {@link NavBlock}. The generated `act()` is always exactly
6
7
  * `page.goto(url)` or `page.locator(click).click()` - never anything else,
@@ -34,14 +35,11 @@ export function defineNavBlock(options) {
34
35
  await page.locator(selector).click();
35
36
  }
36
37
  },
37
- resolve: () => checkpoint(options.checkpoint),
38
+ resolve: () => checkpoint(options.checkpoint.__state),
38
39
  ...(options.verify ? { verify: options.verify } : {}),
39
- ...(options.stubBefore ? { stubBefore: options.stubBefore } : {}),
40
- ...(options.stubAfter ? { stubAfter: options.stubAfter } : {}),
41
- ...(options.stubOnError ? { stubOnError: options.stubOnError } : {}),
42
- ...(options.highlights ? { highlights: options.highlights } : {}),
43
40
  },
44
41
  });
42
+ markRoute(built, options.from?.length ? tagsOf(options.from) : ["*"], [options.checkpoint.__state]);
45
43
  // Non-enumerable so it never shows up in Object.keys/JSON/autocomplete -
46
44
  // purely a runtime marker `waygraph check` (or anything else walking a
47
45
  // project's Blocks) can test for to tell a NavBlock apart from a regular
@@ -56,7 +54,7 @@ export function defineNavBlock(options) {
56
54
  // overlays can label "nav click" without re-parsing source.
57
55
  if (options.from && options.from.length > 0) {
58
56
  Object.defineProperty(built, "__waygraphNavFrom", {
59
- value: [...options.from],
57
+ value: tagsOf(options.from),
60
58
  enumerable: false,
61
59
  configurable: false,
62
60
  });
@@ -94,10 +92,6 @@ export function defineNavClickBlock(options) {
94
92
  ...(options.description ? { description: options.description } : {}),
95
93
  ...(options.requires ? { requires: options.requires } : {}),
96
94
  ...(options.verify ? { verify: options.verify } : {}),
97
- ...(options.stubBefore ? { stubBefore: options.stubBefore } : {}),
98
- ...(options.stubAfter ? { stubAfter: options.stubAfter } : {}),
99
- ...(options.stubOnError ? { stubOnError: options.stubOnError } : {}),
100
- ...(options.highlights ? { highlights: options.highlights } : {}),
101
95
  ...(options.instanceOptions ? { instanceOptions: options.instanceOptions } : {}),
102
96
  });
103
97
  }
@@ -1,21 +1,19 @@
1
- import type { Block, Checkpoint, DefinedBlock, WaygraphHighlight } 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 { Block, DefinedBlock } from "../block.js";
2
+ import type { Checkpoint } from "../../checkpoint/checkpoint.js";
3
+ import type { Trait } from "../../trait/trait.js";
4
+ import { MemPage } from "../../mem/mem.js";
5
+ import type { MemKey } from "../../mem/mem.js";
6
+ import type { SomeDefinedBlock } from "../block.js";
5
7
  /** One Block (or lazy factory) registered on a {@link PageBlock}. */
6
- export type PageMethodEntry = DefinedBlock<any, any> | (() => DefinedBlock<any, any>);
8
+ export type PageMethodEntry = SomeDefinedBlock | (() => SomeDefinedBlock);
9
+ /** Options for `definePageBlock`: the Checkpoint a page hub confirms and the Methods that hang off it. */
7
10
  export type PageBlockOptions<Out extends Checkpoint<string>> = {
8
11
  name: string;
9
12
  description?: string;
10
- /** Checkpoint tag for this screen (hub). */
11
- checkpoint: Out["__state"];
13
+ /** The Checkpoint this page hub confirms: its value (`Home`). */
14
+ checkpoint: Out;
12
15
  verify?: Trait[] | ((out: Out) => Trait[]);
13
- stubBefore?: import("../../highlights.js").HighlightStubPhaseOrFn<Out>;
14
- stubAfter?: import("../../highlights.js").HighlightStubPhaseOrFn<Out>;
15
- stubOnError?: import("../../highlights.js").HighlightStubPhaseOrFn<Out>;
16
- /** @deprecated Prefer stubAfter. */
17
- highlights?: readonly WaygraphHighlight[] | ((out: Out) => readonly WaygraphHighlight[]);
18
- requires?: readonly MemKey<any>[];
16
+ requires?: readonly MemKey<unknown>[];
19
17
  /**
20
18
  * Methods available on this page. Array, or a record of Blocks / `() => Block`
21
19
  * factories (lazy so the page object can colocate method definitions).
@@ -41,16 +39,13 @@ export type PageBlockOptions<Out extends Checkpoint<string>> = {
41
39
  export type PageBlock<Out extends Checkpoint<string>> = Omit<DefinedBlock<Checkpoint<string>, Out>, "withVerify" | "modVerify" | "modVerifyAll" | "stubBefore" | "stubAfter" | "stubOnError"> & {
42
40
  readonly __wgFactory?: "page";
43
41
  /** Resolved method Blocks registered at define time. */
44
- readonly methods: readonly DefinedBlock<any, any>[];
42
+ readonly methods: readonly SomeDefinedBlock[];
45
43
  withVerify(verify: Trait[] | ((out: Out) => Trait[])): PageBlock<Out>;
46
44
  modVerify(nameOrIndex: string | number, newCheck: Trait["check"] | Trait): PageBlock<Out>;
47
45
  modVerifyAll(patches: Record<string, Trait["check"] | Trait>): PageBlock<Out>;
48
- stubBefore(stub: import("../../highlights.js").HighlightStubPhase): PageBlock<Out>;
49
- stubBefore(stub: import("../../highlights.js").StubLifecycleFn<Out>): PageBlock<Out>;
50
- stubAfter(stub: import("../../highlights.js").HighlightStubPhase): PageBlock<Out>;
51
- stubAfter(stub: import("../../highlights.js").StubLifecycleFn<Out>): PageBlock<Out>;
52
- stubOnError(stub: import("../../highlights.js").HighlightStubPhase): PageBlock<Out>;
53
- stubOnError(stub: import("../../highlights.js").StubLifecycleFn<Out>): PageBlock<Out>;
46
+ stubBefore(stub: import("../../stub/stub.js").StubLifecycleFn<Out>): PageBlock<Out>;
47
+ stubAfter(stub: import("../../stub/stub.js").StubLifecycleFn<Out>): PageBlock<Out>;
48
+ stubOnError(stub: import("../../stub/stub.js").StubLifecycleFn<Out>): PageBlock<Out>;
54
49
  };
55
50
  /** @see {@link PageBlockOptions} */
56
51
  export declare function definePageBlock<Out extends Checkpoint<string>>(options: PageBlockOptions<Out>): PageBlock<Out>;
@@ -1,6 +1,7 @@
1
- // Split out of the former 2,900-line engine.ts (see src/ARCHITECTURE.md). Behavior unchanged.
2
- import { checkpoint } from "../../types.js";
1
+ // A Page Block: "you have arrived" - the hub other pages navigate to, verified by what the page shows.
2
+ import { checkpoint } from "../../checkpoint/checkpoint.js";
3
3
  import { defineBlock } from "../block.js";
4
+ import { markRoute } from "../../checkpoint/route.js";
4
5
  function resolvePageMethods(methods) {
5
6
  if (!methods)
6
7
  return [];
@@ -30,14 +31,11 @@ export function definePageBlock(options) {
30
31
  }
31
32
  // else: arrival-only hub — previous Block already landed here
32
33
  },
33
- resolve: () => checkpoint(options.checkpoint),
34
+ resolve: () => checkpoint(options.checkpoint.__state),
34
35
  ...(options.verify ? { verify: options.verify } : {}),
35
- ...(options.stubBefore ? { stubBefore: options.stubBefore } : {}),
36
- ...(options.stubAfter ? { stubAfter: options.stubAfter } : {}),
37
- ...(options.stubOnError ? { stubOnError: options.stubOnError } : {}),
38
- ...(options.highlights ? { highlights: options.highlights } : {}),
39
36
  },
40
37
  });
38
+ markRoute(built, ["*"], [options.checkpoint.__state]);
41
39
  Object.defineProperty(built, "__waygraphKind", {
42
40
  value: "page",
43
41
  enumerable: false,
@@ -0,0 +1,22 @@
1
+ /**
2
+ * A Checkpoint is identified solely by its string tag - a phantom marker with no
3
+ * embedded data. Two Checkpoints with the same tag are the same state everywhere.
4
+ */
5
+ export type Checkpoint<Tag extends string> = {
6
+ readonly __state: Tag;
7
+ };
8
+ /**
9
+ * Builds a Checkpoint - spells `__state` for you so no call site does it by hand.
10
+ * @example resolve: () => checkpoint("LoggedIn")
11
+ */
12
+ export declare function checkpoint<Tag extends string>(tag: Tag): Checkpoint<Tag>;
13
+ /**
14
+ * The type every entry Block's `In` must be - `runGraph` always seeds a fresh
15
+ * run with `checkpoint("__start__")` as the fake initial input, so a Block
16
+ * meant to lead off a Flow needs exactly this type. Exported so no project
17
+ * has to know or hand-type the `"__start__"` literal itself - the same reason
18
+ * `checkpoint()` exists instead of every call site spelling `{ __state: tag }`
19
+ * by hand.
20
+ * @example export const LoginBlock: Block<Start, LoggedIn> = { ... }
21
+ */
22
+ export type Start = Checkpoint<"__start__">;
@@ -0,0 +1,8 @@
1
+ // The states a flow moves between. A Checkpoint is just its tag; flows declare them once as values.
2
+ /**
3
+ * Builds a Checkpoint - spells `__state` for you so no call site does it by hand.
4
+ * @example resolve: () => checkpoint("LoggedIn")
5
+ */
6
+ export function checkpoint(tag) {
7
+ return { __state: tag };
8
+ }
@@ -0,0 +1,28 @@
1
+ import type { Checkpoint } from "./checkpoint.js";
2
+ import type { defineBlock } from "../block/block.js";
3
+ /** Tags of one Checkpoint or a list of them. */
4
+ export declare function tagsOf(refs: Checkpoint<string> | readonly Checkpoint<string>[]): string[];
5
+ /**
6
+ * Records where a Block runs from and lands on, as tags, so the manifest can read the graph at runtime. `from` of `["*"]`
7
+ * means reachable from anywhere.
8
+ */
9
+ export declare function markRoute(block: object, from: readonly string[], to: readonly string[]): void;
10
+ export type BlockBase<In extends Checkpoint<string>, Out extends Checkpoint<string>> = Parameters<typeof defineBlock<In, Out>>[0];
11
+ /**
12
+ * A Method or Effect that says where it runs: `from` (one Checkpoint value or a list; leave it out for "from anywhere") and
13
+ * `to`. `resolve` may be left out when `to` is one Checkpoint; it then always lands there.
14
+ */
15
+ export type RoutedBlockBase<In extends Checkpoint<string>, Out extends Checkpoint<string>> = Omit<BlockBase<In, Out>, "instruction"> & {
16
+ from?: In | readonly In[];
17
+ to: Out | readonly Out[];
18
+ instruction: Omit<BlockBase<In, Out>["instruction"], "resolve" | "stubBefore" | "stubAfter" | "stubOnError"> & {
19
+ resolve?: BlockBase<In, Out>["instruction"]["resolve"];
20
+ };
21
+ };
22
+ /** Turns a `from`/`to` Block base into the plain one `defineBlock` takes (filling `resolve` for a single `to`). */
23
+ export declare function routed<In extends Checkpoint<string>, Out extends Checkpoint<string>>(base: RoutedBlockBase<In, Out>): BlockBase<In, Out>;
24
+ /** Records a routed Block's `from`/`to` on the built Block. */
25
+ export declare function markRouteOf(block: object, base: {
26
+ from?: Checkpoint<string> | readonly Checkpoint<string>[];
27
+ to: Checkpoint<string> | readonly Checkpoint<string>[];
28
+ }): void;
@@ -0,0 +1,28 @@
1
+ import { checkpoint } from "./checkpoint.js";
2
+ /** Tags of one Checkpoint or a list of them. */
3
+ export function tagsOf(refs) {
4
+ return (Array.isArray(refs) ? refs : [refs]).map((r) => r.__state);
5
+ }
6
+ /**
7
+ * Records where a Block runs from and lands on, as tags, so the manifest can read the graph at runtime. `from` of `["*"]`
8
+ * means reachable from anywhere.
9
+ */
10
+ export function markRoute(block, from, to) {
11
+ Object.defineProperty(block, "__waygraphFrom", { value: [...from], enumerable: false, configurable: true });
12
+ Object.defineProperty(block, "__waygraphTo", { value: [...to], enumerable: false, configurable: true });
13
+ }
14
+ /** Turns a `from`/`to` Block base into the plain one `defineBlock` takes (filling `resolve` for a single `to`). */
15
+ export function routed(base) {
16
+ const { from: _from, to, ...rest } = base;
17
+ if (rest.instruction.resolve)
18
+ return rest;
19
+ const targets = tagsOf(to);
20
+ if (targets.length !== 1) {
21
+ throw new Error(`waygraph: Block "${base.name}" lands on ${targets.join(" or ")}; give it a resolve() that picks one`);
22
+ }
23
+ return { ...rest, instruction: { ...rest.instruction, resolve: () => checkpoint(targets[0]) } };
24
+ }
25
+ /** Records a routed Block's `from`/`to` on the built Block. */
26
+ export function markRouteOf(block, base) {
27
+ markRoute(block, base.from === undefined ? ["*"] : tagsOf(base.from), tagsOf(base.to));
28
+ }
@@ -1,6 +1,5 @@
1
1
  import type { BrowserType } from "@playwright/test";
2
- import type { Layout } from "./run-graph.js";
3
- import type { ExtensionSpec } from "../extensions.js";
2
+ import type { Layout } from "./run/run.js";
4
3
  /**
5
4
  * Resolves which `BrowserType` actually launches for a `mem`-only run (no
6
5
  * caller-supplied context) - `config.browsers[browserName]` if given,
@@ -12,6 +11,12 @@ import type { ExtensionSpec } from "../extensions.js";
12
11
  * `webkit` - same `.launch()` shape - so accepting one here costs nothing for
13
12
  * a consumer who never sets it.
14
13
  */
14
+ /** A browser extension to load: a known name (`"hoppscotch"`), a Chrome Web Store id, a path, or `{ id, sha256 }`. */
15
+ export type ExtensionSpec = string | {
16
+ id?: string;
17
+ path?: string;
18
+ sha256?: string;
19
+ };
15
20
  export declare function resolveLauncher(browserName: "chromium" | "firefox" | "webkit", config: EngineConfig | undefined): BrowserType;
16
21
  /** Configures how an Engine launches its own browser - only used by `Flow.run(mem)` (no context given); ignored by `Flow.run(context, mem)`, since that context is already launched. */
17
22
  export interface EngineConfig {
@@ -0,0 +1,6 @@
1
+ // EngineConfig: which browser a flow launches when it opens its own, how, and the layouts every step is checked against.
2
+ import { chromium, firefox, webkit } from "@playwright/test";
3
+ const LAUNCHERS = { chromium, firefox, webkit };
4
+ export function resolveLauncher(browserName, config) {
5
+ return config?.browsers?.[browserName] ?? LAUNCHERS[browserName];
6
+ }
@@ -0,0 +1,45 @@
1
+ import type { Checkpoint } from "./checkpoint/checkpoint.js";
2
+ import type { EngineConfig } from "./config.js";
3
+ import { MapBuilder } from "./flow/map-builder.js";
4
+ import type { MapBuilderOptions } from "./flow/map-builder.js";
5
+ /** Where every `map()` starts: before its first step. */
6
+ export type MapStart = Checkpoint<"__start__">;
7
+ /**
8
+ * Holds engine-level configuration shared across every flow defined from it -
9
+ * for now, just how to launch a browser when a Flow owns its own
10
+ * (`headless`/`browserName`/`slowMo`); traits/interstitials/watchers land here
11
+ * in a later change.
12
+ * @example const engine = new Engine({ headless: false, slowMo: 250 });
13
+ */
14
+ export declare class Engine {
15
+ readonly config: EngineConfig;
16
+ /** How flows from this engine launch their own browser, and the layouts every step is checked against. */
17
+ constructor(config?: EngineConfig);
18
+ /**
19
+ * Builds a flow, one kind-checked step at a time - see {@link MapBuilder}. Real, direct request this responds to: pia/zsign's
20
+ * own agents kept hand-editing/hand-composing Blocks into ad hoc shapes
21
+ * ("locks" convention tried, still got broken) - `map()` forces every step
22
+ * through this Engine's own `define*Block` factories (checked by the same
23
+ * `__waygraphKind`/`__waygraphSalt` runtime markers `graph.ts`/`map-check.ts`
24
+ * already trust), so a hand-rolled plain-object Block can never silently
25
+ * pass as a real navigation/assertion/method step. `homeOrigin`, if given,
26
+ * also gates `.gotoPage()`/`.gotoExternal()` against each Nav/Page Block's
27
+ * own static `url` (skipped, honestly, for click-based/dynamic nav - not
28
+ * statically checkable, same limitation `map-check.ts` already documents).
29
+ * @example
30
+ * const flow = engine.map({ homeOrigin: "https://app.example.com" })
31
+ * .start()
32
+ * .gotoPage(NavHomeBlock)
33
+ * .assert(AssertHelloBlock)
34
+ * .gotoExternal(NavMailpitBlock)
35
+ * .end();
36
+ */
37
+ map(options?: MapBuilderOptions): MapBuilder<MapStart>;
38
+ }
39
+ /**
40
+ * Standalone convenience for `new Engine(config).map(options)` - use this
41
+ * when a call site doesn't otherwise need its own `Engine` instance (no
42
+ * shared `headless`/`slowMo`/`layouts` across several flows).
43
+ * @example const flow = map({ homeOrigin: "https://app.example.com" }).gotoPage(NavHomeBlock).end();
44
+ */
45
+ export declare function map(options?: MapBuilderOptions & EngineConfig): MapBuilder<MapStart>;
@@ -1,5 +1,5 @@
1
- import { applyFlowOptions, buildFlow } from "./flow.js";
2
- import { MapBuilder } from "./map-builder.js";
1
+ import { buildFlow, withSettings } from "./flow/flow.js";
2
+ import { MapBuilder } from "./flow/map-builder.js";
3
3
  /**
4
4
  * Holds engine-level configuration shared across every flow defined from it -
5
5
  * for now, just how to launch a browser when a Flow owns its own
@@ -9,15 +9,12 @@ import { MapBuilder } from "./map-builder.js";
9
9
  */
10
10
  export class Engine {
11
11
  config;
12
+ /** How flows from this engine launch their own browser, and the layouts every step is checked against. */
12
13
  constructor(config = {}) {
13
14
  this.config = config;
14
15
  }
15
- defineFlow(blocks, options) {
16
- return applyFlowOptions(buildFlow(blocks.slice(1, -1), this.config), options);
17
- }
18
16
  /**
19
- * Fluent, kind-checked alternative to `defineFlow([start, ...blocks, end])` -
20
- * see {@link MapBuilder}. Real, direct request this responds to: pia/zsign's
17
+ * Builds a flow, one kind-checked step at a time - see {@link MapBuilder}. Real, direct request this responds to: pia/zsign's
21
18
  * own agents kept hand-editing/hand-composing Blocks into ad hoc shapes
22
19
  * ("locks" convention tried, still got broken) - `map()` forces every step
23
20
  * through this Engine's own `define*Block` factories (checked by the same
@@ -36,9 +33,8 @@ export class Engine {
36
33
  * .end();
37
34
  */
38
35
  map(options) {
39
- const { homeOrigin, ...flowOptions } = options ?? {};
40
- const define = this.defineFlow.bind(this);
41
- return MapBuilder.begin((blocks, extra) => define(blocks, { ...flowOptions, ...extra }), homeOrigin);
36
+ const { homeOrigin, ...settings } = options ?? {};
37
+ return MapBuilder.begin((steps, flowSettings) => withSettings(buildFlow(steps, this.config), flowSettings), settings, homeOrigin);
42
38
  }
43
39
  }
44
40
  /**