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,542 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Large-Scale Coordinator
|
|
3
|
+
* Manages 100+ concurrent agents with hierarchical coordination
|
|
4
|
+
* Implements work-stealing, load balancing, and fault tolerance
|
|
5
|
+
*
|
|
6
|
+
* Performance Targets:
|
|
7
|
+
* - Support: 100+ simultaneous agents
|
|
8
|
+
* - Coordination latency: <10ms
|
|
9
|
+
* - Recovery time: <5 seconds
|
|
10
|
+
*/ function _define_property(obj, key, value) {
|
|
11
|
+
if (key in obj) {
|
|
12
|
+
Object.defineProperty(obj, key, {
|
|
13
|
+
value: value,
|
|
14
|
+
enumerable: true,
|
|
15
|
+
configurable: true,
|
|
16
|
+
writable: true
|
|
17
|
+
});
|
|
18
|
+
} else {
|
|
19
|
+
obj[key] = value;
|
|
20
|
+
}
|
|
21
|
+
return obj;
|
|
22
|
+
}
|
|
23
|
+
import { EventEmitter } from "node:events";
|
|
24
|
+
import { performance } from "perf_hooks";
|
|
25
|
+
import { Logger } from "../core/logger.js";
|
|
26
|
+
export class LargeScaleCoordinator extends EventEmitter {
|
|
27
|
+
initialize() {
|
|
28
|
+
// Create root coordination node
|
|
29
|
+
const rootNode = {
|
|
30
|
+
id: 'root',
|
|
31
|
+
level: 0,
|
|
32
|
+
agents: new Set(),
|
|
33
|
+
subCoordinators: new Set(),
|
|
34
|
+
workQueue: [],
|
|
35
|
+
capacity: this.config.maxAgentsPerNode,
|
|
36
|
+
load: 0
|
|
37
|
+
};
|
|
38
|
+
this.coordinationTree.set('root', rootNode);
|
|
39
|
+
// Start background processes
|
|
40
|
+
this.startHealthMonitoring();
|
|
41
|
+
this.startLoadBalancing();
|
|
42
|
+
if (this.config.workStealing.enabled) {
|
|
43
|
+
this.startWorkStealing();
|
|
44
|
+
}
|
|
45
|
+
this.logger.info('Large-scale coordinator initialized', {
|
|
46
|
+
maxAgentsPerNode: this.config.maxAgentsPerNode,
|
|
47
|
+
hierarchyDepth: this.config.hierarchyDepth
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Register multiple agents in the coordination hierarchy
|
|
52
|
+
*/ async registerAgents(agents) {
|
|
53
|
+
const registerStart = performance.now();
|
|
54
|
+
for (const agent of agents){
|
|
55
|
+
await this.registerAgent(agent);
|
|
56
|
+
}
|
|
57
|
+
const registerTime = performance.now() - registerStart;
|
|
58
|
+
this.metrics.totalAgentsManaged = this.agentToNode.size;
|
|
59
|
+
this.logger.info('Agents registered in coordination hierarchy', {
|
|
60
|
+
count: agents.length,
|
|
61
|
+
totalManaged: this.metrics.totalAgentsManaged,
|
|
62
|
+
registerTime: `${registerTime.toFixed(2)}ms`
|
|
63
|
+
});
|
|
64
|
+
this.emit('agents:registered', {
|
|
65
|
+
count: agents.length,
|
|
66
|
+
totalManaged: this.metrics.totalAgentsManaged
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Register a single agent in the coordination hierarchy
|
|
71
|
+
*/ async registerAgent(agent) {
|
|
72
|
+
// Find the best coordination node for this agent
|
|
73
|
+
const targetNode = this.findBestNode(agent);
|
|
74
|
+
if (!targetNode) {
|
|
75
|
+
// Create new node if needed
|
|
76
|
+
const newNode = await this.createCoordinationNode(agent);
|
|
77
|
+
targetNode = newNode;
|
|
78
|
+
}
|
|
79
|
+
// Register agent to node
|
|
80
|
+
targetNode.agents.add(agent.id);
|
|
81
|
+
this.agentToNode.set(agent.id, targetNode.id);
|
|
82
|
+
// Initialize health tracking
|
|
83
|
+
this.agentHealth.set(agent.id, {
|
|
84
|
+
status: 'healthy',
|
|
85
|
+
lastHeartbeat: Date.now()
|
|
86
|
+
});
|
|
87
|
+
// Initialize load stats
|
|
88
|
+
this.loadStats.set(agent.id, {
|
|
89
|
+
tasks: 0,
|
|
90
|
+
avgLatency: 0,
|
|
91
|
+
lastUpdate: Date.now()
|
|
92
|
+
});
|
|
93
|
+
this.logger.debug('Agent registered', {
|
|
94
|
+
agentId: agent.id,
|
|
95
|
+
nodeId: targetNode.id,
|
|
96
|
+
nodeLevel: targetNode.level
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Coordinate task assignment across agents with intelligent load balancing
|
|
101
|
+
*/ async coordinateTask(task) {
|
|
102
|
+
const coordStart = performance.now();
|
|
103
|
+
try {
|
|
104
|
+
// Find best agent for this task
|
|
105
|
+
const targetAgentId = await this.selectTargetAgent(task);
|
|
106
|
+
if (!targetAgentId) {
|
|
107
|
+
// No available agent - queue globally
|
|
108
|
+
this.globalWorkQueue.push(task);
|
|
109
|
+
this.logger.warn('No available agent, task queued', {
|
|
110
|
+
taskId: task.id
|
|
111
|
+
});
|
|
112
|
+
return 'queued';
|
|
113
|
+
}
|
|
114
|
+
// Assign task to agent
|
|
115
|
+
this.taskAssignments.set(task.id, targetAgentId);
|
|
116
|
+
// Update load stats
|
|
117
|
+
const loadStat = this.loadStats.get(targetAgentId);
|
|
118
|
+
if (loadStat) {
|
|
119
|
+
loadStat.tasks++;
|
|
120
|
+
loadStat.lastUpdate = Date.now();
|
|
121
|
+
}
|
|
122
|
+
// Update node load
|
|
123
|
+
const nodeId = this.agentToNode.get(targetAgentId);
|
|
124
|
+
if (nodeId) {
|
|
125
|
+
const node = this.coordinationTree.get(nodeId);
|
|
126
|
+
if (node) {
|
|
127
|
+
node.load++;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// Record metrics
|
|
131
|
+
const coordLatency = performance.now() - coordStart;
|
|
132
|
+
this.metrics.coordinationLatencies.push(coordLatency);
|
|
133
|
+
if (this.metrics.coordinationLatencies.length > 1000) {
|
|
134
|
+
this.metrics.coordinationLatencies = this.metrics.coordinationLatencies.slice(-1000);
|
|
135
|
+
}
|
|
136
|
+
this.metrics.avgCoordinationLatency = this.metrics.coordinationLatencies.reduce((a, b)=>a + b, 0) / this.metrics.coordinationLatencies.length;
|
|
137
|
+
this.metrics.tasksCoordinated++;
|
|
138
|
+
this.logger.debug('Task coordinated', {
|
|
139
|
+
taskId: task.id,
|
|
140
|
+
agentId: targetAgentId,
|
|
141
|
+
coordLatency: `${coordLatency.toFixed(2)}ms`
|
|
142
|
+
});
|
|
143
|
+
this.emit('task:coordinated', {
|
|
144
|
+
taskId: task.id,
|
|
145
|
+
agentId: targetAgentId,
|
|
146
|
+
latency: coordLatency
|
|
147
|
+
});
|
|
148
|
+
return targetAgentId;
|
|
149
|
+
} catch (error) {
|
|
150
|
+
this.logger.error('Task coordination failed', {
|
|
151
|
+
taskId: task.id,
|
|
152
|
+
error: error instanceof Error ? error.message : String(error)
|
|
153
|
+
});
|
|
154
|
+
throw error;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Select the best agent for a task using configured load balancing strategy
|
|
159
|
+
*/ async selectTargetAgent(task) {
|
|
160
|
+
const healthyAgents = Array.from(this.agentHealth.entries()).filter(([_, health])=>health.status === 'healthy').map(([agentId])=>agentId);
|
|
161
|
+
if (healthyAgents.length === 0) {
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
switch(this.config.loadBalancing.type){
|
|
165
|
+
case 'least-loaded':
|
|
166
|
+
return this.selectLeastLoadedAgent(healthyAgents);
|
|
167
|
+
case 'round-robin':
|
|
168
|
+
return this.selectRoundRobinAgent(healthyAgents);
|
|
169
|
+
case 'random':
|
|
170
|
+
return healthyAgents[Math.floor(Math.random() * healthyAgents.length)];
|
|
171
|
+
case 'weighted':
|
|
172
|
+
return this.selectWeightedAgent(healthyAgents, task);
|
|
173
|
+
default:
|
|
174
|
+
return this.selectLeastLoadedAgent(healthyAgents);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
selectLeastLoadedAgent(agents) {
|
|
178
|
+
let minLoad = Infinity;
|
|
179
|
+
let selectedAgent = agents[0];
|
|
180
|
+
for (const agentId of agents){
|
|
181
|
+
const loadStat = this.loadStats.get(agentId);
|
|
182
|
+
if (loadStat && loadStat.tasks < minLoad) {
|
|
183
|
+
minLoad = loadStat.tasks;
|
|
184
|
+
selectedAgent = agentId;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return selectedAgent;
|
|
188
|
+
}
|
|
189
|
+
selectRoundRobinAgent(agents) {
|
|
190
|
+
const index = this.metrics.tasksCoordinated % agents.length;
|
|
191
|
+
return agents[index];
|
|
192
|
+
}
|
|
193
|
+
selectWeightedAgent(agents, task) {
|
|
194
|
+
// Weight based on task type affinity, load, and latency
|
|
195
|
+
let bestScore = -Infinity;
|
|
196
|
+
let selectedAgent = agents[0];
|
|
197
|
+
for (const agentId of agents){
|
|
198
|
+
const loadStat = this.loadStats.get(agentId);
|
|
199
|
+
if (!loadStat) continue;
|
|
200
|
+
const loadScore = 1 / (loadStat.tasks + 1); // Lower load = higher score
|
|
201
|
+
const latencyScore = loadStat.avgLatency > 0 ? 1000 / loadStat.avgLatency : 1;
|
|
202
|
+
const totalScore = loadScore * 0.7 + latencyScore * 0.3;
|
|
203
|
+
if (totalScore > bestScore) {
|
|
204
|
+
bestScore = totalScore;
|
|
205
|
+
selectedAgent = agentId;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return selectedAgent;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Find the best coordination node for an agent
|
|
212
|
+
*/ findBestNode(agent) {
|
|
213
|
+
let bestNode = null;
|
|
214
|
+
let minLoad = Infinity;
|
|
215
|
+
for (const node of this.coordinationTree.values()){
|
|
216
|
+
// Skip full nodes
|
|
217
|
+
if (node.agents.size >= this.config.maxAgentsPerNode) {
|
|
218
|
+
continue;
|
|
219
|
+
}
|
|
220
|
+
// Find node with lowest load at appropriate level
|
|
221
|
+
if (node.load < minLoad && node.level === this.getTargetLevel(agent)) {
|
|
222
|
+
minLoad = node.load;
|
|
223
|
+
bestNode = node;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return bestNode;
|
|
227
|
+
}
|
|
228
|
+
getTargetLevel(agent) {
|
|
229
|
+
// Distribute agents across hierarchy levels
|
|
230
|
+
return Math.min(Math.floor(this.metrics.totalAgentsManaged / this.config.maxAgentsPerNode), this.config.hierarchyDepth - 1);
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Create a new coordination node in the hierarchy
|
|
234
|
+
*/ async createCoordinationNode(agent) {
|
|
235
|
+
const nodeId = `node-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
|
236
|
+
const level = this.getTargetLevel(agent);
|
|
237
|
+
const newNode = {
|
|
238
|
+
id: nodeId,
|
|
239
|
+
level,
|
|
240
|
+
agents: new Set(),
|
|
241
|
+
subCoordinators: new Set(),
|
|
242
|
+
workQueue: [],
|
|
243
|
+
capacity: this.config.maxAgentsPerNode,
|
|
244
|
+
load: 0
|
|
245
|
+
};
|
|
246
|
+
this.coordinationTree.set(nodeId, newNode);
|
|
247
|
+
this.metrics.activeCoordinationNodes++;
|
|
248
|
+
// Link to parent coordinator if not root level
|
|
249
|
+
if (level > 0) {
|
|
250
|
+
const parentNode = this.findParentNode(level);
|
|
251
|
+
if (parentNode) {
|
|
252
|
+
parentNode.subCoordinators.add(nodeId);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
this.logger.info('Created new coordination node', {
|
|
256
|
+
nodeId,
|
|
257
|
+
level,
|
|
258
|
+
totalNodes: this.coordinationTree.size
|
|
259
|
+
});
|
|
260
|
+
return newNode;
|
|
261
|
+
}
|
|
262
|
+
findParentNode(childLevel) {
|
|
263
|
+
const parentLevel = childLevel - 1;
|
|
264
|
+
for (const node of this.coordinationTree.values()){
|
|
265
|
+
if (node.level === parentLevel && node.subCoordinators.size < this.config.maxAgentsPerNode) {
|
|
266
|
+
return node;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return null;
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Work-stealing algorithm for dynamic load balancing
|
|
273
|
+
*/ startWorkStealing() {
|
|
274
|
+
setInterval(()=>{
|
|
275
|
+
if (this.workStealingActive) return;
|
|
276
|
+
this.workStealingActive = true;
|
|
277
|
+
this.performWorkStealing();
|
|
278
|
+
this.workStealingActive = false;
|
|
279
|
+
}, 500); // Check every 500ms
|
|
280
|
+
}
|
|
281
|
+
performWorkStealing() {
|
|
282
|
+
const nodes = Array.from(this.coordinationTree.values());
|
|
283
|
+
// Find heavily loaded and lightly loaded nodes
|
|
284
|
+
const sortedByLoad = nodes.sort((a, b)=>b.load - a.load);
|
|
285
|
+
const heaviestNode = sortedByLoad[0];
|
|
286
|
+
const lightestNode = sortedByLoad[sortedByLoad.length - 1];
|
|
287
|
+
if (!heaviestNode || !lightestNode) return;
|
|
288
|
+
const loadDifference = heaviestNode.load - lightestNode.load;
|
|
289
|
+
const threshold = lightestNode.load * this.config.workStealing.thresholdRatio;
|
|
290
|
+
if (loadDifference > threshold && heaviestNode.workQueue.length > 0) {
|
|
291
|
+
// Steal tasks from heavy node to light node
|
|
292
|
+
const tasksToSteal = Math.min(Math.max(Math.floor(loadDifference / 2), this.config.workStealing.minTasksToSteal), this.config.workStealing.maxTasksToSteal, heaviestNode.workQueue.length);
|
|
293
|
+
const stolenTasks = heaviestNode.workQueue.splice(0, tasksToSteal);
|
|
294
|
+
lightestNode.workQueue.push(...stolenTasks);
|
|
295
|
+
heaviestNode.load -= tasksToSteal;
|
|
296
|
+
lightestNode.load += tasksToSteal;
|
|
297
|
+
this.metrics.workStealingOperations++;
|
|
298
|
+
this.logger.debug('Work stealing performed', {
|
|
299
|
+
from: heaviestNode.id,
|
|
300
|
+
to: lightestNode.id,
|
|
301
|
+
taskCount: tasksToSteal
|
|
302
|
+
});
|
|
303
|
+
this.emit('work:stolen', {
|
|
304
|
+
from: heaviestNode.id,
|
|
305
|
+
to: lightestNode.id,
|
|
306
|
+
count: tasksToSteal
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Periodic load balancing across coordination nodes
|
|
312
|
+
*/ startLoadBalancing() {
|
|
313
|
+
const interval = this.config.loadBalancing.rebalanceInterval || 5000;
|
|
314
|
+
this.rebalanceTimer = setInterval(()=>{
|
|
315
|
+
this.performLoadRebalancing();
|
|
316
|
+
}, interval);
|
|
317
|
+
}
|
|
318
|
+
performLoadRebalancing() {
|
|
319
|
+
const nodes = Array.from(this.coordinationTree.values());
|
|
320
|
+
const avgLoad = nodes.reduce((sum, node)=>sum + node.load, 0) / nodes.length;
|
|
321
|
+
let rebalanced = false;
|
|
322
|
+
for (const node of nodes){
|
|
323
|
+
const loadDiff = node.load - avgLoad;
|
|
324
|
+
if (Math.abs(loadDiff) > avgLoad * 0.3) {
|
|
325
|
+
// Significant load imbalance detected
|
|
326
|
+
rebalanced = true;
|
|
327
|
+
if (loadDiff > 0) {
|
|
328
|
+
// Redistribute excess load
|
|
329
|
+
const tasksToRedistribute = Math.floor(Math.abs(loadDiff) / 2);
|
|
330
|
+
// Logic to move tasks to less loaded nodes
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
if (rebalanced) {
|
|
335
|
+
this.metrics.rebalancingOperations++;
|
|
336
|
+
this.logger.debug('Load rebalancing performed');
|
|
337
|
+
this.emit('load:rebalanced');
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Health monitoring and automatic recovery
|
|
342
|
+
*/ startHealthMonitoring() {
|
|
343
|
+
setInterval(()=>{
|
|
344
|
+
this.checkAgentHealth();
|
|
345
|
+
this.processRecoveryQueue();
|
|
346
|
+
}, this.config.healthCheckInterval);
|
|
347
|
+
}
|
|
348
|
+
checkAgentHealth() {
|
|
349
|
+
const now = Date.now();
|
|
350
|
+
const healthTimeout = this.config.healthCheckInterval * 3;
|
|
351
|
+
for (const [agentId, health] of this.agentHealth.entries()){
|
|
352
|
+
const timeSinceHeartbeat = now - health.lastHeartbeat;
|
|
353
|
+
if (timeSinceHeartbeat > healthTimeout) {
|
|
354
|
+
// Agent appears to have failed
|
|
355
|
+
if (health.status !== 'failed') {
|
|
356
|
+
this.handleAgentFailure(agentId);
|
|
357
|
+
}
|
|
358
|
+
} else if (timeSinceHeartbeat > healthTimeout / 2) {
|
|
359
|
+
// Agent is degraded
|
|
360
|
+
if (health.status === 'healthy') {
|
|
361
|
+
health.status = 'degraded';
|
|
362
|
+
this.logger.warn('Agent health degraded', {
|
|
363
|
+
agentId
|
|
364
|
+
});
|
|
365
|
+
this.emit('agent:degraded', agentId);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
handleAgentFailure(agentId) {
|
|
371
|
+
const health = this.agentHealth.get(agentId);
|
|
372
|
+
if (!health) return;
|
|
373
|
+
health.status = 'failed';
|
|
374
|
+
this.failedAgents.add(agentId);
|
|
375
|
+
this.metrics.agentFailures++;
|
|
376
|
+
// Add to recovery queue
|
|
377
|
+
this.recoveryQueue.push({
|
|
378
|
+
agentId,
|
|
379
|
+
failureTime: Date.now()
|
|
380
|
+
});
|
|
381
|
+
// Remove from coordination
|
|
382
|
+
const nodeId = this.agentToNode.get(agentId);
|
|
383
|
+
if (nodeId) {
|
|
384
|
+
const node = this.coordinationTree.get(nodeId);
|
|
385
|
+
if (node) {
|
|
386
|
+
node.agents.delete(agentId);
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
this.logger.error('Agent failure detected', {
|
|
390
|
+
agentId
|
|
391
|
+
});
|
|
392
|
+
this.emit('agent:failed', agentId);
|
|
393
|
+
}
|
|
394
|
+
processRecoveryQueue() {
|
|
395
|
+
const now = Date.now();
|
|
396
|
+
const newRecoveryQueue = [];
|
|
397
|
+
for (const recovery of this.recoveryQueue){
|
|
398
|
+
const timeSinceFailure = now - recovery.failureTime;
|
|
399
|
+
if (timeSinceFailure > this.config.recoveryTimeout) {
|
|
400
|
+
// Attempt recovery
|
|
401
|
+
this.attemptAgentRecovery(recovery.agentId);
|
|
402
|
+
} else {
|
|
403
|
+
// Keep in queue
|
|
404
|
+
newRecoveryQueue.push(recovery);
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
this.recoveryQueue = newRecoveryQueue;
|
|
408
|
+
}
|
|
409
|
+
attemptAgentRecovery(agentId) {
|
|
410
|
+
// In production, this would trigger actual agent restart/replacement
|
|
411
|
+
this.logger.info('Attempting agent recovery', {
|
|
412
|
+
agentId
|
|
413
|
+
});
|
|
414
|
+
// Simulate recovery success
|
|
415
|
+
this.failedAgents.delete(agentId);
|
|
416
|
+
const health = this.agentHealth.get(agentId);
|
|
417
|
+
if (health) {
|
|
418
|
+
health.status = 'healthy';
|
|
419
|
+
health.lastHeartbeat = Date.now();
|
|
420
|
+
}
|
|
421
|
+
this.metrics.agentRecoveries++;
|
|
422
|
+
this.emit('agent:recovered', agentId);
|
|
423
|
+
}
|
|
424
|
+
/**
|
|
425
|
+
* Update agent heartbeat (called by agents to signal health)
|
|
426
|
+
*/ updateHeartbeat(agentId) {
|
|
427
|
+
const health = this.agentHealth.get(agentId);
|
|
428
|
+
if (health) {
|
|
429
|
+
health.lastHeartbeat = Date.now();
|
|
430
|
+
if (health.status !== 'healthy') {
|
|
431
|
+
health.status = 'healthy';
|
|
432
|
+
this.logger.info('Agent recovered to healthy state', {
|
|
433
|
+
agentId
|
|
434
|
+
});
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
/**
|
|
439
|
+
* Report task completion for load tracking
|
|
440
|
+
*/ reportTaskCompletion(agentId, taskId, executionTime) {
|
|
441
|
+
const loadStat = this.loadStats.get(agentId);
|
|
442
|
+
if (loadStat) {
|
|
443
|
+
loadStat.tasks = Math.max(0, loadStat.tasks - 1);
|
|
444
|
+
loadStat.avgLatency = (loadStat.avgLatency + executionTime) / 2;
|
|
445
|
+
loadStat.lastUpdate = Date.now();
|
|
446
|
+
}
|
|
447
|
+
// Update node load
|
|
448
|
+
const nodeId = this.agentToNode.get(agentId);
|
|
449
|
+
if (nodeId) {
|
|
450
|
+
const node = this.coordinationTree.get(nodeId);
|
|
451
|
+
if (node) {
|
|
452
|
+
node.load = Math.max(0, node.load - 1);
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
this.taskAssignments.delete(taskId);
|
|
456
|
+
}
|
|
457
|
+
/**
|
|
458
|
+
* Get comprehensive coordination metrics
|
|
459
|
+
*/ getMetrics() {
|
|
460
|
+
return {
|
|
461
|
+
...this.metrics,
|
|
462
|
+
coordinationNodes: this.coordinationTree.size,
|
|
463
|
+
healthyAgents: Array.from(this.agentHealth.values()).filter((h)=>h.status === 'healthy').length,
|
|
464
|
+
degradedAgents: Array.from(this.agentHealth.values()).filter((h)=>h.status === 'degraded').length,
|
|
465
|
+
failedAgents: this.failedAgents.size,
|
|
466
|
+
pendingRecoveries: this.recoveryQueue.length,
|
|
467
|
+
globalQueueSize: this.globalWorkQueue.length,
|
|
468
|
+
nodeLoadDistribution: this.getNodeLoadDistribution()
|
|
469
|
+
};
|
|
470
|
+
}
|
|
471
|
+
getNodeLoadDistribution() {
|
|
472
|
+
const distribution = {};
|
|
473
|
+
for (const [nodeId, node] of this.coordinationTree.entries()){
|
|
474
|
+
distribution[nodeId] = node.load;
|
|
475
|
+
}
|
|
476
|
+
return distribution;
|
|
477
|
+
}
|
|
478
|
+
/**
|
|
479
|
+
* Shutdown coordinator gracefully
|
|
480
|
+
*/ async shutdown() {
|
|
481
|
+
this.logger.info('Shutting down large-scale coordinator');
|
|
482
|
+
if (this.rebalanceTimer) {
|
|
483
|
+
clearInterval(this.rebalanceTimer);
|
|
484
|
+
}
|
|
485
|
+
this.coordinationTree.clear();
|
|
486
|
+
this.agentToNode.clear();
|
|
487
|
+
this.taskAssignments.clear();
|
|
488
|
+
this.agentHealth.clear();
|
|
489
|
+
this.loadStats.clear();
|
|
490
|
+
this.logger.info('Large-scale coordinator shut down');
|
|
491
|
+
}
|
|
492
|
+
constructor(config = {}){
|
|
493
|
+
super(), _define_property(this, "logger", void 0), _define_property(this, "config", void 0), // Hierarchical coordination structure
|
|
494
|
+
_define_property(this, "coordinationTree", new Map()), _define_property(this, "agentToNode", new Map()), _define_property(this, "taskAssignments", new Map()) // taskId -> agentId
|
|
495
|
+
, // Work-stealing queues
|
|
496
|
+
_define_property(this, "globalWorkQueue", []), _define_property(this, "workStealingActive", false), // Load balancing
|
|
497
|
+
_define_property(this, "loadStats", new Map()), _define_property(this, "rebalanceTimer", void 0), // Fault tolerance
|
|
498
|
+
_define_property(this, "agentHealth", new Map()), _define_property(this, "failedAgents", new Set()), _define_property(this, "recoveryQueue", []), // Performance metrics
|
|
499
|
+
_define_property(this, "metrics", {
|
|
500
|
+
totalAgentsManaged: 0,
|
|
501
|
+
activeCoordinationNodes: 0,
|
|
502
|
+
tasksCoordinated: 0,
|
|
503
|
+
workStealingOperations: 0,
|
|
504
|
+
rebalancingOperations: 0,
|
|
505
|
+
agentFailures: 0,
|
|
506
|
+
agentRecoveries: 0,
|
|
507
|
+
avgCoordinationLatency: 0,
|
|
508
|
+
coordinationLatencies: []
|
|
509
|
+
});
|
|
510
|
+
this.config = {
|
|
511
|
+
maxAgentsPerNode: config.maxAgentsPerNode || 10,
|
|
512
|
+
hierarchyDepth: config.hierarchyDepth || 3,
|
|
513
|
+
workStealing: {
|
|
514
|
+
enabled: true,
|
|
515
|
+
thresholdRatio: 2.0,
|
|
516
|
+
minTasksToSteal: 1,
|
|
517
|
+
maxTasksToSteal: 5,
|
|
518
|
+
...config.workStealing
|
|
519
|
+
},
|
|
520
|
+
loadBalancing: {
|
|
521
|
+
type: 'least-loaded',
|
|
522
|
+
rebalanceInterval: 5000,
|
|
523
|
+
...config.loadBalancing
|
|
524
|
+
},
|
|
525
|
+
healthCheckInterval: config.healthCheckInterval || 1000,
|
|
526
|
+
recoveryTimeout: config.recoveryTimeout || 5000
|
|
527
|
+
};
|
|
528
|
+
const loggerConfig = process.env.CLAUDE_FLOW_ENV === 'test' ? {
|
|
529
|
+
level: 'error',
|
|
530
|
+
format: 'json',
|
|
531
|
+
destination: 'console'
|
|
532
|
+
} : {
|
|
533
|
+
level: 'info',
|
|
534
|
+
format: 'json',
|
|
535
|
+
destination: 'console'
|
|
536
|
+
};
|
|
537
|
+
this.logger = new Logger(loggerConfig, {
|
|
538
|
+
component: 'LargeScaleCoordinator'
|
|
539
|
+
});
|
|
540
|
+
this.initialize();
|
|
541
|
+
}
|
|
542
|
+
}
|