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
package/dist/index.js CHANGED
@@ -1,20 +1,47 @@
1
- export { connect, checkpoint } from "./types.js";
2
- export { MemKey, MemPage, key, keyGroup } from "./mem-page.js";
3
- export { registerMemStub, seedMemStub, getMemStub } from "./mem-stub.js";
4
- export { css, byText, byRole } from "./selector.js";
5
- export { WaygraphError, WAYGRAPH_ERRORS } from "./errors.js";
6
- export { Trait, urlMatches, textEquals, visible, disabled, enabled, frameVisible, frameTextEquals, frameContainsText, } from "./trait.js";
7
- export { runGraph, spawnTab, narrate, Engine, start, end, branch, withVerify, modVerify, modVerifyAll, defineBlock, defineNavBlock, defineNavClickBlock, defineMethodBlock, defineActionBlock, defineAssertBlock, definePageBlock, defineEffectBlock, defineMemEffectBlock, defineMemNavBlock, defineApiBlock, locate, composeBlock, fastForwardComposeBlock, isFastForwardBlock, preflight, withSessionReset, withTitle, withMemStub, withDemoPace, withBlockPace, withHighlightStyle, withExpectedFailure, withHighlightFixtures, withStubBefore, withStubAfter, withStubOnError, withDialog, chainFlow, defineLayout, map, MapBuilder, branchRoutes, collectBranchFlows, runBranchRegression, } from "./core.js";
8
- export { resolveHighlightSlots, resolveSlides, runStubPhase, resolveFixtureDwellMs, resolveSlideDwellMs, formatHighlightCaption, hasAuthoredStubAfter, hasAuthoredStubOnError, normalizeHighlightTone, normalizeDemoPace, normalizeHighlightSize, normalizeHighlightWeight, applyHighlightStyleDefaults, toneIconPrefix, resolveStepDemoPace, demoPaceScale, demoPaceIsBlitz, demoPaceIsFast, demoPaceIsSlow, demoPaceGateMs, formatDemoPaceBadge, formatDemoPaceLabel, normalizeTodos, normalizeTodoPos, normalizeTodoStyle, buildTodoDock, applyTodoPhase, advanceTodoDock, completeSequentialTodoDock, applyDevicePhase, resolveDeviceState, normalizeDevicePreset, normalizeDeviceOrientation, applyOrientation, orientationFromViewport, DEVICE_PRESETS, resolveTodoDockUi, FIXTURE_DURATION_MS_DEFAULT, FIXTURE_DURATION_FAST_MS_DEFAULT, FIXTURE_DURATION_SLOW_MS_DEFAULT, SLIDE_DURATION_MS_DEFAULT, SLIDE_DURATION_FAST_MS_DEFAULT, WAYGRAPH_RING_CSS, } from "./highlights.js";
1
+ // The runtime layer supplies how an Engine launches its own browser (config, Chromium path, extensions).
2
+ import "./runtime/full-launch.js";
3
+ // Run events are written to the project's run log (.waygraph/runs) when the CLI turns it on.
4
+ import "./runtime/run-log.js";
5
+ export { connect } from "./engine/run/connect.js";
6
+ export { checkpoint } from "./engine/checkpoint/checkpoint.js";
7
+ export { MemKey, MemPage, key, keyGroup } from "./engine/mem/mem.js";
8
+ export { registerMemStub, seedMemStub, getMemStub } from "./engine/mem/mem-stub.js";
9
+ export { css, byText, byRole } from "./engine/trait/selector.js";
10
+ export { WaygraphError, WAYGRAPH_ERRORS } from "./engine/errors.js";
11
+ export { Trait, urlMatches, textEquals, visible, disabled, enabled, frameVisible, frameTextEquals, frameContainsText } from "./engine/trait/trait.js";
12
+ export { runGraph, spawnTab, narrate, preflight, defineLayout } from "./engine/run/run.js";
13
+ export { Engine, map } from "./engine/engine.js";
14
+ export { branch } from "./engine/block/branch.js";
15
+ export { withVerify, modVerify, modVerifyAll, defineBlock } from "./engine/block/block.js";
16
+ export { withDialog } from "./engine/block/dialog.js";
17
+ export { defineNavBlock, defineNavClickBlock, defineMemNavBlock } from "./engine/block/kinds/nav.js";
18
+ export { defineMethodBlock, defineAssertBlock } from "./engine/block/kinds/method.js";
19
+ export { definePageBlock } from "./engine/block/kinds/page.js";
20
+ export { defineEffectBlock } from "./engine/block/kinds/effect.js";
21
+ export { defineApiBlock } from "./engine/block/kinds/api.js";
22
+ export { locate } from "./engine/locate.js";
23
+ export { composeBlock, fastForwardComposeBlock, isFastForwardBlock } from "./engine/block/compose.js";
24
+ export { MapBuilder } from "./engine/flow/map-builder.js";
25
+ export { branchRoutes, collectBranchFlows, runBranchRegression } from "./engine/flow/branch-regression.js";
26
+ export { resolveHighlightSlots, resolveSlides, runStubPhase, hasAuthoredStubAfter, hasAuthoredStubOnError } from "./demo/narration/narration.js";
27
+ export { resolveFixtureDwellMs, normalizeDemoPace, resolveStepDemoPace, demoPaceScale, demoPaceIsBlitz, demoPaceIsFast, demoPaceIsSlow, demoPaceGateMs, formatDemoPaceBadge, formatDemoPaceLabel, FIXTURE_DURATION_MS_DEFAULT, FIXTURE_DURATION_FAST_MS_DEFAULT, FIXTURE_DURATION_SLOW_MS_DEFAULT } from "./demo/narration/demo-pace.js";
28
+ export { formatHighlightCaption, applyHighlightStyleDefaults, toneIconPrefix } from "./demo/narration/style.js";
29
+ export { normalizeHighlightTone, normalizeHighlightSize, normalizeHighlightWeight } from "./engine/stub/ring.js";
30
+ export { normalizeTodos, normalizeTodoPos, normalizeTodoStyle, buildTodoDock, applyTodoPhase, advanceTodoDock, completeSequentialTodoDock, resolveTodoDockUi } from "./demo/narration/todo-dock.js";
31
+ export { applyDevicePhase, resolveDeviceState, normalizeDevicePreset, normalizeDeviceOrientation, applyOrientation, orientationFromViewport, DEVICE_PRESETS } from "./demo/narration/device.js";
32
+ export { WAYGRAPH_RING_CSS } from "./demo/narration/css.js";
9
33
  export { discoverGraph, toMermaid, findOrphanBlocks, findBlockPath } from "./analysis/graph.js";
