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
@@ -9,9 +9,13 @@
9
9
  * Agents: do not claim the stepper works unless
10
10
  * `assertWgOverlayReady(page)` (or WAYGRAPH_PROVE_EXIT=1) passes.
11
11
  */
12
+ /** Selector matching every element waygraph's overlay draws into a page. */
12
13
  export const WG_UI_SEL = '[data-wg-ui="1"]';
14
+ /** Selector of the overlay element that appears when the step panel is ready. */
13
15
  export const WG_READY_PANEL_SEL = '[data-wg-modal="panel"][data-wg-ready="1"]';
16
+ /** Selector of the overlay element that appears when the auto panel is ready. */
14
17
  export const WG_READY_AUTO_SEL = '[data-wg-modal="auto-panel"][data-wg-ready="1"]';
18
+ /** Selector of the overlay element that appears when the banner is ready. */
15
19
  export const WG_READY_BANNER_SEL = '[data-wg-modal="banner"][data-wg-ready="1"]';
16
20
  /** Browser-side beacon reader (also installed as window.__wgOverlayBeacon). */
17
21
  export function readWgOverlayBeaconInPage() {
@@ -37,6 +41,7 @@ export function readWgOverlayBeaconInPage() {
37
41
  };
38
42
  });
39
43
  }
44
+ /** Reads the overlay beacon from a page: what waygraph's own UI is showing. */
40
45
  export async function readWgOverlayBeacon(page) {
41
46
  return page.evaluate(() => {
42
47
  const w = window;
@@ -0,0 +1,12 @@
1
+ import type { WgBox, WgPage } from "../types.js";
2
+ export declare function moveCursorTo(page: WgPage, box: WgBox, ms: number): Promise<{
3
+ x: number;
4
+ y: number;
5
+ }>;
6
+ export declare function clickPulseAt(page: WgPage, x: any, y: any, tone: any): Promise<void>;
7
+ /**
8
+ * Touch swipe trail (mobile/tablet). dir: left|right|up|down.
9
+ * Returns after the trail animation completes.
10
+ * Self-contained when overlay helper is not installed yet (device runs before panel).
11
+ */
12
+ export declare function playSwipeTrail(page: WgPage, opts: any): Promise<void>;
@@ -0,0 +1,142 @@
1
+ // The demo cursor: travels to what a step clicks, pulses on the click, draws a swipe trail on touch devices.
2
+ import { ignorePageGone } from "../../engine/page-gone.js";
3
+ export async function moveCursorTo(page, box, ms) {
4
+ const x = box.x + box.width / 2;
5
+ const y = box.y + box.height / 2;
6
+ const travel = Math.max(0, Number(ms) || 0);
7
+ await page
8
+ .evaluate(({ x, y, ms }) => {
9
+ if (window.__wgMoveCursorTo)
10
+ window.__wgMoveCursorTo(x, y, ms);
11
+ }, { x, y, ms: travel })
12
+ .catch(ignorePageGone);
13
+ // CSS transition is async - wait the full travel so the cursor is ON the
14
+ // target before ring/pulse/real click (NavBlock click nav was skipping
15
+ // this and looked like a teleport).
16
+ if (travel > 0) {
17
+ await new Promise((res) => setTimeout(res, travel));
18
+ }
19
+ return { x, y };
20
+ }
21
+ export async function clickPulseAt(page, x, y, tone) {
22
+ await page
23
+ .evaluate(({ x, y, tone }) => {
24
+ if (window.__wgClickPulse)
25
+ window.__wgClickPulse(x, y, tone || "planned");
26
+ }, { x, y, tone: tone || "planned" })
27
+ .catch(ignorePageGone);
28
+ }
29
+ /**
30
+ * Touch swipe trail (mobile/tablet). dir: left|right|up|down.
31
+ * Returns after the trail animation completes.
32
+ * Self-contained when overlay helper is not installed yet (device runs before panel).
33
+ */
34
+ export async function playSwipeTrail(page, opts) {
35
+ const o = opts || {};
36
+ const waitMs = await page
37
+ .evaluate((payload) => {
38
+ if (typeof window.__wgSwipeTrail === "function") {
39
+ return window.__wgSwipeTrail(payload);
40
+ }
41
+ // Fallback: inject a one-shot trail without full overlay install.
42
+ const dir = payload.dir === "right" || payload.dir === "up" || payload.dir === "down"
43
+ ? payload.dir
44
+ : "left";
45
+ const ms = Math.max(280, Math.min(1400, Number(payload.ms) || 720));
46
+ const label = payload.label || "swipe";
47
+ let layer = __wgById("wg-swipe-layer");
48
+ if (layer)
49
+ layer.remove();
50
+ layer = document.createElement("div");
51
+ layer.id = "wg-swipe-layer";
52
+ layer.setAttribute("data-wg-ui", "1");
53
+ layer.style.cssText =
54
+ "position:fixed;inset:0;z-index:2147483646;pointer-events:none;overflow:hidden;";
55
+ const finger = document.createElement("div");
56
+ finger.style.cssText =
57
+ "position:absolute;width:28px;height:28px;margin:-14px 0 0 -14px;border-radius:50%;" +
58
+ "background:rgba(15,23,42,.92);border:2px solid #fff;box-shadow:0 4px 16px rgba(0,0,0,.4);";
59
+ const lab = document.createElement("div");
60
+ lab.textContent = label;
61
+ lab.style.cssText =
62
+ "position:absolute;left:50%;top:18%;transform:translateX(-50%);padding:6px 12px;" +
63
+ "border-radius:999px;background:rgba(15,23,42,.88);color:#e0f2fe;" +
64
+ "border:1px solid rgba(56,189,248,.55);font:700 12px/1.2 system-ui,sans-serif;";
65
+ layer.appendChild(lab);
66
+ layer.appendChild(finger);
67
+ __wgAdd(layer);
68
+ const vw = window.innerWidth || 390;
69
+ const vh = window.innerHeight || 844;
70
+ const pad = Math.min(vw, vh) * 0.18;
71
+ let x0;
72
+ let y0;
73
+ let x1;
74
+ let y1;
75
+ if (dir === "left") {
76
+ x0 = vw - pad;
77
+ x1 = pad;
78
+ y0 = y1 = vh * 0.52;
79
+ }
80
+ else if (dir === "right") {
81
+ x0 = pad;
82
+ x1 = vw - pad;
83
+ y0 = y1 = vh * 0.52;
84
+ }
85
+ else if (dir === "up") {
86
+ x0 = x1 = vw * 0.5;
87
+ y0 = vh - pad;
88
+ y1 = pad;
89
+ }
90
+ else {
91
+ x0 = x1 = vw * 0.5;
92
+ y0 = pad;
93
+ y1 = vh - pad;
94
+ }
95
+ finger.style.left = x0 + "px";
96
+ finger.style.top = y0 + "px";
97
+ const steps = 12;
98
+ const stepMs = Math.floor(ms / steps);
99
+ for (let i = 1; i <= steps; i++) {
100
+ const t = i / steps;
101
+ const e = t * t * (3 - 2 * t);
102
+ const x = x0 + (x1 - x0) * e;
103
+ const y = y0 + (y1 - y0) * e;
104
+ setTimeout(() => {
105
+ finger.style.left = x + "px";
106
+ finger.style.top = y + "px";
107
+ const dot = document.createElement("div");
108
+ dot.style.cssText =
109
+ "position:absolute;width:14px;height:14px;margin:-7px 0 0 -7px;border-radius:50%;" +
110
+ "background:rgba(147,197,253,.55);border:2px solid rgba(255,255,255,.85);left:" +
111
+ x +
112
+ "px;top:" +
113
+ y +
114
+ "px;opacity:" +
115
+ (0.85 - t * 0.55) +
116
+ ";transition:opacity .45s ease,transform .45s ease;";
117
+ layer.appendChild(dot);
118
+ requestAnimationFrame(() => {
119
+ dot.style.opacity = "0";
120
+ dot.style.transform = "scale(1.8)";
121
+ });
122
+ if (i === steps) {
123
+ setTimeout(() => {
124
+ const el = __wgById("wg-swipe-layer");
125
+ if (el)
126
+ el.remove();
127
+ }, 400);
128
+ }
129
+ }, i * stepMs);
130
+ }
131
+ return ms + 120;
132
+ }, {
133
+ dir: o.dir || "left",
134
+ label: o.label || "swipe",
135
+ hint: o.hint || "",
136
+ ms: o.ms || 720,
137
+ })
138
+ .catch(() => 0);
139
+ const n = Number(waitMs) || 0;
140
+ if (n > 0)
141
+ await new Promise((r) => setTimeout(r, n));
142
+ }
@@ -0,0 +1,13 @@
1
+ import type { WgPage } from "../types.js";
2
+ /**
3
+ * Video recording locks Playwright viewport to recordVideo.size. Shrinking
4
+ * setViewportSize to mobile/tablet letterboxes the .webm top-left. Instead keep
5
+ * the stage size and center a device-sized #wg-device-shell inside the frame.
6
+ */
7
+ export declare function applyVideoDeviceStage(page: WgPage, target: any, stage: any, opts: any): Promise<void>;
8
+ /**
9
+ * Apply authored device fixture to the live page (0.13+).
10
+ * Seamless viewport lerp + centered window + toast on set/clear.
11
+ * With --video: keep recordVideo stage size and center a device shell in-frame.
12
+ */
13
+ export declare function applyDeviceToPage(page: WgPage, device: any, sync: any): Promise<void>;
@@ -0,0 +1,396 @@
1
+ import { resolveDeviceState } from "../narration/device.js";
2
+ import { envNumber } from "../../engine/env.js";
3
+ import { ignorePageGone } from "../../engine/page-gone.js";
4
+ /**
5
+ * Fit + center the OS browser window on the device viewport so mobile/tablet
6
+ * is not stuck top-left inside a maximized frame (0.13.4).
7
+ * Desktop clear restores maximized.
8
+ */
9
+ async function fitWindowToDeviceViewport(page, viewport, opts) {
10
+ const maximize = !!(opts && opts.maximize);
11
+ let client;
12
+ try {
13
+ client = await page.context().newCDPSession(page);
14
+ const { windowId } = await client.send("Browser.getWindowForTarget");
15
+ if (maximize) {
16
+ await client.send("Browser.setWindowBounds", {
17
+ windowId,
18
+ bounds: { windowState: "maximized" },
19
+ });
20
+ return;
21
+ }
22
+ if (!viewport || !viewport.width || !viewport.height)
23
+ return;
24
+ const metrics = await page
25
+ .evaluate(() => {
26
+ const chromeW = Math.max(0, (window.outerWidth || 0) - (window.innerWidth || 0));
27
+ const chromeH = Math.max(0, (window.outerHeight || 0) - (window.innerHeight || 0));
28
+ return {
29
+ chromeW: Number.isFinite(chromeW) ? chromeW : 0,
30
+ // First paint after maximize often reports 0 chrome - use a floor.
31
+ chromeH: chromeH > 20 ? chromeH : 88,
32
+ screenW: window.screen.availWidth || 1920,
33
+ screenH: window.screen.availHeight || 1080,
34
+ };
35
+ })
36
+ .catch(() => ({ chromeW: 0, chromeH: 88, screenW: 1920, screenH: 1080 }));
37
+ // Leave maximized before setting pixel bounds (Chromium ignores size while max).
38
+ await client.send("Browser.setWindowBounds", {
39
+ windowId,
40
+ bounds: { windowState: "normal" },
41
+ });
42
+ const winW = Math.min(metrics.screenW, Math.max(320, Math.floor(viewport.width + metrics.chromeW)));
43
+ const winH = Math.min(metrics.screenH, Math.max(320, Math.floor(viewport.height + metrics.chromeH)));
44
+ const left = Math.max(0, Math.floor((metrics.screenW - winW) / 2));
45
+ const top = Math.max(0, Math.floor((metrics.screenH - winH) / 2));
46
+ await client.send("Browser.setWindowBounds", {
47
+ windowId,
48
+ bounds: {
49
+ windowState: "normal",
50
+ left,
51
+ top,
52
+ width: winW,
53
+ height: winH,
54
+ },
55
+ });
56
+ }
57
+ catch {
58
+ /* headless / no window - ignore */
59
+ }
60
+ finally {
61
+ if (client)
62
+ await client.detach().catch(ignorePageGone);
63
+ }
64
+ }
65
+ /**
66
+ * Video recording locks Playwright viewport to recordVideo.size. Shrinking
67
+ * setViewportSize to mobile/tablet letterboxes the .webm top-left. Instead keep
68
+ * the stage size and center a device-sized #wg-device-shell inside the frame.
69
+ */
70
+ export async function applyVideoDeviceStage(page, target, stage, opts) {
71
+ const clear = !!(opts && opts.clear);
72
+ const shutterOut = !!(opts && opts.shutterOut);
73
+ const enterIn = !!(opts && opts.enterIn);
74
+ const desktopFlat = !!(opts && (opts.desktopFlat || opts.shutterOut));
75
+ const result = await page
76
+ .evaluate(({ tw, th, sw, sh, clear, shutterOut, enterIn, desktopFlat }) => {
77
+ const MATTE = "#0b1220";
78
+ const unwrap = () => {
79
+ const shell = document.getElementById("wg-device-shell");
80
+ if (shell) {
81
+ const parent = shell.parentNode;
82
+ if (parent) {
83
+ while (shell.firstChild)
84
+ parent.insertBefore(shell.firstChild, shell);
85
+ }
86
+ shell.remove();
87
+ }
88
+ document.documentElement.classList.remove("wg-video-device-stage");
89
+ document.documentElement.style.removeProperty("background");
90
+ const b = document.body;
91
+ if (b) {
92
+ b.style.margin = "";
93
+ b.style.minHeight = "";
94
+ b.style.display = "";
95
+ b.style.alignItems = "";
96
+ b.style.justifyContent = "";
97
+ b.style.background = "";
98
+ b.style.overflow = "";
99
+ }
100
+ };
101
+ if (clear) {
102
+ unwrap();
103
+ return { waitMs: 0 };
104
+ }
105
+ if (!document.body)
106
+ return { waitMs: 0 };
107
+ document.documentElement.classList.add("wg-video-device-stage");
108
+ document.documentElement.style.background = MATTE;
109
+ document.body.style.margin = "0";
110
+ document.body.style.minHeight = "100vh";
111
+ document.body.style.display = "flex";
112
+ document.body.style.alignItems = "center";
113
+ document.body.style.justifyContent = "center";
114
+ document.body.style.background = MATTE;
115
+ document.body.style.overflow = "hidden";
116
+ let shell = document.getElementById("wg-device-shell");
117
+ const created = !shell;
118
+ if (!shell) {
119
+ shell = document.createElement("div");
120
+ shell.id = "wg-device-shell";
121
+ const move = [];
122
+ for (const child of [...document.body.childNodes]) {
123
+ if (child.nodeType === 1 &&
124
+ child.getAttribute &&
125
+ child.getAttribute("data-wg-ui") === "1") {
126
+ continue;
127
+ }
128
+ if (child.nodeType === 1 && child.id === "wg-device-shell")
129
+ continue;
130
+ move.push(child);
131
+ }
132
+ for (const n of move)
133
+ shell.appendChild(n);
134
+ document.body.appendChild(shell);
135
+ }
136
+ // Desktop flat: always full-bleed, never reintroduce bezel on overlay rebuild.
137
+ if (desktopFlat) {
138
+ shell.classList.remove("wg-shell-enter");
139
+ shell.classList.add("wg-shell-shutter-out");
140
+ shell.classList.add("wg-shell-desktop-flat");
141
+ shell.style.width = sw + "px";
142
+ shell.style.height = sh + "px";
143
+ shell.style.maxWidth = sw + "px";
144
+ shell.style.maxHeight = sh + "px";
145
+ shell.style.transform = "scale(1)";
146
+ shell.style.transformOrigin = "center center";
147
+ shell.style.borderRadius = "0";
148
+ shell.style.boxShadow = "none";
149
+ shell.style.border = "none";
150
+ shell.style.outline = "none";
151
+ return { waitMs: shutterOut ? 480 : 0 };
152
+ }
153
+ // Leaving desktop-flat: clear INLINE radius/shadow overrides so CSS
154
+ // border-radius:16px applies evenly on all corners again.
155
+ shell.style.removeProperty("border-radius");
156
+ shell.style.removeProperty("box-shadow");
157
+ shell.style.removeProperty("border");
158
+ shell.style.removeProperty("outline");
159
+ if (enterIn && (created || shell.classList.contains("wg-shell-shutter-out"))) {
160
+ shell.classList.remove("wg-shell-shutter-out");
161
+ shell.classList.remove("wg-shell-desktop-flat");
162
+ shell.classList.add("wg-shell-enter");
163
+ void shell.offsetWidth;
164
+ }
165
+ const scale = Math.min(sw / tw, sh / th) * 0.92;
166
+ shell.style.width = tw + "px";
167
+ shell.style.height = th + "px";
168
+ shell.style.maxWidth = tw + "px";
169
+ shell.style.maxHeight = th + "px";
170
+ shell.style.transform = "scale(" + scale + ")";
171
+ shell.style.transformOrigin = "center center";
172
+ shell.classList.remove("wg-shell-shutter-out");
173
+ shell.classList.remove("wg-shell-desktop-flat");
174
+ if (enterIn && shell.classList.contains("wg-shell-enter")) {
175
+ requestAnimationFrame(() => {
176
+ shell.classList.remove("wg-shell-enter");
177
+ });
178
+ return { waitMs: 520 };
179
+ }
180
+ shell.classList.remove("wg-shell-enter");
181
+ return { waitMs: 0 };
182
+ }, {
183
+ tw: target.width,
184
+ th: target.height,
185
+ sw: stage.width,
186
+ sh: stage.height,
187
+ clear,
188
+ shutterOut,
189
+ enterIn,
190
+ desktopFlat,
191
+ })
192
+ .catch(() => ({ waitMs: 0 }));
193
+ const waitMs = result && result.waitMs ? Number(result.waitMs) : 0;
194
+ if (waitMs > 0)
195
+ await new Promise((r) => setTimeout(r, waitMs));
196
+ }
197
+ /**
198
+ * Apply authored device fixture to the live page (0.13+).
199
+ * Seamless viewport lerp + centered window + toast on set/clear.
200
+ * With --video: keep recordVideo stage size and center a device shell in-frame.
201
+ */
202
+ export async function applyDeviceToPage(page, device, sync) {
203
+ const mode = sync || (device ? "set" : "keep");
204
+ if (mode === "keep" && !device)
205
+ return;
206
+ const d = device ||
207
+ resolveDeviceState("desktop", false) || {
208
+ preset: "desktop",
209
+ viewport: { width: 1280, height: 720, deviceScaleFactor: 1 },
210
+ isMobile: false,
211
+ hasTouch: false,
212
+ touchMode: false,
213
+ };
214
+ const realSet = typeof page.__wgRealSetViewportSize === "function"
215
+ ? page.__wgRealSetViewportSize
216
+ : page.setViewportSize.bind(page);
217
+ const target = {
218
+ width: Math.max(200, Math.floor(d.viewport.width)),
219
+ height: Math.max(200, Math.floor(d.viewport.height)),
220
+ };
221
+ const videoStage = page.__wgVideoViewport &&
222
+ page.__wgVideoViewport.width > 0 &&
223
+ page.__wgVideoViewport.height > 0
224
+ ? {
225
+ width: Math.floor(page.__wgVideoViewport.width),
226
+ height: Math.floor(page.__wgVideoViewport.height),
227
+ }
228
+ : null;
229
+ let from = null;
230
+ try {
231
+ from = page.viewportSize();
232
+ }
233
+ catch {
234
+ from = null;
235
+ }
236
+ // Non-headless (no --video) used to literally resize the real OS browser window/viewport to
237
+ // each device's pixel size - a real, confirmed complaint: it didn't look like the same animated
238
+ // device-shell bezel the --video path already has, just a plain resize. Both now use the exact
239
+ // same applyVideoDeviceStage bezel technique - the "stage" (the fixed outer viewport the shell is
240
+ // centered within) is the recordVideo canvas size when recording, or the window's own size at
241
+ // the FIRST device switch when not (captured once, persisted on the page - the window itself is
242
+ // only really resized that one time, to establish a stable stage; every device switch after that
243
+ // paints the animated shell inside it instead of resizing the window again).
244
+ let establishingHeadedStage = false;
245
+ if (!videoStage && !page.__wgHeadedStage) {
246
+ page.__wgHeadedStage =
247
+ from && from.width > 0 && from.height > 0 ? { width: from.width, height: from.height } : { width: 1280, height: 720 };
248
+ establishingHeadedStage = true;
249
+ }
250
+ const stage = videoStage || page.__wgHeadedStage;
251
+ const announce = mode === "set" || mode === "clear";
252
+ const toDesktop = mode === "clear" || (d.preset === "desktop" && !d.touchMode);
253
+ const shouldAnimate = announce &&
254
+ from &&
255
+ from.width > 0 &&
256
+ from.height > 0 &&
257
+ (from.width !== target.width || from.height !== target.height);
258
+ // Always clear camera zoom when returning to desktop (video + headed).
259
+ if (toDesktop) {
260
+ page.__wgDesktopFlat = true;
261
+ await page
262
+ .evaluate(() => {
263
+ window.__wgZoomOutOnHide = true;
264
+ if (window.__wgClearZoom)
265
+ window.__wgClearZoom();
266
+ })
267
+ .catch(ignorePageGone);
268
+ }
269
+ else if (announce) {
270
+ page.__wgDesktopFlat = false;
271
+ }
272
+ // Swipe trail is for scrolling (see ensureLocatorInView), not device morph.
273
+ const nextOrient = d.orientation === "landscape" || d.orientation === "portrait"
274
+ ? d.orientation
275
+ : target.height > target.width
276
+ ? "portrait"
277
+ : "landscape";
278
+ page.__wgDeviceOrient = nextOrient;
279
+ page.__wgDevicePreset = toDesktop ? "desktop" : d.preset || "";
280
+ if (stage) {
281
+ // Lock the Playwright viewport to the stage size so frames/window fill it; center the device
282
+ // shell inside (OS window centering alone does not). Do NOT fitWindow to the device size -
283
+ // that shrinks the viewport below the stage and (when recording) pads the .webm with grey
284
+ // (top-left bias). Headed-without-video reuses this exact technique (see `stage`'s own
285
+ // comment above) - the real OS window is only ever resized once, right here, to establish the
286
+ // stage itself; every device switch after that paints the animated shell inside it instead.
287
+ if (!videoStage && establishingHeadedStage) {
288
+ await fitWindowToDeviceViewport(page, stage, { maximize: false }).catch(ignorePageGone);
289
+ }
290
+ await realSet(stage).catch(ignorePageGone);
291
+ const shellFrom = page.__wgDeviceShell || target;
292
+ if (toDesktop) {
293
+ // Zoom already cleared above. Full-bleed desktop shell (no matte frame).
294
+ // Shutter-out: soft rounded -> radius 0, then flat edge-to-edge.
295
+ const desk = {
296
+ width: stage.width,
297
+ height: stage.height,
298
+ };
299
+ page.__wgDeviceShell = { ...desk };
300
+ await applyVideoDeviceStage(page, desk, stage, {
301
+ clear: false,
302
+ shutterOut: true,
303
+ desktopFlat: true,
304
+ });
305
+ await realSet(stage).catch(ignorePageGone);
306
+ }
307
+ else {
308
+ // Lerp shell size when switching mobile <-> tablet mid-run.
309
+ const firstDevice = !page.__wgDeviceShell;
310
+ if (announce &&
311
+ shellFrom &&
312
+ (shellFrom.width !== target.width || shellFrom.height !== target.height)) {
313
+ const steps = 14;
314
+ const ms = envNumber("WAYGRAPH_DEVICE_TRANSITION_MS") ?? 520;
315
+ const stepMs = Math.max(12, Math.floor(ms / steps));
316
+ for (let i = 1; i <= steps; i++) {
317
+ const t = i / steps;
318
+ const e = t * t * (3 - 2 * t);
319
+ const mid = {
320
+ width: Math.round(shellFrom.width + (target.width - shellFrom.width) * e),
321
+ height: Math.round(shellFrom.height + (target.height - shellFrom.height) * e),
322
+ };
323
+ await applyVideoDeviceStage(page, mid, stage, {
324
+ clear: false,
325
+ enterIn: i === 1 && firstDevice,
326
+ });
327
+ if (i < steps)
328
+ await new Promise((r) => setTimeout(r, stepMs));
329
+ }
330
+ }
331
+ else {
332
+ await applyVideoDeviceStage(page, target, stage, {
333
+ clear: false,
334
+ enterIn: firstDevice || announce,
335
+ });
336
+ }
337
+ page.__wgDeviceShell = { ...target };
338
+ // Re-assert stage size after any prior fitWindow.
339
+ await realSet(stage).catch(ignorePageGone);
340
+ }
341
+ }
342
+ else {
343
+ // Unmaximize + center early so the lerp does not sit in the corner of a
344
+ // maximized frame. Desktop clear maximizes at the end instead.
345
+ if (!toDesktop) {
346
+ await fitWindowToDeviceViewport(page, from && from.width ? from : target, {
347
+ maximize: false,
348
+ });
349
+ }
350
+ try {
351
+ if (shouldAnimate) {
352
+ const steps = 14;
353
+ const ms = envNumber("WAYGRAPH_DEVICE_TRANSITION_MS") ?? 520;
354
+ const stepMs = Math.max(12, Math.floor(ms / steps));
355
+ for (let i = 1; i <= steps; i++) {
356
+ const t = i / steps;
357
+ const e = t * t * (3 - 2 * t); // smoothstep
358
+ const mid = {
359
+ width: Math.round(from.width + (target.width - from.width) * e),
360
+ height: Math.round(from.height + (target.height - from.height) * e),
361
+ };
362
+ await realSet(mid);
363
+ if (!toDesktop && (i === 1 || i === steps || i % 3 === 0)) {
364
+ await fitWindowToDeviceViewport(page, mid, { maximize: false });
365
+ }
366
+ if (i < steps)
367
+ await new Promise((r) => setTimeout(r, stepMs));
368
+ }
369
+ }
370
+ else {
371
+ await realSet(target);
372
+ }
373
+ }
374
+ catch {
375
+ /* maximized / null viewport hosts may reject - toast still updates */
376
+ }
377
+ if (toDesktop) {
378
+ await fitWindowToDeviceViewport(page, target, { maximize: true });
379
+ }
380
+ else {
381
+ await fitWindowToDeviceViewport(page, target, { maximize: false });
382
+ }
383
+ }
384
+ // Fire toast near the end of the lerp so it reads as one seamless beat.
385
+ await page
386
+ .evaluate((payload) => {
387
+ if (window.__wgSyncDevice)
388
+ window.__wgSyncDevice(payload);
389
+ }, {
390
+ sync: mode,
391
+ device: d,
392
+ remain: mode === "keep" || mode === "set",
393
+ announce,
394
+ })
395
+ .catch(ignorePageGone);
396
+ }
@@ -0,0 +1 @@
1
+ export declare function installBanner({ title, favicon, bannerPos, todoPos, envAutoplay, todoDockUi, bannerUi, tag: bannerTag }: any): void;