@openharness/core 0.3.3 → 0.4.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.
Files changed (99) hide show
  1. package/dist/__tests__/agent-registry.test.d.ts +2 -0
  2. package/dist/__tests__/agent-registry.test.d.ts.map +1 -0
  3. package/dist/__tests__/agent-registry.test.js +429 -0
  4. package/dist/__tests__/agent-registry.test.js.map +1 -0
  5. package/dist/__tests__/conversation.test.d.ts +2 -0
  6. package/dist/__tests__/conversation.test.d.ts.map +1 -0
  7. package/dist/__tests__/conversation.test.js +127 -0
  8. package/dist/__tests__/conversation.test.js.map +1 -0
  9. package/dist/__tests__/messages.test.js +15 -2
  10. package/dist/__tests__/messages.test.js.map +1 -1
  11. package/dist/__tests__/middleware/compaction.test.d.ts +2 -0
  12. package/dist/__tests__/middleware/compaction.test.d.ts.map +1 -0
  13. package/dist/__tests__/middleware/compaction.test.js +163 -0
  14. package/dist/__tests__/middleware/compaction.test.js.map +1 -0
  15. package/dist/__tests__/middleware/hooks.test.d.ts +2 -0
  16. package/dist/__tests__/middleware/hooks.test.d.ts.map +1 -0
  17. package/dist/__tests__/middleware/hooks.test.js +97 -0
  18. package/dist/__tests__/middleware/hooks.test.js.map +1 -0
  19. package/dist/__tests__/middleware/persistence.test.d.ts +2 -0
  20. package/dist/__tests__/middleware/persistence.test.d.ts.map +1 -0
  21. package/dist/__tests__/middleware/persistence.test.js +70 -0
  22. package/dist/__tests__/middleware/persistence.test.js.map +1 -0
  23. package/dist/__tests__/middleware/retry.test.d.ts +2 -0
  24. package/dist/__tests__/middleware/retry.test.d.ts.map +1 -0
  25. package/dist/__tests__/middleware/retry.test.js +151 -0
  26. package/dist/__tests__/middleware/retry.test.js.map +1 -0
  27. package/dist/__tests__/middleware/turn-tracking.test.d.ts +2 -0
  28. package/dist/__tests__/middleware/turn-tracking.test.d.ts.map +1 -0
  29. package/dist/__tests__/middleware/turn-tracking.test.js +70 -0
  30. package/dist/__tests__/middleware/turn-tracking.test.js.map +1 -0
  31. package/dist/__tests__/runner.test.d.ts +2 -0
  32. package/dist/__tests__/runner.test.d.ts.map +1 -0
  33. package/dist/__tests__/runner.test.js +111 -0
  34. package/dist/__tests__/runner.test.js.map +1 -0
  35. package/dist/__tests__/stream.test.d.ts +2 -0
  36. package/dist/__tests__/stream.test.d.ts.map +1 -0
  37. package/dist/__tests__/stream.test.js +100 -0
  38. package/dist/__tests__/stream.test.js.map +1 -0
  39. package/dist/__tests__/ui-stream.test.js +105 -0
  40. package/dist/__tests__/ui-stream.test.js.map +1 -1
  41. package/dist/agent-registry.d.ts +90 -0
  42. package/dist/agent-registry.d.ts.map +1 -0
  43. package/dist/agent-registry.js +217 -0
  44. package/dist/agent-registry.js.map +1 -0
  45. package/dist/agent.d.ts +13 -0
  46. package/dist/agent.d.ts.map +1 -1
  47. package/dist/agent.js +186 -41
  48. package/dist/agent.js.map +1 -1
  49. package/dist/conversation.d.ts +46 -0
  50. package/dist/conversation.d.ts.map +1 -0
  51. package/dist/conversation.js +66 -0
  52. package/dist/conversation.js.map +1 -0
  53. package/dist/index.d.ts +9 -0
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +14 -0
  56. package/dist/index.js.map +1 -1
  57. package/dist/middleware/compaction.d.ts +20 -0
  58. package/dist/middleware/compaction.d.ts.map +1 -0
  59. package/dist/middleware/compaction.js +73 -0
  60. package/dist/middleware/compaction.js.map +1 -0
  61. package/dist/middleware/hooks.d.ts +10 -0
  62. package/dist/middleware/hooks.d.ts.map +1 -0
  63. package/dist/middleware/hooks.js +36 -0
  64. package/dist/middleware/hooks.js.map +1 -0
  65. package/dist/middleware/index.d.ts +6 -0
  66. package/dist/middleware/index.d.ts.map +1 -0
  67. package/dist/middleware/index.js +6 -0
  68. package/dist/middleware/index.js.map +1 -0
  69. package/dist/middleware/persistence.d.ts +12 -0
  70. package/dist/middleware/persistence.d.ts.map +1 -0
  71. package/dist/middleware/persistence.js +15 -0
  72. package/dist/middleware/persistence.js.map +1 -0
  73. package/dist/middleware/retry.d.ts +8 -0
  74. package/dist/middleware/retry.d.ts.map +1 -0
  75. package/dist/middleware/retry.js +70 -0
  76. package/dist/middleware/retry.js.map +1 -0
  77. package/dist/middleware/turn-tracking.d.ts +7 -0
  78. package/dist/middleware/turn-tracking.d.ts.map +1 -0
  79. package/dist/middleware/turn-tracking.js +25 -0
  80. package/dist/middleware/turn-tracking.js.map +1 -0
  81. package/dist/runner.d.ts +23 -0
  82. package/dist/runner.d.ts.map +1 -0
  83. package/dist/runner.js +18 -0
  84. package/dist/runner.js.map +1 -0
  85. package/dist/session.d.ts.map +1 -1
  86. package/dist/session.js +7 -40
  87. package/dist/session.js.map +1 -1
  88. package/dist/stream.d.ts +12 -0
  89. package/dist/stream.d.ts.map +1 -0
  90. package/dist/stream.js +38 -0
  91. package/dist/stream.js.map +1 -0
  92. package/dist/ui-stream.d.ts.map +1 -1
  93. package/dist/ui-stream.js +13 -1
  94. package/dist/ui-stream.js.map +1 -1
  95. package/dist/utils.d.ts +8 -0
  96. package/dist/utils.d.ts.map +1 -0
  97. package/dist/utils.js +40 -0
  98. package/dist/utils.js.map +1 -0
  99. package/package.json +1 -1
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=agent-registry.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-registry.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/agent-registry.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,429 @@
1
+ import { describe, it, expect, vi, afterEach } from "vitest";
2
+ import { AgentRegistry, normalizeBackgroundConfig, } from "../agent-registry.js";
3
+ // ── Mock agents ─────────────────────────────────────────────────────
4
+ function createImmediateAgent(text) {
5
+ return {
6
+ run: async function* () {
7
+ yield { type: "text.done", text };
8
+ yield {
9
+ type: "done",
10
+ result: "complete",
11
+ messages: [],
12
+ totalUsage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },
13
+ };
14
+ },
15
+ close: vi.fn(),
16
+ };
17
+ }
18
+ function createFailingAgent(error) {
19
+ return {
20
+ run: async function* () {
21
+ throw error;
22
+ },
23
+ close: vi.fn(),
24
+ };
25
+ }
26
+ function createControllableAgent() {
27
+ let _resolve;
28
+ let _reject;
29
+ const gate = new Promise((resolve, reject) => {
30
+ _resolve = resolve;
31
+ _reject = reject;
32
+ });
33
+ const closeFn = vi.fn();
34
+ const agent = {
35
+ run: async function* (_h, _i, opts) {
36
+ const text = await Promise.race([
37
+ gate,
38
+ new Promise((_, reject) => {
39
+ if (opts?.signal?.aborted) {
40
+ reject(new Error("Aborted"));
41
+ return;
42
+ }
43
+ opts?.signal?.addEventListener("abort", () => reject(new Error("Aborted")));
44
+ }),
45
+ ]);
46
+ yield { type: "text.done", text };
47
+ yield {
48
+ type: "done",
49
+ result: "complete",
50
+ messages: [],
51
+ totalUsage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },
52
+ };
53
+ },
54
+ close: closeFn,
55
+ };
56
+ return { agent, resolve: _resolve, reject: _reject, closeFn };
57
+ }
58
+ // ── Helpers ─────────────────────────────────────────────────────────
59
+ const DEFAULT_CONFIG = {
60
+ maxConcurrent: Infinity,
61
+ timeout: undefined,
62
+ autoCancel: true,
63
+ tools: { status: true, cancel: true, await: ["all", "any", "race", "allSettled"] },
64
+ };
65
+ function createRegistry(overrides) {
66
+ return new AgentRegistry({ ...DEFAULT_CONFIG, ...overrides });
67
+ }
68
+ // ── Tests ───────────────────────────────────────────────────────────
69
+ describe("normalizeBackgroundConfig", () => {
70
+ it("returns undefined for false", () => {
71
+ expect(normalizeBackgroundConfig(false)).toBeUndefined();
72
+ });
73
+ it("returns full defaults for true", () => {
74
+ const config = normalizeBackgroundConfig(true);
75
+ expect(config).toEqual({
76
+ maxConcurrent: Infinity,
77
+ timeout: undefined,
78
+ autoCancel: true,
79
+ tools: { status: true, cancel: true, await: ["all", "any", "race", "allSettled"] },
80
+ });
81
+ });
82
+ it("fills in defaults for partial object", () => {
83
+ const config = normalizeBackgroundConfig({ maxConcurrent: 3 });
84
+ expect(config).toEqual({
85
+ maxConcurrent: 3,
86
+ timeout: undefined,
87
+ autoCancel: true,
88
+ tools: { status: true, cancel: true, await: ["all", "any", "race", "allSettled"] },
89
+ });
90
+ });
91
+ it("respects tools.await: false", () => {
92
+ const config = normalizeBackgroundConfig({ tools: { await: false } });
93
+ expect(config.tools.await).toBe(false);
94
+ });
95
+ it("respects tools.await: true", () => {
96
+ const config = normalizeBackgroundConfig({ tools: { await: true } });
97
+ expect(config.tools.await).toEqual(["all", "any", "race", "allSettled"]);
98
+ });
99
+ it("respects specific await modes", () => {
100
+ const config = normalizeBackgroundConfig({ tools: { await: ["all", "race"] } });
101
+ expect(config.tools.await).toEqual(["all", "race"]);
102
+ });
103
+ it("respects tools.status: false", () => {
104
+ const config = normalizeBackgroundConfig({ tools: { status: false } });
105
+ expect(config.tools.status).toBe(false);
106
+ });
107
+ it("respects tools.cancel: false", () => {
108
+ const config = normalizeBackgroundConfig({ tools: { cancel: false } });
109
+ expect(config.tools.cancel).toBe(false);
110
+ });
111
+ it("respects timeout", () => {
112
+ const config = normalizeBackgroundConfig({ timeout: 5000 });
113
+ expect(config.timeout).toBe(5000);
114
+ });
115
+ it("respects autoCancel: false", () => {
116
+ const config = normalizeBackgroundConfig({ autoCancel: false });
117
+ expect(config.autoCancel).toBe(false);
118
+ });
119
+ });
120
+ describe("AgentRegistry", () => {
121
+ afterEach(() => {
122
+ vi.restoreAllMocks();
123
+ });
124
+ describe("spawn", () => {
125
+ it("returns a unique ID", () => {
126
+ const registry = createRegistry();
127
+ const id1 = registry.spawn("a", createImmediateAgent("hi"), "p", {});
128
+ const id2 = registry.spawn("b", createImmediateAgent("hi"), "p", {});
129
+ expect(id1).toMatch(/^bg-\d+$/);
130
+ expect(id2).toMatch(/^bg-\d+$/);
131
+ expect(id1).not.toBe(id2);
132
+ });
133
+ it("tracks running count", () => {
134
+ const registry = createRegistry();
135
+ const { agent: a1 } = createControllableAgent();
136
+ const { agent: a2 } = createControllableAgent();
137
+ expect(registry.runningCount).toBe(0);
138
+ registry.spawn("a", a1, "p", {});
139
+ expect(registry.runningCount).toBe(1);
140
+ registry.spawn("b", a2, "p", {});
141
+ expect(registry.runningCount).toBe(2);
142
+ });
143
+ it("enforces maxConcurrent", () => {
144
+ const registry = createRegistry({ maxConcurrent: 1 });
145
+ const { agent: a1 } = createControllableAgent();
146
+ const { agent: a2 } = createControllableAgent();
147
+ registry.spawn("a", a1, "p", {});
148
+ expect(() => registry.spawn("b", a2, "p", {})).toThrow("Maximum concurrent background agents (1) reached");
149
+ });
150
+ it("allows new spawns after previous ones complete", async () => {
151
+ const registry = createRegistry({ maxConcurrent: 1 });
152
+ const agent1 = createImmediateAgent("done");
153
+ registry.spawn("a", agent1, "p", {});
154
+ // Wait for it to complete
155
+ await vi.waitFor(() => expect(registry.runningCount).toBe(0));
156
+ // Should now allow another
157
+ const { agent: a2 } = createControllableAgent();
158
+ expect(() => registry.spawn("b", a2, "p", {})).not.toThrow();
159
+ });
160
+ it("calls onEvent for agent events", async () => {
161
+ const registry = createRegistry();
162
+ const onEvent = vi.fn();
163
+ registry.spawn("researcher", createImmediateAgent("result"), "p", { onEvent });
164
+ await vi.waitFor(() => expect(onEvent).toHaveBeenCalled());
165
+ const textDoneCall = onEvent.mock.calls.find((call) => call[1].type === "text.done");
166
+ expect(textDoneCall).toBeDefined();
167
+ expect(textDoneCall[0]).toEqual(["researcher"]);
168
+ });
169
+ it("calls close on child agent after completion", async () => {
170
+ const registry = createRegistry();
171
+ const agent = createImmediateAgent("result");
172
+ registry.spawn("a", agent, "p", {});
173
+ await vi.waitFor(() => expect(agent.close).toHaveBeenCalled());
174
+ });
175
+ it("calls close on child agent after failure", async () => {
176
+ const registry = createRegistry();
177
+ const agent = createFailingAgent(new Error("boom"));
178
+ registry.spawn("a", agent, "p", {});
179
+ await vi.waitFor(() => expect(agent.close).toHaveBeenCalled());
180
+ });
181
+ });
182
+ describe("getStatus", () => {
183
+ it("returns undefined for unknown ID", () => {
184
+ const registry = createRegistry();
185
+ expect(registry.getStatus("bg-999")).toBeUndefined();
186
+ });
187
+ it("returns running immediately after spawn", () => {
188
+ const registry = createRegistry();
189
+ const { agent } = createControllableAgent();
190
+ const id = registry.spawn("a", agent, "p", {});
191
+ expect(registry.getStatus(id)).toEqual({ status: "running" });
192
+ });
193
+ it("returns done with result after success", async () => {
194
+ const registry = createRegistry();
195
+ const id = registry.spawn("a", createImmediateAgent("hello"), "p", {});
196
+ await vi.waitFor(() => expect(registry.getStatus(id)?.status).toBe("done"));
197
+ expect(registry.getStatus(id)).toEqual({
198
+ status: "done",
199
+ result: "hello",
200
+ });
201
+ });
202
+ it('returns "(no output)" when agent produces no text', async () => {
203
+ const agent = {
204
+ run: async function* () {
205
+ yield {
206
+ type: "done",
207
+ result: "complete",
208
+ messages: [],
209
+ totalUsage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },
210
+ };
211
+ },
212
+ close: vi.fn(),
213
+ };
214
+ const registry = createRegistry();
215
+ const id = registry.spawn("a", agent, "p", {});
216
+ await vi.waitFor(() => expect(registry.getStatus(id)?.status).toBe("done"));
217
+ expect(registry.getStatus(id).result).toBe("(no output)");
218
+ });
219
+ it("returns failed with error after failure", async () => {
220
+ const registry = createRegistry();
221
+ const id = registry.spawn("a", createFailingAgent(new Error("boom")), "p", {});
222
+ await vi.waitFor(() => expect(registry.getStatus(id)?.status).toBe("failed"));
223
+ expect(registry.getStatus(id)).toEqual({
224
+ status: "failed",
225
+ error: "boom",
226
+ });
227
+ });
228
+ it("returns cancelled after cancel", () => {
229
+ const registry = createRegistry();
230
+ const { agent } = createControllableAgent();
231
+ const id = registry.spawn("a", agent, "p", {});
232
+ registry.cancel(id);
233
+ expect(registry.getStatus(id)?.status).toBe("cancelled");
234
+ });
235
+ });
236
+ describe("cancel", () => {
237
+ it("returns true for running agent", () => {
238
+ const registry = createRegistry();
239
+ const { agent } = createControllableAgent();
240
+ const id = registry.spawn("a", agent, "p", {});
241
+ expect(registry.cancel(id)).toBe(true);
242
+ });
243
+ it("returns false for unknown ID", () => {
244
+ const registry = createRegistry();
245
+ expect(registry.cancel("bg-999")).toBe(false);
246
+ });
247
+ it("returns false for already-completed agent", async () => {
248
+ const registry = createRegistry();
249
+ const id = registry.spawn("a", createImmediateAgent("done"), "p", {});
250
+ await vi.waitFor(() => expect(registry.getStatus(id)?.status).toBe("done"));
251
+ expect(registry.cancel(id)).toBe(false);
252
+ });
253
+ it("returns false for already-cancelled agent", () => {
254
+ const registry = createRegistry();
255
+ const { agent } = createControllableAgent();
256
+ const id = registry.spawn("a", agent, "p", {});
257
+ registry.cancel(id);
258
+ expect(registry.cancel(id)).toBe(false);
259
+ });
260
+ it("decrements running count", () => {
261
+ const registry = createRegistry();
262
+ const { agent } = createControllableAgent();
263
+ const id = registry.spawn("a", agent, "p", {});
264
+ expect(registry.runningCount).toBe(1);
265
+ registry.cancel(id);
266
+ expect(registry.runningCount).toBe(0);
267
+ });
268
+ });
269
+ describe("cancelAll", () => {
270
+ it("cancels all running agents", () => {
271
+ const registry = createRegistry();
272
+ const c1 = createControllableAgent();
273
+ const c2 = createControllableAgent();
274
+ const id1 = registry.spawn("a", c1.agent, "p", {});
275
+ const id2 = registry.spawn("b", c2.agent, "p", {});
276
+ registry.cancelAll();
277
+ expect(registry.getStatus(id1)?.status).toBe("cancelled");
278
+ expect(registry.getStatus(id2)?.status).toBe("cancelled");
279
+ expect(registry.runningCount).toBe(0);
280
+ });
281
+ it("does not affect already-completed agents", async () => {
282
+ const registry = createRegistry();
283
+ const id = registry.spawn("a", createImmediateAgent("done"), "p", {});
284
+ await vi.waitFor(() => expect(registry.getStatus(id)?.status).toBe("done"));
285
+ registry.cancelAll();
286
+ expect(registry.getStatus(id)?.status).toBe("done");
287
+ });
288
+ });
289
+ describe("timeout", () => {
290
+ it("auto-cancels after timeout", async () => {
291
+ vi.useFakeTimers();
292
+ const registry = createRegistry({ timeout: 100 });
293
+ const { agent } = createControllableAgent();
294
+ const id = registry.spawn("a", agent, "p", {});
295
+ expect(registry.getStatus(id)?.status).toBe("running");
296
+ vi.advanceTimersByTime(100);
297
+ expect(registry.getStatus(id)?.status).toBe("cancelled");
298
+ expect(registry.getStatus(id)?.error).toBe("Timed out after 100ms");
299
+ vi.useRealTimers();
300
+ });
301
+ it("does not cancel if completed before timeout", async () => {
302
+ vi.useFakeTimers();
303
+ const registry = createRegistry({ timeout: 100 });
304
+ const id = registry.spawn("a", createImmediateAgent("fast"), "p", {});
305
+ await vi.advanceTimersByTimeAsync(0); // let microtasks run
306
+ expect(registry.getStatus(id)?.status).toBe("done");
307
+ vi.advanceTimersByTime(100);
308
+ expect(registry.getStatus(id)?.status).toBe("done"); // still done, not cancelled
309
+ vi.useRealTimers();
310
+ });
311
+ });
312
+ describe("parent signal propagation", () => {
313
+ it("cancels child when parent signal aborts", () => {
314
+ const registry = createRegistry();
315
+ const parentController = new AbortController();
316
+ const { agent } = createControllableAgent();
317
+ const id = registry.spawn("a", agent, "p", { signal: parentController.signal });
318
+ expect(registry.getStatus(id)?.status).toBe("running");
319
+ parentController.abort();
320
+ // The entry status is updated by the promise handler, but the controller is aborted
321
+ // which will cause the agent to throw
322
+ expect(registry.getStatus(id)?.status).toBe("running"); // status updates async
323
+ });
324
+ });
325
+ describe("awaitAll", () => {
326
+ it("resolves when all agents succeed", async () => {
327
+ const registry = createRegistry();
328
+ const id1 = registry.spawn("a", createImmediateAgent("result-1"), "p", {});
329
+ const id2 = registry.spawn("b", createImmediateAgent("result-2"), "p", {});
330
+ const results = await registry.awaitAll([id1, id2]);
331
+ expect(results.get(id1)).toBe("result-1");
332
+ expect(results.get(id2)).toBe("result-2");
333
+ });
334
+ it("rejects when any agent fails", async () => {
335
+ const registry = createRegistry();
336
+ const id1 = registry.spawn("a", createImmediateAgent("ok"), "p", {});
337
+ const id2 = registry.spawn("b", createFailingAgent(new Error("boom")), "p", {});
338
+ await expect(registry.awaitAll([id1, id2])).rejects.toThrow('Agent "bg-2" failed: boom');
339
+ });
340
+ it("rejects for unknown agent ID", async () => {
341
+ const registry = createRegistry();
342
+ await expect(registry.awaitAll(["bg-999"])).rejects.toThrow('Agent "bg-999" not found');
343
+ });
344
+ });
345
+ describe("awaitAllSettled", () => {
346
+ it("returns all results including failures", async () => {
347
+ const registry = createRegistry();
348
+ const id1 = registry.spawn("a", createImmediateAgent("ok"), "p", {});
349
+ const id2 = registry.spawn("b", createFailingAgent(new Error("boom")), "p", {});
350
+ const results = await registry.awaitAllSettled([id1, id2]);
351
+ expect(results.get(id1)).toEqual({ status: "done", result: "ok" });
352
+ expect(results.get(id2)).toEqual({ status: "failed", error: "boom" });
353
+ });
354
+ it("handles unknown IDs gracefully", async () => {
355
+ const registry = createRegistry();
356
+ const results = await registry.awaitAllSettled(["bg-999"]);
357
+ expect(results.get("bg-999")).toEqual({
358
+ status: "failed",
359
+ error: 'Agent "bg-999" not found',
360
+ });
361
+ });
362
+ it("reports cancelled agents correctly", async () => {
363
+ const registry = createRegistry();
364
+ const { agent } = createControllableAgent();
365
+ const id = registry.spawn("a", agent, "p", {});
366
+ registry.cancel(id);
367
+ const results = await registry.awaitAllSettled([id]);
368
+ expect(results.get(id)?.status).toBe("cancelled");
369
+ });
370
+ });
371
+ describe("awaitAny", () => {
372
+ it("resolves with the first successful agent", async () => {
373
+ const registry = createRegistry();
374
+ const c1 = createControllableAgent();
375
+ const id1 = registry.spawn("a", c1.agent, "p", {});
376
+ const id2 = registry.spawn("b", createImmediateAgent("fast"), "p", {});
377
+ const { id, result } = await registry.awaitAny([id1, id2]);
378
+ expect(id).toBe(id2);
379
+ expect(result).toBe("fast");
380
+ });
381
+ it("rejects when all agents fail", async () => {
382
+ const registry = createRegistry();
383
+ const id1 = registry.spawn("a", createFailingAgent(new Error("fail-1")), "p", {});
384
+ const id2 = registry.spawn("b", createFailingAgent(new Error("fail-2")), "p", {});
385
+ await expect(registry.awaitAny([id1, id2])).rejects.toBeInstanceOf(AggregateError);
386
+ });
387
+ it("rejects for unknown agent ID", async () => {
388
+ const registry = createRegistry();
389
+ await expect(registry.awaitAny(["bg-999"])).rejects.toBeInstanceOf(AggregateError);
390
+ });
391
+ it("succeeds if at least one succeeds among failures", async () => {
392
+ const registry = createRegistry();
393
+ const id1 = registry.spawn("a", createFailingAgent(new Error("fail")), "p", {});
394
+ const id2 = registry.spawn("b", createImmediateAgent("ok"), "p", {});
395
+ const { id, result } = await registry.awaitAny([id1, id2]);
396
+ expect(id).toBe(id2);
397
+ expect(result).toBe("ok");
398
+ });
399
+ });
400
+ describe("awaitRace", () => {
401
+ it("resolves with the first agent to settle (success)", async () => {
402
+ const registry = createRegistry();
403
+ const c1 = createControllableAgent();
404
+ const id1 = registry.spawn("slow", c1.agent, "p", {});
405
+ const id2 = registry.spawn("fast", createImmediateAgent("quick"), "p", {});
406
+ const result = await registry.awaitRace([id1, id2]);
407
+ expect(result.id).toBe(id2);
408
+ expect(result.result).toBe("quick");
409
+ expect(result.error).toBeUndefined();
410
+ });
411
+ it("resolves with the first agent to settle (failure)", async () => {
412
+ const registry = createRegistry();
413
+ const c1 = createControllableAgent();
414
+ const id1 = registry.spawn("slow", c1.agent, "p", {});
415
+ const id2 = registry.spawn("fast-fail", createFailingAgent(new Error("oops")), "p", {});
416
+ const result = await registry.awaitRace([id1, id2]);
417
+ expect(result.id).toBe(id2);
418
+ expect(result.error).toBe("oops");
419
+ });
420
+ it("handles unknown IDs", async () => {
421
+ const registry = createRegistry();
422
+ const c1 = createControllableAgent();
423
+ registry.spawn("slow", c1.agent, "p", {});
424
+ const result = await registry.awaitRace(["bg-999"]);
425
+ expect(result.error).toContain("not found");
426
+ });
427
+ });
428
+ });
429
+ //# sourceMappingURL=agent-registry.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-registry.test.js","sourceRoot":"","sources":["../../src/__tests__/agent-registry.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=conversation.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/conversation.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,127 @@
1
+ import { describe, it, expect, vi } from "vitest";
2
+ import { Conversation } from "../conversation.js";
3
+ // ── Helpers ─────────────────────────────────────────────────────────
4
+ const makeMessages = () => [
5
+ { role: "user", content: "hi" },
6
+ { role: "assistant", content: "hello" },
7
+ ];
8
+ function createMockRunner(events) {
9
+ return async function* () {
10
+ for (const event of events)
11
+ yield event;
12
+ };
13
+ }
14
+ async function collectEvents(gen) {
15
+ const result = [];
16
+ for await (const event of gen)
17
+ result.push(event);
18
+ return result;
19
+ }
20
+ const doneEvent = {
21
+ type: "done",
22
+ result: "complete",
23
+ messages: makeMessages(),
24
+ totalUsage: { inputTokens: 10, outputTokens: 5, totalTokens: 15 },
25
+ };
26
+ // ── Tests ───────────────────────────────────────────────────────────
27
+ describe("Conversation", () => {
28
+ it("updates messages from done events", async () => {
29
+ const runner = createMockRunner([
30
+ { type: "text.delta", text: "hello" },
31
+ doneEvent,
32
+ ]);
33
+ const conv = new Conversation({ runner });
34
+ expect(conv.messages).toEqual([]);
35
+ await collectEvents(conv.send("hi"));
36
+ expect(conv.messages).toEqual(makeMessages());
37
+ });
38
+ it("yields all events from the runner", async () => {
39
+ const events = [
40
+ { type: "text.delta", text: "hello" },
41
+ { type: "text.done", text: "hello" },
42
+ doneEvent,
43
+ ];
44
+ const runner = createMockRunner(events);
45
+ const conv = new Conversation({ runner });
46
+ const collected = await collectEvents(conv.send("hi"));
47
+ expect(collected).toEqual(events);
48
+ });
49
+ it("passes messages as history to subsequent calls", async () => {
50
+ const histories = [];
51
+ const runner = async function* (history, input) {
52
+ histories.push([...history]);
53
+ yield {
54
+ type: "done",
55
+ result: "complete",
56
+ messages: [...history, { role: "user", content: input }, { role: "assistant", content: "ok" }],
57
+ totalUsage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },
58
+ };
59
+ };
60
+ const conv = new Conversation({ runner });
61
+ await collectEvents(conv.send("first"));
62
+ await collectEvents(conv.send("second"));
63
+ expect(histories[0]).toEqual([]);
64
+ expect(histories[1]).toHaveLength(2);
65
+ });
66
+ describe("load/save", () => {
67
+ it("load returns false without store", async () => {
68
+ const conv = new Conversation({ runner: createMockRunner([]) });
69
+ expect(await conv.load()).toBe(false);
70
+ });
71
+ it("save is a no-op without store", async () => {
72
+ const conv = new Conversation({ runner: createMockRunner([]) });
73
+ await conv.save(); // should not throw
74
+ });
75
+ it("load populates messages from store", async () => {
76
+ const store = {
77
+ load: vi.fn().mockResolvedValue(makeMessages()),
78
+ save: vi.fn(),
79
+ };
80
+ const conv = new Conversation({
81
+ runner: createMockRunner([]),
82
+ store,
83
+ sessionId: "test-session",
84
+ });
85
+ const loaded = await conv.load();
86
+ expect(loaded).toBe(true);
87
+ expect(conv.messages).toEqual(makeMessages());
88
+ expect(store.load).toHaveBeenCalledWith("test-session");
89
+ });
90
+ it("load returns false when store returns undefined", async () => {
91
+ const store = {
92
+ load: vi.fn().mockResolvedValue(undefined),
93
+ save: vi.fn(),
94
+ };
95
+ const conv = new Conversation({ runner: createMockRunner([]), store });
96
+ expect(await conv.load()).toBe(false);
97
+ expect(conv.messages).toEqual([]);
98
+ });
99
+ it("save persists messages to store", async () => {
100
+ const store = {
101
+ load: vi.fn(),
102
+ save: vi.fn(),
103
+ };
104
+ const conv = new Conversation({
105
+ runner: createMockRunner([doneEvent]),
106
+ store,
107
+ sessionId: "test-session",
108
+ });
109
+ await collectEvents(conv.send("hi"));
110
+ await conv.save();
111
+ expect(store.save).toHaveBeenCalledWith("test-session", makeMessages());
112
+ });
113
+ });
114
+ it("generates a sessionId when not provided", () => {
115
+ const conv = new Conversation({ runner: createMockRunner([]) });
116
+ expect(conv.sessionId).toBeTruthy();
117
+ expect(typeof conv.sessionId).toBe("string");
118
+ });
119
+ it("uses provided sessionId", () => {
120
+ const conv = new Conversation({
121
+ runner: createMockRunner([]),
122
+ sessionId: "my-session",
123
+ });
124
+ expect(conv.sessionId).toBe("my-session");
125
+ });
126
+ });
127
+ //# sourceMappingURL=conversation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation.test.js","sourceRoot":"","sources":["../../src/__tests__/conversation.test.ts"],"names":[],"mappings":"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"}