waygraph 0.15.54 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (510) hide show
  1. package/README.md +8 -3
  2. package/bin/waygraph +2 -2
  3. package/dist/analysis/check.d.ts +38 -0
  4. package/dist/analysis/check.js +87 -0
  5. package/dist/analysis/coverage-gap.d.ts +1 -1
  6. package/dist/analysis/coverage-gap.js +14 -37
  7. package/dist/analysis/flow-source.d.ts +9 -0
  8. package/dist/analysis/flow-source.js +25 -0
  9. package/dist/analysis/graph.d.ts +10 -14
  10. package/dist/analysis/graph.js +48 -371
  11. package/dist/analysis/map-check.js +4 -39
  12. package/dist/analysis/practices-check.d.ts +1 -1
  13. package/dist/analysis/practices-check.js +24 -45
  14. package/dist/cli/args.d.ts +23 -0
  15. package/dist/cli/args.js +20 -0
  16. package/dist/{cli.d.ts → cli/cli.d.ts} +0 -1
  17. package/dist/{cli.js → cli/cli.js} +10 -9
  18. package/dist/{commands → cli/commands}/agent-dive-scaffold.js +35 -64
  19. package/dist/cli/commands/agent-dive.js +42 -0
  20. package/dist/{commands → cli/commands}/check.d.ts +0 -1
  21. package/dist/cli/commands/check.js +104 -0
  22. package/dist/cli/commands/codemod-checkpoints.d.ts +18 -0
  23. package/dist/cli/commands/codemod-checkpoints.js +186 -0
  24. package/dist/cli/commands/codemod-flows.d.ts +18 -0
  25. package/dist/cli/commands/codemod-flows.js +284 -0
  26. package/dist/cli/commands/codemod-stubs.d.ts +10 -0
  27. package/dist/cli/commands/codemod-stubs.js +187 -0
  28. package/dist/{commands → cli/commands}/extensions.js +5 -4
  29. package/dist/{commands → cli/commands}/init.js +1 -2
  30. package/dist/{commands → cli/commands}/list.js +9 -7
  31. package/dist/cli/commands/manifest.d.ts +2 -0
  32. package/dist/cli/commands/manifest.js +20 -0
  33. package/dist/cli/commands/map.js +57 -0
  34. package/dist/{commands → cli/commands}/run.d.ts +0 -1
  35. package/dist/cli/commands/run.js +64 -0
  36. package/dist/{commands → cli/commands}/session.js +61 -88
  37. package/dist/{commands → cli/commands}/test.js +11 -14
  38. package/dist/cli/commands/traverse.js +105 -0
  39. package/dist/{commands → cli/commands}/try.js +29 -25
  40. package/dist/{commands → cli/commands}/upgrade.js +40 -4
  41. package/dist/cli/flags.d.ts +193 -16
  42. package/dist/cli/flags.js +179 -234
  43. package/dist/cli/run-chain.d.ts +1 -0
  44. package/dist/cli/run-chain.js +42 -7
  45. package/dist/cli/usage.d.ts +1 -1
  46. package/dist/cli/usage.js +21 -53
  47. package/dist/cli/util.d.ts +2 -2
  48. package/dist/cli/util.js +2 -3
  49. package/dist/{highlights → demo/narration}/css.d.ts +1 -1
  50. package/dist/{highlights → demo/narration}/css.js +2 -3
  51. package/dist/{highlights → demo/narration}/demo-pace.d.ts +3 -11
  52. package/dist/{highlights → demo/narration}/demo-pace.js +5 -11
  53. package/dist/{highlights → demo/narration}/device.d.ts +2 -2
  54. package/dist/{highlights → demo/narration}/device.js +1 -1
  55. package/dist/demo/narration/merge.d.ts +8 -0
  56. package/dist/demo/narration/merge.js +71 -0
  57. package/dist/{highlights/run-phase.d.ts → demo/narration/narration.d.ts} +10 -14
  58. package/dist/{highlights/run-phase.js → demo/narration/narration.js} +25 -94
  59. package/dist/{highlights → demo/narration}/shorthand.d.ts +1 -1
  60. package/dist/demo/narration/stub-ctx.d.ts +8 -0
  61. package/dist/demo/narration/stub-ctx.js +164 -0
  62. package/dist/{highlights → demo/narration}/style.d.ts +1 -7
  63. package/dist/{highlights → demo/narration}/style.js +1 -41
  64. package/dist/{highlights → demo/narration}/todo-dock.d.ts +3 -3
  65. package/dist/{highlights → demo/narration}/todo-dock.js +13 -30
  66. package/dist/demo/overlay/auto-chrome.d.ts +7 -0
  67. package/dist/demo/overlay/auto-chrome.js +97 -0
  68. package/dist/demo/overlay/cursor.d.ts +12 -0
  69. package/dist/demo/overlay/cursor.js +142 -0
  70. package/dist/demo/overlay/device-stage.d.ts +13 -0
  71. package/dist/demo/overlay/device-stage.js +396 -0
  72. package/dist/demo/overlay/inpage/banner.d.ts +1 -0
  73. package/dist/demo/overlay/inpage/banner.js +160 -0
  74. package/dist/demo/overlay/inpage/caption.d.ts +2 -0
  75. package/dist/demo/overlay/inpage/caption.js +24 -0
  76. package/dist/demo/overlay/inpage/core.d.ts +1 -0
  77. package/dist/demo/overlay/inpage/core.js +345 -0
  78. package/dist/demo/overlay/inpage/device-chip.d.ts +1 -0
  79. package/dist/demo/overlay/inpage/device-chip.js +191 -0
  80. package/dist/demo/overlay/inpage/network.d.ts +9 -0
  81. package/dist/demo/overlay/inpage/network.js +200 -0
  82. package/dist/demo/overlay/inpage/panel-chrome.d.ts +1 -0
  83. package/dist/demo/overlay/inpage/panel-chrome.js +203 -0
  84. package/dist/demo/overlay/inpage/stamp.d.ts +1 -0
  85. package/dist/demo/overlay/inpage/stamp.js +46 -0
  86. package/dist/demo/overlay/inpage/swipe-zoom.d.ts +1 -0
  87. package/dist/demo/overlay/inpage/swipe-zoom.js +220 -0
  88. package/dist/demo/overlay/inpage/todos.d.ts +1 -0
  89. package/dist/demo/overlay/inpage/todos.js +294 -0
  90. package/dist/demo/overlay/locator-theater.d.ts +25 -0
  91. package/dist/demo/overlay/locator-theater.js +76 -0
  92. package/dist/demo/overlay/network-capture.d.ts +22 -0
  93. package/dist/demo/overlay/network-capture.js +127 -0
  94. package/dist/demo/overlay/overlay-css.d.ts +3 -0
  95. package/dist/demo/overlay/overlay-css.js +369 -0
  96. package/dist/demo/overlay/overlay-stage.d.ts +23 -0
  97. package/dist/demo/overlay/overlay-stage.js +106 -0
  98. package/dist/demo/overlay/overlay.d.ts +10 -0
  99. package/dist/demo/overlay/overlay.js +89 -0
  100. package/dist/{pilot-overlay/overlay-fixtures.d.ts → demo/overlay/phase-fixtures.d.ts} +2 -2
  101. package/dist/{pilot-overlay/overlay-fixtures.js → demo/overlay/phase-fixtures.js} +2 -2
  102. package/dist/{pilot-overlay/action-ring.js → demo/overlay/pilot/actions.js} +2 -1
  103. package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.d.ts +6 -5
  104. package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.js +19 -18
  105. package/dist/{pilot-overlay → demo/overlay/pilot}/shell.d.ts +2 -2
  106. package/dist/{pilot-overlay → demo/overlay/pilot}/shell.js +13 -22
  107. package/dist/demo/overlay/reattach.d.ts +7 -0
  108. package/dist/demo/overlay/reattach.js +23 -0
  109. package/dist/demo/overlay/rings.d.ts +33 -0
  110. package/dist/demo/overlay/rings.js +448 -0
  111. package/dist/{ui → demo/overlay/ui}/components/ring.js +2 -2
  112. package/dist/{ui → demo/overlay/ui}/overlay.css +4 -4
  113. package/dist/{ui → demo/overlay/ui}/shadow.d.ts +1 -1
  114. package/dist/{ui → demo/overlay/ui}/shadow.js +39 -2
  115. package/dist/demo/stepper/after.d.ts +3 -0
  116. package/dist/demo/stepper/after.js +113 -0
  117. package/dist/demo/stepper/banner-log.d.ts +37 -0
  118. package/dist/demo/stepper/banner-log.js +63 -0
  119. package/dist/demo/stepper/before.d.ts +4 -0
  120. package/dist/demo/stepper/before.js +110 -0
  121. package/dist/demo/stepper/demo-log.d.ts +31 -0
  122. package/dist/demo/stepper/demo-log.js +309 -0
  123. package/dist/demo/stepper/gate.d.ts +11 -0
  124. package/dist/demo/stepper/gate.js +78 -0
  125. package/dist/demo/stepper/interaction-patch.d.ts +3 -0
  126. package/dist/demo/stepper/interaction-patch.js +323 -0
  127. package/dist/demo/stepper/pacing.d.ts +21 -0
  128. package/dist/demo/stepper/pacing.js +23 -0
  129. package/dist/demo/stepper/slides.d.ts +11 -0
  130. package/dist/demo/stepper/slides.js +233 -0
  131. package/dist/demo/stepper/step-panels.d.ts +21 -0
  132. package/dist/demo/stepper/step-panels.js +589 -0
  133. package/dist/demo/stepper/stepper.d.ts +24 -0
  134. package/dist/demo/stepper/stepper.js +122 -0
  135. package/dist/demo/stepper/teardown.d.ts +48 -0
  136. package/dist/demo/stepper/teardown.js +179 -0
  137. package/dist/demo/stepper/todo-advance.d.ts +14 -0
  138. package/dist/demo/stepper/todo-advance.js +110 -0
  139. package/dist/demo/stepper/view.d.ts +68 -0
  140. package/dist/demo/stepper/view.js +31 -0
  141. package/dist/demo/types.d.ts +17 -0
  142. package/dist/demo/verbose-log.js +15 -0
  143. package/dist/{types.d.ts → engine/block/block.d.ts} +106 -91
  144. package/dist/{core → engine/block}/block.js +10 -53
  145. package/dist/{core → engine/block}/compose.d.ts +9 -7
  146. package/dist/{core → engine/block}/compose.js +1 -1
  147. package/dist/{core/blocks → engine/block/kinds}/api.d.ts +16 -12
  148. package/dist/{core/blocks → engine/block/kinds}/api.js +26 -18
  149. package/dist/{core/blocks → engine/block/kinds}/effect.d.ts +13 -18
  150. package/dist/engine/block/kinds/effect.js +17 -0
  151. package/dist/{core/blocks → engine/block/kinds}/method.d.ts +17 -29
  152. package/dist/{core/blocks → engine/block/kinds}/method.js +6 -21
  153. package/dist/{core/blocks → engine/block/kinds}/nav.d.ts +21 -31
  154. package/dist/{core/blocks → engine/block/kinds}/nav.js +6 -12
  155. package/dist/{core/blocks → engine/block/kinds}/page.d.ts +14 -20
  156. package/dist/{core/blocks → engine/block/kinds}/page.js +5 -7
  157. package/dist/engine/checkpoint/checkpoint.d.ts +22 -0
  158. package/dist/engine/checkpoint/checkpoint.js +8 -0
  159. package/dist/engine/checkpoint/route.d.ts +28 -0
  160. package/dist/engine/checkpoint/route.js +28 -0
  161. package/dist/{core → engine}/config.d.ts +7 -2
  162. package/dist/engine/config.js +6 -0
  163. package/dist/engine/engine.d.ts +45 -0
  164. package/dist/{core → engine}/engine.js +6 -10
  165. package/dist/engine/env.d.ts +59 -0
  166. package/dist/engine/env.js +83 -0
  167. package/dist/{errors.d.ts → engine/errors.d.ts} +22 -22
  168. package/dist/{errors.js → engine/errors.js} +22 -22
  169. package/dist/{core → engine/flow}/branch-regression.d.ts +7 -7
  170. package/dist/{core → engine/flow}/branch-regression.js +4 -3
  171. package/dist/engine/flow/flow.d.ts +162 -0
  172. package/dist/engine/flow/flow.js +244 -0
  173. package/dist/{core → engine/flow}/map-builder.d.ts +34 -39
  174. package/dist/{core → engine/flow}/map-builder.js +45 -47
  175. package/dist/{core → engine}/locate.d.ts +1 -1
  176. package/dist/{core → engine}/locate.js +1 -2
  177. package/dist/{mem-stub.d.ts → engine/mem/mem-stub.d.ts} +9 -8
  178. package/dist/{mem-stub.js → engine/mem/mem-stub.js} +2 -2
  179. package/dist/{mem-page.d.ts → engine/mem/mem.d.ts} +1 -1
  180. package/dist/{mem-page.js → engine/mem/mem.js} +2 -1
  181. package/dist/engine/page-gone.d.ts +5 -0
  182. package/dist/engine/page-gone.js +20 -0
  183. package/dist/engine/run/connect.d.ts +28 -0
  184. package/dist/{types.js → engine/run/connect.js} +11 -10
  185. package/dist/engine/run/events.d.ts +67 -0
  186. package/dist/engine/run/events.js +90 -0
  187. package/dist/engine/run/hooks.d.ts +16 -0
  188. package/dist/engine/run/hooks.js +8 -0
  189. package/dist/engine/run/launch.d.ts +13 -0
  190. package/dist/engine/run/launch.js +27 -0
  191. package/dist/{core/run-graph.d.ts → engine/run/run.d.ts} +8 -12
  192. package/dist/{core/run-graph.js → engine/run/run.js} +22 -12
  193. package/dist/engine/stub/pace.d.ts +12 -0
  194. package/dist/engine/stub/pace.js +2 -0
  195. package/dist/engine/stub/ring.d.ts +130 -0
  196. package/dist/engine/stub/ring.js +41 -0
  197. package/dist/engine/stub/stub.d.ts +268 -0
  198. package/dist/engine/stub/stub.js +1 -0
  199. package/dist/engine/stub/todos.d.ts +104 -0
  200. package/dist/engine/stub/todos.js +2 -0
  201. package/dist/engine/stub/viewport.d.ts +26 -0
  202. package/dist/engine/stub/viewport.js +2 -0
  203. package/dist/{trait.d.ts → engine/trait/trait.d.ts} +1 -1
  204. package/dist/index.d.ts +84 -36
  205. package/dist/index.js +44 -19
  206. package/dist/{session/auto-explore-run.d.ts → live/auto/auto.d.ts} +10 -16
  207. package/dist/{session/auto-explore-run.js → live/auto/auto.js} +164 -254
  208. package/dist/{session/auto-explore.d.ts → live/auto/explore.d.ts} +4 -14
  209. package/dist/{session/auto-explore.js → live/auto/explore.js} +21 -127
  210. package/dist/{auto-session/session.d.ts → live/auto-session/auto-session.d.ts} +1 -1
  211. package/dist/{auto-session/session.js → live/auto-session/auto-session.js} +27 -24
  212. package/dist/{auto-session → live/auto-session}/helpers.d.ts +6 -5
  213. package/dist/{auto-session → live/auto-session}/helpers.js +1 -1
  214. package/dist/{session/auto-session-ipc.d.ts → live/auto-session/ipc.d.ts} +7 -5
  215. package/dist/{session/auto-session-ipc.js → live/auto-session/ipc.js} +31 -16
  216. package/dist/{session/browser.d.ts → live/auto-session/start.d.ts} +1 -2
  217. package/dist/{session/browser.js → live/auto-session/start.js} +2 -3
  218. package/dist/{pilot-overlay → live/pilot}/panel.d.ts +1 -1
  219. package/dist/{pilot-overlay → live/pilot}/panel.js +23 -31
  220. package/dist/{session → live/pilot}/pilot.d.ts +3 -3
  221. package/dist/{session → live/pilot}/pilot.js +4 -4
  222. package/dist/{traverse/run.d.ts → live/traverse/traverse.d.ts} +1 -1
  223. package/dist/{traverse/run.js → live/traverse/traverse.js} +26 -43
  224. package/dist/manifest/manifest.d.ts +52 -0
  225. package/dist/manifest/manifest.js +93 -0
  226. package/dist/manifest/map-imports.d.ts +7 -0
  227. package/dist/manifest/map-imports.js +22 -0
  228. package/dist/manifest/maps.d.ts +33 -0
  229. package/dist/manifest/maps.js +62 -0
  230. package/dist/manifest/pack.d.ts +21 -0
  231. package/dist/manifest/pack.js +109 -0
  232. package/dist/manifest/project.d.ts +60 -0
  233. package/dist/manifest/project.js +101 -0
  234. package/dist/{session/block-inject.js → manifest/roots.js} +1 -18
  235. package/dist/manifest/scan.d.ts +19 -0
  236. package/dist/manifest/scan.js +57 -0
  237. package/dist/manifest/source.d.ts +23 -0
  238. package/dist/manifest/source.js +86 -0
  239. package/dist/runner/mode.d.ts +71 -0
  240. package/dist/runner/mode.js +1 -0
  241. package/dist/runner/modes/branches.d.ts +5 -0
  242. package/dist/runner/modes/branches.js +37 -0
  243. package/dist/runner/modes/demo.d.ts +3 -0
  244. package/dist/runner/modes/demo.js +13 -0
  245. package/dist/runner/modes/report.d.ts +2 -0
  246. package/dist/runner/modes/report.js +54 -0
  247. package/dist/runner/modes/run.d.ts +2 -0
  248. package/dist/runner/modes/run.js +3 -0
  249. package/dist/runner/options.d.ts +31 -0
  250. package/dist/runner/options.js +42 -0
  251. package/dist/runner/plan/find.d.ts +18 -0
  252. package/dist/runner/plan/find.js +65 -0
  253. package/dist/runner/plan/plan.d.ts +11 -0
  254. package/dist/runner/plan/plan.js +97 -0
  255. package/dist/runner/plan/seed-mem.d.ts +12 -0
  256. package/dist/runner/plan/seed-mem.js +98 -0
  257. package/dist/runner/plan/spec.d.ts +5 -0
  258. package/dist/runner/plan/spec.js +17 -0
  259. package/dist/runner/play-steps.d.ts +2 -0
  260. package/dist/runner/play-steps.js +59 -0
  261. package/dist/runner/runner.d.ts +4 -0
  262. package/dist/runner/runner.js +64 -0
  263. package/dist/runner/session.d.ts +9 -0
  264. package/dist/runner/session.js +87 -0
  265. package/dist/{browser.js → runtime/browser.js} +4 -2
  266. package/dist/{env-file.js → runtime/env-file.js} +7 -12
  267. package/dist/{extensions.d.ts → runtime/extensions.d.ts} +1 -5
  268. package/dist/{extensions.js → runtime/extensions.js} +2 -1
  269. package/dist/runtime/full-launch.d.ts +1 -0
  270. package/dist/runtime/full-launch.js +34 -0
  271. package/dist/runtime/global-flag.d.ts +5 -0
  272. package/dist/runtime/global-flag.js +18 -0
  273. package/dist/{playwright-config.d.ts → runtime/playwright-config.d.ts} +1 -1
  274. package/dist/{playwright.config.js → runtime/playwright.config.js} +3 -2
  275. package/dist/runtime/run-log.d.ts +2 -0
  276. package/dist/runtime/run-log.js +17 -0
  277. package/dist/{video-dir.js → runtime/video-dir.js} +3 -2
  278. package/dist/{config.d.ts → runtime/waygraph-config.d.ts} +6 -9
  279. package/dist/{config.js → runtime/waygraph-config.js} +21 -51
  280. package/dist/{webserver.js → runtime/webserver.js} +5 -30
  281. package/examples/routed-demo/config/waygraph.config.ts +20 -0
  282. package/examples/routed-demo/package.json +1 -4
  283. package/examples/routed-demo/scripts/fixture-server.mjs +1 -1
  284. package/examples/routed-demo/src/flows/routed-demo-map.flow.ts +2 -4
  285. package/examples/routed-demo/src/flows/routed-demo.flow.ts +1 -2
  286. package/examples/routed-demo/src/map/(app_base)/dashboard/_methods/click-widget.block.ts +5 -4
  287. package/examples/routed-demo/src/map/(app_base)/dashboard/_nav.block.ts +3 -3
  288. package/examples/routed-demo/src/map/(app_base)/dashboard/_page.block.ts +3 -3
  289. package/examples/routed-demo/src/map/(external)/docs/_nav.block.ts +3 -3
  290. package/examples/routed-demo/src/map/(external)/docs/_page.block.ts +3 -3
  291. package/examples/routed-demo/src/states/routed-demo.states.ts +5 -3
  292. package/examples/routed-demo/tests/routed-demo.spec.ts +4 -4
  293. package/examples/routed-demo/tsconfig.json +1 -1
  294. package/examples/saucedemo/docs/CONVENTION.md +4 -5
  295. package/examples/saucedemo/docs/HELPERS.md +11 -11
  296. package/examples/saucedemo/src/blocks/SITE-MAP.md +0 -1
  297. package/examples/saucedemo/src/blocks/saucedemo-web/NAV.md +1 -5
  298. package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -3
  299. package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
  300. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
  301. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
  302. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
  303. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
  304. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +5 -8
  305. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -3
  306. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
  307. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +35 -43
  308. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
  309. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
  310. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
  311. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
  312. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
  313. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
  314. package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -4
  315. package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -4
  316. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +4 -5
  317. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
  318. package/examples/saucedemo/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
  319. package/examples/saucedemo/src/flows/api-demo.flow.ts +12 -10
  320. package/examples/saucedemo/src/states/checkout.states.ts +21 -11
  321. package/examples/saucedemo/src/stubs/device-showcase.ts +8 -10
  322. package/examples/saucedemo/tests/auto-graph.spec.ts +4 -12
  323. package/package.json +10 -6
  324. package/templates/agents/waygraph-planner.agent.md +2 -2
  325. package/templates/quickstart/docs/CONVENTION.md +4 -4
  326. package/templates/quickstart/docs/HELPERS.md +10 -8
  327. package/templates/quickstart/package.json +0 -3
  328. package/templates/quickstart/src/blocks/SITE-MAP.md +0 -1
  329. package/templates/quickstart/src/blocks/saucedemo-web/NAV.md +1 -5
  330. package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -3
  331. package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
  332. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
  333. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
  334. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
  335. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
  336. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +5 -8
  337. package/templates/quickstart/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -3
  338. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
  339. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +35 -43
  340. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
  341. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
  342. package/templates/quickstart/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
  343. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
  344. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
  345. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
  346. package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -4
  347. package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -4
  348. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +4 -5
  349. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
  350. package/templates/quickstart/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
  351. package/templates/quickstart/src/flows/api-demo.flow.ts +12 -10
  352. package/templates/quickstart/src/states/checkout.states.ts +21 -11
  353. package/templates/quickstart/src/stubs/device-showcase.ts +8 -10
  354. package/templates/scaffold/README.md +2 -1
  355. package/templates/scaffold/STRUCTURE.md +5 -4
  356. package/templates/scaffold/config/waygraph.config.ts +1 -0
  357. package/templates/scaffold/gitignore +1 -0
  358. package/templates/scaffold/src/flows/README.md +2 -2
  359. package/templates/scaffold/src/map/(app_base)/docs/_nav.block.ts +3 -3
  360. package/templates/scaffold/src/map/(app_base)/docs/_page.block.ts +3 -3
  361. package/templates/scaffold/src/map/(app_base)/home/_methods/add-item.effect.block.ts +4 -4
  362. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-hello.method.block.ts +3 -3
  363. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-item-added.method.block.ts +3 -3
  364. package/templates/scaffold/src/map/(app_base)/home/_methods/clear-cart.method.block.ts +5 -4
  365. package/templates/scaffold/src/map/(app_base)/home/_methods/remove-item.effect.block.ts +4 -4
  366. package/templates/scaffold/src/map/(app_base)/home/_nav.block.ts +3 -3
  367. package/templates/scaffold/src/map/(app_base)/home/_page.block.ts +3 -3
  368. package/templates/scaffold/src/map/(app_base)/home/nav-verification-link.block.ts +4 -4
  369. package/templates/scaffold/src/map/(external)/hoppscotch/_keys.ts +21 -0
  370. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-body.method.block.ts +4 -4
  371. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-header.method.block.ts +4 -4
  372. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-status.method.block.ts +4 -4
  373. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/pick-extension-interceptor.method.block.ts +5 -4
  374. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-body.method.block.ts +6 -5
  375. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-headers.method.block.ts +6 -5
  376. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/send-request.method.block.ts +5 -4
  377. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-bearer-token.method.block.ts +6 -5
  378. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-headers.method.block.ts +6 -5
  379. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-json-body.method.block.ts +6 -5
  380. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-method.method.block.ts +6 -5
  381. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-query-params.method.block.ts +6 -5
  382. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-url.method.block.ts +6 -5
  383. package/templates/scaffold/src/map/(external)/hoppscotch/_nav.block.ts +3 -3
  384. package/templates/scaffold/src/map/(external)/hoppscotch/_page.block.ts +3 -3
  385. package/templates/scaffold/src/map/(external)/hoppscotch/_states.ts +6 -0
  386. package/templates/scaffold/src/map/(external)/hoppscotch/settings/_nav.block.ts +3 -3
  387. package/templates/scaffold/src/map/(external)/mailpit/_keys.ts +13 -0
  388. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-content.method.block.ts +4 -4
  389. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-received.method.block.ts +4 -4
  390. package/templates/scaffold/src/map/(external)/mailpit/_methods/extract-email-link.method.block.ts +6 -5
  391. package/templates/scaffold/src/map/(external)/mailpit/_methods/open-message.method.block.ts +6 -5
  392. package/templates/scaffold/src/map/(external)/mailpit/_nav.block.ts +3 -3
  393. package/templates/scaffold/src/map/(external)/mailpit/_page.block.ts +3 -3
  394. package/templates/scaffold/src/map/(external)/mailpit/_states.ts +9 -0
  395. package/templates/scaffold/src/map/README.md +7 -0
  396. package/templates/scaffold/src/states/README.md +4 -1
  397. package/templates/scaffold/src/states/demo.mem-keys.ts +1 -29
  398. package/templates/scaffold/src/states/demo.states.ts +14 -20
  399. package/templates/scaffold/tests/hoppscotch.spec.ts +1 -11
  400. package/templates/scaffold/tests/mail-verify.spec.ts +2 -2
  401. package/templates/skills/waygraph-blind-pilot.skill.md +2 -6
  402. package/templates/skills/waygraph-convention.skill.md +23 -14
  403. package/templates/skills/waygraph-pilot.skill.md +7 -4
  404. package/dist/auto-session/verbose-log.js +0 -16
  405. package/dist/auto-session.d.ts +0 -2
  406. package/dist/auto-session.js +0 -3
  407. package/dist/cli/discover.d.ts +0 -40
  408. package/dist/cli/discover.js +0 -148
  409. package/dist/commands/agent-dive.js +0 -52
  410. package/dist/commands/check.js +0 -192
  411. package/dist/commands/map.js +0 -29
  412. package/dist/commands/run.js +0 -104
  413. package/dist/commands/traverse.js +0 -177
  414. package/dist/core/block.d.ts +0 -109
  415. package/dist/core/blocks/effect.js +0 -23
  416. package/dist/core/config.js +0 -17
  417. package/dist/core/engine.d.ts +0 -198
  418. package/dist/core/flow.d.ts +0 -294
  419. package/dist/core/flow.js +0 -432
  420. package/dist/core.d.ts +0 -14
  421. package/dist/core.js +0 -15
  422. package/dist/highlights/merge.d.ts +0 -8
  423. package/dist/highlights/merge.js +0 -173
  424. package/dist/highlights/stub-ctx.d.ts +0 -10
  425. package/dist/highlights/stub-ctx.js +0 -331
  426. package/dist/highlights/types.d.ts +0 -613
  427. package/dist/highlights.d.ts +0 -9
  428. package/dist/highlights.js +0 -10
  429. package/dist/pilot-overlay.d.ts +0 -5
  430. package/dist/pilot-overlay.js +0 -6
  431. package/dist/runner/banner-log.js +0 -63
  432. package/dist/runner/chain-run.js +0 -102
  433. package/dist/runner/cursor.js +0 -140
  434. package/dist/runner/demo-log.js +0 -316
  435. package/dist/runner/device-stage.d.ts +0 -9
  436. package/dist/runner/device-stage.js +0 -420
  437. package/dist/runner/discovery.js +0 -105
  438. package/dist/runner/index.js +0 -2
  439. package/dist/runner/inpage/banner.d.ts +0 -21
  440. package/dist/runner/inpage/banner.js +0 -156
  441. package/dist/runner/inpage/caption.d.ts +0 -3
  442. package/dist/runner/inpage/caption.js +0 -23
  443. package/dist/runner/inpage/core.d.ts +0 -4
  444. package/dist/runner/inpage/core.js +0 -316
  445. package/dist/runner/inpage/device.d.ts +0 -3
  446. package/dist/runner/inpage/device.js +0 -211
  447. package/dist/runner/inpage/network.d.ts +0 -15
  448. package/dist/runner/inpage/network.js +0 -217
  449. package/dist/runner/inpage/panel-chrome.js +0 -192
  450. package/dist/runner/inpage/stamp.js +0 -46
  451. package/dist/runner/inpage/swipe-zoom.js +0 -220
  452. package/dist/runner/inpage/todos.js +0 -337
  453. package/dist/runner/interaction-patch.js +0 -384
  454. package/dist/runner/main.js +0 -469
  455. package/dist/runner/network-capture.d.ts +0 -9
  456. package/dist/runner/network-capture.js +0 -126
  457. package/dist/runner/overlay-css.d.ts +0 -3
  458. package/dist/runner/overlay-css.js +0 -377
  459. package/dist/runner/overlay-install.js +0 -90
  460. package/dist/runner/overlay-stage.js +0 -110
  461. package/dist/runner/rings.js +0 -514
  462. package/dist/runner/seed-mem.js +0 -110
  463. package/dist/runner/slides.js +0 -278
  464. package/dist/runner/step-mode.js +0 -703
  465. package/dist/runner/step-panels.js +0 -729
  466. package/dist/runner/teardown.js +0 -202
  467. package/dist/runner/todo-dock.js +0 -142
  468. package/dist/session/step-overlay.d.ts +0 -37
  469. package/dist/session/step-overlay.js +0 -244
  470. package/examples/routed-demo/playwright.config.ts +0 -21
  471. package/examples/saucedemo/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
  472. package/templates/quickstart/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
  473. /package/dist/{commands → cli/commands}/agent-dive-scaffold.d.ts +0 -0
  474. /package/dist/{commands → cli/commands}/agent-dive.d.ts +0 -0
  475. /package/dist/{commands → cli/commands}/extensions.d.ts +0 -0
  476. /package/dist/{commands → cli/commands}/init.d.ts +0 -0
  477. /package/dist/{commands → cli/commands}/list.d.ts +0 -0
  478. /package/dist/{commands → cli/commands}/map.d.ts +0 -0
  479. /package/dist/{commands → cli/commands}/session.d.ts +0 -0
  480. /package/dist/{commands → cli/commands}/test.d.ts +0 -0
  481. /package/dist/{commands → cli/commands}/traverse.d.ts +0 -0
  482. /package/dist/{commands → cli/commands}/try.d.ts +0 -0
  483. /package/dist/{commands → cli/commands}/upgrade.d.ts +0 -0
  484. /package/dist/{highlights → demo/narration}/shorthand.js +0 -0
  485. /package/dist/{session/overlay-beacon.d.ts → demo/overlay/beacon.d.ts} +0 -0
  486. /package/dist/{session/overlay-beacon.js → demo/overlay/beacon.js} +0 -0
  487. /package/dist/{pilot-overlay/action-ring.d.ts → demo/overlay/pilot/actions.d.ts} +0 -0
  488. /package/dist/{ui → demo/overlay/ui}/components/ring.d.ts +0 -0
  489. /package/dist/{ui → demo/overlay/ui}/stylesheet.d.ts +0 -0
  490. /package/dist/{ui → demo/overlay/ui}/stylesheet.js +0 -0
  491. /package/dist/{ui → demo/overlay/ui}/tokens.d.ts +0 -0
  492. /package/dist/{ui → demo/overlay/ui}/tokens.js +0 -0
  493. /package/dist/{highlights → demo}/types.js +0 -0
  494. /package/dist/{auto-session → demo}/verbose-log.d.ts +0 -0
  495. /package/dist/{selector.d.ts → engine/trait/selector.d.ts} +0 -0
  496. /package/dist/{selector.js → engine/trait/selector.js} +0 -0
  497. /package/dist/{trait.js → engine/trait/trait.js} +0 -0
  498. /package/dist/{traverse → live/traverse}/coverage.d.ts +0 -0
  499. /package/dist/{traverse → live/traverse}/coverage.js +0 -0
  500. /package/dist/{traverse → live/traverse}/lease.d.ts +0 -0
  501. /package/dist/{traverse → live/traverse}/lease.js +0 -0
  502. /package/dist/{session/block-inject.d.ts → manifest/roots.d.ts} +0 -0
  503. /package/dist/{blocks-select.d.ts → manifest/select.d.ts} +0 -0
  504. /package/dist/{blocks-select.js → manifest/select.js} +0 -0
  505. /package/dist/{browser.d.ts → runtime/browser.d.ts} +0 -0
  506. /package/dist/{env-file.d.ts → runtime/env-file.d.ts} +0 -0
  507. /package/dist/{playwright-config.js → runtime/playwright-config.js} +0 -0
  508. /package/dist/{playwright.config.d.ts → runtime/playwright.config.d.ts} +0 -0
  509. /package/dist/{video-dir.d.ts → runtime/video-dir.d.ts} +0 -0
  510. /package/dist/{webserver.d.ts → runtime/webserver.d.ts} +0 -0
