waygraph 0.15.54 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (510) hide show
  1. package/README.md +8 -3
  2. package/bin/waygraph +2 -2
  3. package/dist/analysis/check.d.ts +38 -0
  4. package/dist/analysis/check.js +87 -0
  5. package/dist/analysis/coverage-gap.d.ts +1 -1
  6. package/dist/analysis/coverage-gap.js +14 -37
  7. package/dist/analysis/flow-source.d.ts +9 -0
  8. package/dist/analysis/flow-source.js +25 -0
  9. package/dist/analysis/graph.d.ts +10 -14
  10. package/dist/analysis/graph.js +48 -371
  11. package/dist/analysis/map-check.js +4 -39
  12. package/dist/analysis/practices-check.d.ts +1 -1
  13. package/dist/analysis/practices-check.js +24 -45
  14. package/dist/cli/args.d.ts +23 -0
  15. package/dist/cli/args.js +20 -0
  16. package/dist/{cli.d.ts → cli/cli.d.ts} +0 -1
  17. package/dist/{cli.js → cli/cli.js} +10 -9
  18. package/dist/{commands → cli/commands}/agent-dive-scaffold.js +35 -64
  19. package/dist/cli/commands/agent-dive.js +42 -0
  20. package/dist/{commands → cli/commands}/check.d.ts +0 -1
  21. package/dist/cli/commands/check.js +104 -0
  22. package/dist/cli/commands/codemod-checkpoints.d.ts +18 -0
  23. package/dist/cli/commands/codemod-checkpoints.js +186 -0
  24. package/dist/cli/commands/codemod-flows.d.ts +18 -0
  25. package/dist/cli/commands/codemod-flows.js +284 -0
  26. package/dist/cli/commands/codemod-stubs.d.ts +10 -0
  27. package/dist/cli/commands/codemod-stubs.js +187 -0
  28. package/dist/{commands → cli/commands}/extensions.js +5 -4
  29. package/dist/{commands → cli/commands}/init.js +1 -2
  30. package/dist/{commands → cli/commands}/list.js +9 -7
  31. package/dist/cli/commands/manifest.d.ts +2 -0
  32. package/dist/cli/commands/manifest.js +20 -0
  33. package/dist/cli/commands/map.js +57 -0
  34. package/dist/{commands → cli/commands}/run.d.ts +0 -1
  35. package/dist/cli/commands/run.js +64 -0
  36. package/dist/{commands → cli/commands}/session.js +61 -88
  37. package/dist/{commands → cli/commands}/test.js +11 -14
  38. package/dist/cli/commands/traverse.js +105 -0
  39. package/dist/{commands → cli/commands}/try.js +29 -25
  40. package/dist/{commands → cli/commands}/upgrade.js +40 -4
  41. package/dist/cli/flags.d.ts +193 -16
  42. package/dist/cli/flags.js +179 -234
  43. package/dist/cli/run-chain.d.ts +1 -0
  44. package/dist/cli/run-chain.js +42 -7
  45. package/dist/cli/usage.d.ts +1 -1
  46. package/dist/cli/usage.js +21 -53
  47. package/dist/cli/util.d.ts +2 -2
  48. package/dist/cli/util.js +2 -3
  49. package/dist/{highlights → demo/narration}/css.d.ts +1 -1
  50. package/dist/{highlights → demo/narration}/css.js +2 -3
  51. package/dist/{highlights → demo/narration}/demo-pace.d.ts +3 -11
  52. package/dist/{highlights → demo/narration}/demo-pace.js +5 -11
  53. package/dist/{highlights → demo/narration}/device.d.ts +2 -2
  54. package/dist/{highlights → demo/narration}/device.js +1 -1
  55. package/dist/demo/narration/merge.d.ts +8 -0
  56. package/dist/demo/narration/merge.js +71 -0
  57. package/dist/{highlights/run-phase.d.ts → demo/narration/narration.d.ts} +10 -14
  58. package/dist/{highlights/run-phase.js → demo/narration/narration.js} +25 -94
  59. package/dist/{highlights → demo/narration}/shorthand.d.ts +1 -1
  60. package/dist/demo/narration/stub-ctx.d.ts +8 -0
  61. package/dist/demo/narration/stub-ctx.js +164 -0
  62. package/dist/{highlights → demo/narration}/style.d.ts +1 -7
  63. package/dist/{highlights → demo/narration}/style.js +1 -41
  64. package/dist/{highlights → demo/narration}/todo-dock.d.ts +3 -3
  65. package/dist/{highlights → demo/narration}/todo-dock.js +13 -30
  66. package/dist/demo/overlay/auto-chrome.d.ts +7 -0
  67. package/dist/demo/overlay/auto-chrome.js +97 -0
  68. package/dist/demo/overlay/cursor.d.ts +12 -0
  69. package/dist/demo/overlay/cursor.js +142 -0
  70. package/dist/demo/overlay/device-stage.d.ts +13 -0
  71. package/dist/demo/overlay/device-stage.js +396 -0
  72. package/dist/demo/overlay/inpage/banner.d.ts +1 -0
  73. package/dist/demo/overlay/inpage/banner.js +160 -0
  74. package/dist/demo/overlay/inpage/caption.d.ts +2 -0
  75. package/dist/demo/overlay/inpage/caption.js +24 -0
  76. package/dist/demo/overlay/inpage/core.d.ts +1 -0
  77. package/dist/demo/overlay/inpage/core.js +345 -0
  78. package/dist/demo/overlay/inpage/device-chip.d.ts +1 -0
  79. package/dist/demo/overlay/inpage/device-chip.js +191 -0
  80. package/dist/demo/overlay/inpage/network.d.ts +9 -0
  81. package/dist/demo/overlay/inpage/network.js +200 -0
  82. package/dist/demo/overlay/inpage/panel-chrome.d.ts +1 -0
  83. package/dist/demo/overlay/inpage/panel-chrome.js +203 -0
  84. package/dist/demo/overlay/inpage/stamp.d.ts +1 -0
  85. package/dist/demo/overlay/inpage/stamp.js +46 -0
  86. package/dist/demo/overlay/inpage/swipe-zoom.d.ts +1 -0
  87. package/dist/demo/overlay/inpage/swipe-zoom.js +220 -0
  88. package/dist/demo/overlay/inpage/todos.d.ts +1 -0
  89. package/dist/demo/overlay/inpage/todos.js +294 -0
  90. package/dist/demo/overlay/locator-theater.d.ts +25 -0
  91. package/dist/demo/overlay/locator-theater.js +76 -0
  92. package/dist/demo/overlay/network-capture.d.ts +22 -0
  93. package/dist/demo/overlay/network-capture.js +127 -0
  94. package/dist/demo/overlay/overlay-css.d.ts +3 -0
  95. package/dist/demo/overlay/overlay-css.js +369 -0
  96. package/dist/demo/overlay/overlay-stage.d.ts +23 -0
  97. package/dist/demo/overlay/overlay-stage.js +106 -0
  98. package/dist/demo/overlay/overlay.d.ts +10 -0
  99. package/dist/demo/overlay/overlay.js +89 -0
  100. package/dist/{pilot-overlay/overlay-fixtures.d.ts → demo/overlay/phase-fixtures.d.ts} +2 -2
  101. package/dist/{pilot-overlay/overlay-fixtures.js → demo/overlay/phase-fixtures.js} +2 -2
  102. package/dist/{pilot-overlay/action-ring.js → demo/overlay/pilot/actions.js} +2 -1
  103. package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.d.ts +6 -5
  104. package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.js +19 -18
  105. package/dist/{pilot-overlay → demo/overlay/pilot}/shell.d.ts +2 -2
  106. package/dist/{pilot-overlay → demo/overlay/pilot}/shell.js +13 -22
  107. package/dist/demo/overlay/reattach.d.ts +7 -0
  108. package/dist/demo/overlay/reattach.js +23 -0
  109. package/dist/demo/overlay/rings.d.ts +33 -0
  110. package/dist/demo/overlay/rings.js +448 -0
  111. package/dist/{ui → demo/overlay/ui}/components/ring.js +2 -2
  112. package/dist/{ui → demo/overlay/ui}/overlay.css +4 -4
  113. package/dist/{ui → demo/overlay/ui}/shadow.d.ts +1 -1
  114. package/dist/{ui → demo/overlay/ui}/shadow.js +39 -2
  115. package/dist/demo/stepper/after.d.ts +3 -0
  116. package/dist/demo/stepper/after.js +113 -0
  117. package/dist/demo/stepper/banner-log.d.ts +37 -0
  118. package/dist/demo/stepper/banner-log.js +63 -0
  119. package/dist/demo/stepper/before.d.ts +4 -0
  120. package/dist/demo/stepper/before.js +110 -0
  121. package/dist/demo/stepper/demo-log.d.ts +31 -0
  122. package/dist/demo/stepper/demo-log.js +309 -0
  123. package/dist/demo/stepper/gate.d.ts +11 -0
  124. package/dist/demo/stepper/gate.js +78 -0
  125. package/dist/demo/stepper/interaction-patch.d.ts +3 -0
  126. package/dist/demo/stepper/interaction-patch.js +323 -0
  127. package/dist/demo/stepper/pacing.d.ts +21 -0
  128. package/dist/demo/stepper/pacing.js +23 -0
  129. package/dist/demo/stepper/slides.d.ts +11 -0
  130. package/dist/demo/stepper/slides.js +233 -0
  131. package/dist/demo/stepper/step-panels.d.ts +21 -0
  132. package/dist/demo/stepper/step-panels.js +589 -0
  133. package/dist/demo/stepper/stepper.d.ts +24 -0
  134. package/dist/demo/stepper/stepper.js +122 -0
  135. package/dist/demo/stepper/teardown.d.ts +48 -0
  136. package/dist/demo/stepper/teardown.js +179 -0
  137. package/dist/demo/stepper/todo-advance.d.ts +14 -0
  138. package/dist/demo/stepper/todo-advance.js +110 -0
  139. package/dist/demo/stepper/view.d.ts +68 -0
  140. package/dist/demo/stepper/view.js +31 -0
  141. package/dist/demo/types.d.ts +17 -0
  142. package/dist/demo/verbose-log.js +15 -0
  143. package/dist/{types.d.ts → engine/block/block.d.ts} +106 -91
  144. package/dist/{core → engine/block}/block.js +10 -53
  145. package/dist/{core → engine/block}/compose.d.ts +9 -7
  146. package/dist/{core → engine/block}/compose.js +1 -1
  147. package/dist/{core/blocks → engine/block/kinds}/api.d.ts +16 -12
  148. package/dist/{core/blocks → engine/block/kinds}/api.js +26 -18
  149. package/dist/{core/blocks → engine/block/kinds}/effect.d.ts +13 -18
  150. package/dist/engine/block/kinds/effect.js +17 -0
  151. package/dist/{core/blocks → engine/block/kinds}/method.d.ts +17 -29
  152. package/dist/{core/blocks → engine/block/kinds}/method.js +6 -21
  153. package/dist/{core/blocks → engine/block/kinds}/nav.d.ts +21 -31
  154. package/dist/{core/blocks → engine/block/kinds}/nav.js +6 -12
  155. package/dist/{core/blocks → engine/block/kinds}/page.d.ts +14 -20
  156. package/dist/{core/blocks → engine/block/kinds}/page.js +5 -7
  157. package/dist/engine/checkpoint/checkpoint.d.ts +22 -0
  158. package/dist/engine/checkpoint/checkpoint.js +8 -0
  159. package/dist/engine/checkpoint/route.d.ts +28 -0
  160. package/dist/engine/checkpoint/route.js +28 -0
  161. package/dist/{core → engine}/config.d.ts +7 -2
  162. package/dist/engine/config.js +6 -0
  163. package/dist/engine/engine.d.ts +45 -0
  164. package/dist/{core → engine}/engine.js +6 -10
  165. package/dist/engine/env.d.ts +59 -0
  166. package/dist/engine/env.js +83 -0
  167. package/dist/{errors.d.ts → engine/errors.d.ts} +22 -22
  168. package/dist/{errors.js → engine/errors.js} +22 -22
  169. package/dist/{core → engine/flow}/branch-regression.d.ts +7 -7
  170. package/dist/{core → engine/flow}/branch-regression.js +4 -3
  171. package/dist/engine/flow/flow.d.ts +162 -0
  172. package/dist/engine/flow/flow.js +244 -0
  173. package/dist/{core → engine/flow}/map-builder.d.ts +34 -39
  174. package/dist/{core → engine/flow}/map-builder.js +45 -47
  175. package/dist/{core → engine}/locate.d.ts +1 -1
  176. package/dist/{core → engine}/locate.js +1 -2
  177. package/dist/{mem-stub.d.ts → engine/mem/mem-stub.d.ts} +9 -8
  178. package/dist/{mem-stub.js → engine/mem/mem-stub.js} +2 -2
  179. package/dist/{mem-page.d.ts → engine/mem/mem.d.ts} +1 -1
  180. package/dist/{mem-page.js → engine/mem/mem.js} +2 -1
  181. package/dist/engine/page-gone.d.ts +5 -0
  182. package/dist/engine/page-gone.js +20 -0
  183. package/dist/engine/run/connect.d.ts +28 -0
  184. package/dist/{types.js → engine/run/connect.js} +11 -10
  185. package/dist/engine/run/events.d.ts +67 -0
  186. package/dist/engine/run/events.js +90 -0
  187. package/dist/engine/run/hooks.d.ts +16 -0
  188. package/dist/engine/run/hooks.js +8 -0
  189. package/dist/engine/run/launch.d.ts +13 -0
  190. package/dist/engine/run/launch.js +27 -0
  191. package/dist/{core/run-graph.d.ts → engine/run/run.d.ts} +8 -12
  192. package/dist/{core/run-graph.js → engine/run/run.js} +22 -12
  193. package/dist/engine/stub/pace.d.ts +12 -0
  194. package/dist/engine/stub/pace.js +2 -0
  195. package/dist/engine/stub/ring.d.ts +130 -0
  196. package/dist/engine/stub/ring.js +41 -0
  197. package/dist/engine/stub/stub.d.ts +268 -0
  198. package/dist/engine/stub/stub.js +1 -0
  199. package/dist/engine/stub/todos.d.ts +104 -0
  200. package/dist/engine/stub/todos.js +2 -0
  201. package/dist/engine/stub/viewport.d.ts +26 -0
  202. package/dist/engine/stub/viewport.js +2 -0
  203. package/dist/{trait.d.ts → engine/trait/trait.d.ts} +1 -1
  204. package/dist/index.d.ts +84 -36
  205. package/dist/index.js +44 -19
  206. package/dist/{session/auto-explore-run.d.ts → live/auto/auto.d.ts} +10 -16
  207. package/dist/{session/auto-explore-run.js → live/auto/auto.js} +164 -254
  208. package/dist/{session/auto-explore.d.ts → live/auto/explore.d.ts} +4 -14
  209. package/dist/{session/auto-explore.js → live/auto/explore.js} +21 -127
  210. package/dist/{auto-session/session.d.ts → live/auto-session/auto-session.d.ts} +1 -1
  211. package/dist/{auto-session/session.js → live/auto-session/auto-session.js} +27 -24
  212. package/dist/{auto-session → live/auto-session}/helpers.d.ts +6 -5
  213. package/dist/{auto-session → live/auto-session}/helpers.js +1 -1
  214. package/dist/{session/auto-session-ipc.d.ts → live/auto-session/ipc.d.ts} +7 -5
  215. package/dist/{session/auto-session-ipc.js → live/auto-session/ipc.js} +31 -16
  216. package/dist/{session/browser.d.ts → live/auto-session/start.d.ts} +1 -2
  217. package/dist/{session/browser.js → live/auto-session/start.js} +2 -3
  218. package/dist/{pilot-overlay → live/pilot}/panel.d.ts +1 -1
  219. package/dist/{pilot-overlay → live/pilot}/panel.js +23 -31
  220. package/dist/{session → live/pilot}/pilot.d.ts +3 -3
  221. package/dist/{session → live/pilot}/pilot.js +4 -4
  222. package/dist/{traverse/run.d.ts → live/traverse/traverse.d.ts} +1 -1
  223. package/dist/{traverse/run.js → live/traverse/traverse.js} +26 -43
  224. package/dist/manifest/manifest.d.ts +52 -0
  225. package/dist/manifest/manifest.js +93 -0
  226. package/dist/manifest/map-imports.d.ts +7 -0
  227. package/dist/manifest/map-imports.js +22 -0
  228. package/dist/manifest/maps.d.ts +33 -0
  229. package/dist/manifest/maps.js +62 -0
  230. package/dist/manifest/pack.d.ts +21 -0
  231. package/dist/manifest/pack.js +109 -0
  232. package/dist/manifest/project.d.ts +60 -0
  233. package/dist/manifest/project.js +101 -0
  234. package/dist/{session/block-inject.js → manifest/roots.js} +1 -18
  235. package/dist/manifest/scan.d.ts +19 -0
  236. package/dist/manifest/scan.js +57 -0
  237. package/dist/manifest/source.d.ts +23 -0
  238. package/dist/manifest/source.js +86 -0
  239. package/dist/runner/mode.d.ts +71 -0
  240. package/dist/runner/mode.js +1 -0
  241. package/dist/runner/modes/branches.d.ts +5 -0
  242. package/dist/runner/modes/branches.js +37 -0
  243. package/dist/runner/modes/demo.d.ts +3 -0
  244. package/dist/runner/modes/demo.js +13 -0
  245. package/dist/runner/modes/report.d.ts +2 -0
  246. package/dist/runner/modes/report.js +54 -0
  247. package/dist/runner/modes/run.d.ts +2 -0
  248. package/dist/runner/modes/run.js +3 -0
  249. package/dist/runner/options.d.ts +31 -0
  250. package/dist/runner/options.js +42 -0
  251. package/dist/runner/plan/find.d.ts +18 -0
  252. package/dist/runner/plan/find.js +65 -0
  253. package/dist/runner/plan/plan.d.ts +11 -0
  254. package/dist/runner/plan/plan.js +97 -0
  255. package/dist/runner/plan/seed-mem.d.ts +12 -0
  256. package/dist/runner/plan/seed-mem.js +98 -0
  257. package/dist/runner/plan/spec.d.ts +5 -0
  258. package/dist/runner/plan/spec.js +17 -0
  259. package/dist/runner/play-steps.d.ts +2 -0
  260. package/dist/runner/play-steps.js +59 -0
  261. package/dist/runner/runner.d.ts +4 -0
  262. package/dist/runner/runner.js +64 -0
  263. package/dist/runner/session.d.ts +9 -0
  264. package/dist/runner/session.js +87 -0
  265. package/dist/{browser.js → runtime/browser.js} +4 -2
  266. package/dist/{env-file.js → runtime/env-file.js} +7 -12
  267. package/dist/{extensions.d.ts → runtime/extensions.d.ts} +1 -5
  268. package/dist/{extensions.js → runtime/extensions.js} +2 -1
  269. package/dist/runtime/full-launch.d.ts +1 -0
  270. package/dist/runtime/full-launch.js +34 -0
  271. package/dist/runtime/global-flag.d.ts +5 -0
  272. package/dist/runtime/global-flag.js +18 -0
  273. package/dist/{playwright-config.d.ts → runtime/playwright-config.d.ts} +1 -1
  274. package/dist/{playwright.config.js → runtime/playwright.config.js} +3 -2
  275. package/dist/runtime/run-log.d.ts +2 -0
  276. package/dist/runtime/run-log.js +17 -0
  277. package/dist/{video-dir.js → runtime/video-dir.js} +3 -2
  278. package/dist/{config.d.ts → runtime/waygraph-config.d.ts} +6 -9
  279. package/dist/{config.js → runtime/waygraph-config.js} +21 -51
  280. package/dist/{webserver.js → runtime/webserver.js} +5 -30
  281. package/examples/routed-demo/config/waygraph.config.ts +20 -0
  282. package/examples/routed-demo/package.json +1 -4
  283. package/examples/routed-demo/scripts/fixture-server.mjs +1 -1
  284. package/examples/routed-demo/src/flows/routed-demo-map.flow.ts +2 -4
  285. package/examples/routed-demo/src/flows/routed-demo.flow.ts +1 -2
  286. package/examples/routed-demo/src/map/(app_base)/dashboard/_methods/click-widget.block.ts +5 -4
  287. package/examples/routed-demo/src/map/(app_base)/dashboard/_nav.block.ts +3 -3
  288. package/examples/routed-demo/src/map/(app_base)/dashboard/_page.block.ts +3 -3
  289. package/examples/routed-demo/src/map/(external)/docs/_nav.block.ts +3 -3
  290. package/examples/routed-demo/src/map/(external)/docs/_page.block.ts +3 -3
  291. package/examples/routed-demo/src/states/routed-demo.states.ts +5 -3
  292. package/examples/routed-demo/tests/routed-demo.spec.ts +4 -4
  293. package/examples/routed-demo/tsconfig.json +1 -1
  294. package/examples/saucedemo/docs/CONVENTION.md +4 -5
  295. package/examples/saucedemo/docs/HELPERS.md +11 -11
  296. package/examples/saucedemo/src/blocks/SITE-MAP.md +0 -1
  297. package/examples/saucedemo/src/blocks/saucedemo-web/NAV.md +1 -5
  298. package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -3
  299. package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
  300. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
  301. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
  302. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
  303. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
  304. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +5 -8
  305. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -3
  306. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
  307. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +35 -43
  308. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
  309. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
  310. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
  311. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
  312. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
  313. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
  314. package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -4
  315. package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -4
  316. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +4 -5
  317. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
  318. package/examples/saucedemo/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
  319. package/examples/saucedemo/src/flows/api-demo.flow.ts +12 -10
  320. package/examples/saucedemo/src/states/checkout.states.ts +21 -11
  321. package/examples/saucedemo/src/stubs/device-showcase.ts +8 -10
  322. package/examples/saucedemo/tests/auto-graph.spec.ts +4 -12
  323. package/package.json +10 -6
  324. package/templates/agents/waygraph-planner.agent.md +2 -2
  325. package/templates/quickstart/docs/CONVENTION.md +4 -4
  326. package/templates/quickstart/docs/HELPERS.md +10 -8
  327. package/templates/quickstart/package.json +0 -3
  328. package/templates/quickstart/src/blocks/SITE-MAP.md +0 -1
  329. package/templates/quickstart/src/blocks/saucedemo-web/NAV.md +1 -5
  330. package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -3
  331. package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
  332. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
  333. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
  334. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
  335. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
  336. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +5 -8
  337. package/templates/quickstart/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -3
  338. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
  339. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +35 -43
  340. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
  341. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
  342. package/templates/quickstart/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
  343. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
  344. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
  345. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
  346. package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -4
  347. package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -4
  348. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +4 -5
  349. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
  350. package/templates/quickstart/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
  351. package/templates/quickstart/src/flows/api-demo.flow.ts +12 -10
  352. package/templates/quickstart/src/states/checkout.states.ts +21 -11
  353. package/templates/quickstart/src/stubs/device-showcase.ts +8 -10
  354. package/templates/scaffold/README.md +2 -1
  355. package/templates/scaffold/STRUCTURE.md +5 -4
  356. package/templates/scaffold/config/waygraph.config.ts +1 -0
  357. package/templates/scaffold/gitignore +1 -0
  358. package/templates/scaffold/src/flows/README.md +2 -2
  359. package/templates/scaffold/src/map/(app_base)/docs/_nav.block.ts +3 -3
  360. package/templates/scaffold/src/map/(app_base)/docs/_page.block.ts +3 -3
  361. package/templates/scaffold/src/map/(app_base)/home/_methods/add-item.effect.block.ts +4 -4
  362. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-hello.method.block.ts +3 -3
  363. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-item-added.method.block.ts +3 -3
  364. package/templates/scaffold/src/map/(app_base)/home/_methods/clear-cart.method.block.ts +5 -4
  365. package/templates/scaffold/src/map/(app_base)/home/_methods/remove-item.effect.block.ts +4 -4
  366. package/templates/scaffold/src/map/(app_base)/home/_nav.block.ts +3 -3
  367. package/templates/scaffold/src/map/(app_base)/home/_page.block.ts +3 -3
  368. package/templates/scaffold/src/map/(app_base)/home/nav-verification-link.block.ts +4 -4
  369. package/templates/scaffold/src/map/(external)/hoppscotch/_keys.ts +21 -0
  370. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-body.method.block.ts +4 -4
  371. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-header.method.block.ts +4 -4
  372. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-status.method.block.ts +4 -4
  373. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/pick-extension-interceptor.method.block.ts +5 -4
  374. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-body.method.block.ts +6 -5
  375. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-headers.method.block.ts +6 -5
  376. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/send-request.method.block.ts +5 -4
  377. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-bearer-token.method.block.ts +6 -5
  378. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-headers.method.block.ts +6 -5
  379. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-json-body.method.block.ts +6 -5
  380. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-method.method.block.ts +6 -5
  381. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-query-params.method.block.ts +6 -5
  382. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-url.method.block.ts +6 -5
  383. package/templates/scaffold/src/map/(external)/hoppscotch/_nav.block.ts +3 -3
  384. package/templates/scaffold/src/map/(external)/hoppscotch/_page.block.ts +3 -3
  385. package/templates/scaffold/src/map/(external)/hoppscotch/_states.ts +6 -0
  386. package/templates/scaffold/src/map/(external)/hoppscotch/settings/_nav.block.ts +3 -3
  387. package/templates/scaffold/src/map/(external)/mailpit/_keys.ts +13 -0
  388. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-content.method.block.ts +4 -4
  389. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-received.method.block.ts +4 -4
  390. package/templates/scaffold/src/map/(external)/mailpit/_methods/extract-email-link.method.block.ts +6 -5
  391. package/templates/scaffold/src/map/(external)/mailpit/_methods/open-message.method.block.ts +6 -5
  392. package/templates/scaffold/src/map/(external)/mailpit/_nav.block.ts +3 -3
  393. package/templates/scaffold/src/map/(external)/mailpit/_page.block.ts +3 -3
  394. package/templates/scaffold/src/map/(external)/mailpit/_states.ts +9 -0
  395. package/templates/scaffold/src/map/README.md +7 -0
  396. package/templates/scaffold/src/states/README.md +4 -1
  397. package/templates/scaffold/src/states/demo.mem-keys.ts +1 -29
  398. package/templates/scaffold/src/states/demo.states.ts +14 -20
  399. package/templates/scaffold/tests/hoppscotch.spec.ts +1 -11
  400. package/templates/scaffold/tests/mail-verify.spec.ts +2 -2
  401. package/templates/skills/waygraph-blind-pilot.skill.md +2 -6
  402. package/templates/skills/waygraph-convention.skill.md +23 -14
  403. package/templates/skills/waygraph-pilot.skill.md +7 -4
  404. package/dist/auto-session/verbose-log.js +0 -16
  405. package/dist/auto-session.d.ts +0 -2
  406. package/dist/auto-session.js +0 -3
  407. package/dist/cli/discover.d.ts +0 -40
  408. package/dist/cli/discover.js +0 -148
  409. package/dist/commands/agent-dive.js +0 -52
  410. package/dist/commands/check.js +0 -192
  411. package/dist/commands/map.js +0 -29
  412. package/dist/commands/run.js +0 -104
  413. package/dist/commands/traverse.js +0 -177
  414. package/dist/core/block.d.ts +0 -109
  415. package/dist/core/blocks/effect.js +0 -23
  416. package/dist/core/config.js +0 -17
  417. package/dist/core/engine.d.ts +0 -198
  418. package/dist/core/flow.d.ts +0 -294
  419. package/dist/core/flow.js +0 -432
  420. package/dist/core.d.ts +0 -14
  421. package/dist/core.js +0 -15
  422. package/dist/highlights/merge.d.ts +0 -8
  423. package/dist/highlights/merge.js +0 -173
  424. package/dist/highlights/stub-ctx.d.ts +0 -10
  425. package/dist/highlights/stub-ctx.js +0 -331
  426. package/dist/highlights/types.d.ts +0 -613
  427. package/dist/highlights.d.ts +0 -9
  428. package/dist/highlights.js +0 -10
  429. package/dist/pilot-overlay.d.ts +0 -5
  430. package/dist/pilot-overlay.js +0 -6
  431. package/dist/runner/banner-log.js +0 -63
  432. package/dist/runner/chain-run.js +0 -102
  433. package/dist/runner/cursor.js +0 -140
  434. package/dist/runner/demo-log.js +0 -316
  435. package/dist/runner/device-stage.d.ts +0 -9
  436. package/dist/runner/device-stage.js +0 -420
  437. package/dist/runner/discovery.js +0 -105
  438. package/dist/runner/index.js +0 -2
  439. package/dist/runner/inpage/banner.d.ts +0 -21
  440. package/dist/runner/inpage/banner.js +0 -156
  441. package/dist/runner/inpage/caption.d.ts +0 -3
  442. package/dist/runner/inpage/caption.js +0 -23
  443. package/dist/runner/inpage/core.d.ts +0 -4
  444. package/dist/runner/inpage/core.js +0 -316
  445. package/dist/runner/inpage/device.d.ts +0 -3
  446. package/dist/runner/inpage/device.js +0 -211
  447. package/dist/runner/inpage/network.d.ts +0 -15
  448. package/dist/runner/inpage/network.js +0 -217
  449. package/dist/runner/inpage/panel-chrome.js +0 -192
  450. package/dist/runner/inpage/stamp.js +0 -46
  451. package/dist/runner/inpage/swipe-zoom.js +0 -220
  452. package/dist/runner/inpage/todos.js +0 -337
  453. package/dist/runner/interaction-patch.js +0 -384
  454. package/dist/runner/main.js +0 -469
  455. package/dist/runner/network-capture.d.ts +0 -9
  456. package/dist/runner/network-capture.js +0 -126
  457. package/dist/runner/overlay-css.d.ts +0 -3
  458. package/dist/runner/overlay-css.js +0 -377
  459. package/dist/runner/overlay-install.js +0 -90
  460. package/dist/runner/overlay-stage.js +0 -110
  461. package/dist/runner/rings.js +0 -514
  462. package/dist/runner/seed-mem.js +0 -110
  463. package/dist/runner/slides.js +0 -278
  464. package/dist/runner/step-mode.js +0 -703
  465. package/dist/runner/step-panels.js +0 -729
  466. package/dist/runner/teardown.js +0 -202
  467. package/dist/runner/todo-dock.js +0 -142
  468. package/dist/session/step-overlay.d.ts +0 -37
  469. package/dist/session/step-overlay.js +0 -244
  470. package/examples/routed-demo/playwright.config.ts +0 -21
  471. package/examples/saucedemo/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
  472. package/templates/quickstart/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
  473. /package/dist/{commands → cli/commands}/agent-dive-scaffold.d.ts +0 -0
  474. /package/dist/{commands → cli/commands}/agent-dive.d.ts +0 -0
  475. /package/dist/{commands → cli/commands}/extensions.d.ts +0 -0
  476. /package/dist/{commands → cli/commands}/init.d.ts +0 -0
  477. /package/dist/{commands → cli/commands}/list.d.ts +0 -0
  478. /package/dist/{commands → cli/commands}/map.d.ts +0 -0
  479. /package/dist/{commands → cli/commands}/session.d.ts +0 -0
  480. /package/dist/{commands → cli/commands}/test.d.ts +0 -0
  481. /package/dist/{commands → cli/commands}/traverse.d.ts +0 -0
  482. /package/dist/{commands → cli/commands}/try.d.ts +0 -0
  483. /package/dist/{commands → cli/commands}/upgrade.d.ts +0 -0
  484. /package/dist/{highlights → demo/narration}/shorthand.js +0 -0
  485. /package/dist/{session/overlay-beacon.d.ts → demo/overlay/beacon.d.ts} +0 -0
  486. /package/dist/{session/overlay-beacon.js → demo/overlay/beacon.js} +0 -0
  487. /package/dist/{pilot-overlay/action-ring.d.ts → demo/overlay/pilot/actions.d.ts} +0 -0
  488. /package/dist/{ui → demo/overlay/ui}/components/ring.d.ts +0 -0
  489. /package/dist/{ui → demo/overlay/ui}/stylesheet.d.ts +0 -0
  490. /package/dist/{ui → demo/overlay/ui}/stylesheet.js +0 -0
  491. /package/dist/{ui → demo/overlay/ui}/tokens.d.ts +0 -0
  492. /package/dist/{ui → demo/overlay/ui}/tokens.js +0 -0
  493. /package/dist/{highlights → demo}/types.js +0 -0
  494. /package/dist/{auto-session → demo}/verbose-log.d.ts +0 -0
  495. /package/dist/{selector.d.ts → engine/trait/selector.d.ts} +0 -0
  496. /package/dist/{selector.js → engine/trait/selector.js} +0 -0
  497. /package/dist/{trait.js → engine/trait/trait.js} +0 -0
  498. /package/dist/{traverse → live/traverse}/coverage.d.ts +0 -0
  499. /package/dist/{traverse → live/traverse}/coverage.js +0 -0
  500. /package/dist/{traverse → live/traverse}/lease.d.ts +0 -0
  501. /package/dist/{traverse → live/traverse}/lease.js +0 -0
  502. /package/dist/{session/block-inject.d.ts → manifest/roots.d.ts} +0 -0
  503. /package/dist/{blocks-select.d.ts → manifest/select.d.ts} +0 -0
  504. /package/dist/{blocks-select.js → manifest/select.js} +0 -0
  505. /package/dist/{browser.d.ts → runtime/browser.d.ts} +0 -0
  506. /package/dist/{env-file.d.ts → runtime/env-file.d.ts} +0 -0
  507. /package/dist/{playwright-config.js → runtime/playwright-config.js} +0 -0
  508. /package/dist/{playwright.config.d.ts → runtime/playwright.config.d.ts} +0 -0
  509. /package/dist/{video-dir.d.ts → runtime/video-dir.d.ts} +0 -0
  510. /package/dist/{webserver.d.ts → runtime/webserver.d.ts} +0 -0
