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
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { createOverlayStage } from "../overlay/overlay-stage.js";
|
|
2
|
+
import { instrumentInteractionHighlighting } from "./interaction-patch.js";
|
|
3
|
+
import { markStepRunning, restoreTheaterAfterNavigation, teardownOverlay } from "./teardown.js";
|
|
4
|
+
import { keepOverlayOnNavigation } from "../overlay/reattach.js";
|
|
5
|
+
import { presentFailPanel } from "./step-panels.js";
|
|
6
|
+
import { installGate } from "./gate.js";
|
|
7
|
+
import { newPacing, paceStep } from "./pacing.js";
|
|
8
|
+
import { showBefore } from "./before.js";
|
|
9
|
+
import { showAfter } from "./after.js";
|
|
10
|
+
import { episodesOf, viewOf } from "./view.js";
|
|
11
|
+
import { envFlag, envString } from "../../engine/env.js";
|
|
12
|
+
import { ignorePageGone } from "../../engine/page-gone.js";
|
|
13
|
+
export async function createStepper(page, mem, steps, options) {
|
|
14
|
+
const demoFast = envFlag("WAYGRAPH_DEMO_FAST");
|
|
15
|
+
const pacing = newPacing(demoFast);
|
|
16
|
+
const refs = { stubBefore: { current: [] }, todoDock: { current: undefined }, device: { current: undefined } };
|
|
17
|
+
instrumentInteractionHighlighting(page, mem, options.beat, pacing, refs.stubBefore, refs.todoDock, refs.device);
|
|
18
|
+
// A navigation inside a step (a redirect, a login bounce) repaints the overlay with the step's todos, device and ring.
|
|
19
|
+
keepOverlayOnNavigation(page, () => restoreTheaterAfterNavigation(page, refs.todoDock, refs.device, refs.stubBefore));
|
|
20
|
+
keepWindowSize(page);
|
|
21
|
+
const gate = await installGate(page, pacing, demoFast);
|
|
22
|
+
await gate.syncAutoplay();
|
|
23
|
+
const ctx = {
|
|
24
|
+
page,
|
|
25
|
+
mem,
|
|
26
|
+
steps,
|
|
27
|
+
stage: createOverlayStage(page, { todoDockRef: refs.todoDock, deviceRef: refs.device }),
|
|
28
|
+
gate,
|
|
29
|
+
pacing,
|
|
30
|
+
refs,
|
|
31
|
+
title: options.title,
|
|
32
|
+
stepperMode: envString("WAYGRAPH_STEPPER") === "full" ? "full" : "carousel",
|
|
33
|
+
stickyTitle: undefined,
|
|
34
|
+
allEpisodes: episodesOf(steps),
|
|
35
|
+
};
|
|
36
|
+
let view;
|
|
37
|
+
return {
|
|
38
|
+
afterReset: gate.syncAutoplay,
|
|
39
|
+
async before(index) {
|
|
40
|
+
view = viewOf(ctx, index);
|
|
41
|
+
paceStep(pacing, view.step, demoFast, options.fastBlocks);
|
|
42
|
+
await showBefore(ctx, view);
|
|
43
|
+
applyMemEdits(ctx, view, await gate.wait());
|
|
44
|
+
await markStepRunning(page, {});
|
|
45
|
+
await labelNavClick(page, view.step);
|
|
46
|
+
},
|
|
47
|
+
async after(_index, result) {
|
|
48
|
+
await stepRan(ctx);
|
|
49
|
+
await showAfter(ctx, view, result);
|
|
50
|
+
},
|
|
51
|
+
async failed(index, failure) {
|
|
52
|
+
await stepRan(ctx);
|
|
53
|
+
const step = view.step;
|
|
54
|
+
const edits = await presentFailPanel(page, {
|
|
55
|
+
block: step.block,
|
|
56
|
+
highlightStyle: step.highlightStyle,
|
|
57
|
+
error: failure.error,
|
|
58
|
+
...(failure.result ? { out: failure.result } : {}),
|
|
59
|
+
index,
|
|
60
|
+
total: steps.length,
|
|
61
|
+
blockName: step.block.name,
|
|
62
|
+
message: failure.result
|
|
63
|
+
? "Resolved " + (failure.result.__state ?? JSON.stringify(failure.result)) + " (expected failure path)"
|
|
64
|
+
: failure.error instanceof Error ? failure.error.message : String(failure.error),
|
|
65
|
+
allNames: view.moduleNames,
|
|
66
|
+
allDescriptions: view.moduleDescriptions,
|
|
67
|
+
moduleIndex: view.moduleIndex,
|
|
68
|
+
allEpisodes: ctx.allEpisodes,
|
|
69
|
+
title: options.title,
|
|
70
|
+
episodeNumber: step.episodeNumber,
|
|
71
|
+
episodeTitle: step.episodeTitle,
|
|
72
|
+
expectedFailureReason: step.expectedFailureReason,
|
|
73
|
+
stepperMode: ctx.stepperMode,
|
|
74
|
+
gatesFast: pacing.gatesFast,
|
|
75
|
+
demoPace: pacing.demoPace,
|
|
76
|
+
gate: gate.wait,
|
|
77
|
+
mem,
|
|
78
|
+
});
|
|
79
|
+
return edits && edits.__wgRetry ? "retry" : "stop";
|
|
80
|
+
},
|
|
81
|
+
end: () => teardownOverlay(page),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Some Blocks call page.setViewportSize() in their own act for their own tests; in a watched demo that would resize
|
|
86
|
+
* the window, so it does nothing here. An authored ctx.device() still resizes through __wgRealSetViewportSize.
|
|
87
|
+
*/
|
|
88
|
+
function keepWindowSize(page) {
|
|
89
|
+
page.__wgRealSetViewportSize = page.setViewportSize.bind(page);
|
|
90
|
+
page.setViewportSize = async () => { };
|
|
91
|
+
}
|
|
92
|
+
/** Values typed into the panel's mem fields replace the step's inputs (left as authored when not valid JSON). */
|
|
93
|
+
function applyMemEdits(ctx, view, edits) {
|
|
94
|
+
for (const k of view.step.block.requires ?? []) {
|
|
95
|
+
if (edits[k.name] === undefined)
|
|
96
|
+
continue;
|
|
97
|
+
try {
|
|
98
|
+
ctx.mem.set(k, JSON.parse(edits[k.name]));
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// left as-authored if the human's edit isn't valid JSON
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/** A click-based Nav Block's cursor reads "nav: <block>", like any other Block's click. */
|
|
106
|
+
async function labelNavClick(page, step) {
|
|
107
|
+
const label = step.block.__waygraphKind === "nav" && step.block.__waygraphNavClick !== undefined ? "nav: " + (step.block.name || "click") : undefined;
|
|
108
|
+
await page
|
|
109
|
+
.evaluate((l) => {
|
|
110
|
+
if (l)
|
|
111
|
+
window.__wgPendingNavClickLabel = l;
|
|
112
|
+
else
|
|
113
|
+
delete window.__wgPendingNavClickLabel;
|
|
114
|
+
}, label)
|
|
115
|
+
.catch(ignorePageGone);
|
|
116
|
+
}
|
|
117
|
+
/** The step finished: drop its nav label, and keep the todo dock it advanced for the steps after it. */
|
|
118
|
+
async function stepRan(ctx) {
|
|
119
|
+
await ctx.page.evaluate(() => delete window.__wgPendingNavClickLabel).catch(ignorePageGone);
|
|
120
|
+
if (ctx.refs.todoDock.current)
|
|
121
|
+
ctx.stage.state.lastTodoDock = ctx.refs.todoDock.current;
|
|
122
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { WgPage } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Patches Locator.prototype.fill (via any real locator's own prototype
|
|
4
|
+
* chain - Playwright doesn't export the class directly) so every fill(),
|
|
5
|
+
* regardless of how the Block built that locator (page.locator, chained
|
|
6
|
+
* .getByLabel off a scoped form locator, etc.), highlights the real target
|
|
7
|
+
* first, then types it out character by character instead of snapping the
|
|
8
|
+
* whole value in - "when something is written from mem, it should
|
|
9
|
+
* highlight then slowly input." One-time patch (idempotent - guarded so a
|
|
10
|
+
* multi-step chain doesn't re-wrap an already-wrapped fill).
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Called once the gate resolves - manual click OR autoplay timeout, both
|
|
14
|
+
* covered from here rather than duplicating this in the in-page click
|
|
15
|
+
* handler - right before the Block's own act() actually starts. the user: "i
|
|
16
|
+
* want the button, step is running thing. so i wont be able to interrupt
|
|
17
|
+
* the playwright automation" - the "Run this step" button used to sit
|
|
18
|
+
* there still looking clickable for the entire multi-second duration a
|
|
19
|
+
* real act()/observe() takes, inviting a confusing extra click (harmless -
|
|
20
|
+
* __wgNext no-ops once already consumed - but looked live when it wasn't).
|
|
21
|
+
* Disables the button and mem-key textareas, and swaps whichever gate
|
|
22
|
+
* text was showing (manual button or "Auto-advancing...") to "Running...".
|
|
23
|
+
* ALWAYS collapses the panel while act() runs - leaving it expanded was a
|
|
24
|
+
* real bug: #wg-panel sits at z-index max with pointer-events:auto, so
|
|
25
|
+
* Playwright's login/add-to-cart clicks hit the stepper instead of the app
|
|
26
|
+
* ("subtree intercepts pointer events"). Empty/partial fills + a lucky
|
|
27
|
+
* edge click on Login then produced Sauce Demo's Epic sadface, verify
|
|
28
|
+
* still passed on the error banner, and the next block blew up. Collapse
|
|
29
|
+
* also matches the user's "step is running / can't interrupt" ask. (_opts kept
|
|
30
|
+
* for call-site compat; autoCollapsePanel is now unconditional.)
|
|
31
|
+
*/
|
|
32
|
+
export declare function markStepRunning(page: WgPage, _opts: any): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Real navigation wipes document + overlay helpers. Reinstall and re-paint
|
|
35
|
+
* carried todos / device / optional stubBefore ring so keep-dock and nav
|
|
36
|
+
* highlights do not vanish until the next ctx.todos() / stubAfter (PIA #15).
|
|
37
|
+
*/
|
|
38
|
+
export declare function restoreTheaterAfterNavigation(page: WgPage, todoDockRef: any, deviceRef: any, stubBeforeRef: any): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Removes every overlay element (panel, ring, ring-label, cursor,
|
|
41
|
+
* click-pulse, banner) and stops the live resize/scroll ring tracker, once
|
|
42
|
+
* the whole chain is genuinely done - "I want to see the same page just
|
|
43
|
+
* like the demo opened for the first time," not the last step's panel and
|
|
44
|
+
* highlight ring stuck over the real app forever. installOverlay only ever
|
|
45
|
+
* ADDS these elements back on demand (idempotent, per-page-load) - nothing
|
|
46
|
+
* re-creates them once torn down here unless another Block/fill/click runs.
|
|
47
|
+
*/
|
|
48
|
+
export declare function teardownOverlay(page: WgPage): Promise<void>;
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { installOverlay } from "../overlay/overlay.js";
|
|
2
|
+
import { applyDeviceToPage } from "../overlay/device-stage.js";
|
|
3
|
+
import { showRing } from "../overlay/rings.js";
|
|
4
|
+
import { formatHighlightCaption } from "../narration/style.js";
|
|
5
|
+
import { ignorePageGone } from "../../engine/page-gone.js";
|
|
6
|
+
/**
|
|
7
|
+
* Patches Locator.prototype.fill (via any real locator's own prototype
|
|
8
|
+
* chain - Playwright doesn't export the class directly) so every fill(),
|
|
9
|
+
* regardless of how the Block built that locator (page.locator, chained
|
|
10
|
+
* .getByLabel off a scoped form locator, etc.), highlights the real target
|
|
11
|
+
* first, then types it out character by character instead of snapping the
|
|
12
|
+
* whole value in - "when something is written from mem, it should
|
|
13
|
+
* highlight then slowly input." One-time patch (idempotent - guarded so a
|
|
14
|
+
* multi-step chain doesn't re-wrap an already-wrapped fill).
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Called once the gate resolves - manual click OR autoplay timeout, both
|
|
18
|
+
* covered from here rather than duplicating this in the in-page click
|
|
19
|
+
* handler - right before the Block's own act() actually starts. the user: "i
|
|
20
|
+
* want the button, step is running thing. so i wont be able to interrupt
|
|
21
|
+
* the playwright automation" - the "Run this step" button used to sit
|
|
22
|
+
* there still looking clickable for the entire multi-second duration a
|
|
23
|
+
* real act()/observe() takes, inviting a confusing extra click (harmless -
|
|
24
|
+
* __wgNext no-ops once already consumed - but looked live when it wasn't).
|
|
25
|
+
* Disables the button and mem-key textareas, and swaps whichever gate
|
|
26
|
+
* text was showing (manual button or "Auto-advancing...") to "Running...".
|
|
27
|
+
* ALWAYS collapses the panel while act() runs - leaving it expanded was a
|
|
28
|
+
* real bug: #wg-panel sits at z-index max with pointer-events:auto, so
|
|
29
|
+
* Playwright's login/add-to-cart clicks hit the stepper instead of the app
|
|
30
|
+
* ("subtree intercepts pointer events"). Empty/partial fills + a lucky
|
|
31
|
+
* edge click on Login then produced Sauce Demo's Epic sadface, verify
|
|
32
|
+
* still passed on the error banner, and the next block blew up. Collapse
|
|
33
|
+
* also matches the user's "step is running / can't interrupt" ask. (_opts kept
|
|
34
|
+
* for call-site compat; autoCollapsePanel is now unconditional.)
|
|
35
|
+
*/
|
|
36
|
+
export async function markStepRunning(page, _opts) {
|
|
37
|
+
await page
|
|
38
|
+
.evaluate(() => {
|
|
39
|
+
const runBtn = __wgById("wg-run");
|
|
40
|
+
if (runBtn) {
|
|
41
|
+
runBtn.disabled = true;
|
|
42
|
+
runBtn.textContent = "Running \u25B6";
|
|
43
|
+
}
|
|
44
|
+
const autoEl = __wgById("wg-gate-auto");
|
|
45
|
+
if (autoEl)
|
|
46
|
+
autoEl.textContent = "Running...";
|
|
47
|
+
__wgQA("#wg-panel textarea[data-key]").forEach((ta) => {
|
|
48
|
+
ta.disabled = true;
|
|
49
|
+
});
|
|
50
|
+
const panel = __wgById("wg-panel");
|
|
51
|
+
if (panel) {
|
|
52
|
+
panel.classList.add("wg-collapsed");
|
|
53
|
+
panel.setAttribute("data-wg-collapsed", "1");
|
|
54
|
+
panel.setAttribute("data-wg-phase", "running");
|
|
55
|
+
if (typeof window.__wgStampModal === "function") {
|
|
56
|
+
window.__wgStampModal(panel, "panel", {
|
|
57
|
+
phase: "running",
|
|
58
|
+
ready: true,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
const toggle = panel.querySelector("[data-wg-toggle]");
|
|
62
|
+
if (toggle)
|
|
63
|
+
toggle.textContent = "Show";
|
|
64
|
+
const titleEl = panel.querySelector(".wg-chrome-title");
|
|
65
|
+
const label = panel.dataset.wgStepLabel;
|
|
66
|
+
if (titleEl && label)
|
|
67
|
+
titleEl.textContent = label;
|
|
68
|
+
const miniNext = panel.querySelector("[data-wg-mini-next]");
|
|
69
|
+
if (miniNext) {
|
|
70
|
+
miniNext.disabled = true;
|
|
71
|
+
miniNext.classList.remove("wg-mini-next-show");
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
})
|
|
75
|
+
.catch(ignorePageGone);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Real navigation wipes document + overlay helpers. Reinstall and re-paint
|
|
79
|
+
* carried todos / device / optional stubBefore ring so keep-dock and nav
|
|
80
|
+
* highlights do not vanish until the next ctx.todos() / stubAfter (PIA #15).
|
|
81
|
+
*/
|
|
82
|
+
export async function restoreTheaterAfterNavigation(page, todoDockRef, deviceRef, stubBeforeRef) {
|
|
83
|
+
const needs = (await page
|
|
84
|
+
.evaluate(() => !window.__wgSyncTodos || !__wgById("wg-ring"))
|
|
85
|
+
.catch(() => true)) || false;
|
|
86
|
+
if (!needs) {
|
|
87
|
+
// Overlay survived (SPA / no full document wipe) - still refresh dock
|
|
88
|
+
// if Node has a carry and the DOM lost .wg-todo-dock.
|
|
89
|
+
const hasDock = await page
|
|
90
|
+
.evaluate(() => !!__wgQ(".wg-todo-dock, #wg-todo-dock"))
|
|
91
|
+
.catch(() => false);
|
|
92
|
+
if (hasDock || !todoDockRef || !todoDockRef.current)
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
await installOverlay(page);
|
|
96
|
+
const dock = todoDockRef && todoDockRef.current;
|
|
97
|
+
if (dock) {
|
|
98
|
+
await page
|
|
99
|
+
.evaluate((d) => {
|
|
100
|
+
if (window.__wgSyncTodos)
|
|
101
|
+
window.__wgSyncTodos({ sync: "set", dock: d });
|
|
102
|
+
}, dock)
|
|
103
|
+
.catch(ignorePageGone);
|
|
104
|
+
}
|
|
105
|
+
if (deviceRef && deviceRef.current) {
|
|
106
|
+
await applyDeviceToPage(page, deviceRef.current, "set").catch(ignorePageGone);
|
|
107
|
+
}
|
|
108
|
+
// Re-show first matching stubBefore ring if selector still exists (sidebar
|
|
109
|
+
// nav targets often survive the route change).
|
|
110
|
+
const stubs = (stubBeforeRef && stubBeforeRef.current) || [];
|
|
111
|
+
for (const h of stubs) {
|
|
112
|
+
if (!h || !h.selector)
|
|
113
|
+
continue;
|
|
114
|
+
// Playwright's own locator (>> piercing / :has-text() / :visible support), not a raw
|
|
115
|
+
// querySelector string - see rings.js's showRing for the same fix, same reason. count() gate:
|
|
116
|
+
// Locator.evaluate() has no timeout option and auto-waits ~30s for a match to appear - count()
|
|
117
|
+
// never waits, keeping this an immediate "does it still exist" check (this selector routinely
|
|
118
|
+
// won't, after a route change - that's the whole point of the loop).
|
|
119
|
+
const hLoc = page.locator(h.selector).first();
|
|
120
|
+
const box = (await hLoc.count().catch(() => 0)) > 0
|
|
121
|
+
? await hLoc
|
|
122
|
+
.evaluate((el) => {
|
|
123
|
+
const r = el.getBoundingClientRect();
|
|
124
|
+
if (r.width < 2 || r.height < 2)
|
|
125
|
+
return null;
|
|
126
|
+
return { x: r.x, y: r.y, width: r.width, height: r.height };
|
|
127
|
+
})
|
|
128
|
+
.catch(() => null)
|
|
129
|
+
: null;
|
|
130
|
+
if (box) {
|
|
131
|
+
await showRing(page, box, formatHighlightCaption(h), h.tone || "planned", {
|
|
132
|
+
size: h.size,
|
|
133
|
+
weight: h.weight,
|
|
134
|
+
selector: h.selector,
|
|
135
|
+
focus: !!h.focus,
|
|
136
|
+
}).catch(ignorePageGone);
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Removes every overlay element (panel, ring, ring-label, cursor,
|
|
143
|
+
* click-pulse, banner) and stops the live resize/scroll ring tracker, once
|
|
144
|
+
* the whole chain is genuinely done - "I want to see the same page just
|
|
145
|
+
* like the demo opened for the first time," not the last step's panel and
|
|
146
|
+
* highlight ring stuck over the real app forever. installOverlay only ever
|
|
147
|
+
* ADDS these elements back on demand (idempotent, per-page-load) - nothing
|
|
148
|
+
* re-creates them once torn down here unless another Block/fill/click runs.
|
|
149
|
+
*/
|
|
150
|
+
export async function teardownOverlay(page) {
|
|
151
|
+
await page
|
|
152
|
+
.evaluate(() => {
|
|
153
|
+
if (window.__wgRingTrack) {
|
|
154
|
+
window.removeEventListener("resize", window.__wgRingTrack);
|
|
155
|
+
window.removeEventListener("scroll", window.__wgRingTrack, true);
|
|
156
|
+
window.__wgRingTrack = null;
|
|
157
|
+
}
|
|
158
|
+
window.__wgNarrateOwnsRing = false;
|
|
159
|
+
for (const id of [
|
|
160
|
+
"wg-panel",
|
|
161
|
+
"wg-ring",
|
|
162
|
+
"wg-ring-label",
|
|
163
|
+
"wg-cursor",
|
|
164
|
+
"wg-click-pulse",
|
|
165
|
+
"wg-banner",
|
|
166
|
+
"wg-todo-dock",
|
|
167
|
+
"wg-device-shell",
|
|
168
|
+
"wg-device-toast",
|
|
169
|
+
"wg-device-badge",
|
|
170
|
+
]) {
|
|
171
|
+
const el = __wgById(id);
|
|
172
|
+
if (el)
|
|
173
|
+
el.remove();
|
|
174
|
+
}
|
|
175
|
+
__wgQA(".wg-todo-dock").forEach((el) => el.remove());
|
|
176
|
+
document.documentElement.classList.remove("wg-video-device-stage");
|
|
177
|
+
})
|
|
178
|
+
.catch(ignorePageGone);
|
|
179
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { WgPage } from "../types.js";
|
|
2
|
+
/** Advance sequential todo dock to stubIndex and push to the page (Method act). */
|
|
3
|
+
export declare function syncTodoDockAdvance(page: WgPage, todoDockRef: any, stubIndex: number, stub: any): Promise<void>;
|
|
4
|
+
export declare function probeTodoDocksOnPage(page: WgPage): Promise<never[] | {
|
|
5
|
+
key: string;
|
|
6
|
+
pos: string;
|
|
7
|
+
top: number;
|
|
8
|
+
left: number;
|
|
9
|
+
w: number;
|
|
10
|
+
h: number;
|
|
11
|
+
onScreen: boolean;
|
|
12
|
+
n: number;
|
|
13
|
+
current: string;
|
|
14
|
+
}[]>;
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { advanceTodoDock } from "../narration/todo-dock.js";
|
|
2
|
+
import { demoLog } from "./demo-log.js";
|
|
3
|
+
import { ignorePageGone } from "../../engine/page-gone.js";
|
|
4
|
+
/** Flatten dock items in order (sequential groups). */
|
|
5
|
+
function flattenTodoDockItems(dock) {
|
|
6
|
+
const items = [];
|
|
7
|
+
if (!dock || !dock.groups)
|
|
8
|
+
return items;
|
|
9
|
+
for (const g of dock.groups) {
|
|
10
|
+
for (const t of g.items || [])
|
|
11
|
+
items.push(t);
|
|
12
|
+
}
|
|
13
|
+
return items;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Resolve which todo index a matched stub should advance to.
|
|
17
|
+
* Prefer stub.todo / stub.slotId / stub.id against item.id; never jump backward.
|
|
18
|
+
*/
|
|
19
|
+
function resolveTodoAdvanceIndex(dock, stub, stubIndex) {
|
|
20
|
+
const items = flattenTodoDockItems(dock);
|
|
21
|
+
if (!items.length)
|
|
22
|
+
return stubIndex;
|
|
23
|
+
const curIdx = items.findIndex((t) => t.current);
|
|
24
|
+
let idx = stubIndex;
|
|
25
|
+
const key = stub && (stub.todo || stub.slotId || stub.id);
|
|
26
|
+
if (key) {
|
|
27
|
+
const k = String(key).trim().toLowerCase();
|
|
28
|
+
let found = items.findIndex((t) => t.id && String(t.id).toLowerCase() === k);
|
|
29
|
+
if (found < 0) {
|
|
30
|
+
// username -> login-user, password -> login-pass, submit -> login-submit
|
|
31
|
+
const aliases = {
|
|
32
|
+
username: ["login-user", "user", "email"],
|
|
33
|
+
password: ["login-pass", "pass"],
|
|
34
|
+
submit: ["login-submit", "login", "tap-login"],
|
|
35
|
+
user: ["login-user", "username"],
|
|
36
|
+
pass: ["login-pass", "password"],
|
|
37
|
+
};
|
|
38
|
+
const alts = aliases[k] || [];
|
|
39
|
+
for (const a of alts) {
|
|
40
|
+
found = items.findIndex((t) => t.id && String(t.id).toLowerCase() === a);
|
|
41
|
+
if (found >= 0)
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (found < 0) {
|
|
46
|
+
found = items.findIndex((t) => (t.id && String(t.id).toLowerCase().includes(k)) ||
|
|
47
|
+
(t.text && String(t.text).toLowerCase().includes(k)));
|
|
48
|
+
}
|
|
49
|
+
if (found >= 0)
|
|
50
|
+
idx = found;
|
|
51
|
+
}
|
|
52
|
+
// Monotonic: never retreat the walkthrough.
|
|
53
|
+
if (curIdx >= 0 && idx < curIdx)
|
|
54
|
+
idx = curIdx;
|
|
55
|
+
return idx;
|
|
56
|
+
}
|
|
57
|
+
/** Advance sequential todo dock to stubIndex and push to the page (Method act). */
|
|
58
|
+
export async function syncTodoDockAdvance(page, todoDockRef, stubIndex, stub) {
|
|
59
|
+
if (!todoDockRef || stubIndex < 0)
|
|
60
|
+
return;
|
|
61
|
+
const prev = todoDockRef.current;
|
|
62
|
+
if (!prev)
|
|
63
|
+
return;
|
|
64
|
+
const idx = resolveTodoAdvanceIndex(prev, stub || null, stubIndex);
|
|
65
|
+
const advanced = advanceTodoDock(prev, idx);
|
|
66
|
+
todoDockRef.current = advanced;
|
|
67
|
+
demoLog(" todo advance -> idx=" +
|
|
68
|
+
idx +
|
|
69
|
+
(stub && (stub.slotId || stub.todo)
|
|
70
|
+
? " slot=" + (stub.todo || stub.slotId)
|
|
71
|
+
: " stub#" + stubIndex) +
|
|
72
|
+
' current="' +
|
|
73
|
+
String((flattenTodoDockItems(advanced).find((t) => t.current) || {}).text || "").slice(0, 40) +
|
|
74
|
+
'"');
|
|
75
|
+
await page
|
|
76
|
+
.evaluate((dock) => {
|
|
77
|
+
if (window.__wgSyncTodos) {
|
|
78
|
+
window.__wgSyncTodos({ sync: "set", dock });
|
|
79
|
+
}
|
|
80
|
+
}, advanced)
|
|
81
|
+
.catch(ignorePageGone);
|
|
82
|
+
}
|
|
83
|
+
export async function probeTodoDocksOnPage(page) {
|
|
84
|
+
return page
|
|
85
|
+
.evaluate(() => {
|
|
86
|
+
const docks = [...__wgQA(".wg-todo-dock, #wg-todo-dock")];
|
|
87
|
+
return docks.map((el) => {
|
|
88
|
+
const r = el.getBoundingClientRect();
|
|
89
|
+
const items = el.querySelectorAll("li");
|
|
90
|
+
let current = "";
|
|
91
|
+
items.forEach((li) => {
|
|
92
|
+
if (li.classList.contains("wg-todo-current")) {
|
|
93
|
+
current = (li.textContent || "").replace(/s+/g, " ").trim().slice(0, 48);
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
return {
|
|
97
|
+
key: el.getAttribute("data-wg-todo-key") || el.id || "?",
|
|
98
|
+
pos: el.dataset.pos || "?",
|
|
99
|
+
top: Math.round(r.top),
|
|
100
|
+
left: Math.round(r.left),
|
|
101
|
+
w: Math.round(r.width),
|
|
102
|
+
h: Math.round(r.height),
|
|
103
|
+
onScreen: r.bottom > 0 && r.right > 0 && r.top < innerHeight && r.left < innerWidth,
|
|
104
|
+
n: items.length,
|
|
105
|
+
current,
|
|
106
|
+
};
|
|
107
|
+
});
|
|
108
|
+
})
|
|
109
|
+
.catch(() => []);
|
|
110
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { MemPage } from "../../engine/mem/mem.js";
|
|
2
|
+
import type { Block } from "../../engine/block/block.js";
|
|
3
|
+
import type { DemoPace } from "../../engine/stub/pace.js";
|
|
4
|
+
import type { HighlightStyleDefaults } from "../../engine/stub/ring.js";
|
|
5
|
+
import type { WgPage } from "../types.js";
|
|
6
|
+
import type { createOverlayStage } from "../overlay/overlay-stage.js";
|
|
7
|
+
import type { Gate } from "./gate.js";
|
|
8
|
+
import type { Pacing } from "./pacing.js";
|
|
9
|
+
/** A step as the stepper sees it (the runner's PlayStep). */
|
|
10
|
+
export interface StepperStep {
|
|
11
|
+
block: Block<any, any> & {
|
|
12
|
+
description?: string;
|
|
13
|
+
fastForward?: boolean;
|
|
14
|
+
demoPace?: DemoPace;
|
|
15
|
+
__waygraphKind?: string;
|
|
16
|
+
__waygraphNavClick?: unknown;
|
|
17
|
+
};
|
|
18
|
+
episodeNumber?: number | undefined;
|
|
19
|
+
episodeTitle?: string | undefined;
|
|
20
|
+
expectedFailureReason?: string | undefined;
|
|
21
|
+
demoPace?: DemoPace | undefined;
|
|
22
|
+
highlightStyle?: HighlightStyleDefaults | undefined;
|
|
23
|
+
wasFastForward?: boolean | undefined;
|
|
24
|
+
}
|
|
25
|
+
/** The stepper's state for the whole run. */
|
|
26
|
+
export interface StepperContext {
|
|
27
|
+
page: WgPage;
|
|
28
|
+
mem: MemPage;
|
|
29
|
+
steps: readonly StepperStep[];
|
|
30
|
+
stage: ReturnType<typeof createOverlayStage>;
|
|
31
|
+
gate: Gate;
|
|
32
|
+
pacing: Pacing;
|
|
33
|
+
refs: {
|
|
34
|
+
stubBefore: {
|
|
35
|
+
current: any[];
|
|
36
|
+
};
|
|
37
|
+
todoDock: {
|
|
38
|
+
current: any;
|
|
39
|
+
};
|
|
40
|
+
device: {
|
|
41
|
+
current: any;
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
title: string | undefined;
|
|
45
|
+
stepperMode: "full" | "carousel";
|
|
46
|
+
/** A title set by a stub (`ctx.title`) names the flow from that step on, until another stub sets a new one. */
|
|
47
|
+
stickyTitle: string | undefined;
|
|
48
|
+
allEpisodes: {
|
|
49
|
+
episodeNumber: number;
|
|
50
|
+
episodeTitle: string;
|
|
51
|
+
}[];
|
|
52
|
+
}
|
|
53
|
+
/** The current step: where it sits in its episode, and what its before panel showed. */
|
|
54
|
+
export interface StepView {
|
|
55
|
+
index: number;
|
|
56
|
+
step: StepperStep;
|
|
57
|
+
/** The breadcrumb is this step's episode ("1st of 2"), or the whole chain when there are no episodes. */
|
|
58
|
+
moduleNames: string[];
|
|
59
|
+
moduleDescriptions: string[];
|
|
60
|
+
moduleIndex: number;
|
|
61
|
+
justEnteredEpisode: boolean;
|
|
62
|
+
overlayTitle: string;
|
|
63
|
+
overlayTodoPos: string | undefined;
|
|
64
|
+
}
|
|
65
|
+
export declare function episodesOf(steps: readonly StepperStep[]): StepperContext["allEpisodes"];
|
|
66
|
+
export declare function viewOf(ctx: StepperContext, index: number): StepView;
|
|
67
|
+
/** Video and --mini get the compact pill; never false, so the person's Hide/Show choice wins otherwise. */
|
|
68
|
+
export declare function forceCollapsed(): true | undefined;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { envFlag, envString } from "../../engine/env.js";
|
|
2
|
+
export function episodesOf(steps) {
|
|
3
|
+
const episodes = [];
|
|
4
|
+
for (const s of steps) {
|
|
5
|
+
if (s.episodeNumber && !episodes.some((e) => e.episodeNumber === s.episodeNumber)) {
|
|
6
|
+
episodes.push({ episodeNumber: s.episodeNumber, episodeTitle: s.episodeTitle ?? "" });
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
return episodes;
|
|
10
|
+
}
|
|
11
|
+
export function viewOf(ctx, index) {
|
|
12
|
+
const step = ctx.steps[index];
|
|
13
|
+
const indices = step.episodeNumber
|
|
14
|
+
? ctx.steps.flatMap((s, i) => (s.episodeNumber === step.episodeNumber ? [i] : []))
|
|
15
|
+
: ctx.steps.map((_s, i) => i);
|
|
16
|
+
const moduleIndex = indices.indexOf(index);
|
|
17
|
+
return {
|
|
18
|
+
index,
|
|
19
|
+
step,
|
|
20
|
+
moduleNames: indices.map((i) => ctx.steps[i].block.name),
|
|
21
|
+
moduleDescriptions: indices.map((i) => ctx.steps[i].block.description || ""),
|
|
22
|
+
moduleIndex,
|
|
23
|
+
justEnteredEpisode: moduleIndex === 0 && step.episodeNumber !== undefined,
|
|
24
|
+
overlayTitle: ctx.title || "waygraph demo",
|
|
25
|
+
overlayTodoPos: undefined,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/** Video and --mini get the compact pill; never false, so the person's Hide/Show choice wins otherwise. */
|
|
29
|
+
export function forceCollapsed() {
|
|
30
|
+
return envString("WAYGRAPH_VIDEO") || envFlag("WAYGRAPH_MINI") ? true : undefined;
|
|
31
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Page } from "@playwright/test";
|
|
2
|
+
export type WgPage = Page;
|
|
3
|
+
declare module "playwright-core" {
|
|
4
|
+
interface Page {
|
|
5
|
+
[key: `__wg${string}`]: any;
|
|
6
|
+
}
|
|
7
|
+
interface Keyboard {
|
|
8
|
+
__wgBeatPatched?: boolean;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
/** A box on the page, in CSS pixels. */
|
|
12
|
+
export interface WgBox {
|
|
13
|
+
x: number;
|
|
14
|
+
y: number;
|
|
15
|
+
width: number;
|
|
16
|
+
height: number;
|
|
17
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { envFlag } from "../engine/env.js";
|
|
2
|
+
/**
|
|
3
|
+
* One log format for the live overlay surfaces (auto / browser / pilot): `[HH:MM:SS.mmm] waygraph <surface>: ...`, the
|
|
4
|
+
* same shape as the demo runner's `step-mode/demo-log.ts`. Silenced by WAYGRAPH_JSON=1.
|
|
5
|
+
*/
|
|
6
|
+
function ts() {
|
|
7
|
+
const d = new Date();
|
|
8
|
+
const p = (n) => String(n).padStart(2, "0");
|
|
9
|
+
return `${p(d.getHours())}:${p(d.getMinutes())}:${p(d.getSeconds())}.${String(d.getMilliseconds()).padStart(3, "0")}`;
|
|
10
|
+
}
|
|
11
|
+
export function verboseLog(surface, msg) {
|
|
12
|
+
if (envFlag("WAYGRAPH_JSON"))
|
|
13
|
+
return;
|
|
14
|
+
console.log(`[${ts()}] waygraph ${surface}: ${msg}`);
|
|
15
|
+
}
|