@sparkleideas/swarm 3.0.0-alpha.7
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/MIGRATION.md +472 -0
- package/README.md +634 -0
- package/__tests__/consensus.test.ts +577 -0
- package/__tests__/coordinator.test.ts +501 -0
- package/__tests__/queen-coordinator.test.ts +1335 -0
- package/__tests__/topology.test.ts +621 -0
- package/package.json +32 -0
- package/src/agent-pool.ts +476 -0
- package/src/application/commands/create-task.command.ts +124 -0
- package/src/application/commands/spawn-agent.command.ts +122 -0
- package/src/application/index.ts +30 -0
- package/src/application/services/swarm-application-service.ts +200 -0
- package/src/attention-coordinator.ts +1000 -0
- package/src/consensus/byzantine.ts +431 -0
- package/src/consensus/gossip.ts +513 -0
- package/src/consensus/index.ts +267 -0
- package/src/consensus/raft.ts +443 -0
- package/src/coordination/agent-registry.ts +544 -0
- package/src/coordination/index.ts +23 -0
- package/src/coordination/swarm-hub.ts +776 -0
- package/src/coordination/task-orchestrator.ts +605 -0
- package/src/domain/entities/agent.d.ts +151 -0
- package/src/domain/entities/agent.d.ts.map +1 -0
- package/src/domain/entities/agent.js +280 -0
- package/src/domain/entities/agent.js.map +1 -0
- package/src/domain/entities/agent.ts +370 -0
- package/src/domain/entities/task.d.ts +133 -0
- package/src/domain/entities/task.d.ts.map +1 -0
- package/src/domain/entities/task.js +261 -0
- package/src/domain/entities/task.js.map +1 -0
- package/src/domain/entities/task.ts +319 -0
- package/src/domain/index.ts +41 -0
- package/src/domain/repositories/agent-repository.interface.d.ts +57 -0
- package/src/domain/repositories/agent-repository.interface.d.ts.map +1 -0
- package/src/domain/repositories/agent-repository.interface.js +9 -0
- package/src/domain/repositories/agent-repository.interface.js.map +1 -0
- package/src/domain/repositories/agent-repository.interface.ts +69 -0
- package/src/domain/repositories/task-repository.interface.d.ts +61 -0
- package/src/domain/repositories/task-repository.interface.d.ts.map +1 -0
- package/src/domain/repositories/task-repository.interface.js +9 -0
- package/src/domain/repositories/task-repository.interface.js.map +1 -0
- package/src/domain/repositories/task-repository.interface.ts +75 -0
- package/src/domain/services/coordination-service.ts +320 -0
- package/src/federation-hub.d.ts +284 -0
- package/src/federation-hub.d.ts.map +1 -0
- package/src/federation-hub.js +692 -0
- package/src/federation-hub.js.map +1 -0
- package/src/federation-hub.ts +979 -0
- package/src/index.ts +348 -0
- package/src/message-bus.ts +607 -0
- package/src/queen-coordinator.ts +2025 -0
- package/src/shared/events.ts +285 -0
- package/src/shared/types.ts +389 -0
- package/src/topology-manager.ts +656 -0
- package/src/types.ts +545 -0
- package/src/unified-coordinator.ts +1844 -0
- package/src/workers/index.ts +65 -0
- package/src/workers/worker-dispatch.d.ts +234 -0
- package/src/workers/worker-dispatch.d.ts.map +1 -0
- package/src/workers/worker-dispatch.js +842 -0
- package/src/workers/worker-dispatch.js.map +1 -0
- package/src/workers/worker-dispatch.ts +1076 -0
- package/tmp.json +0 -0
- package/tsconfig.json +9 -0
- package/vitest.config.ts +20 -0
|
@@ -0,0 +1,842 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker Dispatch Service
|
|
3
|
+
*
|
|
4
|
+
* Implements the 12 background worker triggers from @sparkleideas/agentic-flow@alpha:
|
|
5
|
+
* - ultralearn: Deep knowledge acquisition
|
|
6
|
+
* - optimize: Performance optimization
|
|
7
|
+
* - consolidate: Memory consolidation
|
|
8
|
+
* - predict: Predictive preloading
|
|
9
|
+
* - audit: Security analysis
|
|
10
|
+
* - map: Codebase mapping
|
|
11
|
+
* - preload: Resource preloading
|
|
12
|
+
* - deepdive: Deep code analysis
|
|
13
|
+
* - document: Auto-documentation
|
|
14
|
+
* - refactor: Refactoring suggestions
|
|
15
|
+
* - benchmark: Performance benchmarks
|
|
16
|
+
* - testgaps: Test coverage analysis
|
|
17
|
+
*
|
|
18
|
+
* Performance Targets:
|
|
19
|
+
* - Trigger Detection: <5ms
|
|
20
|
+
* - Worker Spawn: <50ms
|
|
21
|
+
* - Max Concurrent: 10 workers (configurable)
|
|
22
|
+
*
|
|
23
|
+
* @module v3/swarm/workers/worker-dispatch
|
|
24
|
+
*/
|
|
25
|
+
import { EventEmitter } from 'events';
|
|
26
|
+
// =============================================================================
|
|
27
|
+
// Trigger Detection Patterns
|
|
28
|
+
// =============================================================================
|
|
29
|
+
/**
|
|
30
|
+
* Patterns for detecting triggers from user prompts/context
|
|
31
|
+
*/
|
|
32
|
+
const TRIGGER_PATTERNS = {
|
|
33
|
+
ultralearn: [
|
|
34
|
+
/learn\s+about/i,
|
|
35
|
+
/understand\s+(how|what|why)/i,
|
|
36
|
+
/deep\s+dive\s+into/i,
|
|
37
|
+
/explain\s+in\s+detail/i,
|
|
38
|
+
/comprehensive\s+guide/i,
|
|
39
|
+
/master\s+this/i,
|
|
40
|
+
],
|
|
41
|
+
optimize: [
|
|
42
|
+
/optimize/i,
|
|
43
|
+
/improve\s+performance/i,
|
|
44
|
+
/make\s+(it\s+)?faster/i,
|
|
45
|
+
/speed\s+up/i,
|
|
46
|
+
/reduce\s+(memory|time)/i,
|
|
47
|
+
/performance\s+issue/i,
|
|
48
|
+
],
|
|
49
|
+
consolidate: [
|
|
50
|
+
/consolidate/i,
|
|
51
|
+
/merge\s+memories/i,
|
|
52
|
+
/clean\s+up\s+memory/i,
|
|
53
|
+
/deduplicate/i,
|
|
54
|
+
/memory\s+maintenance/i,
|
|
55
|
+
],
|
|
56
|
+
predict: [
|
|
57
|
+
/what\s+will\s+happen/i,
|
|
58
|
+
/predict/i,
|
|
59
|
+
/forecast/i,
|
|
60
|
+
/anticipate/i,
|
|
61
|
+
/preload/i,
|
|
62
|
+
/prepare\s+for/i,
|
|
63
|
+
],
|
|
64
|
+
audit: [
|
|
65
|
+
/security\s+audit/i,
|
|
66
|
+
/vulnerability/i,
|
|
67
|
+
/security\s+check/i,
|
|
68
|
+
/pentest/i,
|
|
69
|
+
/security\s+scan/i,
|
|
70
|
+
/cve/i,
|
|
71
|
+
/owasp/i,
|
|
72
|
+
],
|
|
73
|
+
map: [
|
|
74
|
+
/map\s+(the\s+)?codebase/i,
|
|
75
|
+
/architecture\s+overview/i,
|
|
76
|
+
/project\s+structure/i,
|
|
77
|
+
/dependency\s+graph/i,
|
|
78
|
+
/code\s+map/i,
|
|
79
|
+
/explore\s+codebase/i,
|
|
80
|
+
],
|
|
81
|
+
preload: [
|
|
82
|
+
/preload/i,
|
|
83
|
+
/cache\s+ahead/i,
|
|
84
|
+
/prefetch/i,
|
|
85
|
+
/warm\s+(up\s+)?cache/i,
|
|
86
|
+
],
|
|
87
|
+
deepdive: [
|
|
88
|
+
/deep\s+dive/i,
|
|
89
|
+
/analyze\s+thoroughly/i,
|
|
90
|
+
/in-depth\s+analysis/i,
|
|
91
|
+
/comprehensive\s+review/i,
|
|
92
|
+
/detailed\s+examination/i,
|
|
93
|
+
],
|
|
94
|
+
document: [
|
|
95
|
+
/document\s+(this|the)/i,
|
|
96
|
+
/generate\s+docs/i,
|
|
97
|
+
/add\s+documentation/i,
|
|
98
|
+
/write\s+readme/i,
|
|
99
|
+
/api\s+docs/i,
|
|
100
|
+
/jsdoc/i,
|
|
101
|
+
],
|
|
102
|
+
refactor: [
|
|
103
|
+
/refactor/i,
|
|
104
|
+
/clean\s+up\s+code/i,
|
|
105
|
+
/improve\s+code\s+quality/i,
|
|
106
|
+
/restructure/i,
|
|
107
|
+
/simplify/i,
|
|
108
|
+
/make\s+more\s+readable/i,
|
|
109
|
+
],
|
|
110
|
+
benchmark: [
|
|
111
|
+
/benchmark/i,
|
|
112
|
+
/performance\s+test/i,
|
|
113
|
+
/measure\s+speed/i,
|
|
114
|
+
/stress\s+test/i,
|
|
115
|
+
/load\s+test/i,
|
|
116
|
+
],
|
|
117
|
+
testgaps: [
|
|
118
|
+
/test\s+coverage/i,
|
|
119
|
+
/missing\s+tests/i,
|
|
120
|
+
/untested\s+code/i,
|
|
121
|
+
/coverage\s+report/i,
|
|
122
|
+
/test\s+gaps/i,
|
|
123
|
+
/add\s+tests/i,
|
|
124
|
+
],
|
|
125
|
+
};
|
|
126
|
+
/**
|
|
127
|
+
* Trigger configurations
|
|
128
|
+
*/
|
|
129
|
+
const TRIGGER_CONFIGS = {
|
|
130
|
+
ultralearn: {
|
|
131
|
+
description: 'Deep knowledge acquisition and learning',
|
|
132
|
+
priority: 'normal',
|
|
133
|
+
estimatedDuration: 60000,
|
|
134
|
+
capabilities: ['research', 'analysis', 'synthesis'],
|
|
135
|
+
},
|
|
136
|
+
optimize: {
|
|
137
|
+
description: 'Performance optimization and tuning',
|
|
138
|
+
priority: 'high',
|
|
139
|
+
estimatedDuration: 30000,
|
|
140
|
+
capabilities: ['profiling', 'optimization', 'benchmarking'],
|
|
141
|
+
},
|
|
142
|
+
consolidate: {
|
|
143
|
+
description: 'Memory consolidation and cleanup',
|
|
144
|
+
priority: 'low',
|
|
145
|
+
estimatedDuration: 20000,
|
|
146
|
+
capabilities: ['memory-management', 'deduplication'],
|
|
147
|
+
},
|
|
148
|
+
predict: {
|
|
149
|
+
description: 'Predictive preloading and anticipation',
|
|
150
|
+
priority: 'normal',
|
|
151
|
+
estimatedDuration: 15000,
|
|
152
|
+
capabilities: ['prediction', 'caching', 'preloading'],
|
|
153
|
+
},
|
|
154
|
+
audit: {
|
|
155
|
+
description: 'Security analysis and vulnerability scanning',
|
|
156
|
+
priority: 'critical',
|
|
157
|
+
estimatedDuration: 45000,
|
|
158
|
+
capabilities: ['security', 'vulnerability-scanning', 'audit'],
|
|
159
|
+
},
|
|
160
|
+
map: {
|
|
161
|
+
description: 'Codebase mapping and architecture analysis',
|
|
162
|
+
priority: 'normal',
|
|
163
|
+
estimatedDuration: 30000,
|
|
164
|
+
capabilities: ['analysis', 'mapping', 'visualization'],
|
|
165
|
+
},
|
|
166
|
+
preload: {
|
|
167
|
+
description: 'Resource preloading and cache warming',
|
|
168
|
+
priority: 'low',
|
|
169
|
+
estimatedDuration: 10000,
|
|
170
|
+
capabilities: ['caching', 'preloading'],
|
|
171
|
+
},
|
|
172
|
+
deepdive: {
|
|
173
|
+
description: 'Deep code analysis and examination',
|
|
174
|
+
priority: 'normal',
|
|
175
|
+
estimatedDuration: 60000,
|
|
176
|
+
capabilities: ['analysis', 'review', 'understanding'],
|
|
177
|
+
},
|
|
178
|
+
document: {
|
|
179
|
+
description: 'Auto-documentation generation',
|
|
180
|
+
priority: 'normal',
|
|
181
|
+
estimatedDuration: 45000,
|
|
182
|
+
capabilities: ['documentation', 'writing', 'generation'],
|
|
183
|
+
},
|
|
184
|
+
refactor: {
|
|
185
|
+
description: 'Code refactoring suggestions',
|
|
186
|
+
priority: 'normal',
|
|
187
|
+
estimatedDuration: 30000,
|
|
188
|
+
capabilities: ['refactoring', 'code-quality', 'improvement'],
|
|
189
|
+
},
|
|
190
|
+
benchmark: {
|
|
191
|
+
description: 'Performance benchmarking',
|
|
192
|
+
priority: 'normal',
|
|
193
|
+
estimatedDuration: 60000,
|
|
194
|
+
capabilities: ['benchmarking', 'testing', 'measurement'],
|
|
195
|
+
},
|
|
196
|
+
testgaps: {
|
|
197
|
+
description: 'Test coverage analysis',
|
|
198
|
+
priority: 'normal',
|
|
199
|
+
estimatedDuration: 30000,
|
|
200
|
+
capabilities: ['testing', 'coverage', 'analysis'],
|
|
201
|
+
},
|
|
202
|
+
};
|
|
203
|
+
// =============================================================================
|
|
204
|
+
// Worker Dispatch Service
|
|
205
|
+
// =============================================================================
|
|
206
|
+
/**
|
|
207
|
+
* Worker Dispatch Service
|
|
208
|
+
*
|
|
209
|
+
* Manages background workers for various analysis and optimization tasks.
|
|
210
|
+
*/
|
|
211
|
+
export class WorkerDispatchService extends EventEmitter {
|
|
212
|
+
config;
|
|
213
|
+
workers = new Map();
|
|
214
|
+
queue = [];
|
|
215
|
+
running = new Set();
|
|
216
|
+
idCounter = 0;
|
|
217
|
+
constructor(config = {}) {
|
|
218
|
+
super();
|
|
219
|
+
this.config = {
|
|
220
|
+
maxConcurrent: config.maxConcurrent ?? 10,
|
|
221
|
+
defaultTimeout: config.defaultTimeout ?? 300000,
|
|
222
|
+
memoryLimit: config.memoryLimit ?? 1024,
|
|
223
|
+
autoDispatch: config.autoDispatch ?? true,
|
|
224
|
+
priorityQueue: config.priorityQueue ?? true,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
// ===========================================================================
|
|
228
|
+
// Public API
|
|
229
|
+
// ===========================================================================
|
|
230
|
+
/**
|
|
231
|
+
* Dispatch a worker for the given trigger
|
|
232
|
+
*
|
|
233
|
+
* @param trigger - Worker trigger type
|
|
234
|
+
* @param context - Context string (e.g., file path, topic)
|
|
235
|
+
* @param sessionId - Session identifier
|
|
236
|
+
* @param options - Dispatch options
|
|
237
|
+
* @returns Worker ID
|
|
238
|
+
*/
|
|
239
|
+
async dispatch(trigger, context, sessionId, options = {}) {
|
|
240
|
+
const startTime = performance.now();
|
|
241
|
+
// Generate worker ID
|
|
242
|
+
const workerId = this.generateWorkerId(trigger);
|
|
243
|
+
// Create worker instance
|
|
244
|
+
const worker = {
|
|
245
|
+
id: workerId,
|
|
246
|
+
trigger,
|
|
247
|
+
context,
|
|
248
|
+
sessionId,
|
|
249
|
+
status: 'pending',
|
|
250
|
+
progress: 0,
|
|
251
|
+
phase: 'initializing',
|
|
252
|
+
startedAt: new Date(),
|
|
253
|
+
metadata: options.context,
|
|
254
|
+
};
|
|
255
|
+
// Store worker
|
|
256
|
+
this.workers.set(workerId, worker);
|
|
257
|
+
// Add to queue with priority
|
|
258
|
+
const priority = this.getPriorityValue(options.priority || TRIGGER_CONFIGS[trigger].priority);
|
|
259
|
+
this.queue.push({ id: workerId, priority });
|
|
260
|
+
if (this.config.priorityQueue) {
|
|
261
|
+
this.queue.sort((a, b) => b.priority - a.priority);
|
|
262
|
+
}
|
|
263
|
+
// Emit event
|
|
264
|
+
this.emit('worker:queued', { workerId, trigger, context });
|
|
265
|
+
// Process queue
|
|
266
|
+
await this.processQueue();
|
|
267
|
+
const spawnTime = performance.now() - startTime;
|
|
268
|
+
if (spawnTime > 50) {
|
|
269
|
+
console.warn(`Worker spawn exceeded 50ms target: ${spawnTime.toFixed(2)}ms`);
|
|
270
|
+
}
|
|
271
|
+
return workerId;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Detect triggers in a prompt/context
|
|
275
|
+
*
|
|
276
|
+
* @param text - Text to analyze
|
|
277
|
+
* @returns Detection result
|
|
278
|
+
*/
|
|
279
|
+
detectTriggers(text) {
|
|
280
|
+
const startTime = performance.now();
|
|
281
|
+
const detectedTriggers = [];
|
|
282
|
+
let totalMatches = 0;
|
|
283
|
+
for (const [trigger, patterns] of Object.entries(TRIGGER_PATTERNS)) {
|
|
284
|
+
for (const pattern of patterns) {
|
|
285
|
+
if (pattern.test(text)) {
|
|
286
|
+
if (!detectedTriggers.includes(trigger)) {
|
|
287
|
+
detectedTriggers.push(trigger);
|
|
288
|
+
}
|
|
289
|
+
totalMatches++;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
const detectionTime = performance.now() - startTime;
|
|
294
|
+
if (detectionTime > 5) {
|
|
295
|
+
console.warn(`Trigger detection exceeded 5ms target: ${detectionTime.toFixed(2)}ms`);
|
|
296
|
+
}
|
|
297
|
+
const confidence = detectedTriggers.length > 0
|
|
298
|
+
? Math.min(1, totalMatches / (detectedTriggers.length * 2))
|
|
299
|
+
: 0;
|
|
300
|
+
return {
|
|
301
|
+
detected: detectedTriggers.length > 0,
|
|
302
|
+
triggers: detectedTriggers,
|
|
303
|
+
confidence,
|
|
304
|
+
context: text.slice(0, 100),
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Get worker status
|
|
309
|
+
*
|
|
310
|
+
* @param workerId - Worker ID
|
|
311
|
+
* @returns Worker instance or undefined
|
|
312
|
+
*/
|
|
313
|
+
getWorker(workerId) {
|
|
314
|
+
return this.workers.get(workerId);
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Get all workers for a session
|
|
318
|
+
*
|
|
319
|
+
* @param sessionId - Session ID
|
|
320
|
+
* @returns Worker instances
|
|
321
|
+
*/
|
|
322
|
+
getSessionWorkers(sessionId) {
|
|
323
|
+
return Array.from(this.workers.values())
|
|
324
|
+
.filter(w => w.sessionId === sessionId);
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Cancel a worker
|
|
328
|
+
*
|
|
329
|
+
* @param workerId - Worker ID
|
|
330
|
+
* @returns Success status
|
|
331
|
+
*/
|
|
332
|
+
async cancel(workerId) {
|
|
333
|
+
const worker = this.workers.get(workerId);
|
|
334
|
+
if (!worker)
|
|
335
|
+
return false;
|
|
336
|
+
if (worker.status === 'running') {
|
|
337
|
+
worker.status = 'cancelled';
|
|
338
|
+
worker.completedAt = new Date();
|
|
339
|
+
this.running.delete(workerId);
|
|
340
|
+
this.emit('worker:cancelled', { workerId });
|
|
341
|
+
}
|
|
342
|
+
else if (worker.status === 'pending') {
|
|
343
|
+
worker.status = 'cancelled';
|
|
344
|
+
this.queue = this.queue.filter(q => q.id !== workerId);
|
|
345
|
+
this.emit('worker:cancelled', { workerId });
|
|
346
|
+
}
|
|
347
|
+
return true;
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Get available triggers
|
|
351
|
+
*
|
|
352
|
+
* @returns Trigger configurations
|
|
353
|
+
*/
|
|
354
|
+
getTriggers() {
|
|
355
|
+
return TRIGGER_CONFIGS;
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Get worker statistics
|
|
359
|
+
*/
|
|
360
|
+
getStats() {
|
|
361
|
+
const workers = Array.from(this.workers.values());
|
|
362
|
+
return {
|
|
363
|
+
total: workers.length,
|
|
364
|
+
pending: workers.filter(w => w.status === 'pending').length,
|
|
365
|
+
running: workers.filter(w => w.status === 'running').length,
|
|
366
|
+
completed: workers.filter(w => w.status === 'completed').length,
|
|
367
|
+
failed: workers.filter(w => w.status === 'failed').length,
|
|
368
|
+
cancelled: workers.filter(w => w.status === 'cancelled').length,
|
|
369
|
+
};
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* Get context for prompt injection
|
|
373
|
+
*
|
|
374
|
+
* @param sessionId - Session ID
|
|
375
|
+
* @returns Context string for injection
|
|
376
|
+
*/
|
|
377
|
+
getContextForInjection(sessionId) {
|
|
378
|
+
const workers = this.getSessionWorkers(sessionId)
|
|
379
|
+
.filter(w => w.status === 'completed' && w.result?.success);
|
|
380
|
+
if (workers.length === 0)
|
|
381
|
+
return '';
|
|
382
|
+
const summaries = workers
|
|
383
|
+
.map(w => `[${w.trigger}] ${w.result?.summary || 'Completed'}`)
|
|
384
|
+
.join('\n');
|
|
385
|
+
return `\n### Background Analysis Results\n${summaries}\n`;
|
|
386
|
+
}
|
|
387
|
+
// ===========================================================================
|
|
388
|
+
// Worker Execution
|
|
389
|
+
// ===========================================================================
|
|
390
|
+
/**
|
|
391
|
+
* Process the worker queue
|
|
392
|
+
*/
|
|
393
|
+
async processQueue() {
|
|
394
|
+
while (this.queue.length > 0 &&
|
|
395
|
+
this.running.size < this.config.maxConcurrent) {
|
|
396
|
+
const next = this.queue.shift();
|
|
397
|
+
if (!next)
|
|
398
|
+
break;
|
|
399
|
+
const worker = this.workers.get(next.id);
|
|
400
|
+
if (!worker || worker.status !== 'pending')
|
|
401
|
+
continue;
|
|
402
|
+
this.running.add(next.id);
|
|
403
|
+
this.executeWorker(worker).catch(error => {
|
|
404
|
+
worker.status = 'failed';
|
|
405
|
+
worker.error = error;
|
|
406
|
+
this.emit('worker:failed', { workerId: worker.id, error });
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Execute a worker
|
|
412
|
+
*/
|
|
413
|
+
async executeWorker(worker) {
|
|
414
|
+
worker.status = 'running';
|
|
415
|
+
this.emit('worker:started', { workerId: worker.id, trigger: worker.trigger });
|
|
416
|
+
try {
|
|
417
|
+
// Execute based on trigger type
|
|
418
|
+
const result = await this.executeWorkerByTrigger(worker);
|
|
419
|
+
worker.status = 'completed';
|
|
420
|
+
worker.completedAt = new Date();
|
|
421
|
+
worker.result = result;
|
|
422
|
+
worker.progress = 100;
|
|
423
|
+
worker.phase = 'completed';
|
|
424
|
+
this.emit('worker:completed', {
|
|
425
|
+
workerId: worker.id,
|
|
426
|
+
result,
|
|
427
|
+
duration: worker.completedAt.getTime() - worker.startedAt.getTime(),
|
|
428
|
+
});
|
|
429
|
+
}
|
|
430
|
+
catch (error) {
|
|
431
|
+
worker.status = 'failed';
|
|
432
|
+
worker.completedAt = new Date();
|
|
433
|
+
worker.error = error;
|
|
434
|
+
worker.phase = 'failed';
|
|
435
|
+
this.emit('worker:failed', { workerId: worker.id, error });
|
|
436
|
+
}
|
|
437
|
+
finally {
|
|
438
|
+
this.running.delete(worker.id);
|
|
439
|
+
this.processQueue();
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
/**
|
|
443
|
+
* Execute worker based on trigger type
|
|
444
|
+
*/
|
|
445
|
+
async executeWorkerByTrigger(worker) {
|
|
446
|
+
const executors = {
|
|
447
|
+
ultralearn: () => this.executeUltralearn(worker),
|
|
448
|
+
optimize: () => this.executeOptimize(worker),
|
|
449
|
+
consolidate: () => this.executeConsolidate(worker),
|
|
450
|
+
predict: () => this.executePredict(worker),
|
|
451
|
+
audit: () => this.executeAudit(worker),
|
|
452
|
+
map: () => this.executeMap(worker),
|
|
453
|
+
preload: () => this.executePreload(worker),
|
|
454
|
+
deepdive: () => this.executeDeepdive(worker),
|
|
455
|
+
document: () => this.executeDocument(worker),
|
|
456
|
+
refactor: () => this.executeRefactor(worker),
|
|
457
|
+
benchmark: () => this.executeBenchmark(worker),
|
|
458
|
+
testgaps: () => this.executeTestgaps(worker),
|
|
459
|
+
};
|
|
460
|
+
return executors[worker.trigger]();
|
|
461
|
+
}
|
|
462
|
+
// ===========================================================================
|
|
463
|
+
// Trigger-Specific Executors
|
|
464
|
+
// ===========================================================================
|
|
465
|
+
async executeUltralearn(worker) {
|
|
466
|
+
this.updateProgress(worker, 10, 'analyzing context');
|
|
467
|
+
// Simulate deep learning analysis
|
|
468
|
+
await this.simulateWork(500);
|
|
469
|
+
this.updateProgress(worker, 30, 'gathering knowledge');
|
|
470
|
+
await this.simulateWork(500);
|
|
471
|
+
this.updateProgress(worker, 60, 'synthesizing information');
|
|
472
|
+
await this.simulateWork(500);
|
|
473
|
+
this.updateProgress(worker, 90, 'generating insights');
|
|
474
|
+
return {
|
|
475
|
+
success: true,
|
|
476
|
+
summary: `Deep learning analysis completed for: ${worker.context}`,
|
|
477
|
+
data: {
|
|
478
|
+
topics: ['architecture', 'patterns', 'best-practices'],
|
|
479
|
+
insights: 3,
|
|
480
|
+
recommendations: 5,
|
|
481
|
+
},
|
|
482
|
+
metrics: {
|
|
483
|
+
duration: Date.now() - worker.startedAt.getTime(),
|
|
484
|
+
itemsAnalyzed: 10,
|
|
485
|
+
},
|
|
486
|
+
};
|
|
487
|
+
}
|
|
488
|
+
async executeOptimize(worker) {
|
|
489
|
+
this.updateProgress(worker, 10, 'profiling code');
|
|
490
|
+
await this.simulateWork(400);
|
|
491
|
+
this.updateProgress(worker, 40, 'identifying bottlenecks');
|
|
492
|
+
await this.simulateWork(400);
|
|
493
|
+
this.updateProgress(worker, 70, 'generating optimizations');
|
|
494
|
+
await this.simulateWork(400);
|
|
495
|
+
return {
|
|
496
|
+
success: true,
|
|
497
|
+
summary: `Performance optimization analysis for: ${worker.context}`,
|
|
498
|
+
data: {
|
|
499
|
+
bottlenecks: 3,
|
|
500
|
+
optimizations: 5,
|
|
501
|
+
estimatedImprovement: '25%',
|
|
502
|
+
},
|
|
503
|
+
artifacts: [
|
|
504
|
+
{
|
|
505
|
+
type: 'suggestion',
|
|
506
|
+
name: 'optimization-report',
|
|
507
|
+
content: { suggestions: ['Use memoization', 'Reduce re-renders', 'Optimize queries'] },
|
|
508
|
+
},
|
|
509
|
+
],
|
|
510
|
+
metrics: {
|
|
511
|
+
duration: Date.now() - worker.startedAt.getTime(),
|
|
512
|
+
},
|
|
513
|
+
};
|
|
514
|
+
}
|
|
515
|
+
async executeConsolidate(worker) {
|
|
516
|
+
this.updateProgress(worker, 20, 'scanning memory');
|
|
517
|
+
await this.simulateWork(300);
|
|
518
|
+
this.updateProgress(worker, 50, 'identifying duplicates');
|
|
519
|
+
await this.simulateWork(300);
|
|
520
|
+
this.updateProgress(worker, 80, 'consolidating entries');
|
|
521
|
+
await this.simulateWork(300);
|
|
522
|
+
return {
|
|
523
|
+
success: true,
|
|
524
|
+
summary: `Memory consolidation completed`,
|
|
525
|
+
data: {
|
|
526
|
+
entriesBefore: 1000,
|
|
527
|
+
entriesAfter: 750,
|
|
528
|
+
duplicatesRemoved: 250,
|
|
529
|
+
spaceSaved: '25%',
|
|
530
|
+
},
|
|
531
|
+
metrics: {
|
|
532
|
+
duration: Date.now() - worker.startedAt.getTime(),
|
|
533
|
+
memoryUsed: 50,
|
|
534
|
+
},
|
|
535
|
+
};
|
|
536
|
+
}
|
|
537
|
+
async executePredict(worker) {
|
|
538
|
+
this.updateProgress(worker, 25, 'analyzing patterns');
|
|
539
|
+
await this.simulateWork(250);
|
|
540
|
+
this.updateProgress(worker, 60, 'generating predictions');
|
|
541
|
+
await this.simulateWork(250);
|
|
542
|
+
this.updateProgress(worker, 85, 'preloading resources');
|
|
543
|
+
await this.simulateWork(250);
|
|
544
|
+
return {
|
|
545
|
+
success: true,
|
|
546
|
+
summary: `Predictive analysis for: ${worker.context}`,
|
|
547
|
+
data: {
|
|
548
|
+
predictions: 5,
|
|
549
|
+
preloadedResources: 3,
|
|
550
|
+
confidence: 0.85,
|
|
551
|
+
},
|
|
552
|
+
metrics: {
|
|
553
|
+
duration: Date.now() - worker.startedAt.getTime(),
|
|
554
|
+
},
|
|
555
|
+
};
|
|
556
|
+
}
|
|
557
|
+
async executeAudit(worker) {
|
|
558
|
+
this.updateProgress(worker, 10, 'scanning for vulnerabilities');
|
|
559
|
+
await this.simulateWork(600);
|
|
560
|
+
this.updateProgress(worker, 40, 'checking dependencies');
|
|
561
|
+
await this.simulateWork(600);
|
|
562
|
+
this.updateProgress(worker, 70, 'analyzing code patterns');
|
|
563
|
+
await this.simulateWork(600);
|
|
564
|
+
this.updateProgress(worker, 90, 'generating report');
|
|
565
|
+
return {
|
|
566
|
+
success: true,
|
|
567
|
+
summary: `Security audit completed for: ${worker.context}`,
|
|
568
|
+
data: {
|
|
569
|
+
criticalVulnerabilities: 0,
|
|
570
|
+
highVulnerabilities: 2,
|
|
571
|
+
mediumVulnerabilities: 5,
|
|
572
|
+
lowVulnerabilities: 8,
|
|
573
|
+
recommendations: 10,
|
|
574
|
+
},
|
|
575
|
+
artifacts: [
|
|
576
|
+
{
|
|
577
|
+
type: 'report',
|
|
578
|
+
name: 'security-audit-report',
|
|
579
|
+
content: {
|
|
580
|
+
vulnerabilities: [],
|
|
581
|
+
recommendations: ['Update dependencies', 'Add input validation'],
|
|
582
|
+
},
|
|
583
|
+
},
|
|
584
|
+
],
|
|
585
|
+
metrics: {
|
|
586
|
+
duration: Date.now() - worker.startedAt.getTime(),
|
|
587
|
+
filesProcessed: 50,
|
|
588
|
+
},
|
|
589
|
+
};
|
|
590
|
+
}
|
|
591
|
+
async executeMap(worker) {
|
|
592
|
+
this.updateProgress(worker, 15, 'scanning file structure');
|
|
593
|
+
await this.simulateWork(400);
|
|
594
|
+
this.updateProgress(worker, 45, 'analyzing dependencies');
|
|
595
|
+
await this.simulateWork(400);
|
|
596
|
+
this.updateProgress(worker, 75, 'generating map');
|
|
597
|
+
await this.simulateWork(400);
|
|
598
|
+
return {
|
|
599
|
+
success: true,
|
|
600
|
+
summary: `Codebase mapping completed for: ${worker.context}`,
|
|
601
|
+
data: {
|
|
602
|
+
filesScanned: 100,
|
|
603
|
+
modules: 15,
|
|
604
|
+
dependencies: 50,
|
|
605
|
+
entryPoints: 3,
|
|
606
|
+
},
|
|
607
|
+
artifacts: [
|
|
608
|
+
{
|
|
609
|
+
type: 'data',
|
|
610
|
+
name: 'codebase-map',
|
|
611
|
+
content: {
|
|
612
|
+
structure: { src: {}, tests: {}, docs: {} },
|
|
613
|
+
dependencies: [],
|
|
614
|
+
},
|
|
615
|
+
},
|
|
616
|
+
],
|
|
617
|
+
metrics: {
|
|
618
|
+
duration: Date.now() - worker.startedAt.getTime(),
|
|
619
|
+
filesProcessed: 100,
|
|
620
|
+
},
|
|
621
|
+
};
|
|
622
|
+
}
|
|
623
|
+
async executePreload(worker) {
|
|
624
|
+
this.updateProgress(worker, 30, 'identifying resources');
|
|
625
|
+
await this.simulateWork(200);
|
|
626
|
+
this.updateProgress(worker, 70, 'preloading');
|
|
627
|
+
await this.simulateWork(200);
|
|
628
|
+
return {
|
|
629
|
+
success: true,
|
|
630
|
+
summary: `Preloading completed`,
|
|
631
|
+
data: {
|
|
632
|
+
resourcesPreloaded: 10,
|
|
633
|
+
cacheWarm: true,
|
|
634
|
+
},
|
|
635
|
+
metrics: {
|
|
636
|
+
duration: Date.now() - worker.startedAt.getTime(),
|
|
637
|
+
},
|
|
638
|
+
};
|
|
639
|
+
}
|
|
640
|
+
async executeDeepdive(worker) {
|
|
641
|
+
this.updateProgress(worker, 10, 'parsing code');
|
|
642
|
+
await this.simulateWork(800);
|
|
643
|
+
this.updateProgress(worker, 35, 'analyzing structure');
|
|
644
|
+
await this.simulateWork(800);
|
|
645
|
+
this.updateProgress(worker, 60, 'examining patterns');
|
|
646
|
+
await this.simulateWork(800);
|
|
647
|
+
this.updateProgress(worker, 85, 'generating analysis');
|
|
648
|
+
await this.simulateWork(800);
|
|
649
|
+
return {
|
|
650
|
+
success: true,
|
|
651
|
+
summary: `Deep analysis completed for: ${worker.context}`,
|
|
652
|
+
data: {
|
|
653
|
+
complexity: 'moderate',
|
|
654
|
+
patterns: ['singleton', 'factory', 'observer'],
|
|
655
|
+
insights: 7,
|
|
656
|
+
recommendations: 4,
|
|
657
|
+
},
|
|
658
|
+
metrics: {
|
|
659
|
+
duration: Date.now() - worker.startedAt.getTime(),
|
|
660
|
+
itemsAnalyzed: 25,
|
|
661
|
+
},
|
|
662
|
+
};
|
|
663
|
+
}
|
|
664
|
+
async executeDocument(worker) {
|
|
665
|
+
this.updateProgress(worker, 15, 'analyzing code structure');
|
|
666
|
+
await this.simulateWork(600);
|
|
667
|
+
this.updateProgress(worker, 50, 'generating documentation');
|
|
668
|
+
await this.simulateWork(600);
|
|
669
|
+
this.updateProgress(worker, 85, 'formatting output');
|
|
670
|
+
await this.simulateWork(600);
|
|
671
|
+
return {
|
|
672
|
+
success: true,
|
|
673
|
+
summary: `Documentation generated for: ${worker.context}`,
|
|
674
|
+
data: {
|
|
675
|
+
functionsDocumented: 20,
|
|
676
|
+
classesDocumented: 5,
|
|
677
|
+
modulesDocumented: 3,
|
|
678
|
+
},
|
|
679
|
+
artifacts: [
|
|
680
|
+
{
|
|
681
|
+
type: 'file',
|
|
682
|
+
name: 'documentation.md',
|
|
683
|
+
content: '# API Documentation\n\n...',
|
|
684
|
+
},
|
|
685
|
+
],
|
|
686
|
+
metrics: {
|
|
687
|
+
duration: Date.now() - worker.startedAt.getTime(),
|
|
688
|
+
filesProcessed: 15,
|
|
689
|
+
},
|
|
690
|
+
};
|
|
691
|
+
}
|
|
692
|
+
async executeRefactor(worker) {
|
|
693
|
+
this.updateProgress(worker, 15, 'analyzing code quality');
|
|
694
|
+
await this.simulateWork(400);
|
|
695
|
+
this.updateProgress(worker, 45, 'identifying improvements');
|
|
696
|
+
await this.simulateWork(400);
|
|
697
|
+
this.updateProgress(worker, 75, 'generating suggestions');
|
|
698
|
+
await this.simulateWork(400);
|
|
699
|
+
return {
|
|
700
|
+
success: true,
|
|
701
|
+
summary: `Refactoring analysis for: ${worker.context}`,
|
|
702
|
+
data: {
|
|
703
|
+
suggestions: 8,
|
|
704
|
+
complexity: { before: 15, after: 10 },
|
|
705
|
+
maintainability: { before: 60, after: 80 },
|
|
706
|
+
},
|
|
707
|
+
artifacts: [
|
|
708
|
+
{
|
|
709
|
+
type: 'suggestion',
|
|
710
|
+
name: 'refactoring-suggestions',
|
|
711
|
+
content: {
|
|
712
|
+
suggestions: [
|
|
713
|
+
'Extract method for repeated logic',
|
|
714
|
+
'Use composition over inheritance',
|
|
715
|
+
'Reduce cyclomatic complexity',
|
|
716
|
+
],
|
|
717
|
+
},
|
|
718
|
+
},
|
|
719
|
+
],
|
|
720
|
+
metrics: {
|
|
721
|
+
duration: Date.now() - worker.startedAt.getTime(),
|
|
722
|
+
itemsAnalyzed: 30,
|
|
723
|
+
},
|
|
724
|
+
};
|
|
725
|
+
}
|
|
726
|
+
async executeBenchmark(worker) {
|
|
727
|
+
this.updateProgress(worker, 10, 'preparing benchmarks');
|
|
728
|
+
await this.simulateWork(800);
|
|
729
|
+
this.updateProgress(worker, 40, 'running performance tests');
|
|
730
|
+
await this.simulateWork(800);
|
|
731
|
+
this.updateProgress(worker, 70, 'collecting metrics');
|
|
732
|
+
await this.simulateWork(800);
|
|
733
|
+
this.updateProgress(worker, 90, 'generating report');
|
|
734
|
+
return {
|
|
735
|
+
success: true,
|
|
736
|
+
summary: `Benchmark completed for: ${worker.context}`,
|
|
737
|
+
data: {
|
|
738
|
+
testsRun: 10,
|
|
739
|
+
avgLatency: '45ms',
|
|
740
|
+
throughput: '1000 ops/sec',
|
|
741
|
+
p95: '120ms',
|
|
742
|
+
p99: '250ms',
|
|
743
|
+
},
|
|
744
|
+
artifacts: [
|
|
745
|
+
{
|
|
746
|
+
type: 'report',
|
|
747
|
+
name: 'benchmark-report',
|
|
748
|
+
content: {
|
|
749
|
+
results: [],
|
|
750
|
+
comparison: {},
|
|
751
|
+
},
|
|
752
|
+
},
|
|
753
|
+
],
|
|
754
|
+
metrics: {
|
|
755
|
+
duration: Date.now() - worker.startedAt.getTime(),
|
|
756
|
+
},
|
|
757
|
+
};
|
|
758
|
+
}
|
|
759
|
+
async executeTestgaps(worker) {
|
|
760
|
+
this.updateProgress(worker, 15, 'scanning test files');
|
|
761
|
+
await this.simulateWork(400);
|
|
762
|
+
this.updateProgress(worker, 45, 'analyzing coverage');
|
|
763
|
+
await this.simulateWork(400);
|
|
764
|
+
this.updateProgress(worker, 75, 'identifying gaps');
|
|
765
|
+
await this.simulateWork(400);
|
|
766
|
+
return {
|
|
767
|
+
success: true,
|
|
768
|
+
summary: `Test coverage analysis for: ${worker.context}`,
|
|
769
|
+
data: {
|
|
770
|
+
coverage: {
|
|
771
|
+
statements: 75,
|
|
772
|
+
branches: 60,
|
|
773
|
+
functions: 80,
|
|
774
|
+
lines: 75,
|
|
775
|
+
},
|
|
776
|
+
gaps: [
|
|
777
|
+
{ file: 'src/utils.ts', uncovered: ['parseConfig', 'validateInput'] },
|
|
778
|
+
{ file: 'src/api.ts', uncovered: ['handleError'] },
|
|
779
|
+
],
|
|
780
|
+
recommendations: 5,
|
|
781
|
+
},
|
|
782
|
+
artifacts: [
|
|
783
|
+
{
|
|
784
|
+
type: 'suggestion',
|
|
785
|
+
name: 'test-suggestions',
|
|
786
|
+
content: {
|
|
787
|
+
testsToAdd: ['unit test for parseConfig', 'integration test for API'],
|
|
788
|
+
},
|
|
789
|
+
},
|
|
790
|
+
],
|
|
791
|
+
metrics: {
|
|
792
|
+
duration: Date.now() - worker.startedAt.getTime(),
|
|
793
|
+
filesProcessed: 40,
|
|
794
|
+
},
|
|
795
|
+
};
|
|
796
|
+
}
|
|
797
|
+
// ===========================================================================
|
|
798
|
+
// Utility Methods
|
|
799
|
+
// ===========================================================================
|
|
800
|
+
generateWorkerId(trigger) {
|
|
801
|
+
return `worker_${trigger}_${++this.idCounter}_${Date.now().toString(36)}`;
|
|
802
|
+
}
|
|
803
|
+
getPriorityValue(priority) {
|
|
804
|
+
const priorities = { low: 1, normal: 2, high: 3, critical: 4 };
|
|
805
|
+
return priorities[priority];
|
|
806
|
+
}
|
|
807
|
+
updateProgress(worker, progress, phase) {
|
|
808
|
+
worker.progress = progress;
|
|
809
|
+
worker.phase = phase;
|
|
810
|
+
this.emit('worker:progress', {
|
|
811
|
+
workerId: worker.id,
|
|
812
|
+
progress,
|
|
813
|
+
phase,
|
|
814
|
+
});
|
|
815
|
+
}
|
|
816
|
+
async simulateWork(ms) {
|
|
817
|
+
// In production, this would be actual work
|
|
818
|
+
// For now, simulate with a small delay
|
|
819
|
+
await new Promise(resolve => setTimeout(resolve, Math.min(ms, 50)));
|
|
820
|
+
}
|
|
821
|
+
}
|
|
822
|
+
// =============================================================================
|
|
823
|
+
// Singleton Instance
|
|
824
|
+
// =============================================================================
|
|
825
|
+
let dispatcherInstance = null;
|
|
826
|
+
/**
|
|
827
|
+
* Get the worker dispatch service singleton
|
|
828
|
+
*/
|
|
829
|
+
export function getWorkerDispatchService(config) {
|
|
830
|
+
if (!dispatcherInstance) {
|
|
831
|
+
dispatcherInstance = new WorkerDispatchService(config);
|
|
832
|
+
}
|
|
833
|
+
return dispatcherInstance;
|
|
834
|
+
}
|
|
835
|
+
/**
|
|
836
|
+
* Create a new worker dispatch service
|
|
837
|
+
*/
|
|
838
|
+
export function createWorkerDispatchService(config) {
|
|
839
|
+
return new WorkerDispatchService(config);
|
|
840
|
+
}
|
|
841
|
+
export default WorkerDispatchService;
|
|
842
|
+
//# sourceMappingURL=worker-dispatch.js.map
|