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
@@ -28,9 +28,10 @@
28
28
  * hand-picking indices from each status response) that proved this needs no
29
29
  * new execution primitive.
30
30
  */
31
- import { type WaygraphGraph } from "../analysis/graph.js";
32
- import { type BrowserStartInit } from "./browser.js";
33
- import type { SessionSnapshot } from "../auto-session.js";
31
+ import { type WaygraphGraph } from "../../analysis/graph.js";
32
+ import { type BrowserStartInit } from "../auto-session/start.js";
33
+ import type { SessionSnapshot } from "../auto-session/helpers.js";
34
+ /** What `pilotStart` returns: the session id, socket path and first snapshot. */
34
35
  export interface PilotStartResult {
35
36
  sessionId: string;
36
37
  socketPath: string;
@@ -28,9 +28,9 @@
28
28
  * hand-picking indices from each status response) that proved this needs no
29
29
  * new execution primitive.
30
30
  */
31
- import { discoverGraph } from "../analysis/graph.js";
32
- import { requestSession, resolveSessionMeta, } from "./auto-session-ipc.js";
33
- import { browserStart } from "./browser.js";
31
+ import { discoverGraph } from "../../analysis/graph.js";
32
+ import { requestSession, resolveSessionMeta, } from "../auto-session/ipc.js";
33
+ import { browserStart } from "../auto-session/start.js";
34
34
  /**
35
35
  * Starts a detached session and reads back its own graph + starting
36
36
  * snapshot in one call, so an agent bootstraps with everything it needs
@@ -39,7 +39,7 @@ import { browserStart } from "./browser.js";
39
39
  * --detach` and `waygraph graph` itself.
40
40
  */
