@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,1196 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
36
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
37
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
38
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
39
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
40
|
+
};
|
|
41
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
42
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
43
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
44
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
45
|
+
};
|
|
46
|
+
var _KnowledgeStore_instances, _KnowledgeStore_knowledgeRoot, _KnowledgeStore_sessionIdPrefix, _KnowledgeStore_toolPrefix, _KnowledgeStore_sessionMetadataCache, _KnowledgeStore_actionableTools, _KnowledgeStore_toolActionMap, _KnowledgeStore_discoveryTools, _KnowledgeStore_readSessionMetadata, _KnowledgeStore_matchesFilters, _KnowledgeStore_computeLabels, _KnowledgeStore_stepMatchesFilters, _KnowledgeStore_loadSessionSteps, _KnowledgeStore_sanitizeInput, _KnowledgeStore_getEnvironmentInfo, _KnowledgeStore_summarizeStep, _KnowledgeStore_generateSnippet, _KnowledgeStore_generateStepNotes, _KnowledgeStore_computeSessionScore, _KnowledgeStore_computeSearchScore, _KnowledgeStore_getRelatedSessions, _KnowledgeStore_getSimilarSteps, _KnowledgeStore_lookupA11yHint, _KnowledgeStore_computeSimilarityScore, _KnowledgeStore_buildSuggestedActions, _KnowledgeStore_buildPreferredTarget, _KnowledgeStore_buildFallbackTargets, _KnowledgeStore_toolToAction, _KnowledgeStore_buildAvoidList;
|
|
47
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
+
exports.knowledgeStore = exports.KnowledgeStore = void 0;
|
|
49
|
+
exports.createDefaultObservation = createDefaultObservation;
|
|
50
|
+
exports.createKnowledgeStore = createKnowledgeStore;
|
|
51
|
+
exports.setKnowledgeStore = setKnowledgeStore;
|
|
52
|
+
exports.getKnowledgeStore = getKnowledgeStore;
|
|
53
|
+
exports.hasKnowledgeStore = hasKnowledgeStore;
|
|
54
|
+
/* eslint-disable @typescript-eslint/explicit-function-return-type */
|
|
55
|
+
/* eslint-disable id-length */
|
|
56
|
+
const fs_1 = require("fs");
|
|
57
|
+
const path = __importStar(require("path"));
|
|
58
|
+
const tokenization_js_1 = require("./tokenization.cjs");
|
|
59
|
+
const utils_1 = require("./utils/index.cjs");
|
|
60
|
+
const KNOWLEDGE_ROOT = 'test-artifacts/llm-knowledge';
|
|
61
|
+
const SCHEMA_VERSION = 1;
|
|
62
|
+
const PRIOR_KNOWLEDGE_CONFIG = {
|
|
63
|
+
/** Look back 48 hours for related sessions - balances recency with having enough data */
|
|
64
|
+
windowHours: 48,
|
|
65
|
+
/** Limit to 5 related sessions to keep context focused and token-efficient */
|
|
66
|
+
maxRelatedSessions: 5,
|
|
67
|
+
/** Maximum 10 similar steps to include - prevents overwhelming the context */
|
|
68
|
+
maxSimilarSteps: 10,
|
|
69
|
+
/** Limit to 5 suggested actions to keep recommendations focused and actionable */
|
|
70
|
+
maxSuggestedActions: 5,
|
|
71
|
+
/** Maximum 5 items in avoid list to prevent excessive warnings */
|
|
72
|
+
maxAvoid: 5,
|
|
73
|
+
/** Require at least 2 failures before suggesting avoidance - prevents false positives */
|
|
74
|
+
minAvoidFailureCount: 2,
|
|
75
|
+
};
|
|
76
|
+
const SCAN_LIMITS = {
|
|
77
|
+
/** Scan up to 20 sessions to balance thoroughness with performance */
|
|
78
|
+
maxSessionsToScan: 20,
|
|
79
|
+
/** Limit to 500 steps per session to avoid memory issues with large sessions */
|
|
80
|
+
maxStepsPerSession: 500,
|
|
81
|
+
/** Hard limit of 2000 total steps across all sessions to prevent excessive scanning */
|
|
82
|
+
maxTotalSteps: 2000,
|
|
83
|
+
};
|
|
84
|
+
const SIMILARITY_WEIGHTS = {
|
|
85
|
+
/** Highest weight - same screen is the strongest indicator of relevance */
|
|
86
|
+
sameScreen: 8,
|
|
87
|
+
/** URL path overlap indicates similar context/feature area */
|
|
88
|
+
urlPathOverlap: 6,
|
|
89
|
+
/** Test ID overlap shows similar UI elements are present */
|
|
90
|
+
testIdOverlap: 3,
|
|
91
|
+
/** Accessibility node overlap provides additional context matching */
|
|
92
|
+
a11yOverlap: 2,
|
|
93
|
+
/** Actionable tools (click, type, etc.) are more relevant than discovery tools */
|
|
94
|
+
actionableTool: 2,
|
|
95
|
+
};
|
|
96
|
+
const MAX_SIMILARITY_SCORE = SIMILARITY_WEIGHTS.sameScreen +
|
|
97
|
+
SIMILARITY_WEIGHTS.urlPathOverlap +
|
|
98
|
+
SIMILARITY_WEIGHTS.testIdOverlap * 3 +
|
|
99
|
+
SIMILARITY_WEIGHTS.a11yOverlap * 2 +
|
|
100
|
+
SIMILARITY_WEIGHTS.actionableTool;
|
|
101
|
+
/**
|
|
102
|
+
* Extract path tokens from URL hash fragment
|
|
103
|
+
*
|
|
104
|
+
* @param url - The URL to extract tokens from
|
|
105
|
+
* @returns Array of path tokens from the hash fragment
|
|
106
|
+
*/
|
|
107
|
+
function extractPathTokens(url) {
|
|
108
|
+
try {
|
|
109
|
+
const hashPart = url.split('#')[1] ?? '';
|
|
110
|
+
return hashPart
|
|
111
|
+
.split('/')
|
|
112
|
+
.filter((t) => t.length > 0 && !t.startsWith('0x'));
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
(0, utils_1.debugWarn)('knowledge-store.extractPathTokens', error);
|
|
116
|
+
return [];
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Persistent cross-session knowledge store for recording and querying tool invocations.
|
|
121
|
+
*/
|
|
122
|
+
class KnowledgeStore {
|
|
123
|
+
/**
|
|
124
|
+
* Initialize KnowledgeStore with optional configuration
|
|
125
|
+
*
|
|
126
|
+
* @param config - Configuration options for the store
|
|
127
|
+
*/
|
|
128
|
+
constructor(config = {}) {
|
|
129
|
+
_KnowledgeStore_instances.add(this);
|
|
130
|
+
_KnowledgeStore_knowledgeRoot.set(this, void 0);
|
|
131
|
+
_KnowledgeStore_sessionIdPrefix.set(this, void 0);
|
|
132
|
+
_KnowledgeStore_toolPrefix.set(this, void 0);
|
|
133
|
+
_KnowledgeStore_sessionMetadataCache.set(this, new Map());
|
|
134
|
+
_KnowledgeStore_actionableTools.set(this, void 0);
|
|
135
|
+
_KnowledgeStore_toolActionMap.set(this, void 0);
|
|
136
|
+
_KnowledgeStore_discoveryTools.set(this, void 0);
|
|
137
|
+
__classPrivateFieldSet(this, _KnowledgeStore_knowledgeRoot, config.rootDir ?? path.join(process.cwd(), KNOWLEDGE_ROOT), "f");
|
|
138
|
+
__classPrivateFieldSet(this, _KnowledgeStore_sessionIdPrefix, config.sessionIdPrefix ?? 'mm-', "f");
|
|
139
|
+
__classPrivateFieldSet(this, _KnowledgeStore_toolPrefix, config.toolPrefix ?? 'mm', "f");
|
|
140
|
+
const prefix = __classPrivateFieldGet(this, _KnowledgeStore_toolPrefix, "f");
|
|
141
|
+
__classPrivateFieldSet(this, _KnowledgeStore_actionableTools, [
|
|
142
|
+
`${prefix}_click`,
|
|
143
|
+
`${prefix}_type`,
|
|
144
|
+
`${prefix}_wait_for`,
|
|
145
|
+
`${prefix}_navigate`,
|
|
146
|
+
`${prefix}_wait_for_notification`,
|
|
147
|
+
], "f");
|
|
148
|
+
__classPrivateFieldSet(this, _KnowledgeStore_toolActionMap, {
|
|
149
|
+
[`${prefix}_click`]: 'click',
|
|
150
|
+
[`${prefix}_type`]: 'type',
|
|
151
|
+
[`${prefix}_wait_for`]: 'wait_for',
|
|
152
|
+
[`${prefix}_navigate`]: 'navigate',
|
|
153
|
+
[`${prefix}_wait_for_notification`]: 'wait_for_notification',
|
|
154
|
+
}, "f");
|
|
155
|
+
__classPrivateFieldSet(this, _KnowledgeStore_discoveryTools, [
|
|
156
|
+
`${prefix}_describe_screen`,
|
|
157
|
+
`${prefix}_list_testids`,
|
|
158
|
+
`${prefix}_accessibility_snapshot`,
|
|
159
|
+
`${prefix}_get_state`,
|
|
160
|
+
], "f");
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Write session metadata to disk
|
|
164
|
+
*
|
|
165
|
+
* @param metadata - Session metadata to persist
|
|
166
|
+
* @returns Path to the written metadata file
|
|
167
|
+
*/
|
|
168
|
+
async writeSessionMetadata(metadata) {
|
|
169
|
+
const sessionDir = path.join(__classPrivateFieldGet(this, _KnowledgeStore_knowledgeRoot, "f"), metadata.sessionId);
|
|
170
|
+
await fs_1.promises.mkdir(sessionDir, { recursive: true });
|
|
171
|
+
const filepath = path.join(sessionDir, 'session.json');
|
|
172
|
+
await fs_1.promises.writeFile(filepath, JSON.stringify(metadata, null, 2));
|
|
173
|
+
__classPrivateFieldGet(this, _KnowledgeStore_sessionMetadataCache, "f").set(metadata.sessionId, metadata);
|
|
174
|
+
return filepath;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* List sessions with optional filtering and limit
|
|
178
|
+
*
|
|
179
|
+
* @param limit - Maximum number of sessions to return
|
|
180
|
+
* @param filters - Optional filters for sessions
|
|
181
|
+
* @returns Array of session summaries
|
|
182
|
+
*/
|
|
183
|
+
async listSessions(limit, filters) {
|
|
184
|
+
const sessionIds = await this.getAllSessionIds();
|
|
185
|
+
const sessions = [];
|
|
186
|
+
for (const sid of sessionIds) {
|
|
187
|
+
const metadata = await __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_readSessionMetadata).call(this, sid);
|
|
188
|
+
if (!metadata) {
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
if (!__classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_matchesFilters).call(this, metadata, filters)) {
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
sessions.push({
|
|
195
|
+
metadata,
|
|
196
|
+
createdAt: new Date(metadata.createdAt),
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
sessions.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());
|
|
200
|
+
return sessions.slice(0, limit).map((s) => ({
|
|
201
|
+
sessionId: s.metadata.sessionId,
|
|
202
|
+
createdAt: s.metadata.createdAt,
|
|
203
|
+
goal: s.metadata.goal,
|
|
204
|
+
flowTags: s.metadata.flowTags,
|
|
205
|
+
tags: s.metadata.tags,
|
|
206
|
+
}));
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Resolve session IDs based on scope and filters
|
|
210
|
+
*
|
|
211
|
+
* @param scope - Scope for session resolution (current, all, or specific sessionId)
|
|
212
|
+
* @param currentSessionId - Current session ID for scope resolution
|
|
213
|
+
* @param filters - Optional filters to apply to sessions
|
|
214
|
+
* @returns Array of resolved session IDs
|
|
215
|
+
*/
|
|
216
|
+
async resolveSessionIds(scope, currentSessionId, filters) {
|
|
217
|
+
if (scope === 'current') {
|
|
218
|
+
return currentSessionId ? [currentSessionId] : [];
|
|
219
|
+
}
|
|
220
|
+
if (typeof scope === 'object' && 'sessionId' in scope) {
|
|
221
|
+
return [scope.sessionId];
|
|
222
|
+
}
|
|
223
|
+
const allIds = await this.getAllSessionIds();
|
|
224
|
+
if (!filters) {
|
|
225
|
+
return allIds;
|
|
226
|
+
}
|
|
227
|
+
const filtered = [];
|
|
228
|
+
for (const sid of allIds) {
|
|
229
|
+
const metadata = await __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_readSessionMetadata).call(this, sid);
|
|
230
|
+
if (metadata && __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_matchesFilters).call(this, metadata, filters)) {
|
|
231
|
+
filtered.push(sid);
|
|
232
|
+
}
|
|
233
|
+
else if (!metadata) {
|
|
234
|
+
filtered.push(sid);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return filtered;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Record a tool execution step with context and artifacts
|
|
241
|
+
*
|
|
242
|
+
* @param params - Step recording parameters
|
|
243
|
+
* @param params.sessionId - Session ID for this step
|
|
244
|
+
* @param params.toolName - Name of the tool executed
|
|
245
|
+
* @param params.input - Tool input parameters
|
|
246
|
+
* @param params.target - Target element information
|
|
247
|
+
* @param params.outcome - Execution outcome (success/failure)
|
|
248
|
+
* @param params.observation - Observed state after execution
|
|
249
|
+
* @param params.durationMs - Execution duration in milliseconds
|
|
250
|
+
* @param params.screenshotPath - Path to screenshot artifact
|
|
251
|
+
* @param params.screenshotDimensions - Screenshot dimensions
|
|
252
|
+
* @param params.screenshotDimensions.width - Screenshot width in pixels
|
|
253
|
+
* @param params.screenshotDimensions.height - Screenshot height in pixels
|
|
254
|
+
* @param params.context - Execution context (e2e or prod)
|
|
255
|
+
* @returns Path to the recorded step file
|
|
256
|
+
*/
|
|
257
|
+
async recordStep(params) {
|
|
258
|
+
const timestamp = new Date();
|
|
259
|
+
const filesafeTimestamp = (0, utils_1.generateFilesafeTimestamp)(timestamp);
|
|
260
|
+
const sessionDir = path.join(__classPrivateFieldGet(this, _KnowledgeStore_knowledgeRoot, "f"), params.sessionId);
|
|
261
|
+
const stepsDir = path.join(sessionDir, 'steps');
|
|
262
|
+
await fs_1.promises.mkdir(stepsDir, { recursive: true });
|
|
263
|
+
const sanitizedInput = __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_sanitizeInput).call(this, params.toolName, params.input);
|
|
264
|
+
const labels = __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_computeLabels).call(this, params.toolName, params.target, params.outcome);
|
|
265
|
+
const stepRecord = {
|
|
266
|
+
schemaVersion: SCHEMA_VERSION,
|
|
267
|
+
timestamp: timestamp.toISOString(),
|
|
268
|
+
sessionId: params.sessionId,
|
|
269
|
+
context: params.context,
|
|
270
|
+
environment: __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_getEnvironmentInfo).call(this),
|
|
271
|
+
tool: {
|
|
272
|
+
name: params.toolName,
|
|
273
|
+
input: sanitizedInput.input,
|
|
274
|
+
target: params.target,
|
|
275
|
+
textRedacted: sanitizedInput.textRedacted,
|
|
276
|
+
textLength: sanitizedInput.textLength,
|
|
277
|
+
},
|
|
278
|
+
timing: {
|
|
279
|
+
durationMs: params.durationMs,
|
|
280
|
+
},
|
|
281
|
+
outcome: params.outcome,
|
|
282
|
+
observation: params.observation,
|
|
283
|
+
labels,
|
|
284
|
+
};
|
|
285
|
+
if (params.screenshotPath) {
|
|
286
|
+
stepRecord.artifacts = {
|
|
287
|
+
screenshot: {
|
|
288
|
+
path: params.screenshotPath,
|
|
289
|
+
width: params.screenshotDimensions?.width,
|
|
290
|
+
height: params.screenshotDimensions?.height,
|
|
291
|
+
},
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
const filename = `${filesafeTimestamp}-${params.toolName}.json`;
|
|
295
|
+
const filepath = path.join(stepsDir, filename);
|
|
296
|
+
await fs_1.promises.writeFile(filepath, JSON.stringify(stepRecord, null, 2));
|
|
297
|
+
return filepath;
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Get the last N steps from the knowledge store
|
|
301
|
+
*
|
|
302
|
+
* @param n - Number of steps to retrieve
|
|
303
|
+
* @param scope - Scope for step retrieval (current, all, or specific sessionId)
|
|
304
|
+
* @param currentSessionId - Current session ID for scope resolution
|
|
305
|
+
* @param filters - Optional filters to apply to steps
|
|
306
|
+
* @returns Array of step summaries
|
|
307
|
+
*/
|
|
308
|
+
async getLastSteps(n, scope, currentSessionId, filters) {
|
|
309
|
+
const sessionIds = await this.resolveSessionIds(scope, currentSessionId, filters);
|
|
310
|
+
const allSteps = [];
|
|
311
|
+
for (const sid of sessionIds) {
|
|
312
|
+
const steps = await __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_loadSessionSteps).call(this, sid);
|
|
313
|
+
for (const s of steps) {
|
|
314
|
+
if (__classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_stepMatchesFilters).call(this, s.step, filters)) {
|
|
315
|
+
allSteps.push(s);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
allSteps.sort((a, b) => new Date(b.step.timestamp).getTime() -
|
|
320
|
+
new Date(a.step.timestamp).getTime());
|
|
321
|
+
return allSteps.slice(0, n).map((item) => __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_summarizeStep).call(this, item.step));
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Search steps by query across sessions
|
|
325
|
+
*
|
|
326
|
+
* @param query - Search query string
|
|
327
|
+
* @param limit - Maximum number of results to return
|
|
328
|
+
* @param scope - Scope for search (current, all, or specific sessionId)
|
|
329
|
+
* @param currentSessionId - Current session ID for scope resolution
|
|
330
|
+
* @param filters - Optional filters to apply to steps
|
|
331
|
+
* @returns Array of matching step summaries
|
|
332
|
+
*/
|
|
333
|
+
async searchSteps(query, limit, scope, currentSessionId, filters) {
|
|
334
|
+
const queryTokens = (0, tokenization_js_1.tokenize)(query);
|
|
335
|
+
if (queryTokens.length === 0) {
|
|
336
|
+
return [];
|
|
337
|
+
}
|
|
338
|
+
const expandedTokens = (0, tokenization_js_1.expandWithSynonyms)(queryTokens);
|
|
339
|
+
const sessionIds = await this.resolveSessionIds(scope, currentSessionId, filters);
|
|
340
|
+
const scoredSessions = [];
|
|
341
|
+
for (const sid of sessionIds) {
|
|
342
|
+
const metadata = await __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_readSessionMetadata).call(this, sid);
|
|
343
|
+
const sessionScore = metadata
|
|
344
|
+
? __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_computeSessionScore).call(this, metadata, expandedTokens)
|
|
345
|
+
: 0;
|
|
346
|
+
scoredSessions.push({
|
|
347
|
+
sessionId: sid,
|
|
348
|
+
score: sessionScore,
|
|
349
|
+
metadata: metadata ?? undefined,
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
scoredSessions.sort((a, b) => {
|
|
353
|
+
if (b.score !== a.score) {
|
|
354
|
+
return b.score - a.score;
|
|
355
|
+
}
|
|
356
|
+
const aTime = a.metadata?.createdAt
|
|
357
|
+
? new Date(a.metadata.createdAt).getTime()
|
|
358
|
+
: 0;
|
|
359
|
+
const bTime = b.metadata?.createdAt
|
|
360
|
+
? new Date(b.metadata.createdAt).getTime()
|
|
361
|
+
: 0;
|
|
362
|
+
if (bTime !== aTime) {
|
|
363
|
+
return bTime - aTime;
|
|
364
|
+
}
|
|
365
|
+
return a.sessionId.localeCompare(b.sessionId);
|
|
366
|
+
});
|
|
367
|
+
const topSessions = scoredSessions.slice(0, SCAN_LIMITS.maxSessionsToScan);
|
|
368
|
+
const matches = [];
|
|
369
|
+
let totalStepsScanned = 0;
|
|
370
|
+
for (const { sessionId: sid, score: sessionScore, metadata, } of topSessions) {
|
|
371
|
+
if (totalStepsScanned >= SCAN_LIMITS.maxTotalSteps) {
|
|
372
|
+
break;
|
|
373
|
+
}
|
|
374
|
+
const steps = await __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_loadSessionSteps).call(this, sid);
|
|
375
|
+
const limitedSteps = steps.slice(0, SCAN_LIMITS.maxStepsPerSession);
|
|
376
|
+
totalStepsScanned += limitedSteps.length;
|
|
377
|
+
for (const { step } of limitedSteps) {
|
|
378
|
+
if (!__classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_stepMatchesFilters).call(this, step, filters)) {
|
|
379
|
+
continue;
|
|
380
|
+
}
|
|
381
|
+
const { score: stepScore, matchedFields } = __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_computeSearchScore).call(this, step, expandedTokens);
|
|
382
|
+
const combinedScore = sessionScore + stepScore;
|
|
383
|
+
if (combinedScore > 0) {
|
|
384
|
+
matches.push({
|
|
385
|
+
step,
|
|
386
|
+
score: combinedScore,
|
|
387
|
+
sessionScore,
|
|
388
|
+
sessionGoal: metadata?.goal,
|
|
389
|
+
matchedFields,
|
|
390
|
+
});
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
matches.sort((a, b) => b.score - a.score);
|
|
395
|
+
return matches
|
|
396
|
+
.slice(0, limit)
|
|
397
|
+
.map((m) => __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_summarizeStep).call(this, m.step, m.matchedFields, m.sessionGoal));
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* Generate a recipe summary of steps in a session
|
|
401
|
+
*
|
|
402
|
+
* @param sessionId - Session ID to summarize
|
|
403
|
+
* @returns Session summary with recipe steps
|
|
404
|
+
*/
|
|
405
|
+
async summarizeSession(sessionId) {
|
|
406
|
+
const steps = await __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_loadSessionSteps).call(this, sessionId);
|
|
407
|
+
steps.sort((a, b) => new Date(a.step.timestamp).getTime() -
|
|
408
|
+
new Date(b.step.timestamp).getTime());
|
|
409
|
+
const recipe = steps.map(({ step }, index) => ({
|
|
410
|
+
stepNumber: index + 1,
|
|
411
|
+
tool: step.tool.name,
|
|
412
|
+
notes: __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_generateStepNotes).call(this, step),
|
|
413
|
+
}));
|
|
414
|
+
return {
|
|
415
|
+
sessionId,
|
|
416
|
+
stepCount: steps.length,
|
|
417
|
+
recipe,
|
|
418
|
+
};
|
|
419
|
+
}
|
|
420
|
+
/**
|
|
421
|
+
* Get all session IDs from the knowledge store
|
|
422
|
+
*
|
|
423
|
+
* @returns Array of all session IDs
|
|
424
|
+
*/
|
|
425
|
+
async getAllSessionIds() {
|
|
426
|
+
try {
|
|
427
|
+
const entries = await fs_1.promises.readdir(__classPrivateFieldGet(this, _KnowledgeStore_knowledgeRoot, "f"), {
|
|
428
|
+
withFileTypes: true,
|
|
429
|
+
});
|
|
430
|
+
return entries
|
|
431
|
+
.filter((e) => e.isDirectory() &&
|
|
432
|
+
(e.name.startsWith('mm-') ||
|
|
433
|
+
e.name.startsWith(__classPrivateFieldGet(this, _KnowledgeStore_sessionIdPrefix, "f"))))
|
|
434
|
+
.map((e) => e.name);
|
|
435
|
+
}
|
|
436
|
+
catch (error) {
|
|
437
|
+
(0, utils_1.debugWarn)('knowledge-store.getAllSessionIds', error);
|
|
438
|
+
return [];
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
/**
|
|
442
|
+
* Generate prior knowledge from historical sessions
|
|
443
|
+
*
|
|
444
|
+
* @param context - Current context for knowledge generation
|
|
445
|
+
* @param currentSessionId - Current session ID to exclude from results
|
|
446
|
+
* @returns Prior knowledge object or undefined if no relevant data found
|
|
447
|
+
*/
|
|
448
|
+
async generatePriorKnowledge(context, currentSessionId) {
|
|
449
|
+
const { windowHours } = PRIOR_KNOWLEDGE_CONFIG;
|
|
450
|
+
const filters = {
|
|
451
|
+
sinceHours: windowHours,
|
|
452
|
+
};
|
|
453
|
+
if (context.currentSessionFlowTags?.length) {
|
|
454
|
+
filters.flowTag = context.currentSessionFlowTags[0];
|
|
455
|
+
}
|
|
456
|
+
const sessionIds = await this.resolveSessionIds('all', undefined, filters);
|
|
457
|
+
const candidateSessionIds = sessionIds.filter((sid) => sid !== currentSessionId);
|
|
458
|
+
if (candidateSessionIds.length === 0) {
|
|
459
|
+
return undefined;
|
|
460
|
+
}
|
|
461
|
+
const relatedSessions = await __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_getRelatedSessions).call(this, candidateSessionIds, filters, PRIOR_KNOWLEDGE_CONFIG.maxRelatedSessions);
|
|
462
|
+
const { similarSteps, candidateStepCount } = await __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_getSimilarSteps).call(this, context, candidateSessionIds, filters);
|
|
463
|
+
const suggestedNextActions = __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_buildSuggestedActions).call(this, similarSteps, context);
|
|
464
|
+
const avoidList = await __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_buildAvoidList).call(this, context, candidateSessionIds);
|
|
465
|
+
if (relatedSessions.length === 0 &&
|
|
466
|
+
similarSteps.length === 0 &&
|
|
467
|
+
suggestedNextActions.length === 0) {
|
|
468
|
+
return undefined;
|
|
469
|
+
}
|
|
470
|
+
return {
|
|
471
|
+
schemaVersion: 1,
|
|
472
|
+
generatedAt: new Date().toISOString(),
|
|
473
|
+
query: {
|
|
474
|
+
windowHours,
|
|
475
|
+
usedFlowTags: context.currentSessionFlowTags ?? [],
|
|
476
|
+
usedFilters: filters,
|
|
477
|
+
candidateSessions: candidateSessionIds.length,
|
|
478
|
+
candidateSteps: candidateStepCount,
|
|
479
|
+
},
|
|
480
|
+
relatedSessions,
|
|
481
|
+
similarSteps: similarSteps.slice(0, PRIOR_KNOWLEDGE_CONFIG.maxSimilarSteps),
|
|
482
|
+
suggestedNextActions: suggestedNextActions.slice(0, PRIOR_KNOWLEDGE_CONFIG.maxSuggestedActions),
|
|
483
|
+
avoid: avoidList.length > 0
|
|
484
|
+
? avoidList.slice(0, PRIOR_KNOWLEDGE_CONFIG.maxAvoid)
|
|
485
|
+
: undefined,
|
|
486
|
+
};
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
exports.KnowledgeStore = KnowledgeStore;
|
|
490
|
+
_KnowledgeStore_knowledgeRoot = new WeakMap(), _KnowledgeStore_sessionIdPrefix = new WeakMap(), _KnowledgeStore_toolPrefix = new WeakMap(), _KnowledgeStore_sessionMetadataCache = new WeakMap(), _KnowledgeStore_actionableTools = new WeakMap(), _KnowledgeStore_toolActionMap = new WeakMap(), _KnowledgeStore_discoveryTools = new WeakMap(), _KnowledgeStore_instances = new WeakSet(), _KnowledgeStore_readSessionMetadata =
|
|
491
|
+
/**
|
|
492
|
+
* Read session metadata from disk (private)
|
|
493
|
+
*
|
|
494
|
+
* @param sessionId - Session ID to read metadata for
|
|
495
|
+
* @returns Session metadata or null if not found
|
|
496
|
+
*/
|
|
497
|
+
async function _KnowledgeStore_readSessionMetadata(sessionId) {
|
|
498
|
+
if (__classPrivateFieldGet(this, _KnowledgeStore_sessionMetadataCache, "f").has(sessionId)) {
|
|
499
|
+
return __classPrivateFieldGet(this, _KnowledgeStore_sessionMetadataCache, "f").get(sessionId) ?? null;
|
|
500
|
+
}
|
|
501
|
+
const filepath = path.join(__classPrivateFieldGet(this, _KnowledgeStore_knowledgeRoot, "f"), sessionId, 'session.json');
|
|
502
|
+
try {
|
|
503
|
+
const content = await fs_1.promises.readFile(filepath, 'utf-8');
|
|
504
|
+
const metadata = JSON.parse(content);
|
|
505
|
+
__classPrivateFieldGet(this, _KnowledgeStore_sessionMetadataCache, "f").set(sessionId, metadata);
|
|
506
|
+
return metadata;
|
|
507
|
+
}
|
|
508
|
+
catch (error) {
|
|
509
|
+
(0, utils_1.debugWarn)('knowledge-store.readSessionMetadata', error);
|
|
510
|
+
__classPrivateFieldGet(this, _KnowledgeStore_sessionMetadataCache, "f").set(sessionId, null);
|
|
511
|
+
return null;
|
|
512
|
+
}
|
|
513
|
+
}, _KnowledgeStore_matchesFilters = function _KnowledgeStore_matchesFilters(metadata, filters) {
|
|
514
|
+
if (!filters) {
|
|
515
|
+
return true;
|
|
516
|
+
}
|
|
517
|
+
if (filters.flowTag && !metadata.flowTags.includes(filters.flowTag)) {
|
|
518
|
+
return false;
|
|
519
|
+
}
|
|
520
|
+
if (filters.tag && !metadata.tags.includes(filters.tag)) {
|
|
521
|
+
return false;
|
|
522
|
+
}
|
|
523
|
+
if (filters.sinceHours) {
|
|
524
|
+
const cutoff = Date.now() - filters.sinceHours * 60 * 60 * 1000;
|
|
525
|
+
const createdAt = new Date(metadata.createdAt).getTime();
|
|
526
|
+
if (createdAt < cutoff) {
|
|
527
|
+
return false;
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
return true;
|
|
531
|
+
}, _KnowledgeStore_computeLabels = function _KnowledgeStore_computeLabels(toolName, target, outcome) {
|
|
532
|
+
const labels = [];
|
|
533
|
+
const navigationTools = [
|
|
534
|
+
`${__classPrivateFieldGet(this, _KnowledgeStore_toolPrefix, "f")}_navigate`,
|
|
535
|
+
`${__classPrivateFieldGet(this, _KnowledgeStore_toolPrefix, "f")}_wait_for_notification`,
|
|
536
|
+
];
|
|
537
|
+
const interactionTools = [
|
|
538
|
+
`${__classPrivateFieldGet(this, _KnowledgeStore_toolPrefix, "f")}_click`,
|
|
539
|
+
`${__classPrivateFieldGet(this, _KnowledgeStore_toolPrefix, "f")}_type`,
|
|
540
|
+
`${__classPrivateFieldGet(this, _KnowledgeStore_toolPrefix, "f")}_wait_for`,
|
|
541
|
+
];
|
|
542
|
+
if (__classPrivateFieldGet(this, _KnowledgeStore_discoveryTools, "f").includes(toolName)) {
|
|
543
|
+
labels.push('discovery');
|
|
544
|
+
}
|
|
545
|
+
else if (navigationTools.includes(toolName)) {
|
|
546
|
+
labels.push('navigation');
|
|
547
|
+
}
|
|
548
|
+
else if (interactionTools.includes(toolName)) {
|
|
549
|
+
labels.push('interaction');
|
|
550
|
+
const targetStr = JSON.stringify(target ?? {}).toLowerCase();
|
|
551
|
+
if (targetStr.includes('confirm') ||
|
|
552
|
+
targetStr.includes('approve') ||
|
|
553
|
+
targetStr.includes('submit')) {
|
|
554
|
+
labels.push('confirmation');
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
if (outcome && !outcome.ok) {
|
|
558
|
+
labels.push('error-recovery');
|
|
559
|
+
}
|
|
560
|
+
return labels;
|
|
561
|
+
}, _KnowledgeStore_stepMatchesFilters = function _KnowledgeStore_stepMatchesFilters(step, filters) {
|
|
562
|
+
if (!filters) {
|
|
563
|
+
return true;
|
|
564
|
+
}
|
|
565
|
+
if (filters.screen &&
|
|
566
|
+
step.observation?.state?.currentScreen !== filters.screen) {
|
|
567
|
+
return false;
|
|
568
|
+
}
|
|
569
|
+
return true;
|
|
570
|
+
}, _KnowledgeStore_loadSessionSteps =
|
|
571
|
+
/**
|
|
572
|
+
* Load all step records from a session
|
|
573
|
+
*
|
|
574
|
+
* @param sessionId - Session ID to load steps from
|
|
575
|
+
* @returns Array of step records with file paths
|
|
576
|
+
*/
|
|
577
|
+
async function _KnowledgeStore_loadSessionSteps(sessionId) {
|
|
578
|
+
const stepsDir = path.join(__classPrivateFieldGet(this, _KnowledgeStore_knowledgeRoot, "f"), sessionId, 'steps');
|
|
579
|
+
try {
|
|
580
|
+
const files = await fs_1.promises.readdir(stepsDir);
|
|
581
|
+
const jsonFiles = files.filter((f) => f.endsWith('.json'));
|
|
582
|
+
const steps = [];
|
|
583
|
+
for (const file of jsonFiles) {
|
|
584
|
+
const filepath = path.join(stepsDir, file);
|
|
585
|
+
try {
|
|
586
|
+
const content = await fs_1.promises.readFile(filepath, 'utf-8');
|
|
587
|
+
const step = JSON.parse(content);
|
|
588
|
+
steps.push({ step, filepath });
|
|
589
|
+
}
|
|
590
|
+
catch (error) {
|
|
591
|
+
(0, utils_1.debugWarn)('knowledge-store.loadSessionSteps', error);
|
|
592
|
+
continue;
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
return steps;
|
|
596
|
+
}
|
|
597
|
+
catch (error) {
|
|
598
|
+
(0, utils_1.debugWarn)('knowledge-store.loadSessionSteps', error);
|
|
599
|
+
return [];
|
|
600
|
+
}
|
|
601
|
+
}, _KnowledgeStore_sanitizeInput = function _KnowledgeStore_sanitizeInput(toolName, input) {
|
|
602
|
+
if (!input) {
|
|
603
|
+
return {};
|
|
604
|
+
}
|
|
605
|
+
const sanitized = {};
|
|
606
|
+
let textRedacted = false;
|
|
607
|
+
let textLength;
|
|
608
|
+
const typeToolName = `${__classPrivateFieldGet(this, _KnowledgeStore_toolPrefix, "f")}_type`;
|
|
609
|
+
for (const [key, value] of Object.entries(input)) {
|
|
610
|
+
if (toolName === typeToolName && key === 'text') {
|
|
611
|
+
const textValue = String(value);
|
|
612
|
+
const targetTestId = input.testId;
|
|
613
|
+
const targetSelector = input.selector;
|
|
614
|
+
const isSensitive = (0, utils_1.isSensitiveField)(targetTestId ?? '') ||
|
|
615
|
+
(0, utils_1.isSensitiveField)(targetSelector ?? '') ||
|
|
616
|
+
utils_1.SENSITIVE_FIELD_PATTERNS.some((p) => p.test(key));
|
|
617
|
+
if (isSensitive) {
|
|
618
|
+
textRedacted = true;
|
|
619
|
+
textLength = textValue.length;
|
|
620
|
+
sanitized[key] = '[REDACTED]';
|
|
621
|
+
}
|
|
622
|
+
else {
|
|
623
|
+
sanitized[key] = value;
|
|
624
|
+
}
|
|
625
|
+
}
|
|
626
|
+
else if ((0, utils_1.isSensitiveField)(key)) {
|
|
627
|
+
sanitized[key] = '[REDACTED]';
|
|
628
|
+
}
|
|
629
|
+
else {
|
|
630
|
+
sanitized[key] = value;
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
return {
|
|
634
|
+
input: sanitized,
|
|
635
|
+
textRedacted: textRedacted || undefined,
|
|
636
|
+
textLength,
|
|
637
|
+
};
|
|
638
|
+
}, _KnowledgeStore_getEnvironmentInfo = function _KnowledgeStore_getEnvironmentInfo() {
|
|
639
|
+
return {
|
|
640
|
+
platform: process.platform,
|
|
641
|
+
nodeVersion: process.version,
|
|
642
|
+
};
|
|
643
|
+
}, _KnowledgeStore_summarizeStep = function _KnowledgeStore_summarizeStep(step, matchedFields, sessionGoal) {
|
|
644
|
+
const screen = step.observation?.state?.currentScreen ?? 'unknown';
|
|
645
|
+
const snippet = __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_generateSnippet).call(this, step, matchedFields);
|
|
646
|
+
return {
|
|
647
|
+
timestamp: step.timestamp,
|
|
648
|
+
tool: step.tool.name,
|
|
649
|
+
screen,
|
|
650
|
+
snippet,
|
|
651
|
+
sessionId: step.sessionId,
|
|
652
|
+
matchedFields: matchedFields?.length ? matchedFields : undefined,
|
|
653
|
+
sessionGoal,
|
|
654
|
+
};
|
|
655
|
+
}, _KnowledgeStore_generateSnippet = function _KnowledgeStore_generateSnippet(step, matchedFields) {
|
|
656
|
+
const parts = [];
|
|
657
|
+
if (matchedFields && matchedFields.length > 0) {
|
|
658
|
+
const topMatches = matchedFields.slice(0, 3).join(', ');
|
|
659
|
+
parts.push(`match: ${topMatches}`);
|
|
660
|
+
}
|
|
661
|
+
if (step.tool.target?.testId) {
|
|
662
|
+
parts.push(`testId: ${step.tool.target.testId}`);
|
|
663
|
+
}
|
|
664
|
+
else if (step.tool.target?.a11yRef) {
|
|
665
|
+
parts.push(`ref: ${step.tool.target.a11yRef}`);
|
|
666
|
+
}
|
|
667
|
+
else if (step.tool.target?.selector) {
|
|
668
|
+
const shortSelector = step.tool.target.selector.substring(0, 30);
|
|
669
|
+
parts.push(`selector: ${shortSelector}`);
|
|
670
|
+
}
|
|
671
|
+
if (step.labels && step.labels.length > 0) {
|
|
672
|
+
parts.push(`labels: ${step.labels.join(', ')}`);
|
|
673
|
+
}
|
|
674
|
+
if (step.observation?.state?.currentScreen) {
|
|
675
|
+
parts.push(`screen: ${step.observation.state.currentScreen}`);
|
|
676
|
+
}
|
|
677
|
+
if (!step.outcome.ok && step.outcome.error) {
|
|
678
|
+
parts.push(`error: ${step.outcome.error.code}`);
|
|
679
|
+
}
|
|
680
|
+
return parts.join(', ') || step.tool.name;
|
|
681
|
+
}, _KnowledgeStore_generateStepNotes = function _KnowledgeStore_generateStepNotes(step) {
|
|
682
|
+
const notes = [];
|
|
683
|
+
if (step.tool.target?.testId) {
|
|
684
|
+
notes.push(`target: [data-testid="${step.tool.target.testId}"]`);
|
|
685
|
+
}
|
|
686
|
+
else if (step.tool.target?.a11yRef) {
|
|
687
|
+
notes.push(`target: ${step.tool.target.a11yRef}`);
|
|
688
|
+
}
|
|
689
|
+
if (step.observation?.state?.currentScreen) {
|
|
690
|
+
notes.push(`on screen: ${step.observation.state.currentScreen}`);
|
|
691
|
+
}
|
|
692
|
+
if (!step.outcome.ok && step.outcome.error) {
|
|
693
|
+
notes.push(`FAILED: ${step.outcome.error.message}`);
|
|
694
|
+
}
|
|
695
|
+
if (step.artifacts?.screenshot?.path) {
|
|
696
|
+
notes.push('screenshot captured');
|
|
697
|
+
}
|
|
698
|
+
return notes.join('; ') || 'executed';
|
|
699
|
+
}, _KnowledgeStore_computeSessionScore = function _KnowledgeStore_computeSessionScore(metadata, queryTokens) {
|
|
700
|
+
let score = 0;
|
|
701
|
+
for (const token of queryTokens) {
|
|
702
|
+
for (const flowTag of metadata.flowTags) {
|
|
703
|
+
if (flowTag.toLowerCase().includes(token)) {
|
|
704
|
+
score += 12;
|
|
705
|
+
break;
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
}
|
|
709
|
+
const goalTokens = (0, tokenization_js_1.tokenize)(metadata.goal ?? '');
|
|
710
|
+
for (const token of queryTokens) {
|
|
711
|
+
if (goalTokens.includes(token)) {
|
|
712
|
+
score += 6;
|
|
713
|
+
}
|
|
714
|
+
}
|
|
715
|
+
for (const token of queryTokens) {
|
|
716
|
+
for (const tag of metadata.tags) {
|
|
717
|
+
if (tag.toLowerCase().includes(token)) {
|
|
718
|
+
score += 4;
|
|
719
|
+
break;
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
}
|
|
723
|
+
const ageHours = (Date.now() - new Date(metadata.createdAt).getTime()) / (1000 * 60 * 60);
|
|
724
|
+
if (ageHours < 24) {
|
|
725
|
+
score += 3;
|
|
726
|
+
}
|
|
727
|
+
else if (ageHours < 72) {
|
|
728
|
+
score += 1;
|
|
729
|
+
}
|
|
730
|
+
return score;
|
|
731
|
+
}, _KnowledgeStore_computeSearchScore = function _KnowledgeStore_computeSearchScore(step, queryTokens) {
|
|
732
|
+
let score = 0;
|
|
733
|
+
const matchedFieldsSet = new Set();
|
|
734
|
+
let matchedTokens = 0;
|
|
735
|
+
const targetTestIdTokens = step.tool.target?.testId
|
|
736
|
+
? (0, tokenization_js_1.tokenizeIdentifier)(step.tool.target.testId)
|
|
737
|
+
: [];
|
|
738
|
+
const observedTestIdTokensMap = new Map();
|
|
739
|
+
for (const testIdItem of step.observation?.testIds ?? []) {
|
|
740
|
+
observedTestIdTokensMap.set(testIdItem.testId, (0, tokenization_js_1.tokenizeIdentifier)(testIdItem.testId));
|
|
741
|
+
}
|
|
742
|
+
for (const token of queryTokens) {
|
|
743
|
+
let tokenMatched = false;
|
|
744
|
+
if (step.tool.name.toLowerCase().includes(token)) {
|
|
745
|
+
score += 10;
|
|
746
|
+
matchedFieldsSet.add(`tool:${step.tool.name}`);
|
|
747
|
+
tokenMatched = true;
|
|
748
|
+
}
|
|
749
|
+
const screen = step.observation?.state?.currentScreen;
|
|
750
|
+
if (screen?.toLowerCase().includes(token)) {
|
|
751
|
+
score += 8;
|
|
752
|
+
matchedFieldsSet.add(`screen:${screen}`);
|
|
753
|
+
tokenMatched = true;
|
|
754
|
+
}
|
|
755
|
+
if (step.tool.target?.testId && targetTestIdTokens.includes(token)) {
|
|
756
|
+
score += 6;
|
|
757
|
+
matchedFieldsSet.add(`testId:${step.tool.target.testId}`);
|
|
758
|
+
tokenMatched = true;
|
|
759
|
+
}
|
|
760
|
+
for (const label of step.labels ?? []) {
|
|
761
|
+
if (label.toLowerCase().includes(token)) {
|
|
762
|
+
score += 5;
|
|
763
|
+
matchedFieldsSet.add(`label:${label}`);
|
|
764
|
+
tokenMatched = true;
|
|
765
|
+
break;
|
|
766
|
+
}
|
|
767
|
+
}
|
|
768
|
+
for (const [testId, tokens] of observedTestIdTokensMap) {
|
|
769
|
+
if (tokens.includes(token)) {
|
|
770
|
+
score += 3;
|
|
771
|
+
matchedFieldsSet.add(`testId:${testId}`);
|
|
772
|
+
tokenMatched = true;
|
|
773
|
+
break;
|
|
774
|
+
}
|
|
775
|
+
}
|
|
776
|
+
for (const node of step.observation?.a11y?.nodes ?? []) {
|
|
777
|
+
if (node.name.toLowerCase().includes(token)) {
|
|
778
|
+
score += 2;
|
|
779
|
+
matchedFieldsSet.add(`a11y:${node.role}:"${node.name}"`);
|
|
780
|
+
tokenMatched = true;
|
|
781
|
+
break;
|
|
782
|
+
}
|
|
783
|
+
if (node.role.toLowerCase().includes(token)) {
|
|
784
|
+
score += 2;
|
|
785
|
+
matchedFieldsSet.add(`a11y:${node.role}`);
|
|
786
|
+
tokenMatched = true;
|
|
787
|
+
break;
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
if (tokenMatched) {
|
|
791
|
+
matchedTokens += 1;
|
|
792
|
+
}
|
|
793
|
+
}
|
|
794
|
+
if (queryTokens.length > 0) {
|
|
795
|
+
const coverageRatio = matchedTokens / queryTokens.length;
|
|
796
|
+
score += Math.floor(coverageRatio * 5);
|
|
797
|
+
}
|
|
798
|
+
return { score, matchedFields: [...matchedFieldsSet] };
|
|
799
|
+
}, _KnowledgeStore_getRelatedSessions =
|
|
800
|
+
/**
|
|
801
|
+
* Get related sessions based on filters
|
|
802
|
+
*
|
|
803
|
+
* @param sessionIds - Session IDs to filter
|
|
804
|
+
* @param filters - Filters to apply
|
|
805
|
+
* @param limit - Maximum number of sessions to return
|
|
806
|
+
* @returns Array of related session summaries
|
|
807
|
+
*/
|
|
808
|
+
async function _KnowledgeStore_getRelatedSessions(sessionIds, filters, limit) {
|
|
809
|
+
const sessions = [];
|
|
810
|
+
for (const sid of sessionIds) {
|
|
811
|
+
if (sessions.length >= limit) {
|
|
812
|
+
break;
|
|
813
|
+
}
|
|
814
|
+
const metadata = await __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_readSessionMetadata).call(this, sid);
|
|
815
|
+
if (!metadata) {
|
|
816
|
+
continue;
|
|
817
|
+
}
|
|
818
|
+
if (!__classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_matchesFilters).call(this, metadata, filters)) {
|
|
819
|
+
continue;
|
|
820
|
+
}
|
|
821
|
+
sessions.push({
|
|
822
|
+
sessionId: metadata.sessionId,
|
|
823
|
+
createdAt: metadata.createdAt,
|
|
824
|
+
goal: metadata.goal,
|
|
825
|
+
flowTags: metadata.flowTags,
|
|
826
|
+
tags: metadata.tags,
|
|
827
|
+
});
|
|
828
|
+
}
|
|
829
|
+
return sessions;
|
|
830
|
+
}, _KnowledgeStore_getSimilarSteps =
|
|
831
|
+
/**
|
|
832
|
+
* Find similar steps from historical sessions
|
|
833
|
+
*
|
|
834
|
+
* @param context - Current context for similarity matching
|
|
835
|
+
* @param sessionIds - Session IDs to search
|
|
836
|
+
* @param filters - Filters to apply to steps
|
|
837
|
+
* @returns Similar steps and total candidate count
|
|
838
|
+
*/
|
|
839
|
+
async function _KnowledgeStore_getSimilarSteps(context, sessionIds, filters) {
|
|
840
|
+
const scoredSteps = [];
|
|
841
|
+
let candidateStepCount = 0;
|
|
842
|
+
const visibleTestIdSet = new Set(context.visibleTestIds.map((t) => t.testId));
|
|
843
|
+
const visibleA11yNames = new Set(context.a11yNodes.map((n) => n.name.toLowerCase()));
|
|
844
|
+
const limitedSessionIds = sessionIds.slice(0, SCAN_LIMITS.maxSessionsToScan);
|
|
845
|
+
for (const sid of limitedSessionIds) {
|
|
846
|
+
if (candidateStepCount >= SCAN_LIMITS.maxTotalSteps) {
|
|
847
|
+
break;
|
|
848
|
+
}
|
|
849
|
+
const steps = await __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_loadSessionSteps).call(this, sid);
|
|
850
|
+
const limitedSteps = steps.slice(0, SCAN_LIMITS.maxStepsPerSession);
|
|
851
|
+
for (const { step } of limitedSteps) {
|
|
852
|
+
candidateStepCount += 1;
|
|
853
|
+
if (!__classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_stepMatchesFilters).call(this, step, filters)) {
|
|
854
|
+
continue;
|
|
855
|
+
}
|
|
856
|
+
if (__classPrivateFieldGet(this, _KnowledgeStore_discoveryTools, "f").includes(step.tool.name)) {
|
|
857
|
+
continue;
|
|
858
|
+
}
|
|
859
|
+
const score = __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_computeSimilarityScore).call(this, step, context, visibleTestIdSet, visibleA11yNames);
|
|
860
|
+
if (score > 0) {
|
|
861
|
+
scoredSteps.push({ step, score });
|
|
862
|
+
}
|
|
863
|
+
}
|
|
864
|
+
}
|
|
865
|
+
scoredSteps.sort((a, b) => b.score - a.score);
|
|
866
|
+
const similarSteps = scoredSteps
|
|
867
|
+
.slice(0, PRIOR_KNOWLEDGE_CONFIG.maxSimilarSteps)
|
|
868
|
+
.map(({ step, score }) => {
|
|
869
|
+
const a11yHint = __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_lookupA11yHint).call(this, step);
|
|
870
|
+
return {
|
|
871
|
+
sessionId: step.sessionId,
|
|
872
|
+
timestamp: step.timestamp,
|
|
873
|
+
tool: step.tool.name,
|
|
874
|
+
screen: step.observation?.state?.currentScreen ?? 'unknown',
|
|
875
|
+
snippet: __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_generateSnippet).call(this, step),
|
|
876
|
+
labels: step.labels,
|
|
877
|
+
target: step.tool.target
|
|
878
|
+
? {
|
|
879
|
+
testId: step.tool.target.testId,
|
|
880
|
+
selector: step.tool.target.selector,
|
|
881
|
+
}
|
|
882
|
+
: undefined,
|
|
883
|
+
a11yHint,
|
|
884
|
+
confidence: Math.min(score / MAX_SIMILARITY_SCORE, 1),
|
|
885
|
+
};
|
|
886
|
+
});
|
|
887
|
+
return { similarSteps, candidateStepCount };
|
|
888
|
+
}, _KnowledgeStore_lookupA11yHint = function _KnowledgeStore_lookupA11yHint(step) {
|
|
889
|
+
const a11yRef = step.tool.target?.a11yRef;
|
|
890
|
+
if (!a11yRef) {
|
|
891
|
+
return undefined;
|
|
892
|
+
}
|
|
893
|
+
const nodes = step.observation?.a11y?.nodes ?? [];
|
|
894
|
+
const matchingNode = nodes.find((node) => node.ref === a11yRef);
|
|
895
|
+
if (!matchingNode?.name) {
|
|
896
|
+
return undefined;
|
|
897
|
+
}
|
|
898
|
+
return { role: matchingNode.role, name: matchingNode.name };
|
|
899
|
+
}, _KnowledgeStore_computeSimilarityScore = function _KnowledgeStore_computeSimilarityScore(step, context, visibleTestIdSet, visibleA11yNames) {
|
|
900
|
+
let score = 0;
|
|
901
|
+
const stepScreen = step.observation?.state?.currentScreen;
|
|
902
|
+
const contextScreen = context.currentScreen;
|
|
903
|
+
if (stepScreen === contextScreen && stepScreen !== 'unknown') {
|
|
904
|
+
score += SIMILARITY_WEIGHTS.sameScreen;
|
|
905
|
+
}
|
|
906
|
+
if (context.currentUrl && step.observation?.state) {
|
|
907
|
+
const currentPathTokens = extractPathTokens(context.currentUrl);
|
|
908
|
+
const stepUrl = step.observation.state.currentUrl ?? '';
|
|
909
|
+
const stepPathTokens = extractPathTokens(stepUrl);
|
|
910
|
+
for (const token of currentPathTokens) {
|
|
911
|
+
if (stepPathTokens.includes(token)) {
|
|
912
|
+
score += SIMILARITY_WEIGHTS.urlPathOverlap;
|
|
913
|
+
break;
|
|
914
|
+
}
|
|
915
|
+
}
|
|
916
|
+
}
|
|
917
|
+
let testIdOverlapCount = 0;
|
|
918
|
+
for (const testId of step.observation?.testIds ?? []) {
|
|
919
|
+
if (visibleTestIdSet.has(testId.testId)) {
|
|
920
|
+
testIdOverlapCount += 1;
|
|
921
|
+
if (testIdOverlapCount >= 3) {
|
|
922
|
+
break;
|
|
923
|
+
}
|
|
924
|
+
}
|
|
925
|
+
}
|
|
926
|
+
score += Math.min(testIdOverlapCount, 3) * SIMILARITY_WEIGHTS.testIdOverlap;
|
|
927
|
+
let a11yOverlapCount = 0;
|
|
928
|
+
for (const node of step.observation?.a11y?.nodes ?? []) {
|
|
929
|
+
if (visibleA11yNames.has(node.name.toLowerCase())) {
|
|
930
|
+
a11yOverlapCount += 1;
|
|
931
|
+
if (a11yOverlapCount >= 2) {
|
|
932
|
+
break;
|
|
933
|
+
}
|
|
934
|
+
}
|
|
935
|
+
}
|
|
936
|
+
score += Math.min(a11yOverlapCount, 2) * SIMILARITY_WEIGHTS.a11yOverlap;
|
|
937
|
+
if (__classPrivateFieldGet(this, _KnowledgeStore_actionableTools, "f").includes(step.tool.name)) {
|
|
938
|
+
score += SIMILARITY_WEIGHTS.actionableTool;
|
|
939
|
+
}
|
|
940
|
+
return score;
|
|
941
|
+
}, _KnowledgeStore_buildSuggestedActions = function _KnowledgeStore_buildSuggestedActions(similarSteps, context) {
|
|
942
|
+
const visibleTestIdSet = new Set(context.visibleTestIds.map((t) => t.testId));
|
|
943
|
+
const visibleA11yMap = new Map(context.a11yNodes.map((n) => [n.name.toLowerCase(), n]));
|
|
944
|
+
const actionCounts = new Map();
|
|
945
|
+
for (const step of similarSteps) {
|
|
946
|
+
if (!step.target?.testId && !step.target?.selector) {
|
|
947
|
+
continue;
|
|
948
|
+
}
|
|
949
|
+
const key = step.target.testId ?? step.target.selector ?? '';
|
|
950
|
+
const existing = actionCounts.get(key);
|
|
951
|
+
if (existing) {
|
|
952
|
+
existing.count += 1;
|
|
953
|
+
existing.confidenceSum += step.confidence;
|
|
954
|
+
}
|
|
955
|
+
else {
|
|
956
|
+
actionCounts.set(key, {
|
|
957
|
+
step,
|
|
958
|
+
count: 1,
|
|
959
|
+
confidenceSum: step.confidence,
|
|
960
|
+
});
|
|
961
|
+
}
|
|
962
|
+
}
|
|
963
|
+
const suggestions = [];
|
|
964
|
+
const sortedActions = Array.from(actionCounts.entries()).sort(([, a], [, b]) => b.confidenceSum - a.confidenceSum);
|
|
965
|
+
for (const [, { step, count, confidenceSum }] of sortedActions) {
|
|
966
|
+
if (suggestions.length >= PRIOR_KNOWLEDGE_CONFIG.maxSuggestedActions) {
|
|
967
|
+
break;
|
|
968
|
+
}
|
|
969
|
+
const preferredTarget = __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_buildPreferredTarget).call(this, step, visibleTestIdSet);
|
|
970
|
+
if (!preferredTarget) {
|
|
971
|
+
continue;
|
|
972
|
+
}
|
|
973
|
+
const fallbackTargets = __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_buildFallbackTargets).call(this, preferredTarget, visibleA11yMap);
|
|
974
|
+
const action = __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_toolToAction).call(this, step.tool);
|
|
975
|
+
if (!action) {
|
|
976
|
+
continue;
|
|
977
|
+
}
|
|
978
|
+
suggestions.push({
|
|
979
|
+
rank: suggestions.length + 1,
|
|
980
|
+
action,
|
|
981
|
+
rationale: count > 1
|
|
982
|
+
? `Used ${count} times successfully on this screen`
|
|
983
|
+
: 'Most common next successful step on this screen',
|
|
984
|
+
confidence: Math.min(confidenceSum / count, 1),
|
|
985
|
+
preferredTarget,
|
|
986
|
+
fallbackTargets: fallbackTargets.length > 0 ? fallbackTargets : undefined,
|
|
987
|
+
});
|
|
988
|
+
}
|
|
989
|
+
return suggestions;
|
|
990
|
+
}, _KnowledgeStore_buildPreferredTarget = function _KnowledgeStore_buildPreferredTarget(priorStep, visibleTestIdSet) {
|
|
991
|
+
if (priorStep.target?.testId &&
|
|
992
|
+
visibleTestIdSet.has(priorStep.target.testId)) {
|
|
993
|
+
return { type: 'testId', value: priorStep.target.testId };
|
|
994
|
+
}
|
|
995
|
+
if (priorStep.target?.selector) {
|
|
996
|
+
return { type: 'selector', value: priorStep.target.selector };
|
|
997
|
+
}
|
|
998
|
+
if (priorStep.a11yHint) {
|
|
999
|
+
return { type: 'a11yHint', value: priorStep.a11yHint };
|
|
1000
|
+
}
|
|
1001
|
+
return null;
|
|
1002
|
+
}, _KnowledgeStore_buildFallbackTargets = function _KnowledgeStore_buildFallbackTargets(preferredTarget, visibleA11yMap) {
|
|
1003
|
+
const fallbacks = [];
|
|
1004
|
+
if (preferredTarget.type === 'testId') {
|
|
1005
|
+
const testId = preferredTarget.value;
|
|
1006
|
+
const entries = Array.from(visibleA11yMap.entries());
|
|
1007
|
+
for (const [name, node] of entries) {
|
|
1008
|
+
if (name.includes(testId.replace(/-/gu, ' ').toLowerCase()) ||
|
|
1009
|
+
testId.toLowerCase().includes(name)) {
|
|
1010
|
+
fallbacks.push({
|
|
1011
|
+
type: 'a11yHint',
|
|
1012
|
+
value: { role: node.role, name: node.name },
|
|
1013
|
+
});
|
|
1014
|
+
break;
|
|
1015
|
+
}
|
|
1016
|
+
}
|
|
1017
|
+
}
|
|
1018
|
+
return fallbacks;
|
|
1019
|
+
}, _KnowledgeStore_toolToAction = function _KnowledgeStore_toolToAction(toolName) {
|
|
1020
|
+
return __classPrivateFieldGet(this, _KnowledgeStore_toolActionMap, "f")[toolName] ?? null;
|
|
1021
|
+
}, _KnowledgeStore_buildAvoidList =
|
|
1022
|
+
/**
|
|
1023
|
+
* Build list of actions to avoid based on failure history
|
|
1024
|
+
*
|
|
1025
|
+
* @param context - Current context for avoid list building
|
|
1026
|
+
* @param sessionIds - Session IDs to analyze for failures
|
|
1027
|
+
* @returns Array of actions to avoid
|
|
1028
|
+
*/
|
|
1029
|
+
async function _KnowledgeStore_buildAvoidList(context, sessionIds) {
|
|
1030
|
+
const failureCounts = new Map();
|
|
1031
|
+
for (const sid of sessionIds) {
|
|
1032
|
+
const steps = await __classPrivateFieldGet(this, _KnowledgeStore_instances, "m", _KnowledgeStore_loadSessionSteps).call(this, sid);
|
|
1033
|
+
for (const { step } of steps) {
|
|
1034
|
+
if (step.outcome.ok) {
|
|
1035
|
+
continue;
|
|
1036
|
+
}
|
|
1037
|
+
if (step.observation?.state?.currentScreen !== context.currentScreen) {
|
|
1038
|
+
continue;
|
|
1039
|
+
}
|
|
1040
|
+
const targetKey = step.tool.target?.testId ?? step.tool.target?.selector ?? 'unknown';
|
|
1041
|
+
const existing = failureCounts.get(targetKey);
|
|
1042
|
+
if (existing) {
|
|
1043
|
+
existing.count += 1;
|
|
1044
|
+
}
|
|
1045
|
+
else {
|
|
1046
|
+
failureCounts.set(targetKey, {
|
|
1047
|
+
errorCode: step.outcome.error?.code,
|
|
1048
|
+
testId: step.tool.target?.testId,
|
|
1049
|
+
selector: step.tool.target?.selector,
|
|
1050
|
+
count: 1,
|
|
1051
|
+
});
|
|
1052
|
+
}
|
|
1053
|
+
}
|
|
1054
|
+
}
|
|
1055
|
+
const avoidList = [];
|
|
1056
|
+
const failureEntries = Array.from(failureCounts.values());
|
|
1057
|
+
for (const failure of failureEntries) {
|
|
1058
|
+
if (failure.count < PRIOR_KNOWLEDGE_CONFIG.minAvoidFailureCount) {
|
|
1059
|
+
continue;
|
|
1060
|
+
}
|
|
1061
|
+
avoidList.push({
|
|
1062
|
+
rationale: 'Frequently fails due to UI churn',
|
|
1063
|
+
target: {
|
|
1064
|
+
testId: failure.testId,
|
|
1065
|
+
selector: failure.selector,
|
|
1066
|
+
},
|
|
1067
|
+
errorCode: failure.errorCode,
|
|
1068
|
+
frequency: failure.count,
|
|
1069
|
+
});
|
|
1070
|
+
}
|
|
1071
|
+
avoidList.sort((a, b) => b.frequency - a.frequency);
|
|
1072
|
+
return avoidList;
|
|
1073
|
+
};
|
|
1074
|
+
/**
|
|
1075
|
+
* Create a default observation object with state and optional artifacts
|
|
1076
|
+
*
|
|
1077
|
+
* @param state - Extension state snapshot
|
|
1078
|
+
* @param testIds - Array of visible test IDs
|
|
1079
|
+
* @param a11yNodes - Array of accessibility nodes
|
|
1080
|
+
* @param priorKnowledge - Optional prior knowledge from history
|
|
1081
|
+
* @returns Observation object for step recording
|
|
1082
|
+
*/
|
|
1083
|
+
function createDefaultObservation(state, testIds = [], a11yNodes = [], priorKnowledge) {
|
|
1084
|
+
const observation = {
|
|
1085
|
+
state,
|
|
1086
|
+
testIds,
|
|
1087
|
+
a11y: { nodes: a11yNodes },
|
|
1088
|
+
};
|
|
1089
|
+
if (priorKnowledge) {
|
|
1090
|
+
observation.priorKnowledge = priorKnowledge;
|
|
1091
|
+
}
|
|
1092
|
+
return observation;
|
|
1093
|
+
}
|
|
1094
|
+
/**
|
|
1095
|
+
* Create a new KnowledgeStore instance
|
|
1096
|
+
*
|
|
1097
|
+
* @param config - Optional configuration for the store
|
|
1098
|
+
* @returns New KnowledgeStore instance
|
|
1099
|
+
*/
|
|
1100
|
+
function createKnowledgeStore(config) {
|
|
1101
|
+
return new KnowledgeStore(config);
|
|
1102
|
+
}
|
|
1103
|
+
let _knowledgeStore;
|
|
1104
|
+
/**
|
|
1105
|
+
* Set the global knowledge store instance
|
|
1106
|
+
*
|
|
1107
|
+
* @param store - KnowledgeStore instance to set as global
|
|
1108
|
+
*/
|
|
1109
|
+
function setKnowledgeStore(store) {
|
|
1110
|
+
_knowledgeStore = store;
|
|
1111
|
+
}
|
|
1112
|
+
/**
|
|
1113
|
+
* Get the global knowledge store instance
|
|
1114
|
+
*
|
|
1115
|
+
* @returns The global KnowledgeStore instance
|
|
1116
|
+
*/
|
|
1117
|
+
function getKnowledgeStore() {
|
|
1118
|
+
if (!_knowledgeStore) {
|
|
1119
|
+
throw new Error('Knowledge store not initialized. Call setKnowledgeStore() first.');
|
|
1120
|
+
}
|
|
1121
|
+
return _knowledgeStore;
|
|
1122
|
+
}
|
|
1123
|
+
/**
|
|
1124
|
+
* Check if a knowledge store has been initialized
|
|
1125
|
+
*
|
|
1126
|
+
* @returns True if knowledge store is initialized
|
|
1127
|
+
*/
|
|
1128
|
+
function hasKnowledgeStore() {
|
|
1129
|
+
return _knowledgeStore !== undefined;
|
|
1130
|
+
}
|
|
1131
|
+
exports.knowledgeStore = {
|
|
1132
|
+
/**
|
|
1133
|
+
* Record a tool execution step
|
|
1134
|
+
*
|
|
1135
|
+
* @param params - Step recording parameters
|
|
1136
|
+
* @returns Path to the recorded step file
|
|
1137
|
+
*/
|
|
1138
|
+
recordStep: async (params) => {
|
|
1139
|
+
return getKnowledgeStore().recordStep(params);
|
|
1140
|
+
},
|
|
1141
|
+
/**
|
|
1142
|
+
* Get the last N steps from the knowledge store
|
|
1143
|
+
*
|
|
1144
|
+
* @param args - Arguments for getLastSteps
|
|
1145
|
+
* @returns Array of step summaries
|
|
1146
|
+
*/
|
|
1147
|
+
getLastSteps: async (...args) => {
|
|
1148
|
+
return getKnowledgeStore().getLastSteps(...args);
|
|
1149
|
+
},
|
|
1150
|
+
/**
|
|
1151
|
+
* Search steps by query
|
|
1152
|
+
*
|
|
1153
|
+
* @param args - Arguments for searchSteps
|
|
1154
|
+
* @returns Array of matching step summaries
|
|
1155
|
+
*/
|
|
1156
|
+
searchSteps: async (...args) => {
|
|
1157
|
+
return getKnowledgeStore().searchSteps(...args);
|
|
1158
|
+
},
|
|
1159
|
+
/**
|
|
1160
|
+
* Generate a recipe summary of a session
|
|
1161
|
+
*
|
|
1162
|
+
* @param args - Arguments for summarizeSession
|
|
1163
|
+
* @returns Session summary with recipe steps
|
|
1164
|
+
*/
|
|
1165
|
+
summarizeSession: async (...args) => {
|
|
1166
|
+
return getKnowledgeStore().summarizeSession(...args);
|
|
1167
|
+
},
|
|
1168
|
+
/**
|
|
1169
|
+
* List sessions with optional filtering
|
|
1170
|
+
*
|
|
1171
|
+
* @param args - Arguments for listSessions
|
|
1172
|
+
* @returns Array of session summaries
|
|
1173
|
+
*/
|
|
1174
|
+
listSessions: async (...args) => {
|
|
1175
|
+
return getKnowledgeStore().listSessions(...args);
|
|
1176
|
+
},
|
|
1177
|
+
/**
|
|
1178
|
+
* Generate prior knowledge from historical sessions
|
|
1179
|
+
*
|
|
1180
|
+
* @param args - Arguments for generatePriorKnowledge
|
|
1181
|
+
* @returns Prior knowledge object or undefined
|
|
1182
|
+
*/
|
|
1183
|
+
generatePriorKnowledge: async (...args) => {
|
|
1184
|
+
return getKnowledgeStore().generatePriorKnowledge(...args);
|
|
1185
|
+
},
|
|
1186
|
+
/**
|
|
1187
|
+
* Write session metadata to disk
|
|
1188
|
+
*
|
|
1189
|
+
* @param metadata - Session metadata to persist
|
|
1190
|
+
* @returns Path to the written metadata file
|
|
1191
|
+
*/
|
|
1192
|
+
writeSessionMetadata: async (metadata) => {
|
|
1193
|
+
return getKnowledgeStore().writeSessionMetadata(metadata);
|
|
1194
|
+
},
|
|
1195
|
+
};
|
|
1196
|
+
//# sourceMappingURL=knowledge-store.cjs.map
|