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,58 @@
1
+ import type { MemPage } from "../../engine/mem/mem.js";
2
+ import type { SomeBlock } from "../../engine/block/block.js";
3
+ import type { DemoPace } from "../../engine/stub/pace.js";
4
+ import type { HighlightStyleDefaults } from "../../engine/stub/ring.js";
5
+ import type { StepperRefs, WgPage } from "../types.js";
6
+ import type { createOverlayStage } from "../overlay/overlay-stage.js";
7
+ import type { Gate } from "./gate.js";
8
+ import type { Pacing } from "./pacing.js";
9
+ /** A step as the stepper sees it (the runner's PlayStep). */
10
+ export interface StepperStep {
11
+ block: SomeBlock & {
12
+ description?: string;
13
+ fastForward?: boolean;
14
+ demoPace?: DemoPace;
15
+ __waygraphKind?: string;
16
+ __waygraphNavClick?: unknown;
17
+ };
18
+ episodeNumber?: number | undefined;
19
+ episodeTitle?: string | undefined;
20
+ expectedFailureReason?: string | undefined;
21
+ demoPace?: DemoPace | undefined;
22
+ highlightStyle?: HighlightStyleDefaults | undefined;
23
+ wasFastForward?: boolean | undefined;
24
+ }
25
+ /** The stepper's state for the whole run. */
26
+ export interface StepperContext {
27
+ page: WgPage;
28
+ mem: MemPage;
29
+ steps: readonly StepperStep[];
30
+ stage: ReturnType<typeof createOverlayStage>;
31
+ gate: Gate;
32
+ pacing: Pacing;
33
+ refs: StepperRefs;
34
+ title: string | undefined;
35
+ stepperMode: "full" | "carousel";
36
+ /** A title set by a stub (`ctx.title`) names the flow from that step on, until another stub sets a new one. */
37
+ stickyTitle: string | undefined;
38
+ allEpisodes: {
39
+ episodeNumber: number;
40
+ episodeTitle: string;
41
+ }[];
42
+ }
43
+ /** The current step: where it sits in its episode, and what its before panel showed. */
44
+ export interface StepView {
45
+ index: number;
46
+ step: StepperStep;
47
+ /** The breadcrumb is this step's episode ("1st of 2"), or the whole chain when there are no episodes. */
48
+ moduleNames: string[];
49
+ moduleDescriptions: string[];
50
+ moduleIndex: number;
51
+ justEnteredEpisode: boolean;
52
+ overlayTitle: string;
53
+ overlayTodoPos: string | undefined;
54
+ }
55
+ export declare function episodesOf(steps: readonly StepperStep[]): StepperContext["allEpisodes"];
56
+ export declare function viewOf(ctx: StepperContext, index: number): StepView;
57
+ /** Video and --mini get the compact pill; never false, so the person's Hide/Show choice wins otherwise. */
58
+ export declare function forceCollapsed(): true | undefined;
@@ -0,0 +1,31 @@
1
+ import { envFlag, envString } from "../../engine/env.js";
2
+ export function episodesOf(steps) {
3
+ const episodes = [];
4
+ for (const s of steps) {
5
+ if (s.episodeNumber && !episodes.some((e) => e.episodeNumber === s.episodeNumber)) {
6
+ episodes.push({ episodeNumber: s.episodeNumber, episodeTitle: s.episodeTitle ?? "" });
7
+ }
8
+ }
9
+ return episodes;
10
+ }
11
+ export function viewOf(ctx, index) {
12
+ const step = ctx.steps[index];
13
+ const indices = step.episodeNumber
14
+ ? ctx.steps.flatMap((s, i) => (s.episodeNumber === step.episodeNumber ? [i] : []))
15
+ : ctx.steps.map((_s, i) => i);
16
+ const moduleIndex = indices.indexOf(index);
17
+ return {
18
+ index,
19
+ step,
20
+ moduleNames: indices.map((i) => ctx.steps[i].block.name),
21
+ moduleDescriptions: indices.map((i) => ctx.steps[i].block.description || ""),
22
+ moduleIndex,
23
+ justEnteredEpisode: moduleIndex === 0 && step.episodeNumber !== undefined,
24
+ overlayTitle: ctx.title || "waygraph demo",
25
+ overlayTodoPos: undefined,
26
+ };
27
+ }
28
+ /** Video and --mini get the compact pill; never false, so the person's Hide/Show choice wins otherwise. */
29
+ export function forceCollapsed() {
30
+ return envString("WAYGRAPH_VIDEO") || envFlag("WAYGRAPH_MINI") ? true : undefined;
31
+ }
@@ -0,0 +1,85 @@
1
+ import type { Page } from "@playwright/test";
2
+ import type { ResolvedHighlight } from "../engine/stub/ring.js";
3
+ import type { BannerPos } from "../engine/stub/stub.js";
4
+ import type { TodoDockState, TodoDockUiResolved } from "../engine/stub/todos.js";
5
+ import type { DeviceState } from "../engine/stub/viewport.js";
6
+ export type WgPage = Page;
7
+ declare module "playwright-core" {
8
+ interface Page {
9
+ /** The recordVideo canvas size, when recording: the stage a device shell is centered in. */
10
+ __wgVideoViewport?: {
11
+ width: number;
12
+ height: number;
13
+ } | undefined;
14
+ /** Without a video, the window size at the first device switch (the stage from then on). */
15
+ __wgHeadedStage?: {
16
+ width: number;
17
+ height: number;
18
+ } | undefined;
19
+ /** The device shell's size, rebuilt after a navigation wipes it. */
20
+ __wgDeviceShell?: {
21
+ width: number;
22
+ height: number;
23
+ } | undefined;
24
+ __wgDesktopFlat?: boolean | undefined;
25
+ __wgDevicePreset?: string | undefined;
26
+ __wgDeviceOrient?: string | undefined;
27
+ /** The real setViewportSize, kept while the demo makes the page's own one do nothing. */
28
+ __wgRealSetViewportSize?: Page["setViewportSize"] | undefined;
29
+ /** The network panel's rows; the panel's DOM does not survive a navigation, this does. */
30
+ __wgNetworkHistory?: NetworkEntry[] | undefined;
31
+ __wgNetworkNeedsRestore?: boolean | undefined;
32
+ __wgNetworkCaptureInstalled?: boolean | undefined;
33
+ __wgNetworkTabVisible?: boolean | undefined;
34
+ }
35
+ interface Keyboard {
36
+ __wgBeatPatched?: boolean;
37
+ }
38
+ }
39
+ /** A value the stepper's parts share and update (the todo dock as it advances, the device, the step's rings). */
40
+ export interface Ref<T> {
41
+ current: T;
42
+ }
43
+ /** What the demo carries between a step's panels, its fill / click theater and a re-paint after navigation. */
44
+ export interface StepperRefs {
45
+ stubBefore: Ref<ResolvedHighlight[]>;
46
+ todoDock: Ref<TodoDockState | undefined>;
47
+ device: Ref<DeviceState | undefined>;
48
+ }
49
+ /** A box on the page, in CSS pixels. */
50
+ export interface WgBox {
51
+ x: number;
52
+ y: number;
53
+ width: number;
54
+ height: number;
55
+ }
56
+ /** The banner UX installOverlay takes: where it sits and how it behaves. */
57
+ export interface BannerUiState {
58
+ pos?: BannerPos;
59
+ collision?: boolean;
60
+ hidden?: boolean;
61
+ captionFadeMs?: number;
62
+ }
63
+ /** What installOverlay hands every in-page installer (inpage/*.ts) through page.evaluate; auto and pilot pass only what they use. */
64
+ export interface OverlayInstallArgs {
65
+ title?: string | undefined;
66
+ favicon?: string;
67
+ bannerPos?: BannerPos;
68
+ todoPos?: "left" | "right";
69
+ envAutoplay?: boolean;
70
+ todoDockUi?: TodoDockUiResolved;
71
+ bannerUi?: BannerUiState | null;
72
+ tag?: string;
73
+ }
74
+ /** One row of the network panel (inpage/network.ts): a page request or an API Block's call. */
75
+ export interface NetworkEntry {
76
+ method?: string | undefined;
77
+ url?: string | undefined;
78
+ status?: number | undefined;
79
+ ok?: boolean | undefined;
80
+ ms?: number | undefined;
81
+ reqHeaders?: Record<string, string> | undefined;
82
+ resHeaders?: Record<string, string> | undefined;
83
+ reqBody?: string | undefined;
84
+ resBody?: string | undefined;
85
+ }
@@ -0,0 +1,15 @@
1
+ import { envFlag } from "../engine/env.js";
2
+ /**
3
+ * One log format for the live overlay surfaces (auto / browser / pilot): `[HH:MM:SS.mmm] waygraph <surface>: ...`, the
4
+ * same shape as the demo runner's `step-mode/demo-log.ts`. Silenced by WAYGRAPH_JSON=1.
5
+ */
6
+ function ts() {
7
+ const d = new Date();
8
+ const p = (n) => String(n).padStart(2, "0");
9
+ return `${p(d.getHours())}:${p(d.getMinutes())}:${p(d.getSeconds())}.${String(d.getMilliseconds()).padStart(3, "0")}`;
10
+ }
11
+ export function verboseLog(surface, msg) {
12
+ if (envFlag("WAYGRAPH_JSON"))
13
+ return;
14
+ console.log(`[${ts()}] waygraph ${surface}: ${msg}`);
15
+ }
@@ -0,0 +1,53 @@
1
+ import type { Page } from "@playwright/test";
2
+ /**
3
+ * The `page` a regular Block's `act()` is typed against via `defineBlock` -
4
+ * structurally identical to Playwright's own `Page` (the same real object is
5
+ * passed at runtime; this is a type-only narrowing), except `goto`, `reload`,
6
+ * `goBack`, and `goForward` are re-declared under `@deprecated`. Nothing is
7
+ * blocked - every method is still fully present and callable, and this never
8
+ * causes a build to fail - but a TypeScript-aware editor shows the call
9
+ * struck through with a hover warning the instant it's typed, pointing at
10
+ * `defineNavBlock` instead. `NavBlock`'s own generated `act()` (the one place
11
+ * navigation actually belongs) uses the real `Page`, not this type - that
12
+ * distinction lives entirely inside `defineNavBlock` and never reaches a
13
+ * NavBlock's own author, who never writes its `act()` by hand.
14
+ */
15
+ import type { MemKey } from "../mem/mem.js";
16
+ export type ActionPage = Omit<Page, "goto" | "reload" | "goBack" | "goForward"> & {
17
+ /** @deprecated Navigation doesn't belong in a regular Block's act() - use defineNavBlock instead. */
18
+ goto: Page["goto"];
19
+ /** @deprecated Navigation doesn't belong in a regular Block's act() - use defineNavBlock instead. */
20
+ reload: Page["reload"];
21
+ /** @deprecated Navigation doesn't belong in a regular Block's act() - use defineNavBlock instead. */
22
+ goBack: Page["goBack"];
23
+ /** @deprecated Navigation doesn't belong in a regular Block's act() - use defineNavBlock instead. */
24
+ goForward: Page["goForward"];
25
+ };
26
+ /**
27
+ * One selectable option for a Block whose real choices depend on the live
28
+ * page - "which of these items to add to cart" is only knowable by looking
29
+ * at the DOM, not from static analysis. `waygraph auto` calls
30
+ * {@link Block.instanceOptions} while building its menu and lists one row
31
+ * per option (via `label`) instead of a single generic "block -> checkpoint"
32
+ * row; picking a row does `mem.set(key, value)` before that Block's own
33
+ * `act()` runs, so `act()` just reads mem exactly like any other required
34
+ * key - it never needs to know whether it was driven by a human-authored
35
+ * Flow or a dynamic auto-explore menu.
36
+ * @example { id: "sauce-labs-backpack", label: 'Add "Sauce Labs Backpack" to cart', key: SelectedItem.key, value: { id: "sauce-labs-backpack", name: "Sauce Labs Backpack" } }
37
+ */
38
+ export interface WaygraphInstanceOption<T = unknown> {
39
+ /** Stable id for this option - used to dedupe menu rows across rebuilds. */
40
+ id: string;
41
+ /** Shown in the menu instead of a generic "block -> checkpoint" line. */
42
+ label: string;
43
+ /** Must be one of this Block's own `requires` keys. */
44
+ key: MemKey<T>;
45
+ /** `mem.set(key, value)` right before this Block's `act()` runs. */
46
+ value: T;
47
+ /**
48
+ * Optional CSS selector for the element this option will act on.
49
+ * `waygraph auto` (headful) rings that element while the menu row is hovered
50
+ * so you can see what a pick would click before committing.
51
+ */
52
+ highlight?: string;
53
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -1,53 +1,11 @@
1
1
  import type { Page } from "@playwright/test";
2
- import type { MemPage, MemKey } from "./mem-page.js";
3
- import type { Trait } from "./trait.js";
4
- import type { HighlightStubPhaseOrFn, WaygraphHighlight, WaygraphSlidesOrFn } from "./highlights.js";
5
- export type { WaygraphHighlight } from "./highlights.js";
6
- /**
7
- * A Checkpoint is identified solely by its string tag - a phantom marker with no
8
- * embedded data. Two Checkpoints with the same tag are the same state everywhere.
9
- */
10
- export type Checkpoint<Tag extends string> = {
11
- readonly __state: Tag;
12
- };
13
- /**
14
- * Builds a Checkpoint - spells `__state` for you so no call site does it by hand.
15
- * @example resolve: () => checkpoint("LoggedIn")
16
- */
17
- export declare function checkpoint<Tag extends string>(tag: Tag): Checkpoint<Tag>;
18
- /**
19
- * The type every entry Block's `In` must be - `runGraph` always seeds a fresh
20
- * run with `checkpoint("__start__")` as the fake initial input, so a Block
21
- * meant to lead off a Flow needs exactly this type. Exported so no project
22
- * has to know or hand-type the `"__start__"` literal itself - the same reason
23
- * `checkpoint()` exists instead of every call site spelling `{ __state: tag }`
24
- * by hand.
25
- * @example export const LoginBlock: Block<Start, LoggedIn> = { ... }
26
- */
27
- export type Start = Checkpoint<"__start__">;
28
- /**
29
- * The `page` a regular Block's `act()` is typed against via `defineBlock` -
30
- * structurally identical to Playwright's own `Page` (the same real object is
31
- * passed at runtime; this is a type-only narrowing), except `goto`, `reload`,
32
- * `goBack`, and `goForward` are re-declared under `@deprecated`. Nothing is
33
- * blocked - every method is still fully present and callable, and this never
34
- * causes a build to fail - but a TypeScript-aware editor shows the call
35
- * struck through with a hover warning the instant it's typed, pointing at
36
- * `defineNavBlock` instead. `NavBlock`'s own generated `act()` (the one place
37
- * navigation actually belongs) uses the real `Page`, not this type - that
38
- * distinction lives entirely inside `defineNavBlock` and never reaches a
39
- * NavBlock's own author, who never writes its `act()` by hand.
40
- */
41
- export type ActionPage = Omit<Page, "goto" | "reload" | "goBack" | "goForward"> & {
42
- /** @deprecated Navigation doesn't belong in a regular Block's act() - use defineNavBlock instead. */
43
- goto: Page["goto"];
44
- /** @deprecated Navigation doesn't belong in a regular Block's act() - use defineNavBlock instead. */
45
- reload: Page["reload"];
46
- /** @deprecated Navigation doesn't belong in a regular Block's act() - use defineNavBlock instead. */
47
- goBack: Page["goBack"];
48
- /** @deprecated Navigation doesn't belong in a regular Block's act() - use defineNavBlock instead. */
49
- goForward: Page["goForward"];
50
- };
2
+ import type { Checkpoint } from "../checkpoint/checkpoint.js";
3
+ import type { MemKey } from "../mem/mem.js";
4
+ import { MemPage } from "../mem/mem.js";
5
+ import type { WaygraphSlidesOrFn } from "../stub/ring.js";
6
+ import type { StubLifecycleFn } from "../stub/stub.js";
7
+ import type { Trait } from "../trait/trait.js";
8
+ import type { ActionPage, WaygraphInstanceOption } from "./action-page.js";
51
9
  /**
52
10
  * The four-phase pipeline every Block runs. Most Blocks only need `act` + a
53
11
  * one-line `resolve` - add `observe` only once a Block genuinely branches, add
@@ -90,36 +48,14 @@ export interface Instruction<In extends Checkpoint<string>, Out extends Checkpoi
90
48
  */
91
49
  verify?: Trait[] | ((out: Out) => Trait[]);
92
50
  /**
93
- * Open block lifecycle **before / during** `act` (demo rings + fixtures).
94
- * Prefer `stubBefore(ctx) { ctx.todos(...); ctx.ring(...) }` — not a closed
95
- * slot object. Object map `{ email: { selector, label } }` remains a shorthand.
96
- * Flow {@link HighlightFixtureMap} still overrides ring labels.
97
- * @example stubBefore: (ctx) => {
98
- * ctx.todos(["Email", "Password", "Submit"]);
99
- * ctx.todoIndex(0);
100
- * ctx.highlights({ email: { selector: "#email", label: "Email" } });
101
- * }
102
- */
103
- stubBefore?: HighlightStubPhaseOrFn<Out>;
104
- /**
105
- * Open block lifecycle **after** resolve (step panel rings + fixtures).
106
- * Prefer `stubAfter(ctx) { ... }`. Object map shorthand still works.
107
- * Prefer this over legacy {@link Instruction.highlights}.
108
- * @example stubAfter: (ctx) => {
109
- * ctx.todoIndex(2);
110
- * ctx.ring("badge", { selector: ".cart", label: "Cart updated" });
111
- * }
51
+ * The demo's narration before the step, written by `Block.stubBefore((ctx) => ...)` where a flow uses the Block (stubs
52
+ * chained there add up). Not something to set in a Block's definition: Blocks carry no narration.
112
53
  */
113
- stubAfter?: HighlightStubPhaseOrFn<Out>;
114
- /**
115
- * Open block lifecycle when a **step throws** (failed verify / act error) -
116
- * before the error panel. Success-only {@link Instruction.stubAfter} never runs
117
- * here. Prefer `stubOnError(ctx) { ... }`.
118
- * @example stubOnError: (ctx) => {
119
- * ctx.ring("card", { selector: ".alt-1", label: "Card at failure", tag: "BUG" });
120
- * }
121
- */
122
- stubOnError?: HighlightStubPhaseOrFn<Out>;
54
+ stubBefore?: StubLifecycleFn<Out>;
55
+ /** After the step lands; written by `Block.stubAfter((ctx) => ...)`. */
56
+ stubAfter?: StubLifecycleFn<Out>;
57
+ /** When the step fails, before the failure panel; written by `Block.stubOnError((ctx) => ...)`. */
58
+ stubOnError?: StubLifecycleFn<Out>;
123
59
  /**
124
60
  * Multi-step demo captions ("yap" slides) with Next between each -
125
61
  * not block lifecycle. Explains a long process; optional `selector` rings
@@ -130,39 +66,6 @@ export interface Instruction<In extends Checkpoint<string>, Out extends Checkpoi
130
66
  * ]
131
67
  */
132
68
  slides?: WaygraphSlidesOrFn<Out>;
133
- /**
134
- * @deprecated Prefer {@link Instruction.stubAfter}. Shimmed to stubAfter keys
135
- * `"0"`, `"1"`, … when stubAfter is empty.
136
- */
137
- highlights?: readonly WaygraphHighlight[] | ((out: Out) => readonly WaygraphHighlight[]);
138
- }
139
- /**
140
- * One selectable option for a Block whose real choices depend on the live
141
- * page - "which of these items to add to cart" is only knowable by looking
142
- * at the DOM, not from static analysis. `waygraph auto` calls
143
- * {@link Block.instanceOptions} while building its menu and lists one row
144
- * per option (via `label`) instead of a single generic "block -> checkpoint"
145
- * row; picking a row does `mem.set(key, value)` before that Block's own
146
- * `act()` runs, so `act()` just reads mem exactly like any other required
147
- * key - it never needs to know whether it was driven by a human-authored
148
- * Flow or a dynamic auto-explore menu.
149
- * @example { id: "sauce-labs-backpack", label: 'Add "Sauce Labs Backpack" to cart', key: SelectedItem.key, value: { id: "sauce-labs-backpack", name: "Sauce Labs Backpack" } }
150
- */
151
- export interface WaygraphInstanceOption<T = unknown> {
152
- /** Stable id for this option - used to dedupe menu rows across rebuilds. */
153
- id: string;
154
- /** Shown in the menu instead of a generic "block -> checkpoint" line. */
155
- label: string;
156
- /** Must be one of this Block's own `requires` keys. */
157
- key: MemKey<T>;
158
- /** `mem.set(key, value)` right before this Block's `act()` runs. */
159
- value: T;
160
- /**
161
- * Optional CSS selector for the element this option will act on.
162
- * `waygraph auto` (headful) rings that element while the menu row is hovered
163
- * so you can see what a pick would click before committing.
164
- */
165
- highlight?: string;
166
69
  }
