mindheal 1.0.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/.env.example +48 -0
- package/CHANGELOG.md +27 -0
- package/LICENSE +21 -0
- package/README.md +481 -0
- package/dist/cjs/ai/ai-provider.js +46 -0
- package/dist/cjs/ai/ai-provider.js.map +1 -0
- package/dist/cjs/ai/anthropic-provider.js +106 -0
- package/dist/cjs/ai/anthropic-provider.js.map +1 -0
- package/dist/cjs/ai/azure-openai-provider.js +130 -0
- package/dist/cjs/ai/azure-openai-provider.js.map +1 -0
- package/dist/cjs/ai/bedrock-provider.js +183 -0
- package/dist/cjs/ai/bedrock-provider.js.map +1 -0
- package/dist/cjs/ai/deepseek-provider.js +118 -0
- package/dist/cjs/ai/deepseek-provider.js.map +1 -0
- package/dist/cjs/ai/gemini-provider.js +129 -0
- package/dist/cjs/ai/gemini-provider.js.map +1 -0
- package/dist/cjs/ai/groq-provider.js +118 -0
- package/dist/cjs/ai/groq-provider.js.map +1 -0
- package/dist/cjs/ai/meta-provider.js +118 -0
- package/dist/cjs/ai/meta-provider.js.map +1 -0
- package/dist/cjs/ai/ollama-provider.js +127 -0
- package/dist/cjs/ai/ollama-provider.js.map +1 -0
- package/dist/cjs/ai/openai-provider.js +117 -0
- package/dist/cjs/ai/openai-provider.js.map +1 -0
- package/dist/cjs/ai/perplexity-provider.js +118 -0
- package/dist/cjs/ai/perplexity-provider.js.map +1 -0
- package/dist/cjs/ai/prompt-templates.js +174 -0
- package/dist/cjs/ai/prompt-templates.js.map +1 -0
- package/dist/cjs/ai/qwen-provider.js +118 -0
- package/dist/cjs/ai/qwen-provider.js.map +1 -0
- package/dist/cjs/analytics/healing-analytics.js +263 -0
- package/dist/cjs/analytics/healing-analytics.js.map +1 -0
- package/dist/cjs/cli/init.js +517 -0
- package/dist/cjs/cli/init.js.map +1 -0
- package/dist/cjs/config/config-loader.js +135 -0
- package/dist/cjs/config/config-loader.js.map +1 -0
- package/dist/cjs/config/defaults.js +109 -0
- package/dist/cjs/config/defaults.js.map +1 -0
- package/dist/cjs/core/dom-snapshot.js +280 -0
- package/dist/cjs/core/dom-snapshot.js.map +1 -0
- package/dist/cjs/core/enterprise-strategy.js +702 -0
- package/dist/cjs/core/enterprise-strategy.js.map +1 -0
- package/dist/cjs/core/healer.js +283 -0
- package/dist/cjs/core/healer.js.map +1 -0
- package/dist/cjs/core/interceptor.js +945 -0
- package/dist/cjs/core/interceptor.js.map +1 -0
- package/dist/cjs/core/locator-analyzer.js +172 -0
- package/dist/cjs/core/locator-analyzer.js.map +1 -0
- package/dist/cjs/core/locator-strategies.js +891 -0
- package/dist/cjs/core/locator-strategies.js.map +1 -0
- package/dist/cjs/core/self-heal-cache.js +178 -0
- package/dist/cjs/core/self-heal-cache.js.map +1 -0
- package/dist/cjs/core/smart-retry.js +248 -0
- package/dist/cjs/core/smart-retry.js.map +1 -0
- package/dist/cjs/core/visual-verification.js +262 -0
- package/dist/cjs/core/visual-verification.js.map +1 -0
- package/dist/cjs/git/code-modifier.js +184 -0
- package/dist/cjs/git/code-modifier.js.map +1 -0
- package/dist/cjs/git/git-operations.js +145 -0
- package/dist/cjs/git/git-operations.js.map +1 -0
- package/dist/cjs/git/pr-creator.js +190 -0
- package/dist/cjs/git/pr-creator.js.map +1 -0
- package/dist/cjs/index.js +97 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/rag/context-retriever.js +289 -0
- package/dist/cjs/rag/context-retriever.js.map +1 -0
- package/dist/cjs/rag/embeddings.js +82 -0
- package/dist/cjs/rag/embeddings.js.map +1 -0
- package/dist/cjs/rag/knowledge-store.js +159 -0
- package/dist/cjs/rag/knowledge-store.js.map +1 -0
- package/dist/cjs/reporters/heal-report.js +279 -0
- package/dist/cjs/reporters/heal-report.js.map +1 -0
- package/dist/cjs/reporters/heal-reporter.js +294 -0
- package/dist/cjs/reporters/heal-reporter.js.map +1 -0
- package/dist/cjs/server/review-server.js +166 -0
- package/dist/cjs/server/review-server.js.map +1 -0
- package/dist/cjs/server/routes.js +92 -0
- package/dist/cjs/server/routes.js.map +1 -0
- package/dist/cjs/utils/environment.js +57 -0
- package/dist/cjs/utils/environment.js.map +1 -0
- package/dist/cjs/utils/file-lock.js +136 -0
- package/dist/cjs/utils/file-lock.js.map +1 -0
- package/dist/cjs/utils/file-utils.js +49 -0
- package/dist/cjs/utils/file-utils.js.map +1 -0
- package/dist/cjs/utils/logger.js +78 -0
- package/dist/cjs/utils/logger.js.map +1 -0
- package/dist/esm/ai/ai-provider.js +44 -0
- package/dist/esm/ai/ai-provider.js.map +1 -0
- package/dist/esm/ai/anthropic-provider.js +104 -0
- package/dist/esm/ai/anthropic-provider.js.map +1 -0
- package/dist/esm/ai/azure-openai-provider.js +128 -0
- package/dist/esm/ai/azure-openai-provider.js.map +1 -0
- package/dist/esm/ai/bedrock-provider.js +181 -0
- package/dist/esm/ai/bedrock-provider.js.map +1 -0
- package/dist/esm/ai/deepseek-provider.js +116 -0
- package/dist/esm/ai/deepseek-provider.js.map +1 -0
- package/dist/esm/ai/gemini-provider.js +127 -0
- package/dist/esm/ai/gemini-provider.js.map +1 -0
- package/dist/esm/ai/groq-provider.js +116 -0
- package/dist/esm/ai/groq-provider.js.map +1 -0
- package/dist/esm/ai/meta-provider.js +116 -0
- package/dist/esm/ai/meta-provider.js.map +1 -0
- package/dist/esm/ai/ollama-provider.js +125 -0
- package/dist/esm/ai/ollama-provider.js.map +1 -0
- package/dist/esm/ai/openai-provider.js +115 -0
- package/dist/esm/ai/openai-provider.js.map +1 -0
- package/dist/esm/ai/perplexity-provider.js +116 -0
- package/dist/esm/ai/perplexity-provider.js.map +1 -0
- package/dist/esm/ai/prompt-templates.js +171 -0
- package/dist/esm/ai/prompt-templates.js.map +1 -0
- package/dist/esm/ai/qwen-provider.js +116 -0
- package/dist/esm/ai/qwen-provider.js.map +1 -0
- package/dist/esm/analytics/healing-analytics.js +261 -0
- package/dist/esm/analytics/healing-analytics.js.map +1 -0
- package/dist/esm/cli/init.js +495 -0
- package/dist/esm/cli/init.js.map +1 -0
- package/dist/esm/config/config-loader.js +132 -0
- package/dist/esm/config/config-loader.js.map +1 -0
- package/dist/esm/config/defaults.js +107 -0
- package/dist/esm/config/defaults.js.map +1 -0
- package/dist/esm/core/dom-snapshot.js +278 -0
- package/dist/esm/core/dom-snapshot.js.map +1 -0
- package/dist/esm/core/enterprise-strategy.js +695 -0
- package/dist/esm/core/enterprise-strategy.js.map +1 -0
- package/dist/esm/core/healer.js +281 -0
- package/dist/esm/core/healer.js.map +1 -0
- package/dist/esm/core/interceptor.js +940 -0
- package/dist/esm/core/interceptor.js.map +1 -0
- package/dist/esm/core/locator-analyzer.js +169 -0
- package/dist/esm/core/locator-analyzer.js.map +1 -0
- package/dist/esm/core/locator-strategies.js +882 -0
- package/dist/esm/core/locator-strategies.js.map +1 -0
- package/dist/esm/core/self-heal-cache.js +176 -0
- package/dist/esm/core/self-heal-cache.js.map +1 -0
- package/dist/esm/core/smart-retry.js +246 -0
- package/dist/esm/core/smart-retry.js.map +1 -0
- package/dist/esm/core/visual-verification.js +260 -0
- package/dist/esm/core/visual-verification.js.map +1 -0
- package/dist/esm/git/code-modifier.js +182 -0
- package/dist/esm/git/code-modifier.js.map +1 -0
- package/dist/esm/git/git-operations.js +143 -0
- package/dist/esm/git/git-operations.js.map +1 -0
- package/dist/esm/git/pr-creator.js +188 -0
- package/dist/esm/git/pr-creator.js.map +1 -0
- package/dist/esm/index.js +37 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/rag/context-retriever.js +287 -0
- package/dist/esm/rag/context-retriever.js.map +1 -0
- package/dist/esm/rag/embeddings.js +77 -0
- package/dist/esm/rag/embeddings.js.map +1 -0
- package/dist/esm/rag/knowledge-store.js +157 -0
- package/dist/esm/rag/knowledge-store.js.map +1 -0
- package/dist/esm/reporters/heal-report.js +277 -0
- package/dist/esm/reporters/heal-report.js.map +1 -0
- package/dist/esm/reporters/heal-reporter.js +290 -0
- package/dist/esm/reporters/heal-reporter.js.map +1 -0
- package/dist/esm/server/review-server.js +164 -0
- package/dist/esm/server/review-server.js.map +1 -0
- package/dist/esm/server/routes.js +90 -0
- package/dist/esm/server/routes.js.map +1 -0
- package/dist/esm/utils/environment.js +53 -0
- package/dist/esm/utils/environment.js.map +1 -0
- package/dist/esm/utils/file-lock.js +134 -0
- package/dist/esm/utils/file-lock.js.map +1 -0
- package/dist/esm/utils/file-utils.js +43 -0
- package/dist/esm/utils/file-utils.js.map +1 -0
- package/dist/esm/utils/logger.js +75 -0
- package/dist/esm/utils/logger.js.map +1 -0
- package/dist/types/ai/ai-provider.d.ts +4 -0
- package/dist/types/ai/ai-provider.d.ts.map +1 -0
- package/dist/types/ai/anthropic-provider.d.ts +11 -0
- package/dist/types/ai/anthropic-provider.d.ts.map +1 -0
- package/dist/types/ai/azure-openai-provider.d.ts +13 -0
- package/dist/types/ai/azure-openai-provider.d.ts.map +1 -0
- package/dist/types/ai/bedrock-provider.d.ts +14 -0
- package/dist/types/ai/bedrock-provider.d.ts.map +1 -0
- package/dist/types/ai/deepseek-provider.d.ts +12 -0
- package/dist/types/ai/deepseek-provider.d.ts.map +1 -0
- package/dist/types/ai/gemini-provider.d.ts +12 -0
- package/dist/types/ai/gemini-provider.d.ts.map +1 -0
- package/dist/types/ai/groq-provider.d.ts +12 -0
- package/dist/types/ai/groq-provider.d.ts.map +1 -0
- package/dist/types/ai/meta-provider.d.ts +12 -0
- package/dist/types/ai/meta-provider.d.ts.map +1 -0
- package/dist/types/ai/ollama-provider.d.ts +10 -0
- package/dist/types/ai/ollama-provider.d.ts.map +1 -0
- package/dist/types/ai/openai-provider.d.ts +11 -0
- package/dist/types/ai/openai-provider.d.ts.map +1 -0
- package/dist/types/ai/perplexity-provider.d.ts +12 -0
- package/dist/types/ai/perplexity-provider.d.ts.map +1 -0
- package/dist/types/ai/prompt-templates.d.ts +11 -0
- package/dist/types/ai/prompt-templates.d.ts.map +1 -0
- package/dist/types/ai/qwen-provider.d.ts +12 -0
- package/dist/types/ai/qwen-provider.d.ts.map +1 -0
- package/dist/types/analytics/healing-analytics.d.ts +36 -0
- package/dist/types/analytics/healing-analytics.d.ts.map +1 -0
- package/dist/types/cli/init.d.ts +15 -0
- package/dist/types/cli/init.d.ts.map +1 -0
- package/dist/types/config/config-loader.d.ts +4 -0
- package/dist/types/config/config-loader.d.ts.map +1 -0
- package/dist/types/config/defaults.d.ts +3 -0
- package/dist/types/config/defaults.d.ts.map +1 -0
- package/dist/types/core/dom-snapshot.d.ts +12 -0
- package/dist/types/core/dom-snapshot.d.ts.map +1 -0
- package/dist/types/core/enterprise-strategy.d.ts +56 -0
- package/dist/types/core/enterprise-strategy.d.ts.map +1 -0
- package/dist/types/core/healer.d.ts +52 -0
- package/dist/types/core/healer.d.ts.map +1 -0
- package/dist/types/core/interceptor.d.ts +64 -0
- package/dist/types/core/interceptor.d.ts.map +1 -0
- package/dist/types/core/locator-analyzer.d.ts +31 -0
- package/dist/types/core/locator-analyzer.d.ts.map +1 -0
- package/dist/types/core/locator-strategies.d.ts +45 -0
- package/dist/types/core/locator-strategies.d.ts.map +1 -0
- package/dist/types/core/self-heal-cache.d.ts +51 -0
- package/dist/types/core/self-heal-cache.d.ts.map +1 -0
- package/dist/types/core/smart-retry.d.ts +64 -0
- package/dist/types/core/smart-retry.d.ts.map +1 -0
- package/dist/types/core/visual-verification.d.ts +46 -0
- package/dist/types/core/visual-verification.d.ts.map +1 -0
- package/dist/types/git/code-modifier.d.ts +51 -0
- package/dist/types/git/code-modifier.d.ts.map +1 -0
- package/dist/types/git/git-operations.d.ts +40 -0
- package/dist/types/git/git-operations.d.ts.map +1 -0
- package/dist/types/git/pr-creator.d.ts +27 -0
- package/dist/types/git/pr-creator.d.ts.map +1 -0
- package/dist/types/index.d.ts +40 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/rag/context-retriever.d.ts +69 -0
- package/dist/types/rag/context-retriever.d.ts.map +1 -0
- package/dist/types/rag/embeddings.d.ts +32 -0
- package/dist/types/rag/embeddings.d.ts.map +1 -0
- package/dist/types/rag/index.d.ts +12 -0
- package/dist/types/rag/index.d.ts.map +1 -0
- package/dist/types/rag/knowledge-store.d.ts +38 -0
- package/dist/types/rag/knowledge-store.d.ts.map +1 -0
- package/dist/types/reporters/heal-report.d.ts +29 -0
- package/dist/types/reporters/heal-report.d.ts.map +1 -0
- package/dist/types/reporters/heal-reporter.d.ts +49 -0
- package/dist/types/reporters/heal-reporter.d.ts.map +1 -0
- package/dist/types/server/review-server.d.ts +20 -0
- package/dist/types/server/review-server.d.ts.map +1 -0
- package/dist/types/server/routes.d.ts +4 -0
- package/dist/types/server/routes.d.ts.map +1 -0
- package/dist/types/types/index.d.ts +433 -0
- package/dist/types/types/index.d.ts.map +1 -0
- package/dist/types/utils/environment.d.ts +10 -0
- package/dist/types/utils/environment.d.ts.map +1 -0
- package/dist/types/utils/file-lock.d.ts +37 -0
- package/dist/types/utils/file-lock.d.ts.map +1 -0
- package/dist/types/utils/file-utils.d.ts +7 -0
- package/dist/types/utils/file-utils.d.ts.map +1 -0
- package/dist/types/utils/logger.d.ts +9 -0
- package/dist/types/utils/logger.d.ts.map +1 -0
- package/package.json +106 -0
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
const DEFAULT_CONFIG = {
|
|
2
|
+
ai: {
|
|
3
|
+
provider: 'anthropic',
|
|
4
|
+
apiKey: '',
|
|
5
|
+
model: 'claude-sonnet-4-20250514',
|
|
6
|
+
maxTokens: 1024,
|
|
7
|
+
temperature: 0.1,
|
|
8
|
+
},
|
|
9
|
+
healing: {
|
|
10
|
+
enabled: true,
|
|
11
|
+
maxRetries: 3,
|
|
12
|
+
strategies: ['cache', 'attribute', 'text', 'role', 'css', 'xpath', 'table', 'modal', 'enterprise', 'ai'],
|
|
13
|
+
confidenceThreshold: 0.7,
|
|
14
|
+
cacheHeals: true,
|
|
15
|
+
cachePath: '.mindheal/cache.json',
|
|
16
|
+
excludePatterns: [],
|
|
17
|
+
domSnapshotDepth: 3,
|
|
18
|
+
handleDialogs: true,
|
|
19
|
+
},
|
|
20
|
+
git: {
|
|
21
|
+
enabled: true,
|
|
22
|
+
provider: 'github',
|
|
23
|
+
token: '',
|
|
24
|
+
baseBranch: 'main',
|
|
25
|
+
branchPrefix: 'mindheal/auto-fix',
|
|
26
|
+
autoCreatePR: true,
|
|
27
|
+
commitMessagePrefix: 'fix(locators):',
|
|
28
|
+
prLabels: ['auto-heal', 'mindheal'],
|
|
29
|
+
prReviewers: [],
|
|
30
|
+
},
|
|
31
|
+
reviewServer: {
|
|
32
|
+
enabled: 'auto',
|
|
33
|
+
port: 3000,
|
|
34
|
+
openBrowser: true,
|
|
35
|
+
autoCloseAfterReview: true,
|
|
36
|
+
},
|
|
37
|
+
reporting: {
|
|
38
|
+
outputDir: '.mindheal/reports',
|
|
39
|
+
generateHTML: true,
|
|
40
|
+
generateJSON: true,
|
|
41
|
+
},
|
|
42
|
+
enterprise: {
|
|
43
|
+
enabled: true,
|
|
44
|
+
platform: 'auto',
|
|
45
|
+
waitForLoad: true,
|
|
46
|
+
loadTimeout: 15000,
|
|
47
|
+
virtualScrolling: true,
|
|
48
|
+
customStableAttributes: [],
|
|
49
|
+
customDynamicIdPatterns: [],
|
|
50
|
+
},
|
|
51
|
+
analytics: {
|
|
52
|
+
enabled: true,
|
|
53
|
+
storePath: '.mindheal/analytics.json',
|
|
54
|
+
trackLocators: true,
|
|
55
|
+
trackStrategies: true,
|
|
56
|
+
trackTestStability: true,
|
|
57
|
+
maxEntries: 5000,
|
|
58
|
+
retentionDays: 90,
|
|
59
|
+
},
|
|
60
|
+
smartRetry: {
|
|
61
|
+
enabled: true,
|
|
62
|
+
waitForNetworkIdle: true,
|
|
63
|
+
networkIdleTimeout: 5000,
|
|
64
|
+
exponentialBackoff: true,
|
|
65
|
+
backoffBaseDelay: 500,
|
|
66
|
+
backoffMaxDelay: 10000,
|
|
67
|
+
flakyDetection: true,
|
|
68
|
+
flakyThreshold: 3,
|
|
69
|
+
flakyStorePath: '.mindheal/flaky-tests.json',
|
|
70
|
+
},
|
|
71
|
+
parallel: {
|
|
72
|
+
enabled: true,
|
|
73
|
+
lockTimeout: 10000,
|
|
74
|
+
lockRetryInterval: 50,
|
|
75
|
+
staleLockThreshold: 30000,
|
|
76
|
+
},
|
|
77
|
+
visualVerification: {
|
|
78
|
+
enabled: false,
|
|
79
|
+
screenshotDir: '.mindheal/screenshots',
|
|
80
|
+
diffThreshold: 0.1,
|
|
81
|
+
captureElement: true,
|
|
82
|
+
captureFullPage: false,
|
|
83
|
+
keepScreenshots: true,
|
|
84
|
+
},
|
|
85
|
+
rag: {
|
|
86
|
+
enabled: true,
|
|
87
|
+
storePath: '.mindheal/knowledge.json',
|
|
88
|
+
maxContextChunks: 5,
|
|
89
|
+
similarityThreshold: 0.3,
|
|
90
|
+
sources: [
|
|
91
|
+
'healing-history',
|
|
92
|
+
'page-objects',
|
|
93
|
+
'git-changes',
|
|
94
|
+
'dom-snapshots',
|
|
95
|
+
'component-docs',
|
|
96
|
+
'test-specs',
|
|
97
|
+
],
|
|
98
|
+
pageObjectPaths: ['pages', 'src/pages', 'page-objects'],
|
|
99
|
+
componentDocPaths: [],
|
|
100
|
+
},
|
|
101
|
+
logging: {
|
|
102
|
+
level: 'info',
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
export { DEFAULT_CONFIG };
|
|
107
|
+
//# sourceMappingURL=defaults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.js","sources":["../../../../src/config/defaults.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
import { logger } from '../utils/logger.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Approximate token limit for the HTML snapshot.
|
|
5
|
+
* ~4 chars per token is a conservative estimate.
|
|
6
|
+
*/
|
|
7
|
+
const MAX_SNAPSHOT_CHARS = 16000;
|
|
8
|
+
/**
|
|
9
|
+
* Attribute names and text patterns that indicate sensitive data.
|
|
10
|
+
*/
|
|
11
|
+
const SENSITIVE_ATTR_NAMES = new Set([
|
|
12
|
+
'password',
|
|
13
|
+
'passwd',
|
|
14
|
+
'secret',
|
|
15
|
+
'token',
|
|
16
|
+
'apikey',
|
|
17
|
+
'api-key',
|
|
18
|
+
'api_key',
|
|
19
|
+
'authorization',
|
|
20
|
+
'auth',
|
|
21
|
+
'credential',
|
|
22
|
+
'access-token',
|
|
23
|
+
'access_token',
|
|
24
|
+
'refresh-token',
|
|
25
|
+
'refresh_token',
|
|
26
|
+
'session-id',
|
|
27
|
+
'session_id',
|
|
28
|
+
'csrf',
|
|
29
|
+
'ssn',
|
|
30
|
+
]);
|
|
31
|
+
const SENSITIVE_ATTR_PATTERNS = [
|
|
32
|
+
/password/i,
|
|
33
|
+
/token/i,
|
|
34
|
+
/secret/i,
|
|
35
|
+
/apikey/i,
|
|
36
|
+
/api[_-]?key/i,
|
|
37
|
+
/authorization/i,
|
|
38
|
+
/credential/i,
|
|
39
|
+
/session[_-]?id/i,
|
|
40
|
+
];
|
|
41
|
+
const SENSITIVE_VALUE_PATTERNS = [
|
|
42
|
+
// Bearer tokens
|
|
43
|
+
/^Bearer\s+\S+/i,
|
|
44
|
+
// Long hex/base64 strings that look like tokens (32+ chars)
|
|
45
|
+
/^[A-Za-z0-9+/=_-]{32,}$/,
|
|
46
|
+
];
|
|
47
|
+
/**
|
|
48
|
+
* Sanitizes an attribute value by redacting sensitive content.
|
|
49
|
+
*/
|
|
50
|
+
function sanitizeAttributeValue(name, value) {
|
|
51
|
+
const lowerName = name.toLowerCase();
|
|
52
|
+
if (SENSITIVE_ATTR_NAMES.has(lowerName)) {
|
|
53
|
+
return '[REDACTED]';
|
|
54
|
+
}
|
|
55
|
+
for (const pattern of SENSITIVE_ATTR_PATTERNS) {
|
|
56
|
+
if (pattern.test(lowerName)) {
|
|
57
|
+
return '[REDACTED]';
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
for (const pattern of SENSITIVE_VALUE_PATTERNS) {
|
|
61
|
+
if (pattern.test(value)) {
|
|
62
|
+
return '[REDACTED]';
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Redact type=password input values
|
|
66
|
+
if (lowerName === 'value' || lowerName === 'type') {
|
|
67
|
+
// value is left alone unless caught above; type is informational
|
|
68
|
+
return value;
|
|
69
|
+
}
|
|
70
|
+
return value;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Sanitizes text content by removing potential sensitive data patterns.
|
|
74
|
+
*/
|
|
75
|
+
function sanitizeTextContent(text) {
|
|
76
|
+
if (!text.trim())
|
|
77
|
+
return '';
|
|
78
|
+
// Redact long token-like strings embedded in text
|
|
79
|
+
return text.replace(/[A-Za-z0-9+/=_-]{40,}/g, '[REDACTED]');
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Serializes a DOMElement tree into sanitized HTML, respecting depth and size limits.
|
|
83
|
+
*/
|
|
84
|
+
function serializeElement(element, currentDepth, maxDepth) {
|
|
85
|
+
if (currentDepth > maxDepth) {
|
|
86
|
+
return element.children.length > 0 ? '<!-- truncated -->' : '';
|
|
87
|
+
}
|
|
88
|
+
const tag = element.tag.toLowerCase();
|
|
89
|
+
// Build attribute string
|
|
90
|
+
const attrs = [];
|
|
91
|
+
for (const [name, value] of Object.entries(element.attributes)) {
|
|
92
|
+
const sanitized = sanitizeAttributeValue(name, value);
|
|
93
|
+
attrs.push(`${name}="${escapeHtml(sanitized)}"`);
|
|
94
|
+
}
|
|
95
|
+
const attrStr = attrs.length > 0 ? ' ' + attrs.join(' ') : '';
|
|
96
|
+
// Self-closing tags
|
|
97
|
+
const selfClosing = new Set(['input', 'br', 'hr', 'img', 'meta', 'link', 'area', 'base', 'col', 'embed', 'source', 'track', 'wbr']);
|
|
98
|
+
if (selfClosing.has(tag)) {
|
|
99
|
+
return `<${tag}${attrStr} />`;
|
|
100
|
+
}
|
|
101
|
+
// Text content
|
|
102
|
+
const textContent = element.text ? sanitizeTextContent(element.text) : '';
|
|
103
|
+
// Children
|
|
104
|
+
const childHtml = element.children
|
|
105
|
+
.map((child) => serializeElement(child, currentDepth + 1, maxDepth))
|
|
106
|
+
.filter(Boolean)
|
|
107
|
+
.join('\n');
|
|
108
|
+
const inner = [textContent, childHtml].filter(Boolean).join('\n');
|
|
109
|
+
return `<${tag}${attrStr}>${inner}</${tag}>`;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Escapes special HTML characters in attribute values.
|
|
113
|
+
*/
|
|
114
|
+
function escapeHtml(str) {
|
|
115
|
+
return str
|
|
116
|
+
.replace(/&/g, '&')
|
|
117
|
+
.replace(/"/g, '"')
|
|
118
|
+
.replace(/</g, '<')
|
|
119
|
+
.replace(/>/g, '>');
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Truncates HTML to approximately the target character count,
|
|
123
|
+
* cutting at the last complete tag boundary when possible.
|
|
124
|
+
*/
|
|
125
|
+
function truncateHtml(html, maxChars) {
|
|
126
|
+
if (html.length <= maxChars)
|
|
127
|
+
return html;
|
|
128
|
+
// Find the last closing tag boundary before the limit
|
|
129
|
+
const truncated = html.substring(0, maxChars);
|
|
130
|
+
const lastCloseTag = truncated.lastIndexOf('</');
|
|
131
|
+
const lastSelfClose = truncated.lastIndexOf('/>');
|
|
132
|
+
const cutPoint = Math.max(lastCloseTag, lastSelfClose);
|
|
133
|
+
if (cutPoint > maxChars * 0.5) {
|
|
134
|
+
// Find the end of that closing tag
|
|
135
|
+
const endOfTag = html.indexOf('>', cutPoint);
|
|
136
|
+
if (endOfTag !== -1 && endOfTag < maxChars + 100) {
|
|
137
|
+
return html.substring(0, endOfTag + 1) + '\n<!-- snapshot truncated -->';
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return truncated + '\n<!-- snapshot truncated -->';
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Captures a sanitized DOM snapshot from the given Playwright page.
|
|
144
|
+
*
|
|
145
|
+
* @param page - Playwright Page object
|
|
146
|
+
* @param rootSelector - Optional CSS selector to scope the snapshot. Defaults to 'body'.
|
|
147
|
+
* @param maxDepth - Maximum depth of the DOM tree to capture. Defaults to 3.
|
|
148
|
+
* @returns A DOMSnapshot containing sanitized HTML, URL, title, and timestamp.
|
|
149
|
+
*/
|
|
150
|
+
async function captureDOMSnapshot(page, rootSelector, maxDepth = 3) {
|
|
151
|
+
const startTime = Date.now();
|
|
152
|
+
const selector = rootSelector ?? 'body';
|
|
153
|
+
logger.debug(`Capturing DOM snapshot for selector: ${selector}, maxDepth: ${maxDepth}`);
|
|
154
|
+
try {
|
|
155
|
+
const [url, title] = await Promise.all([
|
|
156
|
+
page.url(),
|
|
157
|
+
page.title(),
|
|
158
|
+
]);
|
|
159
|
+
// Extract the DOM tree from the page context
|
|
160
|
+
const domTree = await page.evaluate(({ sel, depth }) => {
|
|
161
|
+
function extractElement(el, currentDepth, maxD) {
|
|
162
|
+
if (currentDepth > maxD)
|
|
163
|
+
return null;
|
|
164
|
+
const tag = el.tagName.toLowerCase();
|
|
165
|
+
// Skip script, style, and noscript elements
|
|
166
|
+
if (['script', 'style', 'noscript', 'svg'].includes(tag))
|
|
167
|
+
return null;
|
|
168
|
+
const attributes = {};
|
|
169
|
+
for (let ai = 0; ai < el.attributes.length; ai++) {
|
|
170
|
+
const attr = el.attributes[ai];
|
|
171
|
+
attributes[attr.name] = attr.value;
|
|
172
|
+
}
|
|
173
|
+
const id = el.id || undefined;
|
|
174
|
+
const classes = el.className && typeof el.className === 'string'
|
|
175
|
+
? el.className.split(/\s+/).filter(Boolean)
|
|
176
|
+
: undefined;
|
|
177
|
+
// Get direct text (not from children)
|
|
178
|
+
let text;
|
|
179
|
+
const directText = Array.from(el.childNodes)
|
|
180
|
+
.filter((n) => n.nodeType === Node.TEXT_NODE)
|
|
181
|
+
.map((n) => n.textContent?.trim() ?? '')
|
|
182
|
+
.filter(Boolean)
|
|
183
|
+
.join(' ');
|
|
184
|
+
if (directText) {
|
|
185
|
+
text = directText.substring(0, 200);
|
|
186
|
+
}
|
|
187
|
+
const role = el.getAttribute('role') || undefined;
|
|
188
|
+
const ariaLabel = el.getAttribute('aria-label') || undefined;
|
|
189
|
+
const testId = el.getAttribute('data-testid') ??
|
|
190
|
+
el.getAttribute('data-test-id') ??
|
|
191
|
+
el.getAttribute('data-test') ??
|
|
192
|
+
undefined;
|
|
193
|
+
const children = [];
|
|
194
|
+
if (currentDepth < maxD) {
|
|
195
|
+
// Traverse regular children
|
|
196
|
+
for (let ci = 0; ci < el.children.length; ci++) {
|
|
197
|
+
const child = el.children[ci];
|
|
198
|
+
const extracted = extractElement(child, currentDepth + 1, maxD);
|
|
199
|
+
if (extracted) {
|
|
200
|
+
children.push(extracted);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
// Traverse Shadow DOM if present
|
|
204
|
+
if (el.shadowRoot) {
|
|
205
|
+
const shadowMarker = {
|
|
206
|
+
tag: '#shadow-root',
|
|
207
|
+
attributes: {},
|
|
208
|
+
children: [],
|
|
209
|
+
};
|
|
210
|
+
for (let si = 0; si < el.shadowRoot.children.length; si++) {
|
|
211
|
+
const shadowChild = el.shadowRoot.children[si];
|
|
212
|
+
const extracted = extractElement(shadowChild, currentDepth + 1, maxD);
|
|
213
|
+
if (extracted) {
|
|
214
|
+
shadowMarker.children.push(extracted);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
if (shadowMarker.children.length > 0) {
|
|
218
|
+
children.push(shadowMarker);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
return { tag, id, classes, attributes, text, children, role, ariaLabel, testId };
|
|
223
|
+
}
|
|
224
|
+
const root = document.querySelector(sel);
|
|
225
|
+
if (!root)
|
|
226
|
+
return null;
|
|
227
|
+
return extractElement(root, 0, depth);
|
|
228
|
+
}, { sel: selector, depth: maxDepth });
|
|
229
|
+
if (!domTree) {
|
|
230
|
+
logger.warn(`Root element not found for selector: ${selector}`);
|
|
231
|
+
return {
|
|
232
|
+
html: `<!-- element not found: ${escapeHtml(selector)} -->`,
|
|
233
|
+
url,
|
|
234
|
+
title,
|
|
235
|
+
timestamp: Date.now(),
|
|
236
|
+
rootSelector: selector !== 'body' ? selector : undefined,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
// Cast to DOMElement for serialization
|
|
240
|
+
const element = domTree;
|
|
241
|
+
const rawHtml = serializeElement(element, 0, maxDepth);
|
|
242
|
+
const html = truncateHtml(rawHtml, MAX_SNAPSHOT_CHARS);
|
|
243
|
+
const duration = Date.now() - startTime;
|
|
244
|
+
logger.debug(`DOM snapshot captured in ${duration}ms, size: ${html.length} chars`);
|
|
245
|
+
return {
|
|
246
|
+
html,
|
|
247
|
+
url,
|
|
248
|
+
title,
|
|
249
|
+
timestamp: Date.now(),
|
|
250
|
+
rootSelector: selector !== 'body' ? selector : undefined,
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
catch (error) {
|
|
254
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
255
|
+
logger.error(`Failed to capture DOM snapshot: ${message}`);
|
|
256
|
+
// Return a minimal snapshot on failure so healing can still proceed
|
|
257
|
+
let fallbackUrl = 'unknown';
|
|
258
|
+
let fallbackTitle = 'unknown';
|
|
259
|
+
try {
|
|
260
|
+
fallbackUrl = page.url();
|
|
261
|
+
}
|
|
262
|
+
catch { /* ignore */ }
|
|
263
|
+
try {
|
|
264
|
+
fallbackTitle = await page.title();
|
|
265
|
+
}
|
|
266
|
+
catch { /* ignore */ }
|
|
267
|
+
return {
|
|
268
|
+
html: `<!-- snapshot capture failed: ${escapeHtml(message)} -->`,
|
|
269
|
+
url: fallbackUrl,
|
|
270
|
+
title: fallbackTitle,
|
|
271
|
+
timestamp: Date.now(),
|
|
272
|
+
rootSelector: selector !== 'body' ? selector : undefined,
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
export { captureDOMSnapshot };
|
|
278
|
+
//# sourceMappingURL=dom-snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom-snapshot.js","sources":["../../../../src/core/dom-snapshot.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|