@@ -1,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,25 +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
23
  /** Builds a Block for one page action (fill, submit, click) that does not navigate. */
28
- export declare function defineMethodBlock<In extends Checkpoint<string>, Out extends Checkpoint<string>>(base: Parameters<typeof defineBlock<In, Out>>[0]): MethodBlock<In, Out>;
29
- /** @deprecated Prefer {@link defineMethodBlock} - identical helper (0.7 name). */
30
- export declare const defineActionBlock: typeof defineMethodBlock;
24
+ export declare function defineMethodBlock<In extends Checkpoint<string>, Out extends Checkpoint<string>>(base: RoutedBlockBase<In, Out>): MethodBlock<In, Out>;
31
25
  /** Options for `defineAssertBlock`: a Checkpoint to stay on and the Traits that must hold. */
32
26
  export interface AssertBlockOptions<Out extends Checkpoint<string> = Checkpoint<string>> {
33
27
  name: string;
34
28
  description?: string;
35
- /** Self-loop target - the Checkpoint this assertion runs on and returns to. */
36
- checkpoint: Out["__state"];
29
+ /** The Checkpoint this assertion runs on and returns to: its value (`Home`). */
30
+ checkpoint: Out;
37
31
  /**
38
32
  * Shorthand for the wait-then-assert shape found repeatedly in hand-written
39
33
  * assertion Blocks: waits for a heading with this accessible name before
@@ -44,12 +38,9 @@ export interface AssertBlockOptions<Out extends Checkpoint<string> = Checkpoint<
44
38
  waitForHeading?: string;
45
39
  verify: Trait[] | ((out: Out) => Trait[]);
46
40
  /** Mem keys this assertion's `verify` reads (e.g. a mem-aware Trait) - checked by preflight before the flow runs. */
47
- requires?: readonly MemKey<any>[];
48
- stubBefore?: import("../../highlights.js").HighlightStubPhaseOrFn<Out>;
49
- stubAfter?: import("../../highlights.js").HighlightStubPhaseOrFn<Out>;
50
- stubOnError?: import("../../highlights.js").HighlightStubPhaseOrFn<Out>;
41
+ requires?: readonly MemKey<unknown>[];
51
42
  /** Multi-step yap slides (demo only) - same field `Instruction.slides` exposes elsewhere. */
52
- slides?: import("../../highlights.js").WaygraphSlidesOrFn<Out>;
43
+ slides?: import("../../stub/ring.js").WaygraphSlidesOrFn<Out>;
53
44
  }