@@ -0,0 +1,8 @@
1
+ let apiCallRecorder;
2
+ /** The demo layer registers how an API call is shown (the network panel). Without one, calls are not recorded. */
3
+ export function setApiCallRecorder(recorder) {
4
+ apiCallRecorder = recorder;
5
+ }
6
+ export async function recordApiCall(page, entry) {
7
+ await apiCallRecorder?.(page, entry);
8
+ }
@@ -0,0 +1,13 @@
1
+ import type { BrowserContext } from "@playwright/test";
2
+ import type { EngineConfig } from "../config.js";
3
+ /** A browser context an Engine opened for itself, and how to close it again. */
4
+ export interface OwnContext {
5
+ context: BrowserContext;
6
+ close(): Promise<void>;
7
+ }
8
+ type OwnContextLauncher = (config: EngineConfig | undefined) => Promise<OwnContext>;
9
+ /** The runtime layer registers the full launch (selected config, Chromium path, extensions); see `runtime/full-launch.ts`. */
10
+ export declare function setOwnContextLauncher(next: OwnContextLauncher): void;
11
+ /** Opens the browser and context a `Flow.run(mem)` uses when the caller gave none. */
12
+ export declare function launchOwnContext(config: EngineConfig | undefined): Promise<OwnContext>;
13
+ export {};
@@ -0,0 +1,27 @@
1
+ import { resolveLauncher } from "../config.js";
2
+ import { envString } from "../env.js";
3
+ /** Plain Playwright launch: what an Engine does when nothing richer is registered (no config file, no extensions). */
4
+ async function plainLaunch(config) {
5
+ if (config?.extensions?.length) {
6
+ throw new Error('waygraph: browser extensions need the runtime layer - import the Engine from "waygraph"');
7
+ }
8
+ const browser = await resolveLauncher(config?.browserName ?? "chromium", config).launch({
9
+ headless: config?.headless ?? true,
10
+ ...(config?.slowMo !== undefined ? { slowMo: config.slowMo } : {}),
11
+ });
12
+ const baseURL = config?.baseUrl ?? envString("WAYGRAPH_BASE_URL");
13
+ const context = await browser.newContext({
14
+ ...(baseURL ? { baseURL } : {}),
15
+ ...(config?.recordVideo ? { recordVideo: config.recordVideo } : {}),
16
+ });
17
+ return { context, close: () => browser.close() };
18
+ }
19
+ let launcher = plainLaunch;
20
+ /** The runtime layer registers the full launch (selected config, Chromium path, extensions); see `runtime/full-launch.ts`. */
21
+ export function setOwnContextLauncher(next) {
22
+ launcher = next;
23
+ }
24
+ /** Opens the browser and context a `Flow.run(mem)` uses when the caller gave none. */
25
+ export function launchOwnContext(config) {
26
+ return launcher(config);
27
+ }
@@ -1,16 +1,18 @@
1
- import { MemPage } from "../mem-page.js";
2
- import type { Block, Checkpoint } from "../types.js";
3
- import type { Trait } from "../trait.js";
1
+ import { MemPage } from "../mem/mem.js";
2
+ import type { Block } from "../block/block.js";
3
+ import type { Checkpoint } from "../checkpoint/checkpoint.js";
4
+ import type { Trait } from "../trait/trait.js";
4
5
  import type { BrowserContext, Locator, Page } from "@playwright/test";
