waygraph 0.15.46 → 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.
- package/dist/analysis/graph.js +2 -2
- package/dist/auto-session/session.js +2 -2
- package/dist/cli/discover.d.ts +1 -1
- package/dist/cli/discover.js +1 -1
- package/dist/cli.js +1 -1
- package/dist/{agent-dive.js → commands/agent-dive-scaffold.js} +2 -2
- package/dist/commands/agent-dive.js +1 -1
- package/dist/{engine/core.js → core/block.js} +6 -6
- package/dist/core/blocks/api.d.ts +54 -0
- package/dist/core/blocks/api.js +75 -0
- package/dist/{engine → core}/blocks/effect.d.ts +1 -1
- package/dist/{engine → core}/blocks/effect.js +1 -1
- package/dist/{engine → core}/blocks/method.d.ts +1 -1
- package/dist/{engine → core}/blocks/method.js +1 -1
- package/dist/{engine → core}/blocks/nav.js +1 -1
- package/dist/{engine → core}/blocks/page.js +1 -1
- package/dist/{engine → core}/branch-regression.js +2 -3
- package/dist/{engine → core}/compose.js +4 -4
- package/dist/{engine/engine-class.d.ts → core/engine.d.ts} +2 -133
- package/dist/core/engine.js +50 -0
- package/dist/{engine → core}/flow.js +5 -5
- package/dist/core/map-builder.d.ts +171 -0
- package/dist/{engine/engine-class.js → core/map-builder.js} +82 -98
- package/dist/{engine → core}/run-graph.js +4 -6
- package/dist/core.d.ts +14 -0
- package/dist/core.js +15 -0
- package/dist/errors.d.ts +54 -20
- package/dist/errors.js +67 -20
- package/dist/highlights/run-phase.js +15 -2
- package/dist/highlights/stub-ctx.js +16 -0
- package/dist/highlights/types.d.ts +38 -0
- package/dist/index.d.ts +5 -3
- package/dist/index.js +1 -1
- package/dist/mem-page.js +2 -2
- package/dist/mem-stub.d.ts +1 -1
- package/dist/pilot-overlay/fixtures.js +55 -43
- package/dist/pilot-overlay/shell.js +23 -10
- package/dist/runner/banner-log.js +1 -0
- package/dist/runner/device-stage.js +35 -15
- package/dist/runner/inpage/banner.d.ts +21 -0
- package/dist/runner/inpage/banner.js +29 -4
- package/dist/runner/inpage/caption.d.ts +3 -0
- package/dist/runner/inpage/caption.js +23 -0
- package/dist/runner/inpage/core.js +32 -9
- package/dist/runner/inpage/network.d.ts +15 -0
- package/dist/runner/inpage/network.js +217 -0
- package/dist/runner/inpage/panel-chrome.js +41 -1
- package/dist/runner/inpage/swipe-zoom.js +1 -1
- package/dist/runner/inpage/todos.js +6 -1
- package/dist/runner/main.js +9 -2
- package/dist/runner/network-capture.d.ts +9 -0
- package/dist/runner/network-capture.js +126 -0
- package/dist/runner/overlay-css.js +71 -7
- package/dist/runner/overlay-install.js +39 -2
- package/dist/runner/overlay-stage.js +5 -0
- package/dist/runner/rings.js +69 -45
- package/dist/runner/slides.js +14 -8
- package/dist/runner/step-mode.js +12 -0
- package/dist/runner/step-panels.js +9 -3
- package/dist/runner/teardown.js +16 -9
- package/dist/session/auto-explore-run.d.ts +1 -1
- package/dist/session/auto-explore-run.js +47 -10
- package/dist/{step-overlay.d.ts → session/step-overlay.d.ts} +1 -1
- package/dist/{step-overlay.js → session/step-overlay.js} +1 -1
- package/dist/trait.d.ts +1 -0
- package/dist/trait.js +15 -0
- package/dist/traverse/run.js +1 -1
- package/dist/ui/components/ring.js +4 -2
- package/dist/ui/overlay.css +36 -3
- package/examples/saucedemo/.waygraph-auto/00d147d1.log +21 -0
- package/examples/saucedemo/.waygraph-auto/02f7dd22.log +20 -0
- package/examples/saucedemo/.waygraph-auto/0402cfcf.log +6 -0
- package/examples/saucedemo/.waygraph-auto/062b581f.log +20 -0
- package/examples/saucedemo/.waygraph-auto/0681582b.log +6 -0
- package/examples/saucedemo/.waygraph-auto/07f3e964.log +6 -0
- package/examples/saucedemo/.waygraph-auto/0868ae4d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/0924ddaa.log +22 -0
- package/examples/saucedemo/.waygraph-auto/092d6173.log +5 -0
- package/examples/saucedemo/.waygraph-auto/09924510.log +0 -0
- package/examples/saucedemo/.waygraph-auto/0998c941.log +21 -0
- package/examples/saucedemo/.waygraph-auto/0bf74300.log +21 -0
- package/examples/saucedemo/.waygraph-auto/0c01fd29.log +4 -0
- package/examples/saucedemo/.waygraph-auto/0c302590.log +0 -0
- package/examples/saucedemo/.waygraph-auto/0dee62d6.log +5 -0
- package/examples/saucedemo/.waygraph-auto/0eb4c081.log +5 -0
- package/examples/saucedemo/.waygraph-auto/10fd431c.log +0 -0
- package/examples/saucedemo/.waygraph-auto/13c6fe3c.log +0 -0
- package/examples/saucedemo/.waygraph-auto/1581b677.log +0 -0
- package/examples/saucedemo/.waygraph-auto/164761a5.log +6 -0
- package/examples/saucedemo/.waygraph-auto/1905ceb2.log +0 -0
- package/examples/saucedemo/.waygraph-auto/1b1d55c6.log +0 -0
- package/examples/saucedemo/.waygraph-auto/1b80fd24.log +6 -0
- package/examples/saucedemo/.waygraph-auto/1c30a3c2.log +0 -0
- package/examples/saucedemo/.waygraph-auto/1c58a174.log +0 -0
- package/examples/saucedemo/.waygraph-auto/1d90aa9a.log +0 -0
- package/examples/saucedemo/.waygraph-auto/1de7d889.log +0 -0
- package/examples/saucedemo/.waygraph-auto/1f233a4c.log +6 -0
- package/examples/saucedemo/.waygraph-auto/20e66801.log +0 -0
- package/examples/saucedemo/.waygraph-auto/20ffdb77.log +0 -0
- package/examples/saucedemo/.waygraph-auto/22f1a704.log +5 -0
- package/examples/saucedemo/.waygraph-auto/239cced3.log +20 -0
- package/examples/saucedemo/.waygraph-auto/25204b46.log +4 -0
- package/examples/saucedemo/.waygraph-auto/25e2e90f.log +0 -0
- package/examples/saucedemo/.waygraph-auto/2708455e.log +22 -0
- package/examples/saucedemo/.waygraph-auto/272a96fd.log +20 -0
- package/examples/saucedemo/.waygraph-auto/28d7be5d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/2a6a8266.log +6 -0
- package/examples/saucedemo/.waygraph-auto/2b3401cf.log +20 -0
- package/examples/saucedemo/.waygraph-auto/2ceccd6d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/2f1b0c13.log +6 -0
- package/examples/saucedemo/.waygraph-auto/2f8d4073.log +6 -0
- package/examples/saucedemo/.waygraph-auto/30739278.log +6 -0
- package/examples/saucedemo/.waygraph-auto/31cb2e80.log +0 -0
- package/examples/saucedemo/.waygraph-auto/322d63cd.log +0 -0
- package/examples/saucedemo/.waygraph-auto/3239aa8a.log +6 -0
- package/examples/saucedemo/.waygraph-auto/326d87b7.log +6 -0
- package/examples/saucedemo/.waygraph-auto/3351c0b6.log +0 -0
- package/examples/saucedemo/.waygraph-auto/33df0770.log +0 -0
- package/examples/saucedemo/.waygraph-auto/340d624d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/36367ccf.log +0 -0
- package/examples/saucedemo/.waygraph-auto/372536a5.log +6 -0
- package/examples/saucedemo/.waygraph-auto/3a412f3c.log +0 -0
- package/examples/saucedemo/.waygraph-auto/3a859bd7.log +0 -0
- package/examples/saucedemo/.waygraph-auto/3cb0add7.log +0 -0
- package/examples/saucedemo/.waygraph-auto/3e42f0d8.log +0 -0
- package/examples/saucedemo/.waygraph-auto/4144071d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/4176a3c6.log +0 -0
- package/examples/saucedemo/.waygraph-auto/41d0793d.log +4 -0
- package/examples/saucedemo/.waygraph-auto/41e6feae.log +0 -0
- package/examples/saucedemo/.waygraph-auto/424b4d5d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/43253aba.log +0 -0
- package/examples/saucedemo/.waygraph-auto/438c6c53.log +22 -0
- package/examples/saucedemo/.waygraph-auto/4477db12.log +0 -0
- package/examples/saucedemo/.waygraph-auto/4a1258b7.log +0 -0
- package/examples/saucedemo/.waygraph-auto/4adcd179.log +20 -0
- package/examples/saucedemo/.waygraph-auto/4c9d9b16.log +21 -0
- package/examples/saucedemo/.waygraph-auto/4da39c36.log +6 -0
- package/examples/saucedemo/.waygraph-auto/4dbefa7e.log +5 -0
- package/examples/saucedemo/.waygraph-auto/4efa7035.log +6 -0
- package/examples/saucedemo/.waygraph-auto/505affdc.log +4 -0
- package/examples/saucedemo/.waygraph-auto/51bcb60a.log +0 -0
- package/examples/saucedemo/.waygraph-auto/5291bc78.log +22 -0
- package/examples/saucedemo/.waygraph-auto/54274c39.log +5 -0
- package/examples/saucedemo/.waygraph-auto/5440ce7e.log +0 -0
- package/examples/saucedemo/.waygraph-auto/5738175f.log +22 -0
- package/examples/saucedemo/.waygraph-auto/57ce5643.log +22 -0
- package/examples/saucedemo/.waygraph-auto/5984426b.log +6 -0
- package/examples/saucedemo/.waygraph-auto/5a682e7c.log +22 -0
- package/examples/saucedemo/.waygraph-auto/5b79320c.log +21 -0
- package/examples/saucedemo/.waygraph-auto/5c55aaac.log +21 -0
- package/examples/saucedemo/.waygraph-auto/5ed00b16.log +4 -0
- package/examples/saucedemo/.waygraph-auto/60b9c066.log +6 -0
- package/examples/saucedemo/.waygraph-auto/610dd127.log +0 -0
- package/examples/saucedemo/.waygraph-auto/61105500.log +5 -0
- package/examples/saucedemo/.waygraph-auto/61333142.log +5 -0
- package/examples/saucedemo/.waygraph-auto/6134afe8.log +20 -0
- package/examples/saucedemo/.waygraph-auto/61937e83.log +22 -0
- package/examples/saucedemo/.waygraph-auto/62a0bdc9.log +22 -0
- package/examples/saucedemo/.waygraph-auto/6376fc15.log +0 -0
- package/examples/saucedemo/.waygraph-auto/6599cbca.log +22 -0
- package/examples/saucedemo/.waygraph-auto/67aaca30.log +0 -0
- package/examples/saucedemo/.waygraph-auto/68b10298.log +0 -0
- package/examples/saucedemo/.waygraph-auto/68be5e12.log +0 -0
- package/examples/saucedemo/.waygraph-auto/68df05a6.log +22 -0
- package/examples/saucedemo/.waygraph-auto/693f67c4.log +20 -0
- package/examples/saucedemo/.waygraph-auto/69ae030a.log +6 -0
- package/examples/saucedemo/.waygraph-auto/69e73f35.log +6 -0
- package/examples/saucedemo/.waygraph-auto/6b2333b0.log +5 -0
- package/examples/saucedemo/.waygraph-auto/6c4c3817.log +0 -0
- package/examples/saucedemo/.waygraph-auto/6c954911.log +0 -0
- package/examples/saucedemo/.waygraph-auto/6d65a439.log +5 -0
- package/examples/saucedemo/.waygraph-auto/6d700055.log +0 -0
- package/examples/saucedemo/.waygraph-auto/6ead848f.log +0 -0
- package/examples/saucedemo/.waygraph-auto/72675b2d.log +6 -0
- package/examples/saucedemo/.waygraph-auto/733dd260.log +5 -0
- package/examples/saucedemo/.waygraph-auto/75016486.log +0 -0
- package/examples/saucedemo/.waygraph-auto/752b01c6.log +22 -0
- package/examples/saucedemo/.waygraph-auto/75675227.log +6 -0
- package/examples/saucedemo/.waygraph-auto/75e2e658.log +0 -0
- package/examples/saucedemo/.waygraph-auto/76ac1a86.log +0 -0
- package/examples/saucedemo/.waygraph-auto/77605295.log +0 -0
- package/examples/saucedemo/.waygraph-auto/792671f4.log +22 -0
- package/examples/saucedemo/.waygraph-auto/79915adb.log +20 -0
- package/examples/saucedemo/.waygraph-auto/7a398774.log +6 -0
- package/examples/saucedemo/.waygraph-auto/7a72f66e.log +6 -0
- package/examples/saucedemo/.waygraph-auto/7a984334.log +4 -0
- package/examples/saucedemo/.waygraph-auto/7c6ee793.log +20 -0
- package/examples/saucedemo/.waygraph-auto/7c726dc4.log +22 -0
- package/examples/saucedemo/.waygraph-auto/7c72e8a5.log +4 -0
- package/examples/saucedemo/.waygraph-auto/7dbee625.log +22 -0
- package/examples/saucedemo/.waygraph-auto/7df66956.log +0 -0
- package/examples/saucedemo/.waygraph-auto/7e053160.log +0 -0
- package/examples/saucedemo/.waygraph-auto/802a0b5b.log +0 -0
- package/examples/saucedemo/.waygraph-auto/80322e0b.log +0 -0
- package/examples/saucedemo/.waygraph-auto/80a4978e.log +6 -0
- package/examples/saucedemo/.waygraph-auto/81cfe480.log +22 -0
- package/examples/saucedemo/.waygraph-auto/832f5add.log +0 -0
- package/examples/saucedemo/.waygraph-auto/8337b6ad.log +0 -0
- package/examples/saucedemo/.waygraph-auto/8493928e.log +0 -0
- package/examples/saucedemo/.waygraph-auto/853bde43.log +0 -0
- package/examples/saucedemo/.waygraph-auto/86350ea6.log +22 -0
- package/examples/saucedemo/.waygraph-auto/86bb598a.log +0 -0
- package/examples/saucedemo/.waygraph-auto/86d09876.log +22 -0
- package/examples/saucedemo/.waygraph-auto/878ad01b.log +4 -0
- package/examples/saucedemo/.waygraph-auto/87c88ba5.log +0 -0
- package/examples/saucedemo/.waygraph-auto/87cb80ff.log +0 -0
- package/examples/saucedemo/.waygraph-auto/880b2e78.log +6 -0
- package/examples/saucedemo/.waygraph-auto/88527936.log +5 -0
- package/examples/saucedemo/.waygraph-auto/893023ea.log +5 -0
- package/examples/saucedemo/.waygraph-auto/89416718.log +0 -0
- package/examples/saucedemo/.waygraph-auto/8996a857.log +6 -0
- package/examples/saucedemo/.waygraph-auto/8a64ba0f.log +6 -0
- package/examples/saucedemo/.waygraph-auto/8b1cc2aa.log +6 -0
- package/examples/saucedemo/.waygraph-auto/8b73d13e.log +6 -0
- package/examples/saucedemo/.waygraph-auto/8d960d31.log +1 -0
- package/examples/saucedemo/.waygraph-auto/8d9e5cd2.log +21 -0
- package/examples/saucedemo/.waygraph-auto/8ec7d260.log +0 -0
- package/examples/saucedemo/.waygraph-auto/8ed43279.log +0 -0
- package/examples/saucedemo/.waygraph-auto/93acae32.log +5 -0
- package/examples/saucedemo/.waygraph-auto/96321a08.log +0 -0
- package/examples/saucedemo/.waygraph-auto/9742b6c2.log +6 -0
- package/examples/saucedemo/.waygraph-auto/99cc93eb.log +6 -0
- package/examples/saucedemo/.waygraph-auto/9cbfbedc.log +0 -0
- package/examples/saucedemo/.waygraph-auto/9dc147d2.log +22 -0
- package/examples/saucedemo/.waygraph-auto/a215a395.log +22 -0
- package/examples/saucedemo/.waygraph-auto/a23b7086.log +4 -0
- package/examples/saucedemo/.waygraph-auto/a35bd5ec.log +0 -0
- package/examples/saucedemo/.waygraph-auto/a68995e9.log +22 -0
- package/examples/saucedemo/.waygraph-auto/a6e4f936.log +22 -0
- package/examples/saucedemo/.waygraph-auto/a7da862b.log +0 -0
- package/examples/saucedemo/.waygraph-auto/a82e2a48.log +0 -0
- package/examples/saucedemo/.waygraph-auto/a952eb91.log +0 -0
- package/examples/saucedemo/.waygraph-auto/a9559653.log +5 -0
- package/examples/saucedemo/.waygraph-auto/aa478de2.log +0 -0
- package/examples/saucedemo/.waygraph-auto/ac350fc7.log +20 -0
- package/examples/saucedemo/.waygraph-auto/acc1b63a.log +0 -0
- package/examples/saucedemo/.waygraph-auto/ad12d191.log +0 -0
- package/examples/saucedemo/.waygraph-auto/ae3a9b06.log +0 -0
- package/examples/saucedemo/.waygraph-auto/b04638f4.log +6 -0
- package/examples/saucedemo/.waygraph-auto/b48863e5.log +22 -0
- package/examples/saucedemo/.waygraph-auto/b56968e1.log +6 -0
- package/examples/saucedemo/.waygraph-auto/b64e0620.log +20 -0
- package/examples/saucedemo/.waygraph-auto/b86a6218.log +6 -0
- package/examples/saucedemo/.waygraph-auto/b8e9e956.log +22 -0
- package/examples/saucedemo/.waygraph-auto/b9b310ff.log +21 -0
- package/examples/saucedemo/.waygraph-auto/bc111745.log +22 -0
- package/examples/saucedemo/.waygraph-auto/bf7a77a2.log +0 -0
- package/examples/saucedemo/.waygraph-auto/c0d6f353.log +21 -0
- package/examples/saucedemo/.waygraph-auto/c0febcf2.log +20 -0
- package/examples/saucedemo/.waygraph-auto/c4c52998.log +6 -0
- package/examples/saucedemo/.waygraph-auto/c809ceb4.log +22 -0
- package/examples/saucedemo/.waygraph-auto/ca6de7e7.log +0 -0
- package/examples/saucedemo/.waygraph-auto/ca8561bc.log +0 -0
- package/examples/saucedemo/.waygraph-auto/cb86d45b.log +0 -0
- package/examples/saucedemo/.waygraph-auto/cb9a1978.log +6 -0
- package/examples/saucedemo/.waygraph-auto/cbbc689c.log +6 -0
- package/examples/saucedemo/.waygraph-auto/cd88364b.log +0 -0
- package/examples/saucedemo/.waygraph-auto/cd919e1d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/cfff9eef.log +20 -0
- package/examples/saucedemo/.waygraph-auto/d0f59b21.log +4 -0
- package/examples/saucedemo/.waygraph-auto/d1195079.log +20 -0
- package/examples/saucedemo/.waygraph-auto/d2ef067a.log +5 -0
- package/examples/saucedemo/.waygraph-auto/d425471f.log +6 -0
- package/examples/saucedemo/.waygraph-auto/d5293921.log +0 -0
- package/examples/saucedemo/.waygraph-auto/d62a22c2.log +21 -0
- package/examples/saucedemo/.waygraph-auto/d6d1761f.log +22 -0
- package/examples/saucedemo/.waygraph-auto/d6d5f411.log +22 -0
- package/examples/saucedemo/.waygraph-auto/d6df2771.log +6 -0
- package/examples/saucedemo/.waygraph-auto/d7075012.log +21 -0
- package/examples/saucedemo/.waygraph-auto/d9ddc297.log +0 -0
- package/examples/saucedemo/.waygraph-auto/db4ac845.log +0 -0
- package/examples/saucedemo/.waygraph-auto/db6d7774.log +0 -0
- package/examples/saucedemo/.waygraph-auto/db839827.log +5 -0
- package/examples/saucedemo/.waygraph-auto/dde5e859.log +22 -0
- package/examples/saucedemo/.waygraph-auto/de8cac58.log +0 -0
- package/examples/saucedemo/.waygraph-auto/ded5511a.log +6 -0
- package/examples/saucedemo/.waygraph-auto/dedfcb18.log +0 -0
- package/examples/saucedemo/.waygraph-auto/def4d9b1.log +0 -0
- package/examples/saucedemo/.waygraph-auto/e1549e40.log +0 -0
- package/examples/saucedemo/.waygraph-auto/e1b0676d.log +21 -0
- package/examples/saucedemo/.waygraph-auto/e5111463.log +0 -0
- package/examples/saucedemo/.waygraph-auto/e5fc1d7c.log +5 -0
- package/examples/saucedemo/.waygraph-auto/e6fd2202.log +0 -0
- package/examples/saucedemo/.waygraph-auto/edaa806d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/edaf33de.log +0 -0
- package/examples/saucedemo/.waygraph-auto/edd40cbb.log +20 -0
- package/examples/saucedemo/.waygraph-auto/eddfbffc.log +6 -0
- package/examples/saucedemo/.waygraph-auto/ee9fa1ad.log +5 -0
- package/examples/saucedemo/.waygraph-auto/ef319474.log +22 -0
- package/examples/saucedemo/.waygraph-auto/f28eee8d.log +0 -0
- package/examples/saucedemo/.waygraph-auto/f33bde90.log +0 -0
- package/examples/saucedemo/.waygraph-auto/f6ba7cb4.log +6 -0
- package/examples/saucedemo/.waygraph-auto/f7ac4d62.log +20 -0
- package/examples/saucedemo/.waygraph-auto/f929bb79.log +0 -0
- package/examples/saucedemo/.waygraph-auto/f92d4c6c.log +22 -0
- package/examples/saucedemo/.waygraph-auto/f92faf40.log +5 -0
- package/examples/saucedemo/.waygraph-auto/fa784369.log +21 -0
- package/examples/saucedemo/.waygraph-auto/fb55f723.log +20 -0
- package/examples/saucedemo/.waygraph-auto/fba3b738.log +0 -0
- package/examples/saucedemo/.waygraph-auto/ffdf2854.log +6 -0
- package/examples/saucedemo/README.md +13 -2
- package/examples/saucedemo/package.json +4 -0
- package/examples/saucedemo/src/flows/api-demo.flow.ts +37 -0
- package/examples/saucedemo/src/flows/checkout.flow.ts +34 -11
- package/package.json +5 -3
- package/dist/auto-explore-run.d.ts +0 -37
- package/dist/auto-explore-run.js +0 -670
- package/dist/auto-explore.d.ts +0 -57
- package/dist/auto-explore.js +0 -376
- package/dist/auto-session-ipc.d.ts +0 -150
- package/dist/auto-session-ipc.js +0 -497
- package/dist/block-inject.d.ts +0 -15
- package/dist/block-inject.js +0 -91
- package/dist/browser.d.ts +0 -15
- package/dist/browser.js +0 -29
- package/dist/coverage-gap.d.ts +0 -11
- package/dist/coverage-gap.js +0 -119
- package/dist/engine.d.ts +0 -12
- package/dist/engine.js +0 -13
- package/dist/graph.d.ts +0 -92
- package/dist/graph.js +0 -467
- package/dist/highlight-shorthand.d.ts +0 -24
- package/dist/highlight-shorthand.js +0 -30
- package/dist/map-check.d.ts +0 -18
- package/dist/map-check.js +0 -140
- package/dist/overlay-beacon.d.ts +0 -44
- package/dist/overlay-beacon.js +0 -85
- package/dist/pilot.d.ts +0 -54
- package/dist/pilot.js +0 -80
- package/dist/practices-check.d.ts +0 -14
- package/dist/practices-check.js +0 -195
- package/dist/traverse-coverage.d.ts +0 -59
- package/dist/traverse-coverage.js +0 -127
- package/dist/traverse-lease.d.ts +0 -18
- package/dist/traverse-lease.js +0 -62
- package/dist/traverse-run.d.ts +0 -47
- package/dist/traverse-run.js +0 -439
- package/dist/ui/compose.d.ts +0 -4
- package/dist/ui/compose.js +0 -7
- /package/dist/{verbose-log.d.ts → auto-session/verbose-log.d.ts} +0 -0
- /package/dist/{verbose-log.js → auto-session/verbose-log.js} +0 -0
- /package/dist/{agent-dive.d.ts → commands/agent-dive-scaffold.d.ts} +0 -0
- /package/dist/{engine/core.d.ts → core/block.d.ts} +0 -0
- /package/dist/{engine → core}/blocks/nav.d.ts +0 -0
- /package/dist/{engine → core}/blocks/page.d.ts +0 -0
- /package/dist/{engine → core}/branch-regression.d.ts +0 -0
- /package/dist/{engine → core}/compose.d.ts +0 -0
- /package/dist/{engine → core}/config.d.ts +0 -0
- /package/dist/{engine → core}/config.js +0 -0
- /package/dist/{engine → core}/flow.d.ts +0 -0
- /package/dist/{engine → core}/locate.d.ts +0 -0
- /package/dist/{engine → core}/locate.js +0 -0
- /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
|
|
@@ -104,37 +105,47 @@ export async function showPilotFixtures(page, fixtures) {
|
|
|
104
105
|
const bannerPos = fixtures.clear ? undefined : fixtures.titlePos;
|
|
105
106
|
const bannerHidden = !!fixtures.clear || !!fixtures.bannerUi?.hidden;
|
|
106
107
|
const bannerCollision = fixtures.bannerUi?.collision !== false;
|
|
108
|
+
// Same #wg-banner installer the demo runner uses (runner/inpage/banner.js) - not a separate
|
|
109
|
+
// re-implementation. `tag: "waygraph pilot"` is the only Pilot-specific bit.
|
|
110
|
+
if (bannerTitle !== undefined || bannerHidden) {
|
|
111
|
+
const { installBanner } = await import("../runner/inpage/banner.js");
|
|
112
|
+
await page
|
|
113
|
+
.evaluate(installBanner, {
|
|
114
|
+
title: bannerTitle,
|
|
115
|
+
bannerPos: bannerPos || "left",
|
|
116
|
+
bannerUi: { hidden: bannerHidden, collision: bannerCollision, ...(bannerPos ? { pos: bannerPos } : {}) },
|
|
117
|
+
tag: "waygraph pilot",
|
|
118
|
+
})
|
|
119
|
+
.catch(() => { });
|
|
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;
|
|
107
147
|
return page
|
|
108
|
-
.evaluate(({ rings, todoGroups, todoPos, holdMs, zoom, zoomSelector, zoomOut, clearAll, todoUi,
|
|
109
|
-
// Same #wg-banner element/CSS the demo runner paints (ui/css/banner.css, already in the
|
|
110
|
-
// shared bundle) - so ctx.title / ctx.titlePos / ctx.bannerUi behave identically on a Pilot
|
|
111
|
-
// session, not a separate re-implementation.
|
|
112
|
-
if (bannerHidden) {
|
|
113
|
-
const b = __wgById("wg-banner");
|
|
114
|
-
if (b)
|
|
115
|
-
b.style.display = "none";
|
|
116
|
-
}
|
|
117
|
-
else if (bannerTitle) {
|
|
118
|
-
let banner = __wgById("wg-banner");
|
|
119
|
-
if (!banner) {
|
|
120
|
-
banner = document.createElement("div");
|
|
121
|
-
banner.id = "wg-banner";
|
|
122
|
-
const tag = document.createElement("span");
|
|
123
|
-
tag.className = "wg-banner-tag";
|
|
124
|
-
tag.textContent = "waygraph pilot";
|
|
125
|
-
const text = document.createElement("span");
|
|
126
|
-
text.className = "wg-banner-text";
|
|
127
|
-
banner.appendChild(tag);
|
|
128
|
-
banner.appendChild(text);
|
|
129
|
-
__wgAdd(banner);
|
|
130
|
-
}
|
|
131
|
-
banner.style.display = "";
|
|
132
|
-
banner.dataset.pos = bannerPos || banner.dataset.pos || "left";
|
|
133
|
-
banner.dataset.collision = bannerCollision ? "1" : "0";
|
|
134
|
-
const textEl = banner.querySelector(".wg-banner-text");
|
|
135
|
-
if (textEl)
|
|
136
|
-
textEl.textContent = bannerTitle;
|
|
137
|
-
}
|
|
148
|
+
.evaluate(({ rings, ringBoxes, todoGroups, todoPos, holdMs, zoom, zoomSelector, zoomEl, zoomOut, clearAll, todoUi, }) => {
|
|
138
149
|
const w = window;
|
|
139
150
|
if (w.__wgPilotFxHideTimer)
|
|
140
151
|
clearTimeout(w.__wgPilotFxHideTimer);
|
|
@@ -209,17 +220,11 @@ export async function showPilotFixtures(page, fixtures) {
|
|
|
209
220
|
// (window.__wgPaintRingAt, installed by runner/inpage/core.js's installCore - see
|
|
210
221
|
// ensureInstalled) - one ring implementation, not a separate DOM-building copy here.
|
|
211
222
|
rings.forEach((ring, i) => {
|
|
212
|
-
const
|
|
213
|
-
if (!
|
|
223
|
+
const box = ringBoxes[i];
|
|
224
|
+
if (!box) {
|
|
214
225
|
missing.push(ring.selector);
|
|
215
226
|
return;
|
|
216
227
|
}
|
|
217
|
-
const rect = el.getBoundingClientRect();
|
|
218
|
-
if (rect.width === 0 && rect.height === 0) {
|
|
219
|
-
missing.push(ring.selector);
|
|
220
|
-
return;
|
|
221
|
-
}
|
|
222
|
-
const box = { x: rect.left, y: rect.top, width: rect.width, height: rect.height };
|
|
223
228
|
const ringId = `wg-fx-ring-${i}`;
|
|
224
229
|
const labelId = `wg-fx-ring-${i}-label`;
|
|
225
230
|
if (window.__wgPaintRingAt) {
|
|
@@ -310,7 +315,7 @@ export async function showPilotFixtures(page, fixtures) {
|
|
|
310
315
|
}
|
|
311
316
|
}
|
|
312
317
|
if (zoom > 1.001 && zoomSelector) {
|
|
313
|
-
const target =
|
|
318
|
+
const target = zoomEl;
|
|
314
319
|
if (target) {
|
|
315
320
|
target.scrollIntoView({
|
|
316
321
|
block: "center",
|
|
@@ -338,18 +343,25 @@ export async function showPilotFixtures(page, fixtures) {
|
|
|
338
343
|
return { painted, missing };
|
|
339
344
|
}, {
|
|
340
345
|
rings,
|
|
346
|
+
ringBoxes,
|
|
341
347
|
todoGroups,
|
|
342
348
|
todoPos,
|
|
343
349
|
holdMs,
|
|
344
350
|
zoom,
|
|
345
351
|
zoomSelector: zoomSelector ?? "",
|
|
352
|
+
zoomEl: zoomHandle,
|
|
346
353
|
zoomOut,
|
|
347
354
|
clearAll: fixtures.clear === true,
|
|
348
355
|
todoUi,
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
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;
|
|
353
365
|
})
|
|
354
366
|
.catch(() => ({ painted: 0, missing: rings.map((r) => r.selector) }));
|
|
355
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(({
|
|
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
|
-
|
|
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
|
-
}, {
|
|
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 (
|
|
279
|
-
// Lock Playwright viewport to the
|
|
280
|
-
//
|
|
281
|
-
//
|
|
282
|
-
//
|
|
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(
|
|
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:
|
|
294
|
-
height:
|
|
313
|
+
width: stage.width,
|
|
314
|
+
height: stage.height,
|
|
295
315
|
};
|
|
296
316
|
page.__wgDeviceShell = { ...desk };
|
|
297
|
-
await applyVideoDeviceStage(page, desk,
|
|
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(
|
|
323
|
+
await realSet(stage);
|
|
304
324
|
} catch {
|
|
305
325
|
/* ignore */
|
|
306
326
|
}
|
|
307
327
|
} else {
|
|
308
|
-
// Lerp shell size when switching mobile <-> tablet mid-
|
|
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,
|
|
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,
|
|
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
|
|
358
|
+
// Re-assert stage size after any prior fitWindow.
|
|
339
359
|
try {
|
|
340
|
-
await realSet(
|
|
360
|
+
await realSet(stage);
|
|
341
361
|
} catch {
|
|
342
362
|
/* ignore */
|
|
343
363
|
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** In-page installer (page.evaluate target) - see banner.js's own header. Creates/updates #wg-banner
|
|
2
|
+
* (click-to-move position, localStorage-persisted, authored titlePos/bannerUi support). `tag`
|
|
3
|
+
* overrides the small caption above the title (default "waygraph demo"). */
|
|
4
|
+
export function installBanner(args: {
|
|
5
|
+
title?: string | undefined;
|
|
6
|
+
favicon?: string | undefined;
|
|
7
|
+
bannerPos?: string | undefined;
|
|
8
|
+
todoPos?: string | undefined;
|
|
9
|
+
envAutoplay?: boolean | undefined;
|
|
10
|
+
todoDockUi?: unknown;
|
|
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;
|
|
20
|
+
tag?: string | undefined;
|
|
21
|
+
}): void;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// In-page installer (runs inside the browser via page.evaluate): must stay self-contained - no module-scope closure.
|
|
2
2
|
// Split out of the former single installOverlay evaluate (see src/ARCHITECTURE.md). Shares state only via window.__wg*.
|
|
3
3
|
/* eslint-disable no-unused-vars */
|
|
4
|
-
export function installBanner({ title, favicon, bannerPos, todoPos, envAutoplay, todoDockUi, bannerUi }) {
|
|
4
|
+
export function installBanner({ title, favicon, bannerPos, todoPos, envAutoplay, todoDockUi, bannerUi, tag: bannerTag }) {
|
|
5
5
|
const POSITIONS = ["left", "center", "right"];
|
|
6
6
|
const applyPos = (el, pos) => {
|
|
7
7
|
el.dataset.pos = pos;
|
|
@@ -34,7 +34,7 @@ export function installBanner({ title, favicon, bannerPos, todoPos, envAutoplay,
|
|
|
34
34
|
});
|
|
35
35
|
const tag = document.createElement("span");
|
|
36
36
|
tag.className = "wg-banner-tag";
|
|
37
|
-
tag.textContent = "waygraph demo";
|
|
37
|
+
tag.textContent = bannerTag || "waygraph demo";
|
|
38
38
|
const text = document.createElement("span");
|
|
39
39
|
text.className = "wg-banner-text";
|
|
40
40
|
text.textContent = title;
|
|
@@ -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
|
|
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,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
|
-
|
|
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
|
|
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.
|
|
216
|
+
window.__wgRingFollowEl = null;
|
|
198
217
|
};
|
|
199
|
-
|
|
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 (!
|
|
202
|
-
window.
|
|
224
|
+
if (!el) return;
|
|
225
|
+
window.__wgRingFollowEl = el;
|
|
203
226
|
const tick = () => {
|
|
204
|
-
if (window.
|
|
205
|
-
|
|
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;
|