agent-relay 2.2.24 → 2.3.1
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/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/package.json +12 -12
- 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/package.json +3 -3
- 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/package.json +6 -6
- package/packages/mcp/SPEC.md +0 -1922
- package/packages/mcp/STAFFING_PLAN.md +0 -294
|
@@ -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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { type AgentRuntime, type BrokerEvent, type BrokerStatus, type ProtocolError } from "./protocol.js";
|
|
2
|
+
export interface AgentRelayClientOptions {
|
|
3
|
+
binaryPath?: string;
|
|
4
|
+
binaryArgs?: string[];
|
|
5
|
+
brokerName?: string;
|
|
6
|
+
channels?: string[];
|
|
7
|
+
cwd?: string;
|
|
8
|
+
env?: NodeJS.ProcessEnv;
|
|
9
|
+
requestTimeoutMs?: number;
|
|
10
|
+
shutdownTimeoutMs?: number;
|
|
11
|
+
clientName?: string;
|
|
12
|
+
clientVersion?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface SpawnPtyInput {
|
|
15
|
+
name: string;
|
|
16
|
+
cli: string;
|
|
17
|
+
args?: string[];
|
|
18
|
+
channels?: string[];
|
|
19
|
+
}
|
|
20
|
+
export interface SpawnHeadlessClaudeInput {
|
|
21
|
+
name: string;
|
|
22
|
+
args?: string[];
|
|
23
|
+
channels?: string[];
|
|
24
|
+
}
|
|
25
|
+
export interface SendMessageInput {
|
|
26
|
+
to: string;
|
|
27
|
+
text: string;
|
|
28
|
+
from?: string;
|
|
29
|
+
threadId?: string;
|
|
30
|
+
priority?: number;
|
|
31
|
+
}
|
|
32
|
+
export interface ListAgent {
|
|
33
|
+
name: string;
|
|
34
|
+
runtime: AgentRuntime;
|
|
35
|
+
channels: string[];
|
|
36
|
+
parent?: string;
|
|
37
|
+
pid?: number;
|
|
38
|
+
}
|
|
39
|
+
export declare class AgentRelayProtocolError extends Error {
|
|
40
|
+
code: string;
|
|
41
|
+
retryable: boolean;
|
|
42
|
+
data?: unknown;
|
|
43
|
+
constructor(payload: ProtocolError);
|
|
44
|
+
}
|
|
45
|
+
export declare class AgentRelayProcessError extends Error {
|
|
46
|
+
constructor(message: string);
|
|
47
|
+
}
|
|
48
|
+
export declare class AgentRelayClient {
|
|
49
|
+
private readonly options;
|
|
50
|
+
private child?;
|
|
51
|
+
private stdoutRl?;
|
|
52
|
+
private stderrRl?;
|
|
53
|
+
private requestSeq;
|
|
54
|
+
private pending;
|
|
55
|
+
private startingPromise?;
|
|
56
|
+
private eventListeners;
|
|
57
|
+
private stderrListeners;
|
|
58
|
+
private exitPromise?;
|
|
59
|
+
constructor(options?: AgentRelayClientOptions);
|
|
60
|
+
static start(options?: AgentRelayClientOptions): Promise<AgentRelayClient>;
|
|
61
|
+
onEvent(listener: (event: BrokerEvent) => void): () => void;
|
|
62
|
+
onBrokerStderr(listener: (line: string) => void): () => void;
|
|
63
|
+
start(): Promise<void>;
|
|
64
|
+
spawnPty(input: SpawnPtyInput): Promise<{
|
|
65
|
+
name: string;
|
|
66
|
+
runtime: AgentRuntime;
|
|
67
|
+
}>;
|
|
68
|
+
spawnHeadlessClaude(input: SpawnHeadlessClaudeInput): Promise<{
|
|
69
|
+
name: string;
|
|
70
|
+
runtime: AgentRuntime;
|
|
71
|
+
}>;
|
|
72
|
+
release(name: string): Promise<{
|
|
73
|
+
name: string;
|
|
74
|
+
}>;
|
|
75
|
+
sendMessage(input: SendMessageInput): Promise<{
|
|
76
|
+
event_id: string;
|
|
77
|
+
targets: string[];
|
|
78
|
+
}>;
|
|
79
|
+
listAgents(): Promise<ListAgent[]>;
|
|
80
|
+
getStatus(): Promise<BrokerStatus>;
|
|
81
|
+
shutdown(): Promise<void>;
|
|
82
|
+
waitForExit(): Promise<void>;
|
|
83
|
+
private startInternal;
|
|
84
|
+
private disposeProcessHandles;
|
|
85
|
+
private failAllPending;
|
|
86
|
+
private handleStdoutLine;
|
|
87
|
+
private requestHello;
|
|
88
|
+
private requestOk;
|
|
89
|
+
private sendRequest;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|