waygraph 0.13.6 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (297) hide show
  1. package/README.md +820 -232
  2. package/assets/stubs/stub.mp4 +0 -0
  3. package/assets/stubs/stub.pdf +32 -0
  4. package/assets/stubs/stub.png +0 -0
  5. package/dist/agent-dive.d.ts +9 -0
  6. package/dist/agent-dive.js +32 -0
  7. package/dist/auto-explore-run.d.ts +20 -2
  8. package/dist/auto-explore-run.js +9 -8
  9. package/dist/auto-explore.js +22 -2
  10. package/dist/auto-session-ipc.d.ts +123 -0
  11. package/dist/auto-session-ipc.js +381 -0
  12. package/dist/auto-session.d.ts +342 -0
  13. package/dist/auto-session.js +760 -0
  14. package/dist/cli.js +417 -51
  15. package/dist/engine.d.ts +40 -1
  16. package/dist/engine.js +82 -0
  17. package/dist/graph.d.ts +18 -0
  18. package/dist/graph.js +65 -2
  19. package/dist/highlights.d.ts +20 -1
  20. package/dist/highlights.js +60 -0
  21. package/dist/index.d.ts +8 -4
  22. package/dist/index.js +5 -3
  23. package/dist/pilot-overlay.d.ts +88 -0
  24. package/dist/pilot-overlay.js +363 -0
  25. package/dist/pilot.d.ts +49 -0
  26. package/dist/pilot.js +53 -0
  27. package/dist/trait.d.ts +22 -0
  28. package/dist/trait.js +60 -3
  29. package/examples/routed-demo/package.json +26 -0
  30. package/examples/routed-demo/playwright.config.ts +20 -0
  31. package/examples/routed-demo/scripts/fixture-server.mjs +37 -0
  32. package/examples/routed-demo/scripts/with-fixture.mjs +70 -0
  33. package/examples/routed-demo/src/flows/routed-demo.flow.ts +12 -0
  34. package/examples/routed-demo/src/pages/dashboard.html +10 -0
  35. package/examples/routed-demo/src/pages/docs.html +8 -0
  36. package/examples/routed-demo/src/routes/(base_app)/dashboard/dashboard.sel.ts +10 -0
  37. package/examples/routed-demo/src/routes/(base_app)/dashboard/methods/click-widget.block.ts +23 -0
  38. package/examples/routed-demo/src/routes/(base_app)/dashboard/nav.block.ts +18 -0
  39. package/examples/routed-demo/src/routes/(base_app)/dashboard/page.block.ts +22 -0
  40. package/examples/routed-demo/src/routes/(external)/docs/docs.sel.ts +7 -0
  41. package/examples/routed-demo/src/routes/(external)/docs/nav.block.ts +21 -0
  42. package/examples/routed-demo/src/routes/(external)/docs/page.block.ts +15 -0
  43. package/examples/routed-demo/src/states/routed-demo.states.ts +10 -0
  44. package/examples/routed-demo/tests/routed-demo.spec.ts +75 -0
  45. package/examples/routed-demo/tsconfig.json +18 -0
  46. package/examples/routed-demo-consumer/package.json +18 -0
  47. package/examples/saucedemo/.waygraph-auto/010dd92b.log +0 -0
  48. package/examples/saucedemo/.waygraph-auto/011ad671.log +0 -0
  49. package/examples/saucedemo/.waygraph-auto/01b45645.log +0 -0
  50. package/examples/saucedemo/.waygraph-auto/03764153.log +0 -0
  51. package/examples/saucedemo/.waygraph-auto/0593587e.log +0 -0
  52. package/examples/saucedemo/.waygraph-auto/06d12823.log +0 -0
  53. package/examples/saucedemo/.waygraph-auto/0b1f5b26.json +8 -0
  54. package/examples/saucedemo/.waygraph-auto/0c00f25f.log +0 -0
  55. package/examples/saucedemo/.waygraph-auto/0e480591.log +0 -0
  56. package/examples/saucedemo/.waygraph-auto/110958b8.log +0 -0
  57. package/examples/saucedemo/.waygraph-auto/138107c1.log +0 -0
  58. package/examples/saucedemo/.waygraph-auto/159d541b.log +0 -0
  59. package/examples/saucedemo/.waygraph-auto/16aa2c01.log +0 -0
  60. package/examples/saucedemo/.waygraph-auto/16c35dd5.log +0 -0
  61. package/examples/saucedemo/.waygraph-auto/1706547d.log +0 -0
  62. package/examples/saucedemo/.waygraph-auto/17537e42.log +0 -0
  63. package/examples/saucedemo/.waygraph-auto/17ede493.log +0 -0
  64. package/examples/saucedemo/.waygraph-auto/1fe2414f.log +0 -0
  65. package/examples/saucedemo/.waygraph-auto/1fe2e3b8.log +0 -0
  66. package/examples/saucedemo/.waygraph-auto/25f68ada.log +0 -0
  67. package/examples/saucedemo/.waygraph-auto/26ca9cd8.log +0 -0
  68. package/examples/saucedemo/.waygraph-auto/2bb6c4e8.log +0 -0
  69. package/examples/saucedemo/.waygraph-auto/2d425004.log +0 -0
  70. package/examples/saucedemo/.waygraph-auto/2f5b3ea6.log +0 -0
  71. package/examples/saucedemo/.waygraph-auto/31bb303d.log +0 -0
  72. package/examples/saucedemo/.waygraph-auto/31f2042f.log +0 -0
  73. package/examples/saucedemo/.waygraph-auto/36551ec1.log +0 -0
  74. package/examples/saucedemo/.waygraph-auto/36a1c274.log +0 -0
  75. package/examples/saucedemo/.waygraph-auto/381aa338.log +0 -0
  76. package/examples/saucedemo/.waygraph-auto/3882bce1.log +0 -0
  77. package/examples/saucedemo/.waygraph-auto/38acd1dc.log +0 -0
  78. package/examples/saucedemo/.waygraph-auto/3b8b77b9.log +0 -0
  79. package/examples/saucedemo/.waygraph-auto/4028d2a2.log +0 -0
  80. package/examples/saucedemo/.waygraph-auto/4168b208.log +0 -0
  81. package/examples/saucedemo/.waygraph-auto/43ab66ce.log +0 -0
  82. package/examples/saucedemo/.waygraph-auto/43f66838.log +0 -0
  83. package/examples/saucedemo/.waygraph-auto/442171d4.log +0 -0
  84. package/examples/saucedemo/.waygraph-auto/453b1ce1.log +0 -0
  85. package/examples/saucedemo/.waygraph-auto/457322bd.log +0 -0
  86. package/examples/saucedemo/.waygraph-auto/46197027.log +0 -0
  87. package/examples/saucedemo/.waygraph-auto/46889468.log +0 -0
  88. package/examples/saucedemo/.waygraph-auto/4890da1c.log +0 -0
  89. package/examples/saucedemo/.waygraph-auto/4893a63b.log +0 -0
  90. package/examples/saucedemo/.waygraph-auto/4af71440.log +0 -0
  91. package/examples/saucedemo/.waygraph-auto/4f7496d1.log +0 -0
  92. package/examples/saucedemo/.waygraph-auto/50e8baaa.log +0 -0
  93. package/examples/saucedemo/.waygraph-auto/52b3a455.log +0 -0
  94. package/examples/saucedemo/.waygraph-auto/532dd9b8.log +0 -0
  95. package/examples/saucedemo/.waygraph-auto/5391ce40.log +0 -0
  96. package/examples/saucedemo/.waygraph-auto/57dbddb3.log +0 -0
  97. package/examples/saucedemo/.waygraph-auto/5897f501.log +0 -0
  98. package/examples/saucedemo/.waygraph-auto/59c0b57d.log +0 -0
  99. package/examples/saucedemo/.waygraph-auto/5b511794.log +0 -0
  100. package/examples/saucedemo/.waygraph-auto/5c47910f.log +0 -0
  101. package/examples/saucedemo/.waygraph-auto/5eda8273.log +0 -0
  102. package/examples/saucedemo/.waygraph-auto/621518ad.log +0 -0
  103. package/examples/saucedemo/.waygraph-auto/632b7118.log +0 -0
  104. package/examples/saucedemo/.waygraph-auto/64314c2b.log +0 -0
  105. package/examples/saucedemo/.waygraph-auto/66516213.log +0 -0
  106. package/examples/saucedemo/.waygraph-auto/66c17079.log +0 -0
  107. package/examples/saucedemo/.waygraph-auto/69bf0b80.log +0 -0
  108. package/examples/saucedemo/.waygraph-auto/69c2347a.log +0 -0
  109. package/examples/saucedemo/.waygraph-auto/6d22bdb0.log +0 -0
  110. package/examples/saucedemo/.waygraph-auto/7103bebb.log +0 -0
  111. package/examples/saucedemo/.waygraph-auto/740c9faa.log +0 -0
  112. package/examples/saucedemo/.waygraph-auto/74872fc5.log +0 -0
  113. package/examples/saucedemo/.waygraph-auto/75846ca9.log +0 -0
  114. package/examples/saucedemo/.waygraph-auto/7626c85b.log +0 -0
  115. package/examples/saucedemo/.waygraph-auto/76308eec.log +0 -0
  116. package/examples/saucedemo/.waygraph-auto/76c1650e.log +0 -0
  117. package/examples/saucedemo/.waygraph-auto/7861f38f.log +0 -0
  118. package/examples/saucedemo/.waygraph-auto/7af224ed.log +0 -0
  119. package/examples/saucedemo/.waygraph-auto/7c3be585.log +0 -0
  120. package/examples/saucedemo/.waygraph-auto/7ed55a2c.log +0 -0
  121. package/examples/saucedemo/.waygraph-auto/80086ba2.log +0 -0
  122. package/examples/saucedemo/.waygraph-auto/80206369.log +0 -0
  123. package/examples/saucedemo/.waygraph-auto/847f1092.log +0 -0
  124. package/examples/saucedemo/.waygraph-auto/8581abfa.log +0 -0
  125. package/examples/saucedemo/.waygraph-auto/87b7e0fd.log +0 -0
  126. package/examples/saucedemo/.waygraph-auto/87c79256.log +0 -0
  127. package/examples/saucedemo/.waygraph-auto/88af2495.log +0 -0
  128. package/examples/saucedemo/.waygraph-auto/8c04a403.log +0 -0
  129. package/examples/saucedemo/.waygraph-auto/8c9ab09e.log +0 -0
  130. package/examples/saucedemo/.waygraph-auto/8cc5db51.log +0 -0
  131. package/examples/saucedemo/.waygraph-auto/8ea3a69c.log +0 -0
  132. package/examples/saucedemo/.waygraph-auto/9150f913.log +0 -0
  133. package/examples/saucedemo/.waygraph-auto/929a4313.log +0 -0
  134. package/examples/saucedemo/.waygraph-auto/95a599e4.log +0 -0
  135. package/examples/saucedemo/.waygraph-auto/96c45350.log +0 -0
  136. package/examples/saucedemo/.waygraph-auto/986030e6.log +0 -0
  137. package/examples/saucedemo/.waygraph-auto/99787abb.log +0 -0
  138. package/examples/saucedemo/.waygraph-auto/99ddb62c.log +0 -0
  139. package/examples/saucedemo/.waygraph-auto/a63a2d20.log +0 -0
  140. package/examples/saucedemo/.waygraph-auto/a78befb7.log +0 -0
  141. package/examples/saucedemo/.waygraph-auto/a84d9b79.log +0 -0
  142. package/examples/saucedemo/.waygraph-auto/a9270890.log +0 -0
  143. package/examples/saucedemo/.waygraph-auto/aa440153.log +0 -0
  144. package/examples/saucedemo/.waygraph-auto/ab7561e0.log +0 -0
  145. package/examples/saucedemo/.waygraph-auto/ac19ae60.log +0 -0
  146. package/examples/saucedemo/.waygraph-auto/ae21ad8e.log +0 -0
  147. package/examples/saucedemo/.waygraph-auto/af09042f.log +0 -0
  148. package/examples/saucedemo/.waygraph-auto/b1684126.log +0 -0
  149. package/examples/saucedemo/.waygraph-auto/b21e9d12.log +0 -0
  150. package/examples/saucedemo/.waygraph-auto/b5a838be.log +0 -0
  151. package/examples/saucedemo/.waygraph-auto/b603549d.log +0 -0
  152. package/examples/saucedemo/.waygraph-auto/b83e6259.log +0 -0
  153. package/examples/saucedemo/.waygraph-auto/b9cb2796.log +0 -0
  154. package/examples/saucedemo/.waygraph-auto/bb0a0018.log +0 -0
  155. package/examples/saucedemo/.waygraph-auto/bc0bdd0e.log +0 -0
  156. package/examples/saucedemo/.waygraph-auto/bc7d4a83.log +0 -0
  157. package/examples/saucedemo/.waygraph-auto/bd8e082a.log +0 -0
  158. package/examples/saucedemo/.waygraph-auto/bea0c93e.log +0 -0
  159. package/examples/saucedemo/.waygraph-auto/bf35201a.log +0 -0
  160. package/examples/saucedemo/.waygraph-auto/bffa3a7a.log +0 -0
  161. package/examples/saucedemo/.waygraph-auto/c4afb8bc.log +0 -0
  162. package/examples/saucedemo/.waygraph-auto/c916a654.log +0 -0
  163. package/examples/saucedemo/.waygraph-auto/c9b8d69e.log +0 -0
  164. package/examples/saucedemo/.waygraph-auto/d02e5e7e.log +0 -0
  165. package/examples/saucedemo/.waygraph-auto/d09aff71.log +0 -0
  166. package/examples/saucedemo/.waygraph-auto/d0e41396.log +0 -0
  167. package/examples/saucedemo/.waygraph-auto/d1370d76.log +0 -0
  168. package/examples/saucedemo/.waygraph-auto/d3714ae4.log +0 -0
  169. package/examples/saucedemo/.waygraph-auto/da0685dc.log +0 -0
  170. package/examples/saucedemo/.waygraph-auto/da894ad8.log +0 -0
  171. package/examples/saucedemo/.waygraph-auto/daa2f922.log +0 -0
  172. package/examples/saucedemo/.waygraph-auto/daefb614.log +0 -0
  173. package/examples/saucedemo/.waygraph-auto/db97e833.log +0 -0
  174. package/examples/saucedemo/.waygraph-auto/e101d19a.log +0 -0
  175. package/examples/saucedemo/.waygraph-auto/e207c989.log +0 -0
  176. package/examples/saucedemo/.waygraph-auto/e633e545.log +0 -0
  177. package/examples/saucedemo/.waygraph-auto/e69aec68.log +0 -0
  178. package/examples/saucedemo/.waygraph-auto/e70e2d06.log +0 -0
  179. package/examples/saucedemo/.waygraph-auto/ebad3410.log +0 -0
  180. package/examples/saucedemo/.waygraph-auto/ecbb0966.log +0 -0
  181. package/examples/saucedemo/.waygraph-auto/ecdee753.log +0 -0
  182. package/examples/saucedemo/.waygraph-auto/ed888783.log +0 -0
  183. package/examples/saucedemo/.waygraph-auto/ed931dac.log +0 -0
  184. package/examples/saucedemo/.waygraph-auto/ef655a3f.log +0 -0
  185. package/examples/saucedemo/.waygraph-auto/f3c29b21.log +0 -0
  186. package/examples/saucedemo/.waygraph-auto/f53f7cfc.log +0 -0
  187. package/examples/saucedemo/.waygraph-auto/f5ad5830.log +0 -0
  188. package/examples/saucedemo/.waygraph-auto/faed36dd.log +0 -0
  189. package/examples/saucedemo/docs/CONVENTION.md +25 -5
  190. package/examples/saucedemo/docs/HELPERS.md +15 -4
  191. package/examples/saucedemo/scripts/capture-wrong-login.mjs +8 -2
  192. package/examples/saucedemo/scripts/prove-wrong-login-runtime.mjs +8 -2
  193. package/examples/saucedemo/src/blocks/SITE-MAP.md +14 -3
  194. package/examples/saucedemo/src/blocks/saucedemo-web/NAV.md +15 -1
  195. package/examples/saucedemo/src/blocks/saucedemo-web/cart/NAV.md +1 -0
  196. package/examples/saucedemo/src/blocks/saucedemo-web/cart/cart.sel.ts +9 -0
  197. package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -2
  198. package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +2 -1
  199. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/NAV.md +6 -1
  200. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/checkout-info.sel.ts +11 -0
  201. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +22 -0
  202. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +21 -0
  203. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +21 -0
  204. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +6 -7
  205. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-two/NAV.md +2 -0
  206. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-two/methods/checkout-overview.sel.ts +9 -0
  207. package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +7 -6
  208. package/examples/saucedemo/src/blocks/saucedemo-web/ff-owner-auth.block.ts +7 -2
  209. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/NAV.md +1 -0
  210. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/item-detail.sel.ts +9 -0
  211. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +2 -1
  212. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +2 -1
  213. package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +2 -1
  214. package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +51 -0
  215. package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +69 -0
  216. package/examples/saucedemo/src/blocks/saucedemo-web/methods/login.sel.ts +13 -0
  217. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-login-for-flow.ts +4 -4
  218. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +13 -51
  219. package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +4 -3
  220. package/examples/saucedemo/src/blocks/saucedemo-web/nav-login.block.ts +14 -6
  221. package/examples/saucedemo/src/flows/checkout-then-browse-again.flow.ts +15 -0
  222. package/examples/saucedemo/src/flows/checkout.flow.ts +20 -2
  223. package/examples/saucedemo/src/flows/device-showcase.flow.ts +4 -0
  224. package/examples/saucedemo/src/flows/login.flow.ts +3 -1
  225. package/examples/saucedemo/src/flows/shop.flow.ts +6 -0
  226. package/examples/saucedemo/src/flows/smoke.flow.ts +13 -7
  227. package/examples/saucedemo/src/flows/stub-on-error.flow.ts +4 -2
  228. package/examples/saucedemo/src/flows/viewer-blocked.flow.ts +6 -2
  229. package/examples/saucedemo/tests/flow-block-verify.spec.ts +3 -3
  230. package/examples/saucedemo/tests/submit-login-branch.spec.ts +5 -3
  231. package/package.json +2 -1
  232. package/templates/agents/waygraph-author.agent.md +43 -5
  233. package/templates/agents/waygraph-planner.agent.md +33 -2
  234. package/templates/quickstart/src/blocks/saucedemo-web/NAV.md +15 -1
  235. package/templates/quickstart/src/blocks/saucedemo-web/cart/NAV.md +1 -0
  236. package/templates/quickstart/src/blocks/saucedemo-web/cart/cart.sel.ts +9 -0
  237. package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-cart.block.ts +19 -15
  238. package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +2 -1
  239. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/NAV.md +6 -1
  240. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/checkout-info.sel.ts +11 -0
  241. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +22 -0
  242. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +21 -0
  243. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +21 -0
  244. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +6 -7
  245. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-two/NAV.md +2 -0
  246. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-two/methods/checkout-overview.sel.ts +9 -0
  247. package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +7 -6
  248. package/templates/quickstart/src/blocks/saucedemo-web/ff-owner-auth.block.ts +7 -2
  249. package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +24 -16
  250. package/templates/quickstart/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
  251. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/NAV.md +1 -0
  252. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/item-detail.sel.ts +9 -0
  253. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +2 -1
  254. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +2 -1
  255. package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +2 -1
  256. package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +51 -0
  257. package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +69 -0
  258. package/templates/quickstart/src/blocks/saucedemo-web/methods/login.sel.ts +13 -0
  259. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-login-for-flow.ts +4 -4
  260. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +35 -63
  261. package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +4 -3
  262. package/templates/quickstart/src/blocks/saucedemo-web/nav-login.block.ts +14 -6
  263. package/templates/quickstart/src/flows/checkout-then-browse-again.flow.ts +15 -0
  264. package/templates/quickstart/src/flows/checkout.flow.ts +29 -2
  265. package/templates/quickstart/src/flows/device-showcase.flow.ts +4 -0
  266. package/templates/quickstart/src/flows/login.flow.ts +3 -1
  267. package/templates/quickstart/src/flows/shop.flow.ts +6 -0
  268. package/templates/quickstart/src/flows/smoke.flow.ts +13 -7
  269. package/templates/quickstart/src/flows/viewer-blocked.flow.ts +6 -2
  270. package/templates/quickstart/tests/chain-flow.spec.ts +8 -1
  271. package/templates/scaffold/STRUCTURE.md +23 -3
  272. package/templates/scaffold/src/blocks/demo-external/mailpit/mailpit-inbox.page.block.ts +30 -0
  273. package/templates/scaffold/src/blocks/demo-external/mailpit/mailpit-sel.ts +5 -0
  274. package/templates/scaffold/src/blocks/demo-external/mailpit/methods/assert-email-content.method.block.ts +48 -0
  275. package/templates/scaffold/src/blocks/demo-external/mailpit/methods/assert-email-received.method.block.ts +49 -0
  276. package/templates/scaffold/src/blocks/demo-external/mailpit/methods/extract-email-link.method.block.ts +41 -0
  277. package/templates/scaffold/src/blocks/demo-external/mailpit/methods/open-message.method.block.ts +39 -0
  278. package/templates/scaffold/src/blocks/demo-external/mailpit/nav-mailpit-inbox.block.ts +20 -0
  279. package/templates/scaffold/src/blocks/demo-web/demo-sel.ts +1 -0
  280. package/templates/scaffold/src/blocks/demo-web/docs.html +8 -0
  281. package/templates/scaffold/src/blocks/demo-web/home.html +4 -0
  282. package/templates/scaffold/src/blocks/demo-web/methods/assert-hello.method.block.ts +34 -38
  283. package/templates/scaffold/src/blocks/demo-web/methods/assert-item-added.method.block.ts +38 -0
  284. package/templates/scaffold/src/blocks/demo-web/nav-verification-link.block.ts +34 -0
  285. package/templates/scaffold/src/flows/mail-verify.flow.ts +85 -0
  286. package/templates/scaffold/src/flows/routes-demo.flow.ts +14 -0
  287. package/templates/scaffold/src/flows/shop.flow.ts +19 -2
  288. package/templates/scaffold/src/routes/(external)/docs/docs.sel.ts +7 -0
  289. package/templates/scaffold/src/routes/(external)/docs/nav.block.ts +21 -0
  290. package/templates/scaffold/src/routes/(external)/docs/page.block.ts +15 -0
  291. package/templates/scaffold/src/states/demo.mem-keys.ts +25 -1
  292. package/templates/scaffold/src/states/demo.states.ts +13 -0
  293. package/templates/scaffold/test-results/.last-run.json +4 -0
  294. package/templates/scaffold/tests/mail-verify.spec.ts +191 -0
  295. package/templates/skills/waygraph-blind-pilot.skill.md +61 -0
  296. package/templates/skills/waygraph-pilot.skill.md +108 -0
  297. package/templates/quickstart/README-saucedemo-commands.md +0 -72
