waygraph 0.15.54 → 0.16.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -3
- package/bin/waygraph +2 -2
- package/dist/analysis/check.d.ts +38 -0
- package/dist/analysis/check.js +87 -0
- package/dist/analysis/coverage-gap.d.ts +1 -1
- package/dist/analysis/coverage-gap.js +14 -37
- package/dist/analysis/flow-source.d.ts +9 -0
- package/dist/analysis/flow-source.js +25 -0
- package/dist/analysis/graph.d.ts +10 -14
- package/dist/analysis/graph.js +48 -371
- package/dist/analysis/map-check.js +4 -39
- package/dist/analysis/practices-check.d.ts +1 -1
- package/dist/analysis/practices-check.js +24 -45
- package/dist/cli/args.d.ts +23 -0
- package/dist/cli/args.js +20 -0
- package/dist/{cli.d.ts → cli/cli.d.ts} +0 -1
- package/dist/{cli.js → cli/cli.js} +10 -9
- package/dist/{commands → cli/commands}/agent-dive-scaffold.js +35 -64
- package/dist/cli/commands/agent-dive.js +42 -0
- package/dist/cli/commands/browser.d.ts +2 -0
- package/dist/cli/commands/browser.js +109 -0
- package/dist/{commands → cli/commands}/check.d.ts +0 -1
- package/dist/cli/commands/check.js +104 -0
- package/dist/cli/commands/codemod-checkpoints.d.ts +18 -0
- package/dist/cli/commands/codemod-checkpoints.js +186 -0
- package/dist/cli/commands/codemod-flows.d.ts +18 -0
- package/dist/cli/commands/codemod-flows.js +284 -0
- package/dist/cli/commands/codemod-stubs.d.ts +10 -0
- package/dist/cli/commands/codemod-stubs.js +187 -0
- package/dist/{commands → cli/commands}/extensions.js +5 -4
- package/dist/{commands → cli/commands}/init.js +1 -2
- package/dist/{commands → cli/commands}/list.js +9 -7
- package/dist/cli/commands/manifest.d.ts +2 -0
- package/dist/cli/commands/manifest.js +20 -0
- package/dist/cli/commands/map.js +57 -0
- package/dist/cli/commands/pilot.d.ts +2 -0
- package/dist/cli/commands/pilot.js +102 -0
- package/dist/{commands → cli/commands}/run.d.ts +0 -1
- package/dist/cli/commands/run.js +64 -0
- package/dist/cli/commands/session-ops.d.ts +3 -0
- package/dist/cli/commands/session-ops.js +257 -0
- package/dist/cli/commands/session.js +132 -0
- package/dist/{commands → cli/commands}/test.js +11 -14
- package/dist/cli/commands/traverse.js +105 -0
- package/dist/{commands → cli/commands}/try.js +29 -25
- package/dist/{commands → cli/commands}/upgrade.js +40 -4
- package/dist/cli/flags.d.ts +193 -16
- package/dist/cli/flags.js +179 -234
- package/dist/cli/run-chain.d.ts +1 -0
- package/dist/cli/run-chain.js +42 -7
- package/dist/cli/usage.d.ts +1 -1
- package/dist/cli/usage.js +21 -53
- package/dist/cli/util.d.ts +2 -2
- package/dist/cli/util.js +2 -3
- package/dist/{highlights → demo/narration}/css.d.ts +1 -1
- package/dist/{highlights → demo/narration}/css.js +2 -3
- package/dist/{highlights → demo/narration}/demo-pace.d.ts +4 -12
- package/dist/{highlights → demo/narration}/demo-pace.js +5 -11
- package/dist/{highlights → demo/narration}/device.d.ts +4 -4
- package/dist/{highlights → demo/narration}/device.js +1 -1
- package/dist/demo/narration/merge.d.ts +10 -0
- package/dist/demo/narration/merge.js +67 -0
- package/dist/demo/narration/narration.d.ts +39 -0
- package/dist/{highlights/run-phase.js → demo/narration/narration.js} +25 -94
- package/dist/{highlights → demo/narration}/shorthand.d.ts +1 -1
- package/dist/demo/narration/stub-ctx.d.ts +8 -0
- package/dist/demo/narration/stub-ctx.js +164 -0
- package/dist/{highlights → demo/narration}/style.d.ts +1 -7
- package/dist/{highlights → demo/narration}/style.js +1 -41
- package/dist/{highlights → demo/narration}/todo-dock.d.ts +8 -8
- package/dist/{highlights → demo/narration}/todo-dock.js +13 -30
- package/dist/demo/overlay/auto-chrome.d.ts +7 -0
- package/dist/demo/overlay/auto-chrome.js +97 -0
- package/dist/demo/overlay/cursor.d.ts +19 -0
- package/dist/demo/overlay/cursor.js +142 -0
- package/dist/demo/overlay/device-stage.d.ts +26 -0
- package/dist/demo/overlay/device-stage.js +396 -0
- package/dist/demo/overlay/inpage/banner.d.ts +2 -0
- package/dist/demo/overlay/inpage/banner.js +160 -0
- package/dist/demo/overlay/inpage/caption.d.ts +2 -0
- package/dist/demo/overlay/inpage/caption.js +24 -0
- package/dist/demo/overlay/inpage/core.d.ts +2 -0
- package/dist/demo/overlay/inpage/core.js +345 -0
- package/dist/demo/overlay/inpage/device-chip.d.ts +1 -0
- package/dist/demo/overlay/inpage/device-chip.js +191 -0
- package/dist/demo/overlay/inpage/network.d.ts +10 -0
- package/dist/demo/overlay/inpage/network.js +189 -0
- package/dist/demo/overlay/inpage/panel-chrome.d.ts +1 -0
- package/dist/demo/overlay/inpage/panel-chrome.js +203 -0
- package/dist/demo/overlay/inpage/stamp.d.ts +1 -0
- package/dist/demo/overlay/inpage/stamp.js +46 -0
- package/dist/demo/overlay/inpage/swipe-zoom.d.ts +1 -0
- package/dist/demo/overlay/inpage/swipe-zoom.js +220 -0
- package/dist/demo/overlay/inpage/todos.d.ts +2 -0
- package/dist/demo/overlay/inpage/todos.js +293 -0
- package/dist/demo/overlay/locator-theater.d.ts +25 -0
- package/dist/demo/overlay/locator-theater.js +76 -0
- package/dist/demo/overlay/network-capture.d.ts +22 -0
- package/dist/demo/overlay/network-capture.js +127 -0
- package/dist/demo/overlay/overlay-css.d.ts +3 -0
- package/dist/demo/overlay/overlay-css.js +369 -0
- package/dist/demo/overlay/overlay-stage.d.ts +31 -0
- package/dist/demo/overlay/overlay-stage.js +106 -0
- package/dist/demo/overlay/overlay.d.ts +10 -0
- package/dist/demo/overlay/overlay.js +89 -0
- package/dist/{pilot-overlay/overlay-fixtures.d.ts → demo/overlay/phase-fixtures.d.ts} +2 -2
- package/dist/{pilot-overlay/overlay-fixtures.js → demo/overlay/phase-fixtures.js} +2 -2
- package/dist/{pilot-overlay/action-ring.js → demo/overlay/pilot/actions.js} +2 -1
- package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.d.ts +6 -5
- package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.js +19 -18
- package/dist/{pilot-overlay → demo/overlay/pilot}/shell.d.ts +2 -2
- package/dist/{pilot-overlay → demo/overlay/pilot}/shell.js +13 -22
- package/dist/demo/overlay/reattach.d.ts +7 -0
- package/dist/demo/overlay/reattach.js +23 -0
- package/dist/demo/overlay/rings.d.ts +61 -0
- package/dist/demo/overlay/rings.js +422 -0
- package/dist/{ui → demo/overlay/ui}/components/ring.js +2 -2
- package/dist/{ui → demo/overlay/ui}/overlay.css +4 -4
- package/dist/{ui → demo/overlay/ui}/shadow.d.ts +1 -1
- package/dist/{ui → demo/overlay/ui}/shadow.js +39 -2
- package/dist/demo/stepper/after.d.ts +3 -0
- package/dist/demo/stepper/after.js +103 -0
- package/dist/demo/stepper/banner-log.d.ts +35 -0
- package/dist/demo/stepper/banner-log.js +65 -0
- package/dist/demo/stepper/before.d.ts +4 -0
- package/dist/demo/stepper/before.js +110 -0
- package/dist/demo/stepper/demo-log.d.ts +48 -0
- package/dist/demo/stepper/demo-log.js +292 -0
- package/dist/demo/stepper/gate.d.ts +11 -0
- package/dist/demo/stepper/gate.js +78 -0
- package/dist/demo/stepper/interaction-patch.d.ts +4 -0
- package/dist/demo/stepper/interaction-patch.js +323 -0
- package/dist/demo/stepper/pacing.d.ts +21 -0
- package/dist/demo/stepper/pacing.js +23 -0
- package/dist/demo/stepper/panel-after.d.ts +17 -0
- package/dist/demo/stepper/panel-after.js +166 -0
- package/dist/demo/stepper/panel-before.d.ts +12 -0
- package/dist/demo/stepper/panel-before.js +241 -0
- package/dist/demo/stepper/slides.d.ts +23 -0
- package/dist/demo/stepper/slides.js +233 -0
- package/dist/demo/stepper/step-panels.d.ts +69 -0
- package/dist/demo/stepper/step-panels.js +172 -0
- package/dist/demo/stepper/stepper.d.ts +24 -0
- package/dist/demo/stepper/stepper.js +122 -0
- package/dist/demo/stepper/teardown.d.ts +47 -0
- package/dist/demo/stepper/teardown.js +178 -0
- package/dist/demo/stepper/todo-advance.d.ts +15 -0
- package/dist/demo/stepper/todo-advance.js +110 -0
- package/dist/demo/stepper/view.d.ts +58 -0
- package/dist/demo/stepper/view.js +31 -0
- package/dist/demo/types.d.ts +85 -0
- package/dist/demo/verbose-log.js +15 -0
- package/dist/engine/block/action-page.d.ts +53 -0
- package/dist/engine/block/action-page.js +1 -0
- package/dist/{types.d.ts → engine/block/block.d.ts} +102 -142
- package/dist/{core → engine/block}/block.js +12 -130
- package/dist/engine/block/branch.d.ts +17 -0
- package/dist/engine/block/branch.js +40 -0
- package/dist/{core → engine/block}/compose.d.ts +9 -7
- package/dist/{core → engine/block}/compose.js +1 -1
- package/dist/engine/block/dialog.d.ts +13 -0
- package/dist/engine/block/dialog.js +37 -0
- package/dist/{core/blocks → engine/block/kinds}/api.d.ts +16 -12
- package/dist/{core/blocks → engine/block/kinds}/api.js +26 -18
- package/dist/{core/blocks → engine/block/kinds}/effect.d.ts +13 -18
- package/dist/engine/block/kinds/effect.js +17 -0
- package/dist/{core/blocks → engine/block/kinds}/method.d.ts +17 -29
- package/dist/{core/blocks → engine/block/kinds}/method.js +6 -21
- package/dist/{core/blocks → engine/block/kinds}/nav.d.ts +21 -31
- package/dist/{core/blocks → engine/block/kinds}/nav.js +6 -12
- package/dist/{core/blocks → engine/block/kinds}/page.d.ts +14 -20
- package/dist/{core/blocks → engine/block/kinds}/page.js +5 -7
- package/dist/engine/checkpoint/checkpoint.d.ts +22 -0
- package/dist/engine/checkpoint/checkpoint.js +8 -0
- package/dist/engine/checkpoint/route.d.ts +28 -0
- package/dist/engine/checkpoint/route.js +28 -0
- package/dist/{core → engine}/config.d.ts +7 -2
- package/dist/engine/config.js +6 -0
- package/dist/engine/engine.d.ts +45 -0
- package/dist/{core → engine}/engine.js +6 -10
- package/dist/engine/env.d.ts +59 -0
- package/dist/engine/env.js +83 -0
- package/dist/{errors.d.ts → engine/errors.d.ts} +22 -22
- package/dist/{errors.js → engine/errors.js} +22 -22
- package/dist/{core → engine/flow}/branch-regression.d.ts +7 -7
- package/dist/{core → engine/flow}/branch-regression.js +4 -3
- package/dist/engine/flow/flow.d.ts +162 -0
- package/dist/engine/flow/flow.js +244 -0
- package/dist/engine/flow/map-branch.d.ts +9 -0
- package/dist/engine/flow/map-branch.js +57 -0
- package/dist/{core → engine/flow}/map-builder.d.ts +34 -54
- package/dist/engine/flow/map-builder.js +242 -0
- package/dist/engine/flow/map-steps.d.ts +30 -0
- package/dist/engine/flow/map-steps.js +87 -0
- package/dist/{core → engine}/locate.d.ts +1 -1
- package/dist/{core → engine}/locate.js +1 -2
- package/dist/{mem-stub.d.ts → engine/mem/mem-stub.d.ts} +9 -8
- package/dist/{mem-stub.js → engine/mem/mem-stub.js} +2 -2
- package/dist/{mem-page.d.ts → engine/mem/mem.d.ts} +1 -1
- package/dist/{mem-page.js → engine/mem/mem.js} +2 -1
- package/dist/engine/page-gone.d.ts +5 -0
- package/dist/engine/page-gone.js +20 -0
- package/dist/engine/run/connect.d.ts +28 -0
- package/dist/{types.js → engine/run/connect.js} +11 -10
- package/dist/engine/run/events.d.ts +67 -0
- package/dist/engine/run/events.js +90 -0
- package/dist/engine/run/hooks.d.ts +16 -0
- package/dist/engine/run/hooks.js +8 -0
- package/dist/engine/run/launch.d.ts +13 -0
- package/dist/engine/run/launch.js +27 -0
- package/dist/{core/run-graph.d.ts → engine/run/run.d.ts} +8 -12
- package/dist/{core/run-graph.js → engine/run/run.js} +22 -12
- package/dist/engine/stub/pace.d.ts +12 -0
- package/dist/engine/stub/pace.js +2 -0
- package/dist/engine/stub/ring.d.ts +130 -0
- package/dist/engine/stub/ring.js +41 -0
- package/dist/engine/stub/stub.d.ts +268 -0
- package/dist/engine/stub/stub.js +1 -0
- package/dist/engine/stub/todos.d.ts +104 -0
- package/dist/engine/stub/todos.js +2 -0
- package/dist/engine/stub/viewport.d.ts +26 -0
- package/dist/engine/stub/viewport.js +2 -0
- package/dist/{trait.d.ts → engine/trait/trait.d.ts} +1 -1
- package/dist/{trait.js → engine/trait/trait.js} +1 -1
- package/dist/index.d.ts +88 -36
- package/dist/index.js +46 -19
- package/dist/live/auto/auto.d.ts +22 -0
- package/dist/live/auto/auto.js +207 -0
- package/dist/{session/auto-explore.d.ts → live/auto/explore.d.ts} +4 -14
- package/dist/{session/auto-explore.js → live/auto/explore.js} +21 -127
- package/dist/live/auto/mem.d.ts +11 -0
- package/dist/live/auto/mem.js +85 -0
- package/dist/live/auto/menu.d.ts +30 -0
- package/dist/live/auto/menu.js +335 -0
- package/dist/live/auto-session/auto-session.d.ts +113 -0
- package/dist/live/auto-session/auto-session.js +452 -0
- package/dist/live/auto-session/console.d.ts +4 -0
- package/dist/live/auto-session/console.js +41 -0
- package/dist/live/auto-session/files.d.ts +44 -0
- package/dist/live/auto-session/files.js +145 -0
- package/dist/{auto-session → live/auto-session}/helpers.d.ts +9 -5
- package/dist/{auto-session → live/auto-session}/helpers.js +18 -1
- package/dist/live/auto-session/inspect.d.ts +4 -0
- package/dist/live/auto-session/inspect.js +75 -0
- package/dist/{session/auto-session-ipc.d.ts → live/auto-session/ipc.d.ts} +8 -25
- package/dist/{session/auto-session-ipc.js → live/auto-session/ipc.js} +36 -161
- package/dist/live/auto-session/open-browser.d.ts +6 -0
- package/dist/live/auto-session/open-browser.js +47 -0
- package/dist/{session/browser.d.ts → live/auto-session/start.d.ts} +1 -2
- package/dist/{session/browser.js → live/auto-session/start.js} +2 -3
- package/dist/{pilot-overlay → live/pilot}/panel.d.ts +1 -1
- package/dist/{pilot-overlay → live/pilot}/panel.js +23 -31
- package/dist/{session → live/pilot}/pilot.d.ts +3 -3
- package/dist/{session → live/pilot}/pilot.js +5 -4
- package/dist/{traverse/run.d.ts → live/traverse/traverse.d.ts} +1 -1
- package/dist/live/traverse/traverse.js +212 -0
- package/dist/live/traverse/worker.d.ts +37 -0
- package/dist/live/traverse/worker.js +200 -0
- package/dist/manifest/manifest.d.ts +52 -0
- package/dist/manifest/manifest.js +93 -0
- package/dist/manifest/map-imports.d.ts +7 -0
- package/dist/manifest/map-imports.js +22 -0
- package/dist/manifest/maps.d.ts +33 -0
- package/dist/manifest/maps.js +62 -0
- package/dist/manifest/pack.d.ts +21 -0
- package/dist/manifest/pack.js +109 -0
- package/dist/manifest/project.d.ts +60 -0
- package/dist/manifest/project.js +101 -0
- package/dist/{session/block-inject.js → manifest/roots.js} +1 -18
- package/dist/manifest/scan.d.ts +19 -0
- package/dist/manifest/scan.js +57 -0
- package/dist/manifest/source.d.ts +23 -0
- package/dist/manifest/source.js +86 -0
- package/dist/runner/mode.d.ts +71 -0
- package/dist/runner/mode.js +1 -0
- package/dist/runner/modes/branches.d.ts +5 -0
- package/dist/runner/modes/branches.js +37 -0
- package/dist/runner/modes/demo.d.ts +3 -0
- package/dist/runner/modes/demo.js +13 -0
- package/dist/runner/modes/report.d.ts +2 -0
- package/dist/runner/modes/report.js +54 -0
- package/dist/runner/modes/run.d.ts +2 -0
- package/dist/runner/modes/run.js +3 -0
- package/dist/runner/options.d.ts +31 -0
- package/dist/runner/options.js +42 -0
- package/dist/runner/plan/find.d.ts +18 -0
- package/dist/runner/plan/find.js +65 -0
- package/dist/runner/plan/plan.d.ts +11 -0
- package/dist/runner/plan/plan.js +97 -0
- package/dist/runner/plan/seed-mem.d.ts +12 -0
- package/dist/runner/plan/seed-mem.js +98 -0
- package/dist/runner/plan/spec.d.ts +5 -0
- package/dist/runner/plan/spec.js +17 -0
- package/dist/runner/play-steps.d.ts +2 -0
- package/dist/runner/play-steps.js +59 -0
- package/dist/runner/runner.d.ts +4 -0
- package/dist/runner/runner.js +64 -0
- package/dist/runner/session.d.ts +9 -0
- package/dist/runner/session.js +87 -0
- package/dist/{browser.js → runtime/browser.js} +4 -2
- package/dist/{env-file.js → runtime/env-file.js} +7 -12
- package/dist/{extensions.d.ts → runtime/extensions.d.ts} +1 -5
- package/dist/{extensions.js → runtime/extensions.js} +2 -1
- package/dist/runtime/full-launch.d.ts +1 -0
- package/dist/runtime/full-launch.js +34 -0
- package/dist/runtime/global-flag.d.ts +5 -0
- package/dist/runtime/global-flag.js +18 -0
- package/dist/{playwright-config.d.ts → runtime/playwright-config.d.ts} +1 -1
- package/dist/{playwright.config.js → runtime/playwright.config.js} +3 -2
- package/dist/runtime/run-log.d.ts +2 -0
- package/dist/runtime/run-log.js +17 -0
- package/dist/{video-dir.js → runtime/video-dir.js} +3 -2
- package/dist/{config.d.ts → runtime/waygraph-config.d.ts} +6 -9
- package/dist/{config.js → runtime/waygraph-config.js} +21 -51
- package/dist/{webserver.js → runtime/webserver.js} +5 -30
- package/examples/routed-demo/config/waygraph.config.ts +20 -0
- package/examples/routed-demo/package.json +1 -4
- package/examples/routed-demo/scripts/fixture-server.mjs +1 -1
- package/examples/routed-demo/src/flows/routed-demo-map.flow.ts +2 -4
- package/examples/routed-demo/src/flows/routed-demo.flow.ts +1 -2
- package/examples/routed-demo/src/map/(app_base)/dashboard/_methods/click-widget.block.ts +5 -4
- package/examples/routed-demo/src/map/(app_base)/dashboard/_nav.block.ts +3 -3
- package/examples/routed-demo/src/map/(app_base)/dashboard/_page.block.ts +3 -3
- package/examples/routed-demo/src/map/(external)/docs/_nav.block.ts +3 -3
- package/examples/routed-demo/src/map/(external)/docs/_page.block.ts +3 -3
- package/examples/routed-demo/src/states/routed-demo.states.ts +5 -3
- package/examples/routed-demo/tests/routed-demo.spec.ts +4 -4
- package/examples/routed-demo/tsconfig.json +1 -1
- package/examples/saucedemo/docs/CONVENTION.md +4 -5
- package/examples/saucedemo/docs/HELPERS.md +11 -11
- package/examples/saucedemo/src/blocks/SITE-MAP.md +0 -1
- package/examples/saucedemo/src/blocks/saucedemo-web/NAV.md +1 -5
- package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +5 -8
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +35 -43
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +4 -5
- package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
- package/examples/saucedemo/src/flows/api-demo.flow.ts +12 -10
- package/examples/saucedemo/src/states/checkout.states.ts +21 -11
- package/examples/saucedemo/src/stubs/device-showcase.ts +8 -10
- package/examples/saucedemo/tests/auto-graph.spec.ts +4 -12
- package/package.json +14 -6
- package/templates/agents/waygraph-planner.agent.md +2 -2
- package/templates/quickstart/docs/CONVENTION.md +4 -4
- package/templates/quickstart/docs/HELPERS.md +10 -8
- package/templates/quickstart/package.json +0 -3
- package/templates/quickstart/src/blocks/SITE-MAP.md +0 -1
- package/templates/quickstart/src/blocks/saucedemo-web/NAV.md +1 -5
- package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +5 -8
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +35 -43
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +4 -5
- package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
- package/templates/quickstart/src/flows/api-demo.flow.ts +12 -10
- package/templates/quickstart/src/states/checkout.states.ts +21 -11
- package/templates/quickstart/src/stubs/device-showcase.ts +8 -10
- package/templates/scaffold/README.md +2 -1
- package/templates/scaffold/STRUCTURE.md +5 -4
- package/templates/scaffold/config/waygraph.config.ts +1 -0
- package/templates/scaffold/gitignore +1 -0
- package/templates/scaffold/src/flows/README.md +2 -2
- package/templates/scaffold/src/map/(app_base)/docs/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/docs/_page.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/_methods/add-item.effect.block.ts +4 -4
- package/templates/scaffold/src/map/(app_base)/home/_methods/assert-hello.method.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/_methods/assert-item-added.method.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/_methods/clear-cart.method.block.ts +5 -4
- package/templates/scaffold/src/map/(app_base)/home/_methods/remove-item.effect.block.ts +4 -4
- package/templates/scaffold/src/map/(app_base)/home/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/_page.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/nav-verification-link.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_keys.ts +21 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-body.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-header.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-status.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/pick-extension-interceptor.method.block.ts +5 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-body.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-headers.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/send-request.method.block.ts +5 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-bearer-token.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-headers.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-json-body.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-method.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-query-params.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-url.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/hoppscotch/_page.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/hoppscotch/_states.ts +6 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/settings/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/mailpit/_keys.ts +13 -0
- package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-content.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-received.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/mailpit/_methods/extract-email-link.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/mailpit/_methods/open-message.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/mailpit/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/mailpit/_page.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/mailpit/_states.ts +9 -0
- package/templates/scaffold/src/map/README.md +7 -0
- package/templates/scaffold/src/states/README.md +4 -1
- package/templates/scaffold/src/states/demo.mem-keys.ts +1 -29
- package/templates/scaffold/src/states/demo.states.ts +14 -20
- package/templates/scaffold/tests/hoppscotch.spec.ts +1 -11
- package/templates/scaffold/tests/mail-verify.spec.ts +2 -2
- package/templates/skills/waygraph-blind-pilot.skill.md +2 -6
- package/templates/skills/waygraph-convention.skill.md +23 -14
- package/templates/skills/waygraph-pilot.skill.md +7 -4
- package/dist/auto-session/session.d.ts +0 -193
- package/dist/auto-session/session.js +0 -719
- package/dist/auto-session/verbose-log.js +0 -16
- package/dist/auto-session.d.ts +0 -2
- package/dist/auto-session.js +0 -3
- package/dist/cli/discover.d.ts +0 -40
- package/dist/cli/discover.js +0 -148
- package/dist/commands/agent-dive.js +0 -52
- package/dist/commands/check.js +0 -192
- package/dist/commands/map.js +0 -29
- package/dist/commands/run.js +0 -104
- package/dist/commands/session.js +0 -600
- package/dist/commands/traverse.js +0 -177
- package/dist/core/block.d.ts +0 -109
- package/dist/core/blocks/effect.js +0 -23
- package/dist/core/config.js +0 -17
- package/dist/core/engine.d.ts +0 -198
- package/dist/core/flow.d.ts +0 -294
- package/dist/core/flow.js +0 -432
- package/dist/core/map-builder.js +0 -383
- package/dist/core.d.ts +0 -14
- package/dist/core.js +0 -15
- package/dist/highlights/merge.d.ts +0 -8
- package/dist/highlights/merge.js +0 -173
- package/dist/highlights/run-phase.d.ts +0 -43
- package/dist/highlights/stub-ctx.d.ts +0 -10
- package/dist/highlights/stub-ctx.js +0 -331
- package/dist/highlights/types.d.ts +0 -613
- package/dist/highlights.d.ts +0 -9
- package/dist/highlights.js +0 -10
- package/dist/pilot-overlay.d.ts +0 -5
- package/dist/pilot-overlay.js +0 -6
- package/dist/runner/banner-log.js +0 -63
- package/dist/runner/chain-run.js +0 -102
- package/dist/runner/cursor.js +0 -140
- package/dist/runner/demo-log.js +0 -316
- package/dist/runner/device-stage.d.ts +0 -9
- package/dist/runner/device-stage.js +0 -420
- package/dist/runner/discovery.js +0 -105
- package/dist/runner/index.js +0 -2
- package/dist/runner/inpage/banner.d.ts +0 -21
- package/dist/runner/inpage/banner.js +0 -156
- package/dist/runner/inpage/caption.d.ts +0 -3
- package/dist/runner/inpage/caption.js +0 -23
- package/dist/runner/inpage/core.d.ts +0 -4
- package/dist/runner/inpage/core.js +0 -316
- package/dist/runner/inpage/device.d.ts +0 -3
- package/dist/runner/inpage/device.js +0 -211
- package/dist/runner/inpage/network.d.ts +0 -15
- package/dist/runner/inpage/network.js +0 -217
- package/dist/runner/inpage/panel-chrome.js +0 -192
- package/dist/runner/inpage/stamp.js +0 -46
- package/dist/runner/inpage/swipe-zoom.js +0 -220
- package/dist/runner/inpage/todos.js +0 -337
- package/dist/runner/interaction-patch.js +0 -384
- package/dist/runner/main.js +0 -469
- package/dist/runner/network-capture.d.ts +0 -9
- package/dist/runner/network-capture.js +0 -126
- package/dist/runner/overlay-css.d.ts +0 -3
- package/dist/runner/overlay-css.js +0 -377
- package/dist/runner/overlay-install.js +0 -90
- package/dist/runner/overlay-stage.js +0 -110
- package/dist/runner/rings.js +0 -514
- package/dist/runner/seed-mem.js +0 -110
- package/dist/runner/slides.js +0 -278
- package/dist/runner/step-mode.js +0 -703
- package/dist/runner/step-panels.js +0 -729
- package/dist/runner/teardown.js +0 -202
- package/dist/runner/todo-dock.js +0 -142
- package/dist/session/auto-explore-run.d.ts +0 -40
- package/dist/session/auto-explore-run.js +0 -707
- package/dist/session/step-overlay.d.ts +0 -37
- package/dist/session/step-overlay.js +0 -244
- package/dist/traverse/run.js +0 -423
- package/examples/routed-demo/playwright.config.ts +0 -21
- package/examples/saucedemo/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
- package/templates/quickstart/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
- /package/dist/{commands → cli/commands}/agent-dive-scaffold.d.ts +0 -0
- /package/dist/{commands → cli/commands}/agent-dive.d.ts +0 -0
- /package/dist/{commands → cli/commands}/extensions.d.ts +0 -0
- /package/dist/{commands → cli/commands}/init.d.ts +0 -0
- /package/dist/{commands → cli/commands}/list.d.ts +0 -0
- /package/dist/{commands → cli/commands}/map.d.ts +0 -0
- /package/dist/{commands → cli/commands}/session.d.ts +0 -0
- /package/dist/{commands → cli/commands}/test.d.ts +0 -0
- /package/dist/{commands → cli/commands}/traverse.d.ts +0 -0
- /package/dist/{commands → cli/commands}/try.d.ts +0 -0
- /package/dist/{commands → cli/commands}/upgrade.d.ts +0 -0
- /package/dist/{highlights → demo/narration}/shorthand.js +0 -0
- /package/dist/{session/overlay-beacon.d.ts → demo/overlay/beacon.d.ts} +0 -0
- /package/dist/{session/overlay-beacon.js → demo/overlay/beacon.js} +0 -0
- /package/dist/{pilot-overlay/action-ring.d.ts → demo/overlay/pilot/actions.d.ts} +0 -0
- /package/dist/{ui → demo/overlay/ui}/components/ring.d.ts +0 -0
- /package/dist/{ui → demo/overlay/ui}/stylesheet.d.ts +0 -0
- /package/dist/{ui → demo/overlay/ui}/stylesheet.js +0 -0
- /package/dist/{ui → demo/overlay/ui}/tokens.d.ts +0 -0
- /package/dist/{ui → demo/overlay/ui}/tokens.js +0 -0
- /package/dist/{highlights → demo}/types.js +0 -0
- /package/dist/{auto-session → demo}/verbose-log.d.ts +0 -0
- /package/dist/{selector.d.ts → engine/trait/selector.d.ts} +0 -0
- /package/dist/{selector.js → engine/trait/selector.js} +0 -0
- /package/dist/{traverse → live/traverse}/coverage.d.ts +0 -0
- /package/dist/{traverse → live/traverse}/coverage.js +0 -0
- /package/dist/{traverse → live/traverse}/lease.d.ts +0 -0
- /package/dist/{traverse → live/traverse}/lease.js +0 -0
- /package/dist/{session/block-inject.d.ts → manifest/roots.d.ts} +0 -0
- /package/dist/{blocks-select.d.ts → manifest/select.d.ts} +0 -0
- /package/dist/{blocks-select.js → manifest/select.js} +0 -0
- /package/dist/{browser.d.ts → runtime/browser.d.ts} +0 -0
- /package/dist/{env-file.d.ts → runtime/env-file.d.ts} +0 -0
- /package/dist/{playwright-config.js → runtime/playwright-config.js} +0 -0
- /package/dist/{playwright.config.d.ts → runtime/playwright.config.d.ts} +0 -0
- /package/dist/{video-dir.d.ts → runtime/video-dir.d.ts} +0 -0
- /package/dist/{webserver.d.ts → runtime/webserver.d.ts} +0 -0
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
export function installTodos({ todoPos }) {
|
|
2
|
+
// Floating todo dock - lives outside #wg-panel so --mini / Hide never
|
|
3
|
+
// hide the checklist. Click cycles left <-> right with CSS transform.
|
|
4
|
+
// Authors set side via ctx.todos(id, items, { pos }); env / --todo-* fallback.
|
|
5
|
+
// Payload:
|
|
6
|
+
// { sync: "clear" } -> remove dock
|
|
7
|
+
// { sync: "keep" } -> leave dock alone (no wipe)
|
|
8
|
+
// { sync: "set", dock } / { sync:"set", list } -> render / recreate
|
|
9
|
+
window.__wgSyncTodos = (payload, pos) => {
|
|
10
|
+
const syncPayload = payload;
|
|
11
|
+
let sync = "set";
|
|
12
|
+
let list = [];
|
|
13
|
+
let dockState = null;
|
|
14
|
+
let wantPos = pos === "left" || pos === "right" ? pos : null;
|
|
15
|
+
if (payload && typeof payload === "object") {
|
|
16
|
+
sync = payload.sync === "clear" || payload.sync === "keep" ? payload.sync : "set";
|
|
17
|
+
dockState = payload.dock || null;
|
|
18
|
+
if (payload.pos === "left" || payload.pos === "right")
|
|
19
|
+
wantPos = payload.pos;
|
|
20
|
+
if (Array.isArray(payload.list))
|
|
21
|
+
list = payload.list;
|
|
22
|
+
else if (dockState && Array.isArray(dockState.groups)) {
|
|
23
|
+
// The flat list; the full dock is rendered below.
|
|
24
|
+
list = [];
|
|
25
|
+
for (const g of dockState.groups) {
|
|
26
|
+
if (g && Array.isArray(g.items))
|
|
27
|
+
list = list.concat(g.items);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
list = [];
|
|
33
|
+
sync = "clear";
|
|
34
|
+
}
|
|
35
|
+
let dockKey = (dockState && dockState.id && String(dockState.id).trim()) ||
|
|
36
|
+
(payload && !Array.isArray(payload) && payload.todoId && String(payload.todoId).trim()) ||
|
|
37
|
+
"_default";
|
|
38
|
+
// Drop any in-panel leftover (old builds put #wg-todos in .wg-body).
|
|
39
|
+
__wgQA("#wg-panel #wg-todos").forEach((el) => el.remove());
|
|
40
|
+
const allDocks = () => [...__wgQA(".wg-todo-dock, #wg-todo-dock")].filter((el, i, arr) => arr.indexOf(el) === i);
|
|
41
|
+
const relayoutTodoDocks = () => {
|
|
42
|
+
const docks = allDocks();
|
|
43
|
+
// Must match .wg-todo-dock/#wg-todo-dock's own CSS `top` (demo/overlay/overlay-css.ts,
|
|
44
|
+
// ui/css/dock.css) - this inline style OVERRIDES that CSS the instant more than one
|
|
45
|
+
// dock exists (multi-todo stacking), so a CSS-only change here is silently underwater;
|
|
46
|
+
// real bug this was: the CSS top was bumped 72 -> 104 for banner clearance, but this
|
|
47
|
+
// hardcoded 72 kept winning at runtime and nothing actually moved.
|
|
48
|
+
let top = 104;
|
|
49
|
+
for (const el of docks) {
|
|
50
|
+
el.style.top = top + "px";
|
|
51
|
+
top += Math.max(48, el.getBoundingClientRect().height) + 10;
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
const findDock = (key) => {
|
|
55
|
+
if (key === "_default") {
|
|
56
|
+
return (__wgQ('.wg-todo-dock[data-wg-todo-key="_default"]') ||
|
|
57
|
+
__wgById("wg-todo-dock"));
|
|
58
|
+
}
|
|
59
|
+
const all = __wgQA(".wg-todo-dock");
|
|
60
|
+
for (let i = 0; i < all.length; i++) {
|
|
61
|
+
if (all[i].getAttribute("data-wg-todo-key") === String(key))
|
|
62
|
+
return all[i];
|
|
63
|
+
}
|
|
64
|
+
return null;
|
|
65
|
+
};
|
|
66
|
+
// keep + no new payload: do not remove existing docks (PIA #10).
|
|
67
|
+
if (sync === "keep") {
|
|
68
|
+
if (!dockState && !list.length)
|
|
69
|
+
return;
|
|
70
|
+
// After navigation the DOM may be gone - recreate from carried dock.
|
|
71
|
+
sync = "set";
|
|
72
|
+
}
|
|
73
|
+
// Default replace=true: one checklist. parallel docks only when replace:false.
|
|
74
|
+
const replace = !(payload && !Array.isArray(payload) && payload.replace === false) &&
|
|
75
|
+
!(payload && !Array.isArray(payload) && payload.parallel === true);
|
|
76
|
+
const hasDock = !!(dockState && Array.isArray(dockState.groups) && dockState.groups.length);
|
|
77
|
+
// Explicit clear only - never treat "set + dock + empty list" as clear
|
|
78
|
+
// (that thrash was marks -> blank in a few ms).
|
|
79
|
+
if (sync === "clear" || (sync === "set" && !hasDock && !list.length)) {
|
|
80
|
+
const clearId = (payload && !Array.isArray(payload) && payload.todoId && String(payload.todoId).trim()) ||
|
|
81
|
+
(dockState && dockState.id && String(dockState.id).trim()) ||
|
|
82
|
+
"";
|
|
83
|
+
if (clearId && !replace) {
|
|
84
|
+
const el = findDock(clearId);
|
|
85
|
+
if (el)
|
|
86
|
+
el.remove();
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
allDocks().forEach((el) => el.remove());
|
|
90
|
+
}
|
|
91
|
+
relayoutTodoDocks();
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
if (sync === "set" && replace) {
|
|
95
|
+
// Drop sibling docks so we never stack duplicates.
|
|
96
|
+
for (const el of allDocks()) {
|
|
97
|
+
const key = el.getAttribute("data-wg-todo-key") || "_default";
|
|
98
|
+
if (key !== dockKey)
|
|
99
|
+
el.remove();
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
const POS = ["left", "right"];
|
|
103
|
+
let dock = findDock(dockKey);
|
|
104
|
+
if (!dock) {
|
|
105
|
+
dock = document.createElement("div");
|
|
106
|
+
dock.className = "wg-todo-dock";
|
|
107
|
+
dock.setAttribute("data-wg-todo-key", dockKey);
|
|
108
|
+
if (dockKey === "_default")
|
|
109
|
+
dock.id = "wg-todo-dock";
|
|
110
|
+
else
|
|
111
|
+
dock.id = "wg-todo-dock--" + dockKey.replace(/[^a-zA-Z0-9_-]/g, "-");
|
|
112
|
+
dock.setAttribute("data-wg-ui", "1");
|
|
113
|
+
dock.setAttribute("data-wg-modal", "todos");
|
|
114
|
+
dock.setAttribute("data-wg-ready", "1");
|
|
115
|
+
let saved = null;
|
|
116
|
+
try {
|
|
117
|
+
saved = localStorage.getItem("wg-todo-pos");
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
/* ignore */
|
|
121
|
+
}
|
|
122
|
+
const start = wantPos ||
|
|
123
|
+
(saved && POS.includes(saved) ? saved : todoPos === "right" ? "right" : "left");
|
|
124
|
+
dock.dataset.pos = start;
|
|
125
|
+
dock.title = "Click to move checklist: left / right";
|
|
126
|
+
dock.addEventListener("click", (e) => {
|
|
127
|
+
e.stopPropagation();
|
|
128
|
+
const i = POS.indexOf(dock.dataset.pos || "left");
|
|
129
|
+
const next = POS[(i + 1) % POS.length];
|
|
130
|
+
dock.dataset.pos = next;
|
|
131
|
+
try {
|
|
132
|
+
localStorage.setItem("wg-todo-pos", next ?? "left");
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
/* ignore */
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
__wgAdd(dock);
|
|
139
|
+
}
|
|
140
|
+
else if (wantPos) {
|
|
141
|
+
dock.dataset.pos = wantPos;
|
|
142
|
+
try {
|
|
143
|
+
localStorage.setItem("wg-todo-pos", wantPos);
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
/* ignore */
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
const trimmedId = (raw) => (raw != null && String(raw).trim() ? String(raw).trim() : undefined);
|
|
150
|
+
// Compact + cap: >cap rows folds overflow; hover shows up to expandCap; "+N more" pins expand.
|
|
151
|
+
const ui = (payload && !Array.isArray(payload) && payload.ui) || window.__wgTodoDockUi || {};
|
|
152
|
+
const COMPACT_AT = Number(ui.cap) > 0 ? Number(ui.cap) : 5;
|
|
153
|
+
const WINDOW = COMPACT_AT;
|
|
154
|
+
const EXPAND_MAX = Number(ui.expandCap) > 0 ? Number(ui.expandCap) : 14;
|
|
155
|
+
const compactEnabled = ui.compact !== false;
|
|
156
|
+
const flattenItems = () => {
|
|
157
|
+
if (dockState && Array.isArray(dockState.groups) && dockState.groups.length) {
|
|
158
|
+
const out = [];
|
|
159
|
+
for (const g of dockState.groups) {
|
|
160
|
+
for (const t of g.items || [])
|
|
161
|
+
out.push({ ...t, __style: g.style || dockState.style });
|
|
162
|
+
}
|
|
163
|
+
return out;
|
|
164
|
+
}
|
|
165
|
+
return (list || []).map((t) => ({ ...t, __style: "sequential" }));
|
|
166
|
+
};
|
|
167
|
+
const windowBounds = (items, cap) => {
|
|
168
|
+
const n = items.length;
|
|
169
|
+
if (n <= cap)
|
|
170
|
+
return { start: 0, end: n };
|
|
171
|
+
let cur = items.findIndex((t) => t.current);
|
|
172
|
+
if (cur < 0)
|
|
173
|
+
cur = items.findIndex((t) => !t.done);
|
|
174
|
+
if (cur < 0)
|
|
175
|
+
cur = 0;
|
|
176
|
+
let start = Math.max(0, cur - Math.floor((cap - 1) / 2));
|
|
177
|
+
let end = Math.min(n, start + cap);
|
|
178
|
+
start = Math.max(0, end - cap);
|
|
179
|
+
return { start, end };
|
|
180
|
+
};
|
|
181
|
+
const renderItems = (items, style, foldMeta, indexOffset) => {
|
|
182
|
+
const offset = indexOffset || 0;
|
|
183
|
+
const rawStyle = String(style || "sequential").toLowerCase();
|
|
184
|
+
const st = rawStyle === "checklist"
|
|
185
|
+
? "checklist"
|
|
186
|
+
: rawStyle === "bullets" ||
|
|
187
|
+
rawStyle === "bullet" ||
|
|
188
|
+
rawStyle === "list" ||
|
|
189
|
+
rawStyle === "ul" ||
|
|
190
|
+
rawStyle === "points" ||
|
|
191
|
+
rawStyle === "plain"
|
|
192
|
+
? "bullets"
|
|
193
|
+
: "sequential";
|
|
194
|
+
const foldStart = foldMeta ? foldMeta.foldStart : -1;
|
|
195
|
+
const foldEnd = foldMeta ? foldMeta.foldEnd : -1;
|
|
196
|
+
const deepStart = foldMeta ? foldMeta.deepStart : -1;
|
|
197
|
+
const deepEnd = foldMeta ? foldMeta.deepEnd : -1;
|
|
198
|
+
return __wgEl("ul", { class: "wg-todos-list", data: { wgTodoStyle: st } }, (items || []).map((t, idx) => {
|
|
199
|
+
const gi = offset + idx;
|
|
200
|
+
const clsBase = st === "bullets"
|
|
201
|
+
? t.done
|
|
202
|
+
? "wg-todo-done"
|
|
203
|
+
: "wg-todo-pending"
|
|
204
|
+
: t.current
|
|
205
|
+
? "wg-todo-current"
|
|
206
|
+
: t.done
|
|
207
|
+
? "wg-todo-done"
|
|
208
|
+
: "wg-todo-pending";
|
|
209
|
+
let foldCls = "";
|
|
210
|
+
if (foldStart >= 0 && (gi < foldStart || gi >= foldEnd))
|
|
211
|
+
foldCls += " wg-todo-fold";
|
|
212
|
+
if (deepStart >= 0 && (gi < deepStart || gi >= deepEnd))
|
|
213
|
+
foldCls += " wg-todo-fold-deep";
|
|
214
|
+
let mark;
|
|
215
|
+
if (st === "checklist") {
|
|
216
|
+
mark = t.done ? "☑" : "☐";
|
|
217
|
+
}
|
|
218
|
+
else if (st === "bullets") {
|
|
219
|
+
mark = "•";
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
mark = t.done ? "✓" : t.current ? "→" : "○";
|
|
223
|
+
}
|
|
224
|
+
return __wgEl("li", { class: clsBase + foldCls, data: { wgTodoItem: trimmedId(t.id) } }, __wgEl("span", { class: "wg-todo-mark" }, mark), __wgEl("span", null, t.text || ""));
|
|
225
|
+
}));
|
|
226
|
+
};
|
|
227
|
+
if (dockKey !== "_default")
|
|
228
|
+
dock.setAttribute("data-wg-todo-id", dockKey);
|
|
229
|
+
else
|
|
230
|
+
dock.removeAttribute("data-wg-todo-id");
|
|
231
|
+
const flat = flattenItems();
|
|
232
|
+
const compact = compactEnabled && flat.length > COMPACT_AT;
|
|
233
|
+
const win = windowBounds(flat, WINDOW);
|
|
234
|
+
const expand = windowBounds(flat, EXPAND_MAX);
|
|
235
|
+
const foldMeta = compact
|
|
236
|
+
? {
|
|
237
|
+
foldStart: win.start,
|
|
238
|
+
foldEnd: win.end,
|
|
239
|
+
deepStart: expand.start,
|
|
240
|
+
deepEnd: expand.end,
|
|
241
|
+
}
|
|
242
|
+
: null;
|
|
243
|
+
const hiddenCompact = compact ? flat.length - (win.end - win.start) : 0;
|
|
244
|
+
const hiddenExpand = compact ? flat.length - (expand.end - expand.start) : 0;
|
|
245
|
+
const children = [];
|
|
246
|
+
if (dockState && Array.isArray(dockState.groups) && dockState.groups.length) {
|
|
247
|
+
const dockTitle = dockState.title && String(dockState.title).trim();
|
|
248
|
+
if (dockTitle)
|
|
249
|
+
children.push(__wgEl("div", { class: "wg-todo-dock-title" }, dockTitle));
|
|
250
|
+
let globalIdx = 0;
|
|
251
|
+
for (const g of dockState.groups) {
|
|
252
|
+
const gTitle = g.title && String(g.title).trim();
|
|
253
|
+
const gItems = g.items || [];
|
|
254
|
+
children.push(__wgEl("div", { class: "wg-todo-group", data: { wgTodoGroup: trimmedId(g.id) } }, gTitle ? __wgEl("div", { class: "wg-todo-group-title" }, gTitle) : null, renderItems(gItems, g.style || dockState.style, foldMeta, globalIdx)));
|
|
255
|
+
globalIdx += gItems.length;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
children.push(renderItems(list, "sequential", foldMeta, 0));
|
|
260
|
+
}
|
|
261
|
+
if (compact && hiddenCompact > 0) {
|
|
262
|
+
const n = dock.dataset.expanded === "1" ? hiddenExpand : hiddenCompact;
|
|
263
|
+
if (n > 0) {
|
|
264
|
+
children.push(__wgEl("div", { class: "wg-todo-more", data: { wgTodoMore: "1" }, title: "Click to expand / collapse" }, "+" + n + " more"));
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
if (compact)
|
|
268
|
+
dock.dataset.compact = "1";
|
|
269
|
+
else {
|
|
270
|
+
delete dock.dataset.compact;
|
|
271
|
+
delete dock.dataset.expanded;
|
|
272
|
+
}
|
|
273
|
+
__wgSet(dock, children);
|
|
274
|
+
const moreBtn = dock.querySelector("[data-wg-todo-more]");
|
|
275
|
+
if (moreBtn) {
|
|
276
|
+
moreBtn.addEventListener("click", (e) => {
|
|
277
|
+
e.stopPropagation();
|
|
278
|
+
if (dock.dataset.expanded === "1")
|
|
279
|
+
delete dock.dataset.expanded;
|
|
280
|
+
else
|
|
281
|
+
dock.dataset.expanded = "1";
|
|
282
|
+
if (window.__wgSyncTodos && dock._wgLastPayload) {
|
|
283
|
+
window.__wgSyncTodos(dock._wgLastPayload);
|
|
284
|
+
}
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
dock._wgLastPayload = syncPayload;
|
|
288
|
+
relayoutTodoDocks();
|
|
289
|
+
if (window.__wgStampModal) {
|
|
290
|
+
window.__wgStampModal(dock, "todos", { ready: true });
|
|
291
|
+
}
|
|
292
|
+
};
|
|
293
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Locator, Page } from "@playwright/test";
|
|
2
|
+
/** How a click is performed once the theater has shown it. */
|
|
3
|
+
export type ClickGesture = "click" | "tap" | "hold";
|
|
4
|
+
export interface LocatorTheater {
|
|
5
|
+
/** Before the value is typed: cursor, ring, typing badge. A failure here never stops the fill. */
|
|
6
|
+
beforeFill(locator: Locator, options: {
|
|
7
|
+
timeout?: number;
|
|
8
|
+
} | undefined): Promise<void>;
|
|
9
|
+
/** Per-character typing delay, ms. */
|
|
10
|
+
typingDelay(): number;
|
|
11
|
+
afterFill(locator: Locator): Promise<void>;
|
|
12
|
+
/** Before the click: cursor, ring, pulse. Returns the gesture to perform. A failure here never stops the click. */
|
|
13
|
+
beforeClick(locator: Locator, options: {
|
|
14
|
+
timeout?: number;
|
|
15
|
+
} | undefined): Promise<ClickGesture>;
|
|
16
|
+
/** How long a "hold" keeps the press down, ms. */
|
|
17
|
+
holdMs(): number;
|
|
18
|
+
afterClick(locator: Locator): Promise<void>;
|
|
19
|
+
/** A shorter timeout for a wait that may never succeed (a probe), or the declared one. */
|
|
20
|
+
capWait?(declaredMs: number): number;
|
|
21
|
+
/** A shorter plain sleep. */
|
|
22
|
+
capSleep?(ms: number): number;
|
|
23
|
+
}
|
|
24
|
+
/** Shows every fill and click on `page` through `theater` from now on. */
|
|
25
|
+
export declare function setLocatorTheater(page: Page, theater: LocatorTheater): void;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { isPageGone } from "../../engine/page-gone.js";
|
|
2
|
+
const theaters = new WeakMap();
|
|
3
|
+
/** Shows every fill and click on `page` through `theater` from now on. */
|
|
4
|
+
export function setLocatorTheater(page, theater) {
|
|
5
|
+
theaters.set(page, theater);
|
|
6
|
+
patchLocator(Object.getPrototypeOf(page.locator("html")));
|
|
7
|
+
patchPage(Object.getPrototypeOf(page));
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* The theater only shows the action; the action itself must still run. So a theater failure is printed (unless the page
|
|
11
|
+
* simply went away) and the real fill / click goes ahead.
|
|
12
|
+
*/
|
|
13
|
+
function theaterFailed(err) {
|
|
14
|
+
if (!isPageGone(err))
|
|
15
|
+
console.error(`waygraph: overlay: ${err instanceof Error ? err.message.split("\n")[0] : String(err)}`);
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
function patchLocator(proto) {
|
|
19
|
+
if (proto.__wgTheaterPatched)
|
|
20
|
+
return;
|
|
21
|
+
proto.__wgTheaterPatched = true;
|
|
22
|
+
const { fill, click, waitFor } = proto;
|
|
23
|
+
proto.fill = async function (value, options) {
|
|
24
|
+
const theater = theaters.get(this.page());
|
|
25
|
+
if (!theater)
|
|
26
|
+
return fill.call(this, value, options);
|
|
27
|
+
await theater.beforeFill(this, options).catch(theaterFailed);
|
|
28
|
+
try {
|
|
29
|
+
// Not this.clear(): Locator.clear() is fill(""), which would come back into this wrapper.
|
|
30
|
+
await fill.call(this, "", { ...(options?.timeout !== undefined ? { timeout: options.timeout } : {}) });
|
|
31
|
+
await this.pressSequentially(String(value), { delay: theater.typingDelay(), ...(options?.timeout !== undefined ? { timeout: options.timeout } : {}) });
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// An element pressSequentially can't type into (a contenteditable, say): Playwright's own fill.
|
|
35
|
+
await fill.call(this, value, options);
|
|
36
|
+
}
|
|
37
|
+
await theater.afterFill(this);
|
|
38
|
+
};
|
|
39
|
+
proto.click = async function (options) {
|
|
40
|
+
const theater = theaters.get(this.page());
|
|
41
|
+
if (!theater)
|
|
42
|
+
return click.call(this, options);
|
|
43
|
+
const gesture = (await theater.beforeClick(this, options).catch(theaterFailed)) ?? "click";
|
|
44
|
+
if (gesture === "hold")
|
|
45
|
+
await click.call(this, { ...(options ?? {}), delay: theater.holdMs() });
|
|
46
|
+
else if (gesture === "tap") {
|
|
47
|
+
try {
|
|
48
|
+
await this.tap(options);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// A context without touch: a real click.
|
|
52
|
+
await click.call(this, options);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
else
|
|
56
|
+
await click.call(this, options);
|
|
57
|
+
await theater.afterClick(this);
|
|
58
|
+
};
|
|
59
|
+
proto.waitFor = function (options) {
|
|
60
|
+
const theater = theaters.get(this.page());
|
|
61
|
+
if (!theater?.capWait)
|
|
62
|
+
return waitFor.call(this, options);
|
|
63
|
+
const declared = options?.timeout ?? 30000;
|
|
64
|
+
return waitFor.call(this, { ...(options ?? {}), timeout: theater.capWait(declared) });
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
function patchPage(proto) {
|
|
68
|
+
if (proto.__wgTheaterPatched)
|
|
69
|
+
return;
|
|
70
|
+
proto.__wgTheaterPatched = true;
|
|
71
|
+
const { waitForTimeout } = proto;
|
|
72
|
+
proto.waitForTimeout = function (ms) {
|
|
73
|
+
const theater = theaters.get(this);
|
|
74
|
+
return waitForTimeout.call(this, theater?.capSleep ? theater.capSleep(ms) : ms);
|
|
75
|
+
};
|
|
76
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { NetworkEntry, WgPage } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Records one entry AND paints it live - the single place that touches page.__wgNetworkHistory,
|
|
4
|
+
* so every caller (this file's own listeners, defineApiBlock) stays in sync automatically. History
|
|
5
|
+
* lives on the Playwright `Page` object (Node side), which survives navigation - the panel DOM
|
|
6
|
+
* (page side, inside the shadow root) does not, and gets wiped on every real navigation. Without
|
|
7
|
+
* this, the "network tab" reset to empty on every step that navigated - not what a persistent
|
|
8
|
+
* Network tab is supposed to do.
|
|
9
|
+
*/
|
|
10
|
+
export declare function recordNetworkEntry(page: WgPage, entry: NetworkEntry): Promise<void | undefined>;
|
|
11
|
+
/**
|
|
12
|
+
* Replays whatever history survived the last navigation back into a freshly (re)installed panel -
|
|
13
|
+
* call this after ensureShadowRoot, every step, same as the rest of the overlay's own per-step
|
|
14
|
+
* resync (banner/todos/device), and BEFORE that step's own network activity can add anything new
|
|
15
|
+
* (installOverlay runs at the very start of a step, so this is always true in practice - no
|
|
16
|
+
* interleaving race between "replay old" and "record new" to reason about). A no-op when there's
|
|
17
|
+
* no history yet, or the panel already shows exactly as many entries as history has (nothing was
|
|
18
|
+
* wiped this step). Otherwise clears and rebuilds from scratch, in order - simpler and more
|
|
19
|
+
* obviously correct than trying to diff/append just the "missing" ones.
|
|
20
|
+
*/
|
|
21
|
+
export declare function restoreNetworkHistory(page: WgPage): Promise<void>;
|
|
22
|
+
export declare function installNetworkCapture(page: WgPage): void;
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { addNetworkEntry, clearNetworkLog } from "./inpage/network.js";
|
|
2
|
+
import { setApiCallRecorder } from "../../engine/run/hooks.js";
|
|
3
|
+
import { ignorePageGone } from "../../engine/page-gone.js";
|
|
4
|
+
// Fetch/XHR/navigation only - a real page can fire dozens of image/font/stylesheet requests per
|
|
5
|
+
// second, which would flood a panel meant to answer "what API calls did this page just made".
|
|
6
|
+
const RELEVANT_TYPES = new Set(["xhr", "fetch", "document"]);
|
|
7
|
+
// Response bodies this size or smaller, and only if they look text-ish, get captured for the
|
|
8
|
+
// detail view - a multi-MB image/video response has no business being buffered into page memory
|
|
9
|
+
// just because a demo happened to be running.
|
|
10
|
+
const MAX_BODY_BYTES = 200_000;
|
|
11
|
+
// Matches the in-page addNetworkEntry's own cap (network.js) - the Node-side history this backs
|
|
12
|
+
// stays in sync with what the panel can actually show.
|
|
13
|
+
const MAX_HISTORY = 30;
|
|
14
|
+
/**
|
|
15
|
+
* Records one entry AND paints it live - the single place that touches page.__wgNetworkHistory,
|
|
16
|
+
* so every caller (this file's own listeners, defineApiBlock) stays in sync automatically. History
|
|
17
|
+
* lives on the Playwright `Page` object (Node side), which survives navigation - the panel DOM
|
|
18
|
+
* (page side, inside the shadow root) does not, and gets wiped on every real navigation. Without
|
|
19
|
+
* this, the "network tab" reset to empty on every step that navigated - not what a persistent
|
|
20
|
+
* Network tab is supposed to do.
|
|
21
|
+
*/
|
|
22
|
+
export function recordNetworkEntry(page, entry) {
|
|
23
|
+
page.__wgNetworkHistory = page.__wgNetworkHistory || [];
|
|
24
|
+
page.__wgNetworkHistory.push(entry);
|
|
25
|
+
while (page.__wgNetworkHistory.length > MAX_HISTORY)
|
|
26
|
+
page.__wgNetworkHistory.shift();
|
|
27
|
+
return page.evaluate(addNetworkEntry, entry).catch(ignorePageGone);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Replays whatever history survived the last navigation back into a freshly (re)installed panel -
|
|
31
|
+
* call this after ensureShadowRoot, every step, same as the rest of the overlay's own per-step
|
|
32
|
+
* resync (banner/todos/device), and BEFORE that step's own network activity can add anything new
|
|
33
|
+
* (installOverlay runs at the very start of a step, so this is always true in practice - no
|
|
34
|
+
* interleaving race between "replay old" and "record new" to reason about). A no-op when there's
|
|
35
|
+
* no history yet, or the panel already shows exactly as many entries as history has (nothing was
|
|
36
|
+
* wiped this step). Otherwise clears and rebuilds from scratch, in order - simpler and more
|
|
37
|
+
* obviously correct than trying to diff/append just the "missing" ones.
|
|
38
|
+
*/
|
|
39
|
+
export async function restoreNetworkHistory(page) {
|
|
40
|
+
const history = page.__wgNetworkHistory;
|
|
41
|
+
if (!history || history.length === 0)
|
|
42
|
+
return;
|
|
43
|
+
// page.__wgNetworkNeedsRestore is set by installNetworkCapture's own framenavigated listener -
|
|
44
|
+
// skip the page.evaluate() round-trip entirely (an extra one on EVERY step otherwise, since this
|
|
45
|
+
// runs from installOverlay every step) unless a real navigation actually happened since the last
|
|
46
|
+
// successful restore. A real, caught perf regression: this used to always evaluate() a shown-count
|
|
47
|
+
// check first, which measurably slowed down every step of every test that had ever captured any
|
|
48
|
+
// traffic at all, not just ones that navigate.
|
|
49
|
+
if (!page.__wgNetworkNeedsRestore)
|
|
50
|
+
return;
|
|
51
|
+
page.__wgNetworkNeedsRestore = false;
|
|
52
|
+
await page.evaluate(clearNetworkLog).catch(ignorePageGone);
|
|
53
|
+
for (const entry of history) {
|
|
54
|
+
await page.evaluate(addNetworkEntry, entry).catch(ignorePageGone);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
export function installNetworkCapture(page) {
|
|
58
|
+
if (page.__wgNetworkCaptureInstalled)
|
|
59
|
+
return;
|
|
60
|
+
page.__wgNetworkCaptureInstalled = true;
|
|
61
|
+
// Marks history as needing a replay - see restoreNetworkHistory's own comment. Main frame only;
|
|
62
|
+
// an iframe navigating doesn't wipe the top-level shadow root the panel lives in.
|
|
63
|
+
page.on("framenavigated", (frame) => {
|
|
64
|
+
if (frame === page.mainFrame())
|
|
65
|
+
page.__wgNetworkNeedsRestore = true;
|
|
66
|
+
});
|
|
67
|
+
const startedAt = new Map();
|
|
68
|
+
page.on("request", (request) => {
|
|
69
|
+
startedAt.set(request, Date.now());
|
|
70
|
+
});
|
|
71
|
+
page.on("requestfinished", async (request) => {
|
|
72
|
+
try {
|
|
73
|
+
if (!RELEVANT_TYPES.has(request.resourceType()))
|
|
74
|
+
return;
|
|
75
|
+
const response = await request.response();
|
|
76
|
+
if (!response)
|
|
77
|
+
return;
|
|
78
|
+
const start = startedAt.get(request);
|
|
79
|
+
startedAt.delete(request);
|
|
80
|
+
let resBody;
|
|
81
|
+
try {
|
|
82
|
+
const contentType = (await response.headerValue("content-type")) || "";
|
|
83
|
+
if (/json|text|xml|html|javascript/.test(contentType)) {
|
|
84
|
+
const buf = await response.body();
|
|
85
|
+
if (buf.length <= MAX_BODY_BYTES)
|
|
86
|
+
resBody = buf.toString("utf8");
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
/* body already consumed / redirected away / not available - best-effort only */
|
|
91
|
+
}
|
|
92
|
+
const [reqHeaders, resHeaders] = await Promise.all([
|
|
93
|
+
request.allHeaders().catch(ignorePageGone),
|
|
94
|
+
response.allHeaders().catch(ignorePageGone),
|
|
95
|
+
]);
|
|
96
|
+
await recordNetworkEntry(page, {
|
|
97
|
+
method: request.method(),
|
|
98
|
+
url: request.url(),
|
|
99
|
+
status: response.status(),
|
|
100
|
+
ok: response.ok(),
|
|
101
|
+
ms: start !== undefined ? Date.now() - start : undefined,
|
|
102
|
+
reqHeaders,
|
|
103
|
+
resHeaders,
|
|
104
|
+
reqBody: request.postData() || undefined,
|
|
105
|
+
resBody,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
/* a capture failure must never break the actual run it's observing */
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
page.on("requestfailed", (request) => {
|
|
113
|
+
startedAt.delete(request);
|
|
114
|
+
if (!RELEVANT_TYPES.has(request.resourceType()))
|
|
115
|
+
return;
|
|
116
|
+
recordNetworkEntry(page, {
|
|
117
|
+
method: request.method(),
|
|
118
|
+
url: request.url(),
|
|
119
|
+
status: 0,
|
|
120
|
+
ok: false,
|
|
121
|
+
reqBody: request.postData() || undefined,
|
|
122
|
+
resBody: request.failure()?.errorText,
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
// defineApiBlock reports its calls through core's hook; show them in the same panel.
|
|
127
|
+
setApiCallRecorder((page, entry) => recordNetworkEntry(page, entry));
|