bobs-workshop 0.3.3 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +2 -2
- package/README.md +199 -210
- package/bin/bobs-workshop.js +109 -0
- package/config/agents.json +27 -0
- package/dist/plugins/bobs-workshop.js +34 -0
- package/dist/tools/background-agent/cancel.d.ts +3 -0
- package/dist/tools/background-agent/cancel.d.ts.map +1 -0
- package/dist/tools/background-agent/cancel.js +52 -0
- package/dist/tools/background-agent/concurrency.d.ts +15 -0
- package/dist/tools/background-agent/concurrency.d.ts.map +1 -0
- package/dist/tools/background-agent/concurrency.js +61 -0
- package/dist/tools/background-agent/index.d.ts +8 -0
- package/dist/tools/background-agent/index.d.ts.map +1 -0
- package/dist/tools/background-agent/index.js +7 -0
- package/dist/tools/background-agent/launch.d.ts +6 -0
- package/dist/tools/background-agent/launch.d.ts.map +1 -0
- package/dist/tools/background-agent/launch.js +33 -0
- package/dist/tools/background-agent/list.d.ts +7 -0
- package/dist/tools/background-agent/list.d.ts.map +1 -0
- package/dist/tools/background-agent/list.js +40 -0
- package/dist/tools/background-agent/manager.d.ts +29 -0
- package/dist/tools/background-agent/manager.d.ts.map +1 -0
- package/dist/tools/background-agent/manager.js +377 -0
- package/dist/tools/background-agent/output.d.ts +3 -0
- package/dist/tools/background-agent/output.d.ts.map +1 -0
- package/dist/tools/background-agent/output.js +41 -0
- package/dist/tools/background-agent/types.d.ts +46 -0
- package/dist/tools/background-agent/types.d.ts.map +1 -0
- package/dist/tools/background-agent/types.js +1 -0
- package/dist/tools/index.d.ts +9 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +8 -0
- package/dist/tools/manual/index.d.ts +3 -0
- package/dist/tools/manual/index.d.ts.map +1 -0
- package/dist/tools/manual/index.js +2 -0
- package/dist/tools/manual/manual-update.d.ts +4 -0
- package/dist/tools/manual/manual-update.d.ts.map +1 -0
- package/dist/tools/manual/manual-update.js +190 -0
- package/dist/tools/manual/verify-manual.d.ts +4 -0
- package/dist/tools/manual/verify-manual.d.ts.map +1 -0
- package/dist/tools/manual/verify-manual.js +46 -0
- package/package.json +34 -66
- package/postinstall.js +190 -0
- package/src/agents/alice.md +466 -0
- package/src/agents/bob-rev.md +493 -0
- package/src/agents/bob-send.md +277 -0
- package/src/agents/bob.md +442 -0
- package/src/agents/trace.md +451 -0
- package/src/plugins/bobs-workshop.ts +45 -0
- package/src/skills/api-patterns/SKILL.md +376 -0
- package/src/skills/architecture/SKILL.md +271 -0
- package/src/skills/bobs-workshop/performance/icon.svg +3 -0
- package/src/skills/brainstorming/SKILL.md +210 -0
- package/src/skills/clean-code/SKILL.md +151 -0
- package/src/skills/code-review-checklist/SKILL.md +220 -0
- package/src/skills/database-design/SKILL.md +271 -0
- package/src/skills/exploration/SKILL.md +257 -0
- package/src/skills/frontend-ui-ux/SKILL.md +78 -0
- package/src/skills/git-master/SKILL.md +1105 -0
- package/src/skills/performance/SKILL.md +144 -0
- package/src/skills/performance/icon.svg +3 -0
- package/src/skills/plan-writing/SKILL.md +225 -0
- package/src/skills/security/SKILL.md +410 -0
- package/src/skills/simplification/SKILL.md +238 -0
- package/src/skills/systematic-debugging/SKILL.md +175 -0
- package/src/skills/testing-patterns/SKILL.md +305 -0
- package/src/skills/verification/SKILL.md +286 -0
- package/src/tools/background-agent/cancel.ts +67 -0
- package/src/tools/background-agent/concurrency.ts +71 -0
- package/src/tools/background-agent/index.ts +7 -0
- package/src/tools/background-agent/launch.ts +39 -0
- package/src/tools/background-agent/list.ts +50 -0
- package/src/tools/background-agent/manager.ts +455 -0
- package/src/tools/background-agent/output.ts +57 -0
- package/src/tools/background-agent/types.ts +55 -0
- package/src/tools/index.ts +8 -0
- package/src/tools/manual/index.ts +2 -0
- package/src/tools/manual/manual-update.ts +197 -0
- package/src/tools/manual/verify-manual.ts +55 -0
- package/uninstall.js +64 -0
- package/Claude.md +0 -162
- package/bin/bobs-mcp-server.js +0 -11
- package/bin/bobs-mcp.js +0 -130
- package/dist/api/taskLogger.js +0 -106
- package/dist/api/taskLogger.js.map +0 -1
- package/dist/cli/checker.js +0 -401
- package/dist/cli/checker.js.map +0 -1
- package/dist/cli/cleanup.js +0 -131
- package/dist/cli/cleanup.js.map +0 -1
- package/dist/cli/debug.js +0 -157
- package/dist/cli/debug.js.map +0 -1
- package/dist/cli/health.js +0 -97
- package/dist/cli/health.js.map +0 -1
- package/dist/cli/setup.js +0 -81
- package/dist/cli/setup.js.map +0 -1
- package/dist/cli/workshop.js +0 -42
- package/dist/cli/workshop.js.map +0 -1
- package/dist/dashboard/server.js +0 -1203
- package/dist/dashboard/server.js.map +0 -1
- package/dist/index.js +0 -960
- package/dist/index.js.map +0 -1
- package/dist/prompts/architect.js +0 -221
- package/dist/prompts/architect.js.map +0 -1
- package/dist/prompts/debugger.js +0 -257
- package/dist/prompts/debugger.js.map +0 -1
- package/dist/prompts/engineer.js +0 -249
- package/dist/prompts/engineer.js.map +0 -1
- package/dist/prompts/orchestrator.js +0 -304
- package/dist/prompts/orchestrator.js.map +0 -1
- package/dist/prompts/reviewer.js +0 -289
- package/dist/prompts/reviewer.js.map +0 -1
- package/dist/services/activitySummarizer.js +0 -388
- package/dist/services/activitySummarizer.js.map +0 -1
- package/dist/services/changeValidator.js +0 -396
- package/dist/services/changeValidator.js.map +0 -1
- package/dist/services/claudeOrchestrator.js +0 -343
- package/dist/services/claudeOrchestrator.js.map +0 -1
- package/dist/services/fileMonitor.js +0 -250
- package/dist/services/fileMonitor.js.map +0 -1
- package/dist/services/implementationSummarizer.js +0 -306
- package/dist/services/implementationSummarizer.js.map +0 -1
- package/dist/services/liveMonitor.js +0 -315
- package/dist/services/liveMonitor.js.map +0 -1
- package/dist/services/mcpAuditLogger.js +0 -104
- package/dist/services/mcpAuditLogger.js.map +0 -1
- package/dist/services/mcpLogger.js +0 -223
- package/dist/services/mcpLogger.js.map +0 -1
- package/dist/services/tmuxManager.js +0 -541
- package/dist/services/tmuxManager.js.map +0 -1
- package/dist/tools/approvalTools.js +0 -244
- package/dist/tools/approvalTools.js.map +0 -1
- package/dist/tools/autoDebugger.js +0 -147
- package/dist/tools/autoDebugger.js.map +0 -1
- package/dist/tools/cleanupService.js +0 -221
- package/dist/tools/cleanupService.js.map +0 -1
- package/dist/tools/dashboardTools.js +0 -342
- package/dist/tools/dashboardTools.js.map +0 -1
- package/dist/tools/developmentNudges.js +0 -336
- package/dist/tools/developmentNudges.js.map +0 -1
- package/dist/tools/gitTools.js +0 -741
- package/dist/tools/gitTools.js.map +0 -1
- package/dist/tools/orchestratorTools.js +0 -832
- package/dist/tools/orchestratorTools.js.map +0 -1
- package/dist/tools/searchCache.js +0 -64
- package/dist/tools/searchCache.js.map +0 -1
- package/dist/tools/searchTools.js +0 -1107
- package/dist/tools/searchTools.js.map +0 -1
- package/dist/tools/semgrep-patterns.js +0 -296
- package/dist/tools/semgrep-patterns.js.map +0 -1
- package/dist/tools/specTools.js +0 -332
- package/dist/tools/specTools.js.map +0 -1
- package/dist/tools/structural/__tests__/orchestrator.test.js +0 -61
- package/dist/tools/structural/__tests__/orchestrator.test.js.map +0 -1
- package/dist/tools/structural/cache.js +0 -226
- package/dist/tools/structural/cache.js.map +0 -1
- package/dist/tools/structural/engines/python/index.js +0 -118
- package/dist/tools/structural/engines/python/index.js.map +0 -1
- package/dist/tools/structural/engines/typescript/__tests__/typescript-engine.test.js +0 -97
- package/dist/tools/structural/engines/typescript/__tests__/typescript-engine.test.js.map +0 -1
- package/dist/tools/structural/engines/typescript/analyzer.js +0 -433
- package/dist/tools/structural/engines/typescript/analyzer.js.map +0 -1
- package/dist/tools/structural/engines/typescript/index.js +0 -381
- package/dist/tools/structural/engines/typescript/index.js.map +0 -1
- package/dist/tools/structural/engines/typescript/utils.js +0 -279
- package/dist/tools/structural/engines/typescript/utils.js.map +0 -1
- package/dist/tools/structural/index.js +0 -248
- package/dist/tools/structural/index.js.map +0 -1
- package/dist/tools/structural/types.js +0 -18
- package/dist/tools/structural/types.js.map +0 -1
- package/dist/tools/tmuxTools.js +0 -100
- package/dist/tools/tmuxTools.js.map +0 -1
- package/dist/tools/workRecorder.js +0 -215
- package/dist/tools/workRecorder.js.map +0 -1
- package/dist/tools/worktreeTools.js +0 -705
- package/dist/tools/worktreeTools.js.map +0 -1
- package/dist/utils/__tests__/integration.test.js +0 -57
- package/dist/utils/__tests__/integration.test.js.map +0 -1
- package/dist/utils/__tests__/serverDetection.test.js +0 -151
- package/dist/utils/__tests__/serverDetection.test.js.map +0 -1
- package/dist/utils/errorHandling.js +0 -336
- package/dist/utils/errorHandling.js.map +0 -1
- package/dist/utils/processManager.js +0 -172
- package/dist/utils/processManager.js.map +0 -1
- package/dist/utils/reliability.js +0 -263
- package/dist/utils/reliability.js.map +0 -1
- package/dist/utils/responseFormatter.js +0 -250
- package/dist/utils/responseFormatter.js.map +0 -1
- package/dist/utils/serverDetection.js +0 -133
- package/dist/utils/serverDetection.js.map +0 -1
- package/dist/utils/specMigration.js +0 -105
- package/dist/utils/specMigration.js.map +0 -1
- package/dist/validation/schemas.js +0 -299
- package/dist/validation/schemas.js.map +0 -1
- package/public/.well-known/mcp/manifest.json +0 -473
- package/public/index.html +0 -3157
- package/public/index.html.backup +0 -2805
- package/public/index.html.backup2 +0 -1292
- package/scripts/cleanup-system-logs.ts +0 -121
- package/scripts/init-workspace.js +0 -63
- package/scripts/install-search-tools.js +0 -116
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
// src/utils/processManager.ts
|
|
2
|
-
import { spawn } from "child_process";
|
|
3
|
-
// Store running server processes by SPEC ID
|
|
4
|
-
const runningProcesses = new Map();
|
|
5
|
-
/**
|
|
6
|
-
* Starts a development server based on the provided configuration
|
|
7
|
-
*/
|
|
8
|
-
export async function startDevServer(specId, projectPath, config) {
|
|
9
|
-
console.log(`Starting dev server for SPEC ${specId} with config:`, config);
|
|
10
|
-
try {
|
|
11
|
-
// Run startup script first if provided
|
|
12
|
-
if (config.startupScript) {
|
|
13
|
-
console.log(`Running startup script: ${config.startupScript}`);
|
|
14
|
-
await runCommand(config.startupScript, projectPath);
|
|
15
|
-
}
|
|
16
|
-
// Parse dev command
|
|
17
|
-
const commandParts = config.devCommand.split(' ');
|
|
18
|
-
const command = commandParts[0];
|
|
19
|
-
const args = commandParts.slice(1);
|
|
20
|
-
console.log(`Starting server: ${command} ${args.join(' ')}`);
|
|
21
|
-
// Start the development server
|
|
22
|
-
const serverProcess = spawn(command, args, {
|
|
23
|
-
cwd: projectPath,
|
|
24
|
-
stdio: ['ignore', 'pipe', 'pipe'], // Capture stdout and stderr
|
|
25
|
-
detached: true, // Important for cleanup
|
|
26
|
-
env: { ...process.env, NODE_ENV: 'development' }
|
|
27
|
-
});
|
|
28
|
-
if (!serverProcess.pid) {
|
|
29
|
-
throw new Error(`Failed to start server process for SPEC ${specId}`);
|
|
30
|
-
}
|
|
31
|
-
const processInfo = {
|
|
32
|
-
pid: serverProcess.pid,
|
|
33
|
-
specId,
|
|
34
|
-
command: config.devCommand,
|
|
35
|
-
port: config.port,
|
|
36
|
-
status: 'starting',
|
|
37
|
-
startTime: new Date(),
|
|
38
|
-
process: serverProcess
|
|
39
|
-
};
|
|
40
|
-
// Store process for management
|
|
41
|
-
runningProcesses.set(specId, processInfo);
|
|
42
|
-
// Set up process event handlers
|
|
43
|
-
serverProcess.on('spawn', () => {
|
|
44
|
-
console.log(`Server started for SPEC ${specId} (PID: ${serverProcess.pid})`);
|
|
45
|
-
processInfo.status = 'running';
|
|
46
|
-
});
|
|
47
|
-
serverProcess.on('error', (error) => {
|
|
48
|
-
console.error(`Server error for SPEC ${specId}:`, error);
|
|
49
|
-
processInfo.status = 'crashed';
|
|
50
|
-
runningProcesses.delete(specId);
|
|
51
|
-
});
|
|
52
|
-
serverProcess.on('exit', (code, signal) => {
|
|
53
|
-
console.log(`Server exited for SPEC ${specId} (code: ${code}, signal: ${signal})`);
|
|
54
|
-
processInfo.status = 'stopped';
|
|
55
|
-
runningProcesses.delete(specId);
|
|
56
|
-
});
|
|
57
|
-
// Log server output for debugging
|
|
58
|
-
if (serverProcess.stdout) {
|
|
59
|
-
serverProcess.stdout.on('data', (data) => {
|
|
60
|
-
const output = data.toString().trim();
|
|
61
|
-
if (output) {
|
|
62
|
-
console.log(`[${specId}] STDOUT: ${output}`);
|
|
63
|
-
}
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
if (serverProcess.stderr) {
|
|
67
|
-
serverProcess.stderr.on('data', (data) => {
|
|
68
|
-
const output = data.toString().trim();
|
|
69
|
-
if (output) {
|
|
70
|
-
console.log(`[${specId}] STDERR: ${output}`);
|
|
71
|
-
}
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
// Give the process a moment to start
|
|
75
|
-
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
76
|
-
// Update status if process is still running
|
|
77
|
-
if (processInfo.status === 'starting' && !serverProcess.killed) {
|
|
78
|
-
processInfo.status = 'running';
|
|
79
|
-
}
|
|
80
|
-
console.log(`Dev server started successfully for SPEC ${specId} (PID: ${serverProcess.pid})`);
|
|
81
|
-
return processInfo;
|
|
82
|
-
}
|
|
83
|
-
catch (error) {
|
|
84
|
-
const errorMsg = `Failed to start dev server for SPEC ${specId}: ${error instanceof Error ? error.message : String(error)}`;
|
|
85
|
-
console.error(errorMsg);
|
|
86
|
-
throw new Error(errorMsg);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Stops a development server by SPEC ID
|
|
91
|
-
*/
|
|
92
|
-
export async function stopDevServer(specId) {
|
|
93
|
-
const processInfo = runningProcesses.get(specId);
|
|
94
|
-
if (!processInfo) {
|
|
95
|
-
console.warn(`No running server found for SPEC ${specId}`);
|
|
96
|
-
return false;
|
|
97
|
-
}
|
|
98
|
-
try {
|
|
99
|
-
console.log(`Stopping server for SPEC ${specId} (PID: ${processInfo.pid})`);
|
|
100
|
-
// Try graceful shutdown first
|
|
101
|
-
processInfo.process.kill('SIGTERM');
|
|
102
|
-
// Wait a moment for graceful shutdown
|
|
103
|
-
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
104
|
-
// Force kill if still running
|
|
105
|
-
if (!processInfo.process.killed) {
|
|
106
|
-
processInfo.process.kill('SIGKILL');
|
|
107
|
-
}
|
|
108
|
-
processInfo.status = 'stopped';
|
|
109
|
-
runningProcesses.delete(specId);
|
|
110
|
-
console.log(`Server stopped for SPEC ${specId}`);
|
|
111
|
-
return true;
|
|
112
|
-
}
|
|
113
|
-
catch (error) {
|
|
114
|
-
console.error(`Error stopping server for SPEC ${specId}:`, error);
|
|
115
|
-
// Force remove from tracking even if kill failed
|
|
116
|
-
runningProcesses.delete(specId);
|
|
117
|
-
return false;
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
/**
|
|
121
|
-
* Gets the status of a running server by SPEC ID
|
|
122
|
-
*/
|
|
123
|
-
export function getServerStatus(specId) {
|
|
124
|
-
return runningProcesses.get(specId) || null;
|
|
125
|
-
}
|
|
126
|
-
/**
|
|
127
|
-
* Gets all running server processes
|
|
128
|
-
*/
|
|
129
|
-
export function getAllRunningServers() {
|
|
130
|
-
return Array.from(runningProcesses.values());
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* Stops all running servers (cleanup utility)
|
|
134
|
-
*/
|
|
135
|
-
export async function stopAllServers() {
|
|
136
|
-
const specIds = Array.from(runningProcesses.keys());
|
|
137
|
-
console.log(`Stopping ${specIds.length} running servers...`);
|
|
138
|
-
const stopPromises = specIds.map(specId => stopDevServer(specId));
|
|
139
|
-
await Promise.all(stopPromises);
|
|
140
|
-
console.log('All servers stopped');
|
|
141
|
-
}
|
|
142
|
-
/**
|
|
143
|
-
* Helper function to run a command and wait for completion
|
|
144
|
-
*/
|
|
145
|
-
async function runCommand(command, cwd) {
|
|
146
|
-
return new Promise((resolve, reject) => {
|
|
147
|
-
const [cmd, ...args] = command.split(' ');
|
|
148
|
-
const process = spawn(cmd, args, { cwd, stdio: 'pipe' });
|
|
149
|
-
let stdout = '';
|
|
150
|
-
let stderr = '';
|
|
151
|
-
if (process.stdout) {
|
|
152
|
-
process.stdout.on('data', (data) => {
|
|
153
|
-
stdout += data.toString();
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
|
-
if (process.stderr) {
|
|
157
|
-
process.stderr.on('data', (data) => {
|
|
158
|
-
stderr += data.toString();
|
|
159
|
-
});
|
|
160
|
-
}
|
|
161
|
-
process.on('close', (code) => {
|
|
162
|
-
if (code === 0) {
|
|
163
|
-
resolve();
|
|
164
|
-
}
|
|
165
|
-
else {
|
|
166
|
-
reject(new Error(`Command failed with code ${code}: ${stderr || stdout}`));
|
|
167
|
-
}
|
|
168
|
-
});
|
|
169
|
-
process.on('error', reject);
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
//# sourceMappingURL=processManager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"processManager.js","sourceRoot":"","sources":["../../src/utils/processManager.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,OAAO,EAAE,KAAK,EAAgB,MAAM,eAAe,CAAC;AAapD,4CAA4C;AAC5C,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAyB,CAAC;AAE1D;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAc,EACd,WAAmB,EACnB,MAAoB;IAEpB,OAAO,CAAC,GAAG,CAAC,gCAAgC,MAAM,eAAe,EAAE,MAAM,CAAC,CAAC;IAE3E,IAAI,CAAC;QACH,uCAAuC;QACvC,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,2BAA2B,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;YAC/D,MAAM,UAAU,CAAC,MAAM,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;QACtD,CAAC;QAED,oBAAoB;QACpB,MAAM,YAAY,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAEnC,OAAO,CAAC,GAAG,CAAC,oBAAoB,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAE7D,+BAA+B;QAC/B,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE;YACzC,GAAG,EAAE,WAAW;YAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,4BAA4B;YAC/D,QAAQ,EAAE,IAAI,EAAE,wBAAwB;YACxC,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,aAAa,EAAE;SACjD,CAAC,CAAC;QAEH,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,2CAA2C,MAAM,EAAE,CAAC,CAAC;QACvE,CAAC;QAED,MAAM,WAAW,GAAkB;YACjC,GAAG,EAAE,aAAa,CAAC,GAAG;YACtB,MAAM;YACN,OAAO,EAAE,MAAM,CAAC,UAAU;YAC1B,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,MAAM,EAAE,UAAU;YAClB,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,OAAO,EAAE,aAAa;SACvB,CAAC;QAEF,+BAA+B;QAC/B,gBAAgB,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAE1C,gCAAgC;QAChC,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YAC7B,OAAO,CAAC,GAAG,CAAC,2BAA2B,MAAM,UAAU,aAAa,CAAC,GAAG,GAAG,CAAC,CAAC;YAC7E,WAAW,CAAC,MAAM,GAAG,SAAS,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAClC,OAAO,CAAC,KAAK,CAAC,yBAAyB,MAAM,GAAG,EAAE,KAAK,CAAC,CAAC;YACzD,WAAW,CAAC,MAAM,GAAG,SAAS,CAAC;YAC/B,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YACxC,OAAO,CAAC,GAAG,CAAC,0BAA0B,MAAM,WAAW,IAAI,aAAa,MAAM,GAAG,CAAC,CAAC;YACnF,WAAW,CAAC,MAAM,GAAG,SAAS,CAAC;YAC/B,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,kCAAkC;QAClC,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;YACzB,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;gBACvC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;gBACtC,IAAI,MAAM,EAAE,CAAC;oBACX,OAAO,CAAC,GAAG,CAAC,IAAI,MAAM,aAAa,MAAM,EAAE,CAAC,CAAC;gBAC/C,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;YACzB,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;gBACvC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;gBACtC,IAAI,MAAM,EAAE,CAAC;oBACX,OAAO,CAAC,GAAG,CAAC,IAAI,MAAM,aAAa,MAAM,EAAE,CAAC,CAAC;gBAC/C,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAED,qCAAqC;QACrC,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QAExD,4CAA4C;QAC5C,IAAI,WAAW,CAAC,MAAM,KAAK,UAAU,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;YAC/D,WAAW,CAAC,MAAM,GAAG,SAAS,CAAC;QACjC,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,4CAA4C,MAAM,UAAU,aAAa,CAAC,GAAG,GAAG,CAAC,CAAC;QAC9F,OAAO,WAAW,CAAC;IAErB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,QAAQ,GAAG,uCAAuC,MAAM,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5H,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAAc;IAChD,MAAM,WAAW,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAEjD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,oCAAoC,MAAM,EAAE,CAAC,CAAC;QAC3D,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,4BAA4B,MAAM,UAAU,WAAW,CAAC,GAAG,GAAG,CAAC,CAAC;QAE5E,8BAA8B;QAC9B,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAEpC,sCAAsC;QACtC,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QAExD,8BAA8B;QAC9B,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAChC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtC,CAAC;QAED,WAAW,CAAC,MAAM,GAAG,SAAS,CAAC;QAC/B,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAEhC,OAAO,CAAC,GAAG,CAAC,2BAA2B,MAAM,EAAE,CAAC,CAAC;QACjD,OAAO,IAAI,CAAC;IAEd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,kCAAkC,MAAM,GAAG,EAAE,KAAK,CAAC,CAAC;QAClE,iDAAiD;QACjD,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAChC,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,OAAO,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC;IAEpD,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC,MAAM,qBAAqB,CAAC,CAAC;IAE7D,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;IAClE,MAAM,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAEhC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,UAAU,CAAC,OAAe,EAAE,GAAW;IACpD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAEzD,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;gBACjC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5B,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;gBACjC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5B,CAAC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YAC3B,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,OAAO,EAAE,CAAC;YACZ,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,KAAK,CAAC,4BAA4B,IAAI,KAAK,MAAM,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC;YAC7E,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,263 +0,0 @@
|
|
|
1
|
-
// src/utils/reliability.ts
|
|
2
|
-
import { mcpLogger } from "../services/mcpLogger.js";
|
|
3
|
-
export class RetryableError extends Error {
|
|
4
|
-
constructor(message, originalError) {
|
|
5
|
-
super(message);
|
|
6
|
-
this.originalError = originalError;
|
|
7
|
-
this.name = 'RetryableError';
|
|
8
|
-
}
|
|
9
|
-
}
|
|
10
|
-
export class NonRetryableError extends Error {
|
|
11
|
-
constructor(message, originalError) {
|
|
12
|
-
super(message);
|
|
13
|
-
this.originalError = originalError;
|
|
14
|
-
this.name = 'NonRetryableError';
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
export class CircuitBreakerOpenError extends Error {
|
|
18
|
-
constructor(message = 'Circuit breaker is open') {
|
|
19
|
-
super(message);
|
|
20
|
-
this.name = 'CircuitBreakerOpenError';
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
export class TimeoutError extends Error {
|
|
24
|
-
constructor(message = 'Operation timed out') {
|
|
25
|
-
super(message);
|
|
26
|
-
this.name = 'TimeoutError';
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
export function isRetryableError(error) {
|
|
30
|
-
if (error instanceof NonRetryableError)
|
|
31
|
-
return false;
|
|
32
|
-
if (error instanceof RetryableError)
|
|
33
|
-
return true;
|
|
34
|
-
// Network and system errors are generally retryable
|
|
35
|
-
const retryablePatterns = [
|
|
36
|
-
/ECONNRESET/,
|
|
37
|
-
/ENOTFOUND/,
|
|
38
|
-
/ECONNREFUSED/,
|
|
39
|
-
/ETIMEDOUT/,
|
|
40
|
-
/ENOENT/,
|
|
41
|
-
/EMFILE/,
|
|
42
|
-
/ENFILE/,
|
|
43
|
-
/socket hang up/i,
|
|
44
|
-
/network timeout/i,
|
|
45
|
-
/service unavailable/i,
|
|
46
|
-
/temporary failure/i
|
|
47
|
-
];
|
|
48
|
-
return retryablePatterns.some(pattern => pattern.test(error.message));
|
|
49
|
-
}
|
|
50
|
-
export async function withRetry(operation, options = {}) {
|
|
51
|
-
const config = {
|
|
52
|
-
maxAttempts: 3,
|
|
53
|
-
baseDelay: 1000,
|
|
54
|
-
maxDelay: 30000,
|
|
55
|
-
backoffFactor: 2,
|
|
56
|
-
retryCondition: isRetryableError,
|
|
57
|
-
...options
|
|
58
|
-
};
|
|
59
|
-
let lastError;
|
|
60
|
-
for (let attempt = 1; attempt <= config.maxAttempts; attempt++) {
|
|
61
|
-
try {
|
|
62
|
-
return await operation();
|
|
63
|
-
}
|
|
64
|
-
catch (error) {
|
|
65
|
-
lastError = error instanceof Error ? error : new Error(String(error));
|
|
66
|
-
// Don't retry on last attempt or non-retryable errors
|
|
67
|
-
if (attempt === config.maxAttempts || !config.retryCondition(lastError)) {
|
|
68
|
-
throw lastError;
|
|
69
|
-
}
|
|
70
|
-
// Calculate delay with exponential backoff
|
|
71
|
-
const delay = Math.min(config.baseDelay * Math.pow(config.backoffFactor, attempt - 1), config.maxDelay);
|
|
72
|
-
// Add jitter to prevent thundering herd
|
|
73
|
-
const jitteredDelay = delay + Math.random() * delay * 0.1;
|
|
74
|
-
if (config.onRetry) {
|
|
75
|
-
config.onRetry(attempt, lastError);
|
|
76
|
-
}
|
|
77
|
-
await mcpLogger.info(`Retrying operation (attempt ${attempt}/${config.maxAttempts}) after ${Math.round(jitteredDelay)}ms: ${lastError.message}`);
|
|
78
|
-
await new Promise(resolve => setTimeout(resolve, jitteredDelay));
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
throw lastError;
|
|
82
|
-
}
|
|
83
|
-
export async function withTimeout(operation, options) {
|
|
84
|
-
const controller = new AbortController();
|
|
85
|
-
const timeoutId = setTimeout(() => controller.abort(), options.timeout);
|
|
86
|
-
// Combine with external signal if provided
|
|
87
|
-
if (options.signal) {
|
|
88
|
-
options.signal.addEventListener('abort', () => controller.abort());
|
|
89
|
-
}
|
|
90
|
-
try {
|
|
91
|
-
const result = await Promise.race([
|
|
92
|
-
operation(),
|
|
93
|
-
new Promise((_, reject) => {
|
|
94
|
-
controller.signal.addEventListener('abort', () => {
|
|
95
|
-
reject(new TimeoutError(`Operation timed out after ${options.timeout}ms`));
|
|
96
|
-
});
|
|
97
|
-
})
|
|
98
|
-
]);
|
|
99
|
-
clearTimeout(timeoutId);
|
|
100
|
-
return result;
|
|
101
|
-
}
|
|
102
|
-
catch (error) {
|
|
103
|
-
clearTimeout(timeoutId);
|
|
104
|
-
throw error;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
export class CircuitBreaker {
|
|
108
|
-
constructor(options) {
|
|
109
|
-
this.options = options;
|
|
110
|
-
this.failures = 0;
|
|
111
|
-
this.lastFailureTime = 0;
|
|
112
|
-
this.state = 'closed';
|
|
113
|
-
this.nextAttemptTime = 0;
|
|
114
|
-
}
|
|
115
|
-
async execute(operation) {
|
|
116
|
-
if (this.state === 'open') {
|
|
117
|
-
if (Date.now() < this.nextAttemptTime) {
|
|
118
|
-
throw new CircuitBreakerOpenError();
|
|
119
|
-
}
|
|
120
|
-
this.state = 'half-open';
|
|
121
|
-
}
|
|
122
|
-
try {
|
|
123
|
-
const result = await operation();
|
|
124
|
-
this.onSuccess();
|
|
125
|
-
return result;
|
|
126
|
-
}
|
|
127
|
-
catch (error) {
|
|
128
|
-
this.onFailure();
|
|
129
|
-
throw error;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
onSuccess() {
|
|
133
|
-
this.failures = 0;
|
|
134
|
-
this.state = 'closed';
|
|
135
|
-
}
|
|
136
|
-
onFailure() {
|
|
137
|
-
this.failures++;
|
|
138
|
-
this.lastFailureTime = Date.now();
|
|
139
|
-
if (this.failures >= this.options.threshold) {
|
|
140
|
-
this.state = 'open';
|
|
141
|
-
this.nextAttemptTime = Date.now() + this.options.resetTimeout;
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
getState() {
|
|
145
|
-
return {
|
|
146
|
-
state: this.state,
|
|
147
|
-
failures: this.failures,
|
|
148
|
-
nextAttemptTime: this.state === 'open' ? this.nextAttemptTime : undefined
|
|
149
|
-
};
|
|
150
|
-
}
|
|
151
|
-
reset() {
|
|
152
|
-
this.failures = 0;
|
|
153
|
-
this.state = 'closed';
|
|
154
|
-
this.nextAttemptTime = 0;
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
export function createCircuitBreaker(options = {}) {
|
|
158
|
-
const config = {
|
|
159
|
-
threshold: 5,
|
|
160
|
-
timeout: 60000,
|
|
161
|
-
resetTimeout: 60000,
|
|
162
|
-
monitoringPeriod: 60000,
|
|
163
|
-
...options
|
|
164
|
-
};
|
|
165
|
-
return new CircuitBreaker(config);
|
|
166
|
-
}
|
|
167
|
-
export async function withCircuitBreaker(operation, circuitBreaker) {
|
|
168
|
-
return await circuitBreaker.execute(operation);
|
|
169
|
-
}
|
|
170
|
-
export function createReliableOperation(operation, options = {}) {
|
|
171
|
-
return async () => {
|
|
172
|
-
let wrappedOperation = operation;
|
|
173
|
-
// Apply timeout wrapper
|
|
174
|
-
if (options.timeout) {
|
|
175
|
-
const timeoutOptions = options.timeout;
|
|
176
|
-
wrappedOperation = () => withTimeout(operation, timeoutOptions);
|
|
177
|
-
}
|
|
178
|
-
// Apply circuit breaker wrapper
|
|
179
|
-
if (options.circuitBreaker) {
|
|
180
|
-
const cb = options.circuitBreaker;
|
|
181
|
-
const timeoutOperation = wrappedOperation;
|
|
182
|
-
wrappedOperation = () => withCircuitBreaker(timeoutOperation, cb);
|
|
183
|
-
}
|
|
184
|
-
// Apply retry wrapper (outermost to retry the entire chain)
|
|
185
|
-
if (options.retry) {
|
|
186
|
-
return await withRetry(wrappedOperation, options.retry);
|
|
187
|
-
}
|
|
188
|
-
return await wrappedOperation();
|
|
189
|
-
};
|
|
190
|
-
}
|
|
191
|
-
export class HealthChecker {
|
|
192
|
-
constructor() {
|
|
193
|
-
this.checks = new Map();
|
|
194
|
-
this.lastResults = new Map();
|
|
195
|
-
}
|
|
196
|
-
register(name, check) {
|
|
197
|
-
this.checks.set(name, check);
|
|
198
|
-
}
|
|
199
|
-
async checkHealth(name) {
|
|
200
|
-
const results = {};
|
|
201
|
-
const checksToRun = name ?
|
|
202
|
-
(this.checks.has(name) ? [[name, this.checks.get(name)]] : []) :
|
|
203
|
-
Array.from(this.checks.entries());
|
|
204
|
-
await Promise.allSettled(checksToRun.map(async ([checkName, checkFn]) => {
|
|
205
|
-
try {
|
|
206
|
-
const healthy = await withTimeout(() => checkFn(), { timeout: 5000 });
|
|
207
|
-
const result = { healthy, timestamp: Date.now() };
|
|
208
|
-
this.lastResults.set(checkName, result);
|
|
209
|
-
results[checkName] = result;
|
|
210
|
-
}
|
|
211
|
-
catch (error) {
|
|
212
|
-
const result = {
|
|
213
|
-
healthy: false,
|
|
214
|
-
timestamp: Date.now(),
|
|
215
|
-
error: error instanceof Error ? error.message : String(error)
|
|
216
|
-
};
|
|
217
|
-
this.lastResults.set(checkName, result);
|
|
218
|
-
results[checkName] = result;
|
|
219
|
-
}
|
|
220
|
-
}));
|
|
221
|
-
return results;
|
|
222
|
-
}
|
|
223
|
-
getLastResults() {
|
|
224
|
-
return Object.fromEntries(this.lastResults);
|
|
225
|
-
}
|
|
226
|
-
isHealthy() {
|
|
227
|
-
return Array.from(this.lastResults.values()).every(result => result.healthy);
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
export const globalHealthChecker = new HealthChecker();
|
|
231
|
-
// Utility functions for common operations
|
|
232
|
-
export const reliableFileOperation = (operation, options = {}) => {
|
|
233
|
-
return withRetry(operation, {
|
|
234
|
-
maxAttempts: 3,
|
|
235
|
-
baseDelay: 500,
|
|
236
|
-
retryCondition: (error) => {
|
|
237
|
-
// File system operations are usually retryable except for permission errors
|
|
238
|
-
return isRetryableError(error) && !error.message.includes('EACCES');
|
|
239
|
-
},
|
|
240
|
-
...options
|
|
241
|
-
});
|
|
242
|
-
};
|
|
243
|
-
export const reliableNetworkOperation = (operation, options = {}) => {
|
|
244
|
-
return withRetry(operation, {
|
|
245
|
-
maxAttempts: 5,
|
|
246
|
-
baseDelay: 1000,
|
|
247
|
-
maxDelay: 10000,
|
|
248
|
-
retryCondition: isRetryableError,
|
|
249
|
-
...options
|
|
250
|
-
});
|
|
251
|
-
};
|
|
252
|
-
export const reliableProcessOperation = (operation, options = {}) => {
|
|
253
|
-
return withRetry(operation, {
|
|
254
|
-
maxAttempts: 2,
|
|
255
|
-
baseDelay: 2000,
|
|
256
|
-
retryCondition: (error) => {
|
|
257
|
-
// Process operations might be retryable if it's a temporary resource issue
|
|
258
|
-
return isRetryableError(error) && !error.message.includes('No such file');
|
|
259
|
-
},
|
|
260
|
-
...options
|
|
261
|
-
});
|
|
262
|
-
};
|
|
263
|
-
//# sourceMappingURL=reliability.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reliability.js","sourceRoot":"","sources":["../../src/utils/reliability.ts"],"names":[],"mappings":"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"}
|