@metamask/client-mcp-core 0.1.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/CHANGELOG.md +17 -0
- package/LICENSE +6 -0
- package/LICENSE.APACHE2 +201 -0
- package/LICENSE.MIT +21 -0
- package/README.md +1459 -0
- package/dist/capabilities/context.cjs +34 -0
- package/dist/capabilities/context.cjs.map +1 -0
- package/dist/capabilities/context.d.cts +101 -0
- package/dist/capabilities/context.d.cts.map +1 -0
- package/dist/capabilities/context.d.mts +101 -0
- package/dist/capabilities/context.d.mts.map +1 -0
- package/dist/capabilities/context.mjs +29 -0
- package/dist/capabilities/context.mjs.map +1 -0
- package/dist/capabilities/index.cjs +18 -0
- package/dist/capabilities/index.cjs.map +1 -0
- package/dist/capabilities/index.d.cts +3 -0
- package/dist/capabilities/index.d.cts.map +1 -0
- package/dist/capabilities/index.d.mts +3 -0
- package/dist/capabilities/index.d.mts.map +1 -0
- package/dist/capabilities/index.mjs +2 -0
- package/dist/capabilities/index.mjs.map +1 -0
- package/dist/capabilities/types.cjs +3 -0
- package/dist/capabilities/types.cjs.map +1 -0
- package/dist/capabilities/types.d.cts +152 -0
- package/dist/capabilities/types.d.cts.map +1 -0
- package/dist/capabilities/types.d.mts +152 -0
- package/dist/capabilities/types.d.mts.map +1 -0
- package/dist/capabilities/types.mjs +2 -0
- package/dist/capabilities/types.mjs.map +1 -0
- package/dist/index.cjs +59 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +33 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.mts +33 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +43 -0
- package/dist/index.mjs.map +1 -0
- package/dist/launcher/console-error-buffer.cjs +72 -0
- package/dist/launcher/console-error-buffer.cjs.map +1 -0
- package/dist/launcher/console-error-buffer.d.cts +43 -0
- package/dist/launcher/console-error-buffer.d.cts.map +1 -0
- package/dist/launcher/console-error-buffer.d.mts +43 -0
- package/dist/launcher/console-error-buffer.d.mts.map +1 -0
- package/dist/launcher/console-error-buffer.mjs +68 -0
- package/dist/launcher/console-error-buffer.mjs.map +1 -0
- package/dist/launcher/extension-id-resolver.cjs +177 -0
- package/dist/launcher/extension-id-resolver.cjs.map +1 -0
- package/dist/launcher/extension-id-resolver.d.cts +32 -0
- package/dist/launcher/extension-id-resolver.d.cts.map +1 -0
- package/dist/launcher/extension-id-resolver.d.mts +32 -0
- package/dist/launcher/extension-id-resolver.d.mts.map +1 -0
- package/dist/launcher/extension-id-resolver.mjs +173 -0
- package/dist/launcher/extension-id-resolver.mjs.map +1 -0
- package/dist/launcher/extension-readiness.cjs +50 -0
- package/dist/launcher/extension-readiness.cjs.map +1 -0
- package/dist/launcher/extension-readiness.d.cts +37 -0
- package/dist/launcher/extension-readiness.d.cts.map +1 -0
- package/dist/launcher/extension-readiness.d.mts +37 -0
- package/dist/launcher/extension-readiness.d.mts.map +1 -0
- package/dist/launcher/extension-readiness.mjs +43 -0
- package/dist/launcher/extension-readiness.mjs.map +1 -0
- package/dist/launcher/index.cjs +21 -0
- package/dist/launcher/index.cjs.map +1 -0
- package/dist/launcher/index.d.cts +5 -0
- package/dist/launcher/index.d.cts.map +1 -0
- package/dist/launcher/index.d.mts +5 -0
- package/dist/launcher/index.d.mts.map +1 -0
- package/dist/launcher/index.mjs +5 -0
- package/dist/launcher/index.mjs.map +1 -0
- package/dist/launcher/retry.cjs +35 -0
- package/dist/launcher/retry.cjs.map +1 -0
- package/dist/launcher/retry.d.cts +20 -0
- package/dist/launcher/retry.d.cts.map +1 -0
- package/dist/launcher/retry.d.mts +20 -0
- package/dist/launcher/retry.d.mts.map +1 -0
- package/dist/launcher/retry.mjs +31 -0
- package/dist/launcher/retry.mjs.map +1 -0
- package/dist/mcp-server/constants.cjs +22 -0
- package/dist/mcp-server/constants.cjs.map +1 -0
- package/dist/mcp-server/constants.d.cts +13 -0
- package/dist/mcp-server/constants.d.cts.map +1 -0
- package/dist/mcp-server/constants.d.mts +13 -0
- package/dist/mcp-server/constants.d.mts.map +1 -0
- package/dist/mcp-server/constants.mjs +19 -0
- package/dist/mcp-server/constants.mjs.map +1 -0
- package/dist/mcp-server/discovery.cjs +299 -0
- package/dist/mcp-server/discovery.cjs.map +1 -0
- package/dist/mcp-server/discovery.d.cts +56 -0
- package/dist/mcp-server/discovery.d.cts.map +1 -0
- package/dist/mcp-server/discovery.d.mts +56 -0
- package/dist/mcp-server/discovery.d.mts.map +1 -0
- package/dist/mcp-server/discovery.mjs +292 -0
- package/dist/mcp-server/discovery.mjs.map +1 -0
- package/dist/mcp-server/knowledge-store.cjs +1196 -0
- package/dist/mcp-server/knowledge-store.cjs.map +1 -0
- package/dist/mcp-server/knowledge-store.d.cts +249 -0
- package/dist/mcp-server/knowledge-store.d.cts.map +1 -0
- package/dist/mcp-server/knowledge-store.d.mts +249 -0
- package/dist/mcp-server/knowledge-store.d.mts.map +1 -0
- package/dist/mcp-server/knowledge-store.mjs +1154 -0
- package/dist/mcp-server/knowledge-store.mjs.map +1 -0
- package/dist/mcp-server/schemas.cjs +433 -0
- package/dist/mcp-server/schemas.cjs.map +1 -0
- package/dist/mcp-server/schemas.d.cts +557 -0
- package/dist/mcp-server/schemas.d.cts.map +1 -0
- package/dist/mcp-server/schemas.d.mts +557 -0
- package/dist/mcp-server/schemas.d.mts.map +1 -0
- package/dist/mcp-server/schemas.mjs +430 -0
- package/dist/mcp-server/schemas.mjs.map +1 -0
- package/dist/mcp-server/server.cjs +161 -0
- package/dist/mcp-server/server.cjs.map +1 -0
- package/dist/mcp-server/server.d.cts +24 -0
- package/dist/mcp-server/server.d.cts.map +1 -0
- package/dist/mcp-server/server.d.mts +24 -0
- package/dist/mcp-server/server.d.mts.map +1 -0
- package/dist/mcp-server/server.mjs +158 -0
- package/dist/mcp-server/server.mjs.map +1 -0
- package/dist/mcp-server/session-manager.cjs +53 -0
- package/dist/mcp-server/session-manager.cjs.map +1 -0
- package/dist/mcp-server/session-manager.d.cts +240 -0
- package/dist/mcp-server/session-manager.d.cts.map +1 -0
- package/dist/mcp-server/session-manager.d.mts +240 -0
- package/dist/mcp-server/session-manager.d.mts.map +1 -0
- package/dist/mcp-server/session-manager.mjs +48 -0
- package/dist/mcp-server/session-manager.mjs.map +1 -0
- package/dist/mcp-server/test-utils/flush-promises.cjs +10 -0
- package/dist/mcp-server/test-utils/flush-promises.cjs.map +1 -0
- package/dist/mcp-server/test-utils/flush-promises.d.cts +2 -0
- package/dist/mcp-server/test-utils/flush-promises.d.cts.map +1 -0
- package/dist/mcp-server/test-utils/flush-promises.d.mts +2 -0
- package/dist/mcp-server/test-utils/flush-promises.d.mts.map +1 -0
- package/dist/mcp-server/test-utils/flush-promises.mjs +7 -0
- package/dist/mcp-server/test-utils/flush-promises.mjs.map +1 -0
- package/dist/mcp-server/test-utils/index.cjs +13 -0
- package/dist/mcp-server/test-utils/index.cjs.map +1 -0
- package/dist/mcp-server/test-utils/index.d.cts +4 -0
- package/dist/mcp-server/test-utils/index.d.cts.map +1 -0
- package/dist/mcp-server/test-utils/index.d.mts +4 -0
- package/dist/mcp-server/test-utils/index.d.mts.map +1 -0
- package/dist/mcp-server/test-utils/index.mjs +4 -0
- package/dist/mcp-server/test-utils/index.mjs.map +1 -0
- package/dist/mcp-server/test-utils/mock-factories.cjs +129 -0
- package/dist/mcp-server/test-utils/mock-factories.cjs.map +1 -0
- package/dist/mcp-server/test-utils/mock-factories.d.cts +89 -0
- package/dist/mcp-server/test-utils/mock-factories.d.cts.map +1 -0
- package/dist/mcp-server/test-utils/mock-factories.d.mts +89 -0
- package/dist/mcp-server/test-utils/mock-factories.d.mts.map +1 -0
- package/dist/mcp-server/test-utils/mock-factories.mjs +125 -0
- package/dist/mcp-server/test-utils/mock-factories.mjs.map +1 -0
- package/dist/mcp-server/test-utils/mock-playwright.cjs +205 -0
- package/dist/mcp-server/test-utils/mock-playwright.cjs.map +1 -0
- package/dist/mcp-server/test-utils/mock-playwright.d.cts +69 -0
- package/dist/mcp-server/test-utils/mock-playwright.d.cts.map +1 -0
- package/dist/mcp-server/test-utils/mock-playwright.d.mts +69 -0
- package/dist/mcp-server/test-utils/mock-playwright.d.mts.map +1 -0
- package/dist/mcp-server/test-utils/mock-playwright.mjs +200 -0
- package/dist/mcp-server/test-utils/mock-playwright.mjs.map +1 -0
- package/dist/mcp-server/tokenization.cjs +117 -0
- package/dist/mcp-server/tokenization.cjs.map +1 -0
- package/dist/mcp-server/tokenization.d.cts +22 -0
- package/dist/mcp-server/tokenization.d.cts.map +1 -0
- package/dist/mcp-server/tokenization.d.mts +22 -0
- package/dist/mcp-server/tokenization.d.mts.map +1 -0
- package/dist/mcp-server/tokenization.mjs +112 -0
- package/dist/mcp-server/tokenization.mjs.map +1 -0
- package/dist/mcp-server/tools/batch.cjs +199 -0
- package/dist/mcp-server/tools/batch.cjs.map +1 -0
- package/dist/mcp-server/tools/batch.d.cts +81 -0
- package/dist/mcp-server/tools/batch.d.cts.map +1 -0
- package/dist/mcp-server/tools/batch.d.mts +81 -0
- package/dist/mcp-server/tools/batch.d.mts.map +1 -0
- package/dist/mcp-server/tools/batch.mjs +191 -0
- package/dist/mcp-server/tools/batch.mjs.map +1 -0
- package/dist/mcp-server/tools/build.cjs +47 -0
- package/dist/mcp-server/tools/build.cjs.map +1 -0
- package/dist/mcp-server/tools/build.d.cts +22 -0
- package/dist/mcp-server/tools/build.d.cts.map +1 -0
- package/dist/mcp-server/tools/build.d.mts +22 -0
- package/dist/mcp-server/tools/build.d.mts.map +1 -0
- package/dist/mcp-server/tools/build.mjs +44 -0
- package/dist/mcp-server/tools/build.mjs.map +1 -0
- package/dist/mcp-server/tools/cleanup.cjs +20 -0
- package/dist/mcp-server/tools/cleanup.cjs.map +1 -0
- package/dist/mcp-server/tools/cleanup.d.cts +10 -0
- package/dist/mcp-server/tools/cleanup.d.cts.map +1 -0
- package/dist/mcp-server/tools/cleanup.d.mts +10 -0
- package/dist/mcp-server/tools/cleanup.d.mts.map +1 -0
- package/dist/mcp-server/tools/cleanup.mjs +17 -0
- package/dist/mcp-server/tools/cleanup.mjs.map +1 -0
- package/dist/mcp-server/tools/clipboard.cjs +100 -0
- package/dist/mcp-server/tools/clipboard.cjs.map +1 -0
- package/dist/mcp-server/tools/clipboard.d.cts +16 -0
- package/dist/mcp-server/tools/clipboard.d.cts.map +1 -0
- package/dist/mcp-server/tools/clipboard.d.mts +16 -0
- package/dist/mcp-server/tools/clipboard.d.mts.map +1 -0
- package/dist/mcp-server/tools/clipboard.mjs +97 -0
- package/dist/mcp-server/tools/clipboard.mjs.map +1 -0
- package/dist/mcp-server/tools/context.cjs +66 -0
- package/dist/mcp-server/tools/context.cjs.map +1 -0
- package/dist/mcp-server/tools/context.d.cts +35 -0
- package/dist/mcp-server/tools/context.d.cts.map +1 -0
- package/dist/mcp-server/tools/context.d.mts +35 -0
- package/dist/mcp-server/tools/context.d.mts.map +1 -0
- package/dist/mcp-server/tools/context.mjs +62 -0
- package/dist/mcp-server/tools/context.mjs.map +1 -0
- package/dist/mcp-server/tools/definitions.cjs +463 -0
- package/dist/mcp-server/tools/definitions.cjs.map +1 -0
- package/dist/mcp-server/tools/definitions.d.cts +97 -0
- package/dist/mcp-server/tools/definitions.d.cts.map +1 -0
- package/dist/mcp-server/tools/definitions.d.mts +97 -0
- package/dist/mcp-server/tools/definitions.d.mts.map +1 -0
- package/dist/mcp-server/tools/definitions.mjs +451 -0
- package/dist/mcp-server/tools/definitions.mjs.map +1 -0
- package/dist/mcp-server/tools/discovery-tools.cjs +162 -0
- package/dist/mcp-server/tools/discovery-tools.cjs.map +1 -0
- package/dist/mcp-server/tools/discovery-tools.d.cts +26 -0
- package/dist/mcp-server/tools/discovery-tools.d.cts.map +1 -0
- package/dist/mcp-server/tools/discovery-tools.d.mts +26 -0
- package/dist/mcp-server/tools/discovery-tools.d.mts.map +1 -0
- package/dist/mcp-server/tools/discovery-tools.mjs +157 -0
- package/dist/mcp-server/tools/discovery-tools.mjs.map +1 -0
- package/dist/mcp-server/tools/error-classification.cjs +296 -0
- package/dist/mcp-server/tools/error-classification.cjs.map +1 -0
- package/dist/mcp-server/tools/error-classification.d.cts +135 -0
- package/dist/mcp-server/tools/error-classification.d.cts.map +1 -0
- package/dist/mcp-server/tools/error-classification.d.mts +135 -0
- package/dist/mcp-server/tools/error-classification.d.mts.map +1 -0
- package/dist/mcp-server/tools/error-classification.mjs +281 -0
- package/dist/mcp-server/tools/error-classification.mjs.map +1 -0
- package/dist/mcp-server/tools/helpers.cjs +149 -0
- package/dist/mcp-server/tools/helpers.cjs.map +1 -0
- package/dist/mcp-server/tools/helpers.d.cts +149 -0
- package/dist/mcp-server/tools/helpers.d.cts.map +1 -0
- package/dist/mcp-server/tools/helpers.d.mts +149 -0
- package/dist/mcp-server/tools/helpers.d.mts.map +1 -0
- package/dist/mcp-server/tools/helpers.mjs +141 -0
- package/dist/mcp-server/tools/helpers.mjs.map +1 -0
- package/dist/mcp-server/tools/index.cjs +27 -0
- package/dist/mcp-server/tools/index.cjs.map +1 -0
- package/dist/mcp-server/tools/index.d.cts +11 -0
- package/dist/mcp-server/tools/index.d.cts.map +1 -0
- package/dist/mcp-server/tools/index.d.mts +11 -0
- package/dist/mcp-server/tools/index.d.mts.map +1 -0
- package/dist/mcp-server/tools/index.mjs +11 -0
- package/dist/mcp-server/tools/index.mjs.map +1 -0
- package/dist/mcp-server/tools/interaction.cjs +190 -0
- package/dist/mcp-server/tools/interaction.cjs.map +1 -0
- package/dist/mcp-server/tools/interaction.d.cts +26 -0
- package/dist/mcp-server/tools/interaction.d.cts.map +1 -0
- package/dist/mcp-server/tools/interaction.d.mts +26 -0
- package/dist/mcp-server/tools/interaction.d.mts.map +1 -0
- package/dist/mcp-server/tools/interaction.mjs +185 -0
- package/dist/mcp-server/tools/interaction.mjs.map +1 -0
- package/dist/mcp-server/tools/knowledge.cjs +120 -0
- package/dist/mcp-server/tools/knowledge.cjs.map +1 -0
- package/dist/mcp-server/tools/knowledge.d.cts +34 -0
- package/dist/mcp-server/tools/knowledge.d.cts.map +1 -0
- package/dist/mcp-server/tools/knowledge.d.mts +34 -0
- package/dist/mcp-server/tools/knowledge.d.mts.map +1 -0
- package/dist/mcp-server/tools/knowledge.mjs +114 -0
- package/dist/mcp-server/tools/knowledge.mjs.map +1 -0
- package/dist/mcp-server/tools/launch.cjs +51 -0
- package/dist/mcp-server/tools/launch.cjs.map +1 -0
- package/dist/mcp-server/tools/launch.d.cts +10 -0
- package/dist/mcp-server/tools/launch.d.cts.map +1 -0
- package/dist/mcp-server/tools/launch.d.mts +10 -0
- package/dist/mcp-server/tools/launch.d.mts.map +1 -0
- package/dist/mcp-server/tools/launch.mjs +48 -0
- package/dist/mcp-server/tools/launch.mjs.map +1 -0
- package/dist/mcp-server/tools/navigation.cjs +242 -0
- package/dist/mcp-server/tools/navigation.cjs.map +1 -0
- package/dist/mcp-server/tools/navigation.d.cts +34 -0
- package/dist/mcp-server/tools/navigation.d.cts.map +1 -0
- package/dist/mcp-server/tools/navigation.d.mts +34 -0
- package/dist/mcp-server/tools/navigation.d.mts.map +1 -0
- package/dist/mcp-server/tools/navigation.mjs +236 -0
- package/dist/mcp-server/tools/navigation.mjs.map +1 -0
- package/dist/mcp-server/tools/registry.cjs +10 -0
- package/dist/mcp-server/tools/registry.cjs.map +1 -0
- package/dist/mcp-server/tools/registry.d.cts +4 -0
- package/dist/mcp-server/tools/registry.d.cts.map +1 -0
- package/dist/mcp-server/tools/registry.d.mts +4 -0
- package/dist/mcp-server/tools/registry.d.mts.map +1 -0
- package/dist/mcp-server/tools/registry.mjs +4 -0
- package/dist/mcp-server/tools/registry.mjs.map +1 -0
- package/dist/mcp-server/tools/run-tool.cjs +140 -0
- package/dist/mcp-server/tools/run-tool.cjs.map +1 -0
- package/dist/mcp-server/tools/run-tool.d.cts +39 -0
- package/dist/mcp-server/tools/run-tool.d.cts.map +1 -0
- package/dist/mcp-server/tools/run-tool.d.mts +39 -0
- package/dist/mcp-server/tools/run-tool.d.mts.map +1 -0
- package/dist/mcp-server/tools/run-tool.mjs +137 -0
- package/dist/mcp-server/tools/run-tool.mjs.map +1 -0
- package/dist/mcp-server/tools/screenshot.cjs +55 -0
- package/dist/mcp-server/tools/screenshot.cjs.map +1 -0
- package/dist/mcp-server/tools/screenshot.d.cts +10 -0
- package/dist/mcp-server/tools/screenshot.d.cts.map +1 -0
- package/dist/mcp-server/tools/screenshot.d.mts +10 -0
- package/dist/mcp-server/tools/screenshot.d.mts.map +1 -0
- package/dist/mcp-server/tools/screenshot.mjs +52 -0
- package/dist/mcp-server/tools/screenshot.mjs.map +1 -0
- package/dist/mcp-server/tools/seeding.cjs +214 -0
- package/dist/mcp-server/tools/seeding.cjs.map +1 -0
- package/dist/mcp-server/tools/seeding.d.cts +38 -0
- package/dist/mcp-server/tools/seeding.d.cts.map +1 -0
- package/dist/mcp-server/tools/seeding.d.mts +38 -0
- package/dist/mcp-server/tools/seeding.d.mts.map +1 -0
- package/dist/mcp-server/tools/seeding.mjs +208 -0
- package/dist/mcp-server/tools/seeding.mjs.map +1 -0
- package/dist/mcp-server/tools/state.cjs +69 -0
- package/dist/mcp-server/tools/state.cjs.map +1 -0
- package/dist/mcp-server/tools/state.d.cts +19 -0
- package/dist/mcp-server/tools/state.d.cts.map +1 -0
- package/dist/mcp-server/tools/state.d.mts +19 -0
- package/dist/mcp-server/tools/state.d.mts.map +1 -0
- package/dist/mcp-server/tools/state.mjs +66 -0
- package/dist/mcp-server/tools/state.mjs.map +1 -0
- package/dist/mcp-server/types/discovery.cjs +24 -0
- package/dist/mcp-server/types/discovery.cjs.map +1 -0
- package/dist/mcp-server/types/discovery.d.cts +30 -0
- package/dist/mcp-server/types/discovery.d.cts.map +1 -0
- package/dist/mcp-server/types/discovery.d.mts +30 -0
- package/dist/mcp-server/types/discovery.d.mts.map +1 -0
- package/dist/mcp-server/types/discovery.mjs +21 -0
- package/dist/mcp-server/types/discovery.mjs.map +1 -0
- package/dist/mcp-server/types/errors.cjs +33 -0
- package/dist/mcp-server/types/errors.cjs.map +1 -0
- package/dist/mcp-server/types/errors.d.cts +31 -0
- package/dist/mcp-server/types/errors.d.cts.map +1 -0
- package/dist/mcp-server/types/errors.d.mts +31 -0
- package/dist/mcp-server/types/errors.d.mts.map +1 -0
- package/dist/mcp-server/types/errors.mjs +30 -0
- package/dist/mcp-server/types/errors.mjs.map +1 -0
- package/dist/mcp-server/types/index.cjs +21 -0
- package/dist/mcp-server/types/index.cjs.map +1 -0
- package/dist/mcp-server/types/index.d.cts +10 -0
- package/dist/mcp-server/types/index.d.cts.map +1 -0
- package/dist/mcp-server/types/index.d.mts +10 -0
- package/dist/mcp-server/types/index.d.mts.map +1 -0
- package/dist/mcp-server/types/index.mjs +5 -0
- package/dist/mcp-server/types/index.mjs.map +1 -0
- package/dist/mcp-server/types/knowledge.cjs +3 -0
- package/dist/mcp-server/types/knowledge.cjs.map +1 -0
- package/dist/mcp-server/types/knowledge.d.cts +116 -0
- package/dist/mcp-server/types/knowledge.d.cts.map +1 -0
- package/dist/mcp-server/types/knowledge.d.mts +116 -0
- package/dist/mcp-server/types/knowledge.d.mts.map +1 -0
- package/dist/mcp-server/types/knowledge.mjs +2 -0
- package/dist/mcp-server/types/knowledge.mjs.map +1 -0
- package/dist/mcp-server/types/responses.cjs +3 -0
- package/dist/mcp-server/types/responses.cjs.map +1 -0
- package/dist/mcp-server/types/responses.d.cts +22 -0
- package/dist/mcp-server/types/responses.d.cts.map +1 -0
- package/dist/mcp-server/types/responses.d.mts +22 -0
- package/dist/mcp-server/types/responses.d.mts.map +1 -0
- package/dist/mcp-server/types/responses.mjs +2 -0
- package/dist/mcp-server/types/responses.mjs.map +1 -0
- package/dist/mcp-server/types/seeding.cjs +34 -0
- package/dist/mcp-server/types/seeding.cjs.map +1 -0
- package/dist/mcp-server/types/seeding.d.cts +40 -0
- package/dist/mcp-server/types/seeding.d.cts.map +1 -0
- package/dist/mcp-server/types/seeding.d.mts +40 -0
- package/dist/mcp-server/types/seeding.d.mts.map +1 -0
- package/dist/mcp-server/types/seeding.mjs +31 -0
- package/dist/mcp-server/types/seeding.mjs.map +1 -0
- package/dist/mcp-server/types/session.cjs +3 -0
- package/dist/mcp-server/types/session.cjs.map +1 -0
- package/dist/mcp-server/types/session.d.cts +11 -0
- package/dist/mcp-server/types/session.d.cts.map +1 -0
- package/dist/mcp-server/types/session.d.mts +11 -0
- package/dist/mcp-server/types/session.d.mts.map +1 -0
- package/dist/mcp-server/types/session.mjs +2 -0
- package/dist/mcp-server/types/session.mjs.map +1 -0
- package/dist/mcp-server/types/step-record.cjs +20 -0
- package/dist/mcp-server/types/step-record.cjs.map +1 -0
- package/dist/mcp-server/types/step-record.d.cts +86 -0
- package/dist/mcp-server/types/step-record.d.cts.map +1 -0
- package/dist/mcp-server/types/step-record.d.mts +86 -0
- package/dist/mcp-server/types/step-record.d.mts.map +1 -0
- package/dist/mcp-server/types/step-record.mjs +17 -0
- package/dist/mcp-server/types/step-record.mjs.map +1 -0
- package/dist/mcp-server/types/tool-inputs.cjs +3 -0
- package/dist/mcp-server/types/tool-inputs.cjs.map +1 -0
- package/dist/mcp-server/types/tool-inputs.d.cts +118 -0
- package/dist/mcp-server/types/tool-inputs.d.cts.map +1 -0
- package/dist/mcp-server/types/tool-inputs.d.mts +118 -0
- package/dist/mcp-server/types/tool-inputs.d.mts.map +1 -0
- package/dist/mcp-server/types/tool-inputs.mjs +2 -0
- package/dist/mcp-server/types/tool-inputs.mjs.map +1 -0
- package/dist/mcp-server/types/tool-outputs.cjs +3 -0
- package/dist/mcp-server/types/tool-outputs.cjs.map +1 -0
- package/dist/mcp-server/types/tool-outputs.d.cts +121 -0
- package/dist/mcp-server/types/tool-outputs.d.cts.map +1 -0
- package/dist/mcp-server/types/tool-outputs.d.mts +121 -0
- package/dist/mcp-server/types/tool-outputs.d.mts.map +1 -0
- package/dist/mcp-server/types/tool-outputs.mjs +2 -0
- package/dist/mcp-server/types/tool-outputs.mjs.map +1 -0
- package/dist/mcp-server/utils/errors.cjs +14 -0
- package/dist/mcp-server/utils/errors.cjs.map +1 -0
- package/dist/mcp-server/utils/errors.d.cts +9 -0
- package/dist/mcp-server/utils/errors.d.cts.map +1 -0
- package/dist/mcp-server/utils/errors.d.mts +9 -0
- package/dist/mcp-server/utils/errors.d.mts.map +1 -0
- package/dist/mcp-server/utils/errors.mjs +11 -0
- package/dist/mcp-server/utils/errors.mjs.map +1 -0
- package/dist/mcp-server/utils/index.cjs +22 -0
- package/dist/mcp-server/utils/index.cjs.map +1 -0
- package/dist/mcp-server/utils/index.d.cts +8 -0
- package/dist/mcp-server/utils/index.d.cts.map +1 -0
- package/dist/mcp-server/utils/index.d.mts +8 -0
- package/dist/mcp-server/utils/index.d.mts.map +1 -0
- package/dist/mcp-server/utils/index.mjs +8 -0
- package/dist/mcp-server/utils/index.mjs.map +1 -0
- package/dist/mcp-server/utils/logger.cjs +25 -0
- package/dist/mcp-server/utils/logger.cjs.map +1 -0
- package/dist/mcp-server/utils/logger.d.cts +9 -0
- package/dist/mcp-server/utils/logger.d.cts.map +1 -0
- package/dist/mcp-server/utils/logger.d.mts +9 -0
- package/dist/mcp-server/utils/logger.d.mts.map +1 -0
- package/dist/mcp-server/utils/logger.mjs +22 -0
- package/dist/mcp-server/utils/logger.mjs.map +1 -0
- package/dist/mcp-server/utils/redaction.cjs +24 -0
- package/dist/mcp-server/utils/redaction.cjs.map +1 -0
- package/dist/mcp-server/utils/redaction.d.cts +9 -0
- package/dist/mcp-server/utils/redaction.d.cts.map +1 -0
- package/dist/mcp-server/utils/redaction.d.mts +9 -0
- package/dist/mcp-server/utils/redaction.d.mts.map +1 -0
- package/dist/mcp-server/utils/redaction.mjs +20 -0
- package/dist/mcp-server/utils/redaction.mjs.map +1 -0
- package/dist/mcp-server/utils/response.cjs +49 -0
- package/dist/mcp-server/utils/response.cjs.map +1 -0
- package/dist/mcp-server/utils/response.d.cts +22 -0
- package/dist/mcp-server/utils/response.d.cts.map +1 -0
- package/dist/mcp-server/utils/response.d.mts +22 -0
- package/dist/mcp-server/utils/response.d.mts.map +1 -0
- package/dist/mcp-server/utils/response.mjs +45 -0
- package/dist/mcp-server/utils/response.mjs.map +1 -0
- package/dist/mcp-server/utils/targets.cjs +32 -0
- package/dist/mcp-server/utils/targets.cjs.map +1 -0
- package/dist/mcp-server/utils/targets.d.cts +25 -0
- package/dist/mcp-server/utils/targets.d.cts.map +1 -0
- package/dist/mcp-server/utils/targets.d.mts +25 -0
- package/dist/mcp-server/utils/targets.d.mts.map +1 -0
- package/dist/mcp-server/utils/targets.mjs +29 -0
- package/dist/mcp-server/utils/targets.mjs.map +1 -0
- package/dist/mcp-server/utils/time.cjs +39 -0
- package/dist/mcp-server/utils/time.cjs.map +1 -0
- package/dist/mcp-server/utils/time.d.cts +15 -0
- package/dist/mcp-server/utils/time.d.cts.map +1 -0
- package/dist/mcp-server/utils/time.d.mts +15 -0
- package/dist/mcp-server/utils/time.d.mts.map +1 -0
- package/dist/mcp-server/utils/time.mjs +35 -0
- package/dist/mcp-server/utils/time.mjs.map +1 -0
- package/dist/mcp-server/utils/type-guards.cjs +42 -0
- package/dist/mcp-server/utils/type-guards.cjs.map +1 -0
- package/dist/mcp-server/utils/type-guards.d.cts +30 -0
- package/dist/mcp-server/utils/type-guards.d.cts.map +1 -0
- package/dist/mcp-server/utils/type-guards.d.mts +30 -0
- package/dist/mcp-server/utils/type-guards.d.mts.map +1 -0
- package/dist/mcp-server/utils/type-guards.mjs +38 -0
- package/dist/mcp-server/utils/type-guards.mjs.map +1 -0
- package/dist/utils/fetch.cjs +36 -0
- package/dist/utils/fetch.cjs.map +1 -0
- package/dist/utils/fetch.d.cts +20 -0
- package/dist/utils/fetch.d.cts.map +1 -0
- package/dist/utils/fetch.d.mts +20 -0
- package/dist/utils/fetch.d.mts.map +1 -0
- package/dist/utils/fetch.mjs +33 -0
- package/dist/utils/fetch.mjs.map +1 -0
- package/dist/utils/index.cjs +11 -0
- package/dist/utils/index.cjs.map +1 -0
- package/dist/utils/index.d.cts +6 -0
- package/dist/utils/index.d.cts.map +1 -0
- package/dist/utils/index.d.mts +6 -0
- package/dist/utils/index.d.mts.map +1 -0
- package/dist/utils/index.mjs +6 -0
- package/dist/utils/index.mjs.map +1 -0
- package/dist/utils/service-readiness.cjs +75 -0
- package/dist/utils/service-readiness.cjs.map +1 -0
- package/dist/utils/service-readiness.d.cts +61 -0
- package/dist/utils/service-readiness.d.cts.map +1 -0
- package/dist/utils/service-readiness.d.mts +61 -0
- package/dist/utils/service-readiness.d.mts.map +1 -0
- package/dist/utils/service-readiness.mjs +72 -0
- package/dist/utils/service-readiness.mjs.map +1 -0
- package/package.json +119 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.cjs","sourceRoot":"","sources":["../../src/mcp-server/discovery.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Page, Locator } from '@playwright/test';\n\nimport { TEXT_PREVIEW_MAX_LENGTH } from './constants.js';\nimport type {\n TestIdItem,\n A11yNodeTrimmed,\n RawA11yNode,\n IncludedRole,\n} from './types';\nimport { INCLUDED_ROLES } from './types';\nimport { debugWarn } from './utils';\n\nconst INCLUDED_ROLES_SET = new Set<string>(INCLUDED_ROLES);\n\n/**\n * Regular expression to parse a single ARIA snapshot line descriptor.\n *\n * Matches: `role` + optional `\"name\"` + optional `[attr]` / `[attr=value]` groups\n *\n * Examples:\n * - `button \"Submit\"`\n * - `heading \"Title\" [level=1]`\n * - `checkbox \"Accept\" [checked]`\n * - `listitem`\n */\nconst ARIA_LINE_RE =\n /^(?<role>[a-zA-Z]+)(?:\\s+\"(?<name>(?:[^\"\\\\]|\\\\.)*)\")?(?<attrs>(?:\\s+\\[[^\\]]*\\])*)(?<hasChildren>:?)$/u;\n\n/**\n * Regular expression to match individual `[key]` or `[key=value]` attribute groups.\n */\nconst ATTR_RE = /\\[(?<key>[a-zA-Z]+)(?:=(?<value>[^\\]]*))?\\]/gu;\n\n/**\n * Parse a Playwright ariaSnapshot() YAML string into RawA11yNode[].\n *\n * The YAML format emitted by Playwright's `locator.ariaSnapshot()` (v1.49+)\n * is a line-based, indentation-structured tree where each node line is:\n * `- role \"name\" [attr=value]:` (children follow indented)\n * `- role \"name\" [attr=value]` (leaf node)\n * `- text: some text content` (text node, ignored for our purposes)\n *\n * @param yaml The YAML string returned by Playwright's ariaSnapshot()\n * @returns Array of parsed RawA11yNode trees\n */\nexport function parseAriaSnapshotYaml(yaml: string): RawA11yNode[] {\n if (!yaml?.trim()) {\n return [];\n }\n\n const lines = yaml.split('\\n');\n const roots: RawA11yNode[] = [];\n const stack: { node: RawA11yNode; indent: number }[] = [];\n\n for (const line of lines) {\n if (!line.trim()) {\n continue;\n }\n\n const stripped = line.replace(/^ */u, '');\n const indent = line.length - stripped.length;\n\n if (!stripped.startsWith('- ')) {\n continue;\n }\n\n const descriptor = stripped.slice(2);\n\n if (descriptor.startsWith('text:') || descriptor === 'text') {\n continue;\n }\n\n if (descriptor.startsWith('/')) {\n continue;\n }\n\n const node = parseAriaNodeDescriptor(descriptor);\n if (!node) {\n continue;\n }\n\n while (stack.length > 0 && stack[stack.length - 1].indent >= indent) {\n stack.pop();\n }\n\n if (stack.length === 0) {\n roots.push(node);\n } else {\n const parent = stack[stack.length - 1].node;\n parent.children ??= [];\n parent.children.push(node);\n }\n\n stack.push({ node, indent });\n }\n\n return roots;\n}\n\n/**\n * Parse a single ARIA node descriptor string into a RawA11yNode.\n *\n * @param descriptor The descriptor after removing the `- ` prefix, e.g. `button \"Submit\" [disabled]:`\n * @returns A parsed node, or null if the descriptor cannot be parsed\n */\nfunction parseAriaNodeDescriptor(descriptor: string): RawA11yNode | null {\n let desc = descriptor;\n\n // Strip trailing `:` (children indicator) or `: text` (inline text value)\n const trailingColonMatch = desc.match(\n /^(?<main>(?:[a-zA-Z]+)(?:\\s+\"(?:[^\"\\\\]|\\\\.)*\")?(?:\\s+\\[[^\\]]*\\])*)(?::(?<text>.*))?$/u,\n );\n if (trailingColonMatch?.groups?.main) {\n desc = trailingColonMatch.groups.main;\n }\n\n const match = ARIA_LINE_RE.exec(desc);\n if (!match?.groups) {\n return null;\n }\n\n const { role } = match.groups;\n const rawName = match.groups.name;\n\n const node: RawA11yNode = { role };\n\n if (rawName !== undefined) {\n node.name = rawName.replace(/\\\\\"/gu, '\"').replace(/\\\\\\\\/gu, '\\\\');\n }\n\n const attrsStr = match.groups.attrs;\n if (attrsStr) {\n let attrMatch;\n ATTR_RE.lastIndex = 0;\n while ((attrMatch = ATTR_RE.exec(attrsStr)) !== null) {\n const key = attrMatch.groups?.key;\n const value = attrMatch.groups?.value;\n\n switch (key) {\n case 'disabled':\n node.disabled = value !== 'false';\n break;\n case 'checked':\n if (value === 'mixed') {\n node.checked = 'mixed';\n } else {\n node.checked = value !== 'false';\n }\n break;\n case 'expanded':\n node.expanded = value !== 'false';\n break;\n default:\n break;\n }\n }\n }\n\n return node;\n}\n\n/**\n * Collect all visible test IDs from the current page.\n *\n * @param page The Playwright page to scan for test IDs\n * @param limit Maximum number of test IDs to return (default: 150)\n * @returns Array of test ID items with visibility and text content\n */\nexport async function collectTestIds(\n page: Page,\n limit: number = 150,\n): Promise<TestIdItem[]> {\n await page.waitForLoadState('domcontentloaded').catch(() => undefined);\n\n const locators = await page.locator('[data-testid]').all();\n const results: TestIdItem[] = [];\n\n for (const locator of locators) {\n if (results.length >= limit) {\n break;\n }\n\n try {\n const testId = await locator.getAttribute('data-testid');\n if (!testId) {\n continue;\n }\n\n const isVisible = await locator.isVisible().catch(() => false);\n const textContent = await locator\n .textContent()\n .then(\n (text) =>\n text?.trim().substring(0, TEXT_PREVIEW_MAX_LENGTH) ?? undefined,\n )\n .catch(() => undefined);\n\n results.push({\n testId,\n tag: 'element',\n text: textContent,\n visible: isVisible,\n });\n } catch (error) {\n debugWarn('discovery.collectTestIds', error);\n continue;\n }\n }\n\n return results;\n}\n\n/**\n * Collect a trimmed accessibility tree snapshot with deterministic refs.\n *\n * @param page The Playwright page to snapshot\n * @param rootSelector Optional CSS selector to scope the snapshot to a specific element\n * @returns Object containing trimmed accessibility nodes and a reference map (e1, e2, etc.)\n */\nexport async function collectTrimmedA11ySnapshot(\n page: Page,\n rootSelector?: string,\n): Promise<{\n nodes: A11yNodeTrimmed[];\n refMap: Map<string, string>;\n}> {\n const locator = rootSelector\n ? page.locator(rootSelector).first()\n : page.locator('body').first();\n\n const snapshotYaml: string = await locator.ariaSnapshot();\n\n if (!snapshotYaml) {\n return { nodes: [], refMap: new Map() };\n }\n\n const parsedRoots = parseAriaSnapshotYaml(snapshotYaml);\n\n if (parsedRoots.length === 0) {\n return { nodes: [], refMap: new Map() };\n }\n\n const trimmedNodes: A11yNodeTrimmed[] = [];\n const refMap = new Map<string, string>();\n let refCounter = 1;\n\n /**\n * Recursively traverse accessibility tree and collect included roles.\n *\n * @param node The current accessibility node to process\n * @param ancestorPath The path of ancestor nodes for context\n */\n function traverseNode(node: RawA11yNode, ancestorPath: string[]): void {\n const role = node.role?.toLowerCase() ?? '';\n const name = node.name ?? '';\n\n if (INCLUDED_ROLES_SET.has(role)) {\n const ref = `e${refCounter}`;\n refCounter += 1;\n const currentPath = [...ancestorPath];\n\n if (role === 'dialog' || role === 'heading') {\n currentPath.push(`${role}:${name}`);\n }\n\n const trimmedNode: A11yNodeTrimmed = {\n ref,\n role,\n name,\n path: currentPath,\n };\n\n if (node.disabled !== undefined) {\n trimmedNode.disabled = node.disabled;\n }\n if (node.checked !== undefined) {\n trimmedNode.checked = node.checked === true;\n }\n if (node.expanded !== undefined) {\n trimmedNode.expanded = node.expanded;\n }\n\n trimmedNodes.push(trimmedNode);\n\n const selector = buildA11ySelector(role as IncludedRole, name);\n refMap.set(ref, selector);\n }\n\n const updatedPath =\n role === 'dialog' || role === 'heading'\n ? [...ancestorPath, `${role}:${name}`]\n : ancestorPath;\n\n if (node.children) {\n for (const child of node.children) {\n traverseNode(child, updatedPath);\n }\n }\n }\n\n for (const root of parsedRoots) {\n traverseNode(root, []);\n }\n\n return { nodes: trimmedNodes, refMap };\n}\n\n/**\n * Build an accessibility selector string from role and name.\n *\n * @param role The ARIA role for the selector\n * @param name The accessible name to match\n * @returns Formatted selector string (e.g., \"role=button[name=\\\"Click me\\\"]\")\n */\nfunction buildA11ySelector(role: IncludedRole, name: string): string {\n const escapedName = name.replace(/\"/gu, '\\\\\"');\n return `role=${role}[name=\"${escapedName}\"]`;\n}\n\n/**\n * Resolve a target element to a Playwright Locator.\n *\n * @param page The Playwright page to search\n * @param targetType The type of target identifier (a11yRef, testId, or CSS selector)\n * @param targetValue The target value to resolve\n * @param refMap Map of a11y refs to selectors (used when targetType is 'a11yRef')\n * @returns Playwright Locator for the resolved element\n */\nexport async function resolveTarget(\n page: Page,\n targetType: 'a11yRef' | 'testId' | 'selector',\n targetValue: string,\n refMap: Map<string, string>,\n): Promise<Locator> {\n switch (targetType) {\n case 'a11yRef': {\n const selector = refMap.get(targetValue);\n if (!selector) {\n throw new Error(\n `Unknown a11yRef: ${targetValue}. ` +\n `Available refs: ${Array.from(refMap.keys()).join(', ')}`,\n );\n }\n return page.locator(selector);\n }\n case 'testId':\n return page.locator(`[data-testid=\"${targetValue}\"]`);\n case 'selector':\n return page.locator(targetValue);\n default: {\n const exhaustiveCheck: never = targetType;\n throw new Error(`Unknown target type: ${exhaustiveCheck as string}`);\n }\n }\n}\n\n/**\n * Wait for a target element to become visible.\n *\n * @param page The Playwright page to search\n * @param targetType The type of target identifier (a11yRef, testId, or CSS selector)\n * @param targetValue The target value to resolve\n * @param refMap Map of a11y refs to selectors (used when targetType is 'a11yRef')\n * @param timeoutMs Maximum time to wait in milliseconds\n * @returns Playwright Locator for the visible element\n */\nexport async function waitForTarget(\n page: Page,\n targetType: 'a11yRef' | 'testId' | 'selector',\n targetValue: string,\n refMap: Map<string, string>,\n timeoutMs: number,\n): Promise<Locator> {\n const locator = await resolveTarget(page, targetType, targetValue, refMap);\n await locator.waitFor({ state: 'visible', timeout: timeoutMs });\n return locator;\n}\n"]}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { Page, Locator } from "@playwright/test";
|
|
2
|
+
import type { TestIdItem, A11yNodeTrimmed, RawA11yNode } from "./types/index.cjs";
|
|
3
|
+
/**
|
|
4
|
+
* Parse a Playwright ariaSnapshot() YAML string into RawA11yNode[].
|
|
5
|
+
*
|
|
6
|
+
* The YAML format emitted by Playwright's `locator.ariaSnapshot()` (v1.49+)
|
|
7
|
+
* is a line-based, indentation-structured tree where each node line is:
|
|
8
|
+
* `- role "name" [attr=value]:` (children follow indented)
|
|
9
|
+
* `- role "name" [attr=value]` (leaf node)
|
|
10
|
+
* `- text: some text content` (text node, ignored for our purposes)
|
|
11
|
+
*
|
|
12
|
+
* @param yaml The YAML string returned by Playwright's ariaSnapshot()
|
|
13
|
+
* @returns Array of parsed RawA11yNode trees
|
|
14
|
+
*/
|
|
15
|
+
export declare function parseAriaSnapshotYaml(yaml: string): RawA11yNode[];
|
|
16
|
+
/**
|
|
17
|
+
* Collect all visible test IDs from the current page.
|
|
18
|
+
*
|
|
19
|
+
* @param page The Playwright page to scan for test IDs
|
|
20
|
+
* @param limit Maximum number of test IDs to return (default: 150)
|
|
21
|
+
* @returns Array of test ID items with visibility and text content
|
|
22
|
+
*/
|
|
23
|
+
export declare function collectTestIds(page: Page, limit?: number): Promise<TestIdItem[]>;
|
|
24
|
+
/**
|
|
25
|
+
* Collect a trimmed accessibility tree snapshot with deterministic refs.
|
|
26
|
+
*
|
|
27
|
+
* @param page The Playwright page to snapshot
|
|
28
|
+
* @param rootSelector Optional CSS selector to scope the snapshot to a specific element
|
|
29
|
+
* @returns Object containing trimmed accessibility nodes and a reference map (e1, e2, etc.)
|
|
30
|
+
*/
|
|
31
|
+
export declare function collectTrimmedA11ySnapshot(page: Page, rootSelector?: string): Promise<{
|
|
32
|
+
nodes: A11yNodeTrimmed[];
|
|
33
|
+
refMap: Map<string, string>;
|
|
34
|
+
}>;
|
|
35
|
+
/**
|
|
36
|
+
* Resolve a target element to a Playwright Locator.
|
|
37
|
+
*
|
|
38
|
+
* @param page The Playwright page to search
|
|
39
|
+
* @param targetType The type of target identifier (a11yRef, testId, or CSS selector)
|
|
40
|
+
* @param targetValue The target value to resolve
|
|
41
|
+
* @param refMap Map of a11y refs to selectors (used when targetType is 'a11yRef')
|
|
42
|
+
* @returns Playwright Locator for the resolved element
|
|
43
|
+
*/
|
|
44
|
+
export declare function resolveTarget(page: Page, targetType: 'a11yRef' | 'testId' | 'selector', targetValue: string, refMap: Map<string, string>): Promise<Locator>;
|
|
45
|
+
/**
|
|
46
|
+
* Wait for a target element to become visible.
|
|
47
|
+
*
|
|
48
|
+
* @param page The Playwright page to search
|
|
49
|
+
* @param targetType The type of target identifier (a11yRef, testId, or CSS selector)
|
|
50
|
+
* @param targetValue The target value to resolve
|
|
51
|
+
* @param refMap Map of a11y refs to selectors (used when targetType is 'a11yRef')
|
|
52
|
+
* @param timeoutMs Maximum time to wait in milliseconds
|
|
53
|
+
* @returns Playwright Locator for the visible element
|
|
54
|
+
*/
|
|
55
|
+
export declare function waitForTarget(page: Page, targetType: 'a11yRef' | 'testId' | 'selector', targetValue: string, refMap: Map<string, string>, timeoutMs: number): Promise<Locator>;
|
|
56
|
+
//# sourceMappingURL=discovery.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.d.cts","sourceRoot":"","sources":["../../src/mcp-server/discovery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,yBAAyB;AAGtD,OAAO,KAAK,EACV,UAAU,EACV,eAAe,EACf,WAAW,EAEZ,0BAAgB;AAyBjB;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,CAoDjE;AAgED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,IAAI,EACV,KAAK,GAAE,MAAY,GAClB,OAAO,CAAC,UAAU,EAAE,CAAC,CAuCvB;AAED;;;;;;GAMG;AACH,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,IAAI,EACV,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC;IACT,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7B,CAAC,CAgFD;AAcD;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,SAAS,GAAG,QAAQ,GAAG,UAAU,EAC7C,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC1B,OAAO,CAAC,OAAO,CAAC,CAqBlB;AAED;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,SAAS,GAAG,QAAQ,GAAG,UAAU,EAC7C,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC3B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC,CAIlB"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { Page, Locator } from "@playwright/test";
|
|
2
|
+
import type { TestIdItem, A11yNodeTrimmed, RawA11yNode } from "./types/index.mjs";
|
|
3
|
+
/**
|
|
4
|
+
* Parse a Playwright ariaSnapshot() YAML string into RawA11yNode[].
|
|
5
|
+
*
|
|
6
|
+
* The YAML format emitted by Playwright's `locator.ariaSnapshot()` (v1.49+)
|
|
7
|
+
* is a line-based, indentation-structured tree where each node line is:
|
|
8
|
+
* `- role "name" [attr=value]:` (children follow indented)
|
|
9
|
+
* `- role "name" [attr=value]` (leaf node)
|
|
10
|
+
* `- text: some text content` (text node, ignored for our purposes)
|
|
11
|
+
*
|
|
12
|
+
* @param yaml The YAML string returned by Playwright's ariaSnapshot()
|
|
13
|
+
* @returns Array of parsed RawA11yNode trees
|
|
14
|
+
*/
|
|
15
|
+
export declare function parseAriaSnapshotYaml(yaml: string): RawA11yNode[];
|
|
16
|
+
/**
|
|
17
|
+
* Collect all visible test IDs from the current page.
|
|
18
|
+
*
|
|
19
|
+
* @param page The Playwright page to scan for test IDs
|
|
20
|
+
* @param limit Maximum number of test IDs to return (default: 150)
|
|
21
|
+
* @returns Array of test ID items with visibility and text content
|
|
22
|
+
*/
|
|
23
|
+
export declare function collectTestIds(page: Page, limit?: number): Promise<TestIdItem[]>;
|
|
24
|
+
/**
|
|
25
|
+
* Collect a trimmed accessibility tree snapshot with deterministic refs.
|
|
26
|
+
*
|
|
27
|
+
* @param page The Playwright page to snapshot
|
|
28
|
+
* @param rootSelector Optional CSS selector to scope the snapshot to a specific element
|
|
29
|
+
* @returns Object containing trimmed accessibility nodes and a reference map (e1, e2, etc.)
|
|
30
|
+
*/
|
|
31
|
+
export declare function collectTrimmedA11ySnapshot(page: Page, rootSelector?: string): Promise<{
|
|
32
|
+
nodes: A11yNodeTrimmed[];
|
|
33
|
+
refMap: Map<string, string>;
|
|
34
|
+
}>;
|
|
35
|
+
/**
|
|
36
|
+
* Resolve a target element to a Playwright Locator.
|
|
37
|
+
*
|
|
38
|
+
* @param page The Playwright page to search
|
|
39
|
+
* @param targetType The type of target identifier (a11yRef, testId, or CSS selector)
|
|
40
|
+
* @param targetValue The target value to resolve
|
|
41
|
+
* @param refMap Map of a11y refs to selectors (used when targetType is 'a11yRef')
|
|
42
|
+
* @returns Playwright Locator for the resolved element
|
|
43
|
+
*/
|
|
44
|
+
export declare function resolveTarget(page: Page, targetType: 'a11yRef' | 'testId' | 'selector', targetValue: string, refMap: Map<string, string>): Promise<Locator>;
|
|
45
|
+
/**
|
|
46
|
+
* Wait for a target element to become visible.
|
|
47
|
+
*
|
|
48
|
+
* @param page The Playwright page to search
|
|
49
|
+
* @param targetType The type of target identifier (a11yRef, testId, or CSS selector)
|
|
50
|
+
* @param targetValue The target value to resolve
|
|
51
|
+
* @param refMap Map of a11y refs to selectors (used when targetType is 'a11yRef')
|
|
52
|
+
* @param timeoutMs Maximum time to wait in milliseconds
|
|
53
|
+
* @returns Playwright Locator for the visible element
|
|
54
|
+
*/
|
|
55
|
+
export declare function waitForTarget(page: Page, targetType: 'a11yRef' | 'testId' | 'selector', targetValue: string, refMap: Map<string, string>, timeoutMs: number): Promise<Locator>;
|
|
56
|
+
//# sourceMappingURL=discovery.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.d.mts","sourceRoot":"","sources":["../../src/mcp-server/discovery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,yBAAyB;AAGtD,OAAO,KAAK,EACV,UAAU,EACV,eAAe,EACf,WAAW,EAEZ,0BAAgB;AAyBjB;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,CAoDjE;AAgED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,IAAI,EACV,KAAK,GAAE,MAAY,GAClB,OAAO,CAAC,UAAU,EAAE,CAAC,CAuCvB;AAED;;;;;;GAMG;AACH,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,IAAI,EACV,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC;IACT,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7B,CAAC,CAgFD;AAcD;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,SAAS,GAAG,QAAQ,GAAG,UAAU,EAC7C,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC1B,OAAO,CAAC,OAAO,CAAC,CAqBlB;AAED;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,SAAS,GAAG,QAAQ,GAAG,UAAU,EAC7C,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC3B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC,CAIlB"}
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
import { TEXT_PREVIEW_MAX_LENGTH } from "./constants.mjs";
|
|
2
|
+
import { INCLUDED_ROLES } from "./types/index.mjs";
|
|
3
|
+
import { debugWarn } from "./utils/index.mjs";
|
|
4
|
+
const INCLUDED_ROLES_SET = new Set(INCLUDED_ROLES);
|
|
5
|
+
/**
|
|
6
|
+
* Regular expression to parse a single ARIA snapshot line descriptor.
|
|
7
|
+
*
|
|
8
|
+
* Matches: `role` + optional `"name"` + optional `[attr]` / `[attr=value]` groups
|
|
9
|
+
*
|
|
10
|
+
* Examples:
|
|
11
|
+
* - `button "Submit"`
|
|
12
|
+
* - `heading "Title" [level=1]`
|
|
13
|
+
* - `checkbox "Accept" [checked]`
|
|
14
|
+
* - `listitem`
|
|
15
|
+
*/
|
|
16
|
+
const ARIA_LINE_RE = /^(?<role>[a-zA-Z]+)(?:\s+"(?<name>(?:[^"\\]|\\.)*)")?(?<attrs>(?:\s+\[[^\]]*\])*)(?<hasChildren>:?)$/u;
|
|
17
|
+
/**
|
|
18
|
+
* Regular expression to match individual `[key]` or `[key=value]` attribute groups.
|
|
19
|
+
*/
|
|
20
|
+
const ATTR_RE = /\[(?<key>[a-zA-Z]+)(?:=(?<value>[^\]]*))?\]/gu;
|
|
21
|
+
/**
|
|
22
|
+
* Parse a Playwright ariaSnapshot() YAML string into RawA11yNode[].
|
|
23
|
+
*
|
|
24
|
+
* The YAML format emitted by Playwright's `locator.ariaSnapshot()` (v1.49+)
|
|
25
|
+
* is a line-based, indentation-structured tree where each node line is:
|
|
26
|
+
* `- role "name" [attr=value]:` (children follow indented)
|
|
27
|
+
* `- role "name" [attr=value]` (leaf node)
|
|
28
|
+
* `- text: some text content` (text node, ignored for our purposes)
|
|
29
|
+
*
|
|
30
|
+
* @param yaml The YAML string returned by Playwright's ariaSnapshot()
|
|
31
|
+
* @returns Array of parsed RawA11yNode trees
|
|
32
|
+
*/
|
|
33
|
+
export function parseAriaSnapshotYaml(yaml) {
|
|
34
|
+
if (!yaml?.trim()) {
|
|
35
|
+
return [];
|
|
36
|
+
}
|
|
37
|
+
const lines = yaml.split('\n');
|
|
38
|
+
const roots = [];
|
|
39
|
+
const stack = [];
|
|
40
|
+
for (const line of lines) {
|
|
41
|
+
if (!line.trim()) {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
const stripped = line.replace(/^ */u, '');
|
|
45
|
+
const indent = line.length - stripped.length;
|
|
46
|
+
if (!stripped.startsWith('- ')) {
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
const descriptor = stripped.slice(2);
|
|
50
|
+
if (descriptor.startsWith('text:') || descriptor === 'text') {
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
if (descriptor.startsWith('/')) {
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
const node = parseAriaNodeDescriptor(descriptor);
|
|
57
|
+
if (!node) {
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
while (stack.length > 0 && stack[stack.length - 1].indent >= indent) {
|
|
61
|
+
stack.pop();
|
|
62
|
+
}
|
|
63
|
+
if (stack.length === 0) {
|
|
64
|
+
roots.push(node);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
const parent = stack[stack.length - 1].node;
|
|
68
|
+
parent.children ?? (parent.children = []);
|
|
69
|
+
parent.children.push(node);
|
|
70
|
+
}
|
|
71
|
+
stack.push({ node, indent });
|
|
72
|
+
}
|
|
73
|
+
return roots;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Parse a single ARIA node descriptor string into a RawA11yNode.
|
|
77
|
+
*
|
|
78
|
+
* @param descriptor The descriptor after removing the `- ` prefix, e.g. `button "Submit" [disabled]:`
|
|
79
|
+
* @returns A parsed node, or null if the descriptor cannot be parsed
|
|
80
|
+
*/
|
|
81
|
+
function parseAriaNodeDescriptor(descriptor) {
|
|
82
|
+
let desc = descriptor;
|
|
83
|
+
// Strip trailing `:` (children indicator) or `: text` (inline text value)
|
|
84
|
+
const trailingColonMatch = desc.match(/^(?<main>(?:[a-zA-Z]+)(?:\s+"(?:[^"\\]|\\.)*")?(?:\s+\[[^\]]*\])*)(?::(?<text>.*))?$/u);
|
|
85
|
+
if (trailingColonMatch?.groups?.main) {
|
|
86
|
+
desc = trailingColonMatch.groups.main;
|
|
87
|
+
}
|
|
88
|
+
const match = ARIA_LINE_RE.exec(desc);
|
|
89
|
+
if (!match?.groups) {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
const { role } = match.groups;
|
|
93
|
+
const rawName = match.groups.name;
|
|
94
|
+
const node = { role };
|
|
95
|
+
if (rawName !== undefined) {
|
|
96
|
+
node.name = rawName.replace(/\\"/gu, '"').replace(/\\\\/gu, '\\');
|
|
97
|
+
}
|
|
98
|
+
const attrsStr = match.groups.attrs;
|
|
99
|
+
if (attrsStr) {
|
|
100
|
+
let attrMatch;
|
|
101
|
+
ATTR_RE.lastIndex = 0;
|
|
102
|
+
while ((attrMatch = ATTR_RE.exec(attrsStr)) !== null) {
|
|
103
|
+
const key = attrMatch.groups?.key;
|
|
104
|
+
const value = attrMatch.groups?.value;
|
|
105
|
+
switch (key) {
|
|
106
|
+
case 'disabled':
|
|
107
|
+
node.disabled = value !== 'false';
|
|
108
|
+
break;
|
|
109
|
+
case 'checked':
|
|
110
|
+
if (value === 'mixed') {
|
|
111
|
+
node.checked = 'mixed';
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
node.checked = value !== 'false';
|
|
115
|
+
}
|
|
116
|
+
break;
|
|
117
|
+
case 'expanded':
|
|
118
|
+
node.expanded = value !== 'false';
|
|
119
|
+
break;
|
|
120
|
+
default:
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return node;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Collect all visible test IDs from the current page.
|
|
129
|
+
*
|
|
130
|
+
* @param page The Playwright page to scan for test IDs
|
|
131
|
+
* @param limit Maximum number of test IDs to return (default: 150)
|
|
132
|
+
* @returns Array of test ID items with visibility and text content
|
|
133
|
+
*/
|
|
134
|
+
export async function collectTestIds(page, limit = 150) {
|
|
135
|
+
await page.waitForLoadState('domcontentloaded').catch(() => undefined);
|
|
136
|
+
const locators = await page.locator('[data-testid]').all();
|
|
137
|
+
const results = [];
|
|
138
|
+
for (const locator of locators) {
|
|
139
|
+
if (results.length >= limit) {
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
try {
|
|
143
|
+
const testId = await locator.getAttribute('data-testid');
|
|
144
|
+
if (!testId) {
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
const isVisible = await locator.isVisible().catch(() => false);
|
|
148
|
+
const textContent = await locator
|
|
149
|
+
.textContent()
|
|
150
|
+
.then((text) => text?.trim().substring(0, TEXT_PREVIEW_MAX_LENGTH) ?? undefined)
|
|
151
|
+
.catch(() => undefined);
|
|
152
|
+
results.push({
|
|
153
|
+
testId,
|
|
154
|
+
tag: 'element',
|
|
155
|
+
text: textContent,
|
|
156
|
+
visible: isVisible,
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
debugWarn('discovery.collectTestIds', error);
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return results;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Collect a trimmed accessibility tree snapshot with deterministic refs.
|
|
168
|
+
*
|
|
169
|
+
* @param page The Playwright page to snapshot
|
|
170
|
+
* @param rootSelector Optional CSS selector to scope the snapshot to a specific element
|
|
171
|
+
* @returns Object containing trimmed accessibility nodes and a reference map (e1, e2, etc.)
|
|
172
|
+
*/
|
|
173
|
+
export async function collectTrimmedA11ySnapshot(page, rootSelector) {
|
|
174
|
+
const locator = rootSelector
|
|
175
|
+
? page.locator(rootSelector).first()
|
|
176
|
+
: page.locator('body').first();
|
|
177
|
+
const snapshotYaml = await locator.ariaSnapshot();
|
|
178
|
+
if (!snapshotYaml) {
|
|
179
|
+
return { nodes: [], refMap: new Map() };
|
|
180
|
+
}
|
|
181
|
+
const parsedRoots = parseAriaSnapshotYaml(snapshotYaml);
|
|
182
|
+
if (parsedRoots.length === 0) {
|
|
183
|
+
return { nodes: [], refMap: new Map() };
|
|
184
|
+
}
|
|
185
|
+
const trimmedNodes = [];
|
|
186
|
+
const refMap = new Map();
|
|
187
|
+
let refCounter = 1;
|
|
188
|
+
/**
|
|
189
|
+
* Recursively traverse accessibility tree and collect included roles.
|
|
190
|
+
*
|
|
191
|
+
* @param node The current accessibility node to process
|
|
192
|
+
* @param ancestorPath The path of ancestor nodes for context
|
|
193
|
+
*/
|
|
194
|
+
function traverseNode(node, ancestorPath) {
|
|
195
|
+
const role = node.role?.toLowerCase() ?? '';
|
|
196
|
+
const name = node.name ?? '';
|
|
197
|
+
if (INCLUDED_ROLES_SET.has(role)) {
|
|
198
|
+
const ref = `e${refCounter}`;
|
|
199
|
+
refCounter += 1;
|
|
200
|
+
const currentPath = [...ancestorPath];
|
|
201
|
+
if (role === 'dialog' || role === 'heading') {
|
|
202
|
+
currentPath.push(`${role}:${name}`);
|
|
203
|
+
}
|
|
204
|
+
const trimmedNode = {
|
|
205
|
+
ref,
|
|
206
|
+
role,
|
|
207
|
+
name,
|
|
208
|
+
path: currentPath,
|
|
209
|
+
};
|
|
210
|
+
if (node.disabled !== undefined) {
|
|
211
|
+
trimmedNode.disabled = node.disabled;
|
|
212
|
+
}
|
|
213
|
+
if (node.checked !== undefined) {
|
|
214
|
+
trimmedNode.checked = node.checked === true;
|
|
215
|
+
}
|
|
216
|
+
if (node.expanded !== undefined) {
|
|
217
|
+
trimmedNode.expanded = node.expanded;
|
|
218
|
+
}
|
|
219
|
+
trimmedNodes.push(trimmedNode);
|
|
220
|
+
const selector = buildA11ySelector(role, name);
|
|
221
|
+
refMap.set(ref, selector);
|
|
222
|
+
}
|
|
223
|
+
const updatedPath = role === 'dialog' || role === 'heading'
|
|
224
|
+
? [...ancestorPath, `${role}:${name}`]
|
|
225
|
+
: ancestorPath;
|
|
226
|
+
if (node.children) {
|
|
227
|
+
for (const child of node.children) {
|
|
228
|
+
traverseNode(child, updatedPath);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
for (const root of parsedRoots) {
|
|
233
|
+
traverseNode(root, []);
|
|
234
|
+
}
|
|
235
|
+
return { nodes: trimmedNodes, refMap };
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Build an accessibility selector string from role and name.
|
|
239
|
+
*
|
|
240
|
+
* @param role The ARIA role for the selector
|
|
241
|
+
* @param name The accessible name to match
|
|
242
|
+
* @returns Formatted selector string (e.g., "role=button[name=\"Click me\"]")
|
|
243
|
+
*/
|
|
244
|
+
function buildA11ySelector(role, name) {
|
|
245
|
+
const escapedName = name.replace(/"/gu, '\\"');
|
|
246
|
+
return `role=${role}[name="${escapedName}"]`;
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Resolve a target element to a Playwright Locator.
|
|
250
|
+
*
|
|
251
|
+
* @param page The Playwright page to search
|
|
252
|
+
* @param targetType The type of target identifier (a11yRef, testId, or CSS selector)
|
|
253
|
+
* @param targetValue The target value to resolve
|
|
254
|
+
* @param refMap Map of a11y refs to selectors (used when targetType is 'a11yRef')
|
|
255
|
+
* @returns Playwright Locator for the resolved element
|
|
256
|
+
*/
|
|
257
|
+
export async function resolveTarget(page, targetType, targetValue, refMap) {
|
|
258
|
+
switch (targetType) {
|
|
259
|
+
case 'a11yRef': {
|
|
260
|
+
const selector = refMap.get(targetValue);
|
|
261
|
+
if (!selector) {
|
|
262
|
+
throw new Error(`Unknown a11yRef: ${targetValue}. ` +
|
|
263
|
+
`Available refs: ${Array.from(refMap.keys()).join(', ')}`);
|
|
264
|
+
}
|
|
265
|
+
return page.locator(selector);
|
|
266
|
+
}
|
|
267
|
+
case 'testId':
|
|
268
|
+
return page.locator(`[data-testid="${targetValue}"]`);
|
|
269
|
+
case 'selector':
|
|
270
|
+
return page.locator(targetValue);
|
|
271
|
+
default: {
|
|
272
|
+
const exhaustiveCheck = targetType;
|
|
273
|
+
throw new Error(`Unknown target type: ${exhaustiveCheck}`);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Wait for a target element to become visible.
|
|
279
|
+
*
|
|
280
|
+
* @param page The Playwright page to search
|
|
281
|
+
* @param targetType The type of target identifier (a11yRef, testId, or CSS selector)
|
|
282
|
+
* @param targetValue The target value to resolve
|
|
283
|
+
* @param refMap Map of a11y refs to selectors (used when targetType is 'a11yRef')
|
|
284
|
+
* @param timeoutMs Maximum time to wait in milliseconds
|
|
285
|
+
* @returns Playwright Locator for the visible element
|
|
286
|
+
*/
|
|
287
|
+
export async function waitForTarget(page, targetType, targetValue, refMap, timeoutMs) {
|
|
288
|
+
const locator = await resolveTarget(page, targetType, targetValue, refMap);
|
|
289
|
+
await locator.waitFor({ state: 'visible', timeout: timeoutMs });
|
|
290
|
+
return locator;
|
|
291
|
+
}
|
|
292
|
+
//# sourceMappingURL=discovery.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.mjs","sourceRoot":"","sources":["../../src/mcp-server/discovery.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Page, Locator } from '@playwright/test';\n\nimport { TEXT_PREVIEW_MAX_LENGTH } from './constants.js';\nimport type {\n TestIdItem,\n A11yNodeTrimmed,\n RawA11yNode,\n IncludedRole,\n} from './types';\nimport { INCLUDED_ROLES } from './types';\nimport { debugWarn } from './utils';\n\nconst INCLUDED_ROLES_SET = new Set<string>(INCLUDED_ROLES);\n\n/**\n * Regular expression to parse a single ARIA snapshot line descriptor.\n *\n * Matches: `role` + optional `\"name\"` + optional `[attr]` / `[attr=value]` groups\n *\n * Examples:\n * - `button \"Submit\"`\n * - `heading \"Title\" [level=1]`\n * - `checkbox \"Accept\" [checked]`\n * - `listitem`\n */\nconst ARIA_LINE_RE =\n /^(?<role>[a-zA-Z]+)(?:\\s+\"(?<name>(?:[^\"\\\\]|\\\\.)*)\")?(?<attrs>(?:\\s+\\[[^\\]]*\\])*)(?<hasChildren>:?)$/u;\n\n/**\n * Regular expression to match individual `[key]` or `[key=value]` attribute groups.\n */\nconst ATTR_RE = /\\[(?<key>[a-zA-Z]+)(?:=(?<value>[^\\]]*))?\\]/gu;\n\n/**\n * Parse a Playwright ariaSnapshot() YAML string into RawA11yNode[].\n *\n * The YAML format emitted by Playwright's `locator.ariaSnapshot()` (v1.49+)\n * is a line-based, indentation-structured tree where each node line is:\n * `- role \"name\" [attr=value]:` (children follow indented)\n * `- role \"name\" [attr=value]` (leaf node)\n * `- text: some text content` (text node, ignored for our purposes)\n *\n * @param yaml The YAML string returned by Playwright's ariaSnapshot()\n * @returns Array of parsed RawA11yNode trees\n */\nexport function parseAriaSnapshotYaml(yaml: string): RawA11yNode[] {\n if (!yaml?.trim()) {\n return [];\n }\n\n const lines = yaml.split('\\n');\n const roots: RawA11yNode[] = [];\n const stack: { node: RawA11yNode; indent: number }[] = [];\n\n for (const line of lines) {\n if (!line.trim()) {\n continue;\n }\n\n const stripped = line.replace(/^ */u, '');\n const indent = line.length - stripped.length;\n\n if (!stripped.startsWith('- ')) {\n continue;\n }\n\n const descriptor = stripped.slice(2);\n\n if (descriptor.startsWith('text:') || descriptor === 'text') {\n continue;\n }\n\n if (descriptor.startsWith('/')) {\n continue;\n }\n\n const node = parseAriaNodeDescriptor(descriptor);\n if (!node) {\n continue;\n }\n\n while (stack.length > 0 && stack[stack.length - 1].indent >= indent) {\n stack.pop();\n }\n\n if (stack.length === 0) {\n roots.push(node);\n } else {\n const parent = stack[stack.length - 1].node;\n parent.children ??= [];\n parent.children.push(node);\n }\n\n stack.push({ node, indent });\n }\n\n return roots;\n}\n\n/**\n * Parse a single ARIA node descriptor string into a RawA11yNode.\n *\n * @param descriptor The descriptor after removing the `- ` prefix, e.g. `button \"Submit\" [disabled]:`\n * @returns A parsed node, or null if the descriptor cannot be parsed\n */\nfunction parseAriaNodeDescriptor(descriptor: string): RawA11yNode | null {\n let desc = descriptor;\n\n // Strip trailing `:` (children indicator) or `: text` (inline text value)\n const trailingColonMatch = desc.match(\n /^(?<main>(?:[a-zA-Z]+)(?:\\s+\"(?:[^\"\\\\]|\\\\.)*\")?(?:\\s+\\[[^\\]]*\\])*)(?::(?<text>.*))?$/u,\n );\n if (trailingColonMatch?.groups?.main) {\n desc = trailingColonMatch.groups.main;\n }\n\n const match = ARIA_LINE_RE.exec(desc);\n if (!match?.groups) {\n return null;\n }\n\n const { role } = match.groups;\n const rawName = match.groups.name;\n\n const node: RawA11yNode = { role };\n\n if (rawName !== undefined) {\n node.name = rawName.replace(/\\\\\"/gu, '\"').replace(/\\\\\\\\/gu, '\\\\');\n }\n\n const attrsStr = match.groups.attrs;\n if (attrsStr) {\n let attrMatch;\n ATTR_RE.lastIndex = 0;\n while ((attrMatch = ATTR_RE.exec(attrsStr)) !== null) {\n const key = attrMatch.groups?.key;\n const value = attrMatch.groups?.value;\n\n switch (key) {\n case 'disabled':\n node.disabled = value !== 'false';\n break;\n case 'checked':\n if (value === 'mixed') {\n node.checked = 'mixed';\n } else {\n node.checked = value !== 'false';\n }\n break;\n case 'expanded':\n node.expanded = value !== 'false';\n break;\n default:\n break;\n }\n }\n }\n\n return node;\n}\n\n/**\n * Collect all visible test IDs from the current page.\n *\n * @param page The Playwright page to scan for test IDs\n * @param limit Maximum number of test IDs to return (default: 150)\n * @returns Array of test ID items with visibility and text content\n */\nexport async function collectTestIds(\n page: Page,\n limit: number = 150,\n): Promise<TestIdItem[]> {\n await page.waitForLoadState('domcontentloaded').catch(() => undefined);\n\n const locators = await page.locator('[data-testid]').all();\n const results: TestIdItem[] = [];\n\n for (const locator of locators) {\n if (results.length >= limit) {\n break;\n }\n\n try {\n const testId = await locator.getAttribute('data-testid');\n if (!testId) {\n continue;\n }\n\n const isVisible = await locator.isVisible().catch(() => false);\n const textContent = await locator\n .textContent()\n .then(\n (text) =>\n text?.trim().substring(0, TEXT_PREVIEW_MAX_LENGTH) ?? undefined,\n )\n .catch(() => undefined);\n\n results.push({\n testId,\n tag: 'element',\n text: textContent,\n visible: isVisible,\n });\n } catch (error) {\n debugWarn('discovery.collectTestIds', error);\n continue;\n }\n }\n\n return results;\n}\n\n/**\n * Collect a trimmed accessibility tree snapshot with deterministic refs.\n *\n * @param page The Playwright page to snapshot\n * @param rootSelector Optional CSS selector to scope the snapshot to a specific element\n * @returns Object containing trimmed accessibility nodes and a reference map (e1, e2, etc.)\n */\nexport async function collectTrimmedA11ySnapshot(\n page: Page,\n rootSelector?: string,\n): Promise<{\n nodes: A11yNodeTrimmed[];\n refMap: Map<string, string>;\n}> {\n const locator = rootSelector\n ? page.locator(rootSelector).first()\n : page.locator('body').first();\n\n const snapshotYaml: string = await locator.ariaSnapshot();\n\n if (!snapshotYaml) {\n return { nodes: [], refMap: new Map() };\n }\n\n const parsedRoots = parseAriaSnapshotYaml(snapshotYaml);\n\n if (parsedRoots.length === 0) {\n return { nodes: [], refMap: new Map() };\n }\n\n const trimmedNodes: A11yNodeTrimmed[] = [];\n const refMap = new Map<string, string>();\n let refCounter = 1;\n\n /**\n * Recursively traverse accessibility tree and collect included roles.\n *\n * @param node The current accessibility node to process\n * @param ancestorPath The path of ancestor nodes for context\n */\n function traverseNode(node: RawA11yNode, ancestorPath: string[]): void {\n const role = node.role?.toLowerCase() ?? '';\n const name = node.name ?? '';\n\n if (INCLUDED_ROLES_SET.has(role)) {\n const ref = `e${refCounter}`;\n refCounter += 1;\n const currentPath = [...ancestorPath];\n\n if (role === 'dialog' || role === 'heading') {\n currentPath.push(`${role}:${name}`);\n }\n\n const trimmedNode: A11yNodeTrimmed = {\n ref,\n role,\n name,\n path: currentPath,\n };\n\n if (node.disabled !== undefined) {\n trimmedNode.disabled = node.disabled;\n }\n if (node.checked !== undefined) {\n trimmedNode.checked = node.checked === true;\n }\n if (node.expanded !== undefined) {\n trimmedNode.expanded = node.expanded;\n }\n\n trimmedNodes.push(trimmedNode);\n\n const selector = buildA11ySelector(role as IncludedRole, name);\n refMap.set(ref, selector);\n }\n\n const updatedPath =\n role === 'dialog' || role === 'heading'\n ? [...ancestorPath, `${role}:${name}`]\n : ancestorPath;\n\n if (node.children) {\n for (const child of node.children) {\n traverseNode(child, updatedPath);\n }\n }\n }\n\n for (const root of parsedRoots) {\n traverseNode(root, []);\n }\n\n return { nodes: trimmedNodes, refMap };\n}\n\n/**\n * Build an accessibility selector string from role and name.\n *\n * @param role The ARIA role for the selector\n * @param name The accessible name to match\n * @returns Formatted selector string (e.g., \"role=button[name=\\\"Click me\\\"]\")\n */\nfunction buildA11ySelector(role: IncludedRole, name: string): string {\n const escapedName = name.replace(/\"/gu, '\\\\\"');\n return `role=${role}[name=\"${escapedName}\"]`;\n}\n\n/**\n * Resolve a target element to a Playwright Locator.\n *\n * @param page The Playwright page to search\n * @param targetType The type of target identifier (a11yRef, testId, or CSS selector)\n * @param targetValue The target value to resolve\n * @param refMap Map of a11y refs to selectors (used when targetType is 'a11yRef')\n * @returns Playwright Locator for the resolved element\n */\nexport async function resolveTarget(\n page: Page,\n targetType: 'a11yRef' | 'testId' | 'selector',\n targetValue: string,\n refMap: Map<string, string>,\n): Promise<Locator> {\n switch (targetType) {\n case 'a11yRef': {\n const selector = refMap.get(targetValue);\n if (!selector) {\n throw new Error(\n `Unknown a11yRef: ${targetValue}. ` +\n `Available refs: ${Array.from(refMap.keys()).join(', ')}`,\n );\n }\n return page.locator(selector);\n }\n case 'testId':\n return page.locator(`[data-testid=\"${targetValue}\"]`);\n case 'selector':\n return page.locator(targetValue);\n default: {\n const exhaustiveCheck: never = targetType;\n throw new Error(`Unknown target type: ${exhaustiveCheck as string}`);\n }\n }\n}\n\n/**\n * Wait for a target element to become visible.\n *\n * @param page The Playwright page to search\n * @param targetType The type of target identifier (a11yRef, testId, or CSS selector)\n * @param targetValue The target value to resolve\n * @param refMap Map of a11y refs to selectors (used when targetType is 'a11yRef')\n * @param timeoutMs Maximum time to wait in milliseconds\n * @returns Playwright Locator for the visible element\n */\nexport async function waitForTarget(\n page: Page,\n targetType: 'a11yRef' | 'testId' | 'selector',\n targetValue: string,\n refMap: Map<string, string>,\n timeoutMs: number,\n): Promise<Locator> {\n const locator = await resolveTarget(page, targetType, targetValue, refMap);\n await locator.waitFor({ state: 'visible', timeout: timeoutMs });\n return locator;\n}\n"]}
|