snow-flow 3.0.9 → 3.0.13
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/claude-flow.bat +0 -0
- package/claude-flow.ps1 +0 -0
- package/dist/mcp/intelligent-reporting-mcp.d.ts +7 -0
- package/dist/mcp/intelligent-reporting-mcp.js +379 -0
- package/dist/mcp/servicenow-automation-mcp.js +0 -0
- package/dist/mcp/servicenow-deployment-mcp.js +0 -0
- package/dist/mcp/servicenow-integration-mcp.js +0 -0
- package/dist/mcp/servicenow-mcp-server.js +0 -0
- package/dist/mcp/servicenow-operations-mcp.js +0 -0
- package/dist/mcp/servicenow-platform-development-mcp.js +0 -0
- package/dist/mcp/servicenow-progressive-indexer.js +0 -0
- package/dist/mcp/servicenow-reporting-analytics-mcp.js +280 -29
- package/dist/mcp/servicenow-security-compliance-mcp.js +0 -0
- package/dist/mcp/servicenow-update-set-mcp.js +0 -0
- package/dist/mcp/start-all-mcp-servers.js +0 -0
- package/dist/mcp/start-servicenow-mcp.js +0 -0
- package/dist/services/widget-deployment-service.d.ts +2 -1
- package/dist/services/widget-deployment-service.js +17 -16
- package/dist/utils/anti-mock-data-validator.d.ts +66 -0
- package/dist/utils/anti-mock-data-validator.js +316 -0
- package/dist/utils/servicenow-eventual-consistency.d.ts +120 -0
- package/dist/utils/servicenow-eventual-consistency.js +220 -0
- package/memory/agents/README.md +1 -1
- package/memory/claude-flow-data.json +1 -1
- package/memory/sessions/README.md +1 -1
- package/package.json +4 -3
- package/.mcp.json +0 -22
- package/claude-flow.config.json +0 -20
- package/dist/agents/app-creator.agent.d.ts +0 -55
- package/dist/agents/app-creator.agent.js +0 -1292
- package/dist/agents/base/base-snow-agent.d.ts +0 -75
- package/dist/agents/base/base-snow-agent.js +0 -169
- package/dist/agents/base-snow-agent.d.ts +0 -63
- package/dist/agents/base-snow-agent.js +0 -296
- package/dist/agents/coordinator.d.ts +0 -200
- package/dist/agents/coordinator.js +0 -777
- package/dist/agents/flow-builder-agent.d.ts +0 -18
- package/dist/agents/flow-builder-agent.js +0 -197
- package/dist/agents/queen-403-handler.d.ts +0 -47
- package/dist/agents/queen-403-handler.js +0 -175
- package/dist/agents/queen-agent-example.d.ts +0 -23
- package/dist/agents/queen-agent-example.js +0 -240
- package/dist/agents/queen-agent.test.d.ts +0 -6
- package/dist/agents/script-generator.agent.d.ts +0 -32
- package/dist/agents/script-generator.agent.js +0 -772
- package/dist/agents/script-writer-agent.d.ts +0 -22
- package/dist/agents/script-writer-agent.js +0 -695
- package/dist/agents/security-agent.d.ts +0 -23
- package/dist/agents/security-agent.js +0 -619
- package/dist/agents/specialists/automation-specialist.agent.d.ts +0 -44
- package/dist/agents/specialists/automation-specialist.agent.js +0 -204
- package/dist/agents/specialists/data-specialist.agent.d.ts +0 -165
- package/dist/agents/specialists/data-specialist.agent.js +0 -484
- package/dist/agents/specialists/integration-specialist.agent.d.ts +0 -227
- package/dist/agents/specialists/integration-specialist.agent.js +0 -725
- package/dist/agents/specialists/reporting-specialist.agent.d.ts +0 -54
- package/dist/agents/specialists/reporting-specialist.agent.js +0 -193
- package/dist/agents/specialists/security-specialist.agent.d.ts +0 -85
- package/dist/agents/specialists/security-specialist.agent.js +0 -309
- package/dist/agents/teams/adaptive/adaptive-coordinator.agent.d.ts +0 -111
- package/dist/agents/teams/adaptive/adaptive-coordinator.agent.js +0 -383
- package/dist/agents/teams/base-team.d.ts +0 -72
- package/dist/agents/teams/base-team.js +0 -253
- package/dist/agents/teams/team-types.d.ts +0 -265
- package/dist/agents/teams/team-types.js +0 -3
- package/dist/agents/teams/widget/widget-architect.agent.d.ts +0 -61
- package/dist/agents/teams/widget/widget-architect.agent.js +0 -436
- package/dist/agents/teams/widget/widget-backend.agent.d.ts +0 -74
- package/dist/agents/teams/widget/widget-backend.agent.js +0 -1531
- package/dist/agents/teams/widget/widget-frontend.agent.d.ts +0 -67
- package/dist/agents/teams/widget/widget-frontend.agent.js +0 -1014
- package/dist/agents/teams/widget/widget-platform.agent.d.ts +0 -90
- package/dist/agents/teams/widget/widget-platform.agent.js +0 -1190
- package/dist/agents/teams/widget/widget-uiux.agent.d.ts +0 -107
- package/dist/agents/teams/widget/widget-uiux.agent.js +0 -1033
- package/dist/agents/test-agent.d.ts +0 -26
- package/dist/agents/test-agent.js +0 -734
- package/dist/agents/test-agents.d.ts +0 -7
- package/dist/agents/test-agents.js +0 -64
- package/dist/agents/ui-builder.agent.d.ts +0 -50
- package/dist/agents/ui-builder.agent.js +0 -1539
- package/dist/agents/widget-builder.agent.d.ts +0 -32
- package/dist/agents/widget-builder.agent.js +0 -439
- package/dist/agents/widget-creator-agent.d.ts +0 -18
- package/dist/agents/widget-creator-agent.js +0 -498
- package/dist/agents/workflow-designer.agent.d.ts +0 -31
- package/dist/agents/workflow-designer.agent.js +0 -583
- package/dist/api/error-handling.d.ts +0 -325
- package/dist/api/error-handling.js +0 -1488
- package/dist/api/flow-designer-api.d.ts +0 -167
- package/dist/api/flow-designer-api.js +0 -554
- package/dist/api/natural-language-mapper.d.ts +0 -124
- package/dist/api/natural-language-mapper.js +0 -501
- package/dist/api/performance-optimizer.d.ts +0 -240
- package/dist/api/performance-optimizer.js +0 -706
- package/dist/api/transaction-manager.d.ts +0 -189
- package/dist/api/transaction-manager.js +0 -576
- package/dist/assembly/team-assembler.d.ts +0 -140
- package/dist/assembly/team-assembler.js +0 -502
- package/dist/benchmark-performance.d.ts +0 -41
- package/dist/benchmark-performance.js +0 -230
- package/dist/cli/snow-flow-cli-integration.d.ts +0 -30
- package/dist/cli/snow-flow-cli-integration.js +0 -396
- package/dist/coordination/coordination-engine.d.ts +0 -41
- package/dist/coordination/coordination-engine.js +0 -324
- package/dist/coordination/coordination.test.d.ts +0 -6
- package/dist/coordination/example.d.ts +0 -31
- package/dist/coordination/example.js +0 -394
- package/dist/coordination/execution-patterns.d.ts +0 -43
- package/dist/coordination/execution-patterns.js +0 -507
- package/dist/coordination/factory.d.ts +0 -94
- package/dist/coordination/factory.js +0 -433
- package/dist/coordination/index.d.ts +0 -71
- package/dist/coordination/index.js +0 -135
- package/dist/coordination/progress-monitor.d.ts +0 -71
- package/dist/coordination/progress-monitor.js +0 -505
- package/dist/coordination/quality-gates.d.ts +0 -124
- package/dist/coordination/quality-gates.js +0 -577
- package/dist/coordination/shared-memory.d.ts +0 -39
- package/dist/coordination/shared-memory.js +0 -289
- package/dist/coordination/task-dependencies.d.ts +0 -50
- package/dist/coordination/task-dependencies.js +0 -407
- package/dist/coordination/team-coordinator.d.ts +0 -59
- package/dist/coordination/team-coordinator.js +0 -550
- package/dist/coordination/types.d.ts +0 -152
- package/dist/coordination/types.js +0 -3
- package/dist/mcp/mcp-wrapper.d.ts +0 -8
- package/dist/mcp/mcp-wrapper.js +0 -77
- package/dist/mcp/servicenow-flow-composer-enhanced.js +0 -396
- package/dist/mcp/servicenow-flow-composer-mcp.d.ts +0 -7
- package/dist/mcp/servicenow-flow-composer-mcp.js +0 -3103
- package/dist/mcp/servicenow-graph-memory-mcp.d.ts +0 -7
- package/dist/mcp/servicenow-intelligent-mcp.d.ts +0 -143
- package/dist/mcp/servicenow-intelligent-mcp.js +0 -4156
- package/dist/mcp/servicenow-xml-flow-mcp.d.ts +0 -53
- package/dist/mcp/servicenow-xml-flow-mcp.js +0 -1704
- package/dist/mcp/singleton-check.js +0 -31
- package/dist/mcp/test-simple-mcp.d.ts +0 -6
- package/dist/mcp/test-simple-mcp.js +0 -63
- package/dist/memory/hierarchical-memory-system.d.ts +0 -90
- package/dist/memory/hierarchical-memory-system.js +0 -400
- package/dist/memory/index.d.ts +0 -9
- package/dist/memory/index.js +0 -20
- package/dist/memory/mcp-integration-example.d.ts +0 -6
- package/dist/memory/mcp-integration-example.js +0 -281
- package/dist/memory/memory-client.d.ts +0 -199
- package/dist/memory/memory-client.js +0 -364
- package/dist/memory/memory-manager.d.ts +0 -29
- package/dist/memory/memory-manager.js +0 -280
- package/dist/memory/memory-operations.d.ts +0 -179
- package/dist/memory/memory-operations.js +0 -691
- package/dist/memory/memory-system.d.ts +0 -153
- package/dist/memory/memory-system.js +0 -651
- package/dist/memory/memory-test.d.ts +0 -6
- package/dist/memory/memory-test.js +0 -161
- package/dist/memory/snow-flow-memory-patterns.d.ts +0 -213
- package/dist/memory/snow-flow-memory-patterns.js +0 -200
- package/dist/memory/snow-memory.d.ts +0 -54
- package/dist/memory/snow-memory.js +0 -301
- package/dist/memory/swarm-memory.d.ts +0 -135
- package/dist/memory/swarm-memory.js +0 -378
- package/dist/optimization/flow-performance-optimizer.js +0 -723
- package/dist/orchestration/discovery/service-discovery.d.ts +0 -81
- package/dist/orchestration/discovery/service-discovery.js +0 -808
- package/dist/orchestration/distributed-orchestrator.d.ts +0 -131
- package/dist/orchestration/distributed-orchestrator.js +0 -712
- package/dist/orchestration/distribution/task-distribution-engine.d.ts +0 -53
- package/dist/orchestration/distribution/task-distribution-engine.js +0 -586
- package/dist/orchestration/flow-update-orchestrator.js +0 -648
- package/dist/orchestration/interfaces/distributed-orchestration.interface.d.ts +0 -606
- package/dist/orchestration/interfaces/distributed-orchestration.interface.js +0 -65
- package/dist/orchestration/protocols/mcpx-protocol.d.ts +0 -71
- package/dist/orchestration/protocols/mcpx-protocol.js +0 -668
- package/dist/orchestration/state/distributed-state-manager.d.ts +0 -89
- package/dist/orchestration/state/distributed-state-manager.js +0 -716
- package/dist/orchestrator/flow-composer.d.ts +0 -105
- package/dist/orchestrator/flow-composer.js +0 -404
- package/dist/orchestrator/flow-pattern-templates.d.ts +0 -260
- package/dist/orchestrator/flow-pattern-templates.js +0 -908
- package/dist/orchestrator/flow-subflow-decision-engine.d.ts +0 -202
- package/dist/orchestrator/flow-subflow-decision-engine.js +0 -769
- package/dist/orchestrator/flow-validation-engine.d.ts +0 -169
- package/dist/orchestrator/flow-validation-engine.js +0 -913
- package/dist/orchestrator/snow-orchestrator.d.ts +0 -49
- package/dist/orchestrator/snow-orchestrator.js +0 -235
- package/dist/orchestrator/subflow-creation-handler.d.ts +0 -230
- package/dist/orchestrator/subflow-creation-handler.js +0 -791
- package/dist/patterns/adaptive-patterns.d.ts +0 -140
- package/dist/patterns/adaptive-patterns.js +0 -549
- package/dist/queen/advanced-integration-test.d.ts +0 -48
- package/dist/queen/advanced-integration-test.js +0 -473
- package/dist/queen/integration-example.d.ts +0 -82
- package/dist/queen/integration-example.js +0 -219
- package/dist/queen/integration-test.d.ts +0 -72
- package/dist/queen/integration-test.js +0 -563
- package/dist/queen/mock-mcp-client.d.ts +0 -71
- package/dist/queen/mock-mcp-client.js +0 -317
- package/dist/queen/run-integration-tests.d.ts +0 -9
- package/dist/queen/run-integration-tests.js +0 -27
- package/dist/sparc/coordinators/adaptive-coordinator.d.ts +0 -54
- package/dist/sparc/coordinators/adaptive-coordinator.js +0 -367
- package/dist/sparc/coordinators/team-coordinator.d.ts +0 -66
- package/dist/sparc/coordinators/team-coordinator.js +0 -402
- package/dist/sparc/modes/team-modes.d.ts +0 -33
- package/dist/sparc/modes/team-modes.js +0 -399
- package/dist/sparc/teams/application-team.d.ts +0 -73
- package/dist/sparc/teams/application-team.js +0 -463
- package/dist/sparc/teams/flow-team.d.ts +0 -67
- package/dist/sparc/teams/flow-team.js +0 -373
- package/dist/sparc/teams/widget-team.d.ts +0 -61
- package/dist/sparc/teams/widget-team.js +0 -280
- package/dist/specialists/app-specialists.d.ts +0 -93
- package/dist/specialists/app-specialists.js +0 -1639
- package/dist/specialists/base-specialist.d.ts +0 -19
- package/dist/specialists/base-specialist.js +0 -54
- package/dist/specialists/flow-specialists.d.ts +0 -113
- package/dist/specialists/flow-specialists.js +0 -1787
- package/dist/specialists/individual-specialists.d.ts +0 -67
- package/dist/specialists/individual-specialists.js +0 -632
- package/dist/specialists/widget-specialists.d.ts +0 -70
- package/dist/specialists/widget-specialists.js +0 -1264
- package/dist/src/utils/agent-detector.js +0 -655
- package/dist/teams/adaptive-team.d.ts +0 -81
- package/dist/teams/adaptive-team.js +0 -1153
- package/dist/teams/application-team.d.ts +0 -30
- package/dist/teams/application-team.js +0 -547
- package/dist/teams/base-team.d.ts +0 -55
- package/dist/teams/base-team.js +0 -243
- package/dist/teams/flow-team.d.ts +0 -28
- package/dist/teams/flow-team.js +0 -525
- package/dist/teams/widget-team.d.ts +0 -26
- package/dist/teams/widget-team.js +0 -459
- package/dist/templates/flow-template-system.js +0 -625
- package/dist/test-fetch-incidents.d.ts +0 -2
- package/dist/test-fetch-incidents.js +0 -84
- package/dist/test-incident-access.d.ts +0 -2
- package/dist/test-incident-access.js +0 -72
- package/dist/test-iphone-flow.js +0 -189
- package/dist/test-limit-problem.d.ts +0 -2
- package/dist/test-limit-problem.js +0 -60
- package/dist/test-ml-batch-fix.d.ts +0 -2
- package/dist/test-ml-batch-fix.js +0 -104
- package/dist/test-ml-batch.d.ts +0 -2
- package/dist/test-ml-batch.js +0 -87
- package/dist/test-ml-query.d.ts +0 -2
- package/dist/test-ml-query.js +0 -100
- package/dist/test-ml-training-fix.d.ts +0 -12
- package/dist/test-ml-training-fix.js +0 -113
- package/dist/test-ml-training.d.ts +0 -2
- package/dist/test-ml-training.js +0 -32
- package/dist/test-operations-query.d.ts +0 -2
- package/dist/test-operations-query.js +0 -84
- package/dist/test-performance-query.d.ts +0 -2
- package/dist/test-performance-query.js +0 -52
- package/dist/test-singleton-protection.d.ts +0 -8
- package/dist/test-singleton-protection.js +0 -110
- package/dist/test-smart-limits.d.ts +0 -13
- package/dist/test-smart-limits.js +0 -100
- package/dist/test-snow-query-incidents.d.ts +0 -2
- package/dist/test-snow-query-incidents.js +0 -66
- package/dist/test-universal-query.d.ts +0 -2
- package/dist/test-universal-query.js +0 -106
- package/dist/testing/flow-testing-automation.js +0 -641
- package/dist/utils/complete-flow-xml-generator.js +0 -1285
- package/dist/utils/file-storage-fallback.d.ts +0 -62
- package/dist/utils/file-storage-fallback.js +0 -289
- package/dist/utils/flow-api-discovery.d.ts +0 -151
- package/dist/utils/flow-api-discovery.js +0 -439
- package/dist/utils/flow-examples.js +0 -720
- package/dist/utils/flow-structure-builder.js +0 -677
- package/dist/utils/flow-xml-generator.d.ts +0 -41
- package/dist/utils/flow-xml-generator.js +0 -258
- package/dist/utils/improved-flow-xml-generator.js +0 -820
- package/dist/utils/mcp-process-manager.backup.d.ts +0 -58
- package/dist/utils/mcp-process-manager.backup.js +0 -220
- package/dist/utils/mcp-singleton-enforcer.d.ts +0 -36
- package/dist/utils/mcp-singleton-enforcer.js +0 -201
- package/dist/utils/mcp-timeout-fix.d.ts +0 -53
- package/dist/utils/mcp-timeout-fix.js +0 -221
- package/dist/utils/migrate-claude-flow.d.ts +0 -22
- package/dist/utils/migrate-claude-flow.js +0 -120
- package/dist/utils/scope-utils.d.ts +0 -72
- package/dist/utils/scope-utils.js +0 -386
- package/dist/utils/snow-oauth-old.d.ts +0 -65
- package/dist/utils/snow-oauth-old.js +0 -345
- package/dist/utils/xml-first-flow-generator.js +0 -513
- package/memory/servicenow_artifacts/000d9224c895221055906c7518aa2d3d.json +0 -30
- package/memory/servicenow_artifacts/0196b66173303010e46b4a2214f6a7a2.json +0 -36
- package/memory/servicenow_artifacts/125e5d1d837e2a102a7ea130ceaad397.json +0 -30
- package/memory/servicenow_artifacts/7637c1f2b7112210a5e5911cde11a972.json +0 -30
- package/memory/servicenow_artifacts/default_documentation_tables_1754056582292.json +0 -55
- package/memory/servicenow_artifacts/default_documentation_tables_1754057477189.json +0 -55
- package/memory/update-set-sessions/01f82af583faea102a7ea130ceaad3d4.json +0 -9
- package/memory/update-set-sessions/27718fb983faea102a7ea130ceaad34b.json +0 -9
- package/memory/update-set-sessions/412e9bf6833e22502a7ea130ceaad30a.json +0 -8
- package/memory/update-set-sessions/66fc5a79837aea102a7ea130ceaad3ab.json +0 -9
- package/memory/update-set-sessions/71a30ff5837eea102a7ea130ceaad37f.json +0 -9
- package/memory/update-set-sessions/74fba27983faea102a7ea130ceaad3bd.json +0 -9
- package/memory/update-set-sessions/a0b147b5837eea102a7ea130ceaad344.json +0 -58
- package/memory/update-set-sessions/b13f5eb983baea102a7ea130ceaad33e.json +0 -9
- package/reports/swarm-auto-centralized-1752649029776.json +0 -13
- package/src/memory/README.md +0 -240
|
@@ -1,777 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Agent Coordination System
|
|
4
|
-
* Manages inter-agent communication, task dependencies, and handoffs
|
|
5
|
-
* Integrates with SQLite memory for persistent coordination state
|
|
6
|
-
*/
|
|
7
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
-
if (k2 === undefined) k2 = k;
|
|
9
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
-
}
|
|
13
|
-
Object.defineProperty(o, k2, desc);
|
|
14
|
-
}) : (function(o, m, k, k2) {
|
|
15
|
-
if (k2 === undefined) k2 = k;
|
|
16
|
-
o[k2] = m[k];
|
|
17
|
-
}));
|
|
18
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
-
}) : function(o, v) {
|
|
21
|
-
o["default"] = v;
|
|
22
|
-
});
|
|
23
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
-
var ownKeys = function(o) {
|
|
25
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
-
var ar = [];
|
|
27
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
-
return ar;
|
|
29
|
-
};
|
|
30
|
-
return ownKeys(o);
|
|
31
|
-
};
|
|
32
|
-
return function (mod) {
|
|
33
|
-
if (mod && mod.__esModule) return mod;
|
|
34
|
-
var result = {};
|
|
35
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
-
__setModuleDefault(result, mod);
|
|
37
|
-
return result;
|
|
38
|
-
};
|
|
39
|
-
})();
|
|
40
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
-
exports.AgentCoordinator = void 0;
|
|
42
|
-
const eventemitter3_1 = require("eventemitter3");
|
|
43
|
-
const crypto = __importStar(require("crypto"));
|
|
44
|
-
class AgentCoordinator extends eventemitter3_1.EventEmitter {
|
|
45
|
-
constructor(memory) {
|
|
46
|
-
super();
|
|
47
|
-
this.memory = memory;
|
|
48
|
-
this.contexts = new Map();
|
|
49
|
-
this.strategies = new Map();
|
|
50
|
-
this.recoveryStrategies = new Map();
|
|
51
|
-
this.messageQueue = new Map();
|
|
52
|
-
this.initializeDefaultStrategies();
|
|
53
|
-
this.setupMemorySync();
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Create a new coordination context for an objective
|
|
57
|
-
*/
|
|
58
|
-
async createContext(sessionId, objectiveId) {
|
|
59
|
-
const context = {
|
|
60
|
-
sessionId,
|
|
61
|
-
objectiveId,
|
|
62
|
-
agents: new Map(),
|
|
63
|
-
dependencies: new Map(),
|
|
64
|
-
handoffs: new Map(),
|
|
65
|
-
blockages: new Map()
|
|
66
|
-
};
|
|
67
|
-
this.contexts.set(objectiveId, context);
|
|
68
|
-
// Store context in memory for persistence
|
|
69
|
-
await this.memory.store(`coordination_context_${objectiveId}`, {
|
|
70
|
-
sessionId,
|
|
71
|
-
objectiveId,
|
|
72
|
-
createdAt: new Date().toISOString()
|
|
73
|
-
});
|
|
74
|
-
this.emit('context:created', { sessionId, objectiveId });
|
|
75
|
-
return context;
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* Register an agent with the coordinator
|
|
79
|
-
*/
|
|
80
|
-
async registerAgent(agent, objectiveId) {
|
|
81
|
-
// Find or create context
|
|
82
|
-
let context;
|
|
83
|
-
if (objectiveId) {
|
|
84
|
-
context = this.contexts.get(objectiveId);
|
|
85
|
-
}
|
|
86
|
-
else {
|
|
87
|
-
// Find context that needs this agent type
|
|
88
|
-
for (const ctx of this.contexts.values()) {
|
|
89
|
-
if (!Array.from(ctx.agents.values()).some(a => a.type === agent.type)) {
|
|
90
|
-
context = ctx;
|
|
91
|
-
break;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
if (!context) {
|
|
96
|
-
throw new Error('No suitable coordination context found for agent');
|
|
97
|
-
}
|
|
98
|
-
context.agents.set(agent.id, agent);
|
|
99
|
-
// Store agent registration in memory
|
|
100
|
-
await this.memory.store(`agent_registration_${agent.id}`, {
|
|
101
|
-
agentId: agent.id,
|
|
102
|
-
agentType: agent.type,
|
|
103
|
-
objectiveId: context.objectiveId,
|
|
104
|
-
sessionId: context.sessionId,
|
|
105
|
-
registeredAt: new Date().toISOString()
|
|
106
|
-
});
|
|
107
|
-
// Initialize message queue for agent
|
|
108
|
-
this.messageQueue.set(agent.id, []);
|
|
109
|
-
this.emit('agent:registered', { agent, objectiveId: context.objectiveId });
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* Manage task dependencies between agents
|
|
113
|
-
*/
|
|
114
|
-
async manageDependencies(objectiveId, taskId, dependencies) {
|
|
115
|
-
const context = this.contexts.get(objectiveId);
|
|
116
|
-
if (!context) {
|
|
117
|
-
throw new Error(`No context found for objective: ${objectiveId}`);
|
|
118
|
-
}
|
|
119
|
-
context.dependencies.set(taskId, dependencies);
|
|
120
|
-
// Store dependencies in memory
|
|
121
|
-
await this.memory.store(`dependencies_${taskId}`, {
|
|
122
|
-
taskId,
|
|
123
|
-
dependencies,
|
|
124
|
-
objectiveId,
|
|
125
|
-
createdAt: new Date().toISOString()
|
|
126
|
-
});
|
|
127
|
-
// Check if any dependencies are already satisfied
|
|
128
|
-
await this.checkDependencySatisfaction(context, taskId);
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* Coordinate handoff between agents
|
|
132
|
-
*/
|
|
133
|
-
async coordinateHandoff(fromAgentId, toAgentId, artifactType, artifactData) {
|
|
134
|
-
const handoffId = this.generateId('handoff');
|
|
135
|
-
const handoff = {
|
|
136
|
-
id: handoffId,
|
|
137
|
-
fromAgent: fromAgentId,
|
|
138
|
-
toAgent: toAgentId,
|
|
139
|
-
artifactType,
|
|
140
|
-
artifactData,
|
|
141
|
-
status: 'pending',
|
|
142
|
-
createdAt: new Date()
|
|
143
|
-
};
|
|
144
|
-
// Find context containing these agents
|
|
145
|
-
let context;
|
|
146
|
-
for (const ctx of this.contexts.values()) {
|
|
147
|
-
if (ctx.agents.has(fromAgentId) && ctx.agents.has(toAgentId)) {
|
|
148
|
-
context = ctx;
|
|
149
|
-
break;
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
if (!context) {
|
|
153
|
-
throw new Error('No coordination context found for agents');
|
|
154
|
-
}
|
|
155
|
-
context.handoffs.set(handoffId, handoff);
|
|
156
|
-
// Store handoff in memory
|
|
157
|
-
await this.memory.store(`handoff_${handoffId}`, {
|
|
158
|
-
handoff,
|
|
159
|
-
objectiveId: context.objectiveId,
|
|
160
|
-
timestamp: new Date().toISOString()
|
|
161
|
-
});
|
|
162
|
-
// Notify receiving agent
|
|
163
|
-
await this.sendMessage(fromAgentId, toAgentId, 'coordination', {
|
|
164
|
-
type: 'handoff_request',
|
|
165
|
-
handoffId,
|
|
166
|
-
artifactType,
|
|
167
|
-
artifactData
|
|
168
|
-
});
|
|
169
|
-
this.emit('agent:handoff', {
|
|
170
|
-
handoffId,
|
|
171
|
-
fromAgent: fromAgentId,
|
|
172
|
-
toAgent: toAgentId,
|
|
173
|
-
artifactType,
|
|
174
|
-
objectiveId: context.objectiveId
|
|
175
|
-
});
|
|
176
|
-
return handoff;
|
|
177
|
-
}
|
|
178
|
-
/**
|
|
179
|
-
* Handle agent blockage with recovery strategies
|
|
180
|
-
*/
|
|
181
|
-
async handleBlockage(agentId, reason, blockedTasks) {
|
|
182
|
-
// Find context containing this agent
|
|
183
|
-
let context;
|
|
184
|
-
for (const ctx of this.contexts.values()) {
|
|
185
|
-
if (ctx.agents.has(agentId)) {
|
|
186
|
-
context = ctx;
|
|
187
|
-
break;
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
if (!context) {
|
|
191
|
-
throw new Error(`No context found for agent: ${agentId}`);
|
|
192
|
-
}
|
|
193
|
-
const blockage = {
|
|
194
|
-
agentId,
|
|
195
|
-
reason,
|
|
196
|
-
blockedTasks,
|
|
197
|
-
dependencies: this.findBlockedDependencies(context, blockedTasks),
|
|
198
|
-
attemptedResolutions: [],
|
|
199
|
-
createdAt: new Date()
|
|
200
|
-
};
|
|
201
|
-
context.blockages.set(agentId, blockage);
|
|
202
|
-
// Store blockage in memory
|
|
203
|
-
await this.memory.store(`blockage_${agentId}_${Date.now()}`, {
|
|
204
|
-
blockage,
|
|
205
|
-
objectiveId: context.objectiveId,
|
|
206
|
-
timestamp: new Date().toISOString()
|
|
207
|
-
});
|
|
208
|
-
// Attempt recovery
|
|
209
|
-
await this.attemptRecovery(context, blockage);
|
|
210
|
-
this.emit('agent:blocked', {
|
|
211
|
-
agentId,
|
|
212
|
-
reason,
|
|
213
|
-
blockedTasks,
|
|
214
|
-
objectiveId: context.objectiveId
|
|
215
|
-
});
|
|
216
|
-
}
|
|
217
|
-
/**
|
|
218
|
-
* Send message between agents
|
|
219
|
-
*/
|
|
220
|
-
async sendMessage(fromAgentId, toAgentId, messageType, content) {
|
|
221
|
-
const message = {
|
|
222
|
-
from: fromAgentId,
|
|
223
|
-
to: toAgentId,
|
|
224
|
-
type: messageType,
|
|
225
|
-
content,
|
|
226
|
-
timestamp: new Date()
|
|
227
|
-
};
|
|
228
|
-
// Add to message queue
|
|
229
|
-
const queue = this.messageQueue.get(toAgentId) || [];
|
|
230
|
-
queue.push(message);
|
|
231
|
-
this.messageQueue.set(toAgentId, queue);
|
|
232
|
-
// Store message in memory for audit
|
|
233
|
-
await this.memory.store(`message_${Date.now()}_${crypto.randomBytes(4).toString('hex')}`, {
|
|
234
|
-
message,
|
|
235
|
-
delivered: false,
|
|
236
|
-
timestamp: new Date().toISOString()
|
|
237
|
-
});
|
|
238
|
-
// Process message immediately if agent is listening
|
|
239
|
-
await this.processAgentMessages(toAgentId);
|
|
240
|
-
this.emit('message:sent', message);
|
|
241
|
-
}
|
|
242
|
-
/**
|
|
243
|
-
* Get pending messages for an agent
|
|
244
|
-
*/
|
|
245
|
-
async getAgentMessages(agentId) {
|
|
246
|
-
const messages = this.messageQueue.get(agentId) || [];
|
|
247
|
-
// Clear processed messages
|
|
248
|
-
this.messageQueue.set(agentId, []);
|
|
249
|
-
return messages;
|
|
250
|
-
}
|
|
251
|
-
/**
|
|
252
|
-
* Update handoff status
|
|
253
|
-
*/
|
|
254
|
-
async updateHandoffStatus(handoffId, status) {
|
|
255
|
-
let handoff;
|
|
256
|
-
let context;
|
|
257
|
-
// Find handoff in contexts
|
|
258
|
-
for (const ctx of this.contexts.values()) {
|
|
259
|
-
if (ctx.handoffs.has(handoffId)) {
|
|
260
|
-
handoff = ctx.handoffs.get(handoffId);
|
|
261
|
-
context = ctx;
|
|
262
|
-
break;
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
if (!handoff || !context) {
|
|
266
|
-
throw new Error(`Handoff not found: ${handoffId}`);
|
|
267
|
-
}
|
|
268
|
-
handoff.status = status;
|
|
269
|
-
if (status === 'completed' || status === 'failed') {
|
|
270
|
-
handoff.completedAt = new Date();
|
|
271
|
-
}
|
|
272
|
-
// Update memory
|
|
273
|
-
await this.memory.store(`handoff_status_${handoffId}`, {
|
|
274
|
-
handoffId,
|
|
275
|
-
newStatus: status,
|
|
276
|
-
timestamp: new Date().toISOString()
|
|
277
|
-
});
|
|
278
|
-
this.emit('handoff:updated', {
|
|
279
|
-
handoffId,
|
|
280
|
-
status,
|
|
281
|
-
objectiveId: context.objectiveId
|
|
282
|
-
});
|
|
283
|
-
}
|
|
284
|
-
/**
|
|
285
|
-
* Get coordination status for an objective
|
|
286
|
-
*/
|
|
287
|
-
async getCoordinationStatus(objectiveId) {
|
|
288
|
-
const context = this.contexts.get(objectiveId);
|
|
289
|
-
if (!context) {
|
|
290
|
-
throw new Error(`No context found for objective: ${objectiveId}`);
|
|
291
|
-
}
|
|
292
|
-
const agents = Array.from(context.agents.values());
|
|
293
|
-
const handoffs = Array.from(context.handoffs.values());
|
|
294
|
-
// Count satisfied dependencies
|
|
295
|
-
let totalDeps = 0;
|
|
296
|
-
let satisfiedDeps = 0;
|
|
297
|
-
for (const deps of context.dependencies.values()) {
|
|
298
|
-
totalDeps += deps.length;
|
|
299
|
-
// Check each dependency (would need task completion tracking)
|
|
300
|
-
satisfiedDeps += deps.filter(d => this.isDependencySatisfied(context, d)).length;
|
|
301
|
-
}
|
|
302
|
-
return {
|
|
303
|
-
agents: {
|
|
304
|
-
total: agents.length,
|
|
305
|
-
active: agents.filter(a => a.status === 'working').length,
|
|
306
|
-
blocked: context.blockages.size
|
|
307
|
-
},
|
|
308
|
-
handoffs: {
|
|
309
|
-
total: handoffs.length,
|
|
310
|
-
pending: handoffs.filter(h => h.status === 'pending').length,
|
|
311
|
-
completed: handoffs.filter(h => h.status === 'completed').length
|
|
312
|
-
},
|
|
313
|
-
dependencies: {
|
|
314
|
-
total: totalDeps,
|
|
315
|
-
satisfied: satisfiedDeps
|
|
316
|
-
},
|
|
317
|
-
blockages: context.blockages.size
|
|
318
|
-
};
|
|
319
|
-
}
|
|
320
|
-
/**
|
|
321
|
-
* Apply coordination strategy
|
|
322
|
-
*/
|
|
323
|
-
async applyStrategy(objectiveId, strategyType) {
|
|
324
|
-
const context = this.contexts.get(objectiveId);
|
|
325
|
-
if (!context) {
|
|
326
|
-
throw new Error(`No context found for objective: ${objectiveId}`);
|
|
327
|
-
}
|
|
328
|
-
const strategy = this.strategies.get(strategyType);
|
|
329
|
-
if (!strategy) {
|
|
330
|
-
throw new Error(`Unknown strategy: ${strategyType}`);
|
|
331
|
-
}
|
|
332
|
-
// Apply strategy rules
|
|
333
|
-
for (const rule of strategy.rules) {
|
|
334
|
-
if (this.evaluateCondition(context, rule.condition)) {
|
|
335
|
-
await this.executeAction(context, rule.action);
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
this.emit('strategy:applied', { objectiveId, strategyType });
|
|
339
|
-
}
|
|
340
|
-
/**
|
|
341
|
-
* Terminate an agent
|
|
342
|
-
*/
|
|
343
|
-
async terminateAgent(agentId) {
|
|
344
|
-
// Find and remove agent from all contexts
|
|
345
|
-
for (const context of this.contexts.values()) {
|
|
346
|
-
if (context.agents.has(agentId)) {
|
|
347
|
-
context.agents.delete(agentId);
|
|
348
|
-
// Clear any blockages
|
|
349
|
-
context.blockages.delete(agentId);
|
|
350
|
-
// Update memory
|
|
351
|
-
await this.memory.store(`agent_terminated_${agentId}`, {
|
|
352
|
-
agentId,
|
|
353
|
-
objectiveId: context.objectiveId,
|
|
354
|
-
terminatedAt: new Date().toISOString()
|
|
355
|
-
});
|
|
356
|
-
this.emit('agent:terminated', { agentId, objectiveId: context.objectiveId });
|
|
357
|
-
break;
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
// Clear message queue
|
|
361
|
-
this.messageQueue.delete(agentId);
|
|
362
|
-
}
|
|
363
|
-
/**
|
|
364
|
-
* Initialize default coordination strategies
|
|
365
|
-
*/
|
|
366
|
-
initializeDefaultStrategies() {
|
|
367
|
-
// Sequential strategy
|
|
368
|
-
this.strategies.set('sequential', {
|
|
369
|
-
type: 'sequential',
|
|
370
|
-
rules: [
|
|
371
|
-
{
|
|
372
|
-
condition: 'hasBlockedAgent',
|
|
373
|
-
action: 'waitForDependencies',
|
|
374
|
-
priority: 1
|
|
375
|
-
},
|
|
376
|
-
{
|
|
377
|
-
condition: 'allDependenciesSatisfied',
|
|
378
|
-
action: 'proceedToNextTask',
|
|
379
|
-
priority: 2
|
|
380
|
-
}
|
|
381
|
-
]
|
|
382
|
-
});
|
|
383
|
-
// Parallel strategy
|
|
384
|
-
this.strategies.set('parallel', {
|
|
385
|
-
type: 'parallel',
|
|
386
|
-
rules: [
|
|
387
|
-
{
|
|
388
|
-
condition: 'hasIndependentTasks',
|
|
389
|
-
action: 'assignToAvailableAgents',
|
|
390
|
-
priority: 1
|
|
391
|
-
},
|
|
392
|
-
{
|
|
393
|
-
condition: 'hasBlockedAgent',
|
|
394
|
-
action: 'reassignToOtherAgent',
|
|
395
|
-
priority: 2
|
|
396
|
-
}
|
|
397
|
-
]
|
|
398
|
-
});
|
|
399
|
-
// Adaptive strategy
|
|
400
|
-
this.strategies.set('adaptive', {
|
|
401
|
-
type: 'adaptive',
|
|
402
|
-
rules: [
|
|
403
|
-
{
|
|
404
|
-
condition: 'highComplexity',
|
|
405
|
-
action: 'spawnSpecialistAgent',
|
|
406
|
-
priority: 1
|
|
407
|
-
},
|
|
408
|
-
{
|
|
409
|
-
condition: 'repeatedFailures',
|
|
410
|
-
action: 'switchToFallbackApproach',
|
|
411
|
-
priority: 2
|
|
412
|
-
}
|
|
413
|
-
]
|
|
414
|
-
});
|
|
415
|
-
// Initialize recovery strategies
|
|
416
|
-
this.initializeRecoveryStrategies();
|
|
417
|
-
}
|
|
418
|
-
/**
|
|
419
|
-
* Initialize recovery strategies for error handling
|
|
420
|
-
*/
|
|
421
|
-
initializeRecoveryStrategies() {
|
|
422
|
-
// Permission error recovery
|
|
423
|
-
this.recoveryStrategies.set('permission_error', {
|
|
424
|
-
errorType: 'permission_error',
|
|
425
|
-
recoveryActions: [
|
|
426
|
-
{
|
|
427
|
-
type: 'fallback',
|
|
428
|
-
config: { scope: 'global' }
|
|
429
|
-
},
|
|
430
|
-
{
|
|
431
|
-
type: 'escalate',
|
|
432
|
-
config: { requestElevation: true }
|
|
433
|
-
}
|
|
434
|
-
],
|
|
435
|
-
maxRetries: 3
|
|
436
|
-
});
|
|
437
|
-
// Dependency timeout recovery
|
|
438
|
-
this.recoveryStrategies.set('dependency_timeout', {
|
|
439
|
-
errorType: 'dependency_timeout',
|
|
440
|
-
recoveryActions: [
|
|
441
|
-
{
|
|
442
|
-
type: 'reassign',
|
|
443
|
-
config: { preferredAgentType: 'any' }
|
|
444
|
-
},
|
|
445
|
-
{
|
|
446
|
-
type: 'fallback',
|
|
447
|
-
config: { skipDependency: true }
|
|
448
|
-
}
|
|
449
|
-
],
|
|
450
|
-
maxRetries: 2
|
|
451
|
-
});
|
|
452
|
-
// Resource exhaustion recovery
|
|
453
|
-
this.recoveryStrategies.set('resource_exhaustion', {
|
|
454
|
-
errorType: 'resource_exhaustion',
|
|
455
|
-
recoveryActions: [
|
|
456
|
-
{
|
|
457
|
-
type: 'retry',
|
|
458
|
-
config: { delay: 5000 }
|
|
459
|
-
},
|
|
460
|
-
{
|
|
461
|
-
type: 'reassign',
|
|
462
|
-
config: { reduceComplexity: true }
|
|
463
|
-
}
|
|
464
|
-
],
|
|
465
|
-
maxRetries: 3
|
|
466
|
-
});
|
|
467
|
-
}
|
|
468
|
-
/**
|
|
469
|
-
* Set up memory synchronization
|
|
470
|
-
*/
|
|
471
|
-
setupMemorySync() {
|
|
472
|
-
// Periodically sync coordination state to memory
|
|
473
|
-
setInterval(async () => {
|
|
474
|
-
for (const [objectiveId, context] of this.contexts) {
|
|
475
|
-
await this.syncContextToMemory(objectiveId, context);
|
|
476
|
-
}
|
|
477
|
-
}, 30000); // Every 30 seconds
|
|
478
|
-
}
|
|
479
|
-
/**
|
|
480
|
-
* Sync context to memory
|
|
481
|
-
*/
|
|
482
|
-
async syncContextToMemory(objectiveId, context) {
|
|
483
|
-
await this.memory.store(`coordination_state_${objectiveId}`, {
|
|
484
|
-
objectiveId,
|
|
485
|
-
sessionId: context.sessionId,
|
|
486
|
-
agentCount: context.agents.size,
|
|
487
|
-
activeHandoffs: Array.from(context.handoffs.values()).filter(h => h.status === 'pending').length,
|
|
488
|
-
blockages: context.blockages.size,
|
|
489
|
-
lastSync: new Date().toISOString()
|
|
490
|
-
});
|
|
491
|
-
}
|
|
492
|
-
/**
|
|
493
|
-
* Check if dependencies are satisfied
|
|
494
|
-
*/
|
|
495
|
-
async checkDependencySatisfaction(context, taskId) {
|
|
496
|
-
const dependencies = context.dependencies.get(taskId) || [];
|
|
497
|
-
const allSatisfied = dependencies.every(dep => this.isDependencySatisfied(context, dep));
|
|
498
|
-
if (allSatisfied) {
|
|
499
|
-
this.emit('dependencies:satisfied', {
|
|
500
|
-
taskId,
|
|
501
|
-
objectiveId: context.objectiveId
|
|
502
|
-
});
|
|
503
|
-
}
|
|
504
|
-
}
|
|
505
|
-
/**
|
|
506
|
-
* Check if a specific dependency is satisfied
|
|
507
|
-
*/
|
|
508
|
-
isDependencySatisfied(context, dependencyId) {
|
|
509
|
-
// Check if dependency task is completed
|
|
510
|
-
// This would integrate with TodoWrite status
|
|
511
|
-
// For now, check if there's a completed handoff for this dependency
|
|
512
|
-
for (const handoff of context.handoffs.values()) {
|
|
513
|
-
if (handoff.artifactType === dependencyId && handoff.status === 'completed') {
|
|
514
|
-
return true;
|
|
515
|
-
}
|
|
516
|
-
}
|
|
517
|
-
return false;
|
|
518
|
-
}
|
|
519
|
-
/**
|
|
520
|
-
* Find blocked dependencies
|
|
521
|
-
*/
|
|
522
|
-
findBlockedDependencies(context, blockedTasks) {
|
|
523
|
-
const blockedDeps = [];
|
|
524
|
-
for (const task of blockedTasks) {
|
|
525
|
-
const deps = context.dependencies.get(task) || [];
|
|
526
|
-
blockedDeps.push(...deps);
|
|
527
|
-
}
|
|
528
|
-
return [...new Set(blockedDeps)]; // Remove duplicates
|
|
529
|
-
}
|
|
530
|
-
/**
|
|
531
|
-
* Attempt recovery for blocked agent
|
|
532
|
-
*/
|
|
533
|
-
async attemptRecovery(context, blockage) {
|
|
534
|
-
// Find appropriate recovery strategy
|
|
535
|
-
const strategy = this.findRecoveryStrategy(blockage.reason);
|
|
536
|
-
if (!strategy) {
|
|
537
|
-
this.emit('recovery:failed', {
|
|
538
|
-
agentId: blockage.agentId,
|
|
539
|
-
reason: 'No recovery strategy available'
|
|
540
|
-
});
|
|
541
|
-
return;
|
|
542
|
-
}
|
|
543
|
-
// Try recovery actions
|
|
544
|
-
for (const action of strategy.recoveryActions) {
|
|
545
|
-
if (blockage.attemptedResolutions.length >= strategy.maxRetries) {
|
|
546
|
-
break;
|
|
547
|
-
}
|
|
548
|
-
try {
|
|
549
|
-
await this.executeRecoveryAction(context, blockage, action);
|
|
550
|
-
blockage.attemptedResolutions.push(action.type);
|
|
551
|
-
// If successful, remove blockage
|
|
552
|
-
context.blockages.delete(blockage.agentId);
|
|
553
|
-
this.emit('recovery:success', {
|
|
554
|
-
agentId: blockage.agentId,
|
|
555
|
-
action: action.type
|
|
556
|
-
});
|
|
557
|
-
return;
|
|
558
|
-
}
|
|
559
|
-
catch (error) {
|
|
560
|
-
blockage.attemptedResolutions.push(`${action.type}_failed`);
|
|
561
|
-
}
|
|
562
|
-
}
|
|
563
|
-
this.emit('recovery:exhausted', {
|
|
564
|
-
agentId: blockage.agentId,
|
|
565
|
-
attempts: blockage.attemptedResolutions
|
|
566
|
-
});
|
|
567
|
-
}
|
|
568
|
-
/**
|
|
569
|
-
* Find recovery strategy for error type
|
|
570
|
-
*/
|
|
571
|
-
findRecoveryStrategy(errorReason) {
|
|
572
|
-
// Match error reason to strategy
|
|
573
|
-
for (const [key, strategy] of this.recoveryStrategies) {
|
|
574
|
-
if (errorReason.toLowerCase().includes(key.replace('_', ' '))) {
|
|
575
|
-
return strategy;
|
|
576
|
-
}
|
|
577
|
-
}
|
|
578
|
-
return undefined;
|
|
579
|
-
}
|
|
580
|
-
/**
|
|
581
|
-
* Execute recovery action
|
|
582
|
-
*/
|
|
583
|
-
async executeRecoveryAction(context, blockage, action) {
|
|
584
|
-
switch (action.type) {
|
|
585
|
-
case 'retry':
|
|
586
|
-
// Wait and retry
|
|
587
|
-
await new Promise(resolve => setTimeout(resolve, action.config.delay || 1000));
|
|
588
|
-
// Agent would retry its task
|
|
589
|
-
break;
|
|
590
|
-
case 'fallback':
|
|
591
|
-
// Use fallback approach
|
|
592
|
-
await this.sendMessage('coordinator', blockage.agentId, 'coordination', {
|
|
593
|
-
type: 'use_fallback',
|
|
594
|
-
config: action.config
|
|
595
|
-
});
|
|
596
|
-
break;
|
|
597
|
-
case 'reassign': {
|
|
598
|
-
// Find another agent
|
|
599
|
-
const availableAgent = this.findAvailableAgent(context, action.config.preferredAgentType);
|
|
600
|
-
if (availableAgent) {
|
|
601
|
-
await this.reassignTasks(context, blockage.agentId, availableAgent.id);
|
|
602
|
-
}
|
|
603
|
-
break;
|
|
604
|
-
}
|
|
605
|
-
case 'escalate':
|
|
606
|
-
// Escalate to Queen
|
|
607
|
-
this.emit('escalation:required', {
|
|
608
|
-
blockage,
|
|
609
|
-
action: action.config
|
|
610
|
-
});
|
|
611
|
-
break;
|
|
612
|
-
}
|
|
613
|
-
}
|
|
614
|
-
/**
|
|
615
|
-
* Find available agent of specified type
|
|
616
|
-
*/
|
|
617
|
-
findAvailableAgent(context, preferredType) {
|
|
618
|
-
for (const agent of context.agents.values()) {
|
|
619
|
-
if (agent.status === 'idle' &&
|
|
620
|
-
(preferredType === 'any' || agent.type === preferredType)) {
|
|
621
|
-
return agent;
|
|
622
|
-
}
|
|
623
|
-
}
|
|
624
|
-
return undefined;
|
|
625
|
-
}
|
|
626
|
-
/**
|
|
627
|
-
* Reassign tasks from one agent to another
|
|
628
|
-
*/
|
|
629
|
-
async reassignTasks(context, fromAgentId, toAgentId) {
|
|
630
|
-
// Send reassignment message
|
|
631
|
-
await this.sendMessage('coordinator', toAgentId, 'task_assignment', {
|
|
632
|
-
type: 'reassignment',
|
|
633
|
-
fromAgent: fromAgentId,
|
|
634
|
-
reason: 'agent_blocked'
|
|
635
|
-
});
|
|
636
|
-
this.emit('tasks:reassigned', {
|
|
637
|
-
fromAgent: fromAgentId,
|
|
638
|
-
toAgent: toAgentId,
|
|
639
|
-
objectiveId: context.objectiveId
|
|
640
|
-
});
|
|
641
|
-
}
|
|
642
|
-
/**
|
|
643
|
-
* Process pending messages for an agent
|
|
644
|
-
*/
|
|
645
|
-
async processAgentMessages(agentId) {
|
|
646
|
-
const messages = await this.getAgentMessages(agentId);
|
|
647
|
-
for (const message of messages) {
|
|
648
|
-
this.emit('message:delivered', message);
|
|
649
|
-
}
|
|
650
|
-
}
|
|
651
|
-
/**
|
|
652
|
-
* Evaluate strategy condition
|
|
653
|
-
*/
|
|
654
|
-
evaluateCondition(context, condition) {
|
|
655
|
-
switch (condition) {
|
|
656
|
-
case 'hasBlockedAgent':
|
|
657
|
-
return context.blockages.size > 0;
|
|
658
|
-
case 'allDependenciesSatisfied':
|
|
659
|
-
// Check if all dependencies are satisfied
|
|
660
|
-
for (const deps of context.dependencies.values()) {
|
|
661
|
-
if (!deps.every(d => this.isDependencySatisfied(context, d))) {
|
|
662
|
-
return false;
|
|
663
|
-
}
|
|
664
|
-
}
|
|
665
|
-
return true;
|
|
666
|
-
case 'hasIndependentTasks':
|
|
667
|
-
// Check for tasks with no dependencies
|
|
668
|
-
return Array.from(context.dependencies.values()).some(deps => deps.length === 0);
|
|
669
|
-
case 'highComplexity':
|
|
670
|
-
// Would need complexity metric
|
|
671
|
-
return context.agents.size > 5;
|
|
672
|
-
case 'repeatedFailures':
|
|
673
|
-
// Check for multiple blockages
|
|
674
|
-
return context.blockages.size > 2;
|
|
675
|
-
default:
|
|
676
|
-
return false;
|
|
677
|
-
}
|
|
678
|
-
}
|
|
679
|
-
/**
|
|
680
|
-
* Execute strategy action
|
|
681
|
-
*/
|
|
682
|
-
async executeAction(context, action) {
|
|
683
|
-
switch (action) {
|
|
684
|
-
case 'waitForDependencies':
|
|
685
|
-
// Agents would wait for dependencies
|
|
686
|
-
this.emit('action:wait', { objectiveId: context.objectiveId });
|
|
687
|
-
break;
|
|
688
|
-
case 'proceedToNextTask':
|
|
689
|
-
// Signal agents to proceed
|
|
690
|
-
for (const agent of context.agents.values()) {
|
|
691
|
-
await this.sendMessage('coordinator', agent.id, 'coordination', {
|
|
692
|
-
type: 'proceed'
|
|
693
|
-
});
|
|
694
|
-
}
|
|
695
|
-
break;
|
|
696
|
-
case 'assignToAvailableAgents': {
|
|
697
|
-
// Distribute tasks to available agents
|
|
698
|
-
const availableAgents = Array.from(context.agents.values())
|
|
699
|
-
.filter(a => a.status === 'idle');
|
|
700
|
-
// Would assign tasks here
|
|
701
|
-
this.emit('action:assign', {
|
|
702
|
-
objectiveId: context.objectiveId,
|
|
703
|
-
agentCount: availableAgents.length
|
|
704
|
-
});
|
|
705
|
-
break;
|
|
706
|
-
}
|
|
707
|
-
case 'spawnSpecialistAgent':
|
|
708
|
-
// Request Queen to spawn specialist
|
|
709
|
-
this.emit('action:spawn_specialist', { objectiveId: context.objectiveId });
|
|
710
|
-
break;
|
|
711
|
-
case 'switchToFallbackApproach':
|
|
712
|
-
// Signal all agents to use fallback
|
|
713
|
-
for (const agent of context.agents.values()) {
|
|
714
|
-
await this.sendMessage('coordinator', agent.id, 'coordination', {
|
|
715
|
-
type: 'use_fallback'
|
|
716
|
-
});
|
|
717
|
-
}
|
|
718
|
-
break;
|
|
719
|
-
}
|
|
720
|
-
}
|
|
721
|
-
/**
|
|
722
|
-
* Generate unique ID
|
|
723
|
-
*/
|
|
724
|
-
generateId(prefix) {
|
|
725
|
-
return `${prefix}_${Date.now()}_${crypto.randomBytes(4).toString('hex')}`;
|
|
726
|
-
}
|
|
727
|
-
/**
|
|
728
|
-
* Get coordinator statistics
|
|
729
|
-
*/
|
|
730
|
-
async getStats() {
|
|
731
|
-
let totalAgents = 0;
|
|
732
|
-
let activeHandoffs = 0;
|
|
733
|
-
let blockedAgents = 0;
|
|
734
|
-
let messagesInQueue = 0;
|
|
735
|
-
for (const context of this.contexts.values()) {
|
|
736
|
-
totalAgents += context.agents.size;
|
|
737
|
-
activeHandoffs += Array.from(context.handoffs.values())
|
|
738
|
-
.filter(h => h.status === 'pending').length;
|
|
739
|
-
blockedAgents += context.blockages.size;
|
|
740
|
-
}
|
|
741
|
-
for (const queue of this.messageQueue.values()) {
|
|
742
|
-
messagesInQueue += queue.length;
|
|
743
|
-
}
|
|
744
|
-
return {
|
|
745
|
-
activeContexts: this.contexts.size,
|
|
746
|
-
totalAgents,
|
|
747
|
-
activeHandoffs,
|
|
748
|
-
blockedAgents,
|
|
749
|
-
messagesInQueue
|
|
750
|
-
};
|
|
751
|
-
}
|
|
752
|
-
/**
|
|
753
|
-
* Clean up completed contexts
|
|
754
|
-
*/
|
|
755
|
-
async cleanup() {
|
|
756
|
-
const now = Date.now();
|
|
757
|
-
const maxAge = 3600000; // 1 hour
|
|
758
|
-
for (const [objectiveId, context] of this.contexts) {
|
|
759
|
-
// Check if all agents are terminated and no active handoffs
|
|
760
|
-
const allAgentsIdle = Array.from(context.agents.values())
|
|
761
|
-
.every(a => a.status === 'idle' || a.status === 'completed');
|
|
762
|
-
const noActiveHandoffs = Array.from(context.handoffs.values())
|
|
763
|
-
.every(h => h.status === 'completed' || h.status === 'failed');
|
|
764
|
-
if (allAgentsIdle && noActiveHandoffs) {
|
|
765
|
-
// Check age of last activity
|
|
766
|
-
const lastActivity = Math.max(...Array.from(context.handoffs.values())
|
|
767
|
-
.map(h => h.completedAt?.getTime() || 0));
|
|
768
|
-
if (now - lastActivity > maxAge) {
|
|
769
|
-
this.contexts.delete(objectiveId);
|
|
770
|
-
this.emit('context:cleaned', { objectiveId });
|
|
771
|
-
}
|
|
772
|
-
}
|
|
773
|
-
}
|
|
774
|
-
}
|
|
775
|
-
}
|
|
776
|
-
exports.AgentCoordinator = AgentCoordinator;
|
|
777
|
-
//# sourceMappingURL=coordinator.js.map
|