waygraph 0.15.53 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -3
- package/bin/waygraph +2 -2
- package/dist/analysis/check.d.ts +38 -0
- package/dist/analysis/check.js +87 -0
- package/dist/analysis/coverage-gap.d.ts +1 -1
- package/dist/analysis/coverage-gap.js +14 -37
- package/dist/analysis/flow-source.d.ts +9 -0
- package/dist/analysis/flow-source.js +25 -0
- package/dist/analysis/graph.d.ts +13 -14
- package/dist/analysis/graph.js +48 -371
- package/dist/analysis/map-check.js +4 -39
- package/dist/analysis/practices-check.d.ts +1 -1
- package/dist/analysis/practices-check.js +24 -45
- package/dist/cli/args.d.ts +23 -0
- package/dist/cli/args.js +20 -0
- package/dist/{cli.d.ts → cli/cli.d.ts} +0 -1
- package/dist/{cli.js → cli/cli.js} +10 -9
- package/dist/{commands → cli/commands}/agent-dive-scaffold.js +35 -64
- package/dist/cli/commands/agent-dive.js +42 -0
- package/dist/{commands → cli/commands}/check.d.ts +0 -1
- package/dist/cli/commands/check.js +104 -0
- package/dist/cli/commands/codemod-checkpoints.d.ts +18 -0
- package/dist/cli/commands/codemod-checkpoints.js +186 -0
- package/dist/cli/commands/codemod-flows.d.ts +18 -0
- package/dist/cli/commands/codemod-flows.js +284 -0
- package/dist/cli/commands/codemod-stubs.d.ts +10 -0
- package/dist/cli/commands/codemod-stubs.js +187 -0
- package/dist/{commands → cli/commands}/extensions.js +5 -4
- package/dist/{commands → cli/commands}/init.js +1 -2
- package/dist/{commands → cli/commands}/list.js +9 -7
- package/dist/cli/commands/manifest.d.ts +2 -0
- package/dist/cli/commands/manifest.js +20 -0
- package/dist/cli/commands/map.js +57 -0
- package/dist/{commands → cli/commands}/run.d.ts +0 -1
- package/dist/cli/commands/run.js +64 -0
- package/dist/{commands → cli/commands}/session.js +61 -88
- package/dist/{commands → cli/commands}/test.js +11 -14
- package/dist/cli/commands/traverse.js +105 -0
- package/dist/{commands → cli/commands}/try.js +29 -25
- package/dist/{commands → cli/commands}/upgrade.js +40 -4
- package/dist/cli/flags.d.ts +193 -16
- package/dist/cli/flags.js +179 -234
- package/dist/cli/run-chain.d.ts +1 -0
- package/dist/cli/run-chain.js +42 -7
- package/dist/cli/usage.d.ts +1 -1
- package/dist/cli/usage.js +21 -53
- package/dist/cli/util.d.ts +2 -2
- package/dist/cli/util.js +2 -3
- package/dist/{highlights → demo/narration}/css.d.ts +1 -1
- package/dist/{highlights → demo/narration}/css.js +2 -3
- package/dist/{highlights → demo/narration}/demo-pace.d.ts +7 -11
- package/dist/{highlights → demo/narration}/demo-pace.js +9 -11
- package/dist/{highlights → demo/narration}/device.d.ts +4 -2
- package/dist/{highlights → demo/narration}/device.js +3 -1
- package/dist/demo/narration/merge.d.ts +8 -0
- package/dist/demo/narration/merge.js +71 -0
- package/dist/{highlights/run-phase.d.ts → demo/narration/narration.d.ts} +10 -14
- package/dist/{highlights/run-phase.js → demo/narration/narration.js} +25 -94
- package/dist/{highlights → demo/narration}/shorthand.d.ts +1 -1
- package/dist/demo/narration/stub-ctx.d.ts +8 -0
- package/dist/demo/narration/stub-ctx.js +164 -0
- package/dist/{highlights → demo/narration}/style.d.ts +1 -7
- package/dist/{highlights → demo/narration}/style.js +1 -41
- package/dist/{highlights → demo/narration}/todo-dock.d.ts +3 -3
- package/dist/{highlights → demo/narration}/todo-dock.js +13 -30
- package/dist/demo/overlay/auto-chrome.d.ts +7 -0
- package/dist/demo/overlay/auto-chrome.js +97 -0
- package/dist/{session/overlay-beacon.d.ts → demo/overlay/beacon.d.ts} +7 -0
- package/dist/{session/overlay-beacon.js → demo/overlay/beacon.js} +5 -0
- package/dist/demo/overlay/cursor.d.ts +12 -0
- package/dist/demo/overlay/cursor.js +142 -0
- package/dist/demo/overlay/device-stage.d.ts +13 -0
- package/dist/demo/overlay/device-stage.js +396 -0
- package/dist/demo/overlay/inpage/banner.d.ts +1 -0
- package/dist/demo/overlay/inpage/banner.js +160 -0
- package/dist/demo/overlay/inpage/caption.d.ts +2 -0
- package/dist/demo/overlay/inpage/caption.js +24 -0
- package/dist/demo/overlay/inpage/core.d.ts +1 -0
- package/dist/demo/overlay/inpage/core.js +345 -0
- package/dist/demo/overlay/inpage/device-chip.d.ts +1 -0
- package/dist/demo/overlay/inpage/device-chip.js +191 -0
- package/dist/demo/overlay/inpage/network.d.ts +9 -0
- package/dist/demo/overlay/inpage/network.js +200 -0
- package/dist/demo/overlay/inpage/panel-chrome.d.ts +1 -0
- package/dist/demo/overlay/inpage/panel-chrome.js +203 -0
- package/dist/demo/overlay/inpage/stamp.d.ts +1 -0
- package/dist/demo/overlay/inpage/stamp.js +46 -0
- package/dist/demo/overlay/inpage/swipe-zoom.d.ts +1 -0
- package/dist/demo/overlay/inpage/swipe-zoom.js +220 -0
- package/dist/demo/overlay/inpage/todos.d.ts +1 -0
- package/dist/demo/overlay/inpage/todos.js +294 -0
- package/dist/demo/overlay/locator-theater.d.ts +25 -0
- package/dist/demo/overlay/locator-theater.js +76 -0
- package/dist/demo/overlay/network-capture.d.ts +22 -0
- package/dist/demo/overlay/network-capture.js +127 -0
- package/dist/demo/overlay/overlay-css.d.ts +3 -0
- package/dist/demo/overlay/overlay-css.js +369 -0
- package/dist/demo/overlay/overlay-stage.d.ts +23 -0
- package/dist/demo/overlay/overlay-stage.js +106 -0
- package/dist/demo/overlay/overlay.d.ts +10 -0
- package/dist/demo/overlay/overlay.js +89 -0
- package/dist/{pilot-overlay/overlay-fixtures.d.ts → demo/overlay/phase-fixtures.d.ts} +2 -2
- package/dist/{pilot-overlay/overlay-fixtures.js → demo/overlay/phase-fixtures.js} +2 -2
- package/dist/{pilot-overlay/action-ring.js → demo/overlay/pilot/actions.js} +2 -1
- package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.d.ts +6 -5
- package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.js +19 -18
- package/dist/{pilot-overlay → demo/overlay/pilot}/shell.d.ts +2 -2
- package/dist/{pilot-overlay → demo/overlay/pilot}/shell.js +13 -22
- package/dist/demo/overlay/reattach.d.ts +7 -0
- package/dist/demo/overlay/reattach.js +23 -0
- package/dist/demo/overlay/rings.d.ts +33 -0
- package/dist/demo/overlay/rings.js +448 -0
- package/dist/{ui → demo/overlay/ui}/components/ring.js +2 -2
- package/dist/{ui → demo/overlay/ui}/overlay.css +4 -4
- package/dist/{ui → demo/overlay/ui}/shadow.d.ts +1 -1
- package/dist/{ui → demo/overlay/ui}/shadow.js +39 -2
- package/dist/demo/stepper/after.d.ts +3 -0
- package/dist/demo/stepper/after.js +113 -0
- package/dist/demo/stepper/banner-log.d.ts +37 -0
- package/dist/demo/stepper/banner-log.js +63 -0
- package/dist/demo/stepper/before.d.ts +4 -0
- package/dist/demo/stepper/before.js +110 -0
- package/dist/demo/stepper/demo-log.d.ts +31 -0
- package/dist/demo/stepper/demo-log.js +309 -0
- package/dist/demo/stepper/gate.d.ts +11 -0
- package/dist/demo/stepper/gate.js +78 -0
- package/dist/demo/stepper/interaction-patch.d.ts +3 -0
- package/dist/demo/stepper/interaction-patch.js +323 -0
- package/dist/demo/stepper/pacing.d.ts +21 -0
- package/dist/demo/stepper/pacing.js +23 -0
- package/dist/demo/stepper/slides.d.ts +11 -0
- package/dist/demo/stepper/slides.js +233 -0
- package/dist/demo/stepper/step-panels.d.ts +21 -0
- package/dist/demo/stepper/step-panels.js +589 -0
- package/dist/demo/stepper/stepper.d.ts +24 -0
- package/dist/demo/stepper/stepper.js +122 -0
- package/dist/demo/stepper/teardown.d.ts +48 -0
- package/dist/demo/stepper/teardown.js +179 -0
- package/dist/demo/stepper/todo-advance.d.ts +14 -0
- package/dist/demo/stepper/todo-advance.js +110 -0
- package/dist/demo/stepper/view.d.ts +68 -0
- package/dist/demo/stepper/view.js +31 -0
- package/dist/demo/types.d.ts +17 -0
- package/dist/demo/verbose-log.js +15 -0
- package/dist/{types.d.ts → engine/block/block.d.ts} +106 -91
- package/dist/{core → engine/block}/block.js +10 -53
- package/dist/{core → engine/block}/compose.d.ts +10 -7
- package/dist/{core → engine/block}/compose.js +1 -1
- package/dist/{core/blocks → engine/block/kinds}/api.d.ts +17 -12
- package/dist/{core/blocks → engine/block/kinds}/api.js +26 -18
- package/dist/{core/blocks → engine/block/kinds}/effect.d.ts +13 -18
- package/dist/engine/block/kinds/effect.js +17 -0
- package/dist/{core/blocks → engine/block/kinds}/method.d.ts +19 -29
- package/dist/{core/blocks → engine/block/kinds}/method.js +7 -21
- package/dist/{core/blocks → engine/block/kinds}/nav.d.ts +22 -31
- package/dist/{core/blocks → engine/block/kinds}/nav.js +6 -12
- package/dist/{core/blocks → engine/block/kinds}/page.d.ts +15 -20
- package/dist/{core/blocks → engine/block/kinds}/page.js +5 -7
- package/dist/engine/checkpoint/checkpoint.d.ts +22 -0
- package/dist/engine/checkpoint/checkpoint.js +8 -0
- package/dist/engine/checkpoint/route.d.ts +28 -0
- package/dist/engine/checkpoint/route.js +28 -0
- package/dist/{core → engine}/config.d.ts +7 -2
- package/dist/engine/config.js +6 -0
- package/dist/engine/engine.d.ts +45 -0
- package/dist/{core → engine}/engine.js +6 -10
- package/dist/engine/env.d.ts +59 -0
- package/dist/engine/env.js +83 -0
- package/dist/{errors.d.ts → engine/errors.d.ts} +23 -22
- package/dist/{errors.js → engine/errors.js} +22 -22
- package/dist/{core → engine/flow}/branch-regression.d.ts +8 -7
- package/dist/{core → engine/flow}/branch-regression.js +4 -3
- package/dist/engine/flow/flow.d.ts +162 -0
- package/dist/engine/flow/flow.js +244 -0
- package/dist/{core → engine/flow}/map-builder.d.ts +42 -40
- package/dist/{core → engine/flow}/map-builder.js +46 -48
- package/dist/{core → engine}/locate.d.ts +1 -1
- package/dist/{core → engine}/locate.js +1 -2
- package/dist/{mem-stub.d.ts → engine/mem/mem-stub.d.ts} +9 -8
- package/dist/{mem-stub.js → engine/mem/mem-stub.js} +2 -2
- package/dist/{mem-page.d.ts → engine/mem/mem.d.ts} +1 -1
- package/dist/{mem-page.js → engine/mem/mem.js} +2 -1
- package/dist/engine/page-gone.d.ts +5 -0
- package/dist/engine/page-gone.js +20 -0
- package/dist/engine/run/connect.d.ts +28 -0
- package/dist/{types.js → engine/run/connect.js} +11 -10
- package/dist/engine/run/events.d.ts +67 -0
- package/dist/engine/run/events.js +90 -0
- package/dist/engine/run/hooks.d.ts +16 -0
- package/dist/engine/run/hooks.js +8 -0
- package/dist/engine/run/launch.d.ts +13 -0
- package/dist/engine/run/launch.js +27 -0
- package/dist/{core/run-graph.d.ts → engine/run/run.d.ts} +9 -11
- package/dist/{core/run-graph.js → engine/run/run.js} +22 -11
- package/dist/engine/stub/pace.d.ts +12 -0
- package/dist/engine/stub/pace.js +2 -0
- package/dist/engine/stub/ring.d.ts +130 -0
- package/dist/engine/stub/ring.js +41 -0
- package/dist/engine/stub/stub.d.ts +268 -0
- package/dist/engine/stub/stub.js +1 -0
- package/dist/engine/stub/todos.d.ts +104 -0
- package/dist/engine/stub/todos.js +2 -0
- package/dist/engine/stub/viewport.d.ts +26 -0
- package/dist/engine/stub/viewport.js +2 -0
- package/dist/{trait.d.ts → engine/trait/trait.d.ts} +1 -1
- package/dist/index.d.ts +84 -36
- package/dist/index.js +44 -19
- package/dist/{session/auto-explore-run.d.ts → live/auto/auto.d.ts} +10 -16
- package/dist/{session/auto-explore-run.js → live/auto/auto.js} +164 -248
- package/dist/{session/auto-explore.d.ts → live/auto/explore.d.ts} +4 -14
- package/dist/{session/auto-explore.js → live/auto/explore.js} +21 -127
- package/dist/{auto-session/session.d.ts → live/auto-session/auto-session.d.ts} +1 -1
- package/dist/{auto-session/session.js → live/auto-session/auto-session.js} +27 -24
- package/dist/{auto-session → live/auto-session}/helpers.d.ts +16 -5
- package/dist/{auto-session → live/auto-session}/helpers.js +1 -1
- package/dist/{session/auto-session-ipc.d.ts → live/auto-session/ipc.d.ts} +7 -5
- package/dist/{session/auto-session-ipc.js → live/auto-session/ipc.js} +31 -16
- package/dist/{session/browser.d.ts → live/auto-session/start.d.ts} +1 -2
- package/dist/{session/browser.js → live/auto-session/start.js} +2 -3
- package/dist/{pilot-overlay → live/pilot}/panel.d.ts +1 -1
- package/dist/{pilot-overlay → live/pilot}/panel.js +23 -31
- package/dist/{session → live/pilot}/pilot.d.ts +4 -3
- package/dist/{session → live/pilot}/pilot.js +4 -4
- package/dist/{traverse → live/traverse}/coverage.d.ts +4 -0
- package/dist/{traverse → live/traverse}/coverage.js +3 -0
- package/dist/{traverse → live/traverse}/lease.d.ts +1 -0
- package/dist/{traverse → live/traverse}/lease.js +1 -0
- package/dist/{traverse/run.d.ts → live/traverse/traverse.d.ts} +4 -1
- package/dist/{traverse/run.js → live/traverse/traverse.js} +26 -43
- package/dist/manifest/manifest.d.ts +52 -0
- package/dist/manifest/manifest.js +93 -0
- package/dist/manifest/map-imports.d.ts +7 -0
- package/dist/manifest/map-imports.js +22 -0
- package/dist/manifest/maps.d.ts +33 -0
- package/dist/manifest/maps.js +62 -0
- package/dist/manifest/pack.d.ts +21 -0
- package/dist/manifest/pack.js +109 -0
- package/dist/manifest/project.d.ts +60 -0
- package/dist/manifest/project.js +101 -0
- package/dist/{session/block-inject.js → manifest/roots.js} +1 -18
- package/dist/manifest/scan.d.ts +19 -0
- package/dist/manifest/scan.js +57 -0
- package/dist/{blocks-select.d.ts → manifest/select.d.ts} +3 -0
- package/dist/{blocks-select.js → manifest/select.js} +2 -0
- package/dist/manifest/source.d.ts +23 -0
- package/dist/manifest/source.js +86 -0
- package/dist/runner/mode.d.ts +71 -0
- package/dist/runner/mode.js +1 -0
- package/dist/runner/modes/branches.d.ts +5 -0
- package/dist/runner/modes/branches.js +37 -0
- package/dist/runner/modes/demo.d.ts +3 -0
- package/dist/runner/modes/demo.js +13 -0
- package/dist/runner/modes/report.d.ts +2 -0
- package/dist/runner/modes/report.js +54 -0
- package/dist/runner/modes/run.d.ts +2 -0
- package/dist/runner/modes/run.js +3 -0
- package/dist/runner/options.d.ts +31 -0
- package/dist/runner/options.js +42 -0
- package/dist/runner/plan/find.d.ts +18 -0
- package/dist/runner/plan/find.js +65 -0
- package/dist/runner/plan/plan.d.ts +11 -0
- package/dist/runner/plan/plan.js +97 -0
- package/dist/runner/plan/seed-mem.d.ts +12 -0
- package/dist/runner/plan/seed-mem.js +98 -0
- package/dist/runner/plan/spec.d.ts +5 -0
- package/dist/runner/plan/spec.js +17 -0
- package/dist/runner/play-steps.d.ts +2 -0
- package/dist/runner/play-steps.js +59 -0
- package/dist/runner/runner.d.ts +4 -0
- package/dist/runner/runner.js +64 -0
- package/dist/runner/session.d.ts +9 -0
- package/dist/runner/session.js +87 -0
- package/dist/{browser.js → runtime/browser.js} +4 -2
- package/dist/{env-file.js → runtime/env-file.js} +7 -12
- package/dist/{extensions.d.ts → runtime/extensions.d.ts} +2 -5
- package/dist/{extensions.js → runtime/extensions.js} +3 -1
- package/dist/runtime/full-launch.d.ts +1 -0
- package/dist/runtime/full-launch.js +34 -0
- package/dist/runtime/global-flag.d.ts +5 -0
- package/dist/runtime/global-flag.js +18 -0
- package/dist/{playwright-config.d.ts → runtime/playwright-config.d.ts} +1 -1
- package/dist/{playwright.config.js → runtime/playwright.config.js} +3 -2
- package/dist/runtime/run-log.d.ts +2 -0
- package/dist/runtime/run-log.js +17 -0
- package/dist/{video-dir.js → runtime/video-dir.js} +3 -2
- package/dist/{config.d.ts → runtime/waygraph-config.d.ts} +8 -9
- package/dist/{config.js → runtime/waygraph-config.js} +21 -51
- package/dist/{webserver.js → runtime/webserver.js} +5 -30
- package/examples/routed-demo/config/waygraph.config.ts +20 -0
- package/examples/routed-demo/package.json +1 -4
- package/examples/routed-demo/scripts/fixture-server.mjs +1 -1
- package/examples/routed-demo/src/flows/routed-demo-map.flow.ts +2 -4
- package/examples/routed-demo/src/flows/routed-demo.flow.ts +2 -3
- package/examples/routed-demo/src/map/(app_base)/dashboard/_methods/click-widget.block.ts +5 -4
- package/examples/routed-demo/src/map/(app_base)/dashboard/_nav.block.ts +3 -3
- package/examples/routed-demo/src/map/(app_base)/dashboard/_page.block.ts +3 -3
- package/examples/routed-demo/src/map/(external)/docs/_nav.block.ts +3 -3
- package/examples/routed-demo/src/map/(external)/docs/_page.block.ts +3 -3
- package/examples/routed-demo/src/states/routed-demo.states.ts +5 -3
- package/examples/routed-demo/tests/routed-demo.spec.ts +4 -4
- package/examples/routed-demo/tsconfig.json +1 -1
- package/examples/saucedemo/README.md +11 -12
- package/examples/saucedemo/config/waygraph.config.ts +17 -0
- package/examples/saucedemo/docs/CONVENTION.md +5 -7
- package/examples/saucedemo/docs/HELPERS.md +12 -12
- package/examples/saucedemo/package-lock.json +10 -3
- package/examples/saucedemo/package.json +12 -29
- package/examples/saucedemo/src/blocks/SITE-MAP.md +0 -1
- package/examples/saucedemo/src/blocks/saucedemo-web/NAV.md +1 -5
- package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -52
- package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +21 -27
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -9
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +10 -76
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -29
- package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -48
- package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +13 -77
- package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
- package/examples/saucedemo/src/flows/api-demo.flow.ts +26 -18
- package/examples/saucedemo/src/flows/cart-bulk.flow.ts +19 -14
- package/examples/saucedemo/src/flows/cart-continue.flow.ts +10 -8
- package/examples/saucedemo/src/flows/cart-mem.flow.ts +7 -7
- package/examples/saucedemo/src/flows/catalog-logout.flow.ts +13 -8
- package/examples/saucedemo/src/flows/checkout-then-browse-again.flow.ts +26 -48
- package/examples/saucedemo/src/flows/checkout.flow.ts +70 -86
- package/examples/saucedemo/src/flows/device-showcase.flow.ts +24 -25
- package/examples/saucedemo/src/flows/login.flow.ts +11 -18
- package/examples/saucedemo/src/flows/mem-stub-demo.flow.ts +9 -20
- package/examples/saucedemo/src/flows/shop.flow.ts +15 -20
- package/examples/saucedemo/src/flows/smoke.flow.ts +12 -27
- package/examples/saucedemo/src/flows/stub-on-error.flow.ts +24 -43
- package/examples/saucedemo/src/flows/viewer-blocked.flow.ts +26 -34
- package/examples/saucedemo/src/states/checkout.mem-stubs.ts +11 -0
- package/examples/saucedemo/src/states/checkout.states.ts +21 -11
- package/examples/saucedemo/src/stubs/device-showcase.ts +191 -0
- package/examples/saucedemo/src/stubs/login.ts +37 -0
- package/examples/saucedemo/tests/auto-graph.spec.ts +4 -12
- package/examples/saucedemo/tests/chain-flow-episodes.spec.ts +7 -9
- package/examples/saucedemo/tests/submit-login-branch.spec.ts +18 -5
- package/package.json +12 -7
- package/templates/agents/waygraph-planner.agent.md +2 -2
- package/templates/quickstart/README.md +4 -7
- package/templates/quickstart/config/waygraph.config.ts +17 -0
- package/templates/quickstart/docs/CONVENTION.md +5 -6
- package/templates/quickstart/docs/HELPERS.md +11 -9
- package/templates/quickstart/package.json +14 -17
- package/templates/quickstart/src/blocks/SITE-MAP.md +13 -3
- package/templates/quickstart/src/blocks/saucedemo-web/NAV.md +1 -5
- package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -52
- package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +21 -27
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -9
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +10 -76
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -29
- package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -48
- package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +13 -77
- package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
- package/templates/quickstart/src/flows/api-demo.flow.ts +45 -0
- package/templates/quickstart/src/flows/cart-bulk.flow.ts +19 -14
- package/templates/quickstart/src/flows/cart-continue.flow.ts +10 -8
- package/templates/quickstart/src/flows/cart-mem.flow.ts +7 -7
- package/templates/quickstart/src/flows/catalog-logout.flow.ts +13 -8
- package/templates/quickstart/src/flows/checkout-then-browse-again.flow.ts +26 -48
- package/templates/quickstart/src/flows/checkout.flow.ts +70 -63
- package/templates/quickstart/src/flows/device-showcase.flow.ts +24 -25
- package/templates/quickstart/src/flows/login.flow.ts +11 -18
- package/templates/quickstart/src/flows/mem-stub-demo.flow.ts +12 -0
- package/templates/quickstart/src/flows/shop.flow.ts +15 -20
- package/templates/quickstart/src/flows/smoke.flow.ts +12 -27
- package/templates/quickstart/src/flows/stub-on-error.flow.ts +31 -0
- package/templates/quickstart/src/flows/viewer-blocked.flow.ts +26 -34
- package/templates/quickstart/src/states/checkout.mem-stubs.ts +11 -0
- package/templates/quickstart/src/states/checkout.states.ts +21 -11
- package/templates/quickstart/src/stubs/device-showcase.ts +191 -0
- package/templates/quickstart/src/stubs/login.ts +37 -0
- package/templates/quickstart/tests/chain-flow.spec.ts +7 -10
- package/templates/scaffold/README.md +2 -1
- package/templates/scaffold/STRUCTURE.md +5 -4
- package/templates/scaffold/config/waygraph.config.ts +1 -0
- package/templates/scaffold/gitignore +1 -0
- package/templates/scaffold/src/flows/README.md +2 -2
- package/templates/scaffold/src/map/(app_base)/docs/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/docs/_page.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/_methods/add-item.effect.block.ts +4 -4
- package/templates/scaffold/src/map/(app_base)/home/_methods/assert-hello.method.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/_methods/assert-item-added.method.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/_methods/clear-cart.method.block.ts +5 -4
- package/templates/scaffold/src/map/(app_base)/home/_methods/remove-item.effect.block.ts +4 -4
- package/templates/scaffold/src/map/(app_base)/home/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/_page.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/nav-verification-link.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_keys.ts +21 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-body.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-header.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-status.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/pick-extension-interceptor.method.block.ts +5 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-body.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-headers.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/send-request.method.block.ts +5 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-bearer-token.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-headers.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-json-body.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-method.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-query-params.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-url.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/hoppscotch/_page.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/hoppscotch/_states.ts +6 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/settings/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/mailpit/_keys.ts +13 -0
- package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-content.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-received.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/mailpit/_methods/extract-email-link.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/mailpit/_methods/open-message.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/mailpit/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/mailpit/_page.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/mailpit/_states.ts +9 -0
- package/templates/scaffold/src/map/README.md +7 -0
- package/templates/scaffold/src/states/README.md +4 -1
- package/templates/scaffold/src/states/demo.mem-keys.ts +1 -29
- package/templates/scaffold/src/states/demo.states.ts +14 -20
- package/templates/scaffold/tests/hoppscotch.spec.ts +1 -11
- package/templates/scaffold/tests/mail-verify.spec.ts +2 -2
- package/templates/skills/waygraph-blind-pilot.skill.md +2 -6
- package/templates/skills/waygraph-convention.skill.md +23 -14
- package/templates/skills/waygraph-pilot.skill.md +7 -4
- package/dist/auto-session/verbose-log.js +0 -16
- package/dist/auto-session.d.ts +0 -2
- package/dist/auto-session.js +0 -3
- package/dist/cli/discover.d.ts +0 -40
- package/dist/cli/discover.js +0 -148
- package/dist/commands/agent-dive.js +0 -52
- package/dist/commands/check.js +0 -192
- package/dist/commands/map.js +0 -29
- package/dist/commands/run.js +0 -104
- package/dist/commands/traverse.js +0 -177
- package/dist/core/block.d.ts +0 -109
- package/dist/core/blocks/effect.js +0 -23
- package/dist/core/config.js +0 -17
- package/dist/core/engine.d.ts +0 -198
- package/dist/core/flow.d.ts +0 -293
- package/dist/core/flow.js +0 -432
- package/dist/core.d.ts +0 -14
- package/dist/core.js +0 -15
- package/dist/highlights/merge.d.ts +0 -8
- package/dist/highlights/merge.js +0 -173
- package/dist/highlights/stub-ctx.d.ts +0 -10
- package/dist/highlights/stub-ctx.js +0 -331
- package/dist/highlights/types.d.ts +0 -607
- package/dist/highlights.d.ts +0 -9
- package/dist/highlights.js +0 -10
- package/dist/pilot-overlay.d.ts +0 -5
- package/dist/pilot-overlay.js +0 -6
- package/dist/runner/banner-log.js +0 -63
- package/dist/runner/chain-run.js +0 -102
- package/dist/runner/cursor.js +0 -140
- package/dist/runner/demo-log.js +0 -316
- package/dist/runner/device-stage.d.ts +0 -9
- package/dist/runner/device-stage.js +0 -420
- package/dist/runner/discovery.js +0 -105
- package/dist/runner/index.js +0 -2
- package/dist/runner/inpage/banner.d.ts +0 -21
- package/dist/runner/inpage/banner.js +0 -156
- package/dist/runner/inpage/caption.d.ts +0 -3
- package/dist/runner/inpage/caption.js +0 -23
- package/dist/runner/inpage/core.d.ts +0 -4
- package/dist/runner/inpage/core.js +0 -316
- package/dist/runner/inpage/device.d.ts +0 -3
- package/dist/runner/inpage/device.js +0 -211
- package/dist/runner/inpage/network.d.ts +0 -15
- package/dist/runner/inpage/network.js +0 -217
- package/dist/runner/inpage/panel-chrome.js +0 -192
- package/dist/runner/inpage/stamp.js +0 -46
- package/dist/runner/inpage/swipe-zoom.js +0 -220
- package/dist/runner/inpage/todos.js +0 -337
- package/dist/runner/interaction-patch.js +0 -384
- package/dist/runner/main.js +0 -469
- package/dist/runner/network-capture.d.ts +0 -9
- package/dist/runner/network-capture.js +0 -126
- package/dist/runner/overlay-css.d.ts +0 -3
- package/dist/runner/overlay-css.js +0 -377
- package/dist/runner/overlay-install.js +0 -90
- package/dist/runner/overlay-stage.js +0 -110
- package/dist/runner/rings.js +0 -514
- package/dist/runner/seed-mem.js +0 -110
- package/dist/runner/slides.js +0 -278
- package/dist/runner/step-mode.js +0 -703
- package/dist/runner/step-panels.js +0 -729
- package/dist/runner/teardown.js +0 -202
- package/dist/runner/todo-dock.js +0 -142
- package/dist/session/step-overlay.d.ts +0 -37
- package/dist/session/step-overlay.js +0 -244
- package/examples/routed-demo/playwright.config.ts +0 -21
- package/examples/saucedemo/playwright.config.ts +0 -19
- package/examples/saucedemo/scripts/drive-auto-cli.mjs +0 -93
- package/examples/saucedemo/scripts/prove-add-to-cart-menu.mjs +0 -126
- package/examples/saucedemo/scripts/prove-auto-graph.mjs +0 -92
- package/examples/saucedemo/scripts/prove-wrong-login-runtime.mjs +0 -63
- package/examples/saucedemo/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
- package/templates/quickstart/playwright.config.ts +0 -14
- package/templates/quickstart/scripts/drive-auto-cli.mjs +0 -93
- package/templates/quickstart/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
- /package/dist/{commands → cli/commands}/agent-dive-scaffold.d.ts +0 -0
- /package/dist/{commands → cli/commands}/agent-dive.d.ts +0 -0
- /package/dist/{commands → cli/commands}/extensions.d.ts +0 -0
- /package/dist/{commands → cli/commands}/init.d.ts +0 -0
- /package/dist/{commands → cli/commands}/list.d.ts +0 -0
- /package/dist/{commands → cli/commands}/map.d.ts +0 -0
- /package/dist/{commands → cli/commands}/session.d.ts +0 -0
- /package/dist/{commands → cli/commands}/test.d.ts +0 -0
- /package/dist/{commands → cli/commands}/traverse.d.ts +0 -0
- /package/dist/{commands → cli/commands}/try.d.ts +0 -0
- /package/dist/{commands → cli/commands}/upgrade.d.ts +0 -0
- /package/dist/{highlights → demo/narration}/shorthand.js +0 -0
- /package/dist/{pilot-overlay/action-ring.d.ts → demo/overlay/pilot/actions.d.ts} +0 -0
- /package/dist/{ui → demo/overlay/ui}/components/ring.d.ts +0 -0
- /package/dist/{ui → demo/overlay/ui}/stylesheet.d.ts +0 -0
- /package/dist/{ui → demo/overlay/ui}/stylesheet.js +0 -0
- /package/dist/{ui → demo/overlay/ui}/tokens.d.ts +0 -0
- /package/dist/{ui → demo/overlay/ui}/tokens.js +0 -0
- /package/dist/{highlights → demo}/types.js +0 -0
- /package/dist/{auto-session → demo}/verbose-log.d.ts +0 -0
- /package/dist/{selector.d.ts → engine/trait/selector.d.ts} +0 -0
- /package/dist/{selector.js → engine/trait/selector.js} +0 -0
- /package/dist/{trait.js → engine/trait/trait.js} +0 -0
- /package/dist/{session/block-inject.d.ts → manifest/roots.d.ts} +0 -0
- /package/dist/{browser.d.ts → runtime/browser.d.ts} +0 -0
- /package/dist/{env-file.d.ts → runtime/env-file.d.ts} +0 -0
- /package/dist/{playwright-config.js → runtime/playwright-config.js} +0 -0
- /package/dist/{playwright.config.d.ts → runtime/playwright.config.d.ts} +0 -0
- /package/dist/{video-dir.d.ts → runtime/video-dir.d.ts} +0 -0
- /package/dist/{webserver.d.ts → runtime/webserver.d.ts} +0 -0
|
@@ -1,62 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
function walkDir(dir, pattern) {
|
|
6
|
-
const results = [];
|
|
7
|
-
let entries;
|
|
8
|
-
try {
|
|
9
|
-
entries = readdirSync(dir, { withFileTypes: true });
|
|
10
|
-
}
|
|
11
|
-
catch {
|
|
12
|
-
return results;
|
|
13
|
-
}
|
|
14
|
-
for (const entry of entries) {
|
|
15
|
-
const full = join(dir, entry.name);
|
|
16
|
-
if (entry.isDirectory()) {
|
|
17
|
-
if (entry.name === "node_modules" || entry.name === "dist" || entry.name === ".git")
|
|
18
|
-
continue;
|
|
19
|
-
results.push(...walkDir(full, pattern));
|
|
20
|
-
}
|
|
21
|
-
else if (pattern.test(entry.name)) {
|
|
22
|
-
results.push(full);
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
return results;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Real, confirmed bug this fixes: a bare `import(url.href)` is permanently
|
|
29
|
-
* cached by Node's ESM loader for the lifetime of the process, keyed on the
|
|
30
|
-
* exact specifier. `AutoSession.reloadLibrary()` exists specifically so a
|
|
31
|
-
* Block edited on disk mid-session takes effect without restarting the
|
|
32
|
-
* session - but a SECOND `reload` of a file already imported once in this
|
|
33
|
-
* process silently kept returning the FIRST version's content, no matter
|
|
34
|
-
* how many times the file changed on disk after that. A one-shot CLI
|
|
35
|
-
* process (`waygraph graph`, etc.) never hits this - it only ever imports
|
|
36
|
-
* each file once anyway - but a long-running `--detach` session calling
|
|
37
|
-
* `reloadLibrary()` repeatedly does.
|
|
38
|
-
*
|
|
39
|
-
* Fix: bust the cache with the file's own mtime as a query param - a
|
|
40
|
-
* genuinely changed file gets a new specifier (forcing a fresh import); an
|
|
41
|
-
* UNCHANGED file between two reloads keeps hitting the SAME specifier (no
|
|
42
|
-
* unbounded accumulation of dead module instances across many reloads).
|
|
43
|
-
*/
|
|
44
|
-
async function importModule(filePath) {
|
|
45
|
-
const resolved = resolve(filePath);
|
|
46
|
-
const url = new URL(`file://${resolved}`);
|
|
47
|
-
const mtimeMs = statSync(resolved).mtimeMs;
|
|
48
|
-
url.searchParams.set("t", String(mtimeMs));
|
|
49
|
-
return (await import(url.href));
|
|
50
|
-
}
|
|
51
|
-
function isBlockLike(val) {
|
|
52
|
-
if (val === null || typeof val !== "object")
|
|
53
|
-
return false;
|
|
54
|
-
const obj = val;
|
|
55
|
-
if (typeof obj.name !== "string")
|
|
56
|
-
return false;
|
|
57
|
-
const instruction = obj.instruction;
|
|
58
|
-
return instruction !== null && typeof instruction === "object" && typeof instruction?.act === "function";
|
|
59
|
-
}
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { discoverGraph } from "../../analysis/graph.js";
|
|
3
|
+
import { scanProject } from "../../manifest/project.js";
|
|
4
|
+
import { importFresh, walkDir } from "../../manifest/scan.js";
|
|
60
5
|
function isNavBlockMarked(val) {
|
|
61
6
|
const kind = val.__waygraphKind;
|
|
62
7
|
return kind === "nav" || kind === "page";
|
|
@@ -103,56 +48,26 @@ async function wildcardActionRunnable(page, entry, here) {
|
|
|
103
48
|
* Import every `*.block.ts` export keyed by runtime Block `.name`.
|
|
104
49
|
*/
|
|
105
50
|
export async function loadBlockLibrary(projectDir, opts) {
|
|
106
|
-
const { matchBlocksSelect } = await import("../blocks-select.js");
|
|
107
51
|
const byName = new Map();
|
|
108
52
|
const navBlocks = [];
|
|
109
|
-
const
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
}
|
|
123
|
-
catch (err) {
|
|
124
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
125
|
-
if (/second time|playwright/i.test(msg)) {
|
|
126
|
-
console.error(`waygraph auto: skip ${relFile}: ${msg.split("\n")[0]}`);
|
|
127
|
-
}
|
|
128
|
-
continue;
|
|
129
|
-
}
|
|
130
|
-
for (const [exportName, exported] of Object.entries(mod)) {
|
|
131
|
-
if (!isBlockLike(exported))
|
|
132
|
-
continue;
|
|
133
|
-
if (select &&
|
|
134
|
-
!matchBlocksSelect(select, { relFile, blockName: exported.name })) {
|
|
135
|
-
continue;
|
|
136
|
-
}
|
|
137
|
-
const kind = isNavBlockMarked(exported) ? "nav" : "action";
|
|
138
|
-
const entry = {
|
|
139
|
-
block: exported,
|
|
140
|
-
exportName,
|
|
141
|
-
file: taggedFile,
|
|
142
|
-
kind,
|
|
143
|
-
description: typeof exported.description === "string" ? exported.description : "",
|
|
144
|
-
};
|
|
145
|
-
if (byName.has(exported.name)) {
|
|
146
|
-
console.error(`waygraph: inject skipped duplicate Block name "${exported.name}" (${taggedFile})`);
|
|
147
|
-
continue;
|
|
148
|
-
}
|
|
149
|
-
byName.set(exported.name, entry);
|
|
150
|
-
if (kind === "nav" && !navSeen.has(exported.name)) {
|
|
151
|
-
navSeen.add(exported.name);
|
|
152
|
-
navBlocks.push(entry);
|
|
153
|
-
}
|
|
154
|
-
}
|
|
53
|
+
const scan = await scanProject(projectDir, {
|
|
54
|
+
blocksSelect: opts?.blocksSelect,
|
|
55
|
+
inject: opts?.inject,
|
|
56
|
+
flows: false,
|
|
57
|
+
});
|
|
58
|
+
// A Block's required keys get the project's own defaults: every `*.mem-stubs.ts` registers its fakes on import.
|
|
59
|
+
for (const file of walkDir(join(projectDir, "src"), /\.mem-stubs\.ts$/))
|
|
60
|
+
await importFresh(file);
|
|
61
|
+
for (const b of scan.blocks) {
|
|
62
|
+
const kind = isNavBlockMarked(b.block) ? "nav" : "action";
|
|
63
|
+
if (byName.has(b.name)) {
|
|
64
|
+
console.error(`waygraph: inject skipped duplicate Block name "${b.name}" (${b.file})`);
|
|
65
|
+
continue;
|
|
155
66
|
}
|
|
67
|
+
const entry = { block: b.block, exportName: b.exportName, file: b.file, kind, description: b.description };
|
|
68
|
+
byName.set(b.name, entry);
|
|
69
|
+
if (kind === "nav")
|
|
70
|
+
navBlocks.push(entry);
|
|
156
71
|
}
|
|
157
72
|
navBlocks.sort((a, b) => {
|
|
158
73
|
const aUrl = isUrlNav(a) ? 0 : 1;
|
|
@@ -161,27 +76,6 @@ export async function loadBlockLibrary(projectDir, opts) {
|
|
|
161
76
|
});
|
|
162
77
|
return { byName, navBlocks };
|
|
163
78
|
}
|
|
164
|
-
/**
|
|
165
|
-
* @deprecated Use {@link buildExploreMenu} — kept for unit tests.
|
|
166
|
-
*/
|
|
167
|
-
export function exploreChoices(graph, here) {
|
|
168
|
-
const seen = new Set();
|
|
169
|
-
const out = [];
|
|
170
|
-
for (const edge of graph.edges) {
|
|
171
|
-
if (here === null) {
|
|
172
|
-
if (edge.kind !== "nav" || edge.from !== "*")
|
|
173
|
-
continue;
|
|
174
|
-
}
|
|
175
|
-
else if (edge.from !== here && edge.from !== "*") {
|
|
176
|
-
continue;
|
|
177
|
-
}
|
|
178
|
-
if (seen.has(edge.block))
|
|
179
|
-
continue;
|
|
180
|
-
seen.add(edge.block);
|
|
181
|
-
out.push(edge);
|
|
182
|
-
}
|
|
183
|
-
return out.sort((a, b) => a.block.localeCompare(b.block));
|
|
184
|
-
}
|
|
185
79
|
/**
|
|
186
80
|
* Runtime-filtered menu: only Blocks that can run on the live page, grouped forward/back.
|
|
187
81
|
*/
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ApplyPathResult, ApplyPickResult, AutoSessionInit, ConsoleLogEntry, InspectDomOptions, InspectDomResult, SessionSnapshot, StorageSnapshot, StubFileKind, TraceStep } from "./helpers.js";
|
|
2
|
-
import type { PilotHighlightFixtures } from "
|
|
2
|
+
import type { PilotHighlightFixtures } from "../../demo/overlay/pilot/fixtures.js";
|
|
3
3
|
/**
|
|
4
4
|
* Non-interactive explore session: same graph/library/mem/browser setup
|
|
5
5
|
* `runAutoExplore` runs in `--cli` mode, driven by `applyPick` instead of a
|
|
@@ -1,16 +1,21 @@
|
|
|
1
|
-
// Split out of the former 1,078-line auto-session.ts (see src/ARCHITECTURE.md). Behavior unchanged.
|
|
2
1
|
import { CONSOLE_LOG_MAX_ENTRIES, FULL_MODE_DEFAULT_DEPTH, FULL_MODE_MAX_NODES, FULL_MODE_MAX_TEXT_LENGTH, TRACE_MAX_STEPS, buildSessionSnapshot, parsePick, stubFilePath, stubPhaseHasContent, walkFullDom } from "./helpers.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
2
|
+
import { keepOverlayOnNavigation } from "../../demo/overlay/reattach.js";
|
|
3
|
+
import { installPersistentPilotOverlay, showPilotActivity, showPilotVision } from "../../demo/overlay/pilot/shell.js";
|
|
4
|
+
import { showPilotFixtures } from "../../demo/overlay/pilot/fixtures.js";
|
|
5
|
+
import { instrumentPilotActions } from "../../demo/overlay/pilot/actions.js";
|
|
6
|
+
import { phaseToOverlayFixtures, describeOverlayFixtures } from "../../demo/overlay/phase-fixtures.js";
|
|
7
|
+
import { updatePilotOverlay } from "../pilot/panel.js";
|
|
8
|
+
import { buildExploreContext, buildExploreMenu } from "../auto/explore.js";
|
|
9
|
+
import { MemPage } from "../../engine/mem/mem.js";
|
|
10
|
+
import { Engine } from "../../engine/engine.js";
|
|
11
|
+
import { detectHere, ensureLivePage, ensureMem, runOneBlock, seedDefaultMem } from "../auto/auto.js";
|
|
12
|
+
import { collectKnownInteractionSelectors, unmappedInteractionsPageScript } from "../../analysis/coverage-gap.js";
|
|
13
|
+
import { runStubPhase } from "../../demo/narration/narration.js";
|
|
14
|
+
import { verboseLog } from "../../demo/verbose-log.js";
|
|
15
|
+
import { findBlockPathDetailed } from "../../analysis/graph.js";
|
|
16
|
+
import { configuredExtensions, resolveBaseUrl } from "../../runtime/waygraph-config.js";
|
|
17
|
+
import { chromiumExecutablePath, launchContext } from "../../runtime/browser.js";
|
|
18
|
+
import { ignorePageGone, ignoreTimeout } from "../../engine/page-gone.js";
|
|
14
19
|
/**
|
|
15
20
|
* Non-interactive explore session: same graph/library/mem/browser setup
|
|
16
21
|
* `runAutoExplore` runs in `--cli` mode, driven by `applyPick` instead of a
|
|
@@ -101,20 +106,18 @@ export class AutoSession {
|
|
|
101
106
|
const page = await context.newPage();
|
|
102
107
|
instrumentPilotActions(page, headless ? 0 : 450);
|
|
103
108
|
if (startUrl) {
|
|
104
|
-
await page.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(
|
|
105
|
-
await page.waitForLoadState("load").catch(
|
|
109
|
+
await page.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(ignorePageGone);
|
|
110
|
+
await page.waitForLoadState("load").catch(ignoreTimeout);
|
|
106
111
|
}
|
|
107
112
|
else {
|
|
108
|
-
await page.goto("about:blank").catch(
|
|
113
|
+
await page.goto("about:blank").catch(ignorePageGone);
|
|
109
114
|
}
|
|
110
115
|
const knownInteractionSelectors = collectKnownInteractionSelectors(init.projectDir, library, init.inject);
|
|
111
116
|
const session = new AutoSession(init.projectDir, init.inject, init.blocksSelect, graph, library, mem, engine, closeBrowser, context, page, startUrl, init.sessionId, knownInteractionSelectors, headless);
|
|
112
|
-
page
|
|
113
|
-
void session.repaintOverlayAfterNavigation();
|
|
114
|
-
});
|
|
117
|
+
keepOverlayOnNavigation(page, () => session.repaintOverlayAfterNavigation());
|
|
115
118
|
if (!headless) {
|
|
116
|
-
await session.bootstrapOverlay().catch(
|
|
117
|
-
await page.bringToFront().catch(
|
|
119
|
+
await session.bootstrapOverlay().catch(ignorePageGone);
|
|
120
|
+
await page.bringToFront().catch(ignorePageGone);
|
|
118
121
|
}
|
|
119
122
|
// Attached once, on the page created here - `ensureLivePage` only swaps
|
|
120
123
|
// to a fresh Page if the current one closed (a rare case, e.g. the human
|
|
@@ -204,11 +207,11 @@ export class AutoSession {
|
|
|
204
207
|
/** Re-apply cached overlay state after navigation (init script restores shell only). */
|
|
205
208
|
async repaintOverlayAfterNavigation() {
|
|
206
209
|
if (this.lastOverlayInfo) {
|
|
207
|
-
await updatePilotOverlay(this.page, this.lastOverlayInfo).catch(
|
|
210
|
+
await updatePilotOverlay(this.page, this.lastOverlayInfo).catch(ignorePageGone);
|
|
208
211
|
return;
|
|
209
212
|
}
|
|
210
213
|
if (!this.headless) {
|
|
211
|
-
await this.bootstrapOverlay().catch(
|
|
214
|
+
await this.bootstrapOverlay().catch(ignorePageGone);
|
|
212
215
|
}
|
|
213
216
|
}
|
|
214
217
|
/**
|
|
@@ -233,7 +236,7 @@ export class AutoSession {
|
|
|
233
236
|
knownPathnames,
|
|
234
237
|
knownSelectors: this.knownInteractionSelectors,
|
|
235
238
|
};
|
|
236
|
-
await this.page.evaluate(unmappedInteractionsPageScript, payload).catch(
|
|
239
|
+
await this.page.evaluate(unmappedInteractionsPageScript, payload).catch(ignorePageGone);
|
|
237
240
|
}
|
|
238
241
|
/** Pure getter - no Block runs, no mem/page mutation. */
|
|
239
242
|
async currentSnapshot() {
|
|
@@ -342,7 +345,7 @@ export class AutoSession {
|
|
|
342
345
|
const fixtures = phaseToOverlayFixtures(phase, holdMs);
|
|
343
346
|
for (const line of describeOverlayFixtures(tag, fixtures))
|
|
344
347
|
verboseLog("pilot", line);
|
|
345
|
-
await showPilotFixtures(this.page, fixtures).catch(
|
|
348
|
+
await showPilotFixtures(this.page, fixtures).catch(ignorePageGone);
|
|
346
349
|
}
|
|
347
350
|
async runNamedBlock(entry, expectedTo, instanceOption) {
|
|
348
351
|
const from = this.here;
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import type { StubPhaseResult } from "
|
|
2
|
-
import type {
|
|
3
|
-
import type {
|
|
1
|
+
import type { StubPhaseResult } from "../../engine/stub/stub.js";
|
|
2
|
+
import type { ExploreMenu } from "../auto/explore.js";
|
|
3
|
+
import type { BlockEntry } from "../../manifest/project.js";
|
|
4
|
+
import type { PickResult } from "../auto/auto.js";
|
|
4
5
|
/** True when a stub-phase result actually carries authored content worth keeping. */
|
|
5
6
|
export declare function stubPhaseHasContent(r: StubPhaseResult): boolean;
|
|
7
|
+
/** One available move in a session snapshot: a Block and the Checkpoint it leads to. */
|
|
6
8
|
export interface SessionSnapshotEdge {
|
|
7
9
|
/** 1-based, matching the numbers a human/agent picks by (same as printCliMenu). */
|
|
8
10
|
index: number;
|
|
@@ -12,10 +14,12 @@ export interface SessionSnapshotEdge {
|
|
|
12
14
|
label?: string;
|
|
13
15
|
description?: string;
|
|
14
16
|
}
|
|
17
|
+
/** A group of moves in a session snapshot, by page. */
|
|
15
18
|
export interface SessionSnapshotSection {
|
|
16
19
|
title: string;
|
|
17
20
|
edges: SessionSnapshotEdge[];
|
|
18
21
|
}
|
|
22
|
+
/** The state of a live session: where it is, the moves available from there, and the trace so far. */
|
|
19
23
|
export interface SessionSnapshot {
|
|
20
24
|
here: string | null;
|
|
21
25
|
sections: SessionSnapshotSection[];
|
|
@@ -82,11 +86,12 @@ export declare function walkFullDom(root: Element, caps: FullDomCaps): {
|
|
|
82
86
|
tree: FullDomNode;
|
|
83
87
|
truncated: boolean;
|
|
84
88
|
};
|
|
89
|
+
/** What `AutoSession.start` needs: project, selection, headless mode and the session id. */
|
|
85
90
|
export interface AutoSessionInit {
|
|
86
91
|
projectDir: string;
|
|
87
92
|
baseURL?: string;
|
|
88
93
|
startUrl?: string;
|
|
89
|
-
blocksSelect?: import("
|
|
94
|
+
blocksSelect?: import("../../manifest/select.js").BlocksSelect;
|
|
90
95
|
/** Absolute paths — merged Block libraries (see `waygraph browser --inject`). */
|
|
91
96
|
inject?: string[];
|
|
92
97
|
/** When true, open about:blank instead of baseURL/startUrl (browser default). */
|
|
@@ -102,6 +107,7 @@ export interface AutoSessionInit {
|
|
|
102
107
|
*/
|
|
103
108
|
sessionId?: string;
|
|
104
109
|
}
|
|
110
|
+
/** The result of running one menu pick in a live session. */
|
|
105
111
|
export type ApplyPickResult = {
|
|
106
112
|
ok: true;
|
|
107
113
|
snapshot: SessionSnapshot;
|
|
@@ -110,6 +116,7 @@ export type ApplyPickResult = {
|
|
|
110
116
|
ok: false;
|
|
111
117
|
error: string;
|
|
112
118
|
};
|
|
119
|
+
/** The result of running a multi-step route in a live session. */
|
|
113
120
|
export type ApplyPathResult = {
|
|
114
121
|
ok: true;
|
|
115
122
|
path: string[];
|
|
@@ -133,7 +140,7 @@ export interface TraceStep {
|
|
|
133
140
|
* Resolved demo-narration fixtures (highlights/todos/device), when the
|
|
134
141
|
* Block actually authors `stubBefore`/`stubAfter`/`stubOnError` - the same
|
|
135
142
|
* data `waygraph demo`'s lifecycle logging already computes (`runStubPhase`
|
|
136
|
-
* in
|
|
143
|
+
* in demo/narration/index.ts), reused here for extra context on what a step meant to
|
|
137
144
|
* convey. Omitted when the Block has none, or the result carries nothing.
|
|
138
145
|
*/
|
|
139
146
|
stubBefore?: StubPhaseResult;
|
|
@@ -141,6 +148,7 @@ export interface TraceStep {
|
|
|
141
148
|
stubOnError?: StubPhaseResult;
|
|
142
149
|
}
|
|
143
150
|
export declare const TRACE_MAX_STEPS = 500;
|
|
151
|
+
/** Which stub file a live session wrote: before, after or on-error. */
|
|
144
152
|
export type StubFileKind = "image" | "pdf" | "video";
|
|
145
153
|
/**
|
|
146
154
|
* Real, minimal, valid fixture files bundled at `assets/stubs/` - not
|
|
@@ -180,11 +188,13 @@ export interface ConsoleLogEntry {
|
|
|
180
188
|
timestamp: string;
|
|
181
189
|
}
|
|
182
190
|
export declare const CONSOLE_LOG_MAX_ENTRIES = 200;
|
|
191
|
+
/** One service worker registration as reported by a live session. */
|
|
183
192
|
export interface ServiceWorkerRegistrationInfo {
|
|
184
193
|
scope: string;
|
|
185
194
|
activeUrl?: string;
|
|
186
195
|
state?: string;
|
|
187
196
|
}
|
|
197
|
+
/** One cookie as reported by a live session's `auto cookies`. */
|
|
188
198
|
export interface CookieInfo {
|
|
189
199
|
name: string;
|
|
190
200
|
value: string;
|
|
@@ -193,6 +203,7 @@ export interface CookieInfo {
|
|
|
193
203
|
httpOnly: boolean;
|
|
194
204
|
secure: boolean;
|
|
195
205
|
}
|
|
206
|
+
/** Local and session storage of a live session's page. */
|
|
196
207
|
export interface StorageSnapshot {
|
|
197
208
|
localStorage: Record<string, string>;
|
|
198
209
|
sessionStorage: Record<string, string>;
|
|
@@ -137,7 +137,7 @@ export const TRACE_MAX_STEPS = 500;
|
|
|
137
137
|
* exist for more than a moment.
|
|
138
138
|
*/
|
|
139
139
|
export function stubFilePath(kind) {
|
|
140
|
-
const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), "..", "..");
|
|
140
|
+
const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), "..", "..", "..");
|
|
141
141
|
const names = {
|
|
142
142
|
image: "stub.png",
|
|
143
143
|
pdf: "stub.pdf",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { AutoSession
|
|
2
|
-
import type
|
|
3
|
-
|
|
1
|
+
import { AutoSession } from "./auto-session.js";
|
|
2
|
+
import { type AutoSessionInit, type SessionSnapshot, type InspectDomOptions, type DomSnapshot, type TraceStep, type ApplyPathResult, type ConsoleLogEntry, type StorageSnapshot, type StubFileKind } from "./helpers.js";
|
|
3
|
+
import type { PilotHighlightFixtures } from "../../demo/overlay/pilot/fixtures.js";
|
|
4
4
|
export interface SessionMeta {
|
|
5
5
|
sessionId: string;
|
|
6
6
|
socketPath: string;
|
|
@@ -128,8 +128,10 @@ export declare function serveSession(session: AutoSession, projectDir: string, s
|
|
|
128
128
|
export declare function runAutoServeCommand(init: AutoSessionInit, sessionId: string): Promise<void>;
|
|
129
129
|
/**
|
|
130
130
|
* Parent-side: spawns a detached background process running the same
|
|
131
|
-
* explore session as a socket server, waits for it to
|
|
132
|
-
*
|
|
131
|
+
* explore session as a socket server, waits for it to say it is serving (one
|
|
132
|
+
* message over an IPC channel, then disconnect), and returns its identity. A
|
|
133
|
+
* child that exits or stays silent past the timeout fails the start, and a silent
|
|
134
|
+
* one is stopped. Recurses through the
|
|
133
135
|
* existing `bin/waygraph` launcher (same tsx/esm registration every other
|
|
134
136
|
* invocation already gets) with the hidden `__auto-serve` command, rather
|
|
135
137
|
* than re-implementing that resolution here.
|
|
@@ -14,7 +14,8 @@ import { fileURLToPath } from "node:url";
|
|
|
14
14
|
import { randomBytes } from "node:crypto";
|
|
15
15
|
import { createInterface } from "node:readline/promises";
|
|
16
16
|
import { stdin as input, stdout as output } from "node:process";
|
|
17
|
-
import { AutoSession
|
|
17
|
+
import { AutoSession } from "./auto-session.js";
|
|
18
|
+
import { ignorePageGone } from "../../engine/page-gone.js";
|
|
18
19
|
function sessionDir(projectDir) {
|
|
19
20
|
return join(projectDir, ".waygraph-auto");
|
|
20
21
|
}
|
|
@@ -318,7 +319,7 @@ export async function serveSession(session, projectDir, sessionId, headless = tr
|
|
|
318
319
|
return;
|
|
319
320
|
shuttingDown = true;
|
|
320
321
|
server.close();
|
|
321
|
-
await session.close().catch(
|
|
322
|
+
await session.close().catch(ignorePageGone);
|
|
322
323
|
removeSessionFiles(projectDir, sessionId);
|
|
323
324
|
process.exit(0);
|
|
324
325
|
}
|
|
@@ -343,14 +344,19 @@ export async function serveSession(session, projectDir, sessionId, headless = tr
|
|
|
343
344
|
export async function runAutoServeCommand(init, sessionId) {
|
|
344
345
|
const session = await AutoSession.start({ ...init, sessionId });
|
|
345
346
|
await serveSession(session, init.projectDir, sessionId, init.headless ?? true);
|
|
347
|
+
// Tell the parent that spawned us (spawnDetachedSession) we are serving, then let it go.
|
|
348
|
+
process.send?.({ ready: true });
|
|
349
|
+
process.disconnect?.();
|
|
346
350
|
// Keep the event loop alive - the listening server already does this,
|
|
347
351
|
// but await forever here documents the intent for a reader.
|
|
348
352
|
await new Promise(() => { });
|
|
349
353
|
}
|
|
350
354
|
/**
|
|
351
355
|
* Parent-side: spawns a detached background process running the same
|
|
352
|
-
* explore session as a socket server, waits for it to
|
|
353
|
-
*
|
|
356
|
+
* explore session as a socket server, waits for it to say it is serving (one
|
|
357
|
+
* message over an IPC channel, then disconnect), and returns its identity. A
|
|
358
|
+
* child that exits or stays silent past the timeout fails the start, and a silent
|
|
359
|
+
* one is stopped. Recurses through the
|
|
354
360
|
* existing `bin/waygraph` launcher (same tsx/esm registration every other
|
|
355
361
|
* invocation already gets) with the hidden `__auto-serve` command, rather
|
|
356
362
|
* than re-implementing that resolution here.
|
|
@@ -358,12 +364,12 @@ export async function runAutoServeCommand(init, sessionId) {
|
|
|
358
364
|
export async function spawnDetachedSession(init, readyTimeoutMs = 20_000) {
|
|
359
365
|
const sessionId = generateSessionId();
|
|
360
366
|
mkdirSync(sessionDir(init.projectDir), { recursive: true });
|
|
361
|
-
// This file compiles to dist/
|
|
367
|
+
// This file compiles to dist/live/auto-session/ipc.js - three levels down from the package
|
|
362
368
|
// root, not one. Same bug class as cli/util.ts's own packageRoot(); see its comment.
|
|
363
|
-
const pkgRoot = join(dirname(fileURLToPath(import.meta.url)), "..", "..");
|
|
369
|
+
const pkgRoot = join(dirname(fileURLToPath(import.meta.url)), "..", "..", "..");
|
|
364
370
|
const require = createRequire(join(pkgRoot, "package.json"));
|
|
365
371
|
const tsxEsm = require.resolve("tsx/esm");
|
|
366
|
-
const cli = join(pkgRoot, "dist", "cli.js");
|
|
372
|
+
const cli = join(pkgRoot, "dist", "cli", "cli.js");
|
|
367
373
|
const logFd = openSync(logPathFor(init.projectDir, sessionId), "a");
|
|
368
374
|
const args = ["--import", tsxEsm, cli, "__auto-serve", init.projectDir, "--session-id", sessionId];
|
|
369
375
|
if (init.baseURL)
|
|
@@ -382,20 +388,29 @@ export async function spawnDetachedSession(init, readyTimeoutMs = 20_000) {
|
|
|
382
388
|
// Spawn cli.js directly — not bin/waygraph (which would fork a second Node).
|
|
383
389
|
const child = spawn(process.execPath, args, {
|
|
384
390
|
detached: true,
|
|
385
|
-
stdio: ["ignore", logFd, logFd],
|
|
391
|
+
stdio: ["ignore", logFd, logFd, "ipc"],
|
|
386
392
|
windowsHide: true,
|
|
387
393
|
env: process.env,
|
|
388
394
|
});
|
|
395
|
+
const log = logPathFor(init.projectDir, sessionId);
|
|
396
|
+
const outcome = await new Promise((done) => {
|
|
397
|
+
const timer = setTimeout(() => done("timeout"), readyTimeoutMs);
|
|
398
|
+
child.once("message", () => (clearTimeout(timer), done("ready")));
|
|
399
|
+
child.once("exit", (code) => (clearTimeout(timer), done({ exit: code })));
|
|
400
|
+
});
|
|
401
|
+
if (child.connected)
|
|
402
|
+
child.disconnect();
|
|
389
403
|
child.unref();
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
if (meta)
|
|
394
|
-
return meta;
|
|
395
|
-
await new Promise((r) => setTimeout(r, 150));
|
|
404
|
+
if (outcome === "timeout") {
|
|
405
|
+
child.kill("SIGTERM");
|
|
406
|
+
throw new Error(`session "${sessionId}" did not become ready within ${readyTimeoutMs}ms (stopped it) - check ${log} for errors`);
|
|
396
407
|
}
|
|
397
|
-
|
|
398
|
-
`
|
|
408
|
+
if (outcome !== "ready")
|
|
409
|
+
throw new Error(`session "${sessionId}" exited (code ${outcome.exit}) before it was ready - check ${log}`);
|
|
410
|
+
const meta = readSessionMeta(init.projectDir, sessionId);
|
|
411
|
+
if (!meta)
|
|
412
|
+
throw new Error(`session "${sessionId}" said it was ready but wrote no metadata - check ${log}`);
|
|
413
|
+
return meta;
|
|
399
414
|
}
|
|
400
415
|
/** Stop one detached session (SIGTERM + cleanup metadata/socket). */
|
|
401
416
|
export function stopBrowserSession(projectDir, sessionId) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AutoSessionInit } from "
|
|
1
|
+
import type { AutoSessionInit } from "./helpers.js";
|
|
2
2
|
export interface BrowserStartInit extends AutoSessionInit {
|
|
3
3
|
/** Preset names or paths; resolved before spawn. */
|
|
4
4
|
injectTokens?: string[];
|
|
@@ -12,4 +12,3 @@ export interface BrowserStartResult {
|
|
|
12
12
|
}
|
|
13
13
|
/** Always spawns a new detached session — does not stop or reuse existing ones. */
|
|
14
14
|
export declare function browserStart(init: BrowserStartInit): Promise<BrowserStartResult>;
|
|
15
|
-
export { listBrowserSessions, stopBrowserSession, stopAllBrowserSessions, type SessionMeta, } from "./auto-session-ipc.js";
|
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
* Session lifecycle is explicit: `browser sessions` lists what's live;
|
|
7
7
|
* `browser start` always opens another; `browser attach` / `browser stop` pick one up or shut it down.
|
|
8
8
|
*/
|
|
9
|
-
import { spawnDetachedSession } from "./
|
|
10
|
-
import { resolveInjectRoots } from "
|
|
9
|
+
import { spawnDetachedSession } from "./ipc.js";
|
|
10
|
+
import { resolveInjectRoots } from "../../manifest/roots.js";
|
|
11
11
|
/** Always spawns a new detached session — does not stop or reuse existing ones. */
|
|
12
12
|
export async function browserStart(init) {
|
|
13
13
|
const inject = init.inject ??
|
|
@@ -26,4 +26,3 @@ export async function browserStart(init) {
|
|
|
26
26
|
inject,
|
|
27
27
|
};
|
|
28
28
|
}
|
|
29
|
-
export { listBrowserSessions, stopBrowserSession, stopAllBrowserSessions, } from "./auto-session-ipc.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { SessionSnapshot } from "../auto-session.js";
|
|
1
|
+
import type { SessionSnapshot } from "../auto-session/helpers.js";
|
|
2
2
|
import type { Page } from "@playwright/test";
|
|
3
3
|
/** Minimal shape needed to render the graph tree - matches WaygraphGraph. */
|
|
4
4
|
interface PilotOverlayGraph {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { ensureInstalled } from "
|
|
1
|
+
import { ensureInstalled } from "../../demo/overlay/pilot/shell.js";
|
|
2
|
+
import { ignorePageGone } from "../../engine/page-gone.js";
|
|
2
3
|
/**
|
|
3
4
|
* Refreshes the badge text and the (possibly-collapsed) panel's two tabs
|
|
4
5
|
* ("Here" - current live menu; "All nodes" - whole project graph as a
|
|
@@ -10,6 +11,8 @@ export async function updatePilotOverlay(page, info) {
|
|
|
10
11
|
await ensureInstalled(page);
|
|
11
12
|
await page
|
|
12
13
|
.evaluate(async ({ sessionId, snapshot, graph }) => {
|
|
14
|
+
// Block names, labels and descriptions can carry the page's own text (an Effect's instance label is read off
|
|
15
|
+
// the live DOM), so they go in as text nodes (__wgEl), never as markup.
|
|
13
16
|
const badge = __wgById("wg-pilot-badge");
|
|
14
17
|
const current = __wgById("wg-pilot-panel-current");
|
|
15
18
|
const graphPanel = __wgById("wg-pilot-panel-graph");
|
|
@@ -21,26 +24,16 @@ export async function updatePilotOverlay(page, info) {
|
|
|
21
24
|
badge.textContent = `Waygraph Pilot - ${idPart} - ${hereLabel}`;
|
|
22
25
|
const totalEdges = snapshot.sections.reduce((n, s) => n + s.edges.length, 0);
|
|
23
26
|
if (totalEdges === 0) {
|
|
24
|
-
current.
|
|
25
|
-
? '<div class="wg-pilot-empty">Blank page — no Block moves yet. Use auto goto or a nav Block when ready.</div>'
|
|
26
|
-
: '<div class="wg-pilot-empty">No Block moves from here right now.</div>';
|
|
27
|
+
__wgSet(current, __wgEl("div", { class: "wg-pilot-empty" }, onBlank ? "Blank page — no Block moves yet. Use auto goto or a nav Block when ready." : "No Block moves from here right now."));
|
|
27
28
|
}
|
|
28
29
|
else {
|
|
29
|
-
current
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
const desc = edge.description ? ` - ${edge.description}` : "";
|
|
34
|
-
const label = edge.label ? ` (${edge.label})` : "";
|
|
35
|
-
return `<div class="wg-pilot-edge">[${edge.index}] <span class="wg-pilot-kind">${edge.kind}</span> ${edge.block}${label} -> ${edge.to}${desc}</div>`;
|
|
36
|
-
})
|
|
37
|
-
.join("");
|
|
38
|
-
return `<div class="wg-pilot-section">${section.title}</div>${rows}`;
|
|
39
|
-
})
|
|
40
|
-
.join("");
|
|
30
|
+
__wgSet(current, snapshot.sections.map((section) => [
|
|
31
|
+
__wgEl("div", { class: "wg-pilot-section" }, section.title),
|
|
32
|
+
section.edges.map((edge) => __wgEl("div", { class: "wg-pilot-edge" }, `[${edge.index}] `, __wgEl("span", { class: "wg-pilot-kind" }, edge.kind), ` ${edge.block}${edge.label ? ` (${edge.label})` : ""} -> ${edge.to}${edge.description ? ` - ${edge.description}` : ""}`)),
|
|
33
|
+
]));
|
|
41
34
|
}
|
|
42
35
|
if (!graph || graph.nodes.length === 0) {
|
|
43
|
-
graphPanel
|
|
36
|
+
__wgSet(graphPanel, __wgEl("div", { class: "wg-pilot-empty" }, "No graph data yet."));
|
|
44
37
|
return;
|
|
45
38
|
}
|
|
46
39
|
// Flat indented-text tree - the ORIGINAL "All nodes" rendering.
|
|
@@ -49,18 +42,14 @@ export async function updatePilotOverlay(page, info) {
|
|
|
49
42
|
// when Mermaid genuinely can't load (e.g. offline), not the primary
|
|
50
43
|
// rendering anymore.
|
|
51
44
|
const renderTextTree = () => {
|
|
52
|
-
graphPanel
|
|
53
|
-
.map((node) => {
|
|
45
|
+
__wgSet(graphPanel, graph.nodes.map((node) => {
|
|
54
46
|
const outgoing = graph.edges.filter((e) => e.from === node.checkpoint || e.from === "*");
|
|
55
47
|
const rows = outgoing.length
|
|
56
|
-
? outgoing
|
|
57
|
-
|
|
58
|
-
.join("")
|
|
59
|
-
: '<div class="wg-pilot-graph-edge wg-pilot-empty">(no outgoing edges)</div>';
|
|
48
|
+
? outgoing.map((e) => __wgEl("div", { class: "wg-pilot-graph-edge" }, __wgEl("span", { class: "wg-pilot-kind" }, e.kind), ` ${e.block} -> ${e.to}`))
|
|
49
|
+
: [__wgEl("div", { class: "wg-pilot-graph-edge wg-pilot-empty" }, "(no outgoing edges)")];
|
|
60
50
|
const here = node.checkpoint === snapshot.here ? " (here)" : "";
|
|
61
|
-
return
|
|
62
|
-
})
|
|
63
|
-
.join("");
|
|
51
|
+
return __wgEl("div", { class: "wg-pilot-graph-node" }, __wgEl("div", { class: "wg-pilot-graph-checkpoint" }, node.checkpoint + here), rows);
|
|
52
|
+
}));
|
|
64
53
|
};
|
|
65
54
|
try {
|
|
66
55
|
const w = window;
|
|
@@ -80,10 +69,11 @@ export async function updatePilotOverlay(page, info) {
|
|
|
80
69
|
throw new Error("mermaid did not attach to window after load");
|
|
81
70
|
// Real, direct user request: "left to right stuff. maybe mermaid?
|
|
82
71
|
// with square ish arrows???" - LR layout, linear (non-curvy) edges.
|
|
83
|
-
|
|
72
|
+
// strict: Mermaid escapes label text itself; plain SVG labels (no HTML) so the result parses as SVG.
|
|
73
|
+
w.mermaid.initialize({ startOnLoad: false, theme: "dark", securityLevel: "strict", flowchart: { curve: "linear", htmlLabels: false } });
|
|
84
74
|
const sanitize = (s) => s.replace(/[^A-Za-z0-9_]/g, "_");
|
|
85
75
|
// Every Nav Block gets a `from:"*"` wildcard edge for pathfinding
|
|
86
|
-
// (see auto
|
|
76
|
+
// (see live/auto/explore.ts's own isUrlNav comment). Real, screenshot-
|
|
87
77
|
// confirmed finding, TWICE over:
|
|
88
78
|
// 1. Collapsing all of these into one shared "Anywhere" hub node
|
|
89
79
|
// still broke the layout - ~9 of 10 Checkpoints have their own
|
|
@@ -137,8 +127,10 @@ export async function updatePilotOverlay(page, info) {
|
|
|
137
127
|
lines.push(` ${sanitize(e.from)} -->|${e.block}| ${sanitize(e.to)}`);
|
|
138
128
|
}
|
|
139
129
|
const { svg } = await w.mermaid.render(`wg-mermaid-${Date.now()}`, lines.join("\n"));
|
|
140
|
-
|
|
141
|
-
|
|
130
|
+
const diagram = __wgSvg(svg);
|
|
131
|
+
if (diagram.nodeName !== "svg")
|
|
132
|
+
throw new Error("mermaid output did not parse as SVG");
|
|
133
|
+
__wgSet(graphPanel, diagram, __wgEl("div", { class: "wg-pilot-graph-note" }, '[nav] = also directly reachable via sidebar/URL from anywhere (not drawn as an edge - see the "Here" tab for what\'s live on this page).'));
|
|
142
134
|
// Real, direct user request: "i hope it is zoomed to the current
|
|
143
135
|
// node" - the diagram is usually bigger than the panel, so scroll
|
|
144
136
|
// (not zoom - the SVG itself stays real size, legible) the "here"
|
|
@@ -151,5 +143,5 @@ export async function updatePilotOverlay(page, info) {
|
|
|
151
143
|
renderTextTree();
|
|
152
144
|
}
|
|
153
145
|
}, { sessionId: info.sessionId, snapshot: info.snapshot, graph: info.graph ?? null })
|
|
154
|
-
.catch(
|
|
146
|
+
.catch(ignorePageGone);
|
|
155
147
|
}
|