waygraph 0.15.54 → 0.16.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (552) hide show
  1. package/README.md +8 -3
  2. package/bin/waygraph +2 -2
  3. package/dist/analysis/check.d.ts +38 -0
  4. package/dist/analysis/check.js +87 -0
  5. package/dist/analysis/coverage-gap.d.ts +1 -1
  6. package/dist/analysis/coverage-gap.js +14 -37
  7. package/dist/analysis/flow-source.d.ts +9 -0
  8. package/dist/analysis/flow-source.js +25 -0
  9. package/dist/analysis/graph.d.ts +10 -14
  10. package/dist/analysis/graph.js +48 -371
  11. package/dist/analysis/map-check.js +4 -39
  12. package/dist/analysis/practices-check.d.ts +1 -1
  13. package/dist/analysis/practices-check.js +24 -45
  14. package/dist/cli/args.d.ts +23 -0
  15. package/dist/cli/args.js +20 -0
  16. package/dist/{cli.d.ts → cli/cli.d.ts} +0 -1
  17. package/dist/{cli.js → cli/cli.js} +10 -9
  18. package/dist/{commands → cli/commands}/agent-dive-scaffold.js +35 -64
  19. package/dist/cli/commands/agent-dive.js +42 -0
  20. package/dist/cli/commands/browser.d.ts +2 -0
  21. package/dist/cli/commands/browser.js +109 -0
  22. package/dist/{commands → cli/commands}/check.d.ts +0 -1
  23. package/dist/cli/commands/check.js +104 -0
  24. package/dist/cli/commands/codemod-checkpoints.d.ts +18 -0
  25. package/dist/cli/commands/codemod-checkpoints.js +186 -0
  26. package/dist/cli/commands/codemod-flows.d.ts +18 -0
  27. package/dist/cli/commands/codemod-flows.js +284 -0
  28. package/dist/cli/commands/codemod-stubs.d.ts +10 -0
  29. package/dist/cli/commands/codemod-stubs.js +187 -0
  30. package/dist/{commands → cli/commands}/extensions.js +5 -4
  31. package/dist/{commands → cli/commands}/init.js +1 -2
  32. package/dist/{commands → cli/commands}/list.js +9 -7
  33. package/dist/cli/commands/manifest.d.ts +2 -0
  34. package/dist/cli/commands/manifest.js +20 -0
  35. package/dist/cli/commands/map.js +57 -0
  36. package/dist/cli/commands/pilot.d.ts +2 -0
  37. package/dist/cli/commands/pilot.js +102 -0
  38. package/dist/{commands → cli/commands}/run.d.ts +0 -1
  39. package/dist/cli/commands/run.js +64 -0
  40. package/dist/cli/commands/session-ops.d.ts +3 -0
  41. package/dist/cli/commands/session-ops.js +257 -0
  42. package/dist/cli/commands/session.js +132 -0
  43. package/dist/{commands → cli/commands}/test.js +11 -14
  44. package/dist/cli/commands/traverse.js +105 -0
  45. package/dist/{commands → cli/commands}/try.js +29 -25
  46. package/dist/{commands → cli/commands}/upgrade.js +40 -4
  47. package/dist/cli/flags.d.ts +193 -16
  48. package/dist/cli/flags.js +179 -234
  49. package/dist/cli/run-chain.d.ts +1 -0
  50. package/dist/cli/run-chain.js +42 -7
  51. package/dist/cli/usage.d.ts +1 -1
  52. package/dist/cli/usage.js +21 -53
  53. package/dist/cli/util.d.ts +2 -2
  54. package/dist/cli/util.js +2 -3
  55. package/dist/{highlights → demo/narration}/css.d.ts +1 -1
  56. package/dist/{highlights → demo/narration}/css.js +2 -3
  57. package/dist/{highlights → demo/narration}/demo-pace.d.ts +4 -12
  58. package/dist/{highlights → demo/narration}/demo-pace.js +5 -11
  59. package/dist/{highlights → demo/narration}/device.d.ts +4 -4
  60. package/dist/{highlights → demo/narration}/device.js +1 -1
  61. package/dist/demo/narration/merge.d.ts +10 -0
  62. package/dist/demo/narration/merge.js +67 -0
  63. package/dist/demo/narration/narration.d.ts +39 -0
  64. package/dist/{highlights/run-phase.js → demo/narration/narration.js} +25 -94
  65. package/dist/{highlights → demo/narration}/shorthand.d.ts +1 -1
  66. package/dist/demo/narration/stub-ctx.d.ts +8 -0
  67. package/dist/demo/narration/stub-ctx.js +164 -0
  68. package/dist/{highlights → demo/narration}/style.d.ts +1 -7
  69. package/dist/{highlights → demo/narration}/style.js +1 -41
  70. package/dist/{highlights → demo/narration}/todo-dock.d.ts +8 -8
  71. package/dist/{highlights → demo/narration}/todo-dock.js +13 -30
  72. package/dist/demo/overlay/auto-chrome.d.ts +7 -0
  73. package/dist/demo/overlay/auto-chrome.js +97 -0
  74. package/dist/demo/overlay/cursor.d.ts +19 -0
  75. package/dist/demo/overlay/cursor.js +142 -0
  76. package/dist/demo/overlay/device-stage.d.ts +26 -0
  77. package/dist/demo/overlay/device-stage.js +396 -0
  78. package/dist/demo/overlay/inpage/banner.d.ts +2 -0
  79. package/dist/demo/overlay/inpage/banner.js +160 -0
  80. package/dist/demo/overlay/inpage/caption.d.ts +2 -0
  81. package/dist/demo/overlay/inpage/caption.js +24 -0
  82. package/dist/demo/overlay/inpage/core.d.ts +2 -0
  83. package/dist/demo/overlay/inpage/core.js +345 -0
  84. package/dist/demo/overlay/inpage/device-chip.d.ts +1 -0
  85. package/dist/demo/overlay/inpage/device-chip.js +191 -0
  86. package/dist/demo/overlay/inpage/network.d.ts +10 -0
  87. package/dist/demo/overlay/inpage/network.js +189 -0
  88. package/dist/demo/overlay/inpage/panel-chrome.d.ts +1 -0
  89. package/dist/demo/overlay/inpage/panel-chrome.js +203 -0
  90. package/dist/demo/overlay/inpage/stamp.d.ts +1 -0
  91. package/dist/demo/overlay/inpage/stamp.js +46 -0
  92. package/dist/demo/overlay/inpage/swipe-zoom.d.ts +1 -0
  93. package/dist/demo/overlay/inpage/swipe-zoom.js +220 -0
  94. package/dist/demo/overlay/inpage/todos.d.ts +2 -0
  95. package/dist/demo/overlay/inpage/todos.js +293 -0
  96. package/dist/demo/overlay/locator-theater.d.ts +25 -0
  97. package/dist/demo/overlay/locator-theater.js +76 -0
  98. package/dist/demo/overlay/network-capture.d.ts +22 -0
  99. package/dist/demo/overlay/network-capture.js +127 -0
  100. package/dist/demo/overlay/overlay-css.d.ts +3 -0
  101. package/dist/demo/overlay/overlay-css.js +369 -0
  102. package/dist/demo/overlay/overlay-stage.d.ts +31 -0
  103. package/dist/demo/overlay/overlay-stage.js +106 -0
  104. package/dist/demo/overlay/overlay.d.ts +10 -0
  105. package/dist/demo/overlay/overlay.js +89 -0
  106. package/dist/{pilot-overlay/overlay-fixtures.d.ts → demo/overlay/phase-fixtures.d.ts} +2 -2
  107. package/dist/{pilot-overlay/overlay-fixtures.js → demo/overlay/phase-fixtures.js} +2 -2
  108. package/dist/{pilot-overlay/action-ring.js → demo/overlay/pilot/actions.js} +2 -1
  109. package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.d.ts +6 -5
  110. package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.js +19 -18
  111. package/dist/{pilot-overlay → demo/overlay/pilot}/shell.d.ts +2 -2
  112. package/dist/{pilot-overlay → demo/overlay/pilot}/shell.js +13 -22
  113. package/dist/demo/overlay/reattach.d.ts +7 -0
  114. package/dist/demo/overlay/reattach.js +23 -0
  115. package/dist/demo/overlay/rings.d.ts +61 -0
  116. package/dist/demo/overlay/rings.js +422 -0
  117. package/dist/{ui → demo/overlay/ui}/components/ring.js +2 -2
  118. package/dist/{ui → demo/overlay/ui}/overlay.css +4 -4
  119. package/dist/{ui → demo/overlay/ui}/shadow.d.ts +1 -1
  120. package/dist/{ui → demo/overlay/ui}/shadow.js +39 -2
  121. package/dist/demo/stepper/after.d.ts +3 -0
  122. package/dist/demo/stepper/after.js +103 -0
  123. package/dist/demo/stepper/banner-log.d.ts +35 -0
  124. package/dist/demo/stepper/banner-log.js +65 -0
  125. package/dist/demo/stepper/before.d.ts +4 -0
  126. package/dist/demo/stepper/before.js +110 -0
  127. package/dist/demo/stepper/demo-log.d.ts +48 -0
  128. package/dist/demo/stepper/demo-log.js +292 -0
  129. package/dist/demo/stepper/gate.d.ts +11 -0
  130. package/dist/demo/stepper/gate.js +78 -0
  131. package/dist/demo/stepper/interaction-patch.d.ts +4 -0
  132. package/dist/demo/stepper/interaction-patch.js +323 -0
  133. package/dist/demo/stepper/pacing.d.ts +21 -0
  134. package/dist/demo/stepper/pacing.js +23 -0
  135. package/dist/demo/stepper/panel-after.d.ts +17 -0
  136. package/dist/demo/stepper/panel-after.js +166 -0
  137. package/dist/demo/stepper/panel-before.d.ts +12 -0
  138. package/dist/demo/stepper/panel-before.js +241 -0
  139. package/dist/demo/stepper/slides.d.ts +23 -0
  140. package/dist/demo/stepper/slides.js +233 -0
  141. package/dist/demo/stepper/step-panels.d.ts +69 -0
  142. package/dist/demo/stepper/step-panels.js +172 -0
  143. package/dist/demo/stepper/stepper.d.ts +24 -0
  144. package/dist/demo/stepper/stepper.js +122 -0
  145. package/dist/demo/stepper/teardown.d.ts +47 -0
  146. package/dist/demo/stepper/teardown.js +178 -0
  147. package/dist/demo/stepper/todo-advance.d.ts +15 -0
  148. package/dist/demo/stepper/todo-advance.js +110 -0
  149. package/dist/demo/stepper/view.d.ts +58 -0
  150. package/dist/demo/stepper/view.js +31 -0
  151. package/dist/demo/types.d.ts +85 -0
  152. package/dist/demo/verbose-log.js +15 -0
  153. package/dist/engine/block/action-page.d.ts +53 -0
  154. package/dist/engine/block/action-page.js +1 -0
  155. package/dist/{types.d.ts → engine/block/block.d.ts} +102 -142
  156. package/dist/{core → engine/block}/block.js +12 -130
  157. package/dist/engine/block/branch.d.ts +17 -0
  158. package/dist/engine/block/branch.js +40 -0
  159. package/dist/{core → engine/block}/compose.d.ts +9 -7
  160. package/dist/{core → engine/block}/compose.js +1 -1
  161. package/dist/engine/block/dialog.d.ts +13 -0
  162. package/dist/engine/block/dialog.js +37 -0
  163. package/dist/{core/blocks → engine/block/kinds}/api.d.ts +16 -12
  164. package/dist/{core/blocks → engine/block/kinds}/api.js +26 -18
  165. package/dist/{core/blocks → engine/block/kinds}/effect.d.ts +13 -18
  166. package/dist/engine/block/kinds/effect.js +17 -0
  167. package/dist/{core/blocks → engine/block/kinds}/method.d.ts +17 -29
  168. package/dist/{core/blocks → engine/block/kinds}/method.js +6 -21
  169. package/dist/{core/blocks → engine/block/kinds}/nav.d.ts +21 -31
  170. package/dist/{core/blocks → engine/block/kinds}/nav.js +6 -12
  171. package/dist/{core/blocks → engine/block/kinds}/page.d.ts +14 -20
  172. package/dist/{core/blocks → engine/block/kinds}/page.js +5 -7
  173. package/dist/engine/checkpoint/checkpoint.d.ts +22 -0
  174. package/dist/engine/checkpoint/checkpoint.js +8 -0
  175. package/dist/engine/checkpoint/route.d.ts +28 -0
  176. package/dist/engine/checkpoint/route.js +28 -0
  177. package/dist/{core → engine}/config.d.ts +7 -2
  178. package/dist/engine/config.js +6 -0
  179. package/dist/engine/engine.d.ts +45 -0
  180. package/dist/{core → engine}/engine.js +6 -10
  181. package/dist/engine/env.d.ts +59 -0
  182. package/dist/engine/env.js +83 -0
  183. package/dist/{errors.d.ts → engine/errors.d.ts} +22 -22
  184. package/dist/{errors.js → engine/errors.js} +22 -22
  185. package/dist/{core → engine/flow}/branch-regression.d.ts +7 -7
  186. package/dist/{core → engine/flow}/branch-regression.js +4 -3
  187. package/dist/engine/flow/flow.d.ts +162 -0
  188. package/dist/engine/flow/flow.js +244 -0
  189. package/dist/engine/flow/map-branch.d.ts +9 -0
  190. package/dist/engine/flow/map-branch.js +57 -0
  191. package/dist/{core → engine/flow}/map-builder.d.ts +34 -54
  192. package/dist/engine/flow/map-builder.js +242 -0
  193. package/dist/engine/flow/map-steps.d.ts +30 -0
  194. package/dist/engine/flow/map-steps.js +87 -0
  195. package/dist/{core → engine}/locate.d.ts +1 -1
  196. package/dist/{core → engine}/locate.js +1 -2
  197. package/dist/{mem-stub.d.ts → engine/mem/mem-stub.d.ts} +9 -8
  198. package/dist/{mem-stub.js → engine/mem/mem-stub.js} +2 -2
  199. package/dist/{mem-page.d.ts → engine/mem/mem.d.ts} +1 -1
  200. package/dist/{mem-page.js → engine/mem/mem.js} +2 -1
  201. package/dist/engine/page-gone.d.ts +5 -0
  202. package/dist/engine/page-gone.js +20 -0
  203. package/dist/engine/run/connect.d.ts +28 -0
  204. package/dist/{types.js → engine/run/connect.js} +11 -10
  205. package/dist/engine/run/events.d.ts +67 -0
  206. package/dist/engine/run/events.js +90 -0
  207. package/dist/engine/run/hooks.d.ts +16 -0
  208. package/dist/engine/run/hooks.js +8 -0
  209. package/dist/engine/run/launch.d.ts +13 -0
  210. package/dist/engine/run/launch.js +27 -0
  211. package/dist/{core/run-graph.d.ts → engine/run/run.d.ts} +8 -12
  212. package/dist/{core/run-graph.js → engine/run/run.js} +22 -12
  213. package/dist/engine/stub/pace.d.ts +12 -0
  214. package/dist/engine/stub/pace.js +2 -0
  215. package/dist/engine/stub/ring.d.ts +130 -0
  216. package/dist/engine/stub/ring.js +41 -0
  217. package/dist/engine/stub/stub.d.ts +268 -0
  218. package/dist/engine/stub/stub.js +1 -0
  219. package/dist/engine/stub/todos.d.ts +104 -0
  220. package/dist/engine/stub/todos.js +2 -0
  221. package/dist/engine/stub/viewport.d.ts +26 -0
  222. package/dist/engine/stub/viewport.js +2 -0
  223. package/dist/{trait.d.ts → engine/trait/trait.d.ts} +1 -1
  224. package/dist/{trait.js → engine/trait/trait.js} +1 -1
  225. package/dist/index.d.ts +88 -36
  226. package/dist/index.js +46 -19
  227. package/dist/live/auto/auto.d.ts +22 -0
  228. package/dist/live/auto/auto.js +207 -0
  229. package/dist/{session/auto-explore.d.ts → live/auto/explore.d.ts} +4 -14
  230. package/dist/{session/auto-explore.js → live/auto/explore.js} +21 -127
  231. package/dist/live/auto/mem.d.ts +11 -0
  232. package/dist/live/auto/mem.js +85 -0
  233. package/dist/live/auto/menu.d.ts +30 -0
  234. package/dist/live/auto/menu.js +335 -0
  235. package/dist/live/auto-session/auto-session.d.ts +113 -0
  236. package/dist/live/auto-session/auto-session.js +452 -0
  237. package/dist/live/auto-session/console.d.ts +4 -0
  238. package/dist/live/auto-session/console.js +41 -0
  239. package/dist/live/auto-session/files.d.ts +44 -0
  240. package/dist/live/auto-session/files.js +145 -0
  241. package/dist/{auto-session → live/auto-session}/helpers.d.ts +9 -5
  242. package/dist/{auto-session → live/auto-session}/helpers.js +18 -1
  243. package/dist/live/auto-session/inspect.d.ts +4 -0
  244. package/dist/live/auto-session/inspect.js +75 -0
  245. package/dist/{session/auto-session-ipc.d.ts → live/auto-session/ipc.d.ts} +8 -25
  246. package/dist/{session/auto-session-ipc.js → live/auto-session/ipc.js} +36 -161
  247. package/dist/live/auto-session/open-browser.d.ts +6 -0
  248. package/dist/live/auto-session/open-browser.js +47 -0
  249. package/dist/{session/browser.d.ts → live/auto-session/start.d.ts} +1 -2
  250. package/dist/{session/browser.js → live/auto-session/start.js} +2 -3
  251. package/dist/{pilot-overlay → live/pilot}/panel.d.ts +1 -1
  252. package/dist/{pilot-overlay → live/pilot}/panel.js +23 -31
  253. package/dist/{session → live/pilot}/pilot.d.ts +3 -3
  254. package/dist/{session → live/pilot}/pilot.js +5 -4
  255. package/dist/{traverse/run.d.ts → live/traverse/traverse.d.ts} +1 -1
  256. package/dist/live/traverse/traverse.js +212 -0
  257. package/dist/live/traverse/worker.d.ts +37 -0
  258. package/dist/live/traverse/worker.js +200 -0
  259. package/dist/manifest/manifest.d.ts +52 -0
  260. package/dist/manifest/manifest.js +93 -0
  261. package/dist/manifest/map-imports.d.ts +7 -0
  262. package/dist/manifest/map-imports.js +22 -0
  263. package/dist/manifest/maps.d.ts +33 -0
  264. package/dist/manifest/maps.js +62 -0
  265. package/dist/manifest/pack.d.ts +21 -0
  266. package/dist/manifest/pack.js +109 -0
  267. package/dist/manifest/project.d.ts +60 -0
  268. package/dist/manifest/project.js +101 -0
  269. package/dist/{session/block-inject.js → manifest/roots.js} +1 -18
  270. package/dist/manifest/scan.d.ts +19 -0
  271. package/dist/manifest/scan.js +57 -0
  272. package/dist/manifest/source.d.ts +23 -0
  273. package/dist/manifest/source.js +86 -0
  274. package/dist/runner/mode.d.ts +71 -0
  275. package/dist/runner/mode.js +1 -0
  276. package/dist/runner/modes/branches.d.ts +5 -0
  277. package/dist/runner/modes/branches.js +37 -0
  278. package/dist/runner/modes/demo.d.ts +3 -0
  279. package/dist/runner/modes/demo.js +13 -0
  280. package/dist/runner/modes/report.d.ts +2 -0
  281. package/dist/runner/modes/report.js +54 -0
  282. package/dist/runner/modes/run.d.ts +2 -0
  283. package/dist/runner/modes/run.js +3 -0
  284. package/dist/runner/options.d.ts +31 -0
  285. package/dist/runner/options.js +42 -0
  286. package/dist/runner/plan/find.d.ts +18 -0
  287. package/dist/runner/plan/find.js +65 -0
  288. package/dist/runner/plan/plan.d.ts +11 -0
  289. package/dist/runner/plan/plan.js +97 -0
  290. package/dist/runner/plan/seed-mem.d.ts +12 -0
  291. package/dist/runner/plan/seed-mem.js +98 -0
  292. package/dist/runner/plan/spec.d.ts +5 -0
  293. package/dist/runner/plan/spec.js +17 -0
  294. package/dist/runner/play-steps.d.ts +2 -0
  295. package/dist/runner/play-steps.js +59 -0
  296. package/dist/runner/runner.d.ts +4 -0
  297. package/dist/runner/runner.js +64 -0
  298. package/dist/runner/session.d.ts +9 -0
  299. package/dist/runner/session.js +87 -0
  300. package/dist/{browser.js → runtime/browser.js} +4 -2
  301. package/dist/{env-file.js → runtime/env-file.js} +7 -12
  302. package/dist/{extensions.d.ts → runtime/extensions.d.ts} +1 -5
  303. package/dist/{extensions.js → runtime/extensions.js} +2 -1
  304. package/dist/runtime/full-launch.d.ts +1 -0
  305. package/dist/runtime/full-launch.js +34 -0
  306. package/dist/runtime/global-flag.d.ts +5 -0
  307. package/dist/runtime/global-flag.js +18 -0
  308. package/dist/{playwright-config.d.ts → runtime/playwright-config.d.ts} +1 -1
  309. package/dist/{playwright.config.js → runtime/playwright.config.js} +3 -2
  310. package/dist/runtime/run-log.d.ts +2 -0
  311. package/dist/runtime/run-log.js +17 -0
  312. package/dist/{video-dir.js → runtime/video-dir.js} +3 -2
  313. package/dist/{config.d.ts → runtime/waygraph-config.d.ts} +6 -9
  314. package/dist/{config.js → runtime/waygraph-config.js} +21 -51
  315. package/dist/{webserver.js → runtime/webserver.js} +5 -30
  316. package/examples/routed-demo/config/waygraph.config.ts +20 -0
  317. package/examples/routed-demo/package.json +1 -4
  318. package/examples/routed-demo/scripts/fixture-server.mjs +1 -1
  319. package/examples/routed-demo/src/flows/routed-demo-map.flow.ts +2 -4
  320. package/examples/routed-demo/src/flows/routed-demo.flow.ts +1 -2
  321. package/examples/routed-demo/src/map/(app_base)/dashboard/_methods/click-widget.block.ts +5 -4
  322. package/examples/routed-demo/src/map/(app_base)/dashboard/_nav.block.ts +3 -3
  323. package/examples/routed-demo/src/map/(app_base)/dashboard/_page.block.ts +3 -3
  324. package/examples/routed-demo/src/map/(external)/docs/_nav.block.ts +3 -3
  325. package/examples/routed-demo/src/map/(external)/docs/_page.block.ts +3 -3
  326. package/examples/routed-demo/src/states/routed-demo.states.ts +5 -3
  327. package/examples/routed-demo/tests/routed-demo.spec.ts +4 -4
  328. package/examples/routed-demo/tsconfig.json +1 -1
  329. package/examples/saucedemo/docs/CONVENTION.md +4 -5
  330. package/examples/saucedemo/docs/HELPERS.md +11 -11
  331. package/examples/saucedemo/src/blocks/SITE-MAP.md +0 -1
  332. package/examples/saucedemo/src/blocks/saucedemo-web/NAV.md +1 -5
  333. package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -3
  334. package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
  335. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
  336. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
  337. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
  338. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
  339. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +5 -8
  340. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -3
  341. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
  342. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +35 -43
  343. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
  344. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
  345. package/examples/saucedemo/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
  346. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
  347. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
  348. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
  349. package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -4
  350. package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -4
  351. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +4 -5
  352. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
  353. package/examples/saucedemo/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
  354. package/examples/saucedemo/src/flows/api-demo.flow.ts +12 -10
  355. package/examples/saucedemo/src/states/checkout.states.ts +21 -11
  356. package/examples/saucedemo/src/stubs/device-showcase.ts +8 -10
  357. package/examples/saucedemo/tests/auto-graph.spec.ts +4 -12
  358. package/package.json +14 -6
  359. package/templates/agents/waygraph-planner.agent.md +2 -2
  360. package/templates/quickstart/docs/CONVENTION.md +4 -4
  361. package/templates/quickstart/docs/HELPERS.md +10 -8
  362. package/templates/quickstart/package.json +0 -3
  363. package/templates/quickstart/src/blocks/SITE-MAP.md +0 -1
  364. package/templates/quickstart/src/blocks/saucedemo-web/NAV.md +1 -5
  365. package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -3
  366. package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
  367. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
  368. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
  369. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
  370. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
  371. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +5 -8
  372. package/templates/quickstart/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -3
  373. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
  374. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +35 -43
  375. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
  376. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
  377. package/templates/quickstart/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
  378. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
  379. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
  380. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
  381. package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -4
  382. package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -4
  383. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +4 -5
  384. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
  385. package/templates/quickstart/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
  386. package/templates/quickstart/src/flows/api-demo.flow.ts +12 -10
  387. package/templates/quickstart/src/states/checkout.states.ts +21 -11
  388. package/templates/quickstart/src/stubs/device-showcase.ts +8 -10
  389. package/templates/scaffold/README.md +2 -1
  390. package/templates/scaffold/STRUCTURE.md +5 -4
  391. package/templates/scaffold/config/waygraph.config.ts +1 -0
  392. package/templates/scaffold/gitignore +1 -0
  393. package/templates/scaffold/src/flows/README.md +2 -2
  394. package/templates/scaffold/src/map/(app_base)/docs/_nav.block.ts +3 -3
  395. package/templates/scaffold/src/map/(app_base)/docs/_page.block.ts +3 -3
  396. package/templates/scaffold/src/map/(app_base)/home/_methods/add-item.effect.block.ts +4 -4
  397. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-hello.method.block.ts +3 -3
  398. package/templates/scaffold/src/map/(app_base)/home/_methods/assert-item-added.method.block.ts +3 -3
  399. package/templates/scaffold/src/map/(app_base)/home/_methods/clear-cart.method.block.ts +5 -4
  400. package/templates/scaffold/src/map/(app_base)/home/_methods/remove-item.effect.block.ts +4 -4
  401. package/templates/scaffold/src/map/(app_base)/home/_nav.block.ts +3 -3
  402. package/templates/scaffold/src/map/(app_base)/home/_page.block.ts +3 -3
  403. package/templates/scaffold/src/map/(app_base)/home/nav-verification-link.block.ts +4 -4
  404. package/templates/scaffold/src/map/(external)/hoppscotch/_keys.ts +21 -0
  405. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-body.method.block.ts +4 -4
  406. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-header.method.block.ts +4 -4
  407. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-status.method.block.ts +4 -4
  408. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/pick-extension-interceptor.method.block.ts +5 -4
  409. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-body.method.block.ts +6 -5
  410. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-headers.method.block.ts +6 -5
  411. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/send-request.method.block.ts +5 -4
  412. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-bearer-token.method.block.ts +6 -5
  413. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-headers.method.block.ts +6 -5
  414. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-json-body.method.block.ts +6 -5
  415. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-method.method.block.ts +6 -5
  416. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-query-params.method.block.ts +6 -5
  417. package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-url.method.block.ts +6 -5
  418. package/templates/scaffold/src/map/(external)/hoppscotch/_nav.block.ts +3 -3
  419. package/templates/scaffold/src/map/(external)/hoppscotch/_page.block.ts +3 -3
  420. package/templates/scaffold/src/map/(external)/hoppscotch/_states.ts +6 -0
  421. package/templates/scaffold/src/map/(external)/hoppscotch/settings/_nav.block.ts +3 -3
  422. package/templates/scaffold/src/map/(external)/mailpit/_keys.ts +13 -0
  423. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-content.method.block.ts +4 -4
  424. package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-received.method.block.ts +4 -4
  425. package/templates/scaffold/src/map/(external)/mailpit/_methods/extract-email-link.method.block.ts +6 -5
  426. package/templates/scaffold/src/map/(external)/mailpit/_methods/open-message.method.block.ts +6 -5
  427. package/templates/scaffold/src/map/(external)/mailpit/_nav.block.ts +3 -3
  428. package/templates/scaffold/src/map/(external)/mailpit/_page.block.ts +3 -3
  429. package/templates/scaffold/src/map/(external)/mailpit/_states.ts +9 -0
  430. package/templates/scaffold/src/map/README.md +7 -0
  431. package/templates/scaffold/src/states/README.md +4 -1
  432. package/templates/scaffold/src/states/demo.mem-keys.ts +1 -29
  433. package/templates/scaffold/src/states/demo.states.ts +14 -20
  434. package/templates/scaffold/tests/hoppscotch.spec.ts +1 -11
  435. package/templates/scaffold/tests/mail-verify.spec.ts +2 -2
  436. package/templates/skills/waygraph-blind-pilot.skill.md +2 -6
  437. package/templates/skills/waygraph-convention.skill.md +23 -14
  438. package/templates/skills/waygraph-pilot.skill.md +7 -4
  439. package/dist/auto-session/session.d.ts +0 -193
  440. package/dist/auto-session/session.js +0 -719
  441. package/dist/auto-session/verbose-log.js +0 -16
  442. package/dist/auto-session.d.ts +0 -2
  443. package/dist/auto-session.js +0 -3
  444. package/dist/cli/discover.d.ts +0 -40
  445. package/dist/cli/discover.js +0 -148
  446. package/dist/commands/agent-dive.js +0 -52
  447. package/dist/commands/check.js +0 -192
  448. package/dist/commands/map.js +0 -29
  449. package/dist/commands/run.js +0 -104
  450. package/dist/commands/session.js +0 -600
  451. package/dist/commands/traverse.js +0 -177
  452. package/dist/core/block.d.ts +0 -109
  453. package/dist/core/blocks/effect.js +0 -23
  454. package/dist/core/config.js +0 -17
  455. package/dist/core/engine.d.ts +0 -198
  456. package/dist/core/flow.d.ts +0 -294
  457. package/dist/core/flow.js +0 -432
  458. package/dist/core/map-builder.js +0 -383
  459. package/dist/core.d.ts +0 -14
  460. package/dist/core.js +0 -15
  461. package/dist/highlights/merge.d.ts +0 -8
  462. package/dist/highlights/merge.js +0 -173
  463. package/dist/highlights/run-phase.d.ts +0 -43
  464. package/dist/highlights/stub-ctx.d.ts +0 -10
  465. package/dist/highlights/stub-ctx.js +0 -331
  466. package/dist/highlights/types.d.ts +0 -613
  467. package/dist/highlights.d.ts +0 -9
  468. package/dist/highlights.js +0 -10
  469. package/dist/pilot-overlay.d.ts +0 -5
  470. package/dist/pilot-overlay.js +0 -6
  471. package/dist/runner/banner-log.js +0 -63
  472. package/dist/runner/chain-run.js +0 -102
  473. package/dist/runner/cursor.js +0 -140
  474. package/dist/runner/demo-log.js +0 -316
  475. package/dist/runner/device-stage.d.ts +0 -9
  476. package/dist/runner/device-stage.js +0 -420
  477. package/dist/runner/discovery.js +0 -105
  478. package/dist/runner/index.js +0 -2
  479. package/dist/runner/inpage/banner.d.ts +0 -21
  480. package/dist/runner/inpage/banner.js +0 -156
  481. package/dist/runner/inpage/caption.d.ts +0 -3
  482. package/dist/runner/inpage/caption.js +0 -23
  483. package/dist/runner/inpage/core.d.ts +0 -4
  484. package/dist/runner/inpage/core.js +0 -316
  485. package/dist/runner/inpage/device.d.ts +0 -3
  486. package/dist/runner/inpage/device.js +0 -211
  487. package/dist/runner/inpage/network.d.ts +0 -15
  488. package/dist/runner/inpage/network.js +0 -217
  489. package/dist/runner/inpage/panel-chrome.js +0 -192
  490. package/dist/runner/inpage/stamp.js +0 -46
  491. package/dist/runner/inpage/swipe-zoom.js +0 -220
  492. package/dist/runner/inpage/todos.js +0 -337
  493. package/dist/runner/interaction-patch.js +0 -384
  494. package/dist/runner/main.js +0 -469
  495. package/dist/runner/network-capture.d.ts +0 -9
  496. package/dist/runner/network-capture.js +0 -126
  497. package/dist/runner/overlay-css.d.ts +0 -3
  498. package/dist/runner/overlay-css.js +0 -377
  499. package/dist/runner/overlay-install.js +0 -90
  500. package/dist/runner/overlay-stage.js +0 -110
  501. package/dist/runner/rings.js +0 -514
  502. package/dist/runner/seed-mem.js +0 -110
  503. package/dist/runner/slides.js +0 -278
  504. package/dist/runner/step-mode.js +0 -703
  505. package/dist/runner/step-panels.js +0 -729
  506. package/dist/runner/teardown.js +0 -202
  507. package/dist/runner/todo-dock.js +0 -142
  508. package/dist/session/auto-explore-run.d.ts +0 -40
  509. package/dist/session/auto-explore-run.js +0 -707
  510. package/dist/session/step-overlay.d.ts +0 -37
  511. package/dist/session/step-overlay.js +0 -244
  512. package/dist/traverse/run.js +0 -423
  513. package/examples/routed-demo/playwright.config.ts +0 -21
  514. package/examples/saucedemo/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
  515. package/templates/quickstart/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
  516. /package/dist/{commands → cli/commands}/agent-dive-scaffold.d.ts +0 -0
  517. /package/dist/{commands → cli/commands}/agent-dive.d.ts +0 -0
  518. /package/dist/{commands → cli/commands}/extensions.d.ts +0 -0
  519. /package/dist/{commands → cli/commands}/init.d.ts +0 -0
  520. /package/dist/{commands → cli/commands}/list.d.ts +0 -0
  521. /package/dist/{commands → cli/commands}/map.d.ts +0 -0
  522. /package/dist/{commands → cli/commands}/session.d.ts +0 -0
  523. /package/dist/{commands → cli/commands}/test.d.ts +0 -0
  524. /package/dist/{commands → cli/commands}/traverse.d.ts +0 -0
  525. /package/dist/{commands → cli/commands}/try.d.ts +0 -0
  526. /package/dist/{commands → cli/commands}/upgrade.d.ts +0 -0
  527. /package/dist/{highlights → demo/narration}/shorthand.js +0 -0
  528. /package/dist/{session/overlay-beacon.d.ts → demo/overlay/beacon.d.ts} +0 -0
  529. /package/dist/{session/overlay-beacon.js → demo/overlay/beacon.js} +0 -0
  530. /package/dist/{pilot-overlay/action-ring.d.ts → demo/overlay/pilot/actions.d.ts} +0 -0
  531. /package/dist/{ui → demo/overlay/ui}/components/ring.d.ts +0 -0
  532. /package/dist/{ui → demo/overlay/ui}/stylesheet.d.ts +0 -0
  533. /package/dist/{ui → demo/overlay/ui}/stylesheet.js +0 -0
  534. /package/dist/{ui → demo/overlay/ui}/tokens.d.ts +0 -0
  535. /package/dist/{ui → demo/overlay/ui}/tokens.js +0 -0
  536. /package/dist/{highlights → demo}/types.js +0 -0
  537. /package/dist/{auto-session → demo}/verbose-log.d.ts +0 -0
  538. /package/dist/{selector.d.ts → engine/trait/selector.d.ts} +0 -0
  539. /package/dist/{selector.js → engine/trait/selector.js} +0 -0
  540. /package/dist/{traverse → live/traverse}/coverage.d.ts +0 -0
  541. /package/dist/{traverse → live/traverse}/coverage.js +0 -0
  542. /package/dist/{traverse → live/traverse}/lease.d.ts +0 -0
  543. /package/dist/{traverse → live/traverse}/lease.js +0 -0
  544. /package/dist/{session/block-inject.d.ts → manifest/roots.d.ts} +0 -0
  545. /package/dist/{blocks-select.d.ts → manifest/select.d.ts} +0 -0
  546. /package/dist/{blocks-select.js → manifest/select.js} +0 -0
  547. /package/dist/{browser.d.ts → runtime/browser.d.ts} +0 -0
  548. /package/dist/{env-file.d.ts → runtime/env-file.d.ts} +0 -0
  549. /package/dist/{playwright-config.js → runtime/playwright-config.js} +0 -0
  550. /package/dist/{playwright.config.d.ts → runtime/playwright.config.d.ts} +0 -0
  551. /package/dist/{video-dir.d.ts → runtime/video-dir.d.ts} +0 -0
  552. /package/dist/{webserver.d.ts → runtime/webserver.d.ts} +0 -0
