waygraph 0.15.54 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (510) hide show
  1. package/README.md +8 -3
  2. package/bin/waygraph +2 -2
  3. package/dist/analysis/check.d.ts +38 -0
  4. package/dist/analysis/check.js +87 -0
  5. package/dist/analysis/coverage-gap.d.ts +1 -1
  6. package/dist/analysis/coverage-gap.js +14 -37
  7. package/dist/analysis/flow-source.d.ts +9 -0
  8. package/dist/analysis/flow-source.js +25 -0
  9. package/dist/analysis/graph.d.ts +10 -14
  10. package/dist/analysis/graph.js +48 -371
  11. package/dist/analysis/map-check.js +4 -39
  12. package/dist/analysis/practices-check.d.ts +1 -1
  13. package/dist/analysis/practices-check.js +24 -45
  14. package/dist/cli/args.d.ts +23 -0
  15. package/dist/cli/args.js +20 -0
  16. package/dist/{cli.d.ts → cli/cli.d.ts} +0 -1
  17. package/dist/{cli.js → cli/cli.js} +10 -9
  18. package/dist/{commands → cli/commands}/agent-dive-scaffold.js +35 -64
  19. package/dist/cli/commands/agent-dive.js +42 -0
  20. package/dist/{commands → cli/commands}/check.d.ts +0 -1
  21. package/dist/cli/commands/check.js +104 -0
  22. package/dist/cli/commands/codemod-checkpoints.d.ts +18 -0
  23. package/dist/cli/commands/codemod-checkpoints.js +186 -0
  24. package/dist/cli/commands/codemod-flows.d.ts +18 -0
  25. package/dist/cli/commands/codemod-flows.js +284 -0
  26. package/dist/cli/commands/codemod-stubs.d.ts +10 -0
  27. package/dist/cli/commands/codemod-stubs.js +187 -0
  28. package/dist/{commands → cli/commands}/extensions.js +5 -4
  29. package/dist/{commands → cli/commands}/init.js +1 -2
  30. package/dist/{commands → cli/commands}/list.js +9 -7
  31. package/dist/cli/commands/manifest.d.ts +2 -0
  32. package/dist/cli/commands/manifest.js +20 -0
  33. package/dist/cli/commands/map.js +57 -0
  34. package/dist/{commands → cli/commands}/run.d.ts +0 -1
  35. package/dist/cli/commands/run.js +64 -0
  36. package/dist/{commands → cli/commands}/session.js +61 -88
  37. package/dist/{commands → cli/commands}/test.js +11 -14
  38. package/dist/cli/commands/traverse.js +105 -0
  39. package/dist/{commands → cli/commands}/try.js +29 -25
  40. package/dist/{commands → cli/commands}/upgrade.js +40 -4
  41. package/dist/cli/flags.d.ts +193 -16
  42. package/dist/cli/flags.js +179 -234
  43. package/dist/cli/run-chain.d.ts +1 -0
  44. package/dist/cli/run-chain.js +42 -7
  45. package/dist/cli/usage.d.ts +1 -1
  46. package/dist/cli/usage.js +21 -53
  47. package/dist/cli/util.d.ts +2 -2
  48. package/dist/cli/util.js +2 -3
  49. package/dist/{highlights → demo/narration}/css.d.ts +1 -1
  50. package/dist/{highlights → demo/narration}/css.js +2 -3
  51. package/dist/{highlights → demo/narration}/demo-pace.d.ts +3 -11
  52. package/dist/{highlights → demo/narration}/demo-pace.js +5 -11
  53. package/dist/{highlights → demo/narration}/device.d.ts +2 -2
  54. package/dist/{highlights → demo/narration}/device.js +1 -1
  55. package/dist/demo/narration/merge.d.ts +8 -0
  56. package/dist/demo/narration/merge.js +71 -0
  57. package/dist/{highlights/run-phase.d.ts → demo/narration/narration.d.ts} +10 -14
  58. package/dist/{highlights/run-phase.js → demo/narration/narration.js} +25 -94
  59. package/dist/{highlights → demo/narration}/shorthand.d.ts +1 -1
  60. package/dist/demo/narration/stub-ctx.d.ts +8 -0
  61. package/dist/demo/narration/stub-ctx.js +164 -0
  62. package/dist/{highlights → demo/narration}/style.d.ts +1 -7
  63. package/dist/{highlights → demo/narration}/style.js +1 -41
  64. package/dist/{highlights → demo/narration}/todo-dock.d.ts +3 -3
  65. package/dist/{highlights → demo/narration}/todo-dock.js +13 -30
  66. package/dist/demo/overlay/auto-chrome.d.ts +7 -0
  67. package/dist/demo/overlay/auto-chrome.js +97 -0
  68. package/dist/demo/overlay/cursor.d.ts +12 -0
  69. package/dist/demo/overlay/cursor.js +142 -0
  70. package/dist/demo/overlay/device-stage.d.ts +13 -0
  71. package/dist/demo/overlay/device-stage.js +396 -0
  72. package/dist/demo/overlay/inpage/banner.d.ts +1 -0
  73. package/dist/demo/overlay/inpage/banner.js +160 -0
  74. package/dist/demo/overlay/inpage/caption.d.ts +2 -0
  75. package/dist/demo/overlay/inpage/caption.js +24 -0
  76. package/dist/demo/overlay/inpage/core.d.ts +1 -0
  77. package/dist/demo/overlay/inpage/core.js +345 -0
  78. package/dist/demo/overlay/inpage/device-chip.d.ts +1 -0
  79. package/dist/demo/overlay/inpage/device-chip.js +191 -0
  80. package/dist/demo/overlay/inpage/network.d.ts +9 -0
  81. package/dist/demo/overlay/inpage/network.js +200 -0
  82. package/dist/demo/overlay/inpage/panel-chrome.d.ts +1 -0
  83. package/dist/demo/overlay/inpage/panel-chrome.js +203 -0
  84. package/dist/demo/overlay/inpage/stamp.d.ts +1 -0
  85. package/dist/demo/overlay/inpage/stamp.js +46 -0
  86. package/dist/demo/overlay/inpage/swipe-zoom.d.ts +1 -0
  87. package/dist/demo/overlay/inpage/swipe-zoom.js +220 -0
  88. package/dist/demo/overlay/inpage/todos.d.ts +1 -0
  89. package/dist/demo/overlay/inpage/todos.js +294 -0
  90. package/dist/demo/overlay/locator-theater.d.ts +25 -0
  91. package/dist/demo/overlay/locator-theater.js +76 -0
  92. package/dist/demo/overlay/network-capture.d.ts +22 -0
  93. package/dist/demo/overlay/network-capture.js +127 -0
  94. package/dist/demo/overlay/overlay-css.d.ts +3 -0
  95. package/dist/demo/overlay/overlay-css.js +369 -0
  96. package/dist/demo/overlay/overlay-stage.d.ts +23 -0
  97. package/dist/demo/overlay/overlay-stage.js +106 -0
  98. package/dist/demo/overlay/overlay.d.ts +10 -0
  99. package/dist/demo/overlay/overlay.js +89 -0
  100. package/dist/{pilot-overlay/overlay-fixtures.d.ts → demo/overlay/phase-fixtures.d.ts} +2 -2
  101. package/dist/{pilot-overlay/overlay-fixtures.js → demo/overlay/phase-fixtures.js} +2 -2
  102. package/dist/{pilot-overlay/action-ring.js → demo/overlay/pilot/actions.js} +2 -1
  103. package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.d.ts +6 -5
  104. package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.js +19 -18
  105. package/dist/{pilot-overlay → demo/overlay/pilot}/shell.d.ts +2 -2
  106. package/dist/{pilot-overlay → demo/overlay/pilot}/shell.js +13 -22
  107. package/dist/demo/overlay/reattach.d.ts +7 -0
  108. package/dist/demo/overlay/reattach.js +23 -0
  109. package/dist/demo/overlay/rings.d.ts +33 -0
  110. package/dist/demo/overlay/rings.js +448 -0
  111. package/dist/{ui → demo/overlay/ui}/components/ring.js +2 -2
  112. package/dist/{ui → demo/overlay/ui}/overlay.css +4 -4
  113. package/dist/{ui → demo/overlay/ui}/shadow.d.ts +1 -1
  114. package/dist/{ui → demo/overlay/ui}/shadow.js +39 -2
  115. package/dist/demo/stepper/after.d.ts +3 -0
  116. package/dist/demo/stepper/after.js +113 -0
  117. package/dist/demo/stepper/banner-log.d.ts +37 -0
  118. package/dist/demo/stepper/banner-log.js +63 -0
  119. package/dist/demo/stepper/before.d.ts +4 -0
  120. package/dist/demo/stepper/before.js +110 -0
  121. package/dist/demo/stepper/demo-log.d.ts +31 -0
  122. package/dist/demo/stepper/demo-log.js +309 -0
  123. package/dist/demo/stepper/gate.d.ts +11 -0
  124. package/dist/demo/stepper/gate.js +78 -0
  125. package/dist/demo/stepper/interaction-patch.d.ts +3 -0
  126. package/dist/demo/stepper/interaction-patch.js +323 -0
  127. package/dist/demo/stepper/pacing.d.ts +21 -0
  128. package/dist/demo/stepper/pacing.js +23 -0
  129. package/dist/demo/stepper/slides.d.ts +11 -0
  130. package/dist/demo/stepper/slides.js +233 -0
  131. package/dist/demo/stepper/step-panels.d.ts +21 -0
  132. package/dist/demo/stepper/step-panels.js +589 -0
  133. package/dist/demo/stepper/stepper.d.ts +24 -0
  134. package/dist/demo/stepper/stepper.js +122 -0
  135. package/dist/demo/stepper/teardown.d.ts +48 -0
  136. package/dist/demo/stepper/teardown.js +179 -0
  137. package/dist/demo/stepper/todo-advance.d.ts +14 -0
  138. package/dist/demo/stepper/todo-advance.js +110 -0
  139. package/dist/demo/stepper/view.d.ts +68 -0
  140. package/dist/demo/stepper/view.js +31 -0
  141. package/dist/demo/types.d.ts +17 -0
  142. package/dist/demo/verbose-log.js +15 -0
  143. package/dist/{types.d.ts → engine/block/block.d.ts} +106 -91
  144. package/dist/{core → engine/block}/block.js +10 -53
  145. package/dist/{core → engine/block}/compose.d.ts +9 -7
  146. package/dist/{core → engine/block}/compose.js +1 -1
  147. package/dist/{core/blocks → engine/block/kinds}/api.d.ts +16 -12
  148. package/dist/{core/blocks → engine/block/kinds}/api.js +26 -18
  149. package/dist/{core/blocks → engine/block/kinds}/effect.d.ts +13 -18
  150. package/dist/engine/block/kinds/effect.js +17 -0
  151. package/dist/{core/blocks → engine/block/kinds}/method.d.ts +17 -29
  152. package/dist/{core/blocks → engine/block/kinds}/method.js +6 -21
  153. package/dist/{core/blocks → engine/block/kinds}/nav.d.ts +21 -31
  154. package/dist/{core/blocks → engine/block/kinds}/nav.js +6 -12
  155. package/dist/{core/blocks → engine/block/kinds}/page.d.ts +14 -20
  156. package/dist/{core/blocks → engine/block/kinds}/page.js +5 -7
  157. package/dist/engine/checkpoint/checkpoint.d.ts +22 -0
  158. package/dist/engine/checkpoint/checkpoint.js +8 -0
  159. package/dist/engine/checkpoint/route.d.ts +28 -0
  160. package/dist/engine/checkpoint/route.js +28 -0
  161. package/dist/{core → engine}/config.d.ts +7 -2
  162. package/dist/engine/config.js +6 -0
  163. package/dist/engine/engine.d.ts +45 -0
  164. package/dist/{core → engine}/engine.js +6 -10
  165. package/dist/engine/env.d.ts +59 -0
  166. package/dist/engine/env.js +83 -0
  167. package/dist/{errors.d.ts → engine/errors.d.ts} +22 -22
  168. package/dist/{errors.js → engine/errors.js} +22 -22
  169. package/dist/{core → engine/flow}/branch-regression.d.ts +7 -7
  170. package/dist/{core → engine/flow}/branch-regression.js +4 -3
  171. package/dist/engine/flow/flow.d.ts +162 -0
  172. package/dist/engine/flow/flow.js +244 -0
  173. package/dist/{core → engine/flow}/map-builder.d.ts +34 -39
  174. package/dist/{core → engine/flow}/map-builder.js +45 -47
  175. package/dist/{core → engine}/locate.d.ts +1 -1
  176. package/dist/{core → engine}/locate.js +1 -2
  177. package/dist/{mem-stub.d.ts → engine/mem/mem-stub.d.ts} +9 -8
  178. package/dist/{mem-stub.js → engine/mem/mem-stub.js} +2 -2
  179. package/dist/{mem-page.d.ts → engine/mem/mem.d.ts} +1 -1
  180. package/dist/{mem-page.js → engine/mem/mem.js} +2 -1
  181. package/dist/engine/page-gone.d.ts +5 -0
  182. package/dist/engine/page-gone.js +20 -0
  183. package/dist/engine/run/connect.d.ts +28 -0
  184. package/dist/{types.js → engine/run/connect.js} +11 -10
  185. package/dist/engine/run/events.d.ts +67 -0
  186. package/dist/engine/run/events.js +90 -0
  187. package/dist/engine/run/hooks.d.ts +16 -0
  188. package/dist/engine/run/hooks.js +8 -0
  189. package/dist/engine/run/launch.d.ts +13 -0
  190. package/dist/engine/run/launch.js +27 -0
  191. package/dist/{core/run-graph.d.ts → engine/run/run.d.ts} +8 -12
  192. package/dist/{core/run-graph.js → engine/run/run.js} +22 -12
  193. package/dist/engine/stub/pace.d.ts +12 -0
  194. package/dist/engine/stub/pace.js +2 -0
  195. package/dist/engine/stub/ring.d.ts +130 -0
  196. package/dist/engine/stub/ring.js +41 -0
  197. package/dist/engine/stub/stub.d.ts +268 -0
  198. package/dist/engine/stub/stub.js +1 -0
  199. package/dist/engine/stub/todos.d.ts +104 -0
  200. package/dist/engine/stub/todos.js +2 -0
  201. package/dist/engine/stub/viewport.d.ts +26 -0
  202. package/dist/engine/stub/viewport.js +2 -0
  203. package/dist/{trait.d.ts → engine/trait/trait.d.ts} +1 -1
  204. package/dist/index.d.ts +84 -36
  205. package/dist/index.js +44 -19
  206. package/dist/{session/auto-explore-run.d.ts → live/auto/auto.d.ts} +10 -16
  207. package/dist/{session/auto-explore-run.js → live/auto/auto.js} +164 -254
  208. package/dist/{session/auto-explore.d.ts → live/auto/explore.d.ts} +4 -14
  209. package/dist/{session/auto-explore.js → live/auto/explore.js} +21 -127
  210. package/dist/{auto-session/session.d.ts → live/auto-session/auto-session.d.ts} +1 -1
  211. package/dist/{auto-session/session.js → live/auto-session/auto-session.js} +27 -24
  212. package/dist/{auto-session → live/auto-session}/helpers.d.ts +6 -5
  213. package/dist/{auto-session → live/auto-session}/helpers.js +1 -1
  214. package/dist/{session/auto-session-ipc.d.ts → live/auto-session/ipc.d.ts} +7 -5
  215. package/dist/{session/auto-session-ipc.js → live/auto-session/ipc.js} +31 -16
  216. package/dist/{session/browser.d.ts → live/auto-session/start.d.ts} +1 -2
  217. package/dist/{session/browser.js → live/auto-session/start.js} +2 -3
  218. package/dist/{pilot-overlay → live/pilot}/panel.d.ts +1 -1
  219. package/dist/{pilot-overlay → live/pilot}/panel.js +23 -31
  220. package/dist/{session → live/pilot}/pilot.d.ts +3 -3
  221. package/dist/{session → live/pilot}/pilot.js +4 -4
  222. package/dist/{traverse/run.d.ts → live/traverse/traverse.d.ts} +1 -1
  223. package/dist/{traverse/run.js → live/traverse/traverse.js} +26 -43
  224. package/dist/manifest/manifest.d.ts +52 -0
  225. package/dist/manifest/manifest.js +93 -0
  226. package/dist/manifest/map-imports.d.ts +7 -0
  227. package/dist/manifest/map-imports.js +22 -0
  228. package/dist/manifest/maps.d.ts +33 -0
  229. package/dist/manifest/maps.js +62 -0
  230. package/dist/manifest/pack.d.ts +21 -0
  231. package/dist/manifest/pack.js +109 -0
  232. package/dist/manifest/project.d.ts +60 -0
  233. package/dist/manifest/project.js +101 -0
  234. package/dist/{session/block-inject.js → manifest/roots.js} +1 -18
  235. package/dist/manifest/scan.d.ts +19 -0
  236. package/dist/manifest/scan.js +57 -0
  237. package/dist/manifest/source.d.ts +23 -0
  238. package/dist/manifest/source.js +86 -0
  239. package/dist/runner/mode.d.ts +71 -0
  240. package/dist/runner/mode.js +1 -0
  241. package/dist/runner/modes/branches.d.ts +5 -0
  242. package/dist/runner/modes/branches.js +37 -0
  243. package/dist/runner/modes/demo.d.ts +3 -0
  244. package/dist/runner/modes/demo.js +13 -0
  245. package/dist/runner/modes/report.d.ts +2 -0
  246. package/dist/runner/modes/report.js +54 -0
  247. package/dist/runner/modes/run.d.ts +2 -0
  248. package/dist/runner/modes/run.js +3 -0
  249. package/dist/runner/options.d.ts +31 -0
  250. package/dist/runner/options.js +42 -0
  251. package/dist/runner/plan/find.d.ts +18 -0
  252. package/dist/runner/plan/find.js +65 -0
  253. package/dist/runner/plan/plan.d.ts +11 -0
  254. package/dist/runner/plan/plan.js +97 -0
  255. package/dist/runner/plan/seed-mem.d.ts +12 -0
  256. package/dist/runner/plan/seed-mem.js +98 -0
  257. package/dist/runner/plan/spec.d.ts +5 -0
  258. package/dist/runner/plan/spec.js +17 -0
  259. package/dist/runner/play-steps.d.ts +2 -0
  260. package/dist/runner/play-steps.js +59 -0
  261. package/dist/runner/runner.d.ts +4 -0
  262. package/dist/runner/runner.js +64 -0
  263. package/dist/runner/session.d.ts +9 -0
  264. package/dist/runner/session.js +87 -0
  265. package/dist/{browser.js → runtime/browser.js} +4 -2
  266. package/dist/{env-file.js → runtime/env-file.js} +7 -12
  267. package/dist/{extensions.d.ts → runtime/extensions.d.ts} +1 -5
  268. package/dist/{extensions.js → runtime/extensions.js} +2 -1
  269. package/dist/runtime/full-launch.d.ts +1 -0
  270. package/dist/runtime/full-launch.js +34 -0
  271. package/dist/runtime/global-flag.d.ts +5 -0
  272. package/dist/runtime/global-flag.js +18 -0
  273. package/dist/{playwright-config.d.ts → runtime/playwright-config.d.ts} +1 -1
  274. package/dist/{playwright.config.js → runtime/playwright.config.js} +3 -2
  275. package/dist/runtime/run-log.d.ts +2 -0
  276. package/dist/runtime/run-log.js +17 -0
  277. package/dist/{video-dir.js → runtime/video-dir.js} +3 -2
  278. package/dist/{config.d.ts → runtime/waygraph-config.d.ts} +6 -9
  279. package/dist/{config.js → runtime/waygraph-config.js} +21 -51
  280. package/dist/{webserver.js → runtime/webserver.js} +5 -30
  281. package/examples/routed-demo/config/waygraph.config.ts +20 -0
  282. package/examples/routed-demo/package.json +1 -4
  283. package/examples/routed-demo/scripts/fixture-server.mjs +1 -1
  284. package/examples/routed-demo/src/flows/routed-demo-map.flow.ts +2 -4
  285. package/examples/routed-demo/src/flows/routed-demo.flow.ts +1 -2
  286. package/examples/routed-demo/src/map/(app_base)/dashboard/_methods/click-widget.block.ts +5 -4
  287. package/examples/routed-demo/src/map/(app_base)/dashboard/_nav.block.ts +3 -3
  288. package/examples/routed-demo/src/map/(app_base)/dashboard/_page.block.ts +3 -3
  289. package/examples/routed-demo/src/map/(external)/docs/_nav.block.ts +3 -3
  290. package/examples/routed-demo/src/map/(external)/docs/_page.block.ts +3 -3
  291. package/examples/routed-demo/src/states/routed-demo.states.ts +5 -3
  292. package/examples/routed-demo/tests/routed-demo.spec.ts +4 -4
  293. package/examples/routed-demo/tsconfig.json +1 -1
  294. package/examples/saucedemo/docs/CONVENTION.md +4 -5
  295. package/examples/saucedemo/docs/HELPERS.md +11 -11
  296. package/examples/saucedemo/src/blocks/SITE-MAP.md +0 -1
  297. package/examples/saucedemo/src/blocks/saucedemo-web/NAV.md +1 -5
  298. package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -3
  299. package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
  300. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
  301. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
  302. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
  303. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
  304. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +5 -8
  305. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -3
  306. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
  307. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +35 -43
  308. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
  309. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
  310. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
  311. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
  312. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
  313. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
  314. package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -4
  315. package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -4
  316. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +4 -5
  317. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
  318. package/examples/saucedemo/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
  319. package/examples/saucedemo/src/flows/api-demo.flow.ts +12 -10
  320. package/examples/saucedemo/src/states/checkout.states.ts +21 -11
  321. package/examples/saucedemo/src/stubs/device-showcase.ts +8 -10
  322. package/examples/saucedemo/tests/auto-graph.spec.ts +4 -12
  323. package/package.json +10 -6
  324. package/templates/agents/waygraph-planner.agent.md +2 -2
  325. package/templates/quickstart/docs/CONVENTION.md +4 -4
  326. package/templates/quickstart/docs/HELPERS.md +10 -8
  327. package/templates/quickstart/package.json +0 -3
  328. package/templates/quickstart/src/blocks/SITE-MAP.md +0 -1
  329. package/templates/quickstart/src/blocks/saucedemo-web/NAV.md +1 -5
  330. package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -3
  331. package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
  332. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
  333. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
  334. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
  335. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
  336. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +5 -8
  337. package/templates/quickstart/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -3
  338. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
  339. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +35 -43
  340. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
  341. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
  342. package/templates/quickstart/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
  343. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
  344. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
  345. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
  346. package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -4
  347. package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -4
  348. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +4 -5
  349. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
  350. package/templates/quickstart/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
  351. package/templates/quickstart/src/flows/api-demo.flow.ts +12 -10
  352. package/templates/quickstart/src/states/checkout.states.ts +21 -11
  353. package/templates/quickstart/src/stubs/device-showcase.ts +8 -10
  354. package/templates/scaffold/README.md +2 -1
  355. package/templates/scaffold/STRUCTURE.md +5 -4
  356. package/templates/scaffold/config/waygraph.config.ts +1 -0
  357. package/templates/scaffold/gitignore +1 -0
  358. package/templates/scaffold/src/flows/README.md +2 -2
  359. package/templates/scaffold/src/map/(app_base)/docs/_nav.block.ts +3 -3
  360. package/templates/scaffold/src/map/(app_base)/docs/_page.block.ts +3 -3
  361. package/templates/scaffold/src/map/(app_base)/home/_methods/add-item.effect.block.ts +4 -4
  362. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-hello.method.block.ts +3 -3
  363. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-item-added.method.block.ts +3 -3
  364. package/templates/scaffold/src/map/(app_base)/home/_methods/clear-cart.method.block.ts +5 -4
  365. package/templates/scaffold/src/map/(app_base)/home/_methods/remove-item.effect.block.ts +4 -4
  366. package/templates/scaffold/src/map/(app_base)/home/_nav.block.ts +3 -3
  367. package/templates/scaffold/src/map/(app_base)/home/_page.block.ts +3 -3
  368. package/templates/scaffold/src/map/(app_base)/home/nav-verification-link.block.ts +4 -4
  369. package/templates/scaffold/src/map/(external)/hoppscotch/_keys.ts +21 -0
  370. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-body.method.block.ts +4 -4
  371. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-header.method.block.ts +4 -4
  372. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-status.method.block.ts +4 -4
  373. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/pick-extension-interceptor.method.block.ts +5 -4
  374. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-body.method.block.ts +6 -5
  375. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-headers.method.block.ts +6 -5
  376. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/send-request.method.block.ts +5 -4
  377. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-bearer-token.method.block.ts +6 -5
  378. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-headers.method.block.ts +6 -5
  379. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-json-body.method.block.ts +6 -5
  380. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-method.method.block.ts +6 -5
  381. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-query-params.method.block.ts +6 -5
  382. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-url.method.block.ts +6 -5
  383. package/templates/scaffold/src/map/(external)/hoppscotch/_nav.block.ts +3 -3
  384. package/templates/scaffold/src/map/(external)/hoppscotch/_page.block.ts +3 -3
  385. package/templates/scaffold/src/map/(external)/hoppscotch/_states.ts +6 -0
  386. package/templates/scaffold/src/map/(external)/hoppscotch/settings/_nav.block.ts +3 -3
  387. package/templates/scaffold/src/map/(external)/mailpit/_keys.ts +13 -0
  388. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-content.method.block.ts +4 -4
  389. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-received.method.block.ts +4 -4
  390. package/templates/scaffold/src/map/(external)/mailpit/_methods/extract-email-link.method.block.ts +6 -5
  391. package/templates/scaffold/src/map/(external)/mailpit/_methods/open-message.method.block.ts +6 -5
  392. package/templates/scaffold/src/map/(external)/mailpit/_nav.block.ts +3 -3
  393. package/templates/scaffold/src/map/(external)/mailpit/_page.block.ts +3 -3
  394. package/templates/scaffold/src/map/(external)/mailpit/_states.ts +9 -0
  395. package/templates/scaffold/src/map/README.md +7 -0
  396. package/templates/scaffold/src/states/README.md +4 -1
  397. package/templates/scaffold/src/states/demo.mem-keys.ts +1 -29
  398. package/templates/scaffold/src/states/demo.states.ts +14 -20
  399. package/templates/scaffold/tests/hoppscotch.spec.ts +1 -11
  400. package/templates/scaffold/tests/mail-verify.spec.ts +2 -2
  401. package/templates/skills/waygraph-blind-pilot.skill.md +2 -6
  402. package/templates/skills/waygraph-convention.skill.md +23 -14
  403. package/templates/skills/waygraph-pilot.skill.md +7 -4
  404. package/dist/auto-session/verbose-log.js +0 -16
  405. package/dist/auto-session.d.ts +0 -2
  406. package/dist/auto-session.js +0 -3
  407. package/dist/cli/discover.d.ts +0 -40
  408. package/dist/cli/discover.js +0 -148
  409. package/dist/commands/agent-dive.js +0 -52
  410. package/dist/commands/check.js +0 -192
  411. package/dist/commands/map.js +0 -29
  412. package/dist/commands/run.js +0 -104
  413. package/dist/commands/traverse.js +0 -177
  414. package/dist/core/block.d.ts +0 -109
  415. package/dist/core/blocks/effect.js +0 -23
  416. package/dist/core/config.js +0 -17
  417. package/dist/core/engine.d.ts +0 -198
  418. package/dist/core/flow.d.ts +0 -294
  419. package/dist/core/flow.js +0 -432
  420. package/dist/core.d.ts +0 -14
  421. package/dist/core.js +0 -15
  422. package/dist/highlights/merge.d.ts +0 -8
  423. package/dist/highlights/merge.js +0 -173
  424. package/dist/highlights/stub-ctx.d.ts +0 -10
  425. package/dist/highlights/stub-ctx.js +0 -331
  426. package/dist/highlights/types.d.ts +0 -613
  427. package/dist/highlights.d.ts +0 -9
  428. package/dist/highlights.js +0 -10
  429. package/dist/pilot-overlay.d.ts +0 -5
  430. package/dist/pilot-overlay.js +0 -6
  431. package/dist/runner/banner-log.js +0 -63
  432. package/dist/runner/chain-run.js +0 -102
  433. package/dist/runner/cursor.js +0 -140
  434. package/dist/runner/demo-log.js +0 -316
  435. package/dist/runner/device-stage.d.ts +0 -9
  436. package/dist/runner/device-stage.js +0 -420
  437. package/dist/runner/discovery.js +0 -105
  438. package/dist/runner/index.js +0 -2
  439. package/dist/runner/inpage/banner.d.ts +0 -21
  440. package/dist/runner/inpage/banner.js +0 -156
  441. package/dist/runner/inpage/caption.d.ts +0 -3
  442. package/dist/runner/inpage/caption.js +0 -23
  443. package/dist/runner/inpage/core.d.ts +0 -4
  444. package/dist/runner/inpage/core.js +0 -316
  445. package/dist/runner/inpage/device.d.ts +0 -3
  446. package/dist/runner/inpage/device.js +0 -211
  447. package/dist/runner/inpage/network.d.ts +0 -15
  448. package/dist/runner/inpage/network.js +0 -217
  449. package/dist/runner/inpage/panel-chrome.js +0 -192
  450. package/dist/runner/inpage/stamp.js +0 -46
  451. package/dist/runner/inpage/swipe-zoom.js +0 -220
  452. package/dist/runner/inpage/todos.js +0 -337
  453. package/dist/runner/interaction-patch.js +0 -384
  454. package/dist/runner/main.js +0 -469
  455. package/dist/runner/network-capture.d.ts +0 -9
  456. package/dist/runner/network-capture.js +0 -126
  457. package/dist/runner/overlay-css.d.ts +0 -3
  458. package/dist/runner/overlay-css.js +0 -377
  459. package/dist/runner/overlay-install.js +0 -90
  460. package/dist/runner/overlay-stage.js +0 -110
  461. package/dist/runner/rings.js +0 -514
  462. package/dist/runner/seed-mem.js +0 -110
  463. package/dist/runner/slides.js +0 -278
  464. package/dist/runner/step-mode.js +0 -703
  465. package/dist/runner/step-panels.js +0 -729
  466. package/dist/runner/teardown.js +0 -202
  467. package/dist/runner/todo-dock.js +0 -142
  468. package/dist/session/step-overlay.d.ts +0 -37
  469. package/dist/session/step-overlay.js +0 -244
  470. package/examples/routed-demo/playwright.config.ts +0 -21
  471. package/examples/saucedemo/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
  472. package/templates/quickstart/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
  473. /package/dist/{commands → cli/commands}/agent-dive-scaffold.d.ts +0 -0
  474. /package/dist/{commands → cli/commands}/agent-dive.d.ts +0 -0
  475. /package/dist/{commands → cli/commands}/extensions.d.ts +0 -0
  476. /package/dist/{commands → cli/commands}/init.d.ts +0 -0
  477. /package/dist/{commands → cli/commands}/list.d.ts +0 -0
  478. /package/dist/{commands → cli/commands}/map.d.ts +0 -0
  479. /package/dist/{commands → cli/commands}/session.d.ts +0 -0
  480. /package/dist/{commands → cli/commands}/test.d.ts +0 -0
  481. /package/dist/{commands → cli/commands}/traverse.d.ts +0 -0
  482. /package/dist/{commands → cli/commands}/try.d.ts +0 -0
  483. /package/dist/{commands → cli/commands}/upgrade.d.ts +0 -0
  484. /package/dist/{highlights → demo/narration}/shorthand.js +0 -0
  485. /package/dist/{session/overlay-beacon.d.ts → demo/overlay/beacon.d.ts} +0 -0
  486. /package/dist/{session/overlay-beacon.js → demo/overlay/beacon.js} +0 -0
  487. /package/dist/{pilot-overlay/action-ring.d.ts → demo/overlay/pilot/actions.d.ts} +0 -0
  488. /package/dist/{ui → demo/overlay/ui}/components/ring.d.ts +0 -0
  489. /package/dist/{ui → demo/overlay/ui}/stylesheet.d.ts +0 -0
  490. /package/dist/{ui → demo/overlay/ui}/stylesheet.js +0 -0
  491. /package/dist/{ui → demo/overlay/ui}/tokens.d.ts +0 -0
  492. /package/dist/{ui → demo/overlay/ui}/tokens.js +0 -0
  493. /package/dist/{highlights → demo}/types.js +0 -0
  494. /package/dist/{auto-session → demo}/verbose-log.d.ts +0 -0
  495. /package/dist/{selector.d.ts → engine/trait/selector.d.ts} +0 -0
  496. /package/dist/{selector.js → engine/trait/selector.js} +0 -0
  497. /package/dist/{trait.js → engine/trait/trait.js} +0 -0
  498. /package/dist/{traverse → live/traverse}/coverage.d.ts +0 -0
  499. /package/dist/{traverse → live/traverse}/coverage.js +0 -0
  500. /package/dist/{traverse → live/traverse}/lease.d.ts +0 -0
  501. /package/dist/{traverse → live/traverse}/lease.js +0 -0
  502. /package/dist/{session/block-inject.d.ts → manifest/roots.d.ts} +0 -0
  503. /package/dist/{blocks-select.d.ts → manifest/select.d.ts} +0 -0
  504. /package/dist/{blocks-select.js → manifest/select.js} +0 -0
  505. /package/dist/{browser.d.ts → runtime/browser.d.ts} +0 -0
  506. /package/dist/{env-file.d.ts → runtime/env-file.d.ts} +0 -0
  507. /package/dist/{playwright-config.js → runtime/playwright-config.js} +0 -0
  508. /package/dist/{playwright.config.d.ts → runtime/playwright.config.d.ts} +0 -0
  509. /package/dist/{video-dir.d.ts → runtime/video-dir.d.ts} +0 -0
  510. /package/dist/{webserver.d.ts → runtime/webserver.d.ts} +0 -0