167
70
  /**
168
71
  * A Block wraps one instruction. Its Observed type is an internal detail, erased here.
@@ -200,7 +103,7 @@ export interface Block<In extends Checkpoint<string>, Out extends Checkpoint<str
200
103
  * Block, meaning "terminal after one step". Returning the Block itself is a
201
104
  * self-loop - see `runGraph`'s `maxSteps` for the safety net that needs.
202
105
  */
203
- next?(checkpoint: Out): Block<any, any> | null | undefined;
106
+ next?(checkpoint: Out): SomeBlock | null | undefined;
204
107
  /**
205
108
  * `branch()`'s routing table as plain, readable data - Checkpoint tag ->
206
109
  * target Block's `.name` (`null` for a terminal tag) - alongside {@link next}
@@ -220,12 +123,12 @@ export interface Block<In extends Checkpoint<string>, Out extends Checkpoint<str
220
123
  * `act`.
221
124
  * @example requires: [LoginCreds.key]
222
125
  */
223
- requires?: readonly MemKey<any>[];
126
+ requires?: readonly MemKey<unknown>[];
224
127
  /**
225
- * Demo pacing for this Block or compose group (`withBlockPace`).
128
+ * Demo pacing for this Block (the `{ pace }` step option).
226
129
  * Demo/step only - `runGraph` ignores. Prefer `fastForwardComposeBlock` for blitz.
227
130
  */