6
+ import type { SomeBlock } from "../block/block.js";
5
7
  /**
6
8
  * Checks `block.requires` against `mem` and throws, naming every missing key at
7
9
  * once, if any are unset. `connect()` unions each Block's `requires` into the
8
- * composed Block, so calling this on a `defineFlow`-built Flow's entry - which
10
+ * composed Block, so calling this on a `map()`-built Flow's entry - which
9
11
  * `runGraph` does automatically, before opening a tab - covers every Block in
10
12
  * that flow. It does not see Blocks only reachable through `branch()` routing,
11
13
  * since those depend on a runtime decision that hasn't happened yet.
12
14
  */
13
- export declare function preflight(mem: MemPage, block: Block<any, any>): void;
15
+ export declare function preflight(mem: MemPage, block: SomeBlock): void;
14
16
  /**
15
17
  * A cross-cutting, automatically-enforced verify - the real engine
16
18
  * primitive behind "persistent UI" (a sidebar, a header, anything that's
@@ -73,7 +75,7 @@ export declare function defineLayout(options: LayoutOptions): Layout;
73
75
  * `terminals`, if given, is a sanity check: the Checkpoint the run stops on must be
74
76
  * one of the tags the caller actually expects, or the run fails loud instead of
75
77
  * silently returning an unexpected result. Omit it when there is only ever one
76
- * reachable outcome by construction (as with a `defineFlow`-built Flow, which has
78
+ * reachable outcome by construction (as with a `map()`-built Flow, which has
77
79
  * no routing at all) - there is nothing to validate against.
78
80
  */
