waygraph 0.15.53 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (556) hide show
  1. package/README.md +8 -3
  2. package/bin/waygraph +2 -2
  3. package/dist/analysis/check.d.ts +38 -0
  4. package/dist/analysis/check.js +87 -0
  5. package/dist/analysis/coverage-gap.d.ts +1 -1
  6. package/dist/analysis/coverage-gap.js +14 -37
  7. package/dist/analysis/flow-source.d.ts +9 -0
  8. package/dist/analysis/flow-source.js +25 -0
  9. package/dist/analysis/graph.d.ts +13 -14
  10. package/dist/analysis/graph.js +48 -371
  11. package/dist/analysis/map-check.js +4 -39
  12. package/dist/analysis/practices-check.d.ts +1 -1
  13. package/dist/analysis/practices-check.js +24 -45
  14. package/dist/cli/args.d.ts +23 -0
  15. package/dist/cli/args.js +20 -0
  16. package/dist/{cli.d.ts → cli/cli.d.ts} +0 -1
  17. package/dist/{cli.js → cli/cli.js} +10 -9
  18. package/dist/{commands → cli/commands}/agent-dive-scaffold.js +35 -64
  19. package/dist/cli/commands/agent-dive.js +42 -0
  20. package/dist/{commands → cli/commands}/check.d.ts +0 -1
  21. package/dist/cli/commands/check.js +104 -0
  22. package/dist/cli/commands/codemod-checkpoints.d.ts +18 -0
  23. package/dist/cli/commands/codemod-checkpoints.js +186 -0
  24. package/dist/cli/commands/codemod-flows.d.ts +18 -0
  25. package/dist/cli/commands/codemod-flows.js +284 -0
  26. package/dist/cli/commands/codemod-stubs.d.ts +10 -0
  27. package/dist/cli/commands/codemod-stubs.js +187 -0
  28. package/dist/{commands → cli/commands}/extensions.js +5 -4
  29. package/dist/{commands → cli/commands}/init.js +1 -2
  30. package/dist/{commands → cli/commands}/list.js +9 -7
  31. package/dist/cli/commands/manifest.d.ts +2 -0
  32. package/dist/cli/commands/manifest.js +20 -0
  33. package/dist/cli/commands/map.js +57 -0
  34. package/dist/{commands → cli/commands}/run.d.ts +0 -1
  35. package/dist/cli/commands/run.js +64 -0
  36. package/dist/{commands → cli/commands}/session.js +61 -88
  37. package/dist/{commands → cli/commands}/test.js +11 -14
  38. package/dist/cli/commands/traverse.js +105 -0
  39. package/dist/{commands → cli/commands}/try.js +29 -25
  40. package/dist/{commands → cli/commands}/upgrade.js +40 -4
  41. package/dist/cli/flags.d.ts +193 -16
  42. package/dist/cli/flags.js +179 -234
  43. package/dist/cli/run-chain.d.ts +1 -0
  44. package/dist/cli/run-chain.js +42 -7
  45. package/dist/cli/usage.d.ts +1 -1
  46. package/dist/cli/usage.js +21 -53
  47. package/dist/cli/util.d.ts +2 -2
  48. package/dist/cli/util.js +2 -3
  49. package/dist/{highlights → demo/narration}/css.d.ts +1 -1
  50. package/dist/{highlights → demo/narration}/css.js +2 -3
  51. package/dist/{highlights → demo/narration}/demo-pace.d.ts +7 -11
  52. package/dist/{highlights → demo/narration}/demo-pace.js +9 -11
  53. package/dist/{highlights → demo/narration}/device.d.ts +4 -2
  54. package/dist/{highlights → demo/narration}/device.js +3 -1
  55. package/dist/demo/narration/merge.d.ts +8 -0
  56. package/dist/demo/narration/merge.js +71 -0
  57. package/dist/{highlights/run-phase.d.ts → demo/narration/narration.d.ts} +10 -14
  58. package/dist/{highlights/run-phase.js → demo/narration/narration.js} +25 -94
  59. package/dist/{highlights → demo/narration}/shorthand.d.ts +1 -1
  60. package/dist/demo/narration/stub-ctx.d.ts +8 -0
  61. package/dist/demo/narration/stub-ctx.js +164 -0
  62. package/dist/{highlights → demo/narration}/style.d.ts +1 -7
  63. package/dist/{highlights → demo/narration}/style.js +1 -41
  64. package/dist/{highlights → demo/narration}/todo-dock.d.ts +3 -3
  65. package/dist/{highlights → demo/narration}/todo-dock.js +13 -30
  66. package/dist/demo/overlay/auto-chrome.d.ts +7 -0
  67. package/dist/demo/overlay/auto-chrome.js +97 -0
  68. package/dist/{session/overlay-beacon.d.ts → demo/overlay/beacon.d.ts} +7 -0
  69. package/dist/{session/overlay-beacon.js → demo/overlay/beacon.js} +5 -0
  70. package/dist/demo/overlay/cursor.d.ts +12 -0
  71. package/dist/demo/overlay/cursor.js +142 -0
  72. package/dist/demo/overlay/device-stage.d.ts +13 -0
  73. package/dist/demo/overlay/device-stage.js +396 -0
  74. package/dist/demo/overlay/inpage/banner.d.ts +1 -0
  75. package/dist/demo/overlay/inpage/banner.js +160 -0
  76. package/dist/demo/overlay/inpage/caption.d.ts +2 -0
  77. package/dist/demo/overlay/inpage/caption.js +24 -0
  78. package/dist/demo/overlay/inpage/core.d.ts +1 -0
  79. package/dist/demo/overlay/inpage/core.js +345 -0
  80. package/dist/demo/overlay/inpage/device-chip.d.ts +1 -0
  81. package/dist/demo/overlay/inpage/device-chip.js +191 -0
  82. package/dist/demo/overlay/inpage/network.d.ts +9 -0
  83. package/dist/demo/overlay/inpage/network.js +200 -0
  84. package/dist/demo/overlay/inpage/panel-chrome.d.ts +1 -0
  85. package/dist/demo/overlay/inpage/panel-chrome.js +203 -0
  86. package/dist/demo/overlay/inpage/stamp.d.ts +1 -0
  87. package/dist/demo/overlay/inpage/stamp.js +46 -0
  88. package/dist/demo/overlay/inpage/swipe-zoom.d.ts +1 -0
  89. package/dist/demo/overlay/inpage/swipe-zoom.js +220 -0
  90. package/dist/demo/overlay/inpage/todos.d.ts +1 -0
  91. package/dist/demo/overlay/inpage/todos.js +294 -0
  92. package/dist/demo/overlay/locator-theater.d.ts +25 -0
  93. package/dist/demo/overlay/locator-theater.js +76 -0
  94. package/dist/demo/overlay/network-capture.d.ts +22 -0
  95. package/dist/demo/overlay/network-capture.js +127 -0
  96. package/dist/demo/overlay/overlay-css.d.ts +3 -0
  97. package/dist/demo/overlay/overlay-css.js +369 -0
  98. package/dist/demo/overlay/overlay-stage.d.ts +23 -0
  99. package/dist/demo/overlay/overlay-stage.js +106 -0
  100. package/dist/demo/overlay/overlay.d.ts +10 -0
  101. package/dist/demo/overlay/overlay.js +89 -0
  102. package/dist/{pilot-overlay/overlay-fixtures.d.ts → demo/overlay/phase-fixtures.d.ts} +2 -2
  103. package/dist/{pilot-overlay/overlay-fixtures.js → demo/overlay/phase-fixtures.js} +2 -2
  104. package/dist/{pilot-overlay/action-ring.js → demo/overlay/pilot/actions.js} +2 -1
  105. package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.d.ts +6 -5
  106. package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.js +19 -18
  107. package/dist/{pilot-overlay → demo/overlay/pilot}/shell.d.ts +2 -2
  108. package/dist/{pilot-overlay → demo/overlay/pilot}/shell.js +13 -22
  109. package/dist/demo/overlay/reattach.d.ts +7 -0
  110. package/dist/demo/overlay/reattach.js +23 -0
  111. package/dist/demo/overlay/rings.d.ts +33 -0
  112. package/dist/demo/overlay/rings.js +448 -0
  113. package/dist/{ui → demo/overlay/ui}/components/ring.js +2 -2
  114. package/dist/{ui → demo/overlay/ui}/overlay.css +4 -4
  115. package/dist/{ui → demo/overlay/ui}/shadow.d.ts +1 -1
  116. package/dist/{ui → demo/overlay/ui}/shadow.js +39 -2
  117. package/dist/demo/stepper/after.d.ts +3 -0
  118. package/dist/demo/stepper/after.js +113 -0
  119. package/dist/demo/stepper/banner-log.d.ts +37 -0
  120. package/dist/demo/stepper/banner-log.js +63 -0
  121. package/dist/demo/stepper/before.d.ts +4 -0
  122. package/dist/demo/stepper/before.js +110 -0
  123. package/dist/demo/stepper/demo-log.d.ts +31 -0
  124. package/dist/demo/stepper/demo-log.js +309 -0
  125. package/dist/demo/stepper/gate.d.ts +11 -0
  126. package/dist/demo/stepper/gate.js +78 -0
  127. package/dist/demo/stepper/interaction-patch.d.ts +3 -0
  128. package/dist/demo/stepper/interaction-patch.js +323 -0
  129. package/dist/demo/stepper/pacing.d.ts +21 -0
  130. package/dist/demo/stepper/pacing.js +23 -0
  131. package/dist/demo/stepper/slides.d.ts +11 -0
  132. package/dist/demo/stepper/slides.js +233 -0
  133. package/dist/demo/stepper/step-panels.d.ts +21 -0
  134. package/dist/demo/stepper/step-panels.js +589 -0
  135. package/dist/demo/stepper/stepper.d.ts +24 -0
  136. package/dist/demo/stepper/stepper.js +122 -0
  137. package/dist/demo/stepper/teardown.d.ts +48 -0
  138. package/dist/demo/stepper/teardown.js +179 -0
  139. package/dist/demo/stepper/todo-advance.d.ts +14 -0
  140. package/dist/demo/stepper/todo-advance.js +110 -0
  141. package/dist/demo/stepper/view.d.ts +68 -0
  142. package/dist/demo/stepper/view.js +31 -0
  143. package/dist/demo/types.d.ts +17 -0
  144. package/dist/demo/verbose-log.js +15 -0
  145. package/dist/{types.d.ts → engine/block/block.d.ts} +106 -91
  146. package/dist/{core → engine/block}/block.js +10 -53
  147. package/dist/{core → engine/block}/compose.d.ts +10 -7
  148. package/dist/{core → engine/block}/compose.js +1 -1
  149. package/dist/{core/blocks → engine/block/kinds}/api.d.ts +17 -12
  150. package/dist/{core/blocks → engine/block/kinds}/api.js +26 -18
  151. package/dist/{core/blocks → engine/block/kinds}/effect.d.ts +13 -18
  152. package/dist/engine/block/kinds/effect.js +17 -0
  153. package/dist/{core/blocks → engine/block/kinds}/method.d.ts +19 -29
  154. package/dist/{core/blocks → engine/block/kinds}/method.js +7 -21
  155. package/dist/{core/blocks → engine/block/kinds}/nav.d.ts +22 -31
  156. package/dist/{core/blocks → engine/block/kinds}/nav.js +6 -12
  157. package/dist/{core/blocks → engine/block/kinds}/page.d.ts +15 -20
  158. package/dist/{core/blocks → engine/block/kinds}/page.js +5 -7
  159. package/dist/engine/checkpoint/checkpoint.d.ts +22 -0
  160. package/dist/engine/checkpoint/checkpoint.js +8 -0
  161. package/dist/engine/checkpoint/route.d.ts +28 -0
  162. package/dist/engine/checkpoint/route.js +28 -0
  163. package/dist/{core → engine}/config.d.ts +7 -2
  164. package/dist/engine/config.js +6 -0
  165. package/dist/engine/engine.d.ts +45 -0
  166. package/dist/{core → engine}/engine.js +6 -10
  167. package/dist/engine/env.d.ts +59 -0
  168. package/dist/engine/env.js +83 -0
  169. package/dist/{errors.d.ts → engine/errors.d.ts} +23 -22
  170. package/dist/{errors.js → engine/errors.js} +22 -22
  171. package/dist/{core → engine/flow}/branch-regression.d.ts +8 -7
  172. package/dist/{core → engine/flow}/branch-regression.js +4 -3
  173. package/dist/engine/flow/flow.d.ts +162 -0
  174. package/dist/engine/flow/flow.js +244 -0
  175. package/dist/{core → engine/flow}/map-builder.d.ts +42 -40
  176. package/dist/{core → engine/flow}/map-builder.js +46 -48
  177. package/dist/{core → engine}/locate.d.ts +1 -1
  178. package/dist/{core → engine}/locate.js +1 -2
  179. package/dist/{mem-stub.d.ts → engine/mem/mem-stub.d.ts} +9 -8
  180. package/dist/{mem-stub.js → engine/mem/mem-stub.js} +2 -2
  181. package/dist/{mem-page.d.ts → engine/mem/mem.d.ts} +1 -1
  182. package/dist/{mem-page.js → engine/mem/mem.js} +2 -1
  183. package/dist/engine/page-gone.d.ts +5 -0
  184. package/dist/engine/page-gone.js +20 -0
  185. package/dist/engine/run/connect.d.ts +28 -0
  186. package/dist/{types.js → engine/run/connect.js} +11 -10
  187. package/dist/engine/run/events.d.ts +67 -0
  188. package/dist/engine/run/events.js +90 -0
  189. package/dist/engine/run/hooks.d.ts +16 -0
  190. package/dist/engine/run/hooks.js +8 -0
  191. package/dist/engine/run/launch.d.ts +13 -0
  192. package/dist/engine/run/launch.js +27 -0
  193. package/dist/{core/run-graph.d.ts → engine/run/run.d.ts} +9 -11
  194. package/dist/{core/run-graph.js → engine/run/run.js} +22 -11
  195. package/dist/engine/stub/pace.d.ts +12 -0
  196. package/dist/engine/stub/pace.js +2 -0
  197. package/dist/engine/stub/ring.d.ts +130 -0
  198. package/dist/engine/stub/ring.js +41 -0
  199. package/dist/engine/stub/stub.d.ts +268 -0
  200. package/dist/engine/stub/stub.js +1 -0
  201. package/dist/engine/stub/todos.d.ts +104 -0
  202. package/dist/engine/stub/todos.js +2 -0
  203. package/dist/engine/stub/viewport.d.ts +26 -0
  204. package/dist/engine/stub/viewport.js +2 -0
  205. package/dist/{trait.d.ts → engine/trait/trait.d.ts} +1 -1
  206. package/dist/index.d.ts +84 -36
  207. package/dist/index.js +44 -19
  208. package/dist/{session/auto-explore-run.d.ts → live/auto/auto.d.ts} +10 -16
  209. package/dist/{session/auto-explore-run.js → live/auto/auto.js} +164 -248
  210. package/dist/{session/auto-explore.d.ts → live/auto/explore.d.ts} +4 -14
  211. package/dist/{session/auto-explore.js → live/auto/explore.js} +21 -127
  212. package/dist/{auto-session/session.d.ts → live/auto-session/auto-session.d.ts} +1 -1
  213. package/dist/{auto-session/session.js → live/auto-session/auto-session.js} +27 -24
  214. package/dist/{auto-session → live/auto-session}/helpers.d.ts +16 -5
  215. package/dist/{auto-session → live/auto-session}/helpers.js +1 -1
  216. package/dist/{session/auto-session-ipc.d.ts → live/auto-session/ipc.d.ts} +7 -5
  217. package/dist/{session/auto-session-ipc.js → live/auto-session/ipc.js} +31 -16
  218. package/dist/{session/browser.d.ts → live/auto-session/start.d.ts} +1 -2
  219. package/dist/{session/browser.js → live/auto-session/start.js} +2 -3
  220. package/dist/{pilot-overlay → live/pilot}/panel.d.ts +1 -1
  221. package/dist/{pilot-overlay → live/pilot}/panel.js +23 -31
  222. package/dist/{session → live/pilot}/pilot.d.ts +4 -3
  223. package/dist/{session → live/pilot}/pilot.js +4 -4
  224. package/dist/{traverse → live/traverse}/coverage.d.ts +4 -0
  225. package/dist/{traverse → live/traverse}/coverage.js +3 -0
  226. package/dist/{traverse → live/traverse}/lease.d.ts +1 -0
  227. package/dist/{traverse → live/traverse}/lease.js +1 -0
  228. package/dist/{traverse/run.d.ts → live/traverse/traverse.d.ts} +4 -1
  229. package/dist/{traverse/run.js → live/traverse/traverse.js} +26 -43
  230. package/dist/manifest/manifest.d.ts +52 -0
  231. package/dist/manifest/manifest.js +93 -0
  232. package/dist/manifest/map-imports.d.ts +7 -0
  233. package/dist/manifest/map-imports.js +22 -0
  234. package/dist/manifest/maps.d.ts +33 -0
  235. package/dist/manifest/maps.js +62 -0
  236. package/dist/manifest/pack.d.ts +21 -0
  237. package/dist/manifest/pack.js +109 -0
  238. package/dist/manifest/project.d.ts +60 -0
  239. package/dist/manifest/project.js +101 -0
  240. package/dist/{session/block-inject.js → manifest/roots.js} +1 -18
  241. package/dist/manifest/scan.d.ts +19 -0
  242. package/dist/manifest/scan.js +57 -0
  243. package/dist/{blocks-select.d.ts → manifest/select.d.ts} +3 -0
  244. package/dist/{blocks-select.js → manifest/select.js} +2 -0
  245. package/dist/manifest/source.d.ts +23 -0
  246. package/dist/manifest/source.js +86 -0
  247. package/dist/runner/mode.d.ts +71 -0
  248. package/dist/runner/mode.js +1 -0
  249. package/dist/runner/modes/branches.d.ts +5 -0
  250. package/dist/runner/modes/branches.js +37 -0
  251. package/dist/runner/modes/demo.d.ts +3 -0
  252. package/dist/runner/modes/demo.js +13 -0
  253. package/dist/runner/modes/report.d.ts +2 -0
  254. package/dist/runner/modes/report.js +54 -0
  255. package/dist/runner/modes/run.d.ts +2 -0
  256. package/dist/runner/modes/run.js +3 -0
  257. package/dist/runner/options.d.ts +31 -0
  258. package/dist/runner/options.js +42 -0
  259. package/dist/runner/plan/find.d.ts +18 -0
  260. package/dist/runner/plan/find.js +65 -0
  261. package/dist/runner/plan/plan.d.ts +11 -0
  262. package/dist/runner/plan/plan.js +97 -0
  263. package/dist/runner/plan/seed-mem.d.ts +12 -0
  264. package/dist/runner/plan/seed-mem.js +98 -0
  265. package/dist/runner/plan/spec.d.ts +5 -0
  266. package/dist/runner/plan/spec.js +17 -0
  267. package/dist/runner/play-steps.d.ts +2 -0
  268. package/dist/runner/play-steps.js +59 -0
  269. package/dist/runner/runner.d.ts +4 -0
  270. package/dist/runner/runner.js +64 -0
  271. package/dist/runner/session.d.ts +9 -0
  272. package/dist/runner/session.js +87 -0
  273. package/dist/{browser.js → runtime/browser.js} +4 -2
  274. package/dist/{env-file.js → runtime/env-file.js} +7 -12
  275. package/dist/{extensions.d.ts → runtime/extensions.d.ts} +2 -5
  276. package/dist/{extensions.js → runtime/extensions.js} +3 -1
  277. package/dist/runtime/full-launch.d.ts +1 -0
  278. package/dist/runtime/full-launch.js +34 -0
  279. package/dist/runtime/global-flag.d.ts +5 -0
  280. package/dist/runtime/global-flag.js +18 -0
  281. package/dist/{playwright-config.d.ts → runtime/playwright-config.d.ts} +1 -1
  282. package/dist/{playwright.config.js → runtime/playwright.config.js} +3 -2
  283. package/dist/runtime/run-log.d.ts +2 -0
  284. package/dist/runtime/run-log.js +17 -0
  285. package/dist/{video-dir.js → runtime/video-dir.js} +3 -2
  286. package/dist/{config.d.ts → runtime/waygraph-config.d.ts} +8 -9
  287. package/dist/{config.js → runtime/waygraph-config.js} +21 -51
  288. package/dist/{webserver.js → runtime/webserver.js} +5 -30
  289. package/examples/routed-demo/config/waygraph.config.ts +20 -0
  290. package/examples/routed-demo/package.json +1 -4
  291. package/examples/routed-demo/scripts/fixture-server.mjs +1 -1
  292. package/examples/routed-demo/src/flows/routed-demo-map.flow.ts +2 -4
  293. package/examples/routed-demo/src/flows/routed-demo.flow.ts +2 -3
  294. package/examples/routed-demo/src/map/(app_base)/dashboard/_methods/click-widget.block.ts +5 -4
  295. package/examples/routed-demo/src/map/(app_base)/dashboard/_nav.block.ts +3 -3
  296. package/examples/routed-demo/src/map/(app_base)/dashboard/_page.block.ts +3 -3
  297. package/examples/routed-demo/src/map/(external)/docs/_nav.block.ts +3 -3
  298. package/examples/routed-demo/src/map/(external)/docs/_page.block.ts +3 -3
  299. package/examples/routed-demo/src/states/routed-demo.states.ts +5 -3
  300. package/examples/routed-demo/tests/routed-demo.spec.ts +4 -4
  301. package/examples/routed-demo/tsconfig.json +1 -1
  302. package/examples/saucedemo/README.md +11 -12
  303. package/examples/saucedemo/config/waygraph.config.ts +17 -0
  304. package/examples/saucedemo/docs/CONVENTION.md +5 -7
  305. package/examples/saucedemo/docs/HELPERS.md +12 -12
  306. package/examples/saucedemo/package-lock.json +10 -3
  307. package/examples/saucedemo/package.json +12 -29
  308. package/examples/saucedemo/src/blocks/SITE-MAP.md +0 -1
  309. package/examples/saucedemo/src/blocks/saucedemo-web/NAV.md +1 -5
  310. package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -52
  311. package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
  312. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
  313. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
  314. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
  315. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
  316. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +21 -27
  317. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -9
  318. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
  319. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +10 -76
  320. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
  321. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
  322. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
  323. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
  324. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
  325. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
  326. package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -29
  327. package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -48
  328. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +13 -77
  329. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
  330. package/examples/saucedemo/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
  331. package/examples/saucedemo/src/flows/api-demo.flow.ts +26 -18
  332. package/examples/saucedemo/src/flows/cart-bulk.flow.ts +19 -14
  333. package/examples/saucedemo/src/flows/cart-continue.flow.ts +10 -8
  334. package/examples/saucedemo/src/flows/cart-mem.flow.ts +7 -7
  335. package/examples/saucedemo/src/flows/catalog-logout.flow.ts +13 -8
  336. package/examples/saucedemo/src/flows/checkout-then-browse-again.flow.ts +26 -48
  337. package/examples/saucedemo/src/flows/checkout.flow.ts +70 -86
  338. package/examples/saucedemo/src/flows/device-showcase.flow.ts +24 -25
  339. package/examples/saucedemo/src/flows/login.flow.ts +11 -18
  340. package/examples/saucedemo/src/flows/mem-stub-demo.flow.ts +9 -20
  341. package/examples/saucedemo/src/flows/shop.flow.ts +15 -20
  342. package/examples/saucedemo/src/flows/smoke.flow.ts +12 -27
  343. package/examples/saucedemo/src/flows/stub-on-error.flow.ts +24 -43
  344. package/examples/saucedemo/src/flows/viewer-blocked.flow.ts +26 -34
  345. package/examples/saucedemo/src/states/checkout.mem-stubs.ts +11 -0
  346. package/examples/saucedemo/src/states/checkout.states.ts +21 -11
  347. package/examples/saucedemo/src/stubs/device-showcase.ts +191 -0
  348. package/examples/saucedemo/src/stubs/login.ts +37 -0
  349. package/examples/saucedemo/tests/auto-graph.spec.ts +4 -12
  350. package/examples/saucedemo/tests/chain-flow-episodes.spec.ts +7 -9
  351. package/examples/saucedemo/tests/submit-login-branch.spec.ts +18 -5
  352. package/package.json +12 -7
  353. package/templates/agents/waygraph-planner.agent.md +2 -2
  354. package/templates/quickstart/README.md +4 -7
  355. package/templates/quickstart/config/waygraph.config.ts +17 -0
  356. package/templates/quickstart/docs/CONVENTION.md +5 -6
  357. package/templates/quickstart/docs/HELPERS.md +11 -9
  358. package/templates/quickstart/package.json +14 -17
  359. package/templates/quickstart/src/blocks/SITE-MAP.md +13 -3
  360. package/templates/quickstart/src/blocks/saucedemo-web/NAV.md +1 -5
  361. package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -52
  362. package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
  363. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
  364. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
  365. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
  366. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
  367. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +21 -27
  368. package/templates/quickstart/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -9
  369. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
  370. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +10 -76
  371. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
  372. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
  373. package/templates/quickstart/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
  374. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
  375. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
  376. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
  377. package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -29
  378. package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -48
  379. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +13 -77
  380. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
  381. package/templates/quickstart/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
  382. package/templates/quickstart/src/flows/api-demo.flow.ts +45 -0
  383. package/templates/quickstart/src/flows/cart-bulk.flow.ts +19 -14
  384. package/templates/quickstart/src/flows/cart-continue.flow.ts +10 -8
  385. package/templates/quickstart/src/flows/cart-mem.flow.ts +7 -7
  386. package/templates/quickstart/src/flows/catalog-logout.flow.ts +13 -8
  387. package/templates/quickstart/src/flows/checkout-then-browse-again.flow.ts +26 -48
  388. package/templates/quickstart/src/flows/checkout.flow.ts +70 -63
  389. package/templates/quickstart/src/flows/device-showcase.flow.ts +24 -25
  390. package/templates/quickstart/src/flows/login.flow.ts +11 -18
  391. package/templates/quickstart/src/flows/mem-stub-demo.flow.ts +12 -0
  392. package/templates/quickstart/src/flows/shop.flow.ts +15 -20
  393. package/templates/quickstart/src/flows/smoke.flow.ts +12 -27
  394. package/templates/quickstart/src/flows/stub-on-error.flow.ts +31 -0
  395. package/templates/quickstart/src/flows/viewer-blocked.flow.ts +26 -34
  396. package/templates/quickstart/src/states/checkout.mem-stubs.ts +11 -0
  397. package/templates/quickstart/src/states/checkout.states.ts +21 -11
  398. package/templates/quickstart/src/stubs/device-showcase.ts +191 -0
  399. package/templates/quickstart/src/stubs/login.ts +37 -0
  400. package/templates/quickstart/tests/chain-flow.spec.ts +7 -10
  401. package/templates/scaffold/README.md +2 -1
  402. package/templates/scaffold/STRUCTURE.md +5 -4
  403. package/templates/scaffold/config/waygraph.config.ts +1 -0
  404. package/templates/scaffold/gitignore +1 -0
  405. package/templates/scaffold/src/flows/README.md +2 -2
  406. package/templates/scaffold/src/map/(app_base)/docs/_nav.block.ts +3 -3
  407. package/templates/scaffold/src/map/(app_base)/docs/_page.block.ts +3 -3
  408. package/templates/scaffold/src/map/(app_base)/home/_methods/add-item.effect.block.ts +4 -4
  409. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-hello.method.block.ts +3 -3
  410. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-item-added.method.block.ts +3 -3
  411. package/templates/scaffold/src/map/(app_base)/home/_methods/clear-cart.method.block.ts +5 -4
  412. package/templates/scaffold/src/map/(app_base)/home/_methods/remove-item.effect.block.ts +4 -4
  413. package/templates/scaffold/src/map/(app_base)/home/_nav.block.ts +3 -3
  414. package/templates/scaffold/src/map/(app_base)/home/_page.block.ts +3 -3
  415. package/templates/scaffold/src/map/(app_base)/home/nav-verification-link.block.ts +4 -4
  416. package/templates/scaffold/src/map/(external)/hoppscotch/_keys.ts +21 -0
  417. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-body.method.block.ts +4 -4
  418. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-header.method.block.ts +4 -4
  419. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-status.method.block.ts +4 -4
  420. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/pick-extension-interceptor.method.block.ts +5 -4
  421. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-body.method.block.ts +6 -5
  422. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-headers.method.block.ts +6 -5
  423. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/send-request.method.block.ts +5 -4
  424. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-bearer-token.method.block.ts +6 -5
  425. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-headers.method.block.ts +6 -5
  426. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-json-body.method.block.ts +6 -5
  427. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-method.method.block.ts +6 -5
  428. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-query-params.method.block.ts +6 -5
  429. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-url.method.block.ts +6 -5
  430. package/templates/scaffold/src/map/(external)/hoppscotch/_nav.block.ts +3 -3
  431. package/templates/scaffold/src/map/(external)/hoppscotch/_page.block.ts +3 -3
  432. package/templates/scaffold/src/map/(external)/hoppscotch/_states.ts +6 -0
  433. package/templates/scaffold/src/map/(external)/hoppscotch/settings/_nav.block.ts +3 -3
  434. package/templates/scaffold/src/map/(external)/mailpit/_keys.ts +13 -0
  435. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-content.method.block.ts +4 -4
  436. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-received.method.block.ts +4 -4
  437. package/templates/scaffold/src/map/(external)/mailpit/_methods/extract-email-link.method.block.ts +6 -5
  438. package/templates/scaffold/src/map/(external)/mailpit/_methods/open-message.method.block.ts +6 -5
  439. package/templates/scaffold/src/map/(external)/mailpit/_nav.block.ts +3 -3
  440. package/templates/scaffold/src/map/(external)/mailpit/_page.block.ts +3 -3
  441. package/templates/scaffold/src/map/(external)/mailpit/_states.ts +9 -0
  442. package/templates/scaffold/src/map/README.md +7 -0
  443. package/templates/scaffold/src/states/README.md +4 -1
  444. package/templates/scaffold/src/states/demo.mem-keys.ts +1 -29
  445. package/templates/scaffold/src/states/demo.states.ts +14 -20
  446. package/templates/scaffold/tests/hoppscotch.spec.ts +1 -11
  447. package/templates/scaffold/tests/mail-verify.spec.ts +2 -2
  448. package/templates/skills/waygraph-blind-pilot.skill.md +2 -6
  449. package/templates/skills/waygraph-convention.skill.md +23 -14
  450. package/templates/skills/waygraph-pilot.skill.md +7 -4
  451. package/dist/auto-session/verbose-log.js +0 -16
  452. package/dist/auto-session.d.ts +0 -2
  453. package/dist/auto-session.js +0 -3
  454. package/dist/cli/discover.d.ts +0 -40
  455. package/dist/cli/discover.js +0 -148
  456. package/dist/commands/agent-dive.js +0 -52
  457. package/dist/commands/check.js +0 -192
  458. package/dist/commands/map.js +0 -29
  459. package/dist/commands/run.js +0 -104
  460. package/dist/commands/traverse.js +0 -177
  461. package/dist/core/block.d.ts +0 -109
  462. package/dist/core/blocks/effect.js +0 -23
  463. package/dist/core/config.js +0 -17
  464. package/dist/core/engine.d.ts +0 -198
  465. package/dist/core/flow.d.ts +0 -293
  466. package/dist/core/flow.js +0 -432
  467. package/dist/core.d.ts +0 -14
  468. package/dist/core.js +0 -15
  469. package/dist/highlights/merge.d.ts +0 -8
  470. package/dist/highlights/merge.js +0 -173
  471. package/dist/highlights/stub-ctx.d.ts +0 -10
  472. package/dist/highlights/stub-ctx.js +0 -331
  473. package/dist/highlights/types.d.ts +0 -607
  474. package/dist/highlights.d.ts +0 -9
  475. package/dist/highlights.js +0 -10
  476. package/dist/pilot-overlay.d.ts +0 -5
  477. package/dist/pilot-overlay.js +0 -6
  478. package/dist/runner/banner-log.js +0 -63
  479. package/dist/runner/chain-run.js +0 -102
  480. package/dist/runner/cursor.js +0 -140
  481. package/dist/runner/demo-log.js +0 -316
  482. package/dist/runner/device-stage.d.ts +0 -9
  483. package/dist/runner/device-stage.js +0 -420
  484. package/dist/runner/discovery.js +0 -105
  485. package/dist/runner/index.js +0 -2
  486. package/dist/runner/inpage/banner.d.ts +0 -21
  487. package/dist/runner/inpage/banner.js +0 -156
  488. package/dist/runner/inpage/caption.d.ts +0 -3
  489. package/dist/runner/inpage/caption.js +0 -23
  490. package/dist/runner/inpage/core.d.ts +0 -4
  491. package/dist/runner/inpage/core.js +0 -316
  492. package/dist/runner/inpage/device.d.ts +0 -3
  493. package/dist/runner/inpage/device.js +0 -211
  494. package/dist/runner/inpage/network.d.ts +0 -15
  495. package/dist/runner/inpage/network.js +0 -217
  496. package/dist/runner/inpage/panel-chrome.js +0 -192
  497. package/dist/runner/inpage/stamp.js +0 -46
  498. package/dist/runner/inpage/swipe-zoom.js +0 -220
  499. package/dist/runner/inpage/todos.js +0 -337
  500. package/dist/runner/interaction-patch.js +0 -384
  501. package/dist/runner/main.js +0 -469
  502. package/dist/runner/network-capture.d.ts +0 -9
  503. package/dist/runner/network-capture.js +0 -126
  504. package/dist/runner/overlay-css.d.ts +0 -3
  505. package/dist/runner/overlay-css.js +0 -377
  506. package/dist/runner/overlay-install.js +0 -90
  507. package/dist/runner/overlay-stage.js +0 -110
  508. package/dist/runner/rings.js +0 -514
  509. package/dist/runner/seed-mem.js +0 -110
  510. package/dist/runner/slides.js +0 -278
  511. package/dist/runner/step-mode.js +0 -703
  512. package/dist/runner/step-panels.js +0 -729
  513. package/dist/runner/teardown.js +0 -202
  514. package/dist/runner/todo-dock.js +0 -142
  515. package/dist/session/step-overlay.d.ts +0 -37
  516. package/dist/session/step-overlay.js +0 -244
  517. package/examples/routed-demo/playwright.config.ts +0 -21
  518. package/examples/saucedemo/playwright.config.ts +0 -19
  519. package/examples/saucedemo/scripts/drive-auto-cli.mjs +0 -93
  520. package/examples/saucedemo/scripts/prove-add-to-cart-menu.mjs +0 -126
  521. package/examples/saucedemo/scripts/prove-auto-graph.mjs +0 -92
  522. package/examples/saucedemo/scripts/prove-wrong-login-runtime.mjs +0 -63
  523. package/examples/saucedemo/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
  524. package/templates/quickstart/playwright.config.ts +0 -14
  525. package/templates/quickstart/scripts/drive-auto-cli.mjs +0 -93
  526. package/templates/quickstart/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
  527. /package/dist/{commands → cli/commands}/agent-dive-scaffold.d.ts +0 -0
  528. /package/dist/{commands → cli/commands}/agent-dive.d.ts +0 -0
  529. /package/dist/{commands → cli/commands}/extensions.d.ts +0 -0
  530. /package/dist/{commands → cli/commands}/init.d.ts +0 -0
  531. /package/dist/{commands → cli/commands}/list.d.ts +0 -0
  532. /package/dist/{commands → cli/commands}/map.d.ts +0 -0
  533. /package/dist/{commands → cli/commands}/session.d.ts +0 -0
  534. /package/dist/{commands → cli/commands}/test.d.ts +0 -0
  535. /package/dist/{commands → cli/commands}/traverse.d.ts +0 -0
  536. /package/dist/{commands → cli/commands}/try.d.ts +0 -0
  537. /package/dist/{commands → cli/commands}/upgrade.d.ts +0 -0
  538. /package/dist/{highlights → demo/narration}/shorthand.js +0 -0
  539. /package/dist/{pilot-overlay/action-ring.d.ts → demo/overlay/pilot/actions.d.ts} +0 -0
  540. /package/dist/{ui → demo/overlay/ui}/components/ring.d.ts +0 -0
  541. /package/dist/{ui → demo/overlay/ui}/stylesheet.d.ts +0 -0
  542. /package/dist/{ui → demo/overlay/ui}/stylesheet.js +0 -0
  543. /package/dist/{ui → demo/overlay/ui}/tokens.d.ts +0 -0
  544. /package/dist/{ui → demo/overlay/ui}/tokens.js +0 -0
  545. /package/dist/{highlights → demo}/types.js +0 -0
  546. /package/dist/{auto-session → demo}/verbose-log.d.ts +0 -0
  547. /package/dist/{selector.d.ts → engine/trait/selector.d.ts} +0 -0
  548. /package/dist/{selector.js → engine/trait/selector.js} +0 -0
  549. /package/dist/{trait.js → engine/trait/trait.js} +0 -0
  550. /package/dist/{session/block-inject.d.ts → manifest/roots.d.ts} +0 -0
  551. /package/dist/{browser.d.ts → runtime/browser.d.ts} +0 -0
  552. /package/dist/{env-file.d.ts → runtime/env-file.d.ts} +0 -0
  553. /package/dist/{playwright-config.js → runtime/playwright-config.js} +0 -0
  554. /package/dist/{playwright.config.d.ts → runtime/playwright.config.d.ts} +0 -0
  555. /package/dist/{video-dir.d.ts → runtime/video-dir.d.ts} +0 -0
  556. /package/dist/{webserver.d.ts → runtime/webserver.d.ts} +0 -0