54
45
  /**
55
46
  * Sugar for a self-loop-only "pure assertion" Block: no hand-written
@@ -67,7 +58,7 @@ export interface AssertBlockOptions<Out extends Checkpoint<string> = Checkpoint<
67
58
  * verify: [Trait.visible(RawMaterialsSel.reorderBadge)],
68
59
  * });
69
60
  */
70
- 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>;
71
62
  /**
72
63
  * Self-loop verify Block from {@link defineAssertBlock}. Branded for
73
64
  * {@link MapBuilder.assert} (not accepted by `.method()`).
@@ -77,10 +68,7 @@ export type AssertBlock<Out extends Checkpoint<string>> = Omit<DefinedBlock<Out,
77
68
  withVerify(verify: Trait[] | ((out: Out) => Trait[])): AssertBlock<Out>;
78
69
  modVerify(nameOrIndex: string | number, newCheck: Trait["check"] | Trait): AssertBlock<Out>;
79
70
  modVerifyAll(patches: Record<string, Trait["check"] | Trait>): AssertBlock<Out>;
80
- stubBefore(stub: import("../../highlights.js").HighlightStubPhase): AssertBlock<Out>;
81
- stubBefore(stub: import("../../highlights.js").StubLifecycleFn<Out>): AssertBlock<Out>;
82
- stubAfter(stub: import("../../highlights.js").HighlightStubPhase): AssertBlock<Out>;
83
- stubAfter(stub: import("../../highlights.js").StubLifecycleFn<Out>): AssertBlock<Out>;
84
- stubOnError(stub: import("../../highlights.js").HighlightStubPhase): AssertBlock<Out>;
85
- 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>;
86
74
  };
@@ -1,9 +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";
4
3
  /** Builds a Block for one page action (fill, submit, click) that does not navigate. */
