waygraph 0.15.53 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (556) hide show
  1. package/README.md +8 -3
  2. package/bin/waygraph +2 -2
  3. package/dist/analysis/check.d.ts +38 -0
  4. package/dist/analysis/check.js +87 -0
  5. package/dist/analysis/coverage-gap.d.ts +1 -1
  6. package/dist/analysis/coverage-gap.js +14 -37
  7. package/dist/analysis/flow-source.d.ts +9 -0
  8. package/dist/analysis/flow-source.js +25 -0
  9. package/dist/analysis/graph.d.ts +13 -14
  10. package/dist/analysis/graph.js +48 -371
  11. package/dist/analysis/map-check.js +4 -39
  12. package/dist/analysis/practices-check.d.ts +1 -1
  13. package/dist/analysis/practices-check.js +24 -45
  14. package/dist/cli/args.d.ts +23 -0
  15. package/dist/cli/args.js +20 -0
  16. package/dist/{cli.d.ts → cli/cli.d.ts} +0 -1
  17. package/dist/{cli.js → cli/cli.js} +10 -9
  18. package/dist/{commands → cli/commands}/agent-dive-scaffold.js +35 -64
  19. package/dist/cli/commands/agent-dive.js +42 -0
  20. package/dist/{commands → cli/commands}/check.d.ts +0 -1
  21. package/dist/cli/commands/check.js +104 -0
  22. package/dist/cli/commands/codemod-checkpoints.d.ts +18 -0
  23. package/dist/cli/commands/codemod-checkpoints.js +186 -0
  24. package/dist/cli/commands/codemod-flows.d.ts +18 -0
  25. package/dist/cli/commands/codemod-flows.js +284 -0
  26. package/dist/cli/commands/codemod-stubs.d.ts +10 -0
  27. package/dist/cli/commands/codemod-stubs.js +187 -0
  28. package/dist/{commands → cli/commands}/extensions.js +5 -4
  29. package/dist/{commands → cli/commands}/init.js +1 -2
  30. package/dist/{commands → cli/commands}/list.js +9 -7
  31. package/dist/cli/commands/manifest.d.ts +2 -0
  32. package/dist/cli/commands/manifest.js +20 -0
  33. package/dist/cli/commands/map.js +57 -0
  34. package/dist/{commands → cli/commands}/run.d.ts +0 -1
  35. package/dist/cli/commands/run.js +64 -0
  36. package/dist/{commands → cli/commands}/session.js +61 -88
  37. package/dist/{commands → cli/commands}/test.js +11 -14
  38. package/dist/cli/commands/traverse.js +105 -0
  39. package/dist/{commands → cli/commands}/try.js +29 -25
  40. package/dist/{commands → cli/commands}/upgrade.js +40 -4
  41. package/dist/cli/flags.d.ts +193 -16
  42. package/dist/cli/flags.js +179 -234
  43. package/dist/cli/run-chain.d.ts +1 -0
  44. package/dist/cli/run-chain.js +42 -7
  45. package/dist/cli/usage.d.ts +1 -1
  46. package/dist/cli/usage.js +21 -53
  47. package/dist/cli/util.d.ts +2 -2
  48. package/dist/cli/util.js +2 -3
  49. package/dist/{highlights → demo/narration}/css.d.ts +1 -1
  50. package/dist/{highlights → demo/narration}/css.js +2 -3
  51. package/dist/{highlights → demo/narration}/demo-pace.d.ts +7 -11
  52. package/dist/{highlights → demo/narration}/demo-pace.js +9 -11
  53. package/dist/{highlights → demo/narration}/device.d.ts +4 -2
  54. package/dist/{highlights → demo/narration}/device.js +3 -1
  55. package/dist/demo/narration/merge.d.ts +8 -0
  56. package/dist/demo/narration/merge.js +71 -0
  57. package/dist/{highlights/run-phase.d.ts → demo/narration/narration.d.ts} +10 -14
  58. package/dist/{highlights/run-phase.js → demo/narration/narration.js} +25 -94
  59. package/dist/{highlights → demo/narration}/shorthand.d.ts +1 -1
  60. package/dist/demo/narration/stub-ctx.d.ts +8 -0
  61. package/dist/demo/narration/stub-ctx.js +164 -0
  62. package/dist/{highlights → demo/narration}/style.d.ts +1 -7
  63. package/dist/{highlights → demo/narration}/style.js +1 -41
  64. package/dist/{highlights → demo/narration}/todo-dock.d.ts +3 -3
  65. package/dist/{highlights → demo/narration}/todo-dock.js +13 -30
  66. package/dist/demo/overlay/auto-chrome.d.ts +7 -0
  67. package/dist/demo/overlay/auto-chrome.js +97 -0
  68. package/dist/{session/overlay-beacon.d.ts → demo/overlay/beacon.d.ts} +7 -0
  69. package/dist/{session/overlay-beacon.js → demo/overlay/beacon.js} +5 -0
  70. package/dist/demo/overlay/cursor.d.ts +12 -0
  71. package/dist/demo/overlay/cursor.js +142 -0
  72. package/dist/demo/overlay/device-stage.d.ts +13 -0
  73. package/dist/demo/overlay/device-stage.js +396 -0
  74. package/dist/demo/overlay/inpage/banner.d.ts +1 -0
  75. package/dist/demo/overlay/inpage/banner.js +160 -0
  76. package/dist/demo/overlay/inpage/caption.d.ts +2 -0
  77. package/dist/demo/overlay/inpage/caption.js +24 -0
  78. package/dist/demo/overlay/inpage/core.d.ts +1 -0
  79. package/dist/demo/overlay/inpage/core.js +345 -0
  80. package/dist/demo/overlay/inpage/device-chip.d.ts +1 -0
  81. package/dist/demo/overlay/inpage/device-chip.js +191 -0
  82. package/dist/demo/overlay/inpage/network.d.ts +9 -0
  83. package/dist/demo/overlay/inpage/network.js +200 -0
  84. package/dist/demo/overlay/inpage/panel-chrome.d.ts +1 -0
  85. package/dist/demo/overlay/inpage/panel-chrome.js +203 -0
  86. package/dist/demo/overlay/inpage/stamp.d.ts +1 -0
  87. package/dist/demo/overlay/inpage/stamp.js +46 -0
  88. package/dist/demo/overlay/inpage/swipe-zoom.d.ts +1 -0
  89. package/dist/demo/overlay/inpage/swipe-zoom.js +220 -0
  90. package/dist/demo/overlay/inpage/todos.d.ts +1 -0
  91. package/dist/demo/overlay/inpage/todos.js +294 -0
  92. package/dist/demo/overlay/locator-theater.d.ts +25 -0
  93. package/dist/demo/overlay/locator-theater.js +76 -0
  94. package/dist/demo/overlay/network-capture.d.ts +22 -0
  95. package/dist/demo/overlay/network-capture.js +127 -0
  96. package/dist/demo/overlay/overlay-css.d.ts +3 -0
  97. package/dist/demo/overlay/overlay-css.js +369 -0
  98. package/dist/demo/overlay/overlay-stage.d.ts +23 -0
  99. package/dist/demo/overlay/overlay-stage.js +106 -0
  100. package/dist/demo/overlay/overlay.d.ts +10 -0
  101. package/dist/demo/overlay/overlay.js +89 -0
  102. package/dist/{pilot-overlay/overlay-fixtures.d.ts → demo/overlay/phase-fixtures.d.ts} +2 -2
  103. package/dist/{pilot-overlay/overlay-fixtures.js → demo/overlay/phase-fixtures.js} +2 -2
  104. package/dist/{pilot-overlay/action-ring.js → demo/overlay/pilot/actions.js} +2 -1
  105. package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.d.ts +6 -5
  106. package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.js +19 -18
  107. package/dist/{pilot-overlay → demo/overlay/pilot}/shell.d.ts +2 -2
  108. package/dist/{pilot-overlay → demo/overlay/pilot}/shell.js +13 -22
  109. package/dist/demo/overlay/reattach.d.ts +7 -0
  110. package/dist/demo/overlay/reattach.js +23 -0
  111. package/dist/demo/overlay/rings.d.ts +33 -0
  112. package/dist/demo/overlay/rings.js +448 -0
  113. package/dist/{ui → demo/overlay/ui}/components/ring.js +2 -2
  114. package/dist/{ui → demo/overlay/ui}/overlay.css +4 -4
  115. package/dist/{ui → demo/overlay/ui}/shadow.d.ts +1 -1
  116. package/dist/{ui → demo/overlay/ui}/shadow.js +39 -2
  117. package/dist/demo/stepper/after.d.ts +3 -0
  118. package/dist/demo/stepper/after.js +113 -0
  119. package/dist/demo/stepper/banner-log.d.ts +37 -0
  120. package/dist/demo/stepper/banner-log.js +63 -0
  121. package/dist/demo/stepper/before.d.ts +4 -0
  122. package/dist/demo/stepper/before.js +110 -0
  123. package/dist/demo/stepper/demo-log.d.ts +31 -0
  124. package/dist/demo/stepper/demo-log.js +309 -0
  125. package/dist/demo/stepper/gate.d.ts +11 -0
  126. package/dist/demo/stepper/gate.js +78 -0
  127. package/dist/demo/stepper/interaction-patch.d.ts +3 -0
  128. package/dist/demo/stepper/interaction-patch.js +323 -0
  129. package/dist/demo/stepper/pacing.d.ts +21 -0
  130. package/dist/demo/stepper/pacing.js +23 -0
  131. package/dist/demo/stepper/slides.d.ts +11 -0
  132. package/dist/demo/stepper/slides.js +233 -0
  133. package/dist/demo/stepper/step-panels.d.ts +21 -0
  134. package/dist/demo/stepper/step-panels.js +589 -0
  135. package/dist/demo/stepper/stepper.d.ts +24 -0
  136. package/dist/demo/stepper/stepper.js +122 -0
  137. package/dist/demo/stepper/teardown.d.ts +48 -0
  138. package/dist/demo/stepper/teardown.js +179 -0
  139. package/dist/demo/stepper/todo-advance.d.ts +14 -0
  140. package/dist/demo/stepper/todo-advance.js +110 -0
  141. package/dist/demo/stepper/view.d.ts +68 -0
  142. package/dist/demo/stepper/view.js +31 -0
  143. package/dist/demo/types.d.ts +17 -0
  144. package/dist/demo/verbose-log.js +15 -0
  145. package/dist/{types.d.ts → engine/block/block.d.ts} +106 -91
  146. package/dist/{core → engine/block}/block.js +10 -53
  147. package/dist/{core → engine/block}/compose.d.ts +10 -7
  148. package/dist/{core → engine/block}/compose.js +1 -1
  149. package/dist/{core/blocks → engine/block/kinds}/api.d.ts +17 -12
  150. package/dist/{core/blocks → engine/block/kinds}/api.js +26 -18
  151. package/dist/{core/blocks → engine/block/kinds}/effect.d.ts +13 -18
  152. package/dist/engine/block/kinds/effect.js +17 -0
  153. package/dist/{core/blocks → engine/block/kinds}/method.d.ts +19 -29
  154. package/dist/{core/blocks → engine/block/kinds}/method.js +7 -21
  155. package/dist/{core/blocks → engine/block/kinds}/nav.d.ts +22 -31
  156. package/dist/{core/blocks → engine/block/kinds}/nav.js +6 -12
  157. package/dist/{core/blocks → engine/block/kinds}/page.d.ts +15 -20
  158. package/dist/{core/blocks → engine/block/kinds}/page.js +5 -7
  159. package/dist/engine/checkpoint/checkpoint.d.ts +22 -0
  160. package/dist/engine/checkpoint/checkpoint.js +8 -0
  161. package/dist/engine/checkpoint/route.d.ts +28 -0
  162. package/dist/engine/checkpoint/route.js +28 -0
  163. package/dist/{core → engine}/config.d.ts +7 -2
  164. package/dist/engine/config.js +6 -0
  165. package/dist/engine/engine.d.ts +45 -0
  166. package/dist/{core → engine}/engine.js +6 -10
  167. package/dist/engine/env.d.ts +59 -0
  168. package/dist/engine/env.js +83 -0
  169. package/dist/{errors.d.ts → engine/errors.d.ts} +23 -22
  170. package/dist/{errors.js → engine/errors.js} +22 -22
  171. package/dist/{core → engine/flow}/branch-regression.d.ts +8 -7
  172. package/dist/{core → engine/flow}/branch-regression.js +4 -3
  173. package/dist/engine/flow/flow.d.ts +162 -0
  174. package/dist/engine/flow/flow.js +244 -0
  175. package/dist/{core → engine/flow}/map-builder.d.ts +42 -40
  176. package/dist/{core → engine/flow}/map-builder.js +46 -48
  177. package/dist/{core → engine}/locate.d.ts +1 -1
  178. package/dist/{core → engine}/locate.js +1 -2
  179. package/dist/{mem-stub.d.ts → engine/mem/mem-stub.d.ts} +9 -8
  180. package/dist/{mem-stub.js → engine/mem/mem-stub.js} +2 -2
  181. package/dist/{mem-page.d.ts → engine/mem/mem.d.ts} +1 -1
  182. package/dist/{mem-page.js → engine/mem/mem.js} +2 -1
  183. package/dist/engine/page-gone.d.ts +5 -0
  184. package/dist/engine/page-gone.js +20 -0
  185. package/dist/engine/run/connect.d.ts +28 -0
  186. package/dist/{types.js → engine/run/connect.js} +11 -10
  187. package/dist/engine/run/events.d.ts +67 -0
  188. package/dist/engine/run/events.js +90 -0
  189. package/dist/engine/run/hooks.d.ts +16 -0
  190. package/dist/engine/run/hooks.js +8 -0
  191. package/dist/engine/run/launch.d.ts +13 -0
  192. package/dist/engine/run/launch.js +27 -0
  193. package/dist/{core/run-graph.d.ts → engine/run/run.d.ts} +9 -11
  194. package/dist/{core/run-graph.js → engine/run/run.js} +22 -11
  195. package/dist/engine/stub/pace.d.ts +12 -0
  196. package/dist/engine/stub/pace.js +2 -0
  197. package/dist/engine/stub/ring.d.ts +130 -0
  198. package/dist/engine/stub/ring.js +41 -0
  199. package/dist/engine/stub/stub.d.ts +268 -0
  200. package/dist/engine/stub/stub.js +1 -0
  201. package/dist/engine/stub/todos.d.ts +104 -0
  202. package/dist/engine/stub/todos.js +2 -0
  203. package/dist/engine/stub/viewport.d.ts +26 -0
  204. package/dist/engine/stub/viewport.js +2 -0
  205. package/dist/{trait.d.ts → engine/trait/trait.d.ts} +1 -1
  206. package/dist/index.d.ts +84 -36
  207. package/dist/index.js +44 -19
  208. package/dist/{session/auto-explore-run.d.ts → live/auto/auto.d.ts} +10 -16
  209. package/dist/{session/auto-explore-run.js → live/auto/auto.js} +164 -248
  210. package/dist/{session/auto-explore.d.ts → live/auto/explore.d.ts} +4 -14
  211. package/dist/{session/auto-explore.js → live/auto/explore.js} +21 -127
  212. package/dist/{auto-session/session.d.ts → live/auto-session/auto-session.d.ts} +1 -1
  213. package/dist/{auto-session/session.js → live/auto-session/auto-session.js} +27 -24
  214. package/dist/{auto-session → live/auto-session}/helpers.d.ts +16 -5
  215. package/dist/{auto-session → live/auto-session}/helpers.js +1 -1
  216. package/dist/{session/auto-session-ipc.d.ts → live/auto-session/ipc.d.ts} +7 -5
  217. package/dist/{session/auto-session-ipc.js → live/auto-session/ipc.js} +31 -16
  218. package/dist/{session/browser.d.ts → live/auto-session/start.d.ts} +1 -2
  219. package/dist/{session/browser.js → live/auto-session/start.js} +2 -3
  220. package/dist/{pilot-overlay → live/pilot}/panel.d.ts +1 -1
  221. package/dist/{pilot-overlay → live/pilot}/panel.js +23 -31
  222. package/dist/{session → live/pilot}/pilot.d.ts +4 -3
  223. package/dist/{session → live/pilot}/pilot.js +4 -4
  224. package/dist/{traverse → live/traverse}/coverage.d.ts +4 -0
  225. package/dist/{traverse → live/traverse}/coverage.js +3 -0
  226. package/dist/{traverse → live/traverse}/lease.d.ts +1 -0
  227. package/dist/{traverse → live/traverse}/lease.js +1 -0
  228. package/dist/{traverse/run.d.ts → live/traverse/traverse.d.ts} +4 -1
  229. package/dist/{traverse/run.js → live/traverse/traverse.js} +26 -43
  230. package/dist/manifest/manifest.d.ts +52 -0
  231. package/dist/manifest/manifest.js +93 -0
  232. package/dist/manifest/map-imports.d.ts +7 -0
  233. package/dist/manifest/map-imports.js +22 -0
  234. package/dist/manifest/maps.d.ts +33 -0
  235. package/dist/manifest/maps.js +62 -0
  236. package/dist/manifest/pack.d.ts +21 -0
  237. package/dist/manifest/pack.js +109 -0
  238. package/dist/manifest/project.d.ts +60 -0
  239. package/dist/manifest/project.js +101 -0
  240. package/dist/{session/block-inject.js → manifest/roots.js} +1 -18
  241. package/dist/manifest/scan.d.ts +19 -0
  242. package/dist/manifest/scan.js +57 -0
  243. package/dist/{blocks-select.d.ts → manifest/select.d.ts} +3 -0
  244. package/dist/{blocks-select.js → manifest/select.js} +2 -0
  245. package/dist/manifest/source.d.ts +23 -0
  246. package/dist/manifest/source.js +86 -0
  247. package/dist/runner/mode.d.ts +71 -0
  248. package/dist/runner/mode.js +1 -0
  249. package/dist/runner/modes/branches.d.ts +5 -0
  250. package/dist/runner/modes/branches.js +37 -0
  251. package/dist/runner/modes/demo.d.ts +3 -0
  252. package/dist/runner/modes/demo.js +13 -0
  253. package/dist/runner/modes/report.d.ts +2 -0
  254. package/dist/runner/modes/report.js +54 -0
  255. package/dist/runner/modes/run.d.ts +2 -0
  256. package/dist/runner/modes/run.js +3 -0
  257. package/dist/runner/options.d.ts +31 -0
  258. package/dist/runner/options.js +42 -0
  259. package/dist/runner/plan/find.d.ts +18 -0
  260. package/dist/runner/plan/find.js +65 -0
  261. package/dist/runner/plan/plan.d.ts +11 -0
  262. package/dist/runner/plan/plan.js +97 -0
  263. package/dist/runner/plan/seed-mem.d.ts +12 -0
  264. package/dist/runner/plan/seed-mem.js +98 -0
  265. package/dist/runner/plan/spec.d.ts +5 -0
  266. package/dist/runner/plan/spec.js +17 -0
  267. package/dist/runner/play-steps.d.ts +2 -0
  268. package/dist/runner/play-steps.js +59 -0
  269. package/dist/runner/runner.d.ts +4 -0
  270. package/dist/runner/runner.js +64 -0
  271. package/dist/runner/session.d.ts +9 -0
  272. package/dist/runner/session.js +87 -0
  273. package/dist/{browser.js → runtime/browser.js} +4 -2
  274. package/dist/{env-file.js → runtime/env-file.js} +7 -12
  275. package/dist/{extensions.d.ts → runtime/extensions.d.ts} +2 -5
  276. package/dist/{extensions.js → runtime/extensions.js} +3 -1
  277. package/dist/runtime/full-launch.d.ts +1 -0
  278. package/dist/runtime/full-launch.js +34 -0
  279. package/dist/runtime/global-flag.d.ts +5 -0
  280. package/dist/runtime/global-flag.js +18 -0
  281. package/dist/{playwright-config.d.ts → runtime/playwright-config.d.ts} +1 -1
  282. package/dist/{playwright.config.js → runtime/playwright.config.js} +3 -2
  283. package/dist/runtime/run-log.d.ts +2 -0
  284. package/dist/runtime/run-log.js +17 -0
  285. package/dist/{video-dir.js → runtime/video-dir.js} +3 -2
  286. package/dist/{config.d.ts → runtime/waygraph-config.d.ts} +8 -9
  287. package/dist/{config.js → runtime/waygraph-config.js} +21 -51
  288. package/dist/{webserver.js → runtime/webserver.js} +5 -30
  289. package/examples/routed-demo/config/waygraph.config.ts +20 -0
  290. package/examples/routed-demo/package.json +1 -4
  291. package/examples/routed-demo/scripts/fixture-server.mjs +1 -1
  292. package/examples/routed-demo/src/flows/routed-demo-map.flow.ts +2 -4
  293. package/examples/routed-demo/src/flows/routed-demo.flow.ts +2 -3
  294. package/examples/routed-demo/src/map/(app_base)/dashboard/_methods/click-widget.block.ts +5 -4
  295. package/examples/routed-demo/src/map/(app_base)/dashboard/_nav.block.ts +3 -3
  296. package/examples/routed-demo/src/map/(app_base)/dashboard/_page.block.ts +3 -3
  297. package/examples/routed-demo/src/map/(external)/docs/_nav.block.ts +3 -3
  298. package/examples/routed-demo/src/map/(external)/docs/_page.block.ts +3 -3
  299. package/examples/routed-demo/src/states/routed-demo.states.ts +5 -3
  300. package/examples/routed-demo/tests/routed-demo.spec.ts +4 -4
  301. package/examples/routed-demo/tsconfig.json +1 -1
  302. package/examples/saucedemo/README.md +11 -12
  303. package/examples/saucedemo/config/waygraph.config.ts +17 -0
  304. package/examples/saucedemo/docs/CONVENTION.md +5 -7
  305. package/examples/saucedemo/docs/HELPERS.md +12 -12
  306. package/examples/saucedemo/package-lock.json +10 -3
  307. package/examples/saucedemo/package.json +12 -29
  308. package/examples/saucedemo/src/blocks/SITE-MAP.md +0 -1
  309. package/examples/saucedemo/src/blocks/saucedemo-web/NAV.md +1 -5
  310. package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -52
  311. package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
  312. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
  313. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
  314. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
  315. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
  316. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +21 -27
  317. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -9
  318. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
  319. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +10 -76
  320. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
  321. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
  322. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
  323. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
  324. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
  325. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
  326. package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -29
  327. package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -48
  328. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +13 -77
  329. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
  330. package/examples/saucedemo/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
  331. package/examples/saucedemo/src/flows/api-demo.flow.ts +26 -18
  332. package/examples/saucedemo/src/flows/cart-bulk.flow.ts +19 -14
  333. package/examples/saucedemo/src/flows/cart-continue.flow.ts +10 -8
  334. package/examples/saucedemo/src/flows/cart-mem.flow.ts +7 -7
  335. package/examples/saucedemo/src/flows/catalog-logout.flow.ts +13 -8
  336. package/examples/saucedemo/src/flows/checkout-then-browse-again.flow.ts +26 -48
  337. package/examples/saucedemo/src/flows/checkout.flow.ts +70 -86
  338. package/examples/saucedemo/src/flows/device-showcase.flow.ts +24 -25
  339. package/examples/saucedemo/src/flows/login.flow.ts +11 -18
  340. package/examples/saucedemo/src/flows/mem-stub-demo.flow.ts +9 -20
  341. package/examples/saucedemo/src/flows/shop.flow.ts +15 -20
  342. package/examples/saucedemo/src/flows/smoke.flow.ts +12 -27
  343. package/examples/saucedemo/src/flows/stub-on-error.flow.ts +24 -43
  344. package/examples/saucedemo/src/flows/viewer-blocked.flow.ts +26 -34
  345. package/examples/saucedemo/src/states/checkout.mem-stubs.ts +11 -0
  346. package/examples/saucedemo/src/states/checkout.states.ts +21 -11
  347. package/examples/saucedemo/src/stubs/device-showcase.ts +191 -0
  348. package/examples/saucedemo/src/stubs/login.ts +37 -0
  349. package/examples/saucedemo/tests/auto-graph.spec.ts +4 -12
  350. package/examples/saucedemo/tests/chain-flow-episodes.spec.ts +7 -9
  351. package/examples/saucedemo/tests/submit-login-branch.spec.ts +18 -5
  352. package/package.json +12 -7
  353. package/templates/agents/waygraph-planner.agent.md +2 -2
  354. package/templates/quickstart/README.md +4 -7
  355. package/templates/quickstart/config/waygraph.config.ts +17 -0
  356. package/templates/quickstart/docs/CONVENTION.md +5 -6
  357. package/templates/quickstart/docs/HELPERS.md +11 -9
  358. package/templates/quickstart/package.json +14 -17
  359. package/templates/quickstart/src/blocks/SITE-MAP.md +13 -3
  360. package/templates/quickstart/src/blocks/saucedemo-web/NAV.md +1 -5
  361. package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -52
  362. package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
  363. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
  364. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
  365. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
  366. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
  367. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +21 -27
  368. package/templates/quickstart/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -9
  369. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
  370. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +10 -76
  371. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
  372. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
  373. package/templates/quickstart/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
  374. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
  375. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
  376. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
  377. package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -29
  378. package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -48
  379. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +13 -77
  380. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
  381. package/templates/quickstart/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
  382. package/templates/quickstart/src/flows/api-demo.flow.ts +45 -0
  383. package/templates/quickstart/src/flows/cart-bulk.flow.ts +19 -14
  384. package/templates/quickstart/src/flows/cart-continue.flow.ts +10 -8
  385. package/templates/quickstart/src/flows/cart-mem.flow.ts +7 -7
  386. package/templates/quickstart/src/flows/catalog-logout.flow.ts +13 -8
  387. package/templates/quickstart/src/flows/checkout-then-browse-again.flow.ts +26 -48
  388. package/templates/quickstart/src/flows/checkout.flow.ts +70 -63
  389. package/templates/quickstart/src/flows/device-showcase.flow.ts +24 -25
  390. package/templates/quickstart/src/flows/login.flow.ts +11 -18
  391. package/templates/quickstart/src/flows/mem-stub-demo.flow.ts +12 -0
  392. package/templates/quickstart/src/flows/shop.flow.ts +15 -20
  393. package/templates/quickstart/src/flows/smoke.flow.ts +12 -27
  394. package/templates/quickstart/src/flows/stub-on-error.flow.ts +31 -0
  395. package/templates/quickstart/src/flows/viewer-blocked.flow.ts +26 -34
  396. package/templates/quickstart/src/states/checkout.mem-stubs.ts +11 -0
  397. package/templates/quickstart/src/states/checkout.states.ts +21 -11
  398. package/templates/quickstart/src/stubs/device-showcase.ts +191 -0
  399. package/templates/quickstart/src/stubs/login.ts +37 -0
  400. package/templates/quickstart/tests/chain-flow.spec.ts +7 -10
  401. package/templates/scaffold/README.md +2 -1
  402. package/templates/scaffold/STRUCTURE.md +5 -4
  403. package/templates/scaffold/config/waygraph.config.ts +1 -0
  404. package/templates/scaffold/gitignore +1 -0
  405. package/templates/scaffold/src/flows/README.md +2 -2
  406. package/templates/scaffold/src/map/(app_base)/docs/_nav.block.ts +3 -3
  407. package/templates/scaffold/src/map/(app_base)/docs/_page.block.ts +3 -3
  408. package/templates/scaffold/src/map/(app_base)/home/_methods/add-item.effect.block.ts +4 -4
  409. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-hello.method.block.ts +3 -3
  410. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-item-added.method.block.ts +3 -3
  411. package/templates/scaffold/src/map/(app_base)/home/_methods/clear-cart.method.block.ts +5 -4
  412. package/templates/scaffold/src/map/(app_base)/home/_methods/remove-item.effect.block.ts +4 -4
  413. package/templates/scaffold/src/map/(app_base)/home/_nav.block.ts +3 -3
  414. package/templates/scaffold/src/map/(app_base)/home/_page.block.ts +3 -3
  415. package/templates/scaffold/src/map/(app_base)/home/nav-verification-link.block.ts +4 -4
  416. package/templates/scaffold/src/map/(external)/hoppscotch/_keys.ts +21 -0
  417. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-body.method.block.ts +4 -4
  418. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-header.method.block.ts +4 -4
  419. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-status.method.block.ts +4 -4
  420. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/pick-extension-interceptor.method.block.ts +5 -4
  421. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-body.method.block.ts +6 -5
  422. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-headers.method.block.ts +6 -5
  423. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/send-request.method.block.ts +5 -4
  424. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-bearer-token.method.block.ts +6 -5
  425. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-headers.method.block.ts +6 -5
  426. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-json-body.method.block.ts +6 -5
  427. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-method.method.block.ts +6 -5
  428. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-query-params.method.block.ts +6 -5
  429. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-url.method.block.ts +6 -5
  430. package/templates/scaffold/src/map/(external)/hoppscotch/_nav.block.ts +3 -3
  431. package/templates/scaffold/src/map/(external)/hoppscotch/_page.block.ts +3 -3
  432. package/templates/scaffold/src/map/(external)/hoppscotch/_states.ts +6 -0
  433. package/templates/scaffold/src/map/(external)/hoppscotch/settings/_nav.block.ts +3 -3
  434. package/templates/scaffold/src/map/(external)/mailpit/_keys.ts +13 -0
  435. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-content.method.block.ts +4 -4
  436. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-received.method.block.ts +4 -4
  437. package/templates/scaffold/src/map/(external)/mailpit/_methods/extract-email-link.method.block.ts +6 -5
  438. package/templates/scaffold/src/map/(external)/mailpit/_methods/open-message.method.block.ts +6 -5
  439. package/templates/scaffold/src/map/(external)/mailpit/_nav.block.ts +3 -3
  440. package/templates/scaffold/src/map/(external)/mailpit/_page.block.ts +3 -3
  441. package/templates/scaffold/src/map/(external)/mailpit/_states.ts +9 -0
  442. package/templates/scaffold/src/map/README.md +7 -0
  443. package/templates/scaffold/src/states/README.md +4 -1
  444. package/templates/scaffold/src/states/demo.mem-keys.ts +1 -29
  445. package/templates/scaffold/src/states/demo.states.ts +14 -20
  446. package/templates/scaffold/tests/hoppscotch.spec.ts +1 -11
  447. package/templates/scaffold/tests/mail-verify.spec.ts +2 -2
  448. package/templates/skills/waygraph-blind-pilot.skill.md +2 -6
  449. package/templates/skills/waygraph-convention.skill.md +23 -14
  450. package/templates/skills/waygraph-pilot.skill.md +7 -4
  451. package/dist/auto-session/verbose-log.js +0 -16
  452. package/dist/auto-session.d.ts +0 -2
  453. package/dist/auto-session.js +0 -3
  454. package/dist/cli/discover.d.ts +0 -40
  455. package/dist/cli/discover.js +0 -148
  456. package/dist/commands/agent-dive.js +0 -52
  457. package/dist/commands/check.js +0 -192
  458. package/dist/commands/map.js +0 -29
  459. package/dist/commands/run.js +0 -104
  460. package/dist/commands/traverse.js +0 -177
  461. package/dist/core/block.d.ts +0 -109
  462. package/dist/core/blocks/effect.js +0 -23
  463. package/dist/core/config.js +0 -17
  464. package/dist/core/engine.d.ts +0 -198
  465. package/dist/core/flow.d.ts +0 -293
  466. package/dist/core/flow.js +0 -432
  467. package/dist/core.d.ts +0 -14
  468. package/dist/core.js +0 -15
  469. package/dist/highlights/merge.d.ts +0 -8
  470. package/dist/highlights/merge.js +0 -173
  471. package/dist/highlights/stub-ctx.d.ts +0 -10
  472. package/dist/highlights/stub-ctx.js +0 -331
  473. package/dist/highlights/types.d.ts +0 -607
  474. package/dist/highlights.d.ts +0 -9
  475. package/dist/highlights.js +0 -10
  476. package/dist/pilot-overlay.d.ts +0 -5
  477. package/dist/pilot-overlay.js +0 -6
  478. package/dist/runner/banner-log.js +0 -63
  479. package/dist/runner/chain-run.js +0 -102
  480. package/dist/runner/cursor.js +0 -140
  481. package/dist/runner/demo-log.js +0 -316
  482. package/dist/runner/device-stage.d.ts +0 -9
  483. package/dist/runner/device-stage.js +0 -420
  484. package/dist/runner/discovery.js +0 -105
  485. package/dist/runner/index.js +0 -2
  486. package/dist/runner/inpage/banner.d.ts +0 -21
  487. package/dist/runner/inpage/banner.js +0 -156
  488. package/dist/runner/inpage/caption.d.ts +0 -3
  489. package/dist/runner/inpage/caption.js +0 -23
  490. package/dist/runner/inpage/core.d.ts +0 -4
  491. package/dist/runner/inpage/core.js +0 -316
  492. package/dist/runner/inpage/device.d.ts +0 -3
  493. package/dist/runner/inpage/device.js +0 -211
  494. package/dist/runner/inpage/network.d.ts +0 -15
  495. package/dist/runner/inpage/network.js +0 -217
  496. package/dist/runner/inpage/panel-chrome.js +0 -192
  497. package/dist/runner/inpage/stamp.js +0 -46
  498. package/dist/runner/inpage/swipe-zoom.js +0 -220
  499. package/dist/runner/inpage/todos.js +0 -337
  500. package/dist/runner/interaction-patch.js +0 -384
  501. package/dist/runner/main.js +0 -469
  502. package/dist/runner/network-capture.d.ts +0 -9
  503. package/dist/runner/network-capture.js +0 -126
  504. package/dist/runner/overlay-css.d.ts +0 -3
  505. package/dist/runner/overlay-css.js +0 -377
  506. package/dist/runner/overlay-install.js +0 -90
  507. package/dist/runner/overlay-stage.js +0 -110
  508. package/dist/runner/rings.js +0 -514
  509. package/dist/runner/seed-mem.js +0 -110
  510. package/dist/runner/slides.js +0 -278
  511. package/dist/runner/step-mode.js +0 -703
  512. package/dist/runner/step-panels.js +0 -729
  513. package/dist/runner/teardown.js +0 -202
  514. package/dist/runner/todo-dock.js +0 -142
  515. package/dist/session/step-overlay.d.ts +0 -37
  516. package/dist/session/step-overlay.js +0 -244
  517. package/examples/routed-demo/playwright.config.ts +0 -21
  518. package/examples/saucedemo/playwright.config.ts +0 -19
  519. package/examples/saucedemo/scripts/drive-auto-cli.mjs +0 -93
  520. package/examples/saucedemo/scripts/prove-add-to-cart-menu.mjs +0 -126
  521. package/examples/saucedemo/scripts/prove-auto-graph.mjs +0 -92
  522. package/examples/saucedemo/scripts/prove-wrong-login-runtime.mjs +0 -63
  523. package/examples/saucedemo/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
  524. package/templates/quickstart/playwright.config.ts +0 -14
  525. package/templates/quickstart/scripts/drive-auto-cli.mjs +0 -93
  526. package/templates/quickstart/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
  527. /package/dist/{commands → cli/commands}/agent-dive-scaffold.d.ts +0 -0
  528. /package/dist/{commands → cli/commands}/agent-dive.d.ts +0 -0
  529. /package/dist/{commands → cli/commands}/extensions.d.ts +0 -0
  530. /package/dist/{commands → cli/commands}/init.d.ts +0 -0
  531. /package/dist/{commands → cli/commands}/list.d.ts +0 -0
  532. /package/dist/{commands → cli/commands}/map.d.ts +0 -0
  533. /package/dist/{commands → cli/commands}/session.d.ts +0 -0
  534. /package/dist/{commands → cli/commands}/test.d.ts +0 -0
  535. /package/dist/{commands → cli/commands}/traverse.d.ts +0 -0
  536. /package/dist/{commands → cli/commands}/try.d.ts +0 -0
  537. /package/dist/{commands → cli/commands}/upgrade.d.ts +0 -0
  538. /package/dist/{highlights → demo/narration}/shorthand.js +0 -0
  539. /package/dist/{pilot-overlay/action-ring.d.ts → demo/overlay/pilot/actions.d.ts} +0 -0
  540. /package/dist/{ui → demo/overlay/ui}/components/ring.d.ts +0 -0
  541. /package/dist/{ui → demo/overlay/ui}/stylesheet.d.ts +0 -0
  542. /package/dist/{ui → demo/overlay/ui}/stylesheet.js +0 -0
  543. /package/dist/{ui → demo/overlay/ui}/tokens.d.ts +0 -0
  544. /package/dist/{ui → demo/overlay/ui}/tokens.js +0 -0
  545. /package/dist/{highlights → demo}/types.js +0 -0
  546. /package/dist/{auto-session → demo}/verbose-log.d.ts +0 -0
  547. /package/dist/{selector.d.ts → engine/trait/selector.d.ts} +0 -0
  548. /package/dist/{selector.js → engine/trait/selector.js} +0 -0
  549. /package/dist/{trait.js → engine/trait/trait.js} +0 -0
  550. /package/dist/{session/block-inject.d.ts → manifest/roots.d.ts} +0 -0
  551. /package/dist/{browser.d.ts → runtime/browser.d.ts} +0 -0
  552. /package/dist/{env-file.d.ts → runtime/env-file.d.ts} +0 -0
  553. /package/dist/{playwright-config.js → runtime/playwright-config.js} +0 -0
  554. /package/dist/{playwright.config.d.ts → runtime/playwright.config.d.ts} +0 -0
  555. /package/dist/{video-dir.d.ts → runtime/video-dir.d.ts} +0 -0
  556. /package/dist/{webserver.d.ts → runtime/webserver.d.ts} +0 -0
