waygraph 0.15.54 → 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 +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/{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 +3 -11
- package/dist/{highlights → demo/narration}/demo-pace.js +5 -11
- package/dist/{highlights → demo/narration}/device.d.ts +2 -2
- package/dist/{highlights → demo/narration}/device.js +1 -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/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 +9 -7
- package/dist/{core → engine/block}/compose.js +1 -1
- 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/{core → engine/flow}/map-builder.d.ts +34 -39
- package/dist/{core → engine/flow}/map-builder.js +45 -47
- 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/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 -254
- 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 +6 -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 +3 -3
- package/dist/{session → live/pilot}/pilot.js +4 -4
- package/dist/{traverse/run.d.ts → live/traverse/traverse.d.ts} +1 -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/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 +10 -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/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 -294
- 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 -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/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/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/{trait.js → engine/trait/trait.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,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,6 +1,7 @@
|
|
|
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;
|
|
6
7
|
/** One available move in a session snapshot: a Block and the Checkpoint it leads to. */
|
|
@@ -90,7 +91,7 @@ export interface AutoSessionInit {
|
|
|
90
91
|
projectDir: string;
|
|
91
92
|
baseURL?: string;
|
|
92
93
|
startUrl?: string;
|
|
93
|
-
blocksSelect?: import("
|
|
94
|
+
blocksSelect?: import("../../manifest/select.js").BlocksSelect;
|
|
94
95
|
/** Absolute paths — merged Block libraries (see `waygraph browser --inject`). */
|
|
95
96
|
inject?: string[];
|
|
96
97
|
/** When true, open about:blank instead of baseURL/startUrl (browser default). */
|
|
@@ -139,7 +140,7 @@ export interface TraceStep {
|
|
|
139
140
|
* Resolved demo-narration fixtures (highlights/todos/device), when the
|
|
140
141
|
* Block actually authors `stubBefore`/`stubAfter`/`stubOnError` - the same
|
|
141
142
|
* data `waygraph demo`'s lifecycle logging already computes (`runStubPhase`
|
|
142
|
-
* in
|
|
143
|
+
* in demo/narration/index.ts), reused here for extra context on what a step meant to
|
|
143
144
|
* convey. Omitted when the Block has none, or the result carries nothing.
|
|
144
145
|
*/
|
|
145
146
|
stubBefore?: StubPhaseResult;
|
|
@@ -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
|
}
|
|
@@ -28,9 +28,9 @@
|
|
|
28
28
|
* hand-picking indices from each status response) that proved this needs no
|
|
29
29
|
* new execution primitive.
|
|
30
30
|
*/
|
|
31
|
-
import { type WaygraphGraph } from "
|
|
32
|
-
import { type BrowserStartInit } from "
|
|
33
|
-
import type { SessionSnapshot } from "../auto-session.js";
|
|
31
|
+
import { type WaygraphGraph } from "../../analysis/graph.js";
|
|
32
|
+
import { type BrowserStartInit } from "../auto-session/start.js";
|
|
33
|
+
import type { SessionSnapshot } from "../auto-session/helpers.js";
|
|
34
34
|
/** What `pilotStart` returns: the session id, socket path and first snapshot. */
|
|
35
35
|
export interface PilotStartResult {
|
|
36
36
|
sessionId: string;
|
|
@@ -28,9 +28,9 @@
|
|
|
28
28
|
* hand-picking indices from each status response) that proved this needs no
|
|
29
29
|
* new execution primitive.
|
|
30
30
|
*/
|
|
31
|
-
import { discoverGraph } from "
|
|
32
|
-
import { requestSession, resolveSessionMeta, } from "
|
|
33
|
-
import { browserStart } from "
|
|
31
|
+
import { discoverGraph } from "../../analysis/graph.js";
|
|
32
|
+
import { requestSession, resolveSessionMeta, } from "../auto-session/ipc.js";
|
|
33
|
+
import { browserStart } from "../auto-session/start.js";
|
|
34
34
|
/**
|
|
35
35
|
* Starts a detached session and reads back its own graph + starting
|
|
36
36
|
* snapshot in one call, so an agent bootstraps with everything it needs
|
|
@@ -39,7 +39,7 @@ import { browserStart } from "./browser.js";
|
|
|
39
39
|
* --detach` and `waygraph graph` itself.
|
|
40
40
|
*/
|
|
41
41
|
export async function pilotStart(init) {
|
|
42
|
-
const { resolveInjectRoots } = await import("
|
|
42
|
+
const { resolveInjectRoots } = await import("../../manifest/roots.js");
|
|
43
43
|
const exploreInject = init.inject ??
|
|
44
44
|
(init.injectTokens?.length ? resolveInjectRoots(init.injectTokens, init.projectDir) : undefined);
|
|
45
45
|
const started = await browserStart({
|
|
@@ -28,7 +28,7 @@ export interface TraverseOptions {
|
|
|
28
28
|
/** Traverse id for greppable lines (default traverse-1). */
|
|
29
29
|
traverseId?: string;
|
|
30
30
|
/** Phase C: glob / regex / bare `--blocks` file select. */
|
|
31
|
-
blocksSelect?: import("
|
|
31
|
+
blocksSelect?: import("../../manifest/select.js").BlocksSelect;
|
|
32
32
|
/** Phase D: parallel workers (default 1). Cap 4. */
|
|
33
33
|
parallel?: number;
|
|
34
34
|
/** Phase D: clone (default) or inherit. Inherit refused when parallel > 1. */
|