claude-flow 2.7.34 โ 2.7.36
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +82 -0
- package/bin/claude-flow +1 -1
- package/dist/src/__tests__/benchmarks/performance.bench.js +0 -19
- package/dist/src/__tests__/benchmarks/performance.bench.js.map +1 -1
- package/dist/src/__tests__/hook-matchers.test.js.map +1 -1
- package/dist/src/agents/agent-registry.js.map +1 -1
- package/dist/src/api/auth-service.js.map +1 -1
- package/dist/src/api/claude-client-enhanced.js +4 -2
- package/dist/src/api/claude-client-enhanced.js.map +1 -1
- package/dist/src/api/claude-client.js +4 -2
- package/dist/src/api/claude-client.js.map +1 -1
- package/dist/src/api/database-service.js.map +1 -1
- package/dist/src/api/swarm-api.js +1 -1
- package/dist/src/api/swarm-api.js.map +1 -1
- package/dist/src/cli/commands/hive-mind/wizard.js +1 -1
- package/dist/src/cli/commands/hive-mind/wizard.js.map +1 -1
- package/dist/src/cli/help-formatter.js +0 -5
- package/dist/src/cli/init/index.js +55 -33
- package/dist/src/cli/init/index.js.map +1 -1
- package/dist/src/cli/simple-commands/init/skills-copier.js +1 -1
- package/dist/src/cli/simple-commands/init/skills-copier.js.map +1 -1
- package/dist/src/cli/simple-orchestrator.js +1 -1
- package/dist/src/cli/simple-orchestrator.js.map +1 -1
- package/dist/src/coordination/conflict-resolution.js +1 -1
- package/dist/src/coordination/conflict-resolution.js.map +1 -1
- package/dist/src/coordination/load-balancer.js +1 -1
- package/dist/src/coordination/load-balancer.js.map +1 -1
- package/dist/src/core/DatabaseManager.js +39 -9
- package/dist/src/core/DatabaseManager.js.map +1 -1
- package/dist/src/core/config.js +1 -1
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/enterprise/audit-manager.js +1 -1
- package/dist/src/enterprise/audit-manager.js.map +1 -1
- package/dist/src/providers/openai-provider.js +2 -2
- package/dist/src/providers/openai-provider.js.map +1 -1
- package/dist/src/sdk/checkpoint-manager.js +1 -1
- package/dist/src/sdk/checkpoint-manager.js.map +1 -1
- package/dist/src/services/agentic-flow-hooks/workflow-hooks.js +1 -1
- package/dist/src/services/agentic-flow-hooks/workflow-hooks.js.map +1 -1
- package/dist/src/swarm/coordinator.js +1 -1
- package/dist/src/swarm/coordinator.js.map +1 -1
- package/dist/src/utils/error-recovery.js +215 -0
- package/dist/src/utils/error-recovery.js.map +1 -0
- package/dist/src/utils/key-redactor.js.map +1 -1
- package/dist/src/utils/metrics-reader.js +10 -0
- package/dist/src/verification/rollback.js +2 -2
- package/dist/src/verification/rollback.js.map +1 -1
- package/dist/src/verification/tests/mocks/false-reporting-scenarios.test.js +4 -2
- package/dist/src/verification/tests/mocks/false-reporting-scenarios.test.js.map +1 -1
- package/docs/.claude-flow/metrics/performance.json +3 -3
- package/docs/.claude-flow/metrics/task-metrics.json +3 -3
- package/docs/architecture/README.md +555 -0
- package/docs/architecture/github-workflows-optimization-strategy.md +1079 -0
- package/docs/architecture/workflow-architecture-diagram.md +615 -0
- package/docs/architecture/workflow-optimization-implementation-guide.md +593 -0
- package/docs/features/AUTOMATIC_ERROR_RECOVERY_v2.7.35.md +321 -0
- package/docs/features/automatic-error-recovery.md +333 -0
- package/docs/fixes/WORKFLOW_FIXES.md +292 -0
- package/docs/fixes/WORKFLOW_FIXES_FINAL_STATUS.md +291 -0
- package/docs/fixes/github-workflow-fixes-pr888.md +279 -0
- package/docs/fixes/workflow-fixes-action-plan.md +388 -0
- package/docs/github-issues/README.md +88 -0
- package/docs/github-issues/wsl-enotempty-automatic-recovery.md +470 -0
- package/docs/github-workflow-fixes.md +219 -0
- package/docs/reviews/github-workflows-analysis-report.md +820 -0
- package/docs/reviews/pr-888-review-report.md +560 -0
- package/docs/testing/CONFIRMATION_AUTOMATIC_ERROR_RECOVERY.md +384 -0
- package/docs/testing/DOCKER_TEST_RESULTS_v2.7.35.md +305 -0
- package/docs/troubleshooting/wsl-better-sqlite3-error.md +239 -0
- package/docs/validation/workflow-fix-verification.md +206 -0
- package/package.json +7 -7
- package/scripts/create-github-issue.sh +64 -0
- package/scripts/test-docker-wsl.sh +198 -0
- package/src/__tests__/benchmarks/performance.bench.ts +2 -25
- package/src/__tests__/hook-matchers.test.ts +2 -0
- package/src/agents/agent-registry.ts +1 -1
- package/src/api/auth-service.ts +1 -1
- package/src/api/claude-client-enhanced.ts +2 -1
- package/src/api/claude-client.ts +2 -2
- package/src/api/database-service.ts +1 -2
- package/src/api/swarm-api.ts +2 -2
- package/src/cli/commands/hive-mind/wizard.ts +1 -1
- package/src/cli/init/index.ts +72 -42
- package/src/cli/simple-commands/init/skills-copier.js +1 -1
- package/src/cli/simple-orchestrator.ts +1 -1
- package/src/coordination/conflict-resolution.ts +1 -1
- package/src/coordination/load-balancer.ts +1 -1
- package/src/core/DatabaseManager.ts +55 -9
- package/src/core/config.ts +1 -1
- package/src/enterprise/audit-manager.ts +1 -1
- package/src/providers/openai-provider.ts +2 -2
- package/src/sdk/checkpoint-manager.ts +1 -1
- package/src/services/agentic-flow-hooks/workflow-hooks.ts +1 -1
- package/src/swarm/coordinator.ts +1 -1
- package/src/utils/error-recovery.ts +325 -0
- package/src/verification/rollback.ts +2 -2
- package/src/verification/tests/mocks/false-reporting-scenarios.test.ts +6 -3
- /package/docs/{BUG_REPORT_MEMORY_STATS.md โ bug-reports/BUG_REPORT_MEMORY_STATS.md} +0 -0
- /package/docs/{MCP_2025_FEATURE_CONFIRMATION.md โ features/MCP_2025_FEATURE_CONFIRMATION.md} +0 -0
- /package/docs/{OPTIONAL_LOCAL_EMBEDDINGS.md โ features/OPTIONAL_LOCAL_EMBEDDINGS.md} +0 -0
- /package/docs/{mcp-2025-implementation-summary.md โ features/mcp-2025-implementation-summary.md} +0 -0
- /package/docs/{mcp-spec-2025-implementation-plan.md โ features/mcp-spec-2025-implementation-plan.md} +0 -0
- /package/docs/{AGENTIC_FLOW_ENABLED_LOG_FIX.md โ fixes/AGENTIC_FLOW_ENABLED_LOG_FIX.md} +0 -0
- /package/docs/{MEMORY_COMMAND_FIX.md โ fixes/MEMORY_COMMAND_FIX.md} +0 -0
- /package/docs/{NPX_MEMORY_FIX_v2.7.19.md โ fixes/NPX_MEMORY_FIX_v2.7.19.md} +0 -0
- /package/docs/{REMOTE_INSTALL_FIX.md โ fixes/REMOTE_INSTALL_FIX.md} +0 -0
- /package/docs/{SQLITE_FIX_COMPLETE_v2.7.21.md โ fixes/SQLITE_FIX_COMPLETE_v2.7.21.md} +0 -0
- /package/docs/{NPM_PUBLISH_GUIDE_v2.7.33.md โ guides/NPM_PUBLISH_GUIDE_v2.7.33.md} +0 -0
- /package/docs/{SWARM_INITIALIZATION_GUIDE.md โ guides/SWARM_INITIALIZATION_GUIDE.md} +0 -0
- /package/docs/{AGENTDB_BRANCH_MERGE_VERIFICATION.md โ integration/AGENTDB_BRANCH_MERGE_VERIFICATION.md} +0 -0
- /package/docs/{INTEGRATION_STATUS_FINAL.md โ integration/INTEGRATION_STATUS_FINAL.md} +0 -0
- /package/docs/{agentic-flow-agentdb-mcp-integration.md โ integration/agentic-flow-agentdb-mcp-integration.md} +0 -0
- /package/docs/{phase-1-2-implementation-summary.md โ integration/phase-1-2-implementation-summary.md} +0 -0
- /package/docs/{.github-release-issue-v2.7.33.md โ releases/.github-release-issue-v2.7.33.md} +0 -0
- /package/docs/{RELEASE_NOTES_v2.7.15.md โ releases/RELEASE_NOTES_v2.7.15.md} +0 -0
- /package/docs/{RELEASE_NOTES_v2.7.33.md โ releases/RELEASE_NOTES_v2.7.33.md} +0 -0
- /package/docs/{RELEASE_READINESS_SUMMARY.md โ releases/RELEASE_READINESS_SUMMARY.md} +0 -0
- /package/docs/{RELEASE_SUMMARY_v2.7.33.md โ releases/RELEASE_SUMMARY_v2.7.33.md} +0 -0
- /package/docs/{V2.7.14_RELEASE_NOTES.md โ releases/V2.7.14_RELEASE_NOTES.md} +0 -0
- /package/docs/{V2.7.25_RELEASE_NOTES.md โ releases/V2.7.25_RELEASE_NOTES.md} +0 -0
- /package/docs/{V2.7.26_RELEASE_SUMMARY.md โ releases/V2.7.26_RELEASE_SUMMARY.md} +0 -0
- /package/docs/{V2.7.27_RELEASE_NOTES.md โ releases/V2.7.27_RELEASE_NOTES.md} +0 -0
- /package/docs/{V2.7.28_RELEASE_NOTES.md โ releases/V2.7.28_RELEASE_NOTES.md} +0 -0
- /package/docs/{AGENTIC_FLOW_INTEGRATION_REVIEW.md โ reviews/AGENTIC_FLOW_INTEGRATION_REVIEW.md} +0 -0
- /package/docs/{BRANCH_REVIEW_SUMMARY.md โ reviews/BRANCH_REVIEW_SUMMARY.md} +0 -0
- /package/docs/{DEEP_CODE_REVIEW_v2.7.33.md โ reviews/DEEP_CODE_REVIEW_v2.7.33.md} +0 -0
- /package/docs/{LATEST_LIBRARIES_REVIEW.md โ reviews/LATEST_LIBRARIES_REVIEW.md} +0 -0
- /package/docs/{REGRESSION_TEST_REPORT_v2.7.33.md โ testing/REGRESSION_TEST_REPORT_v2.7.33.md} +0 -0
- /package/docs/{V2.7.27_TEST_REPORT.md โ testing/V2.7.27_TEST_REPORT.md} +0 -0
- /package/docs/{regression-analysis-phase-1-2.md โ testing/regression-analysis-phase-1-2.md} +0 -0
- /package/docs/{TRANSFORMER_INITIALIZATION_ISSUE.md โ troubleshooting/TRANSFORMER_INITIALIZATION_ISSUE.md} +0 -0
- /package/docs/{FIX_VERIFICATION_MEMORY_STATS.md โ validation/FIX_VERIFICATION_MEMORY_STATS.md} +0 -0
- /package/docs/{TOOL_VALIDATION_REPORT.md โ validation/TOOL_VALIDATION_REPORT.md} +0 -0
- /package/docs/{VALIDATION_REPORT_v2.7.1.md โ validation/VALIDATION_REPORT_v2.7.1.md} +0 -0
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import { execSync } from 'child_process';
|
|
2
|
+
import * as fs from 'fs-extra';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import * as os from 'os';
|
|
5
|
+
export function isNpmCacheError(error) {
|
|
6
|
+
const errorStr = error?.message || String(error);
|
|
7
|
+
return errorStr.includes('ENOTEMPTY') && (errorStr.includes('npm') || errorStr.includes('npx') || errorStr.includes('_npx')) || errorStr.includes('better-sqlite3');
|
|
8
|
+
}
|
|
9
|
+
export function isWSL() {
|
|
10
|
+
if (process.platform !== 'linux') {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
try {
|
|
14
|
+
const release = fs.readFileSync('/proc/version', 'utf8').toLowerCase();
|
|
15
|
+
return release.includes('microsoft') || release.includes('wsl');
|
|
16
|
+
} catch {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export async function cleanNpmCache() {
|
|
21
|
+
const homeDir = os.homedir();
|
|
22
|
+
const npxCacheDir = path.join(homeDir, '.npm', '_npx');
|
|
23
|
+
try {
|
|
24
|
+
console.log('๐งน Cleaning npm cache...');
|
|
25
|
+
try {
|
|
26
|
+
execSync('npm cache clean --force', {
|
|
27
|
+
stdio: 'pipe'
|
|
28
|
+
});
|
|
29
|
+
console.log('โ
npm cache cleaned');
|
|
30
|
+
} catch (error) {
|
|
31
|
+
console.warn('โ ๏ธ npm cache clean failed, continuing...');
|
|
32
|
+
}
|
|
33
|
+
if (await fs.pathExists(npxCacheDir)) {
|
|
34
|
+
console.log(`๐๏ธ Removing npx cache: ${npxCacheDir}`);
|
|
35
|
+
await fs.remove(npxCacheDir);
|
|
36
|
+
console.log('โ
npx cache removed');
|
|
37
|
+
}
|
|
38
|
+
if (isWSL()) {
|
|
39
|
+
const npmDir = path.join(homeDir, '.npm');
|
|
40
|
+
if (await fs.pathExists(npmDir)) {
|
|
41
|
+
try {
|
|
42
|
+
execSync(`chmod -R 755 "${npmDir}"`, {
|
|
43
|
+
stdio: 'pipe'
|
|
44
|
+
});
|
|
45
|
+
console.log('โ
npm directory permissions fixed');
|
|
46
|
+
} catch (error) {
|
|
47
|
+
console.warn('โ ๏ธ Permission fix failed, continuing...');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
success: true,
|
|
53
|
+
action: 'cache-cleanup',
|
|
54
|
+
message: 'npm/npx cache cleaned successfully',
|
|
55
|
+
recovered: true
|
|
56
|
+
};
|
|
57
|
+
} catch (error) {
|
|
58
|
+
return {
|
|
59
|
+
success: false,
|
|
60
|
+
action: 'cache-cleanup',
|
|
61
|
+
message: `Failed to clean cache: ${error instanceof Error ? error.message : String(error)}`,
|
|
62
|
+
recovered: false
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
export async function retryWithRecovery(fn, options = {}) {
|
|
67
|
+
const { maxRetries = 3, delay = 1000, onRetry, cleanupFn } = options;
|
|
68
|
+
let lastError;
|
|
69
|
+
for(let attempt = 1; attempt <= maxRetries; attempt++){
|
|
70
|
+
try {
|
|
71
|
+
return await fn();
|
|
72
|
+
} catch (error) {
|
|
73
|
+
lastError = error;
|
|
74
|
+
if (isNpmCacheError(error)) {
|
|
75
|
+
console.log(`\nโ ๏ธ Detected npm cache error (attempt ${attempt}/${maxRetries})`);
|
|
76
|
+
const recovery = await cleanNpmCache();
|
|
77
|
+
if (recovery.success) {
|
|
78
|
+
console.log('โ
Cache cleaned, retrying...\n');
|
|
79
|
+
if (cleanupFn) {
|
|
80
|
+
await cleanupFn();
|
|
81
|
+
}
|
|
82
|
+
const backoffDelay = delay * Math.pow(2, attempt - 1);
|
|
83
|
+
await new Promise((resolve)=>setTimeout(resolve, backoffDelay));
|
|
84
|
+
continue;
|
|
85
|
+
} else {
|
|
86
|
+
console.error('โ Cache cleanup failed:', recovery.message);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (onRetry && attempt < maxRetries) {
|
|
90
|
+
onRetry(attempt, lastError);
|
|
91
|
+
await new Promise((resolve)=>setTimeout(resolve, delay));
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
if (attempt === maxRetries) {
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
throw new Error(`Operation failed after ${maxRetries} attempts. ` + `Last error: ${lastError?.message || 'Unknown error'}`);
|
|
100
|
+
}
|
|
101
|
+
export async function recoverWSLErrors() {
|
|
102
|
+
if (!isWSL()) {
|
|
103
|
+
return {
|
|
104
|
+
success: true,
|
|
105
|
+
action: 'wsl-check',
|
|
106
|
+
message: 'Not running on WSL, no recovery needed',
|
|
107
|
+
recovered: false
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
console.log('๐ Detected WSL environment, applying fixes...');
|
|
111
|
+
try {
|
|
112
|
+
const homeDir = os.homedir();
|
|
113
|
+
const cwd = process.cwd();
|
|
114
|
+
if (cwd.startsWith('/mnt/')) {
|
|
115
|
+
console.warn('โ ๏ธ WARNING: Running from Windows filesystem (/mnt/)');
|
|
116
|
+
console.warn(' For best results, run from WSL filesystem (e.g., ~/projects/)');
|
|
117
|
+
}
|
|
118
|
+
try {
|
|
119
|
+
execSync('which gcc', {
|
|
120
|
+
stdio: 'pipe'
|
|
121
|
+
});
|
|
122
|
+
} catch {
|
|
123
|
+
console.warn('โ ๏ธ build-essential not found. Install with:');
|
|
124
|
+
console.warn(' sudo apt-get update && sudo apt-get install -y build-essential python3');
|
|
125
|
+
}
|
|
126
|
+
return await cleanNpmCache();
|
|
127
|
+
} catch (error) {
|
|
128
|
+
return {
|
|
129
|
+
success: false,
|
|
130
|
+
action: 'wsl-recovery',
|
|
131
|
+
message: `WSL recovery failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
132
|
+
recovered: false
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
export async function verifyBetterSqlite3() {
|
|
137
|
+
try {
|
|
138
|
+
require.resolve('better-sqlite3');
|
|
139
|
+
return true;
|
|
140
|
+
} catch {
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
export async function installBetterSqlite3WithRecovery() {
|
|
145
|
+
console.log('๐ฆ Installing better-sqlite3...');
|
|
146
|
+
return retryWithRecovery(async ()=>{
|
|
147
|
+
execSync('npm install better-sqlite3 --no-save', {
|
|
148
|
+
stdio: 'inherit',
|
|
149
|
+
cwd: process.cwd()
|
|
150
|
+
});
|
|
151
|
+
if (await verifyBetterSqlite3()) {
|
|
152
|
+
return {
|
|
153
|
+
success: true,
|
|
154
|
+
action: 'install-sqlite',
|
|
155
|
+
message: 'better-sqlite3 installed successfully',
|
|
156
|
+
recovered: true
|
|
157
|
+
};
|
|
158
|
+
} else {
|
|
159
|
+
throw new Error('Installation completed but module not found');
|
|
160
|
+
}
|
|
161
|
+
}, {
|
|
162
|
+
maxRetries: 3,
|
|
163
|
+
delay: 2000,
|
|
164
|
+
onRetry: (attempt, error)=>{
|
|
165
|
+
console.log(`โ ๏ธ Install attempt ${attempt} failed: ${error.message}`);
|
|
166
|
+
console.log('๐ Cleaning cache and retrying...');
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
export async function recoverInitErrors(error) {
|
|
171
|
+
console.log('\n๐จ Error detected during initialization');
|
|
172
|
+
console.log(` Error: ${error?.message || String(error)}\n`);
|
|
173
|
+
if (isWSL()) {
|
|
174
|
+
console.log('๐ง Applying WSL-specific fixes...');
|
|
175
|
+
const wslRecovery = await recoverWSLErrors();
|
|
176
|
+
if (!wslRecovery.success) {
|
|
177
|
+
return wslRecovery;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
if (isNpmCacheError(error)) {
|
|
181
|
+
console.log('๐ง Detected npm cache error, attempting recovery...');
|
|
182
|
+
const cacheRecovery = await cleanNpmCache();
|
|
183
|
+
if (!cacheRecovery.success) {
|
|
184
|
+
return cacheRecovery;
|
|
185
|
+
}
|
|
186
|
+
if (!await verifyBetterSqlite3()) {
|
|
187
|
+
console.log('๐ง better-sqlite3 missing, attempting reinstall...');
|
|
188
|
+
return await installBetterSqlite3WithRecovery();
|
|
189
|
+
}
|
|
190
|
+
return {
|
|
191
|
+
success: true,
|
|
192
|
+
action: 'error-recovery',
|
|
193
|
+
message: 'Cache cleaned and dependencies verified',
|
|
194
|
+
recovered: true
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
return {
|
|
198
|
+
success: false,
|
|
199
|
+
action: 'error-recovery',
|
|
200
|
+
message: `Unable to automatically recover from error: ${error?.message || String(error)}`,
|
|
201
|
+
recovered: false
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
export const errorRecovery = {
|
|
205
|
+
isNpmCacheError,
|
|
206
|
+
isWSL,
|
|
207
|
+
cleanNpmCache,
|
|
208
|
+
retryWithRecovery,
|
|
209
|
+
recoverWSLErrors,
|
|
210
|
+
verifyBetterSqlite3,
|
|
211
|
+
installBetterSqlite3WithRecovery,
|
|
212
|
+
recoverInitErrors
|
|
213
|
+
};
|
|
214
|
+
|
|
215
|
+
//# sourceMappingURL=error-recovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/error-recovery.ts"],"sourcesContent":["/**\n * Error Recovery Utilities\n * Automatic error detection and recovery for common installation issues\n */\n\nimport { execSync } from 'child_process';\nimport * as fs from 'fs-extra';\nimport * as path from 'path';\nimport * as os from 'os';\n\nexport interface RecoveryResult {\n success: boolean;\n action: string;\n message: string;\n recovered: boolean;\n}\n\nexport interface RetryOptions {\n maxRetries?: number;\n delay?: number;\n onRetry?: (attempt: number, error: Error) => void;\n cleanupFn?: () => Promise<void>;\n}\n\n/**\n * Detect if an error is the ENOTEMPTY npm cache error\n */\nexport function isNpmCacheError(error: any): boolean {\n const errorStr = error?.message || String(error);\n return (\n errorStr.includes('ENOTEMPTY') &&\n (errorStr.includes('npm') || errorStr.includes('npx') || errorStr.includes('_npx'))\n ) || errorStr.includes('better-sqlite3');\n}\n\n/**\n * Detect if running on WSL (Windows Subsystem for Linux)\n */\nexport function isWSL(): boolean {\n if (process.platform !== 'linux') {\n return false;\n }\n\n try {\n const release = fs.readFileSync('/proc/version', 'utf8').toLowerCase();\n return release.includes('microsoft') || release.includes('wsl');\n } catch {\n return false;\n }\n}\n\n/**\n * Clean npm and npx cache directories\n */\nexport async function cleanNpmCache(): Promise<RecoveryResult> {\n const homeDir = os.homedir();\n const npxCacheDir = path.join(homeDir, '.npm', '_npx');\n\n try {\n console.log('๐งน Cleaning npm cache...');\n\n // Clean npm cache\n try {\n execSync('npm cache clean --force', { stdio: 'pipe' });\n console.log('โ
npm cache cleaned');\n } catch (error) {\n console.warn('โ ๏ธ npm cache clean failed, continuing...');\n }\n\n // Remove npx cache directory\n if (await fs.pathExists(npxCacheDir)) {\n console.log(`๐๏ธ Removing npx cache: ${npxCacheDir}`);\n await fs.remove(npxCacheDir);\n console.log('โ
npx cache removed');\n }\n\n // Fix permissions on WSL\n if (isWSL()) {\n const npmDir = path.join(homeDir, '.npm');\n if (await fs.pathExists(npmDir)) {\n try {\n execSync(`chmod -R 755 \"${npmDir}\"`, { stdio: 'pipe' });\n console.log('โ
npm directory permissions fixed');\n } catch (error) {\n console.warn('โ ๏ธ Permission fix failed, continuing...');\n }\n }\n }\n\n return {\n success: true,\n action: 'cache-cleanup',\n message: 'npm/npx cache cleaned successfully',\n recovered: true\n };\n } catch (error) {\n return {\n success: false,\n action: 'cache-cleanup',\n message: `Failed to clean cache: ${error instanceof Error ? error.message : String(error)}`,\n recovered: false\n };\n }\n}\n\n/**\n * Automatic retry with exponential backoff and error recovery\n */\nexport async function retryWithRecovery<T>(\n fn: () => Promise<T>,\n options: RetryOptions = {}\n): Promise<T> {\n const {\n maxRetries = 3,\n delay = 1000,\n onRetry,\n cleanupFn\n } = options;\n\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error as Error;\n\n // Check if it's a recoverable error\n if (isNpmCacheError(error)) {\n console.log(`\\nโ ๏ธ Detected npm cache error (attempt ${attempt}/${maxRetries})`);\n\n // Attempt automatic recovery\n const recovery = await cleanNpmCache();\n if (recovery.success) {\n console.log('โ
Cache cleaned, retrying...\\n');\n\n // Run custom cleanup if provided\n if (cleanupFn) {\n await cleanupFn();\n }\n\n // Exponential backoff\n const backoffDelay = delay * Math.pow(2, attempt - 1);\n await new Promise(resolve => setTimeout(resolve, backoffDelay));\n\n continue; // Retry\n } else {\n console.error('โ Cache cleanup failed:', recovery.message);\n }\n }\n\n // Call retry callback\n if (onRetry && attempt < maxRetries) {\n onRetry(attempt, lastError);\n await new Promise(resolve => setTimeout(resolve, delay));\n continue;\n }\n\n // Last attempt failed\n if (attempt === maxRetries) {\n break;\n }\n }\n }\n\n // All retries exhausted\n throw new Error(\n `Operation failed after ${maxRetries} attempts. ` +\n `Last error: ${lastError?.message || 'Unknown error'}`\n );\n}\n\n/**\n * WSL-specific error recovery\n */\nexport async function recoverWSLErrors(): Promise<RecoveryResult> {\n if (!isWSL()) {\n return {\n success: true,\n action: 'wsl-check',\n message: 'Not running on WSL, no recovery needed',\n recovered: false\n };\n }\n\n console.log('๐ Detected WSL environment, applying fixes...');\n\n try {\n const homeDir = os.homedir();\n\n // Check if running from Windows mount\n const cwd = process.cwd();\n if (cwd.startsWith('/mnt/')) {\n console.warn('โ ๏ธ WARNING: Running from Windows filesystem (/mnt/)');\n console.warn(' For best results, run from WSL filesystem (e.g., ~/projects/)');\n }\n\n // Ensure build tools are available\n try {\n execSync('which gcc', { stdio: 'pipe' });\n } catch {\n console.warn('โ ๏ธ build-essential not found. Install with:');\n console.warn(' sudo apt-get update && sudo apt-get install -y build-essential python3');\n }\n\n // Clean cache with WSL-specific handling\n return await cleanNpmCache();\n } catch (error) {\n return {\n success: false,\n action: 'wsl-recovery',\n message: `WSL recovery failed: ${error instanceof Error ? error.message : String(error)}`,\n recovered: false\n };\n }\n}\n\n/**\n * Verify better-sqlite3 installation\n */\nexport async function verifyBetterSqlite3(): Promise<boolean> {\n try {\n require.resolve('better-sqlite3');\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Install better-sqlite3 with retry and error recovery\n */\nexport async function installBetterSqlite3WithRecovery(): Promise<RecoveryResult> {\n console.log('๐ฆ Installing better-sqlite3...');\n\n return retryWithRecovery(\n async () => {\n execSync('npm install better-sqlite3 --no-save', {\n stdio: 'inherit',\n cwd: process.cwd()\n });\n\n // Verify installation\n if (await verifyBetterSqlite3()) {\n return {\n success: true,\n action: 'install-sqlite',\n message: 'better-sqlite3 installed successfully',\n recovered: true\n };\n } else {\n throw new Error('Installation completed but module not found');\n }\n },\n {\n maxRetries: 3,\n delay: 2000,\n onRetry: (attempt, error) => {\n console.log(`โ ๏ธ Install attempt ${attempt} failed: ${error.message}`);\n console.log('๐ Cleaning cache and retrying...');\n }\n }\n );\n}\n\n/**\n * Comprehensive error recovery for initialization\n */\nexport async function recoverInitErrors(error: any): Promise<RecoveryResult> {\n console.log('\\n๐จ Error detected during initialization');\n console.log(` Error: ${error?.message || String(error)}\\n`);\n\n // WSL-specific recovery\n if (isWSL()) {\n console.log('๐ง Applying WSL-specific fixes...');\n const wslRecovery = await recoverWSLErrors();\n if (!wslRecovery.success) {\n return wslRecovery;\n }\n }\n\n // npm cache error recovery\n if (isNpmCacheError(error)) {\n console.log('๐ง Detected npm cache error, attempting recovery...');\n const cacheRecovery = await cleanNpmCache();\n if (!cacheRecovery.success) {\n return cacheRecovery;\n }\n\n // Try to reinstall better-sqlite3\n if (!await verifyBetterSqlite3()) {\n console.log('๐ง better-sqlite3 missing, attempting reinstall...');\n return await installBetterSqlite3WithRecovery();\n }\n\n return {\n success: true,\n action: 'error-recovery',\n message: 'Cache cleaned and dependencies verified',\n recovered: true\n };\n }\n\n // Generic error handling\n return {\n success: false,\n action: 'error-recovery',\n message: `Unable to automatically recover from error: ${error?.message || String(error)}`,\n recovered: false\n };\n}\n\n/**\n * Export utility functions\n */\nexport const errorRecovery = {\n isNpmCacheError,\n isWSL,\n cleanNpmCache,\n retryWithRecovery,\n recoverWSLErrors,\n verifyBetterSqlite3,\n installBetterSqlite3WithRecovery,\n recoverInitErrors\n};\n"],"names":["execSync","fs","path","os","isNpmCacheError","error","errorStr","message","String","includes","isWSL","process","platform","release","readFileSync","toLowerCase","cleanNpmCache","homeDir","homedir","npxCacheDir","join","console","log","stdio","warn","pathExists","remove","npmDir","success","action","recovered","Error","retryWithRecovery","fn","options","maxRetries","delay","onRetry","cleanupFn","lastError","attempt","recovery","backoffDelay","Math","pow","Promise","resolve","setTimeout","recoverWSLErrors","cwd","startsWith","verifyBetterSqlite3","require","installBetterSqlite3WithRecovery","recoverInitErrors","wslRecovery","cacheRecovery","errorRecovery"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/utils/key-redactor.
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/key-redactor.js"],"sourcesContent":["/**\n * API Key Redaction Utility\n * Prevents sensitive data from leaking into logs, memory, or git commits\n */\n\nexport class KeyRedactor {\n static API_KEY_PATTERNS = [\n // Anthropic API keys\n /sk-ant-[a-zA-Z0-9_-]{95,}/gi,\n\n // OpenRouter API keys\n /sk-or-[a-zA-Z0-9_-]{32,}/gi,\n\n // Google/Gemini API keys\n /AIza[a-zA-Z0-9_-]{35}/gi,\n\n // Generic API keys\n /[a-zA-Z0-9_-]{20,}API[a-zA-Z0-9_-]{20,}/gi,\n\n // Bearer tokens\n /Bearer\\s+[a-zA-Z0-9_\\-\\.]{20,}/gi,\n\n // Environment variable format\n /([A-Z_]+_API_KEY|[A-Z_]+_TOKEN|[A-Z_]+_SECRET)=[\"']?([^\"'\\s]+)[\"']?/gi,\n\n // Supabase keys\n /eyJ[a-zA-Z0-9_-]*\\.eyJ[a-zA-Z0-9_-]*\\.[a-zA-Z0-9_-]*/gi,\n ];\n\n static SENSITIVE_FIELDS = [\n 'apiKey',\n 'api_key',\n 'token',\n 'secret',\n 'password',\n 'private_key',\n 'privateKey',\n 'accessToken',\n 'access_token',\n 'refreshToken',\n 'refresh_token',\n ];\n\n /**\n * Redact API keys and sensitive data from text\n */\n static redact(text, showPrefix = true) {\n if (!text) return text;\n\n let redacted = text;\n\n // Redact using patterns\n this.API_KEY_PATTERNS.forEach(pattern => {\n redacted = redacted.replace(pattern, (match) => {\n if (showPrefix && match.length > 8) {\n const prefix = match.substring(0, 8);\n return `${prefix}...[REDACTED]`;\n }\n return '[REDACTED_API_KEY]';\n });\n });\n\n return redacted;\n }\n\n /**\n * Redact sensitive fields in objects\n */\n static redactObject(obj, deep = true) {\n if (!obj || typeof obj !== 'object') return obj;\n\n const redacted = { ...obj };\n\n Object.keys(redacted).forEach(key => {\n const lowerKey = key.toLowerCase();\n\n // Check if field name is sensitive\n const isSensitive = this.SENSITIVE_FIELDS.some(field =>\n lowerKey.includes(field)\n );\n\n if (isSensitive && typeof redacted[key] === 'string') {\n const value = redacted[key];\n if (value && value.length > 8) {\n redacted[key] = `${value.substring(0, 4)}...[REDACTED]`;\n } else {\n redacted[key] = '[REDACTED]';\n }\n } else if (deep && typeof redacted[key] === 'object' && redacted[key] !== null) {\n redacted[key] = this.redactObject(redacted[key], deep);\n } else if (typeof redacted[key] === 'string') {\n // Redact any API keys in string values\n redacted[key] = this.redact(redacted[key]);\n }\n });\n\n return redacted;\n }\n\n /**\n * Sanitize text for safe logging\n */\n static sanitize(text) {\n return this.redact(text, true);\n }\n\n /**\n * Sanitize command arguments\n */\n static sanitizeArgs(args) {\n return args.map(arg => {\n // Check if arg is a flag value pair\n if (arg.includes('key') || arg.includes('token') || arg.includes('secret')) {\n return this.redact(arg);\n }\n return arg;\n });\n }\n\n /**\n * Check if text contains unredacted sensitive data\n */\n static containsSensitiveData(text) {\n return this.API_KEY_PATTERNS.some(pattern => pattern.test(text));\n }\n\n /**\n * Validate that text is safe for logging/storage\n */\n static validate(text) {\n const warnings = [];\n\n this.API_KEY_PATTERNS.forEach((pattern, index) => {\n if (pattern.test(text)) {\n warnings.push(`Potential API key detected (pattern ${index + 1})`);\n }\n });\n\n return {\n safe: warnings.length === 0,\n warnings,\n };\n }\n\n /**\n * Redact environment variables\n */\n static redactEnv(env) {\n const redacted = {};\n\n Object.keys(env).forEach(key => {\n const value = env[key];\n if (!value) {\n redacted[key] = '';\n return;\n }\n\n const lowerKey = key.toLowerCase();\n const isSensitive = lowerKey.includes('key') ||\n lowerKey.includes('token') ||\n lowerKey.includes('secret') ||\n lowerKey.includes('password');\n\n if (isSensitive) {\n redacted[key] = value.length > 8\n ? `${value.substring(0, 4)}...[REDACTED]`\n : '[REDACTED]';\n } else {\n redacted[key] = value;\n }\n });\n\n return redacted;\n }\n}\n\n// Export singleton instance\nexport const redactor = KeyRedactor;\n"],"names":["KeyRedactor","API_KEY_PATTERNS","SENSITIVE_FIELDS","redact","text","showPrefix","redacted","forEach","pattern","replace","match","length","prefix","substring","redactObject","obj","deep","Object","keys","key","lowerKey","toLowerCase","isSensitive","some","field","includes","value","sanitize","sanitizeArgs","args","map","arg","containsSensitiveData","test","validate","warnings","index","push","safe","redactEnv","env","redactor"],"mappings":"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"}
|
|
@@ -166,4 +166,14 @@ export class MetricsReader {
|
|
|
166
166
|
}
|
|
167
167
|
}
|
|
168
168
|
|
|
169
|
+
//# sourceMappingURL=metrics-reader.js.map processCount: 0,
|
|
170
|
+
orchestratorRunning: false,
|
|
171
|
+
port: null,
|
|
172
|
+
connections: 0
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
export { MetricsReader };
|
|
178
|
+
|
|
169
179
|
//# sourceMappingURL=metrics-reader.js.map
|
|
@@ -217,7 +217,7 @@ export class StateManager extends EventEmitter {
|
|
|
217
217
|
async storeSnapshot(snapshot) {
|
|
218
218
|
const filename = `${snapshot.id}.snapshot.json`;
|
|
219
219
|
const filepath = join(this.snapshotDir, filename);
|
|
220
|
-
|
|
220
|
+
const content = JSON.stringify(snapshot, null, 2);
|
|
221
221
|
if (this.compressionEnabled) {
|
|
222
222
|
const compressed = await gzipAsync(Buffer.from(content, 'utf-8'));
|
|
223
223
|
await fs.writeFile(filepath + '.gz', compressed);
|
|
@@ -944,7 +944,7 @@ export class RollbackHistory extends EventEmitter {
|
|
|
944
944
|
async storeHistoryEntry(entry) {
|
|
945
945
|
const filename = `${entry.id}.history.json`;
|
|
946
946
|
const filepath = join(this.historyDir, filename);
|
|
947
|
-
|
|
947
|
+
const content = JSON.stringify(entry, null, 2);
|
|
948
948
|
if (this.compressionEnabled) {
|
|
949
949
|
const compressed = await gzipAsync(Buffer.from(content, 'utf-8'));
|
|
950
950
|
await fs.writeFile(filepath + '.gz', compressed);
|