@openharness/core 0.1.0 → 0.3.0

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 (38) hide show
  1. package/dist/__tests__/to-response.test.d.ts +2 -0
  2. package/dist/__tests__/to-response.test.d.ts.map +1 -0
  3. package/dist/__tests__/to-response.test.js +67 -0
  4. package/dist/__tests__/to-response.test.js.map +1 -0
  5. package/dist/__tests__/ui-stream.test.d.ts +2 -0
  6. package/dist/__tests__/ui-stream.test.d.ts.map +1 -0
  7. package/dist/__tests__/ui-stream.test.js +435 -0
  8. package/dist/__tests__/ui-stream.test.js.map +1 -0
  9. package/dist/agent.d.ts +1 -2
  10. package/dist/agent.d.ts.map +1 -1
  11. package/dist/agent.js +10 -9
  12. package/dist/agent.js.map +1 -1
  13. package/dist/index.d.ts +4 -0
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +10 -0
  16. package/dist/index.js.map +1 -1
  17. package/dist/session.d.ts +174 -0
  18. package/dist/session.d.ts.map +1 -0
  19. package/dist/session.js +370 -0
  20. package/dist/session.js.map +1 -0
  21. package/dist/types/__tests__/stream-parts.test.d.ts +2 -0
  22. package/dist/types/__tests__/stream-parts.test.d.ts.map +1 -0
  23. package/dist/types/__tests__/stream-parts.test.js +231 -0
  24. package/dist/types/__tests__/stream-parts.test.js.map +1 -0
  25. package/dist/types/stream-parts.d.ts +68 -0
  26. package/dist/types/stream-parts.d.ts.map +1 -0
  27. package/dist/types/stream-parts.js +53 -0
  28. package/dist/types/stream-parts.js.map +1 -0
  29. package/dist/types/ui-message.d.ts +41 -0
  30. package/dist/types/ui-message.d.ts.map +1 -0
  31. package/dist/types/ui-message.js +2 -0
  32. package/dist/types/ui-message.js.map +1 -0
  33. package/dist/ui-stream.d.ts +15 -0
  34. package/dist/ui-stream.d.ts.map +1 -0
  35. package/dist/ui-stream.js +246 -0
  36. package/dist/ui-stream.js.map +1 -0
  37. package/package.json +8 -11
  38. package/README.md +0 -267
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=to-response.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"to-response.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/to-response.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,67 @@
1
+ import { describe, it, expect, vi } from "vitest";
2
+ import { Session } from "../session.js";
3
+ import { Agent } from "../agent.js";
4
+ // Minimal mock agent that yields a simple completion
5
+ function createMockAgent() {
6
+ const model = {
7
+ specificationVersion: "v2",
8
+ provider: "mock",
9
+ modelId: "mock-model",
10
+ doStream: vi.fn(),
11
+ doGenerate: vi.fn(),
12
+ };
13
+ // Create Agent with a model that we'll bypass via mock
14
+ return new Agent({
15
+ name: "test",
16
+ model: model,
17
+ maxSteps: 1,
18
+ instructions: false,
19
+ });
20
+ }
21
+ describe("Session.toResponse", () => {
22
+ it("returns a Response with correct SSE headers", () => {
23
+ const agent = createMockAgent();
24
+ const session = new Session({ agent });
25
+ // Mock session.send to yield minimal events
26
+ const originalSend = session.send.bind(session);
27
+ session.send = async function* () {
28
+ yield {
29
+ type: "done",
30
+ result: "complete",
31
+ messages: [],
32
+ totalUsage: {
33
+ inputTokens: 0,
34
+ outputTokens: 0,
35
+ totalTokens: 0,
36
+ },
37
+ };
38
+ };
39
+ const response = session.toResponse("hello");
40
+ expect(response).toBeInstanceOf(Response);
41
+ expect(response.headers.get("content-type")).toContain("text/event-stream");
42
+ expect(response.body).toBeTruthy();
43
+ // Restore
44
+ session.send = originalSend;
45
+ });
46
+ it("passes custom headers through", () => {
47
+ const agent = createMockAgent();
48
+ const session = new Session({ agent });
49
+ session.send = async function* () {
50
+ yield {
51
+ type: "done",
52
+ result: "complete",
53
+ messages: [],
54
+ totalUsage: {
55
+ inputTokens: 0,
56
+ outputTokens: 0,
57
+ totalTokens: 0,
58
+ },
59
+ };
60
+ };
61
+ const response = session.toResponse("hello", {
62
+ headers: { "X-Custom": "test" },
63
+ });
64
+ expect(response.headers.get("x-custom")).toBe("test");
65
+ });
66
+ });
67
+ //# sourceMappingURL=to-response.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"to-response.test.js","sourceRoot":"","sources":["../../src/__tests__/to-response.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,qDAAqD;AACrD,SAAS,eAAe;IACtB,MAAM,KAAK,GAAG;QACZ,oBAAoB,EAAE,IAAI;QAC1B,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,YAAY;QACrB,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE;QACjB,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE;KACpB,CAAC;IAEF,uDAAuD;IACvD,OAAO,IAAI,KAAK,CAAC;QACf,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,KAAY;QACnB,QAAQ,EAAE,CAAC;QACX,YAAY,EAAE,KAAK;KACpB,CAAC,CAAC;AACL,CAAC;AAED,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAEvC,4CAA4C;QAC5C,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,GAAG,KAAK,SAAS,CAAC;YAC5B,MAAM;gBACJ,IAAI,EAAE,MAAe;gBACrB,MAAM,EAAE,UAAmB;gBAC3B,QAAQ,EAAE,EAAE;gBACZ,UAAU,EAAE;oBACV,WAAW,EAAE,CAAC;oBACd,YAAY,EAAE,CAAC;oBACf,WAAW,EAAE,CAAC;iBACf;aACF,CAAC;QACJ,CAAC,CAAC;QAEF,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAE7C,MAAM,CAAC,QAAQ,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC1C,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAC5E,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;QAEnC,UAAU;QACV,OAAO,CAAC,IAAI,GAAG,YAAY,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAEvC,OAAO,CAAC,IAAI,GAAG,KAAK,SAAS,CAAC;YAC5B,MAAM;gBACJ,IAAI,EAAE,MAAe;gBACrB,MAAM,EAAE,UAAmB;gBAC3B,QAAQ,EAAE,EAAE;gBACZ,UAAU,EAAE;oBACV,WAAW,EAAE,CAAC;oBACd,YAAY,EAAE,CAAC;oBACf,WAAW,EAAE,CAAC;iBACf;aACF,CAAC;QACJ,CAAC,CAAC;QAEF,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE;YAC3C,OAAO,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE;SAChC,CAAC,CAAC;QAEH,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ui-stream.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-stream.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/ui-stream.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,435 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { sessionEventsToUIStream } from "../ui-stream.js";
3
+ // ── Helpers ─────────────────────────────────────────────────────────
4
+ async function collectChunks(events) {
5
+ async function* gen() {
6
+ for (const e of events)
7
+ yield e;
8
+ }
9
+ const stream = sessionEventsToUIStream(gen());
10
+ const reader = stream.getReader();
11
+ const chunks = [];
12
+ while (true) {
13
+ const { done, value } = await reader.read();
14
+ if (done)
15
+ break;
16
+ chunks.push(value);
17
+ }
18
+ return chunks;
19
+ }
20
+ function findChunks(chunks, type) {
21
+ return chunks.filter((c) => c.type === type);
22
+ }
23
+ // ── Tests ───────────────────────────────────────────────────────────
24
+ describe("sessionEventsToUIStream", () => {
25
+ describe("stream lifecycle", () => {
26
+ it("emits start chunk at the beginning", async () => {
27
+ const chunks = await collectChunks([]);
28
+ expect(chunks[0]).toEqual({ type: "start" });
29
+ });
30
+ it("emits finish chunk on done event", async () => {
31
+ const chunks = await collectChunks([
32
+ {
33
+ type: "done",
34
+ result: "complete",
35
+ messages: [],
36
+ totalUsage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },
37
+ },
38
+ ]);
39
+ const finish = findChunks(chunks, "finish");
40
+ expect(finish).toHaveLength(1);
41
+ expect(finish[0].finishReason).toBe("stop");
42
+ });
43
+ it("maps result types to correct finish reasons", async () => {
44
+ const cases = [
45
+ ["complete", "stop"],
46
+ ["max_steps", "tool-calls"],
47
+ ["error", "error"],
48
+ ["stopped", "unknown"],
49
+ ];
50
+ for (const [result, expected] of cases) {
51
+ const chunks = await collectChunks([
52
+ {
53
+ type: "done",
54
+ result: result,
55
+ messages: [],
56
+ totalUsage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },
57
+ },
58
+ ]);
59
+ const finish = findChunks(chunks, "finish");
60
+ expect(finish[0].finishReason).toBe(expected);
61
+ }
62
+ });
63
+ });
64
+ describe("text streaming", () => {
65
+ it("emits text-start before first text-delta", async () => {
66
+ const chunks = await collectChunks([
67
+ { type: "text.delta", text: "Hello" },
68
+ { type: "text.done", text: "Hello world" },
69
+ ]);
70
+ const textStart = findChunks(chunks, "text-start");
71
+ expect(textStart).toHaveLength(1);
72
+ expect(textStart[0].id).toBeTruthy();
73
+ });
74
+ it("emits text-delta with matching id", async () => {
75
+ const chunks = await collectChunks([
76
+ { type: "text.delta", text: "Hello" },
77
+ { type: "text.delta", text: " world" },
78
+ { type: "text.done", text: "Hello world" },
79
+ ]);
80
+ const textStart = findChunks(chunks, "text-start")[0];
81
+ const deltas = findChunks(chunks, "text-delta");
82
+ expect(deltas).toHaveLength(2);
83
+ expect(deltas[0].id).toBe(textStart.id);
84
+ expect(deltas[0].delta).toBe("Hello");
85
+ expect(deltas[1].delta).toBe(" world");
86
+ });
87
+ it("emits text-end on text.done", async () => {
88
+ const chunks = await collectChunks([
89
+ { type: "text.delta", text: "Hi" },
90
+ { type: "text.done", text: "Hi" },
91
+ ]);
92
+ const textStart = findChunks(chunks, "text-start")[0];
93
+ const textEnd = findChunks(chunks, "text-end");
94
+ expect(textEnd).toHaveLength(1);
95
+ expect(textEnd[0].id).toBe(textStart.id);
96
+ });
97
+ });
98
+ describe("reasoning streaming", () => {
99
+ it("emits reasoning-start before first reasoning-delta", async () => {
100
+ const chunks = await collectChunks([
101
+ { type: "reasoning.delta", text: "thinking" },
102
+ { type: "reasoning.done", text: "thinking" },
103
+ ]);
104
+ const start = findChunks(chunks, "reasoning-start");
105
+ expect(start).toHaveLength(1);
106
+ });
107
+ it("emits reasoning-delta and reasoning-end", async () => {
108
+ const chunks = await collectChunks([
109
+ { type: "reasoning.delta", text: "step 1" },
110
+ { type: "reasoning.delta", text: " step 2" },
111
+ { type: "reasoning.done", text: "step 1 step 2" },
112
+ ]);
113
+ const start = findChunks(chunks, "reasoning-start")[0];
114
+ const deltas = findChunks(chunks, "reasoning-delta");
115
+ const end = findChunks(chunks, "reasoning-end");
116
+ expect(deltas).toHaveLength(2);
117
+ expect(deltas[0].id).toBe(start.id);
118
+ expect(end).toHaveLength(1);
119
+ expect(end[0].id).toBe(start.id);
120
+ });
121
+ it("closes text part before starting reasoning", async () => {
122
+ const chunks = await collectChunks([
123
+ { type: "text.delta", text: "Hi" },
124
+ { type: "reasoning.delta", text: "think" },
125
+ { type: "reasoning.done", text: "think" },
126
+ ]);
127
+ const types = chunks.map((c) => c.type);
128
+ const textEndIdx = types.indexOf("text-end");
129
+ const reasoningStartIdx = types.indexOf("reasoning-start");
130
+ expect(textEndIdx).toBeLessThan(reasoningStartIdx);
131
+ });
132
+ });
133
+ describe("tool events", () => {
134
+ it("emits tool-input-start and tool-input-available on tool.start", async () => {
135
+ const chunks = await collectChunks([
136
+ {
137
+ type: "tool.start",
138
+ toolCallId: "tc-1",
139
+ toolName: "readFile",
140
+ input: { path: "/test" },
141
+ },
142
+ ]);
143
+ const inputStart = findChunks(chunks, "tool-input-start");
144
+ expect(inputStart).toHaveLength(1);
145
+ expect(inputStart[0]).toEqual({
146
+ type: "tool-input-start",
147
+ toolCallId: "tc-1",
148
+ toolName: "readFile",
149
+ });
150
+ const inputAvailable = findChunks(chunks, "tool-input-available");
151
+ expect(inputAvailable).toHaveLength(1);
152
+ expect(inputAvailable[0].input).toEqual({ path: "/test" });
153
+ });
154
+ it("emits tool-output-available on tool.done", async () => {
155
+ const chunks = await collectChunks([
156
+ {
157
+ type: "tool.done",
158
+ toolCallId: "tc-1",
159
+ toolName: "readFile",
160
+ output: { content: "file contents" },
161
+ },
162
+ ]);
163
+ const output = findChunks(chunks, "tool-output-available");
164
+ expect(output).toHaveLength(1);
165
+ expect(output[0]).toEqual({
166
+ type: "tool-output-available",
167
+ toolCallId: "tc-1",
168
+ output: { content: "file contents" },
169
+ });
170
+ });
171
+ it("emits tool-output-error on tool.error", async () => {
172
+ const chunks = await collectChunks([
173
+ {
174
+ type: "tool.error",
175
+ toolCallId: "tc-1",
176
+ toolName: "readFile",
177
+ error: "File not found",
178
+ },
179
+ ]);
180
+ const errors = findChunks(chunks, "tool-output-error");
181
+ expect(errors).toHaveLength(1);
182
+ expect(errors[0]).toEqual({
183
+ type: "tool-output-error",
184
+ toolCallId: "tc-1",
185
+ errorText: "File not found",
186
+ });
187
+ });
188
+ it("closes text/reasoning parts before tool events", async () => {
189
+ const chunks = await collectChunks([
190
+ { type: "text.delta", text: "Let me check" },
191
+ {
192
+ type: "tool.start",
193
+ toolCallId: "tc-1",
194
+ toolName: "readFile",
195
+ input: {},
196
+ },
197
+ ]);
198
+ const types = chunks.map((c) => c.type);
199
+ const textEndIdx = types.indexOf("text-end");
200
+ const toolStartIdx = types.indexOf("tool-input-start");
201
+ expect(textEndIdx).toBeLessThan(toolStartIdx);
202
+ });
203
+ });
204
+ describe("subagent detection via task tool", () => {
205
+ it("emits data-oh:subagent.start for task tool calls", async () => {
206
+ const chunks = await collectChunks([
207
+ {
208
+ type: "tool.start",
209
+ toolCallId: "tc-1",
210
+ toolName: "task",
211
+ input: { agent: "explore", prompt: "search codebase" },
212
+ },
213
+ ]);
214
+ const subStart = findChunks(chunks, "data-oh:subagent.start");
215
+ expect(subStart).toHaveLength(1);
216
+ expect(subStart[0].data).toEqual({
217
+ agentName: "explore",
218
+ task: "search codebase",
219
+ });
220
+ });
221
+ it("emits data-oh:subagent.done when task tool completes", async () => {
222
+ const chunks = await collectChunks([
223
+ {
224
+ type: "tool.start",
225
+ toolCallId: "tc-1",
226
+ toolName: "task",
227
+ input: { agent: "explore", prompt: "search" },
228
+ },
229
+ {
230
+ type: "tool.done",
231
+ toolCallId: "tc-1",
232
+ toolName: "task",
233
+ output: "result",
234
+ },
235
+ ]);
236
+ const subDone = findChunks(chunks, "data-oh:subagent.done");
237
+ expect(subDone).toHaveLength(1);
238
+ expect(subDone[0].data.durationMs).toBeGreaterThanOrEqual(0);
239
+ });
240
+ it("emits data-oh:subagent.error when task tool fails", async () => {
241
+ const chunks = await collectChunks([
242
+ {
243
+ type: "tool.start",
244
+ toolCallId: "tc-1",
245
+ toolName: "task",
246
+ input: { agent: "explore", prompt: "search" },
247
+ },
248
+ {
249
+ type: "tool.error",
250
+ toolCallId: "tc-1",
251
+ toolName: "task",
252
+ error: "Agent crashed",
253
+ },
254
+ ]);
255
+ const subError = findChunks(chunks, "data-oh:subagent.error");
256
+ expect(subError).toHaveLength(1);
257
+ expect(subError[0].data.error).toBe("Agent crashed");
258
+ });
259
+ it("does not emit subagent events for regular tools", async () => {
260
+ const chunks = await collectChunks([
261
+ {
262
+ type: "tool.start",
263
+ toolCallId: "tc-1",
264
+ toolName: "readFile",
265
+ input: { path: "/test" },
266
+ },
267
+ {
268
+ type: "tool.done",
269
+ toolCallId: "tc-1",
270
+ toolName: "readFile",
271
+ output: "ok",
272
+ },
273
+ ]);
274
+ const subEvents = chunks.filter((c) => c.type?.startsWith("data-oh:subagent."));
275
+ expect(subEvents).toHaveLength(0);
276
+ });
277
+ });
278
+ describe("step events", () => {
279
+ it("emits start-step and finish-step", async () => {
280
+ const chunks = await collectChunks([
281
+ { type: "step.start", stepNumber: 1 },
282
+ { type: "text.delta", text: "Hi" },
283
+ { type: "text.done", text: "Hi" },
284
+ {
285
+ type: "step.done",
286
+ stepNumber: 1,
287
+ usage: { inputTokens: 10, outputTokens: 5, totalTokens: 15 },
288
+ finishReason: "stop",
289
+ },
290
+ ]);
291
+ expect(findChunks(chunks, "start-step")).toHaveLength(1);
292
+ expect(findChunks(chunks, "finish-step")).toHaveLength(1);
293
+ });
294
+ });
295
+ describe("session lifecycle data parts", () => {
296
+ it("emits turn start/done data parts", async () => {
297
+ const chunks = await collectChunks([
298
+ { type: "turn.start", turnNumber: 3 },
299
+ {
300
+ type: "turn.done",
301
+ turnNumber: 3,
302
+ usage: { inputTokens: 100, outputTokens: 50, totalTokens: 150 },
303
+ },
304
+ ]);
305
+ const turnStart = findChunks(chunks, "data-oh:turn.start");
306
+ expect(turnStart).toHaveLength(1);
307
+ expect(turnStart[0].data).toEqual({ turnIndex: 3 });
308
+ const turnDone = findChunks(chunks, "data-oh:turn.done");
309
+ expect(turnDone).toHaveLength(1);
310
+ expect(turnDone[0].data.turnIndex).toBe(3);
311
+ });
312
+ it("emits compaction data parts", async () => {
313
+ const chunks = await collectChunks([
314
+ { type: "compaction.start", reason: "overflow", tokensBefore: 50000 },
315
+ { type: "compaction.pruned", tokensRemoved: 10000, messagesRemoved: 5 },
316
+ { type: "compaction.done", tokensBefore: 50000, tokensAfter: 30000 },
317
+ ]);
318
+ expect(findChunks(chunks, "data-oh:session.compacting")).toHaveLength(1);
319
+ expect(findChunks(chunks, "data-oh:compaction.start")).toHaveLength(1);
320
+ const compDone = findChunks(chunks, "data-oh:compaction.done");
321
+ // One from pruned, one from done
322
+ expect(compDone.length).toBeGreaterThanOrEqual(1);
323
+ });
324
+ it("emits retry data part", async () => {
325
+ const chunks = await collectChunks([
326
+ {
327
+ type: "retry",
328
+ attempt: 1,
329
+ maxRetries: 3,
330
+ delayMs: 2000,
331
+ error: new Error("rate limit exceeded"),
332
+ },
333
+ ]);
334
+ const retry = findChunks(chunks, "data-oh:retry");
335
+ expect(retry).toHaveLength(1);
336
+ expect(retry[0].data).toEqual({
337
+ attempt: 1,
338
+ reason: "rate limit exceeded",
339
+ delayMs: 2000,
340
+ });
341
+ });
342
+ });
343
+ describe("error handling", () => {
344
+ it("emits error chunk on error event", async () => {
345
+ const chunks = await collectChunks([
346
+ { type: "error", error: new Error("something went wrong") },
347
+ ]);
348
+ const errors = findChunks(chunks, "error");
349
+ expect(errors).toHaveLength(1);
350
+ expect(errors[0].errorText).toBe("something went wrong");
351
+ });
352
+ it("emits error chunk when generator throws", async () => {
353
+ async function* throwingGen() {
354
+ throw new Error("generator exploded");
355
+ }
356
+ const stream = sessionEventsToUIStream(throwingGen());
357
+ const reader = stream.getReader();
358
+ const chunks = [];
359
+ while (true) {
360
+ const { done, value } = await reader.read();
361
+ if (done)
362
+ break;
363
+ chunks.push(value);
364
+ }
365
+ const errors = chunks.filter((c) => c.type === "error");
366
+ expect(errors).toHaveLength(1);
367
+ expect(errors[0].errorText).toBe("generator exploded");
368
+ });
369
+ });
370
+ describe("full conversation flow", () => {
371
+ it("handles a complete multi-step conversation", async () => {
372
+ const events = [
373
+ { type: "turn.start", turnNumber: 1 },
374
+ { type: "step.start", stepNumber: 1 },
375
+ { type: "text.delta", text: "Let me " },
376
+ { type: "text.delta", text: "check." },
377
+ { type: "text.done", text: "Let me check." },
378
+ {
379
+ type: "tool.start",
380
+ toolCallId: "tc-1",
381
+ toolName: "readFile",
382
+ input: { path: "/src/index.ts" },
383
+ },
384
+ {
385
+ type: "tool.done",
386
+ toolCallId: "tc-1",
387
+ toolName: "readFile",
388
+ output: { content: "export {}" },
389
+ },
390
+ {
391
+ type: "step.done",
392
+ stepNumber: 1,
393
+ usage: { inputTokens: 100, outputTokens: 20, totalTokens: 120 },
394
+ finishReason: "tool-calls",
395
+ },
396
+ { type: "step.start", stepNumber: 2 },
397
+ { type: "text.delta", text: "The file exports nothing." },
398
+ { type: "text.done", text: "The file exports nothing." },
399
+ {
400
+ type: "step.done",
401
+ stepNumber: 2,
402
+ usage: { inputTokens: 200, outputTokens: 30, totalTokens: 230 },
403
+ finishReason: "stop",
404
+ },
405
+ {
406
+ type: "done",
407
+ result: "complete",
408
+ messages: [],
409
+ totalUsage: { inputTokens: 300, outputTokens: 50, totalTokens: 350 },
410
+ },
411
+ {
412
+ type: "turn.done",
413
+ turnNumber: 1,
414
+ usage: { inputTokens: 300, outputTokens: 50, totalTokens: 350 },
415
+ },
416
+ ];
417
+ const chunks = await collectChunks(events);
418
+ const types = chunks.map((c) => c.type);
419
+ // Stream structure
420
+ expect(types[0]).toBe("start");
421
+ expect(types[types.length - 1]).toBe("data-oh:turn.done");
422
+ expect(types).toContain("text-start");
423
+ expect(types).toContain("text-delta");
424
+ expect(types).toContain("text-end");
425
+ expect(types).toContain("tool-input-start");
426
+ expect(types).toContain("tool-input-available");
427
+ expect(types).toContain("tool-output-available");
428
+ expect(types).toContain("start-step");
429
+ expect(types).toContain("finish-step");
430
+ expect(types).toContain("finish");
431
+ expect(types).toContain("data-oh:turn.start");
432
+ });
433
+ });
434
+ });
435
+ //# sourceMappingURL=ui-stream.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-stream.test.js","sourceRoot":"","sources":["../../src/__tests__/ui-stream.test.ts"],"names":[],"mappings":"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"}
package/dist/agent.d.ts CHANGED
@@ -77,7 +77,6 @@ export declare class Agent {
77
77
  /** MCP server configs — connected lazily on first run. */
78
78
  private mcpServerConfigs?;
79
79
  private mcpConnection;
80
- private messages;
81
80
  private cachedInstructions;
82
81
  constructor(options: {
83
82
  name: string;
@@ -112,7 +111,7 @@ export declare class Agent {
112
111
  * Close all MCP server connections. Call this when the agent is no longer needed.
113
112
  */
114
113
  close(): Promise<void>;
115
- run(input: string | ModelMessage[], options?: {
114
+ run(history: ModelMessage[], input: string | ModelMessage[], options?: {
116
115
  signal?: AbortSignal;
117
116
  }): AsyncGenerator<AgentEvent>;
118
117
  }
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
package/dist/agent.js CHANGED
@@ -19,7 +19,6 @@ export class Agent {
19
19
  /** MCP server configs — connected lazily on first run. */
20
20
  mcpServerConfigs;
21
21
  mcpConnection = null;
22
- messages = [];
23
22
  cachedInstructions = null; // null = not loaded yet
24
23
  constructor(options) {
25
24
  this.name = options.name;
@@ -53,12 +52,14 @@ export class Agent {
53
52
  this.mcpConnection = null;
54
53
  }
55
54
  }
56
- async *run(input, options) {
55
+ async *run(history, input, options) {
56
+ // Build messages: history + new input (Agent does NOT mutate history)
57
+ const messages = [...history];
57
58
  if (typeof input === "string") {
58
- this.messages.push({ role: "user", content: input });
59
+ messages.push({ role: "user", content: input });
59
60
  }
60
61
  else {
61
- this.messages.push(...input);
62
+ messages.push(...input);
62
63
  }
63
64
  // Load AGENTS.md once per agent lifetime
64
65
  if (this.instructions && this.cachedInstructions === null) {
@@ -83,7 +84,7 @@ export class Agent {
83
84
  const stream = streamText({
84
85
  model: this.model,
85
86
  system,
86
- messages: this.messages,
87
+ messages,
87
88
  tools,
88
89
  stopWhen: stepCountIs(this.maxSteps),
89
90
  temperature: this.temperature,
@@ -167,11 +168,11 @@ export class Agent {
167
168
  ? "error"
168
169
  : "stopped";
169
170
  const response = await stream.response;
170
- this.messages.push(...response.messages);
171
+ messages.push(...response.messages);
171
172
  yield {
172
173
  type: "done",
173
174
  result,
174
- messages: this.messages,
175
+ messages,
175
176
  totalUsage: toTokenUsage(part.totalUsage),
176
177
  };
177
178
  break;
@@ -187,7 +188,7 @@ export class Agent {
187
188
  yield {
188
189
  type: "done",
189
190
  result: "error",
190
- messages: this.messages,
191
+ messages,
191
192
  totalUsage: { inputTokens: undefined, outputTokens: undefined, totalTokens: undefined },
192
193
  };
193
194
  }
@@ -227,7 +228,7 @@ function createTaskTool(subagents, onSubagentEvent) {
227
228
  // No subagents — prevent recursive nesting
228
229
  });
229
230
  let lastText = "";
230
- for await (const event of child.run(prompt, { signal: abortSignal })) {
231
+ for await (const event of child.run([], prompt, { signal: abortSignal })) {
231
232
  onSubagentEvent?.(agentName, event);
232
233
  if (event.type === "text.done") {
233
234
  lastText = event.text;