228
- demoPace?: import("./highlights.js").DemoPace;
131
+ demoPace?: import("../stub/pace.js").DemoPace;
229
132
  /**
230
133
  * Optional. When this Block's real choices depend on the live page
231
134
  * (which of several items to add to cart, which of several rows to
@@ -282,39 +185,96 @@ export type DefinedBlock<In extends Checkpoint<string>, Out extends Checkpoint<s
282
185
  * Overloads keep `ctx` typed when the author passes a lifecycle function
283
186
  * (a single union parameter would make the callback param `any`).
284
187
  */
285
- stubBefore(stub: import("./highlights.js").HighlightStubPhase): DefinedBlock<In, Out>;
286
- stubBefore(stub: import("./highlights.js").StubLifecycleFn<Out>): DefinedBlock<In, Out>;
188
+ stubBefore(stub: import("../stub/stub.js").StubLifecycleFn<Out>): DefinedBlock<In, Out>;
287
189
  /** Demo narration after resolve. Prefer ctx callbacks over slot-map objects. */
288
- stubAfter(stub: import("./highlights.js").HighlightStubPhase): DefinedBlock<In, Out>;
289
- stubAfter(stub: import("./highlights.js").StubLifecycleFn<Out>): DefinedBlock<In, Out>;
190
+ stubAfter(stub: import("../stub/stub.js").StubLifecycleFn<Out>): DefinedBlock<In, Out>;
290
191
  /** Demo narration when the step fails / expected-failure path. */