10
- export { isFileSelectToken, parseBlocksSelect, matchBlocksSelect, globToRegExp, } from "./blocks-select.js";
11
- export { EdgeLeaseCoordinator } from "./traverse/lease.js";
12
- export { runTraverse } from "./traverse/run.js";
13
- export { buildCoverageReport, collectGraphEdgeKeys, defaultCoverageOutPath, formatCoverageLine, normalizeHitKey, parseMinEdgeCoverage, writeCoverageReport, } from "./traverse/coverage.js";
14
- export { WG_UI_SEL, WG_READY_PANEL_SEL, WG_READY_AUTO_SEL, WG_READY_BANNER_SEL, readWgOverlayBeacon, readWgOverlayBeaconInPage, assertWgOverlayReady, } from "./session/overlay-beacon.js";
15
- export { AutoSession, stubFilePath } from "./auto-session.js";
16
- export { pilotStart } from "./session/pilot.js";
17
- export { defineConfig, resolveBaseUrl } from "./config.js";
18
- export { withWebServer } from "./webserver.js";
19
- export { chromiumExecutablePath } from "./browser.js";
20
- export { resolveExtension, KNOWN_EXTENSIONS } from "./extensions.js";
34
+ export { buildManifest } from "./manifest/manifest.js";
35
+ export { onRunEvent } from "./engine/run/events.js";
36
+ export { isFileSelectToken, parseBlocksSelect, matchBlocksSelect, globToRegExp } from "./manifest/select.js";
37
+ export { EdgeLeaseCoordinator } from "./live/traverse/lease.js";
38
+ export { runTraverse } from "./live/traverse/traverse.js";
39
+ export { buildCoverageReport, collectGraphEdgeKeys, defaultCoverageOutPath, formatCoverageLine, normalizeHitKey, parseMinEdgeCoverage, writeCoverageReport } from "./live/traverse/coverage.js";
40
+ export { WG_UI_SEL, WG_READY_PANEL_SEL, WG_READY_AUTO_SEL, WG_READY_BANNER_SEL, readWgOverlayBeacon, readWgOverlayBeaconInPage, assertWgOverlayReady } from "./demo/overlay/beacon.js";
41
+ export { AutoSession } from "./live/auto-session/auto-session.js";
42
+ export { stubFilePath } from "./live/auto-session/helpers.js";
43
+ export { pilotStart } from "./live/pilot/pilot.js";
44
+ export { defineConfig, resolveBaseUrl } from "./runtime/waygraph-config.js";
45
+ export { withWebServer } from "./runtime/webserver.js";
46
+ export { chromiumExecutablePath } from "./runtime/browser.js";
47
+ export { resolveExtension, KNOWN_EXTENSIONS } from "./runtime/extensions.js";
@@ -0,0 +1,22 @@
1
+ import type { BrowserContext, Page } from "@playwright/test";
2
+ import type { Checkpoint } from "../../engine/checkpoint/checkpoint.js";
3
+ import { Engine } from "../../engine/engine.js";
4
+ import { MemPage } from "../../engine/mem/mem.js";
5
+ import type { BlockEntry } from "../../manifest/project.js";
6
+ export interface AutoExploreOptions {
7
+ /** Terminal menu (browser still runs for act()). Default false = headful picker panel. */
8
+ cli?: boolean;
9
+ baseURL?: string;
10
+ /** Initial URL when the page is blank (defaults to baseURL). */
11
+ startUrl?: string;
12
+ /** Phase C: glob / regex / bare `--blocks` file select for discovery. */
13
+ blocksSelect?: import("../../manifest/select.js").BlocksSelect;
14
+ }
15
+ /** Which Checkpoint the page is on, asked of the project's own Nav / Page Blocks (their verify). */
16
+ export declare function detectHere(page: Page, navBlocks: BlockEntry[]): Promise<string | null>;
17
+ export declare function ensureLivePage(context: BrowserContext, page: Page, startUrl: string | undefined): Promise<Page>;
18
+ export declare function runOneBlock(engine: Engine, entry: BlockEntry, context: BrowserContext, page: Page, mem: MemPage, headful: boolean): Promise<Checkpoint<string>>;
19
+ /**
20
+ * Interactive waygraph auto: locate current Checkpoint, list runnable Blocks, pick one, repeat.
21
+ */
22
+ export declare function runAutoExplore(projectDir: string, options?: AutoExploreOptions): Promise<void>;
@@ -0,0 +1,207 @@
1
+ import { stdin as input, stdout as output } from "node:process";
2
+ import { createInterface } from "node:readline/promises";
3
+ import { installDemoChrome, instrumentAutoInteractions } from "../../demo/overlay/auto-chrome.js";
4
+ import { keepOverlayOnNavigation } from "../../demo/overlay/reattach.js";
5
+ import { Engine } from "../../engine/engine.js";
6
+ import { envString } from "../../engine/env.js";
7
+ import { buildFlow } from "../../engine/flow/flow.js";
8
+ import { locate } from "../../engine/locate.js";
9
+ import { MemPage } from "../../engine/mem/mem.js";
10
+ import { ignorePageGone, ignoreTimeout } from "../../engine/page-gone.js";
11
+ import { chromiumExecutablePath, launchContext } from "../../runtime/browser.js";
12
+ import { configuredExtensions, resolveBaseUrl } from "../../runtime/waygraph-config.js";
13
+ import { withWebServer } from "../../runtime/webserver.js";
14
+ import { buildExploreContext, buildExploreMenu, } from "./explore.js";
15
+ import { ensureMem, seedDefaultMem } from "./mem.js";
16
+ import { armPickWait, cliPick, headfulPick, printCliMenu, setAutoPanelRunning, syncPanelMem } from "./menu.js";
17
+ /** Which Checkpoint the page is on, asked of the project's own Nav / Page Blocks (their verify). */
18
+ export async function detectHere(page, navBlocks) {
19
+ const tags = navBlocks.map((n) => n.block);
20
+ return locate(page, tags, { timeoutMs: 1500 });
21
+ }
22
+ export async function ensureLivePage(context, page, startUrl) {
23
+ if (!page.isClosed())
24
+ return page;
25
+ const fresh = await context.newPage();
26
+ if (startUrl) {
27
+ await fresh.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(ignorePageGone);
28
+ await fresh.waitForLoadState("load").catch(ignoreTimeout);
29
+ }
30
+ return fresh;
31
+ }
32
+ export async function runOneBlock(engine, entry, context, page, mem, headful) {
33
+ const navClick = entry.block.__waygraphNavClick;
34
+ if (entry.kind === "nav" && navClick !== undefined) {
35
+ await page
36
+ .evaluate((label) => {
37
+ window.__wgPendingNavClickLabel = label;
38
+ }, `nav: ${entry.block.name}`)
39
+ .catch(ignorePageGone);
40
+ }
41
+ if (headful)
42
+ await setAutoPanelRunning(page, entry.block.name);
43
+ const flow = buildFlow([entry.block], engine.config);
44
+ const BLOCK_TIMEOUT_MS = 45_000;
45
+ let timer;
46
+ let result;
47
+ try {
48
+ const ran = await Promise.race([
49
+ flow.run(context, mem, { page, closeOnFinish: false }),
50
+ new Promise((_, reject) => {
51
+ timer = setTimeout(() => reject(new Error(`Block "${entry.block.name}" timed out after ${BLOCK_TIMEOUT_MS / 1000}s - ` +
52
+ "click Quit and retry, or check network / mem credentials")), BLOCK_TIMEOUT_MS);
53
+ }),
54
+ ]);
55
+ result = ran.result;
56
+ }
57
+ finally {
58
+ if (timer)
59
+ clearTimeout(timer);
60
+ }
61
+ await page.evaluate("delete window.__wgPendingNavClickLabel").catch(ignorePageGone);
62
+ return result;
63
+ }
64
+ /** Shown in the headful panel after each Block run. */
65
+ let lastRunNote = null;
66
+ /**
67
+ * Interactive waygraph auto: locate current Checkpoint, list runnable Blocks, pick one, repeat.
68
+ */
69
+ export async function runAutoExplore(projectDir, options = {}) {
70
+ await withWebServer(projectDir, () => runAutoExploreCore(projectDir, options));
71
+ }
72
+ async function runAutoExploreCore(projectDir, options = {}) {
73
+ lastRunNote = null;
74
+ const cli = options.cli === true;
75
+ const baseURL = options.baseURL ?? (await resolveBaseUrl(projectDir)) ?? envString("WAYGRAPH_BASE_URL");
76
+ const startUrl = options.startUrl ?? baseURL;
77
+ const { graph, library } = await buildExploreContext(projectDir, options.blocksSelect ? { blocksSelect: options.blocksSelect } : undefined);
78
+ if (options.blocksSelect) {
79
+ console.error(`waygraph auto: --blocks ${options.blocksSelect.raw} → ` +
80
+ `${library.byName.size} block(s), ${graph.edges.length} edge(s)`);
81
+ }
82
+ const mem = new MemPage();
83
+ seedDefaultMem(library.byName, mem);
84
+ const engine = cli ? new Engine({ headless: true }) : new Engine({ headless: false, slowMo: 250 });
85
+ const { chromium } = await import("@playwright/test");
86
+ const executablePath = chromiumExecutablePath();
87
+ const launchOpts = {
88
+ headless: cli,
89
+ args: cli ? [] : ["--start-maximized"],
90
+ };
91
+ if (!cli)
92
+ launchOpts.slowMo = 250;
93
+ if (executablePath)
94
+ launchOpts.executablePath = executablePath;
95
+ const contextOpts = cli
96
+ ? { viewport: { width: 1280, height: 720 } }
97
+ : { viewport: null };
98
+ if (baseURL)
99
+ contextOpts.baseURL = baseURL;
100
+ const { close: closeBrowser, context } = await launchContext({
101
+ launcher: chromium,
102
+ launch: launchOpts,
103
+ context: contextOpts,
104
+ extensions: await configuredExtensions(projectDir),
105
+ });
106
+ let page = await context.newPage();
107
+ if (startUrl) {
108
+ await page.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(ignorePageGone);
109
+ await page.waitForLoadState("load").catch(ignoreTimeout);
110
+ }
111
+ console.error(`waygraph auto: ${graph.nodes.length} checkpoint(s), ${graph.edges.length} edge(s) - ` +
112
+ (cli ? "CLI picker (terminal menu)" : "headful picker (browser panel)"));
113
+ const pickSlot = { resolve: null };
114
+ let wiredPage = null;
115
+ async function wirePage(target) {
116
+ if (wiredPage === target)
117
+ return;
118
+ await target.exposeFunction("__wgAutoPick", (index) => {
119
+ pickSlot.resolve?.({ type: "pick", index });
120
+ });
121
+ await target.exposeFunction("__wgAutoQuit", () => {
122
+ pickSlot.resolve?.({ type: "quit" });
123
+ });
124
+ if (!cli) {
125
+ await installDemoChrome(target, "", { banner: false });
126
+ keepOverlayOnNavigation(target, () => installDemoChrome(target, "", { banner: false }));
127
+ instrumentAutoInteractions(target, mem, 250);
128
+ }
129
+ wiredPage = target;
130
+ }
131
+ let here = null;
132
+ const cliRl = cli ? createInterface({ input, output }) : null;
133
+ try {
134
+ for (;;) {
135
+ page = await ensureLivePage(context, page, startUrl);
136
+ await wirePage(page);
137
+ const pickWait = armPickWait();
138
+ pickSlot.resolve = pickWait.resolve;
139
+ if (here === null) {
140
+ here = await detectHere(page, library.navBlocks);
141
+ }
142
+ if (cli)
143
+ console.error("waygraph auto: scanning page for moves ...");
144
+ const menu = await buildExploreMenu(page, graph, library, here);
145
+ if (cli)
146
+ console.error(`waygraph auto: ${menu.flat.length} move(s) available`);
147
+ if (menu.flat.length === 0) {
148
+ const fromHere = graph.edges.filter((e) => e.from === here).map((e) => e.block);
149
+ const missing = [...new Set(fromHere)].filter((b) => !library.byName.has(b));
150
+ console.error(here
151
+ ? `waygraph auto: no runnable Blocks on "${here}"` +
152
+ (fromHere.length
153
+ ? ` (graph has: ${[...new Set(fromHere)].join(", ")}${missing.length ? `; not loaded: ${missing.join(", ")}` : ""})`
154
+ : " - nothing on this page matches the graph.") +
155
+ (cli ? "" : " Tip: waygraph auto --cli")
156
+ : "waygraph auto: location unknown - pick nav-login (Start here) if shown.");
157
+ if (cli)
158
+ break;
159
+ }
160
+ let pick;
161
+ if (cli && cliRl) {
162
+ printCliMenu(menu, library.byName);
163
+ pick = await cliPick(menu, cliRl);
164
+ }
165
+ else {
166
+ pick = await headfulPick(page, menu, library.byName, mem, () => pickWait.promise, lastRunNote);
167
+ }
168
+ if (pick.type === "quit")
169
+ break;
170
+ if (pick.index < 0 || pick.index >= menu.flat.length)
171
+ continue;
172
+ const edge = menu.flat[pick.index];
173
+ const entry = library.byName.get(edge.block);
174
+ if (!entry) {
175
+ console.error(`waygraph auto: Block "${edge.block}" not loaded - skipped`);
176
+ continue;
177
+ }
178
+ try {
179
+ if (edge.instanceOption) {
180
+ mem.set(edge.instanceOption.key, edge.instanceOption.value);
181
+ }
182
+ if (!cli && (entry.block.requires?.length ?? 0) > 0) {
183
+ await syncPanelMem(page, mem, entry.block.requires ?? []);
184
+ }
185
+ else {
186
+ await ensureMem(entry, mem, cli);
187
+ }
188
+ const pickLabel = edge.label ?? entry.block.name;
189
+ console.error(`waygraph auto: running [${pick.index + 1}] ${pickLabel} ...`);
190
+ const result = await runOneBlock(engine, entry, context, page, mem, !cli);
191
+ // Trust block output over locate() - nav verify traits collide on /dashboard.
192
+ here = result.__state ?? edge.to;
193
+ lastRunNote = `${entry.block.name} -> ${here}`;
194
+ console.error(`waygraph auto: ran ${entry.block.name} -> ${here}`);
195
+ }
196
+ catch (err) {
197
+ lastRunNote = `${entry.block.name} failed`;
198
+ console.error(`waygraph auto: ${entry.block.name} failed - ${err instanceof Error ? err.message : String(err)}`);
199
+ }
200
+ }
201
+ }
202
+ finally {
203
+ cliRl?.close();
204
+ await context.close();
205
+ await closeBrowser();
206
+ }
207
+ }
@@ -1,18 +1,12 @@
1
1
  import type { Page } from "@playwright/test";
