@cogitator-ai/swarms 0.1.0
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/LICENSE +21 -0
- package/README.md +90 -0
- package/dist/communication/blackboard.d.ts +24 -0
- package/dist/communication/blackboard.d.ts.map +1 -0
- package/dist/communication/blackboard.js +135 -0
- package/dist/communication/blackboard.js.map +1 -0
- package/dist/communication/event-emitter.d.ts +20 -0
- package/dist/communication/event-emitter.d.ts.map +1 -0
- package/dist/communication/event-emitter.js +87 -0
- package/dist/communication/event-emitter.js.map +1 -0
- package/dist/communication/index.d.ts +7 -0
- package/dist/communication/index.d.ts.map +1 -0
- package/dist/communication/index.js +7 -0
- package/dist/communication/index.js.map +1 -0
- package/dist/communication/message-bus.d.ts +23 -0
- package/dist/communication/message-bus.d.ts.map +1 -0
- package/dist/communication/message-bus.js +128 -0
- package/dist/communication/message-bus.js.map +1 -0
- package/dist/coordinator.d.ts +44 -0
- package/dist/coordinator.d.ts.map +1 -0
- package/dist/coordinator.js +283 -0
- package/dist/coordinator.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/resources/circuit-breaker.d.ts +29 -0
- package/dist/resources/circuit-breaker.d.ts.map +1 -0
- package/dist/resources/circuit-breaker.js +82 -0
- package/dist/resources/circuit-breaker.js.map +1 -0
- package/dist/resources/index.d.ts +7 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +6 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/tracker.d.ts +30 -0
- package/dist/resources/tracker.d.ts.map +1 -0
- package/dist/resources/tracker.js +84 -0
- package/dist/resources/tracker.js.map +1 -0
- package/dist/strategies/auction.d.ts +17 -0
- package/dist/strategies/auction.d.ts.map +1 -0
- package/dist/strategies/auction.js +204 -0
- package/dist/strategies/auction.js.map +1 -0
- package/dist/strategies/base.d.ts +34 -0
- package/dist/strategies/base.d.ts.map +1 -0
- package/dist/strategies/base.js +74 -0
- package/dist/strategies/base.js.map +1 -0
- package/dist/strategies/consensus.d.ts +20 -0
- package/dist/strategies/consensus.d.ts.map +1 -0
- package/dist/strategies/consensus.js +328 -0
- package/dist/strategies/consensus.js.map +1 -0
- package/dist/strategies/debate.d.ts +15 -0
- package/dist/strategies/debate.d.ts.map +1 -0
- package/dist/strategies/debate.js +171 -0
- package/dist/strategies/debate.js.map +1 -0
- package/dist/strategies/hierarchical.d.ts +13 -0
- package/dist/strategies/hierarchical.d.ts.map +1 -0
- package/dist/strategies/hierarchical.js +86 -0
- package/dist/strategies/hierarchical.js.map +1 -0
- package/dist/strategies/index.d.ts +28 -0
- package/dist/strategies/index.d.ts.map +1 -0
- package/dist/strategies/index.js +106 -0
- package/dist/strategies/index.js.map +1 -0
- package/dist/strategies/pipeline.d.ts +16 -0
- package/dist/strategies/pipeline.d.ts.map +1 -0
- package/dist/strategies/pipeline.js +180 -0
- package/dist/strategies/pipeline.js.map +1 -0
- package/dist/strategies/round-robin.d.ts +27 -0
- package/dist/strategies/round-robin.d.ts.map +1 -0
- package/dist/strategies/round-robin.js +98 -0
- package/dist/strategies/round-robin.js.map +1 -0
- package/dist/swarm.d.ts +113 -0
- package/dist/swarm.d.ts.map +1 -0
- package/dist/swarm.js +280 -0
- package/dist/swarm.js.map +1 -0
- package/dist/tools/blackboard.d.ts +71 -0
- package/dist/tools/blackboard.d.ts.map +1 -0
- package/dist/tools/blackboard.js +149 -0
- package/dist/tools/blackboard.js.map +1 -0
- package/dist/tools/delegation.d.ts +120 -0
- package/dist/tools/delegation.d.ts.map +1 -0
- package/dist/tools/delegation.js +257 -0
- package/dist/tools/delegation.js.map +1 -0
- package/dist/tools/index.d.ts +26 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +65 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/messaging.d.ts +73 -0
- package/dist/tools/messaging.d.ts.map +1 -0
- package/dist/tools/messaging.js +146 -0
- package/dist/tools/messaging.js.map +1 -0
- package/dist/tools/voting.d.ts +110 -0
- package/dist/tools/voting.d.ts.map +1 -0
- package/dist/tools/voting.js +201 -0
- package/dist/tools/voting.js.map +1 -0
- package/dist/workflow/swarm-node.d.ts +43 -0
- package/dist/workflow/swarm-node.d.ts.map +1 -0
- package/dist/workflow/swarm-node.js +111 -0
- package/dist/workflow/swarm-node.js.map +1 -0
- package/package.json +45 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Cogitator Contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# @cogitator-ai/swarms
|
|
2
|
+
|
|
3
|
+
Multi-agent swarm coordination for Cogitator. Orchestrate teams of AI agents with various collaboration strategies.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm add @cogitator-ai/swarms
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
### Hierarchical Swarm
|
|
14
|
+
|
|
15
|
+
Supervisor delegates tasks to workers:
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
import { Swarm, SwarmBuilder } from '@cogitator-ai/swarms';
|
|
19
|
+
|
|
20
|
+
const swarm = new SwarmBuilder('dev-team')
|
|
21
|
+
.strategy('hierarchical')
|
|
22
|
+
.supervisor(techLeadAgent)
|
|
23
|
+
.workers([coderAgent, testerAgent, reviewerAgent])
|
|
24
|
+
.build();
|
|
25
|
+
|
|
26
|
+
const result = await swarm.run(cogitator, {
|
|
27
|
+
input: 'Build a REST API for user management',
|
|
28
|
+
});
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Debate Swarm
|
|
32
|
+
|
|
33
|
+
Multiple perspectives with synthesis:
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
const swarm = new SwarmBuilder('analysis-team')
|
|
37
|
+
.strategy('debate')
|
|
38
|
+
.agents([optimistAgent, skepticAgent, pragmatistAgent])
|
|
39
|
+
.config({
|
|
40
|
+
rounds: 3,
|
|
41
|
+
moderator: moderatorAgent,
|
|
42
|
+
})
|
|
43
|
+
.build();
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Pipeline Swarm
|
|
47
|
+
|
|
48
|
+
Sequential processing stages:
|
|
49
|
+
|
|
50
|
+
```typescript
|
|
51
|
+
const swarm = new SwarmBuilder('content-pipeline')
|
|
52
|
+
.strategy('pipeline')
|
|
53
|
+
.stages([
|
|
54
|
+
{ agent: ideationAgent, name: 'ideation' },
|
|
55
|
+
{ agent: writerAgent, name: 'writing' },
|
|
56
|
+
{ agent: editorAgent, name: 'editing' },
|
|
57
|
+
])
|
|
58
|
+
.build();
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Communication
|
|
62
|
+
|
|
63
|
+
Agents can communicate via message bus and shared blackboard:
|
|
64
|
+
|
|
65
|
+
```typescript
|
|
66
|
+
const swarm = new SwarmBuilder('research-team')
|
|
67
|
+
.strategy('hierarchical')
|
|
68
|
+
.supervisor(supervisorAgent)
|
|
69
|
+
.workers([researcher1, researcher2])
|
|
70
|
+
.blackboard({ enabled: true, sections: { findings: [] } })
|
|
71
|
+
.messageBus({ enabled: true })
|
|
72
|
+
.build();
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Available Strategies
|
|
76
|
+
|
|
77
|
+
- **hierarchical** - Supervisor-worker delegation
|
|
78
|
+
- **round-robin** - Load-balanced rotation
|
|
79
|
+
- **consensus** - Voting-based decisions
|
|
80
|
+
- **pipeline** - Sequential stages
|
|
81
|
+
- **debate** - Advocate vs critic with synthesis
|
|
82
|
+
- **auction** - Bidding for task assignment
|
|
83
|
+
|
|
84
|
+
## Documentation
|
|
85
|
+
|
|
86
|
+
See the [Cogitator documentation](https://github.com/eL1fe/cogitator) for full API reference.
|
|
87
|
+
|
|
88
|
+
## License
|
|
89
|
+
|
|
90
|
+
MIT
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Blackboard for shared state between agents
|
|
3
|
+
*/
|
|
4
|
+
import type { Blackboard, BlackboardConfig, BlackboardSection, BlackboardHistoryEntry } from '@cogitator-ai/types';
|
|
5
|
+
export declare class InMemoryBlackboard implements Blackboard {
|
|
6
|
+
private sections;
|
|
7
|
+
private history;
|
|
8
|
+
private subscriptions;
|
|
9
|
+
private config;
|
|
10
|
+
constructor(config: BlackboardConfig);
|
|
11
|
+
read<T = unknown>(section: string): T;
|
|
12
|
+
write<T>(section: string, data: T, agentName: string): void;
|
|
13
|
+
append<T>(section: string, item: T, agentName: string): void;
|
|
14
|
+
has(section: string): boolean;
|
|
15
|
+
delete(section: string): void;
|
|
16
|
+
subscribe(section: string, handler: (data: unknown, agentName: string) => void): () => void;
|
|
17
|
+
getSections(): string[];
|
|
18
|
+
getSection<T = unknown>(section: string): BlackboardSection<T> | undefined;
|
|
19
|
+
getHistory(section: string): BlackboardHistoryEntry[];
|
|
20
|
+
clear(): void;
|
|
21
|
+
private notifySubscribers;
|
|
22
|
+
}
|
|
23
|
+
export declare function createBlackboard(config?: Partial<BlackboardConfig>): Blackboard;
|
|
24
|
+
//# sourceMappingURL=blackboard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blackboard.d.ts","sourceRoot":"","sources":["../../src/communication/blackboard.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,sBAAsB,EACvB,MAAM,qBAAqB,CAAC;AAE7B,qBAAa,kBAAmB,YAAW,UAAU;IACnD,OAAO,CAAC,QAAQ,CAAwC;IACxD,OAAO,CAAC,OAAO,CAA+C;IAC9D,OAAO,CAAC,aAAa,CAAsE;IAC3F,OAAO,CAAC,MAAM,CAAmB;gBAErB,MAAM,EAAE,gBAAgB;IAyBpC,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,CAAC;IAQrC,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAkC3D,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAgB5D,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAI7B,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAM7B,SAAS,CACP,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,GAClD,MAAM,IAAI;IAiBb,WAAW,IAAI,MAAM,EAAE;IAIvB,UAAU,CAAC,CAAC,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,iBAAiB,CAAC,CAAC,CAAC,GAAG,SAAS;IAI1E,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,sBAAsB,EAAE;IAIrD,KAAK,IAAI,IAAI;IAKb,OAAO,CAAC,iBAAiB;CAW1B;AAED,wBAAgB,gBAAgB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,UAAU,CAO/E"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Blackboard for shared state between agents
|
|
3
|
+
*/
|
|
4
|
+
export class InMemoryBlackboard {
|
|
5
|
+
sections = new Map();
|
|
6
|
+
history = new Map();
|
|
7
|
+
subscriptions = new Map();
|
|
8
|
+
config;
|
|
9
|
+
constructor(config) {
|
|
10
|
+
this.config = config;
|
|
11
|
+
for (const [name, initialData] of Object.entries(config.sections)) {
|
|
12
|
+
this.sections.set(name, {
|
|
13
|
+
name,
|
|
14
|
+
data: initialData,
|
|
15
|
+
lastModified: Date.now(),
|
|
16
|
+
modifiedBy: 'system',
|
|
17
|
+
version: 1,
|
|
18
|
+
});
|
|
19
|
+
if (config.trackHistory) {
|
|
20
|
+
this.history.set(name, [
|
|
21
|
+
{
|
|
22
|
+
value: initialData,
|
|
23
|
+
writtenBy: 'system',
|
|
24
|
+
timestamp: Date.now(),
|
|
25
|
+
version: 1,
|
|
26
|
+
},
|
|
27
|
+
]);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
read(section) {
|
|
32
|
+
const sec = this.sections.get(section);
|
|
33
|
+
if (!sec) {
|
|
34
|
+
throw new Error(`Blackboard section '${section}' not found`);
|
|
35
|
+
}
|
|
36
|
+
return sec.data;
|
|
37
|
+
}
|
|
38
|
+
write(section, data, agentName) {
|
|
39
|
+
if (!this.config.enabled) {
|
|
40
|
+
throw new Error('Blackboard is not enabled');
|
|
41
|
+
}
|
|
42
|
+
const existing = this.sections.get(section);
|
|
43
|
+
const version = existing ? existing.version + 1 : 1;
|
|
44
|
+
const timestamp = Date.now();
|
|
45
|
+
const newSection = {
|
|
46
|
+
name: section,
|
|
47
|
+
data,
|
|
48
|
+
lastModified: timestamp,
|
|
49
|
+
modifiedBy: agentName,
|
|
50
|
+
version,
|
|
51
|
+
};
|
|
52
|
+
this.sections.set(section, newSection);
|
|
53
|
+
if (this.config.trackHistory) {
|
|
54
|
+
if (!this.history.has(section)) {
|
|
55
|
+
this.history.set(section, []);
|
|
56
|
+
}
|
|
57
|
+
this.history.get(section).push({
|
|
58
|
+
value: data,
|
|
59
|
+
writtenBy: agentName,
|
|
60
|
+
timestamp,
|
|
61
|
+
version,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
this.notifySubscribers(section, data, agentName);
|
|
65
|
+
}
|
|
66
|
+
append(section, item, agentName) {
|
|
67
|
+
const current = this.sections.get(section);
|
|
68
|
+
if (!current) {
|
|
69
|
+
this.write(section, [item], agentName);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
if (!Array.isArray(current.data)) {
|
|
73
|
+
throw new Error(`Section '${section}' is not an array, cannot append`);
|
|
74
|
+
}
|
|
75
|
+
const newData = [...current.data, item];
|
|
76
|
+
this.write(section, newData, agentName);
|
|
77
|
+
}
|
|
78
|
+
has(section) {
|
|
79
|
+
return this.sections.has(section);
|
|
80
|
+
}
|
|
81
|
+
delete(section) {
|
|
82
|
+
this.sections.delete(section);
|
|
83
|
+
this.history.delete(section);
|
|
84
|
+
this.subscriptions.delete(section);
|
|
85
|
+
}
|
|
86
|
+
subscribe(section, handler) {
|
|
87
|
+
if (!this.subscriptions.has(section)) {
|
|
88
|
+
this.subscriptions.set(section, new Set());
|
|
89
|
+
}
|
|
90
|
+
this.subscriptions.get(section).add(handler);
|
|
91
|
+
return () => {
|
|
92
|
+
const handlers = this.subscriptions.get(section);
|
|
93
|
+
if (handlers) {
|
|
94
|
+
handlers.delete(handler);
|
|
95
|
+
if (handlers.size === 0) {
|
|
96
|
+
this.subscriptions.delete(section);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
getSections() {
|
|
102
|
+
return Array.from(this.sections.keys());
|
|
103
|
+
}
|
|
104
|
+
getSection(section) {
|
|
105
|
+
return this.sections.get(section);
|
|
106
|
+
}
|
|
107
|
+
getHistory(section) {
|
|
108
|
+
return this.history.get(section) ?? [];
|
|
109
|
+
}
|
|
110
|
+
clear() {
|
|
111
|
+
this.sections.clear();
|
|
112
|
+
this.history.clear();
|
|
113
|
+
}
|
|
114
|
+
notifySubscribers(section, data, agentName) {
|
|
115
|
+
const handlers = this.subscriptions.get(section);
|
|
116
|
+
if (handlers) {
|
|
117
|
+
for (const handler of handlers) {
|
|
118
|
+
try {
|
|
119
|
+
handler(data, agentName);
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
export function createBlackboard(config) {
|
|
128
|
+
return new InMemoryBlackboard({
|
|
129
|
+
enabled: true,
|
|
130
|
+
sections: {},
|
|
131
|
+
trackHistory: false,
|
|
132
|
+
...config,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=blackboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blackboard.js","sourceRoot":"","sources":["../../src/communication/blackboard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event emitter for swarm coordination
|
|
3
|
+
*/
|
|
4
|
+
import type { SwarmEventEmitter, SwarmEventType, SwarmEvent, SwarmEventHandler } from '@cogitator-ai/types';
|
|
5
|
+
export declare class SwarmEventEmitterImpl implements SwarmEventEmitter {
|
|
6
|
+
private handlers;
|
|
7
|
+
private events;
|
|
8
|
+
private maxEvents;
|
|
9
|
+
constructor(maxEvents?: number);
|
|
10
|
+
on(event: SwarmEventType | '*', handler: SwarmEventHandler): () => void;
|
|
11
|
+
once(event: SwarmEventType, handler: SwarmEventHandler): () => void;
|
|
12
|
+
emit(event: SwarmEventType, data?: unknown, agentName?: string): void;
|
|
13
|
+
off(event: SwarmEventType | '*', handler: SwarmEventHandler): void;
|
|
14
|
+
removeAllListeners(event?: SwarmEventType): void;
|
|
15
|
+
getEvents(): SwarmEvent[];
|
|
16
|
+
getEventsByType(type: SwarmEventType): SwarmEvent[];
|
|
17
|
+
getEventsByAgent(agentName: string): SwarmEvent[];
|
|
18
|
+
clearEvents(): void;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=event-emitter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-emitter.d.ts","sourceRoot":"","sources":["../../src/communication/event-emitter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,cAAc,EACd,UAAU,EACV,iBAAiB,EAClB,MAAM,qBAAqB,CAAC;AAE7B,qBAAa,qBAAsB,YAAW,iBAAiB;IAC7D,OAAO,CAAC,QAAQ,CAA2D;IAC3E,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,SAAS,CAAS;gBAEd,SAAS,SAAO;IAI5B,EAAE,CAAC,KAAK,EAAE,cAAc,GAAG,GAAG,EAAE,OAAO,EAAE,iBAAiB,GAAG,MAAM,IAAI;IASvE,IAAI,CAAC,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,iBAAiB,GAAG,MAAM,IAAI;IAQnE,IAAI,CAAC,KAAK,EAAE,cAAc,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI;IAmCrE,GAAG,CAAC,KAAK,EAAE,cAAc,GAAG,GAAG,EAAE,OAAO,EAAE,iBAAiB,GAAG,IAAI;IAUlE,kBAAkB,CAAC,KAAK,CAAC,EAAE,cAAc,GAAG,IAAI;IAQhD,SAAS,IAAI,UAAU,EAAE;IAIzB,eAAe,CAAC,IAAI,EAAE,cAAc,GAAG,UAAU,EAAE;IAInD,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,EAAE;IAIjD,WAAW,IAAI,IAAI;CAGpB"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event emitter for swarm coordination
|
|
3
|
+
*/
|
|
4
|
+
export class SwarmEventEmitterImpl {
|
|
5
|
+
handlers = new Map();
|
|
6
|
+
events = [];
|
|
7
|
+
maxEvents;
|
|
8
|
+
constructor(maxEvents = 1000) {
|
|
9
|
+
this.maxEvents = maxEvents;
|
|
10
|
+
}
|
|
11
|
+
on(event, handler) {
|
|
12
|
+
if (!this.handlers.has(event)) {
|
|
13
|
+
this.handlers.set(event, new Set());
|
|
14
|
+
}
|
|
15
|
+
this.handlers.get(event).add(handler);
|
|
16
|
+
return () => this.off(event, handler);
|
|
17
|
+
}
|
|
18
|
+
once(event, handler) {
|
|
19
|
+
const wrapper = (e) => {
|
|
20
|
+
this.off(event, wrapper);
|
|
21
|
+
handler(e);
|
|
22
|
+
};
|
|
23
|
+
return this.on(event, wrapper);
|
|
24
|
+
}
|
|
25
|
+
emit(event, data, agentName) {
|
|
26
|
+
const swarmEvent = {
|
|
27
|
+
type: event,
|
|
28
|
+
timestamp: Date.now(),
|
|
29
|
+
agentName,
|
|
30
|
+
data,
|
|
31
|
+
};
|
|
32
|
+
this.events.push(swarmEvent);
|
|
33
|
+
if (this.events.length > this.maxEvents) {
|
|
34
|
+
this.events = this.events.slice(-this.maxEvents);
|
|
35
|
+
}
|
|
36
|
+
const handlers = this.handlers.get(event);
|
|
37
|
+
if (handlers) {
|
|
38
|
+
for (const handler of handlers) {
|
|
39
|
+
try {
|
|
40
|
+
handler(swarmEvent);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const wildcardHandlers = this.handlers.get('*');
|
|
47
|
+
if (wildcardHandlers) {
|
|
48
|
+
for (const handler of wildcardHandlers) {
|
|
49
|
+
try {
|
|
50
|
+
handler(swarmEvent);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
off(event, handler) {
|
|
58
|
+
const handlers = this.handlers.get(event);
|
|
59
|
+
if (handlers) {
|
|
60
|
+
handlers.delete(handler);
|
|
61
|
+
if (handlers.size === 0) {
|
|
62
|
+
this.handlers.delete(event);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
removeAllListeners(event) {
|
|
67
|
+
if (event) {
|
|
68
|
+
this.handlers.delete(event);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
this.handlers.clear();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
getEvents() {
|
|
75
|
+
return [...this.events];
|
|
76
|
+
}
|
|
77
|
+
getEventsByType(type) {
|
|
78
|
+
return this.events.filter((e) => e.type === type);
|
|
79
|
+
}
|
|
80
|
+
getEventsByAgent(agentName) {
|
|
81
|
+
return this.events.filter((e) => e.agentName === agentName);
|
|
82
|
+
}
|
|
83
|
+
clearEvents() {
|
|
84
|
+
this.events = [];
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=event-emitter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-emitter.js","sourceRoot":"","sources":["../../src/communication/event-emitter.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,MAAM,OAAO,qBAAqB;IACxB,QAAQ,GAAG,IAAI,GAAG,EAAgD,CAAC;IACnE,MAAM,GAAiB,EAAE,CAAC;IAC1B,SAAS,CAAS;IAE1B,YAAY,SAAS,GAAG,IAAI;QAC1B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,EAAE,CAAC,KAA2B,EAAE,OAA0B;QACxD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QACtC,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAEvC,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,CAAC,KAAqB,EAAE,OAA0B;QACpD,MAAM,OAAO,GAAsB,CAAC,CAAC,EAAE,EAAE;YACvC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YACzB,OAAO,CAAC,CAAC,CAAC,CAAC;QACb,CAAC,CAAC;QACF,OAAO,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACjC,CAAC;IAED,IAAI,CAAC,KAAqB,EAAE,IAAc,EAAE,SAAkB;QAC5D,MAAM,UAAU,GAAe;YAC7B,IAAI,EAAE,KAAK;YACX,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,SAAS;YACT,IAAI;SACL,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAE7B,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YACxC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACnD,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,QAAQ,EAAE,CAAC;YACb,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,IAAI,CAAC;oBACH,OAAO,CAAC,UAAU,CAAC,CAAC;gBACtB,CAAC;gBAAC,MAAM,CAAC;gBACT,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChD,IAAI,gBAAgB,EAAE,CAAC;YACrB,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;gBACvC,IAAI,CAAC;oBACH,OAAO,CAAC,UAAU,CAAC,CAAC;gBACtB,CAAC;gBAAC,MAAM,CAAC;gBACT,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,GAAG,CAAC,KAA2B,EAAE,OAA0B;QACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACzB,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACxB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;IAED,kBAAkB,CAAC,KAAsB;QACvC,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;IAED,SAAS;QACP,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IAED,eAAe,CAAC,IAAoB;QAClC,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACpD,CAAC;IAED,gBAAgB,CAAC,SAAiB;QAChC,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;IAC9D,CAAC;IAED,WAAW;QACT,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;IACnB,CAAC;CACF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Communication primitives for swarm coordination
|
|
3
|
+
*/
|
|
4
|
+
export { SwarmEventEmitterImpl } from './event-emitter';
|
|
5
|
+
export { InMemoryMessageBus, createMessageBus } from './message-bus';
|
|
6
|
+
export { InMemoryBlackboard, createBlackboard } from './blackboard';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/communication/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Communication primitives for swarm coordination
|
|
3
|
+
*/
|
|
4
|
+
export { SwarmEventEmitterImpl } from './event-emitter';
|
|
5
|
+
export { InMemoryMessageBus, createMessageBus } from './message-bus';
|
|
6
|
+
export { InMemoryBlackboard, createBlackboard } from './blackboard';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/communication/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Message bus for agent-to-agent communication
|
|
3
|
+
*/
|
|
4
|
+
import type { MessageBus, MessageBusConfig, SwarmMessage } from '@cogitator-ai/types';
|
|
5
|
+
export declare class InMemoryMessageBus implements MessageBus {
|
|
6
|
+
private messages;
|
|
7
|
+
private subscriptions;
|
|
8
|
+
private config;
|
|
9
|
+
private agentMessageCounts;
|
|
10
|
+
constructor(config: MessageBusConfig);
|
|
11
|
+
send(message: Omit<SwarmMessage, 'id' | 'timestamp'>): Promise<SwarmMessage>;
|
|
12
|
+
broadcast(from: string, content: string, channel?: string): Promise<void>;
|
|
13
|
+
subscribe(agentName: string, handler: (msg: SwarmMessage) => void): () => void;
|
|
14
|
+
getMessages(agentName: string, limit?: number): SwarmMessage[];
|
|
15
|
+
getConversation(agent1: string, agent2: string): SwarmMessage[];
|
|
16
|
+
getAllMessages(): SwarmMessage[];
|
|
17
|
+
getUnreadMessages(agentName: string): SwarmMessage[];
|
|
18
|
+
clear(): void;
|
|
19
|
+
resetTurnCounts(): void;
|
|
20
|
+
private notifySubscribers;
|
|
21
|
+
}
|
|
22
|
+
export declare function createMessageBus(config?: Partial<MessageBusConfig>): MessageBus;
|
|
23
|
+
//# sourceMappingURL=message-bus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-bus.d.ts","sourceRoot":"","sources":["../../src/communication/message-bus.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EACV,UAAU,EACV,gBAAgB,EAChB,YAAY,EACb,MAAM,qBAAqB,CAAC;AAE7B,qBAAa,kBAAmB,YAAW,UAAU;IACnD,OAAO,CAAC,QAAQ,CAAsB;IACtC,OAAO,CAAC,aAAa,CAAuD;IAC5E,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,kBAAkB,CAA6B;gBAE3C,MAAM,EAAE,gBAAgB;IAI9B,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;IA6C5E,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW/E,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,IAAI,GAAG,MAAM,IAAI;IAiB9E,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE;IAc9D,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,EAAE;IAQ/D,cAAc,IAAI,YAAY,EAAE;IAIhC,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,EAAE;IAQpD,KAAK,IAAI,IAAI;IAKb,eAAe,IAAI,IAAI;IAIvB,OAAO,CAAC,iBAAiB;CAwB1B;AAED,wBAAgB,gBAAgB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,UAAU,CAM/E"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Message bus for agent-to-agent communication
|
|
3
|
+
*/
|
|
4
|
+
import { nanoid } from 'nanoid';
|
|
5
|
+
export class InMemoryMessageBus {
|
|
6
|
+
messages = [];
|
|
7
|
+
subscriptions = new Map();
|
|
8
|
+
config;
|
|
9
|
+
agentMessageCounts = new Map();
|
|
10
|
+
constructor(config) {
|
|
11
|
+
this.config = config;
|
|
12
|
+
}
|
|
13
|
+
async send(message) {
|
|
14
|
+
if (!this.config.enabled) {
|
|
15
|
+
throw new Error('Message bus is not enabled');
|
|
16
|
+
}
|
|
17
|
+
if (this.config.maxMessageLength &&
|
|
18
|
+
message.content.length > this.config.maxMessageLength) {
|
|
19
|
+
throw new Error(`Message exceeds max length of ${this.config.maxMessageLength} characters`);
|
|
20
|
+
}
|
|
21
|
+
if (this.config.maxMessagesPerTurn) {
|
|
22
|
+
const count = this.agentMessageCounts.get(message.from) ?? 0;
|
|
23
|
+
if (count >= this.config.maxMessagesPerTurn) {
|
|
24
|
+
throw new Error(`Agent ${message.from} exceeded max messages per turn (${this.config.maxMessagesPerTurn})`);
|
|
25
|
+
}
|
|
26
|
+
this.agentMessageCounts.set(message.from, count + 1);
|
|
27
|
+
}
|
|
28
|
+
if (this.config.maxTotalMessages &&
|
|
29
|
+
this.messages.length >= this.config.maxTotalMessages) {
|
|
30
|
+
throw new Error(`Max total messages (${this.config.maxTotalMessages}) reached`);
|
|
31
|
+
}
|
|
32
|
+
const fullMessage = {
|
|
33
|
+
...message,
|
|
34
|
+
id: `msg_${nanoid(12)}`,
|
|
35
|
+
timestamp: Date.now(),
|
|
36
|
+
};
|
|
37
|
+
this.messages.push(fullMessage);
|
|
38
|
+
this.notifySubscribers(fullMessage);
|
|
39
|
+
return fullMessage;
|
|
40
|
+
}
|
|
41
|
+
async broadcast(from, content, channel) {
|
|
42
|
+
await this.send({
|
|
43
|
+
swarmId: '',
|
|
44
|
+
from,
|
|
45
|
+
to: 'broadcast',
|
|
46
|
+
type: 'notification',
|
|
47
|
+
content,
|
|
48
|
+
channel,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
subscribe(agentName, handler) {
|
|
52
|
+
if (!this.subscriptions.has(agentName)) {
|
|
53
|
+
this.subscriptions.set(agentName, new Set());
|
|
54
|
+
}
|
|
55
|
+
this.subscriptions.get(agentName).add(handler);
|
|
56
|
+
return () => {
|
|
57
|
+
const handlers = this.subscriptions.get(agentName);
|
|
58
|
+
if (handlers) {
|
|
59
|
+
handlers.delete(handler);
|
|
60
|
+
if (handlers.size === 0) {
|
|
61
|
+
this.subscriptions.delete(agentName);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
getMessages(agentName, limit) {
|
|
67
|
+
const relevant = this.messages.filter((m) => m.to === agentName ||
|
|
68
|
+
m.to === 'broadcast' ||
|
|
69
|
+
m.from === agentName);
|
|
70
|
+
if (limit) {
|
|
71
|
+
return relevant.slice(-limit);
|
|
72
|
+
}
|
|
73
|
+
return relevant;
|
|
74
|
+
}
|
|
75
|
+
getConversation(agent1, agent2) {
|
|
76
|
+
return this.messages.filter((m) => (m.from === agent1 && m.to === agent2) ||
|
|
77
|
+
(m.from === agent2 && m.to === agent1));
|
|
78
|
+
}
|
|
79
|
+
getAllMessages() {
|
|
80
|
+
return [...this.messages];
|
|
81
|
+
}
|
|
82
|
+
getUnreadMessages(agentName) {
|
|
83
|
+
return this.messages.filter((m) => (m.to === agentName || m.to === 'broadcast') &&
|
|
84
|
+
m.from !== agentName);
|
|
85
|
+
}
|
|
86
|
+
clear() {
|
|
87
|
+
this.messages = [];
|
|
88
|
+
this.agentMessageCounts.clear();
|
|
89
|
+
}
|
|
90
|
+
resetTurnCounts() {
|
|
91
|
+
this.agentMessageCounts.clear();
|
|
92
|
+
}
|
|
93
|
+
notifySubscribers(message) {
|
|
94
|
+
if (message.to !== 'broadcast') {
|
|
95
|
+
const handlers = this.subscriptions.get(message.to);
|
|
96
|
+
if (handlers) {
|
|
97
|
+
for (const handler of handlers) {
|
|
98
|
+
try {
|
|
99
|
+
handler(message);
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
for (const [agentName, handlers] of this.subscriptions) {
|
|
108
|
+
if (agentName !== message.from) {
|
|
109
|
+
for (const handler of handlers) {
|
|
110
|
+
try {
|
|
111
|
+
handler(message);
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
export function createMessageBus(config) {
|
|
122
|
+
return new InMemoryMessageBus({
|
|
123
|
+
enabled: true,
|
|
124
|
+
protocol: 'direct',
|
|
125
|
+
...config,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=message-bus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-bus.js","sourceRoot":"","sources":["../../src/communication/message-bus.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SwarmCoordinator - Execution engine for multi-agent swarms
|
|
3
|
+
*/
|
|
4
|
+
import type { Cogitator } from '@cogitator-ai/core';
|
|
5
|
+
import type { SwarmConfig, SwarmAgent, SwarmAgentMetadata, RunResult, MessageBus, Blackboard, SwarmEventEmitter, SwarmCoordinatorInterface } from '@cogitator-ai/types';
|
|
6
|
+
export declare class SwarmCoordinator implements SwarmCoordinatorInterface {
|
|
7
|
+
private cogitator;
|
|
8
|
+
private config;
|
|
9
|
+
private agents;
|
|
10
|
+
private _messageBus;
|
|
11
|
+
private _blackboard;
|
|
12
|
+
private _events;
|
|
13
|
+
private resourceTracker;
|
|
14
|
+
private circuitBreaker?;
|
|
15
|
+
private aborted;
|
|
16
|
+
private paused;
|
|
17
|
+
private swarmId;
|
|
18
|
+
constructor(cogitator: Cogitator, config: SwarmConfig);
|
|
19
|
+
private initializeAgents;
|
|
20
|
+
get messageBus(): MessageBus;
|
|
21
|
+
get blackboard(): Blackboard;
|
|
22
|
+
get events(): SwarmEventEmitter;
|
|
23
|
+
getSwarmId(): string;
|
|
24
|
+
getAgent(name: string): SwarmAgent | undefined;
|
|
25
|
+
getAgents(): SwarmAgent[];
|
|
26
|
+
getAgentsByRole(role: SwarmAgentMetadata['role']): SwarmAgent[];
|
|
27
|
+
runAgent(agentName: string, input: string, context?: Record<string, unknown>): Promise<RunResult>;
|
|
28
|
+
runAgentsParallel(agents: {
|
|
29
|
+
name: string;
|
|
30
|
+
input: string;
|
|
31
|
+
context?: Record<string, unknown>;
|
|
32
|
+
}[], maxConcurrency?: number): Promise<Map<string, RunResult>>;
|
|
33
|
+
private handleAgentError;
|
|
34
|
+
private retryAgentRun;
|
|
35
|
+
private setAgentState;
|
|
36
|
+
getResourceUsage(): import("@cogitator-ai/types").SwarmResourceUsage;
|
|
37
|
+
pause(): void;
|
|
38
|
+
resume(): void;
|
|
39
|
+
abort(): void;
|
|
40
|
+
isAborted(): boolean;
|
|
41
|
+
isPaused(): boolean;
|
|
42
|
+
reset(): void;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=coordinator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coordinator.d.ts","sourceRoot":"","sources":["../src/coordinator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAEV,WAAW,EACX,UAAU,EACV,kBAAkB,EAElB,SAAS,EACT,UAAU,EACV,UAAU,EACV,iBAAiB,EACjB,yBAAyB,EAC1B,MAAM,qBAAqB,CAAC;AAS7B,qBAAa,gBAAiB,YAAW,yBAAyB;IAChE,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;gBAEZ,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW;IA2BrD,OAAO,CAAC,gBAAgB;IA2DxB,IAAI,UAAU,IAAI,UAAU,CAE3B;IAED,IAAI,UAAU,IAAI,UAAU,CAE3B;IAED,IAAI,MAAM,IAAI,iBAAiB,CAE9B;IAED,UAAU,IAAI,MAAM;IAIpB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAI9C,SAAS,IAAI,UAAU,EAAE;IAIzB,eAAe,CAAC,IAAI,EAAE,kBAAkB,CAAC,MAAM,CAAC,GAAG,UAAU,EAAE;IAIzD,QAAQ,CACZ,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,SAAS,CAAC;IAiEf,iBAAiB,CACrB,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,EAAE,EAC5E,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YA+BpB,gBAAgB;YAyChB,aAAa;IAoC3B,OAAO,CAAC,aAAa;IAOrB,gBAAgB;IAIhB,KAAK,IAAI,IAAI;IAIb,MAAM,IAAI,IAAI;IAId,KAAK,IAAI,IAAI;IAIb,SAAS,IAAI,OAAO;IAIpB,QAAQ,IAAI,OAAO;IAInB,KAAK,IAAI,IAAI;CAgBd"}
|