@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,62 @@
1
+ /**
2
+ * V3 Raft Consensus Implementation
3
+ * Leader election and log replication for distributed coordination
4
+ */
5
+ import { EventEmitter } from 'events';
6
+ import { ConsensusProposal, ConsensusVote, ConsensusResult, ConsensusConfig } from '../types.js';
7
+ export type RaftState = 'follower' | 'candidate' | 'leader';
8
+ export interface RaftNode {
9
+ id: string;
10
+ state: RaftState;
11
+ currentTerm: number;
12
+ votedFor?: string;
13
+ log: RaftLogEntry[];
14
+ commitIndex: number;
15
+ lastApplied: number;
16
+ }
17
+ export interface RaftLogEntry {
18
+ term: number;
19
+ index: number;
20
+ command: unknown;
21
+ timestamp: Date;
22
+ }
23
+ export interface RaftConfig extends Partial<ConsensusConfig> {
24
+ electionTimeoutMinMs?: number;
25
+ electionTimeoutMaxMs?: number;
26
+ heartbeatIntervalMs?: number;
27
+ }
28
+ export declare class RaftConsensus extends EventEmitter {
29
+ private config;
30
+ private node;
31
+ private peers;
32
+ private proposals;
33
+ private electionTimeout?;
34
+ private heartbeatInterval?;
35
+ private proposalCounter;
36
+ constructor(nodeId: string, config?: RaftConfig);
37
+ initialize(): Promise<void>;
38
+ shutdown(): Promise<void>;
39
+ addPeer(peerId: string): void;
40
+ removePeer(peerId: string): void;
41
+ propose(value: unknown): Promise<ConsensusProposal>;
42
+ vote(proposalId: string, vote: ConsensusVote): Promise<void>;
43
+ awaitConsensus(proposalId: string): Promise<ConsensusResult>;
44
+ getState(): RaftState;
45
+ getTerm(): number;
46
+ isLeader(): boolean;
47
+ getLeaderId(): string | undefined;
48
+ private resetElectionTimeout;
49
+ private randomElectionTimeout;
50
+ private startElection;
51
+ private requestVote;
52
+ private becomeLeader;
53
+ private sendHeartbeats;
54
+ private appendEntries;
55
+ private replicateToFollowers;
56
+ private checkConsensus;
57
+ private createResult;
58
+ handleVoteRequest(candidateId: string, term: number, lastLogIndex: number, lastLogTerm: number): boolean;
59
+ handleAppendEntries(leaderId: string, term: number, entries: RaftLogEntry[], leaderCommit: number): boolean;
60
+ }
61
+ export declare function createRaftConsensus(nodeId: string, config?: RaftConfig): RaftConsensus;
62
+ //# sourceMappingURL=raft.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"raft.d.ts","sourceRoot":"","sources":["../../src/consensus/raft.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,eAAe,EAEhB,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,WAAW,GAAG,QAAQ,CAAC;AAE5D,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,YAAY,EAAE,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,UAAW,SAAQ,OAAO,CAAC,eAAe,CAAC;IAC1D,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,IAAI,CAAW;IACvB,OAAO,CAAC,KAAK,CAAoC;IACjD,OAAO,CAAC,SAAS,CAA6C;IAC9D,OAAO,CAAC,eAAe,CAAC,CAAiB;IACzC,OAAO,CAAC,iBAAiB,CAAC,CAAiB;IAC3C,OAAO,CAAC,eAAe,CAAa;gBAExB,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,UAAe;IAsB7C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAU/B,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAW7B,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI1B,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA2CnD,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB5D,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IA2BlE,QAAQ,IAAI,SAAS;IAIrB,OAAO,IAAI,MAAM;IAIjB,QAAQ,IAAI,OAAO;IAInB,WAAW,IAAI,MAAM,GAAG,SAAS;IASjC,OAAO,CAAC,oBAAoB;IAW5B,OAAO,CAAC,qBAAqB;YAMf,aAAa;YAgCb,WAAW;IAezB,OAAO,CAAC,YAAY;YAkBN,cAAc;YAMd,aAAa;YAeb,oBAAoB;YAkBpB,cAAc;IAwB5B,OAAO,CAAC,YAAY;IAoBpB,iBAAiB,CACf,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,GAClB,OAAO;IA6BV,mBAAmB,CACjB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,YAAY,EAAE,EACvB,YAAY,EAAE,MAAM,GACnB,OAAO;CA2BX;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,aAAa,CAEtF"}
@@ -0,0 +1,324 @@
1
+ /**
2
+ * V3 Raft Consensus Implementation
3
+ * Leader election and log replication for distributed coordination
4
+ */
5
+ import { EventEmitter } from 'events';
6
+ import { SWARM_CONSTANTS, } from '../types.js';
7
+ export class RaftConsensus extends EventEmitter {
8
+ config;
9
+ node;
10
+ peers = new Map();
11
+ proposals = new Map();
12
+ electionTimeout;
13
+ heartbeatInterval;
14
+ proposalCounter = 0;
15
+ constructor(nodeId, config = {}) {
16
+ super();
17
+ this.config = {
18
+ threshold: config.threshold ?? SWARM_CONSTANTS.DEFAULT_CONSENSUS_THRESHOLD,
19
+ timeoutMs: config.timeoutMs ?? SWARM_CONSTANTS.DEFAULT_CONSENSUS_TIMEOUT_MS,
20
+ maxRounds: config.maxRounds ?? 10,
21
+ requireQuorum: config.requireQuorum ?? true,
22
+ electionTimeoutMinMs: config.electionTimeoutMinMs ?? 150,
23
+ electionTimeoutMaxMs: config.electionTimeoutMaxMs ?? 300,
24
+ heartbeatIntervalMs: config.heartbeatIntervalMs ?? 50,
25
+ };
26
+ this.node = {
27
+ id: nodeId,
28
+ state: 'follower',
29
+ currentTerm: 0,
30
+ log: [],
31
+ commitIndex: 0,
32
+ lastApplied: 0,
33
+ };
34
+ }
35
+ async initialize() {
36
+ this.resetElectionTimeout();
37
+ this.emit('initialized', { nodeId: this.node.id });
38
+ }
39
+ async shutdown() {
40
+ if (this.electionTimeout) {
41
+ clearTimeout(this.electionTimeout);
42
+ }
43
+ if (this.heartbeatInterval) {
44
+ clearInterval(this.heartbeatInterval);
45
+ }
46
+ this.emit('shutdown');
47
+ }
48
+ addPeer(peerId) {
49
+ this.peers.set(peerId, {
50
+ id: peerId,
51
+ state: 'follower',
52
+ currentTerm: 0,
53
+ log: [],
54
+ commitIndex: 0,
55
+ lastApplied: 0,
56
+ });
57
+ }
58
+ removePeer(peerId) {
59
+ this.peers.delete(peerId);
60
+ }
61
+ async propose(value) {
62
+ if (this.node.state !== 'leader') {
63
+ throw new Error('Only leader can propose values');
64
+ }
65
+ this.proposalCounter++;
66
+ const proposalId = `raft_${this.node.id}_${this.proposalCounter}`;
67
+ const proposal = {
68
+ id: proposalId,
69
+ proposerId: this.node.id,
70
+ value,
71
+ term: this.node.currentTerm,
72
+ timestamp: new Date(),
73
+ votes: new Map(),
74
+ status: 'pending',
75
+ };
76
+ // Add to local log
77
+ const logEntry = {
78
+ term: this.node.currentTerm,
79
+ index: this.node.log.length + 1,
80
+ command: { proposalId, value },
81
+ timestamp: new Date(),
82
+ };
83
+ this.node.log.push(logEntry);
84
+ this.proposals.set(proposalId, proposal);
85
+ // Leader votes for itself
86
+ proposal.votes.set(this.node.id, {
87
+ voterId: this.node.id,
88
+ approve: true,
89
+ confidence: 1.0,
90
+ timestamp: new Date(),
91
+ });
92
+ // Replicate to followers
93
+ await this.replicateToFollowers(logEntry);
94
+ return proposal;
95
+ }
96
+ async vote(proposalId, vote) {
97
+ const proposal = this.proposals.get(proposalId);
98
+ if (!proposal) {
99
+ throw new Error(`Proposal ${proposalId} not found`);
100
+ }
101
+ if (proposal.status !== 'pending') {
102
+ return;
103
+ }
104
+ proposal.votes.set(vote.voterId, vote);
105
+ // Check if we have consensus
106
+ await this.checkConsensus(proposalId);
107
+ }
108
+ async awaitConsensus(proposalId) {
109
+ const startTime = Date.now();
110
+ return new Promise((resolve, reject) => {
111
+ const checkInterval = setInterval(() => {
112
+ const proposal = this.proposals.get(proposalId);
113
+ if (!proposal) {
114
+ clearInterval(checkInterval);
115
+ reject(new Error(`Proposal ${proposalId} not found`));
116
+ return;
117
+ }
118
+ if (proposal.status !== 'pending') {
119
+ clearInterval(checkInterval);
120
+ resolve(this.createResult(proposal, Date.now() - startTime));
121
+ return;
122
+ }
123
+ if (Date.now() - startTime > (this.config.timeoutMs ?? 30000)) {
124
+ clearInterval(checkInterval);
125
+ proposal.status = 'expired';
126
+ resolve(this.createResult(proposal, Date.now() - startTime));
127
+ }
128
+ }, 10);
129
+ });
130
+ }
131
+ getState() {
132
+ return this.node.state;
133
+ }
134
+ getTerm() {
135
+ return this.node.currentTerm;
136
+ }
137
+ isLeader() {
138
+ return this.node.state === 'leader';
139
+ }
140
+ getLeaderId() {
141
+ if (this.node.state === 'leader') {
142
+ return this.node.id;
143
+ }
144
+ return this.node.votedFor;
145
+ }
146
+ // ===== PRIVATE METHODS =====
147
+ resetElectionTimeout() {
148
+ if (this.electionTimeout) {
149
+ clearTimeout(this.electionTimeout);
150
+ }
151
+ const timeout = this.randomElectionTimeout();
152
+ this.electionTimeout = setTimeout(() => {
153
+ this.startElection();
154
+ }, timeout);
155
+ }
156
+ randomElectionTimeout() {
157
+ const min = this.config.electionTimeoutMinMs ?? 150;
158
+ const max = this.config.electionTimeoutMaxMs ?? 300;
159
+ return Math.floor(Math.random() * (max - min + 1)) + min;
160
+ }
161
+ async startElection() {
162
+ this.node.state = 'candidate';
163
+ this.node.currentTerm++;
164
+ this.node.votedFor = this.node.id;
165
+ this.emit('election.started', {
166
+ term: this.node.currentTerm,
167
+ candidateId: this.node.id
168
+ });
169
+ // Vote for self
170
+ let votesReceived = 1;
171
+ const votesNeeded = Math.floor((this.peers.size + 1) / 2) + 1;
172
+ // Request votes from peers
173
+ for (const [peerId, peer] of this.peers) {
174
+ const granted = await this.requestVote(peerId);
175
+ if (granted) {
176
+ votesReceived++;
177
+ }
178
+ if (votesReceived >= votesNeeded) {
179
+ this.becomeLeader();
180
+ return;
181
+ }
182
+ }
183
+ // Election failed, reset to follower
184
+ this.node.state = 'follower';
185
+ this.resetElectionTimeout();
186
+ }
187
+ async requestVote(peerId) {
188
+ const peer = this.peers.get(peerId);
189
+ if (!peer)
190
+ return false;
191
+ // Simulate vote request (in real implementation, this would be RPC)
192
+ // For now, grant vote if candidate's term is higher
193
+ if (this.node.currentTerm > peer.currentTerm) {
194
+ peer.votedFor = this.node.id;
195
+ peer.currentTerm = this.node.currentTerm;
196
+ return true;
197
+ }
198
+ return false;
199
+ }
200
+ becomeLeader() {
201
+ this.node.state = 'leader';
202
+ if (this.electionTimeout) {
203
+ clearTimeout(this.electionTimeout);
204
+ }
205
+ // Start sending heartbeats
206
+ this.heartbeatInterval = setInterval(() => {
207
+ this.sendHeartbeats();
208
+ }, this.config.heartbeatIntervalMs ?? 50);
209
+ this.emit('leader.elected', {
210
+ term: this.node.currentTerm,
211
+ leaderId: this.node.id
212
+ });
213
+ }
214
+ async sendHeartbeats() {
215
+ for (const [peerId, peer] of this.peers) {
216
+ await this.appendEntries(peerId, []);
217
+ }
218
+ }
219
+ async appendEntries(peerId, entries) {
220
+ const peer = this.peers.get(peerId);
221
+ if (!peer)
222
+ return false;
223
+ // Simulate AppendEntries RPC
224
+ if (this.node.currentTerm >= peer.currentTerm) {
225
+ peer.currentTerm = this.node.currentTerm;
226
+ peer.state = 'follower';
227
+ peer.log.push(...entries);
228
+ return true;
229
+ }
230
+ return false;
231
+ }
232
+ async replicateToFollowers(entry) {
233
+ const replicationPromises = Array.from(this.peers.keys()).map(peerId => this.appendEntries(peerId, [entry]));
234
+ const results = await Promise.allSettled(replicationPromises);
235
+ const successCount = results.filter(r => r.status === 'fulfilled' && r.value).length;
236
+ // Check if majority replicated
237
+ const majority = Math.floor((this.peers.size + 1) / 2) + 1;
238
+ if (successCount + 1 >= majority) {
239
+ this.node.commitIndex = entry.index;
240
+ this.emit('log.committed', { index: entry.index });
241
+ }
242
+ }
243
+ async checkConsensus(proposalId) {
244
+ const proposal = this.proposals.get(proposalId);
245
+ if (!proposal || proposal.status !== 'pending') {
246
+ return;
247
+ }
248
+ const totalVoters = this.peers.size + 1;
249
+ const votesReceived = proposal.votes.size;
250
+ const approvingVotes = Array.from(proposal.votes.values()).filter(v => v.approve).length;
251
+ const threshold = this.config.threshold ?? 0.66;
252
+ const quorum = Math.floor(totalVoters * threshold);
253
+ if (approvingVotes >= quorum) {
254
+ proposal.status = 'accepted';
255
+ this.emit('consensus.achieved', { proposalId, approved: true });
256
+ }
257
+ else if (votesReceived - approvingVotes > totalVoters - quorum) {
258
+ proposal.status = 'rejected';
259
+ this.emit('consensus.achieved', { proposalId, approved: false });
260
+ }
261
+ }
262
+ createResult(proposal, durationMs) {
263
+ const totalVoters = this.peers.size + 1;
264
+ const approvingVotes = Array.from(proposal.votes.values()).filter(v => v.approve).length;
265
+ return {
266
+ proposalId: proposal.id,
267
+ approved: proposal.status === 'accepted',
268
+ approvalRate: proposal.votes.size > 0
269
+ ? approvingVotes / proposal.votes.size
270
+ : 0,
271
+ participationRate: proposal.votes.size / totalVoters,
272
+ finalValue: proposal.value,
273
+ rounds: 1,
274
+ durationMs,
275
+ };
276
+ }
277
+ // Handle vote request from another candidate
278
+ handleVoteRequest(candidateId, term, lastLogIndex, lastLogTerm) {
279
+ if (term < this.node.currentTerm) {
280
+ return false;
281
+ }
282
+ if (term > this.node.currentTerm) {
283
+ this.node.currentTerm = term;
284
+ this.node.state = 'follower';
285
+ this.node.votedFor = undefined;
286
+ }
287
+ if (this.node.votedFor === undefined || this.node.votedFor === candidateId) {
288
+ // Check log is at least as up-to-date
289
+ const lastEntry = this.node.log[this.node.log.length - 1];
290
+ const myLastTerm = lastEntry?.term ?? 0;
291
+ const myLastIndex = lastEntry?.index ?? 0;
292
+ if (lastLogTerm > myLastTerm ||
293
+ (lastLogTerm === myLastTerm && lastLogIndex >= myLastIndex)) {
294
+ this.node.votedFor = candidateId;
295
+ this.resetElectionTimeout();
296
+ return true;
297
+ }
298
+ }
299
+ return false;
300
+ }
301
+ // Handle append entries from leader
302
+ handleAppendEntries(leaderId, term, entries, leaderCommit) {
303
+ if (term < this.node.currentTerm) {
304
+ return false;
305
+ }
306
+ this.resetElectionTimeout();
307
+ if (term > this.node.currentTerm) {
308
+ this.node.currentTerm = term;
309
+ this.node.state = 'follower';
310
+ }
311
+ this.node.votedFor = leaderId;
312
+ // Append entries
313
+ this.node.log.push(...entries);
314
+ // Update commit index
315
+ if (leaderCommit > this.node.commitIndex) {
316
+ this.node.commitIndex = Math.min(leaderCommit, this.node.log.length);
317
+ }
318
+ return true;
319
+ }
320
+ }
321
+ export function createRaftConsensus(nodeId, config) {
322
+ return new RaftConsensus(nodeId, config);
323
+ }
324
+ //# sourceMappingURL=raft.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"raft.js","sourceRoot":"","sources":["../../src/consensus/raft.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * V3 Agent Registry
3
+ * Manages registration, lifecycle, and capabilities of all 15 agents
4
+ *
5
+ * Based on ADR-002 (DDD) and 15-Agent Swarm Architecture
6
+ */
7
+ import { AgentId, AgentDomain, AgentStatus, AgentDefinition, AgentState, TaskType, TaskId, EventHandler } from '../shared/types';
8
+ import { IEventBus } from '../shared/events';
9
+ export interface IAgentRegistry {
10
+ register(definition: AgentDefinition): void;
11
+ unregister(agentId: AgentId): boolean;
12
+ isRegistered(agentId: AgentId): boolean;
13
+ spawn(agentId: AgentId): Promise<AgentState>;
14
+ terminate(agentId: AgentId): Promise<boolean>;
15
+ getState(agentId: AgentId): AgentState | undefined;
16
+ updateStatus(agentId: AgentId, status: AgentStatus): void;
17
+ assignTask(agentId: AgentId, taskId: TaskId): void;
18
+ completeTask(agentId: AgentId, taskId: TaskId): void;
19
+ getDefinition(agentId: AgentId): AgentDefinition | undefined;
20
+ getAllAgents(): AgentDefinition[];
21
+ getActiveAgents(): AgentState[];
22
+ getAgentsByDomain(domain: AgentDomain): AgentDefinition[];
23
+ getAgentsByCapability(taskType: TaskType): AgentDefinition[];
24
+ heartbeat(agentId: AgentId): void;
25
+ getHealthStatus(): Map<AgentId, HealthStatus>;
26
+ onAgentEvent(handler: EventHandler): () => void;
27
+ }
28
+ export interface HealthStatus {
29
+ agentId: AgentId;
30
+ healthy: boolean;
31
+ lastHeartbeat: number;
32
+ consecutiveMisses: number;
33
+ status: AgentStatus;
34
+ }
35
+ export declare class AgentRegistry implements IAgentRegistry {
36
+ private definitions;
37
+ private states;
38
+ private healthChecks;
39
+ private eventBus;
40
+ private healthCheckInterval;
41
+ private healthCheckTimer;
42
+ private maxMissedHeartbeats;
43
+ constructor(eventBus: IEventBus);
44
+ register(definition: AgentDefinition): void;
45
+ unregister(agentId: AgentId): boolean;
46
+ isRegistered(agentId: AgentId): boolean;
47
+ spawn(agentId: AgentId): Promise<AgentState>;
48
+ terminate(agentId: AgentId): Promise<boolean>;
49
+ getState(agentId: AgentId): AgentState | undefined;
50
+ updateStatus(agentId: AgentId, status: AgentStatus): void;
51
+ assignTask(agentId: AgentId, taskId: TaskId): void;
52
+ completeTask(agentId: AgentId, taskId: TaskId): void;
53
+ getDefinition(agentId: AgentId): AgentDefinition | undefined;
54
+ getAllAgents(): AgentDefinition[];
55
+ getActiveAgents(): AgentState[];
56
+ getAgentsByDomain(domain: AgentDomain): AgentDefinition[];
57
+ getAgentsByCapability(taskType: TaskType): AgentDefinition[];
58
+ heartbeat(agentId: AgentId): void;
59
+ getHealthStatus(): Map<AgentId, HealthStatus>;
60
+ startHealthChecks(): void;
61
+ stopHealthChecks(): void;
62
+ private performHealthCheck;
63
+ onAgentEvent(handler: EventHandler): () => void;
64
+ private registerDefaultAgents;
65
+ private createInitialMetrics;
66
+ }
67
+ export declare function createAgentRegistry(eventBus: IEventBus): IAgentRegistry;
68
+ //# sourceMappingURL=agent-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-registry.d.ts","sourceRoot":"","sources":["../../src/coordination/agent-registry.ts"],"names":[],"mappings":"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"}