@@ -0,0 +1,342 @@
1
+ import { type BlockEntry, type ExploreMenu } from "./auto-explore.js";
2
+ import { type PickResult } from "./auto-explore-run.js";
3
+ import { type StubPhaseResult } from "./highlights.js";
4
+ export interface SessionSnapshotEdge {
5
+ /** 1-based, matching the numbers a human/agent picks by (same as printCliMenu). */
6
+ index: number;
7
+ block: string;
8
+ kind: "nav" | "action";
9
+ to: string;
10
+ label?: string;
11
+ description?: string;
12
+ }
13
+ export interface SessionSnapshotSection {
14
+ title: string;
15
+ edges: SessionSnapshotEdge[];
16
+ }
17
+ export interface SessionSnapshot {
18
+ here: string | null;
19
+ sections: SessionSnapshotSection[];
20
+ /** True when there are no runnable moves from `here` right now. */
21
+ done: boolean;
22
+ lastRunNote: string | null;
23
+ }
24
+ /** Plain, JSON-serializable view of a menu - no Block/MemKey/class references. */
25
+ export declare function buildSessionSnapshot(menu: ExploreMenu, library: Map<string, BlockEntry>, here: string | null, lastRunNote: string | null): SessionSnapshot;
26
+ export type ParsedPick = PickResult | {
27
+ type: "invalid";
28
+ reason: string;
29
+ };
30
+ /**
31
+ * Same number/`q`/range rules `cliPick` already applies, but returning a
32
+ * result instead of looping to re-prompt - one request gets one answer.
33
+ */
34
+ export declare function parsePick(raw: string, menuLength: number): ParsedPick;
35
+ export interface DomSnapshot {
36
+ mode: "aria" | "full";
37
+ selector?: string;
38
+ /** Always false for aria mode - Playwright's own ariaSnapshotJSON bounds itself. */
39
+ truncated: boolean;
40
+ tree: unknown;
41
+ }
42
+ export interface InspectDomOptions {
43
+ mode?: "aria" | "full";
44
+ /** Scopes either mode to one element's subtree - a modifier, not a third mode. */
45
+ selector?: string;
46
+ depth?: number;
47
+ }
48
+ export type InspectDomResult = {
49
+ ok: true;
50
+ snapshot: DomSnapshot;
51
+ } | {
52
+ ok: false;
53
+ error: string;
54
+ };
55
+ export interface AutoSessionInit {
56
+ projectDir: string;
57
+ baseURL?: string;
58
+ startUrl?: string;
59
+ blocksSelect?: import("./blocks-select.js").BlocksSelect;
60
+ /** Default true. false launches a real visible browser window. */
61
+ headless?: boolean;
62
+ /**
63
+ * Shown on the on-page Pilot overlay badge, when known - purely cosmetic,
64
+ * this class has no other use for it. `auto --cli --detach`'s spawned
65
+ * child (`runAutoServeCommand`) always knows and passes its own generated
66
+ * id; a directly-constructed `AutoSession` (e.g. in a test) simply omits
67
+ * it, and the badge shows "no session id" instead.
68
+ */
69
+ sessionId?: string;
70
+ }
71
+ export type ApplyPickResult = {
72
+ ok: true;
73
+ snapshot: SessionSnapshot;
74
+ quit: boolean;
75
+ } | {
76
+ ok: false;
77
+ error: string;
78
+ };
79
+ export type ApplyPathResult = {
80
+ ok: true;
81
+ path: string[];
82
+ snapshot: SessionSnapshot;
83
+ } | {
84
+ ok: false;
85
+ error: string;
86
+ };
87
+ /**
88
+ * One Checkpoint/Block-level step in a session's history - not a raw action
89
+ * recording (no clicks/fills). Kept lean by design: an agent that wants DOM
90
+ * evidence at a specific step already has `inspectDom` to call itself.
91
+ */
92
+ export interface TraceStep {
93
+ block: string;
94
+ from: string | null;
95
+ to?: string;
96
+ error?: string;
97
+ timestamp: string;
98
+ /**
99
+ * Resolved demo-narration fixtures (highlights/todos/device), when the
100
+ * Block actually authors `stubBefore`/`stubAfter`/`stubOnError` - the same
101
+ * data `waygraph demo`'s lifecycle logging already computes (`runStubPhase`
102
+ * in highlights.ts), reused here for extra context on what a step meant to
103
+ * convey. Omitted when the Block has none, or the result carries nothing.
104
+ */
105
+ stubBefore?: StubPhaseResult;
106
+ stubAfter?: StubPhaseResult;
107
+ stubOnError?: StubPhaseResult;
108
+ }
109
+ export type StubFileKind = "image" | "pdf" | "video";
110
+ /**
111
+ * Real, minimal, valid fixture files bundled at `assets/stubs/` - not
112
+ * placeholder/renamed-empty files: `stub.png` is a real 1x1 PNG,
113
+ * `stub.pdf` a real single-page PDF, `stub.mp4` a real ffmpeg-encoded
114
+ * 1s black clip. Real, direct user request: Blind Pilot hitting a real
115
+ * `<input type="file">` (e.g. an avatar upload) had no way to supply
116
+ * anything without a human handing over a real file each time - these are
117
+ * small enough to ship in the package and pass most apps' basic file-type
118
+ * checks (magic bytes, not just extension).
119
+ */
120
+ /**
121
+ * Public so a Block a consumer writes can reach the same real fixture files
122
+ * `rawUpload` uses - not just the raw primitive. Needed when a real upload
123
+ * flow has no stable `<input type="file">` to hand a selector to at all
124
+ * (e.g. one created on the fly inside a click handler, then immediately
125
+ * `.click()`'d to open the OS picker and possibly torn down right after) -
126
+ * a Block's own `act()` should pair this with `page.waitForEvent("filechooser")`
127
+ * around the triggering click, not go hunting for a selector that may not
128
+ * exist for more than a moment.
129
+ */
130
+ export declare function stubFilePath(kind: StubFileKind): string;
131
+ /**
132
+ * Real gap found live (Blind Pilot against veciro.com): a form submit that
133
+ * does nothing observable in the DOM - no navigation, no visible error text -
134
+ * is undiagnosable through `inspectDom` alone, since a silent client-side
135
+ * validation failure or a failed network request never touches the DOM at
136
+ * all. `auto dom` reads what's rendered; this reads what the page/network
137
+ * actually SAID, independent of whether the app chose to show it.
138
+ */
139
+ export interface ConsoleLogEntry {
140
+ type: "console" | "pageerror" | "response";
141
+ level?: string;
142
+ text: string;
143
+ url?: string;
144
+ status?: number;
145
+ timestamp: string;
146
+ }
147
+ export interface ServiceWorkerRegistrationInfo {
148
+ scope: string;
149
+ activeUrl?: string;
150
+ state?: string;
151
+ }
152
+ export interface CookieInfo {
153
+ name: string;
154
+ value: string;
155
+ domain: string;
156
+ path: string;
157
+ httpOnly: boolean;
158
+ secure: boolean;
159
+ }
160
+ export interface StorageSnapshot {
161
+ localStorage: Record<string, string>;
162
+ sessionStorage: Record<string, string>;
163
+ cookies: CookieInfo[];
164
+ serviceWorkers: string[];
165
+ serviceWorkerRegistrations: ServiceWorkerRegistrationInfo[];
166
+ }
167
+ /**
168
+ * Non-interactive explore session: same graph/library/mem/browser setup
169
+ * `runAutoExplore` runs in `--cli` mode, driven by `applyPick` instead of a
170
+ * blocking `readline` loop. Headless by default (matching
171
+ * `runAutoExplore`'s own `cli` branch), optionally visible via
172
+ * `AutoSessionInit.headless: false` - this type only ever backs the `--cli`
173
+ * picker, never the headful page-embedded panel, headless or not.
174
+ */
175
+ export declare class AutoSession {
176
+ private readonly projectDir;
177
+ private readonly blocksSelect;
178
+ private graph;
179
+ private library;
180
+ private readonly mem;
181
+ private readonly engine;
182
+ private readonly browser;
183
+ private readonly context;
184
+ private page;
185
+ private readonly startUrl;
186
+ private readonly sessionId;
187
+ private here;
188
+ private lastRunNote;
189
+ private readonly trace;
190
+ private readonly consoleLog;
191
+ private constructor();
192
+ static start(init: AutoSessionInit): Promise<AutoSession>;
193
+ /** Pure getter - returns a copy, not the live array. */
194
+ getTrace(): TraceStep[];
195
+ private pushTrace;
196
+ /** Pure getter - returns a copy, not the live array. */
197
+ getConsoleLog(): ConsoleLogEntry[];
198
+ private pushConsoleLog;
199
+ private currentMenu;
200
+ /**
201
+ * Real, direct user request: a Blind Pilot agent had no way to ask "which
202
+ * of the links visible on THIS page are already covered by a NavBlock" -
203
+ * only manual DOM inspection + guessing hrefs, exactly what this session
204
+ * had been doing by hand the whole time this feature was built. Compares
205
+ * every same-origin `<a href>` on the page against every NavBlock's own
206
+ * static url (`__waygraphNavUrl` - see `defineNavBlock`'s own comment for
207
+ * why only plain-string urls qualify), and `console.warn()`s each pathname
208
+ * with no NavBlock at all - surfaced through the same real console capture
209
+ * `auto console` already reads, not a separate channel. Deduped per path
210
+ * per page load (a `Set` living on `window`, so it survives repeated
211
+ * `currentMenu()` calls but resets on a real navigation) - once is enough
212
+ * to flag a gap, repeating it on every status/send call would just be noise.
213
+ */
214
+ private warnUnmappedLinks;
215
+ /** Pure getter - no Block runs, no mem/page mutation. */
216
+ currentSnapshot(): Promise<SessionSnapshot>;
217
+ /**
218
+ * Pure getter - reads the live page's structure at the requested fidelity.
219
+ * No Block runs, no mem/page mutation. `selector` scopes either mode to one
220
+ * element's subtree; it is a modifier, not a third mode.
221
+ */
222
+ inspectDom(opts: InspectDomOptions): Promise<InspectDomResult>;
223
+ /**
224
+ * Pure getter - reads the live page's client-side state: localStorage,
225
+ * sessionStorage, and registered service workers (scope/active URL/state).
226
+ * Real, direct follow-up to `auto console`'s own gap: a site doing web
227
+ * push (this target has a real `NOTIFICATION_VAPID` config, confirmed via
228
+ * `auto dom` earlier) keeps push-subscription/auth state in these places,
229
+ * not in the rendered DOM `inspectDom` reads.
230
+ */
231
+ inspectStorage(): Promise<StorageSnapshot>;
232
+ /**
233
+ * Runs one already-resolved Block entry for real - the shared core both
234
+ * `applyPick` (resolved via a live-menu index) and `applyPath` (resolved
235
+ * directly by name, bypassing live-menu-visibility entirely - see
236
+ * `applyPath`'s own comment for why) call. `expectedTo` is only used as a
237
+ * fallback when a Block's own `resolve()` doesn't set `__state` - same
238
+ * behavior `applyPick` always had, just factored out, not changed.
239
+ */
240
+ private runNamedBlock;
241
+ /** Applies exactly one pick: runs at most one Block, returns the resulting state. */
242
+ applyPick(raw: string): Promise<ApplyPickResult>;
243
+ /**
244
+ * Re-discovers the project's Block library and graph from disk, using the
245
+ * exact same call `start()` itself makes - not a duplicated read - and
246
+ * replaces `this.library`/`this.graph` in place. Leaves the live page,
247
+ * mem, browser/context, and current Checkpoint (`here`) untouched, so a
248
+ * Block written to disk mid-session becomes pickable via a later
249
+ * `applyPick` without restarting the session. See
250
+ * openspec/changes/waygraph-blind-pilot/design.md.
251
+ */
252
+ reloadLibrary(): Promise<void>;
253
+ /**
254
+ * Forces `here` to be re-detected from the real live page, discarding
255
+ * whatever was cached - the fix for a real, confirmed gap: `here` is only
256
+ * ever updated by an action this class itself ran (`applyPick`/`applyPath`
257
+ * set it to a Block's own resolved Checkpoint; `rawClick`/`rawType`/
258
+ * `rawGoto` reset it to `null` because *they* just changed the page). If a
259
+ * human co-driving the same visible session clicks/types/navigates
260
+ * directly - a real scenario for a headful Pilot session someone is
261
+ * watching, not hypothetical - none of that goes through this class at
262
+ * all, so `here` silently goes stale: `currentMenu()`'s own lazy check
263
+ * (`if (this.here === null)`, just above) only re-detects when `here` is
264
+ * already unknown, never to confirm a *known* value is still correct.
265
+ * This does not crash the session (the process/socket/page all stay
266
+ * alive) but subsequent `send`/`reach` calls would act on a menu built
267
+ * from the wrong Checkpoint until something forces re-detection - this
268
+ * method is that: unconditionally re-run the same `detectHere` logic the
269
+ * lazy path already uses, regardless of what `here` currently holds.
270
+ */
271
+ resync(): Promise<ApplyPickResult>;
272
+ /**
273
+ * Raw interaction primitives for a page no Block covers yet (Blind Pilot -
274
+ * see openspec/changes/waygraph-blind-pilot). Unlike `applyPick`, the
275
+ * resulting Checkpoint isn't known ahead of time from a Block's own
276
+ * `resolve()`, so each of these invalidates the cached `here` (forcing
277
+ * `currentMenu()`'s existing lazy `detectHere` call to run again) rather
278
+ * than assuming the page didn't move anywhere a Block now recognizes.
279
+ * A selector matching nothing is a reported failure, not a silent no-op.
280
+ */
281
+ rawClick(selector: string): Promise<ApplyPickResult>;
282
+ rawType(selector: string, text: string): Promise<ApplyPickResult>;
283
+ /**
284
+ * Presses a real key on a real focused element - a real gap found live:
285
+ * many real inline-edit inputs (no visible Save button at all) commit on
286
+ * Enter, not on blur/click-elsewhere. `key` is a Playwright key name
287
+ * (e.g. "Enter", "Escape", "Tab") - same vocabulary as
288
+ * `page.keyboard.press`, which this wraps.
289
+ */
290
+ rawPress(selector: string, key: string): Promise<ApplyPickResult>;
291
+ rawGoto(url: string): Promise<ApplyPickResult>;
292
+ /**
293
+ * Fills a real `<input type="file">` - a built-in stub kind
294
+ * ("image"/"pdf"/"video", see `stubFilePath`) or a caller-supplied
295
+ * `filePath` for anything else ("whatever", per the real request this
296
+ * responds to). Same raw-primitive shape as click/type/goto: works with
297
+ * zero Blocks, invalidates `here` since the app may react to the upload.
298
+ */
299
+ rawUpload(selector: string, stub: StubFileKind | {
300
+ filePath: string;
301
+ }): Promise<ApplyPickResult>;
302
+ /**
303
+ * Runs a whole multi-step route to `targetCheckpoint` in one call, instead
304
+ * of an agent hand-picking one index at a time across many separate
305
+ * `applyPick` round trips - real, reported pain for any non-trivial task
306
+ * on a rich graph ("the entire prompts of the day" driving one step per
307
+ * call).
308
+ *
309
+ * Two other designs were tried and rejected by direct reproduction against
310
+ * live saucedemo.com before this one, both undone by the same root cause:
311
+ * a `from: "*"` edge (e.g. "Checkout", only clickable once you're actually
312
+ * on the cart page with items) looks globally reachable to
313
+ * `findBlockPath`'s static-graph BFS, which has no live-page access and
314
+ * can't know the edge's real precondition isn't showing yet. Computing the
315
+ * whole route once upfront names a premature wildcard step immediately;
316
+ * scoring each live menu option by its static-graph distance to the
317
+ * target (greedy best-first) doesn't fix it either - a harmless self-loop
318
+ * Method can score just as well as real progress once wildcard "shortcuts"
319
+ * are baked into every distance calculation, and the session gets stuck
320
+ * repeating it.
321
+ *
322
+ * The fix that actually works: stop trying to be clever about live-menu
323
+ * visibility per step, and reuse `auto --blocks <From> <To>`'s own already
324
+ * -proven approach instead - compute the path ONCE (via
325
+ * `findBlockPathDetailed`, the same BFS `findBlockPath`/`runChainAuto`
326
+ * already use, extended to also return each hop's specific edge - see its
327
+ * own doc comment for why that extra detail is load-bearing, not cosmetic),
328
+ * then run each Block in it directly via `runNamedBlock`, trusting the
329
+ * graph the same way `runChain`'s own flow execution already does, not
330
+ * gated on live-menu visibility at all. The one real difference from
331
+ * `runChainAuto`: this runs against the session's own already-live
332
+ * page/context/mem, not a freshly spawned browser - the whole point of
333
+ * staying in one session. A step whose real precondition genuinely isn't
334
+ * met still fails loud, naming that step, exactly the way a mis-ordered
335
+ * `runChain` spec would - and a step that runs without throwing but lands
336
+ * somewhere other than what its own edge promised (a real, observed case,
337
+ * not hypothetical - see this method's own test suite) fails loud too,
338
+ * rather than reporting false success.
339
+ */
340
+ applyPath(targetCheckpoint: string): Promise<ApplyPathResult>;
341
+ close(): Promise<void>;
342
+ }