waygraph 0.15.54 → 0.16.1

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 (552) hide show
  1. package/README.md +8 -3
  2. package/bin/waygraph +2 -2
  3. package/dist/analysis/check.d.ts +38 -0
  4. package/dist/analysis/check.js +87 -0
  5. package/dist/analysis/coverage-gap.d.ts +1 -1
  6. package/dist/analysis/coverage-gap.js +14 -37
  7. package/dist/analysis/flow-source.d.ts +9 -0
  8. package/dist/analysis/flow-source.js +25 -0
  9. package/dist/analysis/graph.d.ts +10 -14
  10. package/dist/analysis/graph.js +48 -371
  11. package/dist/analysis/map-check.js +4 -39
  12. package/dist/analysis/practices-check.d.ts +1 -1
  13. package/dist/analysis/practices-check.js +24 -45
  14. package/dist/cli/args.d.ts +23 -0
  15. package/dist/cli/args.js +20 -0
  16. package/dist/{cli.d.ts → cli/cli.d.ts} +0 -1
  17. package/dist/{cli.js → cli/cli.js} +10 -9
  18. package/dist/{commands → cli/commands}/agent-dive-scaffold.js +35 -64
  19. package/dist/cli/commands/agent-dive.js +42 -0
  20. package/dist/cli/commands/browser.d.ts +2 -0
  21. package/dist/cli/commands/browser.js +109 -0
  22. package/dist/{commands → cli/commands}/check.d.ts +0 -1
  23. package/dist/cli/commands/check.js +104 -0
  24. package/dist/cli/commands/codemod-checkpoints.d.ts +18 -0
  25. package/dist/cli/commands/codemod-checkpoints.js +186 -0
  26. package/dist/cli/commands/codemod-flows.d.ts +18 -0
  27. package/dist/cli/commands/codemod-flows.js +284 -0
  28. package/dist/cli/commands/codemod-stubs.d.ts +10 -0
  29. package/dist/cli/commands/codemod-stubs.js +187 -0
  30. package/dist/{commands → cli/commands}/extensions.js +5 -4
  31. package/dist/{commands → cli/commands}/init.js +1 -2
  32. package/dist/{commands → cli/commands}/list.js +9 -7
  33. package/dist/cli/commands/manifest.d.ts +2 -0
  34. package/dist/cli/commands/manifest.js +20 -0
  35. package/dist/cli/commands/map.js +57 -0
  36. package/dist/cli/commands/pilot.d.ts +2 -0
  37. package/dist/cli/commands/pilot.js +102 -0
  38. package/dist/{commands → cli/commands}/run.d.ts +0 -1
  39. package/dist/cli/commands/run.js +64 -0
  40. package/dist/cli/commands/session-ops.d.ts +3 -0
  41. package/dist/cli/commands/session-ops.js +257 -0
  42. package/dist/cli/commands/session.js +132 -0
  43. package/dist/{commands → cli/commands}/test.js +11 -14
  44. package/dist/cli/commands/traverse.js +105 -0
  45. package/dist/{commands → cli/commands}/try.js +29 -25
  46. package/dist/{commands → cli/commands}/upgrade.js +40 -4
  47. package/dist/cli/flags.d.ts +193 -16
  48. package/dist/cli/flags.js +179 -234
  49. package/dist/cli/run-chain.d.ts +1 -0
  50. package/dist/cli/run-chain.js +42 -7
  51. package/dist/cli/usage.d.ts +1 -1
  52. package/dist/cli/usage.js +21 -53
  53. package/dist/cli/util.d.ts +2 -2
  54. package/dist/cli/util.js +2 -3
  55. package/dist/{highlights → demo/narration}/css.d.ts +1 -1
  56. package/dist/{highlights → demo/narration}/css.js +2 -3
  57. package/dist/{highlights → demo/narration}/demo-pace.d.ts +4 -12
  58. package/dist/{highlights → demo/narration}/demo-pace.js +5 -11
  59. package/dist/{highlights → demo/narration}/device.d.ts +4 -4
  60. package/dist/{highlights → demo/narration}/device.js +1 -1
  61. package/dist/demo/narration/merge.d.ts +10 -0
  62. package/dist/demo/narration/merge.js +67 -0
  63. package/dist/demo/narration/narration.d.ts +39 -0
  64. package/dist/{highlights/run-phase.js → demo/narration/narration.js} +25 -94
  65. package/dist/{highlights → demo/narration}/shorthand.d.ts +1 -1
  66. package/dist/demo/narration/stub-ctx.d.ts +8 -0
  67. package/dist/demo/narration/stub-ctx.js +164 -0
  68. package/dist/{highlights → demo/narration}/style.d.ts +1 -7
  69. package/dist/{highlights → demo/narration}/style.js +1 -41
  70. package/dist/{highlights → demo/narration}/todo-dock.d.ts +8 -8
  71. package/dist/{highlights → demo/narration}/todo-dock.js +13 -30
  72. package/dist/demo/overlay/auto-chrome.d.ts +7 -0
  73. package/dist/demo/overlay/auto-chrome.js +97 -0
  74. package/dist/demo/overlay/cursor.d.ts +19 -0
  75. package/dist/demo/overlay/cursor.js +142 -0
  76. package/dist/demo/overlay/device-stage.d.ts +26 -0
  77. package/dist/demo/overlay/device-stage.js +396 -0
  78. package/dist/demo/overlay/inpage/banner.d.ts +2 -0
  79. package/dist/demo/overlay/inpage/banner.js +160 -0
  80. package/dist/demo/overlay/inpage/caption.d.ts +2 -0
  81. package/dist/demo/overlay/inpage/caption.js +24 -0
  82. package/dist/demo/overlay/inpage/core.d.ts +2 -0
  83. package/dist/demo/overlay/inpage/core.js +345 -0
  84. package/dist/demo/overlay/inpage/device-chip.d.ts +1 -0
  85. package/dist/demo/overlay/inpage/device-chip.js +191 -0
  86. package/dist/demo/overlay/inpage/network.d.ts +10 -0
  87. package/dist/demo/overlay/inpage/network.js +189 -0
  88. package/dist/demo/overlay/inpage/panel-chrome.d.ts +1 -0
  89. package/dist/demo/overlay/inpage/panel-chrome.js +203 -0
  90. package/dist/demo/overlay/inpage/stamp.d.ts +1 -0
  91. package/dist/demo/overlay/inpage/stamp.js +46 -0
  92. package/dist/demo/overlay/inpage/swipe-zoom.d.ts +1 -0
  93. package/dist/demo/overlay/inpage/swipe-zoom.js +220 -0
  94. package/dist/demo/overlay/inpage/todos.d.ts +2 -0
  95. package/dist/demo/overlay/inpage/todos.js +293 -0
  96. package/dist/demo/overlay/locator-theater.d.ts +25 -0
  97. package/dist/demo/overlay/locator-theater.js +76 -0
  98. package/dist/demo/overlay/network-capture.d.ts +22 -0
  99. package/dist/demo/overlay/network-capture.js +127 -0
  100. package/dist/demo/overlay/overlay-css.d.ts +3 -0
  101. package/dist/demo/overlay/overlay-css.js +369 -0
  102. package/dist/demo/overlay/overlay-stage.d.ts +31 -0
  103. package/dist/demo/overlay/overlay-stage.js +106 -0
  104. package/dist/demo/overlay/overlay.d.ts +10 -0
  105. package/dist/demo/overlay/overlay.js +89 -0
  106. package/dist/{pilot-overlay/overlay-fixtures.d.ts → demo/overlay/phase-fixtures.d.ts} +2 -2
  107. package/dist/{pilot-overlay/overlay-fixtures.js → demo/overlay/phase-fixtures.js} +2 -2
  108. package/dist/{pilot-overlay/action-ring.js → demo/overlay/pilot/actions.js} +2 -1
  109. package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.d.ts +6 -5
  110. package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.js +19 -18
  111. package/dist/{pilot-overlay → demo/overlay/pilot}/shell.d.ts +2 -2
  112. package/dist/{pilot-overlay → demo/overlay/pilot}/shell.js +13 -22
  113. package/dist/demo/overlay/reattach.d.ts +7 -0
  114. package/dist/demo/overlay/reattach.js +23 -0
  115. package/dist/demo/overlay/rings.d.ts +61 -0
  116. package/dist/demo/overlay/rings.js +422 -0
  117. package/dist/{ui → demo/overlay/ui}/components/ring.js +2 -2
  118. package/dist/{ui → demo/overlay/ui}/overlay.css +4 -4
  119. package/dist/{ui → demo/overlay/ui}/shadow.d.ts +1 -1
  120. package/dist/{ui → demo/overlay/ui}/shadow.js +39 -2
  121. package/dist/demo/stepper/after.d.ts +3 -0
  122. package/dist/demo/stepper/after.js +103 -0
  123. package/dist/demo/stepper/banner-log.d.ts +35 -0
  124. package/dist/demo/stepper/banner-log.js +65 -0
  125. package/dist/demo/stepper/before.d.ts +4 -0
  126. package/dist/demo/stepper/before.js +110 -0
  127. package/dist/demo/stepper/demo-log.d.ts +48 -0
  128. package/dist/demo/stepper/demo-log.js +292 -0
  129. package/dist/demo/stepper/gate.d.ts +11 -0
  130. package/dist/demo/stepper/gate.js +78 -0
  131. package/dist/demo/stepper/interaction-patch.d.ts +4 -0
  132. package/dist/demo/stepper/interaction-patch.js +323 -0
  133. package/dist/demo/stepper/pacing.d.ts +21 -0
  134. package/dist/demo/stepper/pacing.js +23 -0
  135. package/dist/demo/stepper/panel-after.d.ts +17 -0
  136. package/dist/demo/stepper/panel-after.js +166 -0
  137. package/dist/demo/stepper/panel-before.d.ts +12 -0
  138. package/dist/demo/stepper/panel-before.js +241 -0
  139. package/dist/demo/stepper/slides.d.ts +23 -0
  140. package/dist/demo/stepper/slides.js +233 -0
  141. package/dist/demo/stepper/step-panels.d.ts +69 -0
  142. package/dist/demo/stepper/step-panels.js +172 -0
  143. package/dist/demo/stepper/stepper.d.ts +24 -0
  144. package/dist/demo/stepper/stepper.js +122 -0
  145. package/dist/demo/stepper/teardown.d.ts +47 -0
  146. package/dist/demo/stepper/teardown.js +178 -0
  147. package/dist/demo/stepper/todo-advance.d.ts +15 -0
  148. package/dist/demo/stepper/todo-advance.js +110 -0
  149. package/dist/demo/stepper/view.d.ts +58 -0
  150. package/dist/demo/stepper/view.js +31 -0
  151. package/dist/demo/types.d.ts +85 -0
  152. package/dist/demo/verbose-log.js +15 -0
  153. package/dist/engine/block/action-page.d.ts +53 -0
  154. package/dist/engine/block/action-page.js +1 -0
  155. package/dist/{types.d.ts → engine/block/block.d.ts} +102 -142
  156. package/dist/{core → engine/block}/block.js +12 -130
  157. package/dist/engine/block/branch.d.ts +17 -0
  158. package/dist/engine/block/branch.js +40 -0
  159. package/dist/{core → engine/block}/compose.d.ts +9 -7
  160. package/dist/{core → engine/block}/compose.js +1 -1
  161. package/dist/engine/block/dialog.d.ts +13 -0
  162. package/dist/engine/block/dialog.js +37 -0
  163. package/dist/{core/blocks → engine/block/kinds}/api.d.ts +16 -12
  164. package/dist/{core/blocks → engine/block/kinds}/api.js +26 -18
  165. package/dist/{core/blocks → engine/block/kinds}/effect.d.ts +13 -18
  166. package/dist/engine/block/kinds/effect.js +17 -0
  167. package/dist/{core/blocks → engine/block/kinds}/method.d.ts +17 -29
  168. package/dist/{core/blocks → engine/block/kinds}/method.js +6 -21
  169. package/dist/{core/blocks → engine/block/kinds}/nav.d.ts +21 -31
  170. package/dist/{core/blocks → engine/block/kinds}/nav.js +6 -12
  171. package/dist/{core/blocks → engine/block/kinds}/page.d.ts +14 -20
  172. package/dist/{core/blocks → engine/block/kinds}/page.js +5 -7
  173. package/dist/engine/checkpoint/checkpoint.d.ts +22 -0
  174. package/dist/engine/checkpoint/checkpoint.js +8 -0
  175. package/dist/engine/checkpoint/route.d.ts +28 -0
  176. package/dist/engine/checkpoint/route.js +28 -0
  177. package/dist/{core → engine}/config.d.ts +7 -2
  178. package/dist/engine/config.js +6 -0
  179. package/dist/engine/engine.d.ts +45 -0
  180. package/dist/{core → engine}/engine.js +6 -10
  181. package/dist/engine/env.d.ts +59 -0
  182. package/dist/engine/env.js +83 -0
  183. package/dist/{errors.d.ts → engine/errors.d.ts} +22 -22
  184. package/dist/{errors.js → engine/errors.js} +22 -22
  185. package/dist/{core → engine/flow}/branch-regression.d.ts +7 -7
  186. package/dist/{core → engine/flow}/branch-regression.js +4 -3
  187. package/dist/engine/flow/flow.d.ts +162 -0
  188. package/dist/engine/flow/flow.js +244 -0
  189. package/dist/engine/flow/map-branch.d.ts +9 -0
  190. package/dist/engine/flow/map-branch.js +57 -0
  191. package/dist/{core → engine/flow}/map-builder.d.ts +34 -54
  192. package/dist/engine/flow/map-builder.js +242 -0
  193. package/dist/engine/flow/map-steps.d.ts +30 -0
  194. package/dist/engine/flow/map-steps.js +87 -0
  195. package/dist/{core → engine}/locate.d.ts +1 -1
  196. package/dist/{core → engine}/locate.js +1 -2
  197. package/dist/{mem-stub.d.ts → engine/mem/mem-stub.d.ts} +9 -8
  198. package/dist/{mem-stub.js → engine/mem/mem-stub.js} +2 -2
  199. package/dist/{mem-page.d.ts → engine/mem/mem.d.ts} +1 -1
  200. package/dist/{mem-page.js → engine/mem/mem.js} +2 -1
  201. package/dist/engine/page-gone.d.ts +5 -0
  202. package/dist/engine/page-gone.js +20 -0
  203. package/dist/engine/run/connect.d.ts +28 -0
  204. package/dist/{types.js → engine/run/connect.js} +11 -10
  205. package/dist/engine/run/events.d.ts +67 -0
  206. package/dist/engine/run/events.js +90 -0
  207. package/dist/engine/run/hooks.d.ts +16 -0
  208. package/dist/engine/run/hooks.js +8 -0
  209. package/dist/engine/run/launch.d.ts +13 -0
  210. package/dist/engine/run/launch.js +27 -0
  211. package/dist/{core/run-graph.d.ts → engine/run/run.d.ts} +8 -12
  212. package/dist/{core/run-graph.js → engine/run/run.js} +22 -12
  213. package/dist/engine/stub/pace.d.ts +12 -0
  214. package/dist/engine/stub/pace.js +2 -0
  215. package/dist/engine/stub/ring.d.ts +130 -0
  216. package/dist/engine/stub/ring.js +41 -0
  217. package/dist/engine/stub/stub.d.ts +268 -0
  218. package/dist/engine/stub/stub.js +1 -0
  219. package/dist/engine/stub/todos.d.ts +104 -0
  220. package/dist/engine/stub/todos.js +2 -0
  221. package/dist/engine/stub/viewport.d.ts +26 -0
  222. package/dist/engine/stub/viewport.js +2 -0
  223. package/dist/{trait.d.ts → engine/trait/trait.d.ts} +1 -1
  224. package/dist/{trait.js → engine/trait/trait.js} +1 -1
  225. package/dist/index.d.ts +88 -36
  226. package/dist/index.js +46 -19
  227. package/dist/live/auto/auto.d.ts +22 -0
  228. package/dist/live/auto/auto.js +207 -0
  229. package/dist/{session/auto-explore.d.ts → live/auto/explore.d.ts} +4 -14
  230. package/dist/{session/auto-explore.js → live/auto/explore.js} +21 -127
  231. package/dist/live/auto/mem.d.ts +11 -0
  232. package/dist/live/auto/mem.js +85 -0
  233. package/dist/live/auto/menu.d.ts +30 -0
  234. package/dist/live/auto/menu.js +335 -0
  235. package/dist/live/auto-session/auto-session.d.ts +113 -0
  236. package/dist/live/auto-session/auto-session.js +452 -0
  237. package/dist/live/auto-session/console.d.ts +4 -0
  238. package/dist/live/auto-session/console.js +41 -0
  239. package/dist/live/auto-session/files.d.ts +44 -0
  240. package/dist/live/auto-session/files.js +145 -0
  241. package/dist/{auto-session → live/auto-session}/helpers.d.ts +9 -5
  242. package/dist/{auto-session → live/auto-session}/helpers.js +18 -1
  243. package/dist/live/auto-session/inspect.d.ts +4 -0
  244. package/dist/live/auto-session/inspect.js +75 -0
  245. package/dist/{session/auto-session-ipc.d.ts → live/auto-session/ipc.d.ts} +8 -25
  246. package/dist/{session/auto-session-ipc.js → live/auto-session/ipc.js} +36 -161
  247. package/dist/live/auto-session/open-browser.d.ts +6 -0
  248. package/dist/live/auto-session/open-browser.js +47 -0
  249. package/dist/{session/browser.d.ts → live/auto-session/start.d.ts} +1 -2
  250. package/dist/{session/browser.js → live/auto-session/start.js} +2 -3
  251. package/dist/{pilot-overlay → live/pilot}/panel.d.ts +1 -1
  252. package/dist/{pilot-overlay → live/pilot}/panel.js +23 -31
  253. package/dist/{session → live/pilot}/pilot.d.ts +3 -3
  254. package/dist/{session → live/pilot}/pilot.js +5 -4
  255. package/dist/{traverse/run.d.ts → live/traverse/traverse.d.ts} +1 -1
  256. package/dist/live/traverse/traverse.js +212 -0
  257. package/dist/live/traverse/worker.d.ts +37 -0
  258. package/dist/live/traverse/worker.js +200 -0
  259. package/dist/manifest/manifest.d.ts +52 -0
  260. package/dist/manifest/manifest.js +93 -0
  261. package/dist/manifest/map-imports.d.ts +7 -0
  262. package/dist/manifest/map-imports.js +22 -0
  263. package/dist/manifest/maps.d.ts +33 -0
  264. package/dist/manifest/maps.js +62 -0
  265. package/dist/manifest/pack.d.ts +21 -0
  266. package/dist/manifest/pack.js +109 -0
  267. package/dist/manifest/project.d.ts +60 -0
  268. package/dist/manifest/project.js +101 -0
  269. package/dist/{session/block-inject.js → manifest/roots.js} +1 -18
  270. package/dist/manifest/scan.d.ts +19 -0
  271. package/dist/manifest/scan.js +57 -0
  272. package/dist/manifest/source.d.ts +23 -0
  273. package/dist/manifest/source.js +86 -0
  274. package/dist/runner/mode.d.ts +71 -0
  275. package/dist/runner/mode.js +1 -0
  276. package/dist/runner/modes/branches.d.ts +5 -0
  277. package/dist/runner/modes/branches.js +37 -0
  278. package/dist/runner/modes/demo.d.ts +3 -0
  279. package/dist/runner/modes/demo.js +13 -0
  280. package/dist/runner/modes/report.d.ts +2 -0
  281. package/dist/runner/modes/report.js +54 -0
  282. package/dist/runner/modes/run.d.ts +2 -0
  283. package/dist/runner/modes/run.js +3 -0
  284. package/dist/runner/options.d.ts +31 -0
  285. package/dist/runner/options.js +42 -0
  286. package/dist/runner/plan/find.d.ts +18 -0
  287. package/dist/runner/plan/find.js +65 -0
  288. package/dist/runner/plan/plan.d.ts +11 -0
  289. package/dist/runner/plan/plan.js +97 -0
  290. package/dist/runner/plan/seed-mem.d.ts +12 -0
  291. package/dist/runner/plan/seed-mem.js +98 -0
  292. package/dist/runner/plan/spec.d.ts +5 -0
  293. package/dist/runner/plan/spec.js +17 -0
  294. package/dist/runner/play-steps.d.ts +2 -0
  295. package/dist/runner/play-steps.js +59 -0
  296. package/dist/runner/runner.d.ts +4 -0
  297. package/dist/runner/runner.js +64 -0
  298. package/dist/runner/session.d.ts +9 -0
  299. package/dist/runner/session.js +87 -0
  300. package/dist/{browser.js → runtime/browser.js} +4 -2
  301. package/dist/{env-file.js → runtime/env-file.js} +7 -12
  302. package/dist/{extensions.d.ts → runtime/extensions.d.ts} +1 -5
  303. package/dist/{extensions.js → runtime/extensions.js} +2 -1
  304. package/dist/runtime/full-launch.d.ts +1 -0
  305. package/dist/runtime/full-launch.js +34 -0
  306. package/dist/runtime/global-flag.d.ts +5 -0
  307. package/dist/runtime/global-flag.js +18 -0
  308. package/dist/{playwright-config.d.ts → runtime/playwright-config.d.ts} +1 -1
  309. package/dist/{playwright.config.js → runtime/playwright.config.js} +3 -2
  310. package/dist/runtime/run-log.d.ts +2 -0
  311. package/dist/runtime/run-log.js +17 -0
  312. package/dist/{video-dir.js → runtime/video-dir.js} +3 -2
  313. package/dist/{config.d.ts → runtime/waygraph-config.d.ts} +6 -9
  314. package/dist/{config.js → runtime/waygraph-config.js} +21 -51
  315. package/dist/{webserver.js → runtime/webserver.js} +5 -30
  316. package/examples/routed-demo/config/waygraph.config.ts +20 -0
  317. package/examples/routed-demo/package.json +1 -4
  318. package/examples/routed-demo/scripts/fixture-server.mjs +1 -1
  319. package/examples/routed-demo/src/flows/routed-demo-map.flow.ts +2 -4
  320. package/examples/routed-demo/src/flows/routed-demo.flow.ts +1 -2
  321. package/examples/routed-demo/src/map/(app_base)/dashboard/_methods/click-widget.block.ts +5 -4
  322. package/examples/routed-demo/src/map/(app_base)/dashboard/_nav.block.ts +3 -3
  323. package/examples/routed-demo/src/map/(app_base)/dashboard/_page.block.ts +3 -3
  324. package/examples/routed-demo/src/map/(external)/docs/_nav.block.ts +3 -3
  325. package/examples/routed-demo/src/map/(external)/docs/_page.block.ts +3 -3
  326. package/examples/routed-demo/src/states/routed-demo.states.ts +5 -3
  327. package/examples/routed-demo/tests/routed-demo.spec.ts +4 -4
  328. package/examples/routed-demo/tsconfig.json +1 -1
  329. package/examples/saucedemo/docs/CONVENTION.md +4 -5
  330. package/examples/saucedemo/docs/HELPERS.md +11 -11
  331. package/examples/saucedemo/src/blocks/SITE-MAP.md +0 -1
  332. package/examples/saucedemo/src/blocks/saucedemo-web/NAV.md +1 -5
  333. package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -3
  334. package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
  335. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
  336. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
  337. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
  338. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
  339. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +5 -8
  340. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -3
  341. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
  342. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +35 -43
  343. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
  344. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
  345. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
  346. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
  347. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
  348. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
  349. package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -4
  350. package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -4
  351. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +4 -5
  352. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
  353. package/examples/saucedemo/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
  354. package/examples/saucedemo/src/flows/api-demo.flow.ts +12 -10
  355. package/examples/saucedemo/src/states/checkout.states.ts +21 -11
  356. package/examples/saucedemo/src/stubs/device-showcase.ts +8 -10
  357. package/examples/saucedemo/tests/auto-graph.spec.ts +4 -12
  358. package/package.json +14 -6
  359. package/templates/agents/waygraph-planner.agent.md +2 -2
  360. package/templates/quickstart/docs/CONVENTION.md +4 -4
  361. package/templates/quickstart/docs/HELPERS.md +10 -8
  362. package/templates/quickstart/package.json +0 -3
  363. package/templates/quickstart/src/blocks/SITE-MAP.md +0 -1
  364. package/templates/quickstart/src/blocks/saucedemo-web/NAV.md +1 -5
  365. package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -3
  366. package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
  367. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
  368. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
  369. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
  370. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
  371. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +5 -8
  372. package/templates/quickstart/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -3
  373. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
  374. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +35 -43
  375. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
  376. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
  377. package/templates/quickstart/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
  378. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
  379. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
  380. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
  381. package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -4
  382. package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -4
  383. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +4 -5
  384. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
  385. package/templates/quickstart/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
  386. package/templates/quickstart/src/flows/api-demo.flow.ts +12 -10
  387. package/templates/quickstart/src/states/checkout.states.ts +21 -11
  388. package/templates/quickstart/src/stubs/device-showcase.ts +8 -10
  389. package/templates/scaffold/README.md +2 -1
  390. package/templates/scaffold/STRUCTURE.md +5 -4
  391. package/templates/scaffold/config/waygraph.config.ts +1 -0
  392. package/templates/scaffold/gitignore +1 -0
  393. package/templates/scaffold/src/flows/README.md +2 -2
  394. package/templates/scaffold/src/map/(app_base)/docs/_nav.block.ts +3 -3
  395. package/templates/scaffold/src/map/(app_base)/docs/_page.block.ts +3 -3
  396. package/templates/scaffold/src/map/(app_base)/home/_methods/add-item.effect.block.ts +4 -4
  397. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-hello.method.block.ts +3 -3
  398. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-item-added.method.block.ts +3 -3
  399. package/templates/scaffold/src/map/(app_base)/home/_methods/clear-cart.method.block.ts +5 -4
  400. package/templates/scaffold/src/map/(app_base)/home/_methods/remove-item.effect.block.ts +4 -4
  401. package/templates/scaffold/src/map/(app_base)/home/_nav.block.ts +3 -3
  402. package/templates/scaffold/src/map/(app_base)/home/_page.block.ts +3 -3
  403. package/templates/scaffold/src/map/(app_base)/home/nav-verification-link.block.ts +4 -4
  404. package/templates/scaffold/src/map/(external)/hoppscotch/_keys.ts +21 -0
  405. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-body.method.block.ts +4 -4
  406. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-header.method.block.ts +4 -4
  407. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-status.method.block.ts +4 -4
  408. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/pick-extension-interceptor.method.block.ts +5 -4
  409. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-body.method.block.ts +6 -5
  410. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-headers.method.block.ts +6 -5
  411. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/send-request.method.block.ts +5 -4
  412. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-bearer-token.method.block.ts +6 -5
  413. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-headers.method.block.ts +6 -5
  414. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-json-body.method.block.ts +6 -5
  415. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-method.method.block.ts +6 -5
  416. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-query-params.method.block.ts +6 -5
  417. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-url.method.block.ts +6 -5
  418. package/templates/scaffold/src/map/(external)/hoppscotch/_nav.block.ts +3 -3
  419. package/templates/scaffold/src/map/(external)/hoppscotch/_page.block.ts +3 -3
  420. package/templates/scaffold/src/map/(external)/hoppscotch/_states.ts +6 -0
  421. package/templates/scaffold/src/map/(external)/hoppscotch/settings/_nav.block.ts +3 -3
  422. package/templates/scaffold/src/map/(external)/mailpit/_keys.ts +13 -0
  423. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-content.method.block.ts +4 -4
  424. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-received.method.block.ts +4 -4
  425. package/templates/scaffold/src/map/(external)/mailpit/_methods/extract-email-link.method.block.ts +6 -5
  426. package/templates/scaffold/src/map/(external)/mailpit/_methods/open-message.method.block.ts +6 -5
  427. package/templates/scaffold/src/map/(external)/mailpit/_nav.block.ts +3 -3
  428. package/templates/scaffold/src/map/(external)/mailpit/_page.block.ts +3 -3
  429. package/templates/scaffold/src/map/(external)/mailpit/_states.ts +9 -0
  430. package/templates/scaffold/src/map/README.md +7 -0
  431. package/templates/scaffold/src/states/README.md +4 -1
  432. package/templates/scaffold/src/states/demo.mem-keys.ts +1 -29
  433. package/templates/scaffold/src/states/demo.states.ts +14 -20
  434. package/templates/scaffold/tests/hoppscotch.spec.ts +1 -11
  435. package/templates/scaffold/tests/mail-verify.spec.ts +2 -2
  436. package/templates/skills/waygraph-blind-pilot.skill.md +2 -6
  437. package/templates/skills/waygraph-convention.skill.md +23 -14
  438. package/templates/skills/waygraph-pilot.skill.md +7 -4
  439. package/dist/auto-session/session.d.ts +0 -193
  440. package/dist/auto-session/session.js +0 -719
  441. package/dist/auto-session/verbose-log.js +0 -16
  442. package/dist/auto-session.d.ts +0 -2
  443. package/dist/auto-session.js +0 -3
  444. package/dist/cli/discover.d.ts +0 -40
  445. package/dist/cli/discover.js +0 -148
  446. package/dist/commands/agent-dive.js +0 -52
  447. package/dist/commands/check.js +0 -192
  448. package/dist/commands/map.js +0 -29
  449. package/dist/commands/run.js +0 -104
  450. package/dist/commands/session.js +0 -600
  451. package/dist/commands/traverse.js +0 -177
  452. package/dist/core/block.d.ts +0 -109
  453. package/dist/core/blocks/effect.js +0 -23
  454. package/dist/core/config.js +0 -17
  455. package/dist/core/engine.d.ts +0 -198
  456. package/dist/core/flow.d.ts +0 -294
  457. package/dist/core/flow.js +0 -432
  458. package/dist/core/map-builder.js +0 -383
  459. package/dist/core.d.ts +0 -14
  460. package/dist/core.js +0 -15
  461. package/dist/highlights/merge.d.ts +0 -8
  462. package/dist/highlights/merge.js +0 -173
  463. package/dist/highlights/run-phase.d.ts +0 -43
  464. package/dist/highlights/stub-ctx.d.ts +0 -10
  465. package/dist/highlights/stub-ctx.js +0 -331
  466. package/dist/highlights/types.d.ts +0 -613
  467. package/dist/highlights.d.ts +0 -9
  468. package/dist/highlights.js +0 -10
  469. package/dist/pilot-overlay.d.ts +0 -5
  470. package/dist/pilot-overlay.js +0 -6
  471. package/dist/runner/banner-log.js +0 -63
  472. package/dist/runner/chain-run.js +0 -102
  473. package/dist/runner/cursor.js +0 -140
  474. package/dist/runner/demo-log.js +0 -316
  475. package/dist/runner/device-stage.d.ts +0 -9
  476. package/dist/runner/device-stage.js +0 -420
  477. package/dist/runner/discovery.js +0 -105
  478. package/dist/runner/index.js +0 -2
  479. package/dist/runner/inpage/banner.d.ts +0 -21
  480. package/dist/runner/inpage/banner.js +0 -156
  481. package/dist/runner/inpage/caption.d.ts +0 -3
  482. package/dist/runner/inpage/caption.js +0 -23
  483. package/dist/runner/inpage/core.d.ts +0 -4
  484. package/dist/runner/inpage/core.js +0 -316
  485. package/dist/runner/inpage/device.d.ts +0 -3
  486. package/dist/runner/inpage/device.js +0 -211
  487. package/dist/runner/inpage/network.d.ts +0 -15
  488. package/dist/runner/inpage/network.js +0 -217
  489. package/dist/runner/inpage/panel-chrome.js +0 -192
  490. package/dist/runner/inpage/stamp.js +0 -46
  491. package/dist/runner/inpage/swipe-zoom.js +0 -220
  492. package/dist/runner/inpage/todos.js +0 -337
  493. package/dist/runner/interaction-patch.js +0 -384
  494. package/dist/runner/main.js +0 -469
  495. package/dist/runner/network-capture.d.ts +0 -9
  496. package/dist/runner/network-capture.js +0 -126
  497. package/dist/runner/overlay-css.d.ts +0 -3
  498. package/dist/runner/overlay-css.js +0 -377
  499. package/dist/runner/overlay-install.js +0 -90
  500. package/dist/runner/overlay-stage.js +0 -110
  501. package/dist/runner/rings.js +0 -514
  502. package/dist/runner/seed-mem.js +0 -110
  503. package/dist/runner/slides.js +0 -278
  504. package/dist/runner/step-mode.js +0 -703
  505. package/dist/runner/step-panels.js +0 -729
  506. package/dist/runner/teardown.js +0 -202
  507. package/dist/runner/todo-dock.js +0 -142
  508. package/dist/session/auto-explore-run.d.ts +0 -40
  509. package/dist/session/auto-explore-run.js +0 -707
  510. package/dist/session/step-overlay.d.ts +0 -37
  511. package/dist/session/step-overlay.js +0 -244
  512. package/dist/traverse/run.js +0 -423
  513. package/examples/routed-demo/playwright.config.ts +0 -21
  514. package/examples/saucedemo/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
  515. package/templates/quickstart/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
  516. /package/dist/{commands → cli/commands}/agent-dive-scaffold.d.ts +0 -0
  517. /package/dist/{commands → cli/commands}/agent-dive.d.ts +0 -0
  518. /package/dist/{commands → cli/commands}/extensions.d.ts +0 -0
  519. /package/dist/{commands → cli/commands}/init.d.ts +0 -0
  520. /package/dist/{commands → cli/commands}/list.d.ts +0 -0
  521. /package/dist/{commands → cli/commands}/map.d.ts +0 -0
  522. /package/dist/{commands → cli/commands}/session.d.ts +0 -0
  523. /package/dist/{commands → cli/commands}/test.d.ts +0 -0
  524. /package/dist/{commands → cli/commands}/traverse.d.ts +0 -0
  525. /package/dist/{commands → cli/commands}/try.d.ts +0 -0
  526. /package/dist/{commands → cli/commands}/upgrade.d.ts +0 -0
  527. /package/dist/{highlights → demo/narration}/shorthand.js +0 -0
  528. /package/dist/{session/overlay-beacon.d.ts → demo/overlay/beacon.d.ts} +0 -0
  529. /package/dist/{session/overlay-beacon.js → demo/overlay/beacon.js} +0 -0
  530. /package/dist/{pilot-overlay/action-ring.d.ts → demo/overlay/pilot/actions.d.ts} +0 -0
  531. /package/dist/{ui → demo/overlay/ui}/components/ring.d.ts +0 -0
  532. /package/dist/{ui → demo/overlay/ui}/stylesheet.d.ts +0 -0
  533. /package/dist/{ui → demo/overlay/ui}/stylesheet.js +0 -0
  534. /package/dist/{ui → demo/overlay/ui}/tokens.d.ts +0 -0
  535. /package/dist/{ui → demo/overlay/ui}/tokens.js +0 -0
  536. /package/dist/{highlights → demo}/types.js +0 -0
  537. /package/dist/{auto-session → demo}/verbose-log.d.ts +0 -0
  538. /package/dist/{selector.d.ts → engine/trait/selector.d.ts} +0 -0
  539. /package/dist/{selector.js → engine/trait/selector.js} +0 -0
  540. /package/dist/{traverse → live/traverse}/coverage.d.ts +0 -0
  541. /package/dist/{traverse → live/traverse}/coverage.js +0 -0
  542. /package/dist/{traverse → live/traverse}/lease.d.ts +0 -0
  543. /package/dist/{traverse → live/traverse}/lease.js +0 -0
  544. /package/dist/{session/block-inject.d.ts → manifest/roots.d.ts} +0 -0
  545. /package/dist/{blocks-select.d.ts → manifest/select.d.ts} +0 -0
  546. /package/dist/{blocks-select.js → manifest/select.js} +0 -0
  547. /package/dist/{browser.d.ts → runtime/browser.d.ts} +0 -0
  548. /package/dist/{env-file.d.ts → runtime/env-file.d.ts} +0 -0
  549. /package/dist/{playwright-config.js → runtime/playwright-config.js} +0 -0
  550. /package/dist/{playwright.config.d.ts → runtime/playwright.config.d.ts} +0 -0
  551. /package/dist/{video-dir.d.ts → runtime/video-dir.d.ts} +0 -0
  552. /package/dist/{webserver.d.ts → runtime/webserver.d.ts} +0 -0