79
81
  export declare function runGraph<TOut extends Checkpoint<string>>(entry: Block<Checkpoint<"__start__">, TOut>, terminals: ReadonlySet<string> | undefined, context: BrowserContext, mem: MemPage, maxSteps?: number, options?: RunGraphOptions): Promise<TOut>;
@@ -141,9 +143,3 @@ export declare function spawnTab<TOut extends Checkpoint<string>>(entry: Block<C
141
143
  * @example await narrate(submitButton, "confirms the order", () => submitButton.click())
142
144
  */
143
145
  export declare function narrate<T>(locator: Locator, caption: string, action: () => Promise<T>): Promise<T>;
144
- /** Reserved markers bookending a `defineFlow([start, ...blocks, end])` call. */
145
- export declare const start: unique symbol;
146
- /** Marks the end of a hand-built chain. Only the deprecated `defineFlow` needs it; `map()` does not. */
147
- export declare const end: unique symbol;
148
- export type StartMarker = typeof start;
149
- export type EndMarker = typeof end;
@@ -1,10 +1,12 @@
1
1
  import { WaygraphError, MSG_PREFLIGHT_MISSING_KEY, MSG_RUNGRAPH_MAX_STEPS, MSG_RUNGRAPH_NOT_TERMINAL } from "../errors.js";
2
- import { checkpoint } from "../types.js";
3
- import { runPrecondition, runVerify } from "../trait.js";
2
+ import { checkpoint } from "../checkpoint/checkpoint.js";
3
+ import { beginRun, endRun, isConnected, lastLeaf, stepEnded, stepFailed, stepStarted } from "./events.js";
4
+ import { runPrecondition, runVerify } from "../trait/trait.js";
5
+ import { ignorePageGone } from "../page-gone.js";
4
6
  /**
5
7
  * Checks `block.requires` against `mem` and throws, naming every missing key at
6
8
  * once, if any are unset. `connect()` unions each Block's `requires` into the
7
- * composed Block, so calling this on a `defineFlow`-built Flow's entry - which
9
+ * composed Block, so calling this on a `map()`-built Flow's entry - which
8
10
  * `runGraph` does automatically, before opening a tab - covers every Block in
9
11
  * that flow. It does not see Blocks only reachable through `branch()` routing,
10
12
  * since those depend on a runtime decision that hasn't happened yet.
@@ -70,15 +72,17 @@ async function runLayouts(layouts, tag, out, page, mem, blockName) {
70
72
  * `terminals`, if given, is a sanity check: the Checkpoint the run stops on must be
71
73
  * one of the tags the caller actually expects, or the run fails loud instead of
72
74
  * silently returning an unexpected result. Omit it when there is only ever one
73
- * reachable outcome by construction (as with a `defineFlow`-built Flow, which has
75
+ * reachable outcome by construction (as with a `map()`-built Flow, which has
74
76
  * no routing at all) - there is nothing to validate against.
75
77
  */
76
78
  export async function runGraph(entry, terminals, context, mem, maxSteps = 5000, options) {
77
79
  preflight(mem, entry);
78
80
  const page = options?.page ?? (await context.newPage());
79
81
  const closeOnFinish = options?.closeOnFinish ?? true;
82
+ const opened = beginRun();
83
+ let result;
84
+ let failure;
80
85
  try {
81
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
82
86
  let current = entry;
83
87
  let input = checkpoint("__start__");
84
88
  let steps = 0;
@@ -86,6 +90,8 @@ export async function runGraph(entry, terminals, context, mem, maxSteps = 5000,
86
90
  if (++steps > maxSteps) {
87
91
  throw new WaygraphError("WG_RUNGRAPH_MAX_STEPS", MSG_RUNGRAPH_MAX_STEPS(maxSteps));
88
92
  }
93
+ if (!isConnected(current))
94
+ stepStarted(current.name, input.__state);
89
95
  await runPrecondition(current.instruction.precondition, input, page, mem, current.name);
90
96
  await current.instruction.act(page, input, mem);
91
97
  const observed = current.instruction.observe
@@ -94,18 +100,26 @@ export async function runGraph(entry, terminals, context, mem, maxSteps = 5000,
94
100
  const checkpoint = await current.instruction.resolve(observed);
95
101
  await runVerify(current.instruction.verify, checkpoint, page, mem, current.name);
96
102
  await runLayouts(options?.layouts, checkpoint.__state, checkpoint, page, mem, current.name);
103
+ stepEnded(lastLeaf(current), checkpoint.__state);
97
104
  const next = current.next?.(checkpoint);
98
105
  if (!next) {
99
106
  if (terminals && !terminals.has(checkpoint.__state)) {
100
107
  throw new WaygraphError("WG_RUNGRAPH_NOT_TERMINAL", MSG_RUNGRAPH_NOT_TERMINAL(current.name, checkpoint.__state, [...terminals].join(", ")));
101
108
  }
109
+ result = checkpoint.__state;
102
110
  return checkpoint;
103
111
  }
104
112
  current = next;
105
113
  input = checkpoint;
106
114
  }
107
115
  }
116
+ catch (err) {
117
+ failure = err;
118
+ stepFailed(err);
119
+ throw err;
120
+ }
108
121
  finally {
122
+ endRun(opened, failure === undefined ? { ...(result !== undefined ? { result } : {}) } : { error: failure });
109
123
  if (closeOnFinish) {
110
124
  await page.close();
111
125
  }
@@ -177,7 +191,7 @@ export async function narrate(locator, caption, action) {
177
191
  // true; narrate() below is the one that actually clears it.
178
192
  w.__wgNarrateOwnsRing = true;
179
193
  }, { box, caption })
180
- .catch(() => { });
194
+ .catch(ignorePageGone);
181
195
  owning = true;
182
196
  // The ring alone is pointless if action() fires on the very next
183
197
  // tick - a click that navigates (e.g. a form submit) wipes the ring
@@ -195,7 +209,7 @@ export async function narrate(locator, caption, action) {
195
209
  .evaluate(() => {
196
210
  globalThis.__wgLastNarrate = Date.now();
197
211
  })
198
- .catch(() => { });
212
+ .catch(ignorePageGone);
199
213
  }
200
214
  }
201
215
  catch {
@@ -213,11 +227,7 @@ export async function narrate(locator, caption, action) {
213
227
  if (w.__wgHideRing)
214
228
  w.__wgHideRing();
215
229
  })
216
- .catch(() => { });
230
+ .catch(ignorePageGone);
217
231
  }
218
232
  }