@@ -0,0 +1,452 @@
1
+ import { collectKnownInteractionSelectors, unmappedInteractionsPageScript } from "../../analysis/coverage-gap.js";
2
+ import { findBlockPathDetailed } from "../../analysis/graph.js";
3
+ import { runStubPhase } from "../../demo/narration/narration.js";
4
+ import { describeOverlayFixtures, phaseToOverlayFixtures } from "../../demo/overlay/phase-fixtures.js";
5
+ import { showPilotFixtures } from "../../demo/overlay/pilot/fixtures.js";
6
+ import { showPilotActivity, showPilotVision } from "../../demo/overlay/pilot/shell.js";
7
+ import { keepOverlayOnNavigation } from "../../demo/overlay/reattach.js";
8
+ import { verboseLog } from "../../demo/verbose-log.js";
9
+ import { Engine } from "../../engine/engine.js";
10
+ import { MemPage } from "../../engine/mem/mem.js";
11
+ import { ignorePageGone } from "../../engine/page-gone.js";
12
+ import { resolveBaseUrl } from "../../runtime/waygraph-config.js";
13
+ import { detectHere, ensureLivePage, runOneBlock } from "../auto/auto.js";
14
+ import { buildExploreContext, buildExploreMenu } from "../auto/explore.js";
15
+ import { ensureMem, seedDefaultMem } from "../auto/mem.js";
16
+ import { updatePilotOverlay } from "../pilot/panel.js";
17
+ import { recordPageConsole } from "./console.js";
18
+ import { CONSOLE_LOG_MAX_ENTRIES, TRACE_MAX_STEPS, buildSessionSnapshot, describeHighlight, parsePick, stubFilePath, stubPhaseHasContent } from "./helpers.js";
19
+ import { inspectDom, inspectStorage } from "./inspect.js";
20
+ import { openSessionBrowser } from "./open-browser.js";
21
+ /** The first element `selector` matches, ringed with the pilot's vision ring; or why there is none. */
22
+ async function rawTarget(page, selector, label) {
23
+ const locator = page.locator(selector).first();
24
+ if ((await locator.count()) === 0)
25
+ return `no element matches selector "${selector}"`;
26
+ await showPilotVision(page, selector, label);
27
+ return locator;
28
+ }
29
+ /**
30
+ * A live session driven over IPC (`browser start`, `pilot start`): the same graph, library, mem and browser as
31
+ * `waygraph auto`, moved one call at a time (`applyPick`, `applyPath`, the raw actions) instead of a menu loop.
32
+ */
33
+ export class AutoSession {
34
+ projectDir;
35
+ inject;
36
+ blocksSelect;
37
+ graph;
38
+ library;
39
+ mem;
40
+ engine;
41
+ closeBrowser;
42
+ context;
43
+ page;
44
+ startUrl;
45
+ sessionId;
46
+ here = null;
47
+ lastRunNote = null;
48
+ trace = [];
49
+ consoleLog = [];
50
+ knownInteractionSelectors;
51
+ headless;
52
+ lastOverlayInfo = null;
53
+ constructor(projectDir, inject, blocksSelect, graph, library, mem, engine, closeBrowser, context, page, startUrl, sessionId, knownInteractionSelectors, headless) {
54
+ this.projectDir = projectDir;
55
+ this.inject = inject;
56
+ this.blocksSelect = blocksSelect;
57
+ this.graph = graph;
58
+ this.library = library;
59
+ this.mem = mem;
60
+ this.engine = engine;
61
+ this.closeBrowser = closeBrowser;
62
+ this.context = context;
63
+ this.page = page;
64
+ this.startUrl = startUrl;
65
+ this.sessionId = sessionId;
66
+ this.knownInteractionSelectors = knownInteractionSelectors;
67
+ this.headless = headless;
68
+ }
69
+ static async start(init) {
70
+ const baseURL = init.baseURL ?? (await resolveBaseUrl(init.projectDir));
71
+ const skipNav = init.skipInitialNavigation === true;
72
+ const startUrl = skipNav ? undefined : (init.startUrl ?? baseURL);
73
+ const exploreOpts = {
74
+ ...(init.blocksSelect ? { blocksSelect: init.blocksSelect } : {}),
75
+ ...(init.inject?.length ? { inject: init.inject } : {}),
76
+ };
77
+ const { graph, library } = await buildExploreContext(init.projectDir, Object.keys(exploreOpts).length ? exploreOpts : undefined);
78
+ const mem = new MemPage();
79
+ seedDefaultMem(library.byName, mem);
80
+ const headless = init.headless ?? true;
81
+ const engine = new Engine({ headless });
82
+ const { closeBrowser, context, page } = await openSessionBrowser(init.projectDir, headless, baseURL, startUrl);
83
+ const knownInteractionSelectors = collectKnownInteractionSelectors(init.projectDir, library, init.inject);
84
+ const session = new AutoSession(init.projectDir, init.inject, init.blocksSelect, graph, library, mem, engine, closeBrowser, context, page, startUrl, init.sessionId, knownInteractionSelectors, headless);
85
+ keepOverlayOnNavigation(page, () => session.repaintOverlayAfterNavigation());
86
+ if (!headless) {
87
+ await session.bootstrapOverlay().catch(ignorePageGone);
88
+ await page.bringToFront().catch(ignorePageGone);
89
+ }
90
+ recordPageConsole(page, (entry) => session.pushConsoleLog(entry));
91
+ return session;
92
+ }
93
+ /** Pure getter - returns a copy, not the live array. */
94
+ getTrace() {
95
+ return [...this.trace];
96
+ }
97
+ pushTrace(step) {
98
+ this.trace.push(step);
99
+ if (this.trace.length > TRACE_MAX_STEPS)
100
+ this.trace.shift();
101
+ }
102
+ /** Pure getter - returns a copy, not the live array. */
103
+ getConsoleLog() {
104
+ return [...this.consoleLog];
105
+ }
106
+ pushConsoleLog(entry) {
107
+ this.consoleLog.push(entry);
108
+ if (this.consoleLog.length > CONSOLE_LOG_MAX_ENTRIES)
109
+ this.consoleLog.shift();
110
+ }
111
+ async currentMenu() {
112
+ this.page = await ensureLivePage(this.context, this.page, this.startUrl);
113
+ if (this.here === null) {
114
+ this.here = await detectHere(this.page, this.library.navBlocks);
115
+ }
116
+ const menu = await buildExploreMenu(this.page, this.graph, this.library, this.here);
117
+ // Every read and every action goes through currentMenu(), so the overlay is refreshed here, awaited: someone
118
+ // watching sees the state an API caller just got back, not a frame behind.
119
+ this.lastOverlayInfo = {
120
+ sessionId: this.sessionId,
121
+ snapshot: buildSessionSnapshot(menu, this.library.byName, this.here, this.lastRunNote),
122
+ graph: this.graph,
123
+ };
124
+ await updatePilotOverlay(this.page, this.lastOverlayInfo);
125
+ await this.warnUnmappedInteractions();
126
+ return menu;
127
+ }
128
+ /** Paint the overlay on about:blank / immediately after session start (headful browser). */
129
+ async bootstrapOverlay() {
130
+ await this.currentMenu();
131
+ }
132
+ /** Re-apply cached overlay state after navigation (init script restores shell only). */
133
+ async repaintOverlayAfterNavigation() {
134
+ if (this.lastOverlayInfo) {
135
+ await updatePilotOverlay(this.page, this.lastOverlayInfo).catch(ignorePageGone);
136
+ return;
137
+ }
138
+ if (!this.headless) {
139
+ await this.bootstrapOverlay().catch(ignorePageGone);
140
+ }
141
+ }
142
+ /**
143
+ * Flags same-origin `<a href>` paths and visible buttons with no NavBlock
144
+ * URL / Block selector in the loaded library — read via `auto console`.
145
+ * Deduped per page load so repeated status/send calls stay quiet.
146
+ */
147
+ async warnUnmappedInteractions() {
148
+ const knownPathnames = [];
149
+ for (const entry of this.library.navBlocks) {
150
+ const url = entry.block.__waygraphNavUrl;
151
+ if (!url)
152
+ continue;
153
+ try {
154
+ knownPathnames.push(new URL(url, this.page.url()).pathname);
155
+ }
156
+ catch {
157
+ /* not a resolvable URL (relative to an unset base, etc.) - skip */
158
+ }
159
+ }
160
+ const payload = {
161
+ knownPathnames,
162
+ knownSelectors: this.knownInteractionSelectors,
163
+ };
164
+ await this.page.evaluate(unmappedInteractionsPageScript, payload).catch(ignorePageGone);
165
+ }
166
+ /** Pure getter - no Block runs, no mem/page mutation. */
167
+ async currentSnapshot() {
168
+ const menu = await this.currentMenu();
169
+ return buildSessionSnapshot(menu, this.library.byName, this.here, this.lastRunNote);
170
+ }
171
+ /**
172
+ * Pure getter - reads the live page's structure at the requested fidelity.
173
+ * No Block runs, no mem/page mutation. `selector` scopes either mode to one
174
+ * element's subtree; it is a modifier, not a third mode.
175
+ */
176
+ async inspectDom(opts) {
177
+ this.page = await ensureLivePage(this.context, this.page, this.startUrl);
178
+ return inspectDom(this.page, opts);
179
+ }
180
+ /** Reads the live page's client state: storage, cookies, service workers (where web-push state lives). */
181
+ async inspectStorage() {
182
+ this.page = await ensureLivePage(this.context, this.page, this.startUrl);
183
+ return inspectStorage(this.page, this.context);
184
+ }
185
+ /** Paint + log a Block's authored waygraph overlay fixtures (same as demo does), best-effort. */
186
+ async paintStubPhase(tag, phase, holdMs) {
187
+ if (!this.page || !stubPhaseHasContent(phase))
188
+ return;
189
+ const fixtures = phaseToOverlayFixtures(phase, holdMs);
190
+ for (const line of describeOverlayFixtures(tag, fixtures))
191
+ verboseLog("pilot", line);
192
+ await showPilotFixtures(this.page, fixtures).catch(ignorePageGone);
193
+ }
194
+ /**
195
+ * Runs one Block for real: the core of `applyPick` (picked from the live menu) and `applyPath` (named by the route).
196
+ * `expectedTo` is used when the Block's resolve doesn't set `__state`.
197
+ */
198
+ async runNamedBlock(entry, expectedTo, instanceOption) {
199
+ const from = this.here;
200
+ const stubBeforeResult = await runStubPhase(entry.block, "stubBefore");
201
+ await this.paintStubPhase("stub.before", stubBeforeResult, 6000);
202
+ const stepBase = {
203
+ block: entry.block.name,
204
+ from,
205
+ timestamp: new Date().toISOString(),
206
+ ...(stubPhaseHasContent(stubBeforeResult) ? { stubBefore: stubBeforeResult } : {}),
207
+ };
208
+ try {
209
+ if (instanceOption) {
210
+ this.mem.set(instanceOption.key, instanceOption.value);
211
+ }
212
+ // Always the non-interactive path (cli: false) - a detached session has
213
+ // no TTY to prompt on; a missing mem key fails loud instead of hanging.
214
+ await ensureMem(entry, this.mem, false);
215
+ const result = await runOneBlock(this.engine, entry, this.context, this.page, this.mem, false);
216
+ this.here = result.__state ?? expectedTo;
217
+ this.lastRunNote = `${entry.block.name} -> ${this.here}`;
218
+ const stubAfterResult = await runStubPhase(entry.block, "stubAfter", { out: result });
219
+ await this.paintStubPhase("stub.after", stubAfterResult, 6000);
220
+ this.pushTrace({
221
+ ...stepBase,
222
+ to: this.here,
223
+ ...(stubPhaseHasContent(stubAfterResult) ? { stubAfter: stubAfterResult } : {}),
224
+ });
225
+ }
226
+ catch (err) {
227
+ this.lastRunNote = `${entry.block.name} failed`;
228
+ const message = err instanceof Error ? err.message : String(err);
229
+ const stubOnErrorResult = await runStubPhase(entry.block, "stubOnError", { error: err });
230
+ await this.paintStubPhase("stub.error", stubOnErrorResult, 8000);
231
+ this.pushTrace({
232
+ ...stepBase,
233
+ error: message,
234
+ ...(stubPhaseHasContent(stubOnErrorResult) ? { stubOnError: stubOnErrorResult } : {}),
235
+ });
236
+ return { ok: false, error: `${entry.block.name} failed - ${message}` };
237
+ }
238
+ const nextMenu = await this.currentMenu();
239
+ return {
240
+ ok: true,
241
+ snapshot: buildSessionSnapshot(nextMenu, this.library.byName, this.here, this.lastRunNote),
242
+ quit: false,
243
+ };
244
+ }
245
+ /** Applies exactly one pick: runs at most one Block, returns the resulting state. */
246
+ async applyPick(raw) {
247
+ const menu = await this.currentMenu();
248
+ const pick = parsePick(raw, menu);
249
+ if (pick.type === "invalid")
250
+ return { ok: false, error: pick.reason };
251
+ if (pick.type === "quit") {
252
+ return {
253
+ ok: true,
254
+ snapshot: buildSessionSnapshot(menu, this.library.byName, this.here, this.lastRunNote),
255
+ quit: true,
256
+ };
257
+ }
258
+ const edge = menu.flat[pick.index];
259
+ const entry = this.library.byName.get(edge.block);
260
+ if (!entry) {
261
+ return { ok: false, error: `Block "${edge.block}" not loaded - skipped` };
262
+ }
263
+ await showPilotActivity(this.page, `Running (Block): ${edge.block}`);
264
+ return this.runNamedBlock(entry, edge.to, edge.instanceOption);
265
+ }
266
+ /**
267
+ * Re-reads the project's Blocks and graph from disk (the same call `start()` makes) and swaps them in, keeping the
268
+ * page, mem, browser and `here`: a Block written mid-session becomes pickable without a restart.
269
+ */
270
+ async reloadLibrary() {
271
+ if (this.page)
272
+ await showPilotActivity(this.page, "Running: reload");
273
+ const exploreOpts = {
274
+ ...(this.blocksSelect ? { blocksSelect: this.blocksSelect } : {}),
275
+ ...(this.inject?.length ? { inject: this.inject } : {}),
276
+ };
277
+ const { graph, library } = await buildExploreContext(this.projectDir, Object.keys(exploreOpts).length ? exploreOpts : undefined);
278
+ this.graph = graph;
279
+ this.library = library;
280
+ if (this.page)
281
+ await showPilotActivity(this.page, "Map updated");
282
+ }
283
+ /**
284
+ * Re-detects `here` from the live page, whatever is cached. `here` only changes when this session acts; a person
285
+ * clicking in a visible session moves the page without it, and later `send` / `reach` calls would use a stale menu.
286
+ */
287
+ async resync() {
288
+ this.page = await ensureLivePage(this.context, this.page, this.startUrl);
289
+ await showPilotActivity(this.page, "Running: resync");
290
+ this.here = await detectHere(this.page, this.library.navBlocks);
291
+ const menu = await this.currentMenu();
292
+ this.lastRunNote = `resync -> ${this.here ?? "Unknown"}`;
293
+ return {
294
+ ok: true,
295
+ snapshot: buildSessionSnapshot(menu, this.library.byName, this.here, this.lastRunNote),
296
+ quit: false,
297
+ };
298
+ }
299
+ /**
300
+ * Raw actions for a page no Block covers yet (Blind Pilot). The Checkpoint they land on isn't known ahead, so each
301
+ * one forgets `here` and the next menu re-detects it. A selector that matches nothing is a reported failure.
302
+ */
303
+ async rawClick(selector) {
304
+ return this.rawStep(`click "${selector}"`, async (page) => {
305
+ const target = await rawTarget(page, selector, `click: ${selector}`);
306
+ if (typeof target === "string")
307
+ return target;
308
+ await target.click();
309
+ });
310
+ }
311
+ async rawType(selector, text) {
312
+ return this.rawStep(`type into "${selector}"`, async (page) => {
313
+ const target = await rawTarget(page, selector, `type: ${selector}`);
314
+ if (typeof target === "string")
315
+ return target;
316
+ await target.fill(text);
317
+ });
318
+ }
319
+ /** Presses a key on an element (`Enter`, `Escape`, ...): inline-edit inputs often commit on Enter, with no Save button. */
320
+ async rawPress(selector, key) {
321
+ return this.rawStep(`press "${key}" on "${selector}"`, async (page) => {
322
+ const target = await rawTarget(page, selector, `press ${key}: ${selector}`);
323
+ if (typeof target === "string")
324
+ return target;
325
+ await target.press(key);
326
+ });
327
+ }
328
+ async rawGoto(url) {
329
+ return this.rawStep(`goto "${url}"`, async (page) => {
330
+ try {
331
+ await page.goto(url, { waitUntil: "domcontentloaded" });
332
+ }
333
+ catch (err) {
334
+ return `goto "${url}" failed - ${err instanceof Error ? err.message : String(err)}`;
335
+ }
336
+ });
337
+ }
338
+ /** Fills an `<input type="file">` with a built-in stub file ("image", "pdf", "video") or a `filePath` of your own. */
339
+ async rawUpload(selector, stub) {
340
+ const filePath = typeof stub === "string" ? stubFilePath(stub) : stub.filePath;
341
+ const label = typeof stub === "string" ? stub : filePath;
342
+ return this.rawStep(`upload ${label} into "${selector}"`, async (page) => {
343
+ const target = await rawTarget(page, selector, `upload ${label}: ${selector}`);
344
+ if (typeof target === "string")
345
+ return target;
346
+ try {
347
+ await target.setInputFiles(filePath);
348
+ }
349
+ catch (err) {
350
+ return `upload into "${selector}" failed - ${err instanceof Error ? err.message : String(err)}`;
351
+ }
352
+ });
353
+ }
354
+ /** One raw primitive (no Block): announce it, run it, then forget `here` so the next menu re-detects it. */
355
+ async rawStep(what, run) {
356
+ this.page = await ensureLivePage(this.context, this.page, this.startUrl);
357
+ await showPilotActivity(this.page, `Running (no Block): ${what}`);
358
+ const failed = await run(this.page);
359
+ if (failed !== undefined)
360
+ return { ok: false, error: failed };
361
+ this.here = null;
362
+ const menu = await this.currentMenu();
363
+ this.lastRunNote = `${what} -> ${this.here ?? "Unknown"}`;
364
+ return {
365
+ ok: true,
366
+ snapshot: buildSessionSnapshot(menu, this.library.byName, this.here, this.lastRunNote),
367
+ quit: false,
368
+ };
369
+ }
370
+ /**
371
+ * Agent-sent highlight fixtures (rings + optional todos) on the live page -
372
+ * the Pilot equivalent of Block `stubBefore` narration in `waygraph demo`.
373
+ * Does not run a Block; paint-only. Missing selectors are reported, not fatal.
374
+ */
375
+ async applyHighlight(fixtures) {
376
+ this.page = await ensureLivePage(this.context, this.page, this.startUrl);
377
+ const detail = describeHighlight(fixtures);
378
+ // Same bottom-left activity toast as Running (Dom)/(Block) - agent narration.
379
+ await showPilotActivity(this.page, `Highlighting: ${detail}`);
380
+ try {
381
+ for (const line of describeOverlayFixtures("highlight", fixtures))
382
+ verboseLog("pilot", line);
383
+ const { painted, missing } = await showPilotFixtures(this.page, fixtures);
384
+ const menu = await this.currentMenu();
385
+ this.lastRunNote = fixtures.clear
386
+ ? "highlight cleared"
387
+ : `highlight painted ${painted}` +
388
+ (missing.length ? ` (missing: ${missing.join(", ")})` : "");
389
+ return {
390
+ ok: true,
391
+ painted,
392
+ missing,
393
+ snapshot: buildSessionSnapshot(menu, this.library.byName, this.here, this.lastRunNote),
394
+ };
395
+ }
396
+ catch (err) {
397
+ return {
398
+ ok: false,
399
+ error: `highlight failed - ${err instanceof Error ? err.message : String(err)}`,
400
+ };
401
+ }
402
+ }
403
+ /**
404
+ * Runs a whole route to `targetCheckpoint` in one call, instead of one `applyPick` per step. The path is computed
405
+ * once with `findBlockPathDetailed` (the BFS `auto --blocks <From> <To>` uses) and each hop's Block runs directly on
406
+ * the session's live page and mem, trusting the graph rather than live-menu visibility. Per-step choosing was tried
407
+ * and fails: a `from: "*"` edge looks reachable from anywhere to a static BFS. A step whose precondition isn't met
408
+ * fails loud, naming it; so does a step that runs but lands somewhere other than its edge promised.
409
+ */
410
+ async applyPath(targetCheckpoint) {
411
+ await this.currentMenu();
412
+ const from = this.here;
413
+ if (from === null) {
414
+ return { ok: false, error: "cannot path-find: the session's current Checkpoint is unknown (here is null)" };
415
+ }
416
+ const path = findBlockPathDetailed(this.graph, from, targetCheckpoint);
417
+ if (!path) {
418
+ return { ok: false, error: `no Block path from "${from}" to "${targetCheckpoint}" in the discovered graph` };
419
+ }
420
+ for (const step of path) {
421
+ const entry = this.library.byName.get(step.block);
422
+ if (!entry) {
423
+ return { ok: false, error: `path step "${step.block}" is in the discovered graph but not loaded in this session's library` };
424
+ }
425
+ if (entry.block.instanceOptions) {
426
+ return {
427
+ ok: false,
428
+ error: `path step "${step.block}" needs a specific live option chosen (an instanceOptions Block, e.g. one per product) - ambiguous for automatic routing, use applyPick directly with the specific index`,
429
+ };
430
+ }
431
+ if (this.page)
432
+ await showPilotActivity(this.page, `Running (Block): ${step.block} (reach -> ${targetCheckpoint})`);
433
+ const result = await this.runNamedBlock(entry, step.to);
434
+ if (!result.ok) {
435
+ return { ok: false, error: `step "${step.block}" failed - ${result.error}` };
436
+ }
437
+ // A Block can land somewhere else without throwing (submit-login stays on LoginPage on bad auth): compare with
438
+ // what this hop's own edge promised (`step.to`; one name can have several edges).
439
+ if (this.here !== step.to) {
440
+ return {
441
+ ok: false,
442
+ error: `step "${step.block}" ran but landed on "${this.here}", not the expected "${step.to}" - it did not throw, but did not make the expected progress either`,
443
+ };
444
+ }
445
+ }
446
+ return { ok: true, path: path.map((s) => s.block), snapshot: await this.currentSnapshot() };
447
+ }
448
+ async close() {
449
+ await this.context.close();
450
+ await this.closeBrowser();
451
+ }
452
+ }
@@ -0,0 +1,4 @@
1
+ import type { Page } from "@playwright/test";
2
+ import type { ConsoleLogEntry } from "./helpers.js";
3
+ /** Records what the page logs into `push` for `auto console`. */
4
+ export declare function recordPageConsole(page: Page, push: (entry: ConsoleLogEntry) => void): void;
@@ -0,0 +1,41 @@
1
+ /** Records what the page logs into `push` for `auto console`. */
2
+ export function recordPageConsole(page, push) {
3
+ // Attached once, on the page created here - `ensureLivePage` only swaps
4
+ // to a fresh Page if the current one closed (a rare case, e.g. the human
5
+ // closing the tab), not on ordinary same-page SPA navigation, which is
6
+ // all this target (and most real sites) actually do.
7
+ page.on("console", (msg) => {
8
+ push({
9
+ type: "console",
10
+ level: msg.type(),
11
+ text: msg.text(),
12
+ timestamp: new Date().toISOString(),
13
+ });
14
+ });
15
+ page.on("pageerror", (err) => {
16
+ push({
17
+ type: "pageerror",
18
+ text: err instanceof Error ? err.message : String(err),
19
+ timestamp: new Date().toISOString(),
20
+ });
21
+ });
22
+ page.on("response", (res) => {
23
+ // Every failed response (the original case), PLUS every mutation
24
+ // (non-GET) response regardless of status - a real gap found live:
25
+ // "auto console" only logging failures made a SUCCESSFUL POST that
26
+ // simply didn't navigate anywhere look identical to "nothing
27
+ // happened at all," undiagnosable the same way a real failure was.
28
+ // A mutation's outcome (2xx or not) is always diagnostically
29
+ // relevant; a GET's usually isn't (assets, trackers) unless it failed.
30
+ const method = res.request().method();
31
+ if (res.status() < 400 && method === "GET")
32
+ return;
33
+ push({
34
+ type: "response",
35
+ text: `${method} ${res.statusText()}`,
36
+ url: res.url(),
37
+ status: res.status(),
38
+ timestamp: new Date().toISOString(),
39
+ });
40
+ });
41
+ }
@@ -0,0 +1,44 @@
1
+ export interface SessionMeta {
2
+ sessionId: string;
3
+ socketPath: string;
4
+ pid: number;
5
+ projectDir: string;
6
+ startedAt: string;
7
+ headless: boolean;
8
+ }
9
+ export declare function sessionDir(projectDir: string): string;
10
+ export declare function metaPath(projectDir: string, sessionId: string): string;
11
+ /** Global index so session control works even when cwd ≠ the project that spawned the session. */
12
+ export declare function globalMetaPath(sessionId: string): string;
13
+ export declare function isPidAlive(pid: number): boolean;
14
+ /**
15
+ * Deliberately NOT under the project directory (unlike meta/log files) -
16
+ * a real bug found while proving out openspec/changes/waygraph-map's own
17
+ * "waypack" loading claim: a project loaded through a consumer's own deeply
18
+ * nested `node_modules/<pkg>` path can push the socket's absolute path past
19
+ * the OS's AF_UNIX `sun_path` limit (~108 bytes on Linux), failing with
20
+ * `listen EINVAL`. A short, fixed-location directory sidesteps this
21
+ * regardless of how deep `projectDir` itself is nested. `sessionId` alone
22
+ * (8 hex chars, `generateSessionId()`) is enough to keep this collision-safe
23
+ * across every project on the machine sharing this one flat directory - the
24
+ * same randomness space this package already relied on per-project.
25
+ */
26
+ export declare function socketDir(): string;
27
+ export declare function socketPathFor(sessionId: string): string;
28
+ export declare function logPathFor(projectDir: string, sessionId: string): string;
29
+ export declare function generateSessionId(): string;
30
+ export declare function readSessionMeta(projectDir: string, sessionId: string): SessionMeta | null;
31
+ /**
32
+ * Resolve session metadata from a project hint (cwd) or the global registry.
33
+ * Fixes "session unreachable" when the agent calls status/send from a different
34
+ * directory or pane than the one that ran `pilot start`.
35
+ */
36
+ export declare function resolveSessionMeta(sessionId: string, projectDirHint?: string): SessionMeta | null;
37
+ export declare function writeGlobalSessionMeta(meta: SessionMeta): void;
38
+ export declare function removeSessionFiles(projectDir: string, sessionId: string): void;
39
+ /** Stop one detached session (SIGTERM + cleanup metadata/socket). */
40
+ export declare function stopBrowserSession(projectDir: string, sessionId: string): boolean;
41
+ /** Stop every live session registered for a project. */
42
+ export declare function stopAllBrowserSessions(projectDir: string): number;
43
+ /** Live browser sessions for a project (metadata + socket + pid still present). */
44
+ export declare function listBrowserSessions(projectDir: string): SessionMeta[];