@claude-flow/swarm 3.0.0-alpha.7 → 3.0.0-alpha.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent-pool.d.ts.map +1 -1
- package/dist/agent-pool.js +10 -2
- package/dist/agent-pool.js.map +1 -1
- package/dist/attention-coordinator.d.ts +5 -4
- package/dist/attention-coordinator.d.ts.map +1 -1
- package/dist/attention-coordinator.js +17 -10
- package/dist/attention-coordinator.js.map +1 -1
- package/dist/consensus/byzantine.d.ts +2 -1
- package/dist/consensus/byzantine.d.ts.map +1 -1
- package/dist/consensus/byzantine.js +34 -8
- package/dist/consensus/byzantine.js.map +1 -1
- package/dist/consensus/gossip.d.ts +2 -1
- package/dist/consensus/gossip.d.ts.map +1 -1
- package/dist/consensus/gossip.js +27 -8
- package/dist/consensus/gossip.js.map +1 -1
- package/dist/consensus/index.d.ts +1 -1
- package/dist/consensus/index.d.ts.map +1 -1
- package/dist/consensus/index.js +2 -2
- package/dist/consensus/index.js.map +1 -1
- package/dist/consensus/raft.d.ts +2 -1
- package/dist/consensus/raft.d.ts.map +1 -1
- package/dist/consensus/raft.js +25 -9
- package/dist/consensus/raft.js.map +1 -1
- package/dist/coordination/agent-registry.d.ts +2 -2
- package/dist/coordination/agent-registry.d.ts.map +1 -1
- package/dist/coordination/agent-registry.js +1 -1
- package/dist/coordination/agent-registry.js.map +1 -1
- package/dist/coordination/swarm-hub.d.ts +5 -5
- package/dist/coordination/swarm-hub.d.ts.map +1 -1
- package/dist/coordination/swarm-hub.js +5 -5
- package/dist/coordination/swarm-hub.js.map +1 -1
- package/dist/coordination/task-orchestrator.d.ts +3 -3
- package/dist/coordination/task-orchestrator.d.ts.map +1 -1
- package/dist/coordination/task-orchestrator.js +1 -1
- package/dist/coordination/task-orchestrator.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/message-bus.d.ts.map +1 -1
- package/dist/message-bus.js +13 -4
- package/dist/message-bus.js.map +1 -1
- package/dist/queen-coordinator.d.ts +1 -1
- package/dist/queen-coordinator.d.ts.map +1 -1
- package/dist/queen-coordinator.js +10 -3
- package/dist/queen-coordinator.js.map +1 -1
- package/dist/topology-manager.d.ts.map +1 -1
- package/dist/topology-manager.js +26 -1
- package/dist/topology-manager.js.map +1 -1
- package/dist/types.d.ts +3 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/unified-coordinator.d.ts +1 -1
- package/dist/unified-coordinator.d.ts.map +1 -1
- package/dist/unified-coordinator.js +85 -29
- package/dist/unified-coordinator.js.map +1 -1
- package/package.json +7 -2
- package/.claude-flow/data/pending-insights.jsonl +0 -12
- package/__tests__/byzantine-transport.test.ts +0 -147
- package/__tests__/consensus-failure-injection.test.ts +0 -161
- package/__tests__/consensus-transport.test.ts +0 -200
- package/__tests__/consensus.test.ts +0 -577
- package/__tests__/coordinator.test.ts +0 -501
- package/__tests__/federation-transport.test.ts +0 -145
- package/__tests__/gossip-transport.test.ts +0 -81
- package/__tests__/queen-coordinator.test.ts +0 -1335
- package/__tests__/raft-transport.test.ts +0 -121
- package/__tests__/topology.test.ts +0 -621
- package/ruvector.db +0 -0
- package/src/agent-pool.ts +0 -476
- package/src/application/commands/create-task.command.ts +0 -124
- package/src/application/commands/spawn-agent.command.ts +0 -122
- package/src/application/index.ts +0 -30
- package/src/application/services/swarm-application-service.ts +0 -200
- package/src/attention-coordinator.ts +0 -1000
- package/src/consensus/byzantine.ts +0 -514
- package/src/consensus/federation-transport.ts +0 -185
- package/src/consensus/gossip.ts +0 -599
- package/src/consensus/index.ts +0 -296
- package/src/consensus/raft.ts +0 -561
- package/src/consensus/transport.ts +0 -284
- package/src/coordination/agent-registry.ts +0 -544
- package/src/coordination/index.ts +0 -23
- package/src/coordination/swarm-hub.ts +0 -776
- package/src/coordination/task-orchestrator.ts +0 -605
- package/src/domain/entities/agent.d.ts +0 -151
- package/src/domain/entities/agent.d.ts.map +0 -1
- package/src/domain/entities/agent.js +0 -280
- package/src/domain/entities/agent.js.map +0 -1
- package/src/domain/entities/agent.ts +0 -370
- package/src/domain/entities/task.d.ts +0 -133
- package/src/domain/entities/task.d.ts.map +0 -1
- package/src/domain/entities/task.js +0 -261
- package/src/domain/entities/task.js.map +0 -1
- package/src/domain/entities/task.ts +0 -319
- package/src/domain/index.ts +0 -41
- package/src/domain/repositories/agent-repository.interface.d.ts +0 -57
- package/src/domain/repositories/agent-repository.interface.d.ts.map +0 -1
- package/src/domain/repositories/agent-repository.interface.js +0 -9
- package/src/domain/repositories/agent-repository.interface.js.map +0 -1
- package/src/domain/repositories/agent-repository.interface.ts +0 -69
- package/src/domain/repositories/task-repository.interface.d.ts +0 -61
- package/src/domain/repositories/task-repository.interface.d.ts.map +0 -1
- package/src/domain/repositories/task-repository.interface.js +0 -9
- package/src/domain/repositories/task-repository.interface.js.map +0 -1
- package/src/domain/repositories/task-repository.interface.ts +0 -75
- package/src/domain/services/coordination-service.ts +0 -320
- package/src/federation-hub.d.ts +0 -284
- package/src/federation-hub.d.ts.map +0 -1
- package/src/federation-hub.js +0 -692
- package/src/federation-hub.js.map +0 -1
- package/src/federation-hub.ts +0 -979
- package/src/index.ts +0 -348
- package/src/message-bus.ts +0 -607
- package/src/queen-coordinator.ts +0 -2025
- package/src/shared/events.ts +0 -285
- package/src/shared/types.ts +0 -389
- package/src/topology-manager.ts +0 -656
- package/src/types.ts +0 -545
- package/src/unified-coordinator.ts +0 -1844
- package/src/workers/index.ts +0 -65
- package/src/workers/worker-dispatch.d.ts +0 -234
- package/src/workers/worker-dispatch.d.ts.map +0 -1
- package/src/workers/worker-dispatch.js +0 -842
- package/src/workers/worker-dispatch.js.map +0 -1
- package/src/workers/worker-dispatch.ts +0 -1076
- package/tmp.json +0 -0
- package/tsconfig.json +0 -9
- package/tsconfig.tsbuildinfo +0 -1
- package/vitest.config.ts +0 -20
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ADR-095 G2 — RaftConsensus + ConsensusTransport wiring.
|
|
3
|
-
*
|
|
4
|
-
* Verifies the real RequestVote / AppendEntries RPCs over a transport,
|
|
5
|
-
* with proper Raft receiver rules (term comparison, vote-once-per-term,
|
|
6
|
-
* log-up-to-date check). Legacy no-transport behavior is covered by the
|
|
7
|
-
* existing consensus.test.ts.
|
|
8
|
-
*/
|
|
9
|
-
import { describe, it, expect } from 'vitest';
|
|
10
|
-
import { RaftConsensus } from '../src/consensus/raft.js';
|
|
11
|
-
import { LocalTransport, LocalTransportRegistry } from '../src/consensus/transport.js';
|
|
12
|
-
|
|
13
|
-
/** Build N raft nodes wired to a shared registry, each knowing the others as peers. */
|
|
14
|
-
function buildCluster(ids: string[]): { nodes: Map<string, RaftConsensus>; transports: LocalTransport[]; reg: LocalTransportRegistry } {
|
|
15
|
-
const reg = new LocalTransportRegistry();
|
|
16
|
-
const transports: LocalTransport[] = [];
|
|
17
|
-
const nodes = new Map<string, RaftConsensus>();
|
|
18
|
-
for (const id of ids) {
|
|
19
|
-
const t = new LocalTransport(id, { registry: reg });
|
|
20
|
-
transports.push(t);
|
|
21
|
-
const r = new RaftConsensus(id, { transport: t });
|
|
22
|
-
for (const other of ids) if (other !== id) r.addPeer(other);
|
|
23
|
-
nodes.set(id, r);
|
|
24
|
-
}
|
|
25
|
-
return { nodes, transports, reg };
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
describe('ADR-095 G2 — Raft RequestVote over transport', () => {
|
|
29
|
-
it('a peer grants a vote to a candidate with an up-to-date log', async () => {
|
|
30
|
-
const { nodes, transports } = buildCluster(['a', 'b']);
|
|
31
|
-
const candidate = nodes.get('a')!;
|
|
32
|
-
// Drive an election from `a`. It bumps its term and sends RequestVote to `b`.
|
|
33
|
-
// We call the (public) consensus path indirectly — but the simplest way to
|
|
34
|
-
// exercise requestVote is to reach it via startElection. Since that's private,
|
|
35
|
-
// we instead poke the transport directly the way the candidate would:
|
|
36
|
-
const reply = await transports[0].send('b', {
|
|
37
|
-
type: 'request-vote',
|
|
38
|
-
payload: { term: 1, candidateId: 'a', lastLogIndex: 0, lastLogTerm: 0 },
|
|
39
|
-
term: 1,
|
|
40
|
-
});
|
|
41
|
-
expect(reply).not.toBeNull();
|
|
42
|
-
expect(reply!.type).toBe('vote-response');
|
|
43
|
-
const rp = reply!.payload as { term: number; granted: boolean };
|
|
44
|
-
expect(rp.granted).toBe(true);
|
|
45
|
-
expect(rp.term).toBe(1);
|
|
46
|
-
// `b` recorded its vote for `a` this term — a second different candidate is denied.
|
|
47
|
-
const reply2 = await transports[0].send('b', {
|
|
48
|
-
type: 'request-vote',
|
|
49
|
-
payload: { term: 1, candidateId: 'c', lastLogIndex: 0, lastLogTerm: 0 },
|
|
50
|
-
term: 1,
|
|
51
|
-
});
|
|
52
|
-
expect((reply2!.payload as { granted: boolean }).granted).toBe(false);
|
|
53
|
-
await Promise.all([nodes.get('a')!.shutdown(), nodes.get('b')!.shutdown(), ...transports.map(t => t.close())]);
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
it('a peer denies a vote to a stale-term candidate', async () => {
|
|
57
|
-
const { nodes, transports } = buildCluster(['a', 'b']);
|
|
58
|
-
// First, push `b` to term 5 via an AppendEntries from a "term-5 leader".
|
|
59
|
-
await transports[0].send('b', {
|
|
60
|
-
type: 'append-entries',
|
|
61
|
-
payload: { term: 5, leaderId: 'a', entries: [], leaderCommit: 0 },
|
|
62
|
-
term: 5,
|
|
63
|
-
});
|
|
64
|
-
// Now a candidate at term 2 (stale) asks `b` for a vote → denied.
|
|
65
|
-
const reply = await transports[0].send('b', {
|
|
66
|
-
type: 'request-vote',
|
|
67
|
-
payload: { term: 2, candidateId: 'a', lastLogIndex: 0, lastLogTerm: 0 },
|
|
68
|
-
term: 2,
|
|
69
|
-
});
|
|
70
|
-
expect((reply!.payload as { granted: boolean }).granted).toBe(false);
|
|
71
|
-
expect((reply!.payload as { term: number }).term).toBe(5);
|
|
72
|
-
await Promise.all([nodes.get('a')!.shutdown(), nodes.get('b')!.shutdown(), ...transports.map(t => t.close())]);
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
it('a peer denies a vote to a candidate with a behind log', async () => {
|
|
76
|
-
const { nodes, transports } = buildCluster(['a', 'b']);
|
|
77
|
-
// Give `b` a log entry at term 3, index 1 via an AppendEntries.
|
|
78
|
-
await transports[0].send('b', {
|
|
79
|
-
type: 'append-entries',
|
|
80
|
-
payload: { term: 3, leaderId: 'a', entries: [{ term: 3, index: 1, command: { v: 1 }, timestamp: new Date().toISOString() }], leaderCommit: 1 },
|
|
81
|
-
term: 3,
|
|
82
|
-
});
|
|
83
|
-
// Candidate at term 4 but with an empty log (lastLogTerm 0 < b's 3) → denied.
|
|
84
|
-
const reply = await transports[0].send('b', {
|
|
85
|
-
type: 'request-vote',
|
|
86
|
-
payload: { term: 4, candidateId: 'a', lastLogIndex: 0, lastLogTerm: 0 },
|
|
87
|
-
term: 4,
|
|
88
|
-
});
|
|
89
|
-
expect((reply!.payload as { granted: boolean }).granted).toBe(false);
|
|
90
|
-
await Promise.all([nodes.get('a')!.shutdown(), nodes.get('b')!.shutdown(), ...transports.map(t => t.close())]);
|
|
91
|
-
});
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
describe('ADR-095 G2 — Raft AppendEntries over transport', () => {
|
|
95
|
-
it('a follower accepts a valid AppendEntries and updates commitIndex', async () => {
|
|
96
|
-
const { nodes, transports } = buildCluster(['leader', 'follower']);
|
|
97
|
-
const reply = await transports[0].send('follower', {
|
|
98
|
-
type: 'append-entries',
|
|
99
|
-
payload: {
|
|
100
|
-
term: 2, leaderId: 'leader', leaderCommit: 1,
|
|
101
|
-
entries: [{ term: 2, index: 1, command: { op: 'set', k: 'x', v: 1 }, timestamp: new Date().toISOString() }],
|
|
102
|
-
},
|
|
103
|
-
term: 2,
|
|
104
|
-
});
|
|
105
|
-
expect(reply!.type).toBe('append-entries-response');
|
|
106
|
-
expect((reply!.payload as { success: boolean }).success).toBe(true);
|
|
107
|
-
expect((reply!.payload as { term: number }).term).toBe(2);
|
|
108
|
-
await Promise.all([nodes.get('leader')!.shutdown(), nodes.get('follower')!.shutdown(), ...transports.map(t => t.close())]);
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
it('a follower rejects a stale-term AppendEntries', async () => {
|
|
112
|
-
const { nodes, transports } = buildCluster(['leader', 'follower']);
|
|
113
|
-
// Bump follower to term 7.
|
|
114
|
-
await transports[0].send('follower', { type: 'append-entries', payload: { term: 7, leaderId: 'leader', entries: [], leaderCommit: 0 }, term: 7 });
|
|
115
|
-
// Stale leader at term 3 → rejected, follower reports its term.
|
|
116
|
-
const reply = await transports[0].send('follower', { type: 'append-entries', payload: { term: 3, leaderId: 'leader', entries: [], leaderCommit: 0 }, term: 3 });
|
|
117
|
-
expect((reply!.payload as { success: boolean }).success).toBe(false);
|
|
118
|
-
expect((reply!.payload as { term: number }).term).toBe(7);
|
|
119
|
-
await Promise.all([nodes.get('leader')!.shutdown(), nodes.get('follower')!.shutdown(), ...transports.map(t => t.close())]);
|
|
120
|
-
});
|
|
121
|
-
});
|