waygraph 0.15.47 → 0.15.49

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 (345) hide show
  1. package/dist/analysis/graph.js +2 -2
  2. package/dist/auto-session/session.js +2 -2
  3. package/dist/cli/discover.d.ts +1 -1
  4. package/dist/cli/discover.js +1 -1
  5. package/dist/cli.js +1 -1
  6. package/dist/{agent-dive.js → commands/agent-dive-scaffold.js} +2 -2
  7. package/dist/commands/agent-dive.js +1 -1
  8. package/dist/{engine/core.js → core/block.js} +6 -6
  9. package/dist/core/blocks/api.d.ts +54 -0
  10. package/dist/core/blocks/api.js +75 -0
  11. package/dist/{engine → core}/blocks/effect.d.ts +1 -1
  12. package/dist/{engine → core}/blocks/effect.js +1 -1
  13. package/dist/{engine → core}/blocks/method.d.ts +1 -1
  14. package/dist/{engine → core}/blocks/method.js +1 -1
  15. package/dist/{engine → core}/blocks/nav.js +1 -1
  16. package/dist/{engine → core}/blocks/page.js +1 -1
  17. package/dist/{engine → core}/branch-regression.js +2 -3
  18. package/dist/{engine → core}/compose.js +4 -4
  19. package/dist/{engine/engine-class.d.ts → core/engine.d.ts} +2 -133
  20. package/dist/core/engine.js +50 -0
  21. package/dist/{engine → core}/flow.js +5 -5
  22. package/dist/core/map-builder.d.ts +171 -0
  23. package/dist/{engine/engine-class.js → core/map-builder.js} +82 -98
  24. package/dist/{engine → core}/run-graph.js +4 -6
  25. package/dist/core.d.ts +14 -0
  26. package/dist/core.js +15 -0
  27. package/dist/errors.d.ts +54 -20
  28. package/dist/errors.js +67 -20
  29. package/dist/highlights/run-phase.js +15 -2
  30. package/dist/highlights/stub-ctx.js +16 -0
  31. package/dist/highlights/types.d.ts +38 -0
  32. package/dist/index.d.ts +5 -3
  33. package/dist/index.js +1 -1
  34. package/dist/mem-page.js +2 -2
  35. package/dist/mem-stub.d.ts +1 -1
  36. package/dist/pilot-overlay/fixtures.js +42 -10
  37. package/dist/pilot-overlay/shell.js +23 -10
  38. package/dist/runner/banner-log.js +1 -0
  39. package/dist/runner/device-stage.js +35 -15
  40. package/dist/runner/inpage/banner.d.ts +9 -1
  41. package/dist/runner/inpage/banner.js +27 -2
  42. package/dist/runner/inpage/caption.d.ts +3 -0
  43. package/dist/runner/inpage/caption.js +23 -0
  44. package/dist/runner/inpage/core.js +32 -9
  45. package/dist/runner/inpage/network.d.ts +15 -0
  46. package/dist/runner/inpage/network.js +217 -0
  47. package/dist/runner/inpage/panel-chrome.js +41 -1
  48. package/dist/runner/inpage/swipe-zoom.js +1 -1
  49. package/dist/runner/inpage/todos.js +6 -1
  50. package/dist/runner/main.js +9 -2
  51. package/dist/runner/network-capture.d.ts +9 -0
  52. package/dist/runner/network-capture.js +126 -0
  53. package/dist/runner/overlay-css.js +71 -7
  54. package/dist/runner/overlay-install.js +39 -2
  55. package/dist/runner/overlay-stage.js +5 -0
  56. package/dist/runner/rings.js +69 -45
  57. package/dist/runner/slides.js +14 -8
  58. package/dist/runner/step-mode.js +12 -0
  59. package/dist/runner/step-panels.js +9 -3
  60. package/dist/runner/teardown.js +16 -9
  61. package/dist/session/auto-explore-run.d.ts +1 -1
  62. package/dist/session/auto-explore-run.js +47 -10
  63. package/dist/{step-overlay.d.ts → session/step-overlay.d.ts} +1 -1
  64. package/dist/{step-overlay.js → session/step-overlay.js} +1 -1
  65. package/dist/trait.d.ts +1 -0
  66. package/dist/trait.js +15 -0
  67. package/dist/traverse/run.js +1 -1
  68. package/dist/ui/components/ring.js +4 -2
  69. package/dist/ui/overlay.css +36 -3
  70. package/examples/saucedemo/.waygraph-auto/00d147d1.log +21 -0
  71. package/examples/saucedemo/.waygraph-auto/0402cfcf.log +6 -0
  72. package/examples/saucedemo/.waygraph-auto/062b581f.log +20 -0
  73. package/examples/saucedemo/.waygraph-auto/0681582b.log +6 -0
  74. package/examples/saucedemo/.waygraph-auto/07f3e964.log +6 -0
  75. package/examples/saucedemo/.waygraph-auto/0868ae4d.log +0 -0
  76. package/examples/saucedemo/.waygraph-auto/0924ddaa.log +22 -0
  77. package/examples/saucedemo/.waygraph-auto/092d6173.log +5 -0
  78. package/examples/saucedemo/.waygraph-auto/09924510.log +0 -0
  79. package/examples/saucedemo/.waygraph-auto/0998c941.log +21 -0
  80. package/examples/saucedemo/.waygraph-auto/0bf74300.log +21 -0
  81. package/examples/saucedemo/.waygraph-auto/0c01fd29.log +4 -0
  82. package/examples/saucedemo/.waygraph-auto/0c302590.log +0 -0
  83. package/examples/saucedemo/.waygraph-auto/0dee62d6.log +5 -0
  84. package/examples/saucedemo/.waygraph-auto/0eb4c081.log +5 -0
  85. package/examples/saucedemo/.waygraph-auto/10fd431c.log +0 -0
  86. package/examples/saucedemo/.waygraph-auto/13c6fe3c.log +0 -0
  87. package/examples/saucedemo/.waygraph-auto/1581b677.log +0 -0
  88. package/examples/saucedemo/.waygraph-auto/164761a5.log +6 -0
  89. package/examples/saucedemo/.waygraph-auto/1905ceb2.log +0 -0
  90. package/examples/saucedemo/.waygraph-auto/1b1d55c6.log +0 -0
  91. package/examples/saucedemo/.waygraph-auto/1b80fd24.log +6 -0
  92. package/examples/saucedemo/.waygraph-auto/1c30a3c2.log +0 -0
  93. package/examples/saucedemo/.waygraph-auto/1d90aa9a.log +0 -0
  94. package/examples/saucedemo/.waygraph-auto/1de7d889.log +0 -0
  95. package/examples/saucedemo/.waygraph-auto/1f233a4c.log +6 -0
  96. package/examples/saucedemo/.waygraph-auto/20e66801.log +0 -0
  97. package/examples/saucedemo/.waygraph-auto/20ffdb77.log +0 -0
  98. package/examples/saucedemo/.waygraph-auto/22f1a704.log +5 -0
  99. package/examples/saucedemo/.waygraph-auto/239cced3.log +20 -0
  100. package/examples/saucedemo/.waygraph-auto/25204b46.log +4 -0
  101. package/examples/saucedemo/.waygraph-auto/25e2e90f.log +0 -0
  102. package/examples/saucedemo/.waygraph-auto/2708455e.log +22 -0
  103. package/examples/saucedemo/.waygraph-auto/272a96fd.log +20 -0
  104. package/examples/saucedemo/.waygraph-auto/28d7be5d.log +0 -0
  105. package/examples/saucedemo/.waygraph-auto/2a6a8266.log +6 -0
  106. package/examples/saucedemo/.waygraph-auto/2b3401cf.log +20 -0
  107. package/examples/saucedemo/.waygraph-auto/2ceccd6d.log +0 -0
  108. package/examples/saucedemo/.waygraph-auto/2f1b0c13.log +6 -0
  109. package/examples/saucedemo/.waygraph-auto/2f8d4073.log +6 -0
  110. package/examples/saucedemo/.waygraph-auto/30739278.log +6 -0
  111. package/examples/saucedemo/.waygraph-auto/31cb2e80.log +0 -0
  112. package/examples/saucedemo/.waygraph-auto/322d63cd.log +0 -0
  113. package/examples/saucedemo/.waygraph-auto/3239aa8a.log +6 -0
  114. package/examples/saucedemo/.waygraph-auto/326d87b7.log +6 -0
  115. package/examples/saucedemo/.waygraph-auto/3351c0b6.log +0 -0
  116. package/examples/saucedemo/.waygraph-auto/33df0770.log +0 -0
  117. package/examples/saucedemo/.waygraph-auto/340d624d.log +0 -0
  118. package/examples/saucedemo/.waygraph-auto/36367ccf.log +0 -0
  119. package/examples/saucedemo/.waygraph-auto/372536a5.log +6 -0
  120. package/examples/saucedemo/.waygraph-auto/3a412f3c.log +0 -0
  121. package/examples/saucedemo/.waygraph-auto/3a859bd7.log +0 -0
  122. package/examples/saucedemo/.waygraph-auto/3cb0add7.log +0 -0
  123. package/examples/saucedemo/.waygraph-auto/3e42f0d8.log +0 -0
  124. package/examples/saucedemo/.waygraph-auto/4144071d.log +0 -0
  125. package/examples/saucedemo/.waygraph-auto/4176a3c6.log +0 -0
  126. package/examples/saucedemo/.waygraph-auto/41d0793d.log +4 -0
  127. package/examples/saucedemo/.waygraph-auto/424b4d5d.log +0 -0
  128. package/examples/saucedemo/.waygraph-auto/43253aba.log +0 -0
  129. package/examples/saucedemo/.waygraph-auto/438c6c53.log +22 -0
  130. package/examples/saucedemo/.waygraph-auto/4477db12.log +0 -0
  131. package/examples/saucedemo/.waygraph-auto/4a1258b7.log +0 -0
  132. package/examples/saucedemo/.waygraph-auto/4adcd179.log +20 -0
  133. package/examples/saucedemo/.waygraph-auto/4c9d9b16.log +21 -0
  134. package/examples/saucedemo/.waygraph-auto/4da39c36.log +6 -0
  135. package/examples/saucedemo/.waygraph-auto/4dbefa7e.log +5 -0
  136. package/examples/saucedemo/.waygraph-auto/4efa7035.log +6 -0
  137. package/examples/saucedemo/.waygraph-auto/505affdc.log +4 -0
  138. package/examples/saucedemo/.waygraph-auto/51bcb60a.log +0 -0
  139. package/examples/saucedemo/.waygraph-auto/5291bc78.log +22 -0
  140. package/examples/saucedemo/.waygraph-auto/54274c39.log +5 -0
  141. package/examples/saucedemo/.waygraph-auto/5440ce7e.log +0 -0
  142. package/examples/saucedemo/.waygraph-auto/5738175f.log +22 -0
  143. package/examples/saucedemo/.waygraph-auto/57ce5643.log +22 -0
  144. package/examples/saucedemo/.waygraph-auto/5984426b.log +6 -0
  145. package/examples/saucedemo/.waygraph-auto/5a682e7c.log +22 -0
  146. package/examples/saucedemo/.waygraph-auto/5b79320c.log +21 -0
  147. package/examples/saucedemo/.waygraph-auto/5c55aaac.log +21 -0
  148. package/examples/saucedemo/.waygraph-auto/5ed00b16.log +4 -0
  149. package/examples/saucedemo/.waygraph-auto/60b9c066.log +6 -0
  150. package/examples/saucedemo/.waygraph-auto/610dd127.log +0 -0
  151. package/examples/saucedemo/.waygraph-auto/61105500.log +5 -0
  152. package/examples/saucedemo/.waygraph-auto/6134afe8.log +20 -0
  153. package/examples/saucedemo/.waygraph-auto/62a0bdc9.log +22 -0
  154. package/examples/saucedemo/.waygraph-auto/6376fc15.log +0 -0
  155. package/examples/saucedemo/.waygraph-auto/6599cbca.log +22 -0
  156. package/examples/saucedemo/.waygraph-auto/67aaca30.log +0 -0
  157. package/examples/saucedemo/.waygraph-auto/68b10298.log +0 -0
  158. package/examples/saucedemo/.waygraph-auto/68be5e12.log +0 -0
  159. package/examples/saucedemo/.waygraph-auto/68df05a6.log +22 -0
  160. package/examples/saucedemo/.waygraph-auto/693f67c4.log +20 -0
  161. package/examples/saucedemo/.waygraph-auto/69ae030a.log +6 -0
  162. package/examples/saucedemo/.waygraph-auto/69e73f35.log +6 -0
  163. package/examples/saucedemo/.waygraph-auto/6b2333b0.log +5 -0
  164. package/examples/saucedemo/.waygraph-auto/6c4c3817.log +0 -0
  165. package/examples/saucedemo/.waygraph-auto/6c954911.log +0 -0
  166. package/examples/saucedemo/.waygraph-auto/6d65a439.log +5 -0
  167. package/examples/saucedemo/.waygraph-auto/6d700055.log +0 -0
  168. package/examples/saucedemo/.waygraph-auto/6ead848f.log +0 -0
  169. package/examples/saucedemo/.waygraph-auto/72675b2d.log +6 -0
  170. package/examples/saucedemo/.waygraph-auto/733dd260.log +5 -0
  171. package/examples/saucedemo/.waygraph-auto/75016486.log +0 -0
  172. package/examples/saucedemo/.waygraph-auto/752b01c6.log +22 -0
  173. package/examples/saucedemo/.waygraph-auto/75675227.log +6 -0
  174. package/examples/saucedemo/.waygraph-auto/75e2e658.log +0 -0
  175. package/examples/saucedemo/.waygraph-auto/76ac1a86.log +0 -0
  176. package/examples/saucedemo/.waygraph-auto/77605295.log +0 -0
  177. package/examples/saucedemo/.waygraph-auto/792671f4.log +22 -0
  178. package/examples/saucedemo/.waygraph-auto/79915adb.log +20 -0
  179. package/examples/saucedemo/.waygraph-auto/7a398774.log +6 -0
  180. package/examples/saucedemo/.waygraph-auto/7a72f66e.log +6 -0
  181. package/examples/saucedemo/.waygraph-auto/7a984334.log +4 -0
  182. package/examples/saucedemo/.waygraph-auto/7c6ee793.log +20 -0
  183. package/examples/saucedemo/.waygraph-auto/7c726dc4.log +22 -0
  184. package/examples/saucedemo/.waygraph-auto/7c72e8a5.log +4 -0
  185. package/examples/saucedemo/.waygraph-auto/7dbee625.log +22 -0
  186. package/examples/saucedemo/.waygraph-auto/7df66956.log +0 -0
  187. package/examples/saucedemo/.waygraph-auto/7e053160.log +0 -0
  188. package/examples/saucedemo/.waygraph-auto/802a0b5b.log +0 -0
  189. package/examples/saucedemo/.waygraph-auto/80322e0b.log +0 -0
  190. package/examples/saucedemo/.waygraph-auto/80a4978e.log +6 -0
  191. package/examples/saucedemo/.waygraph-auto/81cfe480.log +22 -0
  192. package/examples/saucedemo/.waygraph-auto/832f5add.log +0 -0
  193. package/examples/saucedemo/.waygraph-auto/8337b6ad.log +0 -0
  194. package/examples/saucedemo/.waygraph-auto/8493928e.log +0 -0
  195. package/examples/saucedemo/.waygraph-auto/853bde43.log +0 -0
  196. package/examples/saucedemo/.waygraph-auto/86350ea6.log +22 -0
  197. package/examples/saucedemo/.waygraph-auto/86bb598a.log +0 -0
  198. package/examples/saucedemo/.waygraph-auto/86d09876.log +22 -0
  199. package/examples/saucedemo/.waygraph-auto/878ad01b.log +4 -0
  200. package/examples/saucedemo/.waygraph-auto/87c88ba5.log +0 -0
  201. package/examples/saucedemo/.waygraph-auto/87cb80ff.log +0 -0
  202. package/examples/saucedemo/.waygraph-auto/880b2e78.log +6 -0
  203. package/examples/saucedemo/.waygraph-auto/88527936.log +5 -0
  204. package/examples/saucedemo/.waygraph-auto/893023ea.log +5 -0
  205. package/examples/saucedemo/.waygraph-auto/89416718.log +0 -0
  206. package/examples/saucedemo/.waygraph-auto/8996a857.log +6 -0
  207. package/examples/saucedemo/.waygraph-auto/8a64ba0f.log +6 -0
  208. package/examples/saucedemo/.waygraph-auto/8b1cc2aa.log +6 -0
  209. package/examples/saucedemo/.waygraph-auto/8b73d13e.log +6 -0
  210. package/examples/saucedemo/.waygraph-auto/8d9e5cd2.log +21 -0
  211. package/examples/saucedemo/.waygraph-auto/8ec7d260.log +0 -0
  212. package/examples/saucedemo/.waygraph-auto/8ed43279.log +0 -0
  213. package/examples/saucedemo/.waygraph-auto/93acae32.log +5 -0
  214. package/examples/saucedemo/.waygraph-auto/96321a08.log +0 -0
  215. package/examples/saucedemo/.waygraph-auto/9742b6c2.log +6 -0
  216. package/examples/saucedemo/.waygraph-auto/99cc93eb.log +6 -0
  217. package/examples/saucedemo/.waygraph-auto/9cbfbedc.log +0 -0
  218. package/examples/saucedemo/.waygraph-auto/9dc147d2.log +22 -0
  219. package/examples/saucedemo/.waygraph-auto/a215a395.log +22 -0
  220. package/examples/saucedemo/.waygraph-auto/a23b7086.log +4 -0
  221. package/examples/saucedemo/.waygraph-auto/a35bd5ec.log +0 -0
  222. package/examples/saucedemo/.waygraph-auto/a68995e9.log +22 -0
  223. package/examples/saucedemo/.waygraph-auto/a6e4f936.log +22 -0
  224. package/examples/saucedemo/.waygraph-auto/a7da862b.log +0 -0
  225. package/examples/saucedemo/.waygraph-auto/a82e2a48.log +0 -0
  226. package/examples/saucedemo/.waygraph-auto/a952eb91.log +0 -0
  227. package/examples/saucedemo/.waygraph-auto/a9559653.log +5 -0
  228. package/examples/saucedemo/.waygraph-auto/aa478de2.log +0 -0
  229. package/examples/saucedemo/.waygraph-auto/ac350fc7.log +20 -0
  230. package/examples/saucedemo/.waygraph-auto/acc1b63a.log +0 -0
  231. package/examples/saucedemo/.waygraph-auto/ad12d191.log +0 -0
  232. package/examples/saucedemo/.waygraph-auto/b04638f4.log +6 -0
  233. package/examples/saucedemo/.waygraph-auto/b48863e5.log +22 -0
  234. package/examples/saucedemo/.waygraph-auto/b56968e1.log +6 -0
  235. package/examples/saucedemo/.waygraph-auto/b64e0620.log +20 -0
  236. package/examples/saucedemo/.waygraph-auto/b86a6218.log +6 -0
  237. package/examples/saucedemo/.waygraph-auto/b8e9e956.log +22 -0
  238. package/examples/saucedemo/.waygraph-auto/b9b310ff.log +21 -0
  239. package/examples/saucedemo/.waygraph-auto/bc111745.log +22 -0
  240. package/examples/saucedemo/.waygraph-auto/bf7a77a2.log +0 -0
  241. package/examples/saucedemo/.waygraph-auto/c0d6f353.log +21 -0
  242. package/examples/saucedemo/.waygraph-auto/c0febcf2.log +20 -0
  243. package/examples/saucedemo/.waygraph-auto/c4c52998.log +6 -0
  244. package/examples/saucedemo/.waygraph-auto/c809ceb4.log +22 -0
  245. package/examples/saucedemo/.waygraph-auto/ca6de7e7.log +0 -0
  246. package/examples/saucedemo/.waygraph-auto/ca8561bc.log +0 -0
  247. package/examples/saucedemo/.waygraph-auto/cb86d45b.log +0 -0
  248. package/examples/saucedemo/.waygraph-auto/cb9a1978.log +6 -0
  249. package/examples/saucedemo/.waygraph-auto/cbbc689c.log +6 -0
  250. package/examples/saucedemo/.waygraph-auto/cd88364b.log +0 -0
  251. package/examples/saucedemo/.waygraph-auto/cd919e1d.log +0 -0
  252. package/examples/saucedemo/.waygraph-auto/cfff9eef.log +20 -0
  253. package/examples/saucedemo/.waygraph-auto/d0f59b21.log +4 -0
  254. package/examples/saucedemo/.waygraph-auto/d1195079.log +20 -0
  255. package/examples/saucedemo/.waygraph-auto/d2ef067a.log +5 -0
  256. package/examples/saucedemo/.waygraph-auto/d425471f.log +6 -0
  257. package/examples/saucedemo/.waygraph-auto/d5293921.log +0 -0
  258. package/examples/saucedemo/.waygraph-auto/d62a22c2.log +21 -0
  259. package/examples/saucedemo/.waygraph-auto/d6d1761f.log +22 -0
  260. package/examples/saucedemo/.waygraph-auto/d6d5f411.log +22 -0
  261. package/examples/saucedemo/.waygraph-auto/d6df2771.log +6 -0
  262. package/examples/saucedemo/.waygraph-auto/d7075012.log +21 -0
  263. package/examples/saucedemo/.waygraph-auto/d9ddc297.log +0 -0
  264. package/examples/saucedemo/.waygraph-auto/db4ac845.log +0 -0
  265. package/examples/saucedemo/.waygraph-auto/db6d7774.log +0 -0
  266. package/examples/saucedemo/.waygraph-auto/db839827.log +5 -0
  267. package/examples/saucedemo/.waygraph-auto/dde5e859.log +22 -0
  268. package/examples/saucedemo/.waygraph-auto/de8cac58.log +0 -0
  269. package/examples/saucedemo/.waygraph-auto/dedfcb18.log +0 -0
  270. package/examples/saucedemo/.waygraph-auto/def4d9b1.log +0 -0
  271. package/examples/saucedemo/.waygraph-auto/e1549e40.log +0 -0
  272. package/examples/saucedemo/.waygraph-auto/e1b0676d.log +21 -0
  273. package/examples/saucedemo/.waygraph-auto/e5111463.log +0 -0
  274. package/examples/saucedemo/.waygraph-auto/e5fc1d7c.log +5 -0
  275. package/examples/saucedemo/.waygraph-auto/e6fd2202.log +0 -0
  276. package/examples/saucedemo/.waygraph-auto/edaa806d.log +0 -0
  277. package/examples/saucedemo/.waygraph-auto/edaf33de.log +0 -0
  278. package/examples/saucedemo/.waygraph-auto/edd40cbb.log +20 -0
  279. package/examples/saucedemo/.waygraph-auto/eddfbffc.log +6 -0
  280. package/examples/saucedemo/.waygraph-auto/ee9fa1ad.log +5 -0
  281. package/examples/saucedemo/.waygraph-auto/ef319474.log +22 -0
  282. package/examples/saucedemo/.waygraph-auto/f28eee8d.log +0 -0
  283. package/examples/saucedemo/.waygraph-auto/f33bde90.log +0 -0
  284. package/examples/saucedemo/.waygraph-auto/f6ba7cb4.log +6 -0
  285. package/examples/saucedemo/.waygraph-auto/f7ac4d62.log +20 -0
  286. package/examples/saucedemo/.waygraph-auto/f929bb79.log +0 -0
  287. package/examples/saucedemo/.waygraph-auto/f92d4c6c.log +22 -0
  288. package/examples/saucedemo/.waygraph-auto/f92faf40.log +5 -0
  289. package/examples/saucedemo/.waygraph-auto/fa784369.log +21 -0
  290. package/examples/saucedemo/.waygraph-auto/fb55f723.log +20 -0
  291. package/examples/saucedemo/.waygraph-auto/fba3b738.log +0 -0
  292. package/examples/saucedemo/.waygraph-auto/ffdf2854.log +6 -0
  293. package/examples/saucedemo/README.md +13 -2
  294. package/examples/saucedemo/package.json +4 -0
  295. package/examples/saucedemo/src/flows/api-demo.flow.ts +37 -0
  296. package/examples/saucedemo/src/flows/checkout.flow.ts +34 -11
  297. package/package.json +5 -3
  298. package/dist/auto-explore-run.d.ts +0 -37
  299. package/dist/auto-explore-run.js +0 -670
  300. package/dist/auto-explore.d.ts +0 -57
  301. package/dist/auto-explore.js +0 -376
  302. package/dist/auto-session-ipc.d.ts +0 -150
  303. package/dist/auto-session-ipc.js +0 -497
  304. package/dist/block-inject.d.ts +0 -15
  305. package/dist/block-inject.js +0 -91
  306. package/dist/browser.d.ts +0 -15
  307. package/dist/browser.js +0 -29
  308. package/dist/coverage-gap.d.ts +0 -11
  309. package/dist/coverage-gap.js +0 -119
  310. package/dist/engine.d.ts +0 -12
  311. package/dist/engine.js +0 -13
  312. package/dist/graph.d.ts +0 -92
  313. package/dist/graph.js +0 -467
  314. package/dist/highlight-shorthand.d.ts +0 -24
  315. package/dist/highlight-shorthand.js +0 -30
  316. package/dist/map-check.d.ts +0 -18
  317. package/dist/map-check.js +0 -140
  318. package/dist/overlay-beacon.d.ts +0 -44
  319. package/dist/overlay-beacon.js +0 -85
  320. package/dist/pilot.d.ts +0 -54
  321. package/dist/pilot.js +0 -80
  322. package/dist/practices-check.d.ts +0 -14
  323. package/dist/practices-check.js +0 -195
  324. package/dist/traverse-coverage.d.ts +0 -59
  325. package/dist/traverse-coverage.js +0 -127
  326. package/dist/traverse-lease.d.ts +0 -18
  327. package/dist/traverse-lease.js +0 -62
  328. package/dist/traverse-run.d.ts +0 -47
  329. package/dist/traverse-run.js +0 -439
  330. package/dist/ui/compose.d.ts +0 -4
  331. package/dist/ui/compose.js +0 -7
  332. /package/dist/{verbose-log.d.ts → auto-session/verbose-log.d.ts} +0 -0
  333. /package/dist/{verbose-log.js → auto-session/verbose-log.js} +0 -0
  334. /package/dist/{agent-dive.d.ts → commands/agent-dive-scaffold.d.ts} +0 -0
  335. /package/dist/{engine/core.d.ts → core/block.d.ts} +0 -0
  336. /package/dist/{engine → core}/blocks/nav.d.ts +0 -0
  337. /package/dist/{engine → core}/blocks/page.d.ts +0 -0
  338. /package/dist/{engine → core}/branch-regression.d.ts +0 -0
  339. /package/dist/{engine → core}/compose.d.ts +0 -0
  340. /package/dist/{engine → core}/config.d.ts +0 -0
  341. /package/dist/{engine → core}/config.js +0 -0
  342. /package/dist/{engine → core}/flow.d.ts +0 -0
  343. /package/dist/{engine → core}/locate.d.ts +0 -0
  344. /package/dist/{engine → core}/locate.js +0 -0
  345. /package/dist/{engine → core}/run-graph.d.ts +0 -0
