@claude-flow/cli 3.0.0-alpha.29 → 3.0.0-alpha.30
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/dist/src/commands/daemon.d.ts.map +1 -1
- package/dist/src/commands/daemon.js +33 -9
- package/dist/src/commands/daemon.js.map +1 -1
- package/dist/src/init/settings-generator.d.ts.map +1 -1
- package/dist/src/init/settings-generator.js +7 -6
- package/dist/src/init/settings-generator.js.map +1 -1
- package/dist/src/services/container-worker-pool.d.ts +197 -0
- package/dist/src/services/container-worker-pool.d.ts.map +1 -0
- package/dist/src/services/container-worker-pool.js +581 -0
- package/dist/src/services/container-worker-pool.js.map +1 -0
- package/dist/src/services/headless-worker-executor.d.ts +304 -0
- package/dist/src/services/headless-worker-executor.d.ts.map +1 -0
- package/dist/src/services/headless-worker-executor.js +997 -0
- package/dist/src/services/headless-worker-executor.js.map +1 -0
- package/dist/src/services/index.d.ts +6 -0
- package/dist/src/services/index.d.ts.map +1 -1
- package/dist/src/services/index.js +5 -0
- package/dist/src/services/index.js.map +1 -1
- package/dist/src/services/worker-daemon.d.ts +55 -5
- package/dist/src/services/worker-daemon.d.ts.map +1 -1
- package/dist/src/services/worker-daemon.js +191 -13
- package/dist/src/services/worker-daemon.js.map +1 -1
- package/dist/src/services/worker-queue.d.ts +194 -0
- package/dist/src/services/worker-queue.d.ts.map +1 -0
- package/dist/src/services/worker-queue.js +511 -0
- package/dist/src/services/worker-queue.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,581 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Container Worker Pool
|
|
3
|
+
* Docker-based worker pool for high-throughput headless execution.
|
|
4
|
+
*
|
|
5
|
+
* ADR-020: Headless Worker Integration Architecture - Phase 3
|
|
6
|
+
* - Manages pool of Docker containers for isolated worker execution
|
|
7
|
+
* - Supports dynamic scaling based on workload
|
|
8
|
+
* - Provides container lifecycle management
|
|
9
|
+
* - Integrates with WorkerQueue for task distribution
|
|
10
|
+
*
|
|
11
|
+
* Key Features:
|
|
12
|
+
* - Container pooling with configurable size
|
|
13
|
+
* - Health checking and auto-recovery
|
|
14
|
+
* - Resource limits (CPU, memory)
|
|
15
|
+
* - Volume mounting for workspace access
|
|
16
|
+
* - Network isolation per worker type
|
|
17
|
+
*/
|
|
18
|
+
import { EventEmitter } from 'events';
|
|
19
|
+
import { spawn, exec } from 'child_process';
|
|
20
|
+
import { promisify } from 'util';
|
|
21
|
+
import { existsSync, mkdirSync } from 'fs';
|
|
22
|
+
import { join } from 'path';
|
|
23
|
+
const execAsync = promisify(exec);
|
|
24
|
+
// ============================================
|
|
25
|
+
// Constants
|
|
26
|
+
// ============================================
|
|
27
|
+
const DEFAULT_CONFIG = {
|
|
28
|
+
maxContainers: 3,
|
|
29
|
+
minContainers: 1,
|
|
30
|
+
image: 'ghcr.io/ruvnet/claude-flow-headless:latest',
|
|
31
|
+
resources: {
|
|
32
|
+
cpus: '2',
|
|
33
|
+
memory: '4g',
|
|
34
|
+
},
|
|
35
|
+
healthCheckIntervalMs: 30000,
|
|
36
|
+
idleTimeoutMs: 300000, // 5 minutes
|
|
37
|
+
workspacePath: '/workspace',
|
|
38
|
+
statePath: '.claude-flow/container-pool',
|
|
39
|
+
defaultSandbox: 'strict',
|
|
40
|
+
};
|
|
41
|
+
// ============================================
|
|
42
|
+
// ContainerWorkerPool Class
|
|
43
|
+
// ============================================
|
|
44
|
+
/**
|
|
45
|
+
* ContainerWorkerPool - Manages Docker containers for headless worker execution
|
|
46
|
+
*/
|
|
47
|
+
export class ContainerWorkerPool extends EventEmitter {
|
|
48
|
+
config;
|
|
49
|
+
projectRoot;
|
|
50
|
+
containers = new Map();
|
|
51
|
+
taskQueue = [];
|
|
52
|
+
healthCheckTimer;
|
|
53
|
+
idleCheckTimer;
|
|
54
|
+
dockerAvailable = null;
|
|
55
|
+
initialized = false;
|
|
56
|
+
isShuttingDown = false;
|
|
57
|
+
exitHandlersRegistered = false;
|
|
58
|
+
constructor(projectRoot, config) {
|
|
59
|
+
super();
|
|
60
|
+
this.projectRoot = projectRoot;
|
|
61
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
62
|
+
// Ensure state directory exists
|
|
63
|
+
const stateDir = join(projectRoot, this.config.statePath);
|
|
64
|
+
if (!existsSync(stateDir)) {
|
|
65
|
+
mkdirSync(stateDir, { recursive: true });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// ============================================
|
|
69
|
+
// Public API
|
|
70
|
+
// ============================================
|
|
71
|
+
/**
|
|
72
|
+
* Initialize the container pool
|
|
73
|
+
*/
|
|
74
|
+
async initialize() {
|
|
75
|
+
if (this.initialized) {
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
// Check Docker availability
|
|
79
|
+
this.dockerAvailable = await this.checkDockerAvailable();
|
|
80
|
+
if (!this.dockerAvailable) {
|
|
81
|
+
this.emit('warning', { message: 'Docker not available - container pool disabled' });
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
// Pull image if needed
|
|
85
|
+
await this.ensureImage();
|
|
86
|
+
// Create minimum containers
|
|
87
|
+
await this.scaleToMinimum();
|
|
88
|
+
// Start health check timer
|
|
89
|
+
this.startHealthChecks();
|
|
90
|
+
// Start idle check timer
|
|
91
|
+
this.startIdleChecks();
|
|
92
|
+
// Register exit handlers for cleanup
|
|
93
|
+
this.registerExitHandlers();
|
|
94
|
+
this.initialized = true;
|
|
95
|
+
this.emit('initialized', { containers: this.containers.size });
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Register process exit handlers to clean up containers
|
|
100
|
+
*/
|
|
101
|
+
registerExitHandlers() {
|
|
102
|
+
if (this.exitHandlersRegistered)
|
|
103
|
+
return;
|
|
104
|
+
const cleanup = async () => {
|
|
105
|
+
if (!this.isShuttingDown) {
|
|
106
|
+
await this.shutdown();
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
process.once('SIGTERM', cleanup);
|
|
110
|
+
process.once('SIGINT', cleanup);
|
|
111
|
+
process.once('beforeExit', cleanup);
|
|
112
|
+
this.exitHandlersRegistered = true;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Execute a worker in a container
|
|
116
|
+
*/
|
|
117
|
+
async execute(options) {
|
|
118
|
+
if (!this.initialized) {
|
|
119
|
+
await this.initialize();
|
|
120
|
+
}
|
|
121
|
+
if (!this.dockerAvailable) {
|
|
122
|
+
return this.createErrorResult(options.workerType, 'Docker not available');
|
|
123
|
+
}
|
|
124
|
+
// Try to get a ready container
|
|
125
|
+
const container = this.getReadyContainer();
|
|
126
|
+
if (container) {
|
|
127
|
+
return this.executeInContainer(container, options);
|
|
128
|
+
}
|
|
129
|
+
// No ready containers - check if we can create more
|
|
130
|
+
if (this.containers.size < this.config.maxContainers) {
|
|
131
|
+
const newContainer = await this.createContainer();
|
|
132
|
+
if (newContainer) {
|
|
133
|
+
return this.executeInContainer(newContainer, options);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// Queue the task
|
|
137
|
+
return new Promise((resolve, reject) => {
|
|
138
|
+
this.taskQueue.push({
|
|
139
|
+
options,
|
|
140
|
+
resolve,
|
|
141
|
+
reject,
|
|
142
|
+
queuedAt: new Date(),
|
|
143
|
+
});
|
|
144
|
+
this.emit('taskQueued', {
|
|
145
|
+
workerType: options.workerType,
|
|
146
|
+
queuePosition: this.taskQueue.length,
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Scale pool for batch execution
|
|
152
|
+
*/
|
|
153
|
+
async scaleForBatch(workerCount) {
|
|
154
|
+
const targetSize = Math.min(workerCount, this.config.maxContainers);
|
|
155
|
+
const currentSize = this.containers.size;
|
|
156
|
+
if (targetSize > currentSize) {
|
|
157
|
+
const toCreate = targetSize - currentSize;
|
|
158
|
+
const createPromises = [];
|
|
159
|
+
for (let i = 0; i < toCreate; i++) {
|
|
160
|
+
createPromises.push(this.createContainer());
|
|
161
|
+
}
|
|
162
|
+
await Promise.all(createPromises);
|
|
163
|
+
this.emit('scaled', { from: currentSize, to: this.containers.size });
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Get pool status
|
|
168
|
+
*/
|
|
169
|
+
getStatus() {
|
|
170
|
+
const containers = Array.from(this.containers.values());
|
|
171
|
+
return {
|
|
172
|
+
totalContainers: containers.length,
|
|
173
|
+
readyContainers: containers.filter(c => c.state === 'ready').length,
|
|
174
|
+
busyContainers: containers.filter(c => c.state === 'busy').length,
|
|
175
|
+
unhealthyContainers: containers.filter(c => c.state === 'unhealthy').length,
|
|
176
|
+
queuedTasks: this.taskQueue.length,
|
|
177
|
+
containers,
|
|
178
|
+
dockerAvailable: this.dockerAvailable ?? false,
|
|
179
|
+
lastHealthCheck: undefined, // Will be set by health check
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Shutdown the pool
|
|
184
|
+
*/
|
|
185
|
+
async shutdown() {
|
|
186
|
+
if (this.isShuttingDown)
|
|
187
|
+
return;
|
|
188
|
+
this.isShuttingDown = true;
|
|
189
|
+
// Stop timers
|
|
190
|
+
if (this.healthCheckTimer) {
|
|
191
|
+
clearInterval(this.healthCheckTimer);
|
|
192
|
+
this.healthCheckTimer = undefined;
|
|
193
|
+
}
|
|
194
|
+
if (this.idleCheckTimer) {
|
|
195
|
+
clearInterval(this.idleCheckTimer);
|
|
196
|
+
this.idleCheckTimer = undefined;
|
|
197
|
+
}
|
|
198
|
+
// Reject queued tasks
|
|
199
|
+
for (const task of this.taskQueue) {
|
|
200
|
+
task.reject(new Error('Pool shutting down'));
|
|
201
|
+
}
|
|
202
|
+
this.taskQueue = [];
|
|
203
|
+
// Terminate all containers with timeout
|
|
204
|
+
const terminatePromises = [];
|
|
205
|
+
for (const [id] of this.containers) {
|
|
206
|
+
terminatePromises.push(this.terminateContainer(id).catch(() => {
|
|
207
|
+
// Ignore errors during shutdown
|
|
208
|
+
}));
|
|
209
|
+
}
|
|
210
|
+
// Wait for all containers with 30s timeout
|
|
211
|
+
await Promise.race([
|
|
212
|
+
Promise.all(terminatePromises),
|
|
213
|
+
new Promise(resolve => setTimeout(resolve, 30000)),
|
|
214
|
+
]);
|
|
215
|
+
this.initialized = false;
|
|
216
|
+
this.emit('shutdown', {});
|
|
217
|
+
}
|
|
218
|
+
// ============================================
|
|
219
|
+
// Private Methods - Container Lifecycle
|
|
220
|
+
// ============================================
|
|
221
|
+
/**
|
|
222
|
+
* Check if Docker is available (async)
|
|
223
|
+
*/
|
|
224
|
+
async checkDockerAvailable() {
|
|
225
|
+
try {
|
|
226
|
+
await execAsync('docker --version', { timeout: 5000 });
|
|
227
|
+
await execAsync('docker info', { timeout: 10000 });
|
|
228
|
+
return true;
|
|
229
|
+
}
|
|
230
|
+
catch {
|
|
231
|
+
return false;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Ensure the container image exists (async)
|
|
236
|
+
*/
|
|
237
|
+
async ensureImage() {
|
|
238
|
+
try {
|
|
239
|
+
await execAsync(`docker image inspect ${this.config.image}`, { timeout: 10000 });
|
|
240
|
+
}
|
|
241
|
+
catch {
|
|
242
|
+
// Image not found, try to pull
|
|
243
|
+
this.emit('imagePull', { image: this.config.image });
|
|
244
|
+
try {
|
|
245
|
+
await execAsync(`docker pull ${this.config.image}`, { timeout: 300000 });
|
|
246
|
+
}
|
|
247
|
+
catch (error) {
|
|
248
|
+
this.emit('warning', { message: `Failed to pull image: ${error}` });
|
|
249
|
+
// Continue anyway - might work with local image
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Create a new container
|
|
255
|
+
*/
|
|
256
|
+
async createContainer() {
|
|
257
|
+
const id = `cf-worker-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
258
|
+
const name = `claude-flow-worker-${id}`;
|
|
259
|
+
const containerInfo = {
|
|
260
|
+
id,
|
|
261
|
+
name,
|
|
262
|
+
state: 'creating',
|
|
263
|
+
createdAt: new Date(),
|
|
264
|
+
executionCount: 0,
|
|
265
|
+
healthCheckFailures: 0,
|
|
266
|
+
};
|
|
267
|
+
this.containers.set(id, containerInfo);
|
|
268
|
+
this.emit('containerCreating', { id, name });
|
|
269
|
+
try {
|
|
270
|
+
// Build docker run command
|
|
271
|
+
const args = [
|
|
272
|
+
'run', '-d',
|
|
273
|
+
'--name', name,
|
|
274
|
+
'--cpus', this.config.resources.cpus,
|
|
275
|
+
'--memory', this.config.resources.memory,
|
|
276
|
+
'-v', `${this.projectRoot}:${this.config.workspacePath}:ro`,
|
|
277
|
+
'-v', `${join(this.projectRoot, this.config.statePath)}:/root/.claude-flow`,
|
|
278
|
+
'-w', this.config.workspacePath,
|
|
279
|
+
];
|
|
280
|
+
// Add environment variables
|
|
281
|
+
const env = {
|
|
282
|
+
...this.config.env,
|
|
283
|
+
ANTHROPIC_API_KEY: process.env.ANTHROPIC_API_KEY || '',
|
|
284
|
+
CLAUDE_CODE_HEADLESS: 'true',
|
|
285
|
+
CLAUDE_CODE_SANDBOX_MODE: this.config.defaultSandbox,
|
|
286
|
+
};
|
|
287
|
+
for (const [key, value] of Object.entries(env)) {
|
|
288
|
+
if (value) {
|
|
289
|
+
args.push('-e', `${key}=${value}`);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
// Add network if specified
|
|
293
|
+
if (this.config.network) {
|
|
294
|
+
args.push('--network', this.config.network);
|
|
295
|
+
}
|
|
296
|
+
// Add image and entrypoint to keep container running
|
|
297
|
+
args.push(this.config.image, 'tail', '-f', '/dev/null');
|
|
298
|
+
// Create the container (async)
|
|
299
|
+
const { stdout } = await execAsync(`docker ${args.join(' ')}`, { timeout: 60000 });
|
|
300
|
+
const containerId = stdout.trim();
|
|
301
|
+
containerInfo.state = 'ready';
|
|
302
|
+
this.emit('containerCreated', { id, name, containerId });
|
|
303
|
+
return containerInfo;
|
|
304
|
+
}
|
|
305
|
+
catch (error) {
|
|
306
|
+
this.containers.delete(id);
|
|
307
|
+
this.emit('containerError', { id, error: String(error) });
|
|
308
|
+
return null;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Terminate a container (async)
|
|
313
|
+
*/
|
|
314
|
+
async terminateContainer(id) {
|
|
315
|
+
const container = this.containers.get(id);
|
|
316
|
+
if (!container)
|
|
317
|
+
return;
|
|
318
|
+
container.state = 'terminated';
|
|
319
|
+
try {
|
|
320
|
+
await execAsync(`docker rm -f ${container.name}`, { timeout: 30000 });
|
|
321
|
+
}
|
|
322
|
+
catch {
|
|
323
|
+
// Ignore removal errors
|
|
324
|
+
}
|
|
325
|
+
this.containers.delete(id);
|
|
326
|
+
this.emit('containerTerminated', { id, name: container.name });
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Get a ready container
|
|
330
|
+
*/
|
|
331
|
+
getReadyContainer() {
|
|
332
|
+
for (const container of this.containers.values()) {
|
|
333
|
+
if (container.state === 'ready') {
|
|
334
|
+
return container;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
return null;
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Scale to minimum containers
|
|
341
|
+
*/
|
|
342
|
+
async scaleToMinimum() {
|
|
343
|
+
const current = this.containers.size;
|
|
344
|
+
const needed = this.config.minContainers - current;
|
|
345
|
+
if (needed > 0) {
|
|
346
|
+
const createPromises = [];
|
|
347
|
+
for (let i = 0; i < needed; i++) {
|
|
348
|
+
createPromises.push(this.createContainer());
|
|
349
|
+
}
|
|
350
|
+
await Promise.all(createPromises);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
// ============================================
|
|
354
|
+
// Private Methods - Execution
|
|
355
|
+
// ============================================
|
|
356
|
+
/**
|
|
357
|
+
* Execute worker in a specific container
|
|
358
|
+
*/
|
|
359
|
+
async executeInContainer(container, options) {
|
|
360
|
+
const startTime = Date.now();
|
|
361
|
+
const executionId = `${options.workerType}_${startTime}_${Math.random().toString(36).slice(2, 8)}`;
|
|
362
|
+
container.state = 'busy';
|
|
363
|
+
container.workerType = options.workerType;
|
|
364
|
+
container.lastUsedAt = new Date();
|
|
365
|
+
this.emit('executionStart', { executionId, containerId: container.id, workerType: options.workerType });
|
|
366
|
+
try {
|
|
367
|
+
// Build the command to run inside container
|
|
368
|
+
const command = this.buildWorkerCommand(options);
|
|
369
|
+
// Execute in container with timeout
|
|
370
|
+
const timeoutMs = options.timeoutMs || 300000;
|
|
371
|
+
const output = await this.execInContainer(container.name, command, timeoutMs);
|
|
372
|
+
container.state = 'ready';
|
|
373
|
+
container.executionCount++;
|
|
374
|
+
const result = {
|
|
375
|
+
success: true,
|
|
376
|
+
output: output,
|
|
377
|
+
parsedOutput: this.tryParseJson(output),
|
|
378
|
+
durationMs: Date.now() - startTime,
|
|
379
|
+
model: options.model || 'sonnet',
|
|
380
|
+
sandboxMode: options.sandbox || this.config.defaultSandbox,
|
|
381
|
+
workerType: options.workerType,
|
|
382
|
+
timestamp: new Date(),
|
|
383
|
+
executionId,
|
|
384
|
+
};
|
|
385
|
+
this.emit('executionComplete', result);
|
|
386
|
+
// Process queue
|
|
387
|
+
this.processQueue();
|
|
388
|
+
return result;
|
|
389
|
+
}
|
|
390
|
+
catch (error) {
|
|
391
|
+
container.state = 'ready';
|
|
392
|
+
const result = this.createErrorResult(options.workerType, error instanceof Error ? error.message : String(error));
|
|
393
|
+
result.executionId = executionId;
|
|
394
|
+
result.durationMs = Date.now() - startTime;
|
|
395
|
+
this.emit('executionError', result);
|
|
396
|
+
// Process queue
|
|
397
|
+
this.processQueue();
|
|
398
|
+
return result;
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* Execute command in container
|
|
403
|
+
*/
|
|
404
|
+
async execInContainer(containerName, command, timeoutMs) {
|
|
405
|
+
return new Promise((resolve, reject) => {
|
|
406
|
+
const args = ['exec', containerName, ...command];
|
|
407
|
+
const child = spawn('docker', args, {
|
|
408
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
409
|
+
});
|
|
410
|
+
let stdout = '';
|
|
411
|
+
let stderr = '';
|
|
412
|
+
let timedOut = false;
|
|
413
|
+
const timeout = setTimeout(() => {
|
|
414
|
+
timedOut = true;
|
|
415
|
+
child.kill('SIGTERM');
|
|
416
|
+
setTimeout(() => {
|
|
417
|
+
if (!child.killed) {
|
|
418
|
+
child.kill('SIGKILL');
|
|
419
|
+
}
|
|
420
|
+
}, 5000);
|
|
421
|
+
}, timeoutMs);
|
|
422
|
+
child.stdout?.on('data', (data) => {
|
|
423
|
+
stdout += data.toString();
|
|
424
|
+
});
|
|
425
|
+
child.stderr?.on('data', (data) => {
|
|
426
|
+
stderr += data.toString();
|
|
427
|
+
});
|
|
428
|
+
child.on('close', (code) => {
|
|
429
|
+
clearTimeout(timeout);
|
|
430
|
+
if (timedOut) {
|
|
431
|
+
reject(new Error(`Execution timed out after ${timeoutMs}ms`));
|
|
432
|
+
return;
|
|
433
|
+
}
|
|
434
|
+
if (code !== 0) {
|
|
435
|
+
reject(new Error(stderr || `Process exited with code ${code}`));
|
|
436
|
+
return;
|
|
437
|
+
}
|
|
438
|
+
resolve(stdout);
|
|
439
|
+
});
|
|
440
|
+
child.on('error', (error) => {
|
|
441
|
+
clearTimeout(timeout);
|
|
442
|
+
reject(error);
|
|
443
|
+
});
|
|
444
|
+
});
|
|
445
|
+
}
|
|
446
|
+
/**
|
|
447
|
+
* Build worker command for container execution
|
|
448
|
+
*/
|
|
449
|
+
buildWorkerCommand(options) {
|
|
450
|
+
// Use npx to run claude-flow daemon trigger
|
|
451
|
+
return [
|
|
452
|
+
'npx', 'claude-flow@v3alpha',
|
|
453
|
+
'daemon', 'trigger',
|
|
454
|
+
'-w', options.workerType,
|
|
455
|
+
'--headless',
|
|
456
|
+
];
|
|
457
|
+
}
|
|
458
|
+
/**
|
|
459
|
+
* Process queued tasks
|
|
460
|
+
*/
|
|
461
|
+
processQueue() {
|
|
462
|
+
while (this.taskQueue.length > 0) {
|
|
463
|
+
const container = this.getReadyContainer();
|
|
464
|
+
if (!container)
|
|
465
|
+
break;
|
|
466
|
+
const task = this.taskQueue.shift();
|
|
467
|
+
if (task) {
|
|
468
|
+
this.executeInContainer(container, task.options)
|
|
469
|
+
.then(task.resolve)
|
|
470
|
+
.catch(task.reject);
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
// ============================================
|
|
475
|
+
// Private Methods - Health & Maintenance
|
|
476
|
+
// ============================================
|
|
477
|
+
/**
|
|
478
|
+
* Start health check timer
|
|
479
|
+
*/
|
|
480
|
+
startHealthChecks() {
|
|
481
|
+
this.healthCheckTimer = setInterval(async () => {
|
|
482
|
+
await this.runHealthChecks();
|
|
483
|
+
}, this.config.healthCheckIntervalMs);
|
|
484
|
+
}
|
|
485
|
+
/**
|
|
486
|
+
* Run health checks on all containers
|
|
487
|
+
*/
|
|
488
|
+
async runHealthChecks() {
|
|
489
|
+
for (const [id, container] of this.containers) {
|
|
490
|
+
if (container.state === 'terminated')
|
|
491
|
+
continue;
|
|
492
|
+
try {
|
|
493
|
+
// Check if container is running (async)
|
|
494
|
+
const { stdout } = await execAsync(`docker inspect -f '{{.State.Running}}' ${container.name}`, { timeout: 10000 });
|
|
495
|
+
const output = stdout.trim();
|
|
496
|
+
if (output !== 'true') {
|
|
497
|
+
container.healthCheckFailures++;
|
|
498
|
+
if (container.healthCheckFailures >= 3) {
|
|
499
|
+
container.state = 'unhealthy';
|
|
500
|
+
this.emit('containerUnhealthy', { id, name: container.name });
|
|
501
|
+
// Remove and replace
|
|
502
|
+
await this.terminateContainer(id);
|
|
503
|
+
if (this.containers.size < this.config.minContainers) {
|
|
504
|
+
await this.createContainer();
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
else {
|
|
509
|
+
container.healthCheckFailures = 0;
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
catch {
|
|
513
|
+
container.healthCheckFailures++;
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
this.emit('healthCheckComplete', { containers: this.containers.size });
|
|
517
|
+
}
|
|
518
|
+
/**
|
|
519
|
+
* Start idle check timer
|
|
520
|
+
*/
|
|
521
|
+
startIdleChecks() {
|
|
522
|
+
this.idleCheckTimer = setInterval(async () => {
|
|
523
|
+
await this.runIdleChecks();
|
|
524
|
+
}, 60000); // Check every minute
|
|
525
|
+
}
|
|
526
|
+
/**
|
|
527
|
+
* Terminate idle containers above minimum
|
|
528
|
+
*/
|
|
529
|
+
async runIdleChecks() {
|
|
530
|
+
const now = Date.now();
|
|
531
|
+
const readyContainers = Array.from(this.containers.values())
|
|
532
|
+
.filter(c => c.state === 'ready')
|
|
533
|
+
.sort((a, b) => (a.lastUsedAt?.getTime() || 0) - (b.lastUsedAt?.getTime() || 0));
|
|
534
|
+
// Keep minimum containers
|
|
535
|
+
const toTerminate = readyContainers.slice(this.config.minContainers);
|
|
536
|
+
for (const container of toTerminate) {
|
|
537
|
+
const lastUsed = container.lastUsedAt?.getTime() || container.createdAt.getTime();
|
|
538
|
+
if (now - lastUsed > this.config.idleTimeoutMs) {
|
|
539
|
+
await this.terminateContainer(container.id);
|
|
540
|
+
this.emit('containerIdleTerminated', { id: container.id, name: container.name });
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
// ============================================
|
|
545
|
+
// Private Methods - Utilities
|
|
546
|
+
// ============================================
|
|
547
|
+
/**
|
|
548
|
+
* Try to parse JSON from output
|
|
549
|
+
*/
|
|
550
|
+
tryParseJson(output) {
|
|
551
|
+
try {
|
|
552
|
+
const jsonMatch = output.match(/\{[\s\S]*\}/);
|
|
553
|
+
if (jsonMatch) {
|
|
554
|
+
return JSON.parse(jsonMatch[0]);
|
|
555
|
+
}
|
|
556
|
+
return JSON.parse(output.trim());
|
|
557
|
+
}
|
|
558
|
+
catch {
|
|
559
|
+
return undefined;
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
/**
|
|
563
|
+
* Create an error result
|
|
564
|
+
*/
|
|
565
|
+
createErrorResult(workerType, error) {
|
|
566
|
+
return {
|
|
567
|
+
success: false,
|
|
568
|
+
output: '',
|
|
569
|
+
durationMs: 0,
|
|
570
|
+
model: 'unknown',
|
|
571
|
+
sandboxMode: this.config.defaultSandbox,
|
|
572
|
+
workerType,
|
|
573
|
+
timestamp: new Date(),
|
|
574
|
+
executionId: `error_${Date.now()}`,
|
|
575
|
+
error,
|
|
576
|
+
};
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
// Export default
|
|
580
|
+
export default ContainerWorkerPool;
|
|
581
|
+
//# sourceMappingURL=container-worker-pool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"container-worker-pool.js","sourceRoot":"","sources":["../../../src/services/container-worker-pool.ts"],"names":[],"mappings":"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"}
|