waygraph 0.15.54 → 0.16.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -3
- package/bin/waygraph +2 -2
- package/dist/analysis/check.d.ts +38 -0
- package/dist/analysis/check.js +87 -0
- package/dist/analysis/coverage-gap.d.ts +1 -1
- package/dist/analysis/coverage-gap.js +14 -37
- package/dist/analysis/flow-source.d.ts +9 -0
- package/dist/analysis/flow-source.js +25 -0
- package/dist/analysis/graph.d.ts +10 -14
- package/dist/analysis/graph.js +48 -371
- package/dist/analysis/map-check.js +4 -39
- package/dist/analysis/practices-check.d.ts +1 -1
- package/dist/analysis/practices-check.js +24 -45
- package/dist/cli/args.d.ts +23 -0
- package/dist/cli/args.js +20 -0
- package/dist/{cli.d.ts → cli/cli.d.ts} +0 -1
- package/dist/{cli.js → cli/cli.js} +10 -9
- package/dist/{commands → cli/commands}/agent-dive-scaffold.js +35 -64
- package/dist/cli/commands/agent-dive.js +42 -0
- package/dist/cli/commands/browser.d.ts +2 -0
- package/dist/cli/commands/browser.js +109 -0
- package/dist/{commands → cli/commands}/check.d.ts +0 -1
- package/dist/cli/commands/check.js +104 -0
- package/dist/cli/commands/codemod-checkpoints.d.ts +18 -0
- package/dist/cli/commands/codemod-checkpoints.js +186 -0
- package/dist/cli/commands/codemod-flows.d.ts +18 -0
- package/dist/cli/commands/codemod-flows.js +284 -0
- package/dist/cli/commands/codemod-stubs.d.ts +10 -0
- package/dist/cli/commands/codemod-stubs.js +187 -0
- package/dist/{commands → cli/commands}/extensions.js +5 -4
- package/dist/{commands → cli/commands}/init.js +1 -2
- package/dist/{commands → cli/commands}/list.js +9 -7
- package/dist/cli/commands/manifest.d.ts +2 -0
- package/dist/cli/commands/manifest.js +20 -0
- package/dist/cli/commands/map.js +57 -0
- package/dist/cli/commands/pilot.d.ts +2 -0
- package/dist/cli/commands/pilot.js +102 -0
- package/dist/{commands → cli/commands}/run.d.ts +0 -1
- package/dist/cli/commands/run.js +64 -0
- package/dist/cli/commands/session-ops.d.ts +3 -0
- package/dist/cli/commands/session-ops.js +257 -0
- package/dist/cli/commands/session.js +132 -0
- package/dist/{commands → cli/commands}/test.js +11 -14
- package/dist/cli/commands/traverse.js +105 -0
- package/dist/{commands → cli/commands}/try.js +29 -25
- package/dist/{commands → cli/commands}/upgrade.js +40 -4
- package/dist/cli/flags.d.ts +193 -16
- package/dist/cli/flags.js +179 -234
- package/dist/cli/run-chain.d.ts +1 -0
- package/dist/cli/run-chain.js +42 -7
- package/dist/cli/usage.d.ts +1 -1
- package/dist/cli/usage.js +21 -53
- package/dist/cli/util.d.ts +2 -2
- package/dist/cli/util.js +2 -3
- package/dist/{highlights → demo/narration}/css.d.ts +1 -1
- package/dist/{highlights → demo/narration}/css.js +2 -3
- package/dist/{highlights → demo/narration}/demo-pace.d.ts +4 -12
- package/dist/{highlights → demo/narration}/demo-pace.js +5 -11
- package/dist/{highlights → demo/narration}/device.d.ts +4 -4
- package/dist/{highlights → demo/narration}/device.js +1 -1
- package/dist/demo/narration/merge.d.ts +10 -0
- package/dist/demo/narration/merge.js +67 -0
- package/dist/demo/narration/narration.d.ts +39 -0
- package/dist/{highlights/run-phase.js → demo/narration/narration.js} +25 -94
- package/dist/{highlights → demo/narration}/shorthand.d.ts +1 -1
- package/dist/demo/narration/stub-ctx.d.ts +8 -0
- package/dist/demo/narration/stub-ctx.js +164 -0
- package/dist/{highlights → demo/narration}/style.d.ts +1 -7
- package/dist/{highlights → demo/narration}/style.js +1 -41
- package/dist/{highlights → demo/narration}/todo-dock.d.ts +8 -8
- package/dist/{highlights → demo/narration}/todo-dock.js +13 -30
- package/dist/demo/overlay/auto-chrome.d.ts +7 -0
- package/dist/demo/overlay/auto-chrome.js +97 -0
- package/dist/demo/overlay/cursor.d.ts +19 -0
- package/dist/demo/overlay/cursor.js +142 -0
- package/dist/demo/overlay/device-stage.d.ts +26 -0
- package/dist/demo/overlay/device-stage.js +396 -0
- package/dist/demo/overlay/inpage/banner.d.ts +2 -0
- package/dist/demo/overlay/inpage/banner.js +160 -0
- package/dist/demo/overlay/inpage/caption.d.ts +2 -0
- package/dist/demo/overlay/inpage/caption.js +24 -0
- package/dist/demo/overlay/inpage/core.d.ts +2 -0
- package/dist/demo/overlay/inpage/core.js +345 -0
- package/dist/demo/overlay/inpage/device-chip.d.ts +1 -0
- package/dist/demo/overlay/inpage/device-chip.js +191 -0
- package/dist/demo/overlay/inpage/network.d.ts +10 -0
- package/dist/demo/overlay/inpage/network.js +189 -0
- package/dist/demo/overlay/inpage/panel-chrome.d.ts +1 -0
- package/dist/demo/overlay/inpage/panel-chrome.js +203 -0
- package/dist/demo/overlay/inpage/stamp.d.ts +1 -0
- package/dist/demo/overlay/inpage/stamp.js +46 -0
- package/dist/demo/overlay/inpage/swipe-zoom.d.ts +1 -0
- package/dist/demo/overlay/inpage/swipe-zoom.js +220 -0
- package/dist/demo/overlay/inpage/todos.d.ts +2 -0
- package/dist/demo/overlay/inpage/todos.js +293 -0
- package/dist/demo/overlay/locator-theater.d.ts +25 -0
- package/dist/demo/overlay/locator-theater.js +76 -0
- package/dist/demo/overlay/network-capture.d.ts +22 -0
- package/dist/demo/overlay/network-capture.js +127 -0
- package/dist/demo/overlay/overlay-css.d.ts +3 -0
- package/dist/demo/overlay/overlay-css.js +369 -0
- package/dist/demo/overlay/overlay-stage.d.ts +31 -0
- package/dist/demo/overlay/overlay-stage.js +106 -0
- package/dist/demo/overlay/overlay.d.ts +10 -0
- package/dist/demo/overlay/overlay.js +89 -0
- package/dist/{pilot-overlay/overlay-fixtures.d.ts → demo/overlay/phase-fixtures.d.ts} +2 -2
- package/dist/{pilot-overlay/overlay-fixtures.js → demo/overlay/phase-fixtures.js} +2 -2
- package/dist/{pilot-overlay/action-ring.js → demo/overlay/pilot/actions.js} +2 -1
- package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.d.ts +6 -5
- package/dist/{pilot-overlay → demo/overlay/pilot}/fixtures.js +19 -18
- package/dist/{pilot-overlay → demo/overlay/pilot}/shell.d.ts +2 -2
- package/dist/{pilot-overlay → demo/overlay/pilot}/shell.js +13 -22
- package/dist/demo/overlay/reattach.d.ts +7 -0
- package/dist/demo/overlay/reattach.js +23 -0
- package/dist/demo/overlay/rings.d.ts +61 -0
- package/dist/demo/overlay/rings.js +422 -0
- package/dist/{ui → demo/overlay/ui}/components/ring.js +2 -2
- package/dist/{ui → demo/overlay/ui}/overlay.css +4 -4
- package/dist/{ui → demo/overlay/ui}/shadow.d.ts +1 -1
- package/dist/{ui → demo/overlay/ui}/shadow.js +39 -2
- package/dist/demo/stepper/after.d.ts +3 -0
- package/dist/demo/stepper/after.js +103 -0
- package/dist/demo/stepper/banner-log.d.ts +35 -0
- package/dist/demo/stepper/banner-log.js +65 -0
- package/dist/demo/stepper/before.d.ts +4 -0
- package/dist/demo/stepper/before.js +110 -0
- package/dist/demo/stepper/demo-log.d.ts +48 -0
- package/dist/demo/stepper/demo-log.js +292 -0
- package/dist/demo/stepper/gate.d.ts +11 -0
- package/dist/demo/stepper/gate.js +78 -0
- package/dist/demo/stepper/interaction-patch.d.ts +4 -0
- package/dist/demo/stepper/interaction-patch.js +323 -0
- package/dist/demo/stepper/pacing.d.ts +21 -0
- package/dist/demo/stepper/pacing.js +23 -0
- package/dist/demo/stepper/panel-after.d.ts +17 -0
- package/dist/demo/stepper/panel-after.js +166 -0
- package/dist/demo/stepper/panel-before.d.ts +12 -0
- package/dist/demo/stepper/panel-before.js +241 -0
- package/dist/demo/stepper/slides.d.ts +23 -0
- package/dist/demo/stepper/slides.js +233 -0
- package/dist/demo/stepper/step-panels.d.ts +69 -0
- package/dist/demo/stepper/step-panels.js +172 -0
- package/dist/demo/stepper/stepper.d.ts +24 -0
- package/dist/demo/stepper/stepper.js +122 -0
- package/dist/demo/stepper/teardown.d.ts +47 -0
- package/dist/demo/stepper/teardown.js +178 -0
- package/dist/demo/stepper/todo-advance.d.ts +15 -0
- package/dist/demo/stepper/todo-advance.js +110 -0
- package/dist/demo/stepper/view.d.ts +58 -0
- package/dist/demo/stepper/view.js +31 -0
- package/dist/demo/types.d.ts +85 -0
- package/dist/demo/verbose-log.js +15 -0
- package/dist/engine/block/action-page.d.ts +53 -0
- package/dist/engine/block/action-page.js +1 -0
- package/dist/{types.d.ts → engine/block/block.d.ts} +102 -142
- package/dist/{core → engine/block}/block.js +12 -130
- package/dist/engine/block/branch.d.ts +17 -0
- package/dist/engine/block/branch.js +40 -0
- package/dist/{core → engine/block}/compose.d.ts +9 -7
- package/dist/{core → engine/block}/compose.js +1 -1
- package/dist/engine/block/dialog.d.ts +13 -0
- package/dist/engine/block/dialog.js +37 -0
- package/dist/{core/blocks → engine/block/kinds}/api.d.ts +16 -12
- package/dist/{core/blocks → engine/block/kinds}/api.js +26 -18
- package/dist/{core/blocks → engine/block/kinds}/effect.d.ts +13 -18
- package/dist/engine/block/kinds/effect.js +17 -0
- package/dist/{core/blocks → engine/block/kinds}/method.d.ts +17 -29
- package/dist/{core/blocks → engine/block/kinds}/method.js +6 -21
- package/dist/{core/blocks → engine/block/kinds}/nav.d.ts +21 -31
- package/dist/{core/blocks → engine/block/kinds}/nav.js +6 -12
- package/dist/{core/blocks → engine/block/kinds}/page.d.ts +14 -20
- package/dist/{core/blocks → engine/block/kinds}/page.js +5 -7
- package/dist/engine/checkpoint/checkpoint.d.ts +22 -0
- package/dist/engine/checkpoint/checkpoint.js +8 -0
- package/dist/engine/checkpoint/route.d.ts +28 -0
- package/dist/engine/checkpoint/route.js +28 -0
- package/dist/{core → engine}/config.d.ts +7 -2
- package/dist/engine/config.js +6 -0
- package/dist/engine/engine.d.ts +45 -0
- package/dist/{core → engine}/engine.js +6 -10
- package/dist/engine/env.d.ts +59 -0
- package/dist/engine/env.js +83 -0
- package/dist/{errors.d.ts → engine/errors.d.ts} +22 -22
- package/dist/{errors.js → engine/errors.js} +22 -22
- package/dist/{core → engine/flow}/branch-regression.d.ts +7 -7
- package/dist/{core → engine/flow}/branch-regression.js +4 -3
- package/dist/engine/flow/flow.d.ts +162 -0
- package/dist/engine/flow/flow.js +244 -0
- package/dist/engine/flow/map-branch.d.ts +9 -0
- package/dist/engine/flow/map-branch.js +57 -0
- package/dist/{core → engine/flow}/map-builder.d.ts +34 -54
- package/dist/engine/flow/map-builder.js +242 -0
- package/dist/engine/flow/map-steps.d.ts +30 -0
- package/dist/engine/flow/map-steps.js +87 -0
- package/dist/{core → engine}/locate.d.ts +1 -1
- package/dist/{core → engine}/locate.js +1 -2
- package/dist/{mem-stub.d.ts → engine/mem/mem-stub.d.ts} +9 -8
- package/dist/{mem-stub.js → engine/mem/mem-stub.js} +2 -2
- package/dist/{mem-page.d.ts → engine/mem/mem.d.ts} +1 -1
- package/dist/{mem-page.js → engine/mem/mem.js} +2 -1
- package/dist/engine/page-gone.d.ts +5 -0
- package/dist/engine/page-gone.js +20 -0
- package/dist/engine/run/connect.d.ts +28 -0
- package/dist/{types.js → engine/run/connect.js} +11 -10
- package/dist/engine/run/events.d.ts +67 -0
- package/dist/engine/run/events.js +90 -0
- package/dist/engine/run/hooks.d.ts +16 -0
- package/dist/engine/run/hooks.js +8 -0
- package/dist/engine/run/launch.d.ts +13 -0
- package/dist/engine/run/launch.js +27 -0
- package/dist/{core/run-graph.d.ts → engine/run/run.d.ts} +8 -12
- package/dist/{core/run-graph.js → engine/run/run.js} +22 -12
- package/dist/engine/stub/pace.d.ts +12 -0
- package/dist/engine/stub/pace.js +2 -0
- package/dist/engine/stub/ring.d.ts +130 -0
- package/dist/engine/stub/ring.js +41 -0
- package/dist/engine/stub/stub.d.ts +268 -0
- package/dist/engine/stub/stub.js +1 -0
- package/dist/engine/stub/todos.d.ts +104 -0
- package/dist/engine/stub/todos.js +2 -0
- package/dist/engine/stub/viewport.d.ts +26 -0
- package/dist/engine/stub/viewport.js +2 -0
- package/dist/{trait.d.ts → engine/trait/trait.d.ts} +1 -1
- package/dist/{trait.js → engine/trait/trait.js} +1 -1
- package/dist/index.d.ts +88 -36
- package/dist/index.js +46 -19
- package/dist/live/auto/auto.d.ts +22 -0
- package/dist/live/auto/auto.js +207 -0
- package/dist/{session/auto-explore.d.ts → live/auto/explore.d.ts} +4 -14
- package/dist/{session/auto-explore.js → live/auto/explore.js} +21 -127
- package/dist/live/auto/mem.d.ts +11 -0
- package/dist/live/auto/mem.js +85 -0
- package/dist/live/auto/menu.d.ts +30 -0
- package/dist/live/auto/menu.js +335 -0
- package/dist/live/auto-session/auto-session.d.ts +113 -0
- package/dist/live/auto-session/auto-session.js +452 -0
- package/dist/live/auto-session/console.d.ts +4 -0
- package/dist/live/auto-session/console.js +41 -0
- package/dist/live/auto-session/files.d.ts +44 -0
- package/dist/live/auto-session/files.js +145 -0
- package/dist/{auto-session → live/auto-session}/helpers.d.ts +9 -5
- package/dist/{auto-session → live/auto-session}/helpers.js +18 -1
- package/dist/live/auto-session/inspect.d.ts +4 -0
- package/dist/live/auto-session/inspect.js +75 -0
- package/dist/{session/auto-session-ipc.d.ts → live/auto-session/ipc.d.ts} +8 -25
- package/dist/{session/auto-session-ipc.js → live/auto-session/ipc.js} +36 -161
- package/dist/live/auto-session/open-browser.d.ts +6 -0
- package/dist/live/auto-session/open-browser.js +47 -0
- package/dist/{session/browser.d.ts → live/auto-session/start.d.ts} +1 -2
- package/dist/{session/browser.js → live/auto-session/start.js} +2 -3
- package/dist/{pilot-overlay → live/pilot}/panel.d.ts +1 -1
- package/dist/{pilot-overlay → live/pilot}/panel.js +23 -31
- package/dist/{session → live/pilot}/pilot.d.ts +3 -3
- package/dist/{session → live/pilot}/pilot.js +5 -4
- package/dist/{traverse/run.d.ts → live/traverse/traverse.d.ts} +1 -1
- package/dist/live/traverse/traverse.js +212 -0
- package/dist/live/traverse/worker.d.ts +37 -0
- package/dist/live/traverse/worker.js +200 -0
- package/dist/manifest/manifest.d.ts +52 -0
- package/dist/manifest/manifest.js +93 -0
- package/dist/manifest/map-imports.d.ts +7 -0
- package/dist/manifest/map-imports.js +22 -0
- package/dist/manifest/maps.d.ts +33 -0
- package/dist/manifest/maps.js +62 -0
- package/dist/manifest/pack.d.ts +21 -0
- package/dist/manifest/pack.js +109 -0
- package/dist/manifest/project.d.ts +60 -0
- package/dist/manifest/project.js +101 -0
- package/dist/{session/block-inject.js → manifest/roots.js} +1 -18
- package/dist/manifest/scan.d.ts +19 -0
- package/dist/manifest/scan.js +57 -0
- package/dist/manifest/source.d.ts +23 -0
- package/dist/manifest/source.js +86 -0
- package/dist/runner/mode.d.ts +71 -0
- package/dist/runner/mode.js +1 -0
- package/dist/runner/modes/branches.d.ts +5 -0
- package/dist/runner/modes/branches.js +37 -0
- package/dist/runner/modes/demo.d.ts +3 -0
- package/dist/runner/modes/demo.js +13 -0
- package/dist/runner/modes/report.d.ts +2 -0
- package/dist/runner/modes/report.js +54 -0
- package/dist/runner/modes/run.d.ts +2 -0
- package/dist/runner/modes/run.js +3 -0
- package/dist/runner/options.d.ts +31 -0
- package/dist/runner/options.js +42 -0
- package/dist/runner/plan/find.d.ts +18 -0
- package/dist/runner/plan/find.js +65 -0
- package/dist/runner/plan/plan.d.ts +11 -0
- package/dist/runner/plan/plan.js +97 -0
- package/dist/runner/plan/seed-mem.d.ts +12 -0
- package/dist/runner/plan/seed-mem.js +98 -0
- package/dist/runner/plan/spec.d.ts +5 -0
- package/dist/runner/plan/spec.js +17 -0
- package/dist/runner/play-steps.d.ts +2 -0
- package/dist/runner/play-steps.js +59 -0
- package/dist/runner/runner.d.ts +4 -0
- package/dist/runner/runner.js +64 -0
- package/dist/runner/session.d.ts +9 -0
- package/dist/runner/session.js +87 -0
- package/dist/{browser.js → runtime/browser.js} +4 -2
- package/dist/{env-file.js → runtime/env-file.js} +7 -12
- package/dist/{extensions.d.ts → runtime/extensions.d.ts} +1 -5
- package/dist/{extensions.js → runtime/extensions.js} +2 -1
- package/dist/runtime/full-launch.d.ts +1 -0
- package/dist/runtime/full-launch.js +34 -0
- package/dist/runtime/global-flag.d.ts +5 -0
- package/dist/runtime/global-flag.js +18 -0
- package/dist/{playwright-config.d.ts → runtime/playwright-config.d.ts} +1 -1
- package/dist/{playwright.config.js → runtime/playwright.config.js} +3 -2
- package/dist/runtime/run-log.d.ts +2 -0
- package/dist/runtime/run-log.js +17 -0
- package/dist/{video-dir.js → runtime/video-dir.js} +3 -2
- package/dist/{config.d.ts → runtime/waygraph-config.d.ts} +6 -9
- package/dist/{config.js → runtime/waygraph-config.js} +21 -51
- package/dist/{webserver.js → runtime/webserver.js} +5 -30
- package/examples/routed-demo/config/waygraph.config.ts +20 -0
- package/examples/routed-demo/package.json +1 -4
- package/examples/routed-demo/scripts/fixture-server.mjs +1 -1
- package/examples/routed-demo/src/flows/routed-demo-map.flow.ts +2 -4
- package/examples/routed-demo/src/flows/routed-demo.flow.ts +1 -2
- package/examples/routed-demo/src/map/(app_base)/dashboard/_methods/click-widget.block.ts +5 -4
- package/examples/routed-demo/src/map/(app_base)/dashboard/_nav.block.ts +3 -3
- package/examples/routed-demo/src/map/(app_base)/dashboard/_page.block.ts +3 -3
- package/examples/routed-demo/src/map/(external)/docs/_nav.block.ts +3 -3
- package/examples/routed-demo/src/map/(external)/docs/_page.block.ts +3 -3
- package/examples/routed-demo/src/states/routed-demo.states.ts +5 -3
- package/examples/routed-demo/tests/routed-demo.spec.ts +4 -4
- package/examples/routed-demo/tsconfig.json +1 -1
- package/examples/saucedemo/docs/CONVENTION.md +4 -5
- package/examples/saucedemo/docs/HELPERS.md +11 -11
- package/examples/saucedemo/src/blocks/SITE-MAP.md +0 -1
- package/examples/saucedemo/src/blocks/saucedemo-web/NAV.md +1 -5
- package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +5 -8
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +35 -43
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
- package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +4 -5
- package/examples/saucedemo/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
- package/examples/saucedemo/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
- package/examples/saucedemo/src/flows/api-demo.flow.ts +12 -10
- package/examples/saucedemo/src/states/checkout.states.ts +21 -11
- package/examples/saucedemo/src/stubs/device-showcase.ts +8 -10
- package/examples/saucedemo/tests/auto-graph.spec.ts +4 -12
- package/package.json +14 -6
- package/templates/agents/waygraph-planner.agent.md +2 -2
- package/templates/quickstart/docs/CONVENTION.md +4 -4
- package/templates/quickstart/docs/HELPERS.md +10 -8
- package/templates/quickstart/package.json +0 -3
- package/templates/quickstart/src/blocks/SITE-MAP.md +0 -1
- package/templates/quickstart/src/blocks/saucedemo-web/NAV.md +1 -5
- package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-cart.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/cart/nav-checkout-info.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-first-name.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-last-name.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/fill-postal-code.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-one/methods/submit-checkout-info.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/checkout-step-two/methods/finish-order.method.block.ts +5 -8
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/inventory.page.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-all-to-cart.method.block.ts +4 -6
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/add-to-cart.effect.block.ts +35 -43
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-all-from-cart.method.block.ts +4 -6
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/methods/remove-from-cart.effect.block.ts +4 -3
- package/templates/quickstart/src/blocks/saucedemo-web/inventory/nav-item-detail.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-inventory.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-back-to-products.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/inventory-item/nav-continue-shopping.block.ts +3 -3
- package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-password.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/methods/fill-username.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-login.method.block.ts +4 -5
- package/templates/quickstart/src/blocks/saucedemo-web/methods/submit-logout.method.block.ts +5 -4
- package/templates/quickstart/src/blocks/saucedemo-web/nav-login.block.ts +3 -3
- package/templates/quickstart/src/flows/api-demo.flow.ts +12 -10
- package/templates/quickstart/src/states/checkout.states.ts +21 -11
- package/templates/quickstart/src/stubs/device-showcase.ts +8 -10
- package/templates/scaffold/README.md +2 -1
- package/templates/scaffold/STRUCTURE.md +5 -4
- package/templates/scaffold/config/waygraph.config.ts +1 -0
- package/templates/scaffold/gitignore +1 -0
- package/templates/scaffold/src/flows/README.md +2 -2
- package/templates/scaffold/src/map/(app_base)/docs/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/docs/_page.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/_methods/add-item.effect.block.ts +4 -4
- package/templates/scaffold/src/map/(app_base)/home/_methods/assert-hello.method.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/_methods/assert-item-added.method.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/_methods/clear-cart.method.block.ts +5 -4
- package/templates/scaffold/src/map/(app_base)/home/_methods/remove-item.effect.block.ts +4 -4
- package/templates/scaffold/src/map/(app_base)/home/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/_page.block.ts +3 -3
- package/templates/scaffold/src/map/(app_base)/home/nav-verification-link.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_keys.ts +21 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-body.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-response-header.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/assert-status.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/pick-extension-interceptor.method.block.ts +5 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-body.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/read-response-headers.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/send-request.method.block.ts +5 -4
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-bearer-token.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-headers.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-json-body.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-method.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-query-params.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_methods/set-url.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/hoppscotch/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/hoppscotch/_page.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/hoppscotch/_states.ts +6 -0
- package/templates/scaffold/src/map/(external)/hoppscotch/settings/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/mailpit/_keys.ts +13 -0
- package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-content.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/mailpit/_methods/assert-email-received.method.block.ts +4 -4
- package/templates/scaffold/src/map/(external)/mailpit/_methods/extract-email-link.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/mailpit/_methods/open-message.method.block.ts +6 -5
- package/templates/scaffold/src/map/(external)/mailpit/_nav.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/mailpit/_page.block.ts +3 -3
- package/templates/scaffold/src/map/(external)/mailpit/_states.ts +9 -0
- package/templates/scaffold/src/map/README.md +7 -0
- package/templates/scaffold/src/states/README.md +4 -1
- package/templates/scaffold/src/states/demo.mem-keys.ts +1 -29
- package/templates/scaffold/src/states/demo.states.ts +14 -20
- package/templates/scaffold/tests/hoppscotch.spec.ts +1 -11
- package/templates/scaffold/tests/mail-verify.spec.ts +2 -2
- package/templates/skills/waygraph-blind-pilot.skill.md +2 -6
- package/templates/skills/waygraph-convention.skill.md +23 -14
- package/templates/skills/waygraph-pilot.skill.md +7 -4
- package/dist/auto-session/session.d.ts +0 -193
- package/dist/auto-session/session.js +0 -719
- package/dist/auto-session/verbose-log.js +0 -16
- package/dist/auto-session.d.ts +0 -2
- package/dist/auto-session.js +0 -3
- package/dist/cli/discover.d.ts +0 -40
- package/dist/cli/discover.js +0 -148
- package/dist/commands/agent-dive.js +0 -52
- package/dist/commands/check.js +0 -192
- package/dist/commands/map.js +0 -29
- package/dist/commands/run.js +0 -104
- package/dist/commands/session.js +0 -600
- package/dist/commands/traverse.js +0 -177
- package/dist/core/block.d.ts +0 -109
- package/dist/core/blocks/effect.js +0 -23
- package/dist/core/config.js +0 -17
- package/dist/core/engine.d.ts +0 -198
- package/dist/core/flow.d.ts +0 -294
- package/dist/core/flow.js +0 -432
- package/dist/core/map-builder.js +0 -383
- package/dist/core.d.ts +0 -14
- package/dist/core.js +0 -15
- package/dist/highlights/merge.d.ts +0 -8
- package/dist/highlights/merge.js +0 -173
- package/dist/highlights/run-phase.d.ts +0 -43
- package/dist/highlights/stub-ctx.d.ts +0 -10
- package/dist/highlights/stub-ctx.js +0 -331
- package/dist/highlights/types.d.ts +0 -613
- package/dist/highlights.d.ts +0 -9
- package/dist/highlights.js +0 -10
- package/dist/pilot-overlay.d.ts +0 -5
- package/dist/pilot-overlay.js +0 -6
- package/dist/runner/banner-log.js +0 -63
- package/dist/runner/chain-run.js +0 -102
- package/dist/runner/cursor.js +0 -140
- package/dist/runner/demo-log.js +0 -316
- package/dist/runner/device-stage.d.ts +0 -9
- package/dist/runner/device-stage.js +0 -420
- package/dist/runner/discovery.js +0 -105
- package/dist/runner/index.js +0 -2
- package/dist/runner/inpage/banner.d.ts +0 -21
- package/dist/runner/inpage/banner.js +0 -156
- package/dist/runner/inpage/caption.d.ts +0 -3
- package/dist/runner/inpage/caption.js +0 -23
- package/dist/runner/inpage/core.d.ts +0 -4
- package/dist/runner/inpage/core.js +0 -316
- package/dist/runner/inpage/device.d.ts +0 -3
- package/dist/runner/inpage/device.js +0 -211
- package/dist/runner/inpage/network.d.ts +0 -15
- package/dist/runner/inpage/network.js +0 -217
- package/dist/runner/inpage/panel-chrome.js +0 -192
- package/dist/runner/inpage/stamp.js +0 -46
- package/dist/runner/inpage/swipe-zoom.js +0 -220
- package/dist/runner/inpage/todos.js +0 -337
- package/dist/runner/interaction-patch.js +0 -384
- package/dist/runner/main.js +0 -469
- package/dist/runner/network-capture.d.ts +0 -9
- package/dist/runner/network-capture.js +0 -126
- package/dist/runner/overlay-css.d.ts +0 -3
- package/dist/runner/overlay-css.js +0 -377
- package/dist/runner/overlay-install.js +0 -90
- package/dist/runner/overlay-stage.js +0 -110
- package/dist/runner/rings.js +0 -514
- package/dist/runner/seed-mem.js +0 -110
- package/dist/runner/slides.js +0 -278
- package/dist/runner/step-mode.js +0 -703
- package/dist/runner/step-panels.js +0 -729
- package/dist/runner/teardown.js +0 -202
- package/dist/runner/todo-dock.js +0 -142
- package/dist/session/auto-explore-run.d.ts +0 -40
- package/dist/session/auto-explore-run.js +0 -707
- package/dist/session/step-overlay.d.ts +0 -37
- package/dist/session/step-overlay.js +0 -244
- package/dist/traverse/run.js +0 -423
- package/examples/routed-demo/playwright.config.ts +0 -21
- package/examples/saucedemo/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
- package/templates/quickstart/src/blocks/saucedemo-web/ff-owner-auth.block.ts +0 -22
- /package/dist/{commands → cli/commands}/agent-dive-scaffold.d.ts +0 -0
- /package/dist/{commands → cli/commands}/agent-dive.d.ts +0 -0
- /package/dist/{commands → cli/commands}/extensions.d.ts +0 -0
- /package/dist/{commands → cli/commands}/init.d.ts +0 -0
- /package/dist/{commands → cli/commands}/list.d.ts +0 -0
- /package/dist/{commands → cli/commands}/map.d.ts +0 -0
- /package/dist/{commands → cli/commands}/session.d.ts +0 -0
- /package/dist/{commands → cli/commands}/test.d.ts +0 -0
- /package/dist/{commands → cli/commands}/traverse.d.ts +0 -0
- /package/dist/{commands → cli/commands}/try.d.ts +0 -0
- /package/dist/{commands → cli/commands}/upgrade.d.ts +0 -0
- /package/dist/{highlights → demo/narration}/shorthand.js +0 -0
- /package/dist/{session/overlay-beacon.d.ts → demo/overlay/beacon.d.ts} +0 -0
- /package/dist/{session/overlay-beacon.js → demo/overlay/beacon.js} +0 -0
- /package/dist/{pilot-overlay/action-ring.d.ts → demo/overlay/pilot/actions.d.ts} +0 -0
- /package/dist/{ui → demo/overlay/ui}/components/ring.d.ts +0 -0
- /package/dist/{ui → demo/overlay/ui}/stylesheet.d.ts +0 -0
- /package/dist/{ui → demo/overlay/ui}/stylesheet.js +0 -0
- /package/dist/{ui → demo/overlay/ui}/tokens.d.ts +0 -0
- /package/dist/{ui → demo/overlay/ui}/tokens.js +0 -0
- /package/dist/{highlights → demo}/types.js +0 -0
- /package/dist/{auto-session → demo}/verbose-log.d.ts +0 -0
- /package/dist/{selector.d.ts → engine/trait/selector.d.ts} +0 -0
- /package/dist/{selector.js → engine/trait/selector.js} +0 -0
- /package/dist/{traverse → live/traverse}/coverage.d.ts +0 -0
- /package/dist/{traverse → live/traverse}/coverage.js +0 -0
- /package/dist/{traverse → live/traverse}/lease.d.ts +0 -0
- /package/dist/{traverse → live/traverse}/lease.js +0 -0
- /package/dist/{session/block-inject.d.ts → manifest/roots.d.ts} +0 -0
- /package/dist/{blocks-select.d.ts → manifest/select.d.ts} +0 -0
- /package/dist/{blocks-select.js → manifest/select.js} +0 -0
- /package/dist/{browser.d.ts → runtime/browser.d.ts} +0 -0
- /package/dist/{env-file.d.ts → runtime/env-file.d.ts} +0 -0
- /package/dist/{playwright-config.js → runtime/playwright-config.js} +0 -0
- /package/dist/{playwright.config.d.ts → runtime/playwright.config.d.ts} +0 -0
- /package/dist/{video-dir.d.ts → runtime/video-dir.d.ts} +0 -0
- /package/dist/{webserver.d.ts → runtime/webserver.d.ts} +0 -0
package/dist/index.js
CHANGED
|
@@ -1,20 +1,47 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
export {
|
|
6
|
-
export {
|
|
7
|
-
export {
|
|
8
|
-
export {
|
|
1
|
+
// The runtime layer supplies how an Engine launches its own browser (config, Chromium path, extensions).
|
|
2
|
+
import "./runtime/full-launch.js";
|
|
3
|
+
// Run events are written to the project's run log (.waygraph/runs) when the CLI turns it on.
|
|
4
|
+
import "./runtime/run-log.js";
|
|
5
|
+
export { connect } from "./engine/run/connect.js";
|
|
6
|
+
export { checkpoint } from "./engine/checkpoint/checkpoint.js";
|
|
7
|
+
export { MemKey, MemPage, key, keyGroup } from "./engine/mem/mem.js";
|
|
8
|
+
export { registerMemStub, seedMemStub, getMemStub } from "./engine/mem/mem-stub.js";
|
|
9
|
+
export { css, byText, byRole } from "./engine/trait/selector.js";
|
|
10
|
+
export { WaygraphError, WAYGRAPH_ERRORS } from "./engine/errors.js";
|
|
11
|
+
export { Trait, urlMatches, textEquals, visible, disabled, enabled, frameVisible, frameTextEquals, frameContainsText } from "./engine/trait/trait.js";
|
|
12
|
+
export { runGraph, spawnTab, narrate, preflight, defineLayout } from "./engine/run/run.js";
|
|
13
|
+
export { Engine, map } from "./engine/engine.js";
|
|
14
|
+
export { branch } from "./engine/block/branch.js";
|
|
15
|
+
export { withVerify, modVerify, modVerifyAll, defineBlock } from "./engine/block/block.js";
|
|
16
|
+
export { withDialog } from "./engine/block/dialog.js";
|
|
17
|
+
export { defineNavBlock, defineNavClickBlock, defineMemNavBlock } from "./engine/block/kinds/nav.js";
|
|
18
|
+
export { defineMethodBlock, defineAssertBlock } from "./engine/block/kinds/method.js";
|
|
19
|
+
export { definePageBlock } from "./engine/block/kinds/page.js";
|
|
20
|
+
export { defineEffectBlock } from "./engine/block/kinds/effect.js";
|
|
21
|
+
export { defineApiBlock } from "./engine/block/kinds/api.js";
|
|
22
|
+
export { locate } from "./engine/locate.js";
|
|
23
|
+
export { composeBlock, fastForwardComposeBlock, isFastForwardBlock } from "./engine/block/compose.js";
|
|
24
|
+
export { MapBuilder } from "./engine/flow/map-builder.js";
|
|
25
|
+
export { branchRoutes, collectBranchFlows, runBranchRegression } from "./engine/flow/branch-regression.js";
|
|
26
|
+
export { resolveHighlightSlots, resolveSlides, runStubPhase, hasAuthoredStubAfter, hasAuthoredStubOnError } from "./demo/narration/narration.js";
|
|
27
|
+
export { resolveFixtureDwellMs, normalizeDemoPace, resolveStepDemoPace, demoPaceScale, demoPaceIsBlitz, demoPaceIsFast, demoPaceIsSlow, demoPaceGateMs, formatDemoPaceBadge, formatDemoPaceLabel, FIXTURE_DURATION_MS_DEFAULT, FIXTURE_DURATION_FAST_MS_DEFAULT, FIXTURE_DURATION_SLOW_MS_DEFAULT } from "./demo/narration/demo-pace.js";
|
|
28
|
+
export { formatHighlightCaption, applyHighlightStyleDefaults, toneIconPrefix } from "./demo/narration/style.js";
|
|
29
|
+
export { normalizeHighlightTone, normalizeHighlightSize, normalizeHighlightWeight } from "./engine/stub/ring.js";
|
|
30
|
+
export { normalizeTodos, normalizeTodoPos, normalizeTodoStyle, buildTodoDock, applyTodoPhase, advanceTodoDock, completeSequentialTodoDock, resolveTodoDockUi } from "./demo/narration/todo-dock.js";
|
|
31
|
+
export { applyDevicePhase, resolveDeviceState, normalizeDevicePreset, normalizeDeviceOrientation, applyOrientation, orientationFromViewport, DEVICE_PRESETS } from "./demo/narration/device.js";
|
|
32
|
+
export { WAYGRAPH_RING_CSS } from "./demo/narration/css.js";
|
|
9
33
|
export { discoverGraph, toMermaid, findOrphanBlocks, findBlockPath } from "./analysis/graph.js";
|
|
10
|
-
export {
|
|
11
|
-
export {
|
|
12
|
-
export {
|
|
13
|
-
export {
|
|
14
|
-
export {
|
|
15
|
-
export {
|
|
16
|
-
export {
|
|
17
|
-
export {
|
|
18
|
-
export {
|
|
19
|
-
export {
|
|
20
|
-
export {
|
|
34
|
+
export { buildManifest } from "./manifest/manifest.js";
|
|
35
|
+
export { onRunEvent } from "./engine/run/events.js";
|
|
36
|
+
export { isFileSelectToken, parseBlocksSelect, matchBlocksSelect, globToRegExp } from "./manifest/select.js";
|
|
37
|
+
export { EdgeLeaseCoordinator } from "./live/traverse/lease.js";
|
|
38
|
+
export { runTraverse } from "./live/traverse/traverse.js";
|
|
39
|
+
export { buildCoverageReport, collectGraphEdgeKeys, defaultCoverageOutPath, formatCoverageLine, normalizeHitKey, parseMinEdgeCoverage, writeCoverageReport } from "./live/traverse/coverage.js";
|
|
40
|
+
export { WG_UI_SEL, WG_READY_PANEL_SEL, WG_READY_AUTO_SEL, WG_READY_BANNER_SEL, readWgOverlayBeacon, readWgOverlayBeaconInPage, assertWgOverlayReady } from "./demo/overlay/beacon.js";
|
|
41
|
+
export { AutoSession } from "./live/auto-session/auto-session.js";
|
|
42
|
+
export { stubFilePath } from "./live/auto-session/helpers.js";
|
|
43
|
+
export { pilotStart } from "./live/pilot/pilot.js";
|
|
44
|
+
export { defineConfig, resolveBaseUrl } from "./runtime/waygraph-config.js";
|
|
45
|
+
export { withWebServer } from "./runtime/webserver.js";
|
|
46
|
+
export { chromiumExecutablePath } from "./runtime/browser.js";
|
|
47
|
+
export { resolveExtension, KNOWN_EXTENSIONS } from "./runtime/extensions.js";
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { BrowserContext, Page } from "@playwright/test";
|
|
2
|
+
import type { Checkpoint } from "../../engine/checkpoint/checkpoint.js";
|
|
3
|
+
import { Engine } from "../../engine/engine.js";
|
|
4
|
+
import { MemPage } from "../../engine/mem/mem.js";
|
|
5
|
+
import type { BlockEntry } from "../../manifest/project.js";
|
|
6
|
+
export interface AutoExploreOptions {
|
|
7
|
+
/** Terminal menu (browser still runs for act()). Default false = headful picker panel. */
|
|
8
|
+
cli?: boolean;
|
|
9
|
+
baseURL?: string;
|
|
10
|
+
/** Initial URL when the page is blank (defaults to baseURL). */
|
|
11
|
+
startUrl?: string;
|
|
12
|
+
/** Phase C: glob / regex / bare `--blocks` file select for discovery. */
|
|
13
|
+
blocksSelect?: import("../../manifest/select.js").BlocksSelect;
|
|
14
|
+
}
|
|
15
|
+
/** Which Checkpoint the page is on, asked of the project's own Nav / Page Blocks (their verify). */
|
|
16
|
+
export declare function detectHere(page: Page, navBlocks: BlockEntry[]): Promise<string | null>;
|
|
17
|
+
export declare function ensureLivePage(context: BrowserContext, page: Page, startUrl: string | undefined): Promise<Page>;
|
|
18
|
+
export declare function runOneBlock(engine: Engine, entry: BlockEntry, context: BrowserContext, page: Page, mem: MemPage, headful: boolean): Promise<Checkpoint<string>>;
|
|
19
|
+
/**
|
|
20
|
+
* Interactive waygraph auto: locate current Checkpoint, list runnable Blocks, pick one, repeat.
|
|
21
|
+
*/
|
|
22
|
+
export declare function runAutoExplore(projectDir: string, options?: AutoExploreOptions): Promise<void>;
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { stdin as input, stdout as output } from "node:process";
|
|
2
|
+
import { createInterface } from "node:readline/promises";
|
|
3
|
+
import { installDemoChrome, instrumentAutoInteractions } from "../../demo/overlay/auto-chrome.js";
|
|
4
|
+
import { keepOverlayOnNavigation } from "../../demo/overlay/reattach.js";
|
|
5
|
+
import { Engine } from "../../engine/engine.js";
|
|
6
|
+
import { envString } from "../../engine/env.js";
|
|
7
|
+
import { buildFlow } from "../../engine/flow/flow.js";
|
|
8
|
+
import { locate } from "../../engine/locate.js";
|
|
9
|
+
import { MemPage } from "../../engine/mem/mem.js";
|
|
10
|
+
import { ignorePageGone, ignoreTimeout } from "../../engine/page-gone.js";
|
|
11
|
+
import { chromiumExecutablePath, launchContext } from "../../runtime/browser.js";
|
|
12
|
+
import { configuredExtensions, resolveBaseUrl } from "../../runtime/waygraph-config.js";
|
|
13
|
+
import { withWebServer } from "../../runtime/webserver.js";
|
|
14
|
+
import { buildExploreContext, buildExploreMenu, } from "./explore.js";
|
|
15
|
+
import { ensureMem, seedDefaultMem } from "./mem.js";
|
|
16
|
+
import { armPickWait, cliPick, headfulPick, printCliMenu, setAutoPanelRunning, syncPanelMem } from "./menu.js";
|
|
17
|
+
/** Which Checkpoint the page is on, asked of the project's own Nav / Page Blocks (their verify). */
|
|
18
|
+
export async function detectHere(page, navBlocks) {
|
|
19
|
+
const tags = navBlocks.map((n) => n.block);
|
|
20
|
+
return locate(page, tags, { timeoutMs: 1500 });
|
|
21
|
+
}
|
|
22
|
+
export async function ensureLivePage(context, page, startUrl) {
|
|
23
|
+
if (!page.isClosed())
|
|
24
|
+
return page;
|
|
25
|
+
const fresh = await context.newPage();
|
|
26
|
+
if (startUrl) {
|
|
27
|
+
await fresh.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(ignorePageGone);
|
|
28
|
+
await fresh.waitForLoadState("load").catch(ignoreTimeout);
|
|
29
|
+
}
|
|
30
|
+
return fresh;
|
|
31
|
+
}
|
|
32
|
+
export async function runOneBlock(engine, entry, context, page, mem, headful) {
|
|
33
|
+
const navClick = entry.block.__waygraphNavClick;
|
|
34
|
+
if (entry.kind === "nav" && navClick !== undefined) {
|
|
35
|
+
await page
|
|
36
|
+
.evaluate((label) => {
|
|
37
|
+
window.__wgPendingNavClickLabel = label;
|
|
38
|
+
}, `nav: ${entry.block.name}`)
|
|
39
|
+
.catch(ignorePageGone);
|
|
40
|
+
}
|
|
41
|
+
if (headful)
|
|
42
|
+
await setAutoPanelRunning(page, entry.block.name);
|
|
43
|
+
const flow = buildFlow([entry.block], engine.config);
|
|
44
|
+
const BLOCK_TIMEOUT_MS = 45_000;
|
|
45
|
+
let timer;
|
|
46
|
+
let result;
|
|
47
|
+
try {
|
|
48
|
+
const ran = await Promise.race([
|
|
49
|
+
flow.run(context, mem, { page, closeOnFinish: false }),
|
|
50
|
+
new Promise((_, reject) => {
|
|
51
|
+
timer = setTimeout(() => reject(new Error(`Block "${entry.block.name}" timed out after ${BLOCK_TIMEOUT_MS / 1000}s - ` +
|
|
52
|
+
"click Quit and retry, or check network / mem credentials")), BLOCK_TIMEOUT_MS);
|
|
53
|
+
}),
|
|
54
|
+
]);
|
|
55
|
+
result = ran.result;
|
|
56
|
+
}
|
|
57
|
+
finally {
|
|
58
|
+
if (timer)
|
|
59
|
+
clearTimeout(timer);
|
|
60
|
+
}
|
|
61
|
+
await page.evaluate("delete window.__wgPendingNavClickLabel").catch(ignorePageGone);
|
|
62
|
+
return result;
|
|
63
|
+
}
|
|
64
|
+
/** Shown in the headful panel after each Block run. */
|
|
65
|
+
let lastRunNote = null;
|
|
66
|
+
/**
|
|
67
|
+
* Interactive waygraph auto: locate current Checkpoint, list runnable Blocks, pick one, repeat.
|
|
68
|
+
*/
|
|
69
|
+
export async function runAutoExplore(projectDir, options = {}) {
|
|
70
|
+
await withWebServer(projectDir, () => runAutoExploreCore(projectDir, options));
|
|
71
|
+
}
|
|
72
|
+
async function runAutoExploreCore(projectDir, options = {}) {
|
|
73
|
+
lastRunNote = null;
|
|
74
|
+
const cli = options.cli === true;
|
|
75
|
+
const baseURL = options.baseURL ?? (await resolveBaseUrl(projectDir)) ?? envString("WAYGRAPH_BASE_URL");
|
|
76
|
+
const startUrl = options.startUrl ?? baseURL;
|
|
77
|
+
const { graph, library } = await buildExploreContext(projectDir, options.blocksSelect ? { blocksSelect: options.blocksSelect } : undefined);
|
|
78
|
+
if (options.blocksSelect) {
|
|
79
|
+
console.error(`waygraph auto: --blocks ${options.blocksSelect.raw} → ` +
|
|
80
|
+
`${library.byName.size} block(s), ${graph.edges.length} edge(s)`);
|
|
81
|
+
}
|
|
82
|
+
const mem = new MemPage();
|
|
83
|
+
seedDefaultMem(library.byName, mem);
|
|
84
|
+
const engine = cli ? new Engine({ headless: true }) : new Engine({ headless: false, slowMo: 250 });
|
|
85
|
+
const { chromium } = await import("@playwright/test");
|
|
86
|
+
const executablePath = chromiumExecutablePath();
|
|
87
|
+
const launchOpts = {
|
|
88
|
+
headless: cli,
|
|
89
|
+
args: cli ? [] : ["--start-maximized"],
|
|
90
|
+
};
|
|
91
|
+
if (!cli)
|
|
92
|
+
launchOpts.slowMo = 250;
|
|
93
|
+
if (executablePath)
|
|
94
|
+
launchOpts.executablePath = executablePath;
|
|
95
|
+
const contextOpts = cli
|
|
96
|
+
? { viewport: { width: 1280, height: 720 } }
|
|
97
|
+
: { viewport: null };
|
|
98
|
+
if (baseURL)
|
|
99
|
+
contextOpts.baseURL = baseURL;
|
|
100
|
+
const { close: closeBrowser, context } = await launchContext({
|
|
101
|
+
launcher: chromium,
|
|
102
|
+
launch: launchOpts,
|
|
103
|
+
context: contextOpts,
|
|
104
|
+
extensions: await configuredExtensions(projectDir),
|
|
105
|
+
});
|
|
106
|
+
let page = await context.newPage();
|
|
107
|
+
if (startUrl) {
|
|
108
|
+
await page.goto(startUrl, { waitUntil: "domcontentloaded" }).catch(ignorePageGone);
|
|
109
|
+
await page.waitForLoadState("load").catch(ignoreTimeout);
|
|
110
|
+
}
|
|
111
|
+
console.error(`waygraph auto: ${graph.nodes.length} checkpoint(s), ${graph.edges.length} edge(s) - ` +
|
|
112
|
+
(cli ? "CLI picker (terminal menu)" : "headful picker (browser panel)"));
|
|
113
|
+
const pickSlot = { resolve: null };
|
|
114
|
+
let wiredPage = null;
|
|
115
|
+
async function wirePage(target) {
|
|
116
|
+
if (wiredPage === target)
|
|
117
|
+
return;
|
|
118
|
+
await target.exposeFunction("__wgAutoPick", (index) => {
|
|
119
|
+
pickSlot.resolve?.({ type: "pick", index });
|
|
120
|
+
});
|
|
121
|
+
await target.exposeFunction("__wgAutoQuit", () => {
|
|
122
|
+
pickSlot.resolve?.({ type: "quit" });
|
|
123
|
+
});
|
|
124
|
+
if (!cli) {
|
|
125
|
+
await installDemoChrome(target, "", { banner: false });
|
|
126
|
+
keepOverlayOnNavigation(target, () => installDemoChrome(target, "", { banner: false }));
|
|
127
|
+
instrumentAutoInteractions(target, mem, 250);
|
|
128
|
+
}
|
|
129
|
+
wiredPage = target;
|
|
130
|
+
}
|
|
131
|
+
let here = null;
|
|
132
|
+
const cliRl = cli ? createInterface({ input, output }) : null;
|
|
133
|
+
try {
|
|
134
|
+
for (;;) {
|
|
135
|
+
page = await ensureLivePage(context, page, startUrl);
|
|
136
|
+
await wirePage(page);
|
|
137
|
+
const pickWait = armPickWait();
|
|
138
|
+
pickSlot.resolve = pickWait.resolve;
|
|
139
|
+
if (here === null) {
|
|
140
|
+
here = await detectHere(page, library.navBlocks);
|
|
141
|
+
}
|
|
142
|
+
if (cli)
|
|
143
|
+
console.error("waygraph auto: scanning page for moves ...");
|
|
144
|
+
const menu = await buildExploreMenu(page, graph, library, here);
|
|
145
|
+
if (cli)
|
|
146
|
+
console.error(`waygraph auto: ${menu.flat.length} move(s) available`);
|
|
147
|
+
if (menu.flat.length === 0) {
|
|
148
|
+
const fromHere = graph.edges.filter((e) => e.from === here).map((e) => e.block);
|
|
149
|
+
const missing = [...new Set(fromHere)].filter((b) => !library.byName.has(b));
|
|
150
|
+
console.error(here
|
|
151
|
+
? `waygraph auto: no runnable Blocks on "${here}"` +
|
|
152
|
+
(fromHere.length
|
|
153
|
+
? ` (graph has: ${[...new Set(fromHere)].join(", ")}${missing.length ? `; not loaded: ${missing.join(", ")}` : ""})`
|
|
154
|
+
: " - nothing on this page matches the graph.") +
|
|
155
|
+
(cli ? "" : " Tip: waygraph auto --cli")
|
|
156
|
+
: "waygraph auto: location unknown - pick nav-login (Start here) if shown.");
|
|
157
|
+
if (cli)
|
|
158
|
+
break;
|
|
159
|
+
}
|
|
160
|
+
let pick;
|
|
161
|
+
if (cli && cliRl) {
|
|
162
|
+
printCliMenu(menu, library.byName);
|
|
163
|
+
pick = await cliPick(menu, cliRl);
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
pick = await headfulPick(page, menu, library.byName, mem, () => pickWait.promise, lastRunNote);
|
|
167
|
+
}
|
|
168
|
+
if (pick.type === "quit")
|
|
169
|
+
break;
|
|
170
|
+
if (pick.index < 0 || pick.index >= menu.flat.length)
|
|
171
|
+
continue;
|
|
172
|
+
const edge = menu.flat[pick.index];
|
|
173
|
+
const entry = library.byName.get(edge.block);
|
|
174
|
+
if (!entry) {
|
|
175
|
+
console.error(`waygraph auto: Block "${edge.block}" not loaded - skipped`);
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
try {
|
|
179
|
+
if (edge.instanceOption) {
|
|
180
|
+
mem.set(edge.instanceOption.key, edge.instanceOption.value);
|
|
181
|
+
}
|
|
182
|
+
if (!cli && (entry.block.requires?.length ?? 0) > 0) {
|
|
183
|
+
await syncPanelMem(page, mem, entry.block.requires ?? []);
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
await ensureMem(entry, mem, cli);
|
|
187
|
+
}
|
|
188
|
+
const pickLabel = edge.label ?? entry.block.name;
|
|
189
|
+
console.error(`waygraph auto: running [${pick.index + 1}] ${pickLabel} ...`);
|
|
190
|
+
const result = await runOneBlock(engine, entry, context, page, mem, !cli);
|
|
191
|
+
// Trust block output over locate() - nav verify traits collide on /dashboard.
|
|
192
|
+
here = result.__state ?? edge.to;
|
|
193
|
+
lastRunNote = `${entry.block.name} -> ${here}`;
|
|
194
|
+
console.error(`waygraph auto: ran ${entry.block.name} -> ${here}`);
|
|
195
|
+
}
|
|
196
|
+
catch (err) {
|
|
197
|
+
lastRunNote = `${entry.block.name} failed`;
|
|
198
|
+
console.error(`waygraph auto: ${entry.block.name} failed - ${err instanceof Error ? err.message : String(err)}`);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
finally {
|
|
203
|
+
cliRl?.close();
|
|
204
|
+
await context.close();
|
|
205
|
+
await closeBrowser();
|
|
206
|
+
}
|
|
207
|
+
}
|
|
@@ -1,18 +1,12 @@
|
|
|
1
1
|
import type { Page } from "@playwright/test";
|
|
2
|
-
import
|
|
3
|
-
import
|
|
2
|
+
import { type WaygraphEdge, type WaygraphGraph } from "../../analysis/graph.js";
|
|
3
|
+
import type { WaygraphInstanceOption } from "../../engine/block/action-page.js";
|
|
4
4
|
export interface ExploreContextOpts {
|
|
5
|
-
blocksSelect?: import("
|
|
5
|
+
blocksSelect?: import("../../manifest/select.js").BlocksSelect;
|
|
6
6
|
/** Absolute paths of extra Block trees to merge (host projectDir is always first). */
|
|
7
7
|
inject?: string[];
|
|
8
8
|
}
|
|
9
|
-
|
|
10
|
-
block: Block<Checkpoint<string>, Checkpoint<string>>;
|
|
11
|
-
exportName: string;
|
|
12
|
-
file: string;
|
|
13
|
-
kind: "nav" | "action";
|
|
14
|
-
description: string;
|
|
15
|
-
}
|
|
9
|
+
import type { BlockEntry } from "../../manifest/project.js";
|
|
16
10
|
/**
|
|
17
11
|
* One menu row. Usually just a `WaygraphEdge` as discovered statically; when
|
|
18
12
|
* a Block declares `instanceOptions`, one `ExploreEdge` is produced per live
|
|
@@ -41,10 +35,6 @@ export declare function loadBlockLibrary(projectDir: string, opts?: ExploreConte
|
|
|
41
35
|
byName: Map<string, BlockEntry>;
|
|
42
36
|
navBlocks: BlockEntry[];
|
|
43
37
|
}>;
|
|
44
|
-
/**
|
|
45
|
-
* @deprecated Use {@link buildExploreMenu} — kept for unit tests.
|
|
46
|
-
*/
|
|
47
|
-
export declare function exploreChoices(graph: WaygraphGraph, here: string | null): WaygraphEdge[];
|
|
48
38
|
/**
|
|
49
39
|
* Runtime-filtered menu: only Blocks that can run on the live page, grouped forward/back.
|
|
50
40
|
*/
|
|
@@ -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
|
*/
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { MemPage, type MemKey } from "../../engine/mem/mem.js";
|
|
2
|
+
import type { BlockEntry } from "../../manifest/project.js";
|
|
3
|
+
export declare function missingMemKeys(entry: BlockEntry, mem: MemPage): MemKey<unknown>[];
|
|
4
|
+
/** The project's own default for a key: its `registerMemStub` fake (live sessions load every `*.mem-stubs.ts`). */
|
|
5
|
+
export declare function memStubValue(key: MemKey<unknown>): unknown | undefined;
|
|
6
|
+
export declare function defaultMemJsonPrompt(key: MemKey<unknown>): string;
|
|
7
|
+
export declare function seedMemFromEnv(mem: MemPage, entry: BlockEntry): boolean;
|
|
8
|
+
/** Pre-seeds required keys from WAYGRAPH_DATA and the project's mem stubs, so a session does not stop for mem forms. */
|
|
9
|
+
export declare function seedDefaultMem(library: Map<string, BlockEntry>, mem: MemPage): void;
|
|
10
|
+
export declare function promptMemCli(entry: BlockEntry, mem: MemPage): Promise<void>;
|
|
11
|
+
export declare function ensureMem(entry: BlockEntry, mem: MemPage, cli: boolean): Promise<void>;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
// Mem for a live session: --data first, then the project's mem stubs; the terminal prompt for what is missing.
|
|
2
|
+
import { stdin as input, stdout as output } from "node:process";
|
|
3
|
+
import { createInterface } from "node:readline/promises";
|
|
4
|
+
import { envString } from "../../engine/env.js";
|
|
5
|
+
import { getMemStub } from "../../engine/mem/mem-stub.js";
|
|
6
|
+
export function missingMemKeys(entry, mem) {
|
|
7
|
+
const requires = entry.block.requires ?? [];
|
|
8
|
+
return requires.filter((k) => !mem.has(k));
|
|
9
|
+
}
|
|
10
|
+
/** The project's own default for a key: its `registerMemStub` fake (live sessions load every `*.mem-stubs.ts`). */
|
|
11
|
+
export function memStubValue(key) {
|
|
12
|
+
return getMemStub(key)?.();
|
|
13
|
+
}
|
|
14
|
+
export function defaultMemJsonPrompt(key) {
|
|
15
|
+
const def = memStubValue(key);
|
|
16
|
+
return def === undefined ? "{}" : JSON.stringify(def);
|
|
17
|
+
}
|
|
18
|
+
export function seedMemFromEnv(mem, entry) {
|
|
19
|
+
const raw = envString("WAYGRAPH_DATA") ?? envString("WAYGRAPH_AUTO_MEM");
|
|
20
|
+
if (!raw)
|
|
21
|
+
return false;
|
|
22
|
+
try {
|
|
23
|
+
const parsed = JSON.parse(raw);
|
|
24
|
+
for (const k of entry.block.requires ?? []) {
|
|
25
|
+
if (k.name in parsed)
|
|
26
|
+
mem.set(k, parsed[k.name]);
|
|
27
|
+
}
|
|
28
|
+
return missingMemKeys(entry, mem).length === 0;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/** Pre-seeds required keys from WAYGRAPH_DATA and the project's mem stubs, so a session does not stop for mem forms. */
|
|
35
|
+
export function seedDefaultMem(library, mem) {
|
|
36
|
+
const raw = envString("WAYGRAPH_DATA") ?? envString("WAYGRAPH_AUTO_MEM");
|
|
37
|
+
let envParsed = {};
|
|
38
|
+
if (raw) {
|
|
39
|
+
try {
|
|
40
|
+
envParsed = JSON.parse(raw);
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
throw new Error(`waygraph: --data / WAYGRAPH_DATA is not valid JSON: ${err instanceof Error ? err.message : String(err)}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
for (const entry of library.values()) {
|
|
47
|
+
for (const k of entry.block.requires ?? []) {
|
|
48
|
+
if (mem.has(k))
|
|
49
|
+
continue;
|
|
50
|
+
if (k.name in envParsed) {
|
|
51
|
+
mem.set(k, envParsed[k.name]);
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
const def = memStubValue(k);
|
|
55
|
+
if (def !== undefined)
|
|
56
|
+
mem.set(k, def);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
export async function promptMemCli(entry, mem) {
|
|
61
|
+
const rl = createInterface({ input, output });
|
|
62
|
+
try {
|
|
63
|
+
for (const k of missingMemKeys(entry, mem)) {
|
|
64
|
+
const def = defaultMemJsonPrompt(k);
|
|
65
|
+
const line = await rl.question(` ${k.name} JSON [${def}]: `);
|
|
66
|
+
const json = line.trim() || def;
|
|
67
|
+
mem.set(k, JSON.parse(json));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
finally {
|
|
71
|
+
rl.close();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
export async function ensureMem(entry, mem, cli) {
|
|
75
|
+
if (missingMemKeys(entry, mem).length === 0)
|
|
76
|
+
return;
|
|
77
|
+
if (seedMemFromEnv(mem, entry))
|
|
78
|
+
return;
|
|
79
|
+
if (cli) {
|
|
80
|
+
console.log(`\nBlock "${entry.block.name}" needs MemPage keys:`);
|
|
81
|
+
await promptMemCli(entry, mem);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
throw new Error(`Block "${entry.block.name}" needs MemPage keys - pass --data '{...}' / WAYGRAPH_DATA (or WAYGRAPH_AUTO_MEM), or enter values in --cli`);
|
|
85
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Page } from "@playwright/test";
|
|
2
|
+
import { createInterface } from "node:readline/promises";
|
|
3
|
+
import type { MemKey, MemPage } from "../../engine/mem/mem.js";
|
|
4
|
+
import type { BlockEntry } from "../../manifest/project.js";
|
|
5
|
+
import type { ExploreMenu } from "./explore.js";
|
|
6
|
+
export declare function setAutoPanelRunning(page: Page, label: string): Promise<void>;
|
|
7
|
+
export declare const PANEL_CSS: string;
|
|
8
|
+
export type PickResult = {
|
|
9
|
+
type: "pick";
|
|
10
|
+
index: number;
|
|
11
|
+
} | {
|
|
12
|
+
type: "quit";
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Mem keys any Block on the current menu might read this turn - minus keys a
|
|
16
|
+
* dynamic `instanceOptions` row already answers by picking it (e.g. "which
|
|
17
|
+
* item to add to cart" comes from the menu row itself, not a hand-typed JSON
|
|
18
|
+
* textarea).
|
|
19
|
+
*/
|
|
20
|
+
export declare function memKeysForMenu(menu: ExploreMenu, library: Map<string, BlockEntry>): readonly MemKey<unknown>[];
|
|
21
|
+
export declare function syncPanelMem(page: Page, mem: MemPage, keys: readonly MemKey<unknown>[]): Promise<void>;
|
|
22
|
+
export declare function armPickWait(): {
|
|
23
|
+
promise: Promise<PickResult>;
|
|
24
|
+
resolve: (v: PickResult) => void;
|
|
25
|
+
};
|
|
26
|
+
export declare function headfulPick(page: Page, menu: ExploreMenu, library: Map<string, BlockEntry>, mem: MemPage, waitPick: () => Promise<PickResult>,
|
|
27
|
+
/** What the last Block run did, shown at the top of the menu. */
|
|
28
|
+
note: string | null): Promise<PickResult>;
|
|
29
|
+
export declare function printCliMenu(menu: ExploreMenu, library: Map<string, BlockEntry>): void;
|
|
30
|
+
export declare function cliPick(menu: ExploreMenu, rl: ReturnType<typeof createInterface>): Promise<PickResult>;
|