2
- import type { Block, Checkpoint, WaygraphInstanceOption } from "../types.js";
3
- import { type WaygraphGraph, type WaygraphEdge } from "../analysis/graph.js";
2
+ import { type WaygraphEdge, type WaygraphGraph } from "../../analysis/graph.js";
3
+ import type { WaygraphInstanceOption } from "../../engine/block/action-page.js";
4
4
  export interface ExploreContextOpts {
5
- blocksSelect?: import("../blocks-select.js").BlocksSelect;
5
+ blocksSelect?: import("../../manifest/select.js").BlocksSelect;
6
6
  /** Absolute paths of extra Block trees to merge (host projectDir is always first). */
7
7
  inject?: string[];
8
8
  }
9
- export interface BlockEntry {
10
- block: Block<Checkpoint<string>, Checkpoint<string>>;
11
- exportName: string;
12
- file: string;
13
- kind: "nav" | "action";
14
- description: string;
15
- }
9
+ import type { BlockEntry } from "../../manifest/project.js";
16
10
  /**
17
11
  * One menu row. Usually just a `WaygraphEdge` as discovered statically; when
18
12
  * a Block declares `instanceOptions`, one `ExploreEdge` is produced per live
@@ -41,10 +35,6 @@ export declare function loadBlockLibrary(projectDir: string, opts?: ExploreConte
41
35
  byName: Map<string, BlockEntry>;
42
36
  navBlocks: BlockEntry[];
43
37
  }>;
44
- /**
45
- * @deprecated Use {@link buildExploreMenu} — kept for unit tests.
46
- */
47
- export declare function exploreChoices(graph: WaygraphGraph, here: string | null): WaygraphEdge[];
48
38
  /**
49
39
  * Runtime-filtered menu: only Blocks that can run on the live page, grouped forward/back.
50
40
  */