@@ -1,514 +0,0 @@
1
- // Moved verbatim from the former CHAIN_RUNNER_SCRIPT template string in cli.ts (see src/ARCHITECTURE.md).
2
- // Runs inside the target project's own waygraph copy - keep it dependency-light and self-contained.
3
- import { ANSI, ansiPaint, demoFixture, demoHighlight, demoLog } from "./demo-log.js";
4
- import { playSwipeTrail } from "./cursor.js";
5
- import { advanceTodoDock, formatHighlightCaption, normalizeHighlightSize, normalizeHighlightTone, normalizeHighlightWeight, normalizeTodos, resolveFixtureDwellMs } from "../highlights.js";
6
- import { join } from "node:path";
7
-
8
- /**
9
- * Scroll a locator into view for demo theater.
10
- * Prefer CSS smooth scroll + scrollend wait. Do NOT call Playwright's
11
- * scrollIntoViewIfNeeded first - that jumps instantly and makes the
12
- * following smooth scroll a no-op (looks like a teleport), especially
13
- * noticeable under --fast when dwell is shorter.
14
- * Pass opts.instant=true only for skipTheater / blitz.
15
- */
16
- export async function ensureLocatorInView(locator, opts) {
17
- const instant = !!(opts && opts.instant);
18
- try {
19
- if (instant) {
20
- await locator.scrollIntoViewIfNeeded().catch(() => {});
21
- return;
22
- }
23
- // Touch mode: if the target is off-screen, show a swipe trail in the
24
- // finger direction that would scroll it into view (not device morph).
25
- const scrollPlan = await locator
26
- .evaluate((el) => {
27
- if (!el || typeof el.getBoundingClientRect !== "function") return null;
28
- const touch =
29
- window.__wgDeviceTouch === true ||
30
- document.documentElement.dataset.wgTouch === "1" ||
31
- window.__wgDevicePreset === "mobile" ||
32
- window.__wgDevicePreset === "tablet";
33
- if (!touch) return null;
34
- const r = el.getBoundingClientRect();
35
- const vw = window.innerWidth || 390;
36
- const vh = window.innerHeight || 844;
37
- const margin = 48;
38
- const below = r.top > vh - margin;
39
- const above = r.bottom < margin;
40
- const right = r.left > vw - margin;
41
- const left = r.right < margin;
42
- if (!below && !above && !left && !right) return null;
43
- // Finger direction to reveal the target (swipe up => content moves up).
44
- let dir = "up";
45
- if (below) dir = "up";
46
- else if (above) dir = "down";
47
- else if (right) dir = "left";
48
- else if (left) dir = "right";
49
- return { dir, hint: "scroll" };
50
- })
51
- .catch(() => null);
52
- if (scrollPlan && scrollPlan.dir) {
53
- demoLog(" swipe trail dir=" + scrollPlan.dir + " hint=scroll");
54
- await playSwipeTrail(locator.page(), {
55
- dir: scrollPlan.dir,
56
- label: "swipe \u00b7 scroll",
57
- hint: "scroll",
58
- ms: Number(process.env.WAYGRAPH_SWIPE_MS || 650),
59
- });
60
- }
61
- await locator
62
- .evaluate(async (el) => {
63
- if (!el || typeof el.scrollIntoView !== "function") return;
64
- const waitScroll = (node, ms) =>
65
- new Promise((resolve) => {
66
- let done = false;
67
- const finish = () => {
68
- if (done) return;
69
- done = true;
70
- try {
71
- node.removeEventListener("scrollend", finish);
72
- } catch {
73
- /* ignore */
74
- }
75
- clearTimeout(t);
76
- resolve();
77
- };
78
- const t = setTimeout(finish, ms);
79
- try {
80
- node.addEventListener("scrollend", finish, { once: true });
81
- } catch {
82
- /* scrollend unsupported - timeout only */
83
- }
84
- });
85
- try {
86
- el.scrollIntoView({ block: "center", inline: "center", behavior: "smooth" });
87
- } catch {
88
- try {
89
- el.scrollIntoView({ block: "center", inline: "center" });
90
- } catch {
91
- try {
92
- el.scrollIntoView(true);
93
- } catch {
94
- /* ignore */
95
- }
96
- }
97
- }
98
- await waitScroll(document.scrollingElement || document.documentElement, 650);
99
- let p = el.parentElement;
100
- while (p && p !== document.documentElement && p !== document.body) {
101
- const st = getComputedStyle(p);
102
- const ox = st.overflowX;
103
- const oy = st.overflowY;
104
- if (/(auto|scroll|overlay)/.test(ox) || /(auto|scroll|overlay)/.test(oy)) {
105
- const er = el.getBoundingClientRect();
106
- const pr = p.getBoundingClientRect();
107
- if (er.left < pr.left || er.right > pr.right || er.top < pr.top || er.bottom > pr.bottom) {
108
- const left = p.scrollLeft + (er.left + er.width / 2 - (pr.left + pr.width / 2));
109
- const top = p.scrollTop + (er.top + er.height / 2 - (pr.top + pr.height / 2));
110
- try {
111
- p.scrollTo({ left, top, behavior: "smooth" });
112
- } catch {
113
- p.scrollLeft = left;
114
- p.scrollTop = top;
115
- }
116
- await waitScroll(p, 650);
117
- }
118
- }
119
- p = p.parentElement;
120
- }
121
- })
122
- .catch(() => {});
123
- } catch {
124
- /* best-effort */
125
- }
126
- }
127
-
128
-
129
- export async function ensureSelectorInView(page, selector, opts) {
130
- await ensureLocatorInView(page.locator(selector).first(), opts);
131
- }
132
-
133
-
134
- export async function applyHighlightZoom(page, selector, zoom, zoomOut) {
135
- const z = Number(zoom);
136
- if (!Number.isFinite(z) || z <= 1.001) {
137
- await page.evaluate(() => {
138
- window.__wgZoomOutOnHide = true;
139
- if (window.__wgClearZoom) window.__wgClearZoom();
140
- }).catch(() => {});
141
- return;
142
- }
143
- demoFixture("zoom", "ctx/ring zoom(" + z + ") zoomOut=" + (zoomOut !== false), selector);
144
- await page
145
- .evaluate(
146
- ({ sel, scale, zoomOut }) => {
147
- // false = keep camera after ring hide (ctx.zoomOut(false) / ring.zoomOut).
148
- window.__wgZoomOutOnHide = zoomOut !== false;
149
- if (window.__wgApplyZoom) window.__wgApplyZoom(sel, scale);
150
- },
151
- { sel: selector, scale: z, zoomOut: zoomOut !== false },
152
- )
153
- .catch(() => {});
154
- }
155
-
156
-
157
- async function applyHighlightFocus(page, box, focus) {
158
- if (!focus || !box) {
159
- await page
160
- .evaluate(() => {
161
- if (window.__wgClearFocus) window.__wgClearFocus();
162
- })
163
- .catch(() => {});
164
- return;
165
- }
166
- demoFixture("focus", "ctx/ring focus(true)", {
167
- x: Math.round(box.x),
168
- y: Math.round(box.y),
169
- w: Math.round(box.width),
170
- h: Math.round(box.height),
171
- });
172
- await page
173
- .evaluate((b) => {
174
- if (window.__wgApplyFocus) window.__wgApplyFocus(b);
175
- }, box)
176
- .catch(() => {});
177
- }
178
-
179
-
180
- export async function cycleHighlightRings(page, highlights, gatesFast, opts) {
181
- const list = highlights || [];
182
- // defaultHoldMs: when set (fail path), use instead of legacy 900/200 so BUG
183
- // rings stay visible ~2s before the error panel (PIA stubOnError RFC).
184
- const defaultHoldMs = opts && opts.defaultHoldMs != null ? opts.defaultHoldMs : null;
185
- const pace = opts && opts.pace !== undefined ? opts.pace : undefined;
186
- let dock = opts && opts.todoDock;
187
- const advanceTodos = !(opts && opts.advanceTodos === false);
188
- // Push stubAfter/before dock before the first ring so Method after-panels
189
- // show the updated checklist immediately (not only after the ring cycle).
190
- if (dock) {
191
- await page
192
- .evaluate((d) => {
193
- if (window.__wgSyncTodos) window.__wgSyncTodos({ sync: "set", dock: d });
194
- }, dock)
195
- .catch(() => {});
196
- } else if (opts && opts.todoSync === "clear") {
197
- await page
198
- .evaluate(() => {
199
- if (window.__wgSyncTodos) window.__wgSyncTodos({ sync: "clear" });
200
- })
201
- .catch(() => {});
202
- }
203
- let lastRingEndedAt = null;
204
- for (let i = 0; i < list.length; i++) {
205
- const h = list[i];
206
- const ringStarted = Date.now();
207
- try {
208
- await ensureSelectorInView(page, h.selector);
209
- await applyHighlightZoom(page, h.selector, h.zoom, h.zoomOut);
210
- // Prefer live in-page rect (honors device-shell scale) over Playwright's own boundingBox() -
211
- // but resolve the element through Playwright's OWN locator (full selector engine: >>
212
- // piercing, :has-text(), :visible, ...), not a raw DOM querySelector, which only understands
213
- // real CSS and silently fails to match any Playwright-specific selector syntax.
214
- // count() gate: a real, caught regression - Locator.evaluate() has no timeout option and
215
- // auto-waits (Playwright's default ~30s) for a match to appear, unlike the instant
216
- // document.querySelector it replaced. count() alone never waits, so this stays an immediate
217
- // "does it exist right now" check - ensureSelectorInView above already gave the page a real
218
- // moment to settle.
219
- const hLoc = page.locator(h.selector).first();
220
- const box =
221
- (await hLoc.count().catch(() => 0)) > 0
222
- ? await hLoc
223
- .evaluate((el) => {
224
- const r = el.getBoundingClientRect();
225
- return { x: r.x, y: r.y, width: r.width, height: r.height };
226
- })
227
- .catch(() => null)
228
- : null;
229
- if (box && box.width > 0 && box.height > 0) {
230
- await showRing(page, box, h.label, h.tone || "planned", {
231
- size: h.size,
232
- weight: h.weight,
233
- selector: h.selector,
234
- focus: !!h.focus,
235
- });
236
- // focus is applied by FollowRing / showRing - no second apply needed
237
- // Do NOT advanceTodoDock by ring index after stubAfter already set
238
- // progress - that reset current back to 0 and the next block looked
239
- // blank. Mid-act Method advance still uses syncTodoDockAdvance.
240
- if (dock && advanceTodos) {
241
- dock = advanceTodoDock(dock, i);
242
- if (opts && opts.todoDockRef) opts.todoDockRef.current = dock;
243
- await page
244
- .evaluate((d) => {
245
- if (window.__wgSyncTodos) window.__wgSyncTodos({ sync: "set", dock: d });
246
- }, dock)
247
- .catch(() => {});
248
- } else if (!dock && ((opts && opts.todos && opts.todos.length) || (h.todos && h.todos.length))) {
249
- const rows =
250
- opts && opts.todos && opts.todos.length
251
- ? opts.todos
252
- : normalizeTodos(h.todos, h.todoIndex);
253
- await page
254
- .evaluate((todos) => {
255
- if (window.__wgSyncTodos) {
256
- window.__wgSyncTodos({ sync: "set", list: todos });
257
- return;
258
- }
259
- // Fallback for pages that never got installOverlay sync helper.
260
- const ul = __wgById("wg-todos");
261
- if (!ul) return;
262
- ul.innerHTML = todos
263
- .map((t) => {
264
- const cls = t.current
265
- ? "wg-todo-current"
266
- : t.done
267
- ? "wg-todo-done"
268
- : "wg-todo-pending";
269
- const mark = t.done ? "\u2713" : t.current ? "\u2192" : "\u25CB";
270
- const esc = (s) =>
271
- String(s)
272
- .replace(/&/g, "&amp;")
273
- .replace(/</g, "&lt;")
274
- .replace(/>/g, "&gt;");
275
- return (
276
- "<li class=\"" +
277
- cls +
278
- "\"><span class=\"wg-todo-mark\">" +
279
- mark +
280
- "</span><span>" +
281
- esc(t.text || "") +
282
- "</span></li>"
283
- );
284
- })
285
- .join("");
286
- }, rows)
287
- .catch(() => {});
288
- }
289
- const authored = resolveFixtureDwellMs(h, { gatesFast, pace });
290
- const legacyMs = i === list.length - 1 ? 200 : 900;
291
- const holdMs =
292
- authored != null ? authored : defaultHoldMs != null ? defaultHoldMs : legacyMs;
293
- const gap = lastRingEndedAt != null ? ringStarted - lastRingEndedAt : null;
294
- const holdExtra =
295
- "hold=" +
296
- holdMs +
297
- "ms" +
298
- (authored != null ? " authored" : " default") +
299
- " box=" +
300
- Math.round(box.x) +
301
- "," +
302
- Math.round(box.y) +
303
- " " +
304
- Math.round(box.width) +
305
- "x" +
306
- Math.round(box.height) +
307
- (gap != null ? " gap=" + gap + "ms" : "");
308
- demoHighlight(h, holdExtra);
309
- demoLog(
310
- " highlight " +
311
- (i + 1) +
312
- "/" +
313
- list.length +
314
- (gap != null && gap < 120 ? ansiPaint(ANSI.yellow, " WARN gap<120ms") : "") +
315
- (holdMs < 250 && list.length > 1 ? ansiPaint(ANSI.yellow, " WARN short hold") : ""),
316
- );
317
- await new Promise((res) => setTimeout(res, holdMs));
318
- lastRingEndedAt = Date.now();
319
- } else {
320
- demoHighlight(h, "SKIP no boundingBox");
321
- }
322
- } catch (err) {
323
- demoHighlight(
324
- h || { selector: h && h.selector, label: "(error)" },
325
- "SKIP " + String(err && err.message ? err.message : err).slice(0, 80),
326
- );
327
- }
328
- }
329
- if (list.length > 0) {
330
- const last = list[list.length - 1];
331
- // Resolved through Playwright's own locator (>> piercing / :has-text() / :visible support),
332
- // not handed to the page as a string for a raw DOM querySelector to fail silently on - see
333
- // showRing's own comment (same fix, same reason) and __wgFollowRing's in core.js.
334
- const handle = last.selector
335
- ? await page.locator(last.selector).first().elementHandle({ timeout: 100 }).catch(() => null)
336
- : null;
337
- await page
338
- .evaluate(
339
- ({ h, el }) => {
340
- if (el && window.__wgFollowRing) {
341
- window.__wgFollowRing(
342
- el,
343
- h.label,
344
- h.tone || "planned",
345
- { size: h.size || "md", weight: h.weight || "normal" },
346
- !!h.focus,
347
- );
348
- return;
349
- }
350
- if (!window.__wgPositionRing) return;
351
- if (!el) {
352
- if (window.__wgHideRing) window.__wgHideRing();
353
- return;
354
- }
355
- const reposition = () => {
356
- const box = el.getBoundingClientRect();
357
- window.__wgPositionRing(box, h.label, h.tone || "planned", {
358
- size: h.size || "md",
359
- weight: h.weight || "normal",
360
- });
361
- if (h.focus && window.__wgApplyFocus) {
362
- window.__wgApplyFocus({
363
- x: box.x,
364
- y: box.y,
365
- width: box.width,
366
- height: box.height,
367
- });
368
- }
369
- };
370
- reposition();
371
- window.__wgRingTrack = reposition;
372
- window.addEventListener("resize", reposition);
373
- window.addEventListener("scroll", reposition, true);
374
- },
375
- { h: last, el: handle },
376
- )
377
- .catch(() => {});
378
- } else {
379
- await hideRing(page);
380
- }
381
- }
382
-
383
-
384
- export async function showRing(page, box, label, tone, style) {
385
- const size = normalizeHighlightSize(style && style.size);
386
- const weight = normalizeHighlightWeight(style && style.weight);
387
- const selector = style && style.selector ? String(style.selector) : "";
388
- const focus = !!(style && style.focus);
389
- // Resolve through Playwright's own locator (full selector engine), not a selector string handed
390
- // to the page for a raw DOM lookup - >> piercing / :has-text() / :visible are Playwright-only
391
- // syntax, invisible to document.querySelector. The resolved element handle is passed straight
392
- // into evaluate (Playwright unwraps it to the real DOM node inside the page), so __wgFollowRing's
393
- // per-frame RAF loop tracks that exact element directly - no repeated selector re-resolution.
394
- const handle = selector ? await page.locator(selector).first().elementHandle({ timeout: 100 }).catch(() => null) : null;
395
- await page
396
- .evaluate(
397
- ({ box, label, tone, size, weight, el, focus }) => {
398
- if (el && window.__wgFollowRing) {
399
- window.__wgFollowRing(el, label, tone || "planned", { size, weight }, focus);
400
- return;
401
- }
402
- if (window.__wgStopRingFollow) window.__wgStopRingFollow();
403
- if (window.__wgPositionRing) {
404
- window.__wgPositionRing(box, label, tone || "planned", { size, weight });
405
- }
406
- if (focus && box && window.__wgApplyFocus) window.__wgApplyFocus(box);
407
- else if (!focus && window.__wgClearFocus) window.__wgClearFocus();
408
- },
409
- { box, label, tone: tone || "planned", size, weight, el: handle, focus },
410
- )
411
- .catch(() => {});
412
- }
413
-
414
-
415
- /** Match a locator to a stubBefore slot by overlapping bounding boxes. */
416
- async function matchStubForLocator(page, locator, stubs) {
417
- if (!stubs || stubs.length === 0) return null;
418
- const box = await locator.boundingBox().catch(() => null);
419
- if (!box) return null;
420
- for (const s of stubs) {
421
- try {
422
- const b = await page.locator(s.selector).first().boundingBox();
423
- if (
424
- b &&
425
- Math.abs(b.x - box.x) < 4 &&
426
- Math.abs(b.y - box.y) < 4 &&
427
- Math.abs(b.width - box.width) < 8
428
- ) {
429
- return s;
430
- }
431
- } catch {
432
- /* skip */
433
- }
434
- }
435
- return null;
436
- }
437
-
438
-
439
- /** 0-based stub index for Method fill/click todo advance; -1 if none. */
440
- export async function matchStubIndexForLocator(page, locator, stubs) {
441
- if (!stubs || stubs.length === 0) return -1;
442
- const box = await locator.boundingBox().catch(() => null);
443
- if (!box) return -1;
444
- for (let i = 0; i < stubs.length; i++) {
445
- const s = stubs[i];
446
- try {
447
- const b = await page.locator(s.selector).first().boundingBox();
448
- if (
449
- b &&
450
- Math.abs(b.x - box.x) < 4 &&
451
- Math.abs(b.y - box.y) < 4 &&
452
- Math.abs(b.width - box.width) < 8
453
- ) {
454
- return i;
455
- }
456
- } catch {
457
- /* skip */
458
- }
459
- }
460
- return -1;
461
- }
462
-
463
-
464
- export async function captionForLocator(page, locator, stubs, fallback) {
465
- const matched = await matchStubForLocator(page, locator, stubs);
466
- if (matched) {
467
- return {
468
- label: formatHighlightCaption(matched),
469
- tone: normalizeHighlightTone(matched.tone),
470
- size: normalizeHighlightSize(matched.size),
471
- weight: normalizeHighlightWeight(matched.weight),
472
- };
473
- }
474
- return { label: fallback, tone: "auto", size: "md", weight: "normal" };
475
- }
476
-
477
-
478
- export async function dwellMatchedStub(page, locator, stubs, pacing) {
479
- const matched = await matchStubForLocator(page, locator, stubs);
480
- if (!matched) return;
481
- const ms = resolveFixtureDwellMs(matched, {
482
- gatesFast: !!(pacing && pacing.gatesFast),
483
- pace: pacing && pacing.demoPace,
484
- });
485
- if (ms != null && ms > 0) {
486
- await new Promise((res) => setTimeout(res, ms));
487
- }
488
- }
489
-
490
-
491
- export async function hideRing(page) {
492
- await page
493
- .evaluate(() => {
494
- if (window.__wgHideRing) window.__wgHideRing();
495
- })
496
- .catch(() => {});
497
- }
498
-
499
-
500
- /**
501
- * True if the engine's own narrate() (waygraph's public export, for a Block
502
- * author explicitly captioning one action) JUST positioned the ring for
503
- * THIS action, moments ago - the automatic per-fill/per-click narration
504
- * below should not immediately overwrite an author's own explicit caption
505
- * with its generic guess.
506
- */
507
- export async function wasJustNarrated(page) {
508
- return page
509
- .evaluate(() => {
510
- const w = window;
511
- return typeof w.__wgLastNarrate === "number" && Date.now() - w.__wgLastNarrate < 500;
512
- })
513
- .catch(() => false);
514
- }
@@ -1,110 +0,0 @@
1
- // Moved verbatim from the former CHAIN_RUNNER_SCRIPT template string in cli.ts (see src/ARCHITECTURE.md).
2
- // Runs inside the target project's own waygraph copy - keep it dependency-light and self-contained.
3
- import { join } from "node:path";
4
- import { getMemStub } from "../mem-stub.js";
5
-
6
- function seedMemFromRequires(mem, requires, json, label, stubActive) {
7
- if (requires.length === 0) {
8
- if (json !== undefined) {
9
- throw new Error(
10
- "waygraph chain: \"" + label + "\" takes no input (empty requires) but got a payload: " + json,
11
- );
12
- }
13
- return;
14
- }
15
- if (json === undefined) {
16
- // --data / WAYGRAPH_DATA supplies the same payload shape as blockName({...}).
17
- const fromEnv = process.env.WAYGRAPH_DATA;
18
- if (fromEnv && fromEnv.trim()) json = fromEnv;
19
- }
20
-
21
- let parsed;
22
- let haveParsed = false;
23
- if (json !== undefined) {
24
- try {
25
- parsed = JSON.parse(json);
26
- haveParsed = true;
27
- } catch (err) {
28
- throw new Error("waygraph chain: \"" + label + "\" payload is not valid JSON - " + String(err));
29
- }
30
- }
31
-
32
- if (!haveParsed) {
33
- // No payload at all - only a hard failure when memStub isn't active for
34
- // this flow; when it is, fall through with an empty object so the
35
- // per-key loop below gets a chance to fill each one from the registry.
36
- if (!stubActive) {
37
- throw new Error(
38
- "waygraph chain: \"" + label + "\" requires " + requires.map((k) => k.name).join(", ") +
39
- " - give a JSON payload (inline blockName({...}) or --data '{...}'), or enable --mem-stub" +
40
- " with registerMemStub for these keys",
41
- );
42
- }
43
- parsed = {};
44
- }
45
-
46
- // Keyed-by-name when every require name is a top-level key (preferred for
47
- // --data and for {"saucedemo.credentials":{...}} even with one require).
48
- if (parsed !== null && typeof parsed === "object" && !Array.isArray(parsed)) {
49
- const keyed = requires.every((k) => k.name in parsed);
50
- if (keyed) {
51
- for (const k of requires) mem.set(k, parsed[k.name]);
52
- return;
53
- }
54
- }
55
- // Single-key shorthand: the whole payload IS that one key's value - only
56
- // when a real payload was actually given (the stub-only "{}" fallback
57
- // above must fall through to per-key stub resolution instead).
58
- if (haveParsed && requires.length === 1) {
59
- mem.set(requires[0], parsed);
60
- return;
61
- }
62
- if (haveParsed && (parsed === null || typeof parsed !== "object" || Array.isArray(parsed))) {
63
- throw new Error(
64
- "waygraph chain: \"" + label + "\" requires " + requires.length + " keys (" +
65
- requires.map((k) => k.name).join(", ") + ") - payload must be an object keyed by each key's name",
66
- );
67
- }
68
- const stillMissing = [];
69
- for (const k of requires) {
70
- if (k.name in parsed) {
71
- mem.set(k, parsed[k.name]);
72
- continue;
73
- }
74
- const fake = stubActive ? getMemStub(k) : undefined;
75
- if (fake) {
76
- mem.set(k, fake());
77
- continue;
78
- }
79
- stillMissing.push(k);
80
- }
81
- if (stillMissing.length > 0) {
82
- throw new Error(
83
- "waygraph chain: \"" + label + "\" payload is missing required key(s): " +
84
- stillMissing.map((k) => "\"" + k.name + "\"").join(", "),
85
- );
86
- }
87
- }
88
-
89
-
90
- export function seedMemForBlock(mem, resolved, json, stubActive) {
91
- seedMemFromRequires(mem, resolved.block.requires ?? [], json, resolved.exportName, stubActive);
92
- }
93
-
94
-
95
- /**
96
- * Same idea as seedMemForBlock, but for a whole Flow segment
97
- * ("loginFlow({...}) then ...") - a Flow has no single .requires of its
98
- * own, so this unions every constituent Block's requires (deduped by key
99
- * name) and seeds them all from one JSON payload, same keyed-by-name shape
100
- * as a multi-key Block payload already uses.
101
- */
102
- export function seedMemForFlow(mem, flowBlocks, json, label, stubActive) {
103
- const seen = new Map();
104
- for (const bi of flowBlocks) {
105
- for (const k of bi.block.requires ?? []) {
106
- if (!seen.has(k.name)) seen.set(k.name, k);
107
- }
108
- }
109
- seedMemFromRequires(mem, Array.from(seen.values()), json, label, stubActive);
110
- }