waygraph 0.15.54 → 0.16.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (552) hide show
  1. package/README.md +8 -3
  2. package/bin/waygraph +2 -2
  3. package/dist/analysis/check.d.ts +38 -0
  4. package/dist/analysis/check.js +87 -0
  5. package/dist/analysis/coverage-gap.d.ts +1 -1
  6. package/dist/analysis/coverage-gap.js +14 -37
  7. package/dist/analysis/flow-source.d.ts +9 -0
  8. package/dist/analysis/flow-source.js +25 -0
  9. package/dist/analysis/graph.d.ts +10 -14
  10. package/dist/analysis/graph.js +48 -371
  11. package/dist/analysis/map-check.js +4 -39
  12. package/dist/analysis/practices-check.d.ts +1 -1
  13. package/dist/analysis/practices-check.js +24 -45
  14. package/dist/cli/args.d.ts +23 -0
  15. package/dist/cli/args.js +20 -0
  16. package/dist/{cli.d.ts → cli/cli.d.ts} +0 -1
  17. package/dist/{cli.js → cli/cli.js} +10 -9
  18. package/dist/{commands → cli/commands}/agent-dive-scaffold.js +35 -64
  19. package/dist/cli/commands/agent-dive.js +42 -0
  20. package/dist/cli/commands/browser.d.ts +2 -0
  21. package/dist/cli/commands/browser.js +109 -0
  22. package/dist/{commands → cli/commands}/check.d.ts +0 -1
  23. package/dist/cli/commands/check.js +104 -0
  24. package/dist/cli/commands/codemod-checkpoints.d.ts +18 -0
  25. package/dist/cli/commands/codemod-checkpoints.js +186 -0
  26. package/dist/cli/commands/codemod-flows.d.ts +18 -0
  27. package/dist/cli/commands/codemod-flows.js +284 -0
  28. package/dist/cli/commands/codemod-stubs.d.ts +10 -0
  29. package/dist/cli/commands/codemod-stubs.js +187 -0
  30. package/dist/{commands → cli/commands}/extensions.js +5 -4
  31. package/dist/{commands → cli/commands}/init.js +1 -2
  32. package/dist/{commands → cli/commands}/list.js +9 -7
  33. package/dist/cli/commands/manifest.d.ts +2 -0
  34. package/dist/cli/commands/manifest.js +20 -0
  35. package/dist/cli/commands/map.js +57 -0
  36. package/dist/cli/commands/pilot.d.ts +2 -0
  37. package/dist/cli/commands/pilot.js +102 -0
  38. package/dist/{commands → cli/commands}/run.d.ts +0 -1
  39. package/dist/cli/commands/run.js +64 -0
  40. package/dist/cli/commands/session-ops.d.ts +3 -0
  41. package/dist/cli/commands/session-ops.js +257 -0
  42. package/dist/cli/commands/session.js +132 -0
  43. package/dist/{commands → cli/commands}/test.js +11 -14
  44. package/dist/cli/commands/traverse.js +105 -0
  45. package/dist/{commands → cli/commands}/try.js +29 -25
  46. package/dist/{commands → cli/commands}/upgrade.js +40 -4
  47. package/dist/cli/flags.d.ts +193 -16
  48. package/dist/cli/flags.js +179 -234
  49. package/dist/cli/run-chain.d.ts +1 -0
  50. package/dist/cli/run-chain.js +42 -7
  51. package/dist/cli/usage.d.ts +1 -1
  52. package/dist/cli/usage.js +21 -53
  53. package/dist/cli/util.d.ts +2 -2
  54. package/dist/cli/util.js +2 -3
  55. package/dist/{highlights → demo/narration}/css.d.ts +1 -1
  56. package/dist/{highlights → demo/narration}/css.js +2 -3
  57. package/dist/{highlights → demo/narration}/demo-pace.d.ts +4 -12
  58. package/dist/{highlights → demo/narration}/demo-pace.js +5 -11
  59. package/dist/{highlights → demo/narration}/device.d.ts +4 -4
  60. package/dist/{highlights → demo/narration}/device.js +1 -1
  61. package/dist/demo/narration/merge.d.ts +10 -0
  62. package/dist/demo/narration/merge.js +67 -0
  63. package/dist/demo/narration/narration.d.ts +39 -0
  64. package/dist/{highlights/run-phase.js → demo/narration/narration.js} +25 -94
  65. package/dist/{highlights → demo/narration}/shorthand.d.ts +1 -1
  66. package/dist/demo/narration/stub-ctx.d.ts +8 -0
  67. package/dist/demo/narration/stub-ctx.js +164 -0
  68. package/dist/{highlights → demo/narration}/style.d.ts +1 -7
  69. package/dist/{highlights → demo/narration}/style.js +1 -41
  70. package/dist/{highlights → demo/narration}/todo-dock.d.ts +8 -8
  71. package/dist/{highlights → demo/narration}/todo-dock.js +13 -30
  72. package/dist/demo/overlay/auto-chrome.d.ts +7 -0
  73. package/dist/demo/overlay/auto-chrome.js +97 -0
  74. package/dist/demo/overlay/cursor.d.ts +19 -0
  75. package/dist/demo/overlay/cursor.js +142 -0
  76. package/dist/demo/overlay/device-stage.d.ts +26 -0
  77. package/dist/demo/overlay/device-stage.js +396 -0
  78. package/dist/demo/overlay/inpage/banner.d.ts +2 -0
  79. package/dist/demo/overlay/inpage/banner.js +160 -0
  80. package/dist/demo/overlay/inpage/caption.d.ts +2 -0
  81. package/dist/demo/overlay/inpage/caption.js +24 -0
  82. package/dist/demo/overlay/inpage/core.d.ts +2 -0
  83. package/dist/demo/overlay/inpage/core.js +345 -0
  84. package/dist/demo/overlay/inpage/device-chip.d.ts +1 -0
  85. package/dist/demo/overlay/inpage/device-chip.js +191 -0
  86. package/dist/demo/overlay/inpage/network.d.ts +10 -0
  87. package/dist/demo/overlay/inpage/network.js +189 -0
  88. package/dist/demo/overlay/inpage/panel-chrome.d.ts +1 -0
  89. package/dist/demo/overlay/inpage/panel-chrome.js +203 -0
  90. package/dist/demo/overlay/inpage/stamp.d.ts +1 -0
  91. package/dist/demo/overlay/inpage/stamp.js +46 -0
  92. package/dist/demo/overlay/inpage/swipe-zoom.d.ts +1 -0
  93. package/dist/demo/overlay/inpage/swipe-zoom.js +220 -0
  94. package/dist/demo/overlay/inpage/todos.d.ts +2 -0
  95. package/dist/demo/overlay/inpage/todos.js +293 -0
  96. package/dist/demo/overlay/locator-theater.d.ts +25 -0
  97. package/dist/demo/overlay/locator-theater.js +76 -0
  98. package/dist/demo/overlay/network-capture.d.ts +22 -0
  99. package/dist/demo/overlay/network-capture.js +127 -0
  100. package/dist/demo/overlay/overlay-css.d.ts +3 -0
  101. package/dist/demo/overlay/overlay-css.js +369 -0
  102. package/dist/demo/overlay/overlay-stage.d.ts +31 -0
  103. package/dist/demo/overlay/overlay-stage.js +106 -0
  104. package/dist/demo/overlay/overlay.d.ts +10 -0
  105. package/dist/demo/overlay/overlay.js +89 -0
  106. package/dist/{pilot-overlay/overlay-fixtures.d.ts → demo/overlay/phase-fixtures.d.ts} +2 -2
  107. package/dist/{pilot-overlay/overlay-fixtures.js → demo/overlay/phase-fixtures.js} +2 -2
  108. package/dist/{pilot-overlay/action-ring.js → demo/overlay/pilot/actions.js} +2 -1
  109. package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.d.ts +6 -5
  110. package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.js +19 -18
  111. package/dist/{pilot-overlay → demo/overlay/pilot}/shell.d.ts +2 -2
  112. package/dist/{pilot-overlay → demo/overlay/pilot}/shell.js +13 -22
  113. package/dist/demo/overlay/reattach.d.ts +7 -0
  114. package/dist/demo/overlay/reattach.js +23 -0
  115. package/dist/demo/overlay/rings.d.ts +61 -0
  116. package/dist/demo/overlay/rings.js +422 -0
  117. package/dist/{ui → demo/overlay/ui}/components/ring.js +2 -2
  118. package/dist/{ui → demo/overlay/ui}/overlay.css +4 -4
  119. package/dist/{ui → demo/overlay/ui}/shadow.d.ts +1 -1
  120. package/dist/{ui → demo/overlay/ui}/shadow.js +39 -2
  121. package/dist/demo/stepper/after.d.ts +3 -0
  122. package/dist/demo/stepper/after.js +103 -0
  123. package/dist/demo/stepper/banner-log.d.ts +35 -0
  124. package/dist/demo/stepper/banner-log.js +65 -0
  125. package/dist/demo/stepper/before.d.ts +4 -0
  126. package/dist/demo/stepper/before.js +110 -0
  127. package/dist/demo/stepper/demo-log.d.ts +48 -0
  128. package/dist/demo/stepper/demo-log.js +292 -0
  129. package/dist/demo/stepper/gate.d.ts +11 -0
  130. package/dist/demo/stepper/gate.js +78 -0
  131. package/dist/demo/stepper/interaction-patch.d.ts +4 -0
  132. package/dist/demo/stepper/interaction-patch.js +323 -0
  133. package/dist/demo/stepper/pacing.d.ts +21 -0
  134. package/dist/demo/stepper/pacing.js +23 -0
  135. package/dist/demo/stepper/panel-after.d.ts +17 -0
  136. package/dist/demo/stepper/panel-after.js +166 -0
  137. package/dist/demo/stepper/panel-before.d.ts +12 -0
  138. package/dist/demo/stepper/panel-before.js +241 -0
  139. package/dist/demo/stepper/slides.d.ts +23 -0
  140. package/dist/demo/stepper/slides.js +233 -0
  141. package/dist/demo/stepper/step-panels.d.ts +69 -0
  142. package/dist/demo/stepper/step-panels.js +172 -0
  143. package/dist/demo/stepper/stepper.d.ts +24 -0
  144. package/dist/demo/stepper/stepper.js +122 -0
  145. package/dist/demo/stepper/teardown.d.ts +47 -0
  146. package/dist/demo/stepper/teardown.js +178 -0
  147. package/dist/demo/stepper/todo-advance.d.ts +15 -0
  148. package/dist/demo/stepper/todo-advance.js +110 -0
  149. package/dist/demo/stepper/view.d.ts +58 -0
  150. package/dist/demo/stepper/view.js +31 -0
  151. package/dist/demo/types.d.ts +85 -0
  152. package/dist/demo/verbose-log.js +15 -0
  153. package/dist/engine/block/action-page.d.ts +53 -0
  154. package/dist/engine/block/action-page.js +1 -0
  155. package/dist/{types.d.ts → engine/block/block.d.ts} +102 -142
  156. package/dist/{core → engine/block}/block.js +12 -130
  157. package/dist/engine/block/branch.d.ts +17 -0
  158. package/dist/engine/block/branch.js +40 -0
  159. package/dist/{core → engine/block}/compose.d.ts +9 -7
  160. package/dist/{core → engine/block}/compose.js +1 -1
  161. package/dist/engine/block/dialog.d.ts +13 -0
  162. package/dist/engine/block/dialog.js +37 -0
  163. package/dist/{core/blocks → engine/block/kinds}/api.d.ts +16 -12
  164. package/dist/{core/blocks → engine/block/kinds}/api.js +26 -18
  165. package/dist/{core/blocks → engine/block/kinds}/effect.d.ts +13 -18
  166. package/dist/engine/block/kinds/effect.js +17 -0
  167. package/dist/{core/blocks → engine/block/kinds}/method.d.ts +17 -29
  168. package/dist/{core/blocks → engine/block/kinds}/method.js +6 -21
  169. package/dist/{core/blocks → engine/block/kinds}/nav.d.ts +21 -31
  170. package/dist/{core/blocks → engine/block/kinds}/nav.js +6 -12
  171. package/dist/{core/blocks → engine/block/kinds}/page.d.ts +14 -20
  172. package/dist/{core/blocks → engine/block/kinds}/page.js +5 -7
  173. package/dist/engine/checkpoint/checkpoint.d.ts +22 -0
  174. package/dist/engine/checkpoint/checkpoint.js +8 -0
  175. package/dist/engine/checkpoint/route.d.ts +28 -0
  176. package/dist/engine/checkpoint/route.js +28 -0
  177. package/dist/{core → engine}/config.d.ts +7 -2
  178. package/dist/engine/config.js +6 -0
  179. package/dist/engine/engine.d.ts +45 -0
  180. package/dist/{core → engine}/engine.js +6 -10
  181. package/dist/engine/env.d.ts +59 -0
  182. package/dist/engine/env.js +83 -0
  183. package/dist/{errors.d.ts → engine/errors.d.ts} +22 -22
  184. package/dist/{errors.js → engine/errors.js} +22 -22
  185. package/dist/{core → engine/flow}/branch-regression.d.ts +7 -7
  186. package/dist/{core → engine/flow}/branch-regression.js +4 -3
  187. package/dist/engine/flow/flow.d.ts +162 -0
  188. package/dist/engine/flow/flow.js +244 -0
  189. package/dist/engine/flow/map-branch.d.ts +9 -0
  190. package/dist/engine/flow/map-branch.js +57 -0
  191. package/dist/{core → engine/flow}/map-builder.d.ts +34 -54
  192. package/dist/engine/flow/map-builder.js +242 -0
  193. package/dist/engine/flow/map-steps.d.ts +30 -0
  194. package/dist/engine/flow/map-steps.js +87 -0
  195. package/dist/{core → engine}/locate.d.ts +1 -1
  196. package/dist/{core → engine}/locate.js +1 -2
  197. package/dist/{mem-stub.d.ts → engine/mem/mem-stub.d.ts} +9 -8
  198. package/dist/{mem-stub.js → engine/mem/mem-stub.js} +2 -2
  199. package/dist/{mem-page.d.ts → engine/mem/mem.d.ts} +1 -1
  200. package/dist/{mem-page.js → engine/mem/mem.js} +2 -1
  201. package/dist/engine/page-gone.d.ts +5 -0
  202. package/dist/engine/page-gone.js +20 -0
  203. package/dist/engine/run/connect.d.ts +28 -0
  204. package/dist/{types.js → engine/run/connect.js} +11 -10
  205. package/dist/engine/run/events.d.ts +67 -0
  206. package/dist/engine/run/events.js +90 -0
  207. package/dist/engine/run/hooks.d.ts +16 -0
  208. package/dist/engine/run/hooks.js +8 -0
  209. package/dist/engine/run/launch.d.ts +13 -0
  210. package/dist/engine/run/launch.js +27 -0
  211. package/dist/{core/run-graph.d.ts → engine/run/run.d.ts} +8 -12
  212. package/dist/{core/run-graph.js → engine/run/run.js} +22 -12
  213. package/dist/engine/stub/pace.d.ts +12 -0
  214. package/dist/engine/stub/pace.js +2 -0
  215. package/dist/engine/stub/ring.d.ts +130 -0
  216. package/dist/engine/stub/ring.js +41 -0
  217. package/dist/engine/stub/stub.d.ts +268 -0
  218. package/dist/engine/stub/stub.js +1 -0
  219. package/dist/engine/stub/todos.d.ts +104 -0
  220. package/dist/engine/stub/todos.js +2 -0
  221. package/dist/engine/stub/viewport.d.ts +26 -0
  222. package/dist/engine/stub/viewport.js +2 -0
  223. package/dist/{trait.d.ts → engine/trait/trait.d.ts} +1 -1
  224. package/dist/{trait.js → engine/trait/trait.js} +1 -1
  225. package/dist/index.d.ts +88 -36
  226. package/dist/index.js +46 -19
  227. package/dist/live/auto/auto.d.ts +22 -0
  228. package/dist/live/auto/auto.js +207 -0
  229. package/dist/{session/auto-explore.d.ts → live/auto/explore.d.ts} +4 -14
  230. package/dist/{session/auto-explore.js → live/auto/explore.js} +21 -127
  231. package/dist/live/auto/mem.d.ts +11 -0
  232. package/dist/live/auto/mem.js +85 -0
  233. package/dist/live/auto/menu.d.ts +30 -0
  234. package/dist/live/auto/menu.js +335 -0
  235. package/dist/live/auto-session/auto-session.d.ts +113 -0
  236. package/dist/live/auto-session/auto-session.js +452 -0
  237. package/dist/live/auto-session/console.d.ts +4 -0
  238. package/dist/live/auto-session/console.js +41 -0
  239. package/dist/live/auto-session/files.d.ts +44 -0
  240. package/dist/live/auto-session/files.js +145 -0
  241. package/dist/{auto-session → live/auto-session}/helpers.d.ts +9 -5
  242. package/dist/{auto-session → live/auto-session}/helpers.js +18 -1
  243. package/dist/live/auto-session/inspect.d.ts +4 -0
  244. package/dist/live/auto-session/inspect.js +75 -0
  245. package/dist/{session/auto-session-ipc.d.ts → live/auto-session/ipc.d.ts} +8 -25
  246. package/dist/{session/auto-session-ipc.js → live/auto-session/ipc.js} +36 -161
  247. package/dist/live/auto-session/open-browser.d.ts +6 -0
  248. package/dist/live/auto-session/open-browser.js +47 -0
  249. package/dist/{session/browser.d.ts → live/auto-session/start.d.ts} +1 -2
  250. package/dist/{session/browser.js → live/auto-session/start.js} +2 -3
  251. package/dist/{pilot-overlay → live/pilot}/panel.d.ts +1 -1
  252. package/dist/{pilot-overlay → live/pilot}/panel.js +23 -31
  253. package/dist/{session → live/pilot}/pilot.d.ts +3 -3
  254. package/dist/{session → live/pilot}/pilot.js +5 -4
  255. package/dist/{traverse/run.d.ts → live/traverse/traverse.d.ts} +1 -1
  256. package/dist/live/traverse/traverse.js +212 -0
  257. package/dist/live/traverse/worker.d.ts +37 -0
  258. package/dist/live/traverse/worker.js +200 -0
  259. package/dist/manifest/manifest.d.ts +52 -0
  260. package/dist/manifest/manifest.js +93 -0
  261. package/dist/manifest/map-imports.d.ts +7 -0
  262. package/dist/manifest/map-imports.js +22 -0
  263. package/dist/manifest/maps.d.ts +33 -0
  264. package/dist/manifest/maps.js +62 -0
  265. package/dist/manifest/pack.d.ts +21 -0
  266. package/dist/manifest/pack.js +109 -0
  267. package/dist/manifest/project.d.ts +60 -0
  268. package/dist/manifest/project.js +101 -0
  269. package/dist/{session/block-inject.js → manifest/roots.js} +1 -18
  270. package/dist/manifest/scan.d.ts +19 -0
  271. package/dist/manifest/scan.js +57 -0
  272. package/dist/manifest/source.d.ts +23 -0
  273. package/dist/manifest/source.js +86 -0
  274. package/dist/runner/mode.d.ts +71 -0
  275. package/dist/runner/mode.js +1 -0
  276. package/dist/runner/modes/branches.d.ts +5 -0
  277. package/dist/runner/modes/branches.js +37 -0
  278. package/dist/runner/modes/demo.d.ts +3 -0
  279. package/dist/runner/modes/demo.js +13 -0
  280. package/dist/runner/modes/report.d.ts +2 -0
  281. package/dist/runner/modes/report.js +54 -0
  282. package/dist/runner/modes/run.d.ts +2 -0
  283. package/dist/runner/modes/run.js +3 -0
  284. package/dist/runner/options.d.ts +31 -0
  285. package/dist/runner/options.js +42 -0
  286. package/dist/runner/plan/find.d.ts +18 -0
  287. package/dist/runner/plan/find.js +65 -0
  288. package/dist/runner/plan/plan.d.ts +11 -0
  289. package/dist/runner/plan/plan.js +97 -0
  290. package/dist/runner/plan/seed-mem.d.ts +12 -0
  291. package/dist/runner/plan/seed-mem.js +98 -0
  292. package/dist/runner/plan/spec.d.ts +5 -0
  293. package/dist/runner/plan/spec.js +17 -0
  294. package/dist/runner/play-steps.d.ts +2 -0
  295. package/dist/runner/play-steps.js +59 -0
  296. package/dist/runner/runner.d.ts +4 -0
  297. package/dist/runner/runner.js +64 -0
  298. package/dist/runner/session.d.ts +9 -0
  299. package/dist/runner/session.js +87 -0
  300. package/dist/{browser.js → runtime/browser.js} +4 -2
  301. package/dist/{env-file.js → runtime/env-file.js} +7 -12
  302. package/dist/{extensions.d.ts → runtime/extensions.d.ts} +1 -5
  303. package/dist/{extensions.js → runtime/extensions.js} +2 -1
  304. package/dist/runtime/full-launch.d.ts +1 -0
  305. package/dist/runtime/full-launch.js +34 -0
  306. package/dist/runtime/global-flag.d.ts +5 -0
  307. package/dist/runtime/global-flag.js +18 -0
  308. package/dist/{playwright-config.d.ts → runtime/playwright-config.d.ts} +1 -1
  309. package/dist/{playwright.config.js → runtime/playwright.config.js} +3 -2
  310. package/dist/runtime/run-log.d.ts +2 -0
  311. package/dist/runtime/run-log.js +17 -0
  312. package/dist/{video-dir.js → runtime/video-dir.js} +3 -2
  313. package/dist/{config.d.ts → runtime/waygraph-config.d.ts} +6 -9
  314. package/dist/{config.js → runtime/waygraph-config.js} +21 -51
  315. package/dist/{webserver.js → runtime/webserver.js} +5 -30
  316. package/examples/routed-demo/config/waygraph.config.ts +20 -0
  317. package/examples/routed-demo/package.json +1 -4
  318. package/examples/routed-demo/scripts/fixture-server.mjs +1 -1
  319. package/examples/routed-demo/src/flows/routed-demo-map.flow.ts +2 -4
  320. package/examples/routed-demo/src/flows/routed-demo.flow.ts +1 -2
  321. package/examples/routed-demo/src/map/(app_base)/dashboard/_methods/click-widget.block.ts +5 -4
  322. package/examples/routed-demo/src/map/(app_base)/dashboard/_nav.block.ts +3 -3
  323. package/examples/routed-demo/src/map/(app_base)/dashboard/_page.block.ts +3 -3
  324. package/examples/routed-demo/src/map/(external)/docs/_nav.block.ts +3 -3
  325. package/examples/routed-demo/src/map/(external)/docs/_page.block.ts +3 -3
  326. package/examples/routed-demo/src/states/routed-demo.states.ts +5 -3
  327. package/examples/routed-demo/tests/routed-demo.spec.ts +4 -4
  328. package/examples/routed-demo/tsconfig.json +1 -1
  329. package/examples/saucedemo/docs/CONVENTION.md +4 -5
  330. package/examples/saucedemo/docs/HELPERS.md +11 -11
  331. package/examples/saucedemo/src/blocks/SITE-MAP.md +0 -1
  332. package/examples/saucedemo/src/blocks/saucedemo-web/NAV.md +1 -5
  333. package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -3
  334. package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
  335. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
  336. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
  337. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
  338. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
  339. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +5 -8
  340. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -3
  341. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
  342. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +35 -43
  343. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
  344. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
  345. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
  346. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
  347. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
  348. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
  349. package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -4
  350. package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -4
  351. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +4 -5
  352. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
  353. package/examples/saucedemo/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
  354. package/examples/saucedemo/src/flows/api-demo.flow.ts +12 -10
  355. package/examples/saucedemo/src/states/checkout.states.ts +21 -11
  356. package/examples/saucedemo/src/stubs/device-showcase.ts +8 -10
  357. package/examples/saucedemo/tests/auto-graph.spec.ts +4 -12
  358. package/package.json +14 -6
  359. package/templates/agents/waygraph-planner.agent.md +2 -2
  360. package/templates/quickstart/docs/CONVENTION.md +4 -4
  361. package/templates/quickstart/docs/HELPERS.md +10 -8
  362. package/templates/quickstart/package.json +0 -3
  363. package/templates/quickstart/src/blocks/SITE-MAP.md +0 -1
  364. package/templates/quickstart/src/blocks/saucedemo-web/NAV.md +1 -5
  365. package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -3
  366. package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
  367. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
  368. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
  369. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
  370. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
  371. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +5 -8
  372. package/templates/quickstart/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -3
  373. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
  374. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +35 -43
  375. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
  376. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
  377. package/templates/quickstart/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
  378. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
  379. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
  380. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
  381. package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -4
  382. package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -4
  383. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +4 -5
  384. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
  385. package/templates/quickstart/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
  386. package/templates/quickstart/src/flows/api-demo.flow.ts +12 -10
  387. package/templates/quickstart/src/states/checkout.states.ts +21 -11
  388. package/templates/quickstart/src/stubs/device-showcase.ts +8 -10
  389. package/templates/scaffold/README.md +2 -1
  390. package/templates/scaffold/STRUCTURE.md +5 -4
  391. package/templates/scaffold/config/waygraph.config.ts +1 -0
  392. package/templates/scaffold/gitignore +1 -0
  393. package/templates/scaffold/src/flows/README.md +2 -2
  394. package/templates/scaffold/src/map/(app_base)/docs/_nav.block.ts +3 -3
  395. package/templates/scaffold/src/map/(app_base)/docs/_page.block.ts +3 -3
  396. package/templates/scaffold/src/map/(app_base)/home/_methods/add-item.effect.block.ts +4 -4
  397. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-hello.method.block.ts +3 -3
  398. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-item-added.method.block.ts +3 -3
  399. package/templates/scaffold/src/map/(app_base)/home/_methods/clear-cart.method.block.ts +5 -4
  400. package/templates/scaffold/src/map/(app_base)/home/_methods/remove-item.effect.block.ts +4 -4
  401. package/templates/scaffold/src/map/(app_base)/home/_nav.block.ts +3 -3
  402. package/templates/scaffold/src/map/(app_base)/home/_page.block.ts +3 -3
  403. package/templates/scaffold/src/map/(app_base)/home/nav-verification-link.block.ts +4 -4
  404. package/templates/scaffold/src/map/(external)/hoppscotch/_keys.ts +21 -0
  405. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-body.method.block.ts +4 -4
  406. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-header.method.block.ts +4 -4
  407. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-status.method.block.ts +4 -4
  408. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/pick-extension-interceptor.method.block.ts +5 -4
  409. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-body.method.block.ts +6 -5
  410. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-headers.method.block.ts +6 -5
  411. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/send-request.method.block.ts +5 -4
  412. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-bearer-token.method.block.ts +6 -5
  413. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-headers.method.block.ts +6 -5
  414. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-json-body.method.block.ts +6 -5
  415. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-method.method.block.ts +6 -5
  416. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-query-params.method.block.ts +6 -5
  417. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-url.method.block.ts +6 -5
  418. package/templates/scaffold/src/map/(external)/hoppscotch/_nav.block.ts +3 -3
  419. package/templates/scaffold/src/map/(external)/hoppscotch/_page.block.ts +3 -3
  420. package/templates/scaffold/src/map/(external)/hoppscotch/_states.ts +6 -0
  421. package/templates/scaffold/src/map/(external)/hoppscotch/settings/_nav.block.ts +3 -3
  422. package/templates/scaffold/src/map/(external)/mailpit/_keys.ts +13 -0
  423. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-content.method.block.ts +4 -4
  424. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-received.method.block.ts +4 -4
  425. package/templates/scaffold/src/map/(external)/mailpit/_methods/extract-email-link.method.block.ts +6 -5
  426. package/templates/scaffold/src/map/(external)/mailpit/_methods/open-message.method.block.ts +6 -5
  427. package/templates/scaffold/src/map/(external)/mailpit/_nav.block.ts +3 -3
  428. package/templates/scaffold/src/map/(external)/mailpit/_page.block.ts +3 -3
  429. package/templates/scaffold/src/map/(external)/mailpit/_states.ts +9 -0
  430. package/templates/scaffold/src/map/README.md +7 -0
  431. package/templates/scaffold/src/states/README.md +4 -1
  432. package/templates/scaffold/src/states/demo.mem-keys.ts +1 -29
  433. package/templates/scaffold/src/states/demo.states.ts +14 -20
  434. package/templates/scaffold/tests/hoppscotch.spec.ts +1 -11
  435. package/templates/scaffold/tests/mail-verify.spec.ts +2 -2
  436. package/templates/skills/waygraph-blind-pilot.skill.md +2 -6
  437. package/templates/skills/waygraph-convention.skill.md +23 -14
  438. package/templates/skills/waygraph-pilot.skill.md +7 -4
  439. package/dist/auto-session/session.d.ts +0 -193
  440. package/dist/auto-session/session.js +0 -719
  441. package/dist/auto-session/verbose-log.js +0 -16
  442. package/dist/auto-session.d.ts +0 -2
  443. package/dist/auto-session.js +0 -3
  444. package/dist/cli/discover.d.ts +0 -40
  445. package/dist/cli/discover.js +0 -148
  446. package/dist/commands/agent-dive.js +0 -52
  447. package/dist/commands/check.js +0 -192
  448. package/dist/commands/map.js +0 -29
  449. package/dist/commands/run.js +0 -104
  450. package/dist/commands/session.js +0 -600
  451. package/dist/commands/traverse.js +0 -177
  452. package/dist/core/block.d.ts +0 -109
  453. package/dist/core/blocks/effect.js +0 -23
  454. package/dist/core/config.js +0 -17
  455. package/dist/core/engine.d.ts +0 -198
  456. package/dist/core/flow.d.ts +0 -294
  457. package/dist/core/flow.js +0 -432
  458. package/dist/core/map-builder.js +0 -383
  459. package/dist/core.d.ts +0 -14
  460. package/dist/core.js +0 -15
  461. package/dist/highlights/merge.d.ts +0 -8
  462. package/dist/highlights/merge.js +0 -173
  463. package/dist/highlights/run-phase.d.ts +0 -43
  464. package/dist/highlights/stub-ctx.d.ts +0 -10
  465. package/dist/highlights/stub-ctx.js +0 -331
  466. package/dist/highlights/types.d.ts +0 -613
  467. package/dist/highlights.d.ts +0 -9
  468. package/dist/highlights.js +0 -10
  469. package/dist/pilot-overlay.d.ts +0 -5
  470. package/dist/pilot-overlay.js +0 -6
  471. package/dist/runner/banner-log.js +0 -63
  472. package/dist/runner/chain-run.js +0 -102
  473. package/dist/runner/cursor.js +0 -140
  474. package/dist/runner/demo-log.js +0 -316
  475. package/dist/runner/device-stage.d.ts +0 -9
  476. package/dist/runner/device-stage.js +0 -420
  477. package/dist/runner/discovery.js +0 -105
  478. package/dist/runner/index.js +0 -2
  479. package/dist/runner/inpage/banner.d.ts +0 -21
  480. package/dist/runner/inpage/banner.js +0 -156
  481. package/dist/runner/inpage/caption.d.ts +0 -3
  482. package/dist/runner/inpage/caption.js +0 -23
  483. package/dist/runner/inpage/core.d.ts +0 -4
  484. package/dist/runner/inpage/core.js +0 -316
  485. package/dist/runner/inpage/device.d.ts +0 -3
  486. package/dist/runner/inpage/device.js +0 -211
  487. package/dist/runner/inpage/network.d.ts +0 -15
  488. package/dist/runner/inpage/network.js +0 -217
  489. package/dist/runner/inpage/panel-chrome.js +0 -192
  490. package/dist/runner/inpage/stamp.js +0 -46
  491. package/dist/runner/inpage/swipe-zoom.js +0 -220
  492. package/dist/runner/inpage/todos.js +0 -337
  493. package/dist/runner/interaction-patch.js +0 -384
  494. package/dist/runner/main.js +0 -469
  495. package/dist/runner/network-capture.d.ts +0 -9
  496. package/dist/runner/network-capture.js +0 -126
  497. package/dist/runner/overlay-css.d.ts +0 -3
  498. package/dist/runner/overlay-css.js +0 -377
  499. package/dist/runner/overlay-install.js +0 -90
  500. package/dist/runner/overlay-stage.js +0 -110
  501. package/dist/runner/rings.js +0 -514
  502. package/dist/runner/seed-mem.js +0 -110
  503. package/dist/runner/slides.js +0 -278
  504. package/dist/runner/step-mode.js +0 -703
  505. package/dist/runner/step-panels.js +0 -729
  506. package/dist/runner/teardown.js +0 -202
  507. package/dist/runner/todo-dock.js +0 -142
  508. package/dist/session/auto-explore-run.d.ts +0 -40
  509. package/dist/session/auto-explore-run.js +0 -707
  510. package/dist/session/step-overlay.d.ts +0 -37
  511. package/dist/session/step-overlay.js +0 -244
  512. package/dist/traverse/run.js +0 -423
  513. package/examples/routed-demo/playwright.config.ts +0 -21
  514. package/examples/saucedemo/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
  515. package/templates/quickstart/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
  516. /package/dist/{commands → cli/commands}/agent-dive-scaffold.d.ts +0 -0
  517. /package/dist/{commands → cli/commands}/agent-dive.d.ts +0 -0
  518. /package/dist/{commands → cli/commands}/extensions.d.ts +0 -0
  519. /package/dist/{commands → cli/commands}/init.d.ts +0 -0
  520. /package/dist/{commands → cli/commands}/list.d.ts +0 -0
  521. /package/dist/{commands → cli/commands}/map.d.ts +0 -0
  522. /package/dist/{commands → cli/commands}/session.d.ts +0 -0
  523. /package/dist/{commands → cli/commands}/test.d.ts +0 -0
  524. /package/dist/{commands → cli/commands}/traverse.d.ts +0 -0
  525. /package/dist/{commands → cli/commands}/try.d.ts +0 -0
  526. /package/dist/{commands → cli/commands}/upgrade.d.ts +0 -0
  527. /package/dist/{highlights → demo/narration}/shorthand.js +0 -0
  528. /package/dist/{session/overlay-beacon.d.ts → demo/overlay/beacon.d.ts} +0 -0
  529. /package/dist/{session/overlay-beacon.js → demo/overlay/beacon.js} +0 -0
  530. /package/dist/{pilot-overlay/action-ring.d.ts → demo/overlay/pilot/actions.d.ts} +0 -0
  531. /package/dist/{ui → demo/overlay/ui}/components/ring.d.ts +0 -0
  532. /package/dist/{ui → demo/overlay/ui}/stylesheet.d.ts +0 -0
  533. /package/dist/{ui → demo/overlay/ui}/stylesheet.js +0 -0
  534. /package/dist/{ui → demo/overlay/ui}/tokens.d.ts +0 -0
  535. /package/dist/{ui → demo/overlay/ui}/tokens.js +0 -0
  536. /package/dist/{highlights → demo}/types.js +0 -0
  537. /package/dist/{auto-session → demo}/verbose-log.d.ts +0 -0
  538. /package/dist/{selector.d.ts → engine/trait/selector.d.ts} +0 -0
  539. /package/dist/{selector.js → engine/trait/selector.js} +0 -0
  540. /package/dist/{traverse → live/traverse}/coverage.d.ts +0 -0
  541. /package/dist/{traverse → live/traverse}/coverage.js +0 -0
  542. /package/dist/{traverse → live/traverse}/lease.d.ts +0 -0
  543. /package/dist/{traverse → live/traverse}/lease.js +0 -0
  544. /package/dist/{session/block-inject.d.ts → manifest/roots.d.ts} +0 -0
  545. /package/dist/{blocks-select.d.ts → manifest/select.d.ts} +0 -0
  546. /package/dist/{blocks-select.js → manifest/select.js} +0 -0
  547. /package/dist/{browser.d.ts → runtime/browser.d.ts} +0 -0
  548. /package/dist/{env-file.d.ts → runtime/env-file.d.ts} +0 -0
  549. /package/dist/{playwright-config.js → runtime/playwright-config.js} +0 -0
  550. /package/dist/{playwright.config.d.ts → runtime/playwright.config.d.ts} +0 -0
  551. /package/dist/{video-dir.d.ts → runtime/video-dir.d.ts} +0 -0
  552. /package/dist/{webserver.d.ts → runtime/webserver.d.ts} +0 -0
