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,355 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* High-level facade for the Agent Relay SDK.
|
|
3
|
+
*
|
|
4
|
+
* Provides a clean, property-based API on top of the lower-level
|
|
5
|
+
* {@link AgentRelayClient} protocol client.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* import { AgentRelay } from "@agent-relay/sdk-ts";
|
|
10
|
+
*
|
|
11
|
+
* const relay = new AgentRelay();
|
|
12
|
+
*
|
|
13
|
+
* relay.onMessageReceived = (message) => console.log(message);
|
|
14
|
+
* relay.onAgentSpawned = (agent) => console.log("spawned", agent.name);
|
|
15
|
+
*
|
|
16
|
+
* const codex = await relay.codex.spawn();
|
|
17
|
+
* const human = relay.human({ name: "System" });
|
|
18
|
+
* await human.sendMessage({ to: codex.name, text: "Hello!" });
|
|
19
|
+
*
|
|
20
|
+
* const agents = await relay.listAgents();
|
|
21
|
+
* for (const a of agents) await a.release();
|
|
22
|
+
* await relay.shutdown();
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
import { randomBytes } from "node:crypto";
|
|
26
|
+
import path from "node:path";
|
|
27
|
+
import { AgentRelayClient, AgentRelayProtocolError, } from "./client.js";
|
|
28
|
+
import { RelaycastApi } from "./relaycast.js";
|
|
29
|
+
function isUnsupportedOperation(error) {
|
|
30
|
+
return error instanceof AgentRelayProtocolError && error.code === "unsupported_operation";
|
|
31
|
+
}
|
|
32
|
+
function buildUnsupportedOperationMessage(from, input) {
|
|
33
|
+
return {
|
|
34
|
+
eventId: "unsupported_operation",
|
|
35
|
+
from,
|
|
36
|
+
to: input.to,
|
|
37
|
+
text: input.text,
|
|
38
|
+
threadId: input.threadId,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
// ── AgentRelay facade ───────────────────────────────────────────────────────
|
|
42
|
+
export class AgentRelay {
|
|
43
|
+
// Event hooks — assign a callback or null to clear.
|
|
44
|
+
onMessageReceived = null;
|
|
45
|
+
onMessageSent = null;
|
|
46
|
+
onAgentSpawned = null;
|
|
47
|
+
onAgentReleased = null;
|
|
48
|
+
onAgentExited = null;
|
|
49
|
+
onWorkerOutput = null;
|
|
50
|
+
onDeliveryUpdate = null;
|
|
51
|
+
// Shorthand spawners
|
|
52
|
+
codex;
|
|
53
|
+
claude;
|
|
54
|
+
gemini;
|
|
55
|
+
clientOptions;
|
|
56
|
+
defaultChannels;
|
|
57
|
+
client;
|
|
58
|
+
startPromise;
|
|
59
|
+
unsubEvent;
|
|
60
|
+
knownAgents = new Map();
|
|
61
|
+
exitResolvers = new Map();
|
|
62
|
+
relaycastByName = new Map();
|
|
63
|
+
constructor(options = {}) {
|
|
64
|
+
this.defaultChannels = options.channels ?? ["general"];
|
|
65
|
+
this.clientOptions = {
|
|
66
|
+
binaryPath: options.binaryPath,
|
|
67
|
+
binaryArgs: options.binaryArgs,
|
|
68
|
+
brokerName: options.brokerName,
|
|
69
|
+
channels: this.defaultChannels,
|
|
70
|
+
cwd: options.cwd,
|
|
71
|
+
env: options.env,
|
|
72
|
+
requestTimeoutMs: options.requestTimeoutMs,
|
|
73
|
+
shutdownTimeoutMs: options.shutdownTimeoutMs,
|
|
74
|
+
};
|
|
75
|
+
this.codex = this.createSpawner("codex", "Codex", "pty");
|
|
76
|
+
this.claude = this.createSpawner("claude", "Claude", "pty");
|
|
77
|
+
this.gemini = this.createSpawner("gemini", "Gemini", "pty");
|
|
78
|
+
}
|
|
79
|
+
// ── Spawning ────────────────────────────────────────────────────────────
|
|
80
|
+
async spawnPty(input) {
|
|
81
|
+
const client = await this.ensureStarted();
|
|
82
|
+
const channels = input.channels ?? ["general"];
|
|
83
|
+
const result = await client.spawnPty({
|
|
84
|
+
name: input.name,
|
|
85
|
+
cli: input.cli,
|
|
86
|
+
args: input.args,
|
|
87
|
+
channels,
|
|
88
|
+
});
|
|
89
|
+
const agent = this.makeAgent(result.name, result.runtime, channels);
|
|
90
|
+
this.knownAgents.set(agent.name, agent);
|
|
91
|
+
return agent;
|
|
92
|
+
}
|
|
93
|
+
// ── Human source ────────────────────────────────────────────────────────
|
|
94
|
+
human(opts) {
|
|
95
|
+
const relay = this;
|
|
96
|
+
return {
|
|
97
|
+
name: opts.name,
|
|
98
|
+
async sendMessage(input) {
|
|
99
|
+
const client = await relay.ensureStarted();
|
|
100
|
+
let result;
|
|
101
|
+
try {
|
|
102
|
+
result = await client.sendMessage({
|
|
103
|
+
to: input.to,
|
|
104
|
+
text: input.text,
|
|
105
|
+
from: opts.name,
|
|
106
|
+
threadId: input.threadId,
|
|
107
|
+
priority: input.priority,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
if (isUnsupportedOperation(error)) {
|
|
112
|
+
return buildUnsupportedOperationMessage(opts.name, input);
|
|
113
|
+
}
|
|
114
|
+
throw error;
|
|
115
|
+
}
|
|
116
|
+
if (result?.event_id === "unsupported_operation") {
|
|
117
|
+
return buildUnsupportedOperationMessage(opts.name, input);
|
|
118
|
+
}
|
|
119
|
+
const eventId = result?.event_id ?? randomBytes(8).toString("hex");
|
|
120
|
+
const msg = {
|
|
121
|
+
eventId,
|
|
122
|
+
from: opts.name,
|
|
123
|
+
to: input.to,
|
|
124
|
+
text: input.text,
|
|
125
|
+
threadId: input.threadId,
|
|
126
|
+
};
|
|
127
|
+
relay.onMessageSent?.(msg);
|
|
128
|
+
return msg;
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
// ── Listing ─────────────────────────────────────────────────────────────
|
|
133
|
+
async listAgents() {
|
|
134
|
+
const client = await this.ensureStarted();
|
|
135
|
+
const list = await client.listAgents();
|
|
136
|
+
return list.map((entry) => {
|
|
137
|
+
const existing = this.knownAgents.get(entry.name);
|
|
138
|
+
if (existing)
|
|
139
|
+
return existing;
|
|
140
|
+
const agent = this.makeAgent(entry.name, entry.runtime, entry.channels);
|
|
141
|
+
this.knownAgents.set(agent.name, agent);
|
|
142
|
+
return agent;
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
// ── Status ────────────────────────────────────────────────────────────
|
|
146
|
+
async getStatus() {
|
|
147
|
+
const client = await this.ensureStarted();
|
|
148
|
+
return client.getStatus();
|
|
149
|
+
}
|
|
150
|
+
// ── Lifecycle ───────────────────────────────────────────────────────────
|
|
151
|
+
async shutdown() {
|
|
152
|
+
if (this.unsubEvent) {
|
|
153
|
+
this.unsubEvent();
|
|
154
|
+
this.unsubEvent = undefined;
|
|
155
|
+
}
|
|
156
|
+
if (this.client) {
|
|
157
|
+
await this.client.shutdown();
|
|
158
|
+
this.client = undefined;
|
|
159
|
+
}
|
|
160
|
+
this.knownAgents.clear();
|
|
161
|
+
for (const resolve of this.exitResolvers.values()) {
|
|
162
|
+
resolve("released");
|
|
163
|
+
}
|
|
164
|
+
this.exitResolvers.clear();
|
|
165
|
+
}
|
|
166
|
+
// ── Private helpers ─────────────────────────────────────────────────────
|
|
167
|
+
/** Resolve a target to a channel name. If `to` is `#channel`, use that
|
|
168
|
+
* channel. If it's a known agent name, use the agent's first channel.
|
|
169
|
+
* Otherwise fall back to the relay's default channel. */
|
|
170
|
+
resolveChannel(to) {
|
|
171
|
+
if (to.startsWith("#"))
|
|
172
|
+
return to.slice(1);
|
|
173
|
+
const agent = this.knownAgents.get(to);
|
|
174
|
+
if (agent && agent.channels.length > 0)
|
|
175
|
+
return agent.channels[0];
|
|
176
|
+
return this.defaultChannels[0];
|
|
177
|
+
}
|
|
178
|
+
ensureRelaycast(agentName) {
|
|
179
|
+
let rc = this.relaycastByName.get(agentName);
|
|
180
|
+
if (!rc) {
|
|
181
|
+
const cwd = this.clientOptions.cwd ?? process.cwd();
|
|
182
|
+
rc = new RelaycastApi({
|
|
183
|
+
agentName,
|
|
184
|
+
cachePath: path.join(cwd, ".agent-relay", "relaycast.json"),
|
|
185
|
+
});
|
|
186
|
+
this.relaycastByName.set(agentName, rc);
|
|
187
|
+
}
|
|
188
|
+
return rc;
|
|
189
|
+
}
|
|
190
|
+
async ensureStarted() {
|
|
191
|
+
if (this.client)
|
|
192
|
+
return this.client;
|
|
193
|
+
if (this.startPromise)
|
|
194
|
+
return this.startPromise;
|
|
195
|
+
this.startPromise = AgentRelayClient.start(this.clientOptions)
|
|
196
|
+
.then((c) => {
|
|
197
|
+
this.client = c;
|
|
198
|
+
this.startPromise = undefined;
|
|
199
|
+
this.wireEvents(c);
|
|
200
|
+
return c;
|
|
201
|
+
})
|
|
202
|
+
.catch((err) => {
|
|
203
|
+
this.startPromise = undefined;
|
|
204
|
+
throw err;
|
|
205
|
+
});
|
|
206
|
+
return this.startPromise;
|
|
207
|
+
}
|
|
208
|
+
wireEvents(client) {
|
|
209
|
+
this.unsubEvent = client.onEvent((event) => {
|
|
210
|
+
switch (event.kind) {
|
|
211
|
+
case "relay_inbound": {
|
|
212
|
+
const msg = {
|
|
213
|
+
eventId: event.event_id,
|
|
214
|
+
from: event.from,
|
|
215
|
+
to: event.target,
|
|
216
|
+
text: event.body,
|
|
217
|
+
threadId: event.thread_id,
|
|
218
|
+
};
|
|
219
|
+
this.onMessageReceived?.(msg);
|
|
220
|
+
break;
|
|
221
|
+
}
|
|
222
|
+
case "agent_spawned": {
|
|
223
|
+
let agent = this.knownAgents.get(event.name);
|
|
224
|
+
if (!agent) {
|
|
225
|
+
agent = this.makeAgent(event.name, event.runtime, []);
|
|
226
|
+
this.knownAgents.set(event.name, agent);
|
|
227
|
+
}
|
|
228
|
+
this.onAgentSpawned?.(agent);
|
|
229
|
+
break;
|
|
230
|
+
}
|
|
231
|
+
case "agent_released": {
|
|
232
|
+
const agent = this.knownAgents.get(event.name) ??
|
|
233
|
+
this.makeAgent(event.name, "pty", []);
|
|
234
|
+
this.onAgentReleased?.(agent);
|
|
235
|
+
this.knownAgents.delete(event.name);
|
|
236
|
+
this.exitResolvers.get(event.name)?.("released");
|
|
237
|
+
this.exitResolvers.delete(event.name);
|
|
238
|
+
break;
|
|
239
|
+
}
|
|
240
|
+
case "agent_exited": {
|
|
241
|
+
const agent = this.knownAgents.get(event.name) ??
|
|
242
|
+
this.makeAgent(event.name, "pty", []);
|
|
243
|
+
this.onAgentExited?.(agent);
|
|
244
|
+
this.knownAgents.delete(event.name);
|
|
245
|
+
this.exitResolvers.get(event.name)?.("exited");
|
|
246
|
+
this.exitResolvers.delete(event.name);
|
|
247
|
+
break;
|
|
248
|
+
}
|
|
249
|
+
case "worker_stream": {
|
|
250
|
+
this.onWorkerOutput?.({
|
|
251
|
+
name: event.name,
|
|
252
|
+
stream: event.stream,
|
|
253
|
+
chunk: event.chunk,
|
|
254
|
+
});
|
|
255
|
+
break;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
if (event.kind.startsWith("delivery_")) {
|
|
259
|
+
this.onDeliveryUpdate?.(event);
|
|
260
|
+
}
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
makeAgent(name, runtime, channels) {
|
|
264
|
+
const relay = this;
|
|
265
|
+
return {
|
|
266
|
+
name,
|
|
267
|
+
runtime,
|
|
268
|
+
channels,
|
|
269
|
+
async release() {
|
|
270
|
+
const client = await relay.ensureStarted();
|
|
271
|
+
await client.release(name);
|
|
272
|
+
},
|
|
273
|
+
waitForExit(timeoutMs) {
|
|
274
|
+
return new Promise((resolve) => {
|
|
275
|
+
// If already gone, resolve immediately
|
|
276
|
+
if (!relay.knownAgents.has(name)) {
|
|
277
|
+
resolve("exited");
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
// Non-blocking poll: timeoutMs === 0 means "check now, return immediately"
|
|
281
|
+
if (timeoutMs === 0) {
|
|
282
|
+
resolve("timeout");
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
let timer;
|
|
286
|
+
relay.exitResolvers.set(name, (reason) => {
|
|
287
|
+
if (timer)
|
|
288
|
+
clearTimeout(timer);
|
|
289
|
+
resolve(reason);
|
|
290
|
+
});
|
|
291
|
+
if (timeoutMs !== undefined) {
|
|
292
|
+
timer = setTimeout(() => {
|
|
293
|
+
relay.exitResolvers.delete(name);
|
|
294
|
+
resolve("timeout");
|
|
295
|
+
}, timeoutMs);
|
|
296
|
+
}
|
|
297
|
+
});
|
|
298
|
+
},
|
|
299
|
+
async sendMessage(input) {
|
|
300
|
+
const client = await relay.ensureStarted();
|
|
301
|
+
let result;
|
|
302
|
+
try {
|
|
303
|
+
result = await client.sendMessage({
|
|
304
|
+
to: input.to,
|
|
305
|
+
text: input.text,
|
|
306
|
+
from: name,
|
|
307
|
+
threadId: input.threadId,
|
|
308
|
+
priority: input.priority,
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
catch (error) {
|
|
312
|
+
if (isUnsupportedOperation(error)) {
|
|
313
|
+
return buildUnsupportedOperationMessage(name, input);
|
|
314
|
+
}
|
|
315
|
+
throw error;
|
|
316
|
+
}
|
|
317
|
+
if (result?.event_id === "unsupported_operation") {
|
|
318
|
+
return buildUnsupportedOperationMessage(name, input);
|
|
319
|
+
}
|
|
320
|
+
const eventId = result?.event_id ?? randomBytes(8).toString("hex");
|
|
321
|
+
const msg = {
|
|
322
|
+
eventId,
|
|
323
|
+
from: name,
|
|
324
|
+
to: input.to,
|
|
325
|
+
text: input.text,
|
|
326
|
+
threadId: input.threadId,
|
|
327
|
+
};
|
|
328
|
+
relay.onMessageSent?.(msg);
|
|
329
|
+
return msg;
|
|
330
|
+
},
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
createSpawner(cli, defaultName, runtime) {
|
|
334
|
+
const relay = this;
|
|
335
|
+
return {
|
|
336
|
+
async spawn(options) {
|
|
337
|
+
const client = await relay.ensureStarted();
|
|
338
|
+
const name = options?.name ?? defaultName;
|
|
339
|
+
const channels = options?.channels ?? ["general"];
|
|
340
|
+
const args = options?.args ?? [];
|
|
341
|
+
let result;
|
|
342
|
+
if (runtime === "headless_claude") {
|
|
343
|
+
result = await client.spawnHeadlessClaude({ name, args, channels });
|
|
344
|
+
}
|
|
345
|
+
else {
|
|
346
|
+
result = await client.spawnPty({ name, cli, args, channels });
|
|
347
|
+
}
|
|
348
|
+
const agent = relay.makeAgent(result.name, result.runtime, channels);
|
|
349
|
+
relay.knownAgents.set(agent.name, agent);
|
|
350
|
+
return agent;
|
|
351
|
+
},
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
//# sourceMappingURL=relay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay.js","sourceRoot":"","sources":["../src/relay.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
export interface RelaycastCredentials {
|
|
2
|
+
workspace_id: string;
|
|
3
|
+
agent_id: string;
|
|
4
|
+
api_key: string;
|
|
5
|
+
agent_name?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface RelaycastWorkspace {
|
|
8
|
+
workspaceId: string;
|
|
9
|
+
apiKey: string;
|
|
10
|
+
}
|
|
11
|
+
export interface RelaycastApiOptions {
|
|
12
|
+
/** Workspace API key. If provided, skips reading from the cache file. */
|
|
13
|
+
apiKey?: string;
|
|
14
|
+
baseUrl?: string;
|
|
15
|
+
cachePath?: string;
|
|
16
|
+
/** Agent name to register with. Defaults to a unique "sdk-<hex>" name. */
|
|
17
|
+
agentName?: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Convenience wrapper around `@relaycast/sdk` that manages workspace
|
|
21
|
+
* creation, agent registration, and message sending.
|
|
22
|
+
*/
|
|
23
|
+
export declare class RelaycastApi {
|
|
24
|
+
private readonly baseUrl;
|
|
25
|
+
private readonly cachePath;
|
|
26
|
+
private readonly agentName;
|
|
27
|
+
private readonly apiKeyOverride?;
|
|
28
|
+
private agentClient?;
|
|
29
|
+
constructor(options?: RelaycastApiOptions);
|
|
30
|
+
/**
|
|
31
|
+
* Create a new Relaycast workspace. Returns the workspace ID and API key.
|
|
32
|
+
* No authentication required — this is the bootstrap entry point.
|
|
33
|
+
*/
|
|
34
|
+
static createWorkspace(name: string, baseUrl?: string): Promise<RelaycastWorkspace>;
|
|
35
|
+
/** Resolve the workspace API key from explicit option, env, or cache file. */
|
|
36
|
+
private resolveApiKey;
|
|
37
|
+
/** Lazily register and return an authenticated AgentClient. */
|
|
38
|
+
private ensure;
|
|
39
|
+
/** Send a direct message to a named agent. */
|
|
40
|
+
sendDm(to: string, text: string): Promise<void>;
|
|
41
|
+
/** Send a message to a channel (without the leading #). */
|
|
42
|
+
sendToChannel(channel: string, text: string): Promise<void>;
|
|
43
|
+
/** Send to a target — prefixed with # for channel, otherwise DM. */
|
|
44
|
+
send(to: string, text: string): Promise<void>;
|
|
45
|
+
/** Fetch message history from a channel. */
|
|
46
|
+
getMessages(channel: string, opts?: {
|
|
47
|
+
limit?: number;
|
|
48
|
+
before?: string;
|
|
49
|
+
after?: string;
|
|
50
|
+
}): Promise<Array<{
|
|
51
|
+
id: string;
|
|
52
|
+
agent_name: string;
|
|
53
|
+
text: string;
|
|
54
|
+
created_at: string;
|
|
55
|
+
}>>;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=relaycast.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relaycast.d.ts","sourceRoot":"","sources":["../src/relaycast.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAS;IACzC,OAAO,CAAC,WAAW,CAAC,CAAc;gBAEtB,OAAO,GAAE,mBAAwB;IAO7C;;;OAGG;WACU,eAAe,CAC1B,IAAI,EAAE,MAAM,EACZ,OAAO,SAAmB,GACzB,OAAO,CAAC,kBAAkB,CAAC;IAmB9B,8EAA8E;YAChE,aAAa;IAQ3B,+DAA+D;YACjD,MAAM;IAwBpB,8CAA8C;IACxC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKrD,2DAA2D;IACrD,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKjE,oEAAoE;IAC9D,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQnD,4CAA4C;IACtC,WAAW,CACf,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GACzD,OAAO,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAUxF"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { Relay, RelayError } from "@relaycast/sdk";
|
|
6
|
+
const DEFAULT_BASE_URL = "https://api.relaycast.dev";
|
|
7
|
+
/**
|
|
8
|
+
* Convenience wrapper around `@relaycast/sdk` that manages workspace
|
|
9
|
+
* creation, agent registration, and message sending.
|
|
10
|
+
*/
|
|
11
|
+
export class RelaycastApi {
|
|
12
|
+
baseUrl;
|
|
13
|
+
cachePath;
|
|
14
|
+
agentName;
|
|
15
|
+
apiKeyOverride;
|
|
16
|
+
agentClient;
|
|
17
|
+
constructor(options = {}) {
|
|
18
|
+
this.baseUrl = options.baseUrl ?? process.env.RELAYCAST_BASE_URL ?? DEFAULT_BASE_URL;
|
|
19
|
+
this.cachePath = options.cachePath ?? join(homedir(), ".agent-relay", "relaycast.json");
|
|
20
|
+
this.agentName = options.agentName ?? `sdk-${randomBytes(4).toString("hex")}`;
|
|
21
|
+
this.apiKeyOverride = options.apiKey;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Create a new Relaycast workspace. Returns the workspace ID and API key.
|
|
25
|
+
* No authentication required — this is the bootstrap entry point.
|
|
26
|
+
*/
|
|
27
|
+
static async createWorkspace(name, baseUrl = DEFAULT_BASE_URL) {
|
|
28
|
+
const res = await fetch(`${baseUrl}/v1/workspaces`, {
|
|
29
|
+
method: "POST",
|
|
30
|
+
headers: { "content-type": "application/json" },
|
|
31
|
+
body: JSON.stringify({ name }),
|
|
32
|
+
});
|
|
33
|
+
if (!res.ok) {
|
|
34
|
+
throw new Error(`Failed to create workspace: ${res.status} ${await res.text()}`);
|
|
35
|
+
}
|
|
36
|
+
const body = await res.json();
|
|
37
|
+
const data = body.data ?? body;
|
|
38
|
+
const workspaceId = data.workspace_id ?? data.id;
|
|
39
|
+
const apiKey = data.api_key;
|
|
40
|
+
if (!workspaceId || !apiKey) {
|
|
41
|
+
throw new Error("Workspace response missing workspace_id or api_key");
|
|
42
|
+
}
|
|
43
|
+
return { workspaceId, apiKey };
|
|
44
|
+
}
|
|
45
|
+
/** Resolve the workspace API key from explicit option, env, or cache file. */
|
|
46
|
+
async resolveApiKey() {
|
|
47
|
+
if (this.apiKeyOverride)
|
|
48
|
+
return this.apiKeyOverride;
|
|
49
|
+
if (process.env.RELAY_API_KEY)
|
|
50
|
+
return process.env.RELAY_API_KEY;
|
|
51
|
+
const raw = await readFile(this.cachePath, "utf-8");
|
|
52
|
+
const creds = JSON.parse(raw);
|
|
53
|
+
return creds.api_key;
|
|
54
|
+
}
|
|
55
|
+
/** Lazily register and return an authenticated AgentClient. */
|
|
56
|
+
async ensure() {
|
|
57
|
+
if (this.agentClient)
|
|
58
|
+
return this.agentClient;
|
|
59
|
+
const apiKey = await this.resolveApiKey();
|
|
60
|
+
const relay = new Relay({ apiKey, baseUrl: this.baseUrl });
|
|
61
|
+
// Register — retry with a suffixed name on 409 conflict.
|
|
62
|
+
let name = this.agentName;
|
|
63
|
+
let registration;
|
|
64
|
+
try {
|
|
65
|
+
registration = await relay.agents.register({ name, type: "agent" });
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
if (err instanceof RelayError && err.code === "agent_already_exists") {
|
|
69
|
+
name = `${this.agentName}-${randomBytes(4).toString("hex")}`;
|
|
70
|
+
registration = await relay.agents.register({ name, type: "agent" });
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
throw err;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
this.agentClient = relay.as(registration.token);
|
|
77
|
+
return this.agentClient;
|
|
78
|
+
}
|
|
79
|
+
/** Send a direct message to a named agent. */
|
|
80
|
+
async sendDm(to, text) {
|
|
81
|
+
const agent = await this.ensure();
|
|
82
|
+
await agent.dm(to, text);
|
|
83
|
+
}
|
|
84
|
+
/** Send a message to a channel (without the leading #). */
|
|
85
|
+
async sendToChannel(channel, text) {
|
|
86
|
+
const agent = await this.ensure();
|
|
87
|
+
await agent.send(channel, text);
|
|
88
|
+
}
|
|
89
|
+
/** Send to a target — prefixed with # for channel, otherwise DM. */
|
|
90
|
+
async send(to, text) {
|
|
91
|
+
if (to.startsWith("#")) {
|
|
92
|
+
await this.sendToChannel(to.slice(1), text);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
await this.sendDm(to, text);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/** Fetch message history from a channel. */
|
|
99
|
+
async getMessages(channel, opts) {
|
|
100
|
+
const agent = await this.ensure();
|
|
101
|
+
const messages = await agent.messages(channel, opts);
|
|
102
|
+
return messages.map((m) => ({
|
|
103
|
+
id: m.id,
|
|
104
|
+
agent_name: m.agent_name,
|
|
105
|
+
text: m.text,
|
|
106
|
+
created_at: m.created_at,
|
|
107
|
+
}));
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=relaycast.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relaycast.js","sourceRoot":"","sources":["../src/relaycast.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shadow agent support for the broker SDK.
|
|
3
|
+
*
|
|
4
|
+
* A shadow agent monitors all messages to/from a primary agent.
|
|
5
|
+
* Implemented SDK-side using the event hook system — no broker
|
|
6
|
+
* protocol extension required.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* import { AgentRelay, ShadowManager } from "agent-relay/broker";
|
|
11
|
+
*
|
|
12
|
+
* const relay = new AgentRelay();
|
|
13
|
+
* const shadows = new ShadowManager();
|
|
14
|
+
*
|
|
15
|
+
* // Bind "Reviewer" as shadow of "Worker1"
|
|
16
|
+
* shadows.bind("Reviewer", "Worker1");
|
|
17
|
+
*
|
|
18
|
+
* // Wire into relay events
|
|
19
|
+
* relay.onMessageReceived = (msg) => {
|
|
20
|
+
* const copies = shadows.intercept(msg.from, msg.to, msg);
|
|
21
|
+
* for (const copy of copies) {
|
|
22
|
+
* // Forward shadow copies to the shadow agent
|
|
23
|
+
* relay.human({ name: "system" }).sendMessage({
|
|
24
|
+
* to: copy.shadowAgent,
|
|
25
|
+
* text: `[Shadow of ${copy.primaryAgent}] ${msg.text}`,
|
|
26
|
+
* });
|
|
27
|
+
* }
|
|
28
|
+
* };
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export type SpeakOnTrigger = "ALL_MESSAGES" | "EXPLICIT_ASK" | "SESSION_END" | "CODE_WRITTEN" | "REVIEW_REQUEST";
|
|
32
|
+
export interface ShadowConfig {
|
|
33
|
+
primaryAgent: string;
|
|
34
|
+
speakOn: SpeakOnTrigger[];
|
|
35
|
+
receiveIncoming: boolean;
|
|
36
|
+
receiveOutgoing: boolean;
|
|
37
|
+
}
|
|
38
|
+
export interface ShadowRelationship extends ShadowConfig {
|
|
39
|
+
shadowAgent: string;
|
|
40
|
+
}
|
|
41
|
+
export interface ShadowCopy {
|
|
42
|
+
shadowAgent: string;
|
|
43
|
+
primaryAgent: string;
|
|
44
|
+
direction: "incoming" | "outgoing";
|
|
45
|
+
}
|
|
46
|
+
export declare class ShadowManager {
|
|
47
|
+
/** primaryAgent → list of shadow relationships */
|
|
48
|
+
private shadowsByPrimary;
|
|
49
|
+
/** shadowAgent → primaryAgent (reverse lookup) */
|
|
50
|
+
private primaryByShadow;
|
|
51
|
+
/**
|
|
52
|
+
* Bind a shadow agent to monitor a primary agent.
|
|
53
|
+
*/
|
|
54
|
+
bind(shadowAgent: string, primaryAgent: string, options?: {
|
|
55
|
+
speakOn?: SpeakOnTrigger[];
|
|
56
|
+
receiveIncoming?: boolean;
|
|
57
|
+
receiveOutgoing?: boolean;
|
|
58
|
+
}): void;
|
|
59
|
+
/**
|
|
60
|
+
* Unbind a shadow from its primary.
|
|
61
|
+
*/
|
|
62
|
+
unbind(shadowAgent: string): void;
|
|
63
|
+
/**
|
|
64
|
+
* Get all shadows for a primary agent.
|
|
65
|
+
*/
|
|
66
|
+
getShadowsFor(primaryAgent: string): ShadowRelationship[];
|
|
67
|
+
/**
|
|
68
|
+
* Get the primary agent a shadow is bound to.
|
|
69
|
+
*/
|
|
70
|
+
getPrimaryFor(shadowAgent: string): string | undefined;
|
|
71
|
+
/**
|
|
72
|
+
* Check whether a shadow should speak for a given trigger.
|
|
73
|
+
*/
|
|
74
|
+
shouldSpeak(shadowAgent: string, trigger: SpeakOnTrigger): boolean;
|
|
75
|
+
/**
|
|
76
|
+
* Determine which shadows should receive a copy of a message
|
|
77
|
+
* between `from` and `to`. Returns a list of shadow copies to deliver.
|
|
78
|
+
*
|
|
79
|
+
* Call this from your `onMessageReceived` / `onMessageSent` hooks
|
|
80
|
+
* to fan out shadow copies.
|
|
81
|
+
*/
|
|
82
|
+
intercept(from: string, to: string): ShadowCopy[];
|
|
83
|
+
/**
|
|
84
|
+
* Emit a trigger event and return shadow agents that should be notified.
|
|
85
|
+
*
|
|
86
|
+
* Use this to implement `speakOn` behavior — when a trigger fires
|
|
87
|
+
* (e.g. CODE_WRITTEN, REVIEW_REQUEST), call this to find which
|
|
88
|
+
* shadows should receive a notification.
|
|
89
|
+
*/
|
|
90
|
+
emitTrigger(primaryAgent: string, trigger: SpeakOnTrigger): string[];
|
|
91
|
+
/**
|
|
92
|
+
* List all current shadow bindings.
|
|
93
|
+
*/
|
|
94
|
+
listBindings(): ShadowRelationship[];
|
|
95
|
+
/**
|
|
96
|
+
* Remove all bindings (for shutdown).
|
|
97
|
+
*/
|
|
98
|
+
clear(): void;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=shadow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shadow.d.ts","sourceRoot":"","sources":["../src/shadow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAIH,MAAM,MAAM,cAAc,GACtB,cAAc,GACd,cAAc,GACd,aAAa,GACb,cAAc,GACd,gBAAgB,CAAC;AAErB,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,eAAe,EAAE,OAAO,CAAC;IACzB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,kBAAmB,SAAQ,YAAY;IACtD,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,UAAU,GAAG,UAAU,CAAC;CACpC;AAID,qBAAa,aAAa;IACxB,kDAAkD;IAClD,OAAO,CAAC,gBAAgB,CAA2C;IACnE,kDAAkD;IAClD,OAAO,CAAC,eAAe,CAA6B;IAEpD;;OAEG;IACH,IAAI,CACF,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE;QACP,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;QAC3B,eAAe,CAAC,EAAE,OAAO,CAAC;QAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;KACtB,GACL,IAAI;IAqBP;;OAEG;IACH,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAgBjC;;OAEG;IACH,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,kBAAkB,EAAE;IAIzD;;OAEG;IACH,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAItD;;OAEG;IACH,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO;IAelE;;;;;;OAMG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,UAAU,EAAE;IAoCjD;;;;;;OAMG;IACH,WAAW,CACT,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,cAAc,GACtB,MAAM,EAAE;IAUX;;OAEG;IACH,YAAY,IAAI,kBAAkB,EAAE;IAQpC;;OAEG;IACH,KAAK,IAAI,IAAI;CAId"}
|