bobs-workshop 0.3.3 → 3.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. package/LICENSE +2 -2
  2. package/README.md +199 -210
  3. package/bin/bobs-workshop.js +109 -0
  4. package/config/agents.json +27 -0
  5. package/dist/plugins/bobs-workshop.js +34 -0
  6. package/dist/tools/background-agent/cancel.d.ts +3 -0
  7. package/dist/tools/background-agent/cancel.d.ts.map +1 -0
  8. package/dist/tools/background-agent/cancel.js +52 -0
  9. package/dist/tools/background-agent/concurrency.d.ts +15 -0
  10. package/dist/tools/background-agent/concurrency.d.ts.map +1 -0
  11. package/dist/tools/background-agent/concurrency.js +61 -0
  12. package/dist/tools/background-agent/index.d.ts +8 -0
  13. package/dist/tools/background-agent/index.d.ts.map +1 -0
  14. package/dist/tools/background-agent/index.js +7 -0
  15. package/dist/tools/background-agent/launch.d.ts +6 -0
  16. package/dist/tools/background-agent/launch.d.ts.map +1 -0
  17. package/dist/tools/background-agent/launch.js +33 -0
  18. package/dist/tools/background-agent/list.d.ts +7 -0
  19. package/dist/tools/background-agent/list.d.ts.map +1 -0
  20. package/dist/tools/background-agent/list.js +40 -0
  21. package/dist/tools/background-agent/manager.d.ts +29 -0
  22. package/dist/tools/background-agent/manager.d.ts.map +1 -0
  23. package/dist/tools/background-agent/manager.js +388 -0
  24. package/dist/tools/background-agent/output.d.ts +3 -0
  25. package/dist/tools/background-agent/output.d.ts.map +1 -0
  26. package/dist/tools/background-agent/output.js +41 -0
  27. package/dist/tools/background-agent/types.d.ts +46 -0
  28. package/dist/tools/background-agent/types.d.ts.map +1 -0
  29. package/dist/tools/background-agent/types.js +1 -0
  30. package/dist/tools/index.d.ts +9 -0
  31. package/dist/tools/index.d.ts.map +1 -0
  32. package/dist/tools/index.js +8 -0
  33. package/dist/tools/manual/index.d.ts +3 -0
  34. package/dist/tools/manual/index.d.ts.map +1 -0
  35. package/dist/tools/manual/index.js +2 -0
  36. package/dist/tools/manual/manual-update.d.ts +4 -0
  37. package/dist/tools/manual/manual-update.d.ts.map +1 -0
  38. package/dist/tools/manual/manual-update.js +190 -0
  39. package/dist/tools/manual/verify-manual.d.ts +4 -0
  40. package/dist/tools/manual/verify-manual.d.ts.map +1 -0
  41. package/dist/tools/manual/verify-manual.js +51 -0
  42. package/package.json +34 -66
  43. package/postinstall.js +193 -0
  44. package/src/agents/alice.md +466 -0
  45. package/src/agents/bob-rev.md +493 -0
  46. package/src/agents/bob-send.md +277 -0
  47. package/src/agents/bob.md +442 -0
  48. package/src/agents/trace.md +451 -0
  49. package/src/plugins/bobs-workshop.ts +45 -0
  50. package/src/skills/api-patterns/SKILL.md +376 -0
  51. package/src/skills/architecture/SKILL.md +271 -0
  52. package/src/skills/bobs-workshop/performance/icon.svg +3 -0
  53. package/src/skills/brainstorming/SKILL.md +210 -0
  54. package/src/skills/clean-code/SKILL.md +151 -0
  55. package/src/skills/code-review-checklist/SKILL.md +220 -0
  56. package/src/skills/database-design/SKILL.md +271 -0
  57. package/src/skills/exploration/SKILL.md +257 -0
  58. package/src/skills/frontend-ui-ux/SKILL.md +78 -0
  59. package/src/skills/git-master/SKILL.md +1105 -0
  60. package/src/skills/performance/SKILL.md +144 -0
  61. package/src/skills/performance/icon.svg +3 -0
  62. package/src/skills/plan-writing/SKILL.md +225 -0
  63. package/src/skills/security/SKILL.md +410 -0
  64. package/src/skills/simplification/SKILL.md +238 -0
  65. package/src/skills/systematic-debugging/SKILL.md +175 -0
  66. package/src/skills/testing-patterns/SKILL.md +305 -0
  67. package/src/skills/verification/SKILL.md +286 -0
  68. package/src/tools/background-agent/cancel.ts +67 -0
  69. package/src/tools/background-agent/concurrency.ts +71 -0
  70. package/src/tools/background-agent/index.ts +7 -0
  71. package/src/tools/background-agent/launch.ts +39 -0
  72. package/src/tools/background-agent/list.ts +50 -0
  73. package/src/tools/background-agent/manager.ts +466 -0
  74. package/src/tools/background-agent/output.ts +57 -0
  75. package/src/tools/background-agent/types.ts +55 -0
  76. package/src/tools/index.ts +8 -0
  77. package/src/tools/manual/index.ts +2 -0
  78. package/src/tools/manual/manual-update.ts +197 -0
  79. package/src/tools/manual/verify-manual.ts +60 -0
  80. package/uninstall.js +64 -0
  81. package/Claude.md +0 -162
  82. package/bin/bobs-mcp-server.js +0 -11
  83. package/bin/bobs-mcp.js +0 -130
  84. package/dist/api/taskLogger.js +0 -106
  85. package/dist/api/taskLogger.js.map +0 -1
  86. package/dist/cli/checker.js +0 -401
  87. package/dist/cli/checker.js.map +0 -1
  88. package/dist/cli/cleanup.js +0 -131
  89. package/dist/cli/cleanup.js.map +0 -1
  90. package/dist/cli/debug.js +0 -157
  91. package/dist/cli/debug.js.map +0 -1
  92. package/dist/cli/health.js +0 -97
  93. package/dist/cli/health.js.map +0 -1
  94. package/dist/cli/setup.js +0 -81
  95. package/dist/cli/setup.js.map +0 -1
  96. package/dist/cli/workshop.js +0 -42
  97. package/dist/cli/workshop.js.map +0 -1
  98. package/dist/dashboard/server.js +0 -1203
  99. package/dist/dashboard/server.js.map +0 -1
  100. package/dist/index.js +0 -960
  101. package/dist/index.js.map +0 -1
  102. package/dist/prompts/architect.js +0 -221
  103. package/dist/prompts/architect.js.map +0 -1
  104. package/dist/prompts/debugger.js +0 -257
  105. package/dist/prompts/debugger.js.map +0 -1
  106. package/dist/prompts/engineer.js +0 -249
  107. package/dist/prompts/engineer.js.map +0 -1
  108. package/dist/prompts/orchestrator.js +0 -304
  109. package/dist/prompts/orchestrator.js.map +0 -1
  110. package/dist/prompts/reviewer.js +0 -289
  111. package/dist/prompts/reviewer.js.map +0 -1
  112. package/dist/services/activitySummarizer.js +0 -388
  113. package/dist/services/activitySummarizer.js.map +0 -1
  114. package/dist/services/changeValidator.js +0 -396
  115. package/dist/services/changeValidator.js.map +0 -1
  116. package/dist/services/claudeOrchestrator.js +0 -343
  117. package/dist/services/claudeOrchestrator.js.map +0 -1
  118. package/dist/services/fileMonitor.js +0 -250
  119. package/dist/services/fileMonitor.js.map +0 -1
  120. package/dist/services/implementationSummarizer.js +0 -306
  121. package/dist/services/implementationSummarizer.js.map +0 -1
  122. package/dist/services/liveMonitor.js +0 -315
  123. package/dist/services/liveMonitor.js.map +0 -1
  124. package/dist/services/mcpAuditLogger.js +0 -104
  125. package/dist/services/mcpAuditLogger.js.map +0 -1
  126. package/dist/services/mcpLogger.js +0 -223
  127. package/dist/services/mcpLogger.js.map +0 -1
  128. package/dist/services/tmuxManager.js +0 -541
  129. package/dist/services/tmuxManager.js.map +0 -1
  130. package/dist/tools/approvalTools.js +0 -244
  131. package/dist/tools/approvalTools.js.map +0 -1
  132. package/dist/tools/autoDebugger.js +0 -147
  133. package/dist/tools/autoDebugger.js.map +0 -1
  134. package/dist/tools/cleanupService.js +0 -221
  135. package/dist/tools/cleanupService.js.map +0 -1
  136. package/dist/tools/dashboardTools.js +0 -342
  137. package/dist/tools/dashboardTools.js.map +0 -1
  138. package/dist/tools/developmentNudges.js +0 -336
  139. package/dist/tools/developmentNudges.js.map +0 -1
  140. package/dist/tools/gitTools.js +0 -741
  141. package/dist/tools/gitTools.js.map +0 -1
  142. package/dist/tools/orchestratorTools.js +0 -832
  143. package/dist/tools/orchestratorTools.js.map +0 -1
  144. package/dist/tools/searchCache.js +0 -64
  145. package/dist/tools/searchCache.js.map +0 -1
  146. package/dist/tools/searchTools.js +0 -1107
  147. package/dist/tools/searchTools.js.map +0 -1
  148. package/dist/tools/semgrep-patterns.js +0 -296
  149. package/dist/tools/semgrep-patterns.js.map +0 -1
  150. package/dist/tools/specTools.js +0 -332
  151. package/dist/tools/specTools.js.map +0 -1
  152. package/dist/tools/structural/__tests__/orchestrator.test.js +0 -61
  153. package/dist/tools/structural/__tests__/orchestrator.test.js.map +0 -1
  154. package/dist/tools/structural/cache.js +0 -226
  155. package/dist/tools/structural/cache.js.map +0 -1
  156. package/dist/tools/structural/engines/python/index.js +0 -118
  157. package/dist/tools/structural/engines/python/index.js.map +0 -1
  158. package/dist/tools/structural/engines/typescript/__tests__/typescript-engine.test.js +0 -97
  159. package/dist/tools/structural/engines/typescript/__tests__/typescript-engine.test.js.map +0 -1
  160. package/dist/tools/structural/engines/typescript/analyzer.js +0 -433
  161. package/dist/tools/structural/engines/typescript/analyzer.js.map +0 -1
  162. package/dist/tools/structural/engines/typescript/index.js +0 -381
  163. package/dist/tools/structural/engines/typescript/index.js.map +0 -1
  164. package/dist/tools/structural/engines/typescript/utils.js +0 -279
  165. package/dist/tools/structural/engines/typescript/utils.js.map +0 -1
  166. package/dist/tools/structural/index.js +0 -248
  167. package/dist/tools/structural/index.js.map +0 -1
  168. package/dist/tools/structural/types.js +0 -18
  169. package/dist/tools/structural/types.js.map +0 -1
  170. package/dist/tools/tmuxTools.js +0 -100
  171. package/dist/tools/tmuxTools.js.map +0 -1
  172. package/dist/tools/workRecorder.js +0 -215
  173. package/dist/tools/workRecorder.js.map +0 -1
  174. package/dist/tools/worktreeTools.js +0 -705
  175. package/dist/tools/worktreeTools.js.map +0 -1
  176. package/dist/utils/__tests__/integration.test.js +0 -57
  177. package/dist/utils/__tests__/integration.test.js.map +0 -1
  178. package/dist/utils/__tests__/serverDetection.test.js +0 -151
  179. package/dist/utils/__tests__/serverDetection.test.js.map +0 -1
  180. package/dist/utils/errorHandling.js +0 -336
  181. package/dist/utils/errorHandling.js.map +0 -1
  182. package/dist/utils/processManager.js +0 -172
  183. package/dist/utils/processManager.js.map +0 -1
  184. package/dist/utils/reliability.js +0 -263
  185. package/dist/utils/reliability.js.map +0 -1
  186. package/dist/utils/responseFormatter.js +0 -250
  187. package/dist/utils/responseFormatter.js.map +0 -1
  188. package/dist/utils/serverDetection.js +0 -133
  189. package/dist/utils/serverDetection.js.map +0 -1
  190. package/dist/utils/specMigration.js +0 -105
  191. package/dist/utils/specMigration.js.map +0 -1
  192. package/dist/validation/schemas.js +0 -299
  193. package/dist/validation/schemas.js.map +0 -1
  194. package/public/.well-known/mcp/manifest.json +0 -473
  195. package/public/index.html +0 -3157
  196. package/public/index.html.backup +0 -2805
  197. package/public/index.html.backup2 +0 -1292
  198. package/scripts/cleanup-system-logs.ts +0 -121
  199. package/scripts/init-workspace.js +0 -63
  200. 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":"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"}
@@ -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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"}