@openharness/core 0.4.0 → 0.4.2

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 (100) hide show
  1. package/README.md +116 -0
  2. package/dist/__tests__/agent-registry.test.d.ts +2 -0
  3. package/dist/__tests__/agent-registry.test.d.ts.map +1 -0
  4. package/dist/__tests__/agent-registry.test.js +429 -0
  5. package/dist/__tests__/agent-registry.test.js.map +1 -0
  6. package/dist/__tests__/conversation.test.d.ts +2 -0
  7. package/dist/__tests__/conversation.test.d.ts.map +1 -0
  8. package/dist/__tests__/conversation.test.js +127 -0
  9. package/dist/__tests__/conversation.test.js.map +1 -0
  10. package/dist/__tests__/messages.test.js +15 -2
  11. package/dist/__tests__/messages.test.js.map +1 -1
  12. package/dist/__tests__/middleware/compaction.test.d.ts +2 -0
  13. package/dist/__tests__/middleware/compaction.test.d.ts.map +1 -0
  14. package/dist/__tests__/middleware/compaction.test.js +163 -0
  15. package/dist/__tests__/middleware/compaction.test.js.map +1 -0
  16. package/dist/__tests__/middleware/hooks.test.d.ts +2 -0
  17. package/dist/__tests__/middleware/hooks.test.d.ts.map +1 -0
  18. package/dist/__tests__/middleware/hooks.test.js +97 -0
  19. package/dist/__tests__/middleware/hooks.test.js.map +1 -0
  20. package/dist/__tests__/middleware/persistence.test.d.ts +2 -0
  21. package/dist/__tests__/middleware/persistence.test.d.ts.map +1 -0
  22. package/dist/__tests__/middleware/persistence.test.js +70 -0
  23. package/dist/__tests__/middleware/persistence.test.js.map +1 -0
  24. package/dist/__tests__/middleware/retry.test.d.ts +2 -0
  25. package/dist/__tests__/middleware/retry.test.d.ts.map +1 -0
  26. package/dist/__tests__/middleware/retry.test.js +151 -0
  27. package/dist/__tests__/middleware/retry.test.js.map +1 -0
  28. package/dist/__tests__/middleware/turn-tracking.test.d.ts +2 -0
  29. package/dist/__tests__/middleware/turn-tracking.test.d.ts.map +1 -0
  30. package/dist/__tests__/middleware/turn-tracking.test.js +70 -0
  31. package/dist/__tests__/middleware/turn-tracking.test.js.map +1 -0
  32. package/dist/__tests__/runner.test.d.ts +2 -0
  33. package/dist/__tests__/runner.test.d.ts.map +1 -0
  34. package/dist/__tests__/runner.test.js +111 -0
  35. package/dist/__tests__/runner.test.js.map +1 -0
  36. package/dist/__tests__/stream.test.d.ts +2 -0
  37. package/dist/__tests__/stream.test.d.ts.map +1 -0
  38. package/dist/__tests__/stream.test.js +100 -0
  39. package/dist/__tests__/stream.test.js.map +1 -0
  40. package/dist/__tests__/ui-stream.test.js +105 -0
  41. package/dist/__tests__/ui-stream.test.js.map +1 -1
  42. package/dist/agent-registry.d.ts +90 -0
  43. package/dist/agent-registry.d.ts.map +1 -0
  44. package/dist/agent-registry.js +217 -0
  45. package/dist/agent-registry.js.map +1 -0
  46. package/dist/agent.d.ts +13 -0
  47. package/dist/agent.d.ts.map +1 -1
  48. package/dist/agent.js +186 -41
  49. package/dist/agent.js.map +1 -1
  50. package/dist/conversation.d.ts +46 -0
  51. package/dist/conversation.d.ts.map +1 -0
  52. package/dist/conversation.js +66 -0
  53. package/dist/conversation.js.map +1 -0
  54. package/dist/index.d.ts +9 -0
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +14 -0
  57. package/dist/index.js.map +1 -1
  58. package/dist/middleware/compaction.d.ts +20 -0
  59. package/dist/middleware/compaction.d.ts.map +1 -0
  60. package/dist/middleware/compaction.js +73 -0
  61. package/dist/middleware/compaction.js.map +1 -0
  62. package/dist/middleware/hooks.d.ts +10 -0
  63. package/dist/middleware/hooks.d.ts.map +1 -0
  64. package/dist/middleware/hooks.js +36 -0
  65. package/dist/middleware/hooks.js.map +1 -0
  66. package/dist/middleware/index.d.ts +6 -0
  67. package/dist/middleware/index.d.ts.map +1 -0
  68. package/dist/middleware/index.js +6 -0
  69. package/dist/middleware/index.js.map +1 -0
  70. package/dist/middleware/persistence.d.ts +12 -0
  71. package/dist/middleware/persistence.d.ts.map +1 -0
  72. package/dist/middleware/persistence.js +15 -0
  73. package/dist/middleware/persistence.js.map +1 -0
  74. package/dist/middleware/retry.d.ts +8 -0
  75. package/dist/middleware/retry.d.ts.map +1 -0
  76. package/dist/middleware/retry.js +70 -0
  77. package/dist/middleware/retry.js.map +1 -0
  78. package/dist/middleware/turn-tracking.d.ts +7 -0
  79. package/dist/middleware/turn-tracking.d.ts.map +1 -0
  80. package/dist/middleware/turn-tracking.js +25 -0
  81. package/dist/middleware/turn-tracking.js.map +1 -0
  82. package/dist/runner.d.ts +23 -0
  83. package/dist/runner.d.ts.map +1 -0
  84. package/dist/runner.js +18 -0
  85. package/dist/runner.js.map +1 -0
  86. package/dist/session.d.ts.map +1 -1
  87. package/dist/session.js +7 -40
  88. package/dist/session.js.map +1 -1
  89. package/dist/stream.d.ts +12 -0
  90. package/dist/stream.d.ts.map +1 -0
  91. package/dist/stream.js +38 -0
  92. package/dist/stream.js.map +1 -0
  93. package/dist/ui-stream.d.ts.map +1 -1
  94. package/dist/ui-stream.js +13 -1
  95. package/dist/ui-stream.js.map +1 -1
  96. package/dist/utils.d.ts +8 -0
  97. package/dist/utils.d.ts.map +1 -0
  98. package/dist/utils.js +40 -0
  99. package/dist/utils.js.map +1 -0
  100. package/package.json +13 -2