@@ -1,202 +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 { installOverlay } from "./overlay-install.js";
4
- import { applyDeviceToPage } from "./device-stage.js";
5
- import { showRing } from "./rings.js";
6
- import { formatHighlightCaption } from "../highlights.js";
7
-
8
- /**
9
- * Patches Locator.prototype.fill (via any real locator's own prototype
10
- * chain - Playwright doesn't export the class directly) so every fill(),
11
- * regardless of how the Block built that locator (page.locator, chained
12
- * .getByLabel off a scoped form locator, etc.), highlights the real target
13
- * first, then types it out character by character instead of snapping the
14
- * whole value in - "when something is written from mem, it should
15
- * highlight then slowly input." One-time patch (idempotent - guarded so a
16
- * multi-step chain doesn't re-wrap an already-wrapped fill).
17
- */
18
- /**
19
- * Called once the gate resolves - manual click OR autoplay timeout, both
20
- * covered from here rather than duplicating this in the in-page click
21
- * handler - right before the Block's own act() actually starts. Dan: "i
22
- * want the button, step is running thing. so i wont be able to interrupt
23
- * the playwright automation" - the "Run this step" button used to sit
24
- * there still looking clickable for the entire multi-second duration a
25
- * real act()/observe() takes, inviting a confusing extra click (harmless -
26
- * __wgNext no-ops once already consumed - but looked live when it wasn't).
27
- * Disables the button and mem-key textareas, and swaps whichever gate
28
- * text was showing (manual button or "Auto-advancing...") to "Running...".
29
- * ALWAYS collapses the panel while act() runs - leaving it expanded was a
30
- * real bug: #wg-panel sits at z-index max with pointer-events:auto, so
31
- * Playwright's login/add-to-cart clicks hit the stepper instead of the app
32
- * ("subtree intercepts pointer events"). Empty/partial fills + a lucky
33
- * edge click on Login then produced Sauce Demo's Epic sadface, verify
34
- * still passed on the error banner, and the next block blew up. Collapse
35
- * also matches Dan's "step is running / can't interrupt" ask. (_opts kept
36
- * for call-site compat; autoCollapsePanel is now unconditional.)
37
- */
38
- export async function markStepRunning(page, _opts) {
39
- await page
40
- .evaluate(() => {
41
- const runBtn = __wgById("wg-run");
42
- if (runBtn) {
43
- runBtn.disabled = true;
44
- runBtn.textContent = "Running \u25B6";
45
- }
46
- const autoEl = __wgById("wg-gate-auto");
47
- if (autoEl) autoEl.textContent = "Running...";
48
- __wgQA("#wg-panel textarea[data-key]").forEach((ta) => {
49
- ta.disabled = true;
50
- });
51
- const panel = __wgById("wg-panel");
52
- if (panel) {
53
- panel.classList.add("wg-collapsed");
54
- panel.setAttribute("data-wg-collapsed", "1");
55
- panel.setAttribute("data-wg-phase", "running");
56
- if (typeof window.__wgStampModal === "function") {
57
- window.__wgStampModal(panel, "panel", {
58
- phase: "running",
59
- ready: true,
60
- });
61
- }
62
- const toggle = panel.querySelector("[data-wg-toggle]");
63
- if (toggle) toggle.textContent = "Show";
64
- const titleEl = panel.querySelector(".wg-chrome-title");
65
- const label = panel.dataset.wgStepLabel;
66
- if (titleEl && label) titleEl.textContent = label;
67
- const miniNext = panel.querySelector("[data-wg-mini-next]");
68
- if (miniNext) {
69
- miniNext.disabled = true;
70
- miniNext.classList.remove("wg-mini-next-show");
71
- }
72
- }
73
- })
74
- .catch(() => {});
75
- }
76
-
77
-
78
- /**
79
- * Real navigation wipes document + overlay helpers. Reinstall and re-paint
80
- * carried todos / device / optional stubBefore ring so keep-dock and nav
81
- * highlights do not vanish until the next ctx.todos() / stubAfter (PIA #15).
82
- */
83
- export async function restoreTheaterAfterNavigation(page, todoDockRef, deviceRef, stubBeforeRef) {
84
- const needs =
85
- (await page
86
- .evaluate(() => !window.__wgSyncTodos || !__wgById("wg-ring"))
87
- .catch(() => true)) || false;
88
- if (!needs) {
89
- // Overlay survived (SPA / no full document wipe) - still refresh dock
90
- // if Node has a carry and the DOM lost .wg-todo-dock.
91
- const hasDock = await page
92
- .evaluate(() => !!__wgQ(".wg-todo-dock, #wg-todo-dock"))
93
- .catch(() => false);
94
- if (hasDock || !todoDockRef || !todoDockRef.current) return;
95
- }
96
- await installOverlay(page);
97
- const dock = todoDockRef && todoDockRef.current;
98
- if (dock) {
99
- await page
100
- .evaluate((d) => {
101
- if (window.__wgSyncTodos) window.__wgSyncTodos({ sync: "set", dock: d });
102
- }, dock)
103
- .catch(() => {});
104
- }
105
- if (deviceRef && deviceRef.current) {
106
- await applyDeviceToPage(page, deviceRef.current, "set").catch(() => {});
107
- }
108
- // Re-show first matching stubBefore ring if selector still exists (sidebar
109
- // nav targets often survive the route change).
110
- const stubs = (stubBeforeRef && stubBeforeRef.current) || [];
111
- for (const h of stubs) {
112
- if (!h || !h.selector) continue;
113
- // Playwright's own locator (>> piercing / :has-text() / :visible support), not a raw
114
- // querySelector string - see rings.js's showRing for the same fix, same reason. count() gate:
115
- // Locator.evaluate() has no timeout option and auto-waits ~30s for a match to appear - count()
116
- // never waits, keeping this an immediate "does it still exist" check (this selector routinely
117
- // won't, after a route change - that's the whole point of the loop).
118
- const hLoc = page.locator(h.selector).first();
119
- const box =
120
- (await hLoc.count().catch(() => 0)) > 0
121
- ? await hLoc
122
- .evaluate((el) => {
123
- const r = el.getBoundingClientRect();
124
- if (r.width < 2 || r.height < 2) return null;
125
- return { x: r.x, y: r.y, width: r.width, height: r.height };
126
- })
127
- .catch(() => null)
128
- : null;
129
- if (box) {
130
- await showRing(page, box, formatHighlightCaption(h), h.tone || "planned", {
131
- size: h.size,
132
- weight: h.weight,
133
- selector: h.selector,
134
- focus: !!h.focus,
135
- }).catch(() => {});
136
- break;
137
- }
138
- }
139
- }
140
-
141
-
142
- /**
143
- * Removes every overlay element (panel, ring, ring-label, cursor,
144
- * click-pulse, banner) and stops the live resize/scroll ring tracker, once
145
- * the whole chain is genuinely done - "I want to see the same page just
146
- * like the demo opened for the first time," not the last step's panel and
147
- * highlight ring stuck over the real app forever. installOverlay only ever
148
- * ADDS these elements back on demand (idempotent, per-page-load) - nothing
149
- * re-creates them once torn down here unless another Block/fill/click runs.
150
- */
151
- export async function teardownOverlay(page) {
152
- await page
153
- .evaluate(() => {
154
- if (window.__wgRingTrack) {
155
- window.removeEventListener("resize", window.__wgRingTrack);
156
- window.removeEventListener("scroll", window.__wgRingTrack, true);
157
- window.__wgRingTrack = null;
158
- }
159
- window.__wgNarrateOwnsRing = false;
160
- for (const id of [
161
- "wg-panel",
162
- "wg-ring",
163
- "wg-ring-label",
164
- "wg-cursor",
165
- "wg-click-pulse",
166
- "wg-banner",
167
- "wg-todo-dock",
168
- "wg-device-shell",
169
- "wg-device-toast",
170
- "wg-device-badge",
171
- ]) {
172
- const el = __wgById(id);
173
- if (el) el.remove();
174
- }
175
- __wgQA(".wg-todo-dock").forEach((el) => el.remove());
176
- document.documentElement.classList.remove("wg-video-device-stage");
177
- })
178
- .catch(() => {});
179
- }
180
-
181
-
182
- /**
183
- * Clears cookies + storage and re-navigates to a known-fresh page. Shared by
184
- * the per-block session-reset check below and by the error panel's own
185
- * "Retry Episode" button - a retry needs the exact same clean slate a normal
186
- * episode boundary gets, not just re-running the failed block against
187
- * whatever broken/half-navigated state it left the page in.
188
- */
189
- export async function resetPageState(context, page, baseURL) {
190
- await context.clearCookies().catch(() => {});
191
- await page
192
- .evaluate(() => {
193
- try {
194
- localStorage.clear();
195
- sessionStorage.clear();
196
- } catch {
197
- /* storage blocked (e.g. about:blank) - nothing to clear anyway */
198
- }
199
- })
200
- .catch(() => {});
201
- await page.goto(baseURL || "about:blank").catch(() => {});
202
- }
@@ -1,142 +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 { advanceTodoDock } from "../highlights.js";
5
- import { demoLog } from "./demo-log.js";
6
-
7
- function todosHtmlFromInfo(info, escFn) {
8
- const list = info.todos || [];
9
- if (!list.length) return "";
10
- return (
11
- "<ul id=\"wg-todos\">" +
12
- list
13
- .map((t) => {
14
- const cls = t.current ? "wg-todo-current" : t.done ? "wg-todo-done" : "wg-todo-pending";
15
- const mark = t.done ? "\u2713" : t.current ? "\u2192" : "\u25CB";
16
- return (
17
- "<li class=\"" +
18
- cls +
19
- "\"><span class=\"wg-todo-mark\">" +
20
- mark +
21
- "</span><span>" +
22
- escFn(t.text || "") +
23
- "</span></li>"
24
- );
25
- })
26
- .join("") +
27
- "</ul>"
28
- );
29
- }
30
-
31
-
32
- /** Flatten dock items in order (sequential groups). */
33
- function flattenTodoDockItems(dock) {
34
- const items = [];
35
- if (!dock || !dock.groups) return items;
36
- for (const g of dock.groups) {
37
- for (const t of g.items || []) items.push(t);
38
- }
39
- return items;
40
- }
41
-
42
-
43
- /**
44
- * Resolve which todo index a matched stub should advance to.
45
- * Prefer stub.todo / stub.slotId / stub.id against item.id; never jump backward.
46
- */
47
- function resolveTodoAdvanceIndex(dock, stub, stubIndex) {
48
- const items = flattenTodoDockItems(dock);
49
- if (!items.length) return stubIndex;
50
- const curIdx = items.findIndex((t) => t.current);
51
- let idx = stubIndex;
52
- const key = stub && (stub.todo || stub.slotId || stub.id);
53
- if (key) {
54
- const k = String(key).trim().toLowerCase();
55
- let found = items.findIndex((t) => t.id && String(t.id).toLowerCase() === k);
56
- if (found < 0) {
57
- // username -> login-user, password -> login-pass, submit -> login-submit
58
- const aliases = {
59
- username: ["login-user", "user", "email"],
60
- password: ["login-pass", "pass"],
61
- submit: ["login-submit", "login", "tap-login"],
62
- user: ["login-user", "username"],
63
- pass: ["login-pass", "password"],
64
- };
65
- const alts = aliases[k] || [];
66
- for (const a of alts) {
67
- found = items.findIndex((t) => t.id && String(t.id).toLowerCase() === a);
68
- if (found >= 0) break;
69
- }
70
- }
71
- if (found < 0) {
72
- found = items.findIndex(
73
- (t) =>
74
- (t.id && String(t.id).toLowerCase().includes(k)) ||
75
- (t.text && String(t.text).toLowerCase().includes(k)),
76
- );
77
- }
78
- if (found >= 0) idx = found;
79
- }
80
- // Monotonic: never retreat the walkthrough.
81
- if (curIdx >= 0 && idx < curIdx) idx = curIdx;
82
- return idx;
83
- }
84
-
85
-
86
- /** Advance sequential todo dock to stubIndex and push to the page (Method act). */
87
- export async function syncTodoDockAdvance(page, todoDockRef, stubIndex, stub) {
88
- if (!todoDockRef || stubIndex < 0) return;
89
- const prev = todoDockRef.current;
90
- if (!prev) return;
91
- const idx = resolveTodoAdvanceIndex(prev, stub || null, stubIndex);
92
- const advanced = advanceTodoDock(prev, idx);
93
- todoDockRef.current = advanced;
94
- demoLog(
95
- " todo advance -> idx=" +
96
- idx +
97
- (stub && (stub.slotId || stub.todo)
98
- ? " slot=" + (stub.todo || stub.slotId)
99
- : " stub#" + stubIndex) +
100
- ' current="' +
101
- String(
102
- (flattenTodoDockItems(advanced).find((t) => t.current) || {}).text || "",
103
- ).slice(0, 40) +
104
- '"',
105
- );
106
- await page
107
- .evaluate((dock) => {
108
- if (window.__wgSyncTodos) {
109
- window.__wgSyncTodos({ sync: "set", dock });
110
- }
111
- }, advanced)
112
- .catch(() => {});
113
- }
114
-
115
- export async function probeTodoDocksOnPage(page) {
116
- return page
117
- .evaluate(() => {
118
- const docks = [...__wgQA(".wg-todo-dock, #wg-todo-dock")];
119
- return docks.map((el) => {
120
- const r = el.getBoundingClientRect();
121
- const items = el.querySelectorAll("li");
122
- let current = "";
123
- items.forEach((li) => {
124
- if (li.classList.contains("wg-todo-current")) {
125
- current = (li.textContent || "").replace(/s+/g, " ").trim().slice(0, 48);
126
- }
127
- });
128
- return {
129
- key: el.getAttribute("data-wg-todo-key") || el.id || "?",
130
- pos: el.dataset.pos || "?",
131
- top: Math.round(r.top),
132
- left: Math.round(r.left),
133
- w: Math.round(r.width),
134
- h: Math.round(r.height),
135
- onScreen: r.bottom > 0 && r.right > 0 && r.top < innerHeight && r.left < innerWidth,
136
- n: items.length,
137
- current,
138
- };
139
- });
140
- })
141
- .catch(() => []);
142
- }
@@ -1,37 +0,0 @@
1
- import type { Page } from "@playwright/test";
2
- import type { MemPage } from "../mem-page.js";
3
- export declare function installDemoChrome(page: Page, title?: string, options?: {
4
- banner?: boolean;
5
- }): Promise<void>;
6
- /** Demo cursor + ring on fill/click during auto explore headful runs (automation = gray). */
7
- export declare function instrumentInteractionHighlighting(page: Page, mem: MemPage, slowMo: number): void;
8
- declare global {
9
- interface Window {
10
- __wgMoveCursorTo?: (x: number, y: number, ms?: number) => void;
11
- __wgClickPulse?: (x: number, y: number, tone?: string) => void;
12
- __wgPositionRing?: (box: {
13
- x: number;
14
- y: number;
15
- width: number;
16
- height: number;
17
- }, label: string, tone?: string) => void;
18
- __wgHideRing?: () => void;
19
- __wgPendingNavClickLabel?: string;
20
- __wgWirePanelChrome?: (panel: HTMLElement, storageKey: string, chromeTitle?: string) => void;
21
- __wgStampModal?: (el: Element, kind: string, meta?: Record<string, unknown>) => void;
22
- __wgOverlayBeacon?: () => Array<{
23
- id: string | null;
24
- modal: string | null;
25
- ready: boolean;
26
- phase: string | null;
27
- step: string | null;
28
- block: string | null;
29
- collapsed: boolean;
30
- opacity: string;
31
- textLen: number;
32
- w: number;
33
- h: number;
34
- visible: boolean;
35
- }>;
36
- }
37
- }
@@ -1,244 +0,0 @@
1
- import { ensureShadowRoot } from "../ui/shadow.js";
2
- const FAVICON = "data:image/svg+xml," +
3
- encodeURIComponent("<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'><circle cx='16' cy='16' r='14' fill='#7C3AED'/></svg>");
4
- export async function installDemoChrome(page, title = "waygraph auto", options = {}) {
5
- const showBanner = options.banner !== false;
6
- // ring/cursor/banner CSS comes from the one shared bundle - see ui/css/README.md.
7
- await ensureShadowRoot(page);
8
- await page
9
- .evaluate(({ title, favicon, showBanner }) => {
10
- if (!__wgById("wg-ring")) {
11
- const ring = document.createElement("div");
12
- ring.id = "wg-ring";
13
- __wgAdd(ring);
14
- }
15
- if (!__wgById("wg-ring-label")) {
16
- const ringLabel = document.createElement("div");
17
- ringLabel.id = "wg-ring-label";
18
- __wgAdd(ringLabel);
19
- }
20
- if (!__wgById("wg-cursor")) {
21
- const cursor = document.createElement("div");
22
- cursor.id = "wg-cursor";
23
- cursor.innerHTML =
24
- "<svg viewBox='0 0 32 32' width='24' height='24'>" +
25
- "<path fill='#0C0C1A' stroke='#fff' stroke-width='1.4' stroke-linejoin='round' " +
26
- "d='M6 3.5l1.4 22.5 5.8-5.4 4.2 9.4 3.6-1.6-4.2-9.2H26z'/></svg>";
27
- __wgAdd(cursor);
28
- }
29
- if (!__wgById("wg-click-pulse")) {
30
- const pulse = document.createElement("div");
31
- pulse.id = "wg-click-pulse";
32
- __wgAdd(pulse);
33
- }
34
- window.__wgMoveCursorTo = (x, y, ms) => {
35
- const cursor = __wgById("wg-cursor");
36
- if (!cursor)
37
- return;
38
- cursor.style.setProperty("--wg-cursor-ms", (ms || 600) + "ms");
39
- cursor.style.transform = "translate(" + x + "px," + y + "px)";
40
- cursor.style.opacity = "1";
41
- };
42
- window.__wgClickPulse = (x, y, tone) => {
43
- const pulse = __wgById("wg-click-pulse");
44
- if (!pulse)
45
- return;
46
- const raw = (tone || "planned") + "";
47
- pulse.dataset.tone =
48
- raw === "auto" ||
49
- raw === "info" ||
50
- raw === "warning" ||
51
- raw === "danger" ||
52
- raw === "success"
53
- ? raw
54
- : "planned";
55
- pulse.style.left = x + "px";
56
- pulse.style.top = y + "px";
57
- pulse.classList.remove("wg-pulse");
58
- void pulse.offsetWidth;
59
- pulse.classList.add("wg-pulse");
60
- };
61
- window.__wgPositionRing = (box, label, tone, style) => {
62
- const ring = __wgById("wg-ring");
63
- const ringLabel = __wgById("wg-ring-label");
64
- if (!ring || !ringLabel)
65
- return;
66
- const raw = (tone || "planned") + "";
67
- const t = raw === "auto" ||
68
- raw === "info" ||
69
- raw === "warning" ||
70
- raw === "danger" ||
71
- raw === "success"
72
- ? raw
73
- : "planned";
74
- const sizeRaw = ((style && style.size) || "md") + "";
75
- const size = sizeRaw === "sm" || sizeRaw === "lg" ? sizeRaw : "md";
76
- const weightRaw = ((style && style.weight) || "normal") + "";
77
- const weight = weightRaw === "bold" ? "bold" : "normal";
78
- ring.dataset.tone = t;
79
- ringLabel.dataset.tone = t;
80
- ring.dataset.size = size;
81
- ringLabel.dataset.size = size;
82
- ringLabel.dataset.weight = weight;
83
- const pad = size === "sm" ? 3 : size === "lg" ? 10 : 6;
84
- ring.style.left = box.x - pad + "px";
85
- ring.style.top = box.y - pad + "px";
86
- ring.style.width = box.width + pad * 2 + "px";
87
- ring.style.height = box.height + pad * 2 + "px";
88
- ring.style.opacity = "1";
89
- // Drawn from data-label (CSS ::after), not DOM text, so the page's own text selectors never match it.
90
- ringLabel.dataset.label = label;
91
- ringLabel.textContent = "";
92
- ringLabel.style.left = box.x + "px";
93
- ringLabel.style.top = box.y + box.height + 8 + "px";
94
- ringLabel.style.opacity = "1";
95
- };
96
- window.__wgHideRing = () => {
97
- const ring = __wgById("wg-ring");
98
- const ringLabel = __wgById("wg-ring-label");
99
- if (ring)
100
- ring.style.opacity = "0";
101
- if (ringLabel)
102
- ringLabel.style.opacity = "0";
103
- };
104
- if (showBanner && title && !__wgById("wg-banner")) {
105
- const banner = document.createElement("div");
106
- banner.id = "wg-banner";
107
- banner.innerHTML =
108
- "<span class='wg-banner-tag'>waygraph auto</span><span>" + title + "</span>";
109
- __wgAdd(banner);
110
- banner.setAttribute("data-wg-ui", "1");
111
- banner.setAttribute("data-wg-modal", "banner");
112
- banner.setAttribute("data-wg-ready", "1");
113
- }
114
- else {
115
- const existing = __wgById("wg-banner");
116
- if (existing) {
117
- existing.setAttribute("data-wg-ui", "1");
118
- existing.setAttribute("data-wg-modal", "banner");
119
- existing.setAttribute("data-wg-ready", "1");
120
- }
121
- }
122
- if (showBanner && !document.title.startsWith("[waygraph] ")) {
123
- document.title = "[waygraph] " + document.title;
124
- }
125
- }, { title, favicon: FAVICON, showBanner })
126
- .catch(() => { });
127
- }
128
- async function moveCursorTo(page, box, ms) {
129
- const x = box.x + box.width / 2;
130
- const y = box.y + box.height / 2;
131
- await page.evaluate(({ x, y, ms }) => window.__wgMoveCursorTo?.(x, y, ms), { x, y, ms }).catch(() => { });
132
- if (ms > 0)
133
- await new Promise((r) => setTimeout(r, ms));
134
- return { x, y };
135
- }
136
- async function showRing(page, box, label, tone = "auto") {
137
- await page
138
- .evaluate(({ box, label, tone }) => window.__wgPositionRing?.(box, label, tone), {
139
- box,
140
- label,
141
- tone,
142
- })
143
- .catch(() => { });
144
- }
145
- async function hideRing(page) {
146
- await page.evaluate(() => window.__wgHideRing?.()).catch(() => { });
147
- }
148
- async function clickPulseAt(page, x, y, tone = "auto") {
149
- await page
150
- .evaluate(({ x, y, tone }) => window.__wgClickPulse?.(x, y, tone), { x, y, tone })
151
- .catch(() => { });
152
- }
153
- /** Demo cursor + ring on fill/click during auto explore headful runs (automation = gray). */
154
- export function instrumentInteractionHighlighting(page, mem, slowMo) {
155
- const typeDelay = () => (slowMo ? 0 : 30);
156
- const clickPrePop = () => (slowMo ? 300 : 700);
157
- const clickPostPop = () => (slowMo ? 200 : 500);
158
- const cursorMs = (full) => full;
159
- const memTrack = { lastKeyName: null, at: 0 };
160
- const originalGet = mem.get.bind(mem);
161
- mem.get = (key) => {
162
- memTrack.lastKeyName = key?.name ?? null;
163
- memTrack.at = Date.now();
164
- return originalGet(key);
165
- };
166
- const proto = Object.getPrototypeOf(page.locator("html"));
167
- if (!proto.__wgFillPatched) {
168
- proto.__wgFillPatched = true;
169
- const originalFill = proto.fill;
170
- proto.fill = async function (value, options) {
171
- try {
172
- await installDemoChrome(page, "", { banner: false });
173
- const box = await this.boundingBox();
174
- if (box) {
175
- const label = memTrack.lastKeyName && Date.now() - memTrack.at < 3000
176
- ? "from mem: " + memTrack.lastKeyName
177
- : "writing from mem";
178
- await moveCursorTo(page, box, cursorMs(500));
179
- await showRing(page, box, label, "auto");
180
- await new Promise((res) => setTimeout(res, 200));
181
- }
182
- }
183
- catch {
184
- /* best-effort */
185
- }
186
- let result;
187
- try {
188
- await originalFill.call(this, "", {
189
- timeout: options?.timeout,
190
- });
191
- const seqOpts = { delay: typeDelay() };
192
- const to = options?.timeout;
193
- if (to !== undefined)
194
- seqOpts.timeout = to;
195
- result = await this.pressSequentially(String(value), seqOpts);
196
- }
197
- catch {
198
- result = await originalFill.call(this, value, options);
199
- }
200
- await hideRing(page);
201
- return result;
202
- };
203
- }
204
- if (!proto.__wgClickPatched) {
205
- proto.__wgClickPatched = true;
206
- const originalClick = proto.click;
207
- proto.click = async function (options) {
208
- let clickPoint = null;
209
- try {
210
- await installDemoChrome(page, "", { banner: false });
211
- await this.waitFor({
212
- state: "visible",
213
- timeout: options?.timeout || 30000,
214
- }).catch(() => { });
215
- const box = await this.boundingBox();
216
- if (box) {
217
- let label = "click";
218
- try {
219
- const text = (await this.textContent())?.trim();
220
- if (text && text.length > 0 && text.length <= 30)
221
- label = text;
222
- }
223
- catch {
224
- /* ignore */
225
- }
226
- clickPoint = await moveCursorTo(page, box, cursorMs(600));
227
- await showRing(page, box, label, "auto");
228
- await new Promise((res) => setTimeout(res, clickPrePop()));
229
- }
230
- }
231
- catch {
232
- /* best-effort */
233
- }
234
- if (clickPoint) {
235
- await clickPulseAt(page, clickPoint.x, clickPoint.y, "auto");
236
- await new Promise((res) => setTimeout(res, 80));
237
- }
238
- const result = await originalClick.call(this, options);
239
- await new Promise((res) => setTimeout(res, clickPostPop()));
240
- await hideRing(page);
241
- return result;
242
- };
243
- }
244
- }
@@ -1,21 +0,0 @@
1
- import { defineConfig } from "@playwright/test";
2
- import { chromiumExecutablePath } from "waygraph";
3
-
4
- export default defineConfig({
5
- testDir: "./tests",
6
- fullyParallel: false,
7
- workers: 1,
8
- timeout: 30_000,
9
- reporter: [["list"], ["html", { open: "never" }]],
10
- webServer: {
11
- command: "node scripts/fixture-server.mjs",
12
- url: "http://127.0.0.1:4277/dashboard",
13
- reuseExistingServer: !process.env.CI,
14
- },
15
- use: {
16
- headless: true,
17
- baseURL: "http://127.0.0.1:4277",
18
- trace: "retain-on-failure",
19
- launchOptions: { executablePath: chromiumExecutablePath() },
20
- },
21
- });
@@ -1,22 +0,0 @@
1
- import { fastForwardComposeBlock } from "waygraph";
2
- import { NavLoginBlock } from "./nav-login.block.js";
3
- import { FillUsernameBlock } from "./methods/fill-username.method.block.js";
4
- import { FillPasswordBlock } from "./methods/fill-password.method.block.js";
5
- import { SubmitLoginForFlow } from "./methods/submit-login-for-flow.js";
6
-
7
- /**
8
- * Kind: FFCompose (fast-forward)
9
- * Helper: fastForwardComposeBlock
10
- * Route: saucedemo-web/ (auth prefix)
11
- *
12
- * Collapses nav-login + fill-username + fill-password + submit-login into
13
- * one opaque demo/run step so checkout demos skip watching auth. Use
14
- * --ff-expand to gate inners again (they show as 4 separate steps).
15
- * loginFlow stays expanded for Sign In episode narration.
16
- */
17
- export const FfOwnerAuthBlock = fastForwardComposeBlock("ff-owner-auth", [
18
- NavLoginBlock,
19
- FillUsernameBlock,
20
- FillPasswordBlock,
21
- SubmitLoginForFlow,
22
- ]);