@agent-relay/sdk 2.3.14 → 2.3.15

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.
Files changed (182) hide show
  1. package/README.md +68 -838
  2. package/bin/agent-relay-broker-darwin-arm64 +0 -0
  3. package/bin/agent-relay-broker-darwin-x64 +0 -0
  4. package/bin/agent-relay-broker-linux-arm64 +0 -0
  5. package/bin/agent-relay-broker-linux-x64 +0 -0
  6. package/dist/__tests__/contract-fixtures.test.d.ts +2 -0
  7. package/dist/__tests__/contract-fixtures.test.d.ts.map +1 -0
  8. package/dist/__tests__/contract-fixtures.test.js +85 -0
  9. package/dist/__tests__/contract-fixtures.test.js.map +1 -0
  10. package/dist/__tests__/facade.test.d.ts +2 -0
  11. package/dist/__tests__/facade.test.d.ts.map +1 -0
  12. package/dist/__tests__/facade.test.js +305 -0
  13. package/dist/__tests__/facade.test.js.map +1 -0
  14. package/dist/__tests__/integration.test.d.ts +2 -0
  15. package/dist/__tests__/integration.test.d.ts.map +1 -0
  16. package/dist/__tests__/integration.test.js +169 -0
  17. package/dist/__tests__/integration.test.js.map +1 -0
  18. package/dist/__tests__/pty.test.d.ts +2 -0
  19. package/dist/__tests__/pty.test.d.ts.map +1 -0
  20. package/dist/__tests__/pty.test.js +20 -0
  21. package/dist/__tests__/pty.test.js.map +1 -0
  22. package/dist/__tests__/quickstart.test.d.ts +2 -0
  23. package/dist/__tests__/quickstart.test.d.ts.map +1 -0
  24. package/dist/__tests__/quickstart.test.js +176 -0
  25. package/dist/__tests__/quickstart.test.js.map +1 -0
  26. package/dist/__tests__/spawn-from-env.test.d.ts +2 -0
  27. package/dist/__tests__/spawn-from-env.test.d.ts.map +1 -0
  28. package/dist/__tests__/spawn-from-env.test.js +206 -0
  29. package/dist/__tests__/spawn-from-env.test.js.map +1 -0
  30. package/dist/__tests__/unit.test.d.ts +2 -0
  31. package/dist/__tests__/unit.test.d.ts.map +1 -0
  32. package/dist/__tests__/unit.test.js +347 -0
  33. package/dist/__tests__/unit.test.js.map +1 -0
  34. package/dist/browser.d.ts +16 -0
  35. package/dist/browser.d.ts.map +1 -0
  36. package/dist/browser.js +19 -0
  37. package/dist/browser.js.map +1 -0
  38. package/dist/client.d.ts +140 -526
  39. package/dist/client.d.ts.map +1 -1
  40. package/dist/client.js +430 -1509
  41. package/dist/client.js.map +1 -1
  42. package/dist/consensus-helpers.d.ts +103 -0
  43. package/dist/consensus-helpers.d.ts.map +1 -0
  44. package/dist/consensus-helpers.js +147 -0
  45. package/dist/consensus-helpers.js.map +1 -0
  46. package/dist/consensus.d.ts +72 -0
  47. package/dist/consensus.d.ts.map +1 -0
  48. package/dist/consensus.js +378 -0
  49. package/dist/consensus.js.map +1 -0
  50. package/dist/examples/demo.d.ts +2 -0
  51. package/dist/examples/demo.d.ts.map +1 -0
  52. package/dist/examples/demo.js +63 -0
  53. package/dist/examples/demo.js.map +1 -0
  54. package/dist/examples/example.d.ts +2 -0
  55. package/dist/examples/example.d.ts.map +1 -0
  56. package/dist/examples/example.js +80 -0
  57. package/dist/examples/example.js.map +1 -0
  58. package/dist/examples/quickstart.d.ts +2 -0
  59. package/dist/examples/quickstart.d.ts.map +1 -0
  60. package/dist/examples/quickstart.js +56 -0
  61. package/dist/examples/quickstart.js.map +1 -0
  62. package/dist/examples/ralph-loop.d.ts +2 -0
  63. package/dist/examples/ralph-loop.d.ts.map +1 -0
  64. package/dist/examples/ralph-loop.js +281 -0
  65. package/dist/examples/ralph-loop.js.map +1 -0
  66. package/dist/examples/workflow-superiority.d.ts +32 -0
  67. package/dist/examples/workflow-superiority.d.ts.map +1 -0
  68. package/dist/examples/workflow-superiority.js +1421 -0
  69. package/dist/examples/workflow-superiority.js.map +1 -0
  70. package/dist/index.d.ts +13 -20
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js +12 -26
  73. package/dist/index.js.map +1 -1
  74. package/dist/logs.d.ts +70 -25
  75. package/dist/logs.d.ts.map +1 -1
  76. package/dist/logs.js +238 -42
  77. package/dist/logs.js.map +1 -1
  78. package/dist/models.d.ts +9 -0
  79. package/dist/models.d.ts.map +1 -0
  80. package/dist/models.js +17 -0
  81. package/dist/models.js.map +1 -0
  82. package/dist/protocol.d.ts +366 -0
  83. package/dist/protocol.d.ts.map +1 -0
  84. package/dist/protocol.js +2 -0
  85. package/dist/protocol.js.map +1 -0
  86. package/dist/pty.d.ts +8 -0
  87. package/dist/pty.d.ts.map +1 -0
  88. package/dist/pty.js +26 -0
  89. package/dist/pty.js.map +1 -0
  90. package/dist/relay-adapter.d.ts +139 -0
  91. package/dist/relay-adapter.d.ts.map +1 -0
  92. package/dist/relay-adapter.js +210 -0
  93. package/dist/relay-adapter.js.map +1 -0
  94. package/dist/relay.d.ts +304 -0
  95. package/dist/relay.d.ts.map +1 -0
  96. package/dist/relay.js +910 -0
  97. package/dist/relay.js.map +1 -0
  98. package/dist/shadow.d.ts +101 -0
  99. package/dist/shadow.d.ts.map +1 -0
  100. package/dist/shadow.js +174 -0
  101. package/dist/shadow.js.map +1 -0
  102. package/dist/spawn-from-env.d.ts +77 -0
  103. package/dist/spawn-from-env.d.ts.map +1 -0
  104. package/dist/spawn-from-env.js +172 -0
  105. package/dist/spawn-from-env.js.map +1 -0
  106. package/dist/workflows/barrier.d.ts +72 -0
  107. package/dist/workflows/barrier.d.ts.map +1 -0
  108. package/dist/workflows/barrier.js +162 -0
  109. package/dist/workflows/barrier.js.map +1 -0
  110. package/dist/workflows/builder.d.ts +114 -0
  111. package/dist/workflows/builder.d.ts.map +1 -0
  112. package/dist/workflows/builder.js +201 -0
  113. package/dist/workflows/builder.js.map +1 -0
  114. package/dist/workflows/cli.d.ts +11 -0
  115. package/dist/workflows/cli.d.ts.map +1 -0
  116. package/dist/workflows/cli.js +144 -0
  117. package/dist/workflows/cli.js.map +1 -0
  118. package/dist/workflows/coordinator.d.ts +73 -0
  119. package/dist/workflows/coordinator.d.ts.map +1 -0
  120. package/dist/workflows/coordinator.js +647 -0
  121. package/dist/workflows/coordinator.js.map +1 -0
  122. package/dist/workflows/custom-steps.d.ts +73 -0
  123. package/dist/workflows/custom-steps.d.ts.map +1 -0
  124. package/dist/workflows/custom-steps.js +321 -0
  125. package/dist/workflows/custom-steps.js.map +1 -0
  126. package/dist/workflows/dry-run-format.d.ts +6 -0
  127. package/dist/workflows/dry-run-format.d.ts.map +1 -0
  128. package/dist/workflows/dry-run-format.js +68 -0
  129. package/dist/workflows/dry-run-format.js.map +1 -0
  130. package/dist/workflows/file-db.d.ts +33 -0
  131. package/dist/workflows/file-db.d.ts.map +1 -0
  132. package/dist/workflows/file-db.js +108 -0
  133. package/dist/workflows/file-db.js.map +1 -0
  134. package/dist/workflows/index.d.ts +15 -0
  135. package/dist/workflows/index.d.ts.map +1 -0
  136. package/dist/workflows/index.js +15 -0
  137. package/dist/workflows/index.js.map +1 -0
  138. package/dist/workflows/memory-db.d.ts +17 -0
  139. package/dist/workflows/memory-db.d.ts.map +1 -0
  140. package/dist/workflows/memory-db.js +33 -0
  141. package/dist/workflows/memory-db.js.map +1 -0
  142. package/dist/workflows/run.d.ts +38 -0
  143. package/dist/workflows/run.d.ts.map +1 -0
  144. package/dist/workflows/run.js +25 -0
  145. package/dist/workflows/run.js.map +1 -0
  146. package/dist/workflows/runner.d.ts +320 -0
  147. package/dist/workflows/runner.d.ts.map +1 -0
  148. package/dist/workflows/runner.js +2821 -0
  149. package/dist/workflows/runner.js.map +1 -0
  150. package/dist/workflows/state.d.ts +77 -0
  151. package/dist/workflows/state.d.ts.map +1 -0
  152. package/dist/workflows/state.js +140 -0
  153. package/dist/workflows/state.js.map +1 -0
  154. package/dist/workflows/templates.d.ts +47 -0
  155. package/dist/workflows/templates.d.ts.map +1 -0
  156. package/dist/workflows/templates.js +405 -0
  157. package/dist/workflows/templates.js.map +1 -0
  158. package/dist/workflows/trajectory.d.ts +87 -0
  159. package/dist/workflows/trajectory.d.ts.map +1 -0
  160. package/dist/workflows/trajectory.js +441 -0
  161. package/dist/workflows/trajectory.js.map +1 -0
  162. package/dist/workflows/types.d.ts +306 -0
  163. package/dist/workflows/types.d.ts.map +1 -0
  164. package/dist/workflows/types.js +23 -0
  165. package/dist/workflows/types.js.map +1 -0
  166. package/dist/workflows/validator.d.ts +11 -0
  167. package/dist/workflows/validator.d.ts.map +1 -0
  168. package/dist/workflows/validator.js +128 -0
  169. package/dist/workflows/validator.js.map +1 -0
  170. package/package.json +59 -53
  171. package/dist/discovery.d.ts +0 -10
  172. package/dist/discovery.d.ts.map +0 -1
  173. package/dist/discovery.js +0 -22
  174. package/dist/discovery.js.map +0 -1
  175. package/dist/errors.d.ts +0 -9
  176. package/dist/errors.d.ts.map +0 -1
  177. package/dist/errors.js +0 -9
  178. package/dist/errors.js.map +0 -1
  179. package/dist/protocol/index.d.ts +0 -8
  180. package/dist/protocol/index.d.ts.map +0 -1
  181. package/dist/protocol/index.js +0 -8
  182. package/dist/protocol/index.js.map +0 -1