package/README.md ADDED
@@ -0,0 +1,116 @@
1
+ # @openharness/core
2
+
3
+ Building blocks for capable, general-purpose AI agents. Part of [OpenHarness](https://github.com/MaxGfeller/open-harness).
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install @openharness/core
9
+ ```
10
+
11
+ ## What's inside
12
+
13
+ - **Agent** -- stateless multi-step executor wrapping any AI SDK `LanguageModel` with tools, subagents, MCP, and skills
14
+ - **Session** -- batteries-included stateful wrapper with compaction, retry, persistence, and hooks
15
+ - **Runner & Middleware** -- composable FP-style middleware (`withRetry`, `withCompaction`, `withTurnTracking`, `withPersistence`, `withHooks`) for pick-and-choose behavior
16
+ - **Conversation** -- lightweight stateful wrapper over a composed Runner, with `toResponse()` for AI SDK 5 streaming
17
+ - **Stream combinators** -- `tap`, `filter`, `map`, `takeUntil` for async generator transforms
18
+ - **Tools** -- filesystem tools (`readFile`, `writeFile`, `editFile`, `listFiles`, `grep`, `deleteFile`) and a `bash` tool
19
+ - **UI streaming** -- `sessionEventsToUIStream()` maps agent events to AI SDK 5 `UIMessageChunk` streams
20
+
21
+ ## Quick start
22
+
23
+ ### Agent (stateless)
24
+
25
+ ```typescript
26
+ import { Agent } from "@openharness/core";
27
+ import { openai } from "@ai-sdk/openai";
28
+ import { fsTools } from "@openharness/core/tools/fs";
29
+ import { bash } from "@openharness/core/tools/bash";
30
+
31
+ const agent = new Agent({
32
+ name: "dev",
33
+ model: openai("gpt-5.2"),
34
+ tools: { ...fsTools, bash },
35
+ });
36
+
37
+ for await (const event of agent.run([], "Fix the auth bug")) {
38
+ if (event.type === "text.delta") process.stdout.write(event.text);
39
+ if (event.type === "done") console.log(event.result);
40
+ }
41
+ ```
42
+
43
+ ### Middleware + Conversation (composable)
44
+
45
+ ```typescript
46
+ import {
47
+ Agent, Conversation, toRunner, apply,
48
+ withTurnTracking, withCompaction, withRetry,
49
+ } from "@openharness/core";
50
+
51
+ const runner = apply(
52
+ toRunner(agent),
53
+ withTurnTracking(),
54
+ withCompaction({ contextWindow: 200_000, model: agent.model }),
55
+ withRetry(),
56
+ );
57
+
58
+ const chat = new Conversation({ runner });
59
+
60
+ for await (const event of chat.send("Refactor the config parser")) {
61
+ if (event.type === "text.delta") process.stdout.write(event.text);
62
+ }
63
+ ```
64
+
65
+ ### Session (batteries-included)
66
+
67
+ ```typescript
68
+ import { Session } from "@openharness/core";
69
+
70
+ const session = new Session({ agent, contextWindow: 200_000 });
71
+
72
+ for await (const event of session.send("Refactor the config parser")) {
73
+ if (event.type === "text.delta") process.stdout.write(event.text);
74
+ }
75
+ ```
76
+
77
+ ### Next.js route handler
78
+
79
+ ```typescript
80
+ import {
81
+ Agent, Conversation, toRunner, apply,
82
+ withTurnTracking, withCompaction, withRetry,
83
+ extractUserInput,
84
+ } from "@openharness/core";
85
+
86
+ const runner = apply(
87
+ toRunner(agent),
88
+ withTurnTracking(),
89
+ withCompaction({ contextWindow: 128_000, model: agent.model }),
90
+ withRetry(),
91
+ );
92
+
93
+ const chat = new Conversation({ runner });
94
+
95
+ export async function POST(req: Request) {
96
+ const { messages } = await req.json();
97
+ const input = await extractUserInput(messages);
98
+ return chat.toResponse(input);
99
+ }
100
+ ```
101
+
102
+ ## Documentation
103
+
104
+ See the [full documentation](https://github.com/MaxGfeller/open-harness#readme) for:
105
+
106
+ - Agent configuration, events, and lifecycle
107
+ - Subagents (foreground & background)
108
+ - Middleware reference and custom middleware
109
+ - Compaction strategies
110
+ - MCP server integration
111
+ - Skills system
112
+ - AI SDK 5 UI integration
113
+
114
+ ## License
115
+
116
+ ISC
@@ -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":""}