waygraph 0.15.53 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (556) hide show
  1. package/README.md +8 -3
  2. package/bin/waygraph +2 -2
  3. package/dist/analysis/check.d.ts +38 -0
  4. package/dist/analysis/check.js +87 -0
  5. package/dist/analysis/coverage-gap.d.ts +1 -1
  6. package/dist/analysis/coverage-gap.js +14 -37
  7. package/dist/analysis/flow-source.d.ts +9 -0
  8. package/dist/analysis/flow-source.js +25 -0
  9. package/dist/analysis/graph.d.ts +13 -14
  10. package/dist/analysis/graph.js +48 -371
  11. package/dist/analysis/map-check.js +4 -39
  12. package/dist/analysis/practices-check.d.ts +1 -1
  13. package/dist/analysis/practices-check.js +24 -45
  14. package/dist/cli/args.d.ts +23 -0
  15. package/dist/cli/args.js +20 -0
  16. package/dist/{cli.d.ts → cli/cli.d.ts} +0 -1
  17. package/dist/{cli.js → cli/cli.js} +10 -9
  18. package/dist/{commands → cli/commands}/agent-dive-scaffold.js +35 -64
  19. package/dist/cli/commands/agent-dive.js +42 -0
  20. package/dist/{commands → cli/commands}/check.d.ts +0 -1
  21. package/dist/cli/commands/check.js +104 -0
  22. package/dist/cli/commands/codemod-checkpoints.d.ts +18 -0
  23. package/dist/cli/commands/codemod-checkpoints.js +186 -0
  24. package/dist/cli/commands/codemod-flows.d.ts +18 -0
  25. package/dist/cli/commands/codemod-flows.js +284 -0
  26. package/dist/cli/commands/codemod-stubs.d.ts +10 -0
  27. package/dist/cli/commands/codemod-stubs.js +187 -0
  28. package/dist/{commands → cli/commands}/extensions.js +5 -4
  29. package/dist/{commands → cli/commands}/init.js +1 -2
  30. package/dist/{commands → cli/commands}/list.js +9 -7
  31. package/dist/cli/commands/manifest.d.ts +2 -0
  32. package/dist/cli/commands/manifest.js +20 -0
  33. package/dist/cli/commands/map.js +57 -0
  34. package/dist/{commands → cli/commands}/run.d.ts +0 -1
  35. package/dist/cli/commands/run.js +64 -0
  36. package/dist/{commands → cli/commands}/session.js +61 -88
  37. package/dist/{commands → cli/commands}/test.js +11 -14
  38. package/dist/cli/commands/traverse.js +105 -0
  39. package/dist/{commands → cli/commands}/try.js +29 -25
  40. package/dist/{commands → cli/commands}/upgrade.js +40 -4
  41. package/dist/cli/flags.d.ts +193 -16
  42. package/dist/cli/flags.js +179 -234
  43. package/dist/cli/run-chain.d.ts +1 -0
  44. package/dist/cli/run-chain.js +42 -7
  45. package/dist/cli/usage.d.ts +1 -1
  46. package/dist/cli/usage.js +21 -53
  47. package/dist/cli/util.d.ts +2 -2
  48. package/dist/cli/util.js +2 -3
  49. package/dist/{highlights → demo/narration}/css.d.ts +1 -1
  50. package/dist/{highlights → demo/narration}/css.js +2 -3
  51. package/dist/{highlights → demo/narration}/demo-pace.d.ts +7 -11
  52. package/dist/{highlights → demo/narration}/demo-pace.js +9 -11
  53. package/dist/{highlights → demo/narration}/device.d.ts +4 -2
  54. package/dist/{highlights → demo/narration}/device.js +3 -1
  55. package/dist/demo/narration/merge.d.ts +8 -0
  56. package/dist/demo/narration/merge.js +71 -0
  57. package/dist/{highlights/run-phase.d.ts → demo/narration/narration.d.ts} +10 -14
  58. package/dist/{highlights/run-phase.js → demo/narration/narration.js} +25 -94
  59. package/dist/{highlights → demo/narration}/shorthand.d.ts +1 -1
  60. package/dist/demo/narration/stub-ctx.d.ts +8 -0
  61. package/dist/demo/narration/stub-ctx.js +164 -0
  62. package/dist/{highlights → demo/narration}/style.d.ts +1 -7
  63. package/dist/{highlights → demo/narration}/style.js +1 -41
  64. package/dist/{highlights → demo/narration}/todo-dock.d.ts +3 -3
  65. package/dist/{highlights → demo/narration}/todo-dock.js +13 -30
  66. package/dist/demo/overlay/auto-chrome.d.ts +7 -0
  67. package/dist/demo/overlay/auto-chrome.js +97 -0
  68. package/dist/{session/overlay-beacon.d.ts → demo/overlay/beacon.d.ts} +7 -0
  69. package/dist/{session/overlay-beacon.js → demo/overlay/beacon.js} +5 -0
  70. package/dist/demo/overlay/cursor.d.ts +12 -0
  71. package/dist/demo/overlay/cursor.js +142 -0
  72. package/dist/demo/overlay/device-stage.d.ts +13 -0
  73. package/dist/demo/overlay/device-stage.js +396 -0
  74. package/dist/demo/overlay/inpage/banner.d.ts +1 -0
  75. package/dist/demo/overlay/inpage/banner.js +160 -0
  76. package/dist/demo/overlay/inpage/caption.d.ts +2 -0
  77. package/dist/demo/overlay/inpage/caption.js +24 -0
  78. package/dist/demo/overlay/inpage/core.d.ts +1 -0
  79. package/dist/demo/overlay/inpage/core.js +345 -0
  80. package/dist/demo/overlay/inpage/device-chip.d.ts +1 -0
  81. package/dist/demo/overlay/inpage/device-chip.js +191 -0
  82. package/dist/demo/overlay/inpage/network.d.ts +9 -0
  83. package/dist/demo/overlay/inpage/network.js +200 -0
  84. package/dist/demo/overlay/inpage/panel-chrome.d.ts +1 -0
  85. package/dist/demo/overlay/inpage/panel-chrome.js +203 -0
  86. package/dist/demo/overlay/inpage/stamp.d.ts +1 -0
  87. package/dist/demo/overlay/inpage/stamp.js +46 -0
  88. package/dist/demo/overlay/inpage/swipe-zoom.d.ts +1 -0
  89. package/dist/demo/overlay/inpage/swipe-zoom.js +220 -0
  90. package/dist/demo/overlay/inpage/todos.d.ts +1 -0
  91. package/dist/demo/overlay/inpage/todos.js +294 -0
  92. package/dist/demo/overlay/locator-theater.d.ts +25 -0
  93. package/dist/demo/overlay/locator-theater.js +76 -0
  94. package/dist/demo/overlay/network-capture.d.ts +22 -0
  95. package/dist/demo/overlay/network-capture.js +127 -0
  96. package/dist/demo/overlay/overlay-css.d.ts +3 -0
  97. package/dist/demo/overlay/overlay-css.js +369 -0
  98. package/dist/demo/overlay/overlay-stage.d.ts +23 -0
  99. package/dist/demo/overlay/overlay-stage.js +106 -0
  100. package/dist/demo/overlay/overlay.d.ts +10 -0
  101. package/dist/demo/overlay/overlay.js +89 -0
  102. package/dist/{pilot-overlay/overlay-fixtures.d.ts → demo/overlay/phase-fixtures.d.ts} +2 -2
  103. package/dist/{pilot-overlay/overlay-fixtures.js → demo/overlay/phase-fixtures.js} +2 -2
  104. package/dist/{pilot-overlay/action-ring.js → demo/overlay/pilot/actions.js} +2 -1
  105. package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.d.ts +6 -5
  106. package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.js +19 -18
  107. package/dist/{pilot-overlay → demo/overlay/pilot}/shell.d.ts +2 -2
  108. package/dist/{pilot-overlay → demo/overlay/pilot}/shell.js +13 -22
  109. package/dist/demo/overlay/reattach.d.ts +7 -0
  110. package/dist/demo/overlay/reattach.js +23 -0
  111. package/dist/demo/overlay/rings.d.ts +33 -0
  112. package/dist/demo/overlay/rings.js +448 -0
  113. package/dist/{ui → demo/overlay/ui}/components/ring.js +2 -2
  114. package/dist/{ui → demo/overlay/ui}/overlay.css +4 -4
  115. package/dist/{ui → demo/overlay/ui}/shadow.d.ts +1 -1
  116. package/dist/{ui → demo/overlay/ui}/shadow.js +39 -2
  117. package/dist/demo/stepper/after.d.ts +3 -0
  118. package/dist/demo/stepper/after.js +113 -0
  119. package/dist/demo/stepper/banner-log.d.ts +37 -0
  120. package/dist/demo/stepper/banner-log.js +63 -0
  121. package/dist/demo/stepper/before.d.ts +4 -0
  122. package/dist/demo/stepper/before.js +110 -0
  123. package/dist/demo/stepper/demo-log.d.ts +31 -0
  124. package/dist/demo/stepper/demo-log.js +309 -0
  125. package/dist/demo/stepper/gate.d.ts +11 -0
  126. package/dist/demo/stepper/gate.js +78 -0
  127. package/dist/demo/stepper/interaction-patch.d.ts +3 -0
  128. package/dist/demo/stepper/interaction-patch.js +323 -0
  129. package/dist/demo/stepper/pacing.d.ts +21 -0
  130. package/dist/demo/stepper/pacing.js +23 -0
  131. package/dist/demo/stepper/slides.d.ts +11 -0
  132. package/dist/demo/stepper/slides.js +233 -0
  133. package/dist/demo/stepper/step-panels.d.ts +21 -0
  134. package/dist/demo/stepper/step-panels.js +589 -0
  135. package/dist/demo/stepper/stepper.d.ts +24 -0
  136. package/dist/demo/stepper/stepper.js +122 -0
  137. package/dist/demo/stepper/teardown.d.ts +48 -0
  138. package/dist/demo/stepper/teardown.js +179 -0
  139. package/dist/demo/stepper/todo-advance.d.ts +14 -0
  140. package/dist/demo/stepper/todo-advance.js +110 -0
  141. package/dist/demo/stepper/view.d.ts +68 -0
  142. package/dist/demo/stepper/view.js +31 -0
  143. package/dist/demo/types.d.ts +17 -0
  144. package/dist/demo/verbose-log.js +15 -0
  145. package/dist/{types.d.ts → engine/block/block.d.ts} +106 -91
  146. package/dist/{core → engine/block}/block.js +10 -53
  147. package/dist/{core → engine/block}/compose.d.ts +10 -7
  148. package/dist/{core → engine/block}/compose.js +1 -1
  149. package/dist/{core/blocks → engine/block/kinds}/api.d.ts +17 -12
  150. package/dist/{core/blocks → engine/block/kinds}/api.js +26 -18
  151. package/dist/{core/blocks → engine/block/kinds}/effect.d.ts +13 -18
  152. package/dist/engine/block/kinds/effect.js +17 -0
  153. package/dist/{core/blocks → engine/block/kinds}/method.d.ts +19 -29
  154. package/dist/{core/blocks → engine/block/kinds}/method.js +7 -21
  155. package/dist/{core/blocks → engine/block/kinds}/nav.d.ts +22 -31
  156. package/dist/{core/blocks → engine/block/kinds}/nav.js +6 -12
  157. package/dist/{core/blocks → engine/block/kinds}/page.d.ts +15 -20
  158. package/dist/{core/blocks → engine/block/kinds}/page.js +5 -7
  159. package/dist/engine/checkpoint/checkpoint.d.ts +22 -0
  160. package/dist/engine/checkpoint/checkpoint.js +8 -0
  161. package/dist/engine/checkpoint/route.d.ts +28 -0
  162. package/dist/engine/checkpoint/route.js +28 -0
  163. package/dist/{core → engine}/config.d.ts +7 -2
  164. package/dist/engine/config.js +6 -0
  165. package/dist/engine/engine.d.ts +45 -0
  166. package/dist/{core → engine}/engine.js +6 -10
  167. package/dist/engine/env.d.ts +59 -0
  168. package/dist/engine/env.js +83 -0
  169. package/dist/{errors.d.ts → engine/errors.d.ts} +23 -22
  170. package/dist/{errors.js → engine/errors.js} +22 -22
  171. package/dist/{core → engine/flow}/branch-regression.d.ts +8 -7
  172. package/dist/{core → engine/flow}/branch-regression.js +4 -3
  173. package/dist/engine/flow/flow.d.ts +162 -0
  174. package/dist/engine/flow/flow.js +244 -0
  175. package/dist/{core → engine/flow}/map-builder.d.ts +42 -40
  176. package/dist/{core → engine/flow}/map-builder.js +46 -48
  177. package/dist/{core → engine}/locate.d.ts +1 -1
  178. package/dist/{core → engine}/locate.js +1 -2
  179. package/dist/{mem-stub.d.ts → engine/mem/mem-stub.d.ts} +9 -8
  180. package/dist/{mem-stub.js → engine/mem/mem-stub.js} +2 -2
  181. package/dist/{mem-page.d.ts → engine/mem/mem.d.ts} +1 -1
  182. package/dist/{mem-page.js → engine/mem/mem.js} +2 -1
  183. package/dist/engine/page-gone.d.ts +5 -0
  184. package/dist/engine/page-gone.js +20 -0
  185. package/dist/engine/run/connect.d.ts +28 -0
  186. package/dist/{types.js → engine/run/connect.js} +11 -10
  187. package/dist/engine/run/events.d.ts +67 -0
  188. package/dist/engine/run/events.js +90 -0
  189. package/dist/engine/run/hooks.d.ts +16 -0
  190. package/dist/engine/run/hooks.js +8 -0
  191. package/dist/engine/run/launch.d.ts +13 -0
  192. package/dist/engine/run/launch.js +27 -0
  193. package/dist/{core/run-graph.d.ts → engine/run/run.d.ts} +9 -11
  194. package/dist/{core/run-graph.js → engine/run/run.js} +22 -11
  195. package/dist/engine/stub/pace.d.ts +12 -0
  196. package/dist/engine/stub/pace.js +2 -0
  197. package/dist/engine/stub/ring.d.ts +130 -0
  198. package/dist/engine/stub/ring.js +41 -0
  199. package/dist/engine/stub/stub.d.ts +268 -0
  200. package/dist/engine/stub/stub.js +1 -0
  201. package/dist/engine/stub/todos.d.ts +104 -0
  202. package/dist/engine/stub/todos.js +2 -0
  203. package/dist/engine/stub/viewport.d.ts +26 -0
  204. package/dist/engine/stub/viewport.js +2 -0
  205. package/dist/{trait.d.ts → engine/trait/trait.d.ts} +1 -1
  206. package/dist/index.d.ts +84 -36
  207. package/dist/index.js +44 -19
  208. package/dist/{session/auto-explore-run.d.ts → live/auto/auto.d.ts} +10 -16
  209. package/dist/{session/auto-explore-run.js → live/auto/auto.js} +164 -248
  210. package/dist/{session/auto-explore.d.ts → live/auto/explore.d.ts} +4 -14
  211. package/dist/{session/auto-explore.js → live/auto/explore.js} +21 -127
  212. package/dist/{auto-session/session.d.ts → live/auto-session/auto-session.d.ts} +1 -1
  213. package/dist/{auto-session/session.js → live/auto-session/auto-session.js} +27 -24
  214. package/dist/{auto-session → live/auto-session}/helpers.d.ts +16 -5
  215. package/dist/{auto-session → live/auto-session}/helpers.js +1 -1
  216. package/dist/{session/auto-session-ipc.d.ts → live/auto-session/ipc.d.ts} +7 -5
  217. package/dist/{session/auto-session-ipc.js → live/auto-session/ipc.js} +31 -16
  218. package/dist/{session/browser.d.ts → live/auto-session/start.d.ts} +1 -2
  219. package/dist/{session/browser.js → live/auto-session/start.js} +2 -3
  220. package/dist/{pilot-overlay → live/pilot}/panel.d.ts +1 -1
  221. package/dist/{pilot-overlay → live/pilot}/panel.js +23 -31
  222. package/dist/{session → live/pilot}/pilot.d.ts +4 -3
  223. package/dist/{session → live/pilot}/pilot.js +4 -4
  224. package/dist/{traverse → live/traverse}/coverage.d.ts +4 -0
  225. package/dist/{traverse → live/traverse}/coverage.js +3 -0
  226. package/dist/{traverse → live/traverse}/lease.d.ts +1 -0
  227. package/dist/{traverse → live/traverse}/lease.js +1 -0
  228. package/dist/{traverse/run.d.ts → live/traverse/traverse.d.ts} +4 -1
  229. package/dist/{traverse/run.js → live/traverse/traverse.js} +26 -43
  230. package/dist/manifest/manifest.d.ts +52 -0
  231. package/dist/manifest/manifest.js +93 -0
  232. package/dist/manifest/map-imports.d.ts +7 -0
  233. package/dist/manifest/map-imports.js +22 -0
  234. package/dist/manifest/maps.d.ts +33 -0
  235. package/dist/manifest/maps.js +62 -0
  236. package/dist/manifest/pack.d.ts +21 -0
  237. package/dist/manifest/pack.js +109 -0
  238. package/dist/manifest/project.d.ts +60 -0
  239. package/dist/manifest/project.js +101 -0
  240. package/dist/{session/block-inject.js → manifest/roots.js} +1 -18
  241. package/dist/manifest/scan.d.ts +19 -0
  242. package/dist/manifest/scan.js +57 -0
  243. package/dist/{blocks-select.d.ts → manifest/select.d.ts} +3 -0
  244. package/dist/{blocks-select.js → manifest/select.js} +2 -0
  245. package/dist/manifest/source.d.ts +23 -0
  246. package/dist/manifest/source.js +86 -0
  247. package/dist/runner/mode.d.ts +71 -0
  248. package/dist/runner/mode.js +1 -0
  249. package/dist/runner/modes/branches.d.ts +5 -0
  250. package/dist/runner/modes/branches.js +37 -0
  251. package/dist/runner/modes/demo.d.ts +3 -0
  252. package/dist/runner/modes/demo.js +13 -0
  253. package/dist/runner/modes/report.d.ts +2 -0
  254. package/dist/runner/modes/report.js +54 -0
  255. package/dist/runner/modes/run.d.ts +2 -0
  256. package/dist/runner/modes/run.js +3 -0
  257. package/dist/runner/options.d.ts +31 -0
  258. package/dist/runner/options.js +42 -0
  259. package/dist/runner/plan/find.d.ts +18 -0
  260. package/dist/runner/plan/find.js +65 -0
  261. package/dist/runner/plan/plan.d.ts +11 -0
  262. package/dist/runner/plan/plan.js +97 -0
  263. package/dist/runner/plan/seed-mem.d.ts +12 -0
  264. package/dist/runner/plan/seed-mem.js +98 -0
  265. package/dist/runner/plan/spec.d.ts +5 -0
  266. package/dist/runner/plan/spec.js +17 -0
  267. package/dist/runner/play-steps.d.ts +2 -0
  268. package/dist/runner/play-steps.js +59 -0
  269. package/dist/runner/runner.d.ts +4 -0
  270. package/dist/runner/runner.js +64 -0
  271. package/dist/runner/session.d.ts +9 -0
  272. package/dist/runner/session.js +87 -0
  273. package/dist/{browser.js → runtime/browser.js} +4 -2
  274. package/dist/{env-file.js → runtime/env-file.js} +7 -12
  275. package/dist/{extensions.d.ts → runtime/extensions.d.ts} +2 -5
  276. package/dist/{extensions.js → runtime/extensions.js} +3 -1
  277. package/dist/runtime/full-launch.d.ts +1 -0
  278. package/dist/runtime/full-launch.js +34 -0
  279. package/dist/runtime/global-flag.d.ts +5 -0
  280. package/dist/runtime/global-flag.js +18 -0
  281. package/dist/{playwright-config.d.ts → runtime/playwright-config.d.ts} +1 -1
  282. package/dist/{playwright.config.js → runtime/playwright.config.js} +3 -2
  283. package/dist/runtime/run-log.d.ts +2 -0
  284. package/dist/runtime/run-log.js +17 -0
  285. package/dist/{video-dir.js → runtime/video-dir.js} +3 -2
  286. package/dist/{config.d.ts → runtime/waygraph-config.d.ts} +8 -9
  287. package/dist/{config.js → runtime/waygraph-config.js} +21 -51
  288. package/dist/{webserver.js → runtime/webserver.js} +5 -30
  289. package/examples/routed-demo/config/waygraph.config.ts +20 -0
  290. package/examples/routed-demo/package.json +1 -4
  291. package/examples/routed-demo/scripts/fixture-server.mjs +1 -1
  292. package/examples/routed-demo/src/flows/routed-demo-map.flow.ts +2 -4
  293. package/examples/routed-demo/src/flows/routed-demo.flow.ts +2 -3
  294. package/examples/routed-demo/src/map/(app_base)/dashboard/_methods/click-widget.block.ts +5 -4
  295. package/examples/routed-demo/src/map/(app_base)/dashboard/_nav.block.ts +3 -3
  296. package/examples/routed-demo/src/map/(app_base)/dashboard/_page.block.ts +3 -3
  297. package/examples/routed-demo/src/map/(external)/docs/_nav.block.ts +3 -3
  298. package/examples/routed-demo/src/map/(external)/docs/_page.block.ts +3 -3
  299. package/examples/routed-demo/src/states/routed-demo.states.ts +5 -3
  300. package/examples/routed-demo/tests/routed-demo.spec.ts +4 -4
  301. package/examples/routed-demo/tsconfig.json +1 -1
  302. package/examples/saucedemo/README.md +11 -12
  303. package/examples/saucedemo/config/waygraph.config.ts +17 -0
  304. package/examples/saucedemo/docs/CONVENTION.md +5 -7
  305. package/examples/saucedemo/docs/HELPERS.md +12 -12
  306. package/examples/saucedemo/package-lock.json +10 -3
  307. package/examples/saucedemo/package.json +12 -29
  308. package/examples/saucedemo/src/blocks/SITE-MAP.md +0 -1
  309. package/examples/saucedemo/src/blocks/saucedemo-web/NAV.md +1 -5
  310. package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -52
  311. package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
  312. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
  313. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
  314. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
  315. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
  316. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +21 -27
  317. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -9
  318. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
  319. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +10 -76
  320. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
  321. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
  322. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
  323. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
  324. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
  325. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
  326. package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -29
  327. package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -48
  328. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +13 -77
  329. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
  330. package/examples/saucedemo/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
  331. package/examples/saucedemo/src/flows/api-demo.flow.ts +26 -18
  332. package/examples/saucedemo/src/flows/cart-bulk.flow.ts +19 -14
  333. package/examples/saucedemo/src/flows/cart-continue.flow.ts +10 -8
  334. package/examples/saucedemo/src/flows/cart-mem.flow.ts +7 -7
  335. package/examples/saucedemo/src/flows/catalog-logout.flow.ts +13 -8
  336. package/examples/saucedemo/src/flows/checkout-then-browse-again.flow.ts +26 -48
  337. package/examples/saucedemo/src/flows/checkout.flow.ts +70 -86
  338. package/examples/saucedemo/src/flows/device-showcase.flow.ts +24 -25
  339. package/examples/saucedemo/src/flows/login.flow.ts +11 -18
  340. package/examples/saucedemo/src/flows/mem-stub-demo.flow.ts +9 -20
  341. package/examples/saucedemo/src/flows/shop.flow.ts +15 -20
  342. package/examples/saucedemo/src/flows/smoke.flow.ts +12 -27
  343. package/examples/saucedemo/src/flows/stub-on-error.flow.ts +24 -43
  344. package/examples/saucedemo/src/flows/viewer-blocked.flow.ts +26 -34
  345. package/examples/saucedemo/src/states/checkout.mem-stubs.ts +11 -0
  346. package/examples/saucedemo/src/states/checkout.states.ts +21 -11
  347. package/examples/saucedemo/src/stubs/device-showcase.ts +191 -0
  348. package/examples/saucedemo/src/stubs/login.ts +37 -0
  349. package/examples/saucedemo/tests/auto-graph.spec.ts +4 -12
  350. package/examples/saucedemo/tests/chain-flow-episodes.spec.ts +7 -9
  351. package/examples/saucedemo/tests/submit-login-branch.spec.ts +18 -5
  352. package/package.json +12 -7
  353. package/templates/agents/waygraph-planner.agent.md +2 -2
  354. package/templates/quickstart/README.md +4 -7
  355. package/templates/quickstart/config/waygraph.config.ts +17 -0
  356. package/templates/quickstart/docs/CONVENTION.md +5 -6
  357. package/templates/quickstart/docs/HELPERS.md +11 -9
  358. package/templates/quickstart/package.json +14 -17
  359. package/templates/quickstart/src/blocks/SITE-MAP.md +13 -3
  360. package/templates/quickstart/src/blocks/saucedemo-web/NAV.md +1 -5
  361. package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -52
  362. package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
  363. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
  364. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
  365. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
  366. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
  367. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +21 -27
  368. package/templates/quickstart/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -9
  369. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
  370. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +10 -76
  371. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
  372. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
  373. package/templates/quickstart/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
  374. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
  375. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
  376. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
  377. package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -29
  378. package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -48
  379. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +13 -77
  380. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
  381. package/templates/quickstart/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
  382. package/templates/quickstart/src/flows/api-demo.flow.ts +45 -0
  383. package/templates/quickstart/src/flows/cart-bulk.flow.ts +19 -14
  384. package/templates/quickstart/src/flows/cart-continue.flow.ts +10 -8
  385. package/templates/quickstart/src/flows/cart-mem.flow.ts +7 -7
  386. package/templates/quickstart/src/flows/catalog-logout.flow.ts +13 -8
  387. package/templates/quickstart/src/flows/checkout-then-browse-again.flow.ts +26 -48
  388. package/templates/quickstart/src/flows/checkout.flow.ts +70 -63
  389. package/templates/quickstart/src/flows/device-showcase.flow.ts +24 -25
  390. package/templates/quickstart/src/flows/login.flow.ts +11 -18
  391. package/templates/quickstart/src/flows/mem-stub-demo.flow.ts +12 -0
  392. package/templates/quickstart/src/flows/shop.flow.ts +15 -20
  393. package/templates/quickstart/src/flows/smoke.flow.ts +12 -27
  394. package/templates/quickstart/src/flows/stub-on-error.flow.ts +31 -0
  395. package/templates/quickstart/src/flows/viewer-blocked.flow.ts +26 -34
  396. package/templates/quickstart/src/states/checkout.mem-stubs.ts +11 -0
  397. package/templates/quickstart/src/states/checkout.states.ts +21 -11
  398. package/templates/quickstart/src/stubs/device-showcase.ts +191 -0
  399. package/templates/quickstart/src/stubs/login.ts +37 -0
  400. package/templates/quickstart/tests/chain-flow.spec.ts +7 -10
  401. package/templates/scaffold/README.md +2 -1
  402. package/templates/scaffold/STRUCTURE.md +5 -4
  403. package/templates/scaffold/config/waygraph.config.ts +1 -0
  404. package/templates/scaffold/gitignore +1 -0
  405. package/templates/scaffold/src/flows/README.md +2 -2
  406. package/templates/scaffold/src/map/(app_base)/docs/_nav.block.ts +3 -3
  407. package/templates/scaffold/src/map/(app_base)/docs/_page.block.ts +3 -3
  408. package/templates/scaffold/src/map/(app_base)/home/_methods/add-item.effect.block.ts +4 -4
  409. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-hello.method.block.ts +3 -3
  410. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-item-added.method.block.ts +3 -3
  411. package/templates/scaffold/src/map/(app_base)/home/_methods/clear-cart.method.block.ts +5 -4
  412. package/templates/scaffold/src/map/(app_base)/home/_methods/remove-item.effect.block.ts +4 -4
  413. package/templates/scaffold/src/map/(app_base)/home/_nav.block.ts +3 -3
  414. package/templates/scaffold/src/map/(app_base)/home/_page.block.ts +3 -3
  415. package/templates/scaffold/src/map/(app_base)/home/nav-verification-link.block.ts +4 -4
  416. package/templates/scaffold/src/map/(external)/hoppscotch/_keys.ts +21 -0
  417. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-body.method.block.ts +4 -4
  418. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-header.method.block.ts +4 -4
  419. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-status.method.block.ts +4 -4
  420. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/pick-extension-interceptor.method.block.ts +5 -4
  421. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-body.method.block.ts +6 -5
  422. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-headers.method.block.ts +6 -5
  423. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/send-request.method.block.ts +5 -4
  424. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-bearer-token.method.block.ts +6 -5
  425. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-headers.method.block.ts +6 -5
  426. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-json-body.method.block.ts +6 -5
  427. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-method.method.block.ts +6 -5
  428. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-query-params.method.block.ts +6 -5
  429. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-url.method.block.ts +6 -5
  430. package/templates/scaffold/src/map/(external)/hoppscotch/_nav.block.ts +3 -3
  431. package/templates/scaffold/src/map/(external)/hoppscotch/_page.block.ts +3 -3
  432. package/templates/scaffold/src/map/(external)/hoppscotch/_states.ts +6 -0
  433. package/templates/scaffold/src/map/(external)/hoppscotch/settings/_nav.block.ts +3 -3
  434. package/templates/scaffold/src/map/(external)/mailpit/_keys.ts +13 -0
  435. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-content.method.block.ts +4 -4
  436. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-received.method.block.ts +4 -4
  437. package/templates/scaffold/src/map/(external)/mailpit/_methods/extract-email-link.method.block.ts +6 -5
  438. package/templates/scaffold/src/map/(external)/mailpit/_methods/open-message.method.block.ts +6 -5
  439. package/templates/scaffold/src/map/(external)/mailpit/_nav.block.ts +3 -3
  440. package/templates/scaffold/src/map/(external)/mailpit/_page.block.ts +3 -3
  441. package/templates/scaffold/src/map/(external)/mailpit/_states.ts +9 -0
  442. package/templates/scaffold/src/map/README.md +7 -0
  443. package/templates/scaffold/src/states/README.md +4 -1
  444. package/templates/scaffold/src/states/demo.mem-keys.ts +1 -29
  445. package/templates/scaffold/src/states/demo.states.ts +14 -20
  446. package/templates/scaffold/tests/hoppscotch.spec.ts +1 -11
  447. package/templates/scaffold/tests/mail-verify.spec.ts +2 -2
  448. package/templates/skills/waygraph-blind-pilot.skill.md +2 -6
  449. package/templates/skills/waygraph-convention.skill.md +23 -14
  450. package/templates/skills/waygraph-pilot.skill.md +7 -4
  451. package/dist/auto-session/verbose-log.js +0 -16
  452. package/dist/auto-session.d.ts +0 -2
  453. package/dist/auto-session.js +0 -3
  454. package/dist/cli/discover.d.ts +0 -40
  455. package/dist/cli/discover.js +0 -148
  456. package/dist/commands/agent-dive.js +0 -52
  457. package/dist/commands/check.js +0 -192
  458. package/dist/commands/map.js +0 -29
  459. package/dist/commands/run.js +0 -104
  460. package/dist/commands/traverse.js +0 -177
  461. package/dist/core/block.d.ts +0 -109
  462. package/dist/core/blocks/effect.js +0 -23
  463. package/dist/core/config.js +0 -17
  464. package/dist/core/engine.d.ts +0 -198
  465. package/dist/core/flow.d.ts +0 -293
  466. package/dist/core/flow.js +0 -432
  467. package/dist/core.d.ts +0 -14
  468. package/dist/core.js +0 -15
  469. package/dist/highlights/merge.d.ts +0 -8
  470. package/dist/highlights/merge.js +0 -173
  471. package/dist/highlights/stub-ctx.d.ts +0 -10
  472. package/dist/highlights/stub-ctx.js +0 -331
  473. package/dist/highlights/types.d.ts +0 -607
  474. package/dist/highlights.d.ts +0 -9
  475. package/dist/highlights.js +0 -10
  476. package/dist/pilot-overlay.d.ts +0 -5
  477. package/dist/pilot-overlay.js +0 -6
  478. package/dist/runner/banner-log.js +0 -63
  479. package/dist/runner/chain-run.js +0 -102
  480. package/dist/runner/cursor.js +0 -140
  481. package/dist/runner/demo-log.js +0 -316
  482. package/dist/runner/device-stage.d.ts +0 -9
  483. package/dist/runner/device-stage.js +0 -420
  484. package/dist/runner/discovery.js +0 -105
  485. package/dist/runner/index.js +0 -2
  486. package/dist/runner/inpage/banner.d.ts +0 -21
  487. package/dist/runner/inpage/banner.js +0 -156
  488. package/dist/runner/inpage/caption.d.ts +0 -3
  489. package/dist/runner/inpage/caption.js +0 -23
  490. package/dist/runner/inpage/core.d.ts +0 -4
  491. package/dist/runner/inpage/core.js +0 -316
  492. package/dist/runner/inpage/device.d.ts +0 -3
  493. package/dist/runner/inpage/device.js +0 -211
  494. package/dist/runner/inpage/network.d.ts +0 -15
  495. package/dist/runner/inpage/network.js +0 -217
  496. package/dist/runner/inpage/panel-chrome.js +0 -192
  497. package/dist/runner/inpage/stamp.js +0 -46
  498. package/dist/runner/inpage/swipe-zoom.js +0 -220
  499. package/dist/runner/inpage/todos.js +0 -337
  500. package/dist/runner/interaction-patch.js +0 -384
  501. package/dist/runner/main.js +0 -469
  502. package/dist/runner/network-capture.d.ts +0 -9
  503. package/dist/runner/network-capture.js +0 -126
  504. package/dist/runner/overlay-css.d.ts +0 -3
  505. package/dist/runner/overlay-css.js +0 -377
  506. package/dist/runner/overlay-install.js +0 -90
  507. package/dist/runner/overlay-stage.js +0 -110
  508. package/dist/runner/rings.js +0 -514
  509. package/dist/runner/seed-mem.js +0 -110
  510. package/dist/runner/slides.js +0 -278
  511. package/dist/runner/step-mode.js +0 -703
  512. package/dist/runner/step-panels.js +0 -729
  513. package/dist/runner/teardown.js +0 -202
  514. package/dist/runner/todo-dock.js +0 -142
  515. package/dist/session/step-overlay.d.ts +0 -37
  516. package/dist/session/step-overlay.js +0 -244
  517. package/examples/routed-demo/playwright.config.ts +0 -21
  518. package/examples/saucedemo/playwright.config.ts +0 -19
  519. package/examples/saucedemo/scripts/drive-auto-cli.mjs +0 -93
  520. package/examples/saucedemo/scripts/prove-add-to-cart-menu.mjs +0 -126
  521. package/examples/saucedemo/scripts/prove-auto-graph.mjs +0 -92
  522. package/examples/saucedemo/scripts/prove-wrong-login-runtime.mjs +0 -63
  523. package/examples/saucedemo/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
  524. package/templates/quickstart/playwright.config.ts +0 -14
  525. package/templates/quickstart/scripts/drive-auto-cli.mjs +0 -93
  526. package/templates/quickstart/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
  527. /package/dist/{commands → cli/commands}/agent-dive-scaffold.d.ts +0 -0
  528. /package/dist/{commands → cli/commands}/agent-dive.d.ts +0 -0
  529. /package/dist/{commands → cli/commands}/extensions.d.ts +0 -0
  530. /package/dist/{commands → cli/commands}/init.d.ts +0 -0
  531. /package/dist/{commands → cli/commands}/list.d.ts +0 -0
  532. /package/dist/{commands → cli/commands}/map.d.ts +0 -0
  533. /package/dist/{commands → cli/commands}/session.d.ts +0 -0
  534. /package/dist/{commands → cli/commands}/test.d.ts +0 -0
  535. /package/dist/{commands → cli/commands}/traverse.d.ts +0 -0
  536. /package/dist/{commands → cli/commands}/try.d.ts +0 -0
  537. /package/dist/{commands → cli/commands}/upgrade.d.ts +0 -0
  538. /package/dist/{highlights → demo/narration}/shorthand.js +0 -0
  539. /package/dist/{pilot-overlay/action-ring.d.ts → demo/overlay/pilot/actions.d.ts} +0 -0
  540. /package/dist/{ui → demo/overlay/ui}/components/ring.d.ts +0 -0
  541. /package/dist/{ui → demo/overlay/ui}/stylesheet.d.ts +0 -0
  542. /package/dist/{ui → demo/overlay/ui}/stylesheet.js +0 -0
  543. /package/dist/{ui → demo/overlay/ui}/tokens.d.ts +0 -0
  544. /package/dist/{ui → demo/overlay/ui}/tokens.js +0 -0
  545. /package/dist/{highlights → demo}/types.js +0 -0
  546. /package/dist/{auto-session → demo}/verbose-log.d.ts +0 -0
  547. /package/dist/{selector.d.ts → engine/trait/selector.d.ts} +0 -0
  548. /package/dist/{selector.js → engine/trait/selector.js} +0 -0
  549. /package/dist/{trait.js → engine/trait/trait.js} +0 -0
  550. /package/dist/{session/block-inject.d.ts → manifest/roots.d.ts} +0 -0
  551. /package/dist/{browser.d.ts → runtime/browser.d.ts} +0 -0
  552. /package/dist/{env-file.d.ts → runtime/env-file.d.ts} +0 -0
  553. /package/dist/{playwright-config.js → runtime/playwright-config.js} +0 -0
  554. /package/dist/{playwright.config.d.ts → runtime/playwright.config.d.ts} +0 -0
  555. /package/dist/{video-dir.d.ts → runtime/video-dir.d.ts} +0 -0
  556. /package/dist/{webserver.d.ts → runtime/webserver.d.ts} +0 -0
