@agent-relay/mcp 2.0.4 → 2.0.6
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 +19 -135
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +67 -27
- package/dist/client.js.map +1 -1
- package/dist/cloud.d.ts.map +1 -1
- package/dist/cloud.js +1 -18
- package/dist/cloud.js.map +1 -1
- package/dist/prompts/protocol.d.ts +1 -1
- package/dist/prompts/protocol.d.ts.map +1 -1
- package/dist/prompts/protocol.js +6 -14
- package/dist/prompts/protocol.js.map +1 -1
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -160,166 +160,50 @@ The MCP server provides:
|
|
|
160
160
|
|
|
161
161
|
In cloud environments (with `WORKSPACE_ID` set), MCP is pre-configured and uses workspace-specific sockets automatically.
|
|
162
162
|
|
|
163
|
-
## Programmatic Usage
|
|
163
|
+
## Programmatic Usage
|
|
164
164
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
### Simple Tools API (Recommended)
|
|
165
|
+
Use relay tools directly in your code (no MCP protocol needed):
|
|
168
166
|
|
|
169
167
|
```typescript
|
|
170
168
|
import { createTools } from '@agent-relay/mcp';
|
|
171
169
|
|
|
172
|
-
|
|
173
|
-
const tools = createTools('Conductor');
|
|
174
|
-
|
|
175
|
-
// Send messages to agents
|
|
176
|
-
await tools.send('Worker1', 'Run the test suite');
|
|
177
|
-
await tools.send('#team', 'Starting task coordination'); // Channel
|
|
178
|
-
await tools.send('*', 'System announcement'); // Broadcast
|
|
170
|
+
const tools = createTools('MyAgent');
|
|
179
171
|
|
|
180
|
-
//
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
task: 'Run all tests and report failures',
|
|
185
|
-
cwd: '/path/to/project', // Optional working directory
|
|
186
|
-
});
|
|
172
|
+
// Send messages
|
|
173
|
+
await tools.send('OtherAgent', 'Hello!');
|
|
174
|
+
await tools.send('#general', 'Channel message');
|
|
175
|
+
await tools.send('*', 'Broadcast');
|
|
187
176
|
|
|
188
|
-
|
|
189
|
-
console.error('Spawn failed:', result.error);
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
// Check your inbox
|
|
177
|
+
// Check inbox
|
|
193
178
|
const messages = await tools.inbox();
|
|
194
179
|
for (const msg of messages) {
|
|
195
|
-
console.log(
|
|
196
|
-
if (msg.channel) console.log(` (in ${msg.channel})`);
|
|
180
|
+
console.log(`${msg.from}: ${msg.content}`);
|
|
197
181
|
}
|
|
198
182
|
|
|
199
183
|
// List online agents
|
|
200
184
|
const agents = await tools.who();
|
|
201
|
-
console.log('Online agents:', agents.map(a => a.name));
|
|
202
|
-
|
|
203
|
-
// Release workers when done
|
|
204
|
-
await tools.release('TestRunner', 'Tests complete');
|
|
205
|
-
|
|
206
|
-
// Get connection status
|
|
207
|
-
const status = await tools.status();
|
|
208
|
-
console.log(`Connected: ${status.connected}, Project: ${status.project}`);
|
|
209
|
-
```
|
|
210
|
-
|
|
211
|
-
### Full Integration Example
|
|
212
|
-
|
|
213
|
-
```typescript
|
|
214
|
-
import { createTools, type RelayTools, type Message, type Agent } from '@agent-relay/mcp';
|
|
215
|
-
|
|
216
|
-
class AgentOrchestrator {
|
|
217
|
-
private tools: RelayTools;
|
|
218
|
-
private workers: Map<string, { task: string; status: string }> = new Map();
|
|
219
|
-
|
|
220
|
-
constructor(name: string) {
|
|
221
|
-
this.tools = createTools(name);
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
async spawnWorker(name: string, task: string) {
|
|
225
|
-
const result = await this.tools.spawn({
|
|
226
|
-
name,
|
|
227
|
-
cli: 'claude',
|
|
228
|
-
task,
|
|
229
|
-
});
|
|
230
|
-
|
|
231
|
-
if (result.success) {
|
|
232
|
-
this.workers.set(name, { task, status: 'running' });
|
|
233
|
-
}
|
|
234
|
-
return result;
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
async sendTask(workerName: string, task: string) {
|
|
238
|
-
await this.tools.send(workerName, task);
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
async waitForCompletion(workerName: string, timeoutMs = 60000) {
|
|
242
|
-
// Use sendAndWait for synchronous request-response
|
|
243
|
-
const response = await this.tools.sendAndWait(
|
|
244
|
-
workerName,
|
|
245
|
-
'Report your status',
|
|
246
|
-
{ timeoutMs }
|
|
247
|
-
);
|
|
248
|
-
return response;
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
async getMessages(): Promise<Message[]> {
|
|
252
|
-
return this.tools.inbox();
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
async getOnlineAgents(): Promise<Agent[]> {
|
|
256
|
-
return this.tools.who();
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
async releaseWorker(name: string) {
|
|
260
|
-
await this.tools.release(name);
|
|
261
|
-
this.workers.delete(name);
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
async releaseAll() {
|
|
265
|
-
for (const name of this.workers.keys()) {
|
|
266
|
-
await this.releaseWorker(name);
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
// Usage
|
|
272
|
-
const conductor = new AgentOrchestrator('Conductor');
|
|
273
185
|
|
|
274
|
-
|
|
275
|
-
await
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
// Check for responses
|
|
282
|
-
const messages = await conductor.getMessages();
|
|
186
|
+
// Spawn workers
|
|
187
|
+
await tools.spawn({
|
|
188
|
+
name: 'Worker1',
|
|
189
|
+
cli: 'claude',
|
|
190
|
+
task: 'Run tests',
|
|
191
|
+
});
|
|
283
192
|
|
|
284
|
-
//
|
|
285
|
-
await
|
|
193
|
+
// Release workers
|
|
194
|
+
await tools.release('Worker1');
|
|
286
195
|
```
|
|
287
196
|
|
|
288
|
-
### One-liners
|
|
197
|
+
### One-liners
|
|
289
198
|
|
|
290
199
|
```typescript
|
|
291
|
-
import { send, inbox, who } from '@agent-relay/mcp';
|
|
200
|
+
import { send, inbox, who } from '@agent-relay/mcp/simple';
|
|
292
201
|
|
|
293
|
-
// Send a message
|
|
294
202
|
await send('MyAgent', 'Bob', 'Hello!');
|
|
295
|
-
|
|
296
|
-
// Check inbox
|
|
297
203
|
const messages = await inbox('MyAgent');
|
|
298
|
-
|
|
299
|
-
// List agents
|
|
300
204
|
const agents = await who();
|
|
301
205
|
```
|
|
302
206
|
|
|
303
|
-
### Socket Discovery
|
|
304
|
-
|
|
305
|
-
The MCP package auto-discovers the daemon socket:
|
|
306
|
-
|
|
307
|
-
```typescript
|
|
308
|
-
import { discoverSocket, getConnectionInfo } from '@agent-relay/mcp';
|
|
309
|
-
|
|
310
|
-
// Get socket path and metadata
|
|
311
|
-
const discovery = discoverSocket();
|
|
312
|
-
if (discovery) {
|
|
313
|
-
console.log(`Socket: ${discovery.socketPath}`);
|
|
314
|
-
console.log(`Project: ${discovery.project}`);
|
|
315
|
-
console.log(`Source: ${discovery.source}`); // 'env' | 'cloud' | 'cwd' | 'scan'
|
|
316
|
-
console.log(`Cloud: ${discovery.isCloud}`);
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
// Or get full connection info
|
|
320
|
-
const info = getConnectionInfo();
|
|
321
|
-
```
|
|
322
|
-
|
|
323
207
|
## Requirements
|
|
324
208
|
|
|
325
209
|
- Node.js 18+
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChF,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzJ,KAAK,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzI,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtF,SAAS,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9I,QAAQ,CAAC,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IACjM,UAAU,CAAC,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;CACpJ;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChF,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzJ,KAAK,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzI,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtF,SAAS,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9I,QAAQ,CAAC,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IACjM,UAAU,CAAC,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;CACpJ;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AA+CD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW,CAoG1E;AAED,eAAe,iBAAiB,CAAC"}
|
package/dist/client.js
CHANGED
|
@@ -2,55 +2,95 @@
|
|
|
2
2
|
* RelayClient - Client for connecting to the Agent Relay daemon
|
|
3
3
|
*/
|
|
4
4
|
import { createConnection } from 'node:net';
|
|
5
|
-
import { randomUUID } from 'node:crypto';
|
|
6
5
|
import { discoverSocket } from './cloud.js';
|
|
7
6
|
import { DaemonNotRunningError } from './errors.js';
|
|
7
|
+
// Protocol version
|
|
8
|
+
const PROTOCOL_VERSION = 1;
|
|
9
|
+
/**
|
|
10
|
+
* Encode a message envelope into a length-prefixed frame (legacy format).
|
|
11
|
+
* Format: 4-byte big-endian length + JSON payload
|
|
12
|
+
*/
|
|
13
|
+
function encodeFrame(envelope) {
|
|
14
|
+
const json = JSON.stringify(envelope);
|
|
15
|
+
const data = Buffer.from(json, 'utf-8');
|
|
16
|
+
const header = Buffer.alloc(4);
|
|
17
|
+
header.writeUInt32BE(data.length, 0);
|
|
18
|
+
return Buffer.concat([header, data]);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Frame parser for length-prefixed messages.
|
|
22
|
+
*/
|
|
23
|
+
class FrameParser {
|
|
24
|
+
buffer = Buffer.alloc(0);
|
|
25
|
+
push(data) {
|
|
26
|
+
this.buffer = Buffer.concat([this.buffer, data]);
|
|
27
|
+
const frames = [];
|
|
28
|
+
while (this.buffer.length >= 4) {
|
|
29
|
+
const frameLength = this.buffer.readUInt32BE(0);
|
|
30
|
+
const totalLength = 4 + frameLength;
|
|
31
|
+
if (this.buffer.length < totalLength)
|
|
32
|
+
break;
|
|
33
|
+
const payload = this.buffer.subarray(4, totalLength);
|
|
34
|
+
this.buffer = this.buffer.subarray(totalLength);
|
|
35
|
+
try {
|
|
36
|
+
frames.push(JSON.parse(payload.toString('utf-8')));
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
// Skip malformed frames
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return frames;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
8
45
|
export function createRelayClient(options) {
|
|
9
46
|
const { agentName, project = 'default', timeout = 5000 } = options;
|
|
10
47
|
const discovery = discoverSocket({ socketPath: options.socketPath });
|
|
11
48
|
const socketPath = discovery?.socketPath || options.socketPath || '/tmp/agent-relay.sock';
|
|
12
|
-
//
|
|
13
|
-
|
|
49
|
+
// Generate unique IDs
|
|
50
|
+
let idCounter = 0;
|
|
51
|
+
const generateId = () => `mcp-${Date.now().toString(36)}-${(++idCounter).toString(36)}`;
|
|
14
52
|
async function request(type, payload) {
|
|
15
53
|
return new Promise((resolve, reject) => {
|
|
16
54
|
const id = generateId();
|
|
17
|
-
|
|
55
|
+
// Build a proper protocol envelope
|
|
56
|
+
const envelope = {
|
|
57
|
+
v: PROTOCOL_VERSION,
|
|
58
|
+
type,
|
|
59
|
+
id,
|
|
60
|
+
ts: Date.now(),
|
|
61
|
+
payload,
|
|
62
|
+
};
|
|
18
63
|
let timedOut = false;
|
|
19
|
-
|
|
64
|
+
const parser = new FrameParser();
|
|
20
65
|
const socket = createConnection(socketPath);
|
|
21
66
|
const timeoutId = setTimeout(() => {
|
|
22
67
|
timedOut = true;
|
|
23
68
|
socket.destroy();
|
|
24
69
|
reject(new Error(`Request timeout after ${timeout}ms`));
|
|
25
70
|
}, timeout);
|
|
26
|
-
socket.on('connect', () => socket.write(
|
|
71
|
+
socket.on('connect', () => socket.write(encodeFrame(envelope)));
|
|
27
72
|
socket.on('data', (data) => {
|
|
28
73
|
// Ignore data if we've already timed out
|
|
29
74
|
if (timedOut)
|
|
30
75
|
return;
|
|
31
|
-
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
socket.end();
|
|
42
|
-
if (response.error)
|
|
43
|
-
reject(new Error(response.error));
|
|
44
|
-
else
|
|
45
|
-
resolve(response.payload);
|
|
46
|
-
return;
|
|
76
|
+
const frames = parser.push(data);
|
|
77
|
+
for (const response of frames) {
|
|
78
|
+
// Check if this is a response to our request
|
|
79
|
+
if (response.id === id || response.payload?.replyTo === id) {
|
|
80
|
+
clearTimeout(timeoutId);
|
|
81
|
+
socket.end();
|
|
82
|
+
// Handle error responses
|
|
83
|
+
if (response.type === 'ERROR') {
|
|
84
|
+
const errorPayload = response.payload;
|
|
85
|
+
reject(new Error(errorPayload?.message || errorPayload?.code || 'Unknown error'));
|
|
47
86
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
87
|
+
else if (response.payload?.error) {
|
|
88
|
+
reject(new Error(response.payload.error));
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
resolve(response.payload);
|
|
53
92
|
}
|
|
93
|
+
return;
|
|
54
94
|
}
|
|
55
95
|
}
|
|
56
96
|
});
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAe,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/cloud.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloud.d.ts","sourceRoot":"","sources":["../src/cloud.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"cloud.d.ts","sourceRoot":"","sources":["../src/cloud.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,KAAK,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,cAAc,CAAC;CAC5B;AAED,MAAM,WAAW,sBAAsB;IACrC,yCAAyC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mCAAmC;IACnC,SAAS,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;CACrC;AAMD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,IAAI,cAAc,GAAG,IAAI,CAc5D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAE1C;AAMD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEjF;AAoBD;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,OAAO,GAAE,sBAA2B,GAAG,eAAe,GAAG,IAAI,CAiJ3F;AAMD;;;;;;;GAOG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,cAAc,EACzB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,QAAQ,CAAC,CAgBnB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,cAAc,GACxB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CAAC,CAevD;AAMD,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,GAAE,sBAA2B,GACnC,mBAAmB,GAAG,IAAI,CAoB5B;AAED;;GAEG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAS/E"}
|
package/dist/cloud.js
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
import { existsSync, readdirSync, readFileSync } from 'node:fs';
|
|
8
8
|
import { join } from 'node:path';
|
|
9
9
|
import { homedir } from 'node:os';
|
|
10
|
+
import { findProjectRoot } from '@agent-relay/config';
|
|
10
11
|
// ============================================================================
|
|
11
12
|
// Cloud Workspace Detection
|
|
12
13
|
// ============================================================================
|
|
@@ -61,24 +62,6 @@ export function getCloudSocketPath(workspaceId) {
|
|
|
61
62
|
export function getCloudOutboxPath(workspaceId, agentName) {
|
|
62
63
|
return `/tmp/relay/${workspaceId}/outbox/${agentName}`;
|
|
63
64
|
}
|
|
64
|
-
/**
|
|
65
|
-
* Find project root by looking for common markers.
|
|
66
|
-
* Scans up from startDir until it finds a marker or hits the filesystem root.
|
|
67
|
-
*/
|
|
68
|
-
function findProjectRoot(startDir = process.cwd()) {
|
|
69
|
-
let current = startDir;
|
|
70
|
-
const root = current.split('/')[0] || '/';
|
|
71
|
-
const markers = ['.git', 'package.json', 'Cargo.toml', 'go.mod', 'pyproject.toml', '.agent-relay'];
|
|
72
|
-
while (current !== root && current !== '/') {
|
|
73
|
-
for (const marker of markers) {
|
|
74
|
-
if (existsSync(join(current, marker))) {
|
|
75
|
-
return current;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
current = join(current, '..');
|
|
79
|
-
}
|
|
80
|
-
return null;
|
|
81
|
-
}
|
|
82
65
|
/**
|
|
83
66
|
* Get platform-specific data directory.
|
|
84
67
|
*/
|
package/dist/cloud.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloud.js","sourceRoot":"","sources":["../src/cloud.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"cloud.js","sourceRoot":"","sources":["../src/cloud.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,6 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import type { Prompt } from '@modelcontextprotocol/sdk/types.js';
|
|
8
8
|
export declare const protocolPrompt: Prompt;
|
|
9
|
-
export declare const PROTOCOL_DOCUMENTATION = "\n# Agent Relay Protocol\n\nYou are connected to Agent Relay, a real-time messaging system for AI agent coordination.\n\n## Communication Patterns\n\n### Direct Messages\nSend a message to a specific agent by name:\n```\nrelay_send(to=\"Alice\", message=\"Can you review this PR?\")\n```\n\n### Channel Messages\nSend to a channel (prefix with #):\n```\nrelay_send(to=\"#engineering\", message=\"Build complete\")\n```\nChannel messages are visible to all agents subscribed to that channel.\n\n### Broadcast\nSend to all online agents:\n```\nrelay_send(to=\"*\", message=\"System maintenance in 5 minutes\")\n```\nUse sparingly - broadcasts interrupt all agents.\n\n### Threaded Conversations\nFor multi-turn conversations, use thread IDs:\n```\nrelay_send(to=\"Bob\", message=\"Starting task\", thread=\"task-123\")\nrelay_send(to=\"Bob\", message=\"Task update\", thread=\"task-123\")\n```\n\n### Await Response\nBlock and wait for a reply:\n```\nrelay_send(to=\"Worker\", message=\"Process this file\", await_response=true, timeout_ms=60000)\n```\n\n## Spawning Workers\n\nCreate worker agents to parallelize work:\n\n```\nrelay_spawn(\n name=\"TestRunner\",\n cli=\"claude\",\n task=\"Run the test suite in src/tests/ and report any failures\"\n)\n```\n\nWorkers:\n- Run in separate processes\n- Have their own CLI instance\n- Can use relay to communicate back\n- Should be released when done\n\n### Worker Lifecycle\n1. Spawn worker with task\n2. Worker sends ACK when ready\n3. Worker sends progress updates\n4. Worker sends DONE when complete\n5. Lead releases worker\n\n### Release Workers\n```\nrelay_release(name=\"TestRunner\", reason=\"Tests completed\")\n```\n\n## Message Protocol\n\nWhen you receive messages, they follow this format:\n```\nRelay message from Alice [msg-id-123]: Content here\n```\n\nChannel messages include the channel:\n```\nRelay message from Alice [msg-id-456] [#general]: Hello team!\n```\n\n### ACK/DONE
|
|
9
|
+
export declare const PROTOCOL_DOCUMENTATION = "\n# Agent Relay Protocol\n\nYou are connected to Agent Relay, a real-time messaging system for AI agent coordination.\n\n## Communication Patterns\n\n### Direct Messages\nSend a message to a specific agent by name:\n```\nrelay_send(to=\"Alice\", message=\"Can you review this PR?\")\n```\n\n### Channel Messages\nSend to a channel (prefix with #):\n```\nrelay_send(to=\"#engineering\", message=\"Build complete\")\n```\nChannel messages are visible to all agents subscribed to that channel.\n\n### Broadcast\nSend to all online agents:\n```\nrelay_send(to=\"*\", message=\"System maintenance in 5 minutes\")\n```\nUse sparingly - broadcasts interrupt all agents.\n\n### Threaded Conversations\nFor multi-turn conversations, use thread IDs:\n```\nrelay_send(to=\"Bob\", message=\"Starting task\", thread=\"task-123\")\nrelay_send(to=\"Bob\", message=\"Task update\", thread=\"task-123\")\n```\n\n### Await Response\nBlock and wait for a reply:\n```\nrelay_send(to=\"Worker\", message=\"Process this file\", await_response=true, timeout_ms=60000)\n```\n\n## Spawning Workers\n\nCreate worker agents to parallelize work:\n\n```\nrelay_spawn(\n name=\"TestRunner\",\n cli=\"claude\",\n task=\"Run the test suite in src/tests/ and report any failures\"\n)\n```\n\nWorkers:\n- Run in separate processes\n- Have their own CLI instance\n- Can use relay to communicate back\n- Should be released when done\n\n### Worker Lifecycle\n1. Spawn worker with task\n2. Worker sends ACK when ready\n3. Worker sends progress updates\n4. Worker sends DONE when complete\n5. Lead releases worker\n\n### Release Workers\n```\nrelay_release(name=\"TestRunner\", reason=\"Tests completed\")\n```\n\n## Message Protocol\n\nWhen you receive messages, they follow this format:\n```\nRelay message from Alice [msg-id-123]: Content here\n```\n\nChannel messages include the channel:\n```\nRelay message from Alice [msg-id-456] [#general]: Hello team!\n```\n\n### Optional: ACK/DONE Convention\nSome applications use ACK/DONE conventions for task tracking. If your application uses this pattern:\n1. Send ACK when starting: \"ACK: Starting work on X\"\n2. Send progress updates as needed\n3. Send DONE when complete: \"DONE: Completed X with result Y\"\n\nNote: This is an application-level convention, not a protocol requirement. Check your application's documentation for expected message formats.\n\n## Best Practices\n\n### For Lead Agents\n- Spawn workers for parallelizable tasks\n- Keep track of spawned workers\n- Release workers when done\n- Use channels for team announcements\n\n### For Worker Agents\n- Respond promptly when receiving tasks\n- Send progress updates for long tasks\n- Report results when complete\n- Ask clarifying questions if needed\n\n### Message Etiquette\n- Keep messages concise\n- Include relevant context\n- Use threads for related messages\n- Don't spam broadcasts\n\n## Checking Messages\n\nProactively check your inbox:\n```\nrelay_inbox()\nrelay_inbox(from=\"Lead\")\nrelay_inbox(channel=\"#urgent\")\n```\n\n## Seeing Who's Online\n\n```\nrelay_who()\n```\n\n## Error Handling\n\nIf relay returns an error:\n- \"Daemon not running\" - The relay daemon needs to be started\n- \"Agent not found\" - Target agent is offline\n- \"Channel not found\" - Channel doesn't exist\n- \"Timeout\" - No response within timeout period\n\n## Multi-Project Communication\n\nIn multi-project setups, specify project:\n```\nrelay_send(to=\"frontend:Designer\", message=\"Need UI mockup\")\n```\n\nSpecial targets:\n- `project:lead` - Lead agent of that project\n- `project:*` - Broadcast to project\n- `*:*` - Broadcast to all projects\n";
|
|
10
10
|
export declare function getProtocolPrompt(): string;
|
|
11
11
|
//# sourceMappingURL=protocol.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/prompts/protocol.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AAEjE,eAAO,MAAM,cAAc,EAAE,MAI5B,CAAC;AAEF,eAAO,MAAM,sBAAsB,
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/prompts/protocol.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AAEjE,eAAO,MAAM,cAAc,EAAE,MAI5B,CAAC;AAEF,eAAO,MAAM,sBAAsB,sjHAgJlC,CAAC;AAEF,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C"}
|
package/dist/prompts/protocol.js
CHANGED
|
@@ -91,21 +91,13 @@ Channel messages include the channel:
|
|
|
91
91
|
Relay message from Alice [msg-id-456] [#general]: Hello team!
|
|
92
92
|
\`\`\`
|
|
93
93
|
|
|
94
|
-
### ACK/DONE
|
|
95
|
-
|
|
96
|
-
1. Send ACK
|
|
94
|
+
### Optional: ACK/DONE Convention
|
|
95
|
+
Some applications use ACK/DONE conventions for task tracking. If your application uses this pattern:
|
|
96
|
+
1. Send ACK when starting: "ACK: Starting work on X"
|
|
97
97
|
2. Send progress updates as needed
|
|
98
98
|
3. Send DONE when complete: "DONE: Completed X with result Y"
|
|
99
99
|
|
|
100
|
-
|
|
101
|
-
\`\`\`
|
|
102
|
-
# When receiving a task
|
|
103
|
-
relay_send(to="Lead", message="ACK: Starting test suite run")
|
|
104
|
-
|
|
105
|
-
# ... do work ...
|
|
106
|
-
|
|
107
|
-
relay_send(to="Lead", message="DONE: All 42 tests passed")
|
|
108
|
-
\`\`\`
|
|
100
|
+
Note: This is an application-level convention, not a protocol requirement. Check your application's documentation for expected message formats.
|
|
109
101
|
|
|
110
102
|
## Best Practices
|
|
111
103
|
|
|
@@ -116,9 +108,9 @@ relay_send(to="Lead", message="DONE: All 42 tests passed")
|
|
|
116
108
|
- Use channels for team announcements
|
|
117
109
|
|
|
118
110
|
### For Worker Agents
|
|
119
|
-
-
|
|
111
|
+
- Respond promptly when receiving tasks
|
|
120
112
|
- Send progress updates for long tasks
|
|
121
|
-
-
|
|
113
|
+
- Report results when complete
|
|
122
114
|
- Ask clarifying questions if needed
|
|
123
115
|
|
|
124
116
|
### Message Etiquette
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/prompts/protocol.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,CAAC,MAAM,cAAc,GAAW;IACpC,IAAI,EAAE,gBAAgB;IACtB,WAAW,EAAE,yCAAyC;IACtD,SAAS,EAAE,EAAE;CACd,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/prompts/protocol.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,CAAC,MAAM,cAAc,GAAW;IACpC,IAAI,EAAE,gBAAgB;IACtB,WAAW,EAAE,yCAAyC;IACtD,SAAS,EAAE,EAAE;CACd,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgJrC,CAAC;AAEF,MAAM,UAAU,iBAAiB;IAC/B,OAAO,sBAAsB,CAAC;AAChC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-relay/mcp",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.6",
|
|
4
4
|
"description": "MCP server for Agent Relay - native messaging tools for AI agents in Claude, Cursor, and VS Code",
|
|
5
5
|
"author": "Agent Workforce Inc.",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -47,6 +47,7 @@
|
|
|
47
47
|
"prepublishOnly": "npm run clean && npm run build && npm test"
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
|
+
"@agent-relay/config": "2.0.6",
|
|
50
51
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
51
52
|
"zod": "^3.23.8"
|
|
52
53
|
},
|