291
- stubOnError(stub: import("./highlights.js").HighlightStubPhase): DefinedBlock<In, Out>;
292
- stubOnError(stub: import("./highlights.js").StubLifecycleFn<Out>): DefinedBlock<In, Out>;
192
+ stubOnError(stub: import("../stub/stub.js").StubLifecycleFn<Out>): DefinedBlock<In, Out>;
293
193
  };
294
194
  /**
295
- * Structural (not imported) twin of `engine.ts`'s `Layout` - `types.ts` sits
296
- * below `engine.ts` in the module graph, so it can't import `Layout` without
297
- * a cycle. Same shape, matched by TypeScript's structural typing: any real
298
- * `Layout` satisfies this with no cast needed at the `connect()` call site.
195
+ * Any Block, whatever its route. A Block takes its `In` Checkpoint as a callback argument, so it is contravariant in `In`
196
+ * and no one Checkpoint type covers every Block: `any` is that "some Block", written once here.
197
+ */
198
+ export type SomeBlock = Block<any, any>;
199
+ /** The Checkpoint a Block resolves to. */
200
+ type BlockOut<B> = B extends Block<infer _In, infer Out> ? Out : never;
201
+ /** Any {@link DefinedBlock} (see {@link SomeBlock}). */
202
+ export type SomeDefinedBlock = DefinedBlock<any, any>;
203
+ export declare function findBlockIndex(middle: readonly SomeBlock[], block: SomeBlock | string | number): number;
204
+ /**
205
+ * Strips `withVerify`/`modVerify`/`modVerifyAll` off a Block, keeping everything
206
+ * else - `name`, `instruction`, `next`, `requires`. Every function below that
207
+ * returns a new Block calls this on its input first, then rebuilds through
208
+ * `defineBlock`. Without it, a Block's attached methods close over the shape it
209
+ * had *when they were attached* - call `.withVerify()` on a Block that
210
+ * `branch()` added routing to afterward, and without this step the result would
211
+ * silently drop that routing, since the stale closure never knew about it.
299
212
  */