219
233
  }
220
- /** Reserved markers bookending a `defineFlow([start, ...blocks, end])` call. */
221
- export const start = Symbol("waygraph.start");
222
- /** Marks the end of a hand-built chain. Only the deprecated `defineFlow` needs it; `map()` does not. */
223
- export const end = Symbol("waygraph.end");
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Demo pacing for a Flow episode or a Block/compose group.
3
+ * - `blitz` - FF-like: skip theater + short gates (same as fastForwardComposeBlock)
4
+ * - `fast` - shorter gates, keep cursor theater (~0.33x normal)
5
+ * - `normal` - default demo pace (1x)
6
+ * - `slow` - longer autoplay + fixture dwell (~2x)
7
+ * - `number` - scale vs normal when `<= 20` (e.g. `0.5`, `1.5`, `3`);
8
+ * absolute gate/dwell ms when `> 20` (e.g. `4500`)
9
+ */
10
+ export type DemoPaceName = "blitz" | "fast" | "normal" | "slow";
11
+ /** How fast a demo step runs: `"fast"`, `"slow"`, `"blitz"`, `"normal"`, or a multiplier (`0.5`, `2`). */
12
+ export type DemoPace = DemoPaceName | number;
@@ -0,0 +1,2 @@
1
+ // How fast a demo step plays.
2
+ export {};
@@ -0,0 +1,130 @@
1
+ import type { Checkpoint } from "../checkpoint/checkpoint.js";
2
+ /** Shared dwell fields on stubs, fixtures, and yap slides. */
3
+ export type FixtureDurationFields = {
4
+ /**
5
+ * Min time this fixture stays visible before the demo advances.
6
+ * - `true` - defaults (2000ms normal, {@link FixtureDurationFields.fastMode} or 600ms when --fast)
7
+ * - `number` - override normal dwell ms
8
+ * - omit / false - no authored dwell (caller keeps its default timing)
9
+ */
10
+ duration?: boolean | number;
11
+ /**
12
+ * Dwell ms when demo `--fast` / gatesFast (only when {@link duration} is set).
13
+ * Default 600.
14
+ */
15
+ fastMode?: number;
16
+ };
17
+ /** One named highlight slot on a block (selector + caption). */
18
+ export interface WaygraphHighlightStub extends FixtureDurationFields {
19
+ selector: string;
20
+ /** Primary caption line. */
21
+ label: string;
22
+ /** Extra caption line (ring / slide body). */
23
+ detail?: string;
24
+ /** Short badge, e.g. AC / BUG / GATE / YAP. */
25
+ tag?: string;
26
+ /**
27
+ * Demo ring color + icon:
28
+ * - `planned` purple (authored narration, default)
29
+ * - `auto` gray (engine automation / verify fallback)
30
+ * - `info` blue · `warning` yellow · `danger` red · `success` green
31
+ */
32
+ tone?: HighlightTone;
33
+ /**
34
+ * Ring padding + label font scale: `sm` | `md` (default) | `lg`.
35
+ * Aliases: small/medium/large, s/m/l.
36
+ */
37
+ size?: HighlightSize;
38
+ /**
39
+ * Label font weight: `normal` (default) | `bold`.
40
+ * Aliases: regular, strong.
41
+ */
42
+ weight?: HighlightWeight;
43
+ /**
44
+ * Camera zoom while this ring is up (Screen Studio style - page scales toward
45
+ * the target / cursor). Typical `1.25` .. `2`. Cleared when the ring hides
46
+ * unless `zoomOut: false`. Episode default: {@link StubCtx.zoom}.
47
+ */
48
+ zoom?: number;
49
+ /**
50
+ * When false, keep the camera zoomed after this ring (pan to the next target
51
+ * instead of zooming out). Default true. Phase default: {@link StubCtx.zoomOut}.
52
+ */
53
+ zoomOut?: boolean;
54
+ /**
55
+ * Spotlight: dim the rest of the page, keep this target as the focal point.
56
+ */
57
+ focus?: boolean;
58
+ /**
59
+ * Caption text color (CSS color). Overrides tone label color when set.
60
+ */
61
+ color?: string;
62
+ /**
63
+ * Move the demo cursor to the target while this ring is up (default true
64
+ * for authored stub queues; set false to keep cursor hidden).
65
+ */
66
+ cursor?: boolean;
67
+ /**
68
+ * Optional link to a todo item id. When set, Method fill/click advances that
69
+ * todo row instead of relying on stub array index (avoids password/submit/username
70
+ * alphabetical reorder bugs).
71
+ */
72
+ todo?: string;
73
+ /** Slot key from stubBefore/After map (e.g. "username") - set by resolver. */
74
+ slotId?: string;
75
+ /**
76
+ * Pointer feel when touchMode is on (0.13+):
77
+ * - `tap` - short press via touchscreen (default in touch mode)
78
+ * - `hold` - long-press (~600ms) then release
79
+ * - `click` - mouse click even in touch mode
80
+ */
81
+ gesture?: "tap" | "hold" | "click" | "swipe";
82
+ }
83
+ /** A static stub phase: named ring slots to paint before or after a step. */
84
+ export type HighlightStubPhase = Record<string, WaygraphHighlightStub>;
85
+ /**
86
+ * One yap/slide in a multi-step demo caption sequence.
87
+ * Not block lifecycle - demo pauses (Next / auto-next) between slides.
88
+ */
89
+ export interface WaygraphSlide extends FixtureDurationFields {
90
+ /** Primary caption (required). */
91
+ caption: string;
92
+ detail?: string;
93
+ tag?: string;
94
+ /** Optional ring while this slide is showing. */
95
+ selector?: string;
96
+ tone?: HighlightTone;
97
+ size?: HighlightSize;
98
+ weight?: HighlightWeight;
99
+ /** Magnify via camera (Screen Studio) while this slide is showing. */
100
+ zoom?: number;
101
+ }
102
+ /**
103
+ * Demo ring tones (iconified).
104
+ * Automation (`auto`) is gray so authored planned/info/warning/danger/success stand out.
105
+ * `orange` added for Blind Pilot's own real, direct user request: a visible
106
+ * color distinction between a real Playwright-driven action (a Block run,
107
+ * or a raw click/type/upload - `auto` gray, already meant exactly this) and
108
+ * a pure DOM inspection (`auto dom` - orange, new) - "gray is waygraph
109
+ * playwright run. orange is dom check."
110
+ */
111
+ export type HighlightTone = "planned" | "auto" | "info" | "warning" | "danger" | "success" | "orange";
112
+ /** Ring + label scale. */
113
+ export type HighlightSize = "sm" | "md" | "lg";
114
+ /** Label font weight. */
115
+ export type HighlightWeight = "normal" | "bold";
116
+ /** Optional Flow-level defaults for demo rings (episode-wide). Stub/fixture wins. */
117
+ export type HighlightStyleDefaults = {
118
+ tone?: HighlightTone;
119
+ size?: HighlightSize;
120
+ weight?: HighlightWeight;
121
+ };
122
+ export type WaygraphSlidesOrFn<Out extends Checkpoint<string>> = readonly WaygraphSlide[] | ((out: Out) => readonly WaygraphSlide[]);
123
+ /** A ring or caption after its defaults and overrides are merged, ready to paint. */
124
+ export type ResolvedHighlight = WaygraphHighlightStub;
125
+ /** Map author aliases (`error` -> danger) to a canonical tone. */
126
+ export declare function normalizeHighlightTone(raw: unknown): HighlightTone;
127
+ /** Map size aliases to sm/md/lg. */
128
+ export declare function normalizeHighlightSize(raw: unknown): HighlightSize;
129
+ /** Map weight aliases to normal/bold. */
130
+ export declare function normalizeHighlightWeight(raw: unknown): HighlightWeight;
@@ -0,0 +1,41 @@
1
+ /** Map author aliases (`error` -> danger) to a canonical tone. */
2
+ export function normalizeHighlightTone(raw) {
3
+ if (typeof raw !== "string")
4
+ return "planned";
5
+ const t = raw.trim().toLowerCase();
6
+ if (t === "auto" || t === "automation" || t === "engine")
7
+ return "auto";
8
+ if (t === "info" || t === "blue")
9
+ return "info";
10
+ if (t === "warning" || t === "warn" || t === "yellow")
11
+ return "warning";
12
+ if (t === "danger" || t === "error" || t === "red")
13
+ return "danger";
14
+ if (t === "success" || t === "ok" || t === "green")
15
+ return "success";
16
+ if (t === "orange" || t === "amber" || t === "dom" || t === "inspect")
17
+ return "orange";
18
+ if (t === "planned" || t === "purple" || t === "authored")
19
+ return "planned";
20
+ return "planned";
21
+ }
22
+ /** Map size aliases to sm/md/lg. */
23
+ export function normalizeHighlightSize(raw) {
24
+ if (typeof raw !== "string")
25
+ return "md";
26
+ const t = raw.trim().toLowerCase();
27
+ if (t === "sm" || t === "s" || t === "small" || t === "tiny")
28
+ return "sm";
29
+ if (t === "lg" || t === "l" || t === "large" || t === "big" || t === "xl")
30
+ return "lg";
31
+ return "md";
32
+ }
33
+ /** Map weight aliases to normal/bold. */
34
+ export function normalizeHighlightWeight(raw) {
35
+ if (typeof raw !== "string")
36
+ return "normal";
37
+ const t = raw.trim().toLowerCase();
38
+ if (t === "bold" || t === "strong" || t === "heavy" || t === "b")
39
+ return "bold";
40
+ return "normal";
41
+ }
@@ -0,0 +1,268 @@
1
+ import type { Checkpoint } from "../checkpoint/checkpoint.js";
2
+ import type { MemPage } from "../mem/mem.js";
3
+ import type { TodoDockState, TodoDockUiOpts, TodoListStyle, WaygraphTodoGroupInput, WaygraphTodoInput, WaygraphTodoItem, WaygraphTodosOpts } from "./todos.js";
4
+ import type { DeviceOrientation, DevicePreset, DeviceState, DeviceViewport } from "./viewport.js";
5
+ import type { HighlightStubPhase, ResolvedHighlight, WaygraphHighlightStub } from "./ring.js";
6
+ /** Where the top banner sits. */
7
+ export type BannerPos = "left" | "center" | "right";
8
+ /** Banner UX, mirrors {@link TodoDockUiOpts}: pass `false` fields to opt out for this phase. */
9
+ export interface BannerUiOpts {
10
+ /** Move to a free spot while a highlight ring would overlap it (default true). */
11
+ collision?: boolean;
12
+ /** Hide the banner entirely for this phase. */
13
+ hidden?: boolean;
14
+ /**
15
+ * Fade duration (ms) when the banner's title text changes, so a change reads as a deliberate
16
+ * beat instead of an instant flicker. Default 220; 0 disables the fade (instant swap).
17
+ */
18
+ captionFadeMs?: number;
19
+ }
20
+ /** Episode-level fixtures authored inside stubBefore/After/OnError(ctx). */
21
+ export type StubPhaseFixtures = {
22
+ todos?: readonly WaygraphTodoInput[];
23
+ /** Which todo is current (0-based). Rows before = done, after = pending. */
24
+ todoIndex?: number;
25
+ /** Heading above a single {@link StubCtx.todos} list. */
26
+ todoTitle?: string;
27
+ /**
28
+ * Stable dock id (`data-wg-todo-id`) for external redirect asserts
29
+ * (e.g. Mailhog -> back to app and still find the checklist).
30
+ */
31
+ todoId?: string;
32
+ /** `sequential` (default), `checklist`, or `bullets`. */
33
+ todoStyle?: TodoListStyle;
34
+ /** Multiple titled lists (FR / Scenarios / ACs). Wins over bare todos when set. */
35
+ todoGroups?: readonly WaygraphTodoGroupInput[];
36
+ /**
37
+ * Camera zoom (Screen Studio style) - scales the page toward the target /
38
+ * cursor. Not element CSS zoom. Typical `1.25` .. `2`.
39
+ */
40
+ zoom?: number;
41
+ /** Default zoomOut for rings (false = keep camera between rings). */
42
+ zoomOut?: boolean;
43
+ /** Top demo banner title (the purple "waygraph demo" card). */
44
+ title?: string;
45
+ /** Banner side/position (`left` | `center` | `right`). Authored control, like the todo dock's `pos`. */
46
+ titlePos?: BannerPos;
47
+ /** Banner UX: collision (move away from a ring it overlaps), hidden. See {@link BannerUiOpts}. */
48
+ bannerUi?: BannerUiOpts;
49
+ /**
50
+ * Bottom narration caption - a white rounded card (black text, shadow), bottom-centered above
51
+ * the step pill, distinct from the banner (top, card-shaped). Omit/clear to hide it; set again
52
+ * to change the text, fading out/in.
53
+ */
54
+ caption?: string;
55
+ /**
56
+ * Network-tab overlay visibility - capture always happens in the background regardless; this
57
+ * only controls whether the panel itself is shown. Intentionally hidden by default (`undefined`
58
+ * on the very first phase); omit to leave whatever the previous step set alone.
59
+ */
60
+ networkTabVisible?: boolean;
61
+ /**
62
+ * Floating checklist dock side. `left` | `right`.
63
+ * Authored control (also click / WAYGRAPH_TODO_POS / --todo-left|right).
64
+ */
65
+ todoPos?: "left" | "right";
66
+ /**
67
+ * Todo-dock UX (compact / collision / behind-ring). Merged onto env defaults.
68
+ * See {@link TodoDockUiOpts}.
69
+ */
70
+ todoDockUi?: TodoDockUiOpts;
71
+ /**
72
+ * Viewport preset: `mobile` | `tablet` | `desktop` (default / clear).
73
+ * Omit on later blocks = **keep** (same persist pattern as todos).
74
+ */
75
+ device?: DevicePreset | DeviceState;
76
+ /** Explicit pixel viewport (wins over preset width/height when both set). */
77
+ viewport?: DeviceViewport;
78
+ /** Touch theater + Playwright touchscreen when true. */
79
+ touch?: boolean;
80
+ /** Portrait / landscape (swaps preset width/height). */
81
+ orientation?: DeviceOrientation;
82
+ };
83
+ /**
84
+ * What a stub is given: chained where a flow uses a Block, it paints rings, todos, the device and the banner.
85
+ *
86
+ * @example
87
+ * LoginBlock.stubBefore((ctx) => {
88
+ * ctx.todos("sign-in", ["Enter email", "Enter password", "Click Sign in"], { index: 0 });
89
+ * ctx.zoom(1.35);
90
+ * ctx.highlights({
91
+ * email: { selector: "#email", label: "Email" },
92
+ * submit: { selector: "#login-button", label: "Sign in" },
93
+ * });
94
+ * })
95
+ * // Sequential plan: bump todoIndex in a later phase / a later Block's stubBefore
96
+ * .stubAfter((ctx) => {
97
+ * ctx.todoIndex(2);
98
+ * ctx.ring("inventory", { selector: ".inventory_list", label: "Landed" });
99
+ * });
100
+ */
101
+ export type StubCtx<Out extends Checkpoint<string> = Checkpoint<string>> = {
102
+ /**
103
+ * Live Mem for this run - same store `act`/`observe` read. Prefer this over
104
+ * closing over outer scope or inventing parallel fixture bags.
105
+ * Undefined only if the caller ran a stub phase without passing mem (tests).
106
+ */
107
+ readonly mem: MemPage | undefined;
108
+ /** Present after resolve (stubAfter). Undefined for stubBefore. */
109
+ readonly out: Out | undefined;
110
+ /** Present on stubOnError when the step threw. */
111
+ readonly error: unknown | undefined;
112
+ /** Replace named highlight rings for this phase. */
113
+ highlights(slots: HighlightStubPhase): void;
114
+ /** Set / overwrite one named ring. */
115
+ ring(id: string, stub: WaygraphHighlightStub): void;
116
+ /**
117
+ * Floating checklist: `ctx.todos("login", ["Enter email", "Enter password"], { title: "Sign in", index: 0 })`.
118
+ * The id is the dock's `data-wg-todo-id` (stable through redirects). One dock at a time (setting todos replaces it);
119
+ * pass `{ parallel: true }` to keep docks with other ids. An empty list hides the dock.
120
+ */
121
+ todos(id: string, items: readonly WaygraphTodoInput[], opts?: WaygraphTodosOpts): void;
122
+ /** Moves the current dock's current item (sequential plans: a later step bumps it). */
123
+ todoIndex(n: number): void;
124
+ /** Several titled lists in one dock (e.g. Functional Requirements / Scenarios / ACs), with the same id and options as {@link StubCtx.todos}. */
125
+ todoGroups(id: string, groups: readonly WaygraphTodoGroupInput[], opts?: Omit<WaygraphTodosOpts, "index">): void;
126
+ /**
127
+ * Hide the floating todo dock. Omit todos on a later block = **keep** the
128
+ * previous dock (carry forward). Only hideTodos or an empty todos list clears it.
129
+ */
130
+ hideTodos(): void;
131
+ /**
132
+ * Viewport / device fixture (0.13+). `mobile` | `tablet` | `desktop`.
133
+ * Omit on later blocks = **keep** (same persist as todos). Use
134
+ * {@link StubCtx.hideDevice} or `device("desktop")` to return to desktop.
135
+ */
136
+ device(preset: DevicePreset | DeviceState): void;
137
+ /** Explicit CSS-pixel viewport (implies mobile-ish unless desktop-sized). */
138
+ viewport(box: DeviceViewport): void;
139
+ /** Enable / disable touch theater + touchscreen gestures. */
140
+ touch(on?: boolean): void;
141
+ /**
142
+ * Rotate viewport to portrait or landscape (0.13.3+).
143
+ * Keeps current preset; swaps width/height. Toast + lerp like device().
144
+ */
145
+ orientation(o: DeviceOrientation): void;
146
+ /**
147
+ * Reset to desktop viewport and clear touch mode. Omit device on a later
148
+ * block = **keep**; only hideDevice / device("desktop") clears.
149
+ */
150
+ hideDevice(): void;
151
+ /** Default camera zoom for rings without their own zoom. */
152
+ zoom(n: number): void;
153
+ /**
154
+ * Default zoomOut for rings in this phase. `false` = keep camera between rings.
155
+ */
156
+ zoomOut(keep: boolean): void;
157
+ /** Top banner title (waygraph demo card). `opts.pos` also places it (left | center | right). */
158
+ title(text: string, opts?: {
159
+ pos?: BannerPos;
160
+ }): void;
161
+ /** Place the banner: `left` | `center` | `right` (authored; click / env are fallbacks). */
162
+ titlePos(side: BannerPos): void;
163
+ /**
164
+ * Banner UX: `{ collision: false }` keeps it put even over a ring; `{ hidden: true }` hides it.
165
+ * @example ctx.bannerUi({ collision: false });
166
+ */
167
+ bannerUi(opts: BannerUiOpts): void;
168
+ /**
169
+ * Bottom narration caption - a white rounded card (black text, shadow), bottom-centered above
170
+ * the step pill; distinct from {@link StubCtx.title}, which is the top banner card. Fades in/out
171
+ * on change. Pass `""` (or call {@link StubCtx.hideCaption}) to clear.
172
+ * @example ctx.caption("Click Add to cart to continue");
173
+ */
174
+ caption(text: string): void;
175
+ /** Clears the caption (fades it out). */
176
+ hideCaption(): void;
177
+ /** Shorthand for `bannerUi({ hidden: true })`. */
178
+ hideBanner(): void;
179
+ /**
180
+ * Shows the network-tab overlay (Postman-style inspector of real page traffic + defineApiBlock
181
+ * calls) - capture always runs in the background; this just reveals the panel. Hidden by default.
182
+ * @example ctx.showNetworkTab();
183
+ */
184
+ showNetworkTab(): void;
185
+ /** Hides the network-tab overlay (capture keeps running - only the panel disappears). */
186
+ hideNetworkTab(): void;
187
+ /**
188
+ * Todo-dock UX: compact fold, collision flip, dim-behind-ring.
189
+ * Defaults are smart-on; pass false fields to opt out for this phase.
190
+ * @example
191
+ * ctx.todoDockUi({ compact: false }); // always show the full list
192
+ */
193
+ todoDockUi(opts: TodoDockUiOpts): void;
194
+ };
195
+ /** A stub callback: receives the stub `ctx` and paints rings, titles and todos. */
196
+ export type StubLifecycleFn<Out extends Checkpoint<string>> = (ctx: StubCtx<Out>) => void | Promise<void>;
197
+ /** Result of running a stub phase (rings + episode fixtures). */
198
+ export type StubPhaseResult = {
199
+ highlights: ResolvedHighlight[];
200
+ /** Flattened first-group items (compat). Prefer {@link todoDock}. */
201
+ todos: WaygraphTodoItem[];
202
+ todoIndex?: number;
203
+ todoDock?: TodoDockState;
204
+ /**
205
+ * Todo dock intent for this phase:
206
+ * - `set` - replace dock with {@link todoDock}
207
+ * - `clear` - hide dock (author called hideTodos / empty todos())
208
+ * - `keep` - author omitted todos; demo must leave previous dock alone
209
+ */
210
+ todoSync?: "set" | "clear" | "keep";
211
+ /** Todo-dock UX for this phase (when author called {@link StubCtx.todoDockUi}). */
212
+ todoDockUi?: TodoDockUiOpts;
213
+ /** Resolved device after this phase (undefined when keep with no prior). */
214
+ device?: DeviceState;
215
+ /**
216
+ * Device intent (mirror todoSync):
217
+ * - `set` - apply {@link device}
218
+ * - `clear` - reset to desktop (hideDevice / device desktop)
219
+ * - `keep` - author omitted device; demo must leave previous alone
220
+ */
221
+ deviceSync?: "set" | "clear" | "keep";
222
+ zoom?: number;
223
+ zoomOut?: boolean;
224
+ title?: string;
225
+ titlePos?: BannerPos;
226
+ bannerUi?: BannerUiOpts;
227
+ caption?: string;
228
+ networkTabVisible?: boolean;
229
+ todoPos?: "left" | "right";
230
+ /** When true, keep other docks (multi-todo). Default false = replace. */
231
+ todoParallel?: boolean;
232
+ };
233
+ /** Demo stub phase names. */
234
+ export type HighlightStubPhaseName = "stubBefore" | "stubAfter" | "stubOnError";
235
+ export type StubBagState = {
236
+ highlights: HighlightStubPhase;
237
+ todos?: readonly WaygraphTodoInput[] | undefined;
238
+ todoIndex?: number | undefined;
239
+ todoTitle?: string | undefined;
240
+ todoId?: string | undefined;
241
+ todoStyle?: TodoListStyle | undefined;
242
+ todoGroups?: readonly WaygraphTodoGroupInput[] | undefined;
243
+ /** Author touched the todo dock this phase (set or clear). */
244
+ todoTouched?: boolean | undefined;
245
+ /** Author asked to hide the dock. */
246
+ hideTodos?: boolean | undefined;
247
+ /** Author touched device this phase (set or clear). */
248
+ deviceTouched?: boolean | undefined;
249
+ /** Author asked to reset to desktop. */
250
+ hideDevice?: boolean | undefined;
251
+ device?: DeviceState | undefined;
252
+ /** Touch override when set via ctx.touch() alone or with device. */
253
+ touchOverride?: boolean | undefined;
254
+ /** Orientation override when set via ctx.orientation / landscape / portrait. */
255
+ orientationOverride?: DeviceOrientation | undefined;
256
+ zoom?: number | undefined;
257
+ zoomOut?: boolean | undefined;
258
+ title?: string | undefined;
259
+ titlePos?: BannerPos | undefined;
260
+ bannerUi?: BannerUiOpts | undefined;
261
+ caption?: string | undefined;
262
+ networkTabVisible?: boolean | undefined;
263
+ todoPos?: "left" | "right" | undefined;
264
+ /** Author patched todo-dock UX this phase. */
265
+ todoDockUi?: TodoDockUiOpts | undefined;
266
+ /** Keep sibling docks (compact todos opts.parallel). */
267
+ todoParallel?: boolean | undefined;
268
+ };
@@ -0,0 +1 @@
1
+ export {};