@@ -0,0 +1,347 @@
1
+ /**
2
+ * Unit tests — no broker binary or RELAY_API_KEY required.
3
+ *
4
+ * Run:
5
+ * npm run build && node --test dist/__tests__/unit.test.js
6
+ */
7
+ import assert from "node:assert/strict";
8
+ import { join } from "node:path";
9
+ import { appendFile, mkdtemp, writeFile, rm } from "node:fs/promises";
10
+ import { tmpdir } from "node:os";
11
+ import { setTimeout as sleep } from "node:timers/promises";
12
+ import test from "node:test";
13
+ import { AgentRelay } from "../relay.js";
14
+ import { followLogs, getLogs, listLoggedAgents } from "../logs.js";
15
+ function makeFakeAgent(name, exitAfterMs) {
16
+ return makeFakeAgentWithControls(name, exitAfterMs).agent;
17
+ }
18
+ function makeFakeAgentWithControls(name, exitAfterMs) {
19
+ let resolveExit;
20
+ const exitPromise = new Promise((resolve) => {
21
+ resolveExit = resolve;
22
+ });
23
+ let resolveIdle;
24
+ let idlePromise;
25
+ function makeIdlePromise() {
26
+ idlePromise = new Promise((resolve) => {
27
+ resolveIdle = resolve;
28
+ });
29
+ }
30
+ if (exitAfterMs !== undefined) {
31
+ setTimeout(() => resolveExit?.("exited"), exitAfterMs);
32
+ }
33
+ const agent = {
34
+ name,
35
+ runtime: "pty",
36
+ channels: ["general"],
37
+ status: "ready",
38
+ exitCode: undefined,
39
+ exitSignal: undefined,
40
+ async release() {
41
+ resolveExit?.("released");
42
+ },
43
+ waitForReady(timeoutMs) {
44
+ if (timeoutMs === 0) {
45
+ return Promise.reject(new Error(`Timed out waiting for worker_ready for '${name}' after 0ms`));
46
+ }
47
+ return Promise.resolve();
48
+ },
49
+ waitForExit(timeoutMs) {
50
+ if (timeoutMs === 0)
51
+ return Promise.resolve("timeout");
52
+ if (timeoutMs !== undefined) {
53
+ return Promise.race([
54
+ exitPromise,
55
+ new Promise((resolve) => setTimeout(() => resolve("timeout"), timeoutMs)),
56
+ ]);
57
+ }
58
+ return exitPromise;
59
+ },
60
+ waitForIdle(timeoutMs) {
61
+ makeIdlePromise();
62
+ if (timeoutMs === 0)
63
+ return Promise.resolve("timeout");
64
+ if (timeoutMs !== undefined) {
65
+ return Promise.race([
66
+ idlePromise,
67
+ new Promise((resolve) => setTimeout(() => resolve("timeout"), timeoutMs)),
68
+ ]);
69
+ }
70
+ return idlePromise;
71
+ },
72
+ async sendMessage() {
73
+ return { eventId: "fake", from: name, to: "", text: "" };
74
+ },
75
+ onOutput(_callback) {
76
+ return () => { };
77
+ },
78
+ };
79
+ return {
80
+ agent,
81
+ triggerExit: () => resolveExit?.("exited"),
82
+ triggerIdle: () => resolveIdle?.("idle"),
83
+ };
84
+ }
85
+ async function waitForLogEvent(events, predicate, timeoutMs = 2_000) {
86
+ const startedAt = Date.now();
87
+ while (Date.now() - startedAt < timeoutMs) {
88
+ const matched = events.find(predicate);
89
+ if (matched) {
90
+ return matched;
91
+ }
92
+ await sleep(20);
93
+ }
94
+ throw new Error("Timed out waiting for log follow event");
95
+ }
96
+ test("waitForAny: returns first agent to exit", async () => {
97
+ const fast = makeFakeAgent("fast", 50);
98
+ const slow = makeFakeAgent("slow", 5_000);
99
+ const { agent, result } = await AgentRelay.waitForAny([fast, slow], 3_000);
100
+ assert.equal(agent.name, "fast");
101
+ assert.equal(result, "exited");
102
+ });
103
+ test("waitForAny: returns timeout when no agent exits", async () => {
104
+ const a = makeFakeAgent("a");
105
+ const b = makeFakeAgent("b");
106
+ const { result } = await AgentRelay.waitForAny([a, b], 100);
107
+ assert.equal(result, "timeout");
108
+ });
109
+ test("waitForAny: handles released agent", async () => {
110
+ const agent = makeFakeAgent("releasable");
111
+ // Release after 50ms
112
+ setTimeout(() => agent.release(), 50);
113
+ const { agent: resolved, result } = await AgentRelay.waitForAny([agent], 3_000);
114
+ assert.equal(resolved.name, "releasable");
115
+ assert.equal(result, "released");
116
+ });
117
+ test("waitForAny: throws on empty agents array", async () => {
118
+ await assert.rejects(() => AgentRelay.waitForAny([]), { message: "waitForAny requires at least one agent" });
119
+ });
120
+ // ── getLogs ──────────────────────────────────────────────────────────────────
121
+ test("getLogs: rejects path traversal", async () => {
122
+ const result = await getLogs("../../etc/passwd", {
123
+ logsDir: "/tmp/test-logs",
124
+ });
125
+ assert.equal(result.found, false);
126
+ assert.equal(result.content, "");
127
+ });
128
+ test("getLogs: returns not found for missing agent", async () => {
129
+ const dir = await mkdtemp(join(tmpdir(), "relay-test-logs-"));
130
+ try {
131
+ const result = await getLogs("nonexistent", { logsDir: dir });
132
+ assert.equal(result.found, false);
133
+ assert.equal(result.content, "");
134
+ }
135
+ finally {
136
+ await rm(dir, { recursive: true, force: true });
137
+ }
138
+ });
139
+ test("getLogs: reads content from log file", async () => {
140
+ const dir = await mkdtemp(join(tmpdir(), "relay-test-logs-"));
141
+ try {
142
+ const logContent = "line1\nline2\nline3\n";
143
+ await writeFile(join(dir, "TestAgent.log"), logContent);
144
+ const result = await getLogs("TestAgent", { logsDir: dir, lines: 2 });
145
+ assert.equal(result.found, true);
146
+ assert.equal(result.content, "line2\nline3");
147
+ assert.equal(result.lineCount, 2);
148
+ }
149
+ finally {
150
+ await rm(dir, { recursive: true, force: true });
151
+ }
152
+ });
153
+ test("listLoggedAgents: lists agent names from log files", async () => {
154
+ const dir = await mkdtemp(join(tmpdir(), "relay-test-logs-"));
155
+ try {
156
+ await writeFile(join(dir, "Alice.log"), "hello\n");
157
+ await writeFile(join(dir, "Bob.log"), "world\n");
158
+ await writeFile(join(dir, "not-a-log.txt"), "skip\n");
159
+ const agents = await listLoggedAgents(dir);
160
+ assert.ok(agents.includes("Alice"));
161
+ assert.ok(agents.includes("Bob"));
162
+ assert.ok(!agents.includes("not-a-log"));
163
+ }
164
+ finally {
165
+ await rm(dir, { recursive: true, force: true });
166
+ }
167
+ });
168
+ test("listLoggedAgents: returns empty for missing directory", async () => {
169
+ const agents = await listLoggedAgents("/tmp/definitely-nonexistent-dir");
170
+ assert.deepEqual(agents, []);
171
+ });
172
+ test("followLogs: emits error for missing logs by default", async () => {
173
+ const dir = await mkdtemp(join(tmpdir(), "relay-test-follow-"));
174
+ const events = [];
175
+ try {
176
+ const handle = followLogs("MissingAgent", {
177
+ logsDir: dir,
178
+ pollMs: 50,
179
+ onEvent: (event) => events.push(event),
180
+ });
181
+ const event = await waitForLogEvent(events, (item) => item.type === "error");
182
+ assert.equal(event.type, "error");
183
+ if (event.type === "error") {
184
+ assert.match(event.error, /No local logs/);
185
+ assert.ok(Array.isArray(event.availableAgents));
186
+ }
187
+ handle.unsubscribe();
188
+ }
189
+ finally {
190
+ await rm(dir, { recursive: true, force: true });
191
+ }
192
+ });
193
+ test("followLogs: emits history then incremental log content", async () => {
194
+ const dir = await mkdtemp(join(tmpdir(), "relay-test-follow-"));
195
+ const logFile = join(dir, "Worker.log");
196
+ const events = [];
197
+ try {
198
+ await writeFile(logFile, "line1\nline2\n");
199
+ const handle = followLogs("Worker", {
200
+ logsDir: dir,
201
+ historyLines: 1,
202
+ pollMs: 50,
203
+ onEvent: (event) => events.push(event),
204
+ });
205
+ const historyEvent = await waitForLogEvent(events, (item) => item.type === "history");
206
+ assert.equal(historyEvent.type, "history");
207
+ if (historyEvent.type === "history") {
208
+ assert.deepEqual(historyEvent.lines, ["line2"]);
209
+ }
210
+ await appendFile(logFile, "line3\nline4\n");
211
+ const deltaEvent = await waitForLogEvent(events, (item) => item.type === "log" && item.content.includes("line3"));
212
+ assert.equal(deltaEvent.type, "log");
213
+ if (deltaEvent.type === "log") {
214
+ assert.match(deltaEvent.content, /line3/);
215
+ assert.match(deltaEvent.content, /line4/);
216
+ }
217
+ const logEventsBeforeStop = events.filter((item) => item.type === "log").length;
218
+ handle.unsubscribe();
219
+ await appendFile(logFile, "line5\n");
220
+ await sleep(120);
221
+ const logEventsAfterStop = events.filter((item) => item.type === "log").length;
222
+ assert.equal(logEventsAfterStop, logEventsBeforeStop);
223
+ }
224
+ finally {
225
+ await rm(dir, { recursive: true, force: true });
226
+ }
227
+ });
228
+ test("followLogs: allowMissing keeps stream open until file appears", async () => {
229
+ const dir = await mkdtemp(join(tmpdir(), "relay-test-follow-"));
230
+ const logFile = join(dir, "LateWorker.log");
231
+ const events = [];
232
+ try {
233
+ const handle = followLogs("LateWorker", {
234
+ logsDir: dir,
235
+ allowMissing: true,
236
+ pollMs: 50,
237
+ onEvent: (event) => events.push(event),
238
+ });
239
+ const historyEvent = await waitForLogEvent(events, (item) => item.type === "history");
240
+ assert.equal(historyEvent.type, "history");
241
+ if (historyEvent.type === "history") {
242
+ assert.deepEqual(historyEvent.lines, []);
243
+ }
244
+ await writeFile(logFile, "boot\n");
245
+ const deltaEvent = await waitForLogEvent(events, (item) => item.type === "log" && item.content.includes("boot"));
246
+ assert.equal(deltaEvent.type, "log");
247
+ if (deltaEvent.type === "log") {
248
+ assert.match(deltaEvent.content, /boot/);
249
+ }
250
+ handle.unsubscribe();
251
+ }
252
+ finally {
253
+ await rm(dir, { recursive: true, force: true });
254
+ }
255
+ });
256
+ // ── waitForIdle ────────────────────────────────────────────────────────────
257
+ test("waitForIdle: resolves with idle when agent goes idle", async () => {
258
+ const { agent, triggerIdle } = makeFakeAgentWithControls("worker");
259
+ const promise = agent.waitForIdle(5_000);
260
+ setTimeout(() => triggerIdle(), 20);
261
+ const result = await promise;
262
+ assert.equal(result, "idle");
263
+ });
264
+ test("waitForIdle: resolves with timeout when time elapses", async () => {
265
+ const { agent } = makeFakeAgentWithControls("worker");
266
+ const result = await agent.waitForIdle(50);
267
+ assert.equal(result, "timeout");
268
+ });
269
+ test("waitForIdle: resolves with exited when agent exits before idle", async () => {
270
+ const { agent, triggerExit } = makeFakeAgentWithControls("worker");
271
+ const idlePromise = agent.waitForIdle(5_000);
272
+ // Simulate exit resolving the idle promise (as relay.ts wireEvents does)
273
+ setTimeout(() => {
274
+ // In a real scenario, wireEvents resolves the idle resolver with "exited"
275
+ // when agent_exited fires. Here we simulate that directly.
276
+ triggerExit();
277
+ }, 20);
278
+ // The mock's waitForIdle won't auto-resolve on exit (that's wired in relay.ts),
279
+ // so this tests the timeout fallback for the mock. In the real SDK, the
280
+ // wireEvents handler resolves idle resolvers on exit.
281
+ // For the mock, we can test the timeout path instead.
282
+ const result = await agent.waitForIdle(100);
283
+ assert.equal(result, "timeout");
284
+ });
285
+ test("waitForIdle: returns timeout immediately with timeoutMs=0", async () => {
286
+ const { agent } = makeFakeAgentWithControls("worker");
287
+ const result = await agent.waitForIdle(0);
288
+ assert.equal(result, "timeout");
289
+ });
290
+ test("waitForIdle: idle resolves before timeout", async () => {
291
+ const { agent, triggerIdle } = makeFakeAgentWithControls("worker");
292
+ // Trigger idle almost immediately, with a long timeout
293
+ const promise = agent.waitForIdle(5_000);
294
+ setTimeout(() => triggerIdle(), 10);
295
+ const result = await promise;
296
+ assert.equal(result, "idle");
297
+ });
298
+ // ── agent.status ────────────────────────────────────────────────────────────
299
+ test("agent.status: mock agent has ready status", () => {
300
+ const { agent } = makeFakeAgentWithControls("worker");
301
+ assert.equal(agent.status, "ready");
302
+ });
303
+ // ── agent.onOutput ──────────────────────────────────────────────────────────
304
+ test("agent.onOutput: mock returns unsubscribe function", () => {
305
+ const { agent } = makeFakeAgentWithControls("worker");
306
+ const chunks = [];
307
+ const unsub = agent.onOutput(({ chunk }) => chunks.push(chunk));
308
+ assert.equal(typeof unsub, "function");
309
+ unsub();
310
+ });
311
+ // ── AgentRelay.workspaceKey / observerUrl ────────────────────────────────────
312
+ // These tests verify the getter logic without a running broker.
313
+ test("workspaceKey: undefined before relay starts", () => {
314
+ const relay = new AgentRelay({ channels: ["general"] });
315
+ assert.equal(relay.workspaceKey, undefined);
316
+ });
317
+ test("observerUrl: undefined before relay starts", () => {
318
+ const relay = new AgentRelay({ channels: ["general"] });
319
+ assert.equal(relay.observerUrl, undefined);
320
+ });
321
+ test("observerUrl: returns correct URL format when workspaceKey is set", () => {
322
+ const relay = new AgentRelay({ channels: ["general"] });
323
+ // Simulate the relayApiKey being set (as ensureStarted() does after hello_ack).
324
+ relay.relayApiKey = "rk_live_test123";
325
+ const url = relay.observerUrl;
326
+ assert.ok(url, "observerUrl should be defined after key is set");
327
+ assert.ok(url.startsWith("https://observer.relaycast.dev/?key="), `observerUrl should start with observer base URL, got: ${url}`);
328
+ assert.ok(url.includes("rk_live_test123"), "observerUrl should include the workspace key");
329
+ assert.equal(relay.workspaceKey, "rk_live_test123");
330
+ });
331
+ test("ensureRelaycastApiKey: env key propagates to clientOptions.env", () => {
332
+ // When RELAY_API_KEY is in options.env, it must be preserved and passed
333
+ // to the broker subprocess. Previously, if clientOptions.env was set via
334
+ // the constructor, it would be used as-is without adding process.env
335
+ // (which is correct). If clientOptions.env was undefined, we must populate
336
+ // it so the broker gets the key AND PATH etc.
337
+ const relay = new AgentRelay({
338
+ channels: ["general"],
339
+ env: { RELAY_API_KEY: "rk_live_from_options", PATH: "/usr/bin" },
340
+ });
341
+ // The key should be accessible via getter immediately (read from options.env).
342
+ // Note: workspaceKey is only set after ensureStarted() runs, but we can
343
+ // verify the env is configured correctly via the private field.
344
+ const opts = relay.clientOptions;
345
+ assert.equal(opts.env?.RELAY_API_KEY, "rk_live_from_options");
346
+ });
347
+ //# sourceMappingURL=unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unit.test.js","sourceRoot":"","sources":["../../src/__tests__/unit.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"}