300
- export interface ConnectLayout {
213
+ export declare function stripMethods<In extends Checkpoint<string>, Out extends Checkpoint<string>>(block: Block<In, Out>): {
301
214
  name: string;
302
- appliesTo: (tag: string) => boolean;
303
- verify: Trait[] | ((out: any) => Trait[]);
304
- }
215
+ description?: Block<In, Out>["description"];
216
+ instruction: Block<In, Out>["instruction"];
217
+ next?: Block<In, Out>["next"];
218
+ requires?: Block<In, Out>["requires"];
219
+ routes?: Block<In, Out>["routes"];
220
+ instanceOptions?: Block<In, Out>["instanceOptions"];
221
+ };
222
+ /** Copy non-enumerable waygraph markers so decorate/withVerify keep map() kind checks. */
223
+ export declare function copyWaygraphRuntime(from: object, to: object): void;
224
+ /**
225
+ * Builds a Block with `withVerify`/`modVerify`/`modVerifyAll` attached as
226
+ * methods - `LoginBlock.withVerify([...])`, discoverable by typing
227
+ * `LoginBlock.` in an editor, not just callable as `withVerify(LoginBlock, ...)`
228
+ * if you already know it exists. A raw object literal is still a perfectly
229
+ * valid Block (every test fixture in this codebase is one) - it just won't have
230
+ * these attached. The methods are thin: they delegate to the identically-named
231
+ * free functions, which remain the one place this logic actually lives.
232
+ */
233
+ export declare function defineBlock<In extends Checkpoint<string>, Out extends Checkpoint<string>>(base: {
234
+ name: string;
235
+ description?: Block<In, Out>["description"];
236
+ instruction: Omit<Instruction<In, Out, any>, "act"> & {
237
+ act(page: ActionPage, input: In, mem: MemPage): Promise<void>;
238
+ };
239
+ next?: Block<In, Out>["next"];
240
+ requires?: Block<In, Out>["requires"];
241
+ routes?: Block<In, Out>["routes"];
242
+ instanceOptions?: Block<In, Out>["instanceOptions"];
243
+ }): DefinedBlock<In, Out>;
305
244
  /**
306
- * Composes two Blocks into one, typechecked so this only compiles when A's output
307
- * tag equals B's input tag. The composed Block's act runs A's full instruction
308
- * (act -> observe? -> resolve) then hands the resulting Checkpoint into B's act;
309
- * its own observe/resolve are simply B's, since B is what decides the final Out.
245
+ * Returns a new Block that runs exactly like `block` - same act/observe/resolve,
246
+ * same routing - but with `verify` replaced. For giving one flow stricter (or
247
+ * looser, or just different) confirmation on a Block it didn't author, without
248
+ * that Block needing to have been written as a parameterized factory in
249
+ * anticipation. Same move as `branch()`: decorate an existing Block, don't ask
250
+ * every Block to pre-build its own override mechanism.
310
251
  *
311
- * `layouts`, if given, also runs against the intermediate Checkpoint (A's
312
- * resolved output, right before B's act) - the same enforcement `runGraph`'s
313
- * own loop already applies to a chain's FINAL Checkpoint, but a
314
- * `defineFlow`-built Flow never reaches that loop per-hop: `buildFlow`
315
- * reduces the whole Block array into one `connect()`-composed super-Block, so
316
- * every intermediate hop's verify (and now layout) has to run HERE, inside
317
- * this recursive `act`, not in `runGraph`'s loop, which only ever sees the
318
- * one composed Block run start to finish.
252
+ * Wrap the one Block you want to change, in place, where a flow uses it:
253
+ * `map().gotoPage(NavLoginBlock).method(withVerify(AddToCartBlock, [...]))`.
254
+ */
255
+ export declare function withVerify<B extends SomeBlock>(block: B, verify: Trait[] | ((out: BlockOut<B>) => Trait[])): B;
256
+ /**
257
+ * Replaces one Trait inside `block`'s verify list, leaving every other check
258
+ * untouched - the v1/v2/legacy-variant case, where one check needs a different
259
+ * selector or URL pattern but the rest of the Block is identical. Addressed by
260
+ * the Trait's own `name` (recommended - inserting or reordering other checks
261
+ * can't silently retarget it) or, if you genuinely know the position and don't
262
+ * need that safety, a numeric index. Either way a bad address fails loud
263
+ * immediately instead of quietly doing nothing. `newCheck` can be a bare
264
+ * `check` function (keeps the existing name) or a full `Trait` (to rename too).
265
+ * Only works on a flat `verify` array - a function-form `verify` (from
266
+ * `verify: (out) => Trait[]`) has no fixed list to address into, so this
267
+ * throws rather than guess; use `withVerify` to replace it wholesale instead.
268
+ */
269
+ export declare function modVerify<In extends Checkpoint<string>, Out extends Checkpoint<string>>(block: Block<In, Out>, nameOrIndex: string | number, newCheck: Trait["check"] | Trait): DefinedBlock<In, Out>;
270
+ /**
271
+ * `modVerify`, but for several named checks in one call - a v2 variant that
272
+ * differs in five ways from v1 shouldn't need five nested `modVerify(modVerify(
273
+ * modVerify(...)))` calls to track by eye. `patches` keys are plain strings (a
274
+ * Trait's `name`, not a `MemKey` instance), so an ordinary object literal is
275
+ * fine here - unlike `MemPage`, there's no identity-collision reason to need
276
+ * `[name, check]` pairs. Applies each patch in turn via `modVerify`, so the
277
+ * same fail-loud-on-unknown-name behavior holds for every entry.
319
278
  */
320
- export declare function connect<A extends Checkpoint<string>, B extends Checkpoint<string>, C extends Checkpoint<string>>(a: Block<A, B>, b: Block<B, C>, layouts?: readonly ConnectLayout[]): Block<A, C>;
279
+ export declare function modVerifyAll<In extends Checkpoint<string>, Out extends Checkpoint<string>>(block: Block<In, Out>, patches: Record<string, Trait["check"] | Trait>): DefinedBlock<In, Out>;
280
+ export {};