@@ -1,6 +1,7 @@
1
1
  // Split out of the former 950-line pilot-overlay.ts (see src/ARCHITECTURE.md). Behavior unchanged.
2
2
  import { buildTodoDock, formatHighlightCaption, normalizeHighlightSize, normalizeHighlightTone, normalizeHighlightWeight, resolveDeviceState, resolveTodoDockUi } from "../highlights.js";
3
3
  import { ensureInstalled } from "./shell.js";
4
+ import { verboseLog } from "../auto-session/verbose-log.js";
4
5
  /**
5
6
  * Paint (or clear) agent-authored highlight fixtures on the live page.
6
7
  * Multi-ring + optional todo strip + zoom/focus/device - the Pilot equivalent
@@ -117,8 +118,34 @@ export async function showPilotFixtures(page, fixtures) {
117
118
  })
118
119
  .catch(() => { });
119
120
  }
121
+ // Resolve every ring's box (and the zoom target, if any) through Playwright's own locator, not a
122
+ // selector string handed to the page for a raw DOM querySelector to fail silently on - >>
123
+ // piercing / :has-text() / :visible are Playwright-only selector syntax. "Prefer live in-page
124
+ // rect (honors device-shell scale)" still holds: .evaluate() runs the callback bound to the
125
+ // resolved element, in the page's own real JS context, same as before - only the RESOLUTION
126
+ // step moved from an in-page querySelector to Playwright's full selector engine. count() gate:
127
+ // Locator.evaluate() has no timeout option and auto-waits ~30s for a match to appear - count()
128
+ // never waits, so a genuinely-missing selector (a real, expected case - see `missing` below)
129
+ // still resolves immediately instead of hanging.
130
+ const ringBoxes = await Promise.all(rings.map(async (r) => {
131
+ const loc = page.locator(r.selector).first();
132
+ if ((await loc.count().catch(() => 0)) === 0)
133
+ return null;
134
+ return loc
135
+ .evaluate((el) => {
136
+ const rect = el.getBoundingClientRect();
137
+ if (rect.width === 0 && rect.height === 0)
138
+ return null;
139
+ return { x: rect.left, y: rect.top, width: rect.width, height: rect.height };
140
+ })
141
+ .catch(() => null);
142
+ }));
143
+ const resolvedZoomSelector = zoomSelector ?? "";
144
+ const zoomHandle = zoom > 1.001 && resolvedZoomSelector
145
+ ? await page.locator(resolvedZoomSelector).first().elementHandle({ timeout: 100 }).catch(() => null)
146
+ : null;
120
147
  return page
121
- .evaluate(({ rings, todoGroups, todoPos, holdMs, zoom, zoomSelector, zoomOut, clearAll, todoUi, }) => {
148
+ .evaluate(({ rings, ringBoxes, todoGroups, todoPos, holdMs, zoom, zoomSelector, zoomEl, zoomOut, clearAll, todoUi, }) => {
122
149
  const w = window;
123
150
  if (w.__wgPilotFxHideTimer)
124
151
  clearTimeout(w.__wgPilotFxHideTimer);
@@ -193,17 +220,11 @@ export async function showPilotFixtures(page, fixtures) {
193
220
  // (window.__wgPaintRingAt, installed by runner/inpage/core.js's installCore - see
194
221
  // ensureInstalled) - one ring implementation, not a separate DOM-building copy here.
195
222
  rings.forEach((ring, i) => {
196
- const el = document.querySelector(ring.selector);
197
- if (!el) {
198
- missing.push(ring.selector);
199
- return;
200
- }
201
- const rect = el.getBoundingClientRect();
202
- if (rect.width === 0 && rect.height === 0) {
223
+ const box = ringBoxes[i];
224
+ if (!box) {
203
225
  missing.push(ring.selector);
204
226
  return;
205
227
  }
206
- const box = { x: rect.left, y: rect.top, width: rect.width, height: rect.height };
207
228
  const ringId = `wg-fx-ring-${i}`;
208
229
  const labelId = `wg-fx-ring-${i}-label`;
209
230
  if (window.__wgPaintRingAt) {
@@ -294,7 +315,7 @@ export async function showPilotFixtures(page, fixtures) {
294
315
  }
295
316
  }
296
317
  if (zoom > 1.001 && zoomSelector) {
297
- const target = document.querySelector(zoomSelector);
318
+ const target = zoomEl;
298
319
  if (target) {
299
320
  target.scrollIntoView({
300
321
  block: "center",
@@ -322,14 +343,25 @@ export async function showPilotFixtures(page, fixtures) {
322
343
  return { painted, missing };
323
344
  }, {
324
345
  rings,
346
+ ringBoxes,
325
347
  todoGroups,
326
348
  todoPos,
327
349
  holdMs,
328
350
  zoom,
329
351
  zoomSelector: zoomSelector ?? "",
352
+ zoomEl: zoomHandle,
330
353
  zoomOut,
331
354
  clearAll: fixtures.clear === true,
332
355
  todoUi,
356
+ })
357
+ .then((result) => {
358
+ // Debuggability: a demo/pilot run is a sequential list of steps - when a ring silently
359
+ // doesn't render, "where in the flow" and "which selector" are exactly what's needed to fix
360
+ // it, not a quiet no-op. See rings.js/slides.js/teardown.js for the same fix, same reason.
361
+ for (const sel of result.missing) {
362
+ verboseLog("pilot", `ring not painted - selector matched nothing (or a zero-size element): ${sel}`);
363
+ }
364
+ return result;
333
365
  })
334
366
  .catch(() => ({ painted: 0, missing: rings.map((r) => r.selector) }));
335
367
  }
@@ -1,6 +1,7 @@
1
1
  // Split out of the former 950-line pilot-overlay.ts (see src/ARCHITECTURE.md). Behavior unchanged.
2
2
  import { SURFACE } from "../ui/tokens.js";
3
3
  import { ensureShadowRoot, installShadowRoot } from "../ui/shadow.js";
4
+ import { verboseLog } from "../auto-session/verbose-log.js";
4
5
  // Real, direct user request: this overlay's own colors were an improvised
5
6
  // purple/white scheme (#a78bfa / #1a1033) that didn't match anything else -
6
7
  // "our design here seems like barely shares with the ui on the stepper
@@ -216,8 +217,26 @@ export async function showPilotActivity(page, text) {
216
217
  */
