@researchcomputer/agents-sdk 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/README.md +60 -0
- package/dist/agents/messages.d.ts +29 -0
- package/dist/agents/messages.d.ts.map +1 -0
- package/dist/agents/messages.js +56 -0
- package/dist/agents/messages.js.map +1 -0
- package/dist/agents/messages.test.d.ts +2 -0
- package/dist/agents/messages.test.d.ts.map +1 -0
- package/dist/agents/messages.test.js +80 -0
- package/dist/agents/messages.test.js.map +1 -0
- package/dist/agents/subagent.d.ts +16 -0
- package/dist/agents/subagent.d.ts.map +1 -0
- package/dist/agents/subagent.js +46 -0
- package/dist/agents/subagent.js.map +1 -0
- package/dist/agents/swarm.d.ts +22 -0
- package/dist/agents/swarm.d.ts.map +1 -0
- package/dist/agents/swarm.js +140 -0
- package/dist/agents/swarm.js.map +1 -0
- package/dist/agents/tools.d.ts +6 -0
- package/dist/agents/tools.d.ts.map +1 -0
- package/dist/agents/tools.js +71 -0
- package/dist/agents/tools.js.map +1 -0
- package/dist/agents/tools.test.d.ts +2 -0
- package/dist/agents/tools.test.d.ts.map +1 -0
- package/dist/agents/tools.test.js +70 -0
- package/dist/agents/tools.test.js.map +1 -0
- package/dist/bridge/config.d.ts +21 -0
- package/dist/bridge/config.d.ts.map +1 -0
- package/dist/bridge/config.js +35 -0
- package/dist/bridge/config.js.map +1 -0
- package/dist/bridge/config.test.d.ts +2 -0
- package/dist/bridge/config.test.d.ts.map +1 -0
- package/dist/bridge/config.test.js +79 -0
- package/dist/bridge/config.test.js.map +1 -0
- package/dist/bridge/server.d.ts +3 -0
- package/dist/bridge/server.d.ts.map +1 -0
- package/dist/bridge/server.js +316 -0
- package/dist/bridge/server.js.map +1 -0
- package/dist/context/compression.d.ts +27 -0
- package/dist/context/compression.d.ts.map +1 -0
- package/dist/context/compression.js +117 -0
- package/dist/context/compression.js.map +1 -0
- package/dist/context/compression.test.d.ts +2 -0
- package/dist/context/compression.test.d.ts.map +1 -0
- package/dist/context/compression.test.js +170 -0
- package/dist/context/compression.test.js.map +1 -0
- package/dist/context/converter.d.ts +11 -0
- package/dist/context/converter.d.ts.map +1 -0
- package/dist/context/converter.js +40 -0
- package/dist/context/converter.js.map +1 -0
- package/dist/context/converter.test.d.ts +2 -0
- package/dist/context/converter.test.d.ts.map +1 -0
- package/dist/context/converter.test.js +110 -0
- package/dist/context/converter.test.js.map +1 -0
- package/dist/context/run-context.d.ts +9 -0
- package/dist/context/run-context.d.ts.map +1 -0
- package/dist/context/run-context.js +14 -0
- package/dist/context/run-context.js.map +1 -0
- package/dist/context/run-context.test.d.ts +2 -0
- package/dist/context/run-context.test.d.ts.map +1 -0
- package/dist/context/run-context.test.js +34 -0
- package/dist/context/run-context.test.js.map +1 -0
- package/dist/context/system-prompt.d.ts +24 -0
- package/dist/context/system-prompt.d.ts.map +1 -0
- package/dist/context/system-prompt.js +69 -0
- package/dist/context/system-prompt.js.map +1 -0
- package/dist/context/system-prompt.test.d.ts +2 -0
- package/dist/context/system-prompt.test.d.ts.map +1 -0
- package/dist/context/system-prompt.test.js +134 -0
- package/dist/context/system-prompt.test.js.map +1 -0
- package/dist/errors.d.ts +24 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +47 -0
- package/dist/errors.js.map +1 -0
- package/dist/errors.test.d.ts +2 -0
- package/dist/errors.test.d.ts.map +1 -0
- package/dist/errors.test.js +68 -0
- package/dist/errors.test.js.map +1 -0
- package/dist/factory.d.ts +58 -0
- package/dist/factory.d.ts.map +1 -0
- package/dist/factory.js +282 -0
- package/dist/factory.js.map +1 -0
- package/dist/factory.test.d.ts +2 -0
- package/dist/factory.test.d.ts.map +1 -0
- package/dist/factory.test.js +63 -0
- package/dist/factory.test.js.map +1 -0
- package/dist/fork.test.d.ts +2 -0
- package/dist/fork.test.d.ts.map +1 -0
- package/dist/fork.test.js +456 -0
- package/dist/fork.test.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/client.d.ts +3 -0
- package/dist/mcp/client.d.ts.map +1 -0
- package/dist/mcp/client.js +75 -0
- package/dist/mcp/client.js.map +1 -0
- package/dist/mcp/schema-convert.d.ts +3 -0
- package/dist/mcp/schema-convert.d.ts.map +1 -0
- package/dist/mcp/schema-convert.js +73 -0
- package/dist/mcp/schema-convert.js.map +1 -0
- package/dist/mcp/schema-convert.test.d.ts +2 -0
- package/dist/mcp/schema-convert.test.d.ts.map +1 -0
- package/dist/mcp/schema-convert.test.js +95 -0
- package/dist/mcp/schema-convert.test.js.map +1 -0
- package/dist/mcp/tools.d.ts +14 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +23 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/mcp/tools.test.d.ts +2 -0
- package/dist/mcp/tools.test.d.ts.map +1 -0
- package/dist/mcp/tools.test.js +45 -0
- package/dist/mcp/tools.test.js.map +1 -0
- package/dist/memory/memory.d.ts +3 -0
- package/dist/memory/memory.d.ts.map +1 -0
- package/dist/memory/memory.js +130 -0
- package/dist/memory/memory.js.map +1 -0
- package/dist/memory/memory.test.d.ts +2 -0
- package/dist/memory/memory.test.d.ts.map +1 -0
- package/dist/memory/memory.test.js +94 -0
- package/dist/memory/memory.test.js.map +1 -0
- package/dist/middleware/hooks.d.ts +18 -0
- package/dist/middleware/hooks.d.ts.map +1 -0
- package/dist/middleware/hooks.js +71 -0
- package/dist/middleware/hooks.js.map +1 -0
- package/dist/middleware/hooks.test.d.ts +2 -0
- package/dist/middleware/hooks.test.d.ts.map +1 -0
- package/dist/middleware/hooks.test.js +172 -0
- package/dist/middleware/hooks.test.js.map +1 -0
- package/dist/middleware/index.d.ts +7 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +5 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/permission-middleware.d.ts +11 -0
- package/dist/middleware/permission-middleware.d.ts.map +1 -0
- package/dist/middleware/permission-middleware.js +56 -0
- package/dist/middleware/permission-middleware.js.map +1 -0
- package/dist/middleware/permission-middleware.test.d.ts +2 -0
- package/dist/middleware/permission-middleware.test.d.ts.map +1 -0
- package/dist/middleware/permission-middleware.test.js +170 -0
- package/dist/middleware/permission-middleware.test.js.map +1 -0
- package/dist/middleware/permissions.d.ts +14 -0
- package/dist/middleware/permissions.d.ts.map +1 -0
- package/dist/middleware/permissions.js +118 -0
- package/dist/middleware/permissions.js.map +1 -0
- package/dist/middleware/permissions.test.d.ts +2 -0
- package/dist/middleware/permissions.test.d.ts.map +1 -0
- package/dist/middleware/permissions.test.js +187 -0
- package/dist/middleware/permissions.test.js.map +1 -0
- package/dist/middleware/pipeline.d.ts +13 -0
- package/dist/middleware/pipeline.d.ts.map +1 -0
- package/dist/middleware/pipeline.js +28 -0
- package/dist/middleware/pipeline.js.map +1 -0
- package/dist/middleware/pipeline.test.d.ts +2 -0
- package/dist/middleware/pipeline.test.d.ts.map +1 -0
- package/dist/middleware/pipeline.test.js +189 -0
- package/dist/middleware/pipeline.test.js.map +1 -0
- package/dist/observability/cost-tracker.d.ts +3 -0
- package/dist/observability/cost-tracker.d.ts.map +1 -0
- package/dist/observability/cost-tracker.js +26 -0
- package/dist/observability/cost-tracker.js.map +1 -0
- package/dist/observability/cost-tracker.test.d.ts +2 -0
- package/dist/observability/cost-tracker.test.d.ts.map +1 -0
- package/dist/observability/cost-tracker.test.js +49 -0
- package/dist/observability/cost-tracker.test.js.map +1 -0
- package/dist/observability/trace.d.ts +2 -0
- package/dist/observability/trace.d.ts.map +1 -0
- package/dist/observability/trace.js +5 -0
- package/dist/observability/trace.js.map +1 -0
- package/dist/session/session.d.ts +3 -0
- package/dist/session/session.d.ts.map +1 -0
- package/dist/session/session.js +62 -0
- package/dist/session/session.js.map +1 -0
- package/dist/session/session.test.d.ts +2 -0
- package/dist/session/session.test.d.ts.map +1 -0
- package/dist/session/session.test.js +84 -0
- package/dist/session/session.test.js.map +1 -0
- package/dist/skills.d.ts +14 -0
- package/dist/skills.d.ts.map +1 -0
- package/dist/skills.js +31 -0
- package/dist/skills.js.map +1 -0
- package/dist/skills.test.d.ts +2 -0
- package/dist/skills.test.d.ts.map +1 -0
- package/dist/skills.test.js +61 -0
- package/dist/skills.test.js.map +1 -0
- package/dist/tools/ask-user.d.ts +10 -0
- package/dist/tools/ask-user.d.ts.map +1 -0
- package/dist/tools/ask-user.js +27 -0
- package/dist/tools/ask-user.js.map +1 -0
- package/dist/tools/bash.d.ts +11 -0
- package/dist/tools/bash.d.ts.map +1 -0
- package/dist/tools/bash.js +54 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/bash.test.d.ts +2 -0
- package/dist/tools/bash.test.d.ts.map +1 -0
- package/dist/tools/bash.test.js +63 -0
- package/dist/tools/bash.test.js.map +1 -0
- package/dist/tools/edit.d.ts +10 -0
- package/dist/tools/edit.d.ts.map +1 -0
- package/dist/tools/edit.js +65 -0
- package/dist/tools/edit.js.map +1 -0
- package/dist/tools/edit.test.d.ts +2 -0
- package/dist/tools/edit.test.d.ts.map +1 -0
- package/dist/tools/edit.test.js +60 -0
- package/dist/tools/edit.test.js.map +1 -0
- package/dist/tools/glob.d.ts +8 -0
- package/dist/tools/glob.d.ts.map +1 -0
- package/dist/tools/glob.js +43 -0
- package/dist/tools/glob.js.map +1 -0
- package/dist/tools/glob.test.d.ts +2 -0
- package/dist/tools/glob.test.d.ts.map +1 -0
- package/dist/tools/glob.test.js +54 -0
- package/dist/tools/glob.test.js.map +1 -0
- package/dist/tools/grep.d.ts +9 -0
- package/dist/tools/grep.d.ts.map +1 -0
- package/dist/tools/grep.js +74 -0
- package/dist/tools/grep.js.map +1 -0
- package/dist/tools/grep.test.d.ts +2 -0
- package/dist/tools/grep.test.d.ts.map +1 -0
- package/dist/tools/grep.test.js +48 -0
- package/dist/tools/grep.test.js.map +1 -0
- package/dist/tools/index.d.ts +25 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +40 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/index.test.d.ts +2 -0
- package/dist/tools/index.test.d.ts.map +1 -0
- package/dist/tools/index.test.js +102 -0
- package/dist/tools/index.test.js.map +1 -0
- package/dist/tools/notebook-edit.d.ts +9 -0
- package/dist/tools/notebook-edit.d.ts.map +1 -0
- package/dist/tools/notebook-edit.js +55 -0
- package/dist/tools/notebook-edit.js.map +1 -0
- package/dist/tools/read.d.ts +9 -0
- package/dist/tools/read.d.ts.map +1 -0
- package/dist/tools/read.js +48 -0
- package/dist/tools/read.js.map +1 -0
- package/dist/tools/read.test.d.ts +2 -0
- package/dist/tools/read.test.d.ts.map +1 -0
- package/dist/tools/read.test.js +68 -0
- package/dist/tools/read.test.js.map +1 -0
- package/dist/tools/util.d.ts +19 -0
- package/dist/tools/util.d.ts.map +1 -0
- package/dist/tools/util.js +44 -0
- package/dist/tools/util.js.map +1 -0
- package/dist/tools/util.test.d.ts +2 -0
- package/dist/tools/util.test.d.ts.map +1 -0
- package/dist/tools/util.test.js +75 -0
- package/dist/tools/util.test.js.map +1 -0
- package/dist/tools/web-fetch.d.ts +7 -0
- package/dist/tools/web-fetch.d.ts.map +1 -0
- package/dist/tools/web-fetch.js +35 -0
- package/dist/tools/web-fetch.js.map +1 -0
- package/dist/tools/web-search.d.ts +7 -0
- package/dist/tools/web-search.d.ts.map +1 -0
- package/dist/tools/web-search.js +20 -0
- package/dist/tools/web-search.js.map +1 -0
- package/dist/tools/write.d.ts +8 -0
- package/dist/tools/write.d.ts.map +1 -0
- package/dist/tools/write.js +33 -0
- package/dist/tools/write.js.map +1 -0
- package/dist/tools/write.test.d.ts +2 -0
- package/dist/tools/write.test.d.ts.map +1 -0
- package/dist/tools/write.test.js +49 -0
- package/dist/tools/write.test.js.map +1 -0
- package/dist/types.d.ts +257 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/types.test.d.ts +2 -0
- package/dist/types.test.d.ts.map +1 -0
- package/dist/types.test.js +69 -0
- package/dist/types.test.js.map +1 -0
- package/package.json +51 -0
package/README.md
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# @researchcomputer/agents-sdk
|
|
2
|
+
|
|
3
|
+
A TypeScript SDK for building coding agents powered by large language models. Built on `@mariozechner/pi-agent-core`, it provides a high-level framework for creating agents with file operations, shell execution, web access, permission controls, memory, sessions, MCP servers, and multi-agent swarms.
|
|
4
|
+
|
|
5
|
+
## Documentation
|
|
6
|
+
|
|
7
|
+
| Document | Description |
|
|
8
|
+
|---|---|
|
|
9
|
+
| [Getting Started](./docs/getting-started.md) | Installation, quick start, and first agent |
|
|
10
|
+
| [Concepts](./docs/concepts.md) | Core abstractions: tools, permissions, memory, context |
|
|
11
|
+
| [API Reference](./docs/api-reference.md) | Full API: types, factory, all modules |
|
|
12
|
+
| [Examples](./docs/examples.md) | Practical usage patterns and recipes |
|
|
13
|
+
|
|
14
|
+
## Overview
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
@researchcomputer/agents-sdk
|
|
18
|
+
├── Factory createCodingAgent() — main entry point
|
|
19
|
+
├── Tools Built-in: Read, Write, Edit, Bash, Glob, Grep, WebFetch, ...
|
|
20
|
+
├── Permissions Capability-based access control with multiple modes
|
|
21
|
+
├── Memory Persistent, queryable per-agent memories
|
|
22
|
+
├── Sessions Snapshot-based conversation persistence
|
|
23
|
+
├── MCP Connect external tool servers via Model Context Protocol
|
|
24
|
+
├── Swarm Multi-agent coordination with mailbox messaging
|
|
25
|
+
├── Middleware Hooks, permission gates, and pipeline composition
|
|
26
|
+
├── Context Message conversion, system prompt construction, compression
|
|
27
|
+
└── Observability Token/cost tracking and trace IDs
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Quick Example
|
|
31
|
+
|
|
32
|
+
```typescript
|
|
33
|
+
import { createCodingAgent } from '@researchcomputer/agents-sdk';
|
|
34
|
+
import { getModel } from '@mariozechner/pi-ai';
|
|
35
|
+
|
|
36
|
+
const agent = await createCodingAgent({
|
|
37
|
+
model: getModel('openai', 'gpt-4o'),
|
|
38
|
+
cwd: process.cwd(),
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
await agent.prompt('List all TypeScript files and summarize what they do');
|
|
42
|
+
await agent.dispose();
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Bridge Server
|
|
46
|
+
|
|
47
|
+
The bridge server now lives inside the main package under [`src/bridge/`](./src/bridge) and builds with the rest of the SDK.
|
|
48
|
+
|
|
49
|
+
Build and run it from the root package:
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
npm run build
|
|
53
|
+
npm run bridge:start
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Python example clients live under [`examples/bridge/`](./examples/bridge).
|
|
57
|
+
|
|
58
|
+
## Example CLI
|
|
59
|
+
|
|
60
|
+
A runnable Ink-based terminal UI example lives in [cli/README.md](./cli/README.md). It wraps `createCodingAgent()` in an interactive agent shell with a configurable cute agent name, slash commands, model pickers, live streaming, permission prompts, and support for arbitrary OpenAI-compatible endpoints.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A simple async queue for swarm agent communication (mailbox pattern).
|
|
3
|
+
*/
|
|
4
|
+
export declare class AsyncQueue<T> {
|
|
5
|
+
private items;
|
|
6
|
+
private waiters;
|
|
7
|
+
/**
|
|
8
|
+
* Add an item to the queue. If a waiter exists, resolve it immediately.
|
|
9
|
+
*/
|
|
10
|
+
enqueue(item: T): void;
|
|
11
|
+
/**
|
|
12
|
+
* Non-blocking dequeue. Returns undefined if queue is empty.
|
|
13
|
+
*/
|
|
14
|
+
tryDequeue(): T | undefined;
|
|
15
|
+
/**
|
|
16
|
+
* Async dequeue. Resolves when an item is available.
|
|
17
|
+
* Rejects if the queue is cleared while waiting.
|
|
18
|
+
*/
|
|
19
|
+
dequeue(): Promise<T>;
|
|
20
|
+
/**
|
|
21
|
+
* Returns true if the queue has no items.
|
|
22
|
+
*/
|
|
23
|
+
isEmpty(): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Clear all items and reject pending waiters.
|
|
26
|
+
*/
|
|
27
|
+
clear(): void;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=messages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/agents/messages.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,UAAU,CAAC,CAAC;IACvB,OAAO,CAAC,KAAK,CAAW;IACxB,OAAO,CAAC,OAAO,CAA2E;IAE1F;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI;IAStB;;OAEG;IACH,UAAU,IAAI,CAAC,GAAG,SAAS;IAI3B;;;OAGG;IACH,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC;IAUrB;;OAEG;IACH,OAAO,IAAI,OAAO;IAIlB;;OAEG;IACH,KAAK,IAAI,IAAI;CAQd"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A simple async queue for swarm agent communication (mailbox pattern).
|
|
3
|
+
*/
|
|
4
|
+
export class AsyncQueue {
|
|
5
|
+
items = [];
|
|
6
|
+
waiters = [];
|
|
7
|
+
/**
|
|
8
|
+
* Add an item to the queue. If a waiter exists, resolve it immediately.
|
|
9
|
+
*/
|
|
10
|
+
enqueue(item) {
|
|
11
|
+
const waiter = this.waiters.shift();
|
|
12
|
+
if (waiter) {
|
|
13
|
+
waiter.resolve(item);
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
this.items.push(item);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Non-blocking dequeue. Returns undefined if queue is empty.
|
|
21
|
+
*/
|
|
22
|
+
tryDequeue() {
|
|
23
|
+
return this.items.shift();
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Async dequeue. Resolves when an item is available.
|
|
27
|
+
* Rejects if the queue is cleared while waiting.
|
|
28
|
+
*/
|
|
29
|
+
dequeue() {
|
|
30
|
+
const item = this.items.shift();
|
|
31
|
+
if (item !== undefined) {
|
|
32
|
+
return Promise.resolve(item);
|
|
33
|
+
}
|
|
34
|
+
return new Promise((resolve, reject) => {
|
|
35
|
+
this.waiters.push({ resolve, reject });
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Returns true if the queue has no items.
|
|
40
|
+
*/
|
|
41
|
+
isEmpty() {
|
|
42
|
+
return this.items.length === 0;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Clear all items and reject pending waiters.
|
|
46
|
+
*/
|
|
47
|
+
clear() {
|
|
48
|
+
this.items = [];
|
|
49
|
+
const waiters = this.waiters;
|
|
50
|
+
this.waiters = [];
|
|
51
|
+
for (const waiter of waiters) {
|
|
52
|
+
waiter.reject(new Error('Queue cleared'));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/agents/messages.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,OAAO,UAAU;IACb,KAAK,GAAQ,EAAE,CAAC;IAChB,OAAO,GAAwE,EAAE,CAAC;IAE1F;;OAEG;IACH,OAAO,CAAC,IAAO;QACb,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACpC,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACH,OAAO;QACL,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAChC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACxC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,OAAO;QACL,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.test.d.ts","sourceRoot":"","sources":["../../src/agents/messages.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { AsyncQueue } from './messages.js';
|
|
3
|
+
describe('AsyncQueue', () => {
|
|
4
|
+
it('enqueue and tryDequeue work synchronously', () => {
|
|
5
|
+
const q = new AsyncQueue();
|
|
6
|
+
q.enqueue(1);
|
|
7
|
+
q.enqueue(2);
|
|
8
|
+
expect(q.tryDequeue()).toBe(1);
|
|
9
|
+
expect(q.tryDequeue()).toBe(2);
|
|
10
|
+
expect(q.tryDequeue()).toBeUndefined();
|
|
11
|
+
});
|
|
12
|
+
it('tryDequeue returns undefined when empty', () => {
|
|
13
|
+
const q = new AsyncQueue();
|
|
14
|
+
expect(q.tryDequeue()).toBeUndefined();
|
|
15
|
+
});
|
|
16
|
+
it('dequeue resolves immediately if item available', async () => {
|
|
17
|
+
const q = new AsyncQueue();
|
|
18
|
+
q.enqueue('hello');
|
|
19
|
+
const result = await q.dequeue();
|
|
20
|
+
expect(result).toBe('hello');
|
|
21
|
+
});
|
|
22
|
+
it('dequeue waits for enqueue', async () => {
|
|
23
|
+
const q = new AsyncQueue();
|
|
24
|
+
// Start dequeue before any item is enqueued
|
|
25
|
+
const promise = q.dequeue();
|
|
26
|
+
// Enqueue after a microtask
|
|
27
|
+
setTimeout(() => q.enqueue(42), 10);
|
|
28
|
+
const result = await promise;
|
|
29
|
+
expect(result).toBe(42);
|
|
30
|
+
});
|
|
31
|
+
it('multiple waiters are resolved in order', async () => {
|
|
32
|
+
const q = new AsyncQueue();
|
|
33
|
+
const p1 = q.dequeue();
|
|
34
|
+
const p2 = q.dequeue();
|
|
35
|
+
q.enqueue(1);
|
|
36
|
+
q.enqueue(2);
|
|
37
|
+
expect(await p1).toBe(1);
|
|
38
|
+
expect(await p2).toBe(2);
|
|
39
|
+
});
|
|
40
|
+
it('enqueue resolves waiter immediately instead of queueing', async () => {
|
|
41
|
+
const q = new AsyncQueue();
|
|
42
|
+
const promise = q.dequeue();
|
|
43
|
+
q.enqueue('direct');
|
|
44
|
+
// The item should have gone directly to the waiter, not the queue
|
|
45
|
+
expect(q.isEmpty()).toBe(true);
|
|
46
|
+
expect(await promise).toBe('direct');
|
|
47
|
+
});
|
|
48
|
+
it('isEmpty returns true when empty', () => {
|
|
49
|
+
const q = new AsyncQueue();
|
|
50
|
+
expect(q.isEmpty()).toBe(true);
|
|
51
|
+
});
|
|
52
|
+
it('isEmpty returns false when items exist', () => {
|
|
53
|
+
const q = new AsyncQueue();
|
|
54
|
+
q.enqueue(1);
|
|
55
|
+
expect(q.isEmpty()).toBe(false);
|
|
56
|
+
});
|
|
57
|
+
it('clear removes all items', () => {
|
|
58
|
+
const q = new AsyncQueue();
|
|
59
|
+
q.enqueue(1);
|
|
60
|
+
q.enqueue(2);
|
|
61
|
+
q.enqueue(3);
|
|
62
|
+
q.clear();
|
|
63
|
+
expect(q.isEmpty()).toBe(true);
|
|
64
|
+
expect(q.tryDequeue()).toBeUndefined();
|
|
65
|
+
});
|
|
66
|
+
it('clear rejects pending waiters', async () => {
|
|
67
|
+
const q = new AsyncQueue();
|
|
68
|
+
// Create waiters that will be rejected on clear
|
|
69
|
+
const p1 = q.dequeue().catch((e) => e.message);
|
|
70
|
+
const p2 = q.dequeue().catch((e) => e.message);
|
|
71
|
+
q.clear();
|
|
72
|
+
// Pending waiters should be rejected
|
|
73
|
+
expect(await p1).toBe('Queue cleared');
|
|
74
|
+
expect(await p2).toBe('Queue cleared');
|
|
75
|
+
// After clear, new enqueue should go to the queue, not old waiters
|
|
76
|
+
q.enqueue(99);
|
|
77
|
+
expect(q.tryDequeue()).toBe(99);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
//# sourceMappingURL=messages.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.test.js","sourceRoot":"","sources":["../../src/agents/messages.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { AgentMessage } from '@mariozechner/pi-agent-core';
|
|
2
|
+
import type { Message, Model } from '@mariozechner/pi-ai';
|
|
3
|
+
import type { SdkTool } from '../types.js';
|
|
4
|
+
export interface SubAgentConfig {
|
|
5
|
+
model: Model<any>;
|
|
6
|
+
systemPrompt?: string;
|
|
7
|
+
tools?: SdkTool<any, any>[];
|
|
8
|
+
convertToLlm?: (messages: AgentMessage[]) => Message[] | Promise<Message[]>;
|
|
9
|
+
getApiKey?: (provider: string) => Promise<string | undefined> | string | undefined;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Runs a sub-agent with the given prompt, waits for it to finish,
|
|
13
|
+
* and extracts the last assistant text response.
|
|
14
|
+
*/
|
|
15
|
+
export declare function runSubAgent(prompt: string, config: SubAgentConfig): Promise<string>;
|
|
16
|
+
//# sourceMappingURL=subagent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subagent.d.ts","sourceRoot":"","sources":["../../src/agents/subagent.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAiB,MAAM,6BAA6B,CAAC;AAC/E,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;IAC5B,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5E,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,GAAG,SAAS,CAAC;CACpF;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAoCzF"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { Agent } from '@mariozechner/pi-agent-core';
|
|
2
|
+
/**
|
|
3
|
+
* Runs a sub-agent with the given prompt, waits for it to finish,
|
|
4
|
+
* and extracts the last assistant text response.
|
|
5
|
+
*/
|
|
6
|
+
export async function runSubAgent(prompt, config) {
|
|
7
|
+
const agent = new Agent({
|
|
8
|
+
initialState: {
|
|
9
|
+
systemPrompt: config.systemPrompt ?? 'You are a helpful assistant.',
|
|
10
|
+
model: config.model,
|
|
11
|
+
tools: config.tools ?? [],
|
|
12
|
+
thinkingLevel: 'off',
|
|
13
|
+
},
|
|
14
|
+
convertToLlm: config.convertToLlm ?? defaultConvertToLlm,
|
|
15
|
+
getApiKey: config.getApiKey,
|
|
16
|
+
toolExecution: 'parallel',
|
|
17
|
+
});
|
|
18
|
+
await agent.prompt(prompt);
|
|
19
|
+
await agent.waitForIdle();
|
|
20
|
+
// Extract last assistant text response
|
|
21
|
+
const messages = agent.state.messages;
|
|
22
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
23
|
+
const msg = messages[i];
|
|
24
|
+
if (msg.role === 'assistant') {
|
|
25
|
+
if (typeof msg.content === 'string') {
|
|
26
|
+
return msg.content;
|
|
27
|
+
}
|
|
28
|
+
if (Array.isArray(msg.content)) {
|
|
29
|
+
const texts = msg.content
|
|
30
|
+
.filter((c) => c.type === 'text')
|
|
31
|
+
.map((c) => c.text);
|
|
32
|
+
if (texts.length > 0) {
|
|
33
|
+
return texts.join('\n');
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return '';
|
|
39
|
+
}
|
|
40
|
+
function defaultConvertToLlm(messages) {
|
|
41
|
+
return messages.filter((m) => {
|
|
42
|
+
const role = m.role;
|
|
43
|
+
return role === 'user' || role === 'assistant' || role === 'toolResult';
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=subagent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subagent.js","sourceRoot":"","sources":["../../src/agents/subagent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAapD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAc,EAAE,MAAsB;IACtE,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;QACtB,YAAY,EAAE;YACZ,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,8BAA8B;YACnE,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE;YACzB,aAAa,EAAE,KAAsB;SACtC;QACD,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,mBAAmB;QACxD,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,aAAa,EAAE,UAAU;KAC1B,CAAC,CAAC;IAEH,MAAM,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC3B,MAAM,KAAK,CAAC,WAAW,EAAE,CAAC;IAE1B,uCAAuC;IACvC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC;IACtC,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAuC,CAAC;QAC9D,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC7B,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACpC,OAAO,GAAG,CAAC,OAAO,CAAC;YACrB,CAAC;YACD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC/B,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO;qBACtB,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;qBACrC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBAC3B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACrB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC1B,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,mBAAmB,CAAC,QAAwB;IACnD,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QAC3B,MAAM,IAAI,GAAI,CAAsB,CAAC,IAAI,CAAC;QAC1C,OAAO,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,YAAY,CAAC;IAC1E,CAAC,CAAc,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Agent } from '@mariozechner/pi-agent-core';
|
|
2
|
+
import type { AgentMessage } from '@mariozechner/pi-agent-core';
|
|
3
|
+
import type { Model } from '@mariozechner/pi-ai';
|
|
4
|
+
import type { SdkTool, SwarmManager } from '../types.js';
|
|
5
|
+
export interface SwarmManagerDefaults {
|
|
6
|
+
model: Model<any>;
|
|
7
|
+
tools?: SdkTool<any, any>[];
|
|
8
|
+
convertToLlm: (messages: AgentMessage[]) => import('@mariozechner/pi-ai').Message[] | Promise<import('@mariozechner/pi-ai').Message[]>;
|
|
9
|
+
getApiKey?: (provider: string) => Promise<string | undefined> | string | undefined;
|
|
10
|
+
beforeToolCall?: ConstructorParameters<typeof Agent>[0] extends infer O ? O extends {
|
|
11
|
+
beforeToolCall?: infer B;
|
|
12
|
+
} ? B : never : never;
|
|
13
|
+
afterToolCall?: ConstructorParameters<typeof Agent>[0] extends infer O ? O extends {
|
|
14
|
+
afterToolCall?: infer A;
|
|
15
|
+
} ? A : never : never;
|
|
16
|
+
transformContext?: (messages: AgentMessage[], signal?: AbortSignal) => Promise<AgentMessage[]>;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Creates a SwarmManager for coordinating teams of agents.
|
|
20
|
+
*/
|
|
21
|
+
export declare function createSwarmManager(defaults: SwarmManagerDefaults): SwarmManager;
|
|
22
|
+
//# sourceMappingURL=swarm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swarm.d.ts","sourceRoot":"","sources":["../../src/agents/swarm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAiB,MAAM,6BAA6B,CAAC;AAC/E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,KAAK,EACV,OAAO,EACP,YAAY,EAKb,MAAM,aAAa,CAAC;AAkBrB,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;IAC5B,YAAY,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,OAAO,qBAAqB,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,qBAAqB,EAAE,OAAO,EAAE,CAAC,CAAC;IACvI,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,GAAG,SAAS,CAAC;IACnF,cAAc,CAAC,EAAE,qBAAqB,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,CAAC,SAAS;QAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAA;KAAE,GAAG,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC;IACrI,aAAa,CAAC,EAAE,qBAAqB,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,CAAC,SAAS;QAAE,aAAa,CAAC,EAAE,MAAM,CAAC,CAAA;KAAE,GAAG,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC;IACnI,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;CAChG;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,YAAY,CAoK/E"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { Agent } from '@mariozechner/pi-agent-core';
|
|
2
|
+
import { SdkError } from '../errors.js';
|
|
3
|
+
import { AsyncQueue } from './messages.js';
|
|
4
|
+
/**
|
|
5
|
+
* Creates a SwarmManager for coordinating teams of agents.
|
|
6
|
+
*/
|
|
7
|
+
export function createSwarmManager(defaults) {
|
|
8
|
+
const teams = new Map();
|
|
9
|
+
function createInternalAgent(systemPrompt, model, tools, abortSignal) {
|
|
10
|
+
const agentModel = model ?? defaults.model;
|
|
11
|
+
const agentTools = tools ?? defaults.tools ?? [];
|
|
12
|
+
const agent = new Agent({
|
|
13
|
+
initialState: {
|
|
14
|
+
systemPrompt,
|
|
15
|
+
model: agentModel,
|
|
16
|
+
tools: agentTools,
|
|
17
|
+
thinkingLevel: 'off',
|
|
18
|
+
},
|
|
19
|
+
convertToLlm: defaults.convertToLlm,
|
|
20
|
+
beforeToolCall: defaults.beforeToolCall,
|
|
21
|
+
afterToolCall: defaults.afterToolCall,
|
|
22
|
+
transformContext: defaults.transformContext,
|
|
23
|
+
getApiKey: defaults.getApiKey,
|
|
24
|
+
toolExecution: 'parallel',
|
|
25
|
+
});
|
|
26
|
+
return agent;
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
createTeam(config) {
|
|
30
|
+
const abortController = new AbortController();
|
|
31
|
+
const leaderSystemPrompt = config.leaderSystemPrompt ?? 'You are a team leader coordinating tasks.';
|
|
32
|
+
const agent = createInternalAgent(leaderSystemPrompt, config.model);
|
|
33
|
+
const leader = {
|
|
34
|
+
name: 'leader',
|
|
35
|
+
taskId: `team-${config.name}-leader`,
|
|
36
|
+
status: 'idle',
|
|
37
|
+
budget: { maxTurns: Infinity },
|
|
38
|
+
agent,
|
|
39
|
+
mailbox: new AsyncQueue(),
|
|
40
|
+
abortController,
|
|
41
|
+
};
|
|
42
|
+
const team = {
|
|
43
|
+
name: config.name,
|
|
44
|
+
leader,
|
|
45
|
+
teammates: new Map(),
|
|
46
|
+
};
|
|
47
|
+
teams.set(config.name, team);
|
|
48
|
+
return team;
|
|
49
|
+
},
|
|
50
|
+
async spawnTeammate(teamName, config) {
|
|
51
|
+
const team = teams.get(teamName);
|
|
52
|
+
if (!team) {
|
|
53
|
+
throw new SdkError(`Team not found: ${teamName}`, 'TEAM_NOT_FOUND', false);
|
|
54
|
+
}
|
|
55
|
+
const abortController = new AbortController();
|
|
56
|
+
const systemPrompt = config.systemPrompt ?? 'You are a team member working on assigned tasks.';
|
|
57
|
+
const agent = createInternalAgent(systemPrompt, config.model, config.tools);
|
|
58
|
+
// Budget enforcement: if timeoutMs is set, use AbortSignal.timeout
|
|
59
|
+
if (config.budget.timeoutMs) {
|
|
60
|
+
const timeoutSignal = AbortSignal.timeout(config.budget.timeoutMs);
|
|
61
|
+
timeoutSignal.addEventListener('abort', () => {
|
|
62
|
+
abortController.abort();
|
|
63
|
+
agent.abort();
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
const teammate = {
|
|
67
|
+
name: config.name,
|
|
68
|
+
taskId: config.taskId,
|
|
69
|
+
status: 'running',
|
|
70
|
+
budget: config.budget,
|
|
71
|
+
agent,
|
|
72
|
+
mailbox: new AsyncQueue(),
|
|
73
|
+
abortController,
|
|
74
|
+
};
|
|
75
|
+
team.teammates.set(config.name, teammate);
|
|
76
|
+
// Start agent.prompt non-blocking
|
|
77
|
+
agent.prompt(config.prompt).then(() => {
|
|
78
|
+
teammate.status = 'idle';
|
|
79
|
+
teammate.terminationReason = 'taskComplete';
|
|
80
|
+
}, (err) => {
|
|
81
|
+
teammate.status = 'stopped';
|
|
82
|
+
if (err instanceof Error && (err.name === 'AbortError' || err.message.includes('aborted'))) {
|
|
83
|
+
teammate.terminationReason = 'budgetExhausted';
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
teammate.terminationReason = 'error';
|
|
87
|
+
teammate.error = err instanceof Error ? err.message : String(err);
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
return teammate;
|
|
91
|
+
},
|
|
92
|
+
sendMessage(from, to, message) {
|
|
93
|
+
// Search across all teams for the recipient
|
|
94
|
+
for (const team of teams.values()) {
|
|
95
|
+
if (team.leader.name === to) {
|
|
96
|
+
team.leader.agent.followUp(message);
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
const teammate = team.teammates.get(to);
|
|
100
|
+
if (teammate) {
|
|
101
|
+
teammate.agent.followUp(message);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
throw new SdkError(`Teammate not found: ${to}`, 'TEAMMATE_NOT_FOUND', false);
|
|
106
|
+
},
|
|
107
|
+
async removeTeammate(teamName, name) {
|
|
108
|
+
const team = teams.get(teamName);
|
|
109
|
+
if (!team)
|
|
110
|
+
return;
|
|
111
|
+
const teammate = team.teammates.get(name);
|
|
112
|
+
if (!teammate)
|
|
113
|
+
return;
|
|
114
|
+
teammate.abortController.abort();
|
|
115
|
+
teammate.agent.abort();
|
|
116
|
+
teammate.status = 'stopped';
|
|
117
|
+
teammate.mailbox.clear();
|
|
118
|
+
team.teammates.delete(name);
|
|
119
|
+
},
|
|
120
|
+
async destroyTeam(teamName) {
|
|
121
|
+
const team = teams.get(teamName);
|
|
122
|
+
if (!team)
|
|
123
|
+
return;
|
|
124
|
+
// Remove all teammates
|
|
125
|
+
for (const name of Array.from(team.teammates.keys())) {
|
|
126
|
+
await this.removeTeammate(teamName, name);
|
|
127
|
+
}
|
|
128
|
+
// Abort leader
|
|
129
|
+
team.leader.abortController.abort();
|
|
130
|
+
team.leader.agent.abort();
|
|
131
|
+
team.leader.status = 'stopped';
|
|
132
|
+
team.leader.mailbox.clear();
|
|
133
|
+
teams.delete(teamName);
|
|
134
|
+
},
|
|
135
|
+
getTeam(name) {
|
|
136
|
+
return teams.get(name);
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=swarm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swarm.js","sourceRoot":"","sources":["../../src/agents/swarm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/agents/tools.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEzD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAmE3F"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { Type } from '@sinclair/typebox';
|
|
2
|
+
import { randomUUID } from 'node:crypto';
|
|
3
|
+
/**
|
|
4
|
+
* Creates swarm management tools for a team leader.
|
|
5
|
+
*/
|
|
6
|
+
export function createSwarmTools(teamName, swarm) {
|
|
7
|
+
const spawnTool = {
|
|
8
|
+
name: 'SpawnTeammate',
|
|
9
|
+
label: 'Spawn Teammate',
|
|
10
|
+
description: 'Spawn a new teammate agent to work on a task',
|
|
11
|
+
parameters: Type.Object({
|
|
12
|
+
name: Type.String({ description: 'Name for the teammate' }),
|
|
13
|
+
prompt: Type.String({ description: 'Task prompt for the teammate' }),
|
|
14
|
+
systemPrompt: Type.Optional(Type.String({ description: 'Optional system prompt override' })),
|
|
15
|
+
}),
|
|
16
|
+
capabilities: [],
|
|
17
|
+
async execute(_toolCallId, params) {
|
|
18
|
+
const teammate = await swarm.spawnTeammate(teamName, {
|
|
19
|
+
name: params.name,
|
|
20
|
+
prompt: params.prompt,
|
|
21
|
+
taskId: randomUUID(),
|
|
22
|
+
budget: { maxTurns: 20 },
|
|
23
|
+
systemPrompt: params.systemPrompt,
|
|
24
|
+
});
|
|
25
|
+
return {
|
|
26
|
+
content: [{ type: 'text', text: `Spawned teammate "${teammate.name}" (task: ${teammate.taskId})` }],
|
|
27
|
+
details: { name: teammate.name, taskId: teammate.taskId },
|
|
28
|
+
};
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
const sendTool = {
|
|
32
|
+
name: 'SendMessage',
|
|
33
|
+
label: 'Send Message',
|
|
34
|
+
description: 'Send a message to a teammate',
|
|
35
|
+
parameters: Type.Object({
|
|
36
|
+
to: Type.String({ description: 'Name of the recipient teammate' }),
|
|
37
|
+
message: Type.String({ description: 'Message content to send' }),
|
|
38
|
+
}),
|
|
39
|
+
capabilities: [],
|
|
40
|
+
async execute(_toolCallId, params) {
|
|
41
|
+
const agentMessage = {
|
|
42
|
+
role: 'user',
|
|
43
|
+
content: params.message,
|
|
44
|
+
timestamp: Date.now(),
|
|
45
|
+
};
|
|
46
|
+
swarm.sendMessage(teamName, params.to, agentMessage);
|
|
47
|
+
return {
|
|
48
|
+
content: [{ type: 'text', text: `Message sent to "${params.to}"` }],
|
|
49
|
+
details: { to: params.to },
|
|
50
|
+
};
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
const dismissTool = {
|
|
54
|
+
name: 'DismissTeammate',
|
|
55
|
+
label: 'Dismiss Teammate',
|
|
56
|
+
description: 'Remove a teammate from the team',
|
|
57
|
+
parameters: Type.Object({
|
|
58
|
+
name: Type.String({ description: 'Name of the teammate to dismiss' }),
|
|
59
|
+
}),
|
|
60
|
+
capabilities: [],
|
|
61
|
+
async execute(_toolCallId, params) {
|
|
62
|
+
await swarm.removeTeammate(teamName, params.name);
|
|
63
|
+
return {
|
|
64
|
+
content: [{ type: 'text', text: `Dismissed teammate "${params.name}"` }],
|
|
65
|
+
details: { name: params.name },
|
|
66
|
+
};
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
return [spawnTool, sendTool, dismissTool];
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/agents/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.test.d.ts","sourceRoot":"","sources":["../../src/agents/tools.test.ts"],"names":[],"mappings":""}
|