5
4
  export function defineMethodBlock(base) {
6
- const built = defineBlock(base);
5
+ const built = defineBlock(routed(base));
6
+ markRouteOf(built, base);
7
7
  Object.defineProperty(built, "__waygraphSalt", {
8
8
  value: "method",
9
9
  enumerable: false,
@@ -11,8 +11,6 @@ export function defineMethodBlock(base) {
11
11
  });
12
12
  return built;
13
13
  }
14
- /** @deprecated Prefer {@link defineMethodBlock} - identical helper (0.7 name). */
15
- export const defineActionBlock = defineMethodBlock;
16
14
  /**
17
15
  * Sugar for a self-loop-only "pure assertion" Block: no hand-written
18
16
  * `act`/`resolve`, just a name, a `checkpoint` tag, and a `verify` array.
@@ -34,32 +32,19 @@ export function defineAssertBlock(options) {
34
32
  name: options.name,
35
33
  ...(options.description ? { description: options.description } : {}),
36
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,
37
38
  instruction: {
38
39
  async act(page) {
39
40
  if (options.waitForHeading !== undefined) {
40
41
  await page.getByRole("heading", { name: options.waitForHeading }).waitFor();
41
42
  }
42
43
  },
43
- resolve: () => checkpoint(options.checkpoint),
44
44
  verify: options.verify,
45
- ...(options.stubBefore ? { stubBefore: options.stubBefore } : {}),
46
- ...(options.stubAfter ? { stubAfter: options.stubAfter } : {}),
47
- ...(options.stubOnError ? { stubOnError: options.stubOnError } : {}),
48
45
  ...(options.slides ? { slides: options.slides } : {}),
49
46
  },
50
47
  });
51
- // Real bug this closes: `waygraph graph`'s static discovery only knows
52
- // how to read a Block's Checkpoint tags from an EXPLICIT `<In, Out>`
53
- // generic written in the source text (or, for Nav/Page Blocks, by calling
54
- // their own input-independent `resolve()` directly). `defineAssertBlock`'s
55
- // whole point is skipping that generic - called exactly as documented
56
- // (`defineAssertBlock({ name, checkpoint, verify })`, no generics), it was
57
- // silently invisible to both `waygraph graph` and the live Pilot menu
58
- // ("2 Block(s) skipped (Out not resolvable)", confirmed live against a
59
- // real veciro-waygraph session). `resolve()` here is ALSO input-
60
- // independent (always `checkpoint(options.checkpoint)`), so the same
61
- // resolve()-calling path Nav/Page Blocks already use is reused via this
62
- // marker instead of requiring authors to write generics just to be found.
63
48
  Object.defineProperty(built, "__waygraphKind", {
64
49
  value: "assert",
65
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,17 +104,13 @@ 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
  };
126
116
  /** A Block whose only action is clicking a link; built with `defineNavClickBlock`. */
@@ -132,7 +122,7 @@ export declare function defineNavClickBlock<Out extends Checkpoint<string>>(opti
132
122
  * (which product row / which request id). Still a NavBlock / Block at runtime.
133
123
  */
134
124
  export type MemNavBlock<Out extends Checkpoint<string>> = NavBlock<Out> & {
135
- requires: readonly MemKey<any>[];
125
+ requires: readonly MemKey<unknown>[];
136
126
  instanceOptions: NonNullable<Block<Checkpoint<string>, Out>["instanceOptions"]>;
137
127
  };
138
128
  /**
@@ -142,6 +132,6 @@ export type MemNavBlock<Out extends Checkpoint<string>> = NavBlock<Out> & {
142
132
  * several live rows/items rather than a fixed nav target. Still a Block.
143
133
  */
144
134
  export declare function defineMemNavBlock<Out extends Checkpoint<string>>(options: NavBlockOptions<Out> & {
145
- requires: readonly MemKey<any>[];
135
+ requires: readonly MemKey<unknown>[];
146
136
  instanceOptions: NonNullable<Block<Checkpoint<string>, Out>["instanceOptions"]>;
147
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,22 +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);
7
9
  /** Options for `definePageBlock`: the Checkpoint a page hub confirms and the Methods that hang off it. */
8
10
  export type PageBlockOptions<Out extends Checkpoint<string>> = {
9
11
  name: string;
10
12
  description?: string;
11
- /** Checkpoint tag for this screen (hub). */
12
- checkpoint: Out["__state"];
13
+ /** The Checkpoint this page hub confirms: its value (`Home`). */
14
+ checkpoint: Out;
13
15
  verify?: Trait[] | ((out: Out) => Trait[]);
14
- stubBefore?: import("../../highlights.js").HighlightStubPhaseOrFn<Out>;
15
- stubAfter?: import("../../highlights.js").HighlightStubPhaseOrFn<Out>;
16
- stubOnError?: import("../../highlights.js").HighlightStubPhaseOrFn<Out>;
17
- /** @deprecated Prefer stubAfter. */
18
- highlights?: readonly WaygraphHighlight[] | ((out: Out) => readonly WaygraphHighlight[]);
19
- requires?: readonly MemKey<any>[];
16
+ requires?: readonly MemKey<unknown>[];
20
17
  /**
21
18
  * Methods available on this page. Array, or a record of Blocks / `() => Block`
22
19
  * factories (lazy so the page object can colocate method definitions).
@@ -42,16 +39,13 @@ export type PageBlockOptions<Out extends Checkpoint<string>> = {
42
39
  export type PageBlock<Out extends Checkpoint<string>> = Omit<DefinedBlock<Checkpoint<string>, Out>, "withVerify" | "modVerify" | "modVerifyAll" | "stubBefore" | "stubAfter" | "stubOnError"> & {
43
40
  readonly __wgFactory?: "page";
44
41
  /** Resolved method Blocks registered at define time. */
45
- readonly methods: readonly DefinedBlock<any, any>[];
42
+ readonly methods: readonly SomeDefinedBlock[];
46
43
  withVerify(verify: Trait[] | ((out: Out) => Trait[])): PageBlock<Out>;
47
44
  modVerify(nameOrIndex: string | number, newCheck: Trait["check"] | Trait): PageBlock<Out>;
48
45
  modVerifyAll(patches: Record<string, Trait["check"] | Trait>): PageBlock<Out>;
49
- stubBefore(stub: import("../../highlights.js").HighlightStubPhase): PageBlock<Out>;
50
- stubBefore(stub: import("../../highlights.js").StubLifecycleFn<Out>): PageBlock<Out>;
51
- stubAfter(stub: import("../../highlights.js").HighlightStubPhase): PageBlock<Out>;
52
- stubAfter(stub: import("../../highlights.js").StubLifecycleFn<Out>): PageBlock<Out>;
53
- stubOnError(stub: import("../../highlights.js").HighlightStubPhase): PageBlock<Out>;
54
- 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>;
55
49
  };
56
50
  /** @see {@link PageBlockOptions} */
57
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
  /**