waygraph 0.15.53 → 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 (556) 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 +13 -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 +7 -11
  52. package/dist/{highlights → demo/narration}/demo-pace.js +9 -11
  53. package/dist/{highlights → demo/narration}/device.d.ts +4 -2
  54. package/dist/{highlights → demo/narration}/device.js +3 -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/{session/overlay-beacon.d.ts → demo/overlay/beacon.d.ts} +7 -0
  69. package/dist/{session/overlay-beacon.js → demo/overlay/beacon.js} +5 -0
  70. package/dist/demo/overlay/cursor.d.ts +12 -0
  71. package/dist/demo/overlay/cursor.js +142 -0
  72. package/dist/demo/overlay/device-stage.d.ts +13 -0
  73. package/dist/demo/overlay/device-stage.js +396 -0
  74. package/dist/demo/overlay/inpage/banner.d.ts +1 -0
  75. package/dist/demo/overlay/inpage/banner.js +160 -0
  76. package/dist/demo/overlay/inpage/caption.d.ts +2 -0
  77. package/dist/demo/overlay/inpage/caption.js +24 -0
  78. package/dist/demo/overlay/inpage/core.d.ts +1 -0
  79. package/dist/demo/overlay/inpage/core.js +345 -0
  80. package/dist/demo/overlay/inpage/device-chip.d.ts +1 -0
  81. package/dist/demo/overlay/inpage/device-chip.js +191 -0
  82. package/dist/demo/overlay/inpage/network.d.ts +9 -0
  83. package/dist/demo/overlay/inpage/network.js +200 -0
  84. package/dist/demo/overlay/inpage/panel-chrome.d.ts +1 -0
  85. package/dist/demo/overlay/inpage/panel-chrome.js +203 -0
  86. package/dist/demo/overlay/inpage/stamp.d.ts +1 -0
  87. package/dist/demo/overlay/inpage/stamp.js +46 -0
  88. package/dist/demo/overlay/inpage/swipe-zoom.d.ts +1 -0
  89. package/dist/demo/overlay/inpage/swipe-zoom.js +220 -0
  90. package/dist/demo/overlay/inpage/todos.d.ts +1 -0
  91. package/dist/demo/overlay/inpage/todos.js +294 -0
  92. package/dist/demo/overlay/locator-theater.d.ts +25 -0
  93. package/dist/demo/overlay/locator-theater.js +76 -0
  94. package/dist/demo/overlay/network-capture.d.ts +22 -0
  95. package/dist/demo/overlay/network-capture.js +127 -0
  96. package/dist/demo/overlay/overlay-css.d.ts +3 -0
  97. package/dist/demo/overlay/overlay-css.js +369 -0
  98. package/dist/demo/overlay/overlay-stage.d.ts +23 -0
  99. package/dist/demo/overlay/overlay-stage.js +106 -0
  100. package/dist/demo/overlay/overlay.d.ts +10 -0
  101. package/dist/demo/overlay/overlay.js +89 -0
  102. package/dist/{pilot-overlay/overlay-fixtures.d.ts → demo/overlay/phase-fixtures.d.ts} +2 -2
  103. package/dist/{pilot-overlay/overlay-fixtures.js → demo/overlay/phase-fixtures.js} +2 -2
  104. package/dist/{pilot-overlay/action-ring.js → demo/overlay/pilot/actions.js} +2 -1
  105. package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.d.ts +6 -5
  106. package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.js +19 -18
  107. package/dist/{pilot-overlay → demo/overlay/pilot}/shell.d.ts +2 -2
  108. package/dist/{pilot-overlay → demo/overlay/pilot}/shell.js +13 -22
  109. package/dist/demo/overlay/reattach.d.ts +7 -0
  110. package/dist/demo/overlay/reattach.js +23 -0
  111. package/dist/demo/overlay/rings.d.ts +33 -0
  112. package/dist/demo/overlay/rings.js +448 -0
  113. package/dist/{ui → demo/overlay/ui}/components/ring.js +2 -2
  114. package/dist/{ui → demo/overlay/ui}/overlay.css +4 -4
  115. package/dist/{ui → demo/overlay/ui}/shadow.d.ts +1 -1
  116. package/dist/{ui → demo/overlay/ui}/shadow.js +39 -2
  117. package/dist/demo/stepper/after.d.ts +3 -0
  118. package/dist/demo/stepper/after.js +113 -0
  119. package/dist/demo/stepper/banner-log.d.ts +37 -0
  120. package/dist/demo/stepper/banner-log.js +63 -0
  121. package/dist/demo/stepper/before.d.ts +4 -0
  122. package/dist/demo/stepper/before.js +110 -0
  123. package/dist/demo/stepper/demo-log.d.ts +31 -0
  124. package/dist/demo/stepper/demo-log.js +309 -0
  125. package/dist/demo/stepper/gate.d.ts +11 -0
  126. package/dist/demo/stepper/gate.js +78 -0
  127. package/dist/demo/stepper/interaction-patch.d.ts +3 -0
  128. package/dist/demo/stepper/interaction-patch.js +323 -0
  129. package/dist/demo/stepper/pacing.d.ts +21 -0
  130. package/dist/demo/stepper/pacing.js +23 -0
  131. package/dist/demo/stepper/slides.d.ts +11 -0
  132. package/dist/demo/stepper/slides.js +233 -0
  133. package/dist/demo/stepper/step-panels.d.ts +21 -0
  134. package/dist/demo/stepper/step-panels.js +589 -0
  135. package/dist/demo/stepper/stepper.d.ts +24 -0
  136. package/dist/demo/stepper/stepper.js +122 -0
  137. package/dist/demo/stepper/teardown.d.ts +48 -0
  138. package/dist/demo/stepper/teardown.js +179 -0
  139. package/dist/demo/stepper/todo-advance.d.ts +14 -0
  140. package/dist/demo/stepper/todo-advance.js +110 -0
  141. package/dist/demo/stepper/view.d.ts +68 -0
  142. package/dist/demo/stepper/view.js +31 -0
  143. package/dist/demo/types.d.ts +17 -0
  144. package/dist/demo/verbose-log.js +15 -0
  145. package/dist/{types.d.ts → engine/block/block.d.ts} +106 -91
  146. package/dist/{core → engine/block}/block.js +10 -53
  147. package/dist/{core → engine/block}/compose.d.ts +10 -7
  148. package/dist/{core → engine/block}/compose.js +1 -1
  149. package/dist/{core/blocks → engine/block/kinds}/api.d.ts +17 -12
  150. package/dist/{core/blocks → engine/block/kinds}/api.js +26 -18
  151. package/dist/{core/blocks → engine/block/kinds}/effect.d.ts +13 -18
  152. package/dist/engine/block/kinds/effect.js +17 -0
  153. package/dist/{core/blocks → engine/block/kinds}/method.d.ts +19 -29
  154. package/dist/{core/blocks → engine/block/kinds}/method.js +7 -21
  155. package/dist/{core/blocks → engine/block/kinds}/nav.d.ts +22 -31
  156. package/dist/{core/blocks → engine/block/kinds}/nav.js +6 -12
  157. package/dist/{core/blocks → engine/block/kinds}/page.d.ts +15 -20
  158. package/dist/{core/blocks → engine/block/kinds}/page.js +5 -7
  159. package/dist/engine/checkpoint/checkpoint.d.ts +22 -0
  160. package/dist/engine/checkpoint/checkpoint.js +8 -0
  161. package/dist/engine/checkpoint/route.d.ts +28 -0
  162. package/dist/engine/checkpoint/route.js +28 -0
  163. package/dist/{core → engine}/config.d.ts +7 -2
  164. package/dist/engine/config.js +6 -0
  165. package/dist/engine/engine.d.ts +45 -0
  166. package/dist/{core → engine}/engine.js +6 -10
  167. package/dist/engine/env.d.ts +59 -0
  168. package/dist/engine/env.js +83 -0
  169. package/dist/{errors.d.ts → engine/errors.d.ts} +23 -22
  170. package/dist/{errors.js → engine/errors.js} +22 -22
  171. package/dist/{core → engine/flow}/branch-regression.d.ts +8 -7
  172. package/dist/{core → engine/flow}/branch-regression.js +4 -3
  173. package/dist/engine/flow/flow.d.ts +162 -0
  174. package/dist/engine/flow/flow.js +244 -0
  175. package/dist/{core → engine/flow}/map-builder.d.ts +42 -40
  176. package/dist/{core → engine/flow}/map-builder.js +46 -48
  177. package/dist/{core → engine}/locate.d.ts +1 -1
  178. package/dist/{core → engine}/locate.js +1 -2
  179. package/dist/{mem-stub.d.ts → engine/mem/mem-stub.d.ts} +9 -8
  180. package/dist/{mem-stub.js → engine/mem/mem-stub.js} +2 -2
  181. package/dist/{mem-page.d.ts → engine/mem/mem.d.ts} +1 -1
  182. package/dist/{mem-page.js → engine/mem/mem.js} +2 -1
  183. package/dist/engine/page-gone.d.ts +5 -0
  184. package/dist/engine/page-gone.js +20 -0
  185. package/dist/engine/run/connect.d.ts +28 -0
  186. package/dist/{types.js → engine/run/connect.js} +11 -10
  187. package/dist/engine/run/events.d.ts +67 -0
  188. package/dist/engine/run/events.js +90 -0
  189. package/dist/engine/run/hooks.d.ts +16 -0
  190. package/dist/engine/run/hooks.js +8 -0
  191. package/dist/engine/run/launch.d.ts +13 -0
  192. package/dist/engine/run/launch.js +27 -0
  193. package/dist/{core/run-graph.d.ts → engine/run/run.d.ts} +9 -11
  194. package/dist/{core/run-graph.js → engine/run/run.js} +22 -11
  195. package/dist/engine/stub/pace.d.ts +12 -0
  196. package/dist/engine/stub/pace.js +2 -0
  197. package/dist/engine/stub/ring.d.ts +130 -0
  198. package/dist/engine/stub/ring.js +41 -0
  199. package/dist/engine/stub/stub.d.ts +268 -0
  200. package/dist/engine/stub/stub.js +1 -0
  201. package/dist/engine/stub/todos.d.ts +104 -0
  202. package/dist/engine/stub/todos.js +2 -0
  203. package/dist/engine/stub/viewport.d.ts +26 -0
  204. package/dist/engine/stub/viewport.js +2 -0
  205. package/dist/{trait.d.ts → engine/trait/trait.d.ts} +1 -1
  206. package/dist/index.d.ts +84 -36
  207. package/dist/index.js +44 -19
  208. package/dist/{session/auto-explore-run.d.ts → live/auto/auto.d.ts} +10 -16
  209. package/dist/{session/auto-explore-run.js → live/auto/auto.js} +164 -248
  210. package/dist/{session/auto-explore.d.ts → live/auto/explore.d.ts} +4 -14
  211. package/dist/{session/auto-explore.js → live/auto/explore.js} +21 -127
  212. package/dist/{auto-session/session.d.ts → live/auto-session/auto-session.d.ts} +1 -1
  213. package/dist/{auto-session/session.js → live/auto-session/auto-session.js} +27 -24
  214. package/dist/{auto-session → live/auto-session}/helpers.d.ts +16 -5
  215. package/dist/{auto-session → live/auto-session}/helpers.js +1 -1
  216. package/dist/{session/auto-session-ipc.d.ts → live/auto-session/ipc.d.ts} +7 -5
  217. package/dist/{session/auto-session-ipc.js → live/auto-session/ipc.js} +31 -16
  218. package/dist/{session/browser.d.ts → live/auto-session/start.d.ts} +1 -2
  219. package/dist/{session/browser.js → live/auto-session/start.js} +2 -3
  220. package/dist/{pilot-overlay → live/pilot}/panel.d.ts +1 -1
  221. package/dist/{pilot-overlay → live/pilot}/panel.js +23 -31
  222. package/dist/{session → live/pilot}/pilot.d.ts +4 -3
  223. package/dist/{session → live/pilot}/pilot.js +4 -4
  224. package/dist/{traverse → live/traverse}/coverage.d.ts +4 -0
  225. package/dist/{traverse → live/traverse}/coverage.js +3 -0
  226. package/dist/{traverse → live/traverse}/lease.d.ts +1 -0
  227. package/dist/{traverse → live/traverse}/lease.js +1 -0
  228. package/dist/{traverse/run.d.ts → live/traverse/traverse.d.ts} +4 -1
  229. package/dist/{traverse/run.js → live/traverse/traverse.js} +26 -43
  230. package/dist/manifest/manifest.d.ts +52 -0
  231. package/dist/manifest/manifest.js +93 -0
  232. package/dist/manifest/map-imports.d.ts +7 -0
  233. package/dist/manifest/map-imports.js +22 -0
  234. package/dist/manifest/maps.d.ts +33 -0
  235. package/dist/manifest/maps.js +62 -0
  236. package/dist/manifest/pack.d.ts +21 -0
  237. package/dist/manifest/pack.js +109 -0
  238. package/dist/manifest/project.d.ts +60 -0
  239. package/dist/manifest/project.js +101 -0
  240. package/dist/{session/block-inject.js → manifest/roots.js} +1 -18
  241. package/dist/manifest/scan.d.ts +19 -0
  242. package/dist/manifest/scan.js +57 -0
  243. package/dist/{blocks-select.d.ts → manifest/select.d.ts} +3 -0
  244. package/dist/{blocks-select.js → manifest/select.js} +2 -0
  245. package/dist/manifest/source.d.ts +23 -0
  246. package/dist/manifest/source.js +86 -0
  247. package/dist/runner/mode.d.ts +71 -0
  248. package/dist/runner/mode.js +1 -0
  249. package/dist/runner/modes/branches.d.ts +5 -0
  250. package/dist/runner/modes/branches.js +37 -0
  251. package/dist/runner/modes/demo.d.ts +3 -0
  252. package/dist/runner/modes/demo.js +13 -0
  253. package/dist/runner/modes/report.d.ts +2 -0
  254. package/dist/runner/modes/report.js +54 -0
  255. package/dist/runner/modes/run.d.ts +2 -0
  256. package/dist/runner/modes/run.js +3 -0
  257. package/dist/runner/options.d.ts +31 -0
  258. package/dist/runner/options.js +42 -0
  259. package/dist/runner/plan/find.d.ts +18 -0
  260. package/dist/runner/plan/find.js +65 -0
  261. package/dist/runner/plan/plan.d.ts +11 -0
  262. package/dist/runner/plan/plan.js +97 -0
  263. package/dist/runner/plan/seed-mem.d.ts +12 -0
  264. package/dist/runner/plan/seed-mem.js +98 -0
  265. package/dist/runner/plan/spec.d.ts +5 -0
  266. package/dist/runner/plan/spec.js +17 -0
  267. package/dist/runner/play-steps.d.ts +2 -0
  268. package/dist/runner/play-steps.js +59 -0
  269. package/dist/runner/runner.d.ts +4 -0
  270. package/dist/runner/runner.js +64 -0
  271. package/dist/runner/session.d.ts +9 -0
  272. package/dist/runner/session.js +87 -0
  273. package/dist/{browser.js → runtime/browser.js} +4 -2
  274. package/dist/{env-file.js → runtime/env-file.js} +7 -12
  275. package/dist/{extensions.d.ts → runtime/extensions.d.ts} +2 -5
  276. package/dist/{extensions.js → runtime/extensions.js} +3 -1
  277. package/dist/runtime/full-launch.d.ts +1 -0
  278. package/dist/runtime/full-launch.js +34 -0
  279. package/dist/runtime/global-flag.d.ts +5 -0
  280. package/dist/runtime/global-flag.js +18 -0
  281. package/dist/{playwright-config.d.ts → runtime/playwright-config.d.ts} +1 -1
  282. package/dist/{playwright.config.js → runtime/playwright.config.js} +3 -2
  283. package/dist/runtime/run-log.d.ts +2 -0
  284. package/dist/runtime/run-log.js +17 -0
  285. package/dist/{video-dir.js → runtime/video-dir.js} +3 -2
  286. package/dist/{config.d.ts → runtime/waygraph-config.d.ts} +8 -9
  287. package/dist/{config.js → runtime/waygraph-config.js} +21 -51
  288. package/dist/{webserver.js → runtime/webserver.js} +5 -30
  289. package/examples/routed-demo/config/waygraph.config.ts +20 -0
  290. package/examples/routed-demo/package.json +1 -4
  291. package/examples/routed-demo/scripts/fixture-server.mjs +1 -1
  292. package/examples/routed-demo/src/flows/routed-demo-map.flow.ts +2 -4
  293. package/examples/routed-demo/src/flows/routed-demo.flow.ts +2 -3
  294. package/examples/routed-demo/src/map/(app_base)/dashboard/_methods/click-widget.block.ts +5 -4
  295. package/examples/routed-demo/src/map/(app_base)/dashboard/_nav.block.ts +3 -3
  296. package/examples/routed-demo/src/map/(app_base)/dashboard/_page.block.ts +3 -3
  297. package/examples/routed-demo/src/map/(external)/docs/_nav.block.ts +3 -3
  298. package/examples/routed-demo/src/map/(external)/docs/_page.block.ts +3 -3
  299. package/examples/routed-demo/src/states/routed-demo.states.ts +5 -3
  300. package/examples/routed-demo/tests/routed-demo.spec.ts +4 -4
  301. package/examples/routed-demo/tsconfig.json +1 -1
  302. package/examples/saucedemo/README.md +11 -12
  303. package/examples/saucedemo/config/waygraph.config.ts +17 -0
  304. package/examples/saucedemo/docs/CONVENTION.md +5 -7
  305. package/examples/saucedemo/docs/HELPERS.md +12 -12
  306. package/examples/saucedemo/package-lock.json +10 -3
  307. package/examples/saucedemo/package.json +12 -29
  308. package/examples/saucedemo/src/blocks/SITE-MAP.md +0 -1
  309. package/examples/saucedemo/src/blocks/saucedemo-web/NAV.md +1 -5
  310. package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -52
  311. package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
  312. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
  313. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
  314. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
  315. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
  316. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +21 -27
  317. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -9
  318. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
  319. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +10 -76
  320. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
  321. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
  322. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
  323. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
  324. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
  325. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
  326. package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -29
  327. package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -48
  328. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +13 -77
  329. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
  330. package/examples/saucedemo/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
  331. package/examples/saucedemo/src/flows/api-demo.flow.ts +26 -18
  332. package/examples/saucedemo/src/flows/cart-bulk.flow.ts +19 -14
  333. package/examples/saucedemo/src/flows/cart-continue.flow.ts +10 -8
  334. package/examples/saucedemo/src/flows/cart-mem.flow.ts +7 -7
  335. package/examples/saucedemo/src/flows/catalog-logout.flow.ts +13 -8
  336. package/examples/saucedemo/src/flows/checkout-then-browse-again.flow.ts +26 -48
  337. package/examples/saucedemo/src/flows/checkout.flow.ts +70 -86
  338. package/examples/saucedemo/src/flows/device-showcase.flow.ts +24 -25
  339. package/examples/saucedemo/src/flows/login.flow.ts +11 -18
  340. package/examples/saucedemo/src/flows/mem-stub-demo.flow.ts +9 -20
  341. package/examples/saucedemo/src/flows/shop.flow.ts +15 -20
  342. package/examples/saucedemo/src/flows/smoke.flow.ts +12 -27
  343. package/examples/saucedemo/src/flows/stub-on-error.flow.ts +24 -43
  344. package/examples/saucedemo/src/flows/viewer-blocked.flow.ts +26 -34
  345. package/examples/saucedemo/src/states/checkout.mem-stubs.ts +11 -0
  346. package/examples/saucedemo/src/states/checkout.states.ts +21 -11
  347. package/examples/saucedemo/src/stubs/device-showcase.ts +191 -0
  348. package/examples/saucedemo/src/stubs/login.ts +37 -0
  349. package/examples/saucedemo/tests/auto-graph.spec.ts +4 -12
  350. package/examples/saucedemo/tests/chain-flow-episodes.spec.ts +7 -9
  351. package/examples/saucedemo/tests/submit-login-branch.spec.ts +18 -5
  352. package/package.json +12 -7
  353. package/templates/agents/waygraph-planner.agent.md +2 -2
  354. package/templates/quickstart/README.md +4 -7
  355. package/templates/quickstart/config/waygraph.config.ts +17 -0
  356. package/templates/quickstart/docs/CONVENTION.md +5 -6
  357. package/templates/quickstart/docs/HELPERS.md +11 -9
  358. package/templates/quickstart/package.json +14 -17
  359. package/templates/quickstart/src/blocks/SITE-MAP.md +13 -3
  360. package/templates/quickstart/src/blocks/saucedemo-web/NAV.md +1 -5
  361. package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -52
  362. package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
  363. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
  364. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
  365. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
  366. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
  367. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +21 -27
  368. package/templates/quickstart/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -9
  369. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
  370. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +10 -76
  371. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
  372. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
  373. package/templates/quickstart/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
  374. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
  375. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
  376. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
  377. package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -29
  378. package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -48
  379. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +13 -77
  380. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
  381. package/templates/quickstart/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
  382. package/templates/quickstart/src/flows/api-demo.flow.ts +45 -0
  383. package/templates/quickstart/src/flows/cart-bulk.flow.ts +19 -14
  384. package/templates/quickstart/src/flows/cart-continue.flow.ts +10 -8
  385. package/templates/quickstart/src/flows/cart-mem.flow.ts +7 -7
  386. package/templates/quickstart/src/flows/catalog-logout.flow.ts +13 -8
  387. package/templates/quickstart/src/flows/checkout-then-browse-again.flow.ts +26 -48
  388. package/templates/quickstart/src/flows/checkout.flow.ts +70 -63
  389. package/templates/quickstart/src/flows/device-showcase.flow.ts +24 -25
  390. package/templates/quickstart/src/flows/login.flow.ts +11 -18
  391. package/templates/quickstart/src/flows/mem-stub-demo.flow.ts +12 -0
  392. package/templates/quickstart/src/flows/shop.flow.ts +15 -20
  393. package/templates/quickstart/src/flows/smoke.flow.ts +12 -27
  394. package/templates/quickstart/src/flows/stub-on-error.flow.ts +31 -0
  395. package/templates/quickstart/src/flows/viewer-blocked.flow.ts +26 -34
  396. package/templates/quickstart/src/states/checkout.mem-stubs.ts +11 -0
  397. package/templates/quickstart/src/states/checkout.states.ts +21 -11
  398. package/templates/quickstart/src/stubs/device-showcase.ts +191 -0
  399. package/templates/quickstart/src/stubs/login.ts +37 -0
  400. package/templates/quickstart/tests/chain-flow.spec.ts +7 -10
  401. package/templates/scaffold/README.md +2 -1
  402. package/templates/scaffold/STRUCTURE.md +5 -4
  403. package/templates/scaffold/config/waygraph.config.ts +1 -0
  404. package/templates/scaffold/gitignore +1 -0
  405. package/templates/scaffold/src/flows/README.md +2 -2
  406. package/templates/scaffold/src/map/(app_base)/docs/_nav.block.ts +3 -3
  407. package/templates/scaffold/src/map/(app_base)/docs/_page.block.ts +3 -3
  408. package/templates/scaffold/src/map/(app_base)/home/_methods/add-item.effect.block.ts +4 -4
  409. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-hello.method.block.ts +3 -3
  410. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-item-added.method.block.ts +3 -3
  411. package/templates/scaffold/src/map/(app_base)/home/_methods/clear-cart.method.block.ts +5 -4
  412. package/templates/scaffold/src/map/(app_base)/home/_methods/remove-item.effect.block.ts +4 -4
  413. package/templates/scaffold/src/map/(app_base)/home/_nav.block.ts +3 -3
  414. package/templates/scaffold/src/map/(app_base)/home/_page.block.ts +3 -3
  415. package/templates/scaffold/src/map/(app_base)/home/nav-verification-link.block.ts +4 -4
  416. package/templates/scaffold/src/map/(external)/hoppscotch/_keys.ts +21 -0
  417. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-body.method.block.ts +4 -4
  418. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-header.method.block.ts +4 -4
  419. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-status.method.block.ts +4 -4
  420. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/pick-extension-interceptor.method.block.ts +5 -4
  421. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-body.method.block.ts +6 -5
  422. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-headers.method.block.ts +6 -5
  423. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/send-request.method.block.ts +5 -4
  424. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-bearer-token.method.block.ts +6 -5
  425. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-headers.method.block.ts +6 -5
  426. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-json-body.method.block.ts +6 -5
  427. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-method.method.block.ts +6 -5
  428. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-query-params.method.block.ts +6 -5
  429. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-url.method.block.ts +6 -5
  430. package/templates/scaffold/src/map/(external)/hoppscotch/_nav.block.ts +3 -3
  431. package/templates/scaffold/src/map/(external)/hoppscotch/_page.block.ts +3 -3
  432. package/templates/scaffold/src/map/(external)/hoppscotch/_states.ts +6 -0
  433. package/templates/scaffold/src/map/(external)/hoppscotch/settings/_nav.block.ts +3 -3
  434. package/templates/scaffold/src/map/(external)/mailpit/_keys.ts +13 -0
  435. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-content.method.block.ts +4 -4
  436. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-received.method.block.ts +4 -4
  437. package/templates/scaffold/src/map/(external)/mailpit/_methods/extract-email-link.method.block.ts +6 -5
  438. package/templates/scaffold/src/map/(external)/mailpit/_methods/open-message.method.block.ts +6 -5
  439. package/templates/scaffold/src/map/(external)/mailpit/_nav.block.ts +3 -3
  440. package/templates/scaffold/src/map/(external)/mailpit/_page.block.ts +3 -3
  441. package/templates/scaffold/src/map/(external)/mailpit/_states.ts +9 -0
  442. package/templates/scaffold/src/map/README.md +7 -0
  443. package/templates/scaffold/src/states/README.md +4 -1
  444. package/templates/scaffold/src/states/demo.mem-keys.ts +1 -29
  445. package/templates/scaffold/src/states/demo.states.ts +14 -20
  446. package/templates/scaffold/tests/hoppscotch.spec.ts +1 -11
  447. package/templates/scaffold/tests/mail-verify.spec.ts +2 -2
  448. package/templates/skills/waygraph-blind-pilot.skill.md +2 -6
  449. package/templates/skills/waygraph-convention.skill.md +23 -14
  450. package/templates/skills/waygraph-pilot.skill.md +7 -4
  451. package/dist/auto-session/verbose-log.js +0 -16
  452. package/dist/auto-session.d.ts +0 -2
  453. package/dist/auto-session.js +0 -3
  454. package/dist/cli/discover.d.ts +0 -40
  455. package/dist/cli/discover.js +0 -148
  456. package/dist/commands/agent-dive.js +0 -52
  457. package/dist/commands/check.js +0 -192
  458. package/dist/commands/map.js +0 -29
  459. package/dist/commands/run.js +0 -104
  460. package/dist/commands/traverse.js +0 -177
  461. package/dist/core/block.d.ts +0 -109
  462. package/dist/core/blocks/effect.js +0 -23
  463. package/dist/core/config.js +0 -17
  464. package/dist/core/engine.d.ts +0 -198
  465. package/dist/core/flow.d.ts +0 -293
  466. package/dist/core/flow.js +0 -432
  467. package/dist/core.d.ts +0 -14
  468. package/dist/core.js +0 -15
  469. package/dist/highlights/merge.d.ts +0 -8
  470. package/dist/highlights/merge.js +0 -173
  471. package/dist/highlights/stub-ctx.d.ts +0 -10
  472. package/dist/highlights/stub-ctx.js +0 -331
  473. package/dist/highlights/types.d.ts +0 -607
  474. package/dist/highlights.d.ts +0 -9
  475. package/dist/highlights.js +0 -10
  476. package/dist/pilot-overlay.d.ts +0 -5
  477. package/dist/pilot-overlay.js +0 -6
  478. package/dist/runner/banner-log.js +0 -63
  479. package/dist/runner/chain-run.js +0 -102
  480. package/dist/runner/cursor.js +0 -140
  481. package/dist/runner/demo-log.js +0 -316
  482. package/dist/runner/device-stage.d.ts +0 -9
  483. package/dist/runner/device-stage.js +0 -420
  484. package/dist/runner/discovery.js +0 -105
  485. package/dist/runner/index.js +0 -2
  486. package/dist/runner/inpage/banner.d.ts +0 -21
  487. package/dist/runner/inpage/banner.js +0 -156
  488. package/dist/runner/inpage/caption.d.ts +0 -3
  489. package/dist/runner/inpage/caption.js +0 -23
  490. package/dist/runner/inpage/core.d.ts +0 -4
  491. package/dist/runner/inpage/core.js +0 -316
  492. package/dist/runner/inpage/device.d.ts +0 -3
  493. package/dist/runner/inpage/device.js +0 -211
  494. package/dist/runner/inpage/network.d.ts +0 -15
  495. package/dist/runner/inpage/network.js +0 -217
  496. package/dist/runner/inpage/panel-chrome.js +0 -192
  497. package/dist/runner/inpage/stamp.js +0 -46
  498. package/dist/runner/inpage/swipe-zoom.js +0 -220
  499. package/dist/runner/inpage/todos.js +0 -337
  500. package/dist/runner/interaction-patch.js +0 -384
  501. package/dist/runner/main.js +0 -469
  502. package/dist/runner/network-capture.d.ts +0 -9
  503. package/dist/runner/network-capture.js +0 -126
  504. package/dist/runner/overlay-css.d.ts +0 -3
  505. package/dist/runner/overlay-css.js +0 -377
  506. package/dist/runner/overlay-install.js +0 -90
  507. package/dist/runner/overlay-stage.js +0 -110
  508. package/dist/runner/rings.js +0 -514
  509. package/dist/runner/seed-mem.js +0 -110
  510. package/dist/runner/slides.js +0 -278
  511. package/dist/runner/step-mode.js +0 -703
  512. package/dist/runner/step-panels.js +0 -729
  513. package/dist/runner/teardown.js +0 -202
  514. package/dist/runner/todo-dock.js +0 -142
  515. package/dist/session/step-overlay.d.ts +0 -37
  516. package/dist/session/step-overlay.js +0 -244
  517. package/examples/routed-demo/playwright.config.ts +0 -21
  518. package/examples/saucedemo/playwright.config.ts +0 -19
  519. package/examples/saucedemo/scripts/drive-auto-cli.mjs +0 -93
  520. package/examples/saucedemo/scripts/prove-add-to-cart-menu.mjs +0 -126
  521. package/examples/saucedemo/scripts/prove-auto-graph.mjs +0 -92
  522. package/examples/saucedemo/scripts/prove-wrong-login-runtime.mjs +0 -63
  523. package/examples/saucedemo/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
  524. package/templates/quickstart/playwright.config.ts +0 -14
  525. package/templates/quickstart/scripts/drive-auto-cli.mjs +0 -93
  526. package/templates/quickstart/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
  527. /package/dist/{commands → cli/commands}/agent-dive-scaffold.d.ts +0 -0
  528. /package/dist/{commands → cli/commands}/agent-dive.d.ts +0 -0
  529. /package/dist/{commands → cli/commands}/extensions.d.ts +0 -0
  530. /package/dist/{commands → cli/commands}/init.d.ts +0 -0
  531. /package/dist/{commands → cli/commands}/list.d.ts +0 -0
  532. /package/dist/{commands → cli/commands}/map.d.ts +0 -0
  533. /package/dist/{commands → cli/commands}/session.d.ts +0 -0
  534. /package/dist/{commands → cli/commands}/test.d.ts +0 -0
  535. /package/dist/{commands → cli/commands}/traverse.d.ts +0 -0
  536. /package/dist/{commands → cli/commands}/try.d.ts +0 -0
  537. /package/dist/{commands → cli/commands}/upgrade.d.ts +0 -0
  538. /package/dist/{highlights → demo/narration}/shorthand.js +0 -0
  539. /package/dist/{pilot-overlay/action-ring.d.ts → demo/overlay/pilot/actions.d.ts} +0 -0
  540. /package/dist/{ui → demo/overlay/ui}/components/ring.d.ts +0 -0
  541. /package/dist/{ui → demo/overlay/ui}/stylesheet.d.ts +0 -0
  542. /package/dist/{ui → demo/overlay/ui}/stylesheet.js +0 -0
  543. /package/dist/{ui → demo/overlay/ui}/tokens.d.ts +0 -0
  544. /package/dist/{ui → demo/overlay/ui}/tokens.js +0 -0
  545. /package/dist/{highlights → demo}/types.js +0 -0
  546. /package/dist/{auto-session → demo}/verbose-log.d.ts +0 -0
  547. /package/dist/{selector.d.ts → engine/trait/selector.d.ts} +0 -0
  548. /package/dist/{selector.js → engine/trait/selector.js} +0 -0
  549. /package/dist/{trait.js → engine/trait/trait.js} +0 -0
  550. /package/dist/{session/block-inject.d.ts → manifest/roots.d.ts} +0 -0
  551. /package/dist/{browser.d.ts → runtime/browser.d.ts} +0 -0
  552. /package/dist/{env-file.d.ts → runtime/env-file.d.ts} +0 -0
  553. /package/dist/{playwright-config.js → runtime/playwright-config.js} +0 -0
  554. /package/dist/{playwright.config.d.ts → runtime/playwright.config.d.ts} +0 -0
  555. /package/dist/{video-dir.d.ts → runtime/video-dir.d.ts} +0 -0
  556. /package/dist/{webserver.d.ts → runtime/webserver.d.ts} +0 -0