@@ -0,0 +1,162 @@
1
+ import type { Checkpoint } from "../checkpoint/checkpoint.js";
2
+ import type { RunGraphOptions } from "../run/run.js";
3
+ import type { EngineConfig } from "../config.js";
4
+ import type { BrowserContext, Page } from "@playwright/test";
5
+ import { MemPage } from "../mem/mem.js";
6
+ import type { Trait } from "../trait/trait.js";
7
+ import type { DemoPace } from "../stub/pace.js";
8
+ import type { HighlightStyleDefaults } from "../stub/ring.js";
9
+ import type { SomeBlock } from "../block/block.js";
10
+ /**
11
+ * A composed, runnable flow. Always begins from Checkpoint<"__start__">, same as
12
+ * runGraph's `entry`. `run(context, mem)` uses a context you already have (the
13
+ * usual case inside a `@playwright/test` file, via its `context` fixture) -
14
+ * there's no browser for this Flow to launch, so no config to pass. `run(mem,
15
+ * config?)` - no context - has the Engine launch and own its own browser for
16
+ * this one run instead, and closes it in `finally`; use this outside a
17
+ * Playwright test file, or when a flow genuinely needs its own browser instance
18
+ * rather than sharing the test's. `config` here overrides, per key, whatever
19
+ * `new Engine(...)` was constructed with - so one flow (module-level, imported
20
+ * by many specs) can still have every run choose its own `headless`/`slowMo`
21
+ * rather than being stuck with whatever the flow's own file happened to set.
22
+ *
23
+ * `withBlockVerify`/`modBlockVerify` do what {@link withVerify}/{@link modVerify}
24
+ * do for a single Block, one level up - a spec that only imports the finished
25
+ * Flow (not necessarily the individual Blocks it was built from) can still
26
+ * patch one Block's verify for just that call, without editing the flow's own
27
+ * file or hand-rebuilding its Block list. Addressed the same three ways
28
+ * `modVerify` already addresses a Trait - the Block reference itself
29
+ * (`LoginBlock`, imported like any other Block; typo-proof, refactor-safe,
30
+ * jump-to-definition works), a plain string name, or a numeric index into this
31
+ * Flow's Block list (position between `start`/`end`, 0-based) for a spec that
32
+ * genuinely doesn't have the Block imported and doesn't want to spell its
33
+ * name. A reference or string resolves by `.name` under the hood (a Block's
34
+ * own stable identity in this codebase, same as every error message elsewhere
35
+ * in this file already uses) rather than object identity - it stays
36
+ * resolvable even after an earlier patch already swapped that slot for a new
37
+ * object, since the name survives every `withVerify`/`modVerify` in the
38
+ * chain; an index is checked fresh against this Flow's current Block list
39
+ * each call, so it's still correct after a patch too. Returns a new Flow -
40
+ * the original is untouched, same as every other decorator in this module.
41
+ */
42
+ /**
43
+ * One Block's identity as exposed by graph introspection - {@link Flow.blocks},
44
+ * {@link ComposedBlock.steps} - without needing to execute anything. Does not
45
+ * include the Block's literal Checkpoint `In`/`Out` tags: those are TypeScript
46
+ * literal types, erased at runtime, and can only be recovered by a build-time
47
+ * static-analysis tool reading the source's own type annotations - see the
48
+ * `graph-visualization` openspec change for that piece.
49
+ */
50
+ export interface BlockInfo {
51
+ name: string;
52
+ /** `branch()`'s routing table, if this Block has one - see {@link Block.routes}. */
53
+ routes?: Readonly<Record<string, string | null>>;
54
+ /**
55
+ * True when a session-reset boundary runs immediately before this Block: the first Block of a sub-flow nested with
56
+ * `.flow(sub, { reset: true })` (or a CLI chain segment whose flow has `sessionReset`). Absent on an ordinary Flow.
57
+ */
58
+ resetSessionBefore?: boolean;
59
+ /**
60
+ * The actual Block, re-runnable on its own - e.g. step-through tooling that runs a Flow's Blocks one at a time.
61
+ * Introspection that only wants to read the shape (a visualizer) can ignore this and use `name`/`routes` alone.
62
+ */
63
+ block: SomeBlock;
64
+ }
65
+ /** A runnable chain of Blocks built by `engine.map()`. `run(mem)` launches its own browser; `run(context, mem)` reuses one. */
66
+ export interface Flow<Out extends Checkpoint<string>> {
67
+ /**
68
+ * `map({ sessionReset: true })`: this Flow wants a fresh browser session when it runs after another one (nested with
69
+ * `.flow(sub)` or chained on the CLI). `run()` itself never reads it.
70
+ */
71
+ readonly resetSession: boolean;
72
+ /** The engine config the Flow was built with (launcher, layouts); running one of its steps on its own uses it too. */
73
+ readonly config: EngineConfig;
74
+ /**
75
+ * `map({ expectedFailure })` - a display hint for a step-through overlay: this Flow is DESIGNED to throw
76
+ * (e.g. a blocked user's login attempt genuinely failing), not a bug in
77
+ * the demo itself. `run()` never reads this - the Flow still throws
78
+ * exactly as it would otherwise; only the overlay's error panel reads it,
79
+ * to show an informational "this is the point" panel instead of an
80
+ * alarming one indistinguishable from a real break.
81
+ */
82
+ readonly expectedFailureReason?: string;
83
+ /**
84
+ * Demo pacing for this Flow's episode (`map({ demoPace })`).
85
+ * `run()` ignores; step/demo applies per Block in the episode.
86
+ */
87
+ readonly demoPace?: import("../stub/pace.js").DemoPace;
88
+ /**
89
+ * Default highlight size/weight/tone for this Flow's episode (`map({ highlightStyle })`).
90
+ * Per-slot stub/fixture values win. `run()` ignores.
91
+ */
92
+ readonly highlightStyle?: import("../stub/ring.js").HighlightStyleDefaults;
93
+ /**
94
+ * `map({ memStub: true })` - opts into
95
+ * auto-filling `requires` keys with registered fake values
96
+ * (`registerMemStub`, `src/engine/mem/mem-stub.ts`) instead of failing preflight when
97
+ * the caller didn't supply them. `run()` never reads this - the CLI's own
98
+ * `--data`/`--mem-stub` seeding, or a bare-library caller's own explicit
99
+ * `seedMemStub(mem, flow)` call, is what actually fills mem before `run()`.
100
+ */
101
+ readonly memStub?: boolean;
102
+ /**
103
+ * This Flow's constituent Blocks, in order between `start`/`end`, as plain
104
+ * data - for introspection/visualization tools, without running anything.
105
+ * @example loginFlow.blocks() // [{ name: "login" }, { name: "add-to-cart", routes: {...} }]
106
+ */
107
+ blocks(): readonly BlockInfo[];
108
+ run(context: BrowserContext, mem: MemPage): Promise<Out>;
109
+ /**
110
+ * `options.closeOnFinish: false` hands the driven page back instead of
111
+ * closing it - use this overload (a literal `false`, not a `boolean`) to
112
+ * get the `{ result, page }` shape typed correctly.
113
+ * @example const { result, page } = await loginFlow.run(context, mem, { closeOnFinish: false });
114
+ */
115
+ run(context: BrowserContext, mem: MemPage, options: RunGraphOptions & {
116
+ closeOnFinish: false;
117
+ }): Promise<{
118
+ result: Out;
119
+ page: Page;
120
+ }>;
121
+ /**
122
+ * `options.page` drives that already-open page instead of opening a new
123
+ * one - see {@link RunGraphOptions}.
124
+ * @example await loginFlow.run(context, mem, { page: existingPage });
125
+ */
126
+ run(context: BrowserContext, mem: MemPage, options?: RunGraphOptions): Promise<Out>;
127
+ run(mem: MemPage, config?: EngineConfig): Promise<Out>;
128
+ /**
129
+ * Replaces the given Block's whole verify list, wherever it sits in this
130
+ * Flow - same rules as {@link withVerify}. Throws if no Block in this Flow
131
+ * matches.
132
+ * @example checkoutFlow.withBlockVerify(LoginBlock, [])
133
+ * @example checkoutFlow.withBlockVerify("login", [])
134
+ * @example checkoutFlow.withBlockVerify(0, [])
135
+ */
136
+ withBlockVerify(block: SomeBlock | string | number, verify: Trait[] | ((out: any) => Trait[])): Flow<Out>;
137
+ /**
138
+ * Replaces one Trait inside the given Block's verify list - same rules as
139
+ * {@link modVerify}. Throws if no Block in this Flow matches, or if that
140
+ * Block has no verify trait at the given name/index.
141
+ * @example checkoutFlow.modBlockVerify(LoginBlock, "url-matches", Trait.url({ pathname: "/inventory.html" }))
142
+ */
143
+ modBlockVerify(block: SomeBlock | string | number, nameOrIndex: string | number, newCheck: Trait["check"] | Trait): Flow<Out>;
144
+ }
145
+ export declare function buildFlow<Out extends Checkpoint<string>>(middle: readonly SomeBlock[], engineConfig: EngineConfig): Flow<Out>;
146
+ /** The settings `map({ ... })` gives a Flow. */
147
+ export interface FlowSettings {
148
+ memStub?: boolean;
149
+ sessionReset?: boolean;
150
+ expectedFailure?: string;
151
+ demoPace?: DemoPace;
152
+ highlightStyle?: HighlightStyleDefaults;
153
+ }
154
+ /** The Flow with its `map()` settings set; they survive `withBlockVerify`/`modBlockVerify` patches. */
155
+ export declare function withSettings<Out extends Checkpoint<string>>(flow: Flow<Out>, settings: FlowSettings): Flow<Out>;
156
+ export declare function clearSessionState(context: BrowserContext, page: Page): Promise<void>;
157
+ /**
158
+ * Runs whole Flows one after another on the same page, context and mem - the runner's way of executing a CLI chain
159
+ * (`waygraph run "a then b"`) with each segment still its own episode. A Flow with `resetSession` gets its cookies and
160
+ * storage cleared right before it runs (skipped for the first one). Authors nest flows with `map().flow(sub)` instead.
161
+ */
162
+ export declare function chainFlow(...flows: readonly Flow<Checkpoint<string>>[]): Flow<Checkpoint<string>>;
@@ -0,0 +1,244 @@
1
+ // A Flow: Blocks joined in order (connect), run as one with `run()`; map() builds them, with its settings (withSettings).
2
+ import { connect } from "../run/connect.js";
3
+ import { launchOwnContext } from "../run/launch.js";
4
+ import { WaygraphError, MSG_CHAINFLOW_BLOCK_NOT_FOUND_BY_INDEX, MSG_CHAINFLOW_BLOCK_NOT_FOUND_BY_NAME, MSG_CHAINFLOW_EMPTY, } from "../errors.js";
5
+ import { preflight, runGraph } from "../run/run.js";
6
+ import { MemPage } from "../mem/mem.js";
7
+ import { findBlockIndex, modVerify, withVerify } from "../block/block.js";
8
+ import { normalizeHighlightSize, normalizeHighlightTone, normalizeHighlightWeight } from "../stub/ring.js";
9
+ import { ignorePageGone } from "../page-gone.js";
10
+ export function buildFlow(middle, engineConfig) {
11
+ // Settings (sessionReset, memStub, ...) are added afterwards by withSettings, which re-applies them after any
12
+ // withBlockVerify/modBlockVerify patch so they survive.
13
+ // Layouts have to be threaded into every pairwise connect(), not just the
14
+ // trailing runGraph call - see connect()'s own doc comment in types.ts:
15
+ // buildFlow's reduce IS the only place a Flow's
16
+ // intermediate (non-final) Checkpoints are ever verified at all.
17
+ const chain = middle.reduce((a, b) => connect(a, b, engineConfig.layouts));
18
+ // Declared separately (not as the object-literal method below) so the
19
+ // three-overload `Flow.run` signature can be checked against the actual
20
+ // per-call-shape behavior, then attached with a cast - object-literal
21
+ // methods can't satisfy TS's per-overload implementation check the way a
22
+ // standalone function assigned to the property can.
23
+ const run = async function run(contextOrMem, memOrConfig, options) {
24
+ if (contextOrMem instanceof MemPage) {
25
+ const mem = contextOrMem;
26
+ const config = { ...engineConfig, ...memOrConfig };
27
+ // Checked again inside runGraph too, but doing it here first means a
28
+ // missing key fails before a browser process even launches, not just
29
+ // before a page opens - the same "fail loud, cheaply" guarantee
30
+ // run(context, mem) already has via an existing context.
31
+ preflight(mem, chain);
32
+ const { context, close } = await launchOwnContext(config);
33
+ try {
34
+ try {
35
+ return await runGraph(chain, undefined, context, mem, 5000, {
36
+ ...(config.layouts !== undefined ? { layouts: config.layouts } : {}),
37
+ });
38
+ }
39
+ finally {
40
+ // Playwright finalizes recordVideo on context.close(); skip when
41
+ // not recording so mem-only runs with stub contexts stay unchanged.
42
+ if (config.recordVideo) {
43
+ await context.close();
44
+ }
45
+ }
46
+ }
47
+ finally {
48
+ await close();
49
+ }
50
+ }
51
+ const context = contextOrMem;
52
+ const mem = memOrConfig;
53
+ // Open (or reuse) the page here, not inside runGraph, so this method -
54
+ // not runGraph - decides whether to close it once the run is over; the
55
+ // page reference has to survive past runGraph's own return either way.
56
+ const gotOwnPage = options?.page === undefined;
57
+ const page = options?.page ?? (await context.newPage());
58
+ // Defaulting close-on-finish to `true` unconditionally would close a
59
+ // page the *caller* opened and handed in via `options.page` - the exact
60
+ // thing this option exists to let a caller keep driving. Only default to
61
+ // closing when this call opened the page itself (no `options.page`
62
+ // given), which is the one case that matches every `run(context, mem)`
63
+ // call from before this option existed. An explicit `closeOnFinish`
64
+ // always wins either way.
65
+ const closeOnFinish = options?.closeOnFinish ?? gotOwnPage;
66
+ const resolvedLayouts = options?.layouts ?? engineConfig.layouts;
67
+ const result = await runGraph(chain, undefined, context, mem, 5000, {
68
+ page,
69
+ closeOnFinish: false,
70
+ ...(resolvedLayouts !== undefined ? { layouts: resolvedLayouts } : {}),
71
+ });
72
+ if (closeOnFinish) {
73
+ await page.close();
74
+ }
75
+ // The return *shape* only changes on an explicit `closeOnFinish: false`
76
+ // (the literal the `{ result, page }` overload is typed against) - not
77
+ // on the computed `closeOnFinish` default above. A caller who passed
78
+ // their own `page` and left `closeOnFinish` unset already holds that
79
+ // page reference; handing it back again in a different return shape
80
+ // would silently break the plain-`Out` overload their call actually
81
+ // matched at the type level.
82
+ if (options?.closeOnFinish === false) {
83
+ return { result, page };
84
+ }
85
+ return result;
86
+ };
87
+ return {
88
+ resetSession: false,
89
+ config: engineConfig,
90
+ blocks: () => middle.map((b) => ({
91
+ name: b.name,
92
+ block: b,
93
+ ...(b.routes ? { routes: b.routes } : {}),
94
+ ...(b.__waygraphResetBefore ? { resetSessionBefore: true } : {}),
95
+ })),
96
+ run: run,
97
+ withBlockVerify(block, verify) {
98
+ const index = findBlockIndex(middle, block);
99
+ const patched = [...middle];
100
+ patched[index] = withVerify(middle[index], verify);
101
+ return buildFlow(patched, engineConfig);
102
+ },
103
+ modBlockVerify(block, nameOrIndex, newCheck) {
104
+ const index = findBlockIndex(middle, block);
105
+ const patched = [...middle];
106
+ patched[index] = modVerify(middle[index], nameOrIndex, newCheck);
107
+ return buildFlow(patched, engineConfig);
108
+ },
109
+ };
110
+ }
111
+ /** The Flow with its `map()` settings set; they survive `withBlockVerify`/`modBlockVerify` patches. */
112
+ export function withSettings(flow, settings) {
113
+ const style = settings.highlightStyle;
114
+ const fields = {
115
+ ...(settings.sessionReset ? { resetSession: true } : {}),
116
+ ...(settings.memStub ? { memStub: true } : {}),
117
+ ...(settings.expectedFailure !== undefined ? { expectedFailureReason: settings.expectedFailure } : {}),
118
+ ...(settings.demoPace ? { demoPace: settings.demoPace } : {}),
119
+ ...(style
120
+ ? {
121
+ highlightStyle: {
122
+ ...(style.tone !== undefined ? { tone: normalizeHighlightTone(style.tone) } : {}),
123
+ ...(style.size !== undefined ? { size: normalizeHighlightSize(style.size) } : {}),
124
+ ...(style.weight !== undefined ? { weight: normalizeHighlightWeight(style.weight) } : {}),
125
+ },
126
+ }
127
+ : {}),
128
+ };
129
+ if (Object.keys(fields).length === 0)
130
+ return flow;
131
+ return {
132
+ ...flow,
133
+ ...fields,
134
+ withBlockVerify: (block, verify) => withSettings(flow.withBlockVerify(block, verify), settings),
135
+ modBlockVerify: (block, nameOrIndex, newCheck) => withSettings(flow.modBlockVerify(block, nameOrIndex, newCheck), settings),
136
+ };
137
+ }
138
+ function locateInChain(flows, block) {
139
+ if (typeof block === "number") {
140
+ let remaining = block;
141
+ for (let fi = 0; fi < flows.length; fi++) {
142
+ const len = flows[fi].blocks().length;
143
+ if (remaining < len)
144
+ return { flowIndex: fi, localIndex: remaining };
145
+ remaining -= len;
146
+ }
147
+ throw new WaygraphError("WG_FLOW_BLOCK_NOT_FOUND", MSG_CHAINFLOW_BLOCK_NOT_FOUND_BY_INDEX(block, flows.length));
148
+ }
149
+ const blockName = typeof block === "string" ? block : block.name;
150
+ for (let fi = 0; fi < flows.length; fi++) {
151
+ const localIndex = flows[fi].blocks().findIndex((bi) => bi.name === blockName);
152
+ if (localIndex !== -1)
153
+ return { flowIndex: fi, localIndex };
154
+ }
155
+ throw new WaygraphError("WG_FLOW_BLOCK_NOT_FOUND", MSG_CHAINFLOW_BLOCK_NOT_FOUND_BY_NAME(blockName));
156
+ }
157
+ export async function clearSessionState(context, page) {
158
+ await context.clearCookies().catch(ignorePageGone);
159
+ await page
160
+ .evaluate(() => {
161
+ try {
162
+ localStorage.clear();
163
+ sessionStorage.clear();
164
+ }
165
+ catch {
166
+ /* storage blocked (e.g. about:blank) - nothing to clear anyway */
167
+ }
168
+ })
169
+ .catch(ignorePageGone);
170
+ }
171
+ /**
172
+ * Runs whole Flows one after another on the same page, context and mem - the runner's way of executing a CLI chain
173
+ * (`waygraph run "a then b"`) with each segment still its own episode. A Flow with `resetSession` gets its cookies and
174
+ * storage cleared right before it runs (skipped for the first one). Authors nest flows with `map().flow(sub)` instead.
175
+ */
176
+ export function chainFlow(...flows) {
177
+ if (flows.length === 0) {
178
+ throw new WaygraphError("WG_CHAINFLOW_EMPTY", MSG_CHAINFLOW_EMPTY);
179
+ }
180
+ const run = async function run(contextOrMem, memOrConfig, options) {
181
+ if (contextOrMem instanceof MemPage) {
182
+ const mem = contextOrMem;
183
+ const config = memOrConfig;
184
+ // One browser for the WHOLE chain - each sub-flow's own run(mem,
185
+ // config) would otherwise each launch a separate browser, defeating
186
+ // the point of sequencing them (a fresh browser is itself a full
187
+ // session reset, silently making sessionReset a no-op).
188
+ const { context, close } = await launchOwnContext(config);
189
+ try {
190
+ try {
191
+ return await run(context, mem, { closeOnFinish: true });
192
+ }
193
+ finally {
194
+ await context.close();
195
+ }
196
+ }
197
+ finally {
198
+ await close();
199
+ }
200
+ }
201
+ const context = contextOrMem;
202
+ const mem = memOrConfig;
203
+ const gotOwnPage = options?.page === undefined;
204
+ const page = options?.page ?? (await context.newPage());
205
+ const closeOnFinish = options?.closeOnFinish ?? gotOwnPage;
206
+ let result;
207
+ for (let i = 0; i < flows.length; i++) {
208
+ const flow = flows[i];
209
+ if (i > 0 && flow.resetSession) {
210
+ await clearSessionState(context, page);
211
+ }
212
+ const outcome = (await flow.run(context, mem, { page, closeOnFinish: false }));
213
+ result = outcome.result;
214
+ }
215
+ if (closeOnFinish) {
216
+ await page.close();
217
+ }
218
+ if (options?.closeOnFinish === false) {
219
+ return { result, page };
220
+ }
221
+ return result;
222
+ };
223
+ return {
224
+ config: flows[0].config,
225
+ resetSession: false,
226
+ blocks: () => flows.flatMap((flow, idx) => flow.blocks().map((bi, i) => ({
227
+ ...bi,
228
+ ...(i === 0 && idx > 0 && flow.resetSession ? { resetSessionBefore: true } : {}),
229
+ }))),
230
+ run: run,
231
+ withBlockVerify(block, verify) {
232
+ const { flowIndex, localIndex } = locateInChain(flows, block);
233
+ const patched = [...flows];
234
+ patched[flowIndex] = patched[flowIndex].withBlockVerify(localIndex, verify);
235
+ return chainFlow(...patched);
236
+ },
237
+ modBlockVerify(block, nameOrIndex, newCheck) {
238
+ const { flowIndex, localIndex } = locateInChain(flows, block);
239
+ const patched = [...flows];
240
+ patched[flowIndex] = patched[flowIndex].modBlockVerify(localIndex, nameOrIndex, newCheck);
241
+ return chainFlow(...patched);
242
+ },
243
+ };
244
+ }
@@ -0,0 +1,9 @@
1
+ import type { Checkpoint } from "../checkpoint/checkpoint.js";
2
+ import type { Flow } from "./flow.js";
3
+ /**
4
+ * Builds the `Flow` object `MapBuilder.branch()` returns: run `before`, then dispatch on the
5
+ * resolved tag into whichever `routes` entry matches (same page/context/mem), or return that
6
+ * Checkpoint as-is when its route is `null`. Factored out so `withBlockVerify`/`modBlockVerify`
7
+ * can patch `before` and rebuild the same branched shape, exactly like a plain Flow's own.
8
+ */
9
+ export declare function buildBranchedFlow<Out extends Checkpoint<string>>(before: Flow<Out>, routes: Record<string, Flow<Checkpoint<string>> | null>): Flow<Checkpoint<string>>;
@@ -0,0 +1,57 @@
1
+ import { MSG_MAP_BRANCH_SHARED_SESSION_UNSUPPORTED, WaygraphError } from "../errors.js";
2
+ import { MemPage } from "../mem/mem.js";
3
+ /**
4
+ * Builds the `Flow` object `MapBuilder.branch()` returns: run `before`, then dispatch on the
5
+ * resolved tag into whichever `routes` entry matches (same page/context/mem), or return that
6
+ * Checkpoint as-is when its route is `null`. Factored out so `withBlockVerify`/`modBlockVerify`
7
+ * can patch `before` and rebuild the same branched shape, exactly like a plain Flow's own.
8
+ */
9
+ export function buildBranchedFlow(before, routes) {
10
+ const run = (async (contextOrMem, memOrConfig, options) => {
11
+ if (contextOrMem instanceof MemPage) {
12
+ throw new WaygraphError("WG_MAP_BRANCH_SHARED_SESSION_UNSUPPORTED", MSG_MAP_BRANCH_SHARED_SESSION_UNSUPPORTED);
13
+ }
14
+ const context = contextOrMem;
15
+ const mem = memOrConfig;
16
+ const gotOwnPage = options?.page === undefined;
17
+ const page = options?.page ?? (await context.newPage());
18
+ const closeOnFinish = options?.closeOnFinish ?? gotOwnPage;
19
+ const first = (await before.run(context, mem, { ...options, page, closeOnFinish: false }));
20
+ const branchFlow = routes[first.result.__state];
21
+ if (!branchFlow) {
22
+ if (options?.closeOnFinish === false)
23
+ return { result: first.result, page: first.page };
24
+ if (closeOnFinish)
25
+ await first.page.close();
26
+ return first.result;
27
+ }
28
+ return branchFlow.run(context, mem, { ...options, page: first.page, closeOnFinish });
29
+ });
30
+ return {
31
+ resetSession: before.resetSession,
32
+ config: before.config,
33
+ ...(before.expectedFailureReason !== undefined ? { expectedFailureReason: before.expectedFailureReason } : {}),
34
+ ...(before.demoPace !== undefined ? { demoPace: before.demoPace } : {}),
35
+ ...(before.highlightStyle !== undefined ? { highlightStyle: before.highlightStyle } : {}),
36
+ ...(before.memStub !== undefined ? { memStub: before.memStub } : {}),
37
+ // Read by branchRoutes()/branchInfo() (branch-regression.ts) - real, ORDINARY (enumerable)
38
+ // properties, not hidden ones, specifically so a `{ ...flow, ... }` spread (withSettings) carries them
39
+ // through instead of silently dropping them -
40
+ // the same class of bug branch()'s missing copyWaygraphRuntime call already was.
41
+ __wgBranch: { before, routes },
42
+ // Static introspection (`waygraph graph`/list): the fixed prefix, plus every branch's own
43
+ // Blocks prefixed by the tag that leads to them - can't know at analysis time which one a real
44
+ // run takes, so this shows all of them rather than none.
45
+ blocks: () => [
46
+ ...before.blocks(),
47
+ ...Object.entries(routes).flatMap(([tag, f]) => f ? f.blocks().map((b) => ({ ...b, name: `${tag} -> ${b.name}` })) : []),
48
+ ],
49
+ run,
50
+ withBlockVerify(block, verify) {
51
+ return buildBranchedFlow(before.withBlockVerify(block, verify), routes);
52
+ },
53
+ modBlockVerify(block, nameOrIndex, newCheck) {
54
+ return buildBranchedFlow(before.modBlockVerify(block, nameOrIndex, newCheck), routes);
55
+ },
56
+ };
57
+ }