@@ -0,0 +1,109 @@
1
+ // `waygraph map pack <group>`: compiles one map group with the project's own TypeScript into an installable package
2
+ // (JavaScript + types, an index re-exporting everything, and `waygraph.map.json` for the scanner and Waygraph UI).
3
+ import { spawnSync } from "node:child_process";
4
+ import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
5
+ import { createRequire } from "node:module";
6
+ import { dirname, join, relative, resolve, sep } from "node:path";
7
+ import { fileURLToPath } from "node:url";
8
+ import { findMapGroup, mapGroups } from "./maps.js";
9
+ import { mapGroupImportProblems } from "./map-imports.js";
10
+ import { MANIFEST_VERSION } from "./manifest.js";
11
+ import { scanProject } from "./project.js";
12
+ import { walkDir } from "./scan.js";
13
+ function waygraphVersion() {
14
+ const pkg = join(dirname(fileURLToPath(import.meta.url)), "..", "..", "package.json");
15
+ return JSON.parse(readFileSync(pkg, "utf8")).version;
16
+ }
17
+ function compile(projectDir, group, out) {
18
+ let tsc;
19
+ try {
20
+ tsc = createRequire(join(projectDir, "package.json")).resolve("typescript/bin/tsc");
21
+ }
22
+ catch {
23
+ return "TypeScript is not installed in this project (npm i -D typescript)";
24
+ }
25
+ const base = join(projectDir, "tsconfig.json");
26
+ const config = join(out, "tsconfig.pack.json");
27
+ writeFileSync(config, JSON.stringify({
28
+ ...(existsSync(base) ? { extends: base } : {}),
29
+ compilerOptions: {
30
+ ...(existsSync(base) ? {} : { target: "ES2022", module: "NodeNext", moduleResolution: "NodeNext", strict: true, skipLibCheck: true }),
31
+ noEmit: false,
32
+ declaration: true,
33
+ rootDir: group.dir,
34
+ outDir: out,
35
+ },
36
+ include: [join(group.dir, "**", "*.ts")],
37
+ exclude: [],
38
+ }, null, 2));
39
+ const run = spawnSync(process.execPath, [tsc, "-p", config], { cwd: projectDir, encoding: "utf8" });
40
+ rmSync(config, { force: true });
41
+ if (run.status !== 0)
42
+ return `tsc failed:\n${run.stdout}${run.stderr}`;
43
+ return undefined;
44
+ }
45
+ /** Packs a map group (by `(external)/hoppscotch` or `hoppscotch`) into an installable package folder. */
46
+ export async function packMapGroup(projectDir, groupName, opts = {}) {
47
+ const group = findMapGroup(projectDir, groupName);
48
+ if (!group) {
49
+ const known = mapGroups(projectDir).map((g) => g.group);
50
+ return {
51
+ ok: false,
52
+ reason: `no map group "${groupName}" (a src/map/ folder with its own _states.ts)${known.length ? `; groups: ${known.join(", ")}` : ""}`,
53
+ };
54
+ }
55
+ const problems = mapGroupImportProblems(group);
56
+ if (problems.length > 0)
57
+ return { ok: false, reason: `${group.group} imports files outside the group`, problems };
58
+ const slug = group.group.split("/").pop().replace(/[()]/g, "");
59
+ const name = opts.name ?? `waygraph-map-${slug}`;
60
+ const out = resolve(projectDir, opts.out ?? join(".waygraph", "packages", slug));
61
+ rmSync(out, { recursive: true, force: true });
62
+ mkdirSync(out, { recursive: true });
63
+ const failed = compile(projectDir, group, out);
64
+ if (failed)
65
+ return { ok: false, reason: failed };
66
+ const scan = await scanProject(projectDir, { flows: false, maps: false });
67
+ const blocks = scan.blocks.filter((b) => b.absFile.startsWith(group.dir + sep));
68
+ const checkpoints = new Set();
69
+ for (const b of blocks)
70
+ for (const t of [...b.from, ...b.to])
71
+ if (t !== "*")
72
+ checkpoints.add(t);
73
+ const map = {
74
+ version: MANIFEST_VERSION,
75
+ name,
76
+ group: group.group,
77
+ checkpoints: [...checkpoints].sort(),
78
+ blocks: blocks.map((b) => ({
79
+ name: b.name,
80
+ exportName: b.exportName,
81
+ kind: b.kind,
82
+ from: b.from,
83
+ to: b.to,
84
+ requires: b.requires,
85
+ file: relative(group.dir, b.absFile).split(sep).join("/").replace(/\.ts$/, ".js"),
86
+ })),
87
+ };
88
+ writeFileSync(join(out, "waygraph.map.json"), JSON.stringify(map, null, 2) + "\n");
89
+ const modules = walkDir(out, /\.js$/)
90
+ .map((f) => "./" + relative(out, f).split(sep).join("/"))
91
+ .filter((f) => f !== "./index.js")
92
+ .sort();
93
+ const index = modules.map((m) => `export * from "${m}";`).join("\n") + "\n";
94
+ writeFileSync(join(out, "index.js"), index);
95
+ writeFileSync(join(out, "index.d.ts"), index);
96
+ writeFileSync(join(out, "package.json"), JSON.stringify({
97
+ name,
98
+ version: opts.version ?? "0.1.0",
99
+ description: `waygraph map: ${group.group}`,
100
+ type: "module",
101
+ main: "./index.js",
102
+ types: "./index.d.ts",
103
+ exports: { ".": { types: "./index.d.ts", default: "./index.js" }, "./*": "./*" },
104
+ files: ["**/*.js", "**/*.d.ts", "waygraph.map.json"],
105
+ keywords: ["waygraph", "waygraph-map"],
106
+ peerDependencies: { waygraph: `^${waygraphVersion()}` },
107
+ }, null, 2) + "\n");
108
+ return { ok: true, name, dir: out, group: group.group, blocks: blocks.length };
109
+ }
@@ -0,0 +1,60 @@
1
+ import type { BlocksSelect } from "./select.js";
2
+ import type { AnyBlock } from "./scan.js";
3
+ export type BlockKind = "nav" | "page" | "assert" | "method" | "effect" | "api" | "block";
4
+ export interface ScannedBlock {
5
+ block: AnyBlock;
6
+ name: string;
7
+ exportName: string;
8
+ kind: BlockKind;
9
+ description: string;
10
+ /** Checkpoint tags it runs from (`"*"` = anywhere) and lands on. Empty `to` = route unknown (see `skipped`). */
11
+ from: string[];
12
+ to: string[];
13
+ requires: string[];
14
+ /** Project-relative path; Blocks from an injected library are tagged `@label/...`. */
15
+ file: string;
16
+ absFile: string;
17
+ /** The installed map package it came from (its `file` is then `<package>/<path>`). */
18
+ map?: string;
19
+ }
20
+ export interface ScannedFlow {
21
+ flow: {
22
+ run: (...args: unknown[]) => Promise<unknown>;
23
+ blocks: () => unknown[];
24
+ };
25
+ exportName: string;
26
+ file: string;
27
+ absFile: string;
28
+ }
29
+ /** A Block as the live menus (auto, pilot) hold it: navigation or action. */
30
+ export interface BlockEntry {
31
+ block: AnyBlock;
32
+ exportName: string;
33
+ file: string;
34
+ kind: "nav" | "action";
35
+ description: string;
36
+ }
37
+ export interface ProjectScan {
38
+ projectDir: string;
39
+ blocks: ScannedBlock[];
40
+ flows: ScannedFlow[];
41
+ skipped: {
42
+ block: string;
43
+ file: string;
44
+ reason: string;
45
+ }[];
46
+ }
47
+ export interface ScanOptions {
48
+ blocksSelect?: BlocksSelect | undefined;
49
+ inject?: string[] | undefined;
50
+ /** Also import `*.flow.ts` files. Default true. */
51
+ flows?: boolean;
52
+ /** Also scan installed map packages (dependencies with a `waygraph.map.json`). Default true. */
53
+ maps?: boolean;
54
+ /** Called when a file fails to import (default: a one-line warning for Playwright double-install errors). */
55
+ onImportError?: (relFile: string, err: unknown) => void;
56
+ }
57
+ /** A file that fails to import is left out of the scan, and said so: a silent skip reads as "nothing there". */
58
+ export declare function reportImportError(relFile: string, err: unknown): void;
59
+ /** Imports every `*.block.ts` (and `*.flow.ts`) under the project and its injected roots. */
60
+ export declare function scanProject(projectDir: string, opts?: ScanOptions): Promise<ProjectScan>;
@@ -0,0 +1,101 @@
1
+ // Scans a project (and any injected Block libraries) into its Blocks and Flows, with each Block's route.
2
+ import { relative } from "node:path";
3
+ import { matchBlocksSelect } from "./select.js";
4
+ import { exploreRoots, injectTaggedFile } from "./roots.js";
5
+ import { blockKind, importFresh, isBlockLike, isFlowLike, walkDir } from "./scan.js";
6
+ import { installedMapPackages, mapPackageBlockFiles } from "./maps.js";
7
+ function kindOf(block) {
8
+ const kind = blockKind(block);
9
+ if (kind === "nav" || kind === "page" || kind === "assert" || kind === "api")
10
+ return kind;
11
+ const salt = block.__waygraphSalt;
12
+ if (salt === "effect" || salt === "method" || salt === "api")
13
+ return salt;
14
+ return "block";
15
+ }
16
+ /** A file that fails to import is left out of the scan, and said so: a silent skip reads as "nothing there". */
17
+ export function reportImportError(relFile, err) {
18
+ const msg = err instanceof Error ? err.message : String(err);
19
+ console.error(`waygraph: skip ${relFile}: ${msg.split("\n")[0]}`);
20
+ }
21
+ /** Imports every `*.block.ts` (and `*.flow.ts`) under the project and its injected roots. */
22
+ export async function scanProject(projectDir, opts = {}) {
23
+ const select = opts.blocksSelect;
24
+ const onError = opts.onImportError ?? reportImportError;
25
+ const blocks = [];
26
+ const flows = [];
27
+ const skipped = [];
28
+ const scanBlockFile = async (absFile, rel, file, map) => {
29
+ let mod;
30
+ try {
31
+ mod = await importFresh(absFile);
32
+ }
33
+ catch (err) {
34
+ onError(rel, err);
35
+ return;
36
+ }
37
+ for (const [exportName, exported] of Object.entries(mod)) {
38
+ if (!isBlockLike(exported))
39
+ continue;
40
+ if (select && !matchBlocksSelect(select, { relFile: file, blockName: exported.name }))
41
+ continue;
42
+ const marked = exported;
43
+ const from = marked.__waygraphFrom ?? [];
44
+ const to = marked.__waygraphTo ?? [];
45
+ // Every factory records a route; only a bare defineBlock has none.
46
+ if (to.length === 0)
47
+ skipped.push({ block: exported.name, file, reason: "no route: build it with a define*Block factory and Checkpoint values" });
48
+ blocks.push({
49
+ block: exported,
50
+ name: exported.name,
51
+ exportName,
52
+ kind: kindOf(exported),
53
+ description: typeof exported.description === "string" ? exported.description : "",
54
+ from: [...from],
55
+ to: [...to],
56
+ requires: (exported.requires ?? []).map((k) => k.name),
57
+ file,
58
+ absFile,
59
+ ...(map ? { map } : {}),
60
+ });
61
+ }
62
+ };
63
+ for (const root of exploreRoots(projectDir, opts.inject)) {
64
+ let files = walkDir(root, /\.block\.ts$/);
65
+ if (select && select.kind !== "regex") {
66
+ files = files.filter((f) => matchBlocksSelect(select, { relFile: relative(root, f).replace(/\\/g, "/") }));
67
+ }
68
+ for (const absFile of files) {
69
+ const rel = relative(root, absFile).replace(/\\/g, "/");
70
+ await scanBlockFile(absFile, rel, injectTaggedFile(projectDir, root, rel));
71
+ }
72
+ if (opts.flows === false)
73
+ continue;
74
+ for (const absFile of walkDir(root, /\.flow\.ts$/)) {
75
+ const rel = relative(root, absFile).replace(/\\/g, "/");
76
+ let mod;
77
+ try {
78
+ mod = await importFresh(absFile);
79
+ }
80
+ catch (err) {
81
+ onError(rel, err);
82
+ continue;
83
+ }
84
+ for (const [exportName, exported] of Object.entries(mod)) {
85
+ if (isFlowLike(exported))
86
+ flows.push({ flow: exported, exportName, file: injectTaggedFile(projectDir, root, rel), absFile });
87
+ }
88
+ }
89
+ }
90
+ if (opts.maps !== false) {
91
+ for (const pkg of installedMapPackages(projectDir)) {
92
+ for (const absFile of mapPackageBlockFiles(pkg)) {
93
+ const rel = relative(pkg.dir, absFile).replace(/\\/g, "/");
94
+ if (select && select.kind !== "regex" && !matchBlocksSelect(select, { relFile: `${pkg.name}/${rel}` }))
95
+ continue;
96
+ await scanBlockFile(absFile, rel, `${pkg.name}/${rel}`, pkg.name);
97
+ }
98
+ }
99
+ }
100
+ return { projectDir, blocks, flows, skipped };
101
+ }
@@ -5,12 +5,9 @@
5
5
  import { existsSync } from "node:fs";
