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,396 @@
1
+ import { resolveDeviceState } from "../narration/device.js";
2
+ import { envNumber } from "../../engine/env.js";
3
+ import { ignorePageGone } from "../../engine/page-gone.js";
4
+ /**
5
+ * Fit + center the OS browser window on the device viewport so mobile/tablet
6
+ * is not stuck top-left inside a maximized frame (0.13.4).
7
+ * Desktop clear restores maximized.
8
+ */
9
+ async function fitWindowToDeviceViewport(page, viewport, opts) {
10
+ const maximize = !!(opts && opts.maximize);
11
+ let client;
12
+ try {
13
+ client = await page.context().newCDPSession(page);
14
+ const { windowId } = await client.send("Browser.getWindowForTarget");
15
+ if (maximize) {
16
+ await client.send("Browser.setWindowBounds", {
17
+ windowId,
18
+ bounds: { windowState: "maximized" },
19
+ });
20
+ return;
21
+ }
22
+ if (!viewport || !viewport.width || !viewport.height)
23
+ return;
24
+ const metrics = await page
25
+ .evaluate(() => {
26
+ const chromeW = Math.max(0, (window.outerWidth || 0) - (window.innerWidth || 0));
27
+ const chromeH = Math.max(0, (window.outerHeight || 0) - (window.innerHeight || 0));
28
+ return {
29
+ chromeW: Number.isFinite(chromeW) ? chromeW : 0,
30
+ // First paint after maximize often reports 0 chrome - use a floor.
31
+ chromeH: chromeH > 20 ? chromeH : 88,
32
+ screenW: window.screen.availWidth || 1920,
33
+ screenH: window.screen.availHeight || 1080,
34
+ };
35
+ })
36
+ .catch(() => ({ chromeW: 0, chromeH: 88, screenW: 1920, screenH: 1080 }));
37
+ // Leave maximized before setting pixel bounds (Chromium ignores size while max).
38
+ await client.send("Browser.setWindowBounds", {
39
+ windowId,
40
+ bounds: { windowState: "normal" },
41
+ });
42
+ const winW = Math.min(metrics.screenW, Math.max(320, Math.floor(viewport.width + metrics.chromeW)));
43
+ const winH = Math.min(metrics.screenH, Math.max(320, Math.floor(viewport.height + metrics.chromeH)));
44
+ const left = Math.max(0, Math.floor((metrics.screenW - winW) / 2));
45
+ const top = Math.max(0, Math.floor((metrics.screenH - winH) / 2));
46
+ await client.send("Browser.setWindowBounds", {
47
+ windowId,
48
+ bounds: {
49
+ windowState: "normal",
50
+ left,
51
+ top,
52
+ width: winW,
53
+ height: winH,
54
+ },
55
+ });
56
+ }
57
+ catch {
58
+ /* headless / no window - ignore */
59
+ }
60
+ finally {
61
+ if (client)
62
+ await client.detach().catch(ignorePageGone);
63
+ }
64
+ }
65
+ /**
66
+ * Video recording locks Playwright viewport to recordVideo.size. Shrinking
67
+ * setViewportSize to mobile/tablet letterboxes the .webm top-left. Instead keep
68
+ * the stage size and center a device-sized #wg-device-shell inside the frame.
69
+ */
70
+ export async function applyVideoDeviceStage(page, target, stage, opts) {
71
+ const clear = !!(opts && opts.clear);
72
+ const shutterOut = !!(opts && opts.shutterOut);
73
+ const enterIn = !!(opts && opts.enterIn);
74
+ const desktopFlat = !!(opts && (opts.desktopFlat || opts.shutterOut));
75
+ const result = await page
76
+ .evaluate(({ tw, th, sw, sh, clear, shutterOut, enterIn, desktopFlat }) => {
77
+ const MATTE = "#0b1220";
78
+ const unwrap = () => {
79
+ const shell = document.getElementById("wg-device-shell");
80
+ if (shell) {
81
+ const parent = shell.parentNode;
82
+ if (parent) {
83
+ while (shell.firstChild)
84
+ parent.insertBefore(shell.firstChild, shell);
85
+ }
86
+ shell.remove();
87
+ }
88
+ document.documentElement.classList.remove("wg-video-device-stage");
89
+ document.documentElement.style.removeProperty("background");
90
+ const b = document.body;
91
+ if (b) {
92
+ b.style.margin = "";
93
+ b.style.minHeight = "";
94
+ b.style.display = "";
95
+ b.style.alignItems = "";
96
+ b.style.justifyContent = "";
97
+ b.style.background = "";
98
+ b.style.overflow = "";
99
+ }
100
+ };
101
+ if (clear) {
102
+ unwrap();
103
+ return { waitMs: 0 };
104
+ }
105
+ if (!document.body)
106
+ return { waitMs: 0 };
107
+ document.documentElement.classList.add("wg-video-device-stage");
108
+ document.documentElement.style.background = MATTE;
109
+ document.body.style.margin = "0";
110
+ document.body.style.minHeight = "100vh";
111
+ document.body.style.display = "flex";
112
+ document.body.style.alignItems = "center";
113
+ document.body.style.justifyContent = "center";
114
+ document.body.style.background = MATTE;
115
+ document.body.style.overflow = "hidden";
116
+ let shell = document.getElementById("wg-device-shell");
117
+ const created = !shell;
118
+ if (!shell) {
119
+ shell = document.createElement("div");
120
+ shell.id = "wg-device-shell";
121
+ const move = [];
122
+ for (const child of [...document.body.childNodes]) {
123
+ if (child.nodeType === 1 &&
124
+ child.getAttribute &&
125
+ child.getAttribute("data-wg-ui") === "1") {
126
+ continue;
127
+ }
128
+ if (child.nodeType === 1 && child.id === "wg-device-shell")
129
+ continue;
130
+ move.push(child);
131
+ }
132
+ for (const n of move)
133
+ shell.appendChild(n);
134
+ document.body.appendChild(shell);
135
+ }
136
+ // Desktop flat: always full-bleed, never reintroduce bezel on overlay rebuild.
137
+ if (desktopFlat) {
138
+ shell.classList.remove("wg-shell-enter");
139
+ shell.classList.add("wg-shell-shutter-out");
140
+ shell.classList.add("wg-shell-desktop-flat");
141
+ shell.style.width = sw + "px";
142
+ shell.style.height = sh + "px";
143
+ shell.style.maxWidth = sw + "px";
144
+ shell.style.maxHeight = sh + "px";
145
+ shell.style.transform = "scale(1)";
146
+ shell.style.transformOrigin = "center center";
147
+ shell.style.borderRadius = "0";
148
+ shell.style.boxShadow = "none";
149
+ shell.style.border = "none";
150
+ shell.style.outline = "none";
151
+ return { waitMs: shutterOut ? 480 : 0 };
152
+ }
153
+ // Leaving desktop-flat: clear INLINE radius/shadow overrides so CSS
154
+ // border-radius:16px applies evenly on all corners again.
155
+ shell.style.removeProperty("border-radius");
156
+ shell.style.removeProperty("box-shadow");
157
+ shell.style.removeProperty("border");
158
+ shell.style.removeProperty("outline");
159
+ if (enterIn && (created || shell.classList.contains("wg-shell-shutter-out"))) {
160
+ shell.classList.remove("wg-shell-shutter-out");
161
+ shell.classList.remove("wg-shell-desktop-flat");
162
+ shell.classList.add("wg-shell-enter");
163
+ void shell.offsetWidth;
164
+ }
165
+ const scale = Math.min(sw / tw, sh / th) * 0.92;
166
+ shell.style.width = tw + "px";
167
+ shell.style.height = th + "px";
168
+ shell.style.maxWidth = tw + "px";
169
+ shell.style.maxHeight = th + "px";
170
+ shell.style.transform = "scale(" + scale + ")";
171
+ shell.style.transformOrigin = "center center";
172
+ shell.classList.remove("wg-shell-shutter-out");
173
+ shell.classList.remove("wg-shell-desktop-flat");
174
+ if (enterIn && shell.classList.contains("wg-shell-enter")) {
175
+ requestAnimationFrame(() => {
176
+ shell.classList.remove("wg-shell-enter");
177
+ });
178
+ return { waitMs: 520 };
179
+ }
180
+ shell.classList.remove("wg-shell-enter");
181
+ return { waitMs: 0 };
182
+ }, {
183
+ tw: target.width,
184
+ th: target.height,
185
+ sw: stage.width,
186
+ sh: stage.height,
187
+ clear,
188
+ shutterOut,
189
+ enterIn,
190
+ desktopFlat,
191
+ })
192
+ .catch(() => ({ waitMs: 0 }));
193
+ const waitMs = result && result.waitMs ? Number(result.waitMs) : 0;
194
+ if (waitMs > 0)
195
+ await new Promise((r) => setTimeout(r, waitMs));
196
+ }
197
+ /**
198
+ * Apply authored device fixture to the live page (0.13+).
199
+ * Seamless viewport lerp + centered window + toast on set/clear.
200
+ * With --video: keep recordVideo stage size and center a device shell in-frame.
201
+ */
202
+ export async function applyDeviceToPage(page, device, sync) {
203
+ const mode = sync || (device ? "set" : "keep");
204
+ if (mode === "keep" && !device)
205
+ return;
206
+ const d = device ||
207
+ resolveDeviceState("desktop", false) || {
208
+ preset: "desktop",
209
+ viewport: { width: 1280, height: 720, deviceScaleFactor: 1 },
210
+ isMobile: false,
211
+ hasTouch: false,
212
+ touchMode: false,
213
+ };
214
+ const realSet = typeof page.__wgRealSetViewportSize === "function"
215
+ ? page.__wgRealSetViewportSize
216
+ : page.setViewportSize.bind(page);
217
+ const target = {
218
+ width: Math.max(200, Math.floor(d.viewport.width)),
219
+ height: Math.max(200, Math.floor(d.viewport.height)),
220
+ };
221
+ const videoStage = page.__wgVideoViewport &&
222
+ page.__wgVideoViewport.width > 0 &&
223
+ page.__wgVideoViewport.height > 0
224
+ ? {
225
+ width: Math.floor(page.__wgVideoViewport.width),
226
+ height: Math.floor(page.__wgVideoViewport.height),
227
+ }
228
+ : null;
229
+ let from = null;
230
+ try {
231
+ from = page.viewportSize();
232
+ }
233
+ catch {
234
+ from = null;
235
+ }
236
+ // Non-headless (no --video) used to literally resize the real OS browser window/viewport to
237
+ // each device's pixel size - a real, confirmed complaint: it didn't look like the same animated
238
+ // device-shell bezel the --video path already has, just a plain resize. Both now use the exact
239
+ // same applyVideoDeviceStage bezel technique - the "stage" (the fixed outer viewport the shell is
240
+ // centered within) is the recordVideo canvas size when recording, or the window's own size at
241
+ // the FIRST device switch when not (captured once, persisted on the page - the window itself is
242
+ // only really resized that one time, to establish a stable stage; every device switch after that
243
+ // paints the animated shell inside it instead of resizing the window again).
244
+ let establishingHeadedStage = false;
245
+ if (!videoStage && !page.__wgHeadedStage) {
246
+ page.__wgHeadedStage =
247
+ from && from.width > 0 && from.height > 0 ? { width: from.width, height: from.height } : { width: 1280, height: 720 };
248
+ establishingHeadedStage = true;
249
+ }
250
+ const stage = videoStage || page.__wgHeadedStage;
251
+ const announce = mode === "set" || mode === "clear";
252
+ const toDesktop = mode === "clear" || (d.preset === "desktop" && !d.touchMode);
253
+ const shouldAnimate = announce &&
254
+ from &&
255
+ from.width > 0 &&
256
+ from.height > 0 &&
257
+ (from.width !== target.width || from.height !== target.height);
258
+ // Always clear camera zoom when returning to desktop (video + headed).
259
+ if (toDesktop) {
260
+ page.__wgDesktopFlat = true;
261
+ await page
262
+ .evaluate(() => {
263
+ window.__wgZoomOutOnHide = true;
264
+ if (window.__wgClearZoom)
265
+ window.__wgClearZoom();
266
+ })
267
+ .catch(ignorePageGone);
268
+ }
269
+ else if (announce) {
270
+ page.__wgDesktopFlat = false;
271
+ }
272
+ // Swipe trail is for scrolling (see ensureLocatorInView), not device morph.
273
+ const nextOrient = d.orientation === "landscape" || d.orientation === "portrait"
274
+ ? d.orientation
275
+ : target.height > target.width
276
+ ? "portrait"
277
+ : "landscape";
278
+ page.__wgDeviceOrient = nextOrient;
279
+ page.__wgDevicePreset = toDesktop ? "desktop" : d.preset || "";
280
+ if (stage) {
281
+ // Lock the Playwright viewport to the stage size so frames/window fill it; center the device
282
+ // shell inside (OS window centering alone does not). Do NOT fitWindow to the device size -
283
+ // that shrinks the viewport below the stage and (when recording) pads the .webm with grey
284
+ // (top-left bias). Headed-without-video reuses this exact technique (see `stage`'s own
285
+ // comment above) - the real OS window is only ever resized once, right here, to establish the
286
+ // stage itself; every device switch after that paints the animated shell inside it instead.
287
+ if (!videoStage && establishingHeadedStage) {
288
+ await fitWindowToDeviceViewport(page, stage, { maximize: false }).catch(ignorePageGone);
289
+ }
290
+ await realSet(stage).catch(ignorePageGone);
291
+ const shellFrom = page.__wgDeviceShell || target;
292
+ if (toDesktop) {
293
+ // Zoom already cleared above. Full-bleed desktop shell (no matte frame).
294
+ // Shutter-out: soft rounded -> radius 0, then flat edge-to-edge.
295
+ const desk = {
296
+ width: stage.width,
297
+ height: stage.height,
298
+ };
299
+ page.__wgDeviceShell = { ...desk };
300
+ await applyVideoDeviceStage(page, desk, stage, {
301
+ clear: false,
302
+ shutterOut: true,
303
+ desktopFlat: true,
304
+ });
305
+ await realSet(stage).catch(ignorePageGone);
306
+ }
307
+ else {
308
+ // Lerp shell size when switching mobile <-> tablet mid-run.
309
+ const firstDevice = !page.__wgDeviceShell;
310
+ if (announce &&
311
+ shellFrom &&
312
+ (shellFrom.width !== target.width || shellFrom.height !== target.height)) {
313
+ const steps = 14;
314
+ const ms = envNumber("WAYGRAPH_DEVICE_TRANSITION_MS") ?? 520;
315
+ const stepMs = Math.max(12, Math.floor(ms / steps));
316
+ for (let i = 1; i <= steps; i++) {
317
+ const t = i / steps;
318
+ const e = t * t * (3 - 2 * t);
319
+ const mid = {
320
+ width: Math.round(shellFrom.width + (target.width - shellFrom.width) * e),
321
+ height: Math.round(shellFrom.height + (target.height - shellFrom.height) * e),
322
+ };
323
+ await applyVideoDeviceStage(page, mid, stage, {
324
+ clear: false,
325
+ enterIn: i === 1 && firstDevice,
326
+ });
327
+ if (i < steps)
328
+ await new Promise((r) => setTimeout(r, stepMs));
329
+ }
330
+ }
331
+ else {
332
+ await applyVideoDeviceStage(page, target, stage, {
333
+ clear: false,
334
+ enterIn: firstDevice || announce,
335
+ });
336
+ }
337
+ page.__wgDeviceShell = { ...target };
338
+ // Re-assert stage size after any prior fitWindow.
339
+ await realSet(stage).catch(ignorePageGone);
340
+ }
341
+ }
342
+ else {
343
+ // Unmaximize + center early so the lerp does not sit in the corner of a
344
+ // maximized frame. Desktop clear maximizes at the end instead.
345
+ if (!toDesktop) {
346
+ await fitWindowToDeviceViewport(page, from && from.width ? from : target, {
347
+ maximize: false,
348
+ });
349
+ }
350
+ try {
351
+ if (shouldAnimate) {
352
+ const steps = 14;
353
+ const ms = envNumber("WAYGRAPH_DEVICE_TRANSITION_MS") ?? 520;
354
+ const stepMs = Math.max(12, Math.floor(ms / steps));
355
+ for (let i = 1; i <= steps; i++) {
356
+ const t = i / steps;
357
+ const e = t * t * (3 - 2 * t); // smoothstep
358
+ const mid = {
359
+ width: Math.round(from.width + (target.width - from.width) * e),
360
+ height: Math.round(from.height + (target.height - from.height) * e),
361
+ };
362
+ await realSet(mid);
363
+ if (!toDesktop && (i === 1 || i === steps || i % 3 === 0)) {
364
+ await fitWindowToDeviceViewport(page, mid, { maximize: false });
365
+ }
366
+ if (i < steps)
367
+ await new Promise((r) => setTimeout(r, stepMs));
368
+ }
369
+ }
370
+ else {
371
+ await realSet(target);
372
+ }
373
+ }
374
+ catch {
375
+ /* maximized / null viewport hosts may reject - toast still updates */
376
+ }
377
+ if (toDesktop) {
378
+ await fitWindowToDeviceViewport(page, target, { maximize: true });
379
+ }
380
+ else {
381
+ await fitWindowToDeviceViewport(page, target, { maximize: false });
382
+ }
383
+ }
384
+ // Fire toast near the end of the lerp so it reads as one seamless beat.
385
+ await page
386
+ .evaluate((payload) => {
387
+ if (window.__wgSyncDevice)
388
+ window.__wgSyncDevice(payload);
389
+ }, {
390
+ sync: mode,
391
+ device: d,
392
+ remain: mode === "keep" || mode === "set",
393
+ announce,
394
+ })
395
+ .catch(ignorePageGone);
396
+ }
@@ -0,0 +1,2 @@
1
+ import type { OverlayInstallArgs } from "../../types.js";
2
+ export declare function installBanner({ title, favicon, bannerPos, bannerUi, tag: bannerTag }: OverlayInstallArgs): void;
@@ -0,0 +1,160 @@
1
+ export function installBanner({ title, favicon, bannerPos, bannerUi, tag: bannerTag }) {
2
+ const POSITIONS = ["left", "center", "right"];
3
+ const applyPos = (el, pos) => {
4
+ el.dataset.pos = pos;
5
+ el.dataset.home = pos;
6
+ try {
7
+ localStorage.setItem("wg-banner-pos", pos);
8
+ }
9
+ catch {
10
+ /* private mode / blocked storage - position still applies this page */
11
+ }
12
+ };
13
+ if (title) {
14
+ let banner = __wgById("wg-banner");
15
+ if (!banner) {
16
+ banner = document.createElement("div");
17
+ banner.id = "wg-banner";
18
+ let saved = null;
19
+ try {
20
+ saved = localStorage.getItem("wg-banner-pos");
21
+ }
22
+ catch {
23
+ /* ignore */
24
+ }
25
+ const startPos = saved && POSITIONS.includes(saved) ? saved : bannerPos || "left";
26
+ applyPos(banner, startPos);
27
+ banner.title = "Click to move: top left / center / right";
28
+ banner.addEventListener("click", (e) => {
29
+ e.stopPropagation();
30
+ const i = POSITIONS.indexOf(banner.dataset.pos || "left");
31
+ applyPos(banner, POSITIONS[(i + 1) % POSITIONS.length]);
32
+ });
33
+ const tag = document.createElement("span");
34
+ tag.className = "wg-banner-tag";
35
+ tag.textContent = bannerTag || "waygraph demo";
36
+ const text = document.createElement("span");
37
+ text.className = "wg-banner-text";
38
+ text.textContent = title;
39
+ banner.appendChild(tag);
40
+ banner.appendChild(text);
41
+ __wgAdd(banner);
42
+ }
43
+ else {
44
+ // Fixture / episode title changes every step - update in place
45
+ // (banner is created once; do not leave the first step's text stuck). Fades out/in
46
+ // instead of an instant swap, so a title change reads as a deliberate beat, not a
47
+ // flicker - opt-out (or re-tune) via bannerUi.captionFadeMs, 0 = instant.
48
+ let text = banner.querySelector(".wg-banner-text");
49
+ if (!text) {
50
+ text = document.createElement("span");
51
+ text.className = "wg-banner-text";
52
+ banner.appendChild(text);
53
+ }
54
+ if (text.textContent !== title) {
55
+ const fadeMs = bannerUi && Number.isFinite(Number(bannerUi.captionFadeMs))
56
+ ? Math.max(0, Number(bannerUi.captionFadeMs))
57
+ : 220;
58
+ if (fadeMs <= 0 || !text.textContent) {
59
+ text.textContent = title;
60
+ }
61
+ else {
62
+ text.style.transition = "opacity " + fadeMs + "ms ease";
63
+ text.style.opacity = "0";
64
+ setTimeout(() => {
65
+ text.textContent = title;
66
+ text.style.opacity = "1";
67
+ }, fadeMs);
68
+ }
69
+ }
70
+ }
71
+ }
72
+ // Authored banner UX (StubCtx.titlePos / bannerUi): applied every step, wins over click/env.
73
+ if (bannerUi) {
74
+ const cur = window.__wgBannerUi || {};
75
+ window.__wgBannerUi = { ...cur, ...bannerUi };
76
+ }
77
+ const bui = window.__wgBannerUi || {};
78
+ const bannerEl = __wgById("wg-banner");
79
+ if (bannerEl) {
80
+ if (bui.pos && POSITIONS.includes(bui.pos) && bannerEl.dataset.home !== bui.pos) {
81
+ bannerEl.dataset.pos = bui.pos;
82
+ bannerEl.dataset.home = bui.pos;
83
+ bannerEl.dataset.authored = "1";
84
+ }
85
+ bannerEl.dataset.collision = bui.collision === false ? "0" : "1";
86
+ bannerEl.style.display = bui.hidden ? "none" : "";
87
+ }
88
+ // Move the banner out of the way of a highlight ring (mirrors the todo dock's collision flip).
89
+ window.__wgBannerAvoidRing = (box) => {
90
+ const b = __wgById("wg-banner");
91
+ if (!b || !box || b.dataset.collision === "0" || b.style.display === "none")
92
+ return;
93
+ const pad = 10;
94
+ const hits = () => {
95
+ const r = b.getBoundingClientRect();
96
+ return !(r.right < box.x - pad ||
97
+ r.left > box.x + box.width + pad ||
98
+ r.bottom < box.y - pad ||
99
+ r.top > box.y + box.height + pad);
100
+ };
101
+ const home = b.dataset.home || b.dataset.pos || "left";
102
+ // Called every animation frame while a ring is followed - only log when the outcome changes.
103
+ const log = (state, line) => {
104
+ if (b.dataset.lastLog === state)
105
+ return;
106
+ b.dataset.lastLog = state;
107
+ if (line)
108
+ (window.__wgBannerLog = window.__wgBannerLog || []).push(line);
109
+ };
110
+ b.dataset.pos = home;
111
+ if (!hits()) {
112
+ delete b.dataset.moved;
113
+ log("clear");
114
+ return;
115
+ }
116
+ for (const cand of POSITIONS.filter((p) => p !== home)) {
117
+ b.dataset.pos = cand;
118
+ if (!hits()) {
119
+ b.dataset.moved = home + ">" + cand;
120
+ log("moved:" + cand, "moved " + home + " -> " + cand + " (ring overlap)");
121
+ return;
122
+ }
123
+ }
124
+ b.dataset.pos = home;
125
+ b.dataset.moved = "none-free";
126
+ log("none-free", "overlap at every position (kept " + home + ")");
127
+ };
128
+ window.__wgBannerRestore = () => {
129
+ const b = __wgById("wg-banner");
130
+ if (!b)
131
+ return;
132
+ if (b.dataset.home)
133
+ b.dataset.pos = b.dataset.home;
134
+ delete b.dataset.moved;
135
+ delete b.dataset.lastLog;
136
+ };
137
+ // Dim the banner while a ring caption is the focus - same "auto opacity" effect the todo
138
+ // dock already has via __wgTodosSetBehind, extended to the banner so both floating chrome
139
+ // pieces step back the same way instead of only one of them fading.
140
+ window.__wgBannerSetBehind = (on) => {
141
+ const b = __wgById("wg-banner");
142
+ if (!b)
143
+ return;
144
+ b.classList.toggle("wg-banner-behind", !!on);
145
+ };
146
+ // Tab title/favicon: a real navigation resets document.title and any
147
+ // <link rel="icon"> the new document brings, so re-check (not
148
+ // re-append) on every call instead of a one-time flag.
149
+ if (!document.title.startsWith("[waygraph] ")) {
150
+ document.title = "[waygraph] " + document.title;
151
+ }
152
+ let iconLink = document.querySelector("link[rel~='icon']");
153
+ if (!iconLink) {
154
+ iconLink = document.createElement("link");
155
+ iconLink.rel = "icon";
156
+ document.head.appendChild(iconLink);
157
+ }
158
+ if (favicon && iconLink.href !== favicon)
159
+ iconLink.href = favicon;
160
+ }
@@ -0,0 +1,2 @@
1
+ export declare function showCaption(text: string): void;
2
+ export declare function hideCaption(): void;
@@ -0,0 +1,24 @@
1
+ // In-page installer (page.evaluate target) - must stay self-contained, no module-scope closure.
2
+ // Bottom narration caption - a white rounded card, not the dark zsign-ported scrim this started as
3
+ // (see ui/css/caption.css's own header); narration-timeline/TTS sync not ported yet.
4
+ export function showCaption(text) {
5
+ let bar = __wgById("wg-caption-bar");
6
+ if (!bar) {
7
+ bar = document.createElement("div");
8
+ bar.id = "wg-caption-bar";
9
+ bar.setAttribute("data-wg-ui", "1");
10
+ const span = document.createElement("span");
11
+ span.className = "wg-caption-text";
12
+ bar.appendChild(span);
13
+ __wgAdd(bar);
14
+ }
15
+ const span = bar.querySelector(".wg-caption-text");
16
+ if (span)
17
+ span.textContent = text;
18
+ bar.classList.add("wg-in");
19
+ }
20
+ export function hideCaption() {
21
+ const bar = __wgById("wg-caption-bar");
22
+ if (bar)
23
+ bar.classList.remove("wg-in");
24
+ }
@@ -0,0 +1,2 @@
1
+ import type { OverlayInstallArgs } from "../../types.js";
2
+ export declare function installCore({ envAutoplay, todoDockUi }: OverlayInstallArgs): void;