217
218
  export async function showPilotVision(page, selector, label, tone = "auto") {
218
219
  await ensureInstalled(page);
220
+ // Resolved through Playwright's own locator (>> piercing / :has-text() / :visible support), not
221
+ // a raw querySelector string - see rings.js's showRing for the same fix, same reason. count()
222
+ // gate: Locator.evaluate() has no timeout option and auto-waits ~30s for a match to appear -
223
+ // count() never waits, keeping this an immediate "does it exist right now" check.
224
+ const visionLoc = page.locator(selector).first();
225
+ const box = (await visionLoc.count().catch(() => 0)) > 0
226
+ ? await visionLoc
227
+ .evaluate((el) => {
228
+ const rect = el.getBoundingClientRect();
229
+ if (rect.width === 0 && rect.height === 0)
230
+ return null;
231
+ return { left: rect.left, top: rect.top, width: rect.width, height: rect.height };
232
+ })
233
+ .catch(() => null)
234
+ : null;
235
+ if (!box) {
236
+ verboseLog("pilot", `vision ring not painted - selector matched nothing (or a zero-size element): ${selector}`);
237
+ }
219
238
  await page
220
- .evaluate(({ selector, label, tone }) => {
239
+ .evaluate(({ box, label, tone }) => {
221
240
  const ring = __wgById("wg-ring");
222
241
  const tag = __wgById("wg-ring-label");
223
242
  if (!ring || !tag)
@@ -225,18 +244,12 @@ export async function showPilotVision(page, selector, label, tone = "auto") {
225
244
  const w = window;
226
245
  if (w.__wgVisionHideTimer)
227
246
  clearTimeout(w.__wgVisionHideTimer);
228
- const el = document.querySelector(selector);
229
- if (!el) {
230
- ring.style.opacity = "0";
231
- tag.style.opacity = "0";
232
- return;
233
- }
234
- const rect = el.getBoundingClientRect();
235
- if (rect.width === 0 && rect.height === 0) {
247
+ if (!box) {
236
248
  ring.style.opacity = "0";
237
249
  tag.style.opacity = "0";
238
250
  return;
239
251
  }
252
+ const rect = box;
240
253
  ring.dataset.tone = tone;
241
254
  ring.dataset.size = "md";
242
255
  tag.dataset.tone = tone;
@@ -262,6 +275,6 @@ export async function showPilotVision(page, selector, label, tone = "auto") {
262
275
  ring.style.opacity = "0";
263
276
  tag.style.opacity = "0";
264
277
  }, 4_000);
265
- }, { selector, label, tone })
278
+ }, { box, label, tone })
266
279
  .catch(() => { });
267
280
  }
@@ -9,6 +9,7 @@ export function bannerUiFromPhase(phase) {
9
9
  if (phase && phase.bannerUi) {
10
10
  if (phase.bannerUi.collision !== undefined) ui.collision = !!phase.bannerUi.collision;
11
11
  if (phase.bannerUi.hidden !== undefined) ui.hidden = !!phase.bannerUi.hidden;
12
+ if (phase.bannerUi.captionFadeMs !== undefined) ui.captionFadeMs = Number(phase.bannerUi.captionFadeMs);
12
13
  }
13
14
  return ui;
14
15
  }
@@ -242,6 +242,21 @@ export async function applyDeviceToPage(page, device, sync) {
242
242
  } catch {
243
243
  from = null;
244
244
  }
245
+ // Non-headless (no --video) used to literally resize the real OS browser window/viewport to
246
+ // each device's pixel size - a real, confirmed complaint: it didn't look like the same animated
247
+ // device-shell bezel the --video path already has, just a plain resize. Both now use the exact
248
+ // same applyVideoDeviceStage bezel technique - the "stage" (the fixed outer viewport the shell is
249
+ // centered within) is the recordVideo canvas size when recording, or the window's own size at
250
+ // the FIRST device switch when not (captured once, persisted on the page - the window itself is
251
+ // only really resized that one time, to establish a stable stage; every device switch after that
252
+ // paints the animated shell inside it instead of resizing the window again).
253
+ let establishingHeadedStage = false;
254
+ if (!videoStage && !page.__wgHeadedStage) {
255
+ page.__wgHeadedStage =
256
+ from && from.width > 0 && from.height > 0 ? { width: from.width, height: from.height } : { width: 1280, height: 720 };
257
+ establishingHeadedStage = true;
258
+ }
259
+ const stage = videoStage || page.__wgHeadedStage;
245
260
  const announce = mode === "set" || mode === "clear";
246
261
  const toDesktop =
247
262
  mode === "clear" || (d.preset === "desktop" && !d.touchMode);
@@ -275,13 +290,18 @@ export async function applyDeviceToPage(page, device, sync) {
275
290
  page.__wgDeviceOrient = nextOrient;
276
291
  page.__wgDevicePreset = toDesktop ? "desktop" : d.preset || "";
277
292
 
278
- if (videoStage) {
279
- // Lock Playwright viewport to the recordVideo size so frames fill the
280
- // .webm; center the device shell inside (OS window centering alone does not).
281
- // Do NOT fitWindow to the device size - that shrinks the viewport below the
282
- // recordVideo canvas and Playwright pads the .webm with grey (top-left bias).
293
+ if (stage) {
294
+ // Lock the Playwright viewport to the stage size so frames/window fill it; center the device
295
+ // shell inside (OS window centering alone does not). Do NOT fitWindow to the device size -
296
+ // that shrinks the viewport below the stage and (when recording) pads the .webm with grey
297
+ // (top-left bias). Headed-without-video reuses this exact technique (see `stage`'s own
298
+ // comment above) - the real OS window is only ever resized once, right here, to establish the
299
+ // stage itself; every device switch after that paints the animated shell inside it instead.
300
+ if (!videoStage && establishingHeadedStage) {
301
+ await fitWindowToDeviceViewport(page, stage, { maximize: false }).catch(() => {});
302
+ }
283
303
  try {
284
- await realSet(videoStage);
304
+ await realSet(stage);
285
305
  } catch {
286
306
  /* ignore */
287
307
  }
@@ -290,22 +310,22 @@ export async function applyDeviceToPage(page, device, sync) {
290
310
  // Zoom already cleared above. Full-bleed desktop shell (no matte frame).
291
311
  // Shutter-out: soft rounded -> radius 0, then flat edge-to-edge.
292
312
  const desk = {
293
- width: videoStage.width,
294
- height: videoStage.height,
313
+ width: stage.width,
314
+ height: stage.height,
295
315
  };
296
316
  page.__wgDeviceShell = { ...desk };
297
- await applyVideoDeviceStage(page, desk, videoStage, {
317
+ await applyVideoDeviceStage(page, desk, stage, {
298
318
  clear: false,
299
319
  shutterOut: true,
300
320
  desktopFlat: true,
301
321
  });
302
322
  try {
303
- await realSet(videoStage);
323
+ await realSet(stage);
304
324
  } catch {
305
325
  /* ignore */
306
326
  }
307
327
  } else {
308
- // Lerp shell size when switching mobile <-> tablet mid-video.
328
+ // Lerp shell size when switching mobile <-> tablet mid-run.
309
329
  const firstDevice = !page.__wgDeviceShell;
310
330
  if (
311
331
  announce &&
@@ -322,22 +342,22 @@ export async function applyDeviceToPage(page, device, sync) {
322
342
  width: Math.round(shellFrom.width + (target.width - shellFrom.width) * e),
323
343
  height: Math.round(shellFrom.height + (target.height - shellFrom.height) * e),
324
344
  };
325
- await applyVideoDeviceStage(page, mid, videoStage, {
345
+ await applyVideoDeviceStage(page, mid, stage, {
326
346
  clear: false,
327
347
  enterIn: i === 1 && firstDevice,
328
348
  });
329
349
  if (i < steps) await new Promise((r) => setTimeout(r, stepMs));
330
350
  }
331
351
  } else {
332
- await applyVideoDeviceStage(page, target, videoStage, {
352
+ await applyVideoDeviceStage(page, target, stage, {
333
353
  clear: false,
334
354
  enterIn: firstDevice || announce,
335
355
  });
336
356
  }
337
357
  page.__wgDeviceShell = { ...target };
338
- // Re-assert stage size after any prior non-video fitWindow.
358
+ // Re-assert stage size after any prior fitWindow.
339
359
  try {
340
- await realSet(videoStage);
360
+ await realSet(stage);
341
361
  } catch {
342
362
  /* ignore */
343
363
  }
@@ -8,6 +8,14 @@ export function installBanner(args: {
8
8
  todoPos?: string | undefined;
9
9
  envAutoplay?: boolean | undefined;
10
10
  todoDockUi?: unknown;
11
- bannerUi?: { hidden?: boolean | undefined; collision?: boolean | undefined; pos?: string | undefined } | undefined;
11
+ bannerUi?:
12
+ | {
13
+ hidden?: boolean | undefined;
14
+ collision?: boolean | undefined;
15
+ pos?: string | undefined;
16
+ /** Title-change fade duration in ms (default 220); 0 = instant swap, no fade. */
17
+ captionFadeMs?: number | undefined;
18
+ }
19
+ | undefined;
12
20
  tag?: string | undefined;
13
21
  }): void;
@@ -43,14 +43,31 @@ export function installBanner({ title, favicon, bannerPos, todoPos, envAutoplay,
43
43
  __wgAdd(banner);
44
44
  } else {
45
45
  // Fixture / episode title changes every step - update in place
46
- // (banner is created once; do not leave the first step's text stuck).
46
+ // (banner is created once; do not leave the first step's text stuck). Fades out/in
47
+ // instead of an instant swap, so a title change reads as a deliberate beat, not a
48
+ // flicker - opt-out (or re-tune) via bannerUi.captionFadeMs, 0 = instant.
47
49
  let text = banner.querySelector(".wg-banner-text");
48
50
  if (!text) {
49
51
  text = document.createElement("span");
50
52
  text.className = "wg-banner-text";
51
53
  banner.appendChild(text);
52
54
  }
53
- text.textContent = title;
55
+ if (text.textContent !== title) {
56
+ const fadeMs =
57
+ bannerUi && Number.isFinite(Number(bannerUi.captionFadeMs))
58
+ ? Math.max(0, Number(bannerUi.captionFadeMs))
59
+ : 220;
60
+ if (fadeMs <= 0 || !text.textContent) {
61
+ text.textContent = title;
62
+ } else {
63
+ text.style.transition = "opacity " + fadeMs + "ms ease";
64
+ text.style.opacity = "0";
65
+ setTimeout(() => {
66
+ text.textContent = title;
67
+ text.style.opacity = "1";
68
+ }, fadeMs);
69
+ }
70
+ }
54
71
  }
55
72
  }
56
73
  // Authored banner UX (StubCtx.titlePos / bannerUi): applied every step, wins over click/env.
@@ -107,6 +124,14 @@ export function installBanner({ title, favicon, bannerPos, todoPos, envAutoplay,
107
124
  if (b.dataset.home) b.dataset.pos = b.dataset.home;
108
125
  delete b.dataset.moved;
109
126
  };
127
+ // Dim the banner while a ring caption is the focus - same "auto opacity" effect the todo
128
+ // dock already has via __wgTodosSetBehind, extended to the banner so both floating chrome
129
+ // pieces step back the same way instead of only one of them fading.
130
+ window.__wgBannerSetBehind = (on) => {
131
+ const b = __wgById("wg-banner");
132
+ if (!b) return;
133
+ b.classList.toggle("wg-banner-behind", !!on);
134
+ };
110
135
  // Tab title/favicon: a real navigation resets document.title and any
111
136
  // <link rel="icon"> the new document brings, so re-check (not
112
137
  // re-append) on every call instead of a one-time flag.
@@ -0,0 +1,3 @@
1
+ /** In-page installer (page.evaluate target) - see caption.js's own header. */
2
+ export function showCaption(text: string): void;
3
+ export function hideCaption(): void;
@@ -0,0 +1,23 @@
1
+ // In-page installer (page.evaluate target) - must stay self-contained, no module-scope closure.
2
+ // Bottom subtitle-bar caption, ported from zsign's help-center-clip-engine (see ui/css/caption.css's
3
+ // own header) - same visual fixture, narration-timeline/TTS sync not ported yet.
4
+ export function showCaption(text) {
5
+ let bar = __wgById("wg-caption-bar");
6
+ if (!bar) {
7
+ bar = document.createElement("div");
8
+ bar.id = "wg-caption-bar";
9
+ bar.setAttribute("data-wg-ui", "1");
10
+ const span = document.createElement("span");
11
+ span.className = "wg-caption-text";
12
+ bar.appendChild(span);
13
+ __wgAdd(bar);
14
+ }
15
+ const span = bar.querySelector(".wg-caption-text");
16
+ span.textContent = text;
17
+ bar.classList.add("wg-in");
18
+ }
19
+
20
+ export function hideCaption() {
21
+ const bar = __wgById("wg-caption-bar");
22
+ if (bar) bar.classList.remove("wg-in");
23
+ }
@@ -78,7 +78,25 @@ export function installCore({ title, favicon, bannerPos, todoPos, envAutoplay, t
78
78
  const lh = ringLabel.offsetHeight;
79
79
  let labelLeft = left;
80
80
  let labelTop = top + height + 8;
81
- if (labelTop + lh > vh - margin) labelTop = top - lh - 8;
81
+ const aboveTop = top - lh - 8;
82
+ if (labelTop + lh > vh - margin) {
83
+ labelTop = aboveTop;
84
+ } else {
85
+ // Below the ringed box is often the NEXT form field in a tightly stacked list (e.g.
86
+ // saucedemo's checkout "First Name" / "Last Name" / "Zip" inputs) - a fixed +8px gap
87
+ // has no idea that's there and the label just sits on top of it. Sample a few points
88
+ // under the would-be label and flip above if any land on real page content (not our
89
+ // own ring/label elements, which are the only things expected there otherwise).
90
+ const probe = (x, y) => {
91
+ const el = document.elementFromPoint(x, y);
92
+ return el && el.id !== ringId && el.id !== labelId && !(el.closest && el.closest("#wg-root"));
93
+ };
94
+ const hitsPageContent =
95
+ probe(labelLeft + 2, labelTop + 2) ||
96
+ probe(labelLeft + lw - 2, labelTop + 2) ||
97
+ probe(labelLeft + 2, labelTop + lh - 2);
98
+ if (hitsPageContent && aboveTop >= margin) labelTop = aboveTop;
99
+ }
82
100
  if (labelTop < margin) labelTop = margin;
83
101
  if (labelLeft + lw > vw - margin) labelLeft = Math.max(margin, vw - margin - lw);
84
102
  if (labelLeft < margin) labelLeft = margin;
@@ -136,6 +154,7 @@ export function installCore({ title, favicon, bannerPos, todoPos, envAutoplay, t
136
154
  if (!box) return;
137
155
  window.__wgPaintRingAt("wg-ring", "wg-ring-label", box, label, tone, style);
138
156
  if (window.__wgTodosSetBehind) window.__wgTodosSetBehind(true);
157
+ if (window.__wgBannerSetBehind) window.__wgBannerSetBehind(true);
139
158
  if (window.__wgTodosAvoidRingCollision) window.__wgTodosAvoidRingCollision(box);
140
159
  if (window.__wgBannerAvoidRing) window.__wgBannerAvoidRing(box);
141
160
  };
@@ -188,22 +207,25 @@ export function installCore({ title, favicon, bannerPos, todoPos, envAutoplay, t
188
207
  break;
189
208
  }
190
209
  };
191
- /** Live-follow a selector with rAF (accurate under device shell scale). */
210
+ /** Live-follow a resolved element with rAF (accurate under device shell scale). */
192
211
  window.__wgStopRingFollow = () => {
193
212
  if (window.__wgRingFollowRaf) {
194
213
  cancelAnimationFrame(window.__wgRingFollowRaf);
195
214
  window.__wgRingFollowRaf = 0;
196
215
  }
197
- window.__wgRingFollowSel = "";
216
+ window.__wgRingFollowEl = null;
198
217
  };
199
- window.__wgFollowRing = (sel, label, tone, style, focus) => {
218
+ // `el` is a real DOM element (a Playwright ElementHandle unwrapped by evaluate() - see
219
+ // rings.js's showRing), not a selector string - >> piercing / :has-text() are Playwright's
220
+ // own selector-engine syntax, which document.querySelector has no way to understand, so
221
+ // resolution happens once on the Node side via page.locator(), before this ever runs.
222
+ window.__wgFollowRing = (el, label, tone, style, focus) => {
200
223
  window.__wgStopRingFollow();
201
- if (!sel) return;
202
- window.__wgRingFollowSel = sel;
224
+ if (!el) return;
225
+ window.__wgRingFollowEl = el;
203
226
  const tick = () => {
204
- if (window.__wgRingFollowSel !== sel) return;
205
- const el = document.querySelector(sel);
206
- if (!el) {
227
+ if (window.__wgRingFollowEl !== el) return;
228
+ if (!el.isConnected) {
207
229
  window.__wgRingFollowRaf = requestAnimationFrame(tick);
208
230
  return;
209
231
  }
@@ -244,6 +266,7 @@ export function installCore({ title, favicon, bannerPos, todoPos, envAutoplay, t
244
266
  if (ringLabel) ringLabel.style.opacity = "0";
245
267
  if (window.__wgClearFocus) window.__wgClearFocus();
246
268
  if (window.__wgTodosSetBehind) window.__wgTodosSetBehind(false);
269
+ if (window.__wgBannerSetBehind) window.__wgBannerSetBehind(false);
247
270
  if (window.__wgBannerRestore) window.__wgBannerRestore();
248
271
  window.__wgTodoCollisionLocked = false;
249
272
  __wgQA(".wg-todo-dock[data-tucked], #wg-todo-dock[data-tucked]").forEach((el) => {
@@ -0,0 +1,15 @@
1
+ /** In-page installer (page.evaluate target) - see network.js's own header. */
2
+ export interface NetworkEntry {
3
+ method: string;
4
+ url: string;
5
+ status: number;
6
+ ok: boolean;
7
+ ms?: number | undefined;
8
+ reqHeaders?: Record<string, string> | undefined;
9
+ resHeaders?: Record<string, string> | undefined;
10
+ reqBody?: string | undefined;
11
+ resBody?: string | undefined;
12
+ }
13
+ export function addNetworkEntry(entry: NetworkEntry): void;
14
+ export function setNetworkTabVisible(visible: boolean): void;
15
+ export function clearNetworkLog(): void;