@claude-flow/swarm 3.0.0-alpha.1

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.
Files changed (190) hide show
  1. package/.agentic-flow/intelligence.json +16 -0
  2. package/MIGRATION.md +472 -0
  3. package/README.md +634 -0
  4. package/__tests__/consensus.test.ts +577 -0
  5. package/__tests__/coordinator.test.ts +501 -0
  6. package/__tests__/queen-coordinator.test.ts +1335 -0
  7. package/__tests__/topology.test.ts +621 -0
  8. package/dist/agent-pool.d.ts +52 -0
  9. package/dist/agent-pool.d.ts.map +1 -0
  10. package/dist/agent-pool.js +365 -0
  11. package/dist/agent-pool.js.map +1 -0
  12. package/dist/application/commands/create-task.command.d.ts +64 -0
  13. package/dist/application/commands/create-task.command.d.ts.map +1 -0
  14. package/dist/application/commands/create-task.command.js +77 -0
  15. package/dist/application/commands/create-task.command.js.map +1 -0
  16. package/dist/application/commands/spawn-agent.command.d.ts +63 -0
  17. package/dist/application/commands/spawn-agent.command.d.ts.map +1 -0
  18. package/dist/application/commands/spawn-agent.command.js +74 -0
  19. package/dist/application/commands/spawn-agent.command.js.map +1 -0
  20. package/dist/application/index.d.ts +9 -0
  21. package/dist/application/index.d.ts.map +1 -0
  22. package/dist/application/index.js +11 -0
  23. package/dist/application/index.js.map +1 -0
  24. package/dist/application/services/swarm-application-service.d.ts +112 -0
  25. package/dist/application/services/swarm-application-service.d.ts.map +1 -0
  26. package/dist/application/services/swarm-application-service.js +153 -0
  27. package/dist/application/services/swarm-application-service.js.map +1 -0
  28. package/dist/attention-coordinator.d.ts +212 -0
  29. package/dist/attention-coordinator.d.ts.map +1 -0
  30. package/dist/attention-coordinator.js +667 -0
  31. package/dist/attention-coordinator.js.map +1 -0
  32. package/dist/consensus/byzantine.d.ts +63 -0
  33. package/dist/consensus/byzantine.d.ts.map +1 -0
  34. package/dist/consensus/byzantine.js +316 -0
  35. package/dist/consensus/byzantine.js.map +1 -0
  36. package/dist/consensus/gossip.d.ts +69 -0
  37. package/dist/consensus/gossip.d.ts.map +1 -0
  38. package/dist/consensus/gossip.js +378 -0
  39. package/dist/consensus/gossip.js.map +1 -0
  40. package/dist/consensus/index.d.ts +49 -0
  41. package/dist/consensus/index.d.ts.map +1 -0
  42. package/dist/consensus/index.js +203 -0
  43. package/dist/consensus/index.js.map +1 -0
  44. package/dist/consensus/raft.d.ts +62 -0
  45. package/dist/consensus/raft.d.ts.map +1 -0
  46. package/dist/consensus/raft.js +324 -0
  47. package/dist/consensus/raft.js.map +1 -0
  48. package/dist/coordination/agent-registry.d.ts +68 -0
  49. package/dist/coordination/agent-registry.d.ts.map +1 -0
  50. package/dist/coordination/agent-registry.js +412 -0
  51. package/dist/coordination/agent-registry.js.map +1 -0
  52. package/dist/coordination/index.d.ts +8 -0
  53. package/dist/coordination/index.d.ts.map +1 -0
  54. package/dist/coordination/index.js +8 -0
  55. package/dist/coordination/index.js.map +1 -0
  56. package/dist/coordination/swarm-hub.d.ts +150 -0
  57. package/dist/coordination/swarm-hub.d.ts.map +1 -0
  58. package/dist/coordination/swarm-hub.js +617 -0
  59. package/dist/coordination/swarm-hub.js.map +1 -0
  60. package/dist/coordination/task-orchestrator.d.ts +96 -0
  61. package/dist/coordination/task-orchestrator.d.ts.map +1 -0
  62. package/dist/coordination/task-orchestrator.js +412 -0
  63. package/dist/coordination/task-orchestrator.js.map +1 -0
  64. package/dist/domain/entities/agent.d.ts +151 -0
  65. package/dist/domain/entities/agent.d.ts.map +1 -0
  66. package/dist/domain/entities/agent.js +280 -0
  67. package/dist/domain/entities/agent.js.map +1 -0
  68. package/dist/domain/entities/task.d.ts +133 -0
  69. package/dist/domain/entities/task.d.ts.map +1 -0
  70. package/dist/domain/entities/task.js +261 -0
  71. package/dist/domain/entities/task.js.map +1 -0
  72. package/dist/domain/index.d.ts +11 -0
  73. package/dist/domain/index.d.ts.map +1 -0
  74. package/dist/domain/index.js +11 -0
  75. package/dist/domain/index.js.map +1 -0
  76. package/dist/domain/repositories/agent-repository.interface.d.ts +57 -0
  77. package/dist/domain/repositories/agent-repository.interface.d.ts.map +1 -0
  78. package/dist/domain/repositories/agent-repository.interface.js +9 -0
  79. package/dist/domain/repositories/agent-repository.interface.js.map +1 -0
  80. package/dist/domain/repositories/task-repository.interface.d.ts +61 -0
  81. package/dist/domain/repositories/task-repository.interface.d.ts.map +1 -0
  82. package/dist/domain/repositories/task-repository.interface.js +9 -0
  83. package/dist/domain/repositories/task-repository.interface.js.map +1 -0
  84. package/dist/domain/services/coordination-service.d.ts +84 -0
  85. package/dist/domain/services/coordination-service.d.ts.map +1 -0
  86. package/dist/domain/services/coordination-service.js +231 -0
  87. package/dist/domain/services/coordination-service.js.map +1 -0
  88. package/dist/federation-hub.d.ts +284 -0
  89. package/dist/federation-hub.d.ts.map +1 -0
  90. package/dist/federation-hub.js +692 -0
  91. package/dist/federation-hub.js.map +1 -0
  92. package/dist/index.d.ts +107 -0
  93. package/dist/index.d.ts.map +1 -0
  94. package/dist/index.js +142 -0
  95. package/dist/index.js.map +1 -0
  96. package/dist/message-bus.d.ts +48 -0
  97. package/dist/message-bus.d.ts.map +1 -0
  98. package/dist/message-bus.js +499 -0
  99. package/dist/message-bus.js.map +1 -0
  100. package/dist/queen-coordinator.d.ts +576 -0
  101. package/dist/queen-coordinator.d.ts.map +1 -0
  102. package/dist/queen-coordinator.js +1307 -0
  103. package/dist/queen-coordinator.js.map +1 -0
  104. package/dist/shared/events.d.ts +63 -0
  105. package/dist/shared/events.d.ts.map +1 -0
  106. package/dist/shared/events.js +203 -0
  107. package/dist/shared/events.js.map +1 -0
  108. package/dist/shared/types.d.ts +212 -0
  109. package/dist/shared/types.d.ts.map +1 -0
  110. package/dist/shared/types.js +22 -0
  111. package/dist/shared/types.js.map +1 -0
  112. package/dist/topology-manager.d.ts +62 -0
  113. package/dist/topology-manager.d.ts.map +1 -0
  114. package/dist/topology-manager.js +538 -0
  115. package/dist/topology-manager.js.map +1 -0
  116. package/dist/types.d.ts +353 -0
  117. package/dist/types.d.ts.map +1 -0
  118. package/dist/types.js +43 -0
  119. package/dist/types.js.map +1 -0
  120. package/dist/unified-coordinator.d.ts +260 -0
  121. package/dist/unified-coordinator.d.ts.map +1 -0
  122. package/dist/unified-coordinator.js +1460 -0
  123. package/dist/unified-coordinator.js.map +1 -0
  124. package/dist/workers/index.d.ts +29 -0
  125. package/dist/workers/index.d.ts.map +1 -0
  126. package/dist/workers/index.js +49 -0
  127. package/dist/workers/index.js.map +1 -0
  128. package/dist/workers/worker-dispatch.d.ts +234 -0
  129. package/dist/workers/worker-dispatch.d.ts.map +1 -0
  130. package/dist/workers/worker-dispatch.js +842 -0
  131. package/dist/workers/worker-dispatch.js.map +1 -0
  132. package/package.json +33 -0
  133. package/src/agent-pool.ts +476 -0
  134. package/src/application/commands/create-task.command.ts +124 -0
  135. package/src/application/commands/spawn-agent.command.ts +122 -0
  136. package/src/application/index.ts +30 -0
  137. package/src/application/services/swarm-application-service.ts +200 -0
  138. package/src/attention-coordinator.ts +1000 -0
  139. package/src/consensus/byzantine.ts +431 -0
  140. package/src/consensus/gossip.ts +513 -0
  141. package/src/consensus/index.ts +267 -0
  142. package/src/consensus/raft.ts +443 -0
  143. package/src/coordination/agent-registry.ts +544 -0
  144. package/src/coordination/index.ts +23 -0
  145. package/src/coordination/swarm-hub.ts +776 -0
  146. package/src/coordination/task-orchestrator.ts +605 -0
  147. package/src/domain/entities/agent.d.ts +151 -0
  148. package/src/domain/entities/agent.d.ts.map +1 -0
  149. package/src/domain/entities/agent.js +280 -0
  150. package/src/domain/entities/agent.js.map +1 -0
  151. package/src/domain/entities/agent.ts +370 -0
  152. package/src/domain/entities/task.d.ts +133 -0
  153. package/src/domain/entities/task.d.ts.map +1 -0
  154. package/src/domain/entities/task.js +261 -0
  155. package/src/domain/entities/task.js.map +1 -0
  156. package/src/domain/entities/task.ts +319 -0
  157. package/src/domain/index.ts +41 -0
  158. package/src/domain/repositories/agent-repository.interface.d.ts +57 -0
  159. package/src/domain/repositories/agent-repository.interface.d.ts.map +1 -0
  160. package/src/domain/repositories/agent-repository.interface.js +9 -0
  161. package/src/domain/repositories/agent-repository.interface.js.map +1 -0
  162. package/src/domain/repositories/agent-repository.interface.ts +69 -0
  163. package/src/domain/repositories/task-repository.interface.d.ts +61 -0
  164. package/src/domain/repositories/task-repository.interface.d.ts.map +1 -0
  165. package/src/domain/repositories/task-repository.interface.js +9 -0
  166. package/src/domain/repositories/task-repository.interface.js.map +1 -0
  167. package/src/domain/repositories/task-repository.interface.ts +75 -0
  168. package/src/domain/services/coordination-service.ts +320 -0
  169. package/src/federation-hub.d.ts +284 -0
  170. package/src/federation-hub.d.ts.map +1 -0
  171. package/src/federation-hub.js +692 -0
  172. package/src/federation-hub.js.map +1 -0
  173. package/src/federation-hub.ts +979 -0
  174. package/src/index.ts +348 -0
  175. package/src/message-bus.ts +607 -0
  176. package/src/queen-coordinator.ts +2024 -0
  177. package/src/shared/events.ts +285 -0
  178. package/src/shared/types.ts +389 -0
  179. package/src/topology-manager.ts +656 -0
  180. package/src/types.ts +545 -0
  181. package/src/unified-coordinator.ts +1844 -0
  182. package/src/workers/index.ts +65 -0
  183. package/src/workers/worker-dispatch.d.ts +234 -0
  184. package/src/workers/worker-dispatch.d.ts.map +1 -0
  185. package/src/workers/worker-dispatch.js +842 -0
  186. package/src/workers/worker-dispatch.js.map +1 -0
  187. package/src/workers/worker-dispatch.ts +1072 -0
  188. package/tsconfig.json +9 -0
  189. package/tsconfig.tsbuildinfo +1 -0
  190. package/vitest.config.ts +20 -0
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Spawn Agent Command - Application Layer (CQRS)
3
+ *
4
+ * Command for spawning a new agent in the swarm.
5
+ *
6
+ * @module v3/swarm/application/commands
7
+ */
8
+
9
+ import { Agent, AgentRole, AgentProps } from '../../domain/entities/agent.js';
10
+ import { IAgentRepository } from '../../domain/repositories/agent-repository.interface.js';
11
+
12
+ /**
13
+ * Spawn Agent Command Input
14
+ */
15
+ export interface SpawnAgentInput {
16
+ name: string;
17
+ role: AgentRole;
18
+ domain: string;
19
+ capabilities: string[];
20
+ parentId?: string;
21
+ metadata?: Record<string, unknown>;
22
+ maxConcurrentTasks?: number;
23
+ autoStart?: boolean;
24
+ }
25
+
26
+ /**
27
+ * Spawn Agent Command Result
28
+ */
29
+ export interface SpawnAgentResult {
30
+ success: boolean;
31
+ agentId: string;
32
+ agent: Agent;
33
+ startedAutomatically: boolean;
34
+ }
35
+
36
+ /**
37
+ * Spawn Agent Command Handler
38
+ */
39
+ export class SpawnAgentCommandHandler {
40
+ constructor(private readonly repository: IAgentRepository) {}
41
+
42
+ async execute(input: SpawnAgentInput): Promise<SpawnAgentResult> {
43
+ // Check if agent with same name exists
44
+ const existing = await this.repository.findByName(input.name);
45
+ if (existing) {
46
+ throw new Error(`Agent with name '${input.name}' already exists`);
47
+ }
48
+
49
+ // Create agent
50
+ const agent = Agent.create({
51
+ name: input.name,
52
+ role: input.role,
53
+ domain: input.domain,
54
+ capabilities: input.capabilities,
55
+ parentId: input.parentId,
56
+ metadata: input.metadata,
57
+ maxConcurrentTasks: input.maxConcurrentTasks,
58
+ });
59
+
60
+ // Auto-start if requested
61
+ let startedAutomatically = false;
62
+ if (input.autoStart) {
63
+ agent.start();
64
+ startedAutomatically = true;
65
+ }
66
+
67
+ await this.repository.save(agent);
68
+
69
+ return {
70
+ success: true,
71
+ agentId: agent.id,
72
+ agent,
73
+ startedAutomatically,
74
+ };
75
+ }
76
+ }
77
+
78
+ /**
79
+ * Terminate Agent Command Input
80
+ */
81
+ export interface TerminateAgentInput {
82
+ agentId: string;
83
+ force?: boolean;
84
+ }
85
+
86
+ /**
87
+ * Terminate Agent Command Result
88
+ */
89
+ export interface TerminateAgentResult {
90
+ success: boolean;
91
+ agentId: string;
92
+ tasksReassigned: number;
93
+ }
94
+
95
+ /**
96
+ * Terminate Agent Command Handler
97
+ */
98
+ export class TerminateAgentCommandHandler {
99
+ constructor(private readonly repository: IAgentRepository) {}
100
+
101
+ async execute(input: TerminateAgentInput): Promise<TerminateAgentResult> {
102
+ const agent = await this.repository.findById(input.agentId);
103
+ if (!agent) {
104
+ throw new Error(`Agent '${input.agentId}' not found`);
105
+ }
106
+
107
+ const currentTasks = agent.currentTaskCount;
108
+
109
+ if (currentTasks > 0 && !input.force) {
110
+ throw new Error(`Agent has ${currentTasks} active tasks. Use force=true to terminate anyway.`);
111
+ }
112
+
113
+ agent.terminate();
114
+ await this.repository.save(agent);
115
+
116
+ return {
117
+ success: true,
118
+ agentId: input.agentId,
119
+ tasksReassigned: currentTasks,
120
+ };
121
+ }
122
+ }
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Swarm Application Layer - Public Exports
3
+ *
4
+ * @module v3/swarm/application
5
+ */
6
+
7
+ // Commands
8
+ export {
9
+ SpawnAgentCommandHandler,
10
+ TerminateAgentCommandHandler,
11
+ type SpawnAgentInput,
12
+ type SpawnAgentResult,
13
+ type TerminateAgentInput,
14
+ type TerminateAgentResult,
15
+ } from './commands/spawn-agent.command.js';
16
+
17
+ export {
18
+ CreateTaskCommandHandler,
19
+ CancelTaskCommandHandler,
20
+ type CreateTaskInput,
21
+ type CreateTaskResult,
22
+ type CancelTaskInput,
23
+ type CancelTaskResult,
24
+ } from './commands/create-task.command.js';
25
+
26
+ // Application Service
27
+ export {
28
+ SwarmApplicationService,
29
+ type SwarmConfig,
30
+ } from './services/swarm-application-service.js';
@@ -0,0 +1,200 @@
1
+ /**
2
+ * Swarm Application Service - Application Layer
3
+ *
4
+ * Orchestrates swarm operations and provides simplified interface.
5
+ *
6
+ * @module v3/swarm/application/services
7
+ */
8
+
9
+ import { Agent, AgentRole, AgentStatus } from '../../domain/entities/agent.js';
10
+ import { Task, TaskStatus, TaskPriority } from '../../domain/entities/task.js';
11
+ import { IAgentRepository, AgentStatistics } from '../../domain/repositories/agent-repository.interface.js';
12
+ import { ITaskRepository, TaskStatistics } from '../../domain/repositories/task-repository.interface.js';
13
+ import { CoordinationService, LoadBalancingStrategy, SwarmHealth } from '../../domain/services/coordination-service.js';
14
+ import { SpawnAgentCommandHandler, SpawnAgentInput, TerminateAgentCommandHandler } from '../commands/spawn-agent.command.js';
15
+ import { CreateTaskCommandHandler, CreateTaskInput, CancelTaskCommandHandler } from '../commands/create-task.command.js';
16
+
17
+ /**
18
+ * Swarm configuration
19
+ */
20
+ export interface SwarmConfig {
21
+ loadBalancingStrategy?: LoadBalancingStrategy;
22
+ autoScaling?: boolean;
23
+ minAgents?: number;
24
+ maxAgents?: number;
25
+ }
26
+
27
+ /**
28
+ * Swarm Application Service
29
+ */
30
+ export class SwarmApplicationService {
31
+ private readonly coordinationService: CoordinationService;
32
+ private readonly spawnHandler: SpawnAgentCommandHandler;
33
+ private readonly terminateHandler: TerminateAgentCommandHandler;
34
+ private readonly createTaskHandler: CreateTaskCommandHandler;
35
+ private readonly cancelTaskHandler: CancelTaskCommandHandler;
36
+
37
+ constructor(
38
+ private readonly agentRepository: IAgentRepository,
39
+ private readonly taskRepository: ITaskRepository,
40
+ private readonly config: SwarmConfig = {}
41
+ ) {
42
+ this.coordinationService = new CoordinationService(agentRepository, taskRepository);
43
+ this.spawnHandler = new SpawnAgentCommandHandler(agentRepository);
44
+ this.terminateHandler = new TerminateAgentCommandHandler(agentRepository);
45
+ this.createTaskHandler = new CreateTaskCommandHandler(taskRepository);
46
+ this.cancelTaskHandler = new CancelTaskCommandHandler(taskRepository);
47
+ }
48
+
49
+ // ============================================================================
50
+ // Agent Operations
51
+ // ============================================================================
52
+
53
+ /**
54
+ * Spawn a new agent
55
+ */
56
+ async spawnAgent(input: SpawnAgentInput): Promise<Agent> {
57
+ const result = await this.spawnHandler.execute(input);
58
+ return result.agent;
59
+ }
60
+
61
+ /**
62
+ * Terminate an agent
63
+ */
64
+ async terminateAgent(agentId: string, force = false): Promise<void> {
65
+ await this.terminateHandler.execute({ agentId, force });
66
+ }
67
+
68
+ /**
69
+ * Get agent by ID
70
+ */
71
+ async getAgent(agentId: string): Promise<Agent | null> {
72
+ return this.agentRepository.findById(agentId);
73
+ }
74
+
75
+ /**
76
+ * List all agents
77
+ */
78
+ async listAgents(options?: {
79
+ status?: AgentStatus;
80
+ role?: AgentRole;
81
+ domain?: string;
82
+ }): Promise<Agent[]> {
83
+ return this.agentRepository.findAll(options);
84
+ }
85
+
86
+ /**
87
+ * Get agent statistics
88
+ */
89
+ async getAgentStatistics(): Promise<AgentStatistics> {
90
+ return this.agentRepository.getStatistics();
91
+ }
92
+
93
+ // ============================================================================
94
+ // Task Operations
95
+ // ============================================================================
96
+
97
+ /**
98
+ * Create a new task
99
+ */
100
+ async createTask(input: CreateTaskInput): Promise<Task> {
101
+ const result = await this.createTaskHandler.execute(input);
102
+ return result.task;
103
+ }
104
+
105
+ /**
106
+ * Cancel a task
107
+ */
108
+ async cancelTask(taskId: string): Promise<void> {
109
+ await this.cancelTaskHandler.execute({ taskId });
110
+ }
111
+
112
+ /**
113
+ * Get task by ID
114
+ */
115
+ async getTask(taskId: string): Promise<Task | null> {
116
+ return this.taskRepository.findById(taskId);
117
+ }
118
+
119
+ /**
120
+ * List tasks
121
+ */
122
+ async listTasks(options?: {
123
+ status?: TaskStatus;
124
+ priority?: TaskPriority;
125
+ assignedAgentId?: string;
126
+ }): Promise<Task[]> {
127
+ return this.taskRepository.findAll(options);
128
+ }
129
+
130
+ /**
131
+ * Get task statistics
132
+ */
133
+ async getTaskStatistics(): Promise<TaskStatistics> {
134
+ return this.taskRepository.getStatistics();
135
+ }
136
+
137
+ // ============================================================================
138
+ // Orchestration
139
+ // ============================================================================
140
+
141
+ /**
142
+ * Assign pending tasks to available agents
143
+ */
144
+ async processPendingTasks(): Promise<number> {
145
+ const queuedTasks = await this.taskRepository.findQueued();
146
+ let assigned = 0;
147
+
148
+ for (const task of queuedTasks) {
149
+ const result = await this.coordinationService.assignTask(
150
+ task.id,
151
+ this.config.loadBalancingStrategy ?? 'capability-match'
152
+ );
153
+ if (result.success) assigned++;
154
+ }
155
+
156
+ return assigned;
157
+ }
158
+
159
+ /**
160
+ * Complete a task
161
+ */
162
+ async completeTask(taskId: string, output?: unknown): Promise<void> {
163
+ await this.coordinationService.processTaskCompletion(taskId, output);
164
+ }
165
+
166
+ /**
167
+ * Fail a task
168
+ */
169
+ async failTask(taskId: string, error: string): Promise<boolean> {
170
+ return this.coordinationService.processTaskFailure(taskId, error);
171
+ }
172
+
173
+ /**
174
+ * Get swarm health
175
+ */
176
+ async getHealth(): Promise<SwarmHealth> {
177
+ return this.coordinationService.getSwarmHealth();
178
+ }
179
+
180
+ /**
181
+ * Get scaling recommendation
182
+ */
183
+ async getScalingRecommendation() {
184
+ return this.coordinationService.calculateScalingRecommendation();
185
+ }
186
+
187
+ // ============================================================================
188
+ // Lifecycle
189
+ // ============================================================================
190
+
191
+ async initialize(): Promise<void> {
192
+ await this.agentRepository.initialize();
193
+ await this.taskRepository.initialize();
194
+ }
195
+
196
+ async shutdown(): Promise<void> {
197
+ await this.agentRepository.shutdown();
198
+ await this.taskRepository.shutdown();
199
+ }
200
+ }