agent-relay 2.2.23 → 2.3.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/dist/index.cjs +199 -3
- package/package.json +64 -21
- package/packages/acp-bridge/package.json +2 -2
- package/packages/api-types/package.json +1 -1
- package/packages/benchmark/package.json +5 -5
- package/packages/bridge/package.json +7 -7
- package/packages/cli-tester/package.json +1 -1
- package/packages/config/package.json +2 -2
- package/packages/continuity/package.json +2 -2
- package/packages/daemon/dist/cloud-sync.d.ts +13 -1
- package/packages/daemon/dist/cloud-sync.d.ts.map +1 -1
- package/packages/daemon/dist/cloud-sync.js +169 -5
- package/packages/daemon/dist/cloud-sync.js.map +1 -1
- package/packages/daemon/dist/server.d.ts +5 -0
- package/packages/daemon/dist/server.d.ts.map +1 -1
- package/packages/daemon/dist/server.js +50 -0
- package/packages/daemon/dist/server.js.map +1 -1
- package/packages/daemon/package.json +12 -12
- package/packages/daemon/src/cloud-sync.ts +201 -5
- package/packages/daemon/src/server.ts +61 -0
- package/packages/hooks/package.json +4 -4
- package/packages/mcp/package.json +5 -5
- package/packages/memory/package.json +2 -2
- package/packages/policy/package.json +2 -2
- package/packages/protocol/package.json +1 -1
- package/packages/resiliency/package.json +1 -1
- package/packages/sdk/dist/client.d.ts +1 -1
- package/packages/sdk/dist/client.js +2 -2
- package/packages/sdk/package.json +3 -3
- package/packages/sdk/src/client.ts +2 -2
- package/packages/sdk-ts/README.md +65 -0
- package/packages/sdk-ts/dist/__tests__/integration.test.d.ts +2 -0
- package/packages/sdk-ts/dist/__tests__/integration.test.d.ts.map +1 -0
- package/packages/sdk-ts/dist/__tests__/integration.test.js +139 -0
- package/packages/sdk-ts/dist/__tests__/integration.test.js.map +1 -0
- package/packages/sdk-ts/dist/__tests__/quickstart.test.d.ts +2 -0
- package/packages/sdk-ts/dist/__tests__/quickstart.test.d.ts.map +1 -0
- package/packages/sdk-ts/dist/__tests__/quickstart.test.js +176 -0
- package/packages/sdk-ts/dist/__tests__/quickstart.test.js.map +1 -0
- package/packages/sdk-ts/dist/browser.d.ts +16 -0
- package/packages/sdk-ts/dist/browser.d.ts.map +1 -0
- package/packages/sdk-ts/dist/browser.js +19 -0
- package/packages/sdk-ts/dist/browser.js.map +1 -0
- package/packages/sdk-ts/dist/client.d.ts +91 -0
- package/packages/sdk-ts/dist/client.d.ts.map +1 -0
- package/packages/sdk-ts/dist/client.js +360 -0
- package/packages/sdk-ts/dist/client.js.map +1 -0
- package/packages/sdk-ts/dist/consensus-helpers.d.ts +103 -0
- package/packages/sdk-ts/dist/consensus-helpers.d.ts.map +1 -0
- package/packages/sdk-ts/dist/consensus-helpers.js +147 -0
- package/packages/sdk-ts/dist/consensus-helpers.js.map +1 -0
- package/packages/sdk-ts/dist/consensus.d.ts +72 -0
- package/packages/sdk-ts/dist/consensus.d.ts.map +1 -0
- package/packages/sdk-ts/dist/consensus.js +378 -0
- package/packages/sdk-ts/dist/consensus.js.map +1 -0
- package/packages/sdk-ts/dist/examples/demo.d.ts +2 -0
- package/packages/sdk-ts/dist/examples/demo.d.ts.map +1 -0
- package/packages/sdk-ts/dist/examples/demo.js +63 -0
- package/packages/sdk-ts/dist/examples/demo.js.map +1 -0
- package/packages/sdk-ts/dist/examples/example.d.ts +2 -0
- package/packages/sdk-ts/dist/examples/example.d.ts.map +1 -0
- package/packages/sdk-ts/dist/examples/example.js +80 -0
- package/packages/sdk-ts/dist/examples/example.js.map +1 -0
- package/packages/sdk-ts/dist/examples/quickstart.d.ts +2 -0
- package/packages/sdk-ts/dist/examples/quickstart.d.ts.map +1 -0
- package/packages/sdk-ts/dist/examples/quickstart.js +56 -0
- package/packages/sdk-ts/dist/examples/quickstart.js.map +1 -0
- package/packages/sdk-ts/dist/examples/ralph-loop.d.ts +2 -0
- package/packages/sdk-ts/dist/examples/ralph-loop.d.ts.map +1 -0
- package/packages/sdk-ts/dist/examples/ralph-loop.js +281 -0
- package/packages/sdk-ts/dist/examples/ralph-loop.js.map +1 -0
- package/packages/sdk-ts/dist/index.d.ts +9 -0
- package/packages/sdk-ts/dist/index.d.ts.map +1 -0
- package/packages/sdk-ts/dist/index.js +9 -0
- package/packages/sdk-ts/dist/index.js.map +1 -0
- package/packages/sdk-ts/dist/logs.d.ts +47 -0
- package/packages/sdk-ts/dist/logs.d.ts.map +1 -0
- package/packages/sdk-ts/dist/logs.js +137 -0
- package/packages/sdk-ts/dist/logs.js.map +1 -0
- package/packages/sdk-ts/dist/protocol.d.ts +249 -0
- package/packages/sdk-ts/dist/protocol.d.ts.map +1 -0
- package/packages/sdk-ts/dist/protocol.js +2 -0
- package/packages/sdk-ts/dist/protocol.js.map +1 -0
- package/packages/sdk-ts/dist/pty.d.ts +8 -0
- package/packages/sdk-ts/dist/pty.d.ts.map +1 -0
- package/packages/sdk-ts/dist/pty.js +14 -0
- package/packages/sdk-ts/dist/pty.js.map +1 -0
- package/packages/sdk-ts/dist/relay.d.ts +118 -0
- package/packages/sdk-ts/dist/relay.d.ts.map +1 -0
- package/packages/sdk-ts/dist/relay.js +355 -0
- package/packages/sdk-ts/dist/relay.js.map +1 -0
- package/packages/sdk-ts/dist/relaycast.d.ts +57 -0
- package/packages/sdk-ts/dist/relaycast.d.ts.map +1 -0
- package/packages/sdk-ts/dist/relaycast.js +110 -0
- package/packages/sdk-ts/dist/relaycast.js.map +1 -0
- package/packages/sdk-ts/dist/shadow.d.ts +100 -0
- package/packages/sdk-ts/dist/shadow.d.ts.map +1 -0
- package/packages/sdk-ts/dist/shadow.js +174 -0
- package/packages/sdk-ts/dist/shadow.js.map +1 -0
- package/packages/sdk-ts/package.json +75 -0
- package/packages/sdk-ts/scripts/bundle-agent-relay.mjs +53 -0
- package/packages/sdk-ts/src/__tests__/integration.test.ts +170 -0
- package/packages/sdk-ts/src/__tests__/quickstart.test.ts +198 -0
- package/packages/sdk-ts/src/browser.ts +57 -0
- package/packages/sdk-ts/src/client.ts +491 -0
- package/packages/sdk-ts/src/consensus-helpers.ts +253 -0
- package/packages/sdk-ts/src/consensus.ts +506 -0
- package/packages/sdk-ts/src/examples/demo.ts +88 -0
- package/packages/sdk-ts/src/examples/example.ts +91 -0
- package/packages/sdk-ts/src/examples/quickstart.ts +72 -0
- package/packages/sdk-ts/src/examples/ralph-loop.ts +352 -0
- package/packages/sdk-ts/src/examples/sample-prd.json +37 -0
- package/packages/sdk-ts/src/index.ts +8 -0
- package/packages/sdk-ts/src/logs.ts +163 -0
- package/packages/sdk-ts/src/protocol.ts +266 -0
- package/packages/sdk-ts/src/pty.ts +16 -0
- package/packages/sdk-ts/src/relay.ts +454 -0
- package/packages/sdk-ts/src/relaycast.ts +143 -0
- package/packages/sdk-ts/src/shadow.ts +230 -0
- package/packages/sdk-ts/tsconfig.json +16 -0
- package/packages/spawner/package.json +1 -1
- package/packages/state/package.json +1 -1
- package/packages/storage/package.json +2 -2
- 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 +3 -3
- package/packages/wrapper/dist/client.js +1 -1
- package/packages/wrapper/package.json +6 -6
- package/packages/wrapper/src/client.test.ts +1 -1
- package/packages/wrapper/src/client.ts +1 -1
- package/packages/mcp/SPEC.md +0 -1922
- package/packages/mcp/STAFFING_PLAN.md +0 -294
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-relay/mcp",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.3.0",
|
|
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,15 +47,15 @@
|
|
|
47
47
|
"prepublishOnly": "npm run clean && npm run build && npm test"
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
|
-
"@agent-relay/config": "2.
|
|
51
|
-
"@agent-relay/protocol": "2.
|
|
52
|
-
"@agent-relay/utils": "2.
|
|
50
|
+
"@agent-relay/config": "2.3.0",
|
|
51
|
+
"@agent-relay/protocol": "2.3.0",
|
|
52
|
+
"@agent-relay/utils": "2.3.0",
|
|
53
53
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
54
54
|
"smol-toml": "^1.6.0",
|
|
55
55
|
"zod": "^3.23.8"
|
|
56
56
|
},
|
|
57
57
|
"devDependencies": {
|
|
58
|
-
"@agent-relay/sdk": "2.
|
|
58
|
+
"@agent-relay/sdk": "2.3.0",
|
|
59
59
|
"@types/node": "^22.19.3",
|
|
60
60
|
"typescript": "^5.9.3",
|
|
61
61
|
"vitest": "^2.1.9"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-relay/memory",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.3.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": "2.
|
|
25
|
+
"@agent-relay/hooks": "2.3.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": "2.
|
|
3
|
+
"version": "2.3.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": "2.
|
|
25
|
+
"@agent-relay/config": "2.3.0"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"@types/node": "^22.19.3",
|
|
@@ -245,7 +245,7 @@ export declare class RelayClient {
|
|
|
245
245
|
* @param options.shadowSpeakOn - Shadow speak-on triggers
|
|
246
246
|
* @param options.waitForReady - Wait for the agent to be ready before resolving (default: false)
|
|
247
247
|
* @param options.readyTimeoutMs - Timeout for agent to become ready (default: 60000ms)
|
|
248
|
-
* @param timeoutMs - Timeout for spawn operation (default:
|
|
248
|
+
* @param timeoutMs - Timeout for spawn operation (default: 60000ms)
|
|
249
249
|
* @returns Spawn result. When waitForReady is true, includes `ready` and `readyInfo` fields.
|
|
250
250
|
*/
|
|
251
251
|
spawn(options: {
|
|
@@ -513,10 +513,10 @@ export class RelayClient {
|
|
|
513
513
|
* @param options.shadowSpeakOn - Shadow speak-on triggers
|
|
514
514
|
* @param options.waitForReady - Wait for the agent to be ready before resolving (default: false)
|
|
515
515
|
* @param options.readyTimeoutMs - Timeout for agent to become ready (default: 60000ms)
|
|
516
|
-
* @param timeoutMs - Timeout for spawn operation (default:
|
|
516
|
+
* @param timeoutMs - Timeout for spawn operation (default: 60000ms)
|
|
517
517
|
* @returns Spawn result. When waitForReady is true, includes `ready` and `readyInfo` fields.
|
|
518
518
|
*/
|
|
519
|
-
async spawn(options, timeoutMs =
|
|
519
|
+
async spawn(options, timeoutMs = 60000) {
|
|
520
520
|
if (this._state !== 'READY') {
|
|
521
521
|
throw new Error('Client not ready');
|
|
522
522
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-relay/sdk",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.3.0",
|
|
4
4
|
"description": "Lightweight SDK for agent-to-agent communication via Agent Relay",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -77,8 +77,8 @@
|
|
|
77
77
|
"access": "public"
|
|
78
78
|
},
|
|
79
79
|
"dependencies": {
|
|
80
|
-
"@agent-relay/protocol": "2.
|
|
81
|
-
"@agent-relay/utils": "2.
|
|
80
|
+
"@agent-relay/protocol": "2.3.0",
|
|
81
|
+
"@agent-relay/utils": "2.3.0"
|
|
82
82
|
},
|
|
83
83
|
"engines": {
|
|
84
84
|
"node": ">=18.0.0"
|
|
@@ -782,7 +782,7 @@ export class RelayClient {
|
|
|
782
782
|
* @param options.shadowSpeakOn - Shadow speak-on triggers
|
|
783
783
|
* @param options.waitForReady - Wait for the agent to be ready before resolving (default: false)
|
|
784
784
|
* @param options.readyTimeoutMs - Timeout for agent to become ready (default: 60000ms)
|
|
785
|
-
* @param timeoutMs - Timeout for spawn operation (default:
|
|
785
|
+
* @param timeoutMs - Timeout for spawn operation (default: 60000ms)
|
|
786
786
|
* @returns Spawn result. When waitForReady is true, includes `ready` and `readyInfo` fields.
|
|
787
787
|
*/
|
|
788
788
|
async spawn(
|
|
@@ -811,7 +811,7 @@ export class RelayClient {
|
|
|
811
811
|
/** Timeout for agent to become ready (default: 60000ms). Only used when waitForReady is true. */
|
|
812
812
|
readyTimeoutMs?: number;
|
|
813
813
|
},
|
|
814
|
-
timeoutMs =
|
|
814
|
+
timeoutMs = 60000
|
|
815
815
|
): Promise<SpawnResult> {
|
|
816
816
|
if (this._state !== 'READY') {
|
|
817
817
|
throw new Error('Client not ready');
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# `@agent-relay/broker-sdk`
|
|
2
|
+
|
|
3
|
+
TypeScript SDK for driving `agent-relay init` over stdio.
|
|
4
|
+
|
|
5
|
+
## Status
|
|
6
|
+
- Broker lifecycle + request/response protocol client implemented.
|
|
7
|
+
- Spawn/list/release/shutdown APIs implemented.
|
|
8
|
+
- Event subscription for broker `event` frames implemented.
|
|
9
|
+
|
|
10
|
+
## Bundled binary
|
|
11
|
+
- The SDK package bundles `agent-relay` inside `bin/` during `npm run build` and `npm pack`.
|
|
12
|
+
- By default, `AgentRelayClient` uses the bundled binary path when present.
|
|
13
|
+
- You can still override with `binaryPath` in `AgentRelayClient.start(...)`.
|
|
14
|
+
|
|
15
|
+
## Quick example
|
|
16
|
+
```ts
|
|
17
|
+
import { AgentRelayClient } from "@agent-relay/broker-sdk";
|
|
18
|
+
|
|
19
|
+
const client = await AgentRelayClient.start({
|
|
20
|
+
binaryPath: "/absolute/path/to/agent-relay",
|
|
21
|
+
env: process.env,
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
await client.spawnPty({
|
|
25
|
+
name: "Worker1",
|
|
26
|
+
cli: "codex",
|
|
27
|
+
args: ["--model", "gpt-5"],
|
|
28
|
+
channels: ["general"],
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
const agents = await client.listAgents();
|
|
32
|
+
console.log(agents);
|
|
33
|
+
|
|
34
|
+
await client.release("Worker1");
|
|
35
|
+
await client.shutdown();
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Tic-tac-toe demo script
|
|
39
|
+
After build, run:
|
|
40
|
+
```bash
|
|
41
|
+
npm --prefix packages/sdk-ts run example
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Optional env:
|
|
45
|
+
- `CODEX_CMD` (default: `codex`)
|
|
46
|
+
- `CODEX_ARGS` (space-separated CLI args)
|
|
47
|
+
- `AGENT_X_NAME` / `AGENT_O_NAME`
|
|
48
|
+
- `RELAY_CHANNEL` (default: `general`)
|
|
49
|
+
- `AGENT_RELAY_BIN` (override bundled binary path)
|
|
50
|
+
|
|
51
|
+
## Integration test
|
|
52
|
+
```bash
|
|
53
|
+
cargo build
|
|
54
|
+
npm --prefix packages/sdk-ts install
|
|
55
|
+
npm --prefix packages/sdk-ts run build
|
|
56
|
+
AGENT_RELAY_BIN="$(pwd)/target/debug/agent-relay" npm --prefix packages/sdk-ts run test:integration
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Integration tests require Relaycast credentials in environment (`RELAY_API_KEY`).
|
|
60
|
+
|
|
61
|
+
## Package tarball
|
|
62
|
+
```bash
|
|
63
|
+
npm --prefix packages/sdk-ts pack
|
|
64
|
+
```
|
|
65
|
+
The generated tarball includes `dist/` and `bin/agent-relay` (or `bin/agent-relay.exe` on Windows).
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/integration.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import test from "node:test";
|
|
5
|
+
import { AgentRelayClient, AgentRelayProcessError } from "../client.js";
|
|
6
|
+
function resolveBinaryPath() {
|
|
7
|
+
if (process.env.AGENT_RELAY_BIN) {
|
|
8
|
+
return process.env.AGENT_RELAY_BIN;
|
|
9
|
+
}
|
|
10
|
+
return path.resolve(process.cwd(), "../../target/debug/agent-relay");
|
|
11
|
+
}
|
|
12
|
+
function resolveBundledBinaryPath() {
|
|
13
|
+
const exe = process.platform === "win32" ? "agent-relay.exe" : "agent-relay";
|
|
14
|
+
return path.resolve(process.cwd(), "bin", exe);
|
|
15
|
+
}
|
|
16
|
+
function requireRelaycast(t) {
|
|
17
|
+
const relayKey = process.env.RELAY_API_KEY?.trim();
|
|
18
|
+
if (!relayKey) {
|
|
19
|
+
t.skip("RELAY_API_KEY is required for broker integration tests");
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
test("sdk can use bundled binary by default", async (t) => {
|
|
25
|
+
if (!requireRelaycast(t)) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const bundledBinary = resolveBundledBinaryPath();
|
|
29
|
+
if (!fs.existsSync(bundledBinary)) {
|
|
30
|
+
t.skip(`bundled binary not found at ${bundledBinary}`);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const client = await AgentRelayClient.start({
|
|
34
|
+
env: process.env,
|
|
35
|
+
});
|
|
36
|
+
try {
|
|
37
|
+
const agents = await client.listAgents();
|
|
38
|
+
assert.ok(Array.isArray(agents), "listAgents should return an array");
|
|
39
|
+
}
|
|
40
|
+
finally {
|
|
41
|
+
await client.shutdown();
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
test("sdk can start broker and manage agent lifecycle", async (t) => {
|
|
45
|
+
if (!requireRelaycast(t)) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const binaryPath = resolveBinaryPath();
|
|
49
|
+
if (!fs.existsSync(binaryPath)) {
|
|
50
|
+
t.skip(`agent-relay binary not found at ${binaryPath}`);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const client = await AgentRelayClient.start({
|
|
54
|
+
binaryPath,
|
|
55
|
+
requestTimeoutMs: 8_000,
|
|
56
|
+
shutdownTimeoutMs: 2_000,
|
|
57
|
+
env: process.env,
|
|
58
|
+
});
|
|
59
|
+
const spawnedName = `sdk-test-${Date.now().toString(36)}`;
|
|
60
|
+
const seenEvents = [];
|
|
61
|
+
const unsub = client.onEvent((event) => {
|
|
62
|
+
seenEvents.push(event.kind);
|
|
63
|
+
});
|
|
64
|
+
try {
|
|
65
|
+
const spawned = await client.spawnPty({
|
|
66
|
+
name: spawnedName,
|
|
67
|
+
cli: "cat",
|
|
68
|
+
channels: ["general"],
|
|
69
|
+
});
|
|
70
|
+
assert.equal(spawned.name, spawnedName);
|
|
71
|
+
assert.equal(spawned.runtime, "pty");
|
|
72
|
+
const agentsAfterSpawn = await client.listAgents();
|
|
73
|
+
const spawnedAgent = agentsAfterSpawn.find((agent) => agent.name === spawnedName);
|
|
74
|
+
assert.ok(spawnedAgent, "spawned agent should be present in listAgents()");
|
|
75
|
+
assert.equal(spawnedAgent?.runtime, "pty");
|
|
76
|
+
const released = await client.release(spawnedName);
|
|
77
|
+
assert.equal(released.name, spawnedName);
|
|
78
|
+
const agentsAfterRelease = await client.listAgents();
|
|
79
|
+
assert.equal(agentsAfterRelease.some((agent) => agent.name === spawnedName), false, "released agent should not be present in listAgents()");
|
|
80
|
+
assert.ok(seenEvents.includes("agent_spawned"), "expected agent_spawned event");
|
|
81
|
+
assert.ok(seenEvents.includes("agent_released"), "expected agent_released event");
|
|
82
|
+
}
|
|
83
|
+
finally {
|
|
84
|
+
unsub();
|
|
85
|
+
await client.shutdown();
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
test("sdk can spawn and release headless claude worker", async (t) => {
|
|
89
|
+
if (!requireRelaycast(t)) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const binaryPath = resolveBinaryPath();
|
|
93
|
+
if (!fs.existsSync(binaryPath)) {
|
|
94
|
+
t.skip(`agent-relay binary not found at ${binaryPath}`);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const client = await AgentRelayClient.start({
|
|
98
|
+
binaryPath,
|
|
99
|
+
requestTimeoutMs: 8_000,
|
|
100
|
+
shutdownTimeoutMs: 2_000,
|
|
101
|
+
env: process.env,
|
|
102
|
+
});
|
|
103
|
+
const spawnedName = `sdk-headless-${Date.now().toString(36)}`;
|
|
104
|
+
const seenEvents = [];
|
|
105
|
+
const unsub = client.onEvent((event) => {
|
|
106
|
+
seenEvents.push(event.kind);
|
|
107
|
+
});
|
|
108
|
+
try {
|
|
109
|
+
const spawned = await client.spawnHeadlessClaude({
|
|
110
|
+
name: spawnedName,
|
|
111
|
+
channels: ["general"],
|
|
112
|
+
});
|
|
113
|
+
assert.equal(spawned.name, spawnedName);
|
|
114
|
+
assert.equal(spawned.runtime, "headless_claude");
|
|
115
|
+
const agentsAfterSpawn = await client.listAgents();
|
|
116
|
+
const spawnedAgent = agentsAfterSpawn.find((agent) => agent.name === spawnedName);
|
|
117
|
+
assert.ok(spawnedAgent, "spawned headless agent should be present in listAgents()");
|
|
118
|
+
assert.equal(spawnedAgent?.runtime, "headless_claude");
|
|
119
|
+
const released = await client.release(spawnedName);
|
|
120
|
+
assert.equal(released.name, spawnedName);
|
|
121
|
+
const agentsAfterRelease = await client.listAgents();
|
|
122
|
+
assert.equal(agentsAfterRelease.some((agent) => agent.name === spawnedName), false, "released headless agent should not be present in listAgents()");
|
|
123
|
+
assert.ok(seenEvents.includes("agent_spawned"), "expected agent_spawned event");
|
|
124
|
+
assert.ok(seenEvents.includes("agent_released"), "expected agent_released event");
|
|
125
|
+
}
|
|
126
|
+
finally {
|
|
127
|
+
unsub();
|
|
128
|
+
await client.shutdown();
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
test("sdk surfaces process error when binary is missing", async () => {
|
|
132
|
+
await assert.rejects(AgentRelayClient.start({
|
|
133
|
+
binaryPath: "/definitely/missing/agent-relay",
|
|
134
|
+
requestTimeoutMs: 1_000,
|
|
135
|
+
}), (error) => {
|
|
136
|
+
return error instanceof AgentRelayProcessError || error instanceof Error;
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
//# sourceMappingURL=integration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration.test.js","sourceRoot":"","sources":["../../src/__tests__/integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quickstart.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/quickstart.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Quickstart integration tests — exercises the AgentRelay facade:
|
|
3
|
+
* spawn agents, send messages, list, release, event hooks, shutdown.
|
|
4
|
+
*
|
|
5
|
+
* Run:
|
|
6
|
+
* npm run build && node --test dist/__tests__/quickstart.test.js
|
|
7
|
+
*
|
|
8
|
+
* Requires:
|
|
9
|
+
* RELAY_API_KEY — Relaycast workspace key
|
|
10
|
+
* AGENT_RELAY_BIN (optional) — path to agent-relay binary
|
|
11
|
+
*/
|
|
12
|
+
import assert from "node:assert/strict";
|
|
13
|
+
import fs from "node:fs";
|
|
14
|
+
import path from "node:path";
|
|
15
|
+
import test from "node:test";
|
|
16
|
+
import { AgentRelay } from "../relay.js";
|
|
17
|
+
// ── helpers ─────────────────────────────────────────────────────────────────
|
|
18
|
+
function resolveBinaryPath() {
|
|
19
|
+
if (process.env.AGENT_RELAY_BIN) {
|
|
20
|
+
return process.env.AGENT_RELAY_BIN;
|
|
21
|
+
}
|
|
22
|
+
return path.resolve(process.cwd(), "../../target/debug/agent-relay");
|
|
23
|
+
}
|
|
24
|
+
function requireRelaycast(t) {
|
|
25
|
+
if (!process.env.RELAY_API_KEY?.trim()) {
|
|
26
|
+
t.skip("RELAY_API_KEY is required");
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
function requireBinary(t) {
|
|
32
|
+
const bin = resolveBinaryPath();
|
|
33
|
+
if (!fs.existsSync(bin)) {
|
|
34
|
+
t.skip(`agent-relay binary not found at ${bin}`);
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
return bin;
|
|
38
|
+
}
|
|
39
|
+
// ── full lifecycle ──────────────────────────────────────────────────────────
|
|
40
|
+
test("facade: spawn → message → list → release → shutdown", async (t) => {
|
|
41
|
+
if (!requireRelaycast(t))
|
|
42
|
+
return;
|
|
43
|
+
const bin = requireBinary(t);
|
|
44
|
+
if (!bin)
|
|
45
|
+
return;
|
|
46
|
+
const suffix = Date.now().toString(36);
|
|
47
|
+
const relay = new AgentRelay({
|
|
48
|
+
binaryPath: bin,
|
|
49
|
+
requestTimeoutMs: 10_000,
|
|
50
|
+
env: process.env,
|
|
51
|
+
});
|
|
52
|
+
const spawnedNames = [];
|
|
53
|
+
const releasedNames = [];
|
|
54
|
+
const receivedMessages = [];
|
|
55
|
+
const sentMessages = [];
|
|
56
|
+
relay.onAgentSpawned = (agent) => spawnedNames.push(agent.name);
|
|
57
|
+
relay.onAgentReleased = (agent) => releasedNames.push(agent.name);
|
|
58
|
+
relay.onMessageReceived = (msg) => receivedMessages.push(msg);
|
|
59
|
+
relay.onMessageSent = (msg) => sentMessages.push(msg);
|
|
60
|
+
try {
|
|
61
|
+
// Spawn two agents in parallel
|
|
62
|
+
const [codex, worker1] = await Promise.all([
|
|
63
|
+
relay.codex.spawn({ name: `Codex-${suffix}` }),
|
|
64
|
+
relay.spawnPty({
|
|
65
|
+
name: `Worker1-${suffix}`,
|
|
66
|
+
cli: "cat",
|
|
67
|
+
channels: ["general"],
|
|
68
|
+
}),
|
|
69
|
+
]);
|
|
70
|
+
assert.equal(codex.runtime, "pty");
|
|
71
|
+
assert.equal(worker1.runtime, "pty");
|
|
72
|
+
// Send a message from a human source
|
|
73
|
+
const human = relay.human({ name: "System" });
|
|
74
|
+
const msg = await human.sendMessage({
|
|
75
|
+
to: codex.name,
|
|
76
|
+
text: "Hello, world!",
|
|
77
|
+
});
|
|
78
|
+
assert.ok(msg.eventId, "should return eventId");
|
|
79
|
+
assert.equal(msg.from, "System");
|
|
80
|
+
assert.equal(msg.to, codex.name);
|
|
81
|
+
// onMessageSent should have fired
|
|
82
|
+
assert.equal(sentMessages.length, 1);
|
|
83
|
+
assert.equal(sentMessages[0].text, "Hello, world!");
|
|
84
|
+
// List agents — should return Agent objects with release()
|
|
85
|
+
const agents = await relay.listAgents();
|
|
86
|
+
const names = agents.map((a) => a.name);
|
|
87
|
+
assert.ok(names.includes(codex.name));
|
|
88
|
+
assert.ok(names.includes(worker1.name));
|
|
89
|
+
assert.equal(typeof agents[0].release, "function");
|
|
90
|
+
// Release all via agent.release()
|
|
91
|
+
for (const agent of agents) {
|
|
92
|
+
if (agent.name === codex.name || agent.name === worker1.name) {
|
|
93
|
+
await agent.release();
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// Verify gone
|
|
97
|
+
const remaining = await relay.listAgents();
|
|
98
|
+
assert.ok(!remaining.some((a) => a.name === codex.name));
|
|
99
|
+
assert.ok(!remaining.some((a) => a.name === worker1.name));
|
|
100
|
+
// Event hooks should have fired
|
|
101
|
+
assert.ok(spawnedNames.includes(codex.name));
|
|
102
|
+
assert.ok(spawnedNames.includes(worker1.name));
|
|
103
|
+
assert.ok(releasedNames.includes(codex.name));
|
|
104
|
+
assert.ok(releasedNames.includes(worker1.name));
|
|
105
|
+
}
|
|
106
|
+
finally {
|
|
107
|
+
await relay.shutdown();
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
// ── agent.sendMessage ───────────────────────────────────────────────────────
|
|
111
|
+
test("facade: agent.sendMessage sends from the agent identity", async (t) => {
|
|
112
|
+
if (!requireRelaycast(t))
|
|
113
|
+
return;
|
|
114
|
+
const bin = requireBinary(t);
|
|
115
|
+
if (!bin)
|
|
116
|
+
return;
|
|
117
|
+
const suffix = Date.now().toString(36);
|
|
118
|
+
const relay = new AgentRelay({
|
|
119
|
+
binaryPath: bin,
|
|
120
|
+
requestTimeoutMs: 10_000,
|
|
121
|
+
env: process.env,
|
|
122
|
+
});
|
|
123
|
+
const sentMessages = [];
|
|
124
|
+
relay.onMessageSent = (msg) => sentMessages.push(msg);
|
|
125
|
+
try {
|
|
126
|
+
const [a, b] = await Promise.all([
|
|
127
|
+
relay.spawnPty({ name: `A-${suffix}`, cli: "cat", channels: ["general"] }),
|
|
128
|
+
relay.spawnPty({ name: `B-${suffix}`, cli: "cat", channels: ["general"] }),
|
|
129
|
+
]);
|
|
130
|
+
const msg = await a.sendMessage({ to: b.name, text: "ping" });
|
|
131
|
+
assert.equal(msg.from, a.name);
|
|
132
|
+
assert.equal(msg.to, b.name);
|
|
133
|
+
assert.equal(sentMessages.length, 1);
|
|
134
|
+
assert.equal(sentMessages[0].from, a.name);
|
|
135
|
+
await a.release();
|
|
136
|
+
await b.release();
|
|
137
|
+
}
|
|
138
|
+
finally {
|
|
139
|
+
await relay.shutdown();
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
// ── threading ───────────────────────────────────────────────────────────────
|
|
143
|
+
test("facade: message threading with threadId", async (t) => {
|
|
144
|
+
if (!requireRelaycast(t))
|
|
145
|
+
return;
|
|
146
|
+
const bin = requireBinary(t);
|
|
147
|
+
if (!bin)
|
|
148
|
+
return;
|
|
149
|
+
const suffix = Date.now().toString(36);
|
|
150
|
+
const relay = new AgentRelay({
|
|
151
|
+
binaryPath: bin,
|
|
152
|
+
requestTimeoutMs: 10_000,
|
|
153
|
+
env: process.env,
|
|
154
|
+
});
|
|
155
|
+
try {
|
|
156
|
+
const agent = await relay.spawnPty({
|
|
157
|
+
name: `Thread-${suffix}`,
|
|
158
|
+
cli: "cat",
|
|
159
|
+
channels: ["general"],
|
|
160
|
+
});
|
|
161
|
+
const human = relay.human({ name: "Human" });
|
|
162
|
+
const msg1 = await human.sendMessage({ to: agent.name, text: "start" });
|
|
163
|
+
const msg2 = await human.sendMessage({
|
|
164
|
+
to: agent.name,
|
|
165
|
+
text: "follow-up",
|
|
166
|
+
threadId: msg1.eventId,
|
|
167
|
+
});
|
|
168
|
+
assert.ok(msg2.eventId);
|
|
169
|
+
assert.notEqual(msg1.eventId, msg2.eventId);
|
|
170
|
+
await agent.release();
|
|
171
|
+
}
|
|
172
|
+
finally {
|
|
173
|
+
await relay.shutdown();
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
//# sourceMappingURL=quickstart.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quickstart.test.js","sourceRoot":"","sources":["../../src/__tests__/quickstart.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser-compatible entry point for the broker SDK.
|
|
3
|
+
*
|
|
4
|
+
* Exports only modules with zero Node.js dependencies.
|
|
5
|
+
* The ConsensusEngine class (needs node:crypto + node:events) is NOT
|
|
6
|
+
* exported here — only its types and pure helper functions.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* import { PROTOCOL_VERSION, type BrokerEvent } from "agent-relay/broker/browser";
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
export { PROTOCOL_VERSION, type AgentRuntime, type AgentSpec, type BrokerEvent, type BrokerStatus, type BrokerToSdk, type BrokerToWorker, type PendingDeliveryInfo, type ProtocolEnvelope, type ProtocolError, type RelayDelivery, type SdkToBroker, type WorkerToBroker, } from "./protocol.js";
|
|
14
|
+
export { formatProposalMessage, formatResultMessage, parseVoteCommand, parseProposalCommand, isConsensusCommand, type ConsensusType, type VoteValue, type ProposalStatus, type AgentWeight, type Vote, type Proposal, type ConsensusResult, type ConsensusConfig, type ConsensusEvents, type ParsedProposalCommand, } from "./consensus-helpers.js";
|
|
15
|
+
export { ShadowManager, type ShadowConfig, type ShadowRelationship, type ShadowCopy, type SpeakOnTrigger, } from "./shadow.js";
|
|
16
|
+
//# sourceMappingURL=browser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EACL,gBAAgB,EAChB,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,cAAc,GACpB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,IAAI,EACT,KAAK,QAAQ,EACb,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,qBAAqB,GAC3B,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,aAAa,EACb,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,UAAU,EACf,KAAK,cAAc,GACpB,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser-compatible entry point for the broker SDK.
|
|
3
|
+
*
|
|
4
|
+
* Exports only modules with zero Node.js dependencies.
|
|
5
|
+
* The ConsensusEngine class (needs node:crypto + node:events) is NOT
|
|
6
|
+
* exported here — only its types and pure helper functions.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* import { PROTOCOL_VERSION, type BrokerEvent } from "agent-relay/broker/browser";
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
// Protocol types — pure TypeScript, zero deps
|
|
14
|
+
export { PROTOCOL_VERSION, } from "./protocol.js";
|
|
15
|
+
// Consensus types + pure functions (from the Node-free helpers file)
|
|
16
|
+
export { formatProposalMessage, formatResultMessage, parseVoteCommand, parseProposalCommand, isConsensusCommand, } from "./consensus-helpers.js";
|
|
17
|
+
// Shadow manager — pure in-memory, no I/O deps
|
|
18
|
+
export { ShadowManager, } from "./shadow.js";
|
|
19
|
+
//# sourceMappingURL=browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,8CAA8C;AAC9C,OAAO,EACL,gBAAgB,GAajB,MAAM,eAAe,CAAC;AAEvB,qEAAqE;AACrE,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,GAWnB,MAAM,wBAAwB,CAAC;AAEhC,+CAA+C;AAC/C,OAAO,EACL,aAAa,GAKd,MAAM,aAAa,CAAC"}
|