@@ -1,703 +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 { instrumentInteractionHighlighting } from "./interaction-patch.js";
4
- import { applyHighlightStyleDefaults, normalizeDemoPace, demoPaceGateMs, demoPaceIsBlitz, demoPaceIsFast, demoPaceIsSlow, formatHighlightCaption, hasAuthoredStubAfter, resolveSlides, resolveStepDemoPace, resolveTodoDockUi, runStubPhase } from "../highlights.js";
5
- import { markStepRunning, resetPageState, teardownOverlay } from "./teardown.js";
6
- import { demoLog, logStubPhaseFixtures, logTodoDockFull, paceSpeakFields, summarizeDevice } from "./demo-log.js";
7
- import { extractVerifyHighlights, presentFailPanel, renderAfterStep, renderBeforeStep } from "./step-panels.js";
8
- import { probeTodoDocksOnPage } from "./todo-dock.js";
9
- import { logBannerDom, probeBanner } from "./banner-log.js";
10
- import { createOverlayStage } from "./overlay-stage.js";
11
- import { join } from "node:path";
12
- import { presentSlides } from "./slides.js";
13
-
14
- export async function runStepMode(engine, start, end, context, page, mem, resolved, slowMo, title, fastBlockNames, clearSession, baseURL) {
15
- // A shared, mutable pacing knob the interaction patches read live (per
16
- // call, not once at setup) - flipped per-block below so one block (e.g.
17
- // WAYGRAPH_FAST_BLOCKS=login or an FFCompose unit) can run through with
18
- // none of the overlay's own added dwell while the rest of the chain keeps
19
- // the full theatrical pace.
20
- // --fast / WAYGRAPH_DEMO_FAST: shorter auto-next / Next gates ONLY -
21
- // keeps smooth cursor travel (not akin to waygraph run).
22
- // FFCompose + WAYGRAPH_FAST_BLOCKS: skipTheater (blitz overlay delays).
23
- // When the flow has any opaque FF unit and WAYGRAPH_SLOWMO is unset,
24
- // launch slowMo is 0 so Playwright itself does not re-tax every click
25
- // inside the FF (that was the "30s login / cursor gone but still slow" bug).
26
- const demoFast = process.env.WAYGRAPH_DEMO_FAST === "1";
27
- const stepperMode = process.env.WAYGRAPH_STEPPER === "full" ? "full" : "carousel";
28
- const pacing = { gatesFast: demoFast, gatesSlow: false, skipTheater: false, demoPace: "normal" };
29
- // A title set by a stub (`ctx.title`) names the flow from that step on, until another stub sets a new one.
30
- let stickyTitle;
31
- const stubBeforeRef = { current: [] };
32
- /** Live todo dock for Method fill/click advance (same carry as stage.state.lastTodoDock). */
33
- const todoDockRef = { current: undefined };
34
- /** Live device fixture for touch theater (same carry as stage.state.lastDevice). */
35
- const deviceRef = { current: undefined };
36
- instrumentInteractionHighlighting(page, mem, slowMo, pacing, stubBeforeRef, todoDockRef, deviceRef);
37
- // Force the panel checkbox from this process's flags/env at run start.
38
- // installOverlay only seeds localStorage when the key is null (so mid-run
39
- // checkbox clicks survive navigations). Without this, a prior --autoplay
40
- // session sticks forever and agents cannot flip back with --no-autoplay.
41
- // Must run on the *demo origin* (after goto), not about:blank - localStorage
42
- // is origin-scoped.
43
- const syncAutoplayFromEnv = async () => {
44
- if (process.env.WAYGRAPH_AUTOPLAY === undefined) return;
45
- const on = process.env.WAYGRAPH_AUTOPLAY === "1";
46
- await page
47
- .evaluate((want) => {
48
- try {
49
- localStorage.setItem("wg-autoplay", want ? "1" : "0");
50
- } catch {
51
- /* private mode / blocked storage */
52
- }
53
- }, on)
54
- .catch(() => {});
55
- };
56
- await syncAutoplayFromEnv();
57
- // Some real Blocks (e.g. zsign-all's login.block.ts) call
58
- // page.setViewportSize({ width: 1280, height: 720 }) inside their own
59
- // act() - a hardcoded override for THEIR OWN testing consistency, with no
60
- // idea an interactive human session is watching. Restoring the size
61
- // AFTER each step (the first attempt at this) was still just repairing
62
- // damage after the fact, on a delay, per-step - not the real fix. The
63
- // real fix is to stop the override from ever landing at all: no-op
64
- // setViewportSize entirely for the duration of step mode. Blocks that
65
- // call it don't need it to actually do anything here - their own
66
- // selectors/layouts still work fine at whatever size the real window
67
- // already is. Authored ctx.device() still uses __wgRealSetViewportSize.
68
- page.__wgRealSetViewportSize = page.setViewportSize.bind(page);
69
- page.setViewportSize = async () => {};
70
- let resolveNext = null;
71
- // Render-to-gate race: a slide/step panel's Next button is wired to
72
- // window.__wgNext BEFORE gate() calls waitForNext() (there is at least
73
- // one more await - the autoplay-sync evaluate - in between on the
74
- // presentSlides path). A click landing in that small window used to be
75
- // dropped silently (resolveNext was still null) - the panel then looked
76
- // "stuck" forever since gate() started listening AFTER the click already
77
- // fired and no second click ever came. Queue it instead: the very next
78
- // waitForNext() call picks up a pending click immediately.
79
- let pendingNext = null;
80
- await page.exposeFunction("__wgNext", (edits) => {
81
- if (resolveNext) {
82
- const r = resolveNext;
83
- resolveNext = null;
84
- r(edits);
85
- } else {
86
- pendingNext = edits;
87
- }
88
- });
89
- const waitForNext = () =>
90
- new Promise((res) => {
91
- if (pendingNext !== null) {
92
- const edits = pendingNext;
93
- pendingNext = null;
94
- res(edits);
95
- return;
96
- }
97
- resolveNext = res;
98
- });
99
- // WAYGRAPH_AUTOPLAY=1 only sets the STARTING checkbox state now - the
100
- // panel's own "Auto-advance" checkbox can flip it live, mid-run, and a
101
- // manual click always wins over an in-flight autoplay wait regardless of
102
- // which way the checkbox is set. That's the hybrid Dan asked for: some
103
- // steps auto-advance, some get a manual click, toggled as the demo goes,
104
- // not fixed for the whole run from a single env var.
105
- const autoplayMs = process.env.WAYGRAPH_AUTOPLAY_MS
106
- ? Number(process.env.WAYGRAPH_AUTOPLAY_MS)
107
- : demoFast
108
- ? 450
109
- : 1800;
110
- const currentAutoplay = () =>
111
- page
112
- .evaluate(() => {
113
- try {
114
- return localStorage.getItem("wg-autoplay") === "1";
115
- } catch {
116
- return false;
117
- }
118
- })
119
- .catch(() => false);
120
- const gate = async () => {
121
- const next = waitForNext();
122
- // WAYGRAPH_FAST_BLOCKS names a block that should blow past its own
123
- // gates too, not just skip its interaction dwell - otherwise autoplay
124
- // still stalls the full autoplayMs admiring a step that intentionally
125
- // ran too fast to watch.
126
- const ms = demoPaceGateMs(
127
- pacing.skipTheater ? "blitz" : pacing.demoPace,
128
- autoplayMs,
129
- );
130
- let elapsed = 0;
131
- for (;;) {
132
- // Re-read the checkbox EVERY loop tick, not once up front - a human
133
- // starting a step in manual mode and then checking "Auto-advance"
134
- // mid-wait must actually start counting down from that moment, not
135
- // get stuck on whatever mode was live when gate() was first called.
136
- const auto = await currentAutoplay();
137
- const slice = auto
138
- ? Math.min(250, Math.max(50, ms - elapsed))
139
- : 250; // manual: just a cheap poll tick, waiting on either a click or the box getting checked
140
- const winner = await Promise.race([
141
- next.then((edits) => ({ clicked: true, edits })),
142
- new Promise((res) => setTimeout(() => res({ clicked: false }), slice)),
143
- ]);
144
- if (winner.clicked) return winner.edits;
145
- if (!auto) continue;
146
- elapsed += slice;
147
- if (elapsed >= ms) return {};
148
- }
149
- };
150
- const allNames = resolved.map((r) => r.block.name);
151
- const allDescriptions = resolved.map((r) => r.block.description || "");
152
- // Deduped, in-order list of every real episode this chain touches - for
153
- // the episode tab bar. Ad hoc block segments (no named Flow) carry no
154
- // episodeNumber and never appear here, same gate the "Episode N:"
155
- // heading already used.
156
- const allEpisodes = [];
157
- for (const r of resolved) {
158
- if (r.episodeNumber && !allEpisodes.some((e) => e.episodeNumber === r.episodeNumber)) {
159
- allEpisodes.push({ episodeNumber: r.episodeNumber, episodeTitle: r.episodeTitle });
160
- }
161
- }
162
-
163
- let result;
164
- const stage = createOverlayStage(page, { todoDockRef, deviceRef });
165
- const { pushTodoDockUi, rememberTodoDock, syncAllTodoDocks } = stage;
166
- for (let i = 0; i < resolved.length; i++) {
167
- const r = resolved[i];
168
- // The block breadcrumb is scoped to THIS step's own episode, not the
169
- // whole chain - within episode 2, step 1 should read as "1st of 2,"
170
- // not "6th of 7." Falls back to the whole chain when this block has no
171
- // episode (an ad hoc chain with no named Flows), unchanged from before.
172
- const episodeBlockIndices = r.episodeNumber
173
- ? resolved.reduce((acc, x, idx) => {
174
- if (x.episodeNumber === r.episodeNumber) acc.push(idx);
175
- return acc;
176
- }, [])
177
- : resolved.map((_x, idx) => idx);
178
- const moduleNames = episodeBlockIndices.map((idx) => allNames[idx]);
179
- const moduleDescriptions = episodeBlockIndices.map((idx) => allDescriptions[idx]);
180
- const moduleIndex = episodeBlockIndices.indexOf(i);
181
- // Where a "Retry Episode" click (see the catch block below) rewinds to -
182
- // the current episode's own first block, or the whole chain's first
183
- // block when there's no real episode (episodeBlockIndices degrades to
184
- // the full resolved array in that case, so this is just 0).
185
- const episodeStartIndex = episodeBlockIndices[0];
186
- // True only on an episode's own first block - the one moment worth a
187
- // gentle "you're here now" signal, not every step inside it.
188
- const justEnteredEpisode = moduleIndex === 0 && r.episodeNumber !== undefined;
189
- // Seed THIS segment's own json payload now, not earlier - see the long
190
- // comment where seedMem closures are built, in main()'s resolution
191
- // loop. Must run before "keys" below reads mem.get() for the panel
192
- // display, and before this segment's own first block executes.
193
- if (r.seedMem) r.seedMem();
194
- // Reset session state before this block if EITHER: the blanket
195
- // WAYGRAPH_CLEAR_SESSION=1 override is set (a manual, always-on-after-
196
- // the-first-block stopgap for ad hoc block chains with no real Flow
197
- // object), OR this specific block is a Flow's own declared entry point
198
- // (defineFlow(...) wrapped in withSessionReset) reached via a
199
- // multi-flow chain spec - the proper, opt-in-per-Flow mechanism. Never
200
- // resets before the very first block - there's no prior state yet.
201
- //
202
- // Done HERE, before this step's own "before" panel is even shown - not
203
- // after the human clicks "Run this step" - so the panel for the new
204
- // episode appears over an already-fresh page, not the PREVIOUS
205
- // episode's stale final page (e.g. still showing /dashboard) with the
206
- // new episode's panel merely floating on top of it ("overlapping",
207
- // Dan's own word for this). The explicit re-navigate (not just
208
- // clearing cookies/storage) is what actually makes the page itself
209
- // look fresh again - clearing storage alone doesn't change what's
210
- // still rendered on screen.
211
- if ((clearSession || r.resetSession) && i > 0) {
212
- await resetPageState(context, page, baseURL);
213
- // clear() wiped origin storage - re-apply CLI autoplay default.
214
- await syncAutoplayFromEnv();
215
- }
216
- // Episode pace: block > flow > CLI --fast (only when no authored pace).
217
- // Authoring wins: withDemoPace("slow"|2|4500) keeps slow dwell even under --fast.
218
- // `demo.pace` in the config (WAYGRAPH_DEMO_PACE) is the default for flows and steps that set none.
219
- const defaultPace = process.env.WAYGRAPH_DEMO_PACE ? normalizeDemoPace(process.env.WAYGRAPH_DEMO_PACE) : undefined;
220
- const stepPace = resolveStepDemoPace({
221
- blockPace: r.block.demoPace,
222
- flowPace: r.demoPace ?? defaultPace,
223
- fastForward: !!r.block.fastForward,
224
- wasFastForward: !!r.wasFastForward,
225
- });
226
- const authoredPace =
227
- (r.block.demoPace != null && r.block.demoPace !== "") ||
228
- (r.demoPace != null && r.demoPace !== "") ||
229
- defaultPace != null;
230
- const cliFast = demoFast || fastBlockNames.has(r.block.name);
231
- pacing.demoPace =
232
- stepPace === "normal" && cliFast && !authoredPace
233
- ? fastBlockNames.has(r.block.name)
234
- ? "blitz"
235
- : "fast"
236
- : stepPace;
237
- pacing.gatesFast =
238
- demoPaceIsFast(pacing.demoPace) ||
239
- !!r.block.fastForward ||
240
- !!r.wasFastForward ||
241
- (!authoredPace && demoFast);
242
- pacing.gatesSlow = demoPaceIsSlow(pacing.demoPace);
243
- pacing.skipTheater =
244
- demoPaceIsBlitz(pacing.demoPace) ||
245
- fastBlockNames.has(r.block.name) ||
246
- !!r.block.fastForward ||
247
- !!r.wasFastForward;
248
- const fixtures = r.highlightFixtures;
249
- const flowStyle = r.highlightStyle;
250
- const stubBeforePhase = await runStubPhase(r.block, "stubBefore", { fixtures, mem });
251
- if (stubBeforePhase.todoDockUi) {
252
- await pushTodoDockUi(stubBeforePhase.todoDockUi);
253
- } else {
254
- await pushTodoDockUi(undefined);
255
- }
256
- stubBeforeRef.current = stubBeforePhase.highlights.map((h) =>
257
- applyHighlightStyleDefaults(h, flowStyle),
258
- );
259
- logStubPhaseFixtures("before", {
260
- ...stubBeforePhase,
261
- highlights: stubBeforeRef.current.map((h) => ({
262
- ...h,
263
- label: formatHighlightCaption(h),
264
- })),
265
- });
266
- const { appliedTodo: appliedBefore, appliedDevice: appliedDeviceBefore } = await stage.applyPhase(
267
- stubBeforePhase,
268
- { reapplyDeviceOnKeep: true },
269
- );
270
- const stubBeforeTodos =
271
- (stage.state.lastTodoDock && stage.state.lastTodoDock.groups[0] && stage.state.lastTodoDock.groups[0].items) ||
272
- stubBeforePhase.todos ||
273
- [];
274
- if (stubBeforePhase.title && String(stubBeforePhase.title).trim()) stickyTitle = String(stubBeforePhase.title).trim();
275
- const overlayTitle =
276
- stickyTitle ||
277
- (r.episodeTitle && String(r.episodeTitle).trim()) ||
278
- title ||
279
- "waygraph demo";
280
- const overlayTodoPos =
281
- (stage.state.lastTodoDock && stage.state.lastTodoDock.pos) || stubBeforePhase.todoPos || undefined;
282
- const isNavBlock = r.block.__waygraphKind === "nav";
283
- const autoNow = await currentAutoplay();
284
- // Video / --mini: compact pill. Never pass false - Hide/localStorage wins.
285
- const forceCollapsed =
286
- !!process.env.WAYGRAPH_VIDEO ||
287
- process.env.WAYGRAPH_MINI === "1" ||
288
- process.env.WAYGRAPH_STEPPER_MINI === "1"
289
- ? true
290
- : undefined;
291
- const requires = r.block.requires ?? [];
292
- const keys = requires.map((k) => {
293
- let value = "<not yet set>";
294
- try {
295
- value = JSON.stringify(mem.get(k));
296
- } catch {
297
- // not written yet - shown as a placeholder, not a crash
298
- }
299
- return { name: k.name, value };
300
- });
301
- const paceSpeak = paceSpeakFields(pacing.demoPace, autoplayMs);
302
- if (process.env.WAYGRAPH_JSON !== "1") {
303
- demoLog(
304
- "step " +
305
- (i + 1) +
306
- "/" +
307
- resolved.length +
308
- " " +
309
- r.block.name +
310
- " · " +
311
- paceSpeak.paceLabel +
312
- (r.episodeNumber ? " · episode " + r.episodeNumber : ""),
313
- );
314
- demoLog(
315
- " gate~" +
316
- autoplayMs +
317
- "ms skipTheater=" +
318
- !!pacing.skipTheater +
319
- " gatesFast=" +
320
- !!pacing.gatesFast,
321
- );
322
- demoLog(" " + summarizeDevice(stage.state.lastDevice));
323
- const phaseZoom =
324
- stubBeforePhase.zoom != null && Number(stubBeforePhase.zoom) > 0
325
- ? Number(stubBeforePhase.zoom)
326
- : null;
327
- const phaseZoomOut =
328
- stubBeforePhase.zoomOut !== undefined ? !!stubBeforePhase.zoomOut : null;
329
- demoLog(
330
- " zoom=" +
331
- (phaseZoom != null ? phaseZoom + "x" : "default") +
332
- (phaseZoomOut != null ? " zoomOut=" + phaseZoomOut : "") +
333
- " (StubCtx / API; live chip top-left when ring zoom >1)",
334
- );
335
- logTodoDockFull(stage.state.lastTodoDock, " before");
336
- demoLog(" todoSync=" + appliedBefore.sync);
337
- }
338
- await renderBeforeStep(page, {
339
- index: i,
340
- total: resolved.length,
341
- blockName: r.block.name,
342
- description: r.block.description || "",
343
- keys,
344
- allNames: moduleNames,
345
- allDescriptions: moduleDescriptions,
346
- moduleIndex,
347
- allEpisodes,
348
- justEnteredEpisode,
349
- title: overlayTitle,
350
- bannerUi: stage.state.lastBannerUi,
351
- caption: stubBeforePhase.caption,
352
- networkTabVisible: stubBeforePhase.networkTabVisible,
353
- fastForward: !!r.block.fastForward,
354
- isApi: r.block.__waygraphKind === "api",
355
- todoPos: overlayTodoPos,
356
- episodeNumber: r.episodeNumber,
357
- episodeTitle: r.episodeTitle,
358
- stepperMode,
359
- forceCollapsed,
360
- todos: stubBeforeTodos,
361
- todoDock: stage.state.lastTodoDock,
362
- todoSync: appliedBefore.sync,
363
- todoId: stage.state.lastTodoDock && stage.state.lastTodoDock.id,
364
- ...paceSpeak,
365
- });
366
- // Re-paint dock(s) - renderBeforeStep syncs the active one; this enforces replace.
367
- await syncAllTodoDocks({ parallel: !!stubBeforePhase.todoParallel });
368
- if (process.env.WAYGRAPH_JSON !== "1") {
369
- const docks = await probeTodoDocksOnPage(page);
370
- if (!docks.length && stage.state.lastTodoDock) {
371
- demoLog(" WARN todos authored but dock-dom empty (not painted?)");
372
- } else if (docks.length) {
373
- demoLog(
374
- " dock-dom " +
375
- docks
376
- .map(
377
- (d) =>
378
- d.key +
379
- "@" +
380
- d.pos +
381
- " " +
382
- d.left +
383
- "," +
384
- d.top +
385
- " " +
386
- d.w +
387
- "x" +
388
- d.h +
389
- (d.onScreen ? "" : " OFFSCREEN") +
390
- " n=" +
391
- d.n +
392
- (d.current ? ' cur="' + d.current + '"' : ""),
393
- )
394
- .join(" | "),
395
- );
396
- }
397
- }
398
- if (process.env.WAYGRAPH_JSON !== "1") logBannerDom("before", await probeBanner(page));
399
- const edits = await gate();
400
- for (const k of requires) {
401
- if (edits[k.name] !== undefined) {
402
- try {
403
- mem.set(k, JSON.parse(edits[k.name]));
404
- } catch {
405
- // left as-authored if the human's edit isn't valid JSON
406
- }
407
- }
408
- }
409
- const recordingVideo = !!process.env.WAYGRAPH_VIDEO;
410
- await markStepRunning(page, {});
411
- // NavBlock click-nav: label the upcoming Locator.click demo cursor as
412
- // "nav: <block>" so pia/demo watchers see cursor+pulse on click nav
413
- // (not only on regular Block clicks).
414
- const navClick = r.block.__waygraphNavClick;
415
- if (r.block.__waygraphKind === "nav" && navClick !== undefined) {
416
- await page
417
- .evaluate((label) => {
418
- window.__wgPendingNavClickLabel = label;
419
- }, "nav: " + (r.block.name || "click"))
420
- .catch(() => {});
421
- } else {
422
- await page
423
- .evaluate(() => {
424
- delete window.__wgPendingNavClickLabel;
425
- })
426
- .catch(() => {});
427
- }
428
- const stepFlow = engine.defineFlow([start, r.block, end]);
429
- // { closeOnFinish: false } makes Flow.run return { result, page }, not
430
- // the plain checkpoint - destructure it, don't treat the wrapper as the
431
- // checkpoint itself (caught via the standalone verify script: this used
432
- // to serialize the whole { result, page } object into the panel/log).
433
- let stepOutcome;
434
- try {
435
- stepOutcome = await stepFlow.run(context, mem, { page, closeOnFinish: false });
436
- } catch (err) {
437
- await page
438
- .evaluate(() => {
439
- delete window.__wgPendingNavClickLabel;
440
- })
441
- .catch(() => {});
442
- // stubOnError + error/expected panel BEFORE acknowledging (PIA RFC).
443
- const errEdits = await presentFailPanel(page, {
444
- block: r.block,
445
- fixtures: r.highlightFixtures,
446
- highlightStyle: r.highlightStyle,
447
- error: err,
448
- index: i,
449
- total: resolved.length,
450
- blockName: r.block.name,
451
- message: err && err.message ? err.message : String(err),
452
- allNames: moduleNames,
453
- allDescriptions: moduleDescriptions,
454
- moduleIndex,
455
- allEpisodes,
456
- title,
457
- episodeNumber: r.episodeNumber,
458
- episodeTitle: r.episodeTitle,
459
- expectedFailureReason: r.expectedFailureReason,
460
- stepperMode,
461
- gatesFast: pacing.gatesFast,
462
- demoPace: pacing.demoPace,
463
- gate,
464
- mem,
465
- });
466
- if (errEdits && errEdits.__wgRetry) {
467
- await resetPageState(context, page, baseURL);
468
- await syncAutoplayFromEnv();
469
- i = episodeStartIndex - 1;
470
- continue;
471
- }
472
- // withExpectedFailure episode (e.g. locked_out_user) - throwing here is
473
- // the demo working, not a broken run.
474
- if (r.expectedFailureReason) {
475
- if (process.env.WAYGRAPH_JSON !== "1") {
476
- console.log(
477
- "waygraph: expected failure on " + r.block.name + " - " + r.expectedFailureReason,
478
- );
479
- }
480
- break;
481
- }
482
- throw err;
483
- }
484
- await page
485
- .evaluate(() => {
486
- delete window.__wgPendingNavClickLabel;
487
- })
488
- .catch(() => {});
489
- result = stepOutcome.result;
490
- // Mid-act Method fill/click advances live on todoDockRef - fold that
491
- // back into stage.state.lastTodoDock before stubAfter / next-block keep, or the
492
- // next step reverts to the pre-act (blank / index-0) checklist.
493
- if (todoDockRef.current) stage.state.lastTodoDock = todoDockRef.current;
494
- // withExpectedFailure last block that SUCCEEDS on the intentional fail
495
- // branch (e.g. submit-login -> LoginPage + error banner). Still show
496
- // stubOnError rings + amber "expected outcome" panel - branching no
497
- // longer throws, but the demo must not skip the educational overlay.
498
- if (r.expectedFailureReason) {
499
- const errEdits = await presentFailPanel(page, {
500
- block: r.block,
501
- fixtures: r.highlightFixtures,
502
- highlightStyle: r.highlightStyle,
503
- error: undefined,
504
- out: result,
505
- index: i,
506
- total: resolved.length,
507
- blockName: r.block.name,
508
- message:
509
- "Resolved " +
510
- (result && result.__state ? result.__state : JSON.stringify(result)) +
511
- " (expected failure path)",
512
- allNames: moduleNames,
513
- allDescriptions: moduleDescriptions,
514
- moduleIndex,
515
- allEpisodes,
516
- title,
517
- episodeNumber: r.episodeNumber,
518
- episodeTitle: r.episodeTitle,
519
- expectedFailureReason: r.expectedFailureReason,
520
- stepperMode,
521
- gatesFast: pacing.gatesFast,
522
- demoPace: pacing.demoPace,
523
- gate,
524
- mem,
525
- });
526
- if (errEdits && errEdits.__wgRetry) {
527
- await resetPageState(context, page, baseURL);
528
- await syncAutoplayFromEnv();
529
- i = episodeStartIndex - 1;
530
- continue;
531
- }
532
- if (process.env.WAYGRAPH_JSON !== "1") {
533
- console.log(
534
- "waygraph: expected failure on " + r.block.name + " - " + r.expectedFailureReason,
535
- );
536
- }
537
- break;
538
- }
539
- const fixturesAfter = r.highlightFixtures;
540
- const slides = resolveSlides(r.block, { out: result, fixtures: fixturesAfter }).map((s) =>
541
- applyHighlightStyleDefaults(s, r.highlightStyle),
542
- );
543
- if (slides.length > 0) {
544
- await presentSlides(page, slides, gate, {
545
- title,
546
- blockName: r.block.name,
547
- fast: pacing.gatesFast,
548
- pace: pacing.demoPace,
549
- episodeNumber: r.episodeNumber,
550
- episodeTitle: r.episodeTitle,
551
- autoplayMs,
552
- });
553
- }
554
- let highlights;
555
- let stubAfterTodos = [];
556
- let afterOverlayTitle = overlayTitle;
557
- let afterCaption; // undefined = leave whatever's currently shown alone (see installOverlay's own comment)
558
- let afterNetworkTabVisible; // undefined = leave the network tab's current shown/hidden state alone
559
- let afterTodoPos = overlayTodoPos;
560
- let appliedAfter = { dock: stage.state.lastTodoDock, sync: "keep" };
561
- let appliedDeviceAfter = { device: stage.state.lastDevice, sync: "keep" };
562
- let afterTodoParallel = false;
563
- if (hasAuthoredStubAfter(r.block, result, fixturesAfter)) {
564
- const afterPhase = await runStubPhase(r.block, "stubAfter", {
565
- out: result,
566
- fixtures: fixturesAfter,
567
- mem,
568
- });
569
- if (afterPhase.todoDockUi) {
570
- await pushTodoDockUi(afterPhase.todoDockUi);
571
- }
572
- logStubPhaseFixtures("after", {
573
- ...afterPhase,
574
- highlights: (afterPhase.highlights || []).map((h) => {
575
- const styled = applyHighlightStyleDefaults(h, r.highlightStyle);
576
- return { ...styled, label: formatHighlightCaption(styled) };
577
- }),
578
- });
579
- afterTodoParallel = !!afterPhase.todoParallel;
580
- ({ appliedTodo: appliedAfter, appliedDevice: appliedDeviceAfter } = await stage.applyPhase(afterPhase));
581
- stubAfterTodos =
582
- (stage.state.lastTodoDock && stage.state.lastTodoDock.groups[0] && stage.state.lastTodoDock.groups[0].items) ||
583
- afterPhase.todos ||
584
- [];
585
- if (afterPhase.title && String(afterPhase.title).trim()) {
586
- afterOverlayTitle = String(afterPhase.title).trim();
587
- }
588
- if (afterPhase.caption !== undefined) afterCaption = afterPhase.caption;
589
- if (afterPhase.networkTabVisible !== undefined) afterNetworkTabVisible = afterPhase.networkTabVisible;
590
- if (afterPhase.todoPos) afterTodoPos = afterPhase.todoPos;
591
- if (stage.state.lastTodoDock && stage.state.lastTodoDock.pos) afterTodoPos = stage.state.lastTodoDock.pos;
592
- highlights = afterPhase.highlights.map((h) => {
593
- const styled = applyHighlightStyleDefaults(h, r.highlightStyle);
594
- return {
595
- selector: styled.selector,
596
- label: formatHighlightCaption(styled),
597
- duration: styled.duration,
598
- fastMode: styled.fastMode,
599
- tone: styled.tone,
600
- size: styled.size,
601
- weight: styled.weight,
602
- zoom: styled.zoom,
603
- zoomOut: styled.zoomOut,
604
- focus: !!styled.focus,
605
- tone: styled.tone,
606
- color: styled.color,
607
- detail: styled.detail,
608
- };
609
- });
610
- } else {
611
- highlights = extractVerifyHighlights(r.block, result.__state).map((h) =>
612
- applyHighlightStyleDefaults(h, r.highlightStyle),
613
- );
614
- }
615
- await renderAfterStep(page, {
616
- index: i,
617
- total: resolved.length,
618
- blockName: r.block.name,
619
- result,
620
- resultTag: JSON.stringify(result),
621
- highlights,
622
- gatesFast: pacing.gatesFast,
623
- pace: pacing.demoPace,
624
- ...paceSpeakFields(pacing.demoPace, autoplayMs),
625
- isLast: i === resolved.length - 1,
626
- allNames: moduleNames,
627
- allDescriptions: moduleDescriptions,
628
- moduleIndex,
629
- allEpisodes,
630
- title: afterOverlayTitle,
631
- bannerUi: stage.state.lastBannerUi,
632
- caption: afterCaption,
633
- networkTabVisible: afterNetworkTabVisible,
634
- fastForward: !!r.block.fastForward,
635
- isApi: r.block.__waygraphKind === "api",
636
- todoPos: afterTodoPos,
637
- episodeNumber: r.episodeNumber,
638
- episodeTitle: r.episodeTitle,
639
- stepperMode,
640
- todos: stubAfterTodos,
641
- todoDock: stage.state.lastTodoDock,
642
- todoSync: appliedAfter.sync,
643
- todoId: stage.state.lastTodoDock && stage.state.lastTodoDock.id,
644
- todoDockRef,
645
- forceCollapsed:
646
- !!process.env.WAYGRAPH_VIDEO ||
647
- process.env.WAYGRAPH_MINI === "1" ||
648
- process.env.WAYGRAPH_STEPPER_MINI === "1"
649
- ? true
650
- : undefined,
651
- });
652
- await syncAllTodoDocks({ parallel: afterTodoParallel });
653
- // Ring cycle / stubAfter may have advanced the dock - persist for next block.
654
- if (todoDockRef.current) {
655
- stage.state.lastTodoDock = todoDockRef.current;
656
- rememberTodoDock(todoDockRef.current, "set", afterTodoParallel);
657
- }
658
- if (process.env.WAYGRAPH_JSON !== "1") {
659
- demoLog(
660
- " after " +
661
- summarizeDevice(stage.state.lastDevice) +
662
- " deviceSync=" +
663
- appliedDeviceAfter.sync,
664
- );
665
- logTodoDockFull(stage.state.lastTodoDock, " after");
666
- demoLog(" after todoSync=" + appliedAfter.sync);
667
- const docksAfter = await probeTodoDocksOnPage(page);
668
- if (!docksAfter.length && stage.state.lastTodoDock && appliedAfter.sync !== "clear") {
669
- demoLog(" WARN after: todos authored but dock-dom empty");
670
- } else if (docksAfter.length) {
671
- demoLog(
672
- " after dock-dom " +
673
- docksAfter
674
- .map(
675
- (d) =>
676
- d.key +
677
- "@" +
678
- d.pos +
679
- " " +
680
- d.left +
681
- "," +
682
- d.top +
683
- " " +
684
- d.w +
685
- "x" +
686
- d.h +
687
- (d.onScreen ? "" : " OFFSCREEN") +
688
- " n=" +
689
- d.n +
690
- (d.current ? ' cur="' + d.current + '"' : ""),
691
- )
692
- .join(" | "),
693
- );
694
- } else if (appliedAfter.sync === "clear") {
695
- demoLog(" after dock-dom cleared (expected)");
696
- }
697
- }
698
- if (process.env.WAYGRAPH_JSON !== "1") logBannerDom("after", await probeBanner(page));
699
- await gate();
700
- }
701
- await teardownOverlay(page);
702
- return result;
703
- }