@@ -1,62 +1,7 @@
1
- import { readdirSync, statSync } from "node:fs";
2
- import { join, relative, resolve } from "node:path";
3
- import { discoverGraph } from "../analysis/graph.js";
4
- import { exploreRoots, injectTaggedFile } from "./block-inject.js";
5
- function walkDir(dir, pattern) {
6
- const results = [];
7
- let entries;
8
- try {
9
- entries = readdirSync(dir, { withFileTypes: true });
10
- }
11
- catch {
12
- return results;
13
- }
14
- for (const entry of entries) {
15
- const full = join(dir, entry.name);
16
- if (entry.isDirectory()) {
17
- if (entry.name === "node_modules" || entry.name === "dist" || entry.name === ".git")
18
- continue;
19
- results.push(...walkDir(full, pattern));
20
- }
21
- else if (pattern.test(entry.name)) {
22
- results.push(full);
23
- }
24
- }
25
- return results;
26
- }
27
- /**
28
- * Real, confirmed bug this fixes: a bare `import(url.href)` is permanently
29
- * cached by Node's ESM loader for the lifetime of the process, keyed on the
30
- * exact specifier. `AutoSession.reloadLibrary()` exists specifically so a
31
- * Block edited on disk mid-session takes effect without restarting the
32
- * session - but a SECOND `reload` of a file already imported once in this
33
- * process silently kept returning the FIRST version's content, no matter
34
- * how many times the file changed on disk after that. A one-shot CLI
35
- * process (`waygraph graph`, etc.) never hits this - it only ever imports
36
- * each file once anyway - but a long-running `--detach` session calling
37
- * `reloadLibrary()` repeatedly does.
38
- *
39
- * Fix: bust the cache with the file's own mtime as a query param - a
40
- * genuinely changed file gets a new specifier (forcing a fresh import); an
41
- * UNCHANGED file between two reloads keeps hitting the SAME specifier (no
42
- * unbounded accumulation of dead module instances across many reloads).
43
- */
44
- async function importModule(filePath) {
45
- const resolved = resolve(filePath);
46
- const url = new URL(`file://${resolved}`);
47
- const mtimeMs = statSync(resolved).mtimeMs;
48
- url.searchParams.set("t", String(mtimeMs));
49
- return (await import(url.href));
50
- }
51
- function isBlockLike(val) {
52
- if (val === null || typeof val !== "object")
53
- return false;
54
- const obj = val;
55
- if (typeof obj.name !== "string")
56
- return false;
57
- const instruction = obj.instruction;
58
- return instruction !== null && typeof instruction === "object" && typeof instruction?.act === "function";
59
- }
1
+ import { join } from "node:path";
2
+ import { discoverGraph } from "../../analysis/graph.js";
3
+ import { scanProject } from "../../manifest/project.js";
4
+ import { importFresh, walkDir } from "../../manifest/scan.js";
60
5
  function isNavBlockMarked(val) {
61
6
  const kind = val.__waygraphKind;
62
7
  return kind === "nav" || kind === "page";
@@ -103,56 +48,26 @@ async function wildcardActionRunnable(page, entry, here) {
103
48
  * Import every `*.block.ts` export keyed by runtime Block `.name`.
104
49
  */
105
50
  export async function loadBlockLibrary(projectDir, opts) {
106
- const { matchBlocksSelect } = await import("../blocks-select.js");
107
51
  const byName = new Map();
108
52
  const navBlocks = [];
109
- const navSeen = new Set();
110
- const select = opts?.blocksSelect;
111
- for (const root of exploreRoots(projectDir, opts?.inject)) {
112
- for (const file of walkDir(root, /\.block\.ts$/)) {
113
- const relFile = relative(root, file).replace(/\\/g, "/");
114
- const taggedFile = injectTaggedFile(projectDir, root, relFile);
115
- // Glob/bare: path filter before import. Regex: need block name — filter after.
116
- if (select && select.kind !== "regex" && !matchBlocksSelect(select, { relFile })) {
117
- continue;
118
- }
119
- let mod;
120
- try {
121
- mod = await importModule(file);
122
- }
123
- catch (err) {
124
- const msg = err instanceof Error ? err.message : String(err);
125
- if (/second time|playwright/i.test(msg)) {
126
- console.error(`waygraph auto: skip ${relFile}: ${msg.split("\n")[0]}`);
127
- }
128
- continue;
129
- }
130
- for (const [exportName, exported] of Object.entries(mod)) {
131
- if (!isBlockLike(exported))
132
- continue;
133
- if (select &&
134
- !matchBlocksSelect(select, { relFile, blockName: exported.name })) {
135
- continue;
136
- }
137
- const kind = isNavBlockMarked(exported) ? "nav" : "action";
138
- const entry = {
139
- block: exported,
140
- exportName,
141
- file: taggedFile,
142
- kind,
143
- description: typeof exported.description === "string" ? exported.description : "",
144
- };
145
- if (byName.has(exported.name)) {
146
- console.error(`waygraph: inject skipped duplicate Block name "${exported.name}" (${taggedFile})`);
147
- continue;
148
- }
149
- byName.set(exported.name, entry);
150
- if (kind === "nav" && !navSeen.has(exported.name)) {
151
- navSeen.add(exported.name);
152
- navBlocks.push(entry);
153
- }
154
- }
53
+ const scan = await scanProject(projectDir, {
54
+ blocksSelect: opts?.blocksSelect,
55
+ inject: opts?.inject,
56
+ flows: false,
57
+ });
58
+ // A Block's required keys get the project's own defaults: every `*.mem-stubs.ts` registers its fakes on import.
59
+ for (const file of walkDir(join(projectDir, "src"), /\.mem-stubs\.ts$/))
60
+ await importFresh(file);
61
+ for (const b of scan.blocks) {
62
+ const kind = isNavBlockMarked(b.block) ? "nav" : "action";
63
+ if (byName.has(b.name)) {
64
+ console.error(`waygraph: inject skipped duplicate Block name "${b.name}" (${b.file})`);
65
+ continue;
155
66
  }
67
+ const entry = { block: b.block, exportName: b.exportName, file: b.file, kind, description: b.description };
68
+ byName.set(b.name, entry);
69
+ if (kind === "nav")
70
+ navBlocks.push(entry);
156
71
  }
157
72
  navBlocks.sort((a, b) => {
158
73
  const aUrl = isUrlNav(a) ? 0 : 1;
@@ -161,27 +76,6 @@ export async function loadBlockLibrary(projectDir, opts) {
161
76
  });
162
77
  return { byName, navBlocks };
163
78
  }
164
- /**
165
- * @deprecated Use {@link buildExploreMenu} — kept for unit tests.
166
- */
167
- export function exploreChoices(graph, here) {
168
- const seen = new Set();
169
- const out = [];
170
- for (const edge of graph.edges) {
171
- if (here === null) {
172
- if (edge.kind !== "nav" || edge.from !== "*")
173
- continue;
174
- }
175
- else if (edge.from !== here && edge.from !== "*") {
176
- continue;
177
- }
178
- if (seen.has(edge.block))
179
- continue;
180
- seen.add(edge.block);
181
- out.push(edge);
182
- }
183
- return out.sort((a, b) => a.block.localeCompare(b.block));
184
- }
185
79
  /**
186
80
  * Runtime-filtered menu: only Blocks that can run on the live page, grouped forward/back.
187
81
  */
@@ -1,5 +1,5 @@
1
1
  import type { ApplyPathResult, ApplyPickResult, AutoSessionInit, ConsoleLogEntry, InspectDomOptions, InspectDomResult, SessionSnapshot, StorageSnapshot, StubFileKind, TraceStep } from "./helpers.js";
2
- import type { PilotHighlightFixtures } from "../pilot-overlay.js";
2
+ import type { PilotHighlightFixtures } from "../../demo/overlay/pilot/fixtures.js";
3
3
  /**
4
4
  * Non-interactive explore session: same graph/library/mem/browser setup
5
5
  * `runAutoExplore` runs in `--cli` mode, driven by `applyPick` instead of a
@@ -1,16 +1,21 @@
1
- // Split out of the former 1,078-line auto-session.ts (see src/ARCHITECTURE.md). Behavior unchanged.
2
1
  import { CONSOLE_LOG_MAX_ENTRIES, FULL_MODE_DEFAULT_DEPTH, FULL_MODE_MAX_NODES, FULL_MODE_MAX_TEXT_LENGTH, TRACE_MAX_STEPS, buildSessionSnapshot, parsePick, stubFilePath, stubPhaseHasContent, walkFullDom } from "./helpers.js";
3
- import { instrumentPilotActions, installPersistentPilotOverlay, showPilotActivity, showPilotFixtures, showPilotVision, phaseToOverlayFixtures, describeOverlayFixtures, updatePilotOverlay } from "../pilot-overlay.js";
4
- import { buildExploreContext, buildExploreMenu } from "../session/auto-explore.js";
5
- import { MemPage } from "../mem-page.js";
6
- import { Engine } from "../core.js";
7
- import { detectHere, ensureLivePage, ensureMem, resolveBaseUrl, runOneBlock, seedDefaultMem } from "../session/auto-explore-run.js";
8
- import { collectKnownInteractionSelectors, unmappedInteractionsPageScript } from "../analysis/coverage-gap.js";
9
- import { runStubPhase } from "../highlights.js";
10
- import { verboseLog } from "./verbose-log.js";
11
- import { findBlockPathDetailed } from "../analysis/graph.js";
12
- import { configuredExtensions } from "../config.js";
13
- import { chromiumExecutablePath, launchContext } from "../browser.js";
2
+ import { keepOverlayOnNavigation } from "../../demo/overlay/reattach.js";
3
+ import { installPersistentPilotOverlay, showPilotActivity, showPilotVision } from "../../demo/overlay/pilot/shell.js";
4
+ import { showPilotFixtures } from "../../demo/overlay/pilot/fixtures.js";
5
+ import { instrumentPilotActions } from "../../demo/overlay/pilot/actions.js";
6
+ import { phaseToOverlayFixtures, describeOverlayFixtures } from "../../demo/overlay/phase-fixtures.js";
7
+ import { updatePilotOverlay } from "../pilot/panel.js";
8
+ import { buildExploreContext, buildExploreMenu } from "../auto/explore.js";
9
+ import { MemPage } from "../../engine/mem/mem.js";
10
+ import { Engine } from "../../engine/engine.js";
11
+ import { detectHere, ensureLivePage, ensureMem, runOneBlock, seedDefaultMem } from "../auto/auto.js";
12
+ import { collectKnownInteractionSelectors, unmappedInteractionsPageScript } from "../../analysis/coverage-gap.js";
13
+ import { runStubPhase } from "../../demo/narration/narration.js";
14
+ import { verboseLog } from "../../demo/verbose-log.js";
15
+ import { findBlockPathDetailed } from "../../analysis/graph.js";
16
+ import { configuredExtensions, resolveBaseUrl } from "../../runtime/waygraph-config.js";
17
+ import { chromiumExecutablePath, launchContext } from "../../runtime/browser.js";
18
+ import { ignorePageGone, ignoreTimeout } from "../../engine/page-gone.js";
14
19
  /**
15
20
  * Non-interactive explore session: same graph/library/mem/browser setup
16
21
  * `runAutoExplore` runs in `--cli` mode, driven by `applyPick` instead of a
@@ -101,20 +106,18 @@ export class AutoSession {
101
106
  const page = await context.newPage();
102
107
  instrumentPilotActions(page, headless ? 0 : 450);
103
108
  if (startUrl) {
104
- await page.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(() => { });
105
- await page.waitForLoadState("load").catch(() => { });
109
+ await page.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(ignorePageGone);
110
+ await page.waitForLoadState("load").catch(ignoreTimeout);
106
111
  }
107
112
  else {
108
- await page.goto("about:blank").catch(() => { });
113
+ await page.goto("about:blank").catch(ignorePageGone);
109
114
  }
110
115
  const knownInteractionSelectors = collectKnownInteractionSelectors(init.projectDir, library, init.inject);
111
116
  const session = new AutoSession(init.projectDir, init.inject, init.blocksSelect, graph, library, mem, engine, closeBrowser, context, page, startUrl, init.sessionId, knownInteractionSelectors, headless);
112
- page.on("load", () => {
113
- void session.repaintOverlayAfterNavigation();
114
- });
117
+ keepOverlayOnNavigation(page, () => session.repaintOverlayAfterNavigation());
115
118
  if (!headless) {
116
- await session.bootstrapOverlay().catch(() => { });
117
- await page.bringToFront().catch(() => { });
119
+ await session.bootstrapOverlay().catch(ignorePageGone);
120
+ await page.bringToFront().catch(ignorePageGone);
118
121
  }
119
122
  // Attached once, on the page created here - `ensureLivePage` only swaps
120
123
  // to a fresh Page if the current one closed (a rare case, e.g. the human
@@ -204,11 +207,11 @@ export class AutoSession {
204
207
  /** Re-apply cached overlay state after navigation (init script restores shell only). */
205
208
  async repaintOverlayAfterNavigation() {
206
209
  if (this.lastOverlayInfo) {
207
- await updatePilotOverlay(this.page, this.lastOverlayInfo).catch(() => { });
210
+ await updatePilotOverlay(this.page, this.lastOverlayInfo).catch(ignorePageGone);
208
211
  return;
209
212
  }
210
213
  if (!this.headless) {
211
- await this.bootstrapOverlay().catch(() => { });
214
+ await this.bootstrapOverlay().catch(ignorePageGone);
212
215
  }
213
216
  }
214
217
  /**
@@ -233,7 +236,7 @@ export class AutoSession {
233
236
  knownPathnames,
234
237
  knownSelectors: this.knownInteractionSelectors,
235
238
  };
236
- await this.page.evaluate(unmappedInteractionsPageScript, payload).catch(() => { });
239
+ await this.page.evaluate(unmappedInteractionsPageScript, payload).catch(ignorePageGone);
237
240
  }
238
241
  /** Pure getter - no Block runs, no mem/page mutation. */
239
242
  async currentSnapshot() {
@@ -342,7 +345,7 @@ export class AutoSession {
342
345
  const fixtures = phaseToOverlayFixtures(phase, holdMs);
343
346
  for (const line of describeOverlayFixtures(tag, fixtures))
344
347
  verboseLog("pilot", line);
345
- await showPilotFixtures(this.page, fixtures).catch(() => { });
348
+ await showPilotFixtures(this.page, fixtures).catch(ignorePageGone);
346
349
  }
347
350
  async runNamedBlock(entry, expectedTo, instanceOption) {
348
351
  const from = this.here;
@@ -1,8 +1,10 @@
1
- import type { StubPhaseResult } from "../highlights.js";
2
- import type { BlockEntry, ExploreMenu } from "../session/auto-explore.js";
3
- import type { PickResult } from "../session/auto-explore-run.js";
1
+ import type { StubPhaseResult } from "../../engine/stub/stub.js";
2
+ import type { ExploreMenu } from "../auto/explore.js";
3
+ import type { BlockEntry } from "../../manifest/project.js";
4
+ import type { PickResult } from "../auto/auto.js";
4
5
  /** True when a stub-phase result actually carries authored content worth keeping. */
5
6
  export declare function stubPhaseHasContent(r: StubPhaseResult): boolean;
7
+ /** One available move in a session snapshot: a Block and the Checkpoint it leads to. */
6
8
  export interface SessionSnapshotEdge {
7
9
  /** 1-based, matching the numbers a human/agent picks by (same as printCliMenu). */
8
10
  index: number;
@@ -12,10 +14,12 @@ export interface SessionSnapshotEdge {
12
14
  label?: string;
13
15
  description?: string;
14
16
  }
17
+ /** A group of moves in a session snapshot, by page. */
15
18
  export interface SessionSnapshotSection {
16
19
  title: string;
17
20
  edges: SessionSnapshotEdge[];
18
21
  }
22
+ /** The state of a live session: where it is, the moves available from there, and the trace so far. */
19
23
  export interface SessionSnapshot {
20
24
  here: string | null;
21
25
  sections: SessionSnapshotSection[];
@@ -82,11 +86,12 @@ export declare function walkFullDom(root: Element, caps: FullDomCaps): {
82
86
  tree: FullDomNode;
83
87
  truncated: boolean;
84
88
  };
89
+ /** What `AutoSession.start` needs: project, selection, headless mode and the session id. */
85
90
  export interface AutoSessionInit {
86
91
  projectDir: string;
87
92
  baseURL?: string;
88
93
  startUrl?: string;
89
- blocksSelect?: import("../blocks-select.js").BlocksSelect;
94
+ blocksSelect?: import("../../manifest/select.js").BlocksSelect;
90
95
  /** Absolute paths — merged Block libraries (see `waygraph browser --inject`). */
91
96
  inject?: string[];
92
97
  /** When true, open about:blank instead of baseURL/startUrl (browser default). */
@@ -102,6 +107,7 @@ export interface AutoSessionInit {
102
107
  */
103
108
  sessionId?: string;
104
109
  }
110
+ /** The result of running one menu pick in a live session. */
105
111
  export type ApplyPickResult = {
106
112
  ok: true;
107
113
  snapshot: SessionSnapshot;
@@ -110,6 +116,7 @@ export type ApplyPickResult = {
110
116
  ok: false;
111
117
  error: string;
112
118
  };
119
+ /** The result of running a multi-step route in a live session. */
113
120
  export type ApplyPathResult = {
114
121
  ok: true;
115
122
  path: string[];
@@ -133,7 +140,7 @@ export interface TraceStep {
133
140
  * Resolved demo-narration fixtures (highlights/todos/device), when the
134
141
  * Block actually authors `stubBefore`/`stubAfter`/`stubOnError` - the same
135
142
  * data `waygraph demo`'s lifecycle logging already computes (`runStubPhase`
136
- * in highlights.ts), reused here for extra context on what a step meant to
143
+ * in demo/narration/index.ts), reused here for extra context on what a step meant to
137
144
  * convey. Omitted when the Block has none, or the result carries nothing.
138
145
  */
139
146
  stubBefore?: StubPhaseResult;
@@ -141,6 +148,7 @@ export interface TraceStep {
141
148
  stubOnError?: StubPhaseResult;
142
149
  }
143
150
  export declare const TRACE_MAX_STEPS = 500;
151
+ /** Which stub file a live session wrote: before, after or on-error. */
144
152
  export type StubFileKind = "image" | "pdf" | "video";
145
153
  /**
146
154
  * Real, minimal, valid fixture files bundled at `assets/stubs/` - not
@@ -180,11 +188,13 @@ export interface ConsoleLogEntry {
180
188
  timestamp: string;
181
189
  }
182
190
  export declare const CONSOLE_LOG_MAX_ENTRIES = 200;
191
+ /** One service worker registration as reported by a live session. */
183
192
  export interface ServiceWorkerRegistrationInfo {
184
193
  scope: string;
185
194
  activeUrl?: string;
186
195
  state?: string;
187
196
  }
197
+ /** One cookie as reported by a live session's `auto cookies`. */
188
198
  export interface CookieInfo {
189
199
  name: string;
190
200
  value: string;
@@ -193,6 +203,7 @@ export interface CookieInfo {
193
203
  httpOnly: boolean;
194
204
  secure: boolean;
195
205
  }
206
+ /** Local and session storage of a live session's page. */
196
207
  export interface StorageSnapshot {
197
208
  localStorage: Record<string, string>;
198
209
  sessionStorage: Record<string, string>;
@@ -137,7 +137,7 @@ export const TRACE_MAX_STEPS = 500;
137
137
  * exist for more than a moment.
138
138
  */
139
139
  export function stubFilePath(kind) {
140
- const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), "..", "..");
140
+ const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), "..", "..", "..");
141
141
  const names = {
142
142
  image: "stub.png",
143
143
  pdf: "stub.pdf",
@@ -1,6 +1,6 @@
1
- import { AutoSession, type AutoSessionInit, type SessionSnapshot, type InspectDomOptions, type DomSnapshot, type TraceStep, type ApplyPathResult, type ConsoleLogEntry, type StorageSnapshot, type StubFileKind } from "../auto-session.js";
2
- import type { PilotHighlightFixtures } from "../pilot-overlay.js";
3
- export type { PilotHighlightFixtures } from "../pilot-overlay.js";
1
+ import { AutoSession } from "./auto-session.js";
2
+ import { type AutoSessionInit, type SessionSnapshot, type InspectDomOptions, type DomSnapshot, type TraceStep, type ApplyPathResult, type ConsoleLogEntry, type StorageSnapshot, type StubFileKind } from "./helpers.js";
3
+ import type { PilotHighlightFixtures } from "../../demo/overlay/pilot/fixtures.js";
4
4
  export interface SessionMeta {
5
5
  sessionId: string;
6
6
  socketPath: string;
@@ -128,8 +128,10 @@ export declare function serveSession(session: AutoSession, projectDir: string, s
128
128
  export declare function runAutoServeCommand(init: AutoSessionInit, sessionId: string): Promise<void>;
129
129
  /**
130
130
  * Parent-side: spawns a detached background process running the same
131
- * explore session as a socket server, waits for it to signal readiness (its
132
- * metadata file appearing), and returns its identity. Recurses through the
131
+ * explore session as a socket server, waits for it to say it is serving (one
132
+ * message over an IPC channel, then disconnect), and returns its identity. A
133
+ * child that exits or stays silent past the timeout fails the start, and a silent
134
+ * one is stopped. Recurses through the
133
135
  * existing `bin/waygraph` launcher (same tsx/esm registration every other
134
136
  * invocation already gets) with the hidden `__auto-serve` command, rather
135
137
  * than re-implementing that resolution here.
@@ -14,7 +14,8 @@ import { fileURLToPath } from "node:url";
14
14
  import { randomBytes } from "node:crypto";
15
15
  import { createInterface } from "node:readline/promises";
16
16
  import { stdin as input, stdout as output } from "node:process";
17
- import { AutoSession, } from "../auto-session.js";
17
+ import { AutoSession } from "./auto-session.js";
18
+ import { ignorePageGone } from "../../engine/page-gone.js";
18
19
  function sessionDir(projectDir) {
19
20
  return join(projectDir, ".waygraph-auto");
20
21
  }
@@ -318,7 +319,7 @@ export async function serveSession(session, projectDir, sessionId, headless = tr
318
319
  return;
319
320
  shuttingDown = true;
320
321
  server.close();
321
- await session.close().catch(() => { });
322
+ await session.close().catch(ignorePageGone);
322
323
  removeSessionFiles(projectDir, sessionId);
323
324
  process.exit(0);
324
325
  }
@@ -343,14 +344,19 @@ export async function serveSession(session, projectDir, sessionId, headless = tr
343
344
  export async function runAutoServeCommand(init, sessionId) {
344
345
  const session = await AutoSession.start({ ...init, sessionId });
345
346
  await serveSession(session, init.projectDir, sessionId, init.headless ?? true);
347
+ // Tell the parent that spawned us (spawnDetachedSession) we are serving, then let it go.
348
+ process.send?.({ ready: true });
349
+ process.disconnect?.();
346
350
  // Keep the event loop alive - the listening server already does this,
347
351
  // but await forever here documents the intent for a reader.
348
352
  await new Promise(() => { });
349
353
  }
350
354
  /**
351
355
  * Parent-side: spawns a detached background process running the same
352
- * explore session as a socket server, waits for it to signal readiness (its
353
- * metadata file appearing), and returns its identity. Recurses through the
356
+ * explore session as a socket server, waits for it to say it is serving (one
357
+ * message over an IPC channel, then disconnect), and returns its identity. A
358
+ * child that exits or stays silent past the timeout fails the start, and a silent
359
+ * one is stopped. Recurses through the
354
360
  * existing `bin/waygraph` launcher (same tsx/esm registration every other
355
361
  * invocation already gets) with the hidden `__auto-serve` command, rather
356
362
  * than re-implementing that resolution here.
@@ -358,12 +364,12 @@ export async function runAutoServeCommand(init, sessionId) {
358
364
  export async function spawnDetachedSession(init, readyTimeoutMs = 20_000) {
359
365
  const sessionId = generateSessionId();
360
366
  mkdirSync(sessionDir(init.projectDir), { recursive: true });
361
- // This file compiles to dist/session/auto-session-ipc.js - two levels down from the package
367
+ // This file compiles to dist/live/auto-session/ipc.js - three levels down from the package
362
368
  // root, not one. Same bug class as cli/util.ts's own packageRoot(); see its comment.
363
- const pkgRoot = join(dirname(fileURLToPath(import.meta.url)), "..", "..");
369
+ const pkgRoot = join(dirname(fileURLToPath(import.meta.url)), "..", "..", "..");
364
370
  const require = createRequire(join(pkgRoot, "package.json"));
365
371
  const tsxEsm = require.resolve("tsx/esm");
366
- const cli = join(pkgRoot, "dist", "cli.js");
372
+ const cli = join(pkgRoot, "dist", "cli", "cli.js");
367
373
  const logFd = openSync(logPathFor(init.projectDir, sessionId), "a");
368
374
  const args = ["--import", tsxEsm, cli, "__auto-serve", init.projectDir, "--session-id", sessionId];
369
375
  if (init.baseURL)
@@ -382,20 +388,29 @@ export async function spawnDetachedSession(init, readyTimeoutMs = 20_000) {
382
388
  // Spawn cli.js directly — not bin/waygraph (which would fork a second Node).
383
389
  const child = spawn(process.execPath, args, {
384
390
  detached: true,
385
- stdio: ["ignore", logFd, logFd],
391
+ stdio: ["ignore", logFd, logFd, "ipc"],
386
392
  windowsHide: true,
387
393
  env: process.env,
388
394
  });
395
+ const log = logPathFor(init.projectDir, sessionId);
396
+ const outcome = await new Promise((done) => {
397
+ const timer = setTimeout(() => done("timeout"), readyTimeoutMs);
398
+ child.once("message", () => (clearTimeout(timer), done("ready")));
399
+ child.once("exit", (code) => (clearTimeout(timer), done({ exit: code })));
400
+ });
401
+ if (child.connected)
402
+ child.disconnect();
389
403
  child.unref();
390
- const deadline = Date.now() + readyTimeoutMs;
391
- while (Date.now() < deadline) {
392
- const meta = readSessionMeta(init.projectDir, sessionId);
393
- if (meta)
394
- return meta;
395
- await new Promise((r) => setTimeout(r, 150));
404
+ if (outcome === "timeout") {
405
+ child.kill("SIGTERM");
406
+ throw new Error(`session "${sessionId}" did not become ready within ${readyTimeoutMs}ms (stopped it) - check ${log} for errors`);
396
407
  }
397
- throw new Error(`session "${sessionId}" did not become ready within ${readyTimeoutMs}ms - ` +
398
- `check ${logPathFor(init.projectDir, sessionId)} for errors`);
408
+ if (outcome !== "ready")
409
+ throw new Error(`session "${sessionId}" exited (code ${outcome.exit}) before it was ready - check ${log}`);
410
+ const meta = readSessionMeta(init.projectDir, sessionId);
411
+ if (!meta)
412
+ throw new Error(`session "${sessionId}" said it was ready but wrote no metadata - check ${log}`);
413
+ return meta;
399
414
  }
400
415
  /** Stop one detached session (SIGTERM + cleanup metadata/socket). */
401
416
  export function stopBrowserSession(projectDir, sessionId) {
@@ -1,4 +1,4 @@
1
- import type { AutoSessionInit } from "../auto-session.js";
1
+ import type { AutoSessionInit } from "./helpers.js";
2
2
  export interface BrowserStartInit extends AutoSessionInit {
3
3
  /** Preset names or paths; resolved before spawn. */
4
4
  injectTokens?: string[];
@@ -12,4 +12,3 @@ export interface BrowserStartResult {
12
12
  }
13
13
  /** Always spawns a new detached session — does not stop or reuse existing ones. */
14
14
  export declare function browserStart(init: BrowserStartInit): Promise<BrowserStartResult>;
15
- export { listBrowserSessions, stopBrowserSession, stopAllBrowserSessions, type SessionMeta, } from "./auto-session-ipc.js";
@@ -6,8 +6,8 @@
6
6
  * Session lifecycle is explicit: `browser sessions` lists what's live;
7
7
  * `browser start` always opens another; `browser attach` / `browser stop` pick one up or shut it down.
8
8
  */
9
- import { spawnDetachedSession } from "./auto-session-ipc.js";
10
- import { resolveInjectRoots } from "./block-inject.js";
9
+ import { spawnDetachedSession } from "./ipc.js";
10
+ import { resolveInjectRoots } from "../../manifest/roots.js";
11
11
  /** Always spawns a new detached session — does not stop or reuse existing ones. */
12
12
  export async function browserStart(init) {
13
13
  const inject = init.inject ??
@@ -26,4 +26,3 @@ export async function browserStart(init) {
26
26
  inject,
27
27
  };
28
28
  }
29
- export { listBrowserSessions, stopBrowserSession, stopAllBrowserSessions, } from "./auto-session-ipc.js";
@@ -1,4 +1,4 @@
1
- import type { SessionSnapshot } from "../auto-session.js";
1
+ import type { SessionSnapshot } from "../auto-session/helpers.js";
2
2
  import type { Page } from "@playwright/test";
3
3
  /** Minimal shape needed to render the graph tree - matches WaygraphGraph. */
4
4
  interface PilotOverlayGraph {
@@ -1,4 +1,5 @@
1
- import { ensureInstalled } from "./shell.js";
1
+ import { ensureInstalled } from "../../demo/overlay/pilot/shell.js";
2
+ import { ignorePageGone } from "../../engine/page-gone.js";
2
3
  /**
3
4
  * Refreshes the badge text and the (possibly-collapsed) panel's two tabs
4
5
  * ("Here" - current live menu; "All nodes" - whole project graph as a
@@ -10,6 +11,8 @@ export async function updatePilotOverlay(page, info) {
10
11
  await ensureInstalled(page);
11
12
  await page
12
13
  .evaluate(async ({ sessionId, snapshot, graph }) => {
14
+ // Block names, labels and descriptions can carry the page's own text (an Effect's instance label is read off
15
+ // the live DOM), so they go in as text nodes (__wgEl), never as markup.
13
16
  const badge = __wgById("wg-pilot-badge");
14
17
  const current = __wgById("wg-pilot-panel-current");
15
18
  const graphPanel = __wgById("wg-pilot-panel-graph");
@@ -21,26 +24,16 @@ export async function updatePilotOverlay(page, info) {
21
24
  badge.textContent = `Waygraph Pilot - ${idPart} - ${hereLabel}`;
22
25
  const totalEdges = snapshot.sections.reduce((n, s) => n + s.edges.length, 0);
23
26
  if (totalEdges === 0) {
24
- current.innerHTML = onBlank
25
- ? '<div class="wg-pilot-empty">Blank page — no Block moves yet. Use auto goto or a nav Block when ready.</div>'
26
- : '<div class="wg-pilot-empty">No Block moves from here right now.</div>';
27
+ __wgSet(current, __wgEl("div", { class: "wg-pilot-empty" }, onBlank ? "Blank page — no Block moves yet. Use auto goto or a nav Block when ready." : "No Block moves from here right now."));
27
28
  }
28
29
  else {
29
- current.innerHTML = snapshot.sections
30
- .map((section) => {
31
- const rows = section.edges
32
- .map((edge) => {
33
- const desc = edge.description ? ` - ${edge.description}` : "";
34
- const label = edge.label ? ` (${edge.label})` : "";
35
- return `<div class="wg-pilot-edge">[${edge.index}] <span class="wg-pilot-kind">${edge.kind}</span> ${edge.block}${label} -&gt; ${edge.to}${desc}</div>`;
36
- })
37
- .join("");
38
- return `<div class="wg-pilot-section">${section.title}</div>${rows}`;
39
- })
40
- .join("");
30
+ __wgSet(current, snapshot.sections.map((section) => [
31
+ __wgEl("div", { class: "wg-pilot-section" }, section.title),
32
+ section.edges.map((edge) => __wgEl("div", { class: "wg-pilot-edge" }, `[${edge.index}] `, __wgEl("span", { class: "wg-pilot-kind" }, edge.kind), ` ${edge.block}${edge.label ? ` (${edge.label})` : ""} -> ${edge.to}${edge.description ? ` - ${edge.description}` : ""}`)),
33
+ ]));
41
34
  }
42
35
  if (!graph || graph.nodes.length === 0) {
43
- graphPanel.innerHTML = '<div class="wg-pilot-empty">No graph data yet.</div>';
36
+ __wgSet(graphPanel, __wgEl("div", { class: "wg-pilot-empty" }, "No graph data yet."));
44
37
  return;
45
38
  }
46
39
  // Flat indented-text tree - the ORIGINAL "All nodes" rendering.
@@ -49,18 +42,14 @@ export async function updatePilotOverlay(page, info) {
49
42
  // when Mermaid genuinely can't load (e.g. offline), not the primary
50
43
  // rendering anymore.
51
44
  const renderTextTree = () => {
52
- graphPanel.innerHTML = graph.nodes
53
- .map((node) => {
45
+ __wgSet(graphPanel, graph.nodes.map((node) => {
54
46
  const outgoing = graph.edges.filter((e) => e.from === node.checkpoint || e.from === "*");
55
47
  const rows = outgoing.length
56
- ? outgoing
57
- .map((e) => `<div class="wg-pilot-graph-edge"><span class="wg-pilot-kind">${e.kind}</span> ${e.block} -&gt; ${e.to}</div>`)
58
- .join("")
59
- : '<div class="wg-pilot-graph-edge wg-pilot-empty">(no outgoing edges)</div>';
48
+ ? outgoing.map((e) => __wgEl("div", { class: "wg-pilot-graph-edge" }, __wgEl("span", { class: "wg-pilot-kind" }, e.kind), ` ${e.block} -> ${e.to}`))
49
+ : [__wgEl("div", { class: "wg-pilot-graph-edge wg-pilot-empty" }, "(no outgoing edges)")];
60
50
  const here = node.checkpoint === snapshot.here ? " (here)" : "";
61
- return `<div class="wg-pilot-graph-node"><div class="wg-pilot-graph-checkpoint">${node.checkpoint}${here}</div>${rows}</div>`;
62
- })
63
- .join("");
51
+ return __wgEl("div", { class: "wg-pilot-graph-node" }, __wgEl("div", { class: "wg-pilot-graph-checkpoint" }, node.checkpoint + here), rows);
52
+ }));
64
53
  };
65
54
  try {
66
55
  const w = window;
@@ -80,10 +69,11 @@ export async function updatePilotOverlay(page, info) {
80
69
  throw new Error("mermaid did not attach to window after load");
81
70
  // Real, direct user request: "left to right stuff. maybe mermaid?
82
71
  // with square ish arrows???" - LR layout, linear (non-curvy) edges.
83
- w.mermaid.initialize({ startOnLoad: false, theme: "dark", securityLevel: "loose", flowchart: { curve: "linear" } });
72
+ // strict: Mermaid escapes label text itself; plain SVG labels (no HTML) so the result parses as SVG.
73
+ w.mermaid.initialize({ startOnLoad: false, theme: "dark", securityLevel: "strict", flowchart: { curve: "linear", htmlLabels: false } });
84
74
  const sanitize = (s) => s.replace(/[^A-Za-z0-9_]/g, "_");
85
75
  // Every Nav Block gets a `from:"*"` wildcard edge for pathfinding
86
- // (see auto-explore.ts's own isUrlNav comment). Real, screenshot-
76
+ // (see live/auto/explore.ts's own isUrlNav comment). Real, screenshot-
87
77
  // confirmed finding, TWICE over:
88
78
  // 1. Collapsing all of these into one shared "Anywhere" hub node
89
79
  // still broke the layout - ~9 of 10 Checkpoints have their own
@@ -137,8 +127,10 @@ export async function updatePilotOverlay(page, info) {
137
127
  lines.push(` ${sanitize(e.from)} -->|${e.block}| ${sanitize(e.to)}`);
138
128
  }
139
129
  const { svg } = await w.mermaid.render(`wg-mermaid-${Date.now()}`, lines.join("\n"));
140
- graphPanel.innerHTML =
141
- svg + `<div class="wg-pilot-graph-note">[nav] = also directly reachable via sidebar/URL from anywhere (not drawn as an edge - see the "Here" tab for what's live on this page).</div>`;
130
+ const diagram = __wgSvg(svg);
131
+ if (diagram.nodeName !== "svg")
132
+ throw new Error("mermaid output did not parse as SVG");
133
+ __wgSet(graphPanel, diagram, __wgEl("div", { class: "wg-pilot-graph-note" }, '[nav] = also directly reachable via sidebar/URL from anywhere (not drawn as an edge - see the "Here" tab for what\'s live on this page).'));
142
134
  // Real, direct user request: "i hope it is zoomed to the current
143
135
  // node" - the diagram is usually bigger than the panel, so scroll
144
136
  // (not zoom - the SVG itself stays real size, legible) the "here"
@@ -151,5 +143,5 @@ export async function updatePilotOverlay(page, info) {
151
143
  renderTextTree();
152
144
  }
153
145
  }, { sessionId: info.sessionId, snapshot: info.snapshot, graph: info.graph ?? null })
154
- .catch(() => { });
146
+ .catch(ignorePageGone);
155
147
  }