waygraph 0.15.54 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (510) hide show
  1. package/README.md +8 -3
  2. package/bin/waygraph +2 -2
  3. package/dist/analysis/check.d.ts +38 -0
  4. package/dist/analysis/check.js +87 -0
  5. package/dist/analysis/coverage-gap.d.ts +1 -1
  6. package/dist/analysis/coverage-gap.js +14 -37
  7. package/dist/analysis/flow-source.d.ts +9 -0
  8. package/dist/analysis/flow-source.js +25 -0
  9. package/dist/analysis/graph.d.ts +10 -14
  10. package/dist/analysis/graph.js +48 -371
  11. package/dist/analysis/map-check.js +4 -39
  12. package/dist/analysis/practices-check.d.ts +1 -1
  13. package/dist/analysis/practices-check.js +24 -45
  14. package/dist/cli/args.d.ts +23 -0
  15. package/dist/cli/args.js +20 -0
  16. package/dist/{cli.d.ts → cli/cli.d.ts} +0 -1
  17. package/dist/{cli.js → cli/cli.js} +10 -9
  18. package/dist/{commands → cli/commands}/agent-dive-scaffold.js +35 -64
  19. package/dist/cli/commands/agent-dive.js +42 -0
  20. package/dist/{commands → cli/commands}/check.d.ts +0 -1
  21. package/dist/cli/commands/check.js +104 -0
  22. package/dist/cli/commands/codemod-checkpoints.d.ts +18 -0
  23. package/dist/cli/commands/codemod-checkpoints.js +186 -0
  24. package/dist/cli/commands/codemod-flows.d.ts +18 -0
  25. package/dist/cli/commands/codemod-flows.js +284 -0
  26. package/dist/cli/commands/codemod-stubs.d.ts +10 -0
  27. package/dist/cli/commands/codemod-stubs.js +187 -0
  28. package/dist/{commands → cli/commands}/extensions.js +5 -4
  29. package/dist/{commands → cli/commands}/init.js +1 -2
  30. package/dist/{commands → cli/commands}/list.js +9 -7
  31. package/dist/cli/commands/manifest.d.ts +2 -0
  32. package/dist/cli/commands/manifest.js +20 -0
  33. package/dist/cli/commands/map.js +57 -0
  34. package/dist/{commands → cli/commands}/run.d.ts +0 -1
  35. package/dist/cli/commands/run.js +64 -0
  36. package/dist/{commands → cli/commands}/session.js +61 -88
  37. package/dist/{commands → cli/commands}/test.js +11 -14
  38. package/dist/cli/commands/traverse.js +105 -0
  39. package/dist/{commands → cli/commands}/try.js +29 -25
  40. package/dist/{commands → cli/commands}/upgrade.js +40 -4
  41. package/dist/cli/flags.d.ts +193 -16
  42. package/dist/cli/flags.js +179 -234
  43. package/dist/cli/run-chain.d.ts +1 -0
  44. package/dist/cli/run-chain.js +42 -7
  45. package/dist/cli/usage.d.ts +1 -1
  46. package/dist/cli/usage.js +21 -53
  47. package/dist/cli/util.d.ts +2 -2
  48. package/dist/cli/util.js +2 -3
  49. package/dist/{highlights → demo/narration}/css.d.ts +1 -1
  50. package/dist/{highlights → demo/narration}/css.js +2 -3
  51. package/dist/{highlights → demo/narration}/demo-pace.d.ts +3 -11
  52. package/dist/{highlights → demo/narration}/demo-pace.js +5 -11
  53. package/dist/{highlights → demo/narration}/device.d.ts +2 -2
  54. package/dist/{highlights → demo/narration}/device.js +1 -1
  55. package/dist/demo/narration/merge.d.ts +8 -0
  56. package/dist/demo/narration/merge.js +71 -0
  57. package/dist/{highlights/run-phase.d.ts → demo/narration/narration.d.ts} +10 -14
  58. package/dist/{highlights/run-phase.js → demo/narration/narration.js} +25 -94
  59. package/dist/{highlights → demo/narration}/shorthand.d.ts +1 -1
  60. package/dist/demo/narration/stub-ctx.d.ts +8 -0
  61. package/dist/demo/narration/stub-ctx.js +164 -0
  62. package/dist/{highlights → demo/narration}/style.d.ts +1 -7
  63. package/dist/{highlights → demo/narration}/style.js +1 -41
  64. package/dist/{highlights → demo/narration}/todo-dock.d.ts +3 -3
  65. package/dist/{highlights → demo/narration}/todo-dock.js +13 -30
  66. package/dist/demo/overlay/auto-chrome.d.ts +7 -0
  67. package/dist/demo/overlay/auto-chrome.js +97 -0
  68. package/dist/demo/overlay/cursor.d.ts +12 -0
  69. package/dist/demo/overlay/cursor.js +142 -0
  70. package/dist/demo/overlay/device-stage.d.ts +13 -0
  71. package/dist/demo/overlay/device-stage.js +396 -0
  72. package/dist/demo/overlay/inpage/banner.d.ts +1 -0
  73. package/dist/demo/overlay/inpage/banner.js +160 -0
  74. package/dist/demo/overlay/inpage/caption.d.ts +2 -0
  75. package/dist/demo/overlay/inpage/caption.js +24 -0
  76. package/dist/demo/overlay/inpage/core.d.ts +1 -0
  77. package/dist/demo/overlay/inpage/core.js +345 -0
  78. package/dist/demo/overlay/inpage/device-chip.d.ts +1 -0
  79. package/dist/demo/overlay/inpage/device-chip.js +191 -0
  80. package/dist/demo/overlay/inpage/network.d.ts +9 -0
  81. package/dist/demo/overlay/inpage/network.js +200 -0
  82. package/dist/demo/overlay/inpage/panel-chrome.d.ts +1 -0
  83. package/dist/demo/overlay/inpage/panel-chrome.js +203 -0
  84. package/dist/demo/overlay/inpage/stamp.d.ts +1 -0
  85. package/dist/demo/overlay/inpage/stamp.js +46 -0
  86. package/dist/demo/overlay/inpage/swipe-zoom.d.ts +1 -0
  87. package/dist/demo/overlay/inpage/swipe-zoom.js +220 -0
  88. package/dist/demo/overlay/inpage/todos.d.ts +1 -0
  89. package/dist/demo/overlay/inpage/todos.js +294 -0
  90. package/dist/demo/overlay/locator-theater.d.ts +25 -0
  91. package/dist/demo/overlay/locator-theater.js +76 -0
  92. package/dist/demo/overlay/network-capture.d.ts +22 -0
  93. package/dist/demo/overlay/network-capture.js +127 -0
  94. package/dist/demo/overlay/overlay-css.d.ts +3 -0
  95. package/dist/demo/overlay/overlay-css.js +369 -0
  96. package/dist/demo/overlay/overlay-stage.d.ts +23 -0
  97. package/dist/demo/overlay/overlay-stage.js +106 -0
  98. package/dist/demo/overlay/overlay.d.ts +10 -0
  99. package/dist/demo/overlay/overlay.js +89 -0
  100. package/dist/{pilot-overlay/overlay-fixtures.d.ts → demo/overlay/phase-fixtures.d.ts} +2 -2
  101. package/dist/{pilot-overlay/overlay-fixtures.js → demo/overlay/phase-fixtures.js} +2 -2
  102. package/dist/{pilot-overlay/action-ring.js → demo/overlay/pilot/actions.js} +2 -1
  103. package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.d.ts +6 -5
  104. package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.js +19 -18
  105. package/dist/{pilot-overlay → demo/overlay/pilot}/shell.d.ts +2 -2
  106. package/dist/{pilot-overlay → demo/overlay/pilot}/shell.js +13 -22
  107. package/dist/demo/overlay/reattach.d.ts +7 -0
  108. package/dist/demo/overlay/reattach.js +23 -0
  109. package/dist/demo/overlay/rings.d.ts +33 -0
  110. package/dist/demo/overlay/rings.js +448 -0
  111. package/dist/{ui → demo/overlay/ui}/components/ring.js +2 -2
  112. package/dist/{ui → demo/overlay/ui}/overlay.css +4 -4
  113. package/dist/{ui → demo/overlay/ui}/shadow.d.ts +1 -1
  114. package/dist/{ui → demo/overlay/ui}/shadow.js +39 -2
  115. package/dist/demo/stepper/after.d.ts +3 -0
  116. package/dist/demo/stepper/after.js +113 -0
  117. package/dist/demo/stepper/banner-log.d.ts +37 -0
  118. package/dist/demo/stepper/banner-log.js +63 -0
  119. package/dist/demo/stepper/before.d.ts +4 -0
  120. package/dist/demo/stepper/before.js +110 -0
  121. package/dist/demo/stepper/demo-log.d.ts +31 -0
  122. package/dist/demo/stepper/demo-log.js +309 -0
  123. package/dist/demo/stepper/gate.d.ts +11 -0
  124. package/dist/demo/stepper/gate.js +78 -0
  125. package/dist/demo/stepper/interaction-patch.d.ts +3 -0
  126. package/dist/demo/stepper/interaction-patch.js +323 -0
  127. package/dist/demo/stepper/pacing.d.ts +21 -0
  128. package/dist/demo/stepper/pacing.js +23 -0
  129. package/dist/demo/stepper/slides.d.ts +11 -0
  130. package/dist/demo/stepper/slides.js +233 -0
  131. package/dist/demo/stepper/step-panels.d.ts +21 -0
  132. package/dist/demo/stepper/step-panels.js +589 -0
  133. package/dist/demo/stepper/stepper.d.ts +24 -0
  134. package/dist/demo/stepper/stepper.js +122 -0
  135. package/dist/demo/stepper/teardown.d.ts +48 -0
  136. package/dist/demo/stepper/teardown.js +179 -0
  137. package/dist/demo/stepper/todo-advance.d.ts +14 -0
  138. package/dist/demo/stepper/todo-advance.js +110 -0
  139. package/dist/demo/stepper/view.d.ts +68 -0
  140. package/dist/demo/stepper/view.js +31 -0
  141. package/dist/demo/types.d.ts +17 -0
  142. package/dist/demo/verbose-log.js +15 -0
  143. package/dist/{types.d.ts → engine/block/block.d.ts} +106 -91
  144. package/dist/{core → engine/block}/block.js +10 -53
  145. package/dist/{core → engine/block}/compose.d.ts +9 -7
  146. package/dist/{core → engine/block}/compose.js +1 -1
  147. package/dist/{core/blocks → engine/block/kinds}/api.d.ts +16 -12
  148. package/dist/{core/blocks → engine/block/kinds}/api.js +26 -18
  149. package/dist/{core/blocks → engine/block/kinds}/effect.d.ts +13 -18
  150. package/dist/engine/block/kinds/effect.js +17 -0
  151. package/dist/{core/blocks → engine/block/kinds}/method.d.ts +17 -29
  152. package/dist/{core/blocks → engine/block/kinds}/method.js +6 -21
  153. package/dist/{core/blocks → engine/block/kinds}/nav.d.ts +21 -31
  154. package/dist/{core/blocks → engine/block/kinds}/nav.js +6 -12
  155. package/dist/{core/blocks → engine/block/kinds}/page.d.ts +14 -20
  156. package/dist/{core/blocks → engine/block/kinds}/page.js +5 -7
  157. package/dist/engine/checkpoint/checkpoint.d.ts +22 -0
  158. package/dist/engine/checkpoint/checkpoint.js +8 -0
  159. package/dist/engine/checkpoint/route.d.ts +28 -0
  160. package/dist/engine/checkpoint/route.js +28 -0
  161. package/dist/{core → engine}/config.d.ts +7 -2
  162. package/dist/engine/config.js +6 -0
  163. package/dist/engine/engine.d.ts +45 -0
  164. package/dist/{core → engine}/engine.js +6 -10
  165. package/dist/engine/env.d.ts +59 -0
  166. package/dist/engine/env.js +83 -0
  167. package/dist/{errors.d.ts → engine/errors.d.ts} +22 -22
  168. package/dist/{errors.js → engine/errors.js} +22 -22
  169. package/dist/{core → engine/flow}/branch-regression.d.ts +7 -7
  170. package/dist/{core → engine/flow}/branch-regression.js +4 -3
  171. package/dist/engine/flow/flow.d.ts +162 -0
  172. package/dist/engine/flow/flow.js +244 -0
  173. package/dist/{core → engine/flow}/map-builder.d.ts +34 -39
  174. package/dist/{core → engine/flow}/map-builder.js +45 -47
  175. package/dist/{core → engine}/locate.d.ts +1 -1
  176. package/dist/{core → engine}/locate.js +1 -2
  177. package/dist/{mem-stub.d.ts → engine/mem/mem-stub.d.ts} +9 -8
  178. package/dist/{mem-stub.js → engine/mem/mem-stub.js} +2 -2
  179. package/dist/{mem-page.d.ts → engine/mem/mem.d.ts} +1 -1
  180. package/dist/{mem-page.js → engine/mem/mem.js} +2 -1
  181. package/dist/engine/page-gone.d.ts +5 -0
  182. package/dist/engine/page-gone.js +20 -0
  183. package/dist/engine/run/connect.d.ts +28 -0
  184. package/dist/{types.js → engine/run/connect.js} +11 -10
  185. package/dist/engine/run/events.d.ts +67 -0
  186. package/dist/engine/run/events.js +90 -0
  187. package/dist/engine/run/hooks.d.ts +16 -0
  188. package/dist/engine/run/hooks.js +8 -0
  189. package/dist/engine/run/launch.d.ts +13 -0
  190. package/dist/engine/run/launch.js +27 -0
  191. package/dist/{core/run-graph.d.ts → engine/run/run.d.ts} +8 -12
  192. package/dist/{core/run-graph.js → engine/run/run.js} +22 -12
  193. package/dist/engine/stub/pace.d.ts +12 -0
  194. package/dist/engine/stub/pace.js +2 -0
  195. package/dist/engine/stub/ring.d.ts +130 -0
  196. package/dist/engine/stub/ring.js +41 -0
  197. package/dist/engine/stub/stub.d.ts +268 -0
  198. package/dist/engine/stub/stub.js +1 -0
  199. package/dist/engine/stub/todos.d.ts +104 -0
  200. package/dist/engine/stub/todos.js +2 -0
  201. package/dist/engine/stub/viewport.d.ts +26 -0
  202. package/dist/engine/stub/viewport.js +2 -0
  203. package/dist/{trait.d.ts → engine/trait/trait.d.ts} +1 -1
  204. package/dist/index.d.ts +84 -36
  205. package/dist/index.js +44 -19
  206. package/dist/{session/auto-explore-run.d.ts → live/auto/auto.d.ts} +10 -16
  207. package/dist/{session/auto-explore-run.js → live/auto/auto.js} +164 -254
  208. package/dist/{session/auto-explore.d.ts → live/auto/explore.d.ts} +4 -14
  209. package/dist/{session/auto-explore.js → live/auto/explore.js} +21 -127
  210. package/dist/{auto-session/session.d.ts → live/auto-session/auto-session.d.ts} +1 -1
  211. package/dist/{auto-session/session.js → live/auto-session/auto-session.js} +27 -24
  212. package/dist/{auto-session → live/auto-session}/helpers.d.ts +6 -5
  213. package/dist/{auto-session → live/auto-session}/helpers.js +1 -1
  214. package/dist/{session/auto-session-ipc.d.ts → live/auto-session/ipc.d.ts} +7 -5
  215. package/dist/{session/auto-session-ipc.js → live/auto-session/ipc.js} +31 -16
  216. package/dist/{session/browser.d.ts → live/auto-session/start.d.ts} +1 -2
  217. package/dist/{session/browser.js → live/auto-session/start.js} +2 -3
  218. package/dist/{pilot-overlay → live/pilot}/panel.d.ts +1 -1
  219. package/dist/{pilot-overlay → live/pilot}/panel.js +23 -31
  220. package/dist/{session → live/pilot}/pilot.d.ts +3 -3
  221. package/dist/{session → live/pilot}/pilot.js +4 -4
  222. package/dist/{traverse/run.d.ts → live/traverse/traverse.d.ts} +1 -1
  223. package/dist/{traverse/run.js → live/traverse/traverse.js} +26 -43
  224. package/dist/manifest/manifest.d.ts +52 -0
  225. package/dist/manifest/manifest.js +93 -0
  226. package/dist/manifest/map-imports.d.ts +7 -0
  227. package/dist/manifest/map-imports.js +22 -0
  228. package/dist/manifest/maps.d.ts +33 -0
  229. package/dist/manifest/maps.js +62 -0
  230. package/dist/manifest/pack.d.ts +21 -0
  231. package/dist/manifest/pack.js +109 -0
  232. package/dist/manifest/project.d.ts +60 -0
  233. package/dist/manifest/project.js +101 -0
  234. package/dist/{session/block-inject.js → manifest/roots.js} +1 -18
  235. package/dist/manifest/scan.d.ts +19 -0
  236. package/dist/manifest/scan.js +57 -0
  237. package/dist/manifest/source.d.ts +23 -0
  238. package/dist/manifest/source.js +86 -0
  239. package/dist/runner/mode.d.ts +71 -0
  240. package/dist/runner/mode.js +1 -0
  241. package/dist/runner/modes/branches.d.ts +5 -0
  242. package/dist/runner/modes/branches.js +37 -0
  243. package/dist/runner/modes/demo.d.ts +3 -0
  244. package/dist/runner/modes/demo.js +13 -0
  245. package/dist/runner/modes/report.d.ts +2 -0
  246. package/dist/runner/modes/report.js +54 -0
  247. package/dist/runner/modes/run.d.ts +2 -0
  248. package/dist/runner/modes/run.js +3 -0
  249. package/dist/runner/options.d.ts +31 -0
  250. package/dist/runner/options.js +42 -0
  251. package/dist/runner/plan/find.d.ts +18 -0
  252. package/dist/runner/plan/find.js +65 -0
  253. package/dist/runner/plan/plan.d.ts +11 -0
  254. package/dist/runner/plan/plan.js +97 -0
  255. package/dist/runner/plan/seed-mem.d.ts +12 -0
  256. package/dist/runner/plan/seed-mem.js +98 -0
  257. package/dist/runner/plan/spec.d.ts +5 -0
  258. package/dist/runner/plan/spec.js +17 -0
  259. package/dist/runner/play-steps.d.ts +2 -0
  260. package/dist/runner/play-steps.js +59 -0
  261. package/dist/runner/runner.d.ts +4 -0
  262. package/dist/runner/runner.js +64 -0
  263. package/dist/runner/session.d.ts +9 -0
  264. package/dist/runner/session.js +87 -0
  265. package/dist/{browser.js → runtime/browser.js} +4 -2
  266. package/dist/{env-file.js → runtime/env-file.js} +7 -12
  267. package/dist/{extensions.d.ts → runtime/extensions.d.ts} +1 -5
  268. package/dist/{extensions.js → runtime/extensions.js} +2 -1
  269. package/dist/runtime/full-launch.d.ts +1 -0
  270. package/dist/runtime/full-launch.js +34 -0
  271. package/dist/runtime/global-flag.d.ts +5 -0
  272. package/dist/runtime/global-flag.js +18 -0
  273. package/dist/{playwright-config.d.ts → runtime/playwright-config.d.ts} +1 -1
  274. package/dist/{playwright.config.js → runtime/playwright.config.js} +3 -2
  275. package/dist/runtime/run-log.d.ts +2 -0
  276. package/dist/runtime/run-log.js +17 -0
  277. package/dist/{video-dir.js → runtime/video-dir.js} +3 -2
  278. package/dist/{config.d.ts → runtime/waygraph-config.d.ts} +6 -9
  279. package/dist/{config.js → runtime/waygraph-config.js} +21 -51
  280. package/dist/{webserver.js → runtime/webserver.js} +5 -30
  281. package/examples/routed-demo/config/waygraph.config.ts +20 -0
  282. package/examples/routed-demo/package.json +1 -4
  283. package/examples/routed-demo/scripts/fixture-server.mjs +1 -1
  284. package/examples/routed-demo/src/flows/routed-demo-map.flow.ts +2 -4
  285. package/examples/routed-demo/src/flows/routed-demo.flow.ts +1 -2
  286. package/examples/routed-demo/src/map/(app_base)/dashboard/_methods/click-widget.block.ts +5 -4
  287. package/examples/routed-demo/src/map/(app_base)/dashboard/_nav.block.ts +3 -3
  288. package/examples/routed-demo/src/map/(app_base)/dashboard/_page.block.ts +3 -3
  289. package/examples/routed-demo/src/map/(external)/docs/_nav.block.ts +3 -3
  290. package/examples/routed-demo/src/map/(external)/docs/_page.block.ts +3 -3
  291. package/examples/routed-demo/src/states/routed-demo.states.ts +5 -3
  292. package/examples/routed-demo/tests/routed-demo.spec.ts +4 -4
  293. package/examples/routed-demo/tsconfig.json +1 -1
  294. package/examples/saucedemo/docs/CONVENTION.md +4 -5
  295. package/examples/saucedemo/docs/HELPERS.md +11 -11
  296. package/examples/saucedemo/src/blocks/SITE-MAP.md +0 -1
  297. package/examples/saucedemo/src/blocks/saucedemo-web/NAV.md +1 -5
  298. package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -3
  299. package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
  300. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
  301. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
  302. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
  303. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
  304. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +5 -8
  305. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -3
  306. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
  307. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +35 -43
  308. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
  309. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
  310. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
  311. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
  312. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
  313. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
  314. package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -4
  315. package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -4
  316. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +4 -5
  317. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
  318. package/examples/saucedemo/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
  319. package/examples/saucedemo/src/flows/api-demo.flow.ts +12 -10
  320. package/examples/saucedemo/src/states/checkout.states.ts +21 -11
  321. package/examples/saucedemo/src/stubs/device-showcase.ts +8 -10
  322. package/examples/saucedemo/tests/auto-graph.spec.ts +4 -12
  323. package/package.json +10 -6
  324. package/templates/agents/waygraph-planner.agent.md +2 -2
  325. package/templates/quickstart/docs/CONVENTION.md +4 -4
  326. package/templates/quickstart/docs/HELPERS.md +10 -8
  327. package/templates/quickstart/package.json +0 -3
  328. package/templates/quickstart/src/blocks/SITE-MAP.md +0 -1
  329. package/templates/quickstart/src/blocks/saucedemo-web/NAV.md +1 -5
  330. package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -3
  331. package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
  332. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
  333. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
  334. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
  335. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
  336. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +5 -8
  337. package/templates/quickstart/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -3
  338. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
  339. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +35 -43
  340. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
  341. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
  342. package/templates/quickstart/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
  343. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
  344. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
  345. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
  346. package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -4
  347. package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -4
  348. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +4 -5
  349. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
  350. package/templates/quickstart/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
  351. package/templates/quickstart/src/flows/api-demo.flow.ts +12 -10
  352. package/templates/quickstart/src/states/checkout.states.ts +21 -11
  353. package/templates/quickstart/src/stubs/device-showcase.ts +8 -10
  354. package/templates/scaffold/README.md +2 -1
  355. package/templates/scaffold/STRUCTURE.md +5 -4
  356. package/templates/scaffold/config/waygraph.config.ts +1 -0
  357. package/templates/scaffold/gitignore +1 -0
  358. package/templates/scaffold/src/flows/README.md +2 -2
  359. package/templates/scaffold/src/map/(app_base)/docs/_nav.block.ts +3 -3
  360. package/templates/scaffold/src/map/(app_base)/docs/_page.block.ts +3 -3
  361. package/templates/scaffold/src/map/(app_base)/home/_methods/add-item.effect.block.ts +4 -4
  362. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-hello.method.block.ts +3 -3
  363. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-item-added.method.block.ts +3 -3
  364. package/templates/scaffold/src/map/(app_base)/home/_methods/clear-cart.method.block.ts +5 -4
  365. package/templates/scaffold/src/map/(app_base)/home/_methods/remove-item.effect.block.ts +4 -4
  366. package/templates/scaffold/src/map/(app_base)/home/_nav.block.ts +3 -3
  367. package/templates/scaffold/src/map/(app_base)/home/_page.block.ts +3 -3
  368. package/templates/scaffold/src/map/(app_base)/home/nav-verification-link.block.ts +4 -4
  369. package/templates/scaffold/src/map/(external)/hoppscotch/_keys.ts +21 -0
  370. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-body.method.block.ts +4 -4
  371. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-header.method.block.ts +4 -4
  372. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-status.method.block.ts +4 -4
  373. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/pick-extension-interceptor.method.block.ts +5 -4
  374. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-body.method.block.ts +6 -5
  375. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-headers.method.block.ts +6 -5
  376. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/send-request.method.block.ts +5 -4
  377. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-bearer-token.method.block.ts +6 -5
  378. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-headers.method.block.ts +6 -5
  379. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-json-body.method.block.ts +6 -5
  380. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-method.method.block.ts +6 -5
  381. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-query-params.method.block.ts +6 -5
  382. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-url.method.block.ts +6 -5
  383. package/templates/scaffold/src/map/(external)/hoppscotch/_nav.block.ts +3 -3
  384. package/templates/scaffold/src/map/(external)/hoppscotch/_page.block.ts +3 -3
  385. package/templates/scaffold/src/map/(external)/hoppscotch/_states.ts +6 -0
  386. package/templates/scaffold/src/map/(external)/hoppscotch/settings/_nav.block.ts +3 -3
  387. package/templates/scaffold/src/map/(external)/mailpit/_keys.ts +13 -0
  388. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-content.method.block.ts +4 -4
  389. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-received.method.block.ts +4 -4
  390. package/templates/scaffold/src/map/(external)/mailpit/_methods/extract-email-link.method.block.ts +6 -5
  391. package/templates/scaffold/src/map/(external)/mailpit/_methods/open-message.method.block.ts +6 -5
  392. package/templates/scaffold/src/map/(external)/mailpit/_nav.block.ts +3 -3
  393. package/templates/scaffold/src/map/(external)/mailpit/_page.block.ts +3 -3
  394. package/templates/scaffold/src/map/(external)/mailpit/_states.ts +9 -0
  395. package/templates/scaffold/src/map/README.md +7 -0
  396. package/templates/scaffold/src/states/README.md +4 -1
  397. package/templates/scaffold/src/states/demo.mem-keys.ts +1 -29
  398. package/templates/scaffold/src/states/demo.states.ts +14 -20
  399. package/templates/scaffold/tests/hoppscotch.spec.ts +1 -11
  400. package/templates/scaffold/tests/mail-verify.spec.ts +2 -2
  401. package/templates/skills/waygraph-blind-pilot.skill.md +2 -6
  402. package/templates/skills/waygraph-convention.skill.md +23 -14
  403. package/templates/skills/waygraph-pilot.skill.md +7 -4
  404. package/dist/auto-session/verbose-log.js +0 -16
  405. package/dist/auto-session.d.ts +0 -2
  406. package/dist/auto-session.js +0 -3
  407. package/dist/cli/discover.d.ts +0 -40
  408. package/dist/cli/discover.js +0 -148
  409. package/dist/commands/agent-dive.js +0 -52
  410. package/dist/commands/check.js +0 -192
  411. package/dist/commands/map.js +0 -29
  412. package/dist/commands/run.js +0 -104
  413. package/dist/commands/traverse.js +0 -177
  414. package/dist/core/block.d.ts +0 -109
  415. package/dist/core/blocks/effect.js +0 -23
  416. package/dist/core/config.js +0 -17
  417. package/dist/core/engine.d.ts +0 -198
  418. package/dist/core/flow.d.ts +0 -294
  419. package/dist/core/flow.js +0 -432
  420. package/dist/core.d.ts +0 -14
  421. package/dist/core.js +0 -15
  422. package/dist/highlights/merge.d.ts +0 -8
  423. package/dist/highlights/merge.js +0 -173
  424. package/dist/highlights/stub-ctx.d.ts +0 -10
  425. package/dist/highlights/stub-ctx.js +0 -331
  426. package/dist/highlights/types.d.ts +0 -613
  427. package/dist/highlights.d.ts +0 -9
  428. package/dist/highlights.js +0 -10
  429. package/dist/pilot-overlay.d.ts +0 -5
  430. package/dist/pilot-overlay.js +0 -6
  431. package/dist/runner/banner-log.js +0 -63
  432. package/dist/runner/chain-run.js +0 -102
  433. package/dist/runner/cursor.js +0 -140
  434. package/dist/runner/demo-log.js +0 -316
  435. package/dist/runner/device-stage.d.ts +0 -9
  436. package/dist/runner/device-stage.js +0 -420
  437. package/dist/runner/discovery.js +0 -105
  438. package/dist/runner/index.js +0 -2
  439. package/dist/runner/inpage/banner.d.ts +0 -21
  440. package/dist/runner/inpage/banner.js +0 -156
  441. package/dist/runner/inpage/caption.d.ts +0 -3
  442. package/dist/runner/inpage/caption.js +0 -23
  443. package/dist/runner/inpage/core.d.ts +0 -4
  444. package/dist/runner/inpage/core.js +0 -316
  445. package/dist/runner/inpage/device.d.ts +0 -3
  446. package/dist/runner/inpage/device.js +0 -211
  447. package/dist/runner/inpage/network.d.ts +0 -15
  448. package/dist/runner/inpage/network.js +0 -217
  449. package/dist/runner/inpage/panel-chrome.js +0 -192
  450. package/dist/runner/inpage/stamp.js +0 -46
  451. package/dist/runner/inpage/swipe-zoom.js +0 -220
  452. package/dist/runner/inpage/todos.js +0 -337
  453. package/dist/runner/interaction-patch.js +0 -384
  454. package/dist/runner/main.js +0 -469
  455. package/dist/runner/network-capture.d.ts +0 -9
  456. package/dist/runner/network-capture.js +0 -126
  457. package/dist/runner/overlay-css.d.ts +0 -3
  458. package/dist/runner/overlay-css.js +0 -377
  459. package/dist/runner/overlay-install.js +0 -90
  460. package/dist/runner/overlay-stage.js +0 -110
  461. package/dist/runner/rings.js +0 -514
  462. package/dist/runner/seed-mem.js +0 -110
  463. package/dist/runner/slides.js +0 -278
  464. package/dist/runner/step-mode.js +0 -703
  465. package/dist/runner/step-panels.js +0 -729
  466. package/dist/runner/teardown.js +0 -202
  467. package/dist/runner/todo-dock.js +0 -142
  468. package/dist/session/step-overlay.d.ts +0 -37
  469. package/dist/session/step-overlay.js +0 -244
  470. package/examples/routed-demo/playwright.config.ts +0 -21
  471. package/examples/saucedemo/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
  472. package/templates/quickstart/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
  473. /package/dist/{commands → cli/commands}/agent-dive-scaffold.d.ts +0 -0
  474. /package/dist/{commands → cli/commands}/agent-dive.d.ts +0 -0
  475. /package/dist/{commands → cli/commands}/extensions.d.ts +0 -0
  476. /package/dist/{commands → cli/commands}/init.d.ts +0 -0
  477. /package/dist/{commands → cli/commands}/list.d.ts +0 -0
  478. /package/dist/{commands → cli/commands}/map.d.ts +0 -0
  479. /package/dist/{commands → cli/commands}/session.d.ts +0 -0
  480. /package/dist/{commands → cli/commands}/test.d.ts +0 -0
  481. /package/dist/{commands → cli/commands}/traverse.d.ts +0 -0
  482. /package/dist/{commands → cli/commands}/try.d.ts +0 -0
  483. /package/dist/{commands → cli/commands}/upgrade.d.ts +0 -0
  484. /package/dist/{highlights → demo/narration}/shorthand.js +0 -0
  485. /package/dist/{session/overlay-beacon.d.ts → demo/overlay/beacon.d.ts} +0 -0
  486. /package/dist/{session/overlay-beacon.js → demo/overlay/beacon.js} +0 -0
  487. /package/dist/{pilot-overlay/action-ring.d.ts → demo/overlay/pilot/actions.d.ts} +0 -0
  488. /package/dist/{ui → demo/overlay/ui}/components/ring.d.ts +0 -0
  489. /package/dist/{ui → demo/overlay/ui}/stylesheet.d.ts +0 -0
  490. /package/dist/{ui → demo/overlay/ui}/stylesheet.js +0 -0
  491. /package/dist/{ui → demo/overlay/ui}/tokens.d.ts +0 -0
  492. /package/dist/{ui → demo/overlay/ui}/tokens.js +0 -0
  493. /package/dist/{highlights → demo}/types.js +0 -0
  494. /package/dist/{auto-session → demo}/verbose-log.d.ts +0 -0
  495. /package/dist/{selector.d.ts → engine/trait/selector.d.ts} +0 -0
  496. /package/dist/{selector.js → engine/trait/selector.js} +0 -0
  497. /package/dist/{trait.js → engine/trait/trait.js} +0 -0
  498. /package/dist/{traverse → live/traverse}/coverage.d.ts +0 -0
  499. /package/dist/{traverse → live/traverse}/coverage.js +0 -0
  500. /package/dist/{traverse → live/traverse}/lease.d.ts +0 -0
  501. /package/dist/{traverse → live/traverse}/lease.js +0 -0
  502. /package/dist/{session/block-inject.d.ts → manifest/roots.d.ts} +0 -0
  503. /package/dist/{blocks-select.d.ts → manifest/select.d.ts} +0 -0
  504. /package/dist/{blocks-select.js → manifest/select.js} +0 -0
  505. /package/dist/{browser.d.ts → runtime/browser.d.ts} +0 -0
  506. /package/dist/{env-file.d.ts → runtime/env-file.d.ts} +0 -0
  507. /package/dist/{playwright-config.js → runtime/playwright-config.js} +0 -0
  508. /package/dist/{playwright.config.d.ts → runtime/playwright.config.d.ts} +0 -0
  509. /package/dist/{video-dir.d.ts → runtime/video-dir.d.ts} +0 -0
  510. /package/dist/{webserver.d.ts → runtime/webserver.d.ts} +0 -0
