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
|
@@ -1,1031 +1,959 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Hive Mind Core System
|
|
3
3
|
* Central orchestration and coordination logic
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import
|
|
7
|
-
import { MCPToolWrapper } from './mcp-wrapper.js';
|
|
8
|
-
import { PerformanceOptimizer } from './performance-optimizer.js';
|
|
9
|
-
|
|
4
|
+
*/ import EventEmitter from "events";
|
|
5
|
+
import { MCPToolWrapper } from "./mcp-wrapper.js";
|
|
6
|
+
import { PerformanceOptimizer } from "./performance-optimizer.js";
|
|
10
7
|
/**
|
|
11
8
|
* HiveMindCore - Main orchestration class
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
constructor(config = {}) {
|
|
15
|
-
super();
|
|
16
|
-
|
|
17
|
-
this.config = {
|
|
18
|
-
objective: '',
|
|
19
|
-
name: `hive-${Date.now()}`,
|
|
20
|
-
queenType: 'strategic',
|
|
21
|
-
maxWorkers: 8,
|
|
22
|
-
consensusAlgorithm: 'majority',
|
|
23
|
-
autoScale: true,
|
|
24
|
-
encryption: false,
|
|
25
|
-
memorySize: 100, // MB
|
|
26
|
-
taskTimeout: 60, // minutes
|
|
27
|
-
...config,
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
this.state = {
|
|
31
|
-
status: 'initializing',
|
|
32
|
-
swarmId: null,
|
|
33
|
-
queen: null,
|
|
34
|
-
workers: new Map(),
|
|
35
|
-
tasks: new Map(),
|
|
36
|
-
memory: new Map(),
|
|
37
|
-
decisions: new Map(),
|
|
38
|
-
metrics: {
|
|
39
|
-
tasksCreated: 0,
|
|
40
|
-
tasksCompleted: 0,
|
|
41
|
-
decisionsReached: 0,
|
|
42
|
-
memoryUsage: 0,
|
|
43
|
-
},
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
this.mcpWrapper = new MCPToolWrapper({
|
|
47
|
-
parallel: true,
|
|
48
|
-
timeout: this.config.taskTimeout * 60 * 1000,
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
// Initialize performance optimizer
|
|
52
|
-
this.performanceOptimizer = new PerformanceOptimizer({
|
|
53
|
-
enableAsyncQueue: true,
|
|
54
|
-
enableBatchProcessing: true,
|
|
55
|
-
enableAutoTuning: true,
|
|
56
|
-
asyncQueueConcurrency: Math.min(this.config.maxWorkers * 2, 20),
|
|
57
|
-
batchMaxSize: 50,
|
|
58
|
-
metricsInterval: 30000,
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
this._initializeEventHandlers();
|
|
62
|
-
this._initializePerformanceMonitoring();
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/**
|
|
9
|
+
*/ export class HiveMindCore extends EventEmitter {
|
|
10
|
+
/**
|
|
66
11
|
* Initialize event handlers
|
|
67
|
-
*/
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
this.on('error', (error) => {
|
|
93
|
-
console.error('Hive Mind Error:', error);
|
|
94
|
-
this._handleError(error);
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/**
|
|
12
|
+
*/ _initializeEventHandlers() {
|
|
13
|
+
this.on('task:created', (task)=>{
|
|
14
|
+
this.state.metrics.tasksCreated++;
|
|
15
|
+
this._checkAutoScale();
|
|
16
|
+
});
|
|
17
|
+
this.on('task:completed', (task)=>{
|
|
18
|
+
this.state.metrics.tasksCompleted++;
|
|
19
|
+
this._updatePerformanceMetrics();
|
|
20
|
+
});
|
|
21
|
+
this.on('task:failed', (data)=>{
|
|
22
|
+
console.warn(`Task failed: ${data.task.id}`, data.error);
|
|
23
|
+
this._handleTaskFailure(data.task, data.error);
|
|
24
|
+
});
|
|
25
|
+
this.on('decision:reached', (decision)=>{
|
|
26
|
+
this.state.metrics.decisionsReached++;
|
|
27
|
+
});
|
|
28
|
+
this.on('worker:idle', (workerId)=>{
|
|
29
|
+
this._assignNextTask(workerId);
|
|
30
|
+
});
|
|
31
|
+
this.on('error', (error)=>{
|
|
32
|
+
console.error('Hive Mind Error:', error);
|
|
33
|
+
this._handleError(error);
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
99
37
|
* Initialize performance monitoring
|
|
100
|
-
*/
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
/**
|
|
38
|
+
*/ _initializePerformanceMonitoring() {
|
|
39
|
+
// Listen to performance optimizer events
|
|
40
|
+
this.performanceOptimizer.on('auto_tune', (data)=>{
|
|
41
|
+
console.log(`Performance auto-tuned: ${data.type} = ${data.newValue}`);
|
|
42
|
+
this.emit('performance:auto_tuned', data);
|
|
43
|
+
});
|
|
44
|
+
this.performanceOptimizer.on('error', (error)=>{
|
|
45
|
+
console.error('Performance optimizer error:', error);
|
|
46
|
+
this.emit('error', {
|
|
47
|
+
type: 'performance_optimizer_error',
|
|
48
|
+
error
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
// Periodic performance reporting
|
|
52
|
+
setInterval(()=>{
|
|
53
|
+
const stats = this.performanceOptimizer.getPerformanceStats();
|
|
54
|
+
this.emit('performance:stats', stats);
|
|
55
|
+
// Log performance warnings
|
|
56
|
+
if (parseFloat(stats.asyncQueue.utilization) > 90) {
|
|
57
|
+
console.warn('High async queue utilization:', stats.asyncQueue.utilization + '%');
|
|
58
|
+
}
|
|
59
|
+
if (parseFloat(stats.asyncQueue.successRate) < 95) {
|
|
60
|
+
console.warn('Low async operation success rate:', stats.asyncQueue.successRate + '%');
|
|
61
|
+
}
|
|
62
|
+
}, 60000); // Every minute
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
130
65
|
* Handle task failure with recovery logic
|
|
131
|
-
*/
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
66
|
+
*/ _handleTaskFailure(task, error) {
|
|
67
|
+
// Update metrics
|
|
68
|
+
this.state.metrics.tasksFailed = (this.state.metrics.tasksFailed || 0) + 1;
|
|
69
|
+
// Attempt task retry for recoverable failures
|
|
70
|
+
if (task.retryCount < 2 && this._isRecoverableError(error)) {
|
|
71
|
+
task.retryCount = (task.retryCount || 0) + 1;
|
|
72
|
+
task.status = 'pending';
|
|
73
|
+
// Find another worker for retry
|
|
74
|
+
setTimeout(()=>{
|
|
75
|
+
const worker = this._findBestWorker(task);
|
|
76
|
+
if (worker) {
|
|
77
|
+
this._assignTask(worker.id, task.id);
|
|
78
|
+
}
|
|
79
|
+
}, 5000); // Wait 5 seconds before retry
|
|
80
|
+
console.log(`Retrying task ${task.id} (attempt ${task.retryCount})`);
|
|
146
81
|
}
|
|
147
|
-
}, 5000); // Wait 5 seconds before retry
|
|
148
|
-
|
|
149
|
-
console.log(`Retrying task ${task.id} (attempt ${task.retryCount})`);
|
|
150
82
|
}
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
/**
|
|
83
|
+
/**
|
|
154
84
|
* Check if error is recoverable
|
|
155
|
-
*/
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
85
|
+
*/ _isRecoverableError(error) {
|
|
86
|
+
const recoverableErrors = [
|
|
87
|
+
'timeout',
|
|
88
|
+
'network',
|
|
89
|
+
'temporary',
|
|
90
|
+
'connection'
|
|
91
|
+
];
|
|
92
|
+
return recoverableErrors.some((type)=>error.message.toLowerCase().includes(type));
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
163
95
|
* Initialize the hive mind swarm
|
|
164
|
-
*/
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
this.state.status = 'error';
|
|
187
|
-
this.emit('error', error);
|
|
188
|
-
throw error;
|
|
96
|
+
*/ async initialize() {
|
|
97
|
+
try {
|
|
98
|
+
this.state.status = 'initializing';
|
|
99
|
+
// Initialize swarm with MCP tools
|
|
100
|
+
const [swarmInit, memoryInit, neuralInit] = await this.mcpWrapper.initializeSwarm({
|
|
101
|
+
topology: this._determineTopology(),
|
|
102
|
+
maxAgents: this.config.maxWorkers + 1,
|
|
103
|
+
swarmId: this.config.name
|
|
104
|
+
});
|
|
105
|
+
this.state.swarmId = swarmInit.swarmId;
|
|
106
|
+
// Store initial configuration in memory
|
|
107
|
+
await this.mcpWrapper.storeMemory(this.state.swarmId, 'config', this.config, 'system');
|
|
108
|
+
this.state.status = 'ready';
|
|
109
|
+
this.emit('initialized', {
|
|
110
|
+
swarmId: this.state.swarmId
|
|
111
|
+
});
|
|
112
|
+
return this.state.swarmId;
|
|
113
|
+
} catch (error) {
|
|
114
|
+
this.state.status = 'error';
|
|
115
|
+
this.emit('error', error);
|
|
116
|
+
throw error;
|
|
117
|
+
}
|
|
189
118
|
}
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
/**
|
|
119
|
+
/**
|
|
193
120
|
* Determine optimal topology based on objective
|
|
194
|
-
*/
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
121
|
+
*/ _determineTopology() {
|
|
122
|
+
const objective = this.config.objective.toLowerCase();
|
|
123
|
+
// Heuristic topology selection
|
|
124
|
+
if (objective.includes('research') || objective.includes('analysis')) {
|
|
125
|
+
return 'mesh'; // Peer-to-peer for collaborative research
|
|
126
|
+
} else if (objective.includes('build') || objective.includes('develop')) {
|
|
127
|
+
return 'hierarchical'; // Clear command structure for development
|
|
128
|
+
} else if (objective.includes('monitor') || objective.includes('maintain')) {
|
|
129
|
+
return 'ring'; // Circular for continuous monitoring
|
|
130
|
+
} else if (objective.includes('coordinate') || objective.includes('orchestrate')) {
|
|
131
|
+
return 'star'; // Centralized for coordination
|
|
132
|
+
}
|
|
133
|
+
return 'hierarchical'; // Default
|
|
207
134
|
}
|
|
208
|
-
|
|
209
|
-
return 'hierarchical'; // Default
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
/**
|
|
135
|
+
/**
|
|
213
136
|
* Spawn the queen coordinator
|
|
214
|
-
*/
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
};
|
|
226
|
-
|
|
227
|
-
// Store queen info in memory
|
|
228
|
-
await this.mcpWrapper.storeMemory(this.state.swarmId, 'queen', this.state.queen, 'system');
|
|
229
|
-
|
|
230
|
-
this.emit('queen:spawned', this.state.queen);
|
|
231
|
-
return this.state.queen;
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
/**
|
|
235
|
-
* Spawn worker agents with batch optimization
|
|
236
|
-
*/
|
|
237
|
-
async spawnWorkers(workerTypes) {
|
|
238
|
-
const startTime = Date.now();
|
|
239
|
-
|
|
240
|
-
try {
|
|
241
|
-
// Batch spawn agents in parallel with optimized chunking
|
|
242
|
-
const chunkSize = Math.min(workerTypes.length, 5); // Optimal batch size
|
|
243
|
-
const chunks = [];
|
|
244
|
-
|
|
245
|
-
for (let i = 0; i < workerTypes.length; i += chunkSize) {
|
|
246
|
-
chunks.push(workerTypes.slice(i, i + chunkSize));
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
// Process chunks in parallel with Promise.all
|
|
250
|
-
const allResults = await Promise.all(
|
|
251
|
-
chunks.map((chunk) => this.mcpWrapper.spawnAgents(chunk, this.state.swarmId)),
|
|
252
|
-
);
|
|
253
|
-
|
|
254
|
-
// Flatten results
|
|
255
|
-
const spawnResults = allResults.flat();
|
|
256
|
-
|
|
257
|
-
// Batch create worker objects
|
|
258
|
-
const workers = [];
|
|
259
|
-
const workerUpdates = [];
|
|
260
|
-
|
|
261
|
-
spawnResults.forEach((result, index) => {
|
|
262
|
-
const worker = {
|
|
263
|
-
id: `worker-${index}`,
|
|
264
|
-
agentId: result.agentId,
|
|
265
|
-
type: workerTypes[index],
|
|
266
|
-
status: 'idle',
|
|
267
|
-
tasksCompleted: 0,
|
|
268
|
-
currentTask: null,
|
|
269
|
-
spawnedAt: Date.now(),
|
|
270
|
-
performance: {
|
|
271
|
-
avgTaskTime: 0,
|
|
272
|
-
successRate: 1.0,
|
|
273
|
-
},
|
|
137
|
+
*/ async spawnQueen(queenData) {
|
|
138
|
+
const [spawnResult] = await this.mcpWrapper.spawnAgents([
|
|
139
|
+
'coordinator'
|
|
140
|
+
], this.state.swarmId);
|
|
141
|
+
this.state.queen = {
|
|
142
|
+
id: queenData.id,
|
|
143
|
+
agentId: spawnResult.agentId,
|
|
144
|
+
type: this.config.queenType,
|
|
145
|
+
status: 'active',
|
|
146
|
+
decisions: 0,
|
|
147
|
+
tasks: 0
|
|
274
148
|
};
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
this.
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
149
|
+
// Store queen info in memory
|
|
150
|
+
await this.mcpWrapper.storeMemory(this.state.swarmId, 'queen', this.state.queen, 'system');
|
|
151
|
+
this.emit('queen:spawned', this.state.queen);
|
|
152
|
+
return this.state.queen;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Spawn worker agents with batch optimization
|
|
156
|
+
*/ async spawnWorkers(workerTypes) {
|
|
157
|
+
const startTime = Date.now();
|
|
158
|
+
try {
|
|
159
|
+
// Batch spawn agents in parallel with optimized chunking
|
|
160
|
+
const chunkSize = Math.min(workerTypes.length, 5); // Optimal batch size
|
|
161
|
+
const chunks = [];
|
|
162
|
+
for(let i = 0; i < workerTypes.length; i += chunkSize){
|
|
163
|
+
chunks.push(workerTypes.slice(i, i + chunkSize));
|
|
164
|
+
}
|
|
165
|
+
// Process chunks in parallel with Promise.all
|
|
166
|
+
const allResults = await Promise.all(chunks.map((chunk)=>this.mcpWrapper.spawnAgents(chunk, this.state.swarmId)));
|
|
167
|
+
// Flatten results
|
|
168
|
+
const spawnResults = allResults.flat();
|
|
169
|
+
// Batch create worker objects
|
|
170
|
+
const workers = [];
|
|
171
|
+
const workerUpdates = [];
|
|
172
|
+
spawnResults.forEach((result, index)=>{
|
|
173
|
+
const worker = {
|
|
174
|
+
id: `worker-${index}`,
|
|
175
|
+
agentId: result.agentId,
|
|
176
|
+
type: workerTypes[index],
|
|
177
|
+
status: 'idle',
|
|
178
|
+
tasksCompleted: 0,
|
|
179
|
+
currentTask: null,
|
|
180
|
+
spawnedAt: Date.now(),
|
|
181
|
+
performance: {
|
|
182
|
+
avgTaskTime: 0,
|
|
183
|
+
successRate: 1.0
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
workers.push(worker);
|
|
187
|
+
this.state.workers.set(worker.id, worker);
|
|
188
|
+
workerUpdates.push({
|
|
189
|
+
type: 'worker_spawned',
|
|
190
|
+
workerId: worker.id,
|
|
191
|
+
workerType: worker.type,
|
|
192
|
+
timestamp: worker.spawnedAt
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
// Batch memory operations
|
|
196
|
+
await Promise.all([
|
|
197
|
+
this.mcpWrapper.storeMemory(this.state.swarmId, 'workers', workers, 'system'),
|
|
198
|
+
this.mcpWrapper.storeMemory(this.state.swarmId, 'worker_spawn_batch', {
|
|
199
|
+
count: workers.length,
|
|
200
|
+
types: workerTypes,
|
|
201
|
+
spawnTime: Date.now() - startTime,
|
|
202
|
+
updates: workerUpdates
|
|
203
|
+
}, 'metrics')
|
|
204
|
+
]);
|
|
205
|
+
// Emit batch completion event
|
|
206
|
+
this.emit('workers:spawned', {
|
|
207
|
+
count: this.state.workers.size,
|
|
208
|
+
batchSize: workers.length,
|
|
209
|
+
spawnTime: Date.now() - startTime,
|
|
210
|
+
workers: workers
|
|
211
|
+
});
|
|
212
|
+
return workers;
|
|
213
|
+
} catch (error) {
|
|
214
|
+
this.emit('error', {
|
|
215
|
+
type: 'spawn_batch_failed',
|
|
216
|
+
error,
|
|
217
|
+
workerTypes,
|
|
218
|
+
spawnTime: Date.now() - startTime
|
|
219
|
+
});
|
|
220
|
+
throw error;
|
|
221
|
+
}
|
|
320
222
|
}
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
/**
|
|
223
|
+
/**
|
|
324
224
|
* Create and distribute task with performance optimization
|
|
325
|
-
*/
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
// Assign task if worker available
|
|
364
|
-
if (bestWorker) {
|
|
365
|
-
// Use non-blocking assignment
|
|
366
|
-
setImmediate(() => this._assignTask(bestWorker.id, task.id));
|
|
225
|
+
*/ async createTask(description, priority = 5, metadata = {}) {
|
|
226
|
+
const timestamp = Date.now();
|
|
227
|
+
const randomPart = Math.random().toString(36).substring(2, 11); // Use substring instead of substr
|
|
228
|
+
const taskId = `task-${timestamp}-${randomPart}`;
|
|
229
|
+
const createdAt = Date.now();
|
|
230
|
+
const task = {
|
|
231
|
+
id: taskId,
|
|
232
|
+
swarmId: this.state.swarmId,
|
|
233
|
+
description,
|
|
234
|
+
priority,
|
|
235
|
+
status: 'pending',
|
|
236
|
+
createdAt: new Date(createdAt).toISOString(),
|
|
237
|
+
assignedTo: null,
|
|
238
|
+
result: null,
|
|
239
|
+
metadata: {
|
|
240
|
+
estimatedDuration: this._estimateTaskDuration(description),
|
|
241
|
+
complexity: this._analyzeTaskComplexity(description),
|
|
242
|
+
...metadata
|
|
243
|
+
}
|
|
244
|
+
};
|
|
245
|
+
// Parallel operations: task storage, orchestration, and worker finding
|
|
246
|
+
const [orchestrateResult, bestWorker] = await Promise.all([
|
|
247
|
+
this.mcpWrapper.orchestrateTask(description, 'adaptive'),
|
|
248
|
+
this._findBestWorkerAsync(task),
|
|
249
|
+
// Store task immediately in parallel
|
|
250
|
+
(async ()=>{
|
|
251
|
+
this.state.tasks.set(task.id, task);
|
|
252
|
+
await this.mcpWrapper.storeMemory(this.state.swarmId, `task-${task.id}`, task, 'task');
|
|
253
|
+
})()
|
|
254
|
+
]);
|
|
255
|
+
task.orchestrationId = orchestrateResult[0].taskId;
|
|
256
|
+
this.emit('task:created', task);
|
|
257
|
+
// Assign task if worker available
|
|
258
|
+
if (bestWorker) {
|
|
259
|
+
// Use non-blocking assignment
|
|
260
|
+
setImmediate(()=>this._assignTask(bestWorker.id, task.id));
|
|
261
|
+
}
|
|
262
|
+
return task;
|
|
367
263
|
}
|
|
368
|
-
|
|
369
|
-
return task;
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
/**
|
|
264
|
+
/**
|
|
373
265
|
* Estimate task duration based on description analysis
|
|
374
|
-
*/
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
266
|
+
*/ _estimateTaskDuration(description) {
|
|
267
|
+
const words = description.toLowerCase().split(/\s+/);
|
|
268
|
+
const complexityKeywords = {
|
|
269
|
+
simple: [
|
|
270
|
+
'list',
|
|
271
|
+
'show',
|
|
272
|
+
'display',
|
|
273
|
+
'get',
|
|
274
|
+
'read'
|
|
275
|
+
],
|
|
276
|
+
medium: [
|
|
277
|
+
'create',
|
|
278
|
+
'update',
|
|
279
|
+
'modify',
|
|
280
|
+
'change',
|
|
281
|
+
'build'
|
|
282
|
+
],
|
|
283
|
+
complex: [
|
|
284
|
+
'analyze',
|
|
285
|
+
'optimize',
|
|
286
|
+
'refactor',
|
|
287
|
+
'implement',
|
|
288
|
+
'design'
|
|
289
|
+
]
|
|
290
|
+
};
|
|
291
|
+
let score = 1;
|
|
292
|
+
for (const word of words){
|
|
293
|
+
if (complexityKeywords.complex.includes(word)) score += 3;
|
|
294
|
+
else if (complexityKeywords.medium.includes(word)) score += 2;
|
|
295
|
+
else if (complexityKeywords.simple.includes(word)) score += 1;
|
|
296
|
+
}
|
|
297
|
+
return Math.min(score * 5000, 60000); // Cap at 1 minute
|
|
388
298
|
}
|
|
389
|
-
|
|
390
|
-
return Math.min(score * 5000, 60000); // Cap at 1 minute
|
|
391
|
-
}
|
|
392
|
-
|
|
393
|
-
/**
|
|
299
|
+
/**
|
|
394
300
|
* Analyze task complexity
|
|
395
|
-
*/
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
301
|
+
*/ _analyzeTaskComplexity(description) {
|
|
302
|
+
const words = description.toLowerCase().split(/\s+/);
|
|
303
|
+
const indicators = {
|
|
304
|
+
high: [
|
|
305
|
+
'optimize',
|
|
306
|
+
'refactor',
|
|
307
|
+
'architecture',
|
|
308
|
+
'design',
|
|
309
|
+
'algorithm'
|
|
310
|
+
],
|
|
311
|
+
medium: [
|
|
312
|
+
'implement',
|
|
313
|
+
'build',
|
|
314
|
+
'create',
|
|
315
|
+
'develop',
|
|
316
|
+
'integrate'
|
|
317
|
+
],
|
|
318
|
+
low: [
|
|
319
|
+
'list',
|
|
320
|
+
'show',
|
|
321
|
+
'get',
|
|
322
|
+
'read',
|
|
323
|
+
'display'
|
|
324
|
+
]
|
|
325
|
+
};
|
|
326
|
+
for (const [level, keywords] of Object.entries(indicators)){
|
|
327
|
+
if (keywords.some((keyword)=>words.includes(keyword))) {
|
|
328
|
+
return level;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
return 'medium';
|
|
408
332
|
}
|
|
409
|
-
|
|
410
|
-
return 'medium';
|
|
411
|
-
}
|
|
412
|
-
|
|
413
|
-
/**
|
|
333
|
+
/**
|
|
414
334
|
* Find best worker for task (optimized async version)
|
|
415
|
-
*/
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
)
|
|
520
|
-
|
|
335
|
+
*/ async _findBestWorkerAsync(task) {
|
|
336
|
+
const availableWorkers = Array.from(this.state.workers.values()).filter((w)=>w.status === 'idle');
|
|
337
|
+
if (availableWorkers.length === 0) {
|
|
338
|
+
return null;
|
|
339
|
+
}
|
|
340
|
+
// Use cached analysis if available
|
|
341
|
+
const cacheKey = `worker_match_${task.description.substring(0, 50)}`;
|
|
342
|
+
const cachedMatch = await this.mcpWrapper.retrieveMemory(this.state.swarmId, cacheKey);
|
|
343
|
+
if (cachedMatch && cachedMatch.timestamp > Date.now() - 300000) {
|
|
344
|
+
// 5 min cache
|
|
345
|
+
const cachedWorker = availableWorkers.find((w)=>w.type === cachedMatch.workerType);
|
|
346
|
+
if (cachedWorker) return cachedWorker;
|
|
347
|
+
}
|
|
348
|
+
// Enhanced matching algorithm with performance scoring
|
|
349
|
+
const taskLower = task.description.toLowerCase();
|
|
350
|
+
const taskWords = taskLower.split(/\s+/);
|
|
351
|
+
// Enhanced priority mapping with weights
|
|
352
|
+
const priorityMap = {
|
|
353
|
+
researcher: {
|
|
354
|
+
keywords: [
|
|
355
|
+
'research',
|
|
356
|
+
'investigate',
|
|
357
|
+
'analyze',
|
|
358
|
+
'study',
|
|
359
|
+
'explore'
|
|
360
|
+
],
|
|
361
|
+
weight: 1.2
|
|
362
|
+
},
|
|
363
|
+
coder: {
|
|
364
|
+
keywords: [
|
|
365
|
+
'code',
|
|
366
|
+
'implement',
|
|
367
|
+
'build',
|
|
368
|
+
'develop',
|
|
369
|
+
'fix',
|
|
370
|
+
'create',
|
|
371
|
+
'program'
|
|
372
|
+
],
|
|
373
|
+
weight: 1.0
|
|
374
|
+
},
|
|
375
|
+
analyst: {
|
|
376
|
+
keywords: [
|
|
377
|
+
'analyze',
|
|
378
|
+
'data',
|
|
379
|
+
'metrics',
|
|
380
|
+
'performance',
|
|
381
|
+
'report',
|
|
382
|
+
'statistics'
|
|
383
|
+
],
|
|
384
|
+
weight: 1.1
|
|
385
|
+
},
|
|
386
|
+
tester: {
|
|
387
|
+
keywords: [
|
|
388
|
+
'test',
|
|
389
|
+
'validate',
|
|
390
|
+
'check',
|
|
391
|
+
'verify',
|
|
392
|
+
'quality',
|
|
393
|
+
'qa'
|
|
394
|
+
],
|
|
395
|
+
weight: 1.0
|
|
396
|
+
},
|
|
397
|
+
architect: {
|
|
398
|
+
keywords: [
|
|
399
|
+
'design',
|
|
400
|
+
'architecture',
|
|
401
|
+
'structure',
|
|
402
|
+
'plan',
|
|
403
|
+
'system'
|
|
404
|
+
],
|
|
405
|
+
weight: 1.3
|
|
406
|
+
},
|
|
407
|
+
reviewer: {
|
|
408
|
+
keywords: [
|
|
409
|
+
'review',
|
|
410
|
+
'feedback',
|
|
411
|
+
'improve',
|
|
412
|
+
'refactor',
|
|
413
|
+
'audit'
|
|
414
|
+
],
|
|
415
|
+
weight: 1.0
|
|
416
|
+
},
|
|
417
|
+
optimizer: {
|
|
418
|
+
keywords: [
|
|
419
|
+
'optimize',
|
|
420
|
+
'performance',
|
|
421
|
+
'speed',
|
|
422
|
+
'efficiency',
|
|
423
|
+
'enhance'
|
|
424
|
+
],
|
|
425
|
+
weight: 1.4
|
|
426
|
+
},
|
|
427
|
+
documenter: {
|
|
428
|
+
keywords: [
|
|
429
|
+
'document',
|
|
430
|
+
'explain',
|
|
431
|
+
'write',
|
|
432
|
+
'describe',
|
|
433
|
+
'manual'
|
|
434
|
+
],
|
|
435
|
+
weight: 0.9
|
|
436
|
+
}
|
|
437
|
+
};
|
|
438
|
+
// Calculate scores for each worker
|
|
439
|
+
const workerScores = availableWorkers.map((worker)=>{
|
|
440
|
+
const typeInfo = priorityMap[worker.type] || {
|
|
441
|
+
keywords: [],
|
|
442
|
+
weight: 1.0
|
|
443
|
+
};
|
|
444
|
+
// Keyword matching score
|
|
445
|
+
const keywordScore = typeInfo.keywords.reduce((score, keyword)=>{
|
|
446
|
+
return score + (taskWords.includes(keyword) ? 1 : 0);
|
|
447
|
+
}, 0);
|
|
448
|
+
// Performance history score
|
|
449
|
+
const performanceScore = worker.performance ? worker.performance.successRate * 0.5 + 1 / (worker.performance.avgTaskTime + 1) * 0.5 : 0.5;
|
|
450
|
+
// Task completion rate
|
|
451
|
+
const completionScore = worker.tasksCompleted > 0 ? Math.min(worker.tasksCompleted / 10, 1) : 0;
|
|
452
|
+
// Combined score
|
|
453
|
+
const totalScore = (keywordScore * 2 + // Keyword relevance
|
|
454
|
+
performanceScore * 1.5 + // Historical performance
|
|
455
|
+
completionScore * 1.0) * // Experience
|
|
456
|
+
typeInfo.weight;
|
|
457
|
+
return {
|
|
458
|
+
worker,
|
|
459
|
+
score: totalScore,
|
|
460
|
+
breakdown: {
|
|
461
|
+
keyword: keywordScore,
|
|
462
|
+
performance: performanceScore,
|
|
463
|
+
completion: completionScore,
|
|
464
|
+
weight: typeInfo.weight
|
|
465
|
+
}
|
|
466
|
+
};
|
|
467
|
+
});
|
|
468
|
+
// Sort by score and select best
|
|
469
|
+
workerScores.sort((a, b)=>b.score - a.score);
|
|
470
|
+
const bestMatch = workerScores[0];
|
|
471
|
+
// Cache the result for future use
|
|
472
|
+
if (bestMatch.score > 0) {
|
|
473
|
+
setImmediate(async ()=>{
|
|
474
|
+
await this.mcpWrapper.storeMemory(this.state.swarmId, cacheKey, {
|
|
475
|
+
workerType: bestMatch.worker.type,
|
|
476
|
+
score: bestMatch.score,
|
|
477
|
+
timestamp: Date.now()
|
|
478
|
+
}, 'cache');
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
return bestMatch ? bestMatch.worker : availableWorkers[0];
|
|
521
482
|
}
|
|
522
|
-
|
|
523
|
-
return bestMatch ? bestMatch.worker : availableWorkers[0];
|
|
524
|
-
}
|
|
525
|
-
|
|
526
|
-
/**
|
|
483
|
+
/**
|
|
527
484
|
* Synchronous version for backward compatibility
|
|
528
|
-
*/
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
485
|
+
*/ _findBestWorker(task) {
|
|
486
|
+
const availableWorkers = Array.from(this.state.workers.values()).filter((w)=>w.status === 'idle');
|
|
487
|
+
if (availableWorkers.length === 0) {
|
|
488
|
+
return null;
|
|
489
|
+
}
|
|
490
|
+
// Simplified scoring for sync version
|
|
491
|
+
const taskLower = task.description.toLowerCase();
|
|
492
|
+
const priorityMap = {
|
|
493
|
+
researcher: [
|
|
494
|
+
'research',
|
|
495
|
+
'investigate',
|
|
496
|
+
'analyze',
|
|
497
|
+
'study'
|
|
498
|
+
],
|
|
499
|
+
coder: [
|
|
500
|
+
'code',
|
|
501
|
+
'implement',
|
|
502
|
+
'build',
|
|
503
|
+
'develop',
|
|
504
|
+
'fix',
|
|
505
|
+
'create'
|
|
506
|
+
],
|
|
507
|
+
analyst: [
|
|
508
|
+
'analyze',
|
|
509
|
+
'data',
|
|
510
|
+
'metrics',
|
|
511
|
+
'performance',
|
|
512
|
+
'report'
|
|
513
|
+
],
|
|
514
|
+
tester: [
|
|
515
|
+
'test',
|
|
516
|
+
'validate',
|
|
517
|
+
'check',
|
|
518
|
+
'verify',
|
|
519
|
+
'quality'
|
|
520
|
+
],
|
|
521
|
+
architect: [
|
|
522
|
+
'design',
|
|
523
|
+
'architecture',
|
|
524
|
+
'structure',
|
|
525
|
+
'plan'
|
|
526
|
+
],
|
|
527
|
+
reviewer: [
|
|
528
|
+
'review',
|
|
529
|
+
'feedback',
|
|
530
|
+
'improve',
|
|
531
|
+
'refactor'
|
|
532
|
+
],
|
|
533
|
+
optimizer: [
|
|
534
|
+
'optimize',
|
|
535
|
+
'performance',
|
|
536
|
+
'speed',
|
|
537
|
+
'efficiency'
|
|
538
|
+
],
|
|
539
|
+
documenter: [
|
|
540
|
+
'document',
|
|
541
|
+
'explain',
|
|
542
|
+
'write',
|
|
543
|
+
'describe'
|
|
544
|
+
]
|
|
545
|
+
};
|
|
546
|
+
let bestWorker = null;
|
|
547
|
+
let bestScore = 0;
|
|
548
|
+
for (const worker of availableWorkers){
|
|
549
|
+
const keywords = priorityMap[worker.type] || [];
|
|
550
|
+
const keywordScore = keywords.filter((k)=>taskLower.includes(k)).length;
|
|
551
|
+
const performanceBonus = worker.performance ? worker.performance.successRate * 0.5 : 0;
|
|
552
|
+
const totalScore = keywordScore + performanceBonus;
|
|
553
|
+
if (totalScore > bestScore) {
|
|
554
|
+
bestScore = totalScore;
|
|
555
|
+
bestWorker = worker;
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
return bestWorker || availableWorkers[0];
|
|
564
559
|
}
|
|
565
|
-
|
|
566
|
-
return bestWorker || availableWorkers[0];
|
|
567
|
-
}
|
|
568
|
-
|
|
569
|
-
/**
|
|
560
|
+
/**
|
|
570
561
|
* Assign task to worker
|
|
571
|
-
*/
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
// Simulate task execution
|
|
594
|
-
this._executeTask(workerId, taskId);
|
|
595
|
-
}
|
|
596
|
-
|
|
597
|
-
/**
|
|
562
|
+
*/ async _assignTask(workerId, taskId) {
|
|
563
|
+
const worker = this.state.workers.get(workerId);
|
|
564
|
+
const task = this.state.tasks.get(taskId);
|
|
565
|
+
if (!worker || !task) return;
|
|
566
|
+
worker.status = 'busy';
|
|
567
|
+
worker.currentTask = taskId;
|
|
568
|
+
task.status = 'in_progress';
|
|
569
|
+
task.assignedTo = workerId;
|
|
570
|
+
// Store assignment in memory
|
|
571
|
+
await this.mcpWrapper.storeMemory(this.state.swarmId, `assignment-${taskId}`, {
|
|
572
|
+
workerId,
|
|
573
|
+
taskId,
|
|
574
|
+
timestamp: Date.now()
|
|
575
|
+
}, 'task');
|
|
576
|
+
this.emit('task:assigned', {
|
|
577
|
+
workerId,
|
|
578
|
+
taskId
|
|
579
|
+
});
|
|
580
|
+
// Simulate task execution
|
|
581
|
+
this._executeTask(workerId, taskId);
|
|
582
|
+
}
|
|
583
|
+
/**
|
|
598
584
|
* Execute task with performance optimization
|
|
599
|
-
*/
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
{
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
}
|
|
668
|
-
);
|
|
669
|
-
|
|
670
|
-
this.emit('task:completed', task);
|
|
671
|
-
this.emit('worker:idle', workerId);
|
|
672
|
-
} catch (error) {
|
|
673
|
-
// Handle task failure
|
|
674
|
-
task.status = 'failed';
|
|
675
|
-
task.error = error.message;
|
|
676
|
-
task.failedAt = new Date().toISOString();
|
|
677
|
-
|
|
678
|
-
worker.status = 'idle';
|
|
679
|
-
worker.currentTask = null;
|
|
680
|
-
worker.performance.successRate =
|
|
681
|
-
(worker.performance.successRate * worker.tasksCompleted) / (worker.tasksCompleted + 1);
|
|
682
|
-
|
|
683
|
-
this.emit('task:failed', { task, error });
|
|
684
|
-
this.emit('worker:idle', workerId);
|
|
585
|
+
*/ async _executeTask(workerId, taskId) {
|
|
586
|
+
const worker = this.state.workers.get(workerId);
|
|
587
|
+
const task = this.state.tasks.get(taskId);
|
|
588
|
+
const startTime = Date.now();
|
|
589
|
+
try {
|
|
590
|
+
// Use performance optimizer for async execution
|
|
591
|
+
const result = await this.performanceOptimizer.optimizeAsyncOperation(async ()=>{
|
|
592
|
+
// Simulate task execution based on complexity
|
|
593
|
+
const baseDuration = {
|
|
594
|
+
low: 5000,
|
|
595
|
+
medium: 15000,
|
|
596
|
+
high: 30000
|
|
597
|
+
}[task.metadata?.complexity || 'medium'];
|
|
598
|
+
const duration = baseDuration + Math.random() * baseDuration * 0.5;
|
|
599
|
+
return new Promise((resolve)=>{
|
|
600
|
+
setTimeout(()=>{
|
|
601
|
+
resolve({
|
|
602
|
+
status: 'completed',
|
|
603
|
+
result: `Task completed by ${worker.type} worker`,
|
|
604
|
+
processingTime: Date.now() - startTime,
|
|
605
|
+
complexity: task.metadata?.complexity || 'medium'
|
|
606
|
+
});
|
|
607
|
+
}, duration);
|
|
608
|
+
});
|
|
609
|
+
}, {
|
|
610
|
+
priority: task.priority
|
|
611
|
+
});
|
|
612
|
+
// Update task and worker
|
|
613
|
+
task.status = 'completed';
|
|
614
|
+
task.completedAt = new Date().toISOString();
|
|
615
|
+
task.result = result.result;
|
|
616
|
+
task.actualDuration = result.processingTime;
|
|
617
|
+
worker.status = 'idle';
|
|
618
|
+
worker.currentTask = null;
|
|
619
|
+
worker.tasksCompleted++;
|
|
620
|
+
// Update worker performance metrics
|
|
621
|
+
if (!worker.performance.avgTaskTime) {
|
|
622
|
+
worker.performance.avgTaskTime = result.processingTime;
|
|
623
|
+
} else {
|
|
624
|
+
worker.performance.avgTaskTime = (worker.performance.avgTaskTime * (worker.tasksCompleted - 1) + result.processingTime) / worker.tasksCompleted;
|
|
625
|
+
}
|
|
626
|
+
// Batch store results for better performance
|
|
627
|
+
await this.performanceOptimizer.optimizeBatchOperation('task_results', {
|
|
628
|
+
key: `result-${taskId}`,
|
|
629
|
+
value: task,
|
|
630
|
+
type: 'result'
|
|
631
|
+
}, async (items)=>{
|
|
632
|
+
// Batch store all results
|
|
633
|
+
await Promise.all(items.map((item)=>this.mcpWrapper.storeMemory(this.state.swarmId, item.key, item.value, item.type)));
|
|
634
|
+
return items.map(()=>({
|
|
635
|
+
success: true
|
|
636
|
+
}));
|
|
637
|
+
});
|
|
638
|
+
this.emit('task:completed', task);
|
|
639
|
+
this.emit('worker:idle', workerId);
|
|
640
|
+
} catch (error) {
|
|
641
|
+
// Handle task failure
|
|
642
|
+
task.status = 'failed';
|
|
643
|
+
task.error = error.message;
|
|
644
|
+
task.failedAt = new Date().toISOString();
|
|
645
|
+
worker.status = 'idle';
|
|
646
|
+
worker.currentTask = null;
|
|
647
|
+
worker.performance.successRate = worker.performance.successRate * worker.tasksCompleted / (worker.tasksCompleted + 1);
|
|
648
|
+
this.emit('task:failed', {
|
|
649
|
+
task,
|
|
650
|
+
error
|
|
651
|
+
});
|
|
652
|
+
this.emit('worker:idle', workerId);
|
|
653
|
+
}
|
|
685
654
|
}
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
/**
|
|
655
|
+
/**
|
|
689
656
|
* Assign next task to idle worker
|
|
690
|
-
*/
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
if (pendingTasks.length > 0) {
|
|
697
|
-
this._assignTask(workerId, pendingTasks[0].id);
|
|
657
|
+
*/ _assignNextTask(workerId) {
|
|
658
|
+
const pendingTasks = Array.from(this.state.tasks.values()).filter((t)=>t.status === 'pending').sort((a, b)=>b.priority - a.priority);
|
|
659
|
+
if (pendingTasks.length > 0) {
|
|
660
|
+
this._assignTask(workerId, pendingTasks[0].id);
|
|
661
|
+
}
|
|
698
662
|
}
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
/**
|
|
663
|
+
/**
|
|
702
664
|
* Build consensus for decision
|
|
703
|
-
*/
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
createdAt: new Date().toISOString(),
|
|
714
|
-
};
|
|
715
|
-
|
|
716
|
-
this.state.decisions.set(decision.id, decision);
|
|
717
|
-
|
|
718
|
-
// Simulate voting process
|
|
719
|
-
const workers = Array.from(this.state.workers.values());
|
|
720
|
-
const votes = {};
|
|
721
|
-
|
|
722
|
-
// Each worker votes
|
|
723
|
-
workers.forEach((worker) => {
|
|
724
|
-
const vote = options[Math.floor(Math.random() * options.length)];
|
|
725
|
-
votes[worker.id] = vote;
|
|
726
|
-
decision.votes.set(worker.id, vote);
|
|
727
|
-
});
|
|
728
|
-
|
|
729
|
-
// Queen gets weighted vote
|
|
730
|
-
const queenVote = options[Math.floor(Math.random() * options.length)];
|
|
731
|
-
votes['queen'] = queenVote;
|
|
732
|
-
decision.votes.set('queen', queenVote);
|
|
733
|
-
|
|
734
|
-
// Calculate consensus
|
|
735
|
-
const result = this._calculateConsensus(decision);
|
|
736
|
-
decision.result = result.decision;
|
|
737
|
-
decision.confidence = result.confidence;
|
|
738
|
-
decision.status = 'completed';
|
|
739
|
-
|
|
740
|
-
// Convert Map to plain object for proper JSON serialization
|
|
741
|
-
const decisionForStorage = {
|
|
742
|
-
...decision,
|
|
743
|
-
votes: decision.votes instanceof Map ? Object.fromEntries(decision.votes) : decision.votes,
|
|
744
|
-
};
|
|
745
|
-
|
|
746
|
-
// Store decision in memory
|
|
747
|
-
await this.mcpWrapper.storeMemory(
|
|
748
|
-
this.state.swarmId,
|
|
749
|
-
`decision-${decision.id}`,
|
|
750
|
-
decisionForStorage,
|
|
751
|
-
'consensus',
|
|
752
|
-
);
|
|
753
|
-
|
|
754
|
-
this.emit('decision:reached', decision);
|
|
755
|
-
return decision;
|
|
756
|
-
}
|
|
757
|
-
|
|
758
|
-
/**
|
|
759
|
-
* Calculate consensus based on algorithm
|
|
760
|
-
*/
|
|
761
|
-
_calculateConsensus(decision) {
|
|
762
|
-
const votes = Array.from(decision.votes.values());
|
|
763
|
-
const voteCount = {};
|
|
764
|
-
|
|
765
|
-
// Count votes
|
|
766
|
-
votes.forEach((vote) => {
|
|
767
|
-
voteCount[vote] = (voteCount[vote] || 0) + 1;
|
|
768
|
-
});
|
|
769
|
-
|
|
770
|
-
switch (decision.algorithm) {
|
|
771
|
-
case 'majority':
|
|
772
|
-
// Simple majority
|
|
773
|
-
const sorted = Object.entries(voteCount).sort((a, b) => b[1] - a[1]);
|
|
774
|
-
const winner = sorted[0];
|
|
775
|
-
return {
|
|
776
|
-
decision: winner[0],
|
|
777
|
-
confidence: winner[1] / votes.length,
|
|
665
|
+
*/ async buildConsensus(topic, options) {
|
|
666
|
+
const decision = {
|
|
667
|
+
id: `decision-${Date.now()}`,
|
|
668
|
+
swarmId: this.state.swarmId,
|
|
669
|
+
topic,
|
|
670
|
+
options,
|
|
671
|
+
votes: new Map(),
|
|
672
|
+
algorithm: this.config.consensusAlgorithm,
|
|
673
|
+
status: 'voting',
|
|
674
|
+
createdAt: new Date().toISOString()
|
|
778
675
|
};
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
const
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
676
|
+
this.state.decisions.set(decision.id, decision);
|
|
677
|
+
// Simulate voting process
|
|
678
|
+
const workers = Array.from(this.state.workers.values());
|
|
679
|
+
const votes = {};
|
|
680
|
+
// Each worker votes
|
|
681
|
+
workers.forEach((worker)=>{
|
|
682
|
+
const vote = options[Math.floor(Math.random() * options.length)];
|
|
683
|
+
votes[worker.id] = vote;
|
|
684
|
+
decision.votes.set(worker.id, vote);
|
|
685
|
+
});
|
|
686
|
+
// Queen gets weighted vote
|
|
687
|
+
const queenVote = options[Math.floor(Math.random() * options.length)];
|
|
688
|
+
votes['queen'] = queenVote;
|
|
689
|
+
decision.votes.set('queen', queenVote);
|
|
690
|
+
// Calculate consensus
|
|
691
|
+
const result = this._calculateConsensus(decision);
|
|
692
|
+
decision.result = result.decision;
|
|
693
|
+
decision.confidence = result.confidence;
|
|
694
|
+
decision.status = 'completed';
|
|
695
|
+
// Convert Map to plain object for proper JSON serialization
|
|
696
|
+
const decisionForStorage = {
|
|
697
|
+
...decision,
|
|
698
|
+
votes: decision.votes instanceof Map ? Object.fromEntries(decision.votes) : decision.votes
|
|
790
699
|
};
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
700
|
+
// Store decision in memory
|
|
701
|
+
await this.mcpWrapper.storeMemory(this.state.swarmId, `decision-${decision.id}`, decisionForStorage, 'consensus');
|
|
702
|
+
this.emit('decision:reached', decision);
|
|
703
|
+
return decision;
|
|
704
|
+
}
|
|
705
|
+
/**
|
|
706
|
+
* Calculate consensus based on algorithm
|
|
707
|
+
*/ _calculateConsensus(decision) {
|
|
708
|
+
const votes = Array.from(decision.votes.values());
|
|
709
|
+
const voteCount = {};
|
|
710
|
+
// Count votes
|
|
711
|
+
votes.forEach((vote)=>{
|
|
712
|
+
voteCount[vote] = (voteCount[vote] || 0) + 1;
|
|
713
|
+
});
|
|
714
|
+
switch(decision.algorithm){
|
|
715
|
+
case 'majority':
|
|
716
|
+
// Simple majority
|
|
717
|
+
const sorted = Object.entries(voteCount).sort((a, b)=>b[1] - a[1]);
|
|
718
|
+
const winner = sorted[0];
|
|
719
|
+
return {
|
|
720
|
+
decision: winner[0],
|
|
721
|
+
confidence: winner[1] / votes.length
|
|
722
|
+
};
|
|
723
|
+
case 'weighted':
|
|
724
|
+
// Weight queen vote more heavily
|
|
725
|
+
const queenVote = decision.votes.get('queen');
|
|
726
|
+
voteCount[queenVote] = (voteCount[queenVote] || 0) + 2; // Queen counts as 3 votes
|
|
727
|
+
const weightedSorted = Object.entries(voteCount).sort((a, b)=>b[1] - a[1]);
|
|
728
|
+
const weightedWinner = weightedSorted[0];
|
|
729
|
+
return {
|
|
730
|
+
decision: weightedWinner[0],
|
|
731
|
+
confidence: weightedWinner[1] / (votes.length + 2)
|
|
732
|
+
};
|
|
733
|
+
case 'byzantine':
|
|
734
|
+
// Requires 2/3 majority
|
|
735
|
+
const byzantineSorted = Object.entries(voteCount).sort((a, b)=>b[1] - a[1]);
|
|
736
|
+
const byzantineWinner = byzantineSorted[0];
|
|
737
|
+
const byzantineConfidence = byzantineWinner[1] / votes.length;
|
|
738
|
+
if (byzantineConfidence >= 0.67) {
|
|
739
|
+
return {
|
|
740
|
+
decision: byzantineWinner[0],
|
|
741
|
+
confidence: byzantineConfidence
|
|
742
|
+
};
|
|
743
|
+
} else {
|
|
744
|
+
return {
|
|
745
|
+
decision: 'no_consensus',
|
|
746
|
+
confidence: 0
|
|
747
|
+
};
|
|
748
|
+
}
|
|
749
|
+
default:
|
|
750
|
+
return {
|
|
751
|
+
decision: 'unknown',
|
|
752
|
+
confidence: 0
|
|
753
|
+
};
|
|
808
754
|
}
|
|
809
|
-
|
|
810
|
-
default:
|
|
811
|
-
return {
|
|
812
|
-
decision: 'unknown',
|
|
813
|
-
confidence: 0,
|
|
814
|
-
};
|
|
815
755
|
}
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
/**
|
|
756
|
+
/**
|
|
819
757
|
* Check if auto-scaling is needed
|
|
820
|
-
*/
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
console.log(`Auto-scaled: Added ${newWorkerType} worker`);
|
|
837
|
-
}
|
|
838
|
-
|
|
839
|
-
// Scale down if too many idle workers
|
|
840
|
-
if (idleWorkers > pendingTasks + 2 && this.state.workers.size > 2) {
|
|
841
|
-
// TODO: Implement worker removal
|
|
758
|
+
*/ async _checkAutoScale() {
|
|
759
|
+
if (!this.config.autoScale) return;
|
|
760
|
+
const pendingTasks = Array.from(this.state.tasks.values()).filter((t)=>t.status === 'pending').length;
|
|
761
|
+
const idleWorkers = Array.from(this.state.workers.values()).filter((w)=>w.status === 'idle').length;
|
|
762
|
+
// Scale up if too many pending tasks
|
|
763
|
+
if (pendingTasks > idleWorkers * 2 && this.state.workers.size < this.config.maxWorkers) {
|
|
764
|
+
const newWorkerType = this._determineWorkerType();
|
|
765
|
+
await this.spawnWorkers([
|
|
766
|
+
newWorkerType
|
|
767
|
+
]);
|
|
768
|
+
console.log(`Auto-scaled: Added ${newWorkerType} worker`);
|
|
769
|
+
}
|
|
770
|
+
// Scale down if too many idle workers
|
|
771
|
+
if (idleWorkers > pendingTasks + 2 && this.state.workers.size > 2) {
|
|
772
|
+
// TODO: Implement worker removal
|
|
773
|
+
}
|
|
842
774
|
}
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
/**
|
|
775
|
+
/**
|
|
846
776
|
* Determine worker type for auto-scaling
|
|
847
|
-
*/
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
});
|
|
873
|
-
|
|
874
|
-
// Return type with highest score
|
|
875
|
-
const sorted = Object.entries(typeScores).sort((a, b) => b[1] - a[1]);
|
|
876
|
-
return sorted.length > 0 ? sorted[0][0] : 'coder'; // Default to coder
|
|
877
|
-
}
|
|
878
|
-
|
|
879
|
-
/**
|
|
777
|
+
*/ _determineWorkerType() {
|
|
778
|
+
// Analyze pending tasks to determine needed worker type
|
|
779
|
+
const pendingTasks = Array.from(this.state.tasks.values()).filter((t)=>t.status === 'pending');
|
|
780
|
+
// Simple heuristic based on task descriptions
|
|
781
|
+
const typeScores = {};
|
|
782
|
+
pendingTasks.forEach((task)=>{
|
|
783
|
+
const taskLower = task.description.toLowerCase();
|
|
784
|
+
if (taskLower.includes('code') || taskLower.includes('implement')) {
|
|
785
|
+
typeScores.coder = (typeScores.coder || 0) + 1;
|
|
786
|
+
}
|
|
787
|
+
if (taskLower.includes('test') || taskLower.includes('validate')) {
|
|
788
|
+
typeScores.tester = (typeScores.tester || 0) + 1;
|
|
789
|
+
}
|
|
790
|
+
if (taskLower.includes('analyze') || taskLower.includes('data')) {
|
|
791
|
+
typeScores.analyst = (typeScores.analyst || 0) + 1;
|
|
792
|
+
}
|
|
793
|
+
if (taskLower.includes('research') || taskLower.includes('investigate')) {
|
|
794
|
+
typeScores.researcher = (typeScores.researcher || 0) + 1;
|
|
795
|
+
}
|
|
796
|
+
});
|
|
797
|
+
// Return type with highest score
|
|
798
|
+
const sorted = Object.entries(typeScores).sort((a, b)=>b[1] - a[1]);
|
|
799
|
+
return sorted.length > 0 ? sorted[0][0] : 'coder'; // Default to coder
|
|
800
|
+
}
|
|
801
|
+
/**
|
|
880
802
|
* Update performance metrics
|
|
881
|
-
*/
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
},
|
|
897
|
-
'metrics',
|
|
898
|
-
);
|
|
899
|
-
|
|
900
|
-
// Analyze performance if needed
|
|
901
|
-
if (this.state.metrics.tasksCompleted % 10 === 0) {
|
|
902
|
-
await this.mcpWrapper.analyzePerformance(this.state.swarmId);
|
|
803
|
+
*/ async _updatePerformanceMetrics() {
|
|
804
|
+
// Calculate performance metrics
|
|
805
|
+
const completionRate = this.state.metrics.tasksCompleted / this.state.metrics.tasksCreated;
|
|
806
|
+
const avgTasksPerWorker = this.state.metrics.tasksCompleted / this.state.workers.size;
|
|
807
|
+
// Store metrics in memory
|
|
808
|
+
await this.mcpWrapper.storeMemory(this.state.swarmId, 'metrics', {
|
|
809
|
+
...this.state.metrics,
|
|
810
|
+
completionRate,
|
|
811
|
+
avgTasksPerWorker,
|
|
812
|
+
timestamp: Date.now()
|
|
813
|
+
}, 'metrics');
|
|
814
|
+
// Analyze performance if needed
|
|
815
|
+
if (this.state.metrics.tasksCompleted % 10 === 0) {
|
|
816
|
+
await this.mcpWrapper.analyzePerformance(this.state.swarmId);
|
|
817
|
+
}
|
|
903
818
|
}
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
/**
|
|
819
|
+
/**
|
|
907
820
|
* Handle errors
|
|
908
|
-
*/
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
stack: error.stack,
|
|
918
|
-
timestamp: Date.now(),
|
|
919
|
-
},
|
|
920
|
-
'error',
|
|
921
|
-
)
|
|
922
|
-
.catch(console.error);
|
|
923
|
-
}
|
|
924
|
-
|
|
925
|
-
/**
|
|
821
|
+
*/ _handleError(error) {
|
|
822
|
+
// Log error to memory
|
|
823
|
+
this.mcpWrapper.storeMemory(this.state.swarmId, `error-${Date.now()}`, {
|
|
824
|
+
message: error.message,
|
|
825
|
+
stack: error.stack,
|
|
826
|
+
timestamp: Date.now()
|
|
827
|
+
}, 'error').catch(console.error);
|
|
828
|
+
}
|
|
829
|
+
/**
|
|
926
830
|
* Get current status with performance metrics
|
|
927
|
-
*/
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
}
|
|
954
|
-
|
|
955
|
-
/**
|
|
831
|
+
*/ getStatus() {
|
|
832
|
+
const tasks = Array.from(this.state.tasks.values());
|
|
833
|
+
const workers = Array.from(this.state.workers.values());
|
|
834
|
+
return {
|
|
835
|
+
swarmId: this.state.swarmId,
|
|
836
|
+
status: this.state.status,
|
|
837
|
+
queen: this.state.queen,
|
|
838
|
+
workers: workers,
|
|
839
|
+
tasks: {
|
|
840
|
+
total: this.state.tasks.size,
|
|
841
|
+
pending: tasks.filter((t)=>t.status === 'pending').length,
|
|
842
|
+
inProgress: tasks.filter((t)=>t.status === 'in_progress').length,
|
|
843
|
+
completed: tasks.filter((t)=>t.status === 'completed').length,
|
|
844
|
+
failed: tasks.filter((t)=>t.status === 'failed').length
|
|
845
|
+
},
|
|
846
|
+
metrics: {
|
|
847
|
+
...this.state.metrics,
|
|
848
|
+
averageTaskTime: this._calculateAverageTaskTime(tasks),
|
|
849
|
+
workerEfficiency: this._calculateWorkerEfficiency(workers),
|
|
850
|
+
throughput: this._calculateThroughput(tasks)
|
|
851
|
+
},
|
|
852
|
+
decisions: this.state.decisions.size,
|
|
853
|
+
performance: this.performanceOptimizer.getPerformanceStats()
|
|
854
|
+
};
|
|
855
|
+
}
|
|
856
|
+
/**
|
|
956
857
|
* Calculate average task completion time
|
|
957
|
-
*/
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
}
|
|
965
|
-
|
|
966
|
-
/**
|
|
858
|
+
*/ _calculateAverageTaskTime(tasks) {
|
|
859
|
+
const completedTasks = tasks.filter((t)=>t.status === 'completed' && t.actualDuration);
|
|
860
|
+
if (completedTasks.length === 0) return 0;
|
|
861
|
+
const totalTime = completedTasks.reduce((sum, task)=>sum + task.actualDuration, 0);
|
|
862
|
+
return Math.round(totalTime / completedTasks.length);
|
|
863
|
+
}
|
|
864
|
+
/**
|
|
967
865
|
* Calculate worker efficiency
|
|
968
|
-
*/
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
}
|
|
975
|
-
|
|
976
|
-
/**
|
|
866
|
+
*/ _calculateWorkerEfficiency(workers) {
|
|
867
|
+
if (workers.length === 0) return 0;
|
|
868
|
+
const efficiencies = workers.map((worker)=>worker.performance?.successRate || 1.0);
|
|
869
|
+
return (efficiencies.reduce((sum, eff)=>sum + eff, 0) / workers.length * 100).toFixed(2);
|
|
870
|
+
}
|
|
871
|
+
/**
|
|
977
872
|
* Calculate system throughput (tasks per minute)
|
|
978
|
-
*/
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
return timeSpanMinutes > 0 ? (completedTasks.length / timeSpanMinutes).toFixed(2) : 0;
|
|
988
|
-
}
|
|
989
|
-
|
|
990
|
-
/**
|
|
873
|
+
*/ _calculateThroughput(tasks) {
|
|
874
|
+
const completedTasks = tasks.filter((t)=>t.status === 'completed' && t.completedAt);
|
|
875
|
+
if (completedTasks.length < 2) return 0;
|
|
876
|
+
const firstCompleted = new Date(completedTasks[0].completedAt).getTime();
|
|
877
|
+
const lastCompleted = new Date(completedTasks[completedTasks.length - 1].completedAt).getTime();
|
|
878
|
+
const timeSpanMinutes = (lastCompleted - firstCompleted) / (1000 * 60);
|
|
879
|
+
return timeSpanMinutes > 0 ? (completedTasks.length / timeSpanMinutes).toFixed(2) : 0;
|
|
880
|
+
}
|
|
881
|
+
/**
|
|
991
882
|
* Shutdown hive mind with cleanup
|
|
992
|
-
*/
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
this.state.status = 'shutdown';
|
|
1018
|
-
this.emit('shutdown', { performanceReport });
|
|
1019
|
-
} catch (error) {
|
|
1020
|
-
this.emit('error', { type: 'shutdown_failed', error });
|
|
1021
|
-
throw error;
|
|
883
|
+
*/ async shutdown() {
|
|
884
|
+
this.state.status = 'shutting_down';
|
|
885
|
+
try {
|
|
886
|
+
// Generate final performance report
|
|
887
|
+
const performanceReport = this.performanceOptimizer.generatePerformanceReport();
|
|
888
|
+
// Save final state and performance report
|
|
889
|
+
await Promise.all([
|
|
890
|
+
this.mcpWrapper.storeMemory(this.state.swarmId, 'final_state', this.getStatus(), 'system'),
|
|
891
|
+
this.mcpWrapper.storeMemory(this.state.swarmId, 'final_performance_report', performanceReport, 'metrics')
|
|
892
|
+
]);
|
|
893
|
+
// Close performance optimizer
|
|
894
|
+
await this.performanceOptimizer.close();
|
|
895
|
+
// Destroy swarm
|
|
896
|
+
await this.mcpWrapper.destroySwarm(this.state.swarmId);
|
|
897
|
+
this.state.status = 'shutdown';
|
|
898
|
+
this.emit('shutdown', {
|
|
899
|
+
performanceReport
|
|
900
|
+
});
|
|
901
|
+
} catch (error) {
|
|
902
|
+
this.emit('error', {
|
|
903
|
+
type: 'shutdown_failed',
|
|
904
|
+
error
|
|
905
|
+
});
|
|
906
|
+
throw error;
|
|
907
|
+
}
|
|
1022
908
|
}
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
/**
|
|
909
|
+
/**
|
|
1026
910
|
* Get performance insights and recommendations
|
|
1027
|
-
*/
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
911
|
+
*/ getPerformanceInsights() {
|
|
912
|
+
return this.performanceOptimizer.generatePerformanceReport();
|
|
913
|
+
}
|
|
914
|
+
constructor(config = {}){
|
|
915
|
+
super();
|
|
916
|
+
this.config = {
|
|
917
|
+
objective: '',
|
|
918
|
+
name: `hive-${Date.now()}`,
|
|
919
|
+
queenType: 'strategic',
|
|
920
|
+
maxWorkers: 8,
|
|
921
|
+
consensusAlgorithm: 'majority',
|
|
922
|
+
autoScale: true,
|
|
923
|
+
encryption: false,
|
|
924
|
+
memorySize: 100,
|
|
925
|
+
taskTimeout: 60,
|
|
926
|
+
...config
|
|
927
|
+
};
|
|
928
|
+
this.state = {
|
|
929
|
+
status: 'initializing',
|
|
930
|
+
swarmId: null,
|
|
931
|
+
queen: null,
|
|
932
|
+
workers: new Map(),
|
|
933
|
+
tasks: new Map(),
|
|
934
|
+
memory: new Map(),
|
|
935
|
+
decisions: new Map(),
|
|
936
|
+
metrics: {
|
|
937
|
+
tasksCreated: 0,
|
|
938
|
+
tasksCompleted: 0,
|
|
939
|
+
decisionsReached: 0,
|
|
940
|
+
memoryUsage: 0
|
|
941
|
+
}
|
|
942
|
+
};
|
|
943
|
+
this.mcpWrapper = new MCPToolWrapper({
|
|
944
|
+
parallel: true,
|
|
945
|
+
timeout: this.config.taskTimeout * 60 * 1000
|
|
946
|
+
});
|
|
947
|
+
// Initialize performance optimizer
|
|
948
|
+
this.performanceOptimizer = new PerformanceOptimizer({
|
|
949
|
+
enableAsyncQueue: true,
|
|
950
|
+
enableBatchProcessing: true,
|
|
951
|
+
enableAutoTuning: true,
|
|
952
|
+
asyncQueueConcurrency: Math.min(this.config.maxWorkers * 2, 20),
|
|
953
|
+
batchMaxSize: 50,
|
|
954
|
+
metricsInterval: 30000
|
|
955
|
+
});
|
|
956
|
+
this._initializeEventHandlers();
|
|
957
|
+
this._initializePerformanceMonitoring();
|
|
958
|
+
}
|
|
1031
959
|
}
|