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,9 +1,9 @@
|
|
|
1
|
+
import type { BlockEntry } from "../../manifest/project.js";
|
|
1
2
|
import type { Page, BrowserContext } from "@playwright/test";
|
|
2
|
-
import { Engine } from "
|
|
3
|
-
import { MemPage } from "
|
|
4
|
-
import {
|
|
5
|
-
import type { Checkpoint } from "
|
|
6
|
-
import { resolveBaseUrl } from "../config.js";
|
|
3
|
+
import { Engine } from "../../engine/engine.js";
|
|
4
|
+
import { MemPage } from "../../engine/mem/mem.js";
|
|
5
|
+
import type { MemKey } from "../../engine/mem/mem.js";
|
|
6
|
+
import type { Checkpoint } from "../../engine/checkpoint/checkpoint.js";
|
|
7
7
|
export interface AutoExploreOptions {
|
|
8
8
|
/** Terminal menu (browser still runs for act()). Default false = headful picker panel. */
|
|
9
9
|
cli?: boolean;
|
|
@@ -11,20 +11,14 @@ export interface AutoExploreOptions {
|
|
|
11
11
|
/** Initial URL when the page is blank (defaults to baseURL). */
|
|
12
12
|
startUrl?: string;
|
|
13
13
|
/** Phase C: glob / regex / bare `--blocks` file select for discovery. */
|
|
14
|
-
blocksSelect?: import("
|
|
14
|
+
blocksSelect?: import("../../manifest/select.js").BlocksSelect;
|
|
15
15
|
}
|
|
16
|
-
/**
|
|
17
|
-
* don't need to change their import path. */
|
|
18
|
-
export { resolveBaseUrl };
|
|
16
|
+
/** Which Checkpoint the page is on, asked of the project's own Nav / Page Blocks (their verify). */
|
|
19
17
|
export declare function detectHere(page: Page, navBlocks: BlockEntry[]): Promise<string | null>;
|
|
20
18
|
export declare function ensureLivePage(context: BrowserContext, page: Page, startUrl: string | undefined): Promise<Page>;
|
|
21
|
-
/**
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
* silently gets a saucedemo credentials object instead of its own default.
|
|
25
|
-
*/
|
|
26
|
-
export declare function defaultMemValueForKey(keyName: string): unknown | undefined;
|
|
27
|
-
/** Pre-seed known demo keys (saucedemo creds) so headful/cli do not stop for mem forms. */
|
|
19
|
+
/** The project's own default for a key: its `registerMemStub` fake (live sessions load every `*.mem-stubs.ts`). */
|
|
20
|
+
export declare function memStubValue(key: MemKey<unknown>): unknown | undefined;
|
|
21
|
+
/** Pre-seeds required keys from WAYGRAPH_DATA and the project's mem stubs, so a session does not stop for mem forms. */
|
|
28
22
|
export declare function seedDefaultMem(library: Map<string, BlockEntry>, mem: MemPage): void;
|
|
29
23
|
export declare function ensureMem(entry: BlockEntry, mem: MemPage, cli: boolean): Promise<void>;
|
|
30
24
|
export declare function runOneBlock(engine: Engine, entry: BlockEntry, context: BrowserContext, page: Page, mem: MemPage, headful: boolean): Promise<Checkpoint<string>>;
|
|
@@ -1,47 +1,21 @@
|
|
|
1
|
+
import { getMemStub } from "../../engine/mem/mem-stub.js";
|
|
1
2
|
import { createInterface } from "node:readline/promises";
|
|
2
|
-
import { ensureShadowRoot } from "
|
|
3
|
+
import { ensureShadowRoot } from "../../demo/overlay/ui/shadow.js";
|
|
3
4
|
import { stdin as input, stdout as output } from "node:process";
|
|
4
|
-
import { Engine
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
const path = new URL(page.url()).pathname;
|
|
18
|
-
if (path.includes("inventory-item.html"))
|
|
19
|
-
return "ItemDetailPage";
|
|
20
|
-
if (path.includes("inventory.html"))
|
|
21
|
-
return "LoggedIn";
|
|
22
|
-
if (path.includes("cart.html"))
|
|
23
|
-
return "CartPage";
|
|
24
|
-
if (path.includes("checkout-step-one.html"))
|
|
25
|
-
return "CheckoutInfoPage";
|
|
26
|
-
if (path.includes("checkout-step-two.html"))
|
|
27
|
-
return "CheckoutOverviewPage";
|
|
28
|
-
if (path.includes("checkout-complete.html"))
|
|
29
|
-
return "OrderComplete";
|
|
30
|
-
if (path === "/" || path === "") {
|
|
31
|
-
if (await page.locator("#login-button").isVisible({ timeout: 500 }).catch(() => false)) {
|
|
32
|
-
return "LoginPage";
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
catch {
|
|
37
|
-
/* ignore */
|
|
38
|
-
}
|
|
39
|
-
return null;
|
|
40
|
-
}
|
|
5
|
+
import { Engine } from "../../engine/engine.js";
|
|
6
|
+
import { buildFlow } from "../../engine/flow/flow.js";
|
|
7
|
+
import { locate } from "../../engine/locate.js";
|
|
8
|
+
import { MemPage } from "../../engine/mem/mem.js";
|
|
9
|
+
import { buildExploreContext, buildExploreMenu, } from "./explore.js";
|
|
10
|
+
import { installDemoChrome, instrumentAutoInteractions } from "../../demo/overlay/auto-chrome.js";
|
|
11
|
+
import { keepOverlayOnNavigation } from "../../demo/overlay/reattach.js";
|
|
12
|
+
import { configuredExtensions, resolveBaseUrl } from "../../runtime/waygraph-config.js";
|
|
13
|
+
import { withWebServer } from "../../runtime/webserver.js";
|
|
14
|
+
import { chromiumExecutablePath, launchContext } from "../../runtime/browser.js";
|
|
15
|
+
import { envString } from "../../engine/env.js";
|
|
16
|
+
import { ignorePageGone, ignoreTimeout } from "../../engine/page-gone.js";
|
|
17
|
+
/** Which Checkpoint the page is on, asked of the project's own Nav / Page Blocks (their verify). */
|
|
41
18
|
export async function detectHere(page, navBlocks) {
|
|
42
|
-
const fromUrl = await inferCheckpointFromUrl(page);
|
|
43
|
-
if (fromUrl)
|
|
44
|
-
return fromUrl;
|
|
45
19
|
const tags = navBlocks.map((n) => n.block);
|
|
46
20
|
return locate(page, tags, { timeoutMs: 1500 });
|
|
47
21
|
}
|
|
@@ -50,8 +24,8 @@ export async function ensureLivePage(context, page, startUrl) {
|
|
|
50
24
|
return page;
|
|
51
25
|
const fresh = await context.newPage();
|
|
52
26
|
if (startUrl) {
|
|
53
|
-
await fresh.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(
|
|
54
|
-
await fresh.waitForLoadState("load").catch(
|
|
27
|
+
await fresh.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(ignorePageGone);
|
|
28
|
+
await fresh.waitForLoadState("load").catch(ignoreTimeout);
|
|
55
29
|
}
|
|
56
30
|
return fresh;
|
|
57
31
|
}
|
|
@@ -59,28 +33,16 @@ function missingMemKeys(entry, mem) {
|
|
|
59
33
|
const requires = entry.block.requires ?? [];
|
|
60
34
|
return requires.filter((k) => !mem.has(k));
|
|
61
35
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
* A consumer's own `key<string>("login-email")` must stay unset here, or it
|
|
66
|
-
* silently gets a saucedemo credentials object instead of its own default.
|
|
67
|
-
*/
|
|
68
|
-
export function defaultMemValueForKey(keyName) {
|
|
69
|
-
if (keyName === "login-credentials" ||
|
|
70
|
-
keyName === "credentials" ||
|
|
71
|
-
keyName === "saucedemo.credentials") {
|
|
72
|
-
return DEFAULT_CREDENTIALS;
|
|
73
|
-
}
|
|
74
|
-
return undefined;
|
|
36
|
+
/** The project's own default for a key: its `registerMemStub` fake (live sessions load every `*.mem-stubs.ts`). */
|
|
37
|
+
export function memStubValue(key) {
|
|
38
|
+
return getMemStub(key)?.();
|
|
75
39
|
}
|
|
76
|
-
function defaultMemJsonPrompt(
|
|
77
|
-
const def =
|
|
78
|
-
|
|
79
|
-
return JSON.stringify(def);
|
|
80
|
-
return "{}";
|
|
40
|
+
function defaultMemJsonPrompt(key) {
|
|
41
|
+
const def = memStubValue(key);
|
|
42
|
+
return def === undefined ? "{}" : JSON.stringify(def);
|
|
81
43
|
}
|
|
82
44
|
function seedMemFromEnv(mem, entry) {
|
|
83
|
-
const raw =
|
|
45
|
+
const raw = envString("WAYGRAPH_DATA") ?? envString("WAYGRAPH_AUTO_MEM");
|
|
84
46
|
if (!raw)
|
|
85
47
|
return false;
|
|
86
48
|
try {
|
|
@@ -95,16 +57,16 @@ function seedMemFromEnv(mem, entry) {
|
|
|
95
57
|
return false;
|
|
96
58
|
}
|
|
97
59
|
}
|
|
98
|
-
/** Pre-
|
|
60
|
+
/** Pre-seeds required keys from WAYGRAPH_DATA and the project's mem stubs, so a session does not stop for mem forms. */
|
|
99
61
|
export function seedDefaultMem(library, mem) {
|
|
100
|
-
const raw =
|
|
62
|
+
const raw = envString("WAYGRAPH_DATA") ?? envString("WAYGRAPH_AUTO_MEM");
|
|
101
63
|
let envParsed = {};
|
|
102
64
|
if (raw) {
|
|
103
65
|
try {
|
|
104
66
|
envParsed = JSON.parse(raw);
|
|
105
67
|
}
|
|
106
|
-
catch {
|
|
107
|
-
|
|
68
|
+
catch (err) {
|
|
69
|
+
throw new Error(`waygraph: --data / WAYGRAPH_DATA is not valid JSON: ${err instanceof Error ? err.message : String(err)}`);
|
|
108
70
|
}
|
|
109
71
|
}
|
|
110
72
|
for (const entry of library.values()) {
|
|
@@ -115,7 +77,7 @@ export function seedDefaultMem(library, mem) {
|
|
|
115
77
|
mem.set(k, envParsed[k.name]);
|
|
116
78
|
continue;
|
|
117
79
|
}
|
|
118
|
-
const def =
|
|
80
|
+
const def = memStubValue(k);
|
|
119
81
|
if (def !== undefined)
|
|
120
82
|
mem.set(k, def);
|
|
121
83
|
}
|
|
@@ -125,7 +87,7 @@ async function promptMemCli(entry, mem) {
|
|
|
125
87
|
const rl = createInterface({ input, output });
|
|
126
88
|
try {
|
|
127
89
|
for (const k of missingMemKeys(entry, mem)) {
|
|
128
|
-
const def = defaultMemJsonPrompt(k
|
|
90
|
+
const def = defaultMemJsonPrompt(k);
|
|
129
91
|
const line = await rl.question(` ${k.name} JSON [${def}]: `);
|
|
130
92
|
const json = line.trim() || def;
|
|
131
93
|
mem.set(k, JSON.parse(json));
|
|
@@ -153,11 +115,7 @@ async function setAutoPanelRunning(page, label) {
|
|
|
153
115
|
const panel = __wgById("wg-auto-panel");
|
|
154
116
|
if (!panel)
|
|
155
117
|
return;
|
|
156
|
-
|
|
157
|
-
"Running: <strong>" +
|
|
158
|
-
label +
|
|
159
|
-
"</strong></div>";
|
|
160
|
-
panel.innerHTML = body;
|
|
118
|
+
__wgSet(panel, __wgEl("h3", null, "waygraph auto"), __wgEl("div", { style: "padding:12px 0;color:#c9a6ff" }, "Running: ", __wgEl("strong", null, label)));
|
|
161
119
|
if (typeof window.__wgWirePanelChrome === "function") {
|
|
162
120
|
window.__wgWirePanelChrome(panel, "wg-auto-panel-hidden", "waygraph auto");
|
|
163
121
|
}
|
|
@@ -175,7 +133,7 @@ async function setAutoPanelRunning(page, label) {
|
|
|
175
133
|
panel.setAttribute("data-wg-ready", "1");
|
|
176
134
|
}
|
|
177
135
|
}, label)
|
|
178
|
-
.catch(
|
|
136
|
+
.catch(ignorePageGone);
|
|
179
137
|
}
|
|
180
138
|
export async function runOneBlock(engine, entry, context, page, mem, headful) {
|
|
181
139
|
const navClick = entry.block.__waygraphNavClick;
|
|
@@ -184,11 +142,11 @@ export async function runOneBlock(engine, entry, context, page, mem, headful) {
|
|
|
184
142
|
.evaluate((label) => {
|
|
185
143
|
window.__wgPendingNavClickLabel = label;
|
|
186
144
|
}, `nav: ${entry.block.name}`)
|
|
187
|
-
.catch(
|
|
145
|
+
.catch(ignorePageGone);
|
|
188
146
|
}
|
|
189
147
|
if (headful)
|
|
190
148
|
await setAutoPanelRunning(page, entry.block.name);
|
|
191
|
-
const flow =
|
|
149
|
+
const flow = buildFlow([entry.block], engine.config);
|
|
192
150
|
const BLOCK_TIMEOUT_MS = 45_000;
|
|
193
151
|
let timer;
|
|
194
152
|
let result;
|
|
@@ -206,7 +164,7 @@ export async function runOneBlock(engine, entry, context, page, mem, headful) {
|
|
|
206
164
|
if (timer)
|
|
207
165
|
clearTimeout(timer);
|
|
208
166
|
}
|
|
209
|
-
await page.evaluate("delete window.__wgPendingNavClickLabel").catch(
|
|
167
|
+
await page.evaluate("delete window.__wgPendingNavClickLabel").catch(ignorePageGone);
|
|
210
168
|
return result;
|
|
211
169
|
}
|
|
212
170
|
const PANEL_CSS = "#wg-auto-panel{position:fixed;z-index:2147483647;left:50%;bottom:12px;transform:translateX(-50%);" +
|
|
@@ -242,9 +200,6 @@ const PANEL_CSS = "#wg-auto-panel{position:fixed;z-index:2147483647;left:50%;bot
|
|
|
242
200
|
"#wg-auto-panel.wg-collapsed{left:50%;right:auto;transform:translateX(-50%);width:auto;}" +
|
|
243
201
|
"#wg-auto-panel button.wg-act{padding:12px;font-size:14px;}" +
|
|
244
202
|
"}";
|
|
245
|
-
function esc(s) {
|
|
246
|
-
return s.replace(/&/g, "&").replace(/</g, "<").replace(/"/g, """);
|
|
247
|
-
}
|
|
248
203
|
/** Shown in the headful panel after each Block run. */
|
|
249
204
|
let lastRunNote = null;
|
|
250
205
|
/**
|
|
@@ -306,36 +261,22 @@ async function headfulPick(page, menu, library, mem, waitPick) {
|
|
|
306
261
|
const here = menu.here;
|
|
307
262
|
const hereLabel = here ?? (menu.flat.length > 0 ? "Unknown - pick Start here" : "Unknown - no moves available");
|
|
308
263
|
const menuMemKeys = memKeysForMenu(menu, library);
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
let memIdx = 0;
|
|
319
|
-
for (const k of menuMemKeys) {
|
|
320
|
-
let value = "{}";
|
|
321
|
-
try {
|
|
322
|
-
if (mem.has(k))
|
|
323
|
-
value = JSON.stringify(mem.get(k), null, 2);
|
|
324
|
-
else {
|
|
325
|
-
const def = defaultMemValueForKey(k.name);
|
|
326
|
-
if (def !== undefined)
|
|
327
|
-
value = JSON.stringify(def, null, 2);
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
catch {
|
|
331
|
-
/* ignore */
|
|
264
|
+
const memFields = menuMemKeys.map((k) => {
|
|
265
|
+
let value = "{}";
|
|
266
|
+
try {
|
|
267
|
+
if (mem.has(k))
|
|
268
|
+
value = JSON.stringify(mem.get(k), null, 2);
|
|
269
|
+
else {
|
|
270
|
+
const def = memStubValue(k);
|
|
271
|
+
if (def !== undefined)
|
|
272
|
+
value = JSON.stringify(def, null, 2);
|
|
332
273
|
}
|
|
333
|
-
html +=
|
|
334
|
-
`<label class="wg-mem">${esc(k.name)}</label>` +
|
|
335
|
-
`<textarea class="wg-mem-input" data-mem-key="${esc(k.name)}" id="wg-mem-${memIdx}" rows="4">${esc(value)}</textarea>`;
|
|
336
|
-
memIdx++;
|
|
337
274
|
}
|
|
338
|
-
|
|
275
|
+
catch {
|
|
276
|
+
/* a value JSON can't encode shows as {} for the person to fill in */
|
|
277
|
+
}
|
|
278
|
+
return { name: k.name, value };
|
|
279
|
+
});
|
|
339
280
|
// Pre-resolve every candidate's hover-preview box THROUGH Playwright's own locator (>>
|
|
340
281
|
// piercing / :has-text() / :visible support), once, here on the Node side - not a raw selector
|
|
341
282
|
// string handed to the page for a per-mouseenter document.querySelector to fail silently on
|
|
@@ -367,152 +308,126 @@ async function headfulPick(page, menu, library, mem, waitPick) {
|
|
|
367
308
|
: null;
|
|
368
309
|
hlBoxes.set(sel, box);
|
|
369
310
|
}));
|
|
370
|
-
html += `<div class="wg-actions">`;
|
|
371
311
|
let idx = 0;
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
for (const section of menu.sections) {
|
|
376
|
-
html += `<div class="wg-section">${esc(section.title)}</div>`;
|
|
377
|
-
for (const c of section.edges) {
|
|
312
|
+
const sections = menu.sections.map((section) => ({
|
|
313
|
+
title: section.title,
|
|
314
|
+
buttons: section.edges.map((c) => {
|
|
378
315
|
const entry = library.get(c.block);
|
|
379
316
|
const navClick = entry?.block?.__waygraphNavClick;
|
|
380
317
|
const hl = c.instanceOption?.highlight ?? (typeof navClick === "string" ? navClick : undefined);
|
|
381
318
|
const hlBox = hl ? hlBoxes.get(hl) : null;
|
|
382
|
-
const
|
|
383
|
-
if (c.label)
|
|
384
|
-
|
|
319
|
+
const base = { idx: idx++, hlBox: hlBox ? JSON.stringify(hlBox) : undefined };
|
|
320
|
+
if (c.label)
|
|
321
|
+
return { ...base, label: c.label };
|
|
322
|
+
return { ...base, kind: c.kind, block: c.block, to: c.to, ...(entry?.description ? { description: entry.description } : {}) };
|
|
323
|
+
}),
|
|
324
|
+
}));
|
|
325
|
+
await ensureShadowRoot(page);
|
|
326
|
+
await page.evaluate(({ css, note, hereLabel, memFields, sections }) => {
|
|
327
|
+
__wgCss(css, "wg-auto-style");
|
|
328
|
+
__wgById("wg-auto-panel")?.remove();
|
|
329
|
+
const root = __wgEl("div", { id: "wg-auto-panel" }, __wgEl("h3", null, "waygraph auto"), note ? __wgEl("div", { style: "margin-bottom:8px;font-size:12px;color:#a7f3d0" }, note) : null, __wgEl("div", { class: "wg-here" }, "You are here: ", __wgEl("strong", null, hereLabel)), memFields.length ? __wgEl("div", { class: "wg-section" }, "Mem - edit credentials, then click a block below") : null, memFields.map((f, i) => {
|
|
330
|
+
const field = __wgEl("textarea", { class: "wg-mem-input", id: "wg-mem-" + i, data: { memKey: f.name }, attrs: { rows: 4 } });
|
|
331
|
+
field.value = f.value;
|
|
332
|
+
return [__wgEl("label", { class: "wg-mem" }, f.name), field];
|
|
333
|
+
}), __wgEl("div", { class: "wg-actions" }, sections.length === 0 ? __wgEl("div", { style: "opacity:.85;padding:8px 0" }, "No moves from this screen right now.") : null, sections.map((section) => [
|
|
334
|
+
__wgEl("div", { class: "wg-section" }, section.title),
|
|
335
|
+
section.buttons.map((b) => __wgEl("button", { class: "wg-act", data: { idx: b.idx, hlBox: b.hlBox } }, b.label !== undefined
|
|
336
|
+
? b.label
|
|
337
|
+
: [
|
|
338
|
+
__wgEl("span", { class: "wg-kind" }, b.kind ?? ""),
|
|
339
|
+
" ",
|
|
340
|
+
__wgEl("strong", null, b.block ?? ""),
|
|
341
|
+
" -> " + (b.to ?? ""),
|
|
342
|
+
b.description ? [__wgEl("br"), __wgEl("span", { style: "opacity:.85" }, b.description)] : null,
|
|
343
|
+
])),
|
|
344
|
+
])), __wgEl("button", { class: "wg-act wg-quit", data: { quit: "1" } }, "Quit"));
|
|
345
|
+
__wgAdd(root);
|
|
346
|
+
// Chrome + Hide/Show, shared with setAutoPanelRunning.
|
|
347
|
+
window.__wgWirePanelChrome = (el, storageKey, chromeTitle) => {
|
|
348
|
+
if (!el)
|
|
349
|
+
return;
|
|
350
|
+
if (!el.querySelector(":scope > .wg-chrome")) {
|
|
351
|
+
const body = __wgEl("div", { class: "wg-body" }, Array.from(el.childNodes));
|
|
352
|
+
const chrome = __wgEl("div", { class: "wg-chrome" }, __wgEl("span", { class: "wg-chrome-title" }, chromeTitle || "waygraph auto"), __wgEl("button", { class: "wg-hide-btn", data: { wgToggle: "1" }, attrs: { type: "button" } }, "Hide"));
|
|
353
|
+
el.append(chrome, body);
|
|
385
354
|
}
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
355
|
+
const apply = (hidden) => {
|
|
356
|
+
el.classList.toggle("wg-collapsed", hidden);
|
|
357
|
+
el.setAttribute("data-wg-collapsed", hidden ? "1" : "0");
|
|
358
|
+
const t = el.querySelector("[data-wg-toggle]");
|
|
359
|
+
if (t)
|
|
360
|
+
t.textContent = hidden ? "Show" : "Hide";
|
|
361
|
+
try {
|
|
362
|
+
localStorage.setItem(storageKey, hidden ? "1" : "0");
|
|
363
|
+
}
|
|
364
|
+
catch {
|
|
365
|
+
/* blocked storage: Hide still works for this page */
|
|
366
|
+
}
|
|
367
|
+
};
|
|
368
|
+
let hidden = false;
|
|
369
|
+
try {
|
|
370
|
+
hidden = localStorage.getItem(storageKey) === "1";
|
|
371
|
+
}
|
|
372
|
+
catch {
|
|
373
|
+
/* blocked storage: starts shown */
|
|
374
|
+
}
|
|
375
|
+
apply(hidden);
|
|
376
|
+
const toggle = el.querySelector("[data-wg-toggle]");
|
|
377
|
+
if (toggle && !toggle.dataset.wgWired) {
|
|
378
|
+
toggle.dataset.wgWired = "1";
|
|
379
|
+
toggle.addEventListener("click", (e) => {
|
|
380
|
+
e.stopPropagation();
|
|
381
|
+
apply(!el.classList.contains("wg-collapsed"));
|
|
382
|
+
});
|
|
391
383
|
}
|
|
392
|
-
idx++;
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
html += `</div><button class="wg-act wg-quit" data-quit="1">Quit</button></div>`;
|
|
396
|
-
// Wrap body; chrome + Hide/Show wired in page (shared with stepper).
|
|
397
|
-
html =
|
|
398
|
-
`<style id="wg-auto-style">${PANEL_CSS}</style><div id="wg-auto-panel">` +
|
|
399
|
-
html.slice(html.indexOf("<h3>"));
|
|
400
|
-
await ensureShadowRoot(page);
|
|
401
|
-
await page.evaluate(`((inner) => {
|
|
402
|
-
let panel = __wgById("wg-auto-panel");
|
|
403
|
-
if (!panel) {
|
|
404
|
-
panel = document.createElement("div");
|
|
405
|
-
__wgAdd(panel);
|
|
406
|
-
}
|
|
407
|
-
panel.outerHTML = inner;
|
|
408
|
-
const root = __wgById("wg-auto-panel");
|
|
409
|
-
if (!root) return;
|
|
410
|
-
window.__wgWirePanelChrome = (el, storageKey, chromeTitle) => {
|
|
411
|
-
if (!el) return;
|
|
412
|
-
if (!el.querySelector(":scope > .wg-chrome")) {
|
|
413
|
-
const body = document.createElement("div");
|
|
414
|
-
body.className = "wg-body";
|
|
415
|
-
while (el.firstChild) body.appendChild(el.firstChild);
|
|
416
|
-
const chrome = document.createElement("div");
|
|
417
|
-
chrome.className = "wg-chrome";
|
|
418
|
-
const titleEl = document.createElement("span");
|
|
419
|
-
titleEl.className = "wg-chrome-title";
|
|
420
|
-
titleEl.textContent = chromeTitle || "waygraph auto";
|
|
421
|
-
const btn = document.createElement("button");
|
|
422
|
-
btn.type = "button";
|
|
423
|
-
btn.className = "wg-hide-btn";
|
|
424
|
-
btn.setAttribute("data-wg-toggle", "1");
|
|
425
|
-
btn.textContent = "Hide";
|
|
426
|
-
chrome.appendChild(titleEl);
|
|
427
|
-
chrome.appendChild(btn);
|
|
428
|
-
el.appendChild(chrome);
|
|
429
|
-
el.appendChild(body);
|
|
430
|
-
}
|
|
431
|
-
const apply = (hidden) => {
|
|
432
|
-
el.classList.toggle("wg-collapsed", hidden);
|
|
433
|
-
el.setAttribute("data-wg-collapsed", hidden ? "1" : "0");
|
|
434
|
-
const t = el.querySelector("[data-wg-toggle]");
|
|
435
|
-
if (t) t.textContent = hidden ? "Show" : "Hide";
|
|
436
|
-
try { localStorage.setItem(storageKey, hidden ? "1" : "0"); } catch {}
|
|
437
384
|
};
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
const toggle = el.querySelector("[data-wg-toggle]");
|
|
442
|
-
if (toggle && !toggle.dataset.wgWired) {
|
|
443
|
-
toggle.dataset.wgWired = "1";
|
|
444
|
-
toggle.addEventListener("click", (e) => {
|
|
445
|
-
e.stopPropagation();
|
|
446
|
-
apply(!el.classList.contains("wg-collapsed"));
|
|
447
|
-
});
|
|
385
|
+
window.__wgWirePanelChrome(root, "wg-auto-panel-hidden", "waygraph auto");
|
|
386
|
+
if (typeof window.__wgStampModal === "function") {
|
|
387
|
+
window.__wgStampModal(root, "auto-panel", { phase: "pick", ready: true });
|
|
448
388
|
}
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
const idx = Number(btn.getAttribute("data-idx"));
|
|
489
|
-
window.__wgAutoPick?.(idx);
|
|
490
|
-
});
|
|
491
|
-
btn.addEventListener("mouseenter", () => {
|
|
492
|
-
// Pre-resolved on the Node side via Playwright's own locator (>> piercing / :has-text()
|
|
493
|
-
// support) when this menu was built - see headfulPick's own comment for why a
|
|
494
|
-
// mouseenter handler can't itself round-trip to a Node-side locator per hover.
|
|
495
|
-
const raw = btn.getAttribute("data-hl-box");
|
|
496
|
-
if (!raw || typeof window.__wgPositionRing !== "function") return;
|
|
497
|
-
let box;
|
|
498
|
-
try {
|
|
499
|
-
box = JSON.parse(raw);
|
|
500
|
-
} catch {
|
|
501
|
-
return;
|
|
502
|
-
}
|
|
503
|
-
window.__wgPositionRing(
|
|
504
|
-
box,
|
|
505
|
-
btn.textContent?.trim()?.slice(0, 80) || "target",
|
|
506
|
-
"auto",
|
|
507
|
-
);
|
|
508
|
-
});
|
|
509
|
-
btn.addEventListener("mouseleave", () => {
|
|
510
|
-
window.__wgHideRing?.();
|
|
389
|
+
else {
|
|
390
|
+
root.setAttribute("data-wg-ui", "1");
|
|
391
|
+
root.setAttribute("data-wg-modal", "auto-panel");
|
|
392
|
+
root.setAttribute("data-wg-phase", "pick");
|
|
393
|
+
root.setAttribute("data-wg-collapsed", root.classList.contains("wg-collapsed") ? "1" : "0");
|
|
394
|
+
root.setAttribute("data-wg-ready", "1");
|
|
395
|
+
window.__wgOverlayBeacon =
|
|
396
|
+
window.__wgOverlayBeacon ||
|
|
397
|
+
(() => Array.from(__wgQA('[data-wg-ui="1"]')).map((el) => {
|
|
398
|
+
const r = el.getBoundingClientRect();
|
|
399
|
+
const st = getComputedStyle(el);
|
|
400
|
+
return {
|
|
401
|
+
id: el.id || null,
|
|
402
|
+
modal: el.getAttribute("data-wg-modal"),
|
|
403
|
+
ready: el.getAttribute("data-wg-ready") === "1",
|
|
404
|
+
phase: el.getAttribute("data-wg-phase"),
|
|
405
|
+
step: el.getAttribute("data-wg-step"),
|
|
406
|
+
block: el.getAttribute("data-wg-block"),
|
|
407
|
+
collapsed: el.getAttribute("data-wg-collapsed") === "1" || el.classList.contains("wg-collapsed"),
|
|
408
|
+
opacity: st.opacity,
|
|
409
|
+
textLen: (el.innerText || "").trim().length,
|
|
410
|
+
w: Math.round(r.width),
|
|
411
|
+
h: Math.round(r.height),
|
|
412
|
+
visible: r.width > 0 && r.height > 0 && Number(st.opacity) > 0.05,
|
|
413
|
+
};
|
|
414
|
+
}));
|
|
415
|
+
}
|
|
416
|
+
root.querySelectorAll("button[data-idx]").forEach((btn) => {
|
|
417
|
+
btn.addEventListener("click", () => window.__wgAutoPick?.(Number(btn.dataset.idx)));
|
|
418
|
+
btn.addEventListener("mouseenter", () => {
|
|
419
|
+
// Pre-resolved on the Node side via Playwright's own locator (>> piercing / :has-text()
|
|
420
|
+
// support) when this menu was built - see headfulPick's own comment for why a
|
|
421
|
+
// mouseenter handler can't itself round-trip to a Node-side locator per hover.
|
|
422
|
+
const raw = btn.dataset.hlBox;
|
|
423
|
+
if (!raw || typeof window.__wgPositionRing !== "function")
|
|
424
|
+
return;
|
|
425
|
+
window.__wgPositionRing(JSON.parse(raw), btn.textContent?.trim()?.slice(0, 80) || "target", "auto");
|
|
426
|
+
});
|
|
427
|
+
btn.addEventListener("mouseleave", () => window.__wgHideRing?.());
|
|
511
428
|
});
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
if (quit) quit.addEventListener("click", () => window.__wgAutoQuit?.());
|
|
515
|
-
})(${JSON.stringify(html)})`);
|
|
429
|
+
root.querySelector("[data-quit]")?.addEventListener("click", () => window.__wgAutoQuit?.());
|
|
430
|
+
}, { css: PANEL_CSS, note: lastRunNote, hereLabel, memFields, sections });
|
|
516
431
|
return waitPick();
|
|
517
432
|
}
|
|
518
433
|
function printCliMenu(menu, library) {
|
|
@@ -567,7 +482,7 @@ export async function runAutoExplore(projectDir, options = {}) {
|
|
|
567
482
|
async function runAutoExploreCore(projectDir, options = {}) {
|
|
568
483
|
lastRunNote = null;
|
|
569
484
|
const cli = options.cli === true;
|
|
570
|
-
const baseURL = options.baseURL ?? (await resolveBaseUrl(projectDir)) ??
|
|
485
|
+
const baseURL = options.baseURL ?? (await resolveBaseUrl(projectDir)) ?? envString("WAYGRAPH_BASE_URL");
|
|
571
486
|
const startUrl = options.startUrl ?? baseURL;
|
|
572
487
|
const { graph, library } = await buildExploreContext(projectDir, options.blocksSelect ? { blocksSelect: options.blocksSelect } : undefined);
|
|
573
488
|
if (options.blocksSelect) {
|
|
@@ -600,8 +515,8 @@ async function runAutoExploreCore(projectDir, options = {}) {
|
|
|
600
515
|
});
|
|
601
516
|
let page = await context.newPage();
|
|
602
517
|
if (startUrl) {
|
|
603
|
-
await page.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(
|
|
604
|
-
await page.waitForLoadState("load").catch(
|
|
518
|
+
await page.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(ignorePageGone);
|
|
519
|
+
await page.waitForLoadState("load").catch(ignoreTimeout);
|
|
605
520
|
}
|
|
606
521
|
console.error(`waygraph auto: ${graph.nodes.length} checkpoint(s), ${graph.edges.length} edge(s) - ` +
|
|
607
522
|
(cli ? "CLI picker (terminal menu)" : "headful picker (browser panel)"));
|
|
@@ -618,7 +533,8 @@ async function runAutoExploreCore(projectDir, options = {}) {
|
|
|
618
533
|
});
|
|
619
534
|
if (!cli) {
|
|
620
535
|
await installDemoChrome(target, "", { banner: false });
|
|
621
|
-
|
|
536
|
+
keepOverlayOnNavigation(target, () => installDemoChrome(target, "", { banner: false }));
|
|
537
|
+
instrumentAutoInteractions(target, mem, 250);
|
|
622
538
|
}
|
|
623
539
|
wiredPage = target;
|
|
624
540
|
}
|
|
@@ -1,18 +1,12 @@
|
|
|
1
1
|
import type { Page } from "@playwright/test";
|
|
2
|
-
import type {
|
|
3
|
-
import { type WaygraphGraph, type WaygraphEdge } from "
|
|
2
|
+
import type { WaygraphInstanceOption } from "../../engine/block/block.js";
|
|
3
|
+
import { type WaygraphGraph, type WaygraphEdge } from "../../analysis/graph.js";
|
|
4
4
|
export interface ExploreContextOpts {
|
|
5
|
-
blocksSelect?: import("
|
|
5
|
+
blocksSelect?: import("../../manifest/select.js").BlocksSelect;
|
|
6
6
|
/** Absolute paths of extra Block trees to merge (host projectDir is always first). */
|
|
7
7
|
inject?: string[];
|
|
8
8
|
}
|
|
9
|
-
|
|
10
|
-
block: Block<Checkpoint<string>, Checkpoint<string>>;
|
|
11
|
-
exportName: string;
|
|
12
|
-
file: string;
|
|
13
|
-
kind: "nav" | "action";
|
|
14
|
-
description: string;
|
|
15
|
-
}
|
|
9
|
+
import type { BlockEntry } from "../../manifest/project.js";
|
|
16
10
|
/**
|
|
17
11
|
* One menu row. Usually just a `WaygraphEdge` as discovered statically; when
|
|
18
12
|
* a Block declares `instanceOptions`, one `ExploreEdge` is produced per live
|
|
@@ -41,10 +35,6 @@ export declare function loadBlockLibrary(projectDir: string, opts?: ExploreConte
|
|
|
41
35
|
byName: Map<string, BlockEntry>;
|
|
42
36
|
navBlocks: BlockEntry[];
|
|
43
37
|
}>;
|
|
44
|
-
/**
|
|
45
|
-
* @deprecated Use {@link buildExploreMenu} — kept for unit tests.
|
|
46
|
-
*/
|
|
47
|
-
export declare function exploreChoices(graph: WaygraphGraph, here: string | null): WaygraphEdge[];
|
|
48
38
|
/**
|
|
49
39
|
* Runtime-filtered menu: only Blocks that can run on the live page, grouped forward/back.
|
|
50
40
|
*/
|