@@ -1,156 +0,0 @@
1
- // In-page installer (runs inside the browser via page.evaluate): must stay self-contained - no module-scope closure.
2
- // Split out of the former single installOverlay evaluate (see src/ARCHITECTURE.md). Shares state only via window.__wg*.
3
- /* eslint-disable no-unused-vars */
4
- export function installBanner({ title, favicon, bannerPos, todoPos, envAutoplay, todoDockUi, bannerUi, tag: bannerTag }) {
5
- const POSITIONS = ["left", "center", "right"];
6
- const applyPos = (el, pos) => {
7
- el.dataset.pos = pos;
8
- el.dataset.home = pos;
9
- try {
10
- localStorage.setItem("wg-banner-pos", pos);
11
- } catch {
12
- /* private mode / blocked storage - position still applies this page */
13
- }
14
- };
15
- if (title) {
16
- let banner = __wgById("wg-banner");
17
- if (!banner) {
18
- banner = document.createElement("div");
19
- banner.id = "wg-banner";
20
- let saved = null;
21
- try {
22
- saved = localStorage.getItem("wg-banner-pos");
23
- } catch {
24
- /* ignore */
25
- }
26
- const startPos =
27
- saved && POSITIONS.includes(saved) ? saved : bannerPos;
28
- applyPos(banner, startPos);
29
- banner.title = "Click to move: top left / center / right";
30
- banner.addEventListener("click", (e) => {
31
- e.stopPropagation();
32
- const i = POSITIONS.indexOf(banner.dataset.pos || "left");
33
- applyPos(banner, POSITIONS[(i + 1) % POSITIONS.length]);
34
- });
35
- const tag = document.createElement("span");
36
- tag.className = "wg-banner-tag";
37
- tag.textContent = bannerTag || "waygraph demo";
38
- const text = document.createElement("span");
39
- text.className = "wg-banner-text";
40
- text.textContent = title;
41
- banner.appendChild(tag);
42
- banner.appendChild(text);
43
- __wgAdd(banner);
44
- } else {
45
- // Fixture / episode title changes every step - update in place
46
- // (banner is created once; do not leave the first step's text stuck). Fades out/in
47
- // instead of an instant swap, so a title change reads as a deliberate beat, not a
48
- // flicker - opt-out (or re-tune) via bannerUi.captionFadeMs, 0 = instant.
49
- let text = banner.querySelector(".wg-banner-text");
50
- if (!text) {
51
- text = document.createElement("span");
52
- text.className = "wg-banner-text";
53
- banner.appendChild(text);
54
- }
55
- if (text.textContent !== title) {
56
- const fadeMs =
57
- bannerUi && Number.isFinite(Number(bannerUi.captionFadeMs))
58
- ? Math.max(0, Number(bannerUi.captionFadeMs))
59
- : 220;
60
- if (fadeMs <= 0 || !text.textContent) {
61
- text.textContent = title;
62
- } else {
63
- text.style.transition = "opacity " + fadeMs + "ms ease";
64
- text.style.opacity = "0";
65
- setTimeout(() => {
66
- text.textContent = title;
67
- text.style.opacity = "1";
68
- }, fadeMs);
69
- }
70
- }
71
- }
72
- }
73
- // Authored banner UX (StubCtx.titlePos / bannerUi): applied every step, wins over click/env.
74
- if (bannerUi) {
75
- const cur = window.__wgBannerUi || {};
76
- window.__wgBannerUi = { ...cur, ...bannerUi };
77
- }
78
- const bui = window.__wgBannerUi || {};
79
- const bannerEl = __wgById("wg-banner");
80
- if (bannerEl) {
81
- if (bui.pos && POSITIONS.includes(bui.pos) && bannerEl.dataset.home !== bui.pos) {
82
- bannerEl.dataset.pos = bui.pos;
83
- bannerEl.dataset.home = bui.pos;
84
- bannerEl.dataset.authored = "1";
85
- }
86
- bannerEl.dataset.collision = bui.collision === false ? "0" : "1";
87
- bannerEl.style.display = bui.hidden ? "none" : "";
88
- }
89
- // Move the banner out of the way of a highlight ring (mirrors the todo dock's collision flip).
90
- window.__wgBannerAvoidRing = (box) => {
91
- const b = __wgById("wg-banner");
92
- if (!b || !box || b.dataset.collision === "0" || b.style.display === "none") return;
93
- const pad = 10;
94
- const hits = () => {
95
- const r = b.getBoundingClientRect();
96
- return !(
97
- r.right < box.x - pad ||
98
- r.left > box.x + box.width + pad ||
99
- r.bottom < box.y - pad ||
100
- r.top > box.y + box.height + pad
101
- );
102
- };
103
- const home = b.dataset.home || b.dataset.pos || "left";
104
- // Called every animation frame while a ring is followed - only log when the outcome changes.
105
- const log = (state, line) => {
106
- if (b.dataset.lastLog === state) return;
107
- b.dataset.lastLog = state;
108
- if (line) (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) return;
131
- if (b.dataset.home) b.dataset.pos = b.dataset.home;
132
- delete b.dataset.moved;
133
- delete b.dataset.lastLog;
134
- };
135
- // Dim the banner while a ring caption is the focus - same "auto opacity" effect the todo
136
- // dock already has via __wgTodosSetBehind, extended to the banner so both floating chrome
137
- // pieces step back the same way instead of only one of them fading.
138
- window.__wgBannerSetBehind = (on) => {
139
- const b = __wgById("wg-banner");
140
- if (!b) return;
141
- b.classList.toggle("wg-banner-behind", !!on);
142
- };
143
- // Tab title/favicon: a real navigation resets document.title and any
144
- // <link rel="icon"> the new document brings, so re-check (not
145
- // re-append) on every call instead of a one-time flag.
146
- if (!document.title.startsWith("[waygraph] ")) {
147
- document.title = "[waygraph] " + document.title;
148
- }
149
- let iconLink = document.querySelector("link[rel~='icon']");
150
- if (!iconLink) {
151
- iconLink = document.createElement("link");
152
- iconLink.rel = "icon";
153
- document.head.appendChild(iconLink);
154
- }
155
- if (iconLink.href !== favicon) iconLink.href = favicon;
156
- }
@@ -1,3 +0,0 @@
1
- /** In-page installer (page.evaluate target) - see caption.js's own header. */
2
- export function showCaption(text: string): void;
3
- export function hideCaption(): void;
@@ -1,23 +0,0 @@
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
- span.textContent = text;
17
- bar.classList.add("wg-in");
18
- }
19
-
20
- export function hideCaption() {
21
- const bar = __wgById("wg-caption-bar");
22
- if (bar) bar.classList.remove("wg-in");
23
- }
@@ -1,4 +0,0 @@
1
- /** In-page installer (page.evaluate target) - see core.js's own header. Installs the shared ring
2
- * primitive (__wgEnsureRingEl/__wgPaintRingAt), cursor, click-pulse, focus veil,
3
- * and the #wg-ring singleton every surface's "current action" ring uses. */
4
- export function installCore(args: Record<string, unknown>): void;
@@ -1,316 +0,0 @@
1
- // In-page installer (runs inside the browser via page.evaluate): must stay self-contained - no module-scope closure.
2
- // Split out of the former single installOverlay evaluate (see src/ARCHITECTURE.md). Shares state only via window.__wg*.
3
- /* eslint-disable no-unused-vars */
4
- export function installCore({ title, favicon, bannerPos, todoPos, envAutoplay, todoDockUi }) {
5
- window.__wgTodoDockUi = todoDockUi || {
6
- compact: true,
7
- cap: 5,
8
- expandCap: 14,
9
- collision: true,
10
- behindRing: true,
11
- };
12
- // Seed the live autoplay toggle from the env default on first ever
13
- // load only - a real navigation re-runs this, and re-stamping here
14
- // would silently undo a human's mid-run checkbox click.
15
- try {
16
- if (localStorage.getItem("wg-autoplay") === null) {
17
- localStorage.setItem("wg-autoplay", envAutoplay ? "1" : "0");
18
- }
19
- } catch {
20
- /* private mode / blocked storage - falls back to manual gating */
21
- }
22
- // The one shared ring primitive (ui/css/ring.css) - #wg-ring/#wg-ring-label is just this
23
- // surface's OWN ring instance, found by id like any other (see __wgEnsureRingEl below).
24
- window.__wgEnsureRingEl = (ringId, labelId) => {
25
- let ring = __wgById(ringId);
26
- if (!ring) {
27
- ring = document.createElement("div");
28
- ring.id = ringId;
29
- ring.className = "wg-ring-el";
30
- __wgAdd(ring);
31
- }
32
- let label = __wgById(labelId);
33
- if (!label) {
34
- label = document.createElement("div");
35
- label.id = labelId;
36
- label.className = "wg-ring-el-label";
37
- __wgAdd(label);
38
- }
39
- return [ring, label];
40
- };
41
- /** Bare positioning only - no collision/follow/focus-veil (those are #wg-ring's own extras, see __wgPositionRing). */
42
- window.__wgPaintRingAt = (ringId, labelId, box, label, tone, style) => {
43
- const [ring, ringLabel] = window.__wgEnsureRingEl(ringId, labelId);
44
- if (!box) return null;
45
- const raw = (tone || "planned") + "";
46
- const t =
47
- raw === "auto" || raw === "info" || raw === "warning" || raw === "danger" || raw === "success" || raw === "orange"
48
- ? raw
49
- : "planned";
50
- const st = style && typeof style === "object" ? style : {};
51
- const sizeRaw = (st.size || "md") + "";
52
- const size = sizeRaw === "sm" || sizeRaw === "lg" ? sizeRaw : "md";
53
- const weightRaw = (st.weight || "normal") + "";
54
- const weight = weightRaw === "bold" ? "bold" : "normal";
55
- ring.dataset.tone = t;
56
- ringLabel.dataset.tone = t;
57
- ring.dataset.size = size;
58
- ringLabel.dataset.size = size;
59
- ringLabel.dataset.weight = weight;
60
- if (st.color) ringLabel.style.color = st.color;
61
- else ringLabel.style.removeProperty("color");
62
- const pad = size === "sm" ? 3 : size === "lg" ? 10 : 6;
63
- const margin = 6;
64
- const vw = window.innerWidth;
65
- const vh = window.innerHeight;
66
- const left = box.x - pad;
67
- const top = box.y - pad;
68
- const width = Math.max(4, box.width + pad * 2);
69
- const height = Math.max(4, box.height + pad * 2);
70
- ring.style.left = left + "px";
71
- ring.style.top = top + "px";
72
- ring.style.width = width + "px";
73
- ring.style.height = height + "px";
74
- ring.style.opacity = "1";
75
- if (labelId === "wg-ring-label") {
76
- // The demo ring's caption is drawn from data-label (CSS ::after), not DOM text, so the page's own
77
- // text selectors (getByText, text=...) never match waygraph's overlay twice.
78
- ringLabel.dataset.label = label || "";
79
- ringLabel.textContent = "";
80
- } else {
81
- ringLabel.textContent = label || "";
82
- }
83
- ringLabel.style.opacity = "1";
84
- const lw = ringLabel.offsetWidth;
85
- const lh = ringLabel.offsetHeight;
86
- let labelLeft = left;
87
- let labelTop = top + height + 8;
88
- const aboveTop = top - lh - 8;
89
- if (labelTop + lh > vh - margin) {
90
- labelTop = aboveTop;
91
- } else {
92
- // Below the ringed box is often the NEXT form field in a tightly stacked list (e.g.
93
- // saucedemo's checkout "First Name" / "Last Name" / "Zip" inputs) - a fixed +8px gap
94
- // has no idea that's there and the label just sits on top of it. Sample a few points
95
- // under the would-be label and flip above if any land on real page content (not our
96
- // own ring/label elements, which are the only things expected there otherwise).
97
- const probe = (x, y) => {
98
- const el = document.elementFromPoint(x, y);
99
- return el && el.id !== ringId && el.id !== labelId && !(el.closest && el.closest("#wg-root"));
100
- };
101
- const hitsPageContent =
102
- probe(labelLeft + 2, labelTop + 2) ||
103
- probe(labelLeft + lw - 2, labelTop + 2) ||
104
- probe(labelLeft + 2, labelTop + lh - 2);
105
- if (hitsPageContent && aboveTop >= margin) labelTop = aboveTop;
106
- }
107
- if (labelTop < margin) labelTop = margin;
108
- if (labelLeft + lw > vw - margin) labelLeft = Math.max(margin, vw - margin - lw);
109
- if (labelLeft < margin) labelLeft = margin;
110
- ringLabel.style.left = labelLeft + "px";
111
- ringLabel.style.top = labelTop + "px";
112
- return [ring, ringLabel];
113
- };
114
- window.__wgEnsureRingEl("wg-ring", "wg-ring-label");
115
- if (!__wgById("wg-cursor")) {
116
- const cursor = document.createElement("div");
117
- cursor.id = "wg-cursor";
118
- // Dark fill + white stroke, same as help-center-clip-engine's own
119
- // #clip-cursor - visible against any page background, light or
120
- // dark, unlike a plain solid-white shape.
121
- cursor.innerHTML =
122
- "<svg viewBox='0 0 32 32' width='24' height='24'>" +
123
- "<path fill='#0C0C1A' stroke='#fff' stroke-width='1.4' stroke-linejoin='round' " +
124
- "d='M6 3.5l1.4 22.5 5.8-5.4 4.2 9.4 3.6-1.6-4.2-9.2H26z'/></svg>";
125
- __wgAdd(cursor);
126
- }
127
- if (!__wgById("wg-click-pulse")) {
128
- const pulse = document.createElement("div");
129
- pulse.id = "wg-click-pulse";
130
- __wgAdd(pulse);
131
- }
132
- window.__wgMoveCursorTo = (x, y, ms, instant) => {
133
- const cursor = __wgById("wg-cursor");
134
- if (!cursor) return;
135
- cursor.style.setProperty("--wg-cursor-ms", (ms || 600) + "ms");
136
- if (instant) {
137
- const prev = cursor.style.transition;
138
- cursor.style.transition = "none";
139
- cursor.style.transform = "translate(" + x + "px," + y + "px)";
140
- void cursor.offsetWidth;
141
- cursor.style.transition = prev || "";
142
- } else {
143
- cursor.style.transform = "translate(" + x + "px," + y + "px)";
144
- }
145
- cursor.style.opacity = "1";
146
- };
147
- window.__wgHideCursor = () => {
148
- const cursor = __wgById("wg-cursor");
149
- if (cursor) cursor.style.opacity = "0";
150
- };
151
- // #wg-ring's own extras on top of the shared __wgPaintRingAt primitive: todo/banner
152
- // collision avoidance only makes sense for the ONE "current action" ring, not Pilot's
153
- // several independent fixture rings - kept here, not pushed down into the shared painter.
154
- window.__wgPositionRing = (box, label, tone, style) => {
155
- if (!box) return;
156
- window.__wgPaintRingAt("wg-ring", "wg-ring-label", box, label, tone, style);
157
- if (window.__wgTodosSetBehind) window.__wgTodosSetBehind(true);
158
- if (window.__wgBannerSetBehind) window.__wgBannerSetBehind(true);
159
- if (window.__wgTodosAvoidRingCollision) window.__wgTodosAvoidRingCollision(box);
160
- if (window.__wgBannerAvoidRing) window.__wgBannerAvoidRing(box);
161
- };
162
- /** Dim/lower floating todo docks while a ring caption is the focus. */
163
- window.__wgTodosSetBehind = (on) => {
164
- const ui = window.__wgTodoDockUi || {};
165
- if (ui.behindRing === false) {
166
- __wgQA(".wg-todo-dock, #wg-todo-dock").forEach((el) => {
167
- el.classList.remove("wg-todo-behind");
168
- });
169
- return;
170
- }
171
- __wgQA(".wg-todo-dock, #wg-todo-dock").forEach((el) => {
172
- el.classList.toggle("wg-todo-behind", !!on);
173
- });
174
- };
175
- /**
176
- * If the active ring box intersects a todo dock, flip L/R once.
177
- * Locked until hideRing so follow-rAF does not thrash.
178
- */
179
- window.__wgTodosAvoidRingCollision = (box) => {
180
- const ui = window.__wgTodoDockUi || {};
181
- if (ui.collision === false) return;
182
- if (!box || window.__wgTodoCollisionLocked) return;
183
- const pad = 10;
184
- const rx1 = box.x - pad;
185
- const ry1 = box.y - pad;
186
- const rx2 = box.x + box.width + pad;
187
- const ry2 = box.y + box.height + pad;
188
- const overlaps = (el) => {
189
- const r = el.getBoundingClientRect();
190
- return !(r.right < rx1 || r.left > rx2 || r.bottom < ry1 || r.top > ry2);
191
- };
192
- const docks = [...__wgQA(".wg-todo-dock, #wg-todo-dock")].filter(
193
- (el, i, arr) => arr.indexOf(el) === i,
194
- );
195
- for (const dock of docks) {
196
- if (!overlaps(dock)) continue;
197
- const cur = dock.dataset.pos === "right" ? "right" : "left";
198
- dock.dataset.pos = cur === "right" ? "left" : "right";
199
- try {
200
- localStorage.setItem("wg-todo-pos", dock.dataset.pos);
201
- } catch {
202
- /* ignore */
203
- }
204
- // Still colliding after flip - tuck (shorter max-height).
205
- if (overlaps(dock)) dock.dataset.tucked = "1";
206
- else delete dock.dataset.tucked;
207
- window.__wgTodoCollisionLocked = true;
208
- break;
209
- }
210
- };
211
- /** Live-follow a resolved element with rAF (accurate under device shell scale). */
212
- window.__wgStopRingFollow = () => {
213
- if (window.__wgRingFollowRaf) {
214
- cancelAnimationFrame(window.__wgRingFollowRaf);
215
- window.__wgRingFollowRaf = 0;
216
- }
217
- window.__wgRingFollowEl = null;
218
- };
219
- // `el` is a real DOM element (a Playwright ElementHandle unwrapped by evaluate() - see
220
- // rings.js's showRing), not a selector string - >> piercing / :has-text() are Playwright's
221
- // own selector-engine syntax, which document.querySelector has no way to understand, so
222
- // resolution happens once on the Node side via page.locator(), before this ever runs.
223
- window.__wgFollowRing = (el, label, tone, style, focus) => {
224
- window.__wgStopRingFollow();
225
- if (!el) return;
226
- window.__wgRingFollowEl = el;
227
- const tick = () => {
228
- if (window.__wgRingFollowEl !== el) return;
229
- if (!el.isConnected) {
230
- window.__wgRingFollowRaf = requestAnimationFrame(tick);
231
- return;
232
- }
233
- const r = el.getBoundingClientRect();
234
- const box = { x: r.x, y: r.y, width: r.width, height: r.height };
235
- if (window.__wgPositionRing) {
236
- window.__wgPositionRing(box, label, tone || "planned", style || {});
237
- }
238
- if (focus && window.__wgApplyFocus) window.__wgApplyFocus(box);
239
- window.__wgRingFollowRaf = requestAnimationFrame(tick);
240
- };
241
- tick();
242
- };
243
- window.__wgClickPulse = (x, y, tone) => {
244
- const pulse = __wgById("wg-click-pulse");
245
- if (!pulse) return;
246
- const raw = (tone || "planned") + "";
247
- pulse.dataset.tone =
248
- raw === "auto" || raw === "info" || raw === "warning" || raw === "danger" || raw === "success"
249
- ? raw
250
- : "planned";
251
- pulse.style.left = x + "px";
252
- pulse.style.top = y + "px";
253
- pulse.classList.remove("wg-pulse");
254
- void pulse.offsetWidth;
255
- pulse.classList.add("wg-pulse");
256
- };
257
- window.__wgHideRing = (opts) => {
258
- // While a narrate() call owns the ring (mid multi-step action),
259
- // the auto-highlight click/fill patches' own end-of-step hide is
260
- // a no-op - narrate() itself clears it once the WHOLE wrapped
261
- // action finishes, not just its first sub-step.
262
- if (window.__wgNarrateOwnsRing) return;
263
- if (window.__wgStopRingFollow) window.__wgStopRingFollow();
264
- const ring = __wgById("wg-ring");
265
- const ringLabel = __wgById("wg-ring-label");
266
- if (ring) ring.style.opacity = "0";
267
- if (ringLabel) ringLabel.style.opacity = "0";
268
- if (window.__wgClearFocus) window.__wgClearFocus();
269
- if (window.__wgTodosSetBehind) window.__wgTodosSetBehind(false);
270
- if (window.__wgBannerSetBehind) window.__wgBannerSetBehind(false);
271
- if (window.__wgBannerRestore) window.__wgBannerRestore();
272
- window.__wgTodoCollisionLocked = false;
273
- __wgQA(".wg-todo-dock[data-tucked], #wg-todo-dock[data-tucked]").forEach((el) => {
274
- delete el.dataset.tucked;
275
- });
276
- // Honor zoomOut:false - keep camera until next zoom / desktop clear.
277
- const forceClear = opts && opts.clearZoom === true;
278
- const skipClear = opts && opts.clearZoom === false;
279
- if (
280
- !skipClear &&
281
- (forceClear || window.__wgZoomOutOnHide !== false) &&
282
- window.__wgClearZoom
283
- ) {
284
- window.__wgClearZoom();
285
- }
286
- };
287
- window.__wgClearFocus = () => {
288
- const veil = __wgById("wg-focus-veil");
289
- if (!veil) return;
290
- veil.classList.remove("wg-in");
291
- setTimeout(() => {
292
- const v = __wgById("wg-focus-veil");
293
- if (v && !v.classList.contains("wg-in")) v.remove();
294
- }, 320);
295
- };
296
- window.__wgApplyFocus = (box) => {
297
- if (!box) {
298
- if (window.__wgClearFocus) window.__wgClearFocus();
299
- return;
300
- }
301
- let veil = __wgById("wg-focus-veil");
302
- if (!veil) {
303
- veil = document.createElement("div");
304
- veil.id = "wg-focus-veil";
305
- veil.setAttribute("data-wg-ui", "1");
306
- __wgAdd(veil);
307
- }
308
- const pad = 10;
309
- veil.style.left = Math.max(0, box.x - pad) + "px";
310
- veil.style.top = Math.max(0, box.y - pad) + "px";
311
- veil.style.width = Math.max(8, box.width + pad * 2) + "px";
312
- veil.style.height = Math.max(8, box.height + pad * 2) + "px";
313
- void veil.offsetWidth;
314
- veil.classList.add("wg-in");
315
- };
316
- }
@@ -1,3 +0,0 @@
1
- /** In-page installer (page.evaluate target) - see device.js's own header. Args are accepted for
2
- * signature-consistency with the other inpage/* installers; only defines window.__wgSyncDevice. */
3
- export function installDevice(args: Record<string, unknown>): void;