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
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
// Mem: the values a run carries between Blocks (credentials, the row just added), typed by MemKey.
|
|
2
|
+
import { WaygraphError, MSG_MEM_READ_BEFORE_SET } from "../errors.js";
|
|
2
3
|
/**
|
|
3
4
|
* A typed key into MemPage. The phantom `_phantom` field is never assigned - it
|
|
4
5
|
* exists only so TypeScript can infer `T` at each call site. The store is keyed by
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function isPageGone(err: unknown): boolean;
|
|
2
|
+
/** `.catch(ignorePageGone)`: the call is moot when the page went away; anything else is rethrown. */
|
|
3
|
+
export declare function ignorePageGone(err: unknown): undefined;
|
|
4
|
+
/** `.catch(ignoreTimeout)`: a probe that waited as long as it should (or whose page went away); anything else is rethrown. */
|
|
5
|
+
export declare function ignoreTimeout(err: unknown): undefined;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// The failures a page call may ignore, and nothing else: the page went away (a navigation or a close), or a probe ran
|
|
2
|
+
// out of time. Any other error is real and goes through.
|
|
3
|
+
import { errors } from "@playwright/test";
|
|
4
|
+
/** Playwright has no error class for a closed page or a destroyed document, only these messages. */
|
|
5
|
+
const GONE = /Target page, context or browser has been closed|Target closed|Browser has been closed|Execution context was destroyed|frame was detached|Frame has been detached|Session closed|Cannot find context with specified id|Failed to find context with id/i;
|
|
6
|
+
export function isPageGone(err) {
|
|
7
|
+
return err instanceof Error && GONE.test(err.message);
|
|
8
|
+
}
|
|
9
|
+
/** `.catch(ignorePageGone)`: the call is moot when the page went away; anything else is rethrown. */
|
|
10
|
+
export function ignorePageGone(err) {
|
|
11
|
+
if (isPageGone(err))
|
|
12
|
+
return undefined;
|
|
13
|
+
throw err;
|
|
14
|
+
}
|
|
15
|
+
/** `.catch(ignoreTimeout)`: a probe that waited as long as it should (or whose page went away); anything else is rethrown. */
|
|
16
|
+
export function ignoreTimeout(err) {
|
|
17
|
+
if (err instanceof errors.TimeoutError || isPageGone(err))
|
|
18
|
+
return undefined;
|
|
19
|
+
throw err;
|
|
20
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Block } from "../block/block.js";
|
|
2
|
+
import type { Checkpoint } from "../checkpoint/checkpoint.js";
|
|
3
|
+
import type { Trait } from "../trait/trait.js";
|
|
4
|
+
/**
|
|
5
|
+
* Structural twin of `run.ts`'s `Layout`, so this file needs no import from it. Any real `Layout` satisfies it with no
|
|
6
|
+
* cast at the `connect()` call site.
|
|
7
|
+
*/
|
|
8
|
+
export interface ConnectLayout {
|
|
9
|
+
name: string;
|
|
10
|
+
appliesTo: (tag: string) => boolean;
|
|
11
|
+
verify: Trait[] | ((out: any) => Trait[]);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Composes two Blocks into one, typechecked so this only compiles when A's output
|
|
15
|
+
* tag equals B's input tag. The composed Block's act runs A's full instruction
|
|
16
|
+
* (act -> observe? -> resolve) then hands the resulting Checkpoint into B's act;
|
|
17
|
+
* its own observe/resolve are simply B's, since B is what decides the final Out.
|
|
18
|
+
*
|
|
19
|
+
* `layouts`, if given, also runs against the intermediate Checkpoint (A's
|
|
20
|
+
* resolved output, right before B's act) - the same enforcement `runGraph`'s
|
|
21
|
+
* own loop already applies to a chain's FINAL Checkpoint, but a
|
|
22
|
+
* `map()`-built Flow never reaches that loop per-hop: `buildFlow`
|
|
23
|
+
* reduces the whole Block array into one `connect()`-composed super-Block, so
|
|
24
|
+
* every intermediate hop's verify (and now layout) has to run HERE, inside
|
|
25
|
+
* this recursive `act`, not in `runGraph`'s loop, which only ever sees the
|
|
26
|
+
* one composed Block run start to finish.
|
|
27
|
+
*/
|
|
28
|
+
export declare function connect<A extends Checkpoint<string>, B extends Checkpoint<string>, C extends Checkpoint<string>>(a: Block<A, B>, b: Block<B, C>, layouts?: readonly ConnectLayout[]): Block<A, C>;
|
|
@@ -1,11 +1,5 @@
|
|
|
1
|
-
import { runVerify, runPrecondition } from "
|
|
2
|
-
|
|
3
|
-
* Builds a Checkpoint - spells `__state` for you so no call site does it by hand.
|
|
4
|
-
* @example resolve: () => checkpoint("LoggedIn")
|
|
5
|
-
*/
|
|
6
|
-
export function checkpoint(tag) {
|
|
7
|
-
return { __state: tag };
|
|
8
|
-
}
|
|
1
|
+
import { runVerify, runPrecondition } from "../trait/trait.js";
|
|
2
|
+
import { isConnected, lastLeaf, stepEnded, stepStarted } from "./events.js";
|
|
9
3
|
/**
|
|
10
4
|
* Composes two Blocks into one, typechecked so this only compiles when A's output
|
|
11
5
|
* tag equals B's input tag. The composed Block's act runs A's full instruction
|
|
@@ -15,7 +9,7 @@ export function checkpoint(tag) {
|
|
|
15
9
|
* `layouts`, if given, also runs against the intermediate Checkpoint (A's
|
|
16
10
|
* resolved output, right before B's act) - the same enforcement `runGraph`'s
|
|
17
11
|
* own loop already applies to a chain's FINAL Checkpoint, but a
|
|
18
|
-
* `
|
|
12
|
+
* `map()`-built Flow never reaches that loop per-hop: `buildFlow`
|
|
19
13
|
* reduces the whole Block array into one `connect()`-composed super-Block, so
|
|
20
14
|
* every intermediate hop's verify (and now layout) has to run HERE, inside
|
|
21
15
|
* this recursive `act`, not in `runGraph`'s loop, which only ever sees the
|
|
@@ -25,11 +19,13 @@ export function connect(a, b, layouts) {
|
|
|
25
19
|
const bObserve = b.instruction.observe;
|
|
26
20
|
const bVerify = b.instruction.verify;
|
|
27
21
|
const requires = [...(a.requires ?? []), ...(b.requires ?? [])];
|
|
28
|
-
|
|
22
|
+
const connected = {
|
|
29
23
|
name: `${a.name} -> ${b.name}`,
|
|
30
24
|
...(requires.length > 0 ? { requires } : {}),
|
|
31
25
|
instruction: {
|
|
32
26
|
async act(page, input, mem) {
|
|
27
|
+
if (!isConnected(a))
|
|
28
|
+
stepStarted(a.name, input.__state);
|
|
33
29
|
await runPrecondition(a.instruction.precondition, input, page, mem, a.name);
|
|
34
30
|
await a.instruction.act(page, input, mem);
|
|
35
31
|
const aObserved = a.instruction.observe
|
|
@@ -44,6 +40,9 @@ export function connect(a, b, layouts) {
|
|
|
44
40
|
await runVerify(layout.verify, mid, page, mem, `${a.name} (layout: "${layout.name}")`);
|
|
45
41
|
}
|
|
46
42
|
}
|
|
43
|
+
stepEnded(lastLeaf(a), mid.__state);
|
|
44
|
+
if (!isConnected(b))
|
|
45
|
+
stepStarted(b.name, mid.__state);
|
|
47
46
|
await runPrecondition(b.instruction.precondition, mid, page, mem, b.name);
|
|
48
47
|
await b.instruction.act(page, mid, mem);
|
|
49
48
|
},
|
|
@@ -54,4 +53,6 @@ export function connect(a, b, layouts) {
|
|
|
54
53
|
...(bVerify ? { verify: bVerify } : {}),
|
|
55
54
|
},
|
|
56
55
|
};
|
|
56
|
+
Object.defineProperty(connected, "__wgLastLeaf", { value: lastLeaf(b), enumerable: false });
|
|
57
|
+
return connected;
|
|
57
58
|
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
export type RunEvent = {
|
|
2
|
+
type: "run:start";
|
|
3
|
+
runId: string;
|
|
4
|
+
at: number;
|
|
5
|
+
label?: string;
|
|
6
|
+
} | {
|
|
7
|
+
type: "step:start";
|
|
8
|
+
runId: string;
|
|
9
|
+
at: number;
|
|
10
|
+
index: number;
|
|
11
|
+
block: string;
|
|
12
|
+
from: string;
|
|
13
|
+
} | {
|
|
14
|
+
type: "step:end";
|
|
15
|
+
runId: string;
|
|
16
|
+
at: number;
|
|
17
|
+
index: number;
|
|
18
|
+
block: string;
|
|
19
|
+
to: string;
|
|
20
|
+
ms: number;
|
|
21
|
+
} | {
|
|
22
|
+
type: "step:error";
|
|
23
|
+
runId: string;
|
|
24
|
+
at: number;
|
|
25
|
+
index: number;
|
|
26
|
+
block: string;
|
|
27
|
+
error: string;
|
|
28
|
+
ms: number;
|
|
29
|
+
} | {
|
|
30
|
+
type: "run:end";
|
|
31
|
+
runId: string;
|
|
32
|
+
at: number;
|
|
33
|
+
ok: boolean;
|
|
34
|
+
result?: string;
|
|
35
|
+
error?: string;
|
|
36
|
+
ms: number;
|
|
37
|
+
} | {
|
|
38
|
+
type: "run:artifact";
|
|
39
|
+
runId: string;
|
|
40
|
+
at: number;
|
|
41
|
+
kind: "video" | "trace" | "screenshot";
|
|
42
|
+
path: string;
|
|
43
|
+
};
|
|
44
|
+
/** What {@link onRunEvent} calls with each event. */
|
|
45
|
+
export type RunEventListener = (event: RunEvent) => void;
|
|
46
|
+
/** Subscribes to every run event in this process; returns the unsubscribe function. */
|
|
47
|
+
export declare function onRunEvent(listener: RunEventListener): () => void;
|
|
48
|
+
/**
|
|
49
|
+
* Opens a run, or joins the one already open (a flow nested in another, or a runner driving a chain step by step). Returns
|
|
50
|
+
* whether this call opened it, so only the opener closes it.
|
|
51
|
+
*/
|
|
52
|
+
export declare function beginRun(label?: string): boolean;
|
|
53
|
+
/** Closes the run when the matching `beginRun` opened it. */
|
|
54
|
+
export declare function endRun(opened: boolean, outcome: {
|
|
55
|
+
result?: string;
|
|
56
|
+
error?: unknown;
|
|
57
|
+
}): void;
|
|
58
|
+
export declare function stepStarted(block: string, from: string): void;
|
|
59
|
+
export declare function stepEnded(block: string, to: string): void;
|
|
60
|
+
/** The step that started last failed. */
|
|
61
|
+
export declare function stepFailed(error: unknown): void;
|
|
62
|
+
/** The id of the run open right now, if any. */
|
|
63
|
+
export declare function currentRunId(): string | undefined;
|
|
64
|
+
export declare function recordArtifact(kind: "video" | "trace" | "screenshot", path: string, runId?: string | undefined): void;
|
|
65
|
+
/** The last real Block inside a Block built by `connect` (or the Block itself). */
|
|
66
|
+
export declare function lastLeaf(block: object): string;
|
|
67
|
+
export declare function isConnected(block: object): boolean;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
// Run events: what happened, step by step, during a run. Core emits them; subscribers (the run log, the demo overlay,
|
|
2
|
+
// reports, Waygraph UI) listen. Emitting never throws into the run.
|
|
3
|
+
const listeners = new Set();
|
|
4
|
+
/** Subscribes to every run event in this process; returns the unsubscribe function. */
|
|
5
|
+
export function onRunEvent(listener) {
|
|
6
|
+
listeners.add(listener);
|
|
7
|
+
return () => listeners.delete(listener);
|
|
8
|
+
}
|
|
9
|
+
function emit(event) {
|
|
10
|
+
for (const listener of listeners) {
|
|
11
|
+
try {
|
|
12
|
+
listener(event);
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
/* a broken subscriber never breaks a run */
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
let open;
|
|
20
|
+
/**
|
|
21
|
+
* Opens a run, or joins the one already open (a flow nested in another, or a runner driving a chain step by step). Returns
|
|
22
|
+
* whether this call opened it, so only the opener closes it.
|
|
23
|
+
*/
|
|
24
|
+
export function beginRun(label) {
|
|
25
|
+
if (open) {
|
|
26
|
+
open.depth += 1;
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
const at = Date.now();
|
|
30
|
+
open = { runId: `${new Date(at).toISOString().replace(/[:.]/g, "-")}-${crypto.randomUUID().slice(0, 8)}`, startedAt: at, depth: 1, index: 0 };
|
|
31
|
+
emit({ type: "run:start", runId: open.runId, at, ...(label ? { label } : {}) });
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
/** Closes the run when the matching `beginRun` opened it. */
|
|
35
|
+
export function endRun(opened, outcome) {
|
|
36
|
+
if (!open)
|
|
37
|
+
return;
|
|
38
|
+
open.depth -= 1;
|
|
39
|
+
if (!opened)
|
|
40
|
+
return;
|
|
41
|
+
const at = Date.now();
|
|
42
|
+
emit({
|
|
43
|
+
type: "run:end",
|
|
44
|
+
runId: open.runId,
|
|
45
|
+
at,
|
|
46
|
+
ok: outcome.error === undefined,
|
|
47
|
+
...(outcome.result !== undefined ? { result: outcome.result } : {}),
|
|
48
|
+
...(outcome.error !== undefined ? { error: outcome.error instanceof Error ? outcome.error.message : String(outcome.error) } : {}),
|
|
49
|
+
ms: at - open.startedAt,
|
|
50
|
+
});
|
|
51
|
+
open = undefined;
|
|
52
|
+
}
|
|
53
|
+
export function stepStarted(block, from) {
|
|
54
|
+
if (!open)
|
|
55
|
+
return;
|
|
56
|
+
const at = Date.now();
|
|
57
|
+
open.step = { index: open.index++, block, startedAt: at };
|
|
58
|
+
emit({ type: "step:start", runId: open.runId, at, index: open.step.index, block, from });
|
|
59
|
+
}
|
|
60
|
+
export function stepEnded(block, to) {
|
|
61
|
+
if (!open?.step)
|
|
62
|
+
return;
|
|
63
|
+
const at = Date.now();
|
|
64
|
+
emit({ type: "step:end", runId: open.runId, at, index: open.step.index, block, to, ms: at - open.step.startedAt });
|
|
65
|
+
open.step = undefined;
|
|
66
|
+
}
|
|
67
|
+
/** The step that started last failed. */
|
|
68
|
+
export function stepFailed(error) {
|
|
69
|
+
if (!open?.step)
|
|
70
|
+
return;
|
|
71
|
+
const at = Date.now();
|
|
72
|
+
const { index, block, startedAt } = open.step;
|
|
73
|
+
emit({ type: "step:error", runId: open.runId, at, index, block, error: error instanceof Error ? error.message : String(error), ms: at - startedAt });
|
|
74
|
+
open.step = undefined;
|
|
75
|
+
}
|
|
76
|
+
/** The id of the run open right now, if any. */
|
|
77
|
+
export function currentRunId() {
|
|
78
|
+
return open?.runId;
|
|
79
|
+
}
|
|
80
|
+
export function recordArtifact(kind, path, runId = open?.runId) {
|
|
81
|
+
if (runId)
|
|
82
|
+
emit({ type: "run:artifact", runId, at: Date.now(), kind, path });
|
|
83
|
+
}
|
|
84
|
+
/** The last real Block inside a Block built by `connect` (or the Block itself). */
|
|
85
|
+
export function lastLeaf(block) {
|
|
86
|
+
return block.__wgLastLeaf ?? block.name;
|
|
87
|
+
}
|
|
88
|
+
export function isConnected(block) {
|
|
89
|
+
return block.__wgLastLeaf !== undefined;
|
|
90
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Page } from "@playwright/test";
|
|
2
|
+
/** One HTTP call a Block made on its own (`defineApiBlock`), for whatever is showing network activity. */
|
|
3
|
+
export interface ApiCallRecord {
|
|
4
|
+
method: string;
|
|
5
|
+
url: string;
|
|
6
|
+
status: number;
|
|
7
|
+
ok: boolean;
|
|
8
|
+
ms: number;
|
|
9
|
+
resHeaders?: Record<string, string> | undefined;
|
|
10
|
+
resBody?: string | undefined;
|
|
11
|
+
}
|
|
12
|
+
type ApiCallRecorder = (page: Page, entry: ApiCallRecord) => void | Promise<void>;
|
|
13
|
+
/** The demo layer registers how an API call is shown (the network panel). Without one, calls are not recorded. */
|
|
14
|
+
export declare function setApiCallRecorder(recorder: ApiCallRecorder | undefined): void;
|
|
15
|
+
export declare function recordApiCall(page: Page, entry: ApiCallRecord): Promise<void>;
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
let apiCallRecorder;
|
|
2
|
+
/** The demo layer registers how an API call is shown (the network panel). Without one, calls are not recorded. */
|
|
3
|
+
export function setApiCallRecorder(recorder) {
|
|
4
|
+
apiCallRecorder = recorder;
|
|
5
|
+
}
|
|
6
|
+
export async function recordApiCall(page, entry) {
|
|
7
|
+
await apiCallRecorder?.(page, entry);
|
|
8
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { BrowserContext } from "@playwright/test";
|
|
2
|
+
import type { EngineConfig } from "../config.js";
|
|
3
|
+
/** A browser context an Engine opened for itself, and how to close it again. */
|
|
4
|
+
export interface OwnContext {
|
|
5
|
+
context: BrowserContext;
|
|
6
|
+
close(): Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
type OwnContextLauncher = (config: EngineConfig | undefined) => Promise<OwnContext>;
|
|
9
|
+
/** The runtime layer registers the full launch (selected config, Chromium path, extensions); see `runtime/full-launch.ts`. */
|
|
10
|
+
export declare function setOwnContextLauncher(next: OwnContextLauncher): void;
|
|
11
|
+
/** Opens the browser and context a `Flow.run(mem)` uses when the caller gave none. */
|
|
12
|
+
export declare function launchOwnContext(config: EngineConfig | undefined): Promise<OwnContext>;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { resolveLauncher } from "../config.js";
|
|
2
|
+
import { envString } from "../env.js";
|
|
3
|
+
/** Plain Playwright launch: what an Engine does when nothing richer is registered (no config file, no extensions). */
|
|
4
|
+
async function plainLaunch(config) {
|
|
5
|
+
if (config?.extensions?.length) {
|
|
6
|
+
throw new Error('waygraph: browser extensions need the runtime layer - import the Engine from "waygraph"');
|
|
7
|
+
}
|
|
8
|
+
const browser = await resolveLauncher(config?.browserName ?? "chromium", config).launch({
|
|
9
|
+
headless: config?.headless ?? true,
|
|
10
|
+
...(config?.slowMo !== undefined ? { slowMo: config.slowMo } : {}),
|
|
11
|
+
});
|
|
12
|
+
const baseURL = config?.baseUrl ?? envString("WAYGRAPH_BASE_URL");
|
|
13
|
+
const context = await browser.newContext({
|
|
14
|
+
...(baseURL ? { baseURL } : {}),
|
|
15
|
+
...(config?.recordVideo ? { recordVideo: config.recordVideo } : {}),
|
|
16
|
+
});
|
|
17
|
+
return { context, close: () => browser.close() };
|
|
18
|
+
}
|
|
19
|
+
let launcher = plainLaunch;
|
|
20
|
+
/** The runtime layer registers the full launch (selected config, Chromium path, extensions); see `runtime/full-launch.ts`. */
|
|
21
|
+
export function setOwnContextLauncher(next) {
|
|
22
|
+
launcher = next;
|
|
23
|
+
}
|
|
24
|
+
/** Opens the browser and context a `Flow.run(mem)` uses when the caller gave none. */
|
|
25
|
+
export function launchOwnContext(config) {
|
|
26
|
+
return launcher(config);
|
|
27
|
+
}
|
|
@@ -1,16 +1,18 @@
|
|
|
1
|
-
import { MemPage } from "../mem
|
|
2
|
-
import type { Block
|
|
3
|
-
import type {
|
|
1
|
+
import { MemPage } from "../mem/mem.js";
|
|
2
|
+
import type { Block } from "../block/block.js";
|
|
3
|
+
import type { Checkpoint } from "../checkpoint/checkpoint.js";
|
|
4
|
+
import type { Trait } from "../trait/trait.js";
|
|
4
5
|
import type { BrowserContext, Locator, Page } from "@playwright/test";
|
|
6
|
+
import type { SomeBlock } from "../block/block.js";
|
|
5
7
|
/**
|
|
6
8
|
* Checks `block.requires` against `mem` and throws, naming every missing key at
|
|
7
9
|
* once, if any are unset. `connect()` unions each Block's `requires` into the
|
|
8
|
-
* composed Block, so calling this on a `
|
|
10
|
+
* composed Block, so calling this on a `map()`-built Flow's entry - which
|
|
9
11
|
* `runGraph` does automatically, before opening a tab - covers every Block in
|
|
10
12
|
* that flow. It does not see Blocks only reachable through `branch()` routing,
|
|
11
13
|
* since those depend on a runtime decision that hasn't happened yet.
|
|
12
14
|
*/
|
|
13
|
-
export declare function preflight(mem: MemPage, block:
|
|
15
|
+
export declare function preflight(mem: MemPage, block: SomeBlock): void;
|
|
14
16
|
/**
|
|
15
17
|
* A cross-cutting, automatically-enforced verify - the real engine
|
|
16
18
|
* primitive behind "persistent UI" (a sidebar, a header, anything that's
|
|
@@ -73,7 +75,7 @@ export declare function defineLayout(options: LayoutOptions): Layout;
|
|
|
73
75
|
* `terminals`, if given, is a sanity check: the Checkpoint the run stops on must be
|
|
74
76
|
* one of the tags the caller actually expects, or the run fails loud instead of
|
|
75
77
|
* silently returning an unexpected result. Omit it when there is only ever one
|
|
76
|
-
* reachable outcome by construction (as with a `
|
|
78
|
+
* reachable outcome by construction (as with a `map()`-built Flow, which has
|
|
77
79
|
* no routing at all) - there is nothing to validate against.
|
|
78
80
|
*/
|
|
79
81
|
export declare function runGraph<TOut extends Checkpoint<string>>(entry: Block<Checkpoint<"__start__">, TOut>, terminals: ReadonlySet<string> | undefined, context: BrowserContext, mem: MemPage, maxSteps?: number, options?: RunGraphOptions): Promise<TOut>;
|
|
@@ -141,9 +143,3 @@ export declare function spawnTab<TOut extends Checkpoint<string>>(entry: Block<C
|
|
|
141
143
|
* @example await narrate(submitButton, "confirms the order", () => submitButton.click())
|
|
142
144
|
*/
|
|
143
145
|
export declare function narrate<T>(locator: Locator, caption: string, action: () => Promise<T>): Promise<T>;
|
|
144
|
-
/** Reserved markers bookending a `defineFlow([start, ...blocks, end])` call. */
|
|
145
|
-
export declare const start: unique symbol;
|
|
146
|
-
/** Marks the end of a hand-built chain. Only the deprecated `defineFlow` needs it; `map()` does not. */
|
|
147
|
-
export declare const end: unique symbol;
|
|
148
|
-
export type StartMarker = typeof start;
|
|
149
|
-
export type EndMarker = typeof end;
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { WaygraphError, MSG_PREFLIGHT_MISSING_KEY, MSG_RUNGRAPH_MAX_STEPS, MSG_RUNGRAPH_NOT_TERMINAL } from "../errors.js";
|
|
2
|
-
import { checkpoint } from "../
|
|
3
|
-
import {
|
|
2
|
+
import { checkpoint } from "../checkpoint/checkpoint.js";
|
|
3
|
+
import { beginRun, endRun, isConnected, lastLeaf, stepEnded, stepFailed, stepStarted } from "./events.js";
|
|
4
|
+
import { runPrecondition, runVerify } from "../trait/trait.js";
|
|
5
|
+
import { ignorePageGone } from "../page-gone.js";
|
|
4
6
|
/**
|
|
5
7
|
* Checks `block.requires` against `mem` and throws, naming every missing key at
|
|
6
8
|
* once, if any are unset. `connect()` unions each Block's `requires` into the
|
|
7
|
-
* composed Block, so calling this on a `
|
|
9
|
+
* composed Block, so calling this on a `map()`-built Flow's entry - which
|
|
8
10
|
* `runGraph` does automatically, before opening a tab - covers every Block in
|
|
9
11
|
* that flow. It does not see Blocks only reachable through `branch()` routing,
|
|
10
12
|
* since those depend on a runtime decision that hasn't happened yet.
|
|
@@ -70,15 +72,17 @@ async function runLayouts(layouts, tag, out, page, mem, blockName) {
|
|
|
70
72
|
* `terminals`, if given, is a sanity check: the Checkpoint the run stops on must be
|
|
71
73
|
* one of the tags the caller actually expects, or the run fails loud instead of
|
|
72
74
|
* silently returning an unexpected result. Omit it when there is only ever one
|
|
73
|
-
* reachable outcome by construction (as with a `
|
|
75
|
+
* reachable outcome by construction (as with a `map()`-built Flow, which has
|
|
74
76
|
* no routing at all) - there is nothing to validate against.
|
|
75
77
|
*/
|
|
76
78
|
export async function runGraph(entry, terminals, context, mem, maxSteps = 5000, options) {
|
|
77
79
|
preflight(mem, entry);
|
|
78
80
|
const page = options?.page ?? (await context.newPage());
|
|
79
81
|
const closeOnFinish = options?.closeOnFinish ?? true;
|
|
82
|
+
const opened = beginRun();
|
|
83
|
+
let result;
|
|
84
|
+
let failure;
|
|
80
85
|
try {
|
|
81
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
82
86
|
let current = entry;
|
|
83
87
|
let input = checkpoint("__start__");
|
|
84
88
|
let steps = 0;
|
|
@@ -86,6 +90,8 @@ export async function runGraph(entry, terminals, context, mem, maxSteps = 5000,
|
|
|
86
90
|
if (++steps > maxSteps) {
|
|
87
91
|
throw new WaygraphError("WG_RUNGRAPH_MAX_STEPS", MSG_RUNGRAPH_MAX_STEPS(maxSteps));
|
|
88
92
|
}
|
|
93
|
+
if (!isConnected(current))
|
|
94
|
+
stepStarted(current.name, input.__state);
|
|
89
95
|
await runPrecondition(current.instruction.precondition, input, page, mem, current.name);
|
|
90
96
|
await current.instruction.act(page, input, mem);
|
|
91
97
|
const observed = current.instruction.observe
|
|
@@ -94,18 +100,26 @@ export async function runGraph(entry, terminals, context, mem, maxSteps = 5000,
|
|
|
94
100
|
const checkpoint = await current.instruction.resolve(observed);
|
|
95
101
|
await runVerify(current.instruction.verify, checkpoint, page, mem, current.name);
|
|
96
102
|
await runLayouts(options?.layouts, checkpoint.__state, checkpoint, page, mem, current.name);
|
|
103
|
+
stepEnded(lastLeaf(current), checkpoint.__state);
|
|
97
104
|
const next = current.next?.(checkpoint);
|
|
98
105
|
if (!next) {
|
|
99
106
|
if (terminals && !terminals.has(checkpoint.__state)) {
|
|
100
107
|
throw new WaygraphError("WG_RUNGRAPH_NOT_TERMINAL", MSG_RUNGRAPH_NOT_TERMINAL(current.name, checkpoint.__state, [...terminals].join(", ")));
|
|
101
108
|
}
|
|
109
|
+
result = checkpoint.__state;
|
|
102
110
|
return checkpoint;
|
|
103
111
|
}
|
|
104
112
|
current = next;
|
|
105
113
|
input = checkpoint;
|
|
106
114
|
}
|
|
107
115
|
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
failure = err;
|
|
118
|
+
stepFailed(err);
|
|
119
|
+
throw err;
|
|
120
|
+
}
|
|
108
121
|
finally {
|
|
122
|
+
endRun(opened, failure === undefined ? { ...(result !== undefined ? { result } : {}) } : { error: failure });
|
|
109
123
|
if (closeOnFinish) {
|
|
110
124
|
await page.close();
|
|
111
125
|
}
|
|
@@ -177,7 +191,7 @@ export async function narrate(locator, caption, action) {
|
|
|
177
191
|
// true; narrate() below is the one that actually clears it.
|
|
178
192
|
w.__wgNarrateOwnsRing = true;
|
|
179
193
|
}, { box, caption })
|
|
180
|
-
.catch(
|
|
194
|
+
.catch(ignorePageGone);
|
|
181
195
|
owning = true;
|
|
182
196
|
// The ring alone is pointless if action() fires on the very next
|
|
183
197
|
// tick - a click that navigates (e.g. a form submit) wipes the ring
|
|
@@ -195,7 +209,7 @@ export async function narrate(locator, caption, action) {
|
|
|
195
209
|
.evaluate(() => {
|
|
196
210
|
globalThis.__wgLastNarrate = Date.now();
|
|
197
211
|
})
|
|
198
|
-
.catch(
|
|
212
|
+
.catch(ignorePageGone);
|
|
199
213
|
}
|
|
200
214
|
}
|
|
201
215
|
catch {
|
|
@@ -213,11 +227,7 @@ export async function narrate(locator, caption, action) {
|
|
|
213
227
|
if (w.__wgHideRing)
|
|
214
228
|
w.__wgHideRing();
|
|
215
229
|
})
|
|
216
|
-
.catch(
|
|
230
|
+
.catch(ignorePageGone);
|
|
217
231
|
}
|
|
218
232
|
}
|
|
219
233
|
}
|
|
220
|
-
/** Reserved markers bookending a `defineFlow([start, ...blocks, end])` call. */
|
|
221
|
-
export const start = Symbol("waygraph.start");
|
|
222
|
-
/** Marks the end of a hand-built chain. Only the deprecated `defineFlow` needs it; `map()` does not. */
|
|
223
|
-
export const end = Symbol("waygraph.end");
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Demo pacing for a Flow episode or a Block/compose group.
|
|
3
|
+
* - `blitz` - FF-like: skip theater + short gates (same as fastForwardComposeBlock)
|
|
4
|
+
* - `fast` - shorter gates, keep cursor theater (~0.33x normal)
|
|
5
|
+
* - `normal` - default demo pace (1x)
|
|
6
|
+
* - `slow` - longer autoplay + fixture dwell (~2x)
|
|
7
|
+
* - `number` - scale vs normal when `<= 20` (e.g. `0.5`, `1.5`, `3`);
|
|
8
|
+
* absolute gate/dwell ms when `> 20` (e.g. `4500`)
|
|
9
|
+
*/
|
|
10
|
+
export type DemoPaceName = "blitz" | "fast" | "normal" | "slow";
|
|
11
|
+
/** How fast a demo step runs: `"fast"`, `"slow"`, `"blitz"`, `"normal"`, or a multiplier (`0.5`, `2`). */
|
|
12
|
+
export type DemoPace = DemoPaceName | number;
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import type { Checkpoint } from "../checkpoint/checkpoint.js";
|
|
2
|
+
/** Shared dwell fields on stubs, fixtures, and yap slides. */
|
|
3
|
+
export type FixtureDurationFields = {
|
|
4
|
+
/**
|
|
5
|
+
* Min time this fixture stays visible before the demo advances.
|
|
6
|
+
* - `true` - defaults (2000ms normal, {@link FixtureDurationFields.fastMode} or 600ms when --fast)
|
|
7
|
+
* - `number` - override normal dwell ms
|
|
8
|
+
* - omit / false - no authored dwell (caller keeps its default timing)
|
|
9
|
+
*/
|
|
10
|
+
duration?: boolean | number;
|
|
11
|
+
/**
|
|
12
|
+
* Dwell ms when demo `--fast` / gatesFast (only when {@link duration} is set).
|
|
13
|
+
* Default 600.
|
|
14
|
+
*/
|
|
15
|
+
fastMode?: number;
|
|
16
|
+
};
|
|
17
|
+
/** One named highlight slot on a block (selector + caption). */
|
|
18
|
+
export interface WaygraphHighlightStub extends FixtureDurationFields {
|
|
19
|
+
selector: string;
|
|
20
|
+
/** Primary caption line. */
|
|
21
|
+
label: string;
|
|
22
|
+
/** Extra caption line (ring / slide body). */
|
|
23
|
+
detail?: string;
|
|
24
|
+
/** Short badge, e.g. AC / BUG / GATE / YAP. */
|
|
25
|
+
tag?: string;
|
|
26
|
+
/**
|
|
27
|
+
* Demo ring color + icon:
|
|
28
|
+
* - `planned` purple (authored narration, default)
|
|
29
|
+
* - `auto` gray (engine automation / verify fallback)
|
|
30
|
+
* - `info` blue · `warning` yellow · `danger` red · `success` green
|
|
31
|
+
*/
|
|
32
|
+
tone?: HighlightTone;
|
|
33
|
+
/**
|
|
34
|
+
* Ring padding + label font scale: `sm` | `md` (default) | `lg`.
|
|
35
|
+
* Aliases: small/medium/large, s/m/l.
|
|
36
|
+
*/
|
|
37
|
+
size?: HighlightSize;
|
|
38
|
+
/**
|
|
39
|
+
* Label font weight: `normal` (default) | `bold`.
|
|
40
|
+
* Aliases: regular, strong.
|
|
41
|
+
*/
|
|
42
|
+
weight?: HighlightWeight;
|
|
43
|
+
/**
|
|
44
|
+
* Camera zoom while this ring is up (Screen Studio style - page scales toward
|
|
45
|
+
* the target / cursor). Typical `1.25` .. `2`. Cleared when the ring hides
|
|
46
|
+
* unless `zoomOut: false`. Episode default: {@link StubCtx.zoom}.
|
|
47
|
+
*/
|
|
48
|
+
zoom?: number;
|
|
49
|
+
/**
|
|
50
|
+
* When false, keep the camera zoomed after this ring (pan to the next target
|
|
51
|
+
* instead of zooming out). Default true. Phase default: {@link StubCtx.zoomOut}.
|
|
52
|
+
*/
|
|
53
|
+
zoomOut?: boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Spotlight: dim the rest of the page, keep this target as the focal point.
|
|
56
|
+
*/
|
|
57
|
+
focus?: boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Caption text color (CSS color). Overrides tone label color when set.
|
|
60
|
+
*/
|
|
61
|
+
color?: string;
|
|
62
|
+
/**
|
|
63
|
+
* Move the demo cursor to the target while this ring is up (default true
|
|
64
|
+
* for authored stub queues; set false to keep cursor hidden).
|
|
65
|
+
*/
|
|
66
|
+
cursor?: boolean;
|
|
67
|
+
/**
|
|
68
|
+
* Optional link to a todo item id. When set, Method fill/click advances that
|
|
69
|
+
* todo row instead of relying on stub array index (avoids password/submit/username
|
|
70
|
+
* alphabetical reorder bugs).
|
|
71
|
+
*/
|
|
72
|
+
todo?: string;
|
|
73
|
+
/** Slot key from stubBefore/After map (e.g. "username") - set by resolver. */
|
|
74
|
+
slotId?: string;
|
|
75
|
+
/**
|
|
76
|
+
* Pointer feel when touchMode is on (0.13+):
|
|
77
|
+
* - `tap` - short press via touchscreen (default in touch mode)
|
|
78
|
+
* - `hold` - long-press (~600ms) then release
|
|
79
|
+
* - `click` - mouse click even in touch mode
|
|
80
|
+
*/
|
|
81
|
+
gesture?: "tap" | "hold" | "click" | "swipe";
|
|
82
|
+
}
|
|
83
|
+
/** A static stub phase: named ring slots to paint before or after a step. */
|
|
84
|
+
export type HighlightStubPhase = Record<string, WaygraphHighlightStub>;
|
|
85
|
+
/**
|
|
86
|
+
* One yap/slide in a multi-step demo caption sequence.
|
|
87
|
+
* Not block lifecycle - demo pauses (Next / auto-next) between slides.
|
|
88
|
+
*/
|
|
89
|
+
export interface WaygraphSlide extends FixtureDurationFields {
|
|
90
|
+
/** Primary caption (required). */
|
|
91
|
+
caption: string;
|
|
92
|
+
detail?: string;
|
|
93
|
+
tag?: string;
|
|
94
|
+
/** Optional ring while this slide is showing. */
|
|
95
|
+
selector?: string;
|
|
96
|
+
tone?: HighlightTone;
|
|
97
|
+
size?: HighlightSize;
|
|
98
|
+
weight?: HighlightWeight;
|
|
99
|
+
/** Magnify via camera (Screen Studio) while this slide is showing. */
|
|
100
|
+
zoom?: number;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Demo ring tones (iconified).
|
|
104
|
+
* Automation (`auto`) is gray so authored planned/info/warning/danger/success stand out.
|
|
105
|
+
* `orange` added for Blind Pilot's own real, direct user request: a visible
|
|
106
|
+
* color distinction between a real Playwright-driven action (a Block run,
|
|
107
|
+
* or a raw click/type/upload - `auto` gray, already meant exactly this) and
|
|
108
|
+
* a pure DOM inspection (`auto dom` - orange, new) - "gray is waygraph
|
|
109
|
+
* playwright run. orange is dom check."
|
|
110
|
+
*/
|
|
111
|
+
export type HighlightTone = "planned" | "auto" | "info" | "warning" | "danger" | "success" | "orange";
|
|
112
|
+
/** Ring + label scale. */
|
|
113
|
+
export type HighlightSize = "sm" | "md" | "lg";
|
|
114
|
+
/** Label font weight. */
|
|
115
|
+
export type HighlightWeight = "normal" | "bold";
|
|
116
|
+
/** Optional Flow-level defaults for demo rings (episode-wide). Stub/fixture wins. */
|
|
117
|
+
export type HighlightStyleDefaults = {
|
|
118
|
+
tone?: HighlightTone;
|
|
119
|
+
size?: HighlightSize;
|
|
120
|
+
weight?: HighlightWeight;
|
|
121
|
+
};
|
|
122
|
+
export type WaygraphSlidesOrFn<Out extends Checkpoint<string>> = readonly WaygraphSlide[] | ((out: Out) => readonly WaygraphSlide[]);
|
|
123
|
+
/** A ring or caption after its defaults and overrides are merged, ready to paint. */
|
|
124
|
+
export type ResolvedHighlight = WaygraphHighlightStub;
|
|
125
|
+
/** Map author aliases (`error` -> danger) to a canonical tone. */
|
|
126
|
+
export declare function normalizeHighlightTone(raw: unknown): HighlightTone;
|
|
127
|
+
/** Map size aliases to sm/md/lg. */
|
|
128
|
+
export declare function normalizeHighlightSize(raw: unknown): HighlightSize;
|
|
129
|
+
/** Map weight aliases to normal/bold. */
|
|
130
|
+
export declare function normalizeHighlightWeight(raw: unknown): HighlightWeight;
|