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,134 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, writeFileSync, readFileSync, unlinkSync } from 'fs';
|
|
2
|
+
import { dirname } from 'path';
|
|
3
|
+
import { logger } from './logger.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Parallel Execution Safety — File Locking
|
|
7
|
+
*
|
|
8
|
+
* Provides advisory file locking for shared resources (cache, knowledge store,
|
|
9
|
+
* analytics) when Playwright tests run with multiple workers or shards.
|
|
10
|
+
*
|
|
11
|
+
* Uses .lock files with PID + timestamp to detect stale locks.
|
|
12
|
+
* Cross-platform (Windows + macOS + Linux).
|
|
13
|
+
*/
|
|
14
|
+
class FileLock {
|
|
15
|
+
constructor(config) {
|
|
16
|
+
this.config = config;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Acquires an advisory lock on the given file path.
|
|
20
|
+
* Returns a release function that MUST be called when done.
|
|
21
|
+
*
|
|
22
|
+
* @param filePath - The file to lock (a .lock file is created alongside it)
|
|
23
|
+
* @returns A function to release the lock
|
|
24
|
+
* @throws If the lock cannot be acquired within the timeout
|
|
25
|
+
*/
|
|
26
|
+
async acquire(filePath) {
|
|
27
|
+
if (!this.config.enabled) {
|
|
28
|
+
return () => { }; // No-op release
|
|
29
|
+
}
|
|
30
|
+
const lockPath = `${filePath}.lock`;
|
|
31
|
+
const startTime = Date.now();
|
|
32
|
+
const workerId = `${process.pid}-${Math.random().toString(36).substring(2, 8)}`;
|
|
33
|
+
while (Date.now() - startTime < this.config.lockTimeout) {
|
|
34
|
+
// Check for existing lock
|
|
35
|
+
if (existsSync(lockPath)) {
|
|
36
|
+
const isStale = this.isLockStale(lockPath);
|
|
37
|
+
if (isStale) {
|
|
38
|
+
logger.debug(`[FileLock] Removing stale lock: ${lockPath}`);
|
|
39
|
+
this.removeLock(lockPath);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
// Wait and retry
|
|
43
|
+
await new Promise((resolve) => setTimeout(resolve, this.config.lockRetryInterval));
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// Try to create the lock
|
|
48
|
+
try {
|
|
49
|
+
const dir = dirname(lockPath);
|
|
50
|
+
if (!existsSync(dir)) {
|
|
51
|
+
mkdirSync(dir, { recursive: true });
|
|
52
|
+
}
|
|
53
|
+
const lockInfo = {
|
|
54
|
+
pid: process.pid,
|
|
55
|
+
timestamp: Date.now(),
|
|
56
|
+
workerId,
|
|
57
|
+
};
|
|
58
|
+
// Write lock file atomically-ish (best effort)
|
|
59
|
+
writeFileSync(lockPath, JSON.stringify(lockInfo), { flag: 'wx' });
|
|
60
|
+
logger.debug(`[FileLock] Acquired lock: ${lockPath} (worker: ${workerId})`);
|
|
61
|
+
// Return release function
|
|
62
|
+
return () => {
|
|
63
|
+
this.removeLock(lockPath);
|
|
64
|
+
logger.debug(`[FileLock] Released lock: ${lockPath}`);
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
// File already exists (another process beat us) — retry
|
|
69
|
+
if (err.code === 'EEXIST') {
|
|
70
|
+
await new Promise((resolve) => setTimeout(resolve, this.config.lockRetryInterval));
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
throw err;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
throw new Error(`[MindHeal] Could not acquire file lock for ${filePath} within ${this.config.lockTimeout}ms`);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Executes a function while holding a file lock.
|
|
80
|
+
* Automatically acquires and releases the lock.
|
|
81
|
+
*/
|
|
82
|
+
async withLock(filePath, fn) {
|
|
83
|
+
if (!this.config.enabled) {
|
|
84
|
+
return fn();
|
|
85
|
+
}
|
|
86
|
+
const release = await this.acquire(filePath);
|
|
87
|
+
try {
|
|
88
|
+
return await fn();
|
|
89
|
+
}
|
|
90
|
+
finally {
|
|
91
|
+
release();
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Checks if a lock file is stale (process dead or too old).
|
|
96
|
+
*/
|
|
97
|
+
isLockStale(lockPath) {
|
|
98
|
+
try {
|
|
99
|
+
const content = readFileSync(lockPath, 'utf-8');
|
|
100
|
+
const info = JSON.parse(content);
|
|
101
|
+
// Check timestamp
|
|
102
|
+
if (Date.now() - info.timestamp > this.config.staleLockThreshold) {
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
// Check if PID is still alive
|
|
106
|
+
try {
|
|
107
|
+
process.kill(info.pid, 0); // Signal 0 = check if process exists
|
|
108
|
+
return false; // Process is alive
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
return true; // Process is dead
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
return true; // Can't read lock — treat as stale
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Safely removes a lock file.
|
|
120
|
+
*/
|
|
121
|
+
removeLock(lockPath) {
|
|
122
|
+
try {
|
|
123
|
+
if (existsSync(lockPath)) {
|
|
124
|
+
unlinkSync(lockPath);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
// Ignore — another process may have removed it
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export { FileLock };
|
|
134
|
+
//# sourceMappingURL=file-lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-lock.js","sources":["../../../../src/utils/file-lock.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, writeFileSync, readFileSync } from 'fs';
|
|
2
|
+
import { dirname } from 'path';
|
|
3
|
+
import { logger } from './logger.js';
|
|
4
|
+
|
|
5
|
+
function writeFileContent(filePath, content) {
|
|
6
|
+
try {
|
|
7
|
+
const dir = dirname(filePath);
|
|
8
|
+
if (!existsSync(dir)) {
|
|
9
|
+
mkdirSync(dir, { recursive: true });
|
|
10
|
+
}
|
|
11
|
+
writeFileSync(filePath, content, 'utf-8');
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
logger.error(`Failed to write file: ${filePath}`, error);
|
|
15
|
+
throw new Error(`[MindHeal] Cannot write file: ${filePath}`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function fileExists(filePath) {
|
|
19
|
+
return existsSync(filePath);
|
|
20
|
+
}
|
|
21
|
+
function ensureDirectory(dirPath) {
|
|
22
|
+
if (!existsSync(dirPath)) {
|
|
23
|
+
mkdirSync(dirPath, { recursive: true });
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function readJsonFile(filePath) {
|
|
27
|
+
try {
|
|
28
|
+
if (!existsSync(filePath))
|
|
29
|
+
return null;
|
|
30
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
31
|
+
return JSON.parse(content);
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
logger.warn(`Failed to parse JSON file: ${filePath}`, error);
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function writeJsonFile(filePath, data) {
|
|
39
|
+
writeFileContent(filePath, JSON.stringify(data, null, 2));
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export { ensureDirectory, fileExists, readJsonFile, writeFileContent, writeJsonFile };
|
|
43
|
+
//# sourceMappingURL=file-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-utils.js","sources":["../../../../src/utils/file-utils.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAaM,SAAU,gBAAgB,CAAC,QAAgB,EAAE,OAAe,EAAA;AAChE,IAAA,IAAI;AACF,QAAA,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC;AAC7B,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;YACpB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QACrC;AACA,QAAA,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC;IAC3C;IAAE,OAAO,KAAK,EAAE;QACd,MAAM,CAAC,KAAK,CAAC,CAAA,sBAAA,EAAyB,QAAQ,CAAA,CAAE,EAAE,KAAK,CAAC;AACxD,QAAA,MAAM,IAAI,KAAK,CAAC,iCAAiC,QAAQ,CAAA,CAAE,CAAC;IAC9D;AACF;AAEM,SAAU,UAAU,CAAC,QAAgB,EAAA;AACzC,IAAA,OAAO,UAAU,CAAC,QAAQ,CAAC;AAC7B;AAEM,SAAU,eAAe,CAAC,OAAe,EAAA;AAC7C,IAAA,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;QACxB,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACzC;AACF;AAEM,SAAU,YAAY,CAAI,QAAgB,EAAA;AAC9C,IAAA,IAAI;AACF,QAAA,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;AAAE,YAAA,OAAO,IAAI;QACtC,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC;AAC/C,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAM;IACjC;IAAE,OAAO,KAAK,EAAE;QACd,MAAM,CAAC,IAAI,CAAC,CAAA,2BAAA,EAA8B,QAAQ,CAAA,CAAE,EAAE,KAAK,CAAC;AAC5D,QAAA,OAAO,IAAI;IACb;AACF;AAEM,SAAU,aAAa,CAAC,QAAgB,EAAE,IAAa,EAAA;AAC3D,IAAA,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC3D;;;;"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, appendFileSync } from 'fs';
|
|
2
|
+
import { dirname } from 'path';
|
|
3
|
+
|
|
4
|
+
const LOG_LEVELS = { debug: 0, info: 1, warn: 2, error: 3 };
|
|
5
|
+
const PREFIX = '[MindHeal]';
|
|
6
|
+
let currentLevel = 'info';
|
|
7
|
+
let logFilePath;
|
|
8
|
+
function configureLogger(config) {
|
|
9
|
+
currentLevel = config.level;
|
|
10
|
+
logFilePath = config.file;
|
|
11
|
+
if (logFilePath) {
|
|
12
|
+
const dir = dirname(logFilePath);
|
|
13
|
+
if (!existsSync(dir)) {
|
|
14
|
+
mkdirSync(dir, { recursive: true });
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function shouldLog(level) {
|
|
19
|
+
return LOG_LEVELS[level] >= LOG_LEVELS[currentLevel];
|
|
20
|
+
}
|
|
21
|
+
function formatMessage(level, message, data) {
|
|
22
|
+
const timestamp = new Date().toISOString();
|
|
23
|
+
const base = `${timestamp} ${PREFIX} [${level.toUpperCase()}] ${message}`;
|
|
24
|
+
if (data !== undefined) {
|
|
25
|
+
return `${base} ${JSON.stringify(data, null, 2)}`;
|
|
26
|
+
}
|
|
27
|
+
return base;
|
|
28
|
+
}
|
|
29
|
+
function writeToFile(formatted) {
|
|
30
|
+
if (logFilePath) {
|
|
31
|
+
try {
|
|
32
|
+
appendFileSync(logFilePath, formatted + '\n', 'utf-8');
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
// Silently fail file logging
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const logger = {
|
|
40
|
+
debug(message, data) {
|
|
41
|
+
if (!shouldLog('debug'))
|
|
42
|
+
return;
|
|
43
|
+
const formatted = formatMessage('debug', message, data);
|
|
44
|
+
writeToFile(formatted);
|
|
45
|
+
// eslint-disable-next-line no-console
|
|
46
|
+
console.debug(formatted);
|
|
47
|
+
},
|
|
48
|
+
info(message, data) {
|
|
49
|
+
if (!shouldLog('info'))
|
|
50
|
+
return;
|
|
51
|
+
const formatted = formatMessage('info', message, data);
|
|
52
|
+
writeToFile(formatted);
|
|
53
|
+
// eslint-disable-next-line no-console
|
|
54
|
+
console.info(formatted);
|
|
55
|
+
},
|
|
56
|
+
warn(message, data) {
|
|
57
|
+
if (!shouldLog('warn'))
|
|
58
|
+
return;
|
|
59
|
+
const formatted = formatMessage('warn', message, data);
|
|
60
|
+
writeToFile(formatted);
|
|
61
|
+
// eslint-disable-next-line no-console
|
|
62
|
+
console.warn(formatted);
|
|
63
|
+
},
|
|
64
|
+
error(message, data) {
|
|
65
|
+
if (!shouldLog('error'))
|
|
66
|
+
return;
|
|
67
|
+
const formatted = formatMessage('error', message, data);
|
|
68
|
+
writeToFile(formatted);
|
|
69
|
+
// eslint-disable-next-line no-console
|
|
70
|
+
console.error(formatted);
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
export { configureLogger, logger };
|
|
75
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sources":["../../../../src/utils/logger.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-provider.d.ts","sourceRoot":"","sources":["../../../src/ai/ai-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAa3D,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,QAAQ,GAAG,UAAU,CA8B7D;AAED,YAAY,EAAE,UAAU,EAAE,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { AIConfig, AIProvider, AIHealingRequest, AIHealingResponse } from '../types/index';
|
|
2
|
+
export declare class AnthropicProvider implements AIProvider {
|
|
3
|
+
readonly name = "anthropic";
|
|
4
|
+
private readonly apiKey;
|
|
5
|
+
private readonly model;
|
|
6
|
+
private readonly maxTokens;
|
|
7
|
+
private readonly temperature;
|
|
8
|
+
constructor(config: AIConfig);
|
|
9
|
+
suggestLocator(request: AIHealingRequest): Promise<AIHealingResponse>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=anthropic-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic-provider.d.ts","sourceRoot":"","sources":["../../../src/ai/anthropic-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAqChG,qBAAa,iBAAkB,YAAW,UAAU;IAClD,SAAgB,IAAI,eAAe;IAEnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,MAAM,EAAE,QAAQ;IAUtB,cAAc,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CA+F5E"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { AIConfig, AIProvider, AIHealingRequest, AIHealingResponse } from '../types/index';
|
|
2
|
+
export declare class AzureOpenAIProvider implements AIProvider {
|
|
3
|
+
readonly name = "azure-openai";
|
|
4
|
+
private readonly apiKey;
|
|
5
|
+
private readonly baseUrl;
|
|
6
|
+
private readonly deploymentName;
|
|
7
|
+
private readonly apiVersion;
|
|
8
|
+
private readonly maxTokens;
|
|
9
|
+
private readonly temperature;
|
|
10
|
+
constructor(config: AIConfig);
|
|
11
|
+
suggestLocator(request: AIHealingRequest): Promise<AIHealingResponse>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=azure-openai-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"azure-openai-provider.d.ts","sourceRoot":"","sources":["../../../src/ai/azure-openai-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAgChG,qBAAa,mBAAoB,YAAW,UAAU;IACpD,SAAgB,IAAI,kBAAkB;IAEtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,MAAM,EAAE,QAAQ;IA2BtB,cAAc,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CA+G5E"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { AIConfig, AIProvider, AIHealingRequest, AIHealingResponse } from '../types/index';
|
|
2
|
+
export declare class BedrockProvider implements AIProvider {
|
|
3
|
+
readonly name = "aws-bedrock";
|
|
4
|
+
private readonly region;
|
|
5
|
+
private readonly accessKeyId;
|
|
6
|
+
private readonly secretAccessKey;
|
|
7
|
+
private readonly sessionToken;
|
|
8
|
+
private readonly model;
|
|
9
|
+
private readonly maxTokens;
|
|
10
|
+
private readonly temperature;
|
|
11
|
+
constructor(config: AIConfig);
|
|
12
|
+
suggestLocator(request: AIHealingRequest): Promise<AIHealingResponse>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=bedrock-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bedrock-provider.d.ts","sourceRoot":"","sources":["../../../src/ai/bedrock-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAyHhG,qBAAa,eAAgB,YAAW,UAAU;IAChD,SAAgB,IAAI,iBAAiB;IAErC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAClD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,MAAM,EAAE,QAAQ;IAgBtB,cAAc,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CA2G5E"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { AIConfig, AIProvider, AIHealingRequest, AIHealingResponse } from '../types/index';
|
|
2
|
+
export declare class DeepSeekProvider implements AIProvider {
|
|
3
|
+
readonly name = "deepseek";
|
|
4
|
+
private readonly apiKey;
|
|
5
|
+
private readonly model;
|
|
6
|
+
private readonly maxTokens;
|
|
7
|
+
private readonly temperature;
|
|
8
|
+
private readonly apiUrl;
|
|
9
|
+
constructor(config: AIConfig);
|
|
10
|
+
suggestLocator(request: AIHealingRequest): Promise<AIHealingResponse>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=deepseek-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deepseek-provider.d.ts","sourceRoot":"","sources":["../../../src/ai/deepseek-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAiChG,qBAAa,gBAAiB,YAAW,UAAU;IACjD,SAAgB,IAAI,cAAc;IAElC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,MAAM,EAAE,QAAQ;IAWtB,cAAc,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CA4G5E"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { AIConfig, AIProvider, AIHealingRequest, AIHealingResponse } from '../types/index';
|
|
2
|
+
export declare class GeminiProvider implements AIProvider {
|
|
3
|
+
readonly name = "gemini";
|
|
4
|
+
private readonly apiKey;
|
|
5
|
+
private readonly model;
|
|
6
|
+
private readonly maxTokens;
|
|
7
|
+
private readonly temperature;
|
|
8
|
+
private readonly baseUrl;
|
|
9
|
+
constructor(config: AIConfig);
|
|
10
|
+
suggestLocator(request: AIHealingRequest): Promise<AIHealingResponse>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=gemini-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini-provider.d.ts","sourceRoot":"","sources":["../../../src/ai/gemini-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAwChG,qBAAa,cAAe,YAAW,UAAU;IAC/C,SAAgB,IAAI,YAAY;IAEhC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,MAAM,EAAE,QAAQ;IAgBtB,cAAc,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAmH5E"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { AIConfig, AIProvider, AIHealingRequest, AIHealingResponse } from '../types/index';
|
|
2
|
+
export declare class GroqProvider implements AIProvider {
|
|
3
|
+
readonly name = "groq";
|
|
4
|
+
private readonly apiKey;
|
|
5
|
+
private readonly model;
|
|
6
|
+
private readonly maxTokens;
|
|
7
|
+
private readonly temperature;
|
|
8
|
+
private readonly apiUrl;
|
|
9
|
+
constructor(config: AIConfig);
|
|
10
|
+
suggestLocator(request: AIHealingRequest): Promise<AIHealingResponse>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=groq-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"groq-provider.d.ts","sourceRoot":"","sources":["../../../src/ai/groq-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAiChG,qBAAa,YAAa,YAAW,UAAU;IAC7C,SAAgB,IAAI,UAAU;IAE9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,MAAM,EAAE,QAAQ;IAWtB,cAAc,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CA4G5E"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { AIConfig, AIProvider, AIHealingRequest, AIHealingResponse } from '../types/index';
|
|
2
|
+
export declare class MetaProvider implements AIProvider {
|
|
3
|
+
readonly name = "meta";
|
|
4
|
+
private readonly apiKey;
|
|
5
|
+
private readonly model;
|
|
6
|
+
private readonly maxTokens;
|
|
7
|
+
private readonly temperature;
|
|
8
|
+
private readonly apiUrl;
|
|
9
|
+
constructor(config: AIConfig);
|
|
10
|
+
suggestLocator(request: AIHealingRequest): Promise<AIHealingResponse>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=meta-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meta-provider.d.ts","sourceRoot":"","sources":["../../../src/ai/meta-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAiChG,qBAAa,YAAa,YAAW,UAAU;IAC7C,SAAgB,IAAI,UAAU;IAE9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,MAAM,EAAE,QAAQ;IAWtB,cAAc,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CA4G5E"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { AIConfig, AIProvider, AIHealingRequest, AIHealingResponse } from '../types/index';
|
|
2
|
+
export declare class OllamaProvider implements AIProvider {
|
|
3
|
+
readonly name = "ollama";
|
|
4
|
+
private readonly host;
|
|
5
|
+
private readonly model;
|
|
6
|
+
private readonly temperature;
|
|
7
|
+
constructor(config: AIConfig);
|
|
8
|
+
suggestLocator(request: AIHealingRequest): Promise<AIHealingResponse>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=ollama-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama-provider.d.ts","sourceRoot":"","sources":["../../../src/ai/ollama-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AA2BhG,qBAAa,cAAe,YAAW,UAAU;IAC/C,SAAgB,IAAI,YAAY;IAEhC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,MAAM,EAAE,QAAQ;IAgBtB,cAAc,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAqH5E"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { AIConfig, AIProvider, AIHealingRequest, AIHealingResponse } from '../types/index';
|
|
2
|
+
export declare class OpenAIProvider implements AIProvider {
|
|
3
|
+
readonly name = "openai";
|
|
4
|
+
private readonly apiKey;
|
|
5
|
+
private readonly model;
|
|
6
|
+
private readonly maxTokens;
|
|
7
|
+
private readonly temperature;
|
|
8
|
+
constructor(config: AIConfig);
|
|
9
|
+
suggestLocator(request: AIHealingRequest): Promise<AIHealingResponse>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=openai-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-provider.d.ts","sourceRoot":"","sources":["../../../src/ai/openai-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAiChG,qBAAa,cAAe,YAAW,UAAU;IAC/C,SAAgB,IAAI,YAAY;IAEhC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,MAAM,EAAE,QAAQ;IAUtB,cAAc,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CA4G5E"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { AIConfig, AIProvider, AIHealingRequest, AIHealingResponse } from '../types/index';
|
|
2
|
+
export declare class PerplexityProvider implements AIProvider {
|
|
3
|
+
readonly name = "perplexity";
|
|
4
|
+
private readonly apiKey;
|
|
5
|
+
private readonly model;
|
|
6
|
+
private readonly maxTokens;
|
|
7
|
+
private readonly temperature;
|
|
8
|
+
private readonly apiUrl;
|
|
9
|
+
constructor(config: AIConfig);
|
|
10
|
+
suggestLocator(request: AIHealingRequest): Promise<AIHealingResponse>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=perplexity-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"perplexity-provider.d.ts","sourceRoot":"","sources":["../../../src/ai/perplexity-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAiChG,qBAAa,kBAAmB,YAAW,UAAU;IACnD,SAAgB,IAAI,gBAAgB;IAEpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,MAAM,EAAE,QAAQ;IAWtB,cAAc,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CA4G5E"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { AIHealingRequest, AIHealingResponse } from '../types/index';
|
|
2
|
+
/**
|
|
3
|
+
* Builds a complete prompt for the AI provider to suggest a healed locator.
|
|
4
|
+
*/
|
|
5
|
+
export declare function buildHealingPrompt(request: AIHealingRequest): string;
|
|
6
|
+
/**
|
|
7
|
+
* Parses the AI provider's raw text response into a structured AIHealingResponse.
|
|
8
|
+
* Handles malformed responses gracefully by attempting multiple extraction strategies.
|
|
9
|
+
*/
|
|
10
|
+
export declare function parseHealingResponse(response: string): AIHealingResponse;
|
|
11
|
+
//# sourceMappingURL=prompt-templates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-templates.d.ts","sourceRoot":"","sources":["../../../src/ai/prompt-templates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAgC,MAAM,gBAAgB,CAAC;AAMxG;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CA2EpE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,CAgCxE"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { AIConfig, AIProvider, AIHealingRequest, AIHealingResponse } from '../types/index';
|
|
2
|
+
export declare class QwenProvider implements AIProvider {
|
|
3
|
+
readonly name = "qwen";
|
|
4
|
+
private readonly apiKey;
|
|
5
|
+
private readonly model;
|
|
6
|
+
private readonly maxTokens;
|
|
7
|
+
private readonly temperature;
|
|
8
|
+
private readonly apiUrl;
|
|
9
|
+
constructor(config: AIConfig);
|
|
10
|
+
suggestLocator(request: AIHealingRequest): Promise<AIHealingResponse>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=qwen-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qwen-provider.d.ts","sourceRoot":"","sources":["../../../src/ai/qwen-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAiChG,qBAAa,YAAa,YAAW,UAAU;IAC7C,SAAgB,IAAI,UAAU;IAE9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,MAAM,EAAE,QAAQ;IAWtB,cAAc,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CA4G5E"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Healing Analytics & Metrics
|
|
3
|
+
*
|
|
4
|
+
* Tracks healing success rates, strategy effectiveness, per-locator healing
|
|
5
|
+
* frequency, confidence trends, and test stability scores over time.
|
|
6
|
+
* File-backed with auto-pruning and exportable JSON.
|
|
7
|
+
*/
|
|
8
|
+
import type { AnalyticsConfig, AnalyticsSnapshot, StrategyStats, LocatorStats, TestStabilityRecord, HealingEvent } from '../types/index';
|
|
9
|
+
export declare class HealingAnalytics {
|
|
10
|
+
private readonly config;
|
|
11
|
+
private snapshot;
|
|
12
|
+
private dirty;
|
|
13
|
+
constructor(config: AnalyticsConfig);
|
|
14
|
+
load(): void;
|
|
15
|
+
save(): void;
|
|
16
|
+
recordEvent(event: HealingEvent): void;
|
|
17
|
+
private updateStrategyStats;
|
|
18
|
+
private updateLocatorStats;
|
|
19
|
+
private updateTestStability;
|
|
20
|
+
getStrategyStats(): StrategyStats[];
|
|
21
|
+
getMostHealedLocators(limit?: number): LocatorStats[];
|
|
22
|
+
getUnstableTests(limit?: number): TestStabilityRecord[];
|
|
23
|
+
getDegradingTests(): TestStabilityRecord[];
|
|
24
|
+
getOverallStats(): {
|
|
25
|
+
totalHeals: number;
|
|
26
|
+
successRate: number;
|
|
27
|
+
avgConfidence: number;
|
|
28
|
+
avgDuration: number;
|
|
29
|
+
uniqueLocators: number;
|
|
30
|
+
uniqueTests: number;
|
|
31
|
+
};
|
|
32
|
+
getSnapshot(): AnalyticsSnapshot;
|
|
33
|
+
private prune;
|
|
34
|
+
private emptySnapshot;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=healing-analytics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"healing-analytics.d.ts","sourceRoot":"","sources":["../../../src/analytics/healing-analytics.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,eAAe,EAEf,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,mBAAmB,EACnB,YAAY,EAEb,MAAM,gBAAgB,CAAC;AAMxB,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,KAAK,CAAS;gBAEV,MAAM,EAAE,eAAe;IAOnC,IAAI,IAAI,IAAI;IAwBZ,IAAI,IAAI,IAAI;IAiBZ,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;IAsCtC,OAAO,CAAC,mBAAmB;IAkC3B,OAAO,CAAC,kBAAkB;IAgC1B,OAAO,CAAC,mBAAmB;IAwD3B,gBAAgB,IAAI,aAAa,EAAE;IAKnC,qBAAqB,CAAC,KAAK,SAAK,GAAG,YAAY,EAAE;IAMjD,gBAAgB,CAAC,KAAK,SAAK,GAAG,mBAAmB,EAAE;IAMnD,iBAAiB,IAAI,mBAAmB,EAAE;IAK1C,eAAe,IAAI;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;QACpB,cAAc,EAAE,MAAM,CAAC;QACvB,WAAW,EAAE,MAAM,CAAC;KACrB;IAmBD,WAAW,IAAI,iBAAiB;IAMhC,OAAO,CAAC,KAAK;IAab,OAAO,CAAC,aAAa;CAUtB"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* MindHeal CLI — `npx mindheal init`
|
|
4
|
+
*
|
|
5
|
+
* Interactive setup for MindHeal in an existing Playwright project:
|
|
6
|
+
* 1. Prompts user to select an AI provider (arrow keys + enter)
|
|
7
|
+
* 2. Creates tests/base.ts (re-exports test & expect from mindheal)
|
|
8
|
+
* 3. Updates all .spec.ts / .test.ts imports from '@playwright/test' to './base'
|
|
9
|
+
* 4. Creates .env.example with the selected provider's keys
|
|
10
|
+
* 5. Updates playwright.config.ts with mindHealConfig() + git config
|
|
11
|
+
*
|
|
12
|
+
* Safe to run multiple times — skips files already configured.
|
|
13
|
+
*/
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/init.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;GAWG"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { MindHealConfig } from '../types/index';
|
|
2
|
+
export declare function loadConfig(userConfig?: Partial<MindHealConfig>): MindHealConfig;
|
|
3
|
+
export declare function createConfig(userConfig: Partial<MindHealConfig>): MindHealConfig;
|
|
4
|
+
//# sourceMappingURL=config-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../../src/config/config-loader.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAsIrD,wBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,cAAc,CAqC/E;AAED,wBAAgB,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,cAAc,CAEhF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../../src/config/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,eAAO,MAAM,cAAc,EAAE,cAuG5B,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Page } from '@playwright/test';
|
|
2
|
+
import type { DOMSnapshot } from '../types/index';
|
|
3
|
+
/**
|
|
4
|
+
* Captures a sanitized DOM snapshot from the given Playwright page.
|
|
5
|
+
*
|
|
6
|
+
* @param page - Playwright Page object
|
|
7
|
+
* @param rootSelector - Optional CSS selector to scope the snapshot. Defaults to 'body'.
|
|
8
|
+
* @param maxDepth - Maximum depth of the DOM tree to capture. Defaults to 3.
|
|
9
|
+
* @returns A DOMSnapshot containing sanitized HTML, URL, title, and timestamp.
|
|
10
|
+
*/
|
|
11
|
+
export declare function captureDOMSnapshot(page: Page, rootSelector?: string, maxDepth?: number): Promise<DOMSnapshot>;
|
|
12
|
+
//# sourceMappingURL=dom-snapshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom-snapshot.d.ts","sourceRoot":"","sources":["../../../src/core/dom-snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,gBAAgB,CAAC;AAsK9D;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,IAAI,EACV,YAAY,CAAC,EAAE,MAAM,EACrB,QAAQ,GAAE,MAAU,GACnB,OAAO,CAAC,WAAW,CAAC,CAqJtB"}
|