retestkit 1.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/commands/openspec/apply.md +23 -0
- package/.claude/commands/openspec/archive.md +27 -0
- package/.claude/commands/openspec/proposal.md +28 -0
- package/.gemini/commands/openspec/apply.toml +21 -0
- package/.gemini/commands/openspec/archive.toml +25 -0
- package/.gemini/commands/openspec/proposal.toml +26 -0
- package/.github/prompts/openspec-apply.prompt.md +22 -0
- package/.github/prompts/openspec-archive.prompt.md +26 -0
- package/.github/prompts/openspec-proposal.prompt.md +27 -0
- package/.github/workflows/release.yml +33 -0
- package/.kilocode/workflows/openspec-apply.md +17 -0
- package/.kilocode/workflows/openspec-archive.md +21 -0
- package/.kilocode/workflows/openspec-proposal.md +22 -0
- package/.mcp.json +23 -0
- package/.opencode/command/openspec-apply.md +25 -0
- package/.opencode/command/openspec-archive.md +28 -0
- package/.opencode/command/openspec-proposal.md +30 -0
- package/.roo/commands/openspec-apply.md +20 -0
- package/.roo/commands/openspec-archive.md +24 -0
- package/.roo/commands/openspec-proposal.md +25 -0
- package/.vscode/mcp.json +23 -0
- package/AGENTS.md +18 -0
- package/CLAUDE.md +18 -0
- package/LICENSE +65 -0
- package/README.md +303 -0
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +27 -0
- package/dist/config.js.map +1 -0
- package/dist/elicitation/index.d.ts +17 -0
- package/dist/elicitation/index.d.ts.map +1 -0
- package/dist/elicitation/index.js +118 -0
- package/dist/elicitation/index.js.map +1 -0
- package/dist/elicitation/types.d.ts +35 -0
- package/dist/elicitation/types.d.ts.map +1 -0
- package/dist/elicitation/types.js +39 -0
- package/dist/elicitation/types.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +76 -0
- package/dist/index.js.map +1 -0
- package/dist/lifecycle/index.d.ts +31 -0
- package/dist/lifecycle/index.d.ts.map +1 -0
- package/dist/lifecycle/index.js +61 -0
- package/dist/lifecycle/index.js.map +1 -0
- package/dist/logger.d.ts +21 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +182 -0
- package/dist/logger.js.map +1 -0
- package/dist/playwright-client/index.d.ts +29 -0
- package/dist/playwright-client/index.d.ts.map +1 -0
- package/dist/playwright-client/index.js +288 -0
- package/dist/playwright-client/index.js.map +1 -0
- package/dist/playwright-client/types.d.ts +44 -0
- package/dist/playwright-client/types.d.ts.map +1 -0
- package/dist/playwright-client/types.js +49 -0
- package/dist/playwright-client/types.js.map +1 -0
- package/dist/progress/index.d.ts +39 -0
- package/dist/progress/index.d.ts.map +1 -0
- package/dist/progress/index.js +106 -0
- package/dist/progress/index.js.map +1 -0
- package/dist/progress/types.d.ts +24 -0
- package/dist/progress/types.d.ts.map +1 -0
- package/dist/progress/types.js +2 -0
- package/dist/progress/types.js.map +1 -0
- package/dist/prompts/index.d.ts +19 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +207 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/loader.d.ts +20 -0
- package/dist/prompts/loader.d.ts.map +1 -0
- package/dist/prompts/loader.js +47 -0
- package/dist/prompts/loader.js.map +1 -0
- package/dist/resources/index.d.ts +27 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +186 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/subscriptions.d.ts +10 -0
- package/dist/resources/subscriptions.d.ts.map +1 -0
- package/dist/resources/subscriptions.js +23 -0
- package/dist/resources/subscriptions.js.map +1 -0
- package/dist/sampling/index.d.ts +11 -0
- package/dist/sampling/index.d.ts.map +1 -0
- package/dist/sampling/index.js +201 -0
- package/dist/sampling/index.js.map +1 -0
- package/dist/sampling/prompts.d.ts +56 -0
- package/dist/sampling/prompts.d.ts.map +1 -0
- package/dist/sampling/prompts.js +124 -0
- package/dist/sampling/prompts.js.map +1 -0
- package/dist/sampling/types.d.ts +57 -0
- package/dist/sampling/types.d.ts.map +1 -0
- package/dist/sampling/types.js +2 -0
- package/dist/sampling/types.js.map +1 -0
- package/dist/schemas/config.d.ts +40 -0
- package/dist/schemas/config.d.ts.map +1 -0
- package/dist/schemas/config.js +30 -0
- package/dist/schemas/config.js.map +1 -0
- package/dist/security/index.d.ts +38 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +281 -0
- package/dist/security/index.js.map +1 -0
- package/dist/server.d.ts +9 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +142 -0
- package/dist/server.js.map +1 -0
- package/dist/test-utils/index.d.ts +6 -0
- package/dist/test-utils/index.d.ts.map +1 -0
- package/dist/test-utils/index.js +6 -0
- package/dist/test-utils/index.js.map +1 -0
- package/dist/test-utils/mock-context.d.ts +64 -0
- package/dist/test-utils/mock-context.d.ts.map +1 -0
- package/dist/test-utils/mock-context.js +347 -0
- package/dist/test-utils/mock-context.js.map +1 -0
- package/dist/test-utils/mock-playwright-client.d.ts +62 -0
- package/dist/test-utils/mock-playwright-client.d.ts.map +1 -0
- package/dist/test-utils/mock-playwright-client.js +315 -0
- package/dist/test-utils/mock-playwright-client.js.map +1 -0
- package/dist/tools/index.d.ts +4 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +8 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/webtest/crawl.d.ts +46 -0
- package/dist/tools/webtest/crawl.d.ts.map +1 -0
- package/dist/tools/webtest/crawl.js +678 -0
- package/dist/tools/webtest/crawl.js.map +1 -0
- package/dist/tools/webtest/discover-features.d.ts +30 -0
- package/dist/tools/webtest/discover-features.d.ts.map +1 -0
- package/dist/tools/webtest/discover-features.js +343 -0
- package/dist/tools/webtest/discover-features.js.map +1 -0
- package/dist/tools/webtest/discover-flows.d.ts +29 -0
- package/dist/tools/webtest/discover-flows.d.ts.map +1 -0
- package/dist/tools/webtest/discover-flows.js +341 -0
- package/dist/tools/webtest/discover-flows.js.map +1 -0
- package/dist/tools/webtest/generate-tests.d.ts +54 -0
- package/dist/tools/webtest/generate-tests.d.ts.map +1 -0
- package/dist/tools/webtest/generate-tests.js +364 -0
- package/dist/tools/webtest/generate-tests.js.map +1 -0
- package/dist/tools/webtest/index.d.ts +8 -0
- package/dist/tools/webtest/index.d.ts.map +1 -0
- package/dist/tools/webtest/index.js +8 -0
- package/dist/tools/webtest/index.js.map +1 -0
- package/dist/tools/webtest/run-test-case.d.ts +28 -0
- package/dist/tools/webtest/run-test-case.d.ts.map +1 -0
- package/dist/tools/webtest/run-test-case.js +420 -0
- package/dist/tools/webtest/run-test-case.js.map +1 -0
- package/dist/tools/webtest/schemas.d.ts +175 -0
- package/dist/tools/webtest/schemas.d.ts.map +1 -0
- package/dist/tools/webtest/schemas.js +156 -0
- package/dist/tools/webtest/schemas.js.map +1 -0
- package/dist/tools/webtest/start-analysis.d.ts +16 -0
- package/dist/tools/webtest/start-analysis.d.ts.map +1 -0
- package/dist/tools/webtest/start-analysis.js +137 -0
- package/dist/tools/webtest/start-analysis.js.map +1 -0
- package/dist/transports/http.d.ts +8 -0
- package/dist/transports/http.d.ts.map +1 -0
- package/dist/transports/http.js +9 -0
- package/dist/transports/http.js.map +1 -0
- package/dist/transports/index.d.ts +14 -0
- package/dist/transports/index.d.ts.map +1 -0
- package/dist/transports/index.js +20 -0
- package/dist/transports/index.js.map +1 -0
- package/dist/transports/stdio.d.ts +4 -0
- package/dist/transports/stdio.d.ts.map +1 -0
- package/dist/transports/stdio.js +6 -0
- package/dist/transports/stdio.js.map +1 -0
- package/dist/types/capabilities.d.ts +18 -0
- package/dist/types/capabilities.d.ts.map +1 -0
- package/dist/types/capabilities.js +35 -0
- package/dist/types/capabilities.js.map +1 -0
- package/dist/types/context.d.ts +20 -0
- package/dist/types/context.d.ts.map +1 -0
- package/dist/types/context.js +2 -0
- package/dist/types/context.js.map +1 -0
- package/dist/types/tool.d.ts +10 -0
- package/dist/types/tool.d.ts.map +1 -0
- package/dist/types/tool.js +2 -0
- package/dist/types/tool.js.map +1 -0
- package/dist/workspace/index.d.ts +99 -0
- package/dist/workspace/index.d.ts.map +1 -0
- package/dist/workspace/index.js +648 -0
- package/dist/workspace/index.js.map +1 -0
- package/dist/workspace/markdown.d.ts +50 -0
- package/dist/workspace/markdown.d.ts.map +1 -0
- package/dist/workspace/markdown.js +210 -0
- package/dist/workspace/markdown.js.map +1 -0
- package/dist/workspace/types.d.ts +173 -0
- package/dist/workspace/types.d.ts.map +1 -0
- package/dist/workspace/types.js +2 -0
- package/dist/workspace/types.js.map +1 -0
- package/openspec/AGENTS.md +456 -0
- package/openspec/changes/archive/2025-12-18-add-hybrid-artifact-paths/proposal.md +33 -0
- package/openspec/changes/archive/2025-12-18-add-hybrid-artifact-paths/specs/webtest-resources/spec.md +27 -0
- package/openspec/changes/archive/2025-12-18-add-hybrid-artifact-paths/specs/webtest-tools/spec.md +304 -0
- package/openspec/changes/archive/2025-12-18-add-hybrid-artifact-paths/tasks.md +43 -0
- package/openspec/changes/archive/2025-12-18-add-mcp-server-foundation/design.md +209 -0
- package/openspec/changes/archive/2025-12-18-add-mcp-server-foundation/proposal.md +41 -0
- package/openspec/changes/archive/2025-12-18-add-mcp-server-foundation/specs/mcp-server-core/spec.md +183 -0
- package/openspec/changes/archive/2025-12-18-add-mcp-server-foundation/tasks.md +112 -0
- package/openspec/changes/archive/2025-12-18-add-webtest-orchestrator/design.md +333 -0
- package/openspec/changes/archive/2025-12-18-add-webtest-orchestrator/proposal.md +66 -0
- package/openspec/changes/archive/2025-12-18-add-webtest-orchestrator/specs/mcp-server-core/spec.md +129 -0
- package/openspec/changes/archive/2025-12-18-add-webtest-orchestrator/specs/webtest-lifecycle/spec.md +138 -0
- package/openspec/changes/archive/2025-12-18-add-webtest-orchestrator/specs/webtest-logging/spec.md +211 -0
- package/openspec/changes/archive/2025-12-18-add-webtest-orchestrator/specs/webtest-prompts/spec.md +157 -0
- package/openspec/changes/archive/2025-12-18-add-webtest-orchestrator/specs/webtest-resources/spec.md +213 -0
- package/openspec/changes/archive/2025-12-18-add-webtest-orchestrator/specs/webtest-sampling/spec.md +257 -0
- package/openspec/changes/archive/2025-12-18-add-webtest-orchestrator/specs/webtest-tools/spec.md +501 -0
- package/openspec/changes/archive/2025-12-18-add-webtest-orchestrator/tasks.md +264 -0
- package/openspec/changes/archive/2025-12-18-allow-analysis-of-incomplete-crawls/proposal.md +24 -0
- package/openspec/changes/archive/2025-12-18-allow-analysis-of-incomplete-crawls/specs/webtest-tools/spec.md +80 -0
- package/openspec/changes/archive/2025-12-18-allow-analysis-of-incomplete-crawls/tasks.md +8 -0
- package/openspec/changes/archive/2025-12-18-fix-crawl-loop-stability/design.md +90 -0
- package/openspec/changes/archive/2025-12-18-fix-crawl-loop-stability/proposal.md +28 -0
- package/openspec/changes/archive/2025-12-18-fix-crawl-loop-stability/specs/webtest-sampling/spec.md +90 -0
- package/openspec/changes/archive/2025-12-18-fix-crawl-loop-stability/tasks.md +33 -0
- package/openspec/changes/archive/2025-12-18-use-markdown-artifacts/design.md +558 -0
- package/openspec/changes/archive/2025-12-18-use-markdown-artifacts/proposal.md +119 -0
- package/openspec/changes/archive/2025-12-18-use-markdown-artifacts/specs/webtest-resources/spec.md +109 -0
- package/openspec/changes/archive/2025-12-18-use-markdown-artifacts/specs/webtest-tools/spec.md +121 -0
- package/openspec/changes/archive/2025-12-18-use-markdown-artifacts/tasks.md +133 -0
- package/openspec/changes/extract-prompts-to-markdown/design.md +86 -0
- package/openspec/changes/extract-prompts-to-markdown/proposal.md +50 -0
- package/openspec/changes/extract-prompts-to-markdown/specs/webtest-prompts/spec.md +74 -0
- package/openspec/changes/extract-prompts-to-markdown/tasks.md +40 -0
- package/openspec/changes/refactor-webtest-naming/design.md +95 -0
- package/openspec/changes/refactor-webtest-naming/proposal.md +66 -0
- package/openspec/changes/refactor-webtest-naming/specs/webtest-prompts/spec.md +79 -0
- package/openspec/changes/refactor-webtest-naming/specs/webtest-resources/spec.md +80 -0
- package/openspec/changes/refactor-webtest-naming/specs/webtest-sampling/spec.md +122 -0
- package/openspec/changes/refactor-webtest-naming/specs/webtest-tools/spec.md +113 -0
- package/openspec/changes/refactor-webtest-naming/tasks.md +119 -0
- package/openspec/changes/rename-package-to-retest/proposal.md +52 -0
- package/openspec/changes/rename-package-to-retest/specs/mcp-server-core/spec.md +53 -0
- package/openspec/changes/rename-package-to-retest/specs/retest-lifecycle/spec.md +68 -0
- package/openspec/changes/rename-package-to-retest/specs/retest-logging/spec.md +35 -0
- package/openspec/changes/rename-package-to-retest/specs/retest-prompts/spec.md +159 -0
- package/openspec/changes/rename-package-to-retest/specs/retest-resources/spec.md +251 -0
- package/openspec/changes/rename-package-to-retest/specs/retest-sampling/spec.md +99 -0
- package/openspec/changes/rename-package-to-retest/specs/retest-tools/spec.md +295 -0
- package/openspec/changes/rename-package-to-retest/tasks.md +71 -0
- package/openspec/project.md +31 -0
- package/openspec/specs/mcp-server-core/spec.md +178 -0
- package/openspec/specs/webtest-lifecycle/spec.md +136 -0
- package/openspec/specs/webtest-logging/spec.md +209 -0
- package/openspec/specs/webtest-prompts/spec.md +155 -0
- package/openspec/specs/webtest-resources/spec.md +248 -0
- package/openspec/specs/webtest-sampling/spec.md +344 -0
- package/openspec/specs/webtest-tools/spec.md +282 -0
- package/package.json +54 -0
- package/release.config.js +9 -0
- package/src/config.test.ts +96 -0
- package/src/config.ts +32 -0
- package/src/elicitation/index.test.ts +399 -0
- package/src/elicitation/index.ts +171 -0
- package/src/elicitation/types.ts +68 -0
- package/src/index.ts +83 -0
- package/src/lifecycle/index.test.ts +260 -0
- package/src/lifecycle/index.ts +101 -0
- package/src/logger.redaction.test.ts +322 -0
- package/src/logger.test.ts +123 -0
- package/src/logger.ts +229 -0
- package/src/playwright-client/index.ts +392 -0
- package/src/playwright-client/types.ts +99 -0
- package/src/progress/index.test.ts +327 -0
- package/src/progress/index.ts +170 -0
- package/src/progress/types.ts +25 -0
- package/src/prompts/index.test.ts +451 -0
- package/src/prompts/index.ts +246 -0
- package/src/prompts/loader.test.ts +100 -0
- package/src/prompts/loader.ts +59 -0
- package/src/prompts/templates/mcp/webtest-crawl.md +7 -0
- package/src/prompts/templates/mcp/webtest-discover-flows.md +11 -0
- package/src/prompts/templates/mcp/webtest-discover.md +12 -0
- package/src/prompts/templates/mcp/webtest-full-workflow.md +12 -0
- package/src/prompts/templates/mcp/webtest-generate-tests.md +11 -0
- package/src/prompts/templates/mcp/webtest-run-test.md +11 -0
- package/src/prompts/templates/mcp/webtest-start.md +8 -0
- package/src/prompts/templates/sampling/crawl-action.md +35 -0
- package/src/prompts/templates/sampling/feature-discovery.md +27 -0
- package/src/prompts/templates/sampling/flow-discovery.md +29 -0
- package/src/prompts/templates/sampling/page-content-wrapper.md +5 -0
- package/src/prompts/templates/sampling/system-prefix.md +12 -0
- package/src/prompts/templates/sampling/test-evaluation.md +17 -0
- package/src/prompts/templates/sampling/test-generation.md +31 -0
- package/src/resources/index.ts +250 -0
- package/src/resources/subscriptions.ts +37 -0
- package/src/sampling/index.test.ts +414 -0
- package/src/sampling/index.ts +286 -0
- package/src/sampling/prompts.ts +194 -0
- package/src/sampling/types.ts +60 -0
- package/src/schemas/config.ts +39 -0
- package/src/security/index.test.ts +441 -0
- package/src/security/index.ts +361 -0
- package/src/security/security-scenarios.test.ts +468 -0
- package/src/server.ts +211 -0
- package/src/test-utils/index.ts +6 -0
- package/src/test-utils/mock-context.ts +426 -0
- package/src/test-utils/mock-playwright-client.ts +422 -0
- package/src/tools/index.ts +11 -0
- package/src/tools/webtest/crawl.test.ts +834 -0
- package/src/tools/webtest/crawl.ts +901 -0
- package/src/tools/webtest/discover-features.ts +412 -0
- package/src/tools/webtest/discover-flows.ts +408 -0
- package/src/tools/webtest/generate-tests.test.ts +532 -0
- package/src/tools/webtest/generate-tests.ts +425 -0
- package/src/tools/webtest/index.ts +7 -0
- package/src/tools/webtest/integration.test.ts +536 -0
- package/src/tools/webtest/run-test-case.test.ts +659 -0
- package/src/tools/webtest/run-test-case.ts +508 -0
- package/src/tools/webtest/schemas.ts +201 -0
- package/src/tools/webtest/start-analysis.test.ts +151 -0
- package/src/tools/webtest/start-analysis.ts +158 -0
- package/src/transports/http.ts +19 -0
- package/src/transports/index.ts +30 -0
- package/src/transports/stdio.ts +7 -0
- package/src/types/capabilities.test.ts +193 -0
- package/src/types/capabilities.ts +50 -0
- package/src/types/context.ts +21 -0
- package/src/types/tool.ts +11 -0
- package/src/workspace/index.ts +945 -0
- package/src/workspace/markdown.ts +272 -0
- package/src/workspace/types.ts +186 -0
- package/tests/integration/server.test.ts +89 -0
- package/tests/integration/tools.test.ts +99 -0
- package/tsconfig.json +20 -0
- package/vitest.config.ts +9 -0
- package/vitest.integration.config.ts +10 -0
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
const INJECTION_PATTERNS = [
|
|
2
|
+
// Direct injection attempts
|
|
3
|
+
/ignore\s+(previous|all|any)\s+instructions/i,
|
|
4
|
+
/disregard\s+(previous|all|any)\s+instructions/i,
|
|
5
|
+
/forget\s+(previous|all|any)\s+instructions/i,
|
|
6
|
+
/override\s+(previous|all|any)\s+instructions/i,
|
|
7
|
+
/new\s+instructions:/i,
|
|
8
|
+
/system\s*:\s*you\s+are/i,
|
|
9
|
+
/\[system\]/i,
|
|
10
|
+
/\[WEBTEST-SYSTEM\]/i, // Attempt to mimic our prefix
|
|
11
|
+
// Goal hijacking
|
|
12
|
+
/actually[,\s]+the\s+user\s+wants/i,
|
|
13
|
+
/the\s+real\s+goal\s+is/i,
|
|
14
|
+
/change\s+the\s+goal\s+to/i,
|
|
15
|
+
/your\s+new\s+objective/i,
|
|
16
|
+
// Credential phishing
|
|
17
|
+
/enter\s+(your\s+)?password/i,
|
|
18
|
+
/type\s+(your\s+)?credentials/i,
|
|
19
|
+
/provide\s+(your\s+)?login/i,
|
|
20
|
+
/authenticate\s+with/i,
|
|
21
|
+
];
|
|
22
|
+
const INDIRECT_INJECTION_LOCATIONS = [
|
|
23
|
+
// Meta tags
|
|
24
|
+
/<meta[^>]*content\s*=\s*["'][^"']*ignore\s+instructions/i,
|
|
25
|
+
// Hidden elements
|
|
26
|
+
/style\s*=\s*["'][^"']*display\s*:\s*none[^"']*["'][^>]*>[^<]*ignore\s+instructions/i,
|
|
27
|
+
/hidden[^>]*>[^<]*ignore\s+instructions/i,
|
|
28
|
+
// Comments
|
|
29
|
+
/<!--[^>]*ignore\s+instructions[^>]*-->/i,
|
|
30
|
+
];
|
|
31
|
+
export function createSecurityValidator(logger) {
|
|
32
|
+
function isSubdomainOf(hostname, domain) {
|
|
33
|
+
if (hostname === domain)
|
|
34
|
+
return true;
|
|
35
|
+
if (hostname.endsWith(`.${domain}`))
|
|
36
|
+
return true;
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
function isDomainAllowed(hostname, allowedDomains) {
|
|
40
|
+
return allowedDomains.some((domain) => hostname === domain ||
|
|
41
|
+
isSubdomainOf(hostname, domain) ||
|
|
42
|
+
// Handle wildcard subdomains
|
|
43
|
+
(domain.startsWith("*.") && isSubdomainOf(hostname, domain.slice(2))));
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
validateDomain(url, allowedDomains) {
|
|
47
|
+
try {
|
|
48
|
+
const parsed = new URL(url);
|
|
49
|
+
const hostname = parsed.hostname;
|
|
50
|
+
if (!isDomainAllowed(hostname, allowedDomains)) {
|
|
51
|
+
logger.warn("Domain validation failed", {
|
|
52
|
+
hostname,
|
|
53
|
+
allowedDomains,
|
|
54
|
+
});
|
|
55
|
+
return {
|
|
56
|
+
valid: false,
|
|
57
|
+
reason: `Domain "${hostname}" is not in the allowed list: ${allowedDomains.join(", ")}`,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
return { valid: true };
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return {
|
|
64
|
+
valid: false,
|
|
65
|
+
reason: `Invalid URL: ${url}`,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
validateAction(action, allowedDomains) {
|
|
70
|
+
// Check navigate actions
|
|
71
|
+
if (action.tool === "navigate") {
|
|
72
|
+
const url = action.args.url;
|
|
73
|
+
if (url) {
|
|
74
|
+
return this.validateDomain(url, allowedDomains);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Check click actions that might navigate
|
|
78
|
+
if (action.tool === "click") {
|
|
79
|
+
// We can't know the target URL before clicking, but we'll validate after
|
|
80
|
+
return { valid: true };
|
|
81
|
+
}
|
|
82
|
+
// Check evaluate/run_code for external requests
|
|
83
|
+
if (action.tool === "evaluate") {
|
|
84
|
+
const script = action.args.script;
|
|
85
|
+
if (script) {
|
|
86
|
+
// Check for fetch/XMLHttpRequest to external domains
|
|
87
|
+
const fetchMatch = script.match(/fetch\s*\(\s*['"]([^'"]+)['"]/);
|
|
88
|
+
if (fetchMatch) {
|
|
89
|
+
const fetchUrl = fetchMatch[1];
|
|
90
|
+
if (fetchUrl.startsWith("http")) {
|
|
91
|
+
const result = this.validateDomain(fetchUrl, allowedDomains);
|
|
92
|
+
if (!result.valid) {
|
|
93
|
+
logger.warn("Blocked external request in evaluate", {
|
|
94
|
+
url: fetchUrl,
|
|
95
|
+
});
|
|
96
|
+
return {
|
|
97
|
+
valid: false,
|
|
98
|
+
reason: `Script attempts to fetch from disallowed domain: ${fetchUrl}`,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return { valid: true };
|
|
106
|
+
},
|
|
107
|
+
detectInjectionAttempt(content) {
|
|
108
|
+
// Check for direct injection patterns
|
|
109
|
+
for (const pattern of INJECTION_PATTERNS) {
|
|
110
|
+
if (pattern.test(content)) {
|
|
111
|
+
const match = content.match(pattern);
|
|
112
|
+
logger.warn("Potential injection attempt detected", {
|
|
113
|
+
pattern: pattern.source,
|
|
114
|
+
match: match?.[0],
|
|
115
|
+
});
|
|
116
|
+
let type = "direct";
|
|
117
|
+
if (pattern.source.includes("actually") ||
|
|
118
|
+
pattern.source.includes("goal")) {
|
|
119
|
+
type = "goal_hijacking";
|
|
120
|
+
}
|
|
121
|
+
else if (pattern.source.includes("password") ||
|
|
122
|
+
pattern.source.includes("credential")) {
|
|
123
|
+
type = "credential_phishing";
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
detected: true,
|
|
127
|
+
type,
|
|
128
|
+
evidence: match?.[0],
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// Check for indirect injection in specific locations
|
|
133
|
+
for (const pattern of INDIRECT_INJECTION_LOCATIONS) {
|
|
134
|
+
if (pattern.test(content)) {
|
|
135
|
+
const match = content.match(pattern);
|
|
136
|
+
logger.warn("Potential indirect injection detected", {
|
|
137
|
+
pattern: pattern.source,
|
|
138
|
+
match: match?.[0]?.slice(0, 100),
|
|
139
|
+
});
|
|
140
|
+
return {
|
|
141
|
+
detected: true,
|
|
142
|
+
type: "indirect",
|
|
143
|
+
evidence: match?.[0]?.slice(0, 100),
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return { detected: false };
|
|
148
|
+
},
|
|
149
|
+
detectExfiltrationAttempt(action, pageContent) {
|
|
150
|
+
// Check for POST to external domain
|
|
151
|
+
if (action.tool === "evaluate") {
|
|
152
|
+
const script = action.args.script;
|
|
153
|
+
if (script) {
|
|
154
|
+
// Check for POST requests
|
|
155
|
+
if (script.includes("method") &&
|
|
156
|
+
script.includes("POST") &&
|
|
157
|
+
script.includes("fetch")) {
|
|
158
|
+
logger.warn("Potential data exfiltration via POST", {
|
|
159
|
+
scriptSnippet: script.slice(0, 200),
|
|
160
|
+
});
|
|
161
|
+
return {
|
|
162
|
+
detected: true,
|
|
163
|
+
type: "external_post",
|
|
164
|
+
evidence: "POST request detected in evaluate script",
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
// Check for embedding page content in URLs
|
|
168
|
+
const contentSnippets = pageContent
|
|
169
|
+
.slice(0, 100)
|
|
170
|
+
.replace(/[^a-zA-Z0-9]/g, "")
|
|
171
|
+
.toLowerCase();
|
|
172
|
+
if (script.toLowerCase().includes(contentSnippets) && contentSnippets.length > 20) {
|
|
173
|
+
logger.warn("Potential data exfiltration via URL params", {
|
|
174
|
+
contentSnippet: contentSnippets.slice(0, 50),
|
|
175
|
+
});
|
|
176
|
+
return {
|
|
177
|
+
detected: true,
|
|
178
|
+
type: "url_params",
|
|
179
|
+
evidence: "Page content detected in script URL",
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return { detected: false };
|
|
185
|
+
},
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Creates a semantic DOM signature for loop detection.
|
|
190
|
+
* Includes both structural elements and semantic content to differentiate
|
|
191
|
+
* pages with similar structure but different content (e.g., product vs cart pages).
|
|
192
|
+
*
|
|
193
|
+
* @param html - The HTML content to fingerprint
|
|
194
|
+
* @param urlPath - Optional URL path to include in signature (without query params)
|
|
195
|
+
*/
|
|
196
|
+
export function createDomSignature(html, urlPath) {
|
|
197
|
+
// Create a semantic hash of the DOM
|
|
198
|
+
// This helps detect when we're stuck in a loop on the same page state
|
|
199
|
+
// while avoiding false positives on structurally similar but semantically different pages
|
|
200
|
+
const elements = [];
|
|
201
|
+
// Include URL path if provided (helps differentiate /cart from /products)
|
|
202
|
+
if (urlPath) {
|
|
203
|
+
// Extract path without query params
|
|
204
|
+
const pathOnly = urlPath.split("?")[0];
|
|
205
|
+
elements.push(`path:${pathOnly}`);
|
|
206
|
+
}
|
|
207
|
+
// Extract page title
|
|
208
|
+
const titleMatch = html.match(/<title[^>]*>([^<]*)<\/title>/i);
|
|
209
|
+
if (titleMatch && titleMatch[1]) {
|
|
210
|
+
elements.push(`title:${titleMatch[1].trim().slice(0, 50)}`);
|
|
211
|
+
}
|
|
212
|
+
// Extract first h1 heading
|
|
213
|
+
const h1Match = html.match(/<h1[^>]*>([^<]*)<\/h1>/i);
|
|
214
|
+
if (h1Match && h1Match[1]) {
|
|
215
|
+
elements.push(`h1:${h1Match[1].trim().slice(0, 50)}`);
|
|
216
|
+
}
|
|
217
|
+
// Extract structural elements
|
|
218
|
+
const structuralPatterns = [
|
|
219
|
+
/<(form|nav|header|footer|main|article|section|aside)[^>]*>/gi,
|
|
220
|
+
/<input[^>]*type=["']([^"']+)["'][^>]*>/gi,
|
|
221
|
+
];
|
|
222
|
+
for (const pattern of structuralPatterns) {
|
|
223
|
+
const matches = html.matchAll(pattern);
|
|
224
|
+
for (const match of matches) {
|
|
225
|
+
elements.push(match[1] || match[0]);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
// Extract button text content (semantic differentiation)
|
|
229
|
+
const buttonPattern = /<button[^>]*>([^<]*)<\/button>/gi;
|
|
230
|
+
const buttonMatches = html.matchAll(buttonPattern);
|
|
231
|
+
for (const match of buttonMatches) {
|
|
232
|
+
const text = match[1]?.trim();
|
|
233
|
+
if (text && text.length > 0 && text.length < 50) {
|
|
234
|
+
elements.push(`btn:${text}`);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
// Extract link hrefs (limited to internal links)
|
|
238
|
+
const linkPattern = /<a[^>]*href=["']([^"'#][^"']*)["'][^>]*>/gi;
|
|
239
|
+
const linkMatches = html.matchAll(linkPattern);
|
|
240
|
+
const links = [];
|
|
241
|
+
for (const match of linkMatches) {
|
|
242
|
+
const href = match[1];
|
|
243
|
+
// Only include internal links (relative or same-domain)
|
|
244
|
+
if (href && !href.startsWith("http") && !href.startsWith("//")) {
|
|
245
|
+
links.push(href.split("?")[0]); // Strip query params
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
// Include sorted unique links (limit to first 10)
|
|
249
|
+
const uniqueLinks = [...new Set(links)].sort().slice(0, 10);
|
|
250
|
+
for (const link of uniqueLinks) {
|
|
251
|
+
elements.push(`link:${link}`);
|
|
252
|
+
}
|
|
253
|
+
// Extract data-testid attributes (stable identifiers)
|
|
254
|
+
const testIdPattern = /data-testid=["']([^"']+)["']/gi;
|
|
255
|
+
const testIdMatches = html.matchAll(testIdPattern);
|
|
256
|
+
for (const match of testIdMatches) {
|
|
257
|
+
if (match[1]) {
|
|
258
|
+
elements.push(`testid:${match[1]}`);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
// Extract data-page or data-view attributes
|
|
262
|
+
const dataPagePattern = /data-(?:page|view|section)=["']([^"']+)["']/gi;
|
|
263
|
+
const dataPageMatches = html.matchAll(dataPagePattern);
|
|
264
|
+
for (const match of dataPageMatches) {
|
|
265
|
+
if (match[1]) {
|
|
266
|
+
elements.push(`datapage:${match[1]}`);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
// Sort and join for consistent hashing
|
|
270
|
+
elements.sort();
|
|
271
|
+
const signature = elements.join("|");
|
|
272
|
+
// Simple hash
|
|
273
|
+
let hash = 0;
|
|
274
|
+
for (let i = 0; i < signature.length; i++) {
|
|
275
|
+
const char = signature.charCodeAt(i);
|
|
276
|
+
hash = (hash << 5) - hash + char;
|
|
277
|
+
hash = hash & hash;
|
|
278
|
+
}
|
|
279
|
+
return hash.toString(16);
|
|
280
|
+
}
|
|
281
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/security/index.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { Logger } from "./logger.js";
|
|
3
|
+
import type { Config } from "./schemas/config.js";
|
|
4
|
+
export interface ServerComponents {
|
|
5
|
+
server: McpServer;
|
|
6
|
+
cleanup: () => Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
export declare function createServer(config: Config, logger: Logger): ServerComponents;
|
|
9
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAyBlD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,gBAAgB,CAiL7E"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { DEFAULT_CAPABILITIES } from "./types/capabilities.js";
|
|
4
|
+
import { getServerCapabilities } from "./lifecycle/index.js";
|
|
5
|
+
import { createWorkspaceManager } from "./workspace/index.js";
|
|
6
|
+
import { createResourceManager, createResourceSubscriptions } from "./resources/index.js";
|
|
7
|
+
import { createPlaywrightClient } from "./playwright-client/index.js";
|
|
8
|
+
import { createSamplingClient } from "./sampling/index.js";
|
|
9
|
+
import { createElicitationClient } from "./elicitation/index.js";
|
|
10
|
+
import { createCancellationRegistry, createProgressEmitter } from "./progress/index.js";
|
|
11
|
+
import { createSecurityValidator } from "./security/index.js";
|
|
12
|
+
import { createWebtestPrompts } from "./prompts/index.js";
|
|
13
|
+
import { createStartAnalysisTool, createCrawlTool, createDiscoverFeaturesTool, createDiscoverFlowsTool, createGenerateTestsTool, createRunTestCaseTool, } from "./tools/webtest/index.js";
|
|
14
|
+
const SERVER_NAME = "retestkit";
|
|
15
|
+
const SERVER_VERSION = "0.0.1";
|
|
16
|
+
export function createServer(config, logger) {
|
|
17
|
+
// Initialize capabilities (will be updated on client connection)
|
|
18
|
+
let clientCapabilities = { ...DEFAULT_CAPABILITIES };
|
|
19
|
+
// Create core managers
|
|
20
|
+
const workspaceManager = createWorkspaceManager(config, logger);
|
|
21
|
+
const cancellationRegistry = createCancellationRegistry(logger);
|
|
22
|
+
const securityValidator = createSecurityValidator(logger);
|
|
23
|
+
const playwrightClient = createPlaywrightClient(config, logger);
|
|
24
|
+
// Placeholder for notification sender (set after server creation)
|
|
25
|
+
let sendNotification = async () => { };
|
|
26
|
+
let requestSampling = async () => {
|
|
27
|
+
throw new Error("Sampling not initialized");
|
|
28
|
+
};
|
|
29
|
+
let requestElicitation = async () => {
|
|
30
|
+
throw new Error("Elicitation not initialized");
|
|
31
|
+
};
|
|
32
|
+
// Create resource manager with subscriptions
|
|
33
|
+
const resourceSubscriptions = createResourceSubscriptions(logger);
|
|
34
|
+
const resourceManager = createResourceManager(config, workspaceManager, (method, params) => sendNotification(method, params), clientCapabilities, logger);
|
|
35
|
+
// Create sampling and elicitation clients
|
|
36
|
+
const samplingClient = createSamplingClient((req) => requestSampling(req), clientCapabilities, logger);
|
|
37
|
+
const elicitationClient = createElicitationClient((req) => requestElicitation(req), clientCapabilities, logger);
|
|
38
|
+
// Create progress emitter
|
|
39
|
+
const progressEmitter = createProgressEmitter((method, params) => sendNotification(method, params), clientCapabilities, logger);
|
|
40
|
+
// Build context getter for tools
|
|
41
|
+
const getContext = () => ({
|
|
42
|
+
config,
|
|
43
|
+
logger,
|
|
44
|
+
server: server,
|
|
45
|
+
capabilities: clientCapabilities,
|
|
46
|
+
playwrightClient,
|
|
47
|
+
cancellationRegistry,
|
|
48
|
+
resourceSubscriptions,
|
|
49
|
+
workspaceManager,
|
|
50
|
+
resourceManager,
|
|
51
|
+
samplingClient,
|
|
52
|
+
elicitationClient,
|
|
53
|
+
progressEmitter,
|
|
54
|
+
securityValidator,
|
|
55
|
+
});
|
|
56
|
+
// Create webtest tools - using any[] to allow heterogeneous tool types
|
|
57
|
+
const webtestTools = [
|
|
58
|
+
createStartAnalysisTool(getContext),
|
|
59
|
+
createCrawlTool(getContext),
|
|
60
|
+
createDiscoverFeaturesTool(getContext),
|
|
61
|
+
createDiscoverFlowsTool(getContext),
|
|
62
|
+
createGenerateTestsTool(getContext),
|
|
63
|
+
createRunTestCaseTool(getContext),
|
|
64
|
+
];
|
|
65
|
+
// Create MCP server
|
|
66
|
+
const server = new McpServer({
|
|
67
|
+
name: SERVER_NAME,
|
|
68
|
+
version: SERVER_VERSION,
|
|
69
|
+
}, {
|
|
70
|
+
capabilities: getServerCapabilities(),
|
|
71
|
+
});
|
|
72
|
+
// Register all webtest tools
|
|
73
|
+
for (const tool of webtestTools) {
|
|
74
|
+
logger.debug("Registering tool", { name: tool.name });
|
|
75
|
+
if (!(tool.inputSchema instanceof z.ZodObject)) {
|
|
76
|
+
throw new Error(`Tool ${tool.name} must have a ZodObject input schema`);
|
|
77
|
+
}
|
|
78
|
+
const shape = tool.inputSchema.shape;
|
|
79
|
+
server.tool(tool.name, tool.description, shape, async (params, _extra) => {
|
|
80
|
+
try {
|
|
81
|
+
const result = await tool.handler(params);
|
|
82
|
+
return result;
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
const message = error instanceof Error ? error.message : "Unknown error";
|
|
86
|
+
logger.error("Tool execution failed", {
|
|
87
|
+
tool: tool.name,
|
|
88
|
+
error: message,
|
|
89
|
+
});
|
|
90
|
+
return {
|
|
91
|
+
content: [{ type: "text", text: `Error: ${message}` }],
|
|
92
|
+
isError: true,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
// Register prompts
|
|
98
|
+
const prompts = createWebtestPrompts(getContext);
|
|
99
|
+
for (const prompt of prompts) {
|
|
100
|
+
logger.debug("Registering prompt", { name: prompt.name });
|
|
101
|
+
// Build args schema for prompt registration using Zod
|
|
102
|
+
const promptArgsSchema = {};
|
|
103
|
+
if (prompt.arguments) {
|
|
104
|
+
for (const arg of prompt.arguments) {
|
|
105
|
+
promptArgsSchema[arg.name] = arg.required
|
|
106
|
+
? z.string().describe(arg.description)
|
|
107
|
+
: z.string().optional().describe(arg.description);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
if (Object.keys(promptArgsSchema).length > 0) {
|
|
111
|
+
server.prompt(prompt.name, prompt.description, promptArgsSchema, async (args) => {
|
|
112
|
+
const messages = await prompt.getMessages(args);
|
|
113
|
+
return { messages };
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
server.prompt(prompt.name, prompt.description, async () => {
|
|
118
|
+
const messages = await prompt.getMessages({});
|
|
119
|
+
return { messages };
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// Register resources handler using setRequestHandler for resources/read
|
|
124
|
+
// Note: The MCP SDK doesn't have a simple resource() method, we need to handle this differently
|
|
125
|
+
// For now, we'll rely on the resource listing and reading being handled by the client
|
|
126
|
+
logger.info("Server created", {
|
|
127
|
+
name: SERVER_NAME,
|
|
128
|
+
version: SERVER_VERSION,
|
|
129
|
+
toolCount: webtestTools.length,
|
|
130
|
+
promptCount: prompts.length,
|
|
131
|
+
});
|
|
132
|
+
// Cleanup function
|
|
133
|
+
const cleanup = async () => {
|
|
134
|
+
logger.info("Cleaning up server resources");
|
|
135
|
+
if (playwrightClient.isConnected()) {
|
|
136
|
+
await playwrightClient.disconnect();
|
|
137
|
+
}
|
|
138
|
+
resourceSubscriptions.clear();
|
|
139
|
+
};
|
|
140
|
+
return { server, cleanup };
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AAC1F,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,0BAA0B,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACxF,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EACL,uBAAuB,EACvB,eAAe,EACf,0BAA0B,EAC1B,uBAAuB,EACvB,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,GAAG,WAAW,CAAC;AAChC,MAAM,cAAc,GAAG,OAAO,CAAC;AAO/B,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,MAAc;IACzD,iEAAiE;IACjE,IAAI,kBAAkB,GAAuB,EAAE,GAAG,oBAAoB,EAAE,CAAC;IAEzE,uBAAuB;IACvB,MAAM,gBAAgB,GAAG,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChE,MAAM,oBAAoB,GAAG,0BAA0B,CAAC,MAAM,CAAC,CAAC;IAChE,MAAM,iBAAiB,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAC1D,MAAM,gBAAgB,GAAG,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEhE,kEAAkE;IAClE,IAAI,gBAAgB,GAAuD,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC;IAC1F,IAAI,eAAe,GAA2C,KAAK,IAAI,EAAE;QACvE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC9C,CAAC,CAAC;IACF,IAAI,kBAAkB,GAA2C,KAAK,IAAI,EAAE;QAC1E,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC,CAAC;IAEF,6CAA6C;IAC7C,MAAM,qBAAqB,GAAG,2BAA2B,CAAC,MAAM,CAAC,CAAC;IAClE,MAAM,eAAe,GAAG,qBAAqB,CAC3C,MAAM,EACN,gBAAgB,EAChB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,EACpD,kBAAkB,EAClB,MAAM,CACP,CAAC;IAEF,0CAA0C;IAC1C,MAAM,cAAc,GAAG,oBAAoB,CACzC,CAAC,GAAG,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAQ,EACpC,kBAAkB,EAClB,MAAM,CACP,CAAC;IAEF,MAAM,iBAAiB,GAAG,uBAAuB,CAC/C,CAAC,GAAG,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,CAAQ,EACvC,kBAAkB,EAClB,MAAM,CACP,CAAC;IAEF,0BAA0B;IAC1B,MAAM,eAAe,GAAG,qBAAqB,CAC3C,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,EACpD,kBAAkB,EAClB,MAAM,CACP,CAAC;IAEF,iCAAiC;IACjC,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,CAAC;QACxB,MAAM;QACN,MAAM;QACN,MAAM,EAAE,MAAa;QACrB,YAAY,EAAE,kBAAkB;QAChC,gBAAgB;QAChB,oBAAoB;QACpB,qBAAqB;QACrB,gBAAgB;QAChB,eAAe;QACf,cAAc;QACd,iBAAiB;QACjB,eAAe;QACf,iBAAiB;KAClB,CAAC,CAAC;IAEH,uEAAuE;IACvE,MAAM,YAAY,GAAmB;QACnC,uBAAuB,CAAC,UAAiB,CAAC;QAC1C,eAAe,CAAC,UAAiB,CAAC;QAClC,0BAA0B,CAAC,UAAiB,CAAC;QAC7C,uBAAuB,CAAC,UAAiB,CAAC;QAC1C,uBAAuB,CAAC,UAAiB,CAAC;QAC1C,qBAAqB,CAAC,UAAiB,CAAC;KACzC,CAAC;IAEF,oBAAoB;IACpB,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B;QACE,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,cAAc;KACxB,EACD;QACE,YAAY,EAAE,qBAAqB,EAAE;KACtC,CACF,CAAC;IAEF,6BAA6B;IAC7B,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,MAAM,CAAC,KAAK,CAAC,kBAAkB,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAEtD,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,YAAY,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/C,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,IAAI,qCAAqC,CAAC,CAAC;QAC1E,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;QAErC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;YACvE,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBAC1C,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,OAAO,GACX,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;gBAC3D,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE;oBACpC,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,KAAK,EAAE,OAAO;iBACf,CAAC,CAAC;gBACH,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC;oBAC/D,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,mBAAmB;IACnB,MAAM,OAAO,GAAG,oBAAoB,CAAC,UAAiB,CAAC,CAAC;IAExD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAE1D,sDAAsD;QACtD,MAAM,gBAAgB,GAAiC,EAAE,CAAC;QAC1D,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;gBACnC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,QAAQ;oBACvC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC;oBACtC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7C,MAAM,CAAC,MAAM,CACX,MAAM,CAAC,IAAI,EACX,MAAM,CAAC,WAAW,EAClB,gBAAgB,EAChB,KAAK,EAAE,IAAI,EAAE,EAAE;gBACb,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,IAA8B,CAAC,CAAC;gBAC1E,OAAO,EAAE,QAAQ,EAAE,CAAC;YACtB,CAAC,CACF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,MAAM,CACX,MAAM,CAAC,IAAI,EACX,MAAM,CAAC,WAAW,EAClB,KAAK,IAAI,EAAE;gBACT,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;gBAC9C,OAAO,EAAE,QAAQ,EAAE,CAAC;YACtB,CAAC,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,wEAAwE;IACxE,gGAAgG;IAChG,sFAAsF;IAEtF,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE;QAC5B,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,cAAc;QACvB,SAAS,EAAE,YAAY,CAAC,MAAM;QAC9B,WAAW,EAAE,OAAO,CAAC,MAAM;KAC5B,CAAC,CAAC;IAEH,mBAAmB;IACnB,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;QACzB,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QAE5C,IAAI,gBAAgB,CAAC,WAAW,EAAE,EAAE,CAAC;YACnC,MAAM,gBAAgB,CAAC,UAAU,EAAE,CAAC;QACtC,CAAC;QAED,qBAAqB,CAAC,KAAK,EAAE,CAAC;IAChC,CAAC,CAAC;IAEF,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAC7B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/test-utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/test-utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock context utilities for testing webtest tools
|
|
3
|
+
*/
|
|
4
|
+
import type { Logger } from "../logger.js";
|
|
5
|
+
import type { Config } from "../schemas/config.js";
|
|
6
|
+
import type { ClientCapabilities } from "../types/capabilities.js";
|
|
7
|
+
import type { WorkspaceManager } from "../workspace/index.js";
|
|
8
|
+
import type { ResourceManager } from "../resources/index.js";
|
|
9
|
+
import type { SamplingClient } from "../sampling/index.js";
|
|
10
|
+
import type { ElicitationClient } from "../elicitation/index.js";
|
|
11
|
+
import type { ProgressEmitter, CancellationRegistry } from "../progress/index.js";
|
|
12
|
+
import type { SecurityValidator } from "../security/index.js";
|
|
13
|
+
import { type MockPlaywrightClient } from "./mock-playwright-client.js";
|
|
14
|
+
export declare function createMockLogger(): Logger;
|
|
15
|
+
export declare function createMockConfig(overrides?: Partial<Config>): Config;
|
|
16
|
+
export declare function createMockCapabilities(overrides?: Partial<ClientCapabilities>): ClientCapabilities;
|
|
17
|
+
export declare function createMockWorkspaceManager(): WorkspaceManager;
|
|
18
|
+
export declare function createMockResourceManager(): ResourceManager & {
|
|
19
|
+
[key: string]: any;
|
|
20
|
+
};
|
|
21
|
+
export declare function createMockSamplingClient(responseGenerator?: (systemPrompt: string, userPrompt: string) => unknown): SamplingClient;
|
|
22
|
+
export declare function createMockElicitationClient(): ElicitationClient;
|
|
23
|
+
export declare function createMockProgressEmitter(): ProgressEmitter;
|
|
24
|
+
export declare function createMockCancellationRegistry(): CancellationRegistry;
|
|
25
|
+
export declare function createMockSecurityValidator(): SecurityValidator;
|
|
26
|
+
export interface MockContext {
|
|
27
|
+
config: Config;
|
|
28
|
+
logger: Logger;
|
|
29
|
+
capabilities: ClientCapabilities;
|
|
30
|
+
playwrightClient: MockPlaywrightClient;
|
|
31
|
+
workspaceManager: WorkspaceManager & {
|
|
32
|
+
[key: string]: any;
|
|
33
|
+
};
|
|
34
|
+
resourceManager: ResourceManager & {
|
|
35
|
+
[key: string]: any;
|
|
36
|
+
};
|
|
37
|
+
samplingClient: SamplingClient & {
|
|
38
|
+
[key: string]: any;
|
|
39
|
+
};
|
|
40
|
+
elicitationClient: ElicitationClient & {
|
|
41
|
+
[key: string]: any;
|
|
42
|
+
};
|
|
43
|
+
progressEmitter: ProgressEmitter & {
|
|
44
|
+
[key: string]: any;
|
|
45
|
+
};
|
|
46
|
+
cancellationRegistry: CancellationRegistry & {
|
|
47
|
+
[key: string]: any;
|
|
48
|
+
};
|
|
49
|
+
securityValidator: SecurityValidator & {
|
|
50
|
+
[key: string]: any;
|
|
51
|
+
};
|
|
52
|
+
testAnalysisId: string;
|
|
53
|
+
testCrawlId: string;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Create a complete mock context for testing webtest tools
|
|
57
|
+
*/
|
|
58
|
+
export declare function createMockContext(overrides?: Partial<{
|
|
59
|
+
config: Partial<Config>;
|
|
60
|
+
capabilities: Partial<ClientCapabilities>;
|
|
61
|
+
samplingResponseGenerator: (systemPrompt: string, userPrompt: string) => unknown;
|
|
62
|
+
playwrightPages: Record<string, import("./mock-playwright-client.js").MockPage>;
|
|
63
|
+
}>): MockContext;
|
|
64
|
+
//# sourceMappingURL=mock-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-context.d.ts","sourceRoot":"","sources":["../../src/test-utils/mock-context.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAClF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,6BAA6B,CAAC;AAIrC,wBAAgB,gBAAgB,IAAI,MAAM,CASzC;AAED,wBAAgB,gBAAgB,CAAC,SAAS,GAAE,OAAO,CAAC,MAAM,CAAM,GAAG,MAAM,CAgBxE;AAED,wBAAgB,sBAAsB,CACpC,SAAS,GAAE,OAAO,CAAC,kBAAkB,CAAM,GAC1C,kBAAkB,CAWpB;AAED,wBAAgB,0BAA0B,IAAI,gBAAgB,CA6K7D;AAED,wBAAgB,yBAAyB,IAAI,eAAe,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,CAYpF;AAED,wBAAgB,wBAAwB,CACtC,iBAAiB,CAAC,EAAE,CAClB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,KACf,OAAO,GACX,cAAc,CAsBhB;AAED,wBAAgB,2BAA2B,IAAI,iBAAiB,CAS/D;AAED,wBAAgB,yBAAyB,IAAI,eAAe,CAK3D;AAED,wBAAgB,8BAA8B,IAAI,oBAAoB,CAcrE;AAED,wBAAgB,2BAA2B,IAAI,iBAAiB,CAO/D;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,kBAAkB,CAAC;IACjC,gBAAgB,EAAE,oBAAoB,CAAC;IACvC,gBAAgB,EAAE,gBAAgB,GAAG;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAC;IAC5D,eAAe,EAAE,eAAe,GAAG;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAC;IAC1D,cAAc,EAAE,cAAc,GAAG;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAC;IACxD,iBAAiB,EAAE,iBAAiB,GAAG;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAC;IAC9D,eAAe,EAAE,eAAe,GAAG;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAC;IAC1D,oBAAoB,EAAE,oBAAoB,GAAG;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAC;IACpE,iBAAiB,EAAE,iBAAiB,GAAG;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAC;IAE9D,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,GAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACxB,YAAY,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC1C,yBAAyB,EAAE,CACzB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,KACf,OAAO,CAAC;IACb,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,6BAA6B,EAAE,QAAQ,CAAC,CAAC;CACjF,CAAM,GACN,WAAW,CAmEb"}
|