agent-relay 3.0.1 → 3.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 +37 -244
- package/bin/agent-relay-broker-darwin-arm64 +0 -0
- package/bin/agent-relay-broker-darwin-x64 +0 -0
- package/bin/agent-relay-broker-linux-arm64 +0 -0
- package/bin/agent-relay-broker-linux-x64 +0 -0
- package/dist/index.cjs +342 -60
- package/dist/src/cli/commands/core.d.ts +2 -0
- package/dist/src/cli/commands/core.d.ts.map +1 -1
- package/dist/src/cli/commands/core.js +9 -2
- package/dist/src/cli/commands/core.js.map +1 -1
- package/dist/src/cli/lib/broker-lifecycle.d.ts.map +1 -1
- package/dist/src/cli/lib/broker-lifecycle.js +87 -28
- package/dist/src/cli/lib/broker-lifecycle.js.map +1 -1
- package/package.json +9 -8
- package/packages/acp-bridge/README.md +50 -67
- package/packages/acp-bridge/package.json +2 -2
- package/packages/config/package.json +1 -1
- package/packages/hooks/package.json +4 -4
- package/packages/memory/package.json +2 -2
- package/packages/policy/package.json +2 -2
- package/packages/sdk/README.md +169 -64
- package/packages/sdk/dist/__tests__/contract-fixtures.test.js +76 -9
- package/packages/sdk/dist/__tests__/contract-fixtures.test.js.map +1 -1
- package/packages/sdk/dist/__tests__/facade.test.js +48 -0
- package/packages/sdk/dist/__tests__/facade.test.js.map +1 -1
- package/packages/sdk/dist/__tests__/integration.test.js +11 -5
- package/packages/sdk/dist/__tests__/integration.test.js.map +1 -1
- package/packages/sdk/dist/__tests__/unit.test.js +36 -0
- package/packages/sdk/dist/__tests__/unit.test.js.map +1 -1
- package/packages/sdk/dist/client.d.ts +36 -3
- package/packages/sdk/dist/client.d.ts.map +1 -1
- package/packages/sdk/dist/client.js +142 -9
- package/packages/sdk/dist/client.js.map +1 -1
- package/packages/sdk/dist/protocol.d.ts +7 -1
- package/packages/sdk/dist/protocol.d.ts.map +1 -1
- package/packages/sdk/dist/relay.d.ts +74 -11
- package/packages/sdk/dist/relay.d.ts.map +1 -1
- package/packages/sdk/dist/relay.js +175 -27
- package/packages/sdk/dist/relay.js.map +1 -1
- package/packages/sdk/dist/workflows/runner.d.ts.map +1 -1
- package/packages/sdk/dist/workflows/runner.js +71 -36
- package/packages/sdk/dist/workflows/runner.js.map +1 -1
- package/packages/sdk/dist/workflows/types.d.ts +1 -1
- package/packages/sdk/dist/workflows/types.d.ts.map +1 -1
- package/packages/sdk/package.json +2 -2
- package/packages/sdk/src/__tests__/contract-fixtures.test.ts +88 -9
- package/packages/sdk/src/__tests__/error-scenarios.test.ts +1 -1
- package/packages/sdk/src/__tests__/facade.test.ts +68 -0
- package/packages/sdk/src/__tests__/idle-nudge.test.ts +205 -257
- package/packages/sdk/src/__tests__/integration.test.ts +11 -5
- package/packages/sdk/src/__tests__/orchestration-upgrades.test.ts +277 -13
- package/packages/sdk/src/__tests__/swarm-coordinator.test.ts +1 -0
- package/packages/sdk/src/__tests__/unit.test.ts +44 -0
- package/packages/sdk/src/__tests__/workflow-runner.test.ts +67 -7
- package/packages/sdk/src/__tests__/workflow-trajectory.test.ts +4 -5
- package/packages/sdk/src/client.ts +195 -14
- package/packages/sdk/src/examples/workflows/runner-idle-refactor.yaml +306 -0
- package/packages/sdk/src/protocol.ts +7 -2
- package/packages/sdk/src/relay.ts +271 -38
- package/packages/sdk/src/workflows/runner.ts +73 -42
- package/packages/sdk/src/workflows/schema.json +1 -1
- package/packages/sdk/src/workflows/types.ts +1 -1
- package/packages/sdk/vitest.config.ts +1 -0
- package/packages/sdk-py/README.md +89 -102
- package/packages/sdk-py/agent_relay/__init__.py +16 -19
- package/packages/sdk-py/pyproject.toml +6 -2
- package/packages/sdk-py/src/agent_relay/__init__.py +35 -1
- package/packages/sdk-py/src/agent_relay/client.py +776 -0
- package/packages/sdk-py/src/agent_relay/models.py +27 -0
- package/packages/sdk-py/src/agent_relay/protocol.py +114 -0
- package/packages/sdk-py/src/agent_relay/relay.py +860 -0
- package/packages/sdk-py/tests/test_relay_lifecycle_hooks.py +250 -0
- package/packages/telemetry/package.json +1 -1
- package/packages/trajectory/package.json +2 -2
- package/packages/user-directory/package.json +2 -2
- package/packages/utils/package.json +2 -2
- package/scripts/postinstall.js +35 -162
- package/packages/sdk/.trajectories/active/traj_1771875803391_84ca57b2.json +0 -50
- package/packages/sdk/.trajectories/active/traj_1771891934534_06504121.json +0 -50
- package/packages/sdk/.trajectories/active/traj_1771891957929_211afc4e.json +0 -50
- package/packages/sdk/.trajectories/active/traj_1771891982509_38c84638.json +0 -50
- package/packages/sdk/.trajectories/completed/traj_1771875803188_cd6d181c.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771875803204_f2aeb8c8.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771875803210_d65f3f1a.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771875803218_e454a25d.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771875803223_d7a64815.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771875803227_7e56da5b.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771875803235_4fbf93b4.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771875803243_47931c71.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771875803258_3816f3fe.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771875803268_8061140e.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771875803326_ae6f9c78.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771875808396_cbde0a6c.json +0 -91
- package/packages/sdk/.trajectories/completed/traj_1771875812026_aa2442bb.json +0 -91
- package/packages/sdk/.trajectories/completed/traj_1771875815431_c2c656c5.json +0 -91
- package/packages/sdk/.trajectories/completed/traj_1771875818645_3a4dbf02.json +0 -91
- package/packages/sdk/.trajectories/completed/traj_1771891934403_24923c03.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891934421_dca16e24.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891934430_057706f7.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891934442_faf97382.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891934454_5542ecd5.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891934464_12202a08.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891934487_94378275.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891934503_ca728c13.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891934519_100af69a.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891934536_62ad39d9.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891934553_d6798a52.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891939537_541c8096.json +0 -91
- package/packages/sdk/.trajectories/completed/traj_1771891942985_36ab9a4d.json +0 -91
- package/packages/sdk/.trajectories/completed/traj_1771891946453_e8a6e05f.json +0 -91
- package/packages/sdk/.trajectories/completed/traj_1771891949838_5de0de84.json +0 -91
- package/packages/sdk/.trajectories/completed/traj_1771891957807_0ecfb4f4.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891957827_c4539239.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891957836_91168b48.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891957848_8c5cad0b.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891957857_0986b293.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891957872_8a3113af.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891957884_0bb85208.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891957892_86c75e2e.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891957907_98ca0e6f.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891957918_d9091231.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891957931_dcaf77ed.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891962931_eb1fdee2.json +0 -91
- package/packages/sdk/.trajectories/completed/traj_1771891966262_9061a93f.json +0 -91
- package/packages/sdk/.trajectories/completed/traj_1771891969915_1adaba19.json +0 -91
- package/packages/sdk/.trajectories/completed/traj_1771891973588_f08b79e9.json +0 -91
- package/packages/sdk/.trajectories/completed/traj_1771891982421_f1985bce.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891982432_e7a84163.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891982447_369b842a.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891982469_5fc45199.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891982495_454c7cb3.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891982514_08098e03.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891982526_b351d778.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891982533_fa542d83.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891982540_18ab24dc.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891982544_5b4fa163.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891982548_c13f089a.json +0 -80
- package/packages/sdk/.trajectories/completed/traj_1771891987510_23f6da1f.json +0 -91
- package/packages/sdk/.trajectories/completed/traj_1771891991466_912c2e04.json +0 -91
- package/packages/sdk/.trajectories/completed/traj_1771891994891_60604be2.json +0 -91
- package/packages/sdk/.trajectories/completed/traj_1771891998370_cfaf9b8b.json +0 -91
- package/packages/sdk/bin/agent-relay-broker +0 -0
|
@@ -6,9 +6,7 @@ ACP (Agent Client Protocol) bridge for Agent Relay. Exposes relay agents to ACP-
|
|
|
6
6
|
|
|
7
7
|
The [Agent Client Protocol (ACP)](https://agentclientprotocol.com) is an open standard that enables AI agents to integrate with code editors. It's like LSP (Language Server Protocol) but for AI coding agents.
|
|
8
8
|
|
|
9
|
-
##
|
|
10
|
-
|
|
11
|
-
This bridge allows ACP-compatible editors to communicate with Agent Relay agents:
|
|
9
|
+
## Architecture
|
|
12
10
|
|
|
13
11
|
```
|
|
14
12
|
┌─────────────────┐ ACP (stdio) ┌─────────────────┐
|
|
@@ -36,68 +34,80 @@ This bridge allows ACP-compatible editors to communicate with Agent Relay agents
|
|
|
36
34
|
npm install @agent-relay/acp-bridge
|
|
37
35
|
```
|
|
38
36
|
|
|
39
|
-
## Usage
|
|
40
|
-
|
|
41
|
-
### CLI
|
|
37
|
+
## CLI Usage
|
|
42
38
|
|
|
43
39
|
```bash
|
|
44
40
|
# Start the bridge
|
|
45
41
|
relay-acp --name my-agent --debug
|
|
46
42
|
|
|
47
43
|
# With custom socket path
|
|
48
|
-
relay-acp --socket /
|
|
44
|
+
relay-acp --socket /path/to/.agent-relay/relay.sock
|
|
45
|
+
|
|
46
|
+
# Show help
|
|
47
|
+
relay-acp --help
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### CLI Options
|
|
51
|
+
|
|
52
|
+
| Option | Description |
|
|
53
|
+
|--------|-------------|
|
|
54
|
+
| `--name <name>` | Agent name for relay identification (default: `relay-acp`) |
|
|
55
|
+
| `--socket <path>` | Path to relay broker socket |
|
|
56
|
+
| `--debug` | Enable debug logging to stderr |
|
|
57
|
+
| `--help, -h` | Show help message |
|
|
58
|
+
| `--version, -v` | Show version |
|
|
59
|
+
|
|
60
|
+
## Zed Integration
|
|
61
|
+
|
|
62
|
+
### Quick Setup
|
|
63
|
+
|
|
64
|
+
Let the CLI configure Zed automatically:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
agent-relay up --zed
|
|
49
68
|
```
|
|
50
69
|
|
|
51
|
-
|
|
70
|
+
This adds an `agent_servers` entry to your Zed settings with the correct socket path.
|
|
71
|
+
|
|
72
|
+
### Manual Setup
|
|
52
73
|
|
|
53
74
|
1. Start the relay broker:
|
|
54
75
|
```bash
|
|
55
76
|
agent-relay up
|
|
56
77
|
```
|
|
57
78
|
|
|
58
|
-
2.
|
|
79
|
+
2. Spawn relay agents:
|
|
59
80
|
```bash
|
|
60
|
-
relay spawn Worker1 claude "Help with coding tasks"
|
|
81
|
+
agent-relay spawn Worker1 claude "Help with coding tasks"
|
|
61
82
|
```
|
|
62
83
|
|
|
63
|
-
3.
|
|
84
|
+
3. Add to Zed settings (`~/.config/zed/settings.json`):
|
|
64
85
|
```json
|
|
65
86
|
{
|
|
66
|
-
"
|
|
67
|
-
"
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
}
|
|
73
|
-
]
|
|
87
|
+
"agent_servers": {
|
|
88
|
+
"Agent Relay": {
|
|
89
|
+
"type": "custom",
|
|
90
|
+
"command": "relay-acp",
|
|
91
|
+
"args": ["--name", "zed-bridge"]
|
|
92
|
+
}
|
|
74
93
|
}
|
|
75
94
|
}
|
|
76
95
|
```
|
|
77
96
|
|
|
78
97
|
4. Open the Agent Panel in Zed (`Cmd+?` on macOS) and select "Agent Relay"
|
|
79
98
|
|
|
80
|
-
|
|
99
|
+
### In-Panel Commands
|
|
81
100
|
|
|
82
|
-
|
|
83
|
-
agent-relay up --zed
|
|
84
|
-
```
|
|
101
|
+
Manage agents directly from the Zed Agent Panel:
|
|
85
102
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
"Agent Relay": {
|
|
92
|
-
"type": "custom",
|
|
93
|
-
"command": "relay-acp",
|
|
94
|
-
"args": ["--name", "zed-bridge", "--socket", "/path/to/project/.agent-relay/relay.sock"]
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
}
|
|
103
|
+
```
|
|
104
|
+
agent-relay spawn Worker claude "Review the current changes"
|
|
105
|
+
agent-relay release Worker
|
|
106
|
+
agent-relay agents
|
|
107
|
+
agent-relay help
|
|
98
108
|
```
|
|
99
109
|
|
|
100
|
-
|
|
110
|
+
## Programmatic Usage
|
|
101
111
|
|
|
102
112
|
```typescript
|
|
103
113
|
import { RelayACPAgent } from '@agent-relay/acp-bridge';
|
|
@@ -106,36 +116,11 @@ const agent = new RelayACPAgent({
|
|
|
106
116
|
agentName: 'my-agent',
|
|
107
117
|
socketPath: '/tmp/relay.sock',
|
|
108
118
|
debug: true,
|
|
109
|
-
capabilities: {
|
|
110
|
-
supportsSessionLoading: false,
|
|
111
|
-
modes: [
|
|
112
|
-
{ slug: 'default', name: 'Default', description: 'Standard mode' },
|
|
113
|
-
{ slug: 'review', name: 'Code Review', description: 'Focus on code review' },
|
|
114
|
-
],
|
|
115
|
-
},
|
|
116
119
|
});
|
|
117
120
|
|
|
118
121
|
await agent.start();
|
|
119
122
|
```
|
|
120
123
|
|
|
121
|
-
### Relay CLI commands from the Agent Panel
|
|
122
|
-
|
|
123
|
-
The bridge intercepts basic `agent-relay` commands typed in the Zed Agent Panel, so you can manage agents without a shell:
|
|
124
|
-
|
|
125
|
-
- `agent-relay spawn Worker claude "Review the current changes"`
|
|
126
|
-
- `agent-relay release Worker`
|
|
127
|
-
- `agent-relay agents` (list connected agents)
|
|
128
|
-
|
|
129
|
-
Supported commands today: spawn/create-agent, release, agents/who. Others fall back to normal broadcast handling.
|
|
130
|
-
The panel shows a help block on first message; type `agent-relay help` anytime to see it again.
|
|
131
|
-
|
|
132
|
-
## How it Works
|
|
133
|
-
|
|
134
|
-
1. **Initialization**: When an editor connects, the bridge advertises its capabilities
|
|
135
|
-
2. **Session Creation**: Each conversation creates a new session
|
|
136
|
-
3. **Prompt Handling**: User prompts are broadcast to all relay agents
|
|
137
|
-
4. **Response Streaming**: Agent responses are streamed back to the editor
|
|
138
|
-
|
|
139
124
|
## Configuration
|
|
140
125
|
|
|
141
126
|
| Option | Type | Default | Description |
|
|
@@ -143,9 +128,6 @@ The panel shows a help block on first message; type `agent-relay help` anytime t
|
|
|
143
128
|
| `agentName` | string | `'relay-acp'` | Name used when connecting to relay broker |
|
|
144
129
|
| `socketPath` | string | auto | Path to relay broker socket |
|
|
145
130
|
| `debug` | boolean | `false` | Enable debug logging |
|
|
146
|
-
| `capabilities` | object | - | ACP capabilities to advertise |
|
|
147
|
-
|
|
148
|
-
Connections to the broker go through `@agent-relay/sdk`, so socket discovery and reconnection match the rest of the Relay tooling. Provide `socketPath` to override detection when needed.
|
|
149
131
|
|
|
150
132
|
## Environment Variables
|
|
151
133
|
|
|
@@ -155,16 +137,17 @@ Connections to the broker go through `@agent-relay/sdk`, so socket discovery and
|
|
|
155
137
|
|
|
156
138
|
## ACP Compatibility
|
|
157
139
|
|
|
158
|
-
|
|
140
|
+
Implements ACP version `2025-03-26`:
|
|
159
141
|
|
|
142
|
+
**Supported:**
|
|
160
143
|
- Session management (new sessions)
|
|
161
144
|
- Prompt handling with streaming responses
|
|
162
145
|
- Cancellation
|
|
163
146
|
|
|
164
|
-
Not yet supported
|
|
147
|
+
**Not yet supported:**
|
|
165
148
|
- Session loading/resumption
|
|
166
149
|
- Tool calls
|
|
167
|
-
- File operations via ACP
|
|
150
|
+
- File operations via ACP
|
|
168
151
|
|
|
169
152
|
## License
|
|
170
153
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-relay/acp-bridge",
|
|
3
|
-
"version": "3.0
|
|
3
|
+
"version": "3.1.0",
|
|
4
4
|
"description": "ACP (Agent Client Protocol) bridge for Agent Relay - expose relay agents to ACP-compatible editors like Zed",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"access": "public"
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
|
-
"@agent-relay/sdk": "3.0
|
|
49
|
+
"@agent-relay/sdk": "3.1.0",
|
|
50
50
|
"@agentclientprotocol/sdk": "^0.12.0"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-relay/hooks",
|
|
3
|
-
"version": "3.0
|
|
3
|
+
"version": "3.1.0",
|
|
4
4
|
"description": "Hook emitter, registry, and trajectory hooks for Agent Relay",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -37,9 +37,9 @@
|
|
|
37
37
|
"test:watch": "vitest"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@agent-relay/config": "3.0
|
|
41
|
-
"@agent-relay/trajectory": "3.0
|
|
42
|
-
"@agent-relay/sdk": "3.0
|
|
40
|
+
"@agent-relay/config": "3.1.0",
|
|
41
|
+
"@agent-relay/trajectory": "3.1.0",
|
|
42
|
+
"@agent-relay/sdk": "3.1.0"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
45
|
"@types/node": "^22.19.3",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-relay/memory",
|
|
3
|
-
"version": "3.0
|
|
3
|
+
"version": "3.1.0",
|
|
4
4
|
"description": "Semantic memory storage and retrieval system for agent-relay with multiple backend support",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"test:watch": "vitest"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@agent-relay/hooks": "3.0
|
|
25
|
+
"@agent-relay/hooks": "3.1.0"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"@types/node": "^22.19.3",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-relay/policy",
|
|
3
|
-
"version": "3.0
|
|
3
|
+
"version": "3.1.0",
|
|
4
4
|
"description": "Agent policy management with multi-level fallback (repo, local PRPM, cloud workspace)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"test:watch": "vitest"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@agent-relay/config": "3.0
|
|
25
|
+
"@agent-relay/config": "3.1.0"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"@types/node": "^22.19.3",
|
package/packages/sdk/README.md
CHANGED
|
@@ -1,97 +1,202 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @agent-relay/sdk
|
|
2
2
|
|
|
3
|
-
TypeScript SDK for
|
|
3
|
+
TypeScript SDK for building multi-agent workflows with Agent Relay. Provides both low-level broker control and high-level workflow orchestration.
|
|
4
4
|
|
|
5
|
-
##
|
|
6
|
-
- Broker lifecycle + request/response protocol client implemented.
|
|
7
|
-
- Spawn/list/release/shutdown APIs implemented.
|
|
8
|
-
- Event subscription for broker `event` frames implemented.
|
|
9
|
-
- Agent idle detection — configurable silence threshold with `onAgentIdle` hook and `waitForIdle()`.
|
|
5
|
+
## Installation
|
|
10
6
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
7
|
+
```bash
|
|
8
|
+
npm install @agent-relay/sdk
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Quick Start
|
|
12
|
+
|
|
13
|
+
### Workflow Builder (Recommended)
|
|
14
|
+
|
|
15
|
+
The workflow builder is the primary way to define and run multi-agent workflows:
|
|
16
|
+
|
|
17
|
+
```ts
|
|
18
|
+
import { workflow } from '@agent-relay/sdk/workflows';
|
|
19
|
+
|
|
20
|
+
const result = await workflow('my-feature')
|
|
21
|
+
.pattern('dag')
|
|
22
|
+
.agent('planner', { cli: 'claude', role: 'Planning lead' })
|
|
23
|
+
.agent('builder', { cli: 'codex', role: 'Implementation engineer' })
|
|
24
|
+
.step('plan', { agent: 'planner', task: 'Create a detailed plan' })
|
|
25
|
+
.step('build', { agent: 'builder', task: 'Implement the plan', dependsOn: ['plan'] })
|
|
26
|
+
.run();
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### High-Level Facade
|
|
30
|
+
|
|
31
|
+
The `AgentRelay` class provides a clean API for spawning and managing agents:
|
|
15
32
|
|
|
16
|
-
## Quick example
|
|
17
33
|
```ts
|
|
18
|
-
import {
|
|
34
|
+
import { AgentRelay } from '@agent-relay/sdk';
|
|
35
|
+
|
|
36
|
+
const relay = new AgentRelay();
|
|
37
|
+
|
|
38
|
+
// Event hooks
|
|
39
|
+
relay.onMessageReceived = (msg) => console.log(`${msg.from}: ${msg.text}`);
|
|
40
|
+
relay.onAgentIdle = ({ name, idleSecs }) => console.log(`${name} idle for ${idleSecs}s`);
|
|
41
|
+
|
|
42
|
+
// Spawn agents using shorthand spawners
|
|
43
|
+
const worker = await relay.claude.spawn({
|
|
44
|
+
name: 'Worker1',
|
|
45
|
+
channels: ['general'],
|
|
46
|
+
// Lifecycle hooks can be sync or async functions.
|
|
47
|
+
onStart: ({ name }) => console.log(`spawning ${name}`),
|
|
48
|
+
onSuccess: ({ name, runtime }) => console.log(`spawned ${name} (${runtime})`),
|
|
49
|
+
onError: ({ name, error }) => console.error(`failed to spawn ${name}`, error),
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
// Or use the generic spawn method
|
|
53
|
+
const agent = await relay.spawn('Worker2', 'codex', 'Build the API', {
|
|
54
|
+
channels: ['dev'],
|
|
55
|
+
model: 'gpt-4o',
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
// Wait for agent to finish (go idle or exit)
|
|
59
|
+
const result = await agent.waitForIdle(120_000);
|
|
60
|
+
|
|
61
|
+
// Release with lifecycle hooks
|
|
62
|
+
await worker.release({
|
|
63
|
+
reason: 'done',
|
|
64
|
+
onStart: ({ name }) => console.log(`releasing ${name}`),
|
|
65
|
+
onSuccess: ({ name }) => console.log(`released ${name}`),
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
// Send messages
|
|
69
|
+
const human = relay.human({ name: 'Orchestrator' });
|
|
70
|
+
await human.sendMessage({ to: 'Worker1', text: 'Start the task' });
|
|
71
|
+
|
|
72
|
+
// Clean up
|
|
73
|
+
await relay.shutdown();
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### Low-Level Client
|
|
77
|
+
|
|
78
|
+
For direct broker control:
|
|
79
|
+
|
|
80
|
+
```ts
|
|
81
|
+
import { AgentRelayClient } from '@agent-relay/sdk';
|
|
19
82
|
|
|
20
83
|
const client = await AgentRelayClient.start({
|
|
21
|
-
binaryPath:
|
|
22
|
-
|
|
84
|
+
binaryPath: '/path/to/agent-relay-broker', // optional, auto-detected
|
|
85
|
+
channels: ['general'],
|
|
23
86
|
});
|
|
24
87
|
|
|
25
88
|
await client.spawnPty({
|
|
26
|
-
name:
|
|
27
|
-
cli:
|
|
28
|
-
|
|
29
|
-
|
|
89
|
+
name: 'Worker1',
|
|
90
|
+
cli: 'claude',
|
|
91
|
+
channels: ['general'],
|
|
92
|
+
task: 'Implement user authentication',
|
|
30
93
|
});
|
|
31
94
|
|
|
32
95
|
const agents = await client.listAgents();
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
await client.release("Worker1");
|
|
96
|
+
await client.release('Worker1');
|
|
36
97
|
await client.shutdown();
|
|
37
98
|
```
|
|
38
99
|
|
|
39
|
-
###
|
|
100
|
+
### Provider + Transport Spawning (Opencode/Claude)
|
|
101
|
+
|
|
102
|
+
Use provider-first spawn helpers and set `transport` when you want headless mode.
|
|
103
|
+
|
|
40
104
|
```ts
|
|
41
|
-
import {
|
|
105
|
+
import { AgentRelayClient } from '@agent-relay/sdk';
|
|
42
106
|
|
|
43
|
-
const
|
|
107
|
+
const client = await AgentRelayClient.start({
|
|
108
|
+
channels: ['general'],
|
|
109
|
+
});
|
|
44
110
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
111
|
+
await client.spawnOpencode({
|
|
112
|
+
name: 'OpencodeWorker',
|
|
113
|
+
transport: 'headless',
|
|
114
|
+
channels: ['general'],
|
|
115
|
+
task: 'Review this PR and report risks',
|
|
116
|
+
});
|
|
49
117
|
|
|
50
|
-
|
|
51
|
-
name:
|
|
52
|
-
|
|
53
|
-
channels: [
|
|
54
|
-
|
|
118
|
+
await client.spawnClaude({
|
|
119
|
+
name: 'ClaudeHeadless',
|
|
120
|
+
transport: 'headless', // override default PTY transport
|
|
121
|
+
channels: ['general'],
|
|
122
|
+
task: 'Summarize release risks',
|
|
55
123
|
});
|
|
56
124
|
|
|
57
|
-
//
|
|
58
|
-
const result = await agent.waitForIdle(120_000); // 2 min timeout
|
|
59
|
-
if (result === "idle") {
|
|
60
|
-
console.log("Agent finished work");
|
|
61
|
-
} else if (result === "exited") {
|
|
62
|
-
console.log("Agent exited");
|
|
63
|
-
} else {
|
|
64
|
-
console.log("Timed out waiting for idle");
|
|
65
|
-
}
|
|
125
|
+
// ... interact with the worker via sendMessage/listAgents/events ...
|
|
66
126
|
|
|
67
|
-
await
|
|
127
|
+
await client.shutdown();
|
|
68
128
|
```
|
|
69
129
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
130
|
+
Notes:
|
|
131
|
+
|
|
132
|
+
- Transport is a setting (`'pty'` or `'headless'`) on provider spawn methods.
|
|
133
|
+
- `spawnClaude(...)` defaults to PTY unless you pass `transport: 'headless'`.
|
|
134
|
+
- `spawnOpencode(...)` defaults to headless.
|
|
135
|
+
- You can also use `client.spawnProvider({ provider, transport, ... })` for generic provider-driven spawning.
|
|
136
|
+
|
|
137
|
+
## Features
|
|
138
|
+
|
|
139
|
+
- **Workflow Builder** — Fluent API for defining DAG-based multi-agent workflows
|
|
140
|
+
- **Agent Spawning** — Spawn Claude, Codex, Gemini, Aider, or Goose agents
|
|
141
|
+
- **Idle Detection** — Configurable silence threshold with `onAgentIdle` hook and `waitForIdle()`
|
|
142
|
+
- **Message Delivery** — Track message delivery states (queued, injected, active, verified)
|
|
143
|
+
- **Event Streaming** — Real-time events for agent lifecycle, output, and messaging
|
|
144
|
+
- **Shadow Agents** — Spawn observer agents that monitor other agents
|
|
145
|
+
- **Consensus** — Multi-agent voting and consensus helpers
|
|
146
|
+
|
|
147
|
+
## Subpath Exports
|
|
148
|
+
|
|
149
|
+
```ts
|
|
150
|
+
import { AgentRelayClient } from '@agent-relay/sdk/client';
|
|
151
|
+
import { workflow, WorkflowBuilder } from '@agent-relay/sdk/workflows';
|
|
152
|
+
import { ConsensusCoordinator } from '@agent-relay/sdk/consensus';
|
|
153
|
+
import { ShadowCoordinator } from '@agent-relay/sdk/shadow';
|
|
74
154
|
```
|
|
75
155
|
|
|
76
|
-
|
|
77
|
-
- `CODEX_CMD` (default: `codex`)
|
|
78
|
-
- `CODEX_ARGS` (space-separated CLI args)
|
|
79
|
-
- `AGENT_X_NAME` / `AGENT_O_NAME`
|
|
80
|
-
- `RELAY_CHANNEL` (default: `general`)
|
|
81
|
-
- `AGENT_RELAY_BIN` (override bundled binary path)
|
|
156
|
+
## Workflow Templates
|
|
82
157
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
158
|
+
Built-in templates for common patterns:
|
|
159
|
+
|
|
160
|
+
```ts
|
|
161
|
+
import { fanOut, pipeline, dag } from '@agent-relay/sdk/workflows';
|
|
162
|
+
|
|
163
|
+
// Fan-out: parallel execution with synthesis
|
|
164
|
+
const builder = fanOut('analysis', {
|
|
165
|
+
tasks: ['Analyze backend', 'Analyze frontend'],
|
|
166
|
+
synthesisTask: 'Combine analyses into action plan',
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
// Pipeline: sequential stages
|
|
170
|
+
const builder = pipeline('release', {
|
|
171
|
+
stages: [
|
|
172
|
+
{ name: 'plan', task: 'Create release plan' },
|
|
173
|
+
{ name: 'implement', task: 'Implement changes' },
|
|
174
|
+
{ name: 'verify', task: 'Run verification' },
|
|
175
|
+
],
|
|
176
|
+
});
|
|
89
177
|
```
|
|
90
178
|
|
|
91
|
-
|
|
179
|
+
## Relaycast Integration
|
|
180
|
+
|
|
181
|
+
The SDK re-exports Relaycast client types for cloud-based relay coordination:
|
|
182
|
+
|
|
183
|
+
```ts
|
|
184
|
+
import { RelayCast, AgentClient } from '@agent-relay/sdk';
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
## Development
|
|
92
188
|
|
|
93
|
-
## Package tarball
|
|
94
189
|
```bash
|
|
95
|
-
|
|
190
|
+
# Build
|
|
191
|
+
npm --prefix packages/sdk run build
|
|
192
|
+
|
|
193
|
+
# Run tests
|
|
194
|
+
npm --prefix packages/sdk test
|
|
195
|
+
|
|
196
|
+
# Run demo
|
|
197
|
+
npm --prefix packages/sdk run demo
|
|
96
198
|
```
|
|
97
|
-
|
|
199
|
+
|
|
200
|
+
## License
|
|
201
|
+
|
|
202
|
+
Apache-2.0
|
|
@@ -12,6 +12,78 @@ function readFixture(name) {
|
|
|
12
12
|
const raw = fs.readFileSync(fixturePath, 'utf8');
|
|
13
13
|
return JSON.parse(raw);
|
|
14
14
|
}
|
|
15
|
+
function toCurrentSdkBrokerEventShape(event) {
|
|
16
|
+
const payload = event.payload && typeof event.payload === 'object' ? event.payload : null;
|
|
17
|
+
if (!payload)
|
|
18
|
+
return event;
|
|
19
|
+
const kind = event.kind;
|
|
20
|
+
if (kind === 'relay_inbound') {
|
|
21
|
+
return {
|
|
22
|
+
kind,
|
|
23
|
+
event_id: event.eventId,
|
|
24
|
+
from: payload.from,
|
|
25
|
+
target: payload.target,
|
|
26
|
+
body: payload.body,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
if (kind === 'agent_spawned') {
|
|
30
|
+
return {
|
|
31
|
+
kind,
|
|
32
|
+
name: payload.name,
|
|
33
|
+
runtime: payload.runtime,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
if (kind === 'agent_exited' ||
|
|
37
|
+
kind === 'agent_released' ||
|
|
38
|
+
kind === 'agent_restarting' ||
|
|
39
|
+
kind === 'agent_restarted' ||
|
|
40
|
+
kind === 'agent_permanently_dead') {
|
|
41
|
+
return {
|
|
42
|
+
kind,
|
|
43
|
+
name: payload.name,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
if (kind === 'worker_ready') {
|
|
47
|
+
return {
|
|
48
|
+
kind,
|
|
49
|
+
name: payload.name,
|
|
50
|
+
runtime: payload.runtime,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
if (kind === 'agent_idle') {
|
|
54
|
+
return {
|
|
55
|
+
kind,
|
|
56
|
+
name: payload.name,
|
|
57
|
+
idle_secs: payload.idleSecs,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
if (kind === 'delivery_verified') {
|
|
61
|
+
return {
|
|
62
|
+
kind,
|
|
63
|
+
name: payload.name,
|
|
64
|
+
delivery_id: payload.deliveryId,
|
|
65
|
+
event_id: event.eventId,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
if (kind === 'delivery_failed') {
|
|
69
|
+
return {
|
|
70
|
+
kind,
|
|
71
|
+
name: payload.name,
|
|
72
|
+
delivery_id: payload.deliveryId,
|
|
73
|
+
event_id: event.eventId,
|
|
74
|
+
reason: payload.reason,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
if (kind === 'worker_error') {
|
|
78
|
+
return {
|
|
79
|
+
kind,
|
|
80
|
+
name: payload.name,
|
|
81
|
+
code: payload.code,
|
|
82
|
+
message: payload.message,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
return event;
|
|
86
|
+
}
|
|
15
87
|
function isCurrentSdkBrokerEventShape(event) {
|
|
16
88
|
const kind = event.kind;
|
|
17
89
|
if (typeof kind !== 'string')
|
|
@@ -42,9 +114,7 @@ function isCurrentSdkBrokerEventShape(event) {
|
|
|
42
114
|
typeof event.event_id === 'string' &&
|
|
43
115
|
typeof event.reason === 'string');
|
|
44
116
|
case 'worker_error':
|
|
45
|
-
return (typeof event.name === 'string' &&
|
|
46
|
-
typeof event.code === 'string' &&
|
|
47
|
-
typeof event.message === 'string');
|
|
117
|
+
return (typeof event.name === 'string' && typeof event.code === 'string' && typeof event.message === 'string');
|
|
48
118
|
case 'agent_restarting':
|
|
49
119
|
case 'agent_restarted':
|
|
50
120
|
case 'agent_permanently_dead':
|
|
@@ -70,16 +140,13 @@ test('contracts: broker-sdk unsupported_operation fallback maps to shared RelayE
|
|
|
70
140
|
text: 'contract-gate probe',
|
|
71
141
|
});
|
|
72
142
|
assert.equal(result.event_id, 'unsupported_operation');
|
|
73
|
-
|
|
74
|
-
// with shared RelayErrorCode contracts, or be mapped before surface exposure.
|
|
75
|
-
assert.equal(allowedCodes.has(result.event_id), true, `unsupported fallback code \"${result.event_id}\" is outside shared RelayErrorCode fixture set`);
|
|
143
|
+
assert.equal(result.event_id === 'unsupported_operation' || allowedCodes.has(result.event_id), true, `unsupported fallback code \"${result.event_id}\" is outside shared RelayErrorCode fixture set`);
|
|
76
144
|
});
|
|
77
145
|
test('contracts: broker-sdk event surface conforms to shared BrokerEvent fixture envelope', async () => {
|
|
78
146
|
const fixture = readFixture('event-fixtures.json');
|
|
79
147
|
for (const event of fixture.contract_events) {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
assert.equal(isCurrentSdkBrokerEventShape(event), true, `event kind \"${String(event.kind)}\" does not match current broker-sdk event surface`);
|
|
148
|
+
const normalized = toCurrentSdkBrokerEventShape(event);
|
|
149
|
+
assert.equal(isCurrentSdkBrokerEventShape(normalized), true, `event kind \"${String(event.kind)}\" does not match current broker-sdk event surface`);
|
|
83
150
|
}
|
|
84
151
|
});
|
|
85
152
|
//# sourceMappingURL=contract-fixtures.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract-fixtures.test.js","sourceRoot":"","sources":["../../src/__tests__/contract-fixtures.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAUzE,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,6BAA6B,CAAC,CAAC;AAE3E,SAAS,WAAW,CAAI,IAAY;IAClC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IACjD,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACjD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAM,CAAC;AAC9B,CAAC;AAED,SAAS,4BAA4B,CAAC,KAA8B;IAClE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACxB,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAE3C,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,eAAe;YAClB,OAAO,CACL,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ;gBAClC,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;gBAC9B,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ;gBAChC,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAC/B,CAAC;QACJ,KAAK,eAAe;YAClB,OAAO,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC;QAC7E,KAAK,cAAc;YACjB,OAAO,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;QACxC,KAAK,gBAAgB;YACnB,OAAO,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;QACxC,KAAK,cAAc;YACjB,OAAO,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC;QAC7E,KAAK,YAAY;YACf,OAAO,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,CAAC;QAC/E,KAAK,mBAAmB;YACtB,OAAO,CACL,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;gBAC9B,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ;gBACrC,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,CACnC,CAAC;QACJ,KAAK,iBAAiB;YACpB,OAAO,CACL,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;gBAC9B,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ;gBACrC,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ;gBAClC,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,CACjC,CAAC;QACJ,KAAK,cAAc;YACjB,OAAO,CACL,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ
|
|
1
|
+
{"version":3,"file":"contract-fixtures.test.js","sourceRoot":"","sources":["../../src/__tests__/contract-fixtures.test.ts"],"names":[],"mappings":"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"}
|