waygraph 0.15.53 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +13 -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/{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/{commands → cli/commands}/run.d.ts +0 -1
- package/dist/cli/commands/run.js +64 -0
- package/dist/{commands → cli/commands}/session.js +61 -88
- 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 +7 -11
- package/dist/{highlights → demo/narration}/demo-pace.js +9 -11
- package/dist/{highlights → demo/narration}/device.d.ts +4 -2
- package/dist/{highlights → demo/narration}/device.js +3 -1
- package/dist/demo/narration/merge.d.ts +8 -0
- package/dist/demo/narration/merge.js +71 -0
- package/dist/{highlights/run-phase.d.ts → demo/narration/narration.d.ts} +10 -14
- 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 +3 -3
- 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/{session/overlay-beacon.d.ts → demo/overlay/beacon.d.ts} +7 -0
- package/dist/{session/overlay-beacon.js → demo/overlay/beacon.js} +5 -0
- package/dist/demo/overlay/cursor.d.ts +12 -0
- package/dist/demo/overlay/cursor.js +142 -0
- package/dist/demo/overlay/device-stage.d.ts +13 -0
- package/dist/demo/overlay/device-stage.js +396 -0
- package/dist/demo/overlay/inpage/banner.d.ts +1 -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 +1 -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 +9 -0
- package/dist/demo/overlay/inpage/network.js +200 -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 +1 -0
- package/dist/demo/overlay/inpage/todos.js +294 -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 +23 -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 +33 -0
- package/dist/demo/overlay/rings.js +448 -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 +113 -0
- package/dist/demo/stepper/banner-log.d.ts +37 -0
- package/dist/demo/stepper/banner-log.js +63 -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 +31 -0
- package/dist/demo/stepper/demo-log.js +309 -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 +3 -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/slides.d.ts +11 -0
- package/dist/demo/stepper/slides.js +233 -0
- package/dist/demo/stepper/step-panels.d.ts +21 -0
- package/dist/demo/stepper/step-panels.js +589 -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 +48 -0
- package/dist/demo/stepper/teardown.js +179 -0
- package/dist/demo/stepper/todo-advance.d.ts +14 -0
- package/dist/demo/stepper/todo-advance.js +110 -0
- package/dist/demo/stepper/view.d.ts +68 -0
- package/dist/demo/stepper/view.js +31 -0
- package/dist/demo/types.d.ts +17 -0
- package/dist/demo/verbose-log.js +15 -0
- package/dist/{types.d.ts → engine/block/block.d.ts} +106 -91
- package/dist/{core → engine/block}/block.js +10 -53
- package/dist/{core → engine/block}/compose.d.ts +10 -7
- package/dist/{core → engine/block}/compose.js +1 -1
- package/dist/{core/blocks → engine/block/kinds}/api.d.ts +17 -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 +19 -29
- package/dist/{core/blocks → engine/block/kinds}/method.js +7 -21
- package/dist/{core/blocks → engine/block/kinds}/nav.d.ts +22 -31
- package/dist/{core/blocks → engine/block/kinds}/nav.js +6 -12
- package/dist/{core/blocks → engine/block/kinds}/page.d.ts +15 -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} +23 -22
- package/dist/{errors.js → engine/errors.js} +22 -22
- package/dist/{core → engine/flow}/branch-regression.d.ts +8 -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/{core → engine/flow}/map-builder.d.ts +42 -40
- package/dist/{core → engine/flow}/map-builder.js +46 -48
- 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} +9 -11
- package/dist/{core/run-graph.js → engine/run/run.js} +22 -11
- 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/index.d.ts +84 -36
- package/dist/index.js +44 -19
- package/dist/{session/auto-explore-run.d.ts → live/auto/auto.d.ts} +10 -16
- package/dist/{session/auto-explore-run.js → live/auto/auto.js} +164 -248
- 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/{auto-session/session.d.ts → live/auto-session/auto-session.d.ts} +1 -1
- package/dist/{auto-session/session.js → live/auto-session/auto-session.js} +27 -24
- package/dist/{auto-session → live/auto-session}/helpers.d.ts +16 -5
- package/dist/{auto-session → live/auto-session}/helpers.js +1 -1
- package/dist/{session/auto-session-ipc.d.ts → live/auto-session/ipc.d.ts} +7 -5
- package/dist/{session/auto-session-ipc.js → live/auto-session/ipc.js} +31 -16
- 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 +4 -3
- package/dist/{session → live/pilot}/pilot.js +4 -4
- package/dist/{traverse → live/traverse}/coverage.d.ts +4 -0
- package/dist/{traverse → live/traverse}/coverage.js +3 -0
- package/dist/{traverse → live/traverse}/lease.d.ts +1 -0
- package/dist/{traverse → live/traverse}/lease.js +1 -0
- package/dist/{traverse/run.d.ts → live/traverse/traverse.d.ts} +4 -1
- package/dist/{traverse/run.js → live/traverse/traverse.js} +26 -43
- 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/{blocks-select.d.ts → manifest/select.d.ts} +3 -0
- package/dist/{blocks-select.js → manifest/select.js} +2 -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} +2 -5
- package/dist/{extensions.js → runtime/extensions.js} +3 -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} +8 -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 +2 -3
- 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/README.md +11 -12
- package/examples/saucedemo/config/waygraph.config.ts +17 -0
- package/examples/saucedemo/docs/CONVENTION.md +5 -7
- package/examples/saucedemo/docs/HELPERS.md +12 -12
- package/examples/saucedemo/package-lock.json +10 -3
- package/examples/saucedemo/package.json +12 -29
- 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 -52
- 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 +21 -27
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -9
- 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 +10 -76
- 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 -29
- package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -48
- package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +13 -77
- 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 +26 -18
- package/examples/saucedemo/src/flows/cart-bulk.flow.ts +19 -14
- package/examples/saucedemo/src/flows/cart-continue.flow.ts +10 -8
- package/examples/saucedemo/src/flows/cart-mem.flow.ts +7 -7
- package/examples/saucedemo/src/flows/catalog-logout.flow.ts +13 -8
- package/examples/saucedemo/src/flows/checkout-then-browse-again.flow.ts +26 -48
- package/examples/saucedemo/src/flows/checkout.flow.ts +70 -86
- package/examples/saucedemo/src/flows/device-showcase.flow.ts +24 -25
- package/examples/saucedemo/src/flows/login.flow.ts +11 -18
- package/examples/saucedemo/src/flows/mem-stub-demo.flow.ts +9 -20
- package/examples/saucedemo/src/flows/shop.flow.ts +15 -20
- package/examples/saucedemo/src/flows/smoke.flow.ts +12 -27
- package/examples/saucedemo/src/flows/stub-on-error.flow.ts +24 -43
- package/examples/saucedemo/src/flows/viewer-blocked.flow.ts +26 -34
- package/examples/saucedemo/src/states/checkout.mem-stubs.ts +11 -0
- package/examples/saucedemo/src/states/checkout.states.ts +21 -11
- package/examples/saucedemo/src/stubs/device-showcase.ts +191 -0
- package/examples/saucedemo/src/stubs/login.ts +37 -0
- package/examples/saucedemo/tests/auto-graph.spec.ts +4 -12
- package/examples/saucedemo/tests/chain-flow-episodes.spec.ts +7 -9
- package/examples/saucedemo/tests/submit-login-branch.spec.ts +18 -5
- package/package.json +12 -7
- package/templates/agents/waygraph-planner.agent.md +2 -2
- package/templates/quickstart/README.md +4 -7
- package/templates/quickstart/config/waygraph.config.ts +17 -0
- package/templates/quickstart/docs/CONVENTION.md +5 -6
- package/templates/quickstart/docs/HELPERS.md +11 -9
- package/templates/quickstart/package.json +14 -17
- package/templates/quickstart/src/blocks/SITE-MAP.md +13 -3
- package/templates/quickstart/src/blocks/saucedemo-web/NAV.md +1 -5
- package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -52
- 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 +21 -27
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -9
- 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 +10 -76
- 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 -29
- package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -48
- package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +13 -77
- 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 +45 -0
- package/templates/quickstart/src/flows/cart-bulk.flow.ts +19 -14
- package/templates/quickstart/src/flows/cart-continue.flow.ts +10 -8
- package/templates/quickstart/src/flows/cart-mem.flow.ts +7 -7
- package/templates/quickstart/src/flows/catalog-logout.flow.ts +13 -8
- package/templates/quickstart/src/flows/checkout-then-browse-again.flow.ts +26 -48
- package/templates/quickstart/src/flows/checkout.flow.ts +70 -63
- package/templates/quickstart/src/flows/device-showcase.flow.ts +24 -25
- package/templates/quickstart/src/flows/login.flow.ts +11 -18
- package/templates/quickstart/src/flows/mem-stub-demo.flow.ts +12 -0
- package/templates/quickstart/src/flows/shop.flow.ts +15 -20
- package/templates/quickstart/src/flows/smoke.flow.ts +12 -27
- package/templates/quickstart/src/flows/stub-on-error.flow.ts +31 -0
- package/templates/quickstart/src/flows/viewer-blocked.flow.ts +26 -34
- package/templates/quickstart/src/states/checkout.mem-stubs.ts +11 -0
- package/templates/quickstart/src/states/checkout.states.ts +21 -11
- package/templates/quickstart/src/stubs/device-showcase.ts +191 -0
- package/templates/quickstart/src/stubs/login.ts +37 -0
- package/templates/quickstart/tests/chain-flow.spec.ts +7 -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/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/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 -293
- package/dist/core/flow.js +0 -432
- 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/stub-ctx.d.ts +0 -10
- package/dist/highlights/stub-ctx.js +0 -331
- package/dist/highlights/types.d.ts +0 -607
- 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/step-overlay.d.ts +0 -37
- package/dist/session/step-overlay.js +0 -244
- package/examples/routed-demo/playwright.config.ts +0 -21
- package/examples/saucedemo/playwright.config.ts +0 -19
- package/examples/saucedemo/scripts/drive-auto-cli.mjs +0 -93
- package/examples/saucedemo/scripts/prove-add-to-cart-menu.mjs +0 -126
- package/examples/saucedemo/scripts/prove-auto-graph.mjs +0 -92
- package/examples/saucedemo/scripts/prove-wrong-login-runtime.mjs +0 -63
- package/examples/saucedemo/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
- package/templates/quickstart/playwright.config.ts +0 -14
- package/templates/quickstart/scripts/drive-auto-cli.mjs +0 -93
- 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/{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/{trait.js → engine/trait/trait.js} +0 -0
- /package/dist/{session/block-inject.d.ts → manifest/roots.d.ts} +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
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { createStubCtx
|
|
2
|
-
import { applyDefaultZoom, applyDefaultZoomOut,
|
|
1
|
+
import { createStubCtx } from "./stub-ctx.js";
|
|
2
|
+
import { applyDefaultZoom, applyDefaultZoomOut, readStubRaw, resolvePhaseMap } from "./merge.js";
|
|
3
3
|
import { buildTodoDock, normalizeTodoStyle, normalizeTodos } from "./todo-dock.js";
|
|
4
4
|
import { resolveDeviceState } from "./device.js";
|
|
5
5
|
/**
|
|
@@ -7,7 +7,7 @@ import { resolveDeviceState } from "./device.js";
|
|
|
7
7
|
* Returns rings + episode fixtures (todos / todoIndex / zoom).
|
|
8
8
|
*
|
|
9
9
|
* @example
|
|
10
|
-
* const before = await runStubPhase(block, "stubBefore", {
|
|
10
|
+
* const before = await runStubPhase(block, "stubBefore", { mem });
|
|
11
11
|
* // before.todos, before.highlights
|
|
12
12
|
*/
|
|
13
13
|
export async function runStubPhase(block, phase, opts) {
|
|
@@ -18,43 +18,16 @@ export async function runStubPhase(block, phase, opts) {
|
|
|
18
18
|
...(opts?.mem !== undefined ? { mem: opts.mem } : {}),
|
|
19
19
|
});
|
|
20
20
|
const raw = readStubRaw(block, phase);
|
|
21
|
-
if (
|
|
21
|
+
if (raw) {
|
|
22
22
|
try {
|
|
23
|
-
|
|
24
|
-
if (isStubPhase(ret)) {
|
|
25
|
-
bag.highlights = { ...bag.highlights, ...ret };
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
catch {
|
|
29
|
-
/* best-effort */
|
|
23
|
+
await raw(ctx);
|
|
30
24
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
// (no highlights, no todos) isn't mistaken for "didn't run" and re-invoked with a bare
|
|
35
|
-
// Checkpoint that has none of StubCtx's methods - a real, previously-triggered bug (caught via
|
|
36
|
-
// examples/saucedemo/src/flows/checkout.flow.ts's own stubBefore(ctx) { ctx.caption(...) }).
|
|
37
|
-
const bagUntouched = Object.keys(bag).length === 1 && Object.keys(bag.highlights).length === 0;
|
|
38
|
-
if (bagUntouched) {
|
|
39
|
-
try {
|
|
40
|
-
const legacyOut = (opts?.out ?? { __state: "" });
|
|
41
|
-
const ret2 = raw(legacyOut);
|
|
42
|
-
if (isStubPhase(ret2))
|
|
43
|
-
bag.highlights = { ...ret2 };
|
|
44
|
-
}
|
|
45
|
-
catch {
|
|
46
|
-
/* ignore */
|
|
47
|
-
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
// A mistake in the author's stub: shown on the step (the demo's failure panel), never dropped.
|
|
27
|
+
throw new Error(`${block.name}: its ${phase} stub threw: ${err instanceof Error ? err.message : String(err)}`, { cause: err });
|
|
48
28
|
}
|
|
49
29
|
}
|
|
50
|
-
|
|
51
|
-
bag.highlights = { ...raw };
|
|
52
|
-
}
|
|
53
|
-
bag.highlights = applyLegacyHighlightsShim(block, phase, bag.highlights, opts?.out);
|
|
54
|
-
liftLegacySlotTodos(bag);
|
|
55
|
-
const fixturePhase = opts?.fixtures?.[block.name]?.[phase];
|
|
56
|
-
let highlights = mergePhaseMaps(bag.highlights, fixturePhase);
|
|
57
|
-
highlights = applyDefaultZoom(highlights, bag.zoom);
|
|
30
|
+
let highlights = applyDefaultZoom(resolvePhaseMap(bag.highlights), bag.zoom);
|
|
58
31
|
highlights = applyDefaultZoomOut(highlights, bag.zoomOut);
|
|
59
32
|
const todoDock = bag.hideTodos
|
|
60
33
|
? undefined
|
|
@@ -134,45 +107,19 @@ export async function runStubPhase(block, phase, opts) {
|
|
|
134
107
|
export function resolveHighlightSlots(block, phase, opts) {
|
|
135
108
|
const bag = { highlights: {} };
|
|
136
109
|
const raw = readStubRaw(block, phase);
|
|
137
|
-
if (
|
|
110
|
+
if (raw) {
|
|
111
|
+
// Synchronous read: the rings a stub paints before its first await.
|
|
138
112
|
try {
|
|
139
|
-
|
|
140
|
-
...(opts?.out !== undefined ? { out: opts.out } : {}),
|
|
141
|
-
});
|
|
142
|
-
const ret = raw(ctx);
|
|
143
|
-
if (isStubPhase(ret)) {
|
|
144
|
-
bag.highlights = { ...bag.highlights, ...ret };
|
|
145
|
-
}
|
|
113
|
+
void raw(createStubCtx(bag, { ...(opts?.out !== undefined ? { out: opts.out } : {}) }));
|
|
146
114
|
}
|
|
147
|
-
catch {
|
|
148
|
-
|
|
149
|
-
const legacyOut = (opts?.out ?? { __state: "" });
|
|
150
|
-
const ret2 = raw(legacyOut);
|
|
151
|
-
if (isStubPhase(ret2))
|
|
152
|
-
bag.highlights = { ...ret2 };
|
|
153
|
-
}
|
|
154
|
-
catch {
|
|
155
|
-
bag.highlights = {};
|
|
156
|
-
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
throw new Error(`${block.name}: its ${phase} stub threw: ${err instanceof Error ? err.message : String(err)}`, { cause: err });
|
|
157
117
|
}
|
|
158
118
|
}
|
|
159
|
-
|
|
160
|
-
bag.highlights = { ...raw };
|
|
161
|
-
}
|
|
162
|
-
bag.highlights = applyLegacyHighlightsShim(block, phase, bag.highlights, opts?.out);
|
|
163
|
-
liftLegacySlotTodos(bag);
|
|
164
|
-
const fixturePhase = opts?.fixtures?.[block.name]?.[phase];
|
|
165
|
-
return applyDefaultZoom(mergePhaseMaps(bag.highlights, fixturePhase), bag.zoom);
|
|
119
|
+
return applyDefaultZoom(resolvePhaseMap(bag.highlights), bag.zoom);
|
|
166
120
|
}
|
|
167
|
-
/**
|
|
168
|
-
* Resolve multi-step yap slides: flow fixture `slides` wins when present,
|
|
169
|
-
* else `instruction.slides` (function form allowed).
|
|
170
|
-
*/
|
|
121
|
+
/** Resolve multi-step yap slides from `instruction.slides` (function form allowed). */
|
|
171
122
|
export function resolveSlides(block, opts) {
|
|
172
|
-
const fromFixture = opts?.fixtures?.[block.name]?.slides;
|
|
173
|
-
if (fromFixture && fromFixture.length > 0) {
|
|
174
|
-
return [...fromFixture];
|
|
175
|
-
}
|
|
176
123
|
const instr = block.instruction;
|
|
177
124
|
let raw = instr.slides;
|
|
178
125
|
if (typeof raw === "function") {
|
|
@@ -187,40 +134,24 @@ export function resolveSlides(block, opts) {
|
|
|
187
134
|
return [];
|
|
188
135
|
return raw.filter((s) => s && typeof s.caption === "string" && s.caption.length > 0);
|
|
189
136
|
}
|
|
190
|
-
function stubPhaseLooksAuthored(block, phase
|
|
191
|
-
|
|
192
|
-
if (typeof raw === "function")
|
|
193
|
-
return true;
|
|
194
|
-
if (isStubPhase(raw) && Object.keys(raw).length > 0)
|
|
195
|
-
return true;
|
|
196
|
-
const fx = fixtures?.[block.name]?.[phase];
|
|
197
|
-
if (fx && Object.keys(fx).length > 0)
|
|
198
|
-
return true;
|
|
199
|
-
return false;
|
|
137
|
+
function stubPhaseLooksAuthored(block, phase) {
|
|
138
|
+
return readStubRaw(block, phase) !== undefined;
|
|
200
139
|
}
|
|
201
140
|
/**
|
|
202
|
-
* True when the block authored stubAfter (lifecycle fn
|
|
141
|
+
* True when the block authored stubAfter (lifecycle fn or slots).
|
|
203
142
|
* When true, demo should not use verify-trait fallback.
|
|
204
143
|
*/
|
|
205
|
-
export function hasAuthoredStubAfter(block, out
|
|
206
|
-
if (stubPhaseLooksAuthored(block, "stubAfter"
|
|
207
|
-
return true;
|
|
208
|
-
const instr = block.instruction;
|
|
209
|
-
if (instr.highlights)
|
|
144
|
+
export function hasAuthoredStubAfter(block, out) {
|
|
145
|
+
if (stubPhaseLooksAuthored(block, "stubAfter"))
|
|
210
146
|
return true;
|
|
211
|
-
return resolveHighlightSlots(block, "stubAfter", {
|
|
212
|
-
...(out !== undefined ? { out } : {}),
|
|
213
|
-
...(fixtures !== undefined ? { fixtures } : {}),
|
|
214
|
-
}).length > 0;
|
|
147
|
+
return resolveHighlightSlots(block, "stubAfter", out !== undefined ? { out } : {}).length > 0;
|
|
215
148
|
}
|
|
216
149
|
/**
|
|
217
150
|
* True when stubOnError is authored (lifecycle fn and/or rings).
|
|
218
151
|
* Demo fail path only - success never consults this.
|
|
219
152
|
*/
|
|
220
|
-
export function hasAuthoredStubOnError(block
|
|
221
|
-
if (stubPhaseLooksAuthored(block, "stubOnError"
|
|
153
|
+
export function hasAuthoredStubOnError(block) {
|
|
154
|
+
if (stubPhaseLooksAuthored(block, "stubOnError"))
|
|
222
155
|
return true;
|
|
223
|
-
return
|
|
224
|
-
...(fixtures !== undefined ? { fixtures } : {}),
|
|
225
|
-
}).length > 0);
|
|
156
|
+
return resolveHighlightSlots(block, "stubOnError").length > 0;
|
|
226
157
|
}
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* `a, b` lists). A selector/label containing a literal `;` or `|` needs the
|
|
14
14
|
* full-JSON form instead - documented, not silently mishandled.
|
|
15
15
|
*/
|
|
16
|
-
import type { PilotHighlightFixtures } from "../pilot
|
|
16
|
+
import type { PilotHighlightFixtures } from "../overlay/pilot/fixtures.js";
|
|
17
17
|
export type ParsedHighlightShorthand = {
|
|
18
18
|
type: "ok";
|
|
19
19
|
fixtures: PilotHighlightFixtures;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { StubBagState, StubCtx } from "../../engine/stub/stub.js";
|
|
2
|
+
import type { Checkpoint } from "../../engine/checkpoint/checkpoint.js";
|
|
3
|
+
import type { MemPage } from "../../engine/mem/mem.js";
|
|
4
|
+
export declare function createStubCtx<Out extends Checkpoint<string>>(bag: StubBagState, opts: {
|
|
5
|
+
out?: Out;
|
|
6
|
+
error?: unknown;
|
|
7
|
+
mem?: MemPage;
|
|
8
|
+
}): StubCtx<Out>;
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { normalizeTodoPos, normalizeTodoStyle } from "./todo-dock.js";
|
|
2
|
+
import { applyOrientation, normalizeDeviceOrientation, resolveDeviceState } from "./device.js";
|
|
3
|
+
export function createStubCtx(bag, opts) {
|
|
4
|
+
/** One dock per id: its title, style and side; without `parallel` it replaces the dock on screen. */
|
|
5
|
+
const setDock = (id, opts) => {
|
|
6
|
+
bag.todoTouched = true;
|
|
7
|
+
bag.hideTodos = false;
|
|
8
|
+
delete bag.todoGroups;
|
|
9
|
+
const cleaned = id.trim();
|
|
10
|
+
if (cleaned)
|
|
11
|
+
bag.todoId = cleaned;
|
|
12
|
+
else
|
|
13
|
+
delete bag.todoId;
|
|
14
|
+
if (opts.title != null)
|
|
15
|
+
bag.todoTitle = String(opts.title);
|
|
16
|
+
const style = normalizeTodoStyle(opts.style);
|
|
17
|
+
if (style)
|
|
18
|
+
bag.todoStyle = style;
|
|
19
|
+
const pos = normalizeTodoPos(opts.pos);
|
|
20
|
+
if (pos)
|
|
21
|
+
bag.todoPos = pos;
|
|
22
|
+
bag.todoParallel = opts.parallel === true;
|
|
23
|
+
};
|
|
24
|
+
return {
|
|
25
|
+
mem: opts.mem,
|
|
26
|
+
out: opts.out,
|
|
27
|
+
error: opts.error,
|
|
28
|
+
highlights(slots) {
|
|
29
|
+
bag.highlights = { ...(slots || {}) };
|
|
30
|
+
},
|
|
31
|
+
ring(id, stub) {
|
|
32
|
+
bag.highlights = { ...bag.highlights, [id]: stub };
|
|
33
|
+
},
|
|
34
|
+
todos(id, items, opts = {}) {
|
|
35
|
+
setDock(id, opts);
|
|
36
|
+
bag.todos = items;
|
|
37
|
+
if (opts.index != null)
|
|
38
|
+
bag.todoIndex = Number(opts.index);
|
|
39
|
+
if (!items.length)
|
|
40
|
+
bag.hideTodos = true;
|
|
41
|
+
},
|
|
42
|
+
todoIndex(n) {
|
|
43
|
+
bag.todoIndex = n;
|
|
44
|
+
},
|
|
45
|
+
todoGroups(id, groups, opts = {}) {
|
|
46
|
+
setDock(id, opts);
|
|
47
|
+
bag.todoGroups = groups;
|
|
48
|
+
if (!groups.length)
|
|
49
|
+
bag.hideTodos = true;
|
|
50
|
+
},
|
|
51
|
+
hideTodos() {
|
|
52
|
+
bag.todoTouched = true;
|
|
53
|
+
bag.hideTodos = true;
|
|
54
|
+
bag.todos = [];
|
|
55
|
+
delete bag.todoGroups;
|
|
56
|
+
},
|
|
57
|
+
device(preset) {
|
|
58
|
+
bag.deviceTouched = true;
|
|
59
|
+
bag.hideDevice = false;
|
|
60
|
+
const resolved = resolveDeviceState(preset, bag.touchOverride, bag.orientationOverride);
|
|
61
|
+
if (resolved) {
|
|
62
|
+
bag.device = resolved;
|
|
63
|
+
if (resolved.preset === "desktop" && !resolved.touchMode) {
|
|
64
|
+
bag.hideDevice = true;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
viewport(box) {
|
|
69
|
+
bag.deviceTouched = true;
|
|
70
|
+
bag.hideDevice = false;
|
|
71
|
+
const resolved = resolveDeviceState(box, bag.touchOverride, bag.orientationOverride);
|
|
72
|
+
if (resolved)
|
|
73
|
+
bag.device = resolved;
|
|
74
|
+
},
|
|
75
|
+
touch(on) {
|
|
76
|
+
bag.deviceTouched = true;
|
|
77
|
+
const enabled = on === undefined ? true : !!on;
|
|
78
|
+
bag.touchOverride = enabled;
|
|
79
|
+
if (enabled)
|
|
80
|
+
bag.hideDevice = false;
|
|
81
|
+
if (bag.device) {
|
|
82
|
+
bag.device = {
|
|
83
|
+
...bag.device,
|
|
84
|
+
touchMode: enabled,
|
|
85
|
+
hasTouch: bag.device.hasTouch || enabled,
|
|
86
|
+
};
|
|
87
|
+
if (enabled)
|
|
88
|
+
bag.hideDevice = false;
|
|
89
|
+
}
|
|
90
|
+
else if (enabled) {
|
|
91
|
+
const base = resolveDeviceState("desktop", true, bag.orientationOverride);
|
|
92
|
+
if (base)
|
|
93
|
+
bag.device = { ...base, touchMode: true, hasTouch: true };
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
orientation(o) {
|
|
97
|
+
const want = normalizeDeviceOrientation(o);
|
|
98
|
+
if (!want)
|
|
99
|
+
return;
|
|
100
|
+
bag.deviceTouched = true;
|
|
101
|
+
bag.hideDevice = false;
|
|
102
|
+
bag.orientationOverride = want;
|
|
103
|
+
const base = bag.device ||
|
|
104
|
+
resolveDeviceState("mobile", bag.touchOverride) ||
|
|
105
|
+
resolveDeviceState("mobile");
|
|
106
|
+
if (base)
|
|
107
|
+
bag.device = applyOrientation(base, want);
|
|
108
|
+
},
|
|
109
|
+
hideDevice() {
|
|
110
|
+
bag.deviceTouched = true;
|
|
111
|
+
bag.hideDevice = true;
|
|
112
|
+
bag.device = resolveDeviceState("desktop", false);
|
|
113
|
+
bag.touchOverride = false;
|
|
114
|
+
bag.orientationOverride = undefined;
|
|
115
|
+
},
|
|
116
|
+
zoom(n) {
|
|
117
|
+
if (Number.isFinite(n) && n > 0)
|
|
118
|
+
bag.zoom = n;
|
|
119
|
+
},
|
|
120
|
+
zoomOut(keep) {
|
|
121
|
+
bag.zoomOut = !!keep;
|
|
122
|
+
},
|
|
123
|
+
title(text, opts) {
|
|
124
|
+
bag.title = String(text ?? "");
|
|
125
|
+
const p = normalizeBannerPos(opts?.pos);
|
|
126
|
+
if (p)
|
|
127
|
+
bag.titlePos = p;
|
|
128
|
+
},
|
|
129
|
+
titlePos(side) {
|
|
130
|
+
const p = normalizeBannerPos(side);
|
|
131
|
+
if (p)
|
|
132
|
+
bag.titlePos = p;
|
|
133
|
+
},
|
|
134
|
+
caption(text) {
|
|
135
|
+
bag.caption = String(text ?? "");
|
|
136
|
+
},
|
|
137
|
+
hideCaption() {
|
|
138
|
+
bag.caption = "";
|
|
139
|
+
},
|
|
140
|
+
showNetworkTab() {
|
|
141
|
+
bag.networkTabVisible = true;
|
|
142
|
+
},
|
|
143
|
+
hideNetworkTab() {
|
|
144
|
+
bag.networkTabVisible = false;
|
|
145
|
+
},
|
|
146
|
+
bannerUi(opts) {
|
|
147
|
+
if (!opts || typeof opts !== "object")
|
|
148
|
+
return;
|
|
149
|
+
bag.bannerUi = { ...(bag.bannerUi || {}), ...opts };
|
|
150
|
+
},
|
|
151
|
+
hideBanner() {
|
|
152
|
+
bag.bannerUi = { ...(bag.bannerUi || {}), hidden: true };
|
|
153
|
+
},
|
|
154
|
+
todoDockUi(opts) {
|
|
155
|
+
if (!opts || typeof opts !== "object")
|
|
156
|
+
return;
|
|
157
|
+
bag.todoDockUi = { ...(bag.todoDockUi || {}), ...opts };
|
|
158
|
+
},
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
function normalizeBannerPos(raw) {
|
|
162
|
+
const v = String(raw ?? "").toLowerCase();
|
|
163
|
+
return v === "left" || v === "center" || v === "right" ? v : undefined;
|
|
164
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { HighlightSize, HighlightStyleDefaults, HighlightTone, HighlightWeight } from "
|
|
1
|
+
import type { HighlightSize, HighlightStyleDefaults, HighlightTone, HighlightWeight } from "../../engine/stub/ring.js";
|
|
2
2
|
/** Apply Flow defaults under per-slot authored values (slot wins when set). */
|
|
3
3
|
export declare function applyHighlightStyleDefaults<T extends {
|
|
4
4
|
tone?: HighlightTone | string;
|
|
@@ -9,12 +9,6 @@ export declare function applyHighlightStyleDefaults<T extends {
|
|
|
9
9
|
size: HighlightSize;
|
|
10
10
|
weight: HighlightWeight;
|
|
11
11
|
};
|
|
12
|
-
/** Map author aliases (`error` -> danger) to a canonical tone. */
|
|
13
|
-
export declare function normalizeHighlightTone(raw: unknown): HighlightTone;
|
|
14
|
-
/** Map size aliases to sm/md/lg. */
|
|
15
|
-
export declare function normalizeHighlightSize(raw: unknown): HighlightSize;
|
|
16
|
-
/** Map weight aliases to normal/bold. */
|
|
17
|
-
export declare function normalizeHighlightWeight(raw: unknown): HighlightWeight;
|
|
18
12
|
/** Prefix label with a short ASCII icon for semantic tones. */
|
|
19
13
|
export declare function toneIconPrefix(tone: HighlightTone): string;
|
|
20
14
|
/** Caption for ring / slide UI (label|caption + optional detail/tag + tone icon). */
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { normalizeHighlightSize, normalizeHighlightTone, normalizeHighlightWeight } from "../../engine/stub/ring.js";
|
|
1
2
|
/** Apply Flow defaults under per-slot authored values (slot wins when set). */
|
|
2
3
|
export function applyHighlightStyleDefaults(slot, defaults) {
|
|
3
4
|
const tone = slot.tone !== undefined && slot.tone !== ""
|
|
@@ -26,47 +27,6 @@ const TONE_ICONS = {
|
|
|
26
27
|
success: "+",
|
|
27
28
|
orange: "",
|
|
28
29
|
};
|
|
29
|
-
/** Map author aliases (`error` -> danger) to a canonical tone. */
|
|
30
|
-
export function normalizeHighlightTone(raw) {
|
|
31
|
-
if (typeof raw !== "string")
|
|
32
|
-
return "planned";
|
|
33
|
-
const t = raw.trim().toLowerCase();
|
|
34
|
-
if (t === "auto" || t === "automation" || t === "engine")
|
|
35
|
-
return "auto";
|
|
36
|
-
if (t === "info" || t === "blue")
|
|
37
|
-
return "info";
|
|
38
|
-
if (t === "warning" || t === "warn" || t === "yellow")
|
|
39
|
-
return "warning";
|
|
40
|
-
if (t === "danger" || t === "error" || t === "red")
|
|
41
|
-
return "danger";
|
|
42
|
-
if (t === "success" || t === "ok" || t === "green")
|
|
43
|
-
return "success";
|
|
44
|
-
if (t === "orange" || t === "amber" || t === "dom" || t === "inspect")
|
|
45
|
-
return "orange";
|
|
46
|
-
if (t === "planned" || t === "purple" || t === "authored")
|
|
47
|
-
return "planned";
|
|
48
|
-
return "planned";
|
|
49
|
-
}
|
|
50
|
-
/** Map size aliases to sm/md/lg. */
|
|
51
|
-
export function normalizeHighlightSize(raw) {
|
|
52
|
-
if (typeof raw !== "string")
|
|
53
|
-
return "md";
|
|
54
|
-
const t = raw.trim().toLowerCase();
|
|
55
|
-
if (t === "sm" || t === "s" || t === "small" || t === "tiny")
|
|
56
|
-
return "sm";
|
|
57
|
-
if (t === "lg" || t === "l" || t === "large" || t === "big" || t === "xl")
|
|
58
|
-
return "lg";
|
|
59
|
-
return "md";
|
|
60
|
-
}
|
|
61
|
-
/** Map weight aliases to normal/bold. */
|
|
62
|
-
export function normalizeHighlightWeight(raw) {
|
|
63
|
-
if (typeof raw !== "string")
|
|
64
|
-
return "normal";
|
|
65
|
-
const t = raw.trim().toLowerCase();
|
|
66
|
-
if (t === "bold" || t === "strong" || t === "heavy" || t === "b")
|
|
67
|
-
return "bold";
|
|
68
|
-
return "normal";
|
|
69
|
-
}
|
|
70
30
|
/** Prefix label with a short ASCII icon for semantic tones. */
|
|
71
31
|
export function toneIconPrefix(tone) {
|
|
72
32
|
const icon = TONE_ICONS[tone];
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import type { TodoDockState, TodoDockUiOpts, TodoDockUiResolved, TodoListStyle, WaygraphTodoGroupInput, WaygraphTodoInput, WaygraphTodoItem } from "
|
|
1
|
+
import type { TodoDockState, TodoDockUiOpts, TodoDockUiResolved, TodoListStyle, WaygraphTodoGroupInput, WaygraphTodoInput, WaygraphTodoItem } from "../../engine/stub/todos.js";
|
|
2
2
|
/**
|
|
3
3
|
* Resolve todo-dock UX from env + optional author patch.
|
|
4
|
-
* `WAYGRAPH_TODO_UI=full|off
|
|
4
|
+
* `WAYGRAPH_TODO_UI=full|off` forces compact/collision/behindRing off.
|
|
5
5
|
*/
|
|
6
|
-
export declare function resolveTodoDockUi(patch?: TodoDockUiOpts | null
|
|
6
|
+
export declare function resolveTodoDockUi(patch?: TodoDockUiOpts | null): TodoDockUiResolved;
|
|
7
7
|
/** Normalize checklist dock side. */
|
|
8
8
|
export declare function normalizeTodoPos(raw: unknown): "left" | "right" | undefined;
|
|
9
9
|
/** Normalize dock list style. */
|
|
@@ -1,33 +1,20 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
if (v === undefined || v === "")
|
|
4
|
-
return fallback;
|
|
5
|
-
const s = String(v).trim().toLowerCase();
|
|
6
|
-
if (s === "0" || s === "false" || s === "off" || s === "no")
|
|
7
|
-
return false;
|
|
8
|
-
if (s === "1" || s === "true" || s === "on" || s === "yes")
|
|
9
|
-
return true;
|
|
10
|
-
return fallback;
|
|
11
|
-
}
|
|
12
|
-
function envFlagInt(env, key, fallback) {
|
|
13
|
-
const n = Number(env[key]);
|
|
14
|
-
return Number.isFinite(n) && n > 0 ? Math.floor(n) : fallback;
|
|
15
|
-
}
|
|
1
|
+
import { envNumber, envString, envSwitch } from "../../engine/env.js";
|
|
2
|
+
const positiveInt = (n, fallback) => (n !== undefined && n > 0 ? Math.floor(n) : fallback);
|
|
16
3
|
/**
|
|
17
4
|
* Resolve todo-dock UX from env + optional author patch.
|
|
18
|
-
* `WAYGRAPH_TODO_UI=full|off
|
|
5
|
+
* `WAYGRAPH_TODO_UI=full|off` forces compact/collision/behindRing off.
|
|
19
6
|
*/
|
|
20
|
-
export function resolveTodoDockUi(patch
|
|
21
|
-
const mode = String(
|
|
7
|
+
export function resolveTodoDockUi(patch) {
|
|
8
|
+
const mode = String(envString("WAYGRAPH_TODO_UI") || "smart")
|
|
22
9
|
.trim()
|
|
23
10
|
.toLowerCase();
|
|
24
|
-
const full = mode === "full" || mode === "off" || mode === "0"
|
|
11
|
+
const full = mode === "full" || mode === "off" || mode === "0";
|
|
25
12
|
const base = {
|
|
26
|
-
compact: full ? false :
|
|
27
|
-
collision: full ? false :
|
|
28
|
-
behindRing: full ? false :
|
|
29
|
-
cap:
|
|
30
|
-
expandCap:
|
|
13
|
+
compact: full ? false : envSwitch("WAYGRAPH_TODO_COMPACT", true),
|
|
14
|
+
collision: full ? false : envSwitch("WAYGRAPH_TODO_COLLISION", true),
|
|
15
|
+
behindRing: full ? false : envSwitch("WAYGRAPH_TODO_BEHIND", true),
|
|
16
|
+
cap: positiveInt(envNumber("WAYGRAPH_TODO_CAP"), 5),
|
|
17
|
+
expandCap: positiveInt(envNumber("WAYGRAPH_TODO_EXPAND_CAP"), 14),
|
|
31
18
|
};
|
|
32
19
|
if (base.expandCap < base.cap)
|
|
33
20
|
base.expandCap = base.cap;
|
|
@@ -96,7 +83,7 @@ export function normalizeTodos(todos, todoIndex, style = "sequential") {
|
|
|
96
83
|
item.done = !!t.done;
|
|
97
84
|
if (t.current !== undefined)
|
|
98
85
|
item.current = !!t.current;
|
|
99
|
-
const idRaw = t.id
|
|
86
|
+
const idRaw = t.id;
|
|
100
87
|
if (idRaw != null && String(idRaw).trim())
|
|
101
88
|
item.id = String(idRaw).trim();
|
|
102
89
|
}
|
|
@@ -135,7 +122,7 @@ export function buildTodoDock(opts) {
|
|
|
135
122
|
const group = { style: gs, items };
|
|
136
123
|
if (g.title && String(g.title).trim())
|
|
137
124
|
group.title = String(g.title).trim();
|
|
138
|
-
const gid = g.id
|
|
125
|
+
const gid = g.id;
|
|
139
126
|
if (gid != null && String(gid).trim())
|
|
140
127
|
group.id = String(gid).trim();
|
|
141
128
|
return group;
|
|
@@ -209,8 +196,6 @@ export function advanceTodoDock(dock, index) {
|
|
|
209
196
|
const row = { text: it.text };
|
|
210
197
|
if (it.id)
|
|
211
198
|
row.id = it.id;
|
|
212
|
-
else if (it.name)
|
|
213
|
-
row.id = it.name;
|
|
214
199
|
return row;
|
|
215
200
|
});
|
|
216
201
|
return {
|
|
@@ -238,8 +223,6 @@ export function completeSequentialTodoDock(dock) {
|
|
|
238
223
|
const row = { text: it.text, done: true, current: false };
|
|
239
224
|
if (it.id)
|
|
240
225
|
row.id = it.id;
|
|
241
|
-
else if (it.name)
|
|
242
|
-
row.id = it.name;
|
|
243
226
|
return row;
|
|
244
227
|
}),
|
|
245
228
|
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Page } from "@playwright/test";
|
|
2
|
+
import type { MemPage } from "../../engine/mem/mem.js";
|
|
3
|
+
export declare function installDemoChrome(page: Page, title?: string, options?: {
|
|
4
|
+
banner?: boolean;
|
|
5
|
+
}): Promise<void>;
|
|
6
|
+
/** Demo cursor + ring on fill/click during auto explore headful runs (automation = gray). */
|
|
7
|
+
export declare function instrumentAutoInteractions(page: Page, mem: MemPage, slowMo: number): void;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { ensureShadowRoot } from "./ui/shadow.js";
|
|
2
|
+
import { installCore } from "./inpage/core.js";
|
|
3
|
+
import { clickPulseAt, moveCursorTo } from "./cursor.js";
|
|
4
|
+
import { hideRing } from "./rings.js";
|
|
5
|
+
import { setLocatorTheater } from "./locator-theater.js";
|
|
6
|
+
import { ignorePageGone, ignoreTimeout } from "../../engine/page-gone.js";
|
|
7
|
+
export async function installDemoChrome(page, title = "waygraph auto", options = {}) {
|
|
8
|
+
const showBanner = options.banner !== false;
|
|
9
|
+
await ensureShadowRoot(page);
|
|
10
|
+
await page.evaluate(installCore, {}).catch(ignorePageGone);
|
|
11
|
+
await page
|
|
12
|
+
.evaluate(({ title, showBanner }) => {
|
|
13
|
+
if (showBanner && title && !__wgById("wg-banner")) {
|
|
14
|
+
const banner = document.createElement("div");
|
|
15
|
+
banner.id = "wg-banner";
|
|
16
|
+
const tag = document.createElement("span");
|
|
17
|
+
tag.className = "wg-banner-tag";
|
|
18
|
+
tag.textContent = "waygraph auto";
|
|
19
|
+
const text = document.createElement("span");
|
|
20
|
+
text.textContent = title;
|
|
21
|
+
banner.append(tag, text);
|
|
22
|
+
__wgAdd(banner);
|
|
23
|
+
banner.setAttribute("data-wg-ui", "1");
|
|
24
|
+
banner.setAttribute("data-wg-modal", "banner");
|
|
25
|
+
banner.setAttribute("data-wg-ready", "1");
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
const existing = __wgById("wg-banner");
|
|
29
|
+
if (existing) {
|
|
30
|
+
existing.setAttribute("data-wg-ui", "1");
|
|
31
|
+
existing.setAttribute("data-wg-modal", "banner");
|
|
32
|
+
existing.setAttribute("data-wg-ready", "1");
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if (showBanner && !document.title.startsWith("[waygraph] ")) {
|
|
36
|
+
document.title = "[waygraph] " + document.title;
|
|
37
|
+
}
|
|
38
|
+
}, { title, showBanner })
|
|
39
|
+
.catch(ignorePageGone);
|
|
40
|
+
}
|
|
41
|
+
async function showRing(page, box, label) {
|
|
42
|
+
await page.evaluate(({ box, label }) => window.__wgPositionRing?.(box, label, "auto"), { box, label }).catch(ignorePageGone);
|
|
43
|
+
}
|
|
44
|
+
/** Demo cursor + ring on fill/click during auto explore headful runs (automation = gray). */
|
|
45
|
+
export function instrumentAutoInteractions(page, mem, slowMo) {
|
|
46
|
+
const typeDelay = () => (slowMo ? 0 : 30);
|
|
47
|
+
const clickPrePop = () => (slowMo ? 300 : 700);
|
|
48
|
+
const clickPostPop = () => (slowMo ? 200 : 500);
|
|
49
|
+
const cursorMs = (full) => full;
|
|
50
|
+
const memTrack = { lastKeyName: null, at: 0 };
|
|
51
|
+
const originalGet = mem.get.bind(mem);
|
|
52
|
+
mem.get = (key) => {
|
|
53
|
+
memTrack.lastKeyName = key?.name ?? null;
|
|
54
|
+
memTrack.at = Date.now();
|
|
55
|
+
return originalGet(key);
|
|
56
|
+
};
|
|
57
|
+
setLocatorTheater(page, {
|
|
58
|
+
async beforeFill(locator) {
|
|
59
|
+
await installDemoChrome(page, "", { banner: false });
|
|
60
|
+
const box = await locator.boundingBox();
|
|
61
|
+
if (!box)
|
|
62
|
+
return;
|
|
63
|
+
const label = memTrack.lastKeyName && Date.now() - memTrack.at < 3000 ? "from mem: " + memTrack.lastKeyName : "writing from mem";
|
|
64
|
+
await moveCursorTo(page, box, cursorMs(500));
|
|
65
|
+
await showRing(page, box, label);
|
|
66
|
+
await new Promise((res) => setTimeout(res, 200));
|
|
67
|
+
},
|
|
68
|
+
typingDelay: typeDelay,
|
|
69
|
+
async afterFill() {
|
|
70
|
+
await hideRing(page);
|
|
71
|
+
},
|
|
72
|
+
async beforeClick(locator, options) {
|
|
73
|
+
await installDemoChrome(page, "", { banner: false });
|
|
74
|
+
await locator.waitFor({ state: "visible", timeout: options?.timeout || 30000 }).catch(ignoreTimeout);
|
|
75
|
+
const box = await locator.boundingBox();
|
|
76
|
+
if (!box)
|
|
77
|
+
return "click";
|
|
78
|
+
let label = "click";
|
|
79
|
+
const text = (await locator.textContent().catch(() => null))?.trim();
|
|
80
|
+
if (text && text.length <= 30)
|
|
81
|
+
label = text;
|
|
82
|
+
const clickPoint = await moveCursorTo(page, box, cursorMs(600));
|
|
83
|
+
await showRing(page, box, label);
|
|
84
|
+
await new Promise((res) => setTimeout(res, clickPrePop()));
|
|
85
|
+
if (clickPoint) {
|
|
86
|
+
await clickPulseAt(page, clickPoint.x, clickPoint.y, "auto");
|
|
87
|
+
await new Promise((res) => setTimeout(res, 80));
|
|
88
|
+
}
|
|
89
|
+
return "click";
|
|
90
|
+
},
|
|
91
|
+
holdMs: () => 600,
|
|
92
|
+
async afterClick() {
|
|
93
|
+
await new Promise((res) => setTimeout(res, clickPostPop()));
|
|
94
|
+
await hideRing(page);
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
}
|
|
@@ -10,11 +10,17 @@
|
|
|
10
10
|
* `assertWgOverlayReady(page)` (or WAYGRAPH_PROVE_EXIT=1) passes.
|
|
11
11
|
*/
|
|
12
12
|
import type { Page } from "@playwright/test";
|
|
13
|
+
/** Selector matching every element waygraph's overlay draws into a page. */
|
|
13
14
|
export declare const WG_UI_SEL = "[data-wg-ui=\"1\"]";
|
|
15
|
+
/** Selector of the overlay element that appears when the step panel is ready. */
|
|
14
16
|
export declare const WG_READY_PANEL_SEL = "[data-wg-modal=\"panel\"][data-wg-ready=\"1\"]";
|
|
17
|
+
/** Selector of the overlay element that appears when the auto panel is ready. */
|
|
15
18
|
export declare const WG_READY_AUTO_SEL = "[data-wg-modal=\"auto-panel\"][data-wg-ready=\"1\"]";
|
|
19
|
+
/** Selector of the overlay element that appears when the banner is ready. */
|
|
16
20
|
export declare const WG_READY_BANNER_SEL = "[data-wg-modal=\"banner\"][data-wg-ready=\"1\"]";
|
|
21
|
+
/** The kind of modal the overlay beacon reports. */
|
|
17
22
|
export type WgModalKind = "panel" | "banner" | "auto-panel";
|
|
23
|
+
/** One overlay element a session reports through its beacon. */
|
|
18
24
|
export type WgBeaconRow = {
|
|
19
25
|
id: string | null;
|
|
20
26
|
modal: string | null;
|
|
@@ -31,6 +37,7 @@ export type WgBeaconRow = {
|
|
|
31
37
|
};
|
|
32
38
|
/** Browser-side beacon reader (also installed as window.__wgOverlayBeacon). */
|
|
33
39
|
export declare function readWgOverlayBeaconInPage(): WgBeaconRow[];
|
|
40
|
+
/** Reads the overlay beacon from a page: what waygraph's own UI is showing. */
|
|
34
41
|
export declare function readWgOverlayBeacon(page: Page): Promise<WgBeaconRow[]>;
|
|
35
42
|
/**
|
|
36
43
|
* Hard gate: a blank / missing / opacity-0 modal fails.
|