waygraph 0.15.54 → 0.16.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -3
- package/bin/waygraph +2 -2
- package/dist/analysis/check.d.ts +38 -0
- package/dist/analysis/check.js +87 -0
- package/dist/analysis/coverage-gap.d.ts +1 -1
- package/dist/analysis/coverage-gap.js +14 -37
- package/dist/analysis/flow-source.d.ts +9 -0
- package/dist/analysis/flow-source.js +25 -0
- package/dist/analysis/graph.d.ts +10 -14
- package/dist/analysis/graph.js +48 -371
- package/dist/analysis/map-check.js +4 -39
- package/dist/analysis/practices-check.d.ts +1 -1
- package/dist/analysis/practices-check.js +24 -45
- package/dist/cli/args.d.ts +23 -0
- package/dist/cli/args.js +20 -0
- package/dist/{cli.d.ts → cli/cli.d.ts} +0 -1
- package/dist/{cli.js → cli/cli.js} +10 -9
- package/dist/{commands → cli/commands}/agent-dive-scaffold.js +35 -64
- package/dist/cli/commands/agent-dive.js +42 -0
- package/dist/cli/commands/browser.d.ts +2 -0
- package/dist/cli/commands/browser.js +109 -0
- package/dist/{commands → cli/commands}/check.d.ts +0 -1
- package/dist/cli/commands/check.js +104 -0
- package/dist/cli/commands/codemod-checkpoints.d.ts +18 -0
- package/dist/cli/commands/codemod-checkpoints.js +186 -0
- package/dist/cli/commands/codemod-flows.d.ts +18 -0
- package/dist/cli/commands/codemod-flows.js +284 -0
- package/dist/cli/commands/codemod-stubs.d.ts +10 -0
- package/dist/cli/commands/codemod-stubs.js +187 -0
- package/dist/{commands → cli/commands}/extensions.js +5 -4
- package/dist/{commands → cli/commands}/init.js +1 -2
- package/dist/{commands → cli/commands}/list.js +9 -7
- package/dist/cli/commands/manifest.d.ts +2 -0
- package/dist/cli/commands/manifest.js +20 -0
- package/dist/cli/commands/map.js +57 -0
- package/dist/cli/commands/pilot.d.ts +2 -0
- package/dist/cli/commands/pilot.js +102 -0
- package/dist/{commands → cli/commands}/run.d.ts +0 -1
- package/dist/cli/commands/run.js +64 -0
- package/dist/cli/commands/session-ops.d.ts +3 -0
- package/dist/cli/commands/session-ops.js +257 -0
- package/dist/cli/commands/session.js +132 -0
- package/dist/{commands → cli/commands}/test.js +11 -14
- package/dist/cli/commands/traverse.js +105 -0
- package/dist/{commands → cli/commands}/try.js +29 -25
- package/dist/{commands → cli/commands}/upgrade.js +40 -4
- package/dist/cli/flags.d.ts +193 -16
- package/dist/cli/flags.js +179 -234
- package/dist/cli/run-chain.d.ts +1 -0
- package/dist/cli/run-chain.js +42 -7
- package/dist/cli/usage.d.ts +1 -1
- package/dist/cli/usage.js +21 -53
- package/dist/cli/util.d.ts +2 -2
- package/dist/cli/util.js +2 -3
- package/dist/{highlights → demo/narration}/css.d.ts +1 -1
- package/dist/{highlights → demo/narration}/css.js +2 -3
- package/dist/{highlights → demo/narration}/demo-pace.d.ts +4 -12
- package/dist/{highlights → demo/narration}/demo-pace.js +5 -11
- package/dist/{highlights → demo/narration}/device.d.ts +4 -4
- package/dist/{highlights → demo/narration}/device.js +1 -1
- package/dist/demo/narration/merge.d.ts +10 -0
- package/dist/demo/narration/merge.js +67 -0
- package/dist/demo/narration/narration.d.ts +39 -0
- package/dist/{highlights/run-phase.js → demo/narration/narration.js} +25 -94
- package/dist/{highlights → demo/narration}/shorthand.d.ts +1 -1
- package/dist/demo/narration/stub-ctx.d.ts +8 -0
- package/dist/demo/narration/stub-ctx.js +164 -0
- package/dist/{highlights → demo/narration}/style.d.ts +1 -7
- package/dist/{highlights → demo/narration}/style.js +1 -41
- package/dist/{highlights → demo/narration}/todo-dock.d.ts +8 -8
- package/dist/{highlights → demo/narration}/todo-dock.js +13 -30
- package/dist/demo/overlay/auto-chrome.d.ts +7 -0
- package/dist/demo/overlay/auto-chrome.js +97 -0
- package/dist/demo/overlay/cursor.d.ts +19 -0
- package/dist/demo/overlay/cursor.js +142 -0
- package/dist/demo/overlay/device-stage.d.ts +26 -0
- package/dist/demo/overlay/device-stage.js +396 -0
- package/dist/demo/overlay/inpage/banner.d.ts +2 -0
- package/dist/demo/overlay/inpage/banner.js +160 -0
- package/dist/demo/overlay/inpage/caption.d.ts +2 -0
- package/dist/demo/overlay/inpage/caption.js +24 -0
- package/dist/demo/overlay/inpage/core.d.ts +2 -0
- package/dist/demo/overlay/inpage/core.js +345 -0
- package/dist/demo/overlay/inpage/device-chip.d.ts +1 -0
- package/dist/demo/overlay/inpage/device-chip.js +191 -0
- package/dist/demo/overlay/inpage/network.d.ts +10 -0
- package/dist/demo/overlay/inpage/network.js +189 -0
- package/dist/demo/overlay/inpage/panel-chrome.d.ts +1 -0
- package/dist/demo/overlay/inpage/panel-chrome.js +203 -0
- package/dist/demo/overlay/inpage/stamp.d.ts +1 -0
- package/dist/demo/overlay/inpage/stamp.js +46 -0
- package/dist/demo/overlay/inpage/swipe-zoom.d.ts +1 -0
- package/dist/demo/overlay/inpage/swipe-zoom.js +220 -0
- package/dist/demo/overlay/inpage/todos.d.ts +2 -0
- package/dist/demo/overlay/inpage/todos.js +293 -0
- package/dist/demo/overlay/locator-theater.d.ts +25 -0
- package/dist/demo/overlay/locator-theater.js +76 -0
- package/dist/demo/overlay/network-capture.d.ts +22 -0
- package/dist/demo/overlay/network-capture.js +127 -0
- package/dist/demo/overlay/overlay-css.d.ts +3 -0
- package/dist/demo/overlay/overlay-css.js +369 -0
- package/dist/demo/overlay/overlay-stage.d.ts +31 -0
- package/dist/demo/overlay/overlay-stage.js +106 -0
- package/dist/demo/overlay/overlay.d.ts +10 -0
- package/dist/demo/overlay/overlay.js +89 -0
- package/dist/{pilot-overlay/overlay-fixtures.d.ts → demo/overlay/phase-fixtures.d.ts} +2 -2
- package/dist/{pilot-overlay/overlay-fixtures.js → demo/overlay/phase-fixtures.js} +2 -2
- package/dist/{pilot-overlay/action-ring.js → demo/overlay/pilot/actions.js} +2 -1
- package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.d.ts +6 -5
- package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.js +19 -18
- package/dist/{pilot-overlay → demo/overlay/pilot}/shell.d.ts +2 -2
- package/dist/{pilot-overlay → demo/overlay/pilot}/shell.js +13 -22
- package/dist/demo/overlay/reattach.d.ts +7 -0
- package/dist/demo/overlay/reattach.js +23 -0
- package/dist/demo/overlay/rings.d.ts +61 -0
- package/dist/demo/overlay/rings.js +422 -0
- package/dist/{ui → demo/overlay/ui}/components/ring.js +2 -2
- package/dist/{ui → demo/overlay/ui}/overlay.css +4 -4
- package/dist/{ui → demo/overlay/ui}/shadow.d.ts +1 -1
- package/dist/{ui → demo/overlay/ui}/shadow.js +39 -2
- package/dist/demo/stepper/after.d.ts +3 -0
- package/dist/demo/stepper/after.js +103 -0
- package/dist/demo/stepper/banner-log.d.ts +35 -0
- package/dist/demo/stepper/banner-log.js +65 -0
- package/dist/demo/stepper/before.d.ts +4 -0
- package/dist/demo/stepper/before.js +110 -0
- package/dist/demo/stepper/demo-log.d.ts +48 -0
- package/dist/demo/stepper/demo-log.js +292 -0
- package/dist/demo/stepper/gate.d.ts +11 -0
- package/dist/demo/stepper/gate.js +78 -0
- package/dist/demo/stepper/interaction-patch.d.ts +4 -0
- package/dist/demo/stepper/interaction-patch.js +323 -0
- package/dist/demo/stepper/pacing.d.ts +21 -0
- package/dist/demo/stepper/pacing.js +23 -0
- package/dist/demo/stepper/panel-after.d.ts +17 -0
- package/dist/demo/stepper/panel-after.js +166 -0
- package/dist/demo/stepper/panel-before.d.ts +12 -0
- package/dist/demo/stepper/panel-before.js +241 -0
- package/dist/demo/stepper/slides.d.ts +23 -0
- package/dist/demo/stepper/slides.js +233 -0
- package/dist/demo/stepper/step-panels.d.ts +69 -0
- package/dist/demo/stepper/step-panels.js +172 -0
- package/dist/demo/stepper/stepper.d.ts +24 -0
- package/dist/demo/stepper/stepper.js +122 -0
- package/dist/demo/stepper/teardown.d.ts +47 -0
- package/dist/demo/stepper/teardown.js +178 -0
- package/dist/demo/stepper/todo-advance.d.ts +15 -0
- package/dist/demo/stepper/todo-advance.js +110 -0
- package/dist/demo/stepper/view.d.ts +58 -0
- package/dist/demo/stepper/view.js +31 -0
- package/dist/demo/types.d.ts +85 -0
- package/dist/demo/verbose-log.js +15 -0
- package/dist/engine/block/action-page.d.ts +53 -0
- package/dist/engine/block/action-page.js +1 -0
- package/dist/{types.d.ts → engine/block/block.d.ts} +102 -142
- package/dist/{core → engine/block}/block.js +12 -130
- package/dist/engine/block/branch.d.ts +17 -0
- package/dist/engine/block/branch.js +40 -0
- package/dist/{core → engine/block}/compose.d.ts +9 -7
- package/dist/{core → engine/block}/compose.js +1 -1
- package/dist/engine/block/dialog.d.ts +13 -0
- package/dist/engine/block/dialog.js +37 -0
- package/dist/{core/blocks → engine/block/kinds}/api.d.ts +16 -12
- package/dist/{core/blocks → engine/block/kinds}/api.js +26 -18
- package/dist/{core/blocks → engine/block/kinds}/effect.d.ts +13 -18
- package/dist/engine/block/kinds/effect.js +17 -0
- package/dist/{core/blocks → engine/block/kinds}/method.d.ts +17 -29
- package/dist/{core/blocks → engine/block/kinds}/method.js +6 -21
- package/dist/{core/blocks → engine/block/kinds}/nav.d.ts +21 -31
- package/dist/{core/blocks → engine/block/kinds}/nav.js +6 -12
- package/dist/{core/blocks → engine/block/kinds}/page.d.ts +14 -20
- package/dist/{core/blocks → engine/block/kinds}/page.js +5 -7
- package/dist/engine/checkpoint/checkpoint.d.ts +22 -0
- package/dist/engine/checkpoint/checkpoint.js +8 -0
- package/dist/engine/checkpoint/route.d.ts +28 -0
- package/dist/engine/checkpoint/route.js +28 -0
- package/dist/{core → engine}/config.d.ts +7 -2
- package/dist/engine/config.js +6 -0
- package/dist/engine/engine.d.ts +45 -0
- package/dist/{core → engine}/engine.js +6 -10
- package/dist/engine/env.d.ts +59 -0
- package/dist/engine/env.js +83 -0
- package/dist/{errors.d.ts → engine/errors.d.ts} +22 -22
- package/dist/{errors.js → engine/errors.js} +22 -22
- package/dist/{core → engine/flow}/branch-regression.d.ts +7 -7
- package/dist/{core → engine/flow}/branch-regression.js +4 -3
- package/dist/engine/flow/flow.d.ts +162 -0
- package/dist/engine/flow/flow.js +244 -0
- package/dist/engine/flow/map-branch.d.ts +9 -0
- package/dist/engine/flow/map-branch.js +57 -0
- package/dist/{core → engine/flow}/map-builder.d.ts +34 -54
- package/dist/engine/flow/map-builder.js +242 -0
- package/dist/engine/flow/map-steps.d.ts +30 -0
- package/dist/engine/flow/map-steps.js +87 -0
- package/dist/{core → engine}/locate.d.ts +1 -1
- package/dist/{core → engine}/locate.js +1 -2
- package/dist/{mem-stub.d.ts → engine/mem/mem-stub.d.ts} +9 -8
- package/dist/{mem-stub.js → engine/mem/mem-stub.js} +2 -2
- package/dist/{mem-page.d.ts → engine/mem/mem.d.ts} +1 -1
- package/dist/{mem-page.js → engine/mem/mem.js} +2 -1
- package/dist/engine/page-gone.d.ts +5 -0
- package/dist/engine/page-gone.js +20 -0
- package/dist/engine/run/connect.d.ts +28 -0
- package/dist/{types.js → engine/run/connect.js} +11 -10
- package/dist/engine/run/events.d.ts +67 -0
- package/dist/engine/run/events.js +90 -0
- package/dist/engine/run/hooks.d.ts +16 -0
- package/dist/engine/run/hooks.js +8 -0
- package/dist/engine/run/launch.d.ts +13 -0
- package/dist/engine/run/launch.js +27 -0
- package/dist/{core/run-graph.d.ts → engine/run/run.d.ts} +8 -12
- package/dist/{core/run-graph.js → engine/run/run.js} +22 -12
- package/dist/engine/stub/pace.d.ts +12 -0
- package/dist/engine/stub/pace.js +2 -0
- package/dist/engine/stub/ring.d.ts +130 -0
- package/dist/engine/stub/ring.js +41 -0
- package/dist/engine/stub/stub.d.ts +268 -0
- package/dist/engine/stub/stub.js +1 -0
- package/dist/engine/stub/todos.d.ts +104 -0
- package/dist/engine/stub/todos.js +2 -0
- package/dist/engine/stub/viewport.d.ts +26 -0
- package/dist/engine/stub/viewport.js +2 -0
- package/dist/{trait.d.ts → engine/trait/trait.d.ts} +1 -1
- package/dist/{trait.js → engine/trait/trait.js} +1 -1
- package/dist/index.d.ts +88 -36
- package/dist/index.js +46 -19
- package/dist/live/auto/auto.d.ts +22 -0
- package/dist/live/auto/auto.js +207 -0
- package/dist/{session/auto-explore.d.ts → live/auto/explore.d.ts} +4 -14
- package/dist/{session/auto-explore.js → live/auto/explore.js} +21 -127
- package/dist/live/auto/mem.d.ts +11 -0
- package/dist/live/auto/mem.js +85 -0
- package/dist/live/auto/menu.d.ts +30 -0
- package/dist/live/auto/menu.js +335 -0
- package/dist/live/auto-session/auto-session.d.ts +113 -0
- package/dist/live/auto-session/auto-session.js +452 -0
- package/dist/live/auto-session/console.d.ts +4 -0
- package/dist/live/auto-session/console.js +41 -0
- package/dist/live/auto-session/files.d.ts +44 -0
- package/dist/live/auto-session/files.js +145 -0
- package/dist/{auto-session → live/auto-session}/helpers.d.ts +9 -5
- package/dist/{auto-session → live/auto-session}/helpers.js +18 -1
- package/dist/live/auto-session/inspect.d.ts +4 -0
- package/dist/live/auto-session/inspect.js +75 -0
- package/dist/{session/auto-session-ipc.d.ts → live/auto-session/ipc.d.ts} +8 -25
- package/dist/{session/auto-session-ipc.js → live/auto-session/ipc.js} +36 -161
- package/dist/live/auto-session/open-browser.d.ts +6 -0
- package/dist/live/auto-session/open-browser.js +47 -0
- package/dist/{session/browser.d.ts → live/auto-session/start.d.ts} +1 -2
- package/dist/{session/browser.js → live/auto-session/start.js} +2 -3
- package/dist/{pilot-overlay → live/pilot}/panel.d.ts +1 -1
- package/dist/{pilot-overlay → live/pilot}/panel.js +23 -31
- package/dist/{session → live/pilot}/pilot.d.ts +3 -3
- package/dist/{session → live/pilot}/pilot.js +5 -4
- package/dist/{traverse/run.d.ts → live/traverse/traverse.d.ts} +1 -1
- package/dist/live/traverse/traverse.js +212 -0
- package/dist/live/traverse/worker.d.ts +37 -0
- package/dist/live/traverse/worker.js +200 -0
- package/dist/manifest/manifest.d.ts +52 -0
- package/dist/manifest/manifest.js +93 -0
- package/dist/manifest/map-imports.d.ts +7 -0
- package/dist/manifest/map-imports.js +22 -0
- package/dist/manifest/maps.d.ts +33 -0
- package/dist/manifest/maps.js +62 -0
- package/dist/manifest/pack.d.ts +21 -0
- package/dist/manifest/pack.js +109 -0
- package/dist/manifest/project.d.ts +60 -0
- package/dist/manifest/project.js +101 -0
- package/dist/{session/block-inject.js → manifest/roots.js} +1 -18
- package/dist/manifest/scan.d.ts +19 -0
- package/dist/manifest/scan.js +57 -0
- package/dist/manifest/source.d.ts +23 -0
- package/dist/manifest/source.js +86 -0
- package/dist/runner/mode.d.ts +71 -0
- package/dist/runner/mode.js +1 -0
- package/dist/runner/modes/branches.d.ts +5 -0
- package/dist/runner/modes/branches.js +37 -0
- package/dist/runner/modes/demo.d.ts +3 -0
- package/dist/runner/modes/demo.js +13 -0
- package/dist/runner/modes/report.d.ts +2 -0
- package/dist/runner/modes/report.js +54 -0
- package/dist/runner/modes/run.d.ts +2 -0
- package/dist/runner/modes/run.js +3 -0
- package/dist/runner/options.d.ts +31 -0
- package/dist/runner/options.js +42 -0
- package/dist/runner/plan/find.d.ts +18 -0
- package/dist/runner/plan/find.js +65 -0
- package/dist/runner/plan/plan.d.ts +11 -0
- package/dist/runner/plan/plan.js +97 -0
- package/dist/runner/plan/seed-mem.d.ts +12 -0
- package/dist/runner/plan/seed-mem.js +98 -0
- package/dist/runner/plan/spec.d.ts +5 -0
- package/dist/runner/plan/spec.js +17 -0
- package/dist/runner/play-steps.d.ts +2 -0
- package/dist/runner/play-steps.js +59 -0
- package/dist/runner/runner.d.ts +4 -0
- package/dist/runner/runner.js +64 -0
- package/dist/runner/session.d.ts +9 -0
- package/dist/runner/session.js +87 -0
- package/dist/{browser.js → runtime/browser.js} +4 -2
- package/dist/{env-file.js → runtime/env-file.js} +7 -12
- package/dist/{extensions.d.ts → runtime/extensions.d.ts} +1 -5
- package/dist/{extensions.js → runtime/extensions.js} +2 -1
- package/dist/runtime/full-launch.d.ts +1 -0
- package/dist/runtime/full-launch.js +34 -0
- package/dist/runtime/global-flag.d.ts +5 -0
- package/dist/runtime/global-flag.js +18 -0
- package/dist/{playwright-config.d.ts → runtime/playwright-config.d.ts} +1 -1
- package/dist/{playwright.config.js → runtime/playwright.config.js} +3 -2
- package/dist/runtime/run-log.d.ts +2 -0
- package/dist/runtime/run-log.js +17 -0
- package/dist/{video-dir.js → runtime/video-dir.js} +3 -2
- package/dist/{config.d.ts → runtime/waygraph-config.d.ts} +6 -9
- package/dist/{config.js → runtime/waygraph-config.js} +21 -51
- package/dist/{webserver.js → runtime/webserver.js} +5 -30
- package/examples/routed-demo/config/waygraph.config.ts +20 -0
- package/examples/routed-demo/package.json +1 -4
- package/examples/routed-demo/scripts/fixture-server.mjs +1 -1
- package/examples/routed-demo/src/flows/routed-demo-map.flow.ts +2 -4
- package/examples/routed-demo/src/flows/routed-demo.flow.ts +1 -2
- package/examples/routed-demo/src/map/(app_base)/dashboard/_methods/click-widget.block.ts +5 -4
- package/examples/routed-demo/src/map/(app_base)/dashboard/_nav.block.ts +3 -3
- package/examples/routed-demo/src/map/(app_base)/dashboard/_page.block.ts +3 -3
- package/examples/routed-demo/src/map/(external)/docs/_nav.block.ts +3 -3
- package/examples/routed-demo/src/map/(external)/docs/_page.block.ts +3 -3
- package/examples/routed-demo/src/states/routed-demo.states.ts +5 -3
- package/examples/routed-demo/tests/routed-demo.spec.ts +4 -4
- package/examples/routed-demo/tsconfig.json +1 -1
- package/examples/saucedemo/docs/CONVENTION.md +4 -5
- package/examples/saucedemo/docs/HELPERS.md +11 -11
- package/examples/saucedemo/src/blocks/SITE-MAP.md +0 -1
- package/examples/saucedemo/src/blocks/saucedemo-web/NAV.md +1 -5
- package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +5 -8
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +35 -43
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +4 -5
- package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
- package/examples/saucedemo/src/flows/api-demo.flow.ts +12 -10
- package/examples/saucedemo/src/states/checkout.states.ts +21 -11
- package/examples/saucedemo/src/stubs/device-showcase.ts +8 -10
- package/examples/saucedemo/tests/auto-graph.spec.ts +4 -12
- package/package.json +14 -6
- package/templates/agents/waygraph-planner.agent.md +2 -2
- package/templates/quickstart/docs/CONVENTION.md +4 -4
- package/templates/quickstart/docs/HELPERS.md +10 -8
- package/templates/quickstart/package.json +0 -3
- package/templates/quickstart/src/blocks/SITE-MAP.md +0 -1
- package/templates/quickstart/src/blocks/saucedemo-web/NAV.md +1 -5
- package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +5 -8
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +35 -43
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +4 -5
- package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
- package/templates/quickstart/src/flows/api-demo.flow.ts +12 -10
- package/templates/quickstart/src/states/checkout.states.ts +21 -11
- package/templates/quickstart/src/stubs/device-showcase.ts +8 -10
- package/templates/scaffold/README.md +2 -1
- package/templates/scaffold/STRUCTURE.md +5 -4
- package/templates/scaffold/config/waygraph.config.ts +1 -0
- package/templates/scaffold/gitignore +1 -0
- package/templates/scaffold/src/flows/README.md +2 -2
- package/templates/scaffold/src/map/(app_base)/docs/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/docs/_page.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/_methods/add-item.effect.block.ts +4 -4
- package/templates/scaffold/src/map/(app_base)/home/_methods/assert-hello.method.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/_methods/assert-item-added.method.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/_methods/clear-cart.method.block.ts +5 -4
- package/templates/scaffold/src/map/(app_base)/home/_methods/remove-item.effect.block.ts +4 -4
- package/templates/scaffold/src/map/(app_base)/home/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/_page.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/nav-verification-link.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_keys.ts +21 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-body.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-header.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-status.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/pick-extension-interceptor.method.block.ts +5 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-body.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-headers.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/send-request.method.block.ts +5 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-bearer-token.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-headers.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-json-body.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-method.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-query-params.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-url.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/hoppscotch/_page.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/hoppscotch/_states.ts +6 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/settings/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/mailpit/_keys.ts +13 -0
- package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-content.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-received.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/mailpit/_methods/extract-email-link.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/mailpit/_methods/open-message.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/mailpit/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/mailpit/_page.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/mailpit/_states.ts +9 -0
- package/templates/scaffold/src/map/README.md +7 -0
- package/templates/scaffold/src/states/README.md +4 -1
- package/templates/scaffold/src/states/demo.mem-keys.ts +1 -29
- package/templates/scaffold/src/states/demo.states.ts +14 -20
- package/templates/scaffold/tests/hoppscotch.spec.ts +1 -11
- package/templates/scaffold/tests/mail-verify.spec.ts +2 -2
- package/templates/skills/waygraph-blind-pilot.skill.md +2 -6
- package/templates/skills/waygraph-convention.skill.md +23 -14
- package/templates/skills/waygraph-pilot.skill.md +7 -4
- package/dist/auto-session/session.d.ts +0 -193
- package/dist/auto-session/session.js +0 -719
- package/dist/auto-session/verbose-log.js +0 -16
- package/dist/auto-session.d.ts +0 -2
- package/dist/auto-session.js +0 -3
- package/dist/cli/discover.d.ts +0 -40
- package/dist/cli/discover.js +0 -148
- package/dist/commands/agent-dive.js +0 -52
- package/dist/commands/check.js +0 -192
- package/dist/commands/map.js +0 -29
- package/dist/commands/run.js +0 -104
- package/dist/commands/session.js +0 -600
- package/dist/commands/traverse.js +0 -177
- package/dist/core/block.d.ts +0 -109
- package/dist/core/blocks/effect.js +0 -23
- package/dist/core/config.js +0 -17
- package/dist/core/engine.d.ts +0 -198
- package/dist/core/flow.d.ts +0 -294
- package/dist/core/flow.js +0 -432
- package/dist/core/map-builder.js +0 -383
- package/dist/core.d.ts +0 -14
- package/dist/core.js +0 -15
- package/dist/highlights/merge.d.ts +0 -8
- package/dist/highlights/merge.js +0 -173
- package/dist/highlights/run-phase.d.ts +0 -43
- package/dist/highlights/stub-ctx.d.ts +0 -10
- package/dist/highlights/stub-ctx.js +0 -331
- package/dist/highlights/types.d.ts +0 -613
- package/dist/highlights.d.ts +0 -9
- package/dist/highlights.js +0 -10
- package/dist/pilot-overlay.d.ts +0 -5
- package/dist/pilot-overlay.js +0 -6
- package/dist/runner/banner-log.js +0 -63
- package/dist/runner/chain-run.js +0 -102
- package/dist/runner/cursor.js +0 -140
- package/dist/runner/demo-log.js +0 -316
- package/dist/runner/device-stage.d.ts +0 -9
- package/dist/runner/device-stage.js +0 -420
- package/dist/runner/discovery.js +0 -105
- package/dist/runner/index.js +0 -2
- package/dist/runner/inpage/banner.d.ts +0 -21
- package/dist/runner/inpage/banner.js +0 -156
- package/dist/runner/inpage/caption.d.ts +0 -3
- package/dist/runner/inpage/caption.js +0 -23
- package/dist/runner/inpage/core.d.ts +0 -4
- package/dist/runner/inpage/core.js +0 -316
- package/dist/runner/inpage/device.d.ts +0 -3
- package/dist/runner/inpage/device.js +0 -211
- package/dist/runner/inpage/network.d.ts +0 -15
- package/dist/runner/inpage/network.js +0 -217
- package/dist/runner/inpage/panel-chrome.js +0 -192
- package/dist/runner/inpage/stamp.js +0 -46
- package/dist/runner/inpage/swipe-zoom.js +0 -220
- package/dist/runner/inpage/todos.js +0 -337
- package/dist/runner/interaction-patch.js +0 -384
- package/dist/runner/main.js +0 -469
- package/dist/runner/network-capture.d.ts +0 -9
- package/dist/runner/network-capture.js +0 -126
- package/dist/runner/overlay-css.d.ts +0 -3
- package/dist/runner/overlay-css.js +0 -377
- package/dist/runner/overlay-install.js +0 -90
- package/dist/runner/overlay-stage.js +0 -110
- package/dist/runner/rings.js +0 -514
- package/dist/runner/seed-mem.js +0 -110
- package/dist/runner/slides.js +0 -278
- package/dist/runner/step-mode.js +0 -703
- package/dist/runner/step-panels.js +0 -729
- package/dist/runner/teardown.js +0 -202
- package/dist/runner/todo-dock.js +0 -142
- package/dist/session/auto-explore-run.d.ts +0 -40
- package/dist/session/auto-explore-run.js +0 -707
- package/dist/session/step-overlay.d.ts +0 -37
- package/dist/session/step-overlay.js +0 -244
- package/dist/traverse/run.js +0 -423
- package/examples/routed-demo/playwright.config.ts +0 -21
- package/examples/saucedemo/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
- package/templates/quickstart/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
- /package/dist/{commands → cli/commands}/agent-dive-scaffold.d.ts +0 -0
- /package/dist/{commands → cli/commands}/agent-dive.d.ts +0 -0
- /package/dist/{commands → cli/commands}/extensions.d.ts +0 -0
- /package/dist/{commands → cli/commands}/init.d.ts +0 -0
- /package/dist/{commands → cli/commands}/list.d.ts +0 -0
- /package/dist/{commands → cli/commands}/map.d.ts +0 -0
- /package/dist/{commands → cli/commands}/session.d.ts +0 -0
- /package/dist/{commands → cli/commands}/test.d.ts +0 -0
- /package/dist/{commands → cli/commands}/traverse.d.ts +0 -0
- /package/dist/{commands → cli/commands}/try.d.ts +0 -0
- /package/dist/{commands → cli/commands}/upgrade.d.ts +0 -0
- /package/dist/{highlights → demo/narration}/shorthand.js +0 -0
- /package/dist/{session/overlay-beacon.d.ts → demo/overlay/beacon.d.ts} +0 -0
- /package/dist/{session/overlay-beacon.js → demo/overlay/beacon.js} +0 -0
- /package/dist/{pilot-overlay/action-ring.d.ts → demo/overlay/pilot/actions.d.ts} +0 -0
- /package/dist/{ui → demo/overlay/ui}/components/ring.d.ts +0 -0
- /package/dist/{ui → demo/overlay/ui}/stylesheet.d.ts +0 -0
- /package/dist/{ui → demo/overlay/ui}/stylesheet.js +0 -0
- /package/dist/{ui → demo/overlay/ui}/tokens.d.ts +0 -0
- /package/dist/{ui → demo/overlay/ui}/tokens.js +0 -0
- /package/dist/{highlights → demo}/types.js +0 -0
- /package/dist/{auto-session → demo}/verbose-log.d.ts +0 -0
- /package/dist/{selector.d.ts → engine/trait/selector.d.ts} +0 -0
- /package/dist/{selector.js → engine/trait/selector.js} +0 -0
- /package/dist/{traverse → live/traverse}/coverage.d.ts +0 -0
- /package/dist/{traverse → live/traverse}/coverage.js +0 -0
- /package/dist/{traverse → live/traverse}/lease.d.ts +0 -0
- /package/dist/{traverse → live/traverse}/lease.js +0 -0
- /package/dist/{session/block-inject.d.ts → manifest/roots.d.ts} +0 -0
- /package/dist/{blocks-select.d.ts → manifest/select.d.ts} +0 -0
- /package/dist/{blocks-select.js → manifest/select.js} +0 -0
- /package/dist/{browser.d.ts → runtime/browser.d.ts} +0 -0
- /package/dist/{env-file.d.ts → runtime/env-file.d.ts} +0 -0
- /package/dist/{playwright-config.js → runtime/playwright-config.js} +0 -0
- /package/dist/{playwright.config.d.ts → runtime/playwright.config.d.ts} +0 -0
- /package/dist/{video-dir.d.ts → runtime/video-dir.d.ts} +0 -0
- /package/dist/{webserver.d.ts → runtime/webserver.d.ts} +0 -0
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
import { installOverlay } from "../overlay/overlay.js";
|
|
2
|
+
import { applyHighlightZoom, captionForLocator, dwellMatchedStub, ensureLocatorInView, hideRing, matchStubIndexForLocator, showRing, wasJustNarrated } from "../overlay/rings.js";
|
|
3
|
+
import { syncTodoDockAdvance } from "./todo-advance.js";
|
|
4
|
+
import { clickPulseAt, moveCursorTo } from "../overlay/cursor.js";
|
|
5
|
+
import { demoHighlight } from "./demo-log.js";
|
|
6
|
+
import { repaintOverlay } from "../overlay/reattach.js";
|
|
7
|
+
import { setLocatorTheater } from "../overlay/locator-theater.js";
|
|
8
|
+
import { envNumber } from "../../engine/env.js";
|
|
9
|
+
import { ignorePageGone, ignoreTimeout } from "../../engine/page-gone.js";
|
|
10
|
+
export function instrumentInteractionHighlighting(page, mem, slowMo, pacing, stubBeforeRef, todoDockRef, deviceRef) {
|
|
11
|
+
// Playwright's own slowMo ALREADY pauses after every single low-level
|
|
12
|
+
// action it dispatches - and pressSequentially() fires one such action
|
|
13
|
+
// PER CHARACTER. Also giving pressSequentially its own fixed delay
|
|
14
|
+
// double-paces every keystroke (45ms + slowMo's own ~350ms, per
|
|
15
|
+
// character) - an ordinary 22-character email alone stretched past 8
|
|
16
|
+
// seconds. When slowMo is already doing the pacing, add none of our own;
|
|
17
|
+
// only fall back to a small typing delay when slowMo is off entirely.
|
|
18
|
+
//
|
|
19
|
+
// pacing.skipTheater (WAYGRAPH_FAST_BLOCKS **or** FFCompose): near-zero
|
|
20
|
+
// cursor / pop / typing - blitz this step. --fast alone sets gatesFast only
|
|
21
|
+
// (shorter Next/autoplay gates) and must NOT skip theater, or the whole demo
|
|
22
|
+
// looks like plain waygraph run.
|
|
23
|
+
const skipTheater = () => !!pacing.skipTheater;
|
|
24
|
+
// `slowMo` here is the demo's own beat: ms to rest after each action (once per call, never per keystroke). The browser
|
|
25
|
+
// itself is launched with slowMo 0 in step mode, so a step whose pace is blitz really does run at full speed.
|
|
26
|
+
const beat = () => (skipTheater() ? 0 : slowMo || 0);
|
|
27
|
+
const pause = (ms) => (ms > 0 ? new Promise((res) => setTimeout(res, ms)) : undefined);
|
|
28
|
+
// Per-character typing delay (WAYGRAPH_TYPING_MS, default 30). 0 for blitz steps.
|
|
29
|
+
const typingMs = () => {
|
|
30
|
+
if (skipTheater())
|
|
31
|
+
return 0;
|
|
32
|
+
const n = envNumber("WAYGRAPH_TYPING_MS");
|
|
33
|
+
return n !== undefined && n >= 0 ? n : 30;
|
|
34
|
+
};
|
|
35
|
+
const typeDelay = typingMs;
|
|
36
|
+
const keyboard = page.keyboard;
|
|
37
|
+
if (!keyboard.__wgBeatPatched) {
|
|
38
|
+
keyboard.__wgBeatPatched = true;
|
|
39
|
+
const originalType = keyboard.type.bind(keyboard);
|
|
40
|
+
keyboard.type = async (text, options) => {
|
|
41
|
+
await originalType(text, { delay: typingMs(), ...(options || {}) });
|
|
42
|
+
await pause(beat());
|
|
43
|
+
};
|
|
44
|
+
const originalPress = keyboard.press.bind(keyboard);
|
|
45
|
+
keyboard.press = async (key, options) => {
|
|
46
|
+
await originalPress(key, options);
|
|
47
|
+
await pause(beat());
|
|
48
|
+
};
|
|
49
|
+
const originalInsertText = keyboard.insertText.bind(keyboard);
|
|
50
|
+
keyboard.insertText = async (text) => {
|
|
51
|
+
await originalInsertText(text);
|
|
52
|
+
await pause(beat());
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
// Click is a single action, not per-character, so it doesn't compound
|
|
56
|
+
// the same way - but slowMo still adds its own pause around the actual
|
|
57
|
+
// click, so trim our own explicit "pop" pauses when it's already active
|
|
58
|
+
// rather than stacking a full 1.2s on top of that.
|
|
59
|
+
const clickPrePop = () => (skipTheater() ? 0 : slowMo ? 300 : 700);
|
|
60
|
+
const clickPostPop = () => (skipTheater() ? 0 : slowMo ? 200 : 500);
|
|
61
|
+
// FF / FAST_BLOCKS: no cursor travel animation (0). Plain theater keeps full.
|
|
62
|
+
const cursorMs = (full) => (skipTheater() ? 0 : full);
|
|
63
|
+
// Locator.fill()/click() only ever see a raw call, no context of where
|
|
64
|
+
// the value came from. Patching mem.get() to remember the most recently
|
|
65
|
+
// read key's name (Blocks read-then-immediately-fill, e.g. const { email
|
|
66
|
+
// } = mem.get(LoginInput.key); ...fill(email)) lets the fill patch below
|
|
67
|
+
// label the ring with the real key, not a generic "writing from mem".
|
|
68
|
+
// Patches this ONE mem instance only, not MemPage's shared prototype -
|
|
69
|
+
// there's exactly one mem per chain run.
|
|
70
|
+
const memTrack = { lastKeyName: null, at: 0 };
|
|
71
|
+
const originalGet = mem.get.bind(mem);
|
|
72
|
+
mem.get = (key) => {
|
|
73
|
+
memTrack.lastKeyName = key.name;
|
|
74
|
+
memTrack.at = Date.now();
|
|
75
|
+
return originalGet(key);
|
|
76
|
+
};
|
|
77
|
+
const WAIT_CAP_FLOOR_MS = 700;
|
|
78
|
+
const WAIT_CAP_FRACTION = 0.3;
|
|
79
|
+
const scaledWaitCap = (declared) => Math.min(declared, Math.max(WAIT_CAP_FLOOR_MS, declared * WAIT_CAP_FRACTION));
|
|
80
|
+
setLocatorTheater(page, {
|
|
81
|
+
async beforeFill(locator, options) {
|
|
82
|
+
await installOverlay(page);
|
|
83
|
+
await locator.waitFor({
|
|
84
|
+
state: "visible",
|
|
85
|
+
timeout: (options && options.timeout) || 30000,
|
|
86
|
+
}).catch(ignoreTimeout);
|
|
87
|
+
// Smooth scroll before measuring - otherwise off-screen fields
|
|
88
|
+
// teleport when Playwright's fill actionability scrolls.
|
|
89
|
+
await ensureLocatorInView(locator, { instant: skipTheater() });
|
|
90
|
+
const box = await locator.boundingBox();
|
|
91
|
+
let typeLabel = "input";
|
|
92
|
+
try {
|
|
93
|
+
const meta = await locator.evaluate((el) => {
|
|
94
|
+
const id = (el.id || "").toLowerCase();
|
|
95
|
+
const name = (el.getAttribute("name") || "").toLowerCase();
|
|
96
|
+
const ph = (el.getAttribute("placeholder") || "").toLowerCase();
|
|
97
|
+
const ty = (el.getAttribute("type") || "text").toLowerCase();
|
|
98
|
+
if (ty === "password" || /pass/.test(id + name + ph))
|
|
99
|
+
return "password";
|
|
100
|
+
if (/user|email|login/.test(id + name + ph))
|
|
101
|
+
return "username";
|
|
102
|
+
if (ty && ty !== "text")
|
|
103
|
+
return ty;
|
|
104
|
+
return id || name || ph || "input";
|
|
105
|
+
});
|
|
106
|
+
if (meta)
|
|
107
|
+
typeLabel = String(meta);
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
/* ignore */
|
|
111
|
+
}
|
|
112
|
+
if (box && !(await wasJustNarrated(page))) {
|
|
113
|
+
// Only trust the "last mem.get()" as THIS fill's source if it
|
|
114
|
+
// happened recently - a stale read from several actions ago is
|
|
115
|
+
// more likely unrelated than actually describing this field.
|
|
116
|
+
const fallback = memTrack.lastKeyName && Date.now() - memTrack.at < 3000
|
|
117
|
+
? "from mem: " + memTrack.lastKeyName
|
|
118
|
+
: "writing from mem";
|
|
119
|
+
const stubs = (stubBeforeRef && stubBeforeRef.current) || [];
|
|
120
|
+
const cap = await captionForLocator(page, locator, stubs, fallback);
|
|
121
|
+
const stubIdx = await matchStubIndexForLocator(page, locator, stubs);
|
|
122
|
+
const stub = stubIdx >= 0 ? stubs[stubIdx] : null;
|
|
123
|
+
await syncTodoDockAdvance(page, todoDockRef, stubIdx, stub);
|
|
124
|
+
await moveCursorTo(page, box, cursorMs(500));
|
|
125
|
+
if (stub) {
|
|
126
|
+
await applyHighlightZoom(page, stub.selector, stub.zoom, stub.zoomOut);
|
|
127
|
+
}
|
|
128
|
+
demoHighlight({
|
|
129
|
+
selector: stub?.selector,
|
|
130
|
+
label: cap.label,
|
|
131
|
+
tone: cap.tone || (stub?.tone) || "planned",
|
|
132
|
+
color: stub?.color,
|
|
133
|
+
focus: !!(stub?.focus),
|
|
134
|
+
zoom: stub?.zoom,
|
|
135
|
+
zoomOut: stub?.zoomOut,
|
|
136
|
+
gesture: stub?.gesture,
|
|
137
|
+
weight: cap.weight,
|
|
138
|
+
size: cap.size,
|
|
139
|
+
}, "fill");
|
|
140
|
+
await showRing(page, box, cap.label, cap.tone, {
|
|
141
|
+
size: cap.size,
|
|
142
|
+
weight: cap.weight,
|
|
143
|
+
selector: stub?.selector,
|
|
144
|
+
focus: !!(stub?.focus),
|
|
145
|
+
});
|
|
146
|
+
await dwellMatchedStub(page, locator, stubs, pacing);
|
|
147
|
+
await new Promise((res) => setTimeout(res, skipTheater() ? 0 : 200));
|
|
148
|
+
if (cap && cap.label)
|
|
149
|
+
typeLabel = String(cap.label).slice(0, 40);
|
|
150
|
+
}
|
|
151
|
+
else if (box) {
|
|
152
|
+
// Ring/caption already handled by narrate() - still move the
|
|
153
|
+
// cursor there, just skip re-showing the ring with a generic label.
|
|
154
|
+
await moveCursorTo(page, box, cursorMs(200));
|
|
155
|
+
}
|
|
156
|
+
await page
|
|
157
|
+
.evaluate((label) => {
|
|
158
|
+
if (window.__wgSetTypingBadge)
|
|
159
|
+
window.__wgSetTypingBadge(true, label);
|
|
160
|
+
}, typeLabel)
|
|
161
|
+
.catch(ignorePageGone);
|
|
162
|
+
},
|
|
163
|
+
typingDelay: typeDelay,
|
|
164
|
+
async afterFill() {
|
|
165
|
+
await page
|
|
166
|
+
.evaluate(() => {
|
|
167
|
+
if (window.__wgSetTypingBadge)
|
|
168
|
+
window.__wgSetTypingBadge(false);
|
|
169
|
+
})
|
|
170
|
+
.catch(ignorePageGone);
|
|
171
|
+
// Fade the ring back out once this field is actually done, instead
|
|
172
|
+
// of leaving it lit until the next Block's own before-panel clears
|
|
173
|
+
// it - it was sticking around through the whole rest of the step.
|
|
174
|
+
await hideRing(page);
|
|
175
|
+
await repaintOverlay(page);
|
|
176
|
+
await pause(beat());
|
|
177
|
+
},
|
|
178
|
+
async beforeClick(locator, options) {
|
|
179
|
+
let clickPoint = null;
|
|
180
|
+
let clickTone = "auto";
|
|
181
|
+
await installOverlay(page);
|
|
182
|
+
// Wait until the target is visible BEFORE measuring - otherwise
|
|
183
|
+
// defineNavBlock({ click }) (and any slow-to-appear control) skips
|
|
184
|
+
// the cursor entirely: boundingBox was null, then originalClick
|
|
185
|
+
// waited and clicked with no demo animation.
|
|
186
|
+
await locator.waitFor({
|
|
187
|
+
state: "visible",
|
|
188
|
+
timeout: (options && options.timeout) || 30000,
|
|
189
|
+
}).catch(ignoreTimeout);
|
|
190
|
+
// Smooth-scroll off-screen targets before cursor/ring. Playwright's
|
|
191
|
+
// own click scroll is instant and reads as a teleport under --fast.
|
|
192
|
+
await ensureLocatorInView(locator, { instant: skipTheater() });
|
|
193
|
+
const box = await locator.boundingBox();
|
|
194
|
+
const narrated = box ? await wasJustNarrated(page) : false;
|
|
195
|
+
if (box && !narrated) {
|
|
196
|
+
let fallback = "click";
|
|
197
|
+
try {
|
|
198
|
+
const text = (await locator.textContent())?.trim();
|
|
199
|
+
if (text && text.length > 0 && text.length <= 30)
|
|
200
|
+
fallback = text;
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
// element has no simple text (an icon button, say) - generic label is fine
|
|
204
|
+
}
|
|
205
|
+
// Prefer "nav: …" when this locator is a NavBlock click target
|
|
206
|
+
// (set on page by runStepMode just before act).
|
|
207
|
+
const navLabel = await page.evaluate(() => window.__wgPendingNavClickLabel || null).catch(ignorePageGone);
|
|
208
|
+
if (navLabel)
|
|
209
|
+
fallback = String(navLabel);
|
|
210
|
+
const stubs = (stubBeforeRef && stubBeforeRef.current) || [];
|
|
211
|
+
const cap = await captionForLocator(page, locator, stubs, fallback);
|
|
212
|
+
const stubIdx = await matchStubIndexForLocator(page, locator, stubs);
|
|
213
|
+
const stub = stubIdx >= 0 ? stubs[stubIdx] : null;
|
|
214
|
+
await syncTodoDockAdvance(page, todoDockRef, stubIdx, stub);
|
|
215
|
+
clickTone = cap.tone;
|
|
216
|
+
clickPoint = await moveCursorTo(page, box, cursorMs(600));
|
|
217
|
+
if (stub) {
|
|
218
|
+
await applyHighlightZoom(page, stub.selector, stub.zoom, stub.zoomOut);
|
|
219
|
+
}
|
|
220
|
+
demoHighlight({
|
|
221
|
+
selector: stub?.selector,
|
|
222
|
+
label: cap.label,
|
|
223
|
+
tone: cap.tone || (stub?.tone) || "planned",
|
|
224
|
+
color: stub?.color,
|
|
225
|
+
focus: !!(stub?.focus),
|
|
226
|
+
zoom: stub?.zoom,
|
|
227
|
+
zoomOut: stub?.zoomOut,
|
|
228
|
+
gesture: stub?.gesture,
|
|
229
|
+
weight: cap.weight,
|
|
230
|
+
size: cap.size,
|
|
231
|
+
}, "click");
|
|
232
|
+
await showRing(page, box, cap.label, cap.tone, {
|
|
233
|
+
size: cap.size,
|
|
234
|
+
weight: cap.weight,
|
|
235
|
+
selector: stub?.selector,
|
|
236
|
+
focus: !!(stub?.focus),
|
|
237
|
+
});
|
|
238
|
+
await dwellMatchedStub(page, locator, stubs, pacing);
|
|
239
|
+
// "pop for a few seconds" - the user's own phrase, matching the
|
|
240
|
+
// zsign demo-engine's ring-before-click pattern in
|
|
241
|
+
// services/help-center-clip-engine's video-pipeline.
|
|
242
|
+
await new Promise((res) => setTimeout(res, clickPrePop()));
|
|
243
|
+
}
|
|
244
|
+
else if (box) {
|
|
245
|
+
// Ring/caption already handled by narrate() - still move the
|
|
246
|
+
// cursor + pulse the click point, just skip re-showing the ring.
|
|
247
|
+
clickPoint = await moveCursorTo(page, box, cursorMs(200));
|
|
248
|
+
clickTone = "planned";
|
|
249
|
+
}
|
|
250
|
+
if (clickPoint) {
|
|
251
|
+
await clickPulseAt(page, clickPoint.x, clickPoint.y, clickTone);
|
|
252
|
+
// clickPulseAt only triggers the CSS animation class - it doesn't
|
|
253
|
+
// wait for it. Without a pause here, the real click (and any
|
|
254
|
+
// resulting navigation/DOM change) fires while the ripple is still
|
|
255
|
+
// mid-animation, sometimes cutting it off before it's even visible.
|
|
256
|
+
// Wait out the same .5s the "@keyframes wg-pulse" rule uses, so the
|
|
257
|
+
// mock click visually completes before the real one fires.
|
|
258
|
+
await new Promise((res) => setTimeout(res, skipTheater() ? 0 : 500));
|
|
259
|
+
}
|
|
260
|
+
// Touch theater (0.13+): prefer Locator.tap / long-press when device
|
|
261
|
+
// touchMode is on (context launched with hasTouch). gesture on stub
|
|
262
|
+
// wins: tap | hold | click.
|
|
263
|
+
const stubs = (stubBeforeRef && stubBeforeRef.current) || [];
|
|
264
|
+
const touch = !!(deviceRef && deviceRef.current && deviceRef.current.touchMode);
|
|
265
|
+
const idx = await matchStubIndexForLocator(page, locator, stubs).catch(() => -1);
|
|
266
|
+
const stub = idx >= 0 ? stubs[idx] : null;
|
|
267
|
+
if (stub && (stub.gesture === "tap" || stub.gesture === "hold" || stub.gesture === "click"))
|
|
268
|
+
return stub.gesture;
|
|
269
|
+
return touch ? "tap" : "click";
|
|
270
|
+
},
|
|
271
|
+
holdMs: () => (skipTheater() ? 0 : 600),
|
|
272
|
+
async afterClick() {
|
|
273
|
+
await new Promise((res) => setTimeout(res, clickPostPop()));
|
|
274
|
+
await hideRing(page);
|
|
275
|
+
// Full document navigation drops #wg-todo-dock + rings; restore carry.
|
|
276
|
+
await repaintOverlay(page);
|
|
277
|
+
await pause(beat());
|
|
278
|
+
},
|
|
279
|
+
// Caps any Locator.waitFor()/page.waitForTimeout() timeout during step
|
|
280
|
+
// mode - a Block polling for something that will NEVER happen (e.g. "is
|
|
281
|
+
// there an unverified-account banner" on an account that IS verified)
|
|
282
|
+
// has no choice but to wait out its own hardcoded timeout in full before
|
|
283
|
+
// concluding "no". Only the WAIT gets capped, never the real outcome -
|
|
284
|
+
// if the thing genuinely appears at 800ms into a 5000ms wait, waitFor
|
|
285
|
+
// still resolves at 800ms same as always; this only shortens the "it's
|
|
286
|
+
// just never going to happen" case. Plain setTimeout()-based sleep()
|
|
287
|
+
// helpers some Blocks use for their own pacing are NOT Playwright calls
|
|
288
|
+
// at all and can't be touched this way - a real, disclosed limit, not
|
|
289
|
+
// silently ignored.
|
|
290
|
+
// Pushed down to 700ms earlier this session based on login.block.ts
|
|
291
|
+
// alone - every waitFor() there is a "give up gracefully" pattern
|
|
292
|
+
// (wrapped in .catch()/Promise.race, a timeout IS the expected negative
|
|
293
|
+
// result). That's a different kind of wait than a REQUIRED
|
|
294
|
+
// synchronization point with no catch - e.g. overview-metrics.block.ts
|
|
295
|
+
// waits (uncaught) for a "Loading pending actions..." placeholder to
|
|
296
|
+
// actually appear before it's safe to check for an error, a real
|
|
297
|
+
// hydration signal the block's own comment calls "deterministic,"
|
|
298
|
+
// not a probe. A flat 700ms cap broke that block outright on this
|
|
299
|
+
// shared, loaded box (a real 3-block chain run threw instead of
|
|
300
|
+
// catching). Bumping the SAME flat cap to 4000ms to cover it just
|
|
301
|
+
// reintroduced most of the original torture on login.block.ts's own
|
|
302
|
+
// 5000ms unverified-email check - 4000ms is barely better than the real
|
|
303
|
+
// 5000ms it's capping.
|
|
304
|
+
//
|
|
305
|
+
// A single flat number can't serve both: it has no way to tell "safe to
|
|
306
|
+
// cut short" from "must actually happen" apart from the outside. But
|
|
307
|
+
// each call site's OWN declared timeout is already a real signal of
|
|
308
|
+
// which kind it is - a Block author who wrote timeout: 5000 for a quick
|
|
309
|
+
// conditional check and one who wrote timeout: 15000 for a real
|
|
310
|
+
// hydration wait weren't picking the same number by accident. Scale the
|
|
311
|
+
// cap off that instead of a single constant: 30% of whatever was
|
|
312
|
+
// declared, never below a 700ms floor (the value already proven safe
|
|
313
|
+
// for the fast/common case), and never above what was declared in the
|
|
314
|
+
// first place. login's 5000ms check -> 1500ms (still 3.5s faster than
|
|
315
|
+
// uncapped). overview-metrics' 15000ms wait -> 4500ms (more headroom
|
|
316
|
+
// than the flat 4000ms fix, not less).
|
|
317
|
+
capWait: scaledWaitCap,
|
|
318
|
+
// A plain sleep (not a "wait for condition X") never has a hidden
|
|
319
|
+
// "must actually happen" requirement attached - always safe to cut
|
|
320
|
+
// to the floor, no scaling needed.
|
|
321
|
+
capSleep: (ms) => Math.min(ms, WAIT_CAP_FLOOR_MS),
|
|
322
|
+
});
|
|
323
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { DemoPace } from "../../engine/stub/pace.js";
|
|
2
|
+
export interface Pacing {
|
|
3
|
+
/** Shorter Next gates (keeps the smooth cursor). */
|
|
4
|
+
gatesFast: boolean;
|
|
5
|
+
gatesSlow: boolean;
|
|
6
|
+
/** Skip the overlay's added dwell entirely (blitz, fast-forward, WAYGRAPH_FAST_BLOCKS). */
|
|
7
|
+
skipTheater: boolean;
|
|
8
|
+
demoPace: DemoPace;
|
|
9
|
+
}
|
|
10
|
+
export declare function newPacing(demoFast: boolean): Pacing;
|
|
11
|
+
interface PacedStep {
|
|
12
|
+
block: {
|
|
13
|
+
name: string;
|
|
14
|
+
demoPace?: DemoPace | string | number | null;
|
|
15
|
+
fastForward?: boolean;
|
|
16
|
+
};
|
|
17
|
+
demoPace?: DemoPace | undefined;
|
|
18
|
+
wasFastForward?: boolean | undefined;
|
|
19
|
+
}
|
|
20
|
+
export declare function paceStep(pacing: Pacing, step: PacedStep, demoFast: boolean, fastBlocks: Set<string>): void;
|
|
21
|
+
export {};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { demoPaceIsBlitz, demoPaceIsFast, demoPaceIsSlow, normalizeDemoPace, resolveStepDemoPace } from "../narration/demo-pace.js";
|
|
2
|
+
import { envString } from "../../engine/env.js";
|
|
3
|
+
export function newPacing(demoFast) {
|
|
4
|
+
return { gatesFast: demoFast, gatesSlow: false, skipTheater: false, demoPace: "normal" };
|
|
5
|
+
}
|
|
6
|
+
const isSet = (pace) => pace != null && pace !== "";
|
|
7
|
+
export function paceStep(pacing, step, demoFast, fastBlocks) {
|
|
8
|
+
const defaultPace = envString("WAYGRAPH_DEMO_PACE") ? normalizeDemoPace(envString("WAYGRAPH_DEMO_PACE")) : undefined;
|
|
9
|
+
const fastForward = !!step.block.fastForward || !!step.wasFastForward;
|
|
10
|
+
const flowPace = step.demoPace ?? defaultPace;
|
|
11
|
+
const stepPace = resolveStepDemoPace({
|
|
12
|
+
...(step.block.demoPace !== undefined ? { blockPace: step.block.demoPace } : {}),
|
|
13
|
+
...(flowPace !== undefined ? { flowPace } : {}),
|
|
14
|
+
fastForward: !!step.block.fastForward,
|
|
15
|
+
wasFastForward: !!step.wasFastForward,
|
|
16
|
+
});
|
|
17
|
+
const authoredPace = isSet(step.block.demoPace) || isSet(step.demoPace) || defaultPace != null;
|
|
18
|
+
const listedFast = fastBlocks.has(step.block.name);
|
|
19
|
+
pacing.demoPace = stepPace === "normal" && (demoFast || listedFast) && !authoredPace ? (listedFast ? "blitz" : "fast") : stepPace;
|
|
20
|
+
pacing.gatesFast = demoPaceIsFast(pacing.demoPace) || fastForward || (!authoredPace && demoFast);
|
|
21
|
+
pacing.gatesSlow = demoPaceIsSlow(pacing.demoPace);
|
|
22
|
+
pacing.skipTheater = demoPaceIsBlitz(pacing.demoPace) || listedFast || fastForward;
|
|
23
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Checkpoint } from "../../engine/checkpoint/checkpoint.js";
|
|
2
|
+
import type { DemoPace } from "../../engine/stub/pace.js";
|
|
3
|
+
import type { ResolvedHighlight } from "../../engine/stub/ring.js";
|
|
4
|
+
import type { TodoDockState } from "../../engine/stub/todos.js";
|
|
5
|
+
import type { Ref, WgPage } from "../types.js";
|
|
6
|
+
import { type PanelTodos, type StepPanelInfo } from "./step-panels.js";
|
|
7
|
+
/** The panel after a step: the Checkpoint it resolved to, the rings to cycle, and whether it was the last step. */
|
|
8
|
+
export interface AfterPanelInfo extends StepPanelInfo, PanelTodos {
|
|
9
|
+
result: Checkpoint<string>;
|
|
10
|
+
resultTag: string;
|
|
11
|
+
highlights: readonly ResolvedHighlight[];
|
|
12
|
+
gatesFast?: boolean | undefined;
|
|
13
|
+
isLast: boolean;
|
|
14
|
+
pace?: DemoPace | undefined;
|
|
15
|
+
todoDockRef?: Ref<TodoDockState | undefined> | undefined;
|
|
16
|
+
}
|
|
17
|
+
export declare function renderAfterStep(page: WgPage, info: AfterPanelInfo): Promise<void>;
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
// The demo panel after a step: what it resolved to (pretty / JSON), its rings, and the Next gate.
|
|
2
|
+
import { ignorePageGone } from "../../engine/page-gone.js";
|
|
3
|
+
import { installOverlay } from "../overlay/overlay.js";
|
|
4
|
+
import { cycleHighlightRings } from "../overlay/rings.js";
|
|
5
|
+
import { miniStepLabel } from "./step-panels.js";
|
|
6
|
+
export async function renderAfterStep(page, info) {
|
|
7
|
+
await installOverlay(page, info.title, info.bannerUi, info.caption, info.networkTabVisible);
|
|
8
|
+
// Clear any tracker from a previous highlight before cycling through this
|
|
9
|
+
// step's own.
|
|
10
|
+
await page
|
|
11
|
+
.evaluate(() => {
|
|
12
|
+
if (window.__wgRingTrack) {
|
|
13
|
+
window.removeEventListener("resize", window.__wgRingTrack);
|
|
14
|
+
window.removeEventListener("scroll", window.__wgRingTrack, true);
|
|
15
|
+
window.__wgRingTrack = null;
|
|
16
|
+
}
|
|
17
|
+
})
|
|
18
|
+
.catch(ignorePageGone);
|
|
19
|
+
const highlights = info.highlights || [];
|
|
20
|
+
const gatesFast = !!info.gatesFast;
|
|
21
|
+
// Cycle through EVERY declared/recovered highlight in order, each shown
|
|
22
|
+
// long enough to actually register - "it highlights something [...] then
|
|
23
|
+
// it highlights something [else] and next," not just the first one.
|
|
24
|
+
// duration / fastMode on stubAfter (or flow fixtures) override the default
|
|
25
|
+
// 900ms / 200ms holds when set.
|
|
26
|
+
await cycleHighlightRings(page, highlights, gatesFast, {
|
|
27
|
+
pace: info.pace,
|
|
28
|
+
stepLabel: miniStepLabel(info),
|
|
29
|
+
todoDock: info.todoDock,
|
|
30
|
+
todos: info.todos,
|
|
31
|
+
todoSync: info.todoSync,
|
|
32
|
+
todoDockRef: info.todoDockRef,
|
|
33
|
+
// stubAfter already authored progress - do not re-index by ring 0..n
|
|
34
|
+
advanceTodos: false,
|
|
35
|
+
});
|
|
36
|
+
// After-ring advances may have moved the dock - surface latest for caller.
|
|
37
|
+
if (info.todoDockRef && info.todoDockRef.current) {
|
|
38
|
+
info.todoDock = info.todoDockRef.current;
|
|
39
|
+
}
|
|
40
|
+
const afterPayload = { ...info, stepLabel: miniStepLabel(info) };
|
|
41
|
+
await page
|
|
42
|
+
.evaluate((info) => {
|
|
43
|
+
// Reused in place - see renderBeforeStep's own comment on this.
|
|
44
|
+
let panel = __wgById("wg-panel");
|
|
45
|
+
const isNewPanel = !panel;
|
|
46
|
+
if (!panel) {
|
|
47
|
+
panel = document.createElement("div");
|
|
48
|
+
panel.id = "wg-panel";
|
|
49
|
+
}
|
|
50
|
+
const pct = Math.round(((info.index + 1) / info.total) * 100);
|
|
51
|
+
const heading = info.isLast
|
|
52
|
+
? "End of chain - " + info.total + " / " + info.total + " blocks covered - " + info.blockName + " done"
|
|
53
|
+
: "Step " + (info.index + 1) + " / " + info.total + " - " + info.blockName + " done";
|
|
54
|
+
const buttonLabel = info.isLast ? "Finish" : "Next \u25B6";
|
|
55
|
+
const modulesClass = info.stepperMode === "full" ? "wg-modules-full" : "wg-modules-carousel";
|
|
56
|
+
const modules = info.allNames.map((name, idx) => {
|
|
57
|
+
const cls = idx <= info.moduleIndex ? "wg-mod-done" : "wg-mod-upcoming";
|
|
58
|
+
const desc = info.allDescriptions && info.allDescriptions[idx];
|
|
59
|
+
return __wgEl("span", { class: "wg-mod " + cls, title: desc || undefined }, String(name));
|
|
60
|
+
});
|
|
61
|
+
// QA-friendly by default ("LoginSuccess" -> "Login Success") - raw
|
|
62
|
+
// JSON is one click away for whoever actually wants __state.
|
|
63
|
+
const stateTag = info.result && info.result.__state ? info.result.__state : "";
|
|
64
|
+
const prettyText = stateTag
|
|
65
|
+
.replace(/([a-z0-9])([A-Z])/g, "$1 $2")
|
|
66
|
+
.replace(/([A-Z]+)([A-Z][a-z])/g, "$1 $2") || info.resultTag;
|
|
67
|
+
const pretty = window.__wgPretty !== false;
|
|
68
|
+
let autoNow = false;
|
|
69
|
+
try {
|
|
70
|
+
autoNow = localStorage.getItem("wg-autoplay") === "1";
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
/* private mode / blocked storage - defaults to manual */
|
|
74
|
+
}
|
|
75
|
+
const autoplay = __wgEl("input", { id: "wg-autoplay-cb", attrs: { type: "checkbox" } });
|
|
76
|
+
autoplay.checked = autoNow;
|
|
77
|
+
const episodes = info.allEpisodes && info.allEpisodes.length > 0
|
|
78
|
+
? __wgEl("div", { id: "wg-episodes" }, info.allEpisodes.map((e) => {
|
|
79
|
+
const cls = e.episodeNumber < (info.episodeNumber ?? 0) ? "wg-ep-done"
|
|
80
|
+
: e.episodeNumber === info.episodeNumber ? "wg-ep-current"
|
|
81
|
+
: "wg-ep-upcoming";
|
|
82
|
+
return __wgEl("span", { class: "wg-ep-tab " + cls }, "Episode " + e.episodeNumber + ": " + (e.episodeTitle || ""));
|
|
83
|
+
}))
|
|
84
|
+
: null;
|
|
85
|
+
const pace = info.paceBadge || info.paceLabel
|
|
86
|
+
? __wgEl("div", { class: "wg-pace", data: { paceKind: info.paceKind || "normal" } }, __wgEl("span", { class: "wg-pace-badge" }, info.paceBadge || "1x"), __wgEl("span", null, info.paceLabel || ""))
|
|
87
|
+
: null;
|
|
88
|
+
// Todos float in #wg-todo-dock via __wgSyncTodos, never in the panel.
|
|
89
|
+
__wgSet(panel, __wgEl("div", { id: "wg-progress" }, __wgEl("div", { id: "wg-progress-bar", style: "width:" + pct + "%" })), episodes, pace, __wgEl("div", { id: "wg-modules", class: modulesClass }, modules), __wgEl("h3", null, heading), __wgEl("div", { class: "wg-toggle" }, __wgEl("button", { class: "wg-toggle-btn" + (pretty ? " wg-active" : ""), data: { mode: "pretty" } }, "Pretty"), __wgEl("button", { class: "wg-toggle-btn" + (pretty ? "" : " wg-active"), data: { mode: "json" } }, "JSON")), __wgEl("div", { class: "wg-result wg-result-pretty", style: "display:" + (pretty ? "block" : "none") }, String(prettyText)), __wgEl("div", { class: "wg-result wg-result-json", style: "display:" + (pretty ? "none" : "block") }, String(info.resultTag)), __wgEl("div", { class: "wg-autoplay-row" }, __wgEl("label", null, autoplay, " Auto-advance")), __wgEl("div", { id: "wg-gate-manual", style: autoNow ? "display:none" : "" }, __wgEl("button", { id: "wg-run" }, buttonLabel)), __wgEl("div", { id: "wg-gate-auto", class: "wg-auto", style: autoNow ? "" : "display:none" }, "Auto-advancing..."));
|
|
90
|
+
if (isNewPanel) {
|
|
91
|
+
__wgAdd(panel);
|
|
92
|
+
requestAnimationFrame(() => panel.classList.add("wg-in"));
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
panel.classList.add("wg-in");
|
|
96
|
+
}
|
|
97
|
+
if (window.__wgWirePanelChrome) {
|
|
98
|
+
window.__wgWirePanelChrome(panel, "wg-panel-hidden", "waygraph demo", {
|
|
99
|
+
stepLabel: info.stepLabel || "",
|
|
100
|
+
forceCollapsed: info.forceCollapsed === true ? true : undefined,
|
|
101
|
+
fastForward: !!info.fastForward,
|
|
102
|
+
isApi: !!info.isApi,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
if (window.__wgSyncTodos) {
|
|
106
|
+
const sync = info.todoSync || (info.todos && info.todos.length ? "set" : "keep");
|
|
107
|
+
// Prefer dock-only payload. Passing list:[] with a dock used to clear
|
|
108
|
+
// marks a frame later (empty-list clear path).
|
|
109
|
+
if (sync === "keep" && !info.todoDock) {
|
|
110
|
+
/* leave floating dock alone */
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
const payload = {
|
|
114
|
+
sync: sync,
|
|
115
|
+
dock: info.todoDock || null,
|
|
116
|
+
pos: info.todoPos || null,
|
|
117
|
+
todoId: info.todoId || (info.todoDock && info.todoDock.id) || null,
|
|
118
|
+
};
|
|
119
|
+
if (!info.todoDock && info.todos && info.todos.length) {
|
|
120
|
+
payload.list = info.todos;
|
|
121
|
+
}
|
|
122
|
+
window.__wgSyncTodos(payload);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
if (window.__wgStampModal) {
|
|
126
|
+
window.__wgStampModal(panel, "panel", {
|
|
127
|
+
phase: "after",
|
|
128
|
+
step: info.index + 1,
|
|
129
|
+
total: info.total,
|
|
130
|
+
block: info.blockName || "",
|
|
131
|
+
ready: true,
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
panel.querySelectorAll(".wg-toggle-btn").forEach((btn) => {
|
|
135
|
+
btn.addEventListener("click", () => {
|
|
136
|
+
const wantPretty = btn.getAttribute("data-mode") === "pretty";
|
|
137
|
+
window.__wgPretty = wantPretty;
|
|
138
|
+
panel.querySelectorAll(".wg-toggle-btn").forEach((b) => b.classList.remove("wg-active"));
|
|
139
|
+
btn.classList.add("wg-active");
|
|
140
|
+
panel.querySelector(".wg-result-pretty").style.display = wantPretty ? "block" : "none";
|
|
141
|
+
panel.querySelector(".wg-result-json").style.display = wantPretty ? "none" : "block";
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
const runBtn = __wgById("wg-run");
|
|
145
|
+
if (runBtn)
|
|
146
|
+
runBtn.addEventListener("click", () => window.__wgNext({}));
|
|
147
|
+
const cb = __wgById("wg-autoplay-cb");
|
|
148
|
+
if (cb) {
|
|
149
|
+
cb.addEventListener("change", () => {
|
|
150
|
+
try {
|
|
151
|
+
localStorage.setItem("wg-autoplay", cb.checked ? "1" : "0");
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
/* private mode / blocked storage - toggle still works this page */
|
|
155
|
+
}
|
|
156
|
+
const manual = __wgById("wg-gate-manual");
|
|
157
|
+
const auto = __wgById("wg-gate-auto");
|
|
158
|
+
if (manual)
|
|
159
|
+
manual.style.display = cb.checked ? "none" : "";
|
|
160
|
+
if (auto)
|
|
161
|
+
auto.style.display = cb.checked ? "" : "none";
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
}, afterPayload)
|
|
165
|
+
.catch(ignorePageGone);
|
|
166
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { WgPage } from "../types.js";
|
|
2
|
+
import { type PanelTodos, type StepPanelInfo } from "./step-panels.js";
|
|
3
|
+
/** The panel before a step: its description, the mem it reads (editable), and whether its episode just began. */
|
|
4
|
+
export interface BeforePanelInfo extends StepPanelInfo, PanelTodos {
|
|
5
|
+
description: string;
|
|
6
|
+
keys: readonly {
|
|
7
|
+
name: string;
|
|
8
|
+
value: string;
|
|
9
|
+
}[];
|
|
10
|
+
justEnteredEpisode: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare function renderBeforeStep(page: WgPage, info: BeforePanelInfo): Promise<void>;
|