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,293 @@
1
+ export function installTodos({ todoPos }) {
2
+ // Floating todo dock - lives outside #wg-panel so --mini / Hide never
3
+ // hide the checklist. Click cycles left <-> right with CSS transform.
4
+ // Authors set side via ctx.todos(id, items, { pos }); env / --todo-* fallback.
5
+ // Payload:
6
+ // { sync: "clear" } -> remove dock
7
+ // { sync: "keep" } -> leave dock alone (no wipe)
8
+ // { sync: "set", dock } / { sync:"set", list } -> render / recreate
9
+ window.__wgSyncTodos = (payload, pos) => {
10
+ const syncPayload = payload;
11
+ let sync = "set";
12
+ let list = [];
13
+ let dockState = null;
14
+ let wantPos = pos === "left" || pos === "right" ? pos : null;
15
+ if (payload && typeof payload === "object") {
16
+ sync = payload.sync === "clear" || payload.sync === "keep" ? payload.sync : "set";
17
+ dockState = payload.dock || null;
18
+ if (payload.pos === "left" || payload.pos === "right")
19
+ wantPos = payload.pos;
20
+ if (Array.isArray(payload.list))
21
+ list = payload.list;
22
+ else if (dockState && Array.isArray(dockState.groups)) {
23
+ // The flat list; the full dock is rendered below.
24
+ list = [];
25
+ for (const g of dockState.groups) {
26
+ if (g && Array.isArray(g.items))
27
+ list = list.concat(g.items);
28
+ }
29
+ }
30
+ }
31
+ else {
32
+ list = [];
33
+ sync = "clear";
34
+ }
35
+ let dockKey = (dockState && dockState.id && String(dockState.id).trim()) ||
36
+ (payload && !Array.isArray(payload) && payload.todoId && String(payload.todoId).trim()) ||
37
+ "_default";
38
+ // Drop any in-panel leftover (old builds put #wg-todos in .wg-body).
39
+ __wgQA("#wg-panel #wg-todos").forEach((el) => el.remove());
40
+ const allDocks = () => [...__wgQA(".wg-todo-dock, #wg-todo-dock")].filter((el, i, arr) => arr.indexOf(el) === i);
41
+ const relayoutTodoDocks = () => {
42
+ const docks = allDocks();
43
+ // Must match .wg-todo-dock/#wg-todo-dock's own CSS `top` (demo/overlay/overlay-css.ts,
44
+ // ui/css/dock.css) - this inline style OVERRIDES that CSS the instant more than one
45
+ // dock exists (multi-todo stacking), so a CSS-only change here is silently underwater;
46
+ // real bug this was: the CSS top was bumped 72 -> 104 for banner clearance, but this
47
+ // hardcoded 72 kept winning at runtime and nothing actually moved.
48
+ let top = 104;
49
+ for (const el of docks) {
50
+ el.style.top = top + "px";
51
+ top += Math.max(48, el.getBoundingClientRect().height) + 10;
52
+ }
53
+ };
54
+ const findDock = (key) => {
55
+ if (key === "_default") {
56
+ return (__wgQ('.wg-todo-dock[data-wg-todo-key="_default"]') ||
57
+ __wgById("wg-todo-dock"));
58
+ }
59
+ const all = __wgQA(".wg-todo-dock");
60
+ for (let i = 0; i < all.length; i++) {
61
+ if (all[i].getAttribute("data-wg-todo-key") === String(key))
62
+ return all[i];
63
+ }
64
+ return null;
65
+ };
66
+ // keep + no new payload: do not remove existing docks (PIA #10).
67
+ if (sync === "keep") {
68
+ if (!dockState && !list.length)
69
+ return;
70
+ // After navigation the DOM may be gone - recreate from carried dock.
71
+ sync = "set";
72
+ }
73
+ // Default replace=true: one checklist. parallel docks only when replace:false.
74
+ const replace = !(payload && !Array.isArray(payload) && payload.replace === false) &&
75
+ !(payload && !Array.isArray(payload) && payload.parallel === true);
76
+ const hasDock = !!(dockState && Array.isArray(dockState.groups) && dockState.groups.length);
77
+ // Explicit clear only - never treat "set + dock + empty list" as clear
78
+ // (that thrash was marks -> blank in a few ms).
79
+ if (sync === "clear" || (sync === "set" && !hasDock && !list.length)) {
80
+ const clearId = (payload && !Array.isArray(payload) && payload.todoId && String(payload.todoId).trim()) ||
81
+ (dockState && dockState.id && String(dockState.id).trim()) ||
82
+ "";
83
+ if (clearId && !replace) {
84
+ const el = findDock(clearId);
85
+ if (el)
86
+ el.remove();
87
+ }
88
+ else {
89
+ allDocks().forEach((el) => el.remove());
90
+ }
91
+ relayoutTodoDocks();
92
+ return;
93
+ }
94
+ if (sync === "set" && replace) {
95
+ // Drop sibling docks so we never stack duplicates.
96
+ for (const el of allDocks()) {
97
+ const key = el.getAttribute("data-wg-todo-key") || "_default";
98
+ if (key !== dockKey)
99
+ el.remove();
100
+ }
101
+ }
102
+ const POS = ["left", "right"];
103
+ let dock = findDock(dockKey);
104
+ if (!dock) {
105
+ dock = document.createElement("div");
106
+ dock.className = "wg-todo-dock";
107
+ dock.setAttribute("data-wg-todo-key", dockKey);
108
+ if (dockKey === "_default")
109
+ dock.id = "wg-todo-dock";
110
+ else
111
+ dock.id = "wg-todo-dock--" + dockKey.replace(/[^a-zA-Z0-9_-]/g, "-");
112
+ dock.setAttribute("data-wg-ui", "1");
113
+ dock.setAttribute("data-wg-modal", "todos");
114
+ dock.setAttribute("data-wg-ready", "1");
115
+ let saved = null;
116
+ try {
117
+ saved = localStorage.getItem("wg-todo-pos");
118
+ }
119
+ catch {
120
+ /* ignore */
121
+ }
122
+ const start = wantPos ||
123
+ (saved && POS.includes(saved) ? saved : todoPos === "right" ? "right" : "left");
124
+ dock.dataset.pos = start;
125
+ dock.title = "Click to move checklist: left / right";
126
+ dock.addEventListener("click", (e) => {
127
+ e.stopPropagation();
128
+ const i = POS.indexOf(dock.dataset.pos || "left");
129
+ const next = POS[(i + 1) % POS.length];
130
+ dock.dataset.pos = next;
131
+ try {
132
+ localStorage.setItem("wg-todo-pos", next ?? "left");
133
+ }
134
+ catch {
135
+ /* ignore */
136
+ }
137
+ });
138
+ __wgAdd(dock);
139
+ }
140
+ else if (wantPos) {
141
+ dock.dataset.pos = wantPos;
142
+ try {
143
+ localStorage.setItem("wg-todo-pos", wantPos);
144
+ }
145
+ catch {
146
+ /* ignore */
147
+ }
148
+ }
149
+ const trimmedId = (raw) => (raw != null && String(raw).trim() ? String(raw).trim() : undefined);
150
+ // Compact + cap: >cap rows folds overflow; hover shows up to expandCap; "+N more" pins expand.
151
+ const ui = (payload && !Array.isArray(payload) && payload.ui) || window.__wgTodoDockUi || {};
152
+ const COMPACT_AT = Number(ui.cap) > 0 ? Number(ui.cap) : 5;
153
+ const WINDOW = COMPACT_AT;
154
+ const EXPAND_MAX = Number(ui.expandCap) > 0 ? Number(ui.expandCap) : 14;
155
+ const compactEnabled = ui.compact !== false;
156
+ const flattenItems = () => {
157
+ if (dockState && Array.isArray(dockState.groups) && dockState.groups.length) {
158
+ const out = [];
159
+ for (const g of dockState.groups) {
160
+ for (const t of g.items || [])
161
+ out.push({ ...t, __style: g.style || dockState.style });
162
+ }
163
+ return out;
164
+ }
165
+ return (list || []).map((t) => ({ ...t, __style: "sequential" }));
166
+ };
167
+ const windowBounds = (items, cap) => {
168
+ const n = items.length;
169
+ if (n <= cap)
170
+ return { start: 0, end: n };
171
+ let cur = items.findIndex((t) => t.current);
172
+ if (cur < 0)
173
+ cur = items.findIndex((t) => !t.done);
174
+ if (cur < 0)
175
+ cur = 0;
176
+ let start = Math.max(0, cur - Math.floor((cap - 1) / 2));
177
+ let end = Math.min(n, start + cap);
178
+ start = Math.max(0, end - cap);
179
+ return { start, end };
180
+ };
181
+ const renderItems = (items, style, foldMeta, indexOffset) => {
182
+ const offset = indexOffset || 0;
183
+ const rawStyle = String(style || "sequential").toLowerCase();
184
+ const st = rawStyle === "checklist"
185
+ ? "checklist"
186
+ : rawStyle === "bullets" ||
187
+ rawStyle === "bullet" ||
188
+ rawStyle === "list" ||
189
+ rawStyle === "ul" ||
190
+ rawStyle === "points" ||
191
+ rawStyle === "plain"
192
+ ? "bullets"
193
+ : "sequential";
194
+ const foldStart = foldMeta ? foldMeta.foldStart : -1;
195
+ const foldEnd = foldMeta ? foldMeta.foldEnd : -1;
196
+ const deepStart = foldMeta ? foldMeta.deepStart : -1;
197
+ const deepEnd = foldMeta ? foldMeta.deepEnd : -1;
198
+ return __wgEl("ul", { class: "wg-todos-list", data: { wgTodoStyle: st } }, (items || []).map((t, idx) => {
199
+ const gi = offset + idx;
200
+ const clsBase = st === "bullets"
201
+ ? t.done
202
+ ? "wg-todo-done"
203
+ : "wg-todo-pending"
204
+ : t.current
205
+ ? "wg-todo-current"
206
+ : t.done
207
+ ? "wg-todo-done"
208
+ : "wg-todo-pending";
209
+ let foldCls = "";
210
+ if (foldStart >= 0 && (gi < foldStart || gi >= foldEnd))
211
+ foldCls += " wg-todo-fold";
212
+ if (deepStart >= 0 && (gi < deepStart || gi >= deepEnd))
213
+ foldCls += " wg-todo-fold-deep";
214
+ let mark;
215
+ if (st === "checklist") {
216
+ mark = t.done ? "☑" : "☐";
217
+ }
218
+ else if (st === "bullets") {
219
+ mark = "•";
220
+ }
221
+ else {
222
+ mark = t.done ? "✓" : t.current ? "→" : "○";
223
+ }
224
+ return __wgEl("li", { class: clsBase + foldCls, data: { wgTodoItem: trimmedId(t.id) } }, __wgEl("span", { class: "wg-todo-mark" }, mark), __wgEl("span", null, t.text || ""));
225
+ }));
226
+ };
227
+ if (dockKey !== "_default")
228
+ dock.setAttribute("data-wg-todo-id", dockKey);
229
+ else
230
+ dock.removeAttribute("data-wg-todo-id");
231
+ const flat = flattenItems();
232
+ const compact = compactEnabled && flat.length > COMPACT_AT;
233
+ const win = windowBounds(flat, WINDOW);
234
+ const expand = windowBounds(flat, EXPAND_MAX);
235
+ const foldMeta = compact
236
+ ? {
237
+ foldStart: win.start,
238
+ foldEnd: win.end,
239
+ deepStart: expand.start,
240
+ deepEnd: expand.end,
241
+ }
242
+ : null;
243
+ const hiddenCompact = compact ? flat.length - (win.end - win.start) : 0;
244
+ const hiddenExpand = compact ? flat.length - (expand.end - expand.start) : 0;
245
+ const children = [];
246
+ if (dockState && Array.isArray(dockState.groups) && dockState.groups.length) {
247
+ const dockTitle = dockState.title && String(dockState.title).trim();
248
+ if (dockTitle)
249
+ children.push(__wgEl("div", { class: "wg-todo-dock-title" }, dockTitle));
250
+ let globalIdx = 0;
251
+ for (const g of dockState.groups) {
252
+ const gTitle = g.title && String(g.title).trim();
253
+ const gItems = g.items || [];
254
+ children.push(__wgEl("div", { class: "wg-todo-group", data: { wgTodoGroup: trimmedId(g.id) } }, gTitle ? __wgEl("div", { class: "wg-todo-group-title" }, gTitle) : null, renderItems(gItems, g.style || dockState.style, foldMeta, globalIdx)));
255
+ globalIdx += gItems.length;
256
+ }
257
+ }
258
+ else {
259
+ children.push(renderItems(list, "sequential", foldMeta, 0));
260
+ }
261
+ if (compact && hiddenCompact > 0) {
262
+ const n = dock.dataset.expanded === "1" ? hiddenExpand : hiddenCompact;
263
+ if (n > 0) {
264
+ children.push(__wgEl("div", { class: "wg-todo-more", data: { wgTodoMore: "1" }, title: "Click to expand / collapse" }, "+" + n + " more"));
265
+ }
266
+ }
267
+ if (compact)
268
+ dock.dataset.compact = "1";
269
+ else {
270
+ delete dock.dataset.compact;
271
+ delete dock.dataset.expanded;
272
+ }
273
+ __wgSet(dock, children);
274
+ const moreBtn = dock.querySelector("[data-wg-todo-more]");
275
+ if (moreBtn) {
276
+ moreBtn.addEventListener("click", (e) => {
277
+ e.stopPropagation();
278
+ if (dock.dataset.expanded === "1")
279
+ delete dock.dataset.expanded;
280
+ else
281
+ dock.dataset.expanded = "1";
282
+ if (window.__wgSyncTodos && dock._wgLastPayload) {
283
+ window.__wgSyncTodos(dock._wgLastPayload);
284
+ }
285
+ });
286
+ }
287
+ dock._wgLastPayload = syncPayload;
288
+ relayoutTodoDocks();
289
+ if (window.__wgStampModal) {
290
+ window.__wgStampModal(dock, "todos", { ready: true });
291
+ }
292
+ };
293
+ }
@@ -0,0 +1,25 @@
1
+ import type { Locator, Page } from "@playwright/test";
2
+ /** How a click is performed once the theater has shown it. */
3
+ export type ClickGesture = "click" | "tap" | "hold";
4
+ export interface LocatorTheater {
5
+ /** Before the value is typed: cursor, ring, typing badge. A failure here never stops the fill. */
6
+ beforeFill(locator: Locator, options: {
7
+ timeout?: number;
8
+ } | undefined): Promise<void>;
9
+ /** Per-character typing delay, ms. */
10
+ typingDelay(): number;
11
+ afterFill(locator: Locator): Promise<void>;
12
+ /** Before the click: cursor, ring, pulse. Returns the gesture to perform. A failure here never stops the click. */
13
+ beforeClick(locator: Locator, options: {
14
+ timeout?: number;
15
+ } | undefined): Promise<ClickGesture>;
16
+ /** How long a "hold" keeps the press down, ms. */
17
+ holdMs(): number;
18
+ afterClick(locator: Locator): Promise<void>;
19
+ /** A shorter timeout for a wait that may never succeed (a probe), or the declared one. */
20
+ capWait?(declaredMs: number): number;
21
+ /** A shorter plain sleep. */
22
+ capSleep?(ms: number): number;
23
+ }
24
+ /** Shows every fill and click on `page` through `theater` from now on. */
25
+ export declare function setLocatorTheater(page: Page, theater: LocatorTheater): void;
@@ -0,0 +1,76 @@
1
+ import { isPageGone } from "../../engine/page-gone.js";
2
+ const theaters = new WeakMap();
3
+ /** Shows every fill and click on `page` through `theater` from now on. */
4
+ export function setLocatorTheater(page, theater) {
5
+ theaters.set(page, theater);
6
+ patchLocator(Object.getPrototypeOf(page.locator("html")));
7
+ patchPage(Object.getPrototypeOf(page));
8
+ }
9
+ /**
10
+ * The theater only shows the action; the action itself must still run. So a theater failure is printed (unless the page
11
+ * simply went away) and the real fill / click goes ahead.
12
+ */
13
+ function theaterFailed(err) {
14
+ if (!isPageGone(err))
15
+ console.error(`waygraph: overlay: ${err instanceof Error ? err.message.split("\n")[0] : String(err)}`);
16
+ return undefined;
17
+ }
18
+ function patchLocator(proto) {
19
+ if (proto.__wgTheaterPatched)
20
+ return;
21
+ proto.__wgTheaterPatched = true;
22
+ const { fill, click, waitFor } = proto;
23
+ proto.fill = async function (value, options) {
24
+ const theater = theaters.get(this.page());
25
+ if (!theater)
26
+ return fill.call(this, value, options);
27
+ await theater.beforeFill(this, options).catch(theaterFailed);
28
+ try {
29
+ // Not this.clear(): Locator.clear() is fill(""), which would come back into this wrapper.
30
+ await fill.call(this, "", { ...(options?.timeout !== undefined ? { timeout: options.timeout } : {}) });
31
+ await this.pressSequentially(String(value), { delay: theater.typingDelay(), ...(options?.timeout !== undefined ? { timeout: options.timeout } : {}) });
32
+ }
33
+ catch {
34
+ // An element pressSequentially can't type into (a contenteditable, say): Playwright's own fill.
35
+ await fill.call(this, value, options);
36
+ }
37
+ await theater.afterFill(this);
38
+ };
39
+ proto.click = async function (options) {
40
+ const theater = theaters.get(this.page());
41
+ if (!theater)
42
+ return click.call(this, options);
43
+ const gesture = (await theater.beforeClick(this, options).catch(theaterFailed)) ?? "click";
44
+ if (gesture === "hold")
45
+ await click.call(this, { ...(options ?? {}), delay: theater.holdMs() });
46
+ else if (gesture === "tap") {
47
+ try {
48
+ await this.tap(options);
49
+ }
50
+ catch {
51
+ // A context without touch: a real click.
52
+ await click.call(this, options);
53
+ }
54
+ }
55
+ else
56
+ await click.call(this, options);
57
+ await theater.afterClick(this);
58
+ };
59
+ proto.waitFor = function (options) {
60
+ const theater = theaters.get(this.page());
61
+ if (!theater?.capWait)
62
+ return waitFor.call(this, options);
63
+ const declared = options?.timeout ?? 30000;
64
+ return waitFor.call(this, { ...(options ?? {}), timeout: theater.capWait(declared) });
65
+ };
66
+ }
67
+ function patchPage(proto) {
68
+ if (proto.__wgTheaterPatched)
69
+ return;
70
+ proto.__wgTheaterPatched = true;
71
+ const { waitForTimeout } = proto;
72
+ proto.waitForTimeout = function (ms) {
73
+ const theater = theaters.get(this);
74
+ return waitForTimeout.call(this, theater?.capSleep ? theater.capSleep(ms) : ms);
75
+ };
76
+ }
@@ -0,0 +1,22 @@
1
+ import type { NetworkEntry, WgPage } from "../types.js";
2
+ /**
3
+ * Records one entry AND paints it live - the single place that touches page.__wgNetworkHistory,
4
+ * so every caller (this file's own listeners, defineApiBlock) stays in sync automatically. History
5
+ * lives on the Playwright `Page` object (Node side), which survives navigation - the panel DOM
6
+ * (page side, inside the shadow root) does not, and gets wiped on every real navigation. Without
7
+ * this, the "network tab" reset to empty on every step that navigated - not what a persistent
8
+ * Network tab is supposed to do.
9
+ */
10
+ export declare function recordNetworkEntry(page: WgPage, entry: NetworkEntry): Promise<void | undefined>;
11
+ /**
12
+ * Replays whatever history survived the last navigation back into a freshly (re)installed panel -
13
+ * call this after ensureShadowRoot, every step, same as the rest of the overlay's own per-step
14
+ * resync (banner/todos/device), and BEFORE that step's own network activity can add anything new
15
+ * (installOverlay runs at the very start of a step, so this is always true in practice - no
16
+ * interleaving race between "replay old" and "record new" to reason about). A no-op when there's
17
+ * no history yet, or the panel already shows exactly as many entries as history has (nothing was
18
+ * wiped this step). Otherwise clears and rebuilds from scratch, in order - simpler and more
19
+ * obviously correct than trying to diff/append just the "missing" ones.
20
+ */
21
+ export declare function restoreNetworkHistory(page: WgPage): Promise<void>;
22
+ export declare function installNetworkCapture(page: WgPage): void;
@@ -0,0 +1,127 @@
1
+ import { addNetworkEntry, clearNetworkLog } from "./inpage/network.js";
2
+ import { setApiCallRecorder } from "../../engine/run/hooks.js";
3
+ import { ignorePageGone } from "../../engine/page-gone.js";
4
+ // Fetch/XHR/navigation only - a real page can fire dozens of image/font/stylesheet requests per
5
+ // second, which would flood a panel meant to answer "what API calls did this page just made".
6
+ const RELEVANT_TYPES = new Set(["xhr", "fetch", "document"]);
7
+ // Response bodies this size or smaller, and only if they look text-ish, get captured for the
8
+ // detail view - a multi-MB image/video response has no business being buffered into page memory
9
+ // just because a demo happened to be running.
10
+ const MAX_BODY_BYTES = 200_000;
11
+ // Matches the in-page addNetworkEntry's own cap (network.js) - the Node-side history this backs
12
+ // stays in sync with what the panel can actually show.
13
+ const MAX_HISTORY = 30;
14
+ /**
15
+ * Records one entry AND paints it live - the single place that touches page.__wgNetworkHistory,
16
+ * so every caller (this file's own listeners, defineApiBlock) stays in sync automatically. History
17
+ * lives on the Playwright `Page` object (Node side), which survives navigation - the panel DOM
18
+ * (page side, inside the shadow root) does not, and gets wiped on every real navigation. Without
19
+ * this, the "network tab" reset to empty on every step that navigated - not what a persistent
20
+ * Network tab is supposed to do.
21
+ */
22
+ export function recordNetworkEntry(page, entry) {
23
+ page.__wgNetworkHistory = page.__wgNetworkHistory || [];
24
+ page.__wgNetworkHistory.push(entry);
25
+ while (page.__wgNetworkHistory.length > MAX_HISTORY)
26
+ page.__wgNetworkHistory.shift();
27
+ return page.evaluate(addNetworkEntry, entry).catch(ignorePageGone);
28
+ }
29
+ /**
30
+ * Replays whatever history survived the last navigation back into a freshly (re)installed panel -
31
+ * call this after ensureShadowRoot, every step, same as the rest of the overlay's own per-step
32
+ * resync (banner/todos/device), and BEFORE that step's own network activity can add anything new
33
+ * (installOverlay runs at the very start of a step, so this is always true in practice - no
34
+ * interleaving race between "replay old" and "record new" to reason about). A no-op when there's
35
+ * no history yet, or the panel already shows exactly as many entries as history has (nothing was
36
+ * wiped this step). Otherwise clears and rebuilds from scratch, in order - simpler and more
37
+ * obviously correct than trying to diff/append just the "missing" ones.
38
+ */
39
+ export async function restoreNetworkHistory(page) {
40
+ const history = page.__wgNetworkHistory;
41
+ if (!history || history.length === 0)
42
+ return;
43
+ // page.__wgNetworkNeedsRestore is set by installNetworkCapture's own framenavigated listener -
44
+ // skip the page.evaluate() round-trip entirely (an extra one on EVERY step otherwise, since this
45
+ // runs from installOverlay every step) unless a real navigation actually happened since the last
46
+ // successful restore. A real, caught perf regression: this used to always evaluate() a shown-count
47
+ // check first, which measurably slowed down every step of every test that had ever captured any
48
+ // traffic at all, not just ones that navigate.
49
+ if (!page.__wgNetworkNeedsRestore)
50
+ return;
51
+ page.__wgNetworkNeedsRestore = false;
52
+ await page.evaluate(clearNetworkLog).catch(ignorePageGone);
53
+ for (const entry of history) {
54
+ await page.evaluate(addNetworkEntry, entry).catch(ignorePageGone);
55
+ }
56
+ }
57
+ export function installNetworkCapture(page) {
58
+ if (page.__wgNetworkCaptureInstalled)
59
+ return;
60
+ page.__wgNetworkCaptureInstalled = true;
61
+ // Marks history as needing a replay - see restoreNetworkHistory's own comment. Main frame only;
62
+ // an iframe navigating doesn't wipe the top-level shadow root the panel lives in.
63
+ page.on("framenavigated", (frame) => {
64
+ if (frame === page.mainFrame())
65
+ page.__wgNetworkNeedsRestore = true;
66
+ });
67
+ const startedAt = new Map();
68
+ page.on("request", (request) => {
69
+ startedAt.set(request, Date.now());
70
+ });
71
+ page.on("requestfinished", async (request) => {
72
+ try {
73
+ if (!RELEVANT_TYPES.has(request.resourceType()))
74
+ return;
75
+ const response = await request.response();
76
+ if (!response)
77
+ return;
78
+ const start = startedAt.get(request);
79
+ startedAt.delete(request);
80
+ let resBody;
81
+ try {
82
+ const contentType = (await response.headerValue("content-type")) || "";
83
+ if (/json|text|xml|html|javascript/.test(contentType)) {
84
+ const buf = await response.body();
85
+ if (buf.length <= MAX_BODY_BYTES)
86
+ resBody = buf.toString("utf8");
87
+ }
88
+ }
89
+ catch {
90
+ /* body already consumed / redirected away / not available - best-effort only */
91
+ }
92
+ const [reqHeaders, resHeaders] = await Promise.all([
93
+ request.allHeaders().catch(ignorePageGone),
94
+ response.allHeaders().catch(ignorePageGone),
95
+ ]);
96
+ await recordNetworkEntry(page, {
97
+ method: request.method(),
98
+ url: request.url(),
99
+ status: response.status(),
100
+ ok: response.ok(),
101
+ ms: start !== undefined ? Date.now() - start : undefined,
102
+ reqHeaders,
103
+ resHeaders,
104
+ reqBody: request.postData() || undefined,
105
+ resBody,
106
+ });
107
+ }
108
+ catch {
109
+ /* a capture failure must never break the actual run it's observing */
110
+ }
111
+ });
112
+ page.on("requestfailed", (request) => {
113
+ startedAt.delete(request);
114
+ if (!RELEVANT_TYPES.has(request.resourceType()))
115
+ return;
116
+ recordNetworkEntry(page, {
117
+ method: request.method(),
118
+ url: request.url(),
119
+ status: 0,
120
+ ok: false,
121
+ reqBody: request.postData() || undefined,
122
+ resBody: request.failure()?.errorText,
123
+ });
124
+ });
125
+ }
126
+ // defineApiBlock reports its calls through core's hook; show them in the same panel.
127
+ setApiCallRecorder((page, entry) => recordNetworkEntry(page, entry));
@@ -0,0 +1,3 @@
1
+ export declare const RUNNER_EXTRA_CSS: string;
2
+ export declare const WAYGRAPH_FAVICON: string;
3
+ export declare const HOST_CSS: string;