claude-flow-novice 2.0.3 → 2.0.4
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/cli/commands/guidance.js +487 -668
- package/dist/src/cli/commands/index-validate.js +18 -29
- package/dist/src/cli/commands/mcp-troubleshoot.js +230 -282
- package/dist/src/cli/commands/neural-goal-init.js +92 -125
- package/dist/src/cli/commands/swarm-exec.js +317 -393
- package/dist/src/cli/commands/swarm.js +1 -1
- package/dist/src/cli/commands/validate-framework.js +983 -1100
- package/dist/src/cli/commands/validate.js +144 -223
- package/dist/src/cli/simple-commands/__tests__/agent.test.js +265 -277
- package/dist/src/cli/simple-commands/__tests__/memory.test.js +6 -7
- package/dist/src/cli/simple-commands/__tests__/swarm.test.js +373 -356
- package/dist/src/cli/simple-commands/__tests__/task.test.js +6 -7
- package/dist/src/cli/simple-commands/agent.js +157 -193
- package/dist/src/cli/simple-commands/analysis.js +336 -446
- package/dist/src/cli/simple-commands/automation-executor.js +1095 -1339
- package/dist/src/cli/simple-commands/automation.js +481 -469
- package/dist/src/cli/simple-commands/batch-manager.js +261 -313
- package/dist/src/cli/simple-commands/claude-telemetry.js +241 -267
- package/dist/src/cli/simple-commands/claude-track.js +68 -90
- package/dist/src/cli/simple-commands/concurrent-display.js +266 -320
- package/dist/src/cli/simple-commands/config.js +245 -290
- package/dist/src/cli/simple-commands/coordination.js +182 -234
- package/dist/src/cli/simple-commands/enhanced-ui-views.js +812 -615
- package/dist/src/cli/simple-commands/enhanced-webui-complete.js +922 -981
- package/dist/src/cli/simple-commands/fix-hook-variables.js +274 -294
- package/dist/src/cli/simple-commands/github/gh-coordinator.js +378 -457
- package/dist/src/cli/simple-commands/github/github-api.js +535 -574
- package/dist/src/cli/simple-commands/github/init.js +276 -303
- package/dist/src/cli/simple-commands/github.js +222 -247
- package/dist/src/cli/simple-commands/goal.js +51 -63
- package/dist/src/cli/simple-commands/hive-mind/auto-save-middleware.js +208 -278
- package/dist/src/cli/simple-commands/hive-mind/communication.js +601 -696
- package/dist/src/cli/simple-commands/hive-mind/core.js +907 -979
- package/dist/src/cli/simple-commands/hive-mind/db-optimizer.js +406 -655
- package/dist/src/cli/simple-commands/hive-mind/mcp-wrapper.js +1125 -1245
- package/dist/src/cli/simple-commands/hive-mind/memory.js +854 -1090
- package/dist/src/cli/simple-commands/hive-mind/performance-optimizer.js +459 -574
- package/dist/src/cli/simple-commands/hive-mind/performance-test.js +263 -347
- package/dist/src/cli/simple-commands/hive-mind/queen.js +727 -768
- package/dist/src/cli/simple-commands/hive-mind/session-manager.js +745 -1049
- package/dist/src/cli/simple-commands/hive-mind-optimize.js +227 -283
- package/dist/src/cli/simple-commands/hive-mind-wizard.js +174 -217
- package/dist/src/cli/simple-commands/hive-mind.js +1842 -2283
- package/dist/src/cli/simple-commands/hive.js +90 -79
- package/dist/src/cli/simple-commands/hook-safety.js +431 -521
- package/dist/src/cli/simple-commands/hooks/session-start-soul.js +203 -254
- package/dist/src/cli/simple-commands/hooks.js +1064 -1204
- package/dist/src/cli/simple-commands/init/agent-copier.js +294 -319
- package/dist/src/cli/simple-commands/init/batch-init.js +496 -562
- package/dist/src/cli/simple-commands/init/claude-commands/claude-flow-commands.js +13 -19
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-claude-flow-commands.js +13 -19
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-slash-commands.js +61 -88
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-sparc-commands.js +125 -150
- package/dist/src/cli/simple-commands/init/claude-commands/slash-commands.js +42 -49
- package/dist/src/cli/simple-commands/init/claude-commands/sparc-commands.js +43 -61
- package/dist/src/cli/simple-commands/init/copy-revised-templates.js +141 -147
- package/dist/src/cli/simple-commands/init/executable-wrapper.js +31 -44
- package/dist/src/cli/simple-commands/init/gitignore-updater.js +64 -90
- package/dist/src/cli/simple-commands/init/help.js +104 -107
- package/dist/src/cli/simple-commands/init/hive-mind-init.js +509 -528
- package/dist/src/cli/simple-commands/init/index.js +1510 -1759
- package/dist/src/cli/simple-commands/init/performance-monitor.js +234 -317
- package/dist/src/cli/simple-commands/init/rollback/backup-manager.js +441 -504
- package/dist/src/cli/simple-commands/init/rollback/index.js +289 -364
- package/dist/src/cli/simple-commands/init/rollback/recovery-manager.js +652 -728
- package/dist/src/cli/simple-commands/init/rollback/rollback-executor.js +416 -481
- package/dist/src/cli/simple-commands/init/rollback/state-tracker.js +369 -448
- package/dist/src/cli/simple-commands/init/sparc/roo-readme.js +1 -2
- package/dist/src/cli/simple-commands/init/sparc/roomodes-config.js +122 -99
- package/dist/src/cli/simple-commands/init/sparc/workflows.js +32 -37
- package/dist/src/cli/simple-commands/init/sparc-structure.js +55 -62
- package/dist/src/cli/simple-commands/init/template-copier.js +421 -533
- package/dist/src/cli/simple-commands/init/templates/coordination-md.js +3 -6
- package/dist/src/cli/simple-commands/init/templates/enhanced-templates.js +344 -318
- package/dist/src/cli/simple-commands/init/templates/github-safe-enhanced.js +173 -218
- package/dist/src/cli/simple-commands/init/templates/github-safe.js +65 -75
- package/dist/src/cli/simple-commands/init/templates/memory-bank-md.js +3 -6
- package/dist/src/cli/simple-commands/init/templates/readme-files.js +2 -4
- package/dist/src/cli/simple-commands/init/templates/safe-hook-patterns.js +187 -230
- package/dist/src/cli/simple-commands/init/templates/sparc-modes.js +53 -80
- package/dist/src/cli/simple-commands/init/templates/verification-claude-md.js +101 -85
- package/dist/src/cli/simple-commands/init/validation/config-validator.js +283 -330
- package/dist/src/cli/simple-commands/init/validation/health-checker.js +495 -561
- package/dist/src/cli/simple-commands/init/validation/index.js +302 -358
- package/dist/src/cli/simple-commands/init/validation/mode-validator.js +308 -359
- package/dist/src/cli/simple-commands/init/validation/post-init-validator.js +389 -366
- package/dist/src/cli/simple-commands/init/validation/pre-init-validator.js +270 -268
- package/dist/src/cli/simple-commands/init/validation/test-runner.js +427 -447
- package/dist/src/cli/simple-commands/init.js +1 -2
- package/dist/src/cli/simple-commands/mcp-health.js +131 -158
- package/dist/src/cli/simple-commands/mcp-integration-layer.js +533 -634
- package/dist/src/cli/simple-commands/mcp.js +345 -400
- package/dist/src/cli/simple-commands/memory-consolidation.js +426 -537
- package/dist/src/cli/simple-commands/memory.js +247 -311
- package/dist/src/cli/simple-commands/migrate-hooks.js +39 -46
- package/dist/src/cli/simple-commands/monitor.js +294 -363
- package/dist/src/cli/simple-commands/neural.js +51 -65
- package/dist/src/cli/simple-commands/pair-autofix-only.js +538 -662
- package/dist/src/cli/simple-commands/pair-basic.js +528 -656
- package/dist/src/cli/simple-commands/pair-old.js +430 -543
- package/dist/src/cli/simple-commands/pair-working.js +615 -751
- package/dist/src/cli/simple-commands/pair.js +615 -751
- package/dist/src/cli/simple-commands/performance-hooks.js +83 -111
- package/dist/src/cli/simple-commands/performance-metrics.js +348 -433
- package/dist/src/cli/simple-commands/process-ui-enhanced.js +708 -787
- package/dist/src/cli/simple-commands/process-ui.js +230 -254
- package/dist/src/cli/simple-commands/realtime-update-system.js +525 -611
- package/dist/src/cli/simple-commands/sparc/architecture.js +1704 -1530
- package/dist/src/cli/simple-commands/sparc/commands.js +438 -516
- package/dist/src/cli/simple-commands/sparc/completion.js +1224 -1481
- package/dist/src/cli/simple-commands/sparc/coordinator.js +913 -978
- package/dist/src/cli/simple-commands/sparc/index.js +241 -298
- package/dist/src/cli/simple-commands/sparc/phase-base.js +314 -390
- package/dist/src/cli/simple-commands/sparc/pseudocode.js +965 -869
- package/dist/src/cli/simple-commands/sparc/refinement.js +980 -1273
- package/dist/src/cli/simple-commands/sparc/specification.js +559 -645
- package/dist/src/cli/simple-commands/sparc-modes/architect.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/ask.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/code.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/debug.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/devops.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/docs-writer.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/generic.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/index.js +47 -55
- package/dist/src/cli/simple-commands/sparc-modes/integration.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/mcp.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/monitoring.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/optimization.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/security-review.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/sparc-orchestrator.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/spec-pseudocode.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/supabase-admin.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/swarm.js +101 -87
- package/dist/src/cli/simple-commands/sparc-modes/tdd.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/tutorial.js +1 -1
- package/dist/src/cli/simple-commands/sparc.js +465 -493
- package/dist/src/cli/simple-commands/start-ui.js +108 -132
- package/dist/src/cli/simple-commands/start-wrapper.js +240 -268
- package/dist/src/cli/simple-commands/start.js +1 -1
- package/dist/src/cli/simple-commands/status.js +254 -275
- package/dist/src/cli/simple-commands/stream-chain-clean.js +128 -171
- package/dist/src/cli/simple-commands/stream-chain-fixed.js +61 -82
- package/dist/src/cli/simple-commands/stream-chain-real.js +267 -331
- package/dist/src/cli/simple-commands/stream-chain-working.js +211 -263
- package/dist/src/cli/simple-commands/stream-chain.js +260 -318
- package/dist/src/cli/simple-commands/stream-processor.js +290 -315
- package/dist/src/cli/simple-commands/swarm-executor.js +189 -222
- package/dist/src/cli/simple-commands/swarm-metrics-integration.js +208 -300
- package/dist/src/cli/simple-commands/swarm-ui.js +623 -703
- package/dist/src/cli/simple-commands/swarm-webui-integration.js +258 -286
- package/dist/src/cli/simple-commands/swarm.js +887 -1082
- package/dist/src/cli/simple-commands/task.js +161 -206
- package/dist/src/cli/simple-commands/timestamp-fix.js +59 -89
- package/dist/src/cli/simple-commands/token-tracker.js +258 -316
- package/dist/src/cli/simple-commands/tool-execution-framework.js +433 -519
- package/dist/src/cli/simple-commands/train-and-stream.js +275 -331
- package/dist/src/cli/simple-commands/training-pipeline.js +619 -725
- package/dist/src/cli/simple-commands/training.js +170 -227
- package/dist/src/cli/simple-commands/verification-hooks.js +261 -284
- package/dist/src/cli/simple-commands/verification-integration.js +389 -417
- package/dist/src/cli/simple-commands/verification-training-integration.js +486 -606
- package/dist/src/cli/simple-commands/verification.js +493 -513
- package/dist/src/cli/simple-commands/web-server.js +766 -836
- package/dist/src/cli/simple-commands/webui-validator.js +106 -124
- package/dist/src/coordination/event-bus/demo-wasm-integration.js +212 -251
- package/dist/src/coordination/event-bus/qe-event-bus.js +608 -748
- package/dist/src/coordination/event-bus/qe-event-bus.test.js +379 -454
- package/dist/src/coordination/iteration-tracker.js +363 -454
- package/dist/src/enterprise/analytics-manager.js +1135 -0
- package/dist/src/enterprise/audit-manager.js +1115 -0
- package/dist/src/enterprise/cloud-manager.js +891 -0
- package/dist/src/enterprise/deployment-manager.js +966 -0
- package/dist/src/enterprise/index.js +6 -0
- package/dist/src/enterprise/project-manager.js +584 -0
- package/dist/src/enterprise/security-manager.js +991 -0
- package/dist/src/index.js +1 -1
- package/dist/src/mcp/DEPRECATED.js +46 -60
- package/dist/src/mcp/fixes/mcp-error-fixes.js +115 -134
- package/dist/src/mcp/implementations/agent-tracker.js +114 -128
- package/dist/src/mcp/implementations/daa-tools.js +292 -350
- package/dist/src/mcp/implementations/workflow-tools.js +329 -361
- package/dist/src/mcp/mcp-config-manager.js +1183 -1331
- package/dist/src/mcp/mcp-server-novice-simplified.js +11 -17
- package/dist/src/mcp/mcp-server-novice.js +11 -17
- package/dist/src/mcp/mcp-server-sdk.js +11 -17
- package/dist/src/mcp/mcp-server.js +1620 -1484
- package/dist/src/mcp/ruv-swarm-wrapper.js +209 -239
- package/dist/src/memory/advanced-serializer.js +609 -589
- package/dist/src/memory/enhanced-examples.js +220 -305
- package/dist/src/memory/enhanced-memory.js +295 -336
- package/dist/src/memory/enhanced-session-serializer.js +408 -492
- package/dist/src/memory/fallback-memory-system.js +900 -1021
- package/dist/src/memory/fallback-store.js +93 -131
- package/dist/src/memory/high-performance-serialization.js +592 -730
- package/dist/src/memory/in-memory-store.js +161 -213
- package/dist/src/memory/index.js +123 -157
- package/dist/src/memory/lock-free-structures.js +578 -764
- package/dist/src/memory/memory-mapped-persistence.js +585 -766
- package/dist/src/memory/memory-pressure-manager.js +569 -707
- package/dist/src/memory/migration.js +358 -445
- package/dist/src/memory/shared-memory.js +641 -768
- package/dist/src/memory/sqlite-store.js +245 -325
- package/dist/src/memory/sqlite-wrapper.js +122 -151
- package/dist/src/memory/swarm-memory.js +470 -603
- package/dist/src/memory/test-example.js +126 -134
- package/dist/src/memory/ultra-fast-memory-store.js +622 -821
- package/dist/src/memory/unified-memory-manager.js +356 -437
- package/dist/src/migration/index.js +92 -0
- package/dist/src/migration/logger.js +121 -0
- package/dist/src/migration/migration-analyzer.js +268 -0
- package/dist/src/migration/migration-runner.js +522 -0
- package/dist/src/migration/migration-validator.js +285 -0
- package/dist/src/migration/progress-reporter.js +150 -0
- package/dist/src/migration/rollback-manager.js +321 -0
- package/dist/src/migration/tests/migration-system.test.js +7 -0
- package/dist/src/migration/types.js +3 -0
- package/dist/src/swarm/CodeRefactoringSwarm.js +777 -952
- package/dist/src/swarm/__tests__/integration.test.js +227 -0
- package/dist/src/swarm/__tests__/prompt-copier.test.js +344 -0
- package/dist/src/swarm/advanced-orchestrator.js +1095 -0
- package/dist/src/swarm/claude-code-interface.js +961 -0
- package/dist/src/swarm/claude-flow-executor.js +229 -0
- package/dist/src/swarm/consensus-coordinator.js +475 -0
- package/dist/src/swarm/coordinator.js +2993 -0
- package/dist/src/swarm/direct-executor.js +1180 -0
- package/dist/src/swarm/error-recovery/advanced-error-detection.js +691 -0
- package/dist/src/swarm/error-recovery/automated-recovery-workflows.js +998 -0
- package/dist/src/swarm/error-recovery/error-recovery-coordinator.js +1197 -0
- package/dist/src/swarm/error-recovery/recovery-monitoring.js +772 -0
- package/dist/src/swarm/error-recovery/resilience-architecture.js +714 -0
- package/dist/src/swarm/error-recovery/self-healing-mechanisms.js +1319 -0
- package/dist/src/swarm/error-recovery/test-error-recovery-effectiveness.js +808 -0
- package/dist/src/swarm/executor-v2.js +322 -0
- package/dist/src/swarm/executor.js +815 -0
- package/dist/src/swarm/hive-mind-integration.js +703 -0
- package/dist/src/swarm/index.js +41 -0
- package/dist/src/swarm/json-output-aggregator.js +267 -0
- package/dist/src/swarm/large-scale-coordinator.js +542 -0
- package/dist/src/swarm/mcp-integration-wrapper.js +628 -0
- package/dist/src/swarm/memory.js +1117 -0
- package/dist/src/swarm/optimizations/__tests__/optimization.test.js +348 -0
- package/dist/src/swarm/optimizations/async-file-manager.js +285 -0
- package/dist/src/swarm/optimizations/circular-buffer.js +162 -0
- package/dist/src/swarm/optimizations/connection-pool.js +244 -0
- package/dist/src/swarm/optimizations/index.js +28 -0
- package/dist/src/swarm/optimizations/optimized-executor.js +320 -0
- package/dist/src/swarm/optimizations/ttl-map.js +234 -0
- package/dist/src/swarm/prompt-cli.js +200 -0
- package/dist/src/swarm/prompt-copier-enhanced.js +202 -0
- package/dist/src/swarm/prompt-copier.js +381 -0
- package/dist/src/swarm/prompt-manager.js +295 -0
- package/dist/src/swarm/prompt-utils.js +310 -0
- package/dist/src/swarm/result-aggregator.js +718 -0
- package/dist/src/swarm/sparc-executor.js +1568 -0
- package/dist/src/swarm/strategies/auto.js +758 -0
- package/dist/src/swarm/strategies/base.js +128 -0
- package/dist/src/swarm/strategies/research.js +914 -0
- package/dist/src/swarm/strategies/strategy-metrics-patch.js +2 -0
- package/dist/src/swarm/types.js +52 -0
- package/dist/src/swarm/workers/copy-worker.js +56 -0
- package/dist/src/utils/__tests__/github-cli-safety-wrapper.test.js +332 -400
- package/dist/src/utils/github-cli-safe.js +56 -64
- package/dist/src/utils/github-cli-safety-wrapper.js +451 -546
- package/dist/src/utils/npx-isolated-cache.js +104 -119
- package/dist/src/utils/preference-manager.js +622 -652
- package/dist/src/utils/timezone-utils.js +86 -105
- package/dist/src/validators/epic-config-schema.js +214 -0
- package/dist/src/validators/index.js +10 -0
- package/dist/src/validators/swarm-init-validator.js +259 -0
- package/dist/src/validators/todowrite-batching-validator.js +215 -0
- package/dist/src/validators/todowrite-integration.js +187 -0
- package/package.json +2 -2
|
@@ -0,0 +1,815 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Advanced Task Executor with timeout handling and process management
|
|
3
|
+
*/ function _define_property(obj, key, value) {
|
|
4
|
+
if (key in obj) {
|
|
5
|
+
Object.defineProperty(obj, key, {
|
|
6
|
+
value: value,
|
|
7
|
+
enumerable: true,
|
|
8
|
+
configurable: true,
|
|
9
|
+
writable: true
|
|
10
|
+
});
|
|
11
|
+
} else {
|
|
12
|
+
obj[key] = value;
|
|
13
|
+
}
|
|
14
|
+
return obj;
|
|
15
|
+
}
|
|
16
|
+
import { spawn } from "node:child_process";
|
|
17
|
+
import { EventEmitter } from "node:events";
|
|
18
|
+
import * as fs from "node:fs/promises";
|
|
19
|
+
import * as path from "node:path";
|
|
20
|
+
import * as os from "node:os";
|
|
21
|
+
import { Logger } from "../core/logger.js";
|
|
22
|
+
import { generateId } from "../utils/helpers.js";
|
|
23
|
+
import { SWARM_CONSTANTS } from "./types.js";
|
|
24
|
+
export class TaskExecutor extends EventEmitter {
|
|
25
|
+
async initialize() {
|
|
26
|
+
this.logger.info('Initializing task executor...');
|
|
27
|
+
await this.resourceMonitor.initialize();
|
|
28
|
+
await this.processPool.initialize();
|
|
29
|
+
this.logger.info('Task executor initialized');
|
|
30
|
+
}
|
|
31
|
+
async shutdown() {
|
|
32
|
+
this.logger.info('Shutting down task executor...');
|
|
33
|
+
// Stop all active executions
|
|
34
|
+
const stopPromises = Array.from(this.activeExecutions.values()).map((session)=>this.stopExecution(session.id, 'Executor shutdown'));
|
|
35
|
+
await Promise.allSettled(stopPromises);
|
|
36
|
+
await this.processPool.shutdown();
|
|
37
|
+
await this.resourceMonitor.shutdown();
|
|
38
|
+
this.logger.info('Task executor shut down');
|
|
39
|
+
}
|
|
40
|
+
async executeTask(task, agent, options = {}) {
|
|
41
|
+
const sessionId = generateId('execution');
|
|
42
|
+
const context = await this.createExecutionContext(task, agent);
|
|
43
|
+
const config = {
|
|
44
|
+
...this.config,
|
|
45
|
+
...options
|
|
46
|
+
};
|
|
47
|
+
this.logger.info('Starting task execution', {
|
|
48
|
+
sessionId,
|
|
49
|
+
taskId: task.id.id,
|
|
50
|
+
agentId: agent.id.id,
|
|
51
|
+
timeout: config.timeoutMs
|
|
52
|
+
});
|
|
53
|
+
const session = new ExecutionSession(sessionId, task, agent, context, config, this.logger);
|
|
54
|
+
this.activeExecutions.set(sessionId, session);
|
|
55
|
+
try {
|
|
56
|
+
// Setup monitoring
|
|
57
|
+
this.resourceMonitor.startMonitoring(sessionId, context.resources);
|
|
58
|
+
// Execute with timeout protection
|
|
59
|
+
const result = await this.executeWithTimeout(session);
|
|
60
|
+
// Cleanup
|
|
61
|
+
await this.cleanupExecution(session);
|
|
62
|
+
this.logger.info('Task execution completed', {
|
|
63
|
+
sessionId,
|
|
64
|
+
success: result.success,
|
|
65
|
+
duration: result.duration
|
|
66
|
+
});
|
|
67
|
+
return result;
|
|
68
|
+
} catch (error) {
|
|
69
|
+
this.logger.error('Task execution failed', {
|
|
70
|
+
sessionId,
|
|
71
|
+
error: error instanceof Error ? error.message : String(error),
|
|
72
|
+
stack: error.stack
|
|
73
|
+
});
|
|
74
|
+
await this.cleanupExecution(session);
|
|
75
|
+
throw error;
|
|
76
|
+
} finally{
|
|
77
|
+
this.activeExecutions.delete(sessionId);
|
|
78
|
+
this.resourceMonitor.stopMonitoring(sessionId);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
async stopExecution(sessionId, reason) {
|
|
82
|
+
const session = this.activeExecutions.get(sessionId);
|
|
83
|
+
if (!session) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
this.logger.info('Stopping execution', {
|
|
87
|
+
sessionId,
|
|
88
|
+
reason
|
|
89
|
+
});
|
|
90
|
+
try {
|
|
91
|
+
await session.stop(reason);
|
|
92
|
+
} catch (error) {
|
|
93
|
+
this.logger.error('Error stopping execution', {
|
|
94
|
+
sessionId,
|
|
95
|
+
error
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
async executeClaudeTask(task, agent, claudeOptions = {}) {
|
|
100
|
+
const sessionId = generateId('claude-execution');
|
|
101
|
+
const context = await this.createExecutionContext(task, agent);
|
|
102
|
+
this.logger.info('Starting Claude task execution', {
|
|
103
|
+
sessionId,
|
|
104
|
+
taskId: task.id.id,
|
|
105
|
+
agentId: agent.id.id
|
|
106
|
+
});
|
|
107
|
+
try {
|
|
108
|
+
return await this.executeClaudeWithTimeout(sessionId, task, agent, context, claudeOptions);
|
|
109
|
+
} catch (error) {
|
|
110
|
+
this.logger.error('Claude task execution failed', {
|
|
111
|
+
sessionId,
|
|
112
|
+
error: error instanceof Error ? error.message : String(error)
|
|
113
|
+
});
|
|
114
|
+
throw error;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
getActiveExecutions() {
|
|
118
|
+
return Array.from(this.activeExecutions.values());
|
|
119
|
+
}
|
|
120
|
+
getExecutionMetrics() {
|
|
121
|
+
return {
|
|
122
|
+
activeExecutions: this.activeExecutions.size,
|
|
123
|
+
totalExecutions: this.processPool.getTotalExecutions(),
|
|
124
|
+
averageDuration: this.processPool.getAverageDuration(),
|
|
125
|
+
successRate: this.processPool.getSuccessRate(),
|
|
126
|
+
resourceUtilization: this.resourceMonitor.getUtilization(),
|
|
127
|
+
errorRate: this.processPool.getErrorRate()
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
async executeWithTimeout(session) {
|
|
131
|
+
return new Promise((resolve, reject)=>{
|
|
132
|
+
const timeout = setTimeout(()=>{
|
|
133
|
+
this.logger.warn('Execution timeout', {
|
|
134
|
+
sessionId: session.id,
|
|
135
|
+
timeout: session.config.timeoutMs
|
|
136
|
+
});
|
|
137
|
+
session.stop('Timeout').then(()=>{
|
|
138
|
+
reject(new Error(`Execution timed out after ${session.config.timeoutMs}ms`));
|
|
139
|
+
});
|
|
140
|
+
}, session.config.timeoutMs);
|
|
141
|
+
session.execute().then((result)=>{
|
|
142
|
+
clearTimeout(timeout);
|
|
143
|
+
resolve(result);
|
|
144
|
+
}).catch((error)=>{
|
|
145
|
+
clearTimeout(timeout);
|
|
146
|
+
reject(error);
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
async executeClaudeWithTimeout(sessionId, task, agent, context, options) {
|
|
151
|
+
const startTime = Date.now();
|
|
152
|
+
const timeout = options.timeout || this.config.timeoutMs;
|
|
153
|
+
// Build Claude command
|
|
154
|
+
const command = this.buildClaudeCommand(task, agent, options);
|
|
155
|
+
// Create execution environment
|
|
156
|
+
const env = {
|
|
157
|
+
...process.env,
|
|
158
|
+
...context.environment,
|
|
159
|
+
CLAUDE_TASK_ID: task.id.id,
|
|
160
|
+
CLAUDE_AGENT_ID: agent.id.id,
|
|
161
|
+
CLAUDE_SESSION_ID: sessionId,
|
|
162
|
+
CLAUDE_WORKING_DIR: context.workingDirectory
|
|
163
|
+
};
|
|
164
|
+
this.logger.debug('Executing Claude command', {
|
|
165
|
+
sessionId,
|
|
166
|
+
command: command.command,
|
|
167
|
+
args: command.args,
|
|
168
|
+
workingDir: context.workingDirectory
|
|
169
|
+
});
|
|
170
|
+
return new Promise((resolve, reject)=>{
|
|
171
|
+
let outputBuffer = '';
|
|
172
|
+
let errorBuffer = '';
|
|
173
|
+
let isTimeout = false;
|
|
174
|
+
let process1 = null;
|
|
175
|
+
// Setup timeout
|
|
176
|
+
const timeoutHandle = setTimeout(()=>{
|
|
177
|
+
isTimeout = true;
|
|
178
|
+
if (process1) {
|
|
179
|
+
this.logger.warn('Claude execution timeout, killing process', {
|
|
180
|
+
sessionId,
|
|
181
|
+
pid: process1.pid,
|
|
182
|
+
timeout
|
|
183
|
+
});
|
|
184
|
+
// Graceful shutdown first
|
|
185
|
+
process1.kill('SIGTERM');
|
|
186
|
+
// Force kill after grace period
|
|
187
|
+
setTimeout(()=>{
|
|
188
|
+
if (process1 && !process1.killed) {
|
|
189
|
+
process1.kill('SIGKILL');
|
|
190
|
+
}
|
|
191
|
+
}, this.config.killTimeout);
|
|
192
|
+
}
|
|
193
|
+
}, timeout);
|
|
194
|
+
try {
|
|
195
|
+
// Spawn Claude process
|
|
196
|
+
process1 = spawn(command.command, command.args, {
|
|
197
|
+
cwd: context.workingDirectory,
|
|
198
|
+
env,
|
|
199
|
+
stdio: [
|
|
200
|
+
'pipe',
|
|
201
|
+
'pipe',
|
|
202
|
+
'pipe'
|
|
203
|
+
],
|
|
204
|
+
detached: options.detached || false
|
|
205
|
+
});
|
|
206
|
+
if (!process1.pid) {
|
|
207
|
+
clearTimeout(timeoutHandle);
|
|
208
|
+
reject(new Error('Failed to spawn Claude process'));
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
this.logger.info('Claude process started', {
|
|
212
|
+
sessionId,
|
|
213
|
+
pid: process1.pid,
|
|
214
|
+
command: command.command
|
|
215
|
+
});
|
|
216
|
+
// Handle process output
|
|
217
|
+
if (process1.stdout) {
|
|
218
|
+
process1.stdout.on('data', (data)=>{
|
|
219
|
+
const chunk = data.toString();
|
|
220
|
+
outputBuffer += chunk;
|
|
221
|
+
if (this.config.streamOutput) {
|
|
222
|
+
this.emit('output', {
|
|
223
|
+
sessionId,
|
|
224
|
+
type: 'stdout',
|
|
225
|
+
data: chunk
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
if (process1.stderr) {
|
|
231
|
+
process1.stderr.on('data', (data)=>{
|
|
232
|
+
const chunk = data.toString();
|
|
233
|
+
errorBuffer += chunk;
|
|
234
|
+
if (this.config.streamOutput) {
|
|
235
|
+
this.emit('output', {
|
|
236
|
+
sessionId,
|
|
237
|
+
type: 'stderr',
|
|
238
|
+
data: chunk
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
// Handle process completion
|
|
244
|
+
process1.on('close', async (code, signal)=>{
|
|
245
|
+
clearTimeout(timeoutHandle);
|
|
246
|
+
const duration = Date.now() - startTime;
|
|
247
|
+
const exitCode = code || 0;
|
|
248
|
+
this.logger.info('Claude process completed', {
|
|
249
|
+
sessionId,
|
|
250
|
+
exitCode,
|
|
251
|
+
signal,
|
|
252
|
+
duration,
|
|
253
|
+
isTimeout
|
|
254
|
+
});
|
|
255
|
+
try {
|
|
256
|
+
// Collect resource usage
|
|
257
|
+
const resourceUsage = await this.collectResourceUsage(sessionId);
|
|
258
|
+
// Collect artifacts
|
|
259
|
+
const artifacts = await this.collectArtifacts(context);
|
|
260
|
+
const result = {
|
|
261
|
+
success: !isTimeout && exitCode === 0,
|
|
262
|
+
output: outputBuffer,
|
|
263
|
+
error: errorBuffer,
|
|
264
|
+
exitCode,
|
|
265
|
+
duration,
|
|
266
|
+
resourcesUsed: resourceUsage,
|
|
267
|
+
artifacts,
|
|
268
|
+
metadata: {
|
|
269
|
+
sessionId,
|
|
270
|
+
timeout: isTimeout,
|
|
271
|
+
signal,
|
|
272
|
+
command: command.command,
|
|
273
|
+
args: command.args
|
|
274
|
+
}
|
|
275
|
+
};
|
|
276
|
+
if (isTimeout) {
|
|
277
|
+
reject(new Error(`Claude execution timed out after ${timeout}ms`));
|
|
278
|
+
} else if (exitCode !== 0) {
|
|
279
|
+
reject(new Error(`Claude execution failed with exit code ${exitCode}: ${errorBuffer}`));
|
|
280
|
+
} else {
|
|
281
|
+
resolve(result);
|
|
282
|
+
}
|
|
283
|
+
} catch (error) {
|
|
284
|
+
reject(error);
|
|
285
|
+
}
|
|
286
|
+
});
|
|
287
|
+
// Handle process errors
|
|
288
|
+
process1.on('error', (error)=>{
|
|
289
|
+
clearTimeout(timeoutHandle);
|
|
290
|
+
this.logger.error('Claude process error', {
|
|
291
|
+
sessionId,
|
|
292
|
+
error: error instanceof Error ? error.message : String(error)
|
|
293
|
+
});
|
|
294
|
+
reject(error);
|
|
295
|
+
});
|
|
296
|
+
// Send input if provided
|
|
297
|
+
if (command.input && process1.stdin) {
|
|
298
|
+
process1.stdin.write(command.input);
|
|
299
|
+
process1.stdin.end();
|
|
300
|
+
}
|
|
301
|
+
// If detached, unreference to allow parent to exit
|
|
302
|
+
if (options.detached) {
|
|
303
|
+
process1.unref();
|
|
304
|
+
}
|
|
305
|
+
} catch (error) {
|
|
306
|
+
clearTimeout(timeoutHandle);
|
|
307
|
+
reject(error);
|
|
308
|
+
}
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
buildClaudeCommand(task, agent, options) {
|
|
312
|
+
const args = [];
|
|
313
|
+
let input = '';
|
|
314
|
+
// Build prompt
|
|
315
|
+
const prompt = this.buildClaudePrompt(task, agent);
|
|
316
|
+
if (options.useStdin) {
|
|
317
|
+
// Send prompt via stdin
|
|
318
|
+
input = prompt;
|
|
319
|
+
} else {
|
|
320
|
+
// Send prompt as argument
|
|
321
|
+
args.push('-p', prompt);
|
|
322
|
+
}
|
|
323
|
+
// Add tools
|
|
324
|
+
if (task.requirements.tools.length > 0) {
|
|
325
|
+
args.push('--allowedTools', task.requirements.tools.join(','));
|
|
326
|
+
}
|
|
327
|
+
// Add model if specified
|
|
328
|
+
if (options.model) {
|
|
329
|
+
args.push('--model', options.model);
|
|
330
|
+
}
|
|
331
|
+
// Add max tokens if specified
|
|
332
|
+
if (options.maxTokens) {
|
|
333
|
+
args.push('--max-tokens', options.maxTokens.toString());
|
|
334
|
+
}
|
|
335
|
+
// Add temperature if specified
|
|
336
|
+
if (options.temperature !== undefined) {
|
|
337
|
+
args.push('--temperature', options.temperature.toString());
|
|
338
|
+
}
|
|
339
|
+
// Skip permissions check for swarm execution
|
|
340
|
+
args.push('--dangerously-skip-permissions');
|
|
341
|
+
// Add output format
|
|
342
|
+
if (options.outputFormat) {
|
|
343
|
+
args.push('--output-format', options.outputFormat);
|
|
344
|
+
}
|
|
345
|
+
return {
|
|
346
|
+
command: options.claudePath || 'claude',
|
|
347
|
+
args,
|
|
348
|
+
input
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
buildClaudePrompt(task, agent) {
|
|
352
|
+
const sections = [];
|
|
353
|
+
// Agent identification
|
|
354
|
+
sections.push(`You are ${agent.name}, a ${agent.type} agent in a swarm system.`);
|
|
355
|
+
sections.push(`Agent ID: ${agent.id.id}`);
|
|
356
|
+
sections.push(`Swarm ID: ${agent.id.swarmId}`);
|
|
357
|
+
sections.push('');
|
|
358
|
+
// Task information
|
|
359
|
+
sections.push(`TASK: ${task.name}`);
|
|
360
|
+
sections.push(`Type: ${task.type}`);
|
|
361
|
+
sections.push(`Priority: ${task.priority}`);
|
|
362
|
+
sections.push('');
|
|
363
|
+
// Task description
|
|
364
|
+
sections.push('DESCRIPTION:');
|
|
365
|
+
sections.push(task.description);
|
|
366
|
+
sections.push('');
|
|
367
|
+
// Task instructions
|
|
368
|
+
sections.push('INSTRUCTIONS:');
|
|
369
|
+
sections.push(task.instructions);
|
|
370
|
+
sections.push('');
|
|
371
|
+
// Context if provided
|
|
372
|
+
if (Object.keys(task.context).length > 0) {
|
|
373
|
+
sections.push('CONTEXT:');
|
|
374
|
+
sections.push(JSON.stringify(task.context, null, 2));
|
|
375
|
+
sections.push('');
|
|
376
|
+
}
|
|
377
|
+
// Input data if provided
|
|
378
|
+
if (task.input && Object.keys(task.input).length > 0) {
|
|
379
|
+
sections.push('INPUT DATA:');
|
|
380
|
+
sections.push(JSON.stringify(task.input, null, 2));
|
|
381
|
+
sections.push('');
|
|
382
|
+
}
|
|
383
|
+
// Examples if provided
|
|
384
|
+
if (task.examples && task.examples.length > 0) {
|
|
385
|
+
sections.push('EXAMPLES:');
|
|
386
|
+
task.examples.forEach((example, index)=>{
|
|
387
|
+
sections.push(`Example ${index + 1}:`);
|
|
388
|
+
sections.push(JSON.stringify(example, null, 2));
|
|
389
|
+
sections.push('');
|
|
390
|
+
});
|
|
391
|
+
}
|
|
392
|
+
// Expected output format
|
|
393
|
+
sections.push('EXPECTED OUTPUT:');
|
|
394
|
+
if (task.expectedOutput) {
|
|
395
|
+
sections.push(JSON.stringify(task.expectedOutput, null, 2));
|
|
396
|
+
} else {
|
|
397
|
+
sections.push('Provide a structured response with:');
|
|
398
|
+
sections.push('- Summary of what was accomplished');
|
|
399
|
+
sections.push('- Any artifacts created (files, data, etc.)');
|
|
400
|
+
sections.push('- Recommendations or next steps');
|
|
401
|
+
sections.push('- Any issues encountered');
|
|
402
|
+
}
|
|
403
|
+
sections.push('');
|
|
404
|
+
// Quality requirements
|
|
405
|
+
sections.push('QUALITY REQUIREMENTS:');
|
|
406
|
+
sections.push(`- Quality threshold: ${task.requirements.minReliability || 0.8}`);
|
|
407
|
+
if (task.requirements.reviewRequired) {
|
|
408
|
+
sections.push('- Review required before completion');
|
|
409
|
+
}
|
|
410
|
+
if (task.requirements.testingRequired) {
|
|
411
|
+
sections.push('- Testing required before completion');
|
|
412
|
+
}
|
|
413
|
+
if (task.requirements.documentationRequired) {
|
|
414
|
+
sections.push('- Documentation required');
|
|
415
|
+
}
|
|
416
|
+
sections.push('');
|
|
417
|
+
// Capabilities and constraints
|
|
418
|
+
sections.push('CAPABILITIES:');
|
|
419
|
+
const capabilities = Object.entries(agent.capabilities).filter(([key, value])=>typeof value === 'boolean' && value).map(([key])=>key);
|
|
420
|
+
sections.push(capabilities.join(', '));
|
|
421
|
+
sections.push('');
|
|
422
|
+
sections.push('CONSTRAINTS:');
|
|
423
|
+
sections.push(`- Maximum execution time: ${task.constraints.timeoutAfter || SWARM_CONSTANTS.DEFAULT_TASK_TIMEOUT}ms`);
|
|
424
|
+
sections.push(`- Maximum retries: ${task.constraints.maxRetries || SWARM_CONSTANTS.MAX_RETRIES}`);
|
|
425
|
+
if (task.constraints.deadline) {
|
|
426
|
+
sections.push(`- Deadline: ${task.constraints.deadline.toISOString()}`);
|
|
427
|
+
}
|
|
428
|
+
sections.push('');
|
|
429
|
+
// Final instructions
|
|
430
|
+
sections.push('EXECUTION GUIDELINES:');
|
|
431
|
+
sections.push('1. Read and understand the task completely before starting');
|
|
432
|
+
sections.push('2. Use your capabilities efficiently and effectively');
|
|
433
|
+
sections.push('3. Provide detailed output about your progress and results');
|
|
434
|
+
sections.push('4. Handle errors gracefully and report issues clearly');
|
|
435
|
+
sections.push('5. Ensure your work meets the quality requirements');
|
|
436
|
+
sections.push('6. When complete, provide a clear summary of what was accomplished');
|
|
437
|
+
sections.push('');
|
|
438
|
+
sections.push('Begin your task execution now.');
|
|
439
|
+
return sections.join('\n');
|
|
440
|
+
}
|
|
441
|
+
async createExecutionContext(task, agent) {
|
|
442
|
+
const baseDir = path.join(os.tmpdir(), 'swarm-execution', task.id.id);
|
|
443
|
+
const workingDir = path.join(baseDir, 'work');
|
|
444
|
+
const tempDir = path.join(baseDir, 'temp');
|
|
445
|
+
const logDir = path.join(baseDir, 'logs');
|
|
446
|
+
// Create directories
|
|
447
|
+
await fs.mkdir(workingDir, {
|
|
448
|
+
recursive: true
|
|
449
|
+
});
|
|
450
|
+
await fs.mkdir(tempDir, {
|
|
451
|
+
recursive: true
|
|
452
|
+
});
|
|
453
|
+
await fs.mkdir(logDir, {
|
|
454
|
+
recursive: true
|
|
455
|
+
});
|
|
456
|
+
return {
|
|
457
|
+
task,
|
|
458
|
+
agent,
|
|
459
|
+
workingDirectory: workingDir,
|
|
460
|
+
tempDirectory: tempDir,
|
|
461
|
+
logDirectory: logDir,
|
|
462
|
+
environment: {
|
|
463
|
+
NODE_ENV: 'production',
|
|
464
|
+
SWARM_MODE: 'execution',
|
|
465
|
+
AGENT_TYPE: agent.type,
|
|
466
|
+
TASK_TYPE: task.type,
|
|
467
|
+
...agent.environment.credentials
|
|
468
|
+
},
|
|
469
|
+
resources: {
|
|
470
|
+
maxMemory: task.requirements.memoryRequired || SWARM_CONSTANTS.DEFAULT_MEMORY_LIMIT,
|
|
471
|
+
maxCpuTime: task.requirements.maxDuration || SWARM_CONSTANTS.DEFAULT_TASK_TIMEOUT,
|
|
472
|
+
maxDiskSpace: 1024 * 1024 * 1024,
|
|
473
|
+
maxNetworkConnections: 10,
|
|
474
|
+
maxFileHandles: 100,
|
|
475
|
+
priority: this.getPriorityNumber(task.priority)
|
|
476
|
+
}
|
|
477
|
+
};
|
|
478
|
+
}
|
|
479
|
+
async cleanupExecution(session) {
|
|
480
|
+
try {
|
|
481
|
+
await session.cleanup();
|
|
482
|
+
this.logger.debug('Execution cleanup completed', {
|
|
483
|
+
sessionId: session.id
|
|
484
|
+
});
|
|
485
|
+
} catch (error) {
|
|
486
|
+
this.logger.warn('Error during execution cleanup', {
|
|
487
|
+
sessionId: session.id,
|
|
488
|
+
error: error instanceof Error ? error.message : String(error)
|
|
489
|
+
});
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
async collectResourceUsage(sessionId) {
|
|
493
|
+
return this.resourceMonitor.getUsage(sessionId);
|
|
494
|
+
}
|
|
495
|
+
async collectArtifacts(context) {
|
|
496
|
+
const artifacts = {};
|
|
497
|
+
try {
|
|
498
|
+
// Scan working directory for artifacts
|
|
499
|
+
const files = await this.scanDirectory(context.workingDirectory);
|
|
500
|
+
artifacts.files = files;
|
|
501
|
+
// Check for specific artifact types
|
|
502
|
+
artifacts.logs = await this.collectLogs(context.logDirectory);
|
|
503
|
+
artifacts.outputs = await this.collectOutputs(context.workingDirectory);
|
|
504
|
+
} catch (error) {
|
|
505
|
+
this.logger.warn('Error collecting artifacts', {
|
|
506
|
+
workingDir: context.workingDirectory,
|
|
507
|
+
error: error instanceof Error ? error.message : String(error)
|
|
508
|
+
});
|
|
509
|
+
}
|
|
510
|
+
return artifacts;
|
|
511
|
+
}
|
|
512
|
+
async scanDirectory(dirPath) {
|
|
513
|
+
try {
|
|
514
|
+
const entries = await fs.readdir(dirPath, {
|
|
515
|
+
withFileTypes: true
|
|
516
|
+
});
|
|
517
|
+
const files = [];
|
|
518
|
+
for (const entry of entries){
|
|
519
|
+
const fullPath = path.join(dirPath, entry.name);
|
|
520
|
+
if (entry.isFile()) {
|
|
521
|
+
files.push(fullPath);
|
|
522
|
+
} else if (entry.isDirectory()) {
|
|
523
|
+
const subFiles = await this.scanDirectory(fullPath);
|
|
524
|
+
files.push(...subFiles);
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
return files;
|
|
528
|
+
} catch (error) {
|
|
529
|
+
return [];
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
async collectLogs(logDir) {
|
|
533
|
+
const logs = {};
|
|
534
|
+
try {
|
|
535
|
+
const files = await fs.readdir(logDir);
|
|
536
|
+
for (const file of files){
|
|
537
|
+
if (file.endsWith('.log')) {
|
|
538
|
+
const filePath = path.join(logDir, file);
|
|
539
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
540
|
+
logs[file] = content;
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
} catch (error) {
|
|
544
|
+
// Log directory might not exist
|
|
545
|
+
}
|
|
546
|
+
return logs;
|
|
547
|
+
}
|
|
548
|
+
async collectOutputs(workingDir) {
|
|
549
|
+
const outputs = {};
|
|
550
|
+
try {
|
|
551
|
+
// Look for common output files
|
|
552
|
+
const outputFiles = [
|
|
553
|
+
'output.json',
|
|
554
|
+
'result.json',
|
|
555
|
+
'response.json'
|
|
556
|
+
];
|
|
557
|
+
for (const fileName of outputFiles){
|
|
558
|
+
const filePath = path.join(workingDir, fileName);
|
|
559
|
+
try {
|
|
560
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
561
|
+
outputs[fileName] = JSON.parse(content);
|
|
562
|
+
} catch (error) {
|
|
563
|
+
// File doesn't exist or isn't valid JSON
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
} catch (error) {
|
|
567
|
+
// Working directory might not exist
|
|
568
|
+
}
|
|
569
|
+
return outputs;
|
|
570
|
+
}
|
|
571
|
+
getPriorityNumber(priority) {
|
|
572
|
+
switch(priority){
|
|
573
|
+
case 'critical':
|
|
574
|
+
return 0;
|
|
575
|
+
case 'high':
|
|
576
|
+
return 1;
|
|
577
|
+
case 'normal':
|
|
578
|
+
return 2;
|
|
579
|
+
case 'low':
|
|
580
|
+
return 3;
|
|
581
|
+
case 'background':
|
|
582
|
+
return 4;
|
|
583
|
+
default:
|
|
584
|
+
return 2;
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
mergeWithDefaults(config) {
|
|
588
|
+
return {
|
|
589
|
+
timeoutMs: SWARM_CONSTANTS.DEFAULT_TASK_TIMEOUT,
|
|
590
|
+
retryAttempts: SWARM_CONSTANTS.MAX_RETRIES,
|
|
591
|
+
killTimeout: 5000,
|
|
592
|
+
resourceLimits: {
|
|
593
|
+
maxMemory: SWARM_CONSTANTS.DEFAULT_MEMORY_LIMIT,
|
|
594
|
+
maxCpuTime: SWARM_CONSTANTS.DEFAULT_TASK_TIMEOUT,
|
|
595
|
+
maxDiskSpace: 1024 * 1024 * 1024,
|
|
596
|
+
maxNetworkConnections: 10,
|
|
597
|
+
maxFileHandles: 100,
|
|
598
|
+
priority: 2
|
|
599
|
+
},
|
|
600
|
+
sandboxed: true,
|
|
601
|
+
logLevel: 'info',
|
|
602
|
+
captureOutput: true,
|
|
603
|
+
streamOutput: false,
|
|
604
|
+
enableMetrics: true,
|
|
605
|
+
...config
|
|
606
|
+
};
|
|
607
|
+
}
|
|
608
|
+
setupEventHandlers() {
|
|
609
|
+
// Handle resource limit violations
|
|
610
|
+
this.resourceMonitor.on('limit-violation', (data)=>{
|
|
611
|
+
this.logger.warn('Resource limit violation', data);
|
|
612
|
+
const session = this.activeExecutions.get(data.sessionId);
|
|
613
|
+
if (session) {
|
|
614
|
+
session.stop('Resource limit violation').catch((error)=>{
|
|
615
|
+
this.logger.error('Error stopping session due to resource violation', {
|
|
616
|
+
sessionId: data.sessionId,
|
|
617
|
+
error
|
|
618
|
+
});
|
|
619
|
+
});
|
|
620
|
+
}
|
|
621
|
+
});
|
|
622
|
+
// Handle process pool events
|
|
623
|
+
this.processPool.on('process-failed', (data)=>{
|
|
624
|
+
this.logger.error('Process failed in pool', data);
|
|
625
|
+
});
|
|
626
|
+
}
|
|
627
|
+
constructor(config = {}){
|
|
628
|
+
super(), _define_property(this, "logger", void 0), _define_property(this, "config", void 0), _define_property(this, "activeExecutions", new Map()), _define_property(this, "resourceMonitor", void 0), _define_property(this, "processPool", void 0);
|
|
629
|
+
this.config = this.mergeWithDefaults(config);
|
|
630
|
+
this.logger = new Logger({
|
|
631
|
+
level: this.config.logLevel || 'info',
|
|
632
|
+
format: 'text',
|
|
633
|
+
destination: 'console'
|
|
634
|
+
}, {
|
|
635
|
+
component: 'TaskExecutor'
|
|
636
|
+
});
|
|
637
|
+
this.resourceMonitor = new ResourceMonitor();
|
|
638
|
+
this.processPool = new ProcessPool(this.config);
|
|
639
|
+
this.setupEventHandlers();
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
// ===== SUPPORTING CLASSES =====
|
|
643
|
+
let ExecutionSession = class ExecutionSession {
|
|
644
|
+
async execute() {
|
|
645
|
+
this.startTime = new Date();
|
|
646
|
+
// Implementation would go here for actual task execution
|
|
647
|
+
// This is a placeholder that simulates execution
|
|
648
|
+
await new Promise((resolve)=>setTimeout(resolve, 1000));
|
|
649
|
+
this.endTime = new Date();
|
|
650
|
+
return {
|
|
651
|
+
success: true,
|
|
652
|
+
output: 'Task completed successfully',
|
|
653
|
+
exitCode: 0,
|
|
654
|
+
duration: this.endTime.getTime() - this.startTime.getTime(),
|
|
655
|
+
resourcesUsed: {
|
|
656
|
+
cpuTime: 1000,
|
|
657
|
+
maxMemory: 50 * 1024 * 1024,
|
|
658
|
+
diskIO: 1024,
|
|
659
|
+
networkIO: 0,
|
|
660
|
+
fileHandles: 5
|
|
661
|
+
},
|
|
662
|
+
artifacts: {},
|
|
663
|
+
metadata: {
|
|
664
|
+
sessionId: this.id,
|
|
665
|
+
agentId: this.agent.id.id,
|
|
666
|
+
taskId: this.task.id.id
|
|
667
|
+
}
|
|
668
|
+
};
|
|
669
|
+
}
|
|
670
|
+
async stop(reason) {
|
|
671
|
+
this.logger.info('Stopping execution session', {
|
|
672
|
+
sessionId: this.id,
|
|
673
|
+
reason
|
|
674
|
+
});
|
|
675
|
+
if (this.process) {
|
|
676
|
+
this.process.kill('SIGTERM');
|
|
677
|
+
// Force kill after timeout
|
|
678
|
+
setTimeout(()=>{
|
|
679
|
+
if (this.process && !this.process.killed) {
|
|
680
|
+
this.process.kill('SIGKILL');
|
|
681
|
+
}
|
|
682
|
+
}, 5000);
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
async cleanup() {
|
|
686
|
+
// Cleanup temporary files and resources
|
|
687
|
+
try {
|
|
688
|
+
await fs.rm(this.context.tempDirectory, {
|
|
689
|
+
recursive: true,
|
|
690
|
+
force: true
|
|
691
|
+
});
|
|
692
|
+
} catch (error) {
|
|
693
|
+
// Ignore cleanup errors
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
constructor(id, task, agent, context, config, logger){
|
|
697
|
+
_define_property(this, "id", void 0);
|
|
698
|
+
_define_property(this, "task", void 0);
|
|
699
|
+
_define_property(this, "agent", void 0);
|
|
700
|
+
_define_property(this, "context", void 0);
|
|
701
|
+
_define_property(this, "config", void 0);
|
|
702
|
+
_define_property(this, "logger", void 0);
|
|
703
|
+
_define_property(this, "process", void 0);
|
|
704
|
+
_define_property(this, "startTime", void 0);
|
|
705
|
+
_define_property(this, "endTime", void 0);
|
|
706
|
+
this.id = id;
|
|
707
|
+
this.task = task;
|
|
708
|
+
this.agent = agent;
|
|
709
|
+
this.context = context;
|
|
710
|
+
this.config = config;
|
|
711
|
+
this.logger = logger;
|
|
712
|
+
}
|
|
713
|
+
};
|
|
714
|
+
let ResourceMonitor = class ResourceMonitor extends EventEmitter {
|
|
715
|
+
async initialize() {
|
|
716
|
+
// Initialize resource monitoring
|
|
717
|
+
}
|
|
718
|
+
async shutdown() {
|
|
719
|
+
// Stop all monitors
|
|
720
|
+
for (const [sessionId, timer] of this.activeMonitors){
|
|
721
|
+
clearInterval(timer);
|
|
722
|
+
}
|
|
723
|
+
this.activeMonitors.clear();
|
|
724
|
+
}
|
|
725
|
+
startMonitoring(sessionId, limits) {
|
|
726
|
+
const timer = setInterval(()=>{
|
|
727
|
+
this.checkResources(sessionId, limits);
|
|
728
|
+
}, 1000);
|
|
729
|
+
this.activeMonitors.set(sessionId, timer);
|
|
730
|
+
}
|
|
731
|
+
stopMonitoring(sessionId) {
|
|
732
|
+
const timer = this.activeMonitors.get(sessionId);
|
|
733
|
+
if (timer) {
|
|
734
|
+
clearInterval(timer);
|
|
735
|
+
this.activeMonitors.delete(sessionId);
|
|
736
|
+
}
|
|
737
|
+
}
|
|
738
|
+
getUsage(sessionId) {
|
|
739
|
+
return this.usage.get(sessionId) || {
|
|
740
|
+
cpuTime: 0,
|
|
741
|
+
maxMemory: 0,
|
|
742
|
+
diskIO: 0,
|
|
743
|
+
networkIO: 0,
|
|
744
|
+
fileHandles: 0
|
|
745
|
+
};
|
|
746
|
+
}
|
|
747
|
+
getUtilization() {
|
|
748
|
+
// Return overall system utilization
|
|
749
|
+
return {
|
|
750
|
+
cpu: 0.1,
|
|
751
|
+
memory: 0.2,
|
|
752
|
+
disk: 0.05,
|
|
753
|
+
network: 0.01
|
|
754
|
+
};
|
|
755
|
+
}
|
|
756
|
+
checkResources(sessionId, limits) {
|
|
757
|
+
// Check if any limits are exceeded
|
|
758
|
+
const usage = this.collectCurrentUsage(sessionId);
|
|
759
|
+
this.usage.set(sessionId, usage);
|
|
760
|
+
if (usage.maxMemory > limits.maxMemory) {
|
|
761
|
+
this.emit('limit-violation', {
|
|
762
|
+
sessionId,
|
|
763
|
+
type: 'memory',
|
|
764
|
+
current: usage.maxMemory,
|
|
765
|
+
limit: limits.maxMemory
|
|
766
|
+
});
|
|
767
|
+
}
|
|
768
|
+
if (usage.cpuTime > limits.maxCpuTime) {
|
|
769
|
+
this.emit('limit-violation', {
|
|
770
|
+
sessionId,
|
|
771
|
+
type: 'cpu',
|
|
772
|
+
current: usage.cpuTime,
|
|
773
|
+
limit: limits.maxCpuTime
|
|
774
|
+
});
|
|
775
|
+
}
|
|
776
|
+
}
|
|
777
|
+
collectCurrentUsage(sessionId) {
|
|
778
|
+
// Collect actual resource usage - this would interface with system APIs
|
|
779
|
+
return {
|
|
780
|
+
cpuTime: Math.random() * 1000,
|
|
781
|
+
maxMemory: Math.random() * 100 * 1024 * 1024,
|
|
782
|
+
diskIO: Math.random() * 1024,
|
|
783
|
+
networkIO: Math.random() * 1024,
|
|
784
|
+
fileHandles: Math.floor(Math.random() * 10)
|
|
785
|
+
};
|
|
786
|
+
}
|
|
787
|
+
constructor(...args){
|
|
788
|
+
super(...args), _define_property(this, "activeMonitors", new Map()), _define_property(this, "usage", new Map());
|
|
789
|
+
}
|
|
790
|
+
};
|
|
791
|
+
let ProcessPool = class ProcessPool extends EventEmitter {
|
|
792
|
+
async initialize() {
|
|
793
|
+
// Initialize process pool
|
|
794
|
+
}
|
|
795
|
+
async shutdown() {
|
|
796
|
+
// Shutdown process pool
|
|
797
|
+
}
|
|
798
|
+
getTotalExecutions() {
|
|
799
|
+
return this.totalExecutions;
|
|
800
|
+
}
|
|
801
|
+
getAverageDuration() {
|
|
802
|
+
return this.totalExecutions > 0 ? this.totalDuration / this.totalExecutions : 0;
|
|
803
|
+
}
|
|
804
|
+
getSuccessRate() {
|
|
805
|
+
return this.totalExecutions > 0 ? this.successCount / this.totalExecutions : 0;
|
|
806
|
+
}
|
|
807
|
+
getErrorRate() {
|
|
808
|
+
return this.totalExecutions > 0 ? this.errorCount / this.totalExecutions : 0;
|
|
809
|
+
}
|
|
810
|
+
constructor(config){
|
|
811
|
+
super(), _define_property(this, "config", void 0), _define_property(this, "totalExecutions", 0), _define_property(this, "totalDuration", 0), _define_property(this, "successCount", 0), _define_property(this, "errorCount", 0);
|
|
812
|
+
this.config = config;
|
|
813
|
+
}
|
|
814
|
+
};
|
|
815
|
+
export default TaskExecutor;
|