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,369 @@
1
+ // CSS for the runner-only chrome (step panel, chips) and for the host page (device stage), next to the shared bundle in ui/css.
2
+ import { SURFACE } from "./ui/tokens.js";
3
+ // ---------------------------------------------------------------------------
4
+ // WAYGRAPH_STEP=1 - human-verification overlay: one Block at a time, a
5
+ // browser-injected panel showing/editing that Block's MemKeys, a "Run this
6
+ // step" gate, then a highlight ring over whatever its own verify Traits just
7
+ // confirmed, then a "Next" gate before moving on. Ring CSS borrowed from
8
+ // help-center-clip-engine's video-pipeline overlay (same purple ring +
9
+ // label-under-box language, minus everything camera/narration-specific).
10
+ // Purely CLI-level orchestration - no engine changes, no change to the
11
+ // non-STEP path above.
12
+ // Runner-only chrome (step panel, zoom/typing/device chips) - NOT
13
+ // ring/cursor/banner, which come from the one shared bundle every surface installs
14
+ // (ui/css/*.css, see ensureShadowRoot in overlay.ts). Injected under its own key so it
15
+ // never collides with that bundle.
16
+ export const RUNNER_EXTRA_CSS =
17
+ // Spotlight: dim everything except the highlight target (focus: true).
18
+ "#wg-focus-veil{position:fixed;z-index:2147483644;pointer-events:none;" +
19
+ "border-radius:12px;box-shadow:0 0 0 9999px rgba(8,4,20,.62);" +
20
+ "opacity:0;transition:opacity .3s ease,left .3s ease,top .3s ease,width .3s ease,height .3s ease;}" +
21
+ "#wg-focus-veil.wg-in{opacity:1;}" +
22
+ // Touch swipe trail (mobile/tablet orientation + device theater).
23
+ "#wg-swipe-layer{position:fixed;inset:0;z-index:2147483646;pointer-events:none;" +
24
+ "overflow:hidden;}" +
25
+ "#wg-swipe-layer .wg-swipe-dot{position:absolute;width:14px;height:14px;margin:-7px 0 0 -7px;" +
26
+ "border-radius:50%;background:rgba(147,197,253,.55);border:2px solid rgba(255,255,255,.85);" +
27
+ "box-shadow:0 0 12px rgba(59,130,246,.55);opacity:0;}" +
28
+ "#wg-swipe-layer .wg-swipe-finger{position:absolute;width:28px;height:28px;margin:-14px 0 0 -14px;" +
29
+ "border-radius:50%;background:rgba(15,23,42,.92);border:2px solid #fff;" +
30
+ "box-shadow:0 4px 16px rgba(0,0,0,.4);opacity:0;" +
31
+ "transition:left .05s linear,top .05s linear,opacity .15s ease;}" +
32
+ "#wg-swipe-layer .wg-swipe-label{position:absolute;left:50%;top:18%;transform:translateX(-50%);" +
33
+ "padding:6px 12px;border-radius:999px;background:rgba(15,23,42,.88);color:#e0f2fe;" +
34
+ "border:1px solid rgba(56,189,248,.55);font:700 12px/1.2 system-ui,sans-serif;" +
35
+ "letter-spacing:.04em;text-transform:uppercase;opacity:0;transition:opacity .25s ease;}" +
36
+ "#wg-swipe-layer.wg-in .wg-swipe-label{opacity:1;}" +
37
+ "#wg-panel{position:fixed;z-index:2147483647;left:50%;bottom:12px;transform:translateX(-50%);" +
38
+ "max-width:min(92vw,640px);max-height:calc(100vh - 24px);overflow-y:auto;box-sizing:border-box;" +
39
+ "background:" + SURFACE + ";color:#fff;border-radius:14px;" +
40
+ "padding:16px 20px;font:14px/1.4 system-ui,sans-serif;box-shadow:0 12px 30px rgba(0,0,0,.35);" +
41
+ // .06s was tuned back when the panel was removed and recreated on
42
+ // EVERY step - fast was the only way to avoid feeling laggy. Now that
43
+ // routine per-step updates reuse the same element (no fade at all - see
44
+ // the panel-reuse fix), this only ever fires for a genuinely fresh DOM
45
+ // (first load, or a real navigation - which is exactly what an episode
46
+ // boundary is). Slower and smoother reads as a real, comfortable
47
+ // transition instead of an instant pop - "eyes friendly," not laggy,
48
+ // since it no longer costs anything on the common case.
49
+ "opacity:0;transition:opacity .35s ease;}" +
50
+ "#wg-panel.wg-in{opacity:1;}" +
51
+ "#wg-panel .wg-auto{margin-top:10px;font:600 13px system-ui,sans-serif;color:#c9a6ff;}" +
52
+ "#wg-panel .wg-autoplay-row{margin-top:8px;}" +
53
+ "#wg-panel .wg-autoplay-row label{display:inline-flex;align-items:center;gap:6px;" +
54
+ "font:12px system-ui,sans-serif;color:#b8a0e0;cursor:pointer;user-select:none;}" +
55
+ "#wg-panel .wg-autoplay-row input{margin:0;cursor:pointer;}" +
56
+ "#wg-panel h3{margin:0 0 8px;font-size:13px;color:#c9a6ff;font-weight:700;" +
57
+ "letter-spacing:.02em;text-transform:uppercase;}" +
58
+ // Sits ABOVE the per-Block "Step i/N" heading - the episode/scenario
59
+ // this Block belongs to, not another block-level label. Only rendered
60
+ // when the chain spec actually named a real Flow (chainFlow tags it via
61
+ // BlockInfo.resetSessionBefore's sibling metadata) - a plain ad hoc
62
+ // block chain shows no episode heading at all.
63
+ "#wg-panel .wg-episode{margin:0 0 6px;font:700 15px system-ui,sans-serif;color:#fff;" +
64
+ "padding-bottom:6px;border-bottom:1px solid rgba(124,58,237,.35);}" +
65
+ // Pace chip - numbers speak in the overlay (2.5x / 4500ms / slow).
66
+ "#wg-panel .wg-pace{display:inline-flex;align-items:center;gap:8px;margin:0 0 10px;" +
67
+ "padding:6px 10px;border-radius:8px;background:rgba(124,58,237,.22);" +
68
+ "border:1px solid rgba(124,58,237,.45);font:600 12px/1.35 system-ui,sans-serif;color:#f0e8ff;}" +
69
+ "#wg-panel .wg-pace-badge{display:inline-block;padding:2px 8px;border-radius:999px;" +
70
+ "background:#7C3AED;color:#fff;font:800 11px/1.2 system-ui,sans-serif;letter-spacing:.04em;" +
71
+ "text-transform:uppercase;}" +
72
+ "#wg-panel .wg-pace[data-pace-kind=slow] .wg-pace-badge," +
73
+ "#wg-panel .wg-pace[data-pace-kind=num-slow] .wg-pace-badge{background:#EAB308;color:#1c1917;}" +
74
+ "#wg-panel .wg-pace[data-pace-kind=fast] .wg-pace-badge," +
75
+ "#wg-panel .wg-pace[data-pace-kind=blitz] .wg-pace-badge{background:#22C55E;color:#052e16;}" +
76
+ "#wg-panel .wg-pace[data-pace-kind=ms] .wg-pace-badge{background:#3B82F6;color:#fff;}" +
77
+ "#wg-panel .wg-narration{margin:0 0 12px;font:italic 14px/1.4 system-ui,sans-serif;color:#f0e8ff;}" +
78
+ // Todo checklist(s) float outside #wg-panel so --mini / Hide never hide them.
79
+ // Multiple docks (one per todoId) are supported - stacked on the same side.
80
+ // Click a dock to slide left <-> right (WAYGRAPH_TODO_POS / --todo-left|right).
81
+ ".wg-todo-dock,#wg-todo-dock{position:fixed;z-index:2147483646;top:104px;left:14px;" +
82
+ "width:min(280px,42vw);max-height:calc(100vh - 100px);overflow:auto;box-sizing:border-box;" +
83
+ "padding:10px 12px;background:" + SURFACE + ";color:#fff;border-radius:12px;" +
84
+ "border:1px solid rgba(124,58,237,.45);box-shadow:0 8px 24px rgba(0,0,0,.35);" +
85
+ "pointer-events:auto;cursor:pointer;" +
86
+ "transition:transform .4s cubic-bezier(.22,1,.36,1),top .35s ease,opacity .25s ease,z-index 0s;transform:translateX(0);}" +
87
+ ".wg-todo-dock[data-pos=right],#wg-todo-dock[data-pos=right]{transform:translateX(calc(100vw - 100% - 28px));}" +
88
+ ".wg-todo-dock[data-pos=left],#wg-todo-dock[data-pos=left]{transform:translateX(0);}" +
89
+ /* While a highlight ring is up: sit under the ring so captions stay readable. */
90
+ ".wg-todo-dock.wg-todo-behind,#wg-todo-dock.wg-todo-behind{z-index:2147483643;opacity:.42;}" +
91
+ /* Collision tuck: shrink so a mid-page ring can still breathe. */
92
+ ".wg-todo-dock[data-tucked=\"1\"],#wg-todo-dock[data-tucked=\"1\"]{max-height:min(28vh,220px);}" +
93
+ /* Compact + cap: fold overflow rows; hover / data-expanded reveals more. */
94
+ ".wg-todo-dock[data-compact=\"1\"]:not(:hover):not([data-expanded=\"1\"]) li.wg-todo-fold{display:none;}" +
95
+ ".wg-todo-dock[data-compact=\"1\"]:is(:hover,[data-expanded=\"1\"]) li.wg-todo-fold-deep{display:none;}" +
96
+ ".wg-todo-dock .wg-todo-more{display:flex;align-items:center;gap:6px;margin-top:6px;padding:5px 8px;" +
97
+ "border-radius:8px;background:rgba(124,58,237,.22);border:1px solid rgba(124,58,237,.4);" +
98
+ "font:700 11px/1.2 system-ui,sans-serif;color:#e8dcff;cursor:pointer;user-select:none;}" +
99
+ ".wg-todo-dock .wg-todo-more:hover{background:rgba(124,58,237,.35);}" +
100
+ ".wg-todo-dock .wg-todo-dock-title{font:700 11px/1.2 system-ui,sans-serif;color:#c9a6ff;" +
101
+ "letter-spacing:.04em;text-transform:uppercase;margin:0 0 8px;}" +
102
+ ".wg-todo-dock .wg-todos-list,#wg-todo-dock #wg-todos,.wg-todo-dock #wg-todos{list-style:none;margin:0;padding:0;background:transparent;border:none;}" +
103
+ // Always-on zoom HUD - bottom-right (top-left is crowded: todos + banners). Violet, matching the
104
+ // rest of the overlay's design tokens - this used to be a lone amber/yellow badge, the one
105
+ // surface that never got pulled into the shared palette when everything else did.
106
+ "#wg-zoom-badge{position:fixed;z-index:2147483646;bottom:14px;right:14px;" +
107
+ "display:flex;align-items:center;gap:7px;padding:6px 11px 6px 8px;" +
108
+ "border-radius:999px;background:" + SURFACE + ";color:#f0e8ff;" +
109
+ "border:1px solid rgba(124,58,237,.55);box-shadow:0 6px 18px rgba(0,0,0,.4);" +
110
+ "font:700 12px/1.2 system-ui,sans-serif;pointer-events:none;" +
111
+ "opacity:1;transform:translateY(0);}" +
112
+ "#wg-zoom-badge .wg-zoom-ico{width:18px;height:18px;display:flex;align-items:center;justify-content:center;" +
113
+ "border-radius:6px;background:rgba(124,58,237,.28);}" +
114
+ "#wg-zoom-badge .wg-zoom-ico svg{width:14px;height:14px;display:block;}" +
115
+ "#wg-zoom-badge .wg-zoom-val{color:#c9a6ff;font-variant-numeric:tabular-nums;font-weight:800;min-width:3.2em;}" +
116
+ "#wg-zoom-badge[data-zoomed=\"1\"]{border-color:#7C3AED;}" +
117
+ // Network-tab overlay (real page traffic via network-capture.js + defineApiBlock's own
118
+ // page.request calls) - bottom-left, the one corner free of the zoom HUD (bottom-right) and the
119
+ // typing chip (bottom-center). Persistent (does not auto-fade) once any entry exists - this is a
120
+ // real Postman/DevTools-style inspector meant to be reviewed, not a flash-and-gone toast.
121
+ "#wg-network-log{position:fixed;z-index:2147483646;bottom:14px;left:14px;min-width:260px;" +
122
+ "max-width:min(92vw,420px);max-height:min(60vh,420px);display:flex;flex-direction:column;" +
123
+ "border-radius:10px;background:" + SURFACE + ";color:#f0e8ff;border:1px solid rgba(124,58,237,.45);" +
124
+ "box-shadow:0 8px 22px rgba(0,0,0,.4);font:12px/1.4 ui-monospace,\"SF Mono\",Consolas,monospace;" +
125
+ "opacity:0;transform:translateY(8px);transition:opacity .25s ease,transform .25s ease;overflow:hidden;}" +
126
+ "#wg-network-log.wg-in{opacity:1;transform:translateY(0);}" +
127
+ "#wg-network-log.wg-net-collapsed .wg-net-list{display:none;}" +
128
+ "#wg-network-log .wg-net-header{display:flex;align-items:center;gap:6px;padding:8px 10px;" +
129
+ "border-bottom:1px solid rgba(124,58,237,.25);cursor:default;flex:0 0 auto;}" +
130
+ "#wg-network-log .wg-net-title{font:700 10px/1.2 system-ui,sans-serif;color:#c9a6ff;" +
131
+ "letter-spacing:.06em;text-transform:uppercase;flex:1 1 auto;}" +
132
+ "#wg-network-log .wg-net-count{font:700 10px/1.2 system-ui,sans-serif;color:#9CA3AF;" +
133
+ "background:rgba(124,58,237,.22);border-radius:999px;padding:1px 7px;}" +
134
+ "#wg-network-log .wg-net-collapse{flex:0 0 auto;width:18px;height:18px;border-radius:5px;border:none;" +
135
+ "background:rgba(124,58,237,.28);color:#e8dcff;font:700 13px/1 system-ui,sans-serif;cursor:pointer;" +
136
+ "pointer-events:auto;}" +
137
+ "#wg-network-log .wg-net-collapse:hover{background:rgba(124,58,237,.42);}" +
138
+ "#wg-network-log .wg-net-list{list-style:none;margin:0;padding:6px 8px;display:flex;" +
139
+ "flex-direction:column;gap:2px;overflow-y:auto;pointer-events:auto;}" +
140
+ "#wg-network-log .wg-net-row{display:flex;align-items:baseline;gap:7px;opacity:0;padding:3px 4px;" +
141
+ "border-radius:5px;cursor:pointer;transform:translateX(-4px);transition:opacity .2s ease,transform .2s ease;}" +
142
+ "#wg-network-log .wg-net-row:hover,#wg-network-log .wg-net-row.wg-net-open{background:rgba(124,58,237,.18);}" +
143
+ "#wg-network-log .wg-net-row.wg-in{opacity:1;transform:translateX(0);}" +
144
+ "#wg-network-log .wg-net-method{flex:0 0 auto;font-weight:800;font-size:10px;min-width:38px;}" +
145
+ "#wg-network-log .wg-net-method-get{color:#3B82F6;}" +
146
+ "#wg-network-log .wg-net-method-post{color:#22C55E;}" +
147
+ "#wg-network-log .wg-net-method-put{color:#F97316;}" +
148
+ "#wg-network-log .wg-net-method-delete{color:#EF4444;}" +
149
+ "#wg-network-log .wg-net-method-other{color:#9CA3AF;}" +
150
+ "#wg-network-log .wg-net-path{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;" +
151
+ "white-space:nowrap;color:#e0e0f0;}" +
152
+ "#wg-network-log .wg-net-status{flex:0 0 auto;font-weight:700;color:#22C55E;}" +
153
+ "#wg-network-log .wg-net-row[data-ok=\"0\"] .wg-net-status{color:#EF4444;}" +
154
+ "#wg-network-log .wg-net-ms{flex:0 0 auto;color:#9CA3AF;font-size:10px;}" +
155
+ "#wg-network-log .wg-net-detail{list-style:none;background:rgba(0,0,0,.28);border-radius:6px;" +
156
+ "padding:8px;margin:2px 0 6px;}" +
157
+ "#wg-network-log .wg-net-detail-section{margin-bottom:8px;}" +
158
+ "#wg-network-log .wg-net-detail-section:last-child{margin-bottom:0;}" +
159
+ "#wg-network-log .wg-net-detail-section h4{margin:0 0 4px;font:700 9px/1.2 system-ui,sans-serif;" +
160
+ "color:#9CA3AF;letter-spacing:.06em;text-transform:uppercase;}" +
161
+ "#wg-network-log .wg-net-headers{width:100%;border-collapse:collapse;font-size:11px;}" +
162
+ "#wg-network-log .wg-net-headers td{padding:1px 6px 1px 0;vertical-align:top;word-break:break-all;}" +
163
+ "#wg-network-log .wg-net-headers td:first-child{color:#c9a6ff;white-space:nowrap;}" +
164
+ "#wg-network-log .wg-net-body{margin:0;font-size:11px;white-space:pre-wrap;word-break:break-all;" +
165
+ "max-height:160px;overflow-y:auto;color:#e0e0f0;}" +
166
+ "#wg-network-log .wg-net-curl{color:#7dd3fc;}" +
167
+ "#wg-network-log .wg-net-empty{font-size:11px;color:#6b7280;font-style:italic;}" +
168
+ "#wg-network-log .wg-net-copy{margin-top:5px;padding:3px 9px;border-radius:5px;border:1px solid rgba(124,58,237,.5);" +
169
+ "background:rgba(124,58,237,.22);color:#e8dcff;font:700 10px system-ui,sans-serif;cursor:pointer;}" +
170
+ "#wg-network-log .wg-net-copy:hover{background:rgba(124,58,237,.38);}" +
171
+ // Typing chip (method fills: username / password / etc.)
172
+ "#wg-typing-badge{position:fixed;z-index:2147483646;bottom:88px;left:50%;transform:translateX(-50%);" +
173
+ "display:flex;align-items:center;gap:8px;padding:8px 14px;" +
174
+ "border-radius:999px;background:rgba(20,10,40,.95);color:#e0f2fe;" +
175
+ "border:1px solid rgba(56,189,248,.55);box-shadow:0 8px 22px rgba(0,0,0,.4);" +
176
+ "font:700 12px/1.2 system-ui,sans-serif;pointer-events:none;" +
177
+ "opacity:0;transition:opacity .2s ease;}" +
178
+ "#wg-typing-badge.wg-in{opacity:1;}" +
179
+ "#wg-typing-badge .wg-ty-dots{letter-spacing:.15em;color:#7dd3fc;}" +
180
+ // Device toast + chip (0.13.2+) - icon toast on fixture change, then compact chip.
181
+ "#wg-device-toast{position:fixed;z-index:2147483647;top:14px;right:14px;" +
182
+ "display:flex;align-items:center;gap:10px;min-width:200px;max-width:min(92vw,320px);" +
183
+ "padding:12px 14px;border-radius:14px;background:rgba(20,10,40,.96);color:#f0e8ff;" +
184
+ "border:1px solid rgba(124,58,237,.55);box-shadow:0 10px 28px rgba(0,0,0,.4);" +
185
+ "font:600 13px/1.35 system-ui,sans-serif;pointer-events:none;" +
186
+ "opacity:0;transform:translateX(18px) scale(.96);" +
187
+ "transition:opacity .35s ease,transform .45s cubic-bezier(.22,1,.36,1);}" +
188
+ "#wg-device-toast.wg-in{opacity:1;transform:translateX(0) scale(1);}" +
189
+ "#wg-device-toast.wg-out{opacity:0;transform:translateX(12px) scale(.98);}" +
190
+ "#wg-device-toast[data-preset=mobile]{border-color:#3B82F6;}" +
191
+ "#wg-device-toast[data-preset=tablet]{border-color:#22C55E;}" +
192
+ "#wg-device-toast[data-preset=desktop]{border-color:#9CA3AF;}" +
193
+ "#wg-device-toast .wg-dev-icon{flex:0 0 auto;width:36px;height:36px;border-radius:10px;" +
194
+ "display:flex;align-items:center;justify-content:center;background:rgba(124,58,237,.28);}" +
195
+ "#wg-device-toast[data-preset=mobile] .wg-dev-icon{background:rgba(59,130,246,.28);}" +
196
+ "#wg-device-toast[data-preset=tablet] .wg-dev-icon{background:rgba(34,197,94,.28);}" +
197
+ "#wg-device-toast[data-preset=desktop] .wg-dev-icon{background:rgba(156,163,175,.28);}" +
198
+ "#wg-device-toast .wg-dev-icon svg{width:22px;height:22px;display:block;}" +
199
+ "#wg-device-toast .wg-dev-copy{flex:1 1 auto;min-width:0;}" +
200
+ "#wg-device-toast .wg-dev-title{font:800 13px/1.2 system-ui,sans-serif;color:#fff;}" +
201
+ "#wg-device-toast .wg-dev-sub{margin-top:3px;font:600 11px/1.3 system-ui,sans-serif;" +
202
+ "color:#c9a6ff;letter-spacing:.02em;}" +
203
+ "#wg-device-badge{position:fixed;z-index:2147483646;top:14px;right:14px;" +
204
+ "display:inline-flex;align-items:center;gap:6px;padding:6px 10px 6px 8px;" +
205
+ "border-radius:999px;background:rgba(20,10,40,.92);color:#f0e8ff;" +
206
+ "border:1px solid rgba(124,58,237,.5);font:700 11px/1.2 system-ui,sans-serif;" +
207
+ "letter-spacing:.04em;text-transform:uppercase;pointer-events:none;" +
208
+ "box-shadow:0 4px 14px rgba(0,0,0,.3);opacity:0;transform:translateY(-4px);" +
209
+ "transition:opacity .3s ease,transform .35s cubic-bezier(.22,1,.36,1);}" +
210
+ "#wg-device-badge.wg-in{opacity:1;transform:translateY(0);}" +
211
+ "#wg-device-badge[data-preset=mobile]{border-color:#3B82F6;}" +
212
+ "#wg-device-badge[data-preset=tablet]{border-color:#22C55E;}" +
213
+ "#wg-device-badge[data-preset=desktop]{border-color:#9CA3AF;}" +
214
+ "#wg-device-badge .wg-dev-icon{width:16px;height:16px;display:flex;align-items:center;justify-content:center;}" +
215
+ "#wg-device-badge .wg-dev-icon svg{width:14px;height:14px;display:block;}" +
216
+ "#wg-device-badge .wg-dev-label{white-space:nowrap;}" +
217
+ "#wg-cursor[data-touch=1]{width:28px;height:28px;}" +
218
+ "#wg-todos,.wg-todos-list{list-style:none;margin:0 0 12px;padding:8px 10px;background:#0f0620;border-radius:8px;" +
219
+ "border:1px solid #3a2a60;}" +
220
+ "#wg-todos li,.wg-todos-list li{display:flex;gap:8px;align-items:flex-start;margin:0 0 6px;font:600 12.5px/1.35 system-ui,sans-serif;}" +
221
+ "#wg-todos li:last-child,.wg-todos-list li:last-child{margin-bottom:0;}" +
222
+ "#wg-todos .wg-todo-mark,.wg-todos-list .wg-todo-mark{flex:0 0 auto;width:1.1em;text-align:center;}" +
223
+ "#wg-todos .wg-todo-done,.wg-todos-list .wg-todo-done{color:#6ee7b7;text-decoration:line-through;opacity:.85;}" +
224
+ "#wg-todos .wg-todo-current,.wg-todos-list .wg-todo-current{color:#fff;}" +
225
+ "#wg-todos .wg-todo-pending,.wg-todos-list .wg-todo-pending{color:#9a7ad1;}" +
226
+ "#wg-todos[data-wg-todo-style=bullets] .wg-todo-pending," +
227
+ "#wg-todos[data-wg-todo-style=bullets] .wg-todo-current," +
228
+ ".wg-todos-list[data-wg-todo-style=bullets] .wg-todo-pending," +
229
+ ".wg-todos-list[data-wg-todo-style=bullets] .wg-todo-current{color:#e8dcff;}" +
230
+ "#wg-todos[data-wg-todo-style=bullets] .wg-todo-mark," +
231
+ ".wg-todos-list[data-wg-todo-style=bullets] .wg-todo-mark{color:#c9a6ff;}" +
232
+ "#wg-progress{height:4px;background:#2a1650;border-radius:2px;margin:0 0 12px;overflow:hidden;}" +
233
+ "#wg-progress-bar{height:100%;background:#7C3AED;border-radius:2px;transition:width .3s ease;}" +
234
+ // A real tab bar for episodes - the currently-active episode reads as
235
+ // active (filled underline, full-brightness text), every other episode
236
+ // reads as inactive (dimmed, no underline) - the user's own ask: "if episode
237
+ // 1 is active, the episode 2 tab is inactive." Only rendered when the
238
+ // chain spec actually named real Flows (chainFlow tags each via
239
+ // BlockInfo - same gate the "Episode N:" heading already uses); an
240
+ // ad hoc block chain with no episodes shows no tab bar at all.
241
+ "#wg-episodes{display:flex;gap:4px;margin:0 0 10px;border-bottom:1px solid #3a2a60;}" +
242
+ "#wg-episodes .wg-ep-tab{padding:6px 14px 8px;font:600 12px system-ui,sans-serif;" +
243
+ "border-bottom:2px solid transparent;margin-bottom:-1px;white-space:nowrap;}" +
244
+ "#wg-episodes .wg-ep-current{color:#fff;border-bottom-color:#7C3AED;}" +
245
+ "#wg-episodes .wg-ep-done{color:#9a7ad1;}" +
246
+ "#wg-episodes .wg-ep-upcoming{color:#5a4a80;}" +
247
+ // A one-time, gentle signal for "you just entered this episode" - the user:
248
+ // "i want a clear ui eyes friendly to remind me that i am on next
249
+ // episode." A slow outward glow, not an opacity blink/strobe (that's
250
+ // exactly the kind of flashing that already caused the original
251
+ // complaint) - plays once (no loop), 1.1s, only on the FIRST block of a
252
+ // newly-entered episode, not on every step within it.
253
+ "@keyframes wg-ep-enter{0%{box-shadow:0 0 0 0 rgba(124,58,237,.55);}" +
254
+ "100%{box-shadow:0 0 0 10px rgba(124,58,237,0);}}" +
255
+ "#wg-episodes .wg-ep-entered{border-radius:6px;animation:wg-ep-enter 1.1s ease-out;}" +
256
+ // Block strip: carousel (default) or classic wrap (--full).
257
+ "#wg-modules.wg-modules-carousel{display:flex;flex-wrap:nowrap;gap:8px;margin:0 0 10px;" +
258
+ "overflow-x:auto;scroll-snap-type:x mandatory;-webkit-overflow-scrolling:touch;" +
259
+ "padding:4px 2px 8px;scrollbar-width:thin;}" +
260
+ "#wg-modules.wg-modules-carousel .wg-mod{flex:0 0 auto;scroll-snap-align:center;" +
261
+ "padding:6px 12px;border-radius:999px;font:600 12px system-ui,sans-serif;}" +
262
+ "#wg-modules.wg-modules-carousel .wg-mod-current{transform:scale(1.06);" +
263
+ "box-shadow:0 0 0 2px rgba(124,58,237,.45);}" +
264
+ "#wg-modules.wg-modules-full{display:flex;flex-wrap:wrap;gap:6px;margin:0 0 10px;}" +
265
+ "#wg-modules.wg-modules-full .wg-mod{padding:3px 9px;border-radius:6px;font:600 11px system-ui,sans-serif;}" +
266
+ "#wg-modules .wg-mod-done{background:#2a1650;color:#9a7ad1;}" +
267
+ "#wg-modules .wg-mod-current{background:#7C3AED;color:#fff;}" +
268
+ "#wg-modules .wg-mod-upcoming{background:transparent;color:#5a4a80;border:1px solid #3a2a60;}" +
269
+ // #wg-banner: comes from the shared bundle (ui/css/banner.css) now - not redefined here.
270
+ "#wg-panel .wg-key{margin:8px 0;}" +
271
+ // A live, human-readable preview of what's about to be written for this
272
+ // MemKey - the user: "i want pretty to exist in memkeys too... it shows what
273
+ // input its gonig to be written." Same global Pretty/JSON preference the
274
+ // result display already has (window.__wgPretty) - hidden entirely in
275
+ // JSON mode, since the raw textarea already speaks for itself there.
276
+ "#wg-panel .wg-key-pretty{margin-top:4px;font:12px/1.5 system-ui,sans-serif;" +
277
+ "background:#0f0620;border-radius:6px;padding:6px 8px;}" +
278
+ "#wg-panel .wg-key-pretty-row{color:#f0e8ff;}" +
279
+ "#wg-panel .wg-key-pretty-label{color:#9a7ad1;font-weight:600;}" +
280
+ "#wg-panel label{display:block;font-size:12px;color:#d8c8ff;margin-bottom:3px;}" +
281
+ "#wg-panel textarea{width:100%;box-sizing:border-box;background:#0f0620;color:#fff;" +
282
+ "border:1px solid #4b2a80;border-radius:8px;padding:6px 8px;font:12px/1.3 monospace;resize:vertical;}" +
283
+ "#wg-panel button{margin-top:10px;background:#7C3AED;color:#fff;border:none;border-radius:8px;" +
284
+ "padding:8px 16px;font:600 13px system-ui,sans-serif;cursor:pointer;}" +
285
+ "#wg-panel button:hover{background:#6b2fd6;}" +
286
+ "#wg-panel button:disabled{background:#4b2a80;cursor:default;opacity:.7;}" +
287
+ "#wg-panel textarea:disabled{opacity:.6;}" +
288
+ "#wg-panel .wg-result{font:12px/1.4 monospace;background:#0f0620;border-radius:8px;padding:8px;" +
289
+ "margin:8px 0;white-space:pre-wrap;}" +
290
+ "#wg-panel .wg-result-pretty{font:600 14px/1.4 system-ui,sans-serif;}" +
291
+ "#wg-panel .wg-toggle{display:flex;gap:4px;margin:0 0 4px;}" +
292
+ "#wg-panel .wg-toggle button{margin:0;padding:3px 10px;font:600 11px system-ui,sans-serif;" +
293
+ "background:transparent;border:1px solid #4b2a80;color:#9a7ad1;border-radius:6px;}" +
294
+ "#wg-panel .wg-toggle button.wg-active{background:#4b2a80;color:#fff;}" +
295
+ "#wg-panel.wg-error{border:1.5px solid #e0475c;}" +
296
+ "#wg-panel .wg-error-heading{color:#ff8fa0;}" +
297
+ "#wg-panel .wg-error-msg{font:12px/1.5 monospace;background:#2a0f16;color:#ffc7cf;" +
298
+ "border-radius:8px;padding:10px;margin:0 0 12px;white-space:pre-wrap;max-height:200px;overflow-y:auto;}" +
299
+ "#wg-panel .wg-error-actions{display:flex;gap:8px;}" +
300
+ "#wg-panel .wg-error-stop{background:#e0475c;margin-top:0;}" +
301
+ "#wg-panel .wg-error-stop:hover{background:#c33a4c;}" +
302
+ "#wg-panel .wg-error-retry{background:#2a9d6f;margin-top:0;}" +
303
+ "#wg-panel .wg-error-retry:hover{background:#22855e;}" +
304
+ "#wg-panel.wg-expected{border:1.5px solid #e0a53e;}" +
305
+ "#wg-panel .wg-expected-heading{color:#ffcf7a;}" +
306
+ "#wg-panel .wg-expected-reason{font:600 12.5px/1.5 system-ui,sans-serif;background:#2a2410;" +
307
+ "color:#ffe6ae;border-radius:8px;padding:10px;margin:0 0 8px;}" +
308
+ // Hide / Show chrome: collapsed = compact "N / M · block" pill + Next (manual).
309
+ "#wg-panel .wg-chrome{display:flex;align-items:center;justify-content:space-between;gap:8px;margin:0 0 8px;}" +
310
+ "#wg-panel .wg-chrome-title{font:700 11px/1.2 system-ui,sans-serif;color:#c9a6ff;" +
311
+ "letter-spacing:.04em;text-transform:uppercase;flex:1;min-width:0;display:flex;align-items:center;gap:4px;}" +
312
+ // Animated fast-forward indicator on the collapsed bottom-center pill - a blitzed/FF step has
313
+ // no ring, no narration theater, nothing else visible marking it as different, so it read as
314
+ // just another normal step with no explanation for why it snapped past instantly.
315
+ "#wg-panel .wg-ff-icon{display:inline-flex;align-items:center;flex-shrink:0;width:13px;height:13px;}" +
316
+ "#wg-panel .wg-ff-icon svg{width:100%;height:100%;display:block;}" +
317
+ "#wg-panel .wg-ff-icon .wg-ff-chev{animation:wg-ff-pulse 900ms ease-in-out infinite;}" +
318
+ "#wg-panel .wg-ff-icon .wg-ff-chev:nth-child(2){animation-delay:150ms;}" +
319
+ "@keyframes wg-ff-pulse{0%,100%{opacity:.3;transform:translateX(-1.5px);}50%{opacity:1;transform:translateX(1.5px);}}" +
320
+ "#wg-panel .wg-chrome-actions{display:flex;align-items:center;gap:6px;flex-shrink:0;}" +
321
+ "#wg-panel button.wg-hide-btn,#wg-panel button.wg-mini-next{margin:0;padding:4px 10px;font:600 11px system-ui,sans-serif;" +
322
+ "background:#3a2a60;color:#e8dcff;border:1px solid #5b3aa8;border-radius:6px;cursor:pointer;}" +
323
+ "#wg-panel button.wg-hide-btn:hover,#wg-panel button.wg-mini-next:hover{background:#4b2a80;}" +
324
+ "#wg-panel button.wg-mini-next{background:#2a9d6f;border-color:#22855e;color:#fff;display:none;}" +
325
+ "#wg-panel button.wg-mini-next:hover{background:#22855e;}" +
326
+ "#wg-panel button.wg-mini-next:disabled{opacity:.55;cursor:default;}" +
327
+ "#wg-panel.wg-collapsed{width:auto;max-width:92vw;padding:8px 12px;max-height:none;overflow:hidden;}" +
328
+ "#wg-panel.wg-collapsed .wg-body{display:none;}" +
329
+ "#wg-panel.wg-collapsed .wg-chrome{margin:0;}" +
330
+ "#wg-panel.wg-collapsed .wg-chrome-title{font:700 13px/1.25 system-ui,sans-serif;color:#fff;" +
331
+ "letter-spacing:0;text-transform:none;}" +
332
+ "#wg-panel.wg-collapsed button.wg-mini-next.wg-mini-next-show{display:inline-block;}" +
333
+ "@media (max-width:640px){" +
334
+ "#wg-panel{left:8px;right:8px;bottom:8px;transform:none;max-width:none;width:auto;" +
335
+ "max-height:min(55vh,calc(100vh - 16px));padding:12px 14px;border-radius:12px;}" +
336
+ "#wg-panel.wg-collapsed{left:50%;right:auto;transform:translateX(-50%);width:auto;}" +
337
+ "#wg-episodes{overflow-x:auto;-webkit-overflow-scrolling:touch;flex-wrap:nowrap;}" +
338
+ "#wg-panel .wg-narration{font-size:13px;}" +
339
+ "#wg-panel button{width:100%;}" +
340
+ "#wg-panel.wg-collapsed button.wg-mini-next,#wg-panel.wg-collapsed button.wg-hide-btn{width:auto;}" +
341
+ "#wg-panel .wg-error-actions{flex-direction:column;}" +
342
+ "#wg-banner{max-width:min(92vw,320px);font-size:13px;}" +
343
+ "}";
344
+ // Purple dot favicon (matches the overlay's own theme color) - the tab-bar
345
+ // signal that "this Chromium window is a waygraph run," even at a glance
346
+ // across a taskbar/alt-tab, not just something visible inside the page.
347
+ export const WAYGRAPH_FAVICON = "data:image/svg+xml," +
348
+ encodeURIComponent("<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'>" +
349
+ "<circle cx='16' cy='16' r='14' fill='#7C3AED'/></svg>");
350
+ // Rules that style the HOST page (device stage) - these must stay in the light DOM, outside the overlay's shadow root.
351
+ export const HOST_CSS =
352
+ // Video device stage: keep recordVideo size fixed; center a device-sized shell.
353
+ "html.wg-video-device-stage{background:#0b1220 !important;}" +
354
+ "html.wg-video-device-stage body{margin:0 !important;min-height:100vh !important;" +
355
+ "display:flex !important;align-items:center !important;justify-content:center !important;" +
356
+ "background:#0b1220 !important;overflow:hidden !important;}" +
357
+ "#wg-device-shell{flex-shrink:0;overflow:auto;background:#fff;" +
358
+ "border-radius:16px;box-shadow:0 24px 80px rgba(0,0,0,.55),0 0 0 1px rgba(255,255,255,.08);" +
359
+ "transform-origin:center center;" +
360
+ /* Force radius clip on all corners (Chrome + transform/scale). */
361
+ "-webkit-mask-image:-webkit-radial-gradient(white,black);" +
362
+ "isolation:isolate;" +
363
+ "transition:border-radius .55s cubic-bezier(.22,1,.36,1),box-shadow .55s ease," +
364
+ "transform .55s cubic-bezier(.22,1,.36,1),width .5s ease,height .5s ease,max-width .5s ease,max-height .5s ease;}" +
365
+ "#wg-device-shell.wg-shell-enter{border-radius:0;box-shadow:none;}" +
366
+ "#wg-device-shell.wg-shell-shutter-out{border-radius:0 !important;" +
367
+ "box-shadow:none !important;outline:none !important;border:none !important;}" +
368
+ "#wg-device-shell.wg-shell-desktop-flat{border-radius:0 !important;box-shadow:none !important;" +
369
+ "outline:none !important;border:none !important;-webkit-mask-image:none;}";
@@ -0,0 +1,31 @@
1
+ import type { BannerUiState, StepperRefs, WgPage } from "../types.js";
2
+ import type { StubPhaseResult } from "../../engine/stub/stub.js";
3
+ import type { TodoDockState, TodoDockUiOpts } from "../../engine/stub/todos.js";
4
+ import type { DeviceState } from "../../engine/stub/viewport.js";
5
+ export declare function createOverlayStage(page: WgPage, { todoDockRef, deviceRef }: Pick<StepperRefs, never> & {
6
+ todoDockRef: StepperRefs["todoDock"];
7
+ deviceRef: StepperRefs["device"];
8
+ }): {
9
+ state: {
10
+ lastTodoDock: TodoDockState | undefined;
11
+ lastDevice: DeviceState | undefined;
12
+ lastBannerUi: BannerUiState;
13
+ };
14
+ pushTodoDockUi: (patch: TodoDockUiOpts | undefined) => Promise<void>;
15
+ rememberTodoDock: (dock: TodoDockState | undefined, sync: "set" | "clear" | "keep", parallel: boolean) => void;
16
+ syncAllTodoDocks: (opts?: {
17
+ parallel?: boolean;
18
+ }) => Promise<void>;
19
+ applyPhase: (phase: StubPhaseResult, { reapplyDeviceOnKeep }?: {
20
+ reapplyDeviceOnKeep?: boolean | undefined;
21
+ }) => Promise<{
22
+ appliedTodo: {
23
+ dock: TodoDockState | undefined;
24
+ sync: "set" | "clear" | "keep";
25
+ };
26
+ appliedDevice: {
27
+ device: DeviceState | undefined;
28
+ sync: "set" | "clear" | "keep";
29
+ };
30
+ }>;
31
+ };
@@ -0,0 +1,106 @@
1
+ import { applyDevicePhase } from "../narration/device.js";
2
+ import { applyTodoPhase, resolveTodoDockUi } from "../narration/todo-dock.js";
3
+ import { applyDeviceToPage } from "./device-stage.js";
4
+ import { bannerUiFromPhase } from "../stepper/banner-log.js";
5
+ import { ignorePageGone } from "../../engine/page-gone.js";
6
+ export function createOverlayStage(page, { todoDockRef, deviceRef }) {
7
+ /** Carried across steps: omitting a fixture in a later phase = keep (todos, device, banner UX). */
8
+ const state = {
9
+ lastTodoDock: undefined,
10
+ lastDevice: undefined,
11
+ lastBannerUi: {},
12
+ };
13
+ /** Author todoDockUi patches (merged); resolved against env each step. */
14
+ let lastTodoDockUiPatch = undefined;
15
+ /** Multi-todo: every dock keyed by todoId (or "_default"), survives navigation. */
16
+ const todoDockById = new Map();
17
+ const pushTodoDockUi = async (patch) => {
18
+ if (patch && typeof patch === "object") {
19
+ lastTodoDockUiPatch = { ...(lastTodoDockUiPatch || {}), ...patch };
20
+ }
21
+ const ui = resolveTodoDockUi(lastTodoDockUiPatch);
22
+ await page
23
+ .evaluate((u) => {
24
+ window.__wgTodoDockUi = u;
25
+ }, ui)
26
+ .catch(ignorePageGone);
27
+ };
28
+ const dockRegistryKey = (dock) => dock && dock.id && String(dock.id).trim() ? String(dock.id).trim() : "_default";
29
+ const rememberTodoDock = (dock, sync, parallel) => {
30
+ if (sync === "clear") {
31
+ todoDockById.clear();
32
+ return;
33
+ }
34
+ if (sync === "set" && dock) {
35
+ if (!parallel)
36
+ todoDockById.clear();
37
+ todoDockById.set(dockRegistryKey(dock), dock);
38
+ return;
39
+ }
40
+ // keep: refresh / re-seed so syncAllTodoDocks never sees an empty map
41
+ // while lastTodoDock still carries (nav wipe + mid-act advance).
42
+ if (sync === "keep" && dock) {
43
+ todoDockById.set(dockRegistryKey(dock), dock);
44
+ }
45
+ };
46
+ const syncAllTodoDocks = async (opts) => {
47
+ const docks = [...todoDockById.values()];
48
+ const parallel = !!(opts && opts.parallel);
49
+ if (!docks.length) {
50
+ // Empty registry: do NOT clear the DOM. renderBefore/After may have
51
+ // just painted from lastTodoDock (keep). Clearing here made todos
52
+ // vanish until the next ctx.todos() set (PIA #15).
53
+ return;
54
+ }
55
+ await page
56
+ .evaluate(({ list, parallel }) => {
57
+ if (!window.__wgSyncTodos)
58
+ return;
59
+ for (let i = 0; i < list.length; i++) {
60
+ const d = list[i];
61
+ window.__wgSyncTodos({
62
+ sync: "set",
63
+ dock: d,
64
+ todoId: (d && d.id) || null,
65
+ pos: (d && d.pos) || null,
66
+ // First dock replaces; later ones keep siblings when parallel.
67
+ replace: !(parallel && i > 0),
68
+ parallel: parallel && i > 0,
69
+ });
70
+ }
71
+ }, { list: docks, parallel })
72
+ .catch(ignorePageGone);
73
+ };
74
+ /**
75
+ * Merge one resolved stub phase (banner UX, todo dock, device) into the carried state and push it to the page.
76
+ * `reapplyDeviceOnKeep`: also re-apply the carried device when the phase says keep (after a navigation wipe).
77
+ */
78
+ const applyPhase = async (phase, { reapplyDeviceOnKeep = false } = {}) => {
79
+ state.lastBannerUi = { ...state.lastBannerUi, ...bannerUiFromPhase(phase) };
80
+ const appliedTodo = applyTodoPhase(state.lastTodoDock, {
81
+ todoSync: phase.todoSync,
82
+ todoDock: phase.todoDock,
83
+ todos: phase.todos,
84
+ todoPos: phase.todoPos,
85
+ });
86
+ state.lastTodoDock = appliedTodo.dock;
87
+ todoDockRef.current = state.lastTodoDock;
88
+ rememberTodoDock(appliedTodo.dock, appliedTodo.sync, !!phase.todoParallel);
89
+ const appliedDevice = applyDevicePhase(state.lastDevice, {
90
+ deviceSync: phase.deviceSync,
91
+ device: phase.device,
92
+ });
93
+ state.lastDevice = appliedDevice.device;
94
+ deviceRef.current = state.lastDevice;
95
+ if (appliedDevice.sync !== "keep" || (reapplyDeviceOnKeep && state.lastDevice)) {
96
+ await applyDeviceToPage(page, state.lastDevice, appliedDevice.sync);
97
+ // A deliberate settle beat: applyDeviceToPage's own viewport lerp is fully awaited above, but
98
+ // a ring/camera-zoom transition kicked off immediately after (the very next thing this step
99
+ // does) reads as happening AT THE SAME TIME as the device change on video, with no visual
100
+ // breathing room between them - two transitions with no gap look like one confused one.
101
+ await new Promise((r) => setTimeout(r, 220));
102
+ }
103
+ return { appliedTodo, appliedDevice };
104
+ };
105
+ return { state, pushTodoDockUi, rememberTodoDock, syncAllTodoDocks, applyPhase };
106
+ }
@@ -0,0 +1,10 @@
1
+ import type { BannerUiState, WgPage } from "../types.js";
2
+ /**
3
+ * `ui` = authored banner UX from the stub phase: { pos, collision, hidden } (all optional).
4
+ * `caption` = bottom subtitle-bar text (ctx.caption()/ctx.hideCaption()) - `undefined` leaves it
5
+ * alone (unset this step), `""` hides it, any other string shows/updates it.
6
+ * `networkTabVisible` = network-tab panel shown/hidden (ctx.showNetworkTab()/hideNetworkTab()) -
7
+ * `undefined` leaves it alone (default state is hidden, set the very first time restoreNetworkHistory
8
+ * builds a panel); capture itself is unconditional and unaffected by this either way.
9
+ */
10
+ export declare function installOverlay(page: WgPage, title?: string, ui?: BannerUiState | null, caption?: string, networkTabVisible?: boolean): Promise<void>;
@@ -0,0 +1,89 @@
1
+ import { HOST_CSS, RUNNER_EXTRA_CSS, WAYGRAPH_FAVICON } from "./overlay-css.js";
2
+ import { ensureShadowRoot } from "./ui/shadow.js";
3
+ import { resolveTodoDockUi } from "../narration/todo-dock.js";
4
+ import { installCore } from "./inpage/core.js";
5
+ import { installSwipeZoom } from "./inpage/swipe-zoom.js";
6
+ import { installBanner } from "./inpage/banner.js";
7
+ import { showCaption, hideCaption } from "./inpage/caption.js";
8
+ import { installStamp } from "./inpage/stamp.js";
9
+ import { installPanelChrome } from "./inpage/panel-chrome.js";
10
+ import { installTodos } from "./inpage/todos.js";
11
+ import { installDevice } from "./inpage/device-chip.js";
12
+ import { applyVideoDeviceStage } from "./device-stage.js";
13
+ import { installNetworkCapture, restoreNetworkHistory } from "./network-capture.js";
14
+ import { setNetworkTabVisible } from "./inpage/network.js";
15
+ import { envFlag, envString } from "../../engine/env.js";
16
+ import { ignorePageGone } from "../../engine/page-gone.js";
17
+ /**
18
+ * `ui` = authored banner UX from the stub phase: { pos, collision, hidden } (all optional).
19
+ * `caption` = bottom subtitle-bar text (ctx.caption()/ctx.hideCaption()) - `undefined` leaves it
20
+ * alone (unset this step), `""` hides it, any other string shows/updates it.
21
+ * `networkTabVisible` = network-tab panel shown/hidden (ctx.showNetworkTab()/hideNetworkTab()) -
22
+ * `undefined` leaves it alone (default state is hidden, set the very first time restoreNetworkHistory
23
+ * builds a panel); capture itself is unconditional and unaffected by this either way.
24
+ */
25
+ export async function installOverlay(page, title, ui, caption, networkTabVisible) {
26
+ // ring/cursor/banner/dock come from the ONE shared bundle every surface installs (ui/css/*.css).
27
+ await ensureShadowRoot(page);
28
+ // Idempotent (guarded on page.__wgNetworkCaptureInstalled) - safe to call every step even though
29
+ // installOverlay itself runs every step; the page.on() listeners this installs are attached to
30
+ // the Page object, not any one document, so they already survive navigations on their own.
31
+ installNetworkCapture(page);
32
+ // Visibility is Node-side state too (page.__wgNetworkTabVisible), same reason history is: a
33
+ // navigation wipes window.__wgNetworkTabVisible along with the rest of the page-side JS state,
34
+ // so "shown" would silently revert to the hidden default on the very next navigated step without
35
+ // this. Default false (hidden) - matches addNetworkEntry's own default-hidden behavior.
36
+ if (networkTabVisible !== undefined)
37
+ page.__wgNetworkTabVisible = !!networkTabVisible;
38
+ await page.evaluate((v) => { window.__wgNetworkTabVisible = v; }, !!page.__wgNetworkTabVisible).catch(ignorePageGone);
39
+ // Real bug this fixes: a navigation wipes the shadow root (and with it, the network panel's DOM
40
+ // and in-page entry list) - without replaying page.__wgNetworkHistory (Node-side, survives
41
+ // navigation) back in every step, the "network tab" silently reset to empty on any step that
42
+ // navigated, instead of staying persistent like a real Network tab.
43
+ await restoreNetworkHistory(page);
44
+ // Explicit toggle too, not just the flag write above - covers the case where the panel already
45
+ // existed (no restore ran this step) and this step's `networkTabVisible` differs from before.
46
+ if (networkTabVisible !== undefined) {
47
+ await page.evaluate(setNetworkTabVisible, networkTabVisible).catch(ignorePageGone);
48
+ }
49
+ // Runner-only chrome (step panel, zoom/typing/device chips) - separate key, no collision.
50
+ await page.evaluate(([css, key]) => __wgCss(css, key), [RUNNER_EXTRA_CSS, "wg-runner-css"]).catch(ignorePageGone);
51
+ await page.addStyleTag({ content: HOST_CSS }).catch(ignorePageGone);
52
+ // Default top-left; override with WAYGRAPH_TITLE_POS=left|center|right.
53
+ // Click cycles left -> center -> right (persisted in localStorage so a
54
+ // navigation that rebuilds the banner keeps the human's last pick).
55
+ const envPos = (envString("WAYGRAPH_TITLE_POS") || "left").toLowerCase();
56
+ const bannerPos = envPos === "center" || envPos === "right" ? envPos : "left";
57
+ const envTodoPos = (envString("WAYGRAPH_TODO_POS") || "left").toLowerCase();
58
+ const todoPos = envTodoPos === "right" ? "right" : "left";
59
+ const envAutoplay = envFlag("WAYGRAPH_AUTOPLAY");
60
+ const todoDockUi = resolveTodoDockUi();
61
+ const args = { title, favicon: WAYGRAPH_FAVICON, bannerPos, todoPos, envAutoplay, todoDockUi, bannerUi: ui || null };
62
+ await page.evaluate(installCore, args).catch(ignorePageGone);
63
+ await page.evaluate(installSwipeZoom, args).catch(ignorePageGone);
64
+ await page.evaluate(installBanner, args).catch(ignorePageGone);
65
+ await page.evaluate(installStamp, args).catch(ignorePageGone);
66
+ await page.evaluate(installPanelChrome, args).catch(ignorePageGone);
67
+ await page.evaluate(installTodos, args).catch(ignorePageGone);
68
+ await page.evaluate(installDevice, args).catch(ignorePageGone);
69
+ if (caption !== undefined) {
70
+ if (caption === "") {
71
+ await page.evaluate(hideCaption).catch(ignorePageGone);
72
+ }
73
+ else {
74
+ await page.evaluate(showCaption, caption).catch(ignorePageGone);
75
+ }
76
+ }
77
+ // Navigations wipe #wg-device-shell - rebuild when video stage + device are live.
78
+ // If we already shuttered to desktop-flat, re-apply FLAT (never re-add bezel).
79
+ if (page.__wgVideoViewport &&
80
+ page.__wgDeviceShell &&
81
+ page.__wgDeviceShell.width &&
82
+ page.__wgDeviceShell.height) {
83
+ await applyVideoDeviceStage(page, page.__wgDeviceShell, page.__wgVideoViewport, {
84
+ clear: false,
85
+ shutterOut: !!page.__wgDesktopFlat,
86
+ desktopFlat: !!page.__wgDesktopFlat,
87
+ });
88
+ }
89
+ }
@@ -1,5 +1,5 @@
1
- import type { StubPhaseResult } from "../highlights.js";
2
- import type { PilotHighlightFixtures } from "./fixtures.js";
1
+ import type { StubPhaseResult } from "../../engine/stub/stub.js";
2
+ import type { PilotHighlightFixtures } from "./pilot/fixtures.js";
3
3
  /**
4
4
  * The reverse: a resolved stub phase (what `runStubPhase` returns for a Block's stubBefore/After/OnError)
5
5
  * -> what the Pilot painter takes. Lets `auto/browser/pilot send` paint a Block's authored waygraph overlay
@@ -48,8 +48,8 @@ export function describeOverlayFixtures(tag, f) {
48
48
  out.push(`${tag} ctx.bannerUi(${JSON.stringify(f.bannerUi)})`);
49
49
  if (f.todos?.length)
50
50
  out.push(`${tag} ctx.todos n=${f.todos.length} index=${f.todoIndex ?? 0}${f.todoPos ? ` pos=${f.todoPos}` : ""}`);
51
- if (f.todoDockUi ?? f.todoUi)
52
- out.push(`${tag} ctx.todoDockUi(${JSON.stringify(f.todoDockUi ?? f.todoUi)})`);
51
+ if (f.todoUi)
52
+ out.push(`${tag} todoUi ${JSON.stringify(f.todoUi)}`);
53
53
  if (f.device)
54
54
  out.push(`${tag} ctx.device(${typeof f.device === "string" ? f.device : f.device.preset ?? "custom"})`);
55
55
  if (f.zoom)