@@ -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
  */
@@ -0,0 +1,11 @@
1
+ import { MemPage, type MemKey } from "../../engine/mem/mem.js";
2
+ import type { BlockEntry } from "../../manifest/project.js";
3
+ export declare function missingMemKeys(entry: BlockEntry, mem: MemPage): MemKey<unknown>[];
4
+ /** The project's own default for a key: its `registerMemStub` fake (live sessions load every `*.mem-stubs.ts`). */
5
+ export declare function memStubValue(key: MemKey<unknown>): unknown | undefined;
6
+ export declare function defaultMemJsonPrompt(key: MemKey<unknown>): string;
7
+ export declare function seedMemFromEnv(mem: MemPage, entry: BlockEntry): boolean;
8
+ /** Pre-seeds required keys from WAYGRAPH_DATA and the project's mem stubs, so a session does not stop for mem forms. */
9
+ export declare function seedDefaultMem(library: Map<string, BlockEntry>, mem: MemPage): void;
10
+ export declare function promptMemCli(entry: BlockEntry, mem: MemPage): Promise<void>;
11
+ export declare function ensureMem(entry: BlockEntry, mem: MemPage, cli: boolean): Promise<void>;
@@ -0,0 +1,85 @@
1
+ // Mem for a live session: --data first, then the project's mem stubs; the terminal prompt for what is missing.
2
+ import { stdin as input, stdout as output } from "node:process";
3
+ import { createInterface } from "node:readline/promises";
4
+ import { envString } from "../../engine/env.js";
5
+ import { getMemStub } from "../../engine/mem/mem-stub.js";
6
+ export function missingMemKeys(entry, mem) {
7
+ const requires = entry.block.requires ?? [];
8
+ return requires.filter((k) => !mem.has(k));
9
+ }
10
+ /** The project's own default for a key: its `registerMemStub` fake (live sessions load every `*.mem-stubs.ts`). */
11
+ export function memStubValue(key) {
12
+ return getMemStub(key)?.();
13
+ }
14
+ export function defaultMemJsonPrompt(key) {
15
+ const def = memStubValue(key);
16
+ return def === undefined ? "{}" : JSON.stringify(def);
17
+ }
18
+ export function seedMemFromEnv(mem, entry) {
19
+ const raw = envString("WAYGRAPH_DATA") ?? envString("WAYGRAPH_AUTO_MEM");
20
+ if (!raw)
21
+ return false;
22
+ try {
23
+ const parsed = JSON.parse(raw);
24
+ for (const k of entry.block.requires ?? []) {
25
+ if (k.name in parsed)
26
+ mem.set(k, parsed[k.name]);
27
+ }
28
+ return missingMemKeys(entry, mem).length === 0;
29
+ }
30
+ catch {
31
+ return false;
32
+ }
33
+ }
34
+ /** Pre-seeds required keys from WAYGRAPH_DATA and the project's mem stubs, so a session does not stop for mem forms. */
35
+ export function seedDefaultMem(library, mem) {
36
+ const raw = envString("WAYGRAPH_DATA") ?? envString("WAYGRAPH_AUTO_MEM");
37
+ let envParsed = {};
38
+ if (raw) {
39
+ try {
40
+ envParsed = JSON.parse(raw);
41
+ }
42
+ catch (err) {
43
+ throw new Error(`waygraph: --data / WAYGRAPH_DATA is not valid JSON: ${err instanceof Error ? err.message : String(err)}`);
44
+ }
45
+ }
46
+ for (const entry of library.values()) {
47
+ for (const k of entry.block.requires ?? []) {
48
+ if (mem.has(k))
49
+ continue;
50
+ if (k.name in envParsed) {
51
+ mem.set(k, envParsed[k.name]);
52
+ continue;
53
+ }
54
+ const def = memStubValue(k);
55
+ if (def !== undefined)
56
+ mem.set(k, def);
57
+ }
58
+ }
59
+ }
60
+ export async function promptMemCli(entry, mem) {
61
+ const rl = createInterface({ input, output });
62
+ try {
63
+ for (const k of missingMemKeys(entry, mem)) {
64
+ const def = defaultMemJsonPrompt(k);
65
+ const line = await rl.question(` ${k.name} JSON [${def}]: `);
66
+ const json = line.trim() || def;
67
+ mem.set(k, JSON.parse(json));
68
+ }
69
+ }
70
+ finally {
71
+ rl.close();
72
+ }
73
+ }
74
+ export async function ensureMem(entry, mem, cli) {
75
+ if (missingMemKeys(entry, mem).length === 0)
76
+ return;
77
+ if (seedMemFromEnv(mem, entry))
78
+ return;
79
+ if (cli) {
80
+ console.log(`\nBlock "${entry.block.name}" needs MemPage keys:`);
81
+ await promptMemCli(entry, mem);
82
+ return;
83
+ }
84
+ throw new Error(`Block "${entry.block.name}" needs MemPage keys - pass --data '{...}' / WAYGRAPH_DATA (or WAYGRAPH_AUTO_MEM), or enter values in --cli`);
85
+ }
@@ -0,0 +1,30 @@
1
+ import type { Page } from "@playwright/test";
2
+ import { createInterface } from "node:readline/promises";
3
+ import type { MemKey, MemPage } from "../../engine/mem/mem.js";
4
+ import type { BlockEntry } from "../../manifest/project.js";
5
+ import type { ExploreMenu } from "./explore.js";
6
+ export declare function setAutoPanelRunning(page: Page, label: string): Promise<void>;
7
+ export declare const PANEL_CSS: string;
8
+ export type PickResult = {
9
+ type: "pick";
10
+ index: number;
11
+ } | {
12
+ type: "quit";
13
+ };
14
+ /**
15
+ * Mem keys any Block on the current menu might read this turn - minus keys a
16
+ * dynamic `instanceOptions` row already answers by picking it (e.g. "which
17
+ * item to add to cart" comes from the menu row itself, not a hand-typed JSON
18
+ * textarea).
19
+ */
20
+ export declare function memKeysForMenu(menu: ExploreMenu, library: Map<string, BlockEntry>): readonly MemKey<unknown>[];
21
+ export declare function syncPanelMem(page: Page, mem: MemPage, keys: readonly MemKey<unknown>[]): Promise<void>;
22
+ export declare function armPickWait(): {
23
+ promise: Promise<PickResult>;
24
+ resolve: (v: PickResult) => void;
25
+ };
26
+ export declare function headfulPick(page: Page, menu: ExploreMenu, library: Map<string, BlockEntry>, mem: MemPage, waitPick: () => Promise<PickResult>,
27
+ /** What the last Block run did, shown at the top of the menu. */
28
+ note: string | null): Promise<PickResult>;
29
+ export declare function printCliMenu(menu: ExploreMenu, library: Map<string, BlockEntry>): void;
30
+ export declare function cliPick(menu: ExploreMenu, rl: ReturnType<typeof createInterface>): Promise<PickResult>;