@@ -0,0 +1,172 @@
1
+ // The stepper's panels: before a step (what will happen, its mem), after it (the result and rings), and on failure.
2
+ import { ignorePageGone } from "../../engine/page-gone.js";
3
+ import { hasAuthoredStubOnError, runStubPhase } from "../narration/narration.js";
4
+ import { applyHighlightStyleDefaults, formatHighlightCaption } from "../narration/style.js";
5
+ import { installOverlay } from "../overlay/overlay.js";
6
+ import { cycleHighlightRings } from "../overlay/rings.js";
7
+ export function miniStepLabel(info) {
8
+ const ep = info.episodeNumber !== undefined && info.episodeNumber !== null
9
+ ? "Ep " + info.episodeNumber + " \u00b7 "
10
+ : "";
11
+ return (ep +
12
+ (info.index + 1) +
13
+ " / " +
14
+ info.total +
15
+ (info.blockName ? " \u00b7 " + info.blockName : "") +
16
+ (info.paceBadge ? " \u00b7 " + info.paceBadge : ""));
17
+ }
18
+ /**
19
+ * stubOnError rings + amber "expected outcome" / red error panel, then wait
20
+ * for Stop/Retry. Used when a step throws OR when a `map({ expectedFailure })` flow's last
21
+ * block succeeds on the intentional fail branch (e.g. LoginPage + error banner).
22
+ */
23
+ export async function presentFailPanel(page, opts) {
24
+ const { block, error, index, total, blockName, message, allNames, allDescriptions, moduleIndex, allEpisodes, title, episodeNumber, episodeTitle, expectedFailureReason, stepperMode, gatesFast, demoPace, gate, mem, } = opts;
25
+ if (hasAuthoredStubOnError(block)) {
26
+ await page
27
+ .evaluate(() => {
28
+ if (window.__wgRingTrack) {
29
+ window.removeEventListener("resize", window.__wgRingTrack);
30
+ window.removeEventListener("scroll", window.__wgRingTrack, true);
31
+ window.__wgRingTrack = null;
32
+ }
33
+ })
34
+ .catch(ignorePageGone);
35
+ const errPhase = await runStubPhase(block, "stubOnError", {
36
+ error,
37
+ out: opts.out,
38
+ mem,
39
+ });
40
+ const errHighlights = errPhase.highlights.map((h) => {
41
+ const styled = applyHighlightStyleDefaults(h, opts.highlightStyle);
42
+ return { ...styled, label: formatHighlightCaption(styled), focus: !!styled.focus };
43
+ });
44
+ await cycleHighlightRings(page, errHighlights, !!gatesFast, {
45
+ defaultHoldMs: 2000,
46
+ pace: demoPace,
47
+ todos: errPhase.todos,
48
+ });
49
+ }
50
+ await renderStepError(page, {
51
+ index,
52
+ total,
53
+ blockName,
54
+ message,
55
+ allNames,
56
+ allDescriptions,
57
+ moduleIndex,
58
+ allEpisodes,
59
+ title,
60
+ episodeNumber,
61
+ episodeTitle,
62
+ expectedFailureReason,
63
+ stepperMode,
64
+ });
65
+ return gate();
66
+ }
67
+ /**
68
+ * A Block threw - act()/observe() rejected, or Flow.run's own verify Trait
69
+ * check failed. Shown instead of letting it crash the whole Node process
70
+ * silently from a human's point of view (the browser closes right after
71
+ * regardless - main()'s own try/finally - but not before this is visible).
72
+ */
73
+ async function renderStepError(page, info) {
74
+ await installOverlay(page, info.title, info.bannerUi, info.caption, info.networkTabVisible);
75
+ const errorPayload = { ...info, stepLabel: miniStepLabel(info) };
76
+ await page
77
+ .evaluate((info) => {
78
+ // Reused in place - see renderBeforeStep's own comment on this.
79
+ let panel = __wgById("wg-panel");
80
+ const isNewPanel = !panel;
81
+ if (!panel) {
82
+ panel = document.createElement("div");
83
+ panel.id = "wg-panel";
84
+ }
85
+ const isExpected = !!info.expectedFailureReason;
86
+ const errClass = isExpected ? "wg-expected" : "wg-error";
87
+ panel.classList.remove("wg-error", "wg-expected");
88
+ panel.classList.add(errClass);
89
+ if (!isNewPanel)
90
+ panel.classList.add("wg-in");
91
+ const episodes = info.allEpisodes && info.allEpisodes.length > 0
92
+ ? __wgEl("div", { id: "wg-episodes" }, info.allEpisodes.map((e) => {
93
+ const cls = e.episodeNumber < (info.episodeNumber ?? 0) ? "wg-ep-done"
94
+ : e.episodeNumber === info.episodeNumber ? "wg-ep-current"
95
+ : "wg-ep-upcoming";
96
+ return __wgEl("span", { class: "wg-ep-tab " + cls }, "Episode " + e.episodeNumber + ": " + (e.episodeTitle || ""));
97
+ }))
98
+ : null;
99
+ const modulesClass = info.stepperMode === "full" ? "wg-modules-full" : "wg-modules-carousel";
100
+ const modules = info.allNames.map((name, idx) => {
101
+ const cls = idx === info.moduleIndex ? "wg-mod-current" : idx < info.moduleIndex ? "wg-mod-done" : "wg-mod-upcoming";
102
+ const desc = info.allDescriptions && info.allDescriptions[idx];
103
+ return __wgEl("span", { class: "wg-mod " + cls, title: desc || undefined }, String(name));
104
+ });
105
+ const retryLabel = info.episodeNumber !== undefined ? "Retry Episode " + info.episodeNumber : "Retry";
106
+ const headingText = isExpected
107
+ ? "Expected outcome - Step " + (info.index + 1) + " / " + info.total + " - " + info.blockName + " failed as intended"
108
+ : "Step " + (info.index + 1) + " / " + info.total + " - " + info.blockName + " threw";
109
+ __wgSet(panel, episodes, __wgEl("div", { id: "wg-modules", class: modulesClass }, modules), __wgEl("h3", { class: isExpected ? "wg-expected-heading" : "wg-error-heading" }, headingText), isExpected ? __wgEl("div", { class: "wg-expected-reason" }, String(info.expectedFailureReason)) : null, __wgEl("div", { class: "wg-error-msg" }, String(info.message)), __wgEl("div", { class: "wg-error-actions" }, __wgEl("button", { id: "wg-error-retry", class: "wg-error-retry" }, retryLabel), __wgEl("button", { id: "wg-run", class: "wg-error-stop" }, "Stop")));
110
+ if (isNewPanel) {
111
+ __wgAdd(panel);
112
+ requestAnimationFrame(() => panel.classList.add("wg-in"));
113
+ }
114
+ else {
115
+ panel.classList.add("wg-in");
116
+ }
117
+ if (window.__wgWirePanelChrome) {
118
+ window.__wgWirePanelChrome(panel, "wg-panel-hidden", "waygraph demo", {
119
+ stepLabel: info.stepLabel || "",
120
+ forceCollapsed: info.forceCollapsed === true ? true : undefined,
121
+ fastForward: !!info.fastForward,
122
+ isApi: !!info.isApi,
123
+ });
124
+ }
125
+ if (window.__wgStampModal) {
126
+ window.__wgStampModal(panel, "panel", {
127
+ phase: "error",
128
+ step: info.index + 1,
129
+ total: info.total,
130
+ block: info.blockName || "",
131
+ ready: true,
132
+ });
133
+ }
134
+ const runBtn = __wgById("wg-run");
135
+ if (runBtn)
136
+ runBtn.addEventListener("click", () => window.__wgNext({}));
137
+ const retryBtn = __wgById("wg-error-retry");
138
+ if (retryBtn)
139
+ retryBtn.addEventListener("click", () => window.__wgNext({ __wgRetry: "1" }));
140
+ }, errorPayload)
141
+ .catch(ignorePageGone);
142
+ }
143
+ /**
144
+ * Recovers a DOM selector from a built-in Trait's own .name string -
145
+ * visible(sel) / text-equals(sel, "...") - since Trait.check itself is
146
+ * an opaque closure with no selector field of its own. Best-effort only: a
147
+ * hand-written bespoke Trait, or url-matches(...) (no DOM target), yields
148
+ * nothing to highlight, which is fine - the panel still shows the result.
149
+ */
150
+ export function extractVerifyHighlights(block, resultTag) {
151
+ let verify = block.instruction && block.instruction.verify;
152
+ if (typeof verify === "function") {
153
+ try {
154
+ verify = verify({ __state: resultTag });
155
+ }
156
+ catch {
157
+ verify = [];
158
+ }
159
+ }
160
+ if (!Array.isArray(verify))
161
+ return [];
162
+ const highlights = [];
163
+ for (const t of verify) {
164
+ const name = t && t.name;
165
+ if (typeof name !== "string")
166
+ continue;
167
+ const selector = /^visible\((.+)\)$/.exec(name)?.[1] ?? /^text-equals\((.+?),\s*"/.exec(name)?.[1];
168
+ if (selector)
169
+ highlights.push({ selector, label: name, tone: "auto" });
170
+ }
171
+ return highlights;
172
+ }
@@ -0,0 +1,24 @@
1
+ import type { Checkpoint } from "../../engine/checkpoint/checkpoint.js";
2
+ import type { MemPage } from "../../engine/mem/mem.js";
3
+ import type { WgPage } from "../types.js";
4
+ import type { StepperStep } from "./view.js";
5
+ export interface Stepper {
6
+ /** After the page was reset between episodes: storage was wiped, so the auto-advance setting is put back. */
7
+ afterReset(): Promise<void>;
8
+ before(index: number): Promise<void>;
9
+ after(index: number, result: Checkpoint<string>): Promise<void>;
10
+ /** A step threw, or reached the failure its flow expects: show why, then the person picks Retry or Stop. */
11
+ failed(index: number, failure: {
12
+ error?: unknown;
13
+ result?: Checkpoint<string> | undefined;
14
+ }): Promise<"retry" | "stop">;
15
+ end(): Promise<void>;
16
+ }
17
+ export interface StepperOptions {
18
+ title: string | undefined;
19
+ /** Block names that skip the added dwell (WAYGRAPH_FAST_BLOCKS). */
20
+ fastBlocks: Set<string>;
21
+ /** Waygraph's own beat after each action, in ms. */
22
+ beat: number;
23
+ }
24
+ export declare function createStepper(page: WgPage, mem: MemPage, steps: readonly StepperStep[], options: StepperOptions): Promise<Stepper>;
@@ -0,0 +1,122 @@
1
+ import { createOverlayStage } from "../overlay/overlay-stage.js";
2
+ import { instrumentInteractionHighlighting } from "./interaction-patch.js";
3
+ import { markStepRunning, restoreTheaterAfterNavigation, teardownOverlay } from "./teardown.js";
4
+ import { keepOverlayOnNavigation } from "../overlay/reattach.js";
5
+ import { presentFailPanel } from "./step-panels.js";
6
+ import { installGate } from "./gate.js";
7
+ import { newPacing, paceStep } from "./pacing.js";
8
+ import { showBefore } from "./before.js";
9
+ import { showAfter } from "./after.js";
10
+ import { episodesOf, viewOf } from "./view.js";
11
+ import { envFlag, envString } from "../../engine/env.js";
12
+ import { ignorePageGone } from "../../engine/page-gone.js";
13
+ export async function createStepper(page, mem, steps, options) {
14
+ const demoFast = envFlag("WAYGRAPH_DEMO_FAST");
15
+ const pacing = newPacing(demoFast);
16
+ const refs = { stubBefore: { current: [] }, todoDock: { current: undefined }, device: { current: undefined } };
17
+ instrumentInteractionHighlighting(page, mem, options.beat, pacing, refs.stubBefore, refs.todoDock, refs.device);
18
+ // A navigation inside a step (a redirect, a login bounce) repaints the overlay with the step's todos, device and ring.
19
+ keepOverlayOnNavigation(page, () => restoreTheaterAfterNavigation(page, refs.todoDock, refs.device, refs.stubBefore));
20
+ keepWindowSize(page);
21
+ const gate = await installGate(page, pacing, demoFast);
22
+ await gate.syncAutoplay();
23
+ const ctx = {
24
+ page,
25
+ mem,
26
+ steps,
27
+ stage: createOverlayStage(page, { todoDockRef: refs.todoDock, deviceRef: refs.device }),
28
+ gate,
29
+ pacing,
30
+ refs,
31
+ title: options.title,
32
+ stepperMode: envString("WAYGRAPH_STEPPER") === "full" ? "full" : "carousel",
33
+ stickyTitle: undefined,
34
+ allEpisodes: episodesOf(steps),
35
+ };
36
+ let view;
37
+ return {
38
+ afterReset: gate.syncAutoplay,
39
+ async before(index) {
40
+ view = viewOf(ctx, index);
41
+ paceStep(pacing, view.step, demoFast, options.fastBlocks);
42
+ await showBefore(ctx, view);
43
+ applyMemEdits(ctx, view, await gate.wait());
44
+ await markStepRunning(page);
45
+ await labelNavClick(page, view.step);
46
+ },
47
+ async after(_index, result) {
48
+ await stepRan(ctx);
49
+ await showAfter(ctx, view, result);
50
+ },
51
+ async failed(index, failure) {
52
+ await stepRan(ctx);
53
+ const step = view.step;
54
+ const edits = await presentFailPanel(page, {
55
+ block: step.block,
56
+ highlightStyle: step.highlightStyle,
57
+ error: failure.error,
58
+ ...(failure.result ? { out: failure.result } : {}),
59
+ index,
60
+ total: steps.length,
61
+ blockName: step.block.name,
62
+ message: failure.result
63
+ ? "Resolved " + (failure.result.__state ?? JSON.stringify(failure.result)) + " (expected failure path)"
64
+ : failure.error instanceof Error ? failure.error.message : String(failure.error),
65
+ allNames: view.moduleNames,
66
+ allDescriptions: view.moduleDescriptions,
67
+ moduleIndex: view.moduleIndex,
68
+ allEpisodes: ctx.allEpisodes,
69
+ title: options.title,
70
+ episodeNumber: step.episodeNumber,
71
+ episodeTitle: step.episodeTitle,
72
+ expectedFailureReason: step.expectedFailureReason,
73
+ stepperMode: ctx.stepperMode,
74
+ gatesFast: pacing.gatesFast,
75
+ demoPace: pacing.demoPace,
76
+ gate: gate.wait,
77
+ mem,
78
+ });
79
+ return edits && edits.__wgRetry ? "retry" : "stop";
80
+ },
81
+ end: () => teardownOverlay(page),
82
+ };
83
+ }
84
+ /**
85
+ * Some Blocks call page.setViewportSize() in their own act for their own tests; in a watched demo that would resize
86
+ * the window, so it does nothing here. An authored ctx.device() still resizes through __wgRealSetViewportSize.
87
+ */
88
+ function keepWindowSize(page) {
89
+ page.__wgRealSetViewportSize = page.setViewportSize.bind(page);
90
+ page.setViewportSize = async () => { };
91
+ }
92
+ /** Values typed into the panel's mem fields replace the step's inputs (left as authored when not valid JSON). */
93
+ function applyMemEdits(ctx, view, edits) {
94
+ for (const k of view.step.block.requires ?? []) {
95
+ if (edits[k.name] === undefined)
96
+ continue;
97
+ try {
98
+ ctx.mem.set(k, JSON.parse(edits[k.name]));
99
+ }
100
+ catch {
101
+ // left as-authored if the human's edit isn't valid JSON
102
+ }
103
+ }
104
+ }
105
+ /** A click-based Nav Block's cursor reads "nav: <block>", like any other Block's click. */
106
+ async function labelNavClick(page, step) {
107
+ const label = step.block.__waygraphKind === "nav" && step.block.__waygraphNavClick !== undefined ? "nav: " + (step.block.name || "click") : undefined;
108
+ await page
109
+ .evaluate((l) => {
110
+ if (l)
111
+ window.__wgPendingNavClickLabel = l;
112
+ else
113
+ delete window.__wgPendingNavClickLabel;
114
+ }, label)
115
+ .catch(ignorePageGone);
116
+ }
117
+ /** The step finished: drop its nav label, and keep the todo dock it advanced for the steps after it. */
118
+ async function stepRan(ctx) {
119
+ await ctx.page.evaluate(() => delete window.__wgPendingNavClickLabel).catch(ignorePageGone);
120
+ if (ctx.refs.todoDock.current)
121
+ ctx.stage.state.lastTodoDock = ctx.refs.todoDock.current;
122
+ }
@@ -0,0 +1,47 @@
1
+ import type { StepperRefs, WgPage } from "../types.js";
2
+ /**
3
+ * Patches Locator.prototype.fill (via any real locator's own prototype
4
+ * chain - Playwright doesn't export the class directly) so every fill(),
5
+ * regardless of how the Block built that locator (page.locator, chained
6
+ * .getByLabel off a scoped form locator, etc.), highlights the real target
7
+ * first, then types it out character by character instead of snapping the
8
+ * whole value in - "when something is written from mem, it should
9
+ * highlight then slowly input." One-time patch (idempotent - guarded so a
10
+ * multi-step chain doesn't re-wrap an already-wrapped fill).
11
+ */
12
+ /**
13
+ * Called once the gate resolves - manual click OR autoplay timeout, both
14
+ * covered from here rather than duplicating this in the in-page click
15
+ * handler - right before the Block's own act() actually starts. the user: "i
16
+ * want the button, step is running thing. so i wont be able to interrupt
17
+ * the playwright automation" - the "Run this step" button used to sit
18
+ * there still looking clickable for the entire multi-second duration a
19
+ * real act()/observe() takes, inviting a confusing extra click (harmless -
20
+ * __wgNext no-ops once already consumed - but looked live when it wasn't).
21
+ * Disables the button and mem-key textareas, and swaps whichever gate
22
+ * text was showing (manual button or "Auto-advancing...") to "Running...".
23
+ * ALWAYS collapses the panel while act() runs - leaving it expanded was a
24
+ * real bug: #wg-panel sits at z-index max with pointer-events:auto, so
25
+ * Playwright's login/add-to-cart clicks hit the stepper instead of the app
26
+ * ("subtree intercepts pointer events"). Empty/partial fills + a lucky
27
+ * edge click on Login then produced Sauce Demo's Epic sadface, verify
28
+ * still passed on the error banner, and the next block blew up. Collapse
29
+ * also matches the user's "step is running / can't interrupt" ask.
30
+ */
31
+ export declare function markStepRunning(page: WgPage): Promise<void>;
32
+ /**
33
+ * Real navigation wipes document + overlay helpers. Reinstall and re-paint
34
+ * carried todos / device / optional stubBefore ring so keep-dock and nav
35
+ * highlights do not vanish until the next ctx.todos() / stubAfter (PIA #15).
36
+ */
37
+ export declare function restoreTheaterAfterNavigation(page: WgPage, todoDockRef: StepperRefs["todoDock"], deviceRef: StepperRefs["device"], stubBeforeRef: StepperRefs["stubBefore"]): Promise<void>;
38
+ /**
39
+ * Removes every overlay element (panel, ring, ring-label, cursor,
40
+ * click-pulse, banner) and stops the live resize/scroll ring tracker, once
41
+ * the whole chain is genuinely done - "I want to see the same page just
42
+ * like the demo opened for the first time," not the last step's panel and
43
+ * highlight ring stuck over the real app forever. installOverlay only ever
44
+ * ADDS these elements back on demand (idempotent, per-page-load) - nothing
45
+ * re-creates them once torn down here unless another Block/fill/click runs.
46
+ */
47
+ export declare function teardownOverlay(page: WgPage): Promise<void>;
@@ -0,0 +1,178 @@
1
+ import { installOverlay } from "../overlay/overlay.js";
2
+ import { applyDeviceToPage } from "../overlay/device-stage.js";
3
+ import { showRing } from "../overlay/rings.js";
4
+ import { formatHighlightCaption } from "../narration/style.js";
5
+ import { ignorePageGone } from "../../engine/page-gone.js";
6
+ /**
7
+ * Patches Locator.prototype.fill (via any real locator's own prototype
8
+ * chain - Playwright doesn't export the class directly) so every fill(),
9
+ * regardless of how the Block built that locator (page.locator, chained
10
+ * .getByLabel off a scoped form locator, etc.), highlights the real target
11
+ * first, then types it out character by character instead of snapping the
12
+ * whole value in - "when something is written from mem, it should
13
+ * highlight then slowly input." One-time patch (idempotent - guarded so a
14
+ * multi-step chain doesn't re-wrap an already-wrapped fill).
15
+ */
16
+ /**
17
+ * Called once the gate resolves - manual click OR autoplay timeout, both
18
+ * covered from here rather than duplicating this in the in-page click
19
+ * handler - right before the Block's own act() actually starts. the user: "i
20
+ * want the button, step is running thing. so i wont be able to interrupt
21
+ * the playwright automation" - the "Run this step" button used to sit
22
+ * there still looking clickable for the entire multi-second duration a
23
+ * real act()/observe() takes, inviting a confusing extra click (harmless -
24
+ * __wgNext no-ops once already consumed - but looked live when it wasn't).
25
+ * Disables the button and mem-key textareas, and swaps whichever gate
26
+ * text was showing (manual button or "Auto-advancing...") to "Running...".
27
+ * ALWAYS collapses the panel while act() runs - leaving it expanded was a
28
+ * real bug: #wg-panel sits at z-index max with pointer-events:auto, so
29
+ * Playwright's login/add-to-cart clicks hit the stepper instead of the app
30
+ * ("subtree intercepts pointer events"). Empty/partial fills + a lucky
31
+ * edge click on Login then produced Sauce Demo's Epic sadface, verify
32
+ * still passed on the error banner, and the next block blew up. Collapse
33
+ * also matches the user's "step is running / can't interrupt" ask.
34
+ */
35
+ export async function markStepRunning(page) {
36
+ await page
37
+ .evaluate(() => {
38
+ const runBtn = __wgById("wg-run");
39
+ if (runBtn) {
40
+ runBtn.disabled = true;
41
+ runBtn.textContent = "Running \u25B6";
42
+ }
43
+ const autoEl = __wgById("wg-gate-auto");
44
+ if (autoEl)
45
+ autoEl.textContent = "Running...";
46
+ __wgQA("#wg-panel textarea[data-key]").forEach((ta) => {
47
+ ta.disabled = true;
48
+ });
49
+ const panel = __wgById("wg-panel");
50
+ if (panel) {
51
+ panel.classList.add("wg-collapsed");
52
+ panel.setAttribute("data-wg-collapsed", "1");
53
+ panel.setAttribute("data-wg-phase", "running");
54
+ if (typeof window.__wgStampModal === "function") {
55
+ window.__wgStampModal(panel, "panel", {
56
+ phase: "running",
57
+ ready: true,
58
+ });
59
+ }
60
+ const toggle = panel.querySelector("[data-wg-toggle]");
61
+ if (toggle)
62
+ toggle.textContent = "Show";
63
+ const titleEl = panel.querySelector(".wg-chrome-title");
64
+ const label = panel.dataset.wgStepLabel;
65
+ if (titleEl && label)
66
+ titleEl.textContent = label;
67
+ const miniNext = panel.querySelector("[data-wg-mini-next]");
68
+ if (miniNext) {
69
+ miniNext.disabled = true;
70
+ miniNext.classList.remove("wg-mini-next-show");
71
+ }
72
+ }
73
+ })
74
+ .catch(ignorePageGone);
75
+ }
76
+ /**
77
+ * Real navigation wipes document + overlay helpers. Reinstall and re-paint
78
+ * carried todos / device / optional stubBefore ring so keep-dock and nav
79
+ * highlights do not vanish until the next ctx.todos() / stubAfter (PIA #15).
80
+ */
81
+ export async function restoreTheaterAfterNavigation(page, todoDockRef, deviceRef, stubBeforeRef) {
82
+ const needs = (await page
83
+ .evaluate(() => !window.__wgSyncTodos || !__wgById("wg-ring"))
84
+ .catch(ignorePageGone)) ?? true;
85
+ if (!needs) {
86
+ // Overlay survived (SPA / no full document wipe) - still refresh dock
87
+ // if Node has a carry and the DOM lost .wg-todo-dock.
88
+ const hasDock = await page
89
+ .evaluate(() => !!__wgQ(".wg-todo-dock, #wg-todo-dock"))
90
+ .catch(ignorePageGone);
91
+ if (hasDock || !todoDockRef || !todoDockRef.current)
92
+ return;
93
+ }
94
+ await installOverlay(page);
95
+ const dock = todoDockRef && todoDockRef.current;
96
+ if (dock) {
97
+ await page
98
+ .evaluate((d) => {
99
+ if (window.__wgSyncTodos)
100
+ window.__wgSyncTodos({ sync: "set", dock: d });
101
+ }, dock)
102
+ .catch(ignorePageGone);
103
+ }
104
+ if (deviceRef && deviceRef.current) {
105
+ await applyDeviceToPage(page, deviceRef.current, "set").catch(ignorePageGone);
106
+ }
107
+ // Re-show first matching stubBefore ring if selector still exists (sidebar
108
+ // nav targets often survive the route change).
109
+ const stubs = (stubBeforeRef && stubBeforeRef.current) || [];
110
+ for (const h of stubs) {
111
+ if (!h || !h.selector)
112
+ continue;
113
+ // Playwright's own locator (>> piercing / :has-text() / :visible support), not a raw
114
+ // querySelector string - see rings.js's showRing for the same fix, same reason. count() gate:
115
+ // Locator.evaluate() has no timeout option and auto-waits ~30s for a match to appear - count()
116
+ // never waits, keeping this an immediate "does it still exist" check (this selector routinely
117
+ // won't, after a route change - that's the whole point of the loop).
118
+ const hLoc = page.locator(h.selector).first();
119
+ const box = (await hLoc.count().catch(() => 0)) > 0
120
+ ? await hLoc
121
+ .evaluate((el) => {
122
+ const r = el.getBoundingClientRect();
123
+ if (r.width < 2 || r.height < 2)
124
+ return null;
125
+ return { x: r.x, y: r.y, width: r.width, height: r.height };
126
+ })
127
+ .catch(() => null)
128
+ : null;
129
+ if (box) {
130
+ await showRing(page, box, formatHighlightCaption(h), h.tone || "planned", {
131
+ size: h.size,
132
+ weight: h.weight,
133
+ selector: h.selector,
134
+ focus: !!h.focus,
135
+ }).catch(ignorePageGone);
136
+ break;
137
+ }
138
+ }
139
+ }
140
+ /**
141
+ * Removes every overlay element (panel, ring, ring-label, cursor,
142
+ * click-pulse, banner) and stops the live resize/scroll ring tracker, once
143
+ * the whole chain is genuinely done - "I want to see the same page just
144
+ * like the demo opened for the first time," not the last step's panel and
145
+ * highlight ring stuck over the real app forever. installOverlay only ever
146
+ * ADDS these elements back on demand (idempotent, per-page-load) - nothing
147
+ * re-creates them once torn down here unless another Block/fill/click runs.
148
+ */
149
+ export async function teardownOverlay(page) {
150
+ await page
151
+ .evaluate(() => {
152
+ if (window.__wgRingTrack) {
153
+ window.removeEventListener("resize", window.__wgRingTrack);
154
+ window.removeEventListener("scroll", window.__wgRingTrack, true);
155
+ window.__wgRingTrack = null;
156
+ }
157
+ window.__wgNarrateOwnsRing = false;
158
+ for (const id of [
159
+ "wg-panel",
160
+ "wg-ring",
161
+ "wg-ring-label",
162
+ "wg-cursor",
163
+ "wg-click-pulse",
164
+ "wg-banner",
165
+ "wg-todo-dock",
166
+ "wg-device-shell",
167
+ "wg-device-toast",
168
+ "wg-device-badge",
169
+ ]) {
170
+ const el = __wgById(id);
171
+ if (el)
172
+ el.remove();
173
+ }
174
+ __wgQA(".wg-todo-dock").forEach((el) => el.remove());
175
+ document.documentElement.classList.remove("wg-video-device-stage");
176
+ })
177
+ .catch(ignorePageGone);
178
+ }
@@ -0,0 +1,15 @@
1
+ import type { StepperRefs, WgPage } from "../types.js";
2
+ import type { ResolvedHighlight } from "../../engine/stub/ring.js";
3
+ /** Advance sequential todo dock to stubIndex and push to the page (Method act). */
4
+ export declare function syncTodoDockAdvance(page: WgPage, todoDockRef: StepperRefs["todoDock"] | undefined, stubIndex: number, stub: ResolvedHighlight | null | undefined): Promise<void>;
5
+ export declare function probeTodoDocksOnPage(page: WgPage): Promise<never[] | {
6
+ key: string;
7
+ pos: string;
8
+ top: number;
9
+ left: number;
10
+ w: number;
11
+ h: number;
12
+ onScreen: boolean;
13
+ n: number;
14
+ current: string;
15
+ }[]>;
@@ -0,0 +1,110 @@
1
+ import { advanceTodoDock } from "../narration/todo-dock.js";
2
+ import { demoLog } from "./demo-log.js";
3
+ import { ignorePageGone } from "../../engine/page-gone.js";
4
+ /** Flatten dock items in order (sequential groups). */
5
+ function flattenTodoDockItems(dock) {
6
+ const items = [];
7
+ if (!dock || !dock.groups)
8
+ return items;
9
+ for (const g of dock.groups) {
10
+ for (const t of g.items || [])
11
+ items.push(t);
12
+ }
13
+ return items;
14
+ }
15
+ /**
16
+ * Resolve which todo index a matched stub should advance to.
17
+ * Prefer stub.todo / stub.slotId / stub.id against item.id; never jump backward.
18
+ */
19
+ function resolveTodoAdvanceIndex(dock, stub, stubIndex) {
20
+ const items = flattenTodoDockItems(dock);
21
+ if (!items.length)
22
+ return stubIndex;
23
+ const curIdx = items.findIndex((t) => t.current);
24
+ let idx = stubIndex;
25
+ const key = stub && (stub.todo || stub.slotId);
26
+ if (key) {
27
+ const k = String(key).trim().toLowerCase();
28
+ let found = items.findIndex((t) => t.id && String(t.id).toLowerCase() === k);
29
+ if (found < 0) {
30
+ // username -> login-user, password -> login-pass, submit -> login-submit
31
+ const aliases = {
32
+ username: ["login-user", "user", "email"],
33
+ password: ["login-pass", "pass"],
34
+ submit: ["login-submit", "login", "tap-login"],
35
+ user: ["login-user", "username"],
36
+ pass: ["login-pass", "password"],
37
+ };
38
+ const alts = aliases[k] || [];
39
+ for (const a of alts) {
40
+ found = items.findIndex((t) => t.id && String(t.id).toLowerCase() === a);
41
+ if (found >= 0)
42
+ break;
43
+ }
44
+ }
45
+ if (found < 0) {
46
+ found = items.findIndex((t) => (t.id && String(t.id).toLowerCase().includes(k)) ||
47
+ (t.text && String(t.text).toLowerCase().includes(k)));
48
+ }
49
+ if (found >= 0)
50
+ idx = found;
51
+ }
52
+ // Monotonic: never retreat the walkthrough.
53
+ if (curIdx >= 0 && idx < curIdx)
54
+ idx = curIdx;
55
+ return idx;
56
+ }
57
+ /** Advance sequential todo dock to stubIndex and push to the page (Method act). */
58
+ export async function syncTodoDockAdvance(page, todoDockRef, stubIndex, stub) {
59
+ if (!todoDockRef || stubIndex < 0)
60
+ return;
61
+ const prev = todoDockRef.current;
62
+ if (!prev)
63
+ return;
64
+ const idx = resolveTodoAdvanceIndex(prev, stub || null, stubIndex);
65
+ const advanced = advanceTodoDock(prev, idx);
66
+ todoDockRef.current = advanced;
67
+ demoLog(" todo advance -> idx=" +
68
+ idx +
69
+ (stub && (stub.slotId || stub.todo)
70
+ ? " slot=" + (stub.todo || stub.slotId)
71
+ : " stub#" + stubIndex) +
72
+ ' current="' +
73
+ String((flattenTodoDockItems(advanced).find((t) => t.current) || {}).text || "").slice(0, 40) +
74
+ '"');
75
+ await page
76
+ .evaluate((dock) => {
77
+ if (window.__wgSyncTodos) {
78
+ window.__wgSyncTodos({ sync: "set", dock });
79
+ }
80
+ }, advanced)
81
+ .catch(ignorePageGone);
82
+ }
83
+ export async function probeTodoDocksOnPage(page) {
84
+ return page
85
+ .evaluate(() => {
86
+ const docks = [...__wgQA(".wg-todo-dock, #wg-todo-dock")];
87
+ return docks.map((el) => {
88
+ const r = el.getBoundingClientRect();
89
+ const items = el.querySelectorAll("li");
90
+ let current = "";
91
+ items.forEach((li) => {
92
+ if (li.classList.contains("wg-todo-current")) {
93
+ current = (li.textContent || "").replace(/\s+/g, " ").trim().slice(0, 48);
94
+ }
95
+ });
96
+ return {
97
+ key: el.getAttribute("data-wg-todo-key") || el.id || "?",
98
+ pos: el.dataset.pos || "?",
99
+ top: Math.round(r.top),
100
+ left: Math.round(r.left),
101
+ w: Math.round(r.width),
102
+ h: Math.round(r.height),
103
+ onScreen: r.bottom > 0 && r.right > 0 && r.top < innerHeight && r.left < innerWidth,
104
+ n: items.length,
105
+ current,
106
+ };
107
+ });
108
+ })
109
+ .catch(() => []);
110
+ }