41
41
  export async function pilotStart(init) {
42
- const { resolveInjectRoots } = await import("./block-inject.js");
42
+ const { resolveInjectRoots } = await import("../../manifest/roots.js");
43
43
  const exploreInject = init.inject ??
44
44
  (init.injectTokens?.length ? resolveInjectRoots(init.injectTokens, init.projectDir) : undefined);
45
45
  const started = await browserStart({
@@ -1,3 +1,4 @@
1
+ /** The edge-coverage report `traverse` writes: which graph edges were walked. */
1
2
  export interface TraverseCoverageReport {
2
3
  version: 1;
3
4
  generatedAt: string;
@@ -41,6 +42,7 @@ export declare function normalizeHitKey(hitKey: string, graphKeys: ReadonlySet<s
41
42
  * Returns 0-1 fraction, or null when unset/invalid.
42
43
  */
43
44
  export declare function parseMinEdgeCoverage(raw: unknown): number | null;
45
+ /** Builds the `traverse` coverage report from the edges walked and the graph's edges. */
44
46
  export declare function buildCoverageReport(opts: {
45
47
  projectDir: string;
46
48
  parallel: number;
@@ -51,5 +53,7 @@ export declare function buildCoverageReport(opts: {
51
53
  }): TraverseCoverageReport;
52
54
  /** Greppable one-liner for agents/CI. */
53
55
  export declare function formatCoverageLine(report: TraverseCoverageReport): string;
56
+ /** Where `traverse` writes its coverage report by default. */
54
57
  export declare function defaultCoverageOutPath(projectDir: string): string;
58
+ /** Writes the `traverse` coverage report to disk. */
55
59
  export declare function writeCoverageReport(path: string, report: TraverseCoverageReport): void;
@@ -68,6 +68,7 @@ export function parseMinEdgeCoverage(raw) {
68
68
  return n / 100;
69
69
  return null;
70
70
  }
71
+ /** Builds the `traverse` coverage report from the edges walked and the graph's edges. */
71
72
  export function buildCoverageReport(opts) {
72
73
  const all = [...new Set(opts.allEdgeKeys)].sort();
73
74
  const graphSet = new Set(all);
@@ -118,9 +119,11 @@ export function formatCoverageLine(report) {
118
119
  : "";
119
120
  return `[Coverage edges=${report.edgesHit}/${report.edgesTotal} ratio=${pct}%${minPart}]`;
120
121
  }
122
+ /** Where `traverse` writes its coverage report by default. */
121
123
  export function defaultCoverageOutPath(projectDir) {
122
124
  return join(projectDir, ".waygraph-traverse", "coverage.json");
123
125
  }
126
+ /** Writes the `traverse` coverage report to disk. */
124
127
  export function writeCoverageReport(path, report) {
125
128
  mkdirSync(dirname(path), { recursive: true });
126
129
  writeFileSync(path, JSON.stringify(report, null, 2) + "\n", "utf-8");
@@ -2,6 +2,7 @@ export interface EdgeLeaseRecord {
2
2
  workerId: string;
3
3
  claimedAt: number;
4
4
  }
5
+ /** Hands out graph edges to parallel `traverse` workers so no two workers walk the same edge. */
5
6
  export declare class EdgeLeaseCoordinator {
6
7
  private readonly held;
7
8
  private readonly dir;
@@ -5,6 +5,7 @@
5
5
  */
6
6
  import { existsSync, mkdirSync, writeFileSync } from "node:fs";
7
7
  import { join } from "node:path";
8
+ /** Hands out graph edges to parallel `traverse` workers so no two workers walk the same edge. */
8
9
  export class EdgeLeaseCoordinator {
9
10
  held = new Map();
10
11
  dir;
@@ -1,10 +1,13 @@
1
+ /** How `traverse` workers share a browser: one session, or a clone per worker. */
1
2
  export type TraverseSessionMode = "clone" | "inherit";
3
+ /** What one `traverse` worker did: edges walked and failures. */
2
4
  export interface TraverseWorkerResult {
3
5
  exitCode: number;
4
6
  steps: number;
5
7
  edgesHit: string[];
6
8
  leaf?: string;
7
9
  }
10
+ /** Options for `runTraverse`: workers, session mode, step limit, coverage gate. */
8
11
  export interface TraverseOptions {
9
12
  baseURL?: string;
10
13
  startUrl?: string;
@@ -25,7 +28,7 @@ export interface TraverseOptions {
25
28
  /** Traverse id for greppable lines (default traverse-1). */
26
29
  traverseId?: string;
27
30
  /** Phase C: glob / regex / bare `--blocks` file select. */
28
- blocksSelect?: import("../blocks-select.js").BlocksSelect;
31
+ blocksSelect?: import("../../manifest/select.js").BlocksSelect;
29
32
  /** Phase D: parallel workers (default 1). Cap 4. */
30
33
  parallel?: number;
31
34
  /** Phase D: clone (default) or inherit. Inherit refused when parallel > 1. */
@@ -1,13 +1,16 @@
1
- import { Engine, start, end, locate } from "../core.js";
2
- import { MemPage } from "../mem-page.js";
3
- import { buildExploreContext, buildExploreMenu, } from "../session/auto-explore.js";
4
- import { defaultMemValueForKey } from "../session/auto-explore-run.js";
5
- import { resolveBaseUrl } from "../config.js";
1
+ import { Engine } from "../../engine/engine.js";
2
+ import { buildFlow } from "../../engine/flow/flow.js";
3
+ import { MemPage } from "../../engine/mem/mem.js";
4
+ import { buildExploreContext, buildExploreMenu, } from "../auto/explore.js";
5
+ import { detectHere, memStubValue } from "../auto/auto.js";
6
+ import { resolveBaseUrl } from "../../runtime/waygraph-config.js";
6
7
  import { EdgeLeaseCoordinator } from "./lease.js";
7
8
  import { buildCoverageReport, collectGraphEdgeKeys, defaultCoverageOutPath, formatCoverageLine, writeCoverageReport, } from "./coverage.js";
8
- import { chromiumExecutablePath } from "../browser.js";
9
+ import { chromiumExecutablePath } from "../../runtime/browser.js";
10
+ import { envFlag, envString } from "../../engine/env.js";
11
+ import { ignorePageGone, ignoreTimeout } from "../../engine/page-gone.js";
9
12
  function seedMem(library, mem, dataJson) {
10
- const raw = dataJson ?? process.env.WAYGRAPH_DATA ?? process.env.WAYGRAPH_AUTO_MEM;
13
+ const raw = dataJson ?? envString("WAYGRAPH_DATA") ?? envString("WAYGRAPH_AUTO_MEM");
11
14
  let envParsed = {};
12
15
  if (raw) {
13
16
  try {
@@ -25,7 +28,7 @@ function seedMem(library, mem, dataJson) {
25
28
  mem.set(k, envParsed[k.name]);
26
29
  continue;
27
30
  }
28
- const def = defaultMemValueForKey(k.name);
31
+ const def = memStubValue(k);
29
32
  if (def !== undefined)
30
33
  mem.set(k, def);
31
34
  }
@@ -36,12 +39,7 @@ function snapshotMem(library, mem) {
36
39
  for (const entry of library.values()) {
37
40
  for (const k of entry.block.requires ?? []) {
38
41
  if (mem.has(k) && !(k.name in out)) {
39
- try {
40
- out[k.name] = mem.get(k);
41
- }
42
- catch {
43
- /* skip */
44
- }
42
+ out[k.name] = mem.get(k);
45
43
  }
46
44
  }
47
45
  }
@@ -71,23 +69,8 @@ function edgeKey(edge) {
71
69
  const id = edge.instanceOption?.id;
72
70
  return id ? `${edge.block}::${id}` : edge.block;
73
71
  }
74
- async function detectHere(page, navBlocks) {
75
- try {
76
- const url = page.url();
77
- if (url.includes("/login"))
78
- return "PiaLogin";
79
- if (url.includes("mailpit") || url.includes(":54324") || url.includes("/mailhog")) {
80
- return "PiaMailpitGui";
81
- }
82
- }
83
- catch {
84
- /* ignore */
85
- }
86
- const tags = navBlocks.map((n) => n.block);
87
- return locate(page, tags, { timeoutMs: 1500 });
88
- }
89
72
  async function runOneBlock(engine, entry, context, page, mem) {
90
- const flow = engine.defineFlow([start, entry.block, end]);
73
+ const flow = buildFlow([entry.block], engine.config);
91
74
  const BLOCK_TIMEOUT_MS = 45_000;
92
75
  let timer;
93
76
  try {
@@ -131,7 +114,7 @@ async function runTraverseWorker(opts) {
131
114
  if (page.isClosed()) {
132
115
  page = await context.newPage();
133
116
  if (startUrl) {
134
- await page.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(() => { });
117
+ await page.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(ignorePageGone);
135
118
  }
136
119
  }
137
120
  const detected = await detectHere(page, library.navBlocks);
@@ -238,8 +221,8 @@ export async function runTraverse(projectDir, options = {}) {
238
221
  const maxVisitsPerNode = options.maxVisitsPerNode ?? 2;
239
222
  const maxVisitsPerEdge = options.maxVisitsPerEdge ?? 1;
240
223
  const timeoutMs = options.timeoutMs ?? 15 * 60_000;
241
- const headed = options.headed === true || process.env.WAYGRAPH_HEADED === "1";
242
- const baseURL = options.baseURL ?? (await resolveBaseUrl(projectDir)) ?? process.env.WAYGRAPH_BASE_URL;
224
+ const headed = options.headed === true || envFlag("WAYGRAPH_HEADED");
225
+ const baseURL = options.baseURL ?? (await resolveBaseUrl(projectDir)) ?? envString("WAYGRAPH_BASE_URL");
243
226
  const startUrl = options.startUrl ?? baseURL;
244
227
  const minEdgeCoverage = options.minEdgeCoverage != null && Number.isFinite(options.minEdgeCoverage)
245
228
  ? options.minEdgeCoverage
@@ -253,7 +236,7 @@ export async function runTraverse(projectDir, options = {}) {
253
236
  const allEdgeKeys = collectGraphEdgeKeys(graph.edges);
254
237
  const leases = new EdgeLeaseCoordinator({ projectDir, persist: parallel > 1 });
255
238
  const engine = new Engine({ headless: !headed, slowMo: headed ? 100 : 0 });
256
- if (process.env.WAYGRAPH_EXTENSIONS)
239
+ if (envString("WAYGRAPH_EXTENSIONS"))
257
240
  console.error("waygraph traverse: extensions are not loaded (workers use plain contexts)");
258
241
  const { chromium } = await import("@playwright/test");
259
242
  const executablePath = chromiumExecutablePath();
@@ -318,8 +301,8 @@ export async function runTraverse(projectDir, options = {}) {
318
301
  const mem = new MemPage();
319
302
  seedMem(library.byName, mem, options.data);
320
303
  if (startUrl) {
321
- await page.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(() => { });
322
- await page.waitForLoadState("load").catch(() => { });
304
+ await page.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(ignorePageGone);
305
+ await page.waitForLoadState("load").catch(ignoreTimeout);
323
306
  }
324
307
  const traverseId = options.traverseId ?? "traverse-1";
325
308
  const result = await runTraverseWorker({
@@ -342,7 +325,7 @@ export async function runTraverse(projectDir, options = {}) {
342
325
  mem,
343
326
  leases,
344
327
  });
345
- await context.close().catch(() => { });
328
+ await context.close().catch(ignorePageGone);
346
329
  const coverageCode = emitCoverage([{ traverseId, result }]);
347
330
  if (result.exitCode !== 0)
348
331
  return result.exitCode;
@@ -359,12 +342,12 @@ export async function runTraverse(projectDir, options = {}) {
359
342
  const bootMem = new MemPage();
360
343
  seedMem(library.byName, bootMem, options.data);
361
344
  if (startUrl) {
362
- await bootPage.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(() => { });
363
- await bootPage.waitForLoadState("load").catch(() => { });
345
+ await bootPage.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(ignorePageGone);
346
+ await bootPage.waitForLoadState("load").catch(ignoreTimeout);
364
347
  }
365
348
  const storageState = await bootContext.storageState();
366
349
  const memSnap = snapshotMem(library.byName, bootMem);
367
- await bootContext.close().catch(() => { });
350
+ await bootContext.close().catch(ignorePageGone);
368
351
  console.error(`waygraph traverse: forked ${parallel} clone workers (storageState + mem snapshot)`);
369
352
  const workerMeta = await Promise.all(Array.from({ length: parallel }, async (_, i) => {
370
353
  const traverseId = `traverse-${i + 1}`;
@@ -379,7 +362,7 @@ export async function runTraverse(projectDir, options = {}) {
379
362
  const mem = new MemPage();
380
363
  restoreMem(library.byName, mem, memSnap, options.data);
381
364
  if (startUrl) {
382
- await page.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(() => { });
365
+ await page.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(ignorePageGone);
383
366
  }
384
367
  try {
385
368
  const result = await runTraverseWorker({
@@ -405,7 +388,7 @@ export async function runTraverse(projectDir, options = {}) {
405
388
  return { traverseId, result };
406
389
  }
407
390
  finally {
408
- await context.close().catch(() => { });
391
+ await context.close().catch(ignorePageGone);
409
392
  }
410
393
  }));
411
394
  const results = workerMeta.map((w) => w.result);
@@ -418,6 +401,6 @@ export async function runTraverse(projectDir, options = {}) {
418
401
  return coverageCode;
419
402
  }
420
403
  finally {
421
- await browser.close().catch(() => { });
404
+ await browser.close().catch(ignorePageGone);
422
405
  }
423
406
  }
@@ -0,0 +1,52 @@
1
+ import type { BlockKind, ProjectScan, ScanOptions } from "./project.js";
2
+ export declare const MANIFEST_VERSION = 1;
3
+ export interface ManifestBlock {
4
+ /** `file#exportName`, unique across the project. */
5
+ id: string;
6
+ name: string;
7
+ exportName: string;
8
+ kind: BlockKind;
9
+ description: string;
10
+ from: string[];
11
+ to: string[];
12
+ requires: string[];
13
+ file: string;
14
+ /** The `src/map/` group folder the Block lives in (e.g. `(external)/hoppscotch`), or the map package it came from. */
15
+ map?: string;
16
+ }
17
+ export interface ManifestFlow {
18
+ /** `file#exportName`. */
19
+ id: string;
20
+ exportName: string;
21
+ file: string;
22
+ /** The folders under `src/flows/` (the page or `(user-story)` it belongs to) and the file's name (the outcome). */
23
+ useCase: {
24
+ path: string[];
25
+ outcome: string;
26
+ };
27
+ /** Block names in run order, nested flows flattened. */
28
+ steps: string[];
29
+ settings: {
30
+ memStub?: true;
31
+ expectedFailure?: string;
32
+ sessionReset?: true;
33
+ demoPace?: unknown;
34
+ };
35
+ }
36
+ export interface Manifest {
37
+ version: number;
38
+ project: {
39
+ name: string;
40
+ dir: string;
41
+ waygraph: string;
42
+ };
43
+ checkpoints: string[];
44
+ maps: string[];
45
+ blocks: ManifestBlock[];
46
+ flows: ManifestFlow[];
47
+ skipped: ProjectScan["skipped"];
48
+ }
49
+ /** Builds the manifest from a scan. */
50
+ export declare function manifestFromScan(scan: ProjectScan): Manifest;
51
+ /** Scans the project and returns its manifest. */
52
+ export declare function buildManifest(projectDir: string, opts?: ScanOptions): Promise<Manifest>;
@@ -0,0 +1,93 @@
1
+ // The manifest: everything a project defines, as plain JSON. `waygraph manifest` prints it; Waygraph UI and map packages
2
+ // read it instead of importing the project.
3
+ import { readFileSync } from "node:fs";
4
+ import { dirname, join } from "node:path";
5
+ import { scanProject } from "./project.js";
6
+ export const MANIFEST_VERSION = 1;
7
+ function packageVersion() {
8
+ try {
9
+ return JSON.parse(readFileSync(join(dirname(new URL(import.meta.url).pathname), "..", "..", "package.json"), "utf8")).version;
10
+ }
11
+ catch {
12
+ return "unknown";
13
+ }
14
+ }
15
+ function projectName(dir) {
16
+ try {
17
+ return JSON.parse(readFileSync(join(dir, "package.json"), "utf8")).name ?? dir;
18
+ }
19
+ catch {
20
+ return dir;
21
+ }
22
+ }
23
+ /** `(external)/hoppscotch` for `src/map/(external)/hoppscotch/_methods/x.block.ts`: the group plus its first folder. */
24
+ function mapGroupOf(file) {
25
+ const parts = file.split(/[\\/]/);
26
+ const i = parts.indexOf("map");
27
+ if (i < 0 || parts[i - 1] !== "src")
28
+ return undefined;
29
+ const rest = parts.slice(i + 1, -1);
30
+ if (rest.length === 0)
31
+ return undefined;
32
+ return /^\(.*\)$/.test(rest[0]) && rest[1] && !rest[1].startsWith("_") ? `${rest[0]}/${rest[1]}` : rest[0];
33
+ }
34
+ function useCaseOf(file) {
35
+ const parts = file.split(/[\\/]/);
36
+ const i = parts.indexOf("flows");
37
+ const folders = i >= 0 ? parts.slice(i + 1, -1) : [];
38
+ return { path: folders, outcome: parts[parts.length - 1].replace(/\.flow\.ts$/, "") };
39
+ }
40
+ /** Builds the manifest from a scan. */
41
+ export function manifestFromScan(scan) {
42
+ const checkpoints = new Set();
43
+ const maps = new Set();
44
+ const blocks = scan.blocks.map((b) => {
45
+ for (const t of [...b.from, ...b.to])
46
+ if (t !== "*")
47
+ checkpoints.add(t);
48
+ const map = b.map ?? mapGroupOf(b.file);
49
+ if (map)
50
+ maps.add(map);
51
+ return {
52
+ id: `${b.file}#${b.exportName}`,
53
+ name: b.name,
54
+ exportName: b.exportName,
55
+ kind: b.kind,
56
+ description: b.description,
57
+ from: b.from,
58
+ to: b.to,
59
+ requires: b.requires,
60
+ file: b.file,
61
+ ...(map ? { map } : {}),
62
+ };
63
+ });
64
+ const flows = scan.flows.map((f) => {
65
+ const flow = f.flow;
66
+ return {
67
+ id: `${f.file}#${f.exportName}`,
68
+ exportName: f.exportName,
69
+ file: f.file,
70
+ useCase: useCaseOf(f.file),
71
+ steps: flow.blocks().map((s) => s.name),
72
+ settings: {
73
+ ...(flow.memStub ? { memStub: true } : {}),
74
+ ...(flow.expectedFailureReason ? { expectedFailure: flow.expectedFailureReason } : {}),
75
+ ...(flow.resetSession ? { sessionReset: true } : {}),
76
+ ...(flow.demoPace !== undefined ? { demoPace: flow.demoPace } : {}),
77
+ },
78
+ };
79
+ });
80
+ return {
81
+ version: MANIFEST_VERSION,
82
+ project: { name: projectName(scan.projectDir), dir: scan.projectDir, waygraph: packageVersion() },
83
+ checkpoints: [...checkpoints].sort(),
84
+ maps: [...maps].sort(),
85
+ blocks,
86
+ flows,
87
+ skipped: scan.skipped,
88
+ };
89
+ }
90
+ /** Scans the project and returns its manifest. */
91
+ export async function buildManifest(projectDir, opts = {}) {
92
+ return manifestFromScan(await scanProject(projectDir, opts));
93
+ }
@@ -0,0 +1,7 @@
1
+ import type { MapGroup } from "./maps.js";
2
+ export interface MapImportProblem {
3
+ file: string;
4
+ spec: string;
5
+ }
6
+ /** Imports in a group that reach outside it. */
7
+ export declare function mapGroupImportProblems(group: MapGroup): MapImportProblem[];
@@ -0,0 +1,22 @@
1
+ // The rule that makes a map group packable: its files import only waygraph, Playwright, `node:` modules and each other.
2
+ import { dirname, resolve, sep } from "node:path";
3
+ import { walkDir } from "./scan.js";
4
+ import { importSpecifiers, parseSource } from "./source.js";
5
+ const ALLOWED_BARE = /^(waygraph|@playwright\/test|playwright|playwright-core)(\/.*)?$|^node:/;
6
+ /** Imports in a group that reach outside it. */
7
+ export function mapGroupImportProblems(group) {
8
+ const problems = [];
9
+ for (const file of walkDir(group.dir, /\.ts$/)) {
10
+ for (const spec of importSpecifiers(parseSource(file))) {
11
+ if (spec.startsWith(".")) {
12
+ const target = resolve(dirname(file), spec);
13
+ if (target === group.dir || target.startsWith(group.dir + sep))
14
+ continue;
15
+ }
16
+ else if (ALLOWED_BARE.test(spec))
17
+ continue;
18
+ problems.push({ file, spec });
19
+ }
20
+ }
21
+ return problems;
22
+ }
@@ -0,0 +1,33 @@
1
+ export interface MapGroup {
2
+ /** Path under `src/map/`, e.g. `(external)/hoppscotch`. */
3
+ group: string;
4
+ dir: string;
5
+ }
6
+ /** Every packable group: a folder under `src/map/` with its own `_states.ts`. */
7
+ export declare function mapGroups(projectDir: string): MapGroup[];
8
+ /** Finds a group by its full path (`(external)/hoppscotch`) or its last folder (`hoppscotch`). */
9
+ export declare function findMapGroup(projectDir: string, name: string): MapGroup | undefined;
10
+ export interface MapPackageJson {
11
+ version: number;
12
+ name: string;
13
+ group: string;
14
+ checkpoints: string[];
15
+ blocks: {
16
+ name: string;
17
+ exportName: string;
18
+ kind: string;
19
+ from: string[];
20
+ to: string[];
21
+ requires: string[];
22
+ file: string;
23
+ }[];
24
+ }
25
+ export interface InstalledMapPackage {
26
+ name: string;
27
+ dir: string;
28
+ map: MapPackageJson;
29
+ }
30
+ /** Map packages the project depends on: dependencies whose root holds a `waygraph.map.json`. */
31
+ export declare function installedMapPackages(projectDir: string): InstalledMapPackage[];
32
+ /** The compiled Block files of an installed map package. */
33
+ export declare function mapPackageBlockFiles(pkg: InstalledMapPackage): string[];
@@ -0,0 +1,62 @@
1
+ // Map groups as packages. A group is a `src/map/` folder that owns its Checkpoints (`_states.ts`); it may import only
2
+ // `waygraph`, Playwright, `node:` modules and its own files, so it can be packed (`waygraph map pack`) and installed in
3
+ // another project, where the scanner finds it by its `waygraph.map.json`.
4
+ import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
5
+ import { dirname, join, relative, resolve, sep } from "node:path";
6
+ import { walkDir } from "./scan.js";
7
+ /** Every packable group: a folder under `src/map/` with its own `_states.ts`. */
8
+ export function mapGroups(projectDir) {
9
+ const mapRoot = join(resolve(projectDir), "src", "map");
10
+ if (!existsSync(mapRoot))
11
+ return [];
12
+ return walkDir(mapRoot, /^_states\.ts$/)
13
+ .map((f) => dirname(f))
14
+ .map((dir) => ({ group: relative(mapRoot, dir).split(sep).join("/"), dir }))
15
+ .sort((a, b) => a.group.localeCompare(b.group));
16
+ }
17
+ /** Finds a group by its full path (`(external)/hoppscotch`) or its last folder (`hoppscotch`). */
18
+ export function findMapGroup(projectDir, name) {
19
+ const groups = mapGroups(projectDir);
20
+ return groups.find((g) => g.group === name) ?? groups.find((g) => g.group.split("/").pop() === name);
21
+ }
22
+ /** Map packages the project depends on: dependencies whose root holds a `waygraph.map.json`. */
23
+ export function installedMapPackages(projectDir) {
24
+ let pkg;
25
+ try {
26
+ pkg = JSON.parse(readFileSync(join(projectDir, "package.json"), "utf8"));
27
+ }
28
+ catch {
29
+ return [];
30
+ }
31
+ const out = [];
32
+ for (const name of Object.keys({ ...pkg.dependencies, ...pkg.devDependencies }).sort()) {
33
+ const dir = join(projectDir, "node_modules", name);
34
+ const file = join(dir, "waygraph.map.json");
35
+ if (!existsSync(file))
36
+ continue;
37
+ try {
38
+ out.push({ name, dir, map: JSON.parse(readFileSync(file, "utf8")) });
39
+ }
40
+ catch {
41
+ /* a broken waygraph.map.json is skipped, like a Block file that fails to import */
42
+ }
43
+ }
44
+ return out;
45
+ }
46
+ /** The compiled Block files of an installed map package. */
47
+ export function mapPackageBlockFiles(pkg) {
48
+ const files = [];
49
+ const walk = (dir) => {
50
+ for (const name of readdirSync(dir)) {
51
+ const p = join(dir, name);
52
+ if (name === "node_modules")
53
+ continue;
54
+ if (statSync(p).isDirectory())
55
+ walk(p);
56
+ else if (/\.block\.js$/.test(name))
57
+ files.push(p);
58
+ }
59
+ };
60
+ walk(pkg.dir);
61
+ return files.sort();
62
+ }
@@ -0,0 +1,21 @@
1
+ import type { MapImportProblem } from "./map-imports.js";
2
+ export interface PackOptions {
3
+ /** Output folder. Default `.waygraph/packages/<group>`. */
4
+ out?: string | undefined;
5
+ /** Package name. Default `waygraph-map-<group>`. */
6
+ name?: string | undefined;
7
+ version?: string | undefined;
8
+ }
9
+ export type PackResult = {
10
+ ok: true;
11
+ name: string;
12
+ dir: string;
13
+ group: string;
14
+ blocks: number;
15
+ } | {
16
+ ok: false;
17
+ reason: string;
18
+ problems?: MapImportProblem[];
19
+ };
20
+ /** Packs a map group (by `(external)/hoppscotch` or `hoppscotch`) into an installable package folder. */
21
+ export declare function packMapGroup(projectDir: string, groupName: string, opts?: PackOptions): Promise<PackResult>;