6
6
  import { basename, dirname, join, resolve } from "node:path";
7
7
  import { fileURLToPath } from "node:url";
8
- import { homedir } from "node:os";
9
8
  /**
10
9
  * This package's own installed root (contains `templates/`/`examples/`, sibling to `dist/`) -
11
- * this file compiles to `dist/session/block-inject.js`, two levels down, not one. Same class of
12
- * bug as `cli/util.ts`'s own `packageRoot()` (see its comment) - self-inflicted here by moving
13
- * this file into `src/session/` without updating the path math to match the new depth.
10
+ * this file compiles to `dist/manifest/roots.js`, two levels down.
14
11
  */
15
12
  function packageRoot() {
16
13
  return resolve(dirname(fileURLToPath(import.meta.url)), "..", "..");
@@ -32,20 +29,6 @@ export function injectTaggedFile(hostDir, root, relFile) {
32
29
  }
33
30
  const PRESETS = {
34
31
  saucedemo: () => join(packageRoot(), "examples", "saucedemo"),
35
- demosauce: () => join(packageRoot(), "examples", "saucedemo"),
36
- veciro: () => {
37
- if (process.env.WAYGRAPH_INJECT_VECIRO) {
38
- return resolve(process.env.WAYGRAPH_INJECT_VECIRO);
39
- }
40
- for (const c of [
41
- join(homedir(), "Desktop", "Work", "veciro-waygraph"),
42
- join(homedir(), "Desktop", "Projects", "veciro-waygraph"),
43
- ]) {
44
- if (existsSync(c))
45
- return c;
46
- }
47
- return null;
48
- },
49
32
  };
50
33
  /**
51
34
  * Resolve one `--inject` token to an absolute directory (preset name or path).
@@ -0,0 +1,19 @@
1
+ import type { Block } from "../engine/block/block.js";
2
+ import type { Checkpoint } from "../engine/checkpoint/checkpoint.js";
3
+ /** Every file under `dir` whose name matches, skipping `node_modules`, `dist` and `.git`. */
4
+ export declare function walkDir(dir: string, pattern: RegExp): string[];
5
+ /**
6
+ * Imports a project file. The file's mtime is part of the URL: Node caches an ESM import per specifier for the life of the
7
+ * process, so a long-running session reloading an edited Block would otherwise keep the first version.
8
+ */
9
+ export declare function importFresh(filePath: string): Promise<Record<string, unknown>>;
10
+ export type AnyBlock = Block<Checkpoint<string>, Checkpoint<string>> & {
11
+ description?: string;
12
+ };
13
+ export declare function isBlockLike(val: unknown): val is AnyBlock;
14
+ export declare function isFlowLike(val: unknown): val is {
15
+ run: (...args: unknown[]) => Promise<unknown>;
16
+ blocks: () => unknown[];
17
+ };
18
+ /** The factory kind a Block was built with (`nav`, `page`, `assert`), or undefined for Methods and Effects. */
19
+ export declare function blockKind(block: object): string | undefined;
@@ -0,0 +1,57 @@
1
+ // The one place a project's files are walked and imported. Everything that needs the project's Blocks or Flows
2
+ // (graph, check, map, auto, traverse, the runner) goes through here.
3
+ import { readdirSync, statSync } from "node:fs";
4
+ import { join, resolve } from "node:path";
5
+ import { pathToFileURL } from "node:url";
6
+ /** Every file under `dir` whose name matches, skipping `node_modules`, `dist` and `.git`. */
7
+ export function walkDir(dir, pattern) {
8
+ const results = [];
9
+ let entries;
10
+ try {
11
+ entries = readdirSync(dir, { withFileTypes: true });
12
+ }
13
+ catch {
14
+ return results;
15
+ }
16
+ for (const entry of entries) {
17
+ const full = join(dir, entry.name);
18
+ if (entry.isDirectory()) {
19
+ if (entry.name === "node_modules" || entry.name === "dist" || entry.name === ".git")
20
+ continue;
21
+ results.push(...walkDir(full, pattern));
22
+ }
23
+ else if (pattern.test(entry.name)) {
24
+ results.push(full);
25
+ }
26
+ }
27
+ return results;
28
+ }
29
+ /**
30
+ * Imports a project file. The file's mtime is part of the URL: Node caches an ESM import per specifier for the life of the
31
+ * process, so a long-running session reloading an edited Block would otherwise keep the first version.
32
+ */
33
+ export async function importFresh(filePath) {
34
+ const resolved = resolve(filePath);
35
+ const url = pathToFileURL(resolved);
36
+ url.searchParams.set("t", String(statSync(resolved).mtimeMs));
37
+ return (await import(url.href));
38
+ }
39
+ export function isBlockLike(val) {
40
+ if (val === null || typeof val !== "object")
41
+ return false;
42
+ const obj = val;
43
+ if (typeof obj.name !== "string")
44
+ return false;
45
+ const instruction = obj.instruction;
46
+ return instruction !== null && typeof instruction === "object" && typeof instruction?.act === "function";
47
+ }
48
+ export function isFlowLike(val) {
49
+ return (val !== null &&
50
+ typeof val === "object" &&
51
+ typeof val.run === "function" &&
52
+ typeof val.blocks === "function");
53
+ }
54
+ /** The factory kind a Block was built with (`nav`, `page`, `assert`), or undefined for Methods and Effects. */
55
+ export function blockKind(block) {
56
+ return block.__waygraphKind;
57
+ }
@@ -6,6 +6,7 @@
6
6
  * - otherwise -> bare token (flow export / checkpoint / block name) — caller decides
7
7
  */
8
8
  export type BlocksSelectKind = "regex" | "glob" | "bare";
9
+ /** A parsed `--blocks` selector: which Blocks, by name, glob or file, a command should use. */
9
10
  export interface BlocksSelect {
10
11
  kind: BlocksSelectKind;
11
12
  /** Original token. */
@@ -16,9 +17,11 @@ export interface BlocksSelect {
16
17
  }
17
18
  /** True when the token is file-select (glob/regex), not a bare flow/checkpoint name. */
18
19
  export declare function isFileSelectToken(token: string): boolean;
20
+ /** Parses a `--blocks` argument into a selector. */
19
21
  export declare function parseBlocksSelect(token: string): BlocksSelect;
20
22
  /** Glob → RegExp (simple: ** / * / ? only; no brace expansion). */
21
23
  export declare function globToRegExp(glob: string): RegExp;
24
+ /** True when a Block name and file match a parsed `--blocks` selector. */
22
25
  export declare function matchBlocksSelect(select: BlocksSelect, opts: {
23
26
  relFile: string;
24
27
  blockName?: string;
@@ -14,6 +14,7 @@ export function isFileSelectToken(token) {
14
14
  }
15
15
  return token.includes("*");
16
16
  }
17
+ /** Parses a `--blocks` argument into a selector. */
17
18
  export function parseBlocksSelect(token) {
18
19
  const raw = token.trim();
19
20
  if (raw.length >= 2 && raw.startsWith("/") && raw.endsWith("/")) {
@@ -52,6 +53,7 @@ export function globToRegExp(glob) {
52
53
  }
53
54
  return new RegExp("^" + out + "$");
54
55
  }
56
+ /** True when a Block name and file match a parsed `--blocks` selector. */
55
57
  export function matchBlocksSelect(select, opts) {
56
58
  const file = opts.relFile.replace(/\\/g, "/");
57
59
  const name = opts.blockName ?? "";
@@ -0,0 +1,23 @@
1
+ import type { SourceFile } from "ts-morph";
2
+ /** The file as it is on disk now. */
3
+ export declare function parseSource(file: string): SourceFile;
4
+ /** Names the file exports: `export const|let|var|function|class X`, and `export { X }`. */
5
+ export declare function exportedNames(sf: SourceFile): string[];
6
+ /** Every module the file imports or re-exports from, including dynamic `import("x")`. */
7
+ export declare function importSpecifiers(sf: SourceFile): string[];
8
+ /** Names imported from modules whose specifier passes `from`, in source order (the imported name, not an alias). */
9
+ export declare function namedImportsFrom(sf: SourceFile, from: (specifier: string) => boolean): string[];
10
+ /** The string literal at `argIndex` of every call whose callee text passes `callee`, in source order. */
11
+ export declare function stringArgs(sf: SourceFile, callee: (text: string) => boolean, argIndex?: number): string[];
12
+ /** A string property of the object literal passed to every matching call: `Trait.url({ pathname: "/x" })` -> "/x". */
13
+ export declare function objectArgProperty(sf: SourceFile, callee: (text: string) => boolean, property: string): string[];
14
+ /** Every string literal in the file (comments are not strings), with the property name it initializes, if any. */
15
+ export declare function stringLiterals(sf: SourceFile): {
16
+ value: string;
17
+ property: string | undefined;
18
+ }[];
19
+ /** Every call in the file (comments and strings are not calls): its callee as written and whether its first argument is a string. */
20
+ export declare function calls(sf: SourceFile): {
21
+ callee: string;
22
+ literalFirstArg: boolean;
23
+ }[];
@@ -0,0 +1,86 @@
1
+ // Reads a TypeScript file's shape (its exports, imports, string arguments) from the AST (ts-morph), for the places that
2
+ // need it without importing the file: `list`, `nav`, a flow file's export name, a map group's imports.
3
+ import { readFileSync } from "node:fs";
4
+ import { Node, Project, SyntaxKind } from "ts-morph";
5
+ const project = new Project({ useInMemoryFileSystem: true, skipFileDependencyResolution: true });
6
+ /** The file as it is on disk now. */
7
+ export function parseSource(file) {
8
+ return project.createSourceFile(file.replace(/\\/g, "/").replace(/^[A-Za-z]:/, ""), readFileSync(file, "utf8"), { overwrite: true });
9
+ }
10
+ /** Names the file exports: `export const|let|var|function|class X`, and `export { X }`. */
11
+ export function exportedNames(sf) {
12
+ const names = [];
13
+ for (const statement of sf.getStatements()) {
14
+ if (Node.isVariableStatement(statement) && statement.isExported())
15
+ names.push(...statement.getDeclarations().map((d) => d.getName()));
16
+ else if ((Node.isFunctionDeclaration(statement) || Node.isClassDeclaration(statement)) && statement.isExported() && statement.getName())
17
+ names.push(statement.getName());
18
+ else if (Node.isExportDeclaration(statement) && !statement.getModuleSpecifier())
19
+ names.push(...statement.getNamedExports().map((e) => e.getAliasNode()?.getText() ?? e.getName()));
20
+ }
21
+ return names;
22
+ }
23
+ /** Every module the file imports or re-exports from, including dynamic `import("x")`. */
24
+ export function importSpecifiers(sf) {
25
+ const specs = [
26
+ ...sf.getImportDeclarations().map((d) => d.getModuleSpecifierValue()),
27
+ ...sf.getExportDeclarations().flatMap((d) => d.getModuleSpecifierValue() ?? []),
28
+ ];
29
+ for (const call of sf.getDescendantsOfKind(SyntaxKind.CallExpression)) {
30
+ const arg = call.getArguments()[0];
31
+ if (call.getExpression().getKind() === SyntaxKind.ImportKeyword && Node.isStringLiteral(arg))
32
+ specs.push(arg.getLiteralValue());
33
+ }
34
+ return specs;
35
+ }
36
+ /** Names imported from modules whose specifier passes `from`, in source order (the imported name, not an alias). */
37
+ export function namedImportsFrom(sf, from) {
38
+ return sf
39
+ .getImportDeclarations()
40
+ .filter((d) => from(d.getModuleSpecifierValue()))
41
+ .flatMap((d) => d.getNamedImports().map((n) => n.getName()));
42
+ }
43
+ /** The string literal at `argIndex` of every call whose callee text passes `callee`, in source order. */
44
+ export function stringArgs(sf, callee, argIndex = 0) {
45
+ const out = [];
46
+ for (const call of sf.getDescendantsOfKind(SyntaxKind.CallExpression)) {
47
+ if (!callee(call.getExpression().getText()))
48
+ continue;
49
+ const arg = call.getArguments()[argIndex];
50
+ if (Node.isStringLiteral(arg) || Node.isNoSubstitutionTemplateLiteral(arg))
51
+ out.push(arg.getLiteralValue());
52
+ }
53
+ return out;
54
+ }
55
+ /** A string property of the object literal passed to every matching call: `Trait.url({ pathname: "/x" })` -> "/x". */
56
+ export function objectArgProperty(sf, callee, property) {
57
+ const out = [];
58
+ for (const call of sf.getDescendantsOfKind(SyntaxKind.CallExpression)) {
59
+ if (!callee(call.getExpression().getText()))
60
+ continue;
61
+ const arg = call.getArguments()[0];
62
+ const prop = Node.isObjectLiteralExpression(arg) ? arg.getProperty(property) : undefined;
63
+ const value = Node.isPropertyAssignment(prop) ? prop.getInitializer() : undefined;
64
+ if (Node.isStringLiteral(value) || Node.isNoSubstitutionTemplateLiteral(value))
65
+ out.push(value.getLiteralValue());
66
+ }
67
+ return out;
68
+ }
69
+ /** Every string literal in the file (comments are not strings), with the property name it initializes, if any. */
70
+ export function stringLiterals(sf) {
71
+ const out = [];
72
+ for (const node of [...sf.getDescendantsOfKind(SyntaxKind.StringLiteral), ...sf.getDescendantsOfKind(SyntaxKind.NoSubstitutionTemplateLiteral)]) {
73
+ const parent = node.getParent();
74
+ if (Node.isImportDeclaration(parent) || Node.isExportDeclaration(parent))
75
+ continue;
76
+ out.push({ value: node.getLiteralValue(), property: Node.isPropertyAssignment(parent) && parent.getInitializer() === node ? parent.getName() : undefined });
77
+ }
78
+ return out;
79
+ }
80
+ /** Every call in the file (comments and strings are not calls): its callee as written and whether its first argument is a string. */
81
+ export function calls(sf) {
82
+ return sf.getDescendantsOfKind(SyntaxKind.CallExpression).map((call) => {
83
+ const arg = call.getArguments()[0];
84
+ return { callee: call.getExpression().getText(), literalFirstArg: Node.isStringLiteral(arg) || Node.isTemplateExpression(arg) || Node.isNoSubstitutionTemplateLiteral(arg) };
85
+ });
86
+ }
@@ -0,0 +1,71 @@
1
+ import type { BrowserContext } from "@playwright/test";
2
+ import type { Checkpoint } from "../engine/checkpoint/checkpoint.js";
3
+ import type { EngineConfig } from "../engine/config.js";
4
+ import type { MemPage } from "../engine/mem/mem.js";
5
+ import type { DemoPace } from "../engine/stub/pace.js";
6
+ import type { HighlightStyleDefaults } from "../engine/stub/ring.js";
7
+ import type { WgPage } from "../demo/types.js";
8
+ import type { SomeBlock } from "../engine/block/block.js";
9
+ /** One Block to play, with what its flow says about it. */
10
+ export interface PlayStep {
11
+ block: SomeBlock;
12
+ exportName: string;
13
+ /** The engine config of the flow it came from (its layouts apply when it runs). */
14
+ config: EngineConfig;
15
+ /** Set on a named flow's steps; ad hoc Block chains have no episodes. */
16
+ episodeNumber?: number | undefined;
17
+ episodeTitle?: string | undefined;
18
+ /** Clear cookies and storage before this step (a flow with `sessionReset`, chained after another). */
19
+ resetSession: boolean;
20
+ /** Seeds this segment's `--data` into mem; set on a segment's first step. */
21
+ seedMem?: (() => void) | undefined;
22
+ /** Set on a flow's last step when the flow is meant to fail (`map({ expectedFailure })`). */
23
+ expectedFailureReason?: string | undefined;
24
+ demoPace?: DemoPace | undefined;
25
+ highlightStyle?: HighlightStyleDefaults | undefined;
26
+ /** An inner step of an expanded fast-forward unit (`--ff-expand`). */
27
+ wasFastForward?: boolean | undefined;
28
+ ffSource?: string | undefined;
29
+ }
30
+ /** The browser everything plays in. */
31
+ export interface PlaySession {
32
+ context: BrowserContext;
33
+ page: WgPage;
34
+ mem: MemPage;
35
+ baseURL: string | undefined;
36
+ }
37
+ /** How a step ended, for a mode's `failed` hook: it threw, or it landed on the branch its flow expects to fail on. */
38
+ export type StepFailure = {
39
+ error: unknown;
40
+ result?: undefined;
41
+ } | {
42
+ error?: undefined;
43
+ result: Checkpoint<string>;
44
+ };
45
+ export interface PlayOutcome {
46
+ ok: boolean;
47
+ result?: Checkpoint<string> | undefined;
48
+ /** The step that failed, when one did. */
49
+ failedAt?: {
50
+ index: number;
51
+ step: PlayStep;
52
+ error: unknown;
53
+ } | undefined;
54
+ /** Set when the run stopped where its flow expects to fail. */
55
+ expectedFailure?: {
56
+ step: PlayStep;
57
+ reason: string;
58
+ } | undefined;
59
+ }
60
+ /** A way of playing steps. Every hook is optional; with none, it is a plain Playwright run. */
61
+ export interface Mode {
62
+ name: string;
63
+ begin?(steps: readonly PlayStep[]): Promise<void>;
64
+ /** After the page was reset between episodes. */
65
+ afterReset?(): Promise<void>;
66
+ before?(index: number): Promise<void>;
67
+ after?(index: number, result: Checkpoint<string>, ms: number): Promise<void>;
68
+ /** A step failed (or reached its expected failure): retry its episode, or stop. Without the hook: stop. */
69
+ failed?(index: number, failure: StepFailure, ms: number): Promise<"retry" | "stop">;
70
+ end?(outcome: PlayOutcome): Promise<void>;
71
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,5 @@
1
+ import type { MemPage } from "../../engine/mem/mem.js";
2
+ import type { Flow } from "../../engine/flow/flow.js";
3
+ import type { PlayOptions } from "../options.js";
4
+ import type { Checkpoint } from "../../engine/checkpoint/checkpoint.js";
5
+ export declare function playBranches(flows: readonly Flow<Checkpoint<string>>[], mem: MemPage, options: PlayOptions): Promise<void>;
@@ -0,0 +1,37 @@
1
+ import { branchRoutes, runBranchRegression } from "../../engine/flow/branch-regression.js";
2
+ import { extensionPathsFromEnv } from "../../runtime/browser.js";
3
+ export async function playBranches(flows, mem, options) {
4
+ const flow = flows.length === 1 ? flows[0] : undefined;
5
+ if (!flow) {
6
+ console.error("waygraph run --all-branches: needs a single Flow reference (e.g. --blocks loginFlow), not a multi-segment chain spec - nothing else has one branch tree to explore.");
7
+ process.exitCode = 1;
8
+ return;
9
+ }
10
+ if (!branchRoutes(flow)) {
11
+ console.error("waygraph run --all-branches: this Flow was not built with MapBuilder.branch() - there is no branch tree to explore. Run it normally instead.");
12
+ process.exitCode = 1;
13
+ return;
14
+ }
15
+ if (extensionPathsFromEnv().length > 0) {
16
+ console.warn("waygraph run --all-branches: extensions are not loaded (branches run in cloned contexts)");
17
+ }
18
+ const { chromium } = await import("@playwright/test");
19
+ const browser = await chromium.launch({ headless: !options.headed });
20
+ try {
21
+ const context = await browser.newContext(options.baseURL ? { baseURL: options.baseURL } : undefined);
22
+ const results = await runBranchRegression(flow, context, mem, { cloneSession: !options.sharedSession });
23
+ for (const r of results) {
24
+ console.log(`waygraph run --all-branches: ${r.path || "(root)"} -> ${r.status}` +
25
+ (r.result ? ` (${JSON.stringify(r.result)})` : "") +
26
+ (r.error ? ` - ${r.error}` : ""));
27
+ }
28
+ const failed = results.filter((r) => r.status === "failed");
29
+ if (failed.length) {
30
+ console.error(`waygraph run --all-branches: ${failed.length}/${results.length} path(s) failed`);
31
+ process.exitCode = 1;
32
+ }
33
+ }
34
+ finally {
35
+ await browser.close();
36
+ }
37
+ }
@@ -0,0 +1,3 @@
1
+ import type { Mode, PlaySession, PlayStep } from "../mode.js";
2
+ import type { PlayOptions } from "../options.js";
3
+ export declare function demoMode(session: PlaySession, steps: readonly PlayStep[], options: PlayOptions, beat: number): Promise<Mode>;