@kortyx/stream 0.6.0 → 0.7.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.
package/dist/index.js CHANGED
@@ -39,10 +39,7 @@ module.exports = __toCommonJS(index_exports);
39
39
  // src/client/consume-stream.ts
40
40
  var toError = (value) => value instanceof Error ? value : new Error(String(value));
41
41
  async function consumeStream(stream, handlers = {}) {
42
- let doneCalled = false;
43
42
  const callDone = async () => {
44
- if (doneCalled) return;
45
- doneCalled = true;
46
43
  await handlers.onDone?.();
47
44
  };
48
45
  try {
@@ -78,7 +75,7 @@ async function* readStream(body) {
78
75
  if (done) break;
79
76
  buffer += decoder.decode(value, { stream: true });
80
77
  const parts = buffer.split("\n\n");
81
- buffer = parts.pop() ?? "";
78
+ buffer = parts.pop();
82
79
  for (const part of parts) {
83
80
  if (!part.startsWith("data: ")) continue;
84
81
  const payload = part.slice(6);
@@ -121,7 +118,8 @@ async function* streamFromRoute(args) {
121
118
  "content-type": "application/json",
122
119
  ...args.headers ?? {}
123
120
  },
124
- body: JSON.stringify(args.body)
121
+ body: JSON.stringify(args.body),
122
+ ...args.signal ? { signal: args.signal } : {}
125
123
  });
126
124
  } catch (error) {
127
125
  yield { type: "error", message: toErrorMessage(error) };
@@ -178,13 +176,7 @@ async function collectBufferedStream(stream) {
178
176
  };
179
177
  }
180
178
 
181
- // src/server/create-stream-response.ts
182
- var STREAM_HEADERS = {
183
- "content-type": "text/event-stream",
184
- "cache-control": "no-cache",
185
- connection: "keep-alive",
186
- "x-accel-buffering": "no"
187
- };
179
+ // src/server/json-to-sse.ts
188
180
  var JsonToSseTransformStream = class extends TransformStream {
189
181
  constructor() {
190
182
  super({
@@ -199,6 +191,14 @@ var JsonToSseTransformStream = class extends TransformStream {
199
191
  });
200
192
  }
201
193
  };
194
+
195
+ // src/server/create-stream-response.ts
196
+ var STREAM_HEADERS = {
197
+ "content-type": "text/event-stream",
198
+ "cache-control": "no-cache",
199
+ connection: "keep-alive",
200
+ "x-accel-buffering": "no"
201
+ };
202
202
  function createStreamResponse(stream) {
203
203
  const readable = new ReadableStream({
204
204
  async start(controller) {
@@ -209,7 +209,7 @@ function createStreamResponse(stream) {
209
209
  } catch (err) {
210
210
  controller.enqueue({
211
211
  type: "error",
212
- message: String(err?.message ?? err)
212
+ message: err instanceof Error ? err.message : String(err)
213
213
  });
214
214
  } finally {
215
215
  controller.close();
@@ -229,47 +229,66 @@ function toSSE(stream) {
229
229
 
230
230
  // src/structured/apply-structured-chunk.ts
231
231
  var isPlainObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
232
- var cloneContainer = (value) => {
233
- if (Array.isArray(value)) return [...value];
234
- if (isPlainObject(value)) return { ...value };
235
- return {};
236
- };
237
232
  var isArrayIndex = (value) => /^\d+$/.test(value);
238
- var setByParts = (input, parts, value) => {
239
- if (parts.length === 0) return value;
240
- const [part, ...rest] = parts;
241
- if (part === void 0) return value;
242
- if (Array.isArray(input) || isArrayIndex(part)) {
243
- const nextArray = Array.isArray(input) ? [...input] : [];
244
- const index = Number(part);
245
- if (!Number.isInteger(index)) return nextArray;
246
- nextArray[index] = setByParts(nextArray[index], rest, value);
247
- return nextArray;
233
+ var describeValue = (value) => {
234
+ if (value === null) return "null";
235
+ if (Array.isArray(value)) return "array";
236
+ return typeof value;
237
+ };
238
+ var parsePath = (path) => {
239
+ if (path.length === 0) {
240
+ throw new Error(
241
+ "Structured chunk path must be a non-empty dot-separated string."
242
+ );
248
243
  }
249
- const nextObject = isPlainObject(input) ? { ...input } : {};
250
- nextObject[part] = setByParts(nextObject[part], rest, value);
251
- return nextObject;
244
+ const parts = path.split(".");
245
+ if (parts.some((part) => part.length === 0)) {
246
+ throw new Error(
247
+ `Structured chunk path "${path}" must not contain empty segments.`
248
+ );
249
+ }
250
+ return parts;
252
251
  };
253
- var getByPath = (input, path) => {
254
- const parts = path.split(".").filter(Boolean);
255
- let current = input;
256
- for (const part of parts) {
257
- if (Array.isArray(current)) {
258
- const index = Number(part);
259
- current = Number.isInteger(index) ? current[index] : void 0;
260
- continue;
261
- }
262
- if (isPlainObject(current)) {
263
- current = current[part];
264
- continue;
265
- }
266
- return void 0;
252
+ var cloneContainerForPart = (args) => {
253
+ const expected = isArrayIndex(args.part) ? "array" : "object";
254
+ const location = args.traversed.length === 0 ? "<root>" : args.traversed.join(".");
255
+ if (args.current === void 0) {
256
+ return expected === "array" ? [] : {};
257
+ }
258
+ if (expected === "array") {
259
+ if (Array.isArray(args.current)) return [...args.current];
260
+ throw new Error(
261
+ `Structured path conflict at ${location} for "${args.path}": expected array container, received ${describeValue(args.current)}.`
262
+ );
267
263
  }
268
- return current;
264
+ if (isPlainObject(args.current)) return { ...args.current };
265
+ throw new Error(
266
+ `Structured path conflict at ${location} for "${args.path}": expected object container, received ${describeValue(args.current)}.`
267
+ );
269
268
  };
270
- var setByPath = (input, path, value) => {
271
- const parts = path.split(".").filter(Boolean);
272
- return parts.length === 0 ? value : setByParts(cloneContainer(input), parts, value);
269
+ var updateByParts = (args) => {
270
+ const traversed = args.traversed ?? [];
271
+ const [part, ...rest] = args.parts;
272
+ const container = cloneContainerForPart({
273
+ current: args.input,
274
+ part,
275
+ path: args.path,
276
+ traversed
277
+ });
278
+ const currentChild = Array.isArray(container) ? container[Number(part)] : container[part];
279
+ const nextChild = rest.length === 0 ? args.updateLeaf(currentChild) : updateByParts({
280
+ input: currentChild,
281
+ parts: rest,
282
+ path: args.path,
283
+ updateLeaf: args.updateLeaf,
284
+ traversed: [...traversed, part]
285
+ });
286
+ if (Array.isArray(container)) {
287
+ container[Number(part)] = nextChild;
288
+ } else {
289
+ container[part] = nextChild;
290
+ }
291
+ return container;
273
292
  };
274
293
  function applyStructuredChunk(current, chunk) {
275
294
  if (current && current.streamId !== chunk.streamId) {
@@ -297,26 +316,55 @@ function applyStructuredChunk(current, chunk) {
297
316
  data: chunk.data
298
317
  };
299
318
  }
300
- const previousData = current?.data !== void 0 ? current.data : {};
319
+ const path = chunk.path;
320
+ const pathParts = parsePath(path);
321
+ const previousData = current?.data;
301
322
  if (chunk.kind === "set") {
302
323
  return {
303
324
  ...nextBase,
304
- data: setByPath(previousData, chunk.path, chunk.value)
325
+ data: updateByParts({
326
+ input: previousData,
327
+ parts: pathParts,
328
+ path,
329
+ updateLeaf: () => chunk.value
330
+ })
305
331
  };
306
332
  }
307
333
  if (chunk.kind === "append") {
308
- const existing2 = getByPath(previousData, chunk.path);
309
- const nextItems = Array.isArray(existing2) ? [...existing2, ...chunk.items] : [...chunk.items];
310
334
  return {
311
335
  ...nextBase,
312
- data: setByPath(previousData, chunk.path, nextItems)
336
+ data: updateByParts({
337
+ input: previousData,
338
+ parts: pathParts,
339
+ path,
340
+ updateLeaf: (existing) => {
341
+ if (existing === void 0) return [...chunk.items];
342
+ if (!Array.isArray(existing)) {
343
+ throw new Error(
344
+ `Structured append requires path "${path}" to target an array, received ${describeValue(existing)}.`
345
+ );
346
+ }
347
+ return [...existing, ...chunk.items];
348
+ }
349
+ })
313
350
  };
314
351
  }
315
- const existing = getByPath(previousData, chunk.path);
316
- const text = typeof existing === "string" ? existing : "";
317
352
  return {
318
353
  ...nextBase,
319
- data: setByPath(previousData, chunk.path, text + chunk.delta)
354
+ data: updateByParts({
355
+ input: previousData,
356
+ parts: pathParts,
357
+ path,
358
+ updateLeaf: (existing) => {
359
+ if (existing === void 0) return chunk.delta;
360
+ if (typeof existing !== "string") {
361
+ throw new Error(
362
+ `Structured text-delta requires path "${path}" to target a string, received ${describeValue(existing)}.`
363
+ );
364
+ }
365
+ return existing + chunk.delta;
366
+ }
367
+ })
320
368
  };
321
369
  }
322
370
  function reduceStructuredChunks(chunks) {
@@ -465,7 +513,7 @@ var StreamChunkSchema = import_zod2.z.union([
465
513
  id: import_zod2.z.string().optional(),
466
514
  schemaId: import_zod2.z.string().optional(),
467
515
  schemaVersion: import_zod2.z.string().optional(),
468
- meta: import_zod2.z.record(import_zod2.z.unknown()).optional(),
516
+ meta: import_zod2.z.record(import_zod2.z.string(), import_zod2.z.unknown()).optional(),
469
517
  options: import_zod2.z.array(import_zod2.z.never()).optional()
470
518
  }),
471
519
  // Choice/multi-choice: question + options required
@@ -476,7 +524,7 @@ var StreamChunkSchema = import_zod2.z.union([
476
524
  id: import_zod2.z.string().optional(),
477
525
  schemaId: import_zod2.z.string().optional(),
478
526
  schemaVersion: import_zod2.z.string().optional(),
479
- meta: import_zod2.z.record(import_zod2.z.unknown()).optional(),
527
+ meta: import_zod2.z.record(import_zod2.z.string(), import_zod2.z.unknown()).optional(),
480
528
  options: import_zod2.z.array(
481
529
  import_zod2.z.object({
482
530
  id: import_zod2.z.string(),
@@ -486,7 +534,7 @@ var StreamChunkSchema = import_zod2.z.union([
486
534
  )
487
535
  })
488
536
  ]),
489
- meta: import_zod2.z.record(import_zod2.z.unknown()).optional()
537
+ meta: import_zod2.z.record(import_zod2.z.string(), import_zod2.z.unknown()).optional()
490
538
  }),
491
539
  StructuredDataChunkSchema,
492
540
  import_zod2.z.object({
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/client/consume-stream.ts","../src/client/read-stream.ts","../src/client/stream-from-route.ts","../src/server/collect-stream.ts","../src/server/collect-buffered-stream.ts","../src/server/create-stream-response.ts","../src/server/to-sse.ts","../src/structured/apply-structured-chunk.ts","../src/structured/structured-stream-accumulator.ts","../src/types/stream-chunk.ts","../src/types/structured-data/index.ts"],"sourcesContent":["// release-test: 2026-01-22\n// packages/stream/src/index.ts\n\n// client\nexport * from \"./client/consume-stream\";\nexport * from \"./client/read-stream\";\nexport * from \"./client/stream-from-route\";\n\n// server\nexport * from \"./server/collect-buffered-stream\";\nexport * from \"./server/collect-stream\";\nexport * from \"./server/create-stream-response\";\nexport * from \"./server/to-sse\";\nexport * from \"./structured/apply-structured-chunk\";\nexport * from \"./structured/structured-stream-accumulator\";\nexport * from \"./types/stream-chunk\";\nexport * from \"./types/structured-data\";\n","import type { StreamChunk } from \"../types/stream-chunk\";\n\nexport interface ConsumeStreamHandlers {\n onChunk?: (\n chunk: StreamChunk,\n ) => undefined | boolean | Promise<boolean | undefined>;\n onDone?: () => void | Promise<void>;\n onError?: (error: Error, chunk?: StreamChunk) => void | Promise<void>;\n}\n\nconst toError = (value: unknown): Error =>\n value instanceof Error ? value : new Error(String(value));\n\n/**\n * Consume a stream of StreamChunk events with callback handlers.\n * Returns when a `done` chunk is seen, the stream ends, or `onChunk` returns `false`.\n */\nexport async function consumeStream(\n stream: AsyncIterable<StreamChunk>,\n handlers: ConsumeStreamHandlers = {},\n): Promise<void> {\n let doneCalled = false;\n\n const callDone = async () => {\n if (doneCalled) return;\n doneCalled = true;\n await handlers.onDone?.();\n };\n\n try {\n for await (const chunk of stream) {\n const shouldContinue = await handlers.onChunk?.(chunk);\n\n if (chunk.type === \"error\") {\n await handlers.onError?.(\n new Error(chunk.message || \"Stream error.\"),\n chunk,\n );\n }\n\n if (chunk.type === \"done\" || shouldContinue === false) {\n await callDone();\n return;\n }\n }\n\n await callDone();\n } catch (error) {\n const normalized = toError(error);\n await handlers.onError?.(normalized);\n throw normalized;\n }\n}\n","// packages/stream/src/client/read-stream.ts\nimport type { StreamChunk } from \"../types/stream-chunk\";\n\n/**\n * Reads a server-sent event (SSE) Response body and yields StreamChunk objects.\n */\nexport async function* readStream(\n body: ReadableStream<Uint8Array> | null,\n): AsyncGenerator<StreamChunk, void, void> {\n if (!body) return;\n\n const reader = body.getReader();\n const decoder = new TextDecoder(\"utf-8\");\n let buffer = \"\";\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const parts = buffer.split(\"\\n\\n\");\n buffer = parts.pop() ?? \"\";\n\n for (const part of parts) {\n if (!part.startsWith(\"data: \")) continue;\n const payload = part.slice(6);\n if (payload.trim() === \"[DONE]\") return;\n try {\n yield JSON.parse(payload) as StreamChunk;\n } catch (err: any) {\n console.warn(\"Invalid JSON in stream chunk:\", payload);\n console.error(err);\n }\n }\n }\n}\n","import type { StreamChunk } from \"../types/stream-chunk\";\nimport { readStream } from \"./read-stream\";\n\nexport interface StreamFromRouteArgs<TBody = unknown> {\n endpoint: string;\n body: TBody;\n method?: string | undefined;\n fetchImpl?: typeof fetch;\n headers?: Record<string, string> | undefined;\n}\n\nconst toErrorMessage = (error: unknown): string =>\n error instanceof Error ? error.message : String(error);\n\nconst readErrorMessage = async (response: Response): Promise<string> => {\n let message = `Request failed (${response.status})`;\n try {\n const payload = (await response.json()) as unknown;\n if (\n payload &&\n typeof payload === \"object\" &&\n \"error\" in payload &&\n typeof (payload as { error?: unknown }).error === \"string\"\n ) {\n message = (payload as { error: string }).error;\n }\n } catch {}\n return message;\n};\n\nexport async function* streamFromRoute<TBody = unknown>(\n args: StreamFromRouteArgs<TBody>,\n): AsyncGenerator<StreamChunk, void, void> {\n const fetchFn = args.fetchImpl ?? globalThis.fetch;\n if (!fetchFn) {\n yield { type: \"error\", message: \"No fetch implementation available.\" };\n yield { type: \"done\" };\n return;\n }\n\n let response: Response;\n try {\n response = await fetchFn(args.endpoint, {\n method: args.method ?? \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n ...(args.headers ?? {}),\n },\n body: JSON.stringify(args.body),\n });\n } catch (error) {\n yield { type: \"error\", message: toErrorMessage(error) };\n yield { type: \"done\" };\n return;\n }\n\n if (!response.ok) {\n yield { type: \"error\", message: await readErrorMessage(response) };\n yield { type: \"done\" };\n return;\n }\n\n yield* readStream(response.body);\n}\n","import type { StreamChunk } from \"../types/stream-chunk\";\n\n/**\n * Collects a streamed chat response into an array.\n * Useful for non-streaming HTTP responses or server actions.\n */\nexport async function collectStream(\n stream: AsyncIterable<StreamChunk>,\n): Promise<StreamChunk[]> {\n const chunks: StreamChunk[] = [];\n for await (const chunk of stream) {\n chunks.push(chunk);\n }\n return chunks;\n}\n","import type { StreamChunk } from \"../types/stream-chunk\";\nimport type { StructuredDataChunk } from \"../types/structured-data\";\nimport { collectStream } from \"./collect-stream\";\n\nexport interface BufferedStreamResult {\n chunks: StreamChunk[];\n text: string;\n structured: StructuredDataChunk[];\n}\n\n/**\n * Derive convenient buffered fields from raw chunks.\n * `text-delta` is preferred; `message` is fallback when no text deltas exist.\n */\nexport function summarizeStreamChunks(\n chunks: StreamChunk[],\n): Omit<BufferedStreamResult, \"chunks\"> {\n let sawTextDelta = false;\n let text = \"\";\n const messageFallback: string[] = [];\n const structured: StructuredDataChunk[] = [];\n\n for (const chunk of chunks) {\n if (chunk.type === \"text-delta\") {\n sawTextDelta = true;\n text += chunk.delta;\n continue;\n }\n\n if (chunk.type === \"message\") {\n messageFallback.push(chunk.content ?? \"\");\n continue;\n }\n\n if (chunk.type === \"structured-data\") {\n structured.push(chunk as StructuredDataChunk);\n }\n }\n\n if (!sawTextDelta && messageFallback.length > 0) {\n text = messageFallback.join(\"\");\n }\n\n return { text, structured };\n}\n\n/**\n * Collect a stream and return both raw chunks and buffered convenience fields.\n */\nexport async function collectBufferedStream(\n stream: AsyncIterable<StreamChunk>,\n): Promise<BufferedStreamResult> {\n const chunks = await collectStream(stream);\n return {\n chunks,\n ...summarizeStreamChunks(chunks),\n };\n}\n","// packages/stream/src/server/create-stream-response.ts\nimport type { StreamChunk } from \"../types/stream-chunk\";\n\nexport const STREAM_HEADERS = {\n \"content-type\": \"text/event-stream\",\n \"cache-control\": \"no-cache\",\n connection: \"keep-alive\",\n \"x-accel-buffering\": \"no\",\n};\n\nclass JsonToSseTransformStream extends TransformStream<unknown, string> {\n constructor() {\n super({\n transform(part, controller) {\n controller.enqueue(`data: ${JSON.stringify(part)}\\n\\n`);\n },\n flush(controller) {\n controller.enqueue(\"data: [DONE]\\n\\n\");\n },\n });\n }\n}\n\n/**\n * Turns an AsyncIterable<StreamChunk> into a streamed HTTP Response.\n * Works in Node, Bun, Cloudflare, Edge, etc.\n */\nexport function createStreamResponse(\n stream: AsyncIterable<StreamChunk>,\n): Response {\n const readable = new ReadableStream<StreamChunk>({\n async start(controller) {\n try {\n for await (const chunk of stream) {\n controller.enqueue(chunk);\n }\n } catch (err: any) {\n controller.enqueue({\n type: \"error\",\n message: String(err?.message ?? err),\n } as StreamChunk);\n } finally {\n controller.close();\n }\n },\n });\n\n return new Response(\n readable\n .pipeThrough(new JsonToSseTransformStream())\n .pipeThrough(new TextEncoderStream()),\n { headers: STREAM_HEADERS },\n );\n}\n","import type { StreamChunk } from \"../types/stream-chunk\";\nimport { createStreamResponse } from \"./create-stream-response\";\n\n/**\n * Friendly alias for createStreamResponse.\n */\nexport function toSSE(stream: AsyncIterable<StreamChunk>): Response {\n return createStreamResponse(stream);\n}\n","import type { StructuredDataChunk } from \"../types/structured-data\";\n\nexport type StructuredStreamState<TData = unknown> = {\n streamId: string;\n dataType: string;\n status: \"streaming\" | \"done\";\n data: TData;\n node?: string;\n id?: string;\n schemaId?: string;\n schemaVersion?: string;\n};\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst cloneContainer = (value: unknown): unknown => {\n if (Array.isArray(value)) return [...value];\n if (isPlainObject(value)) return { ...value };\n return {};\n};\n\nconst isArrayIndex = (value: string): boolean => /^\\d+$/.test(value);\n\nconst setByParts = (\n input: unknown,\n parts: string[],\n value: unknown,\n): unknown => {\n if (parts.length === 0) return value;\n\n const [part, ...rest] = parts;\n if (part === undefined) return value;\n\n if (Array.isArray(input) || isArrayIndex(part)) {\n const nextArray = Array.isArray(input) ? [...input] : [];\n const index = Number(part);\n if (!Number.isInteger(index)) return nextArray;\n nextArray[index] = setByParts(nextArray[index], rest, value);\n return nextArray;\n }\n\n const nextObject = isPlainObject(input) ? { ...input } : {};\n nextObject[part] = setByParts(nextObject[part], rest, value);\n return nextObject;\n};\n\nconst getByPath = (input: unknown, path: string): unknown => {\n const parts = path.split(\".\").filter(Boolean);\n let current: unknown = input;\n\n for (const part of parts) {\n if (Array.isArray(current)) {\n const index = Number(part);\n current = Number.isInteger(index) ? current[index] : undefined;\n continue;\n }\n\n if (isPlainObject(current)) {\n current = current[part];\n continue;\n }\n\n return undefined;\n }\n\n return current;\n};\n\nconst setByPath = (input: unknown, path: string, value: unknown): unknown => {\n const parts = path.split(\".\").filter(Boolean);\n return parts.length === 0\n ? value\n : setByParts(cloneContainer(input), parts, value);\n};\n\nexport function applyStructuredChunk<TData = unknown>(\n current: StructuredStreamState<TData> | undefined,\n chunk: StructuredDataChunk,\n): StructuredStreamState<TData> {\n if (current && current.streamId !== chunk.streamId) {\n throw new Error(\n `Structured chunk streamId mismatch: expected ${current.streamId}, received ${chunk.streamId}.`,\n );\n }\n\n if (current?.status === \"done\") {\n throw new Error(\n `Structured stream ${chunk.streamId} already completed with a final chunk.`,\n );\n }\n\n const nextBase = {\n streamId: chunk.streamId,\n dataType: chunk.dataType,\n status: chunk.kind === \"final\" ? (\"done\" as const) : (\"streaming\" as const),\n ...(chunk.node ? { node: chunk.node } : {}),\n ...(chunk.id ? { id: chunk.id } : {}),\n ...(chunk.schemaId ? { schemaId: chunk.schemaId } : {}),\n ...(chunk.schemaVersion ? { schemaVersion: chunk.schemaVersion } : {}),\n };\n\n if (chunk.kind === \"final\") {\n return {\n ...nextBase,\n data: chunk.data as TData,\n };\n }\n\n const previousData =\n current?.data !== undefined\n ? current.data\n : ({} as TData | Record<string, unknown>);\n\n if (chunk.kind === \"set\") {\n return {\n ...nextBase,\n data: setByPath(previousData, chunk.path, chunk.value) as TData,\n };\n }\n\n if (chunk.kind === \"append\") {\n const existing = getByPath(previousData, chunk.path);\n const nextItems = Array.isArray(existing)\n ? [...existing, ...chunk.items]\n : [...chunk.items];\n return {\n ...nextBase,\n data: setByPath(previousData, chunk.path, nextItems) as TData,\n };\n }\n\n const existing = getByPath(previousData, chunk.path);\n const text = typeof existing === \"string\" ? existing : \"\";\n return {\n ...nextBase,\n data: setByPath(previousData, chunk.path, text + chunk.delta) as TData,\n };\n}\n\nexport function reduceStructuredChunks<TData = unknown>(\n chunks: StructuredDataChunk[],\n): Record<string, StructuredStreamState<TData>> {\n return chunks.reduce<Record<string, StructuredStreamState<TData>>>(\n (acc, chunk) => {\n acc[chunk.streamId] = applyStructuredChunk(acc[chunk.streamId], chunk);\n return acc;\n },\n {},\n );\n}\n","import type { StreamChunk } from \"../types/stream-chunk\";\nimport type { StructuredDataChunk } from \"../types/structured-data\";\nimport {\n applyStructuredChunk,\n type StructuredStreamState,\n} from \"./apply-structured-chunk\";\n\nexport type StructuredStreamAccumulator<TData = unknown> = {\n apply: (chunk: StructuredDataChunk) => StructuredStreamState<TData>;\n applyStreamChunk: (\n chunk: StreamChunk,\n ) => StructuredStreamState<TData> | undefined;\n get: (streamId: string) => StructuredStreamState<TData> | undefined;\n has: (streamId: string) => boolean;\n delete: (streamId: string) => boolean;\n clear: () => void;\n size: () => number;\n entries: () => Array<[string, StructuredStreamState<TData>]>;\n values: () => StructuredStreamState<TData>[];\n toRecord: () => Record<string, StructuredStreamState<TData>>;\n};\n\nconst isStructuredDataChunk = (\n chunk: StreamChunk,\n): chunk is StructuredDataChunk => chunk.type === \"structured-data\";\n\nexport function createStructuredStreamAccumulator<TData = unknown>(\n initialChunks: Iterable<StructuredDataChunk> = [],\n): StructuredStreamAccumulator<TData> {\n const states = new Map<string, StructuredStreamState<TData>>();\n\n const apply = (chunk: StructuredDataChunk): StructuredStreamState<TData> => {\n const nextState = applyStructuredChunk(states.get(chunk.streamId), chunk);\n states.set(chunk.streamId, nextState);\n return nextState;\n };\n\n for (const chunk of initialChunks) {\n apply(chunk);\n }\n\n return {\n apply,\n applyStreamChunk: (chunk) => {\n if (!isStructuredDataChunk(chunk)) return undefined;\n return apply(chunk);\n },\n get: (streamId) => states.get(streamId),\n has: (streamId) => states.has(streamId),\n delete: (streamId) => states.delete(streamId),\n clear: () => {\n states.clear();\n },\n size: () => states.size,\n entries: () => Array.from(states.entries()),\n values: () => Array.from(states.values()),\n toRecord: () => Object.fromEntries(states.entries()),\n };\n}\n","import { z } from \"zod\";\nimport { StructuredDataChunkSchema } from \"./structured-data\";\n\nexport const StreamChunkSchema = z.union([\n z.object({\n type: z.literal(\"session\"),\n sessionId: z.string(),\n }),\n z.object({\n type: z.literal(\"status\"),\n message: z.string(),\n node: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"message\"),\n content: z.string(),\n node: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"text-start\"),\n node: z.string().optional(),\n id: z.string().optional(),\n opId: z.string().optional(),\n segmentId: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"text-delta\"),\n delta: z.string(),\n node: z.string().optional(),\n id: z.string().optional(),\n opId: z.string().optional(),\n segmentId: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"text-end\"),\n node: z.string().optional(),\n id: z.string().optional(),\n opId: z.string().optional(),\n segmentId: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"tool-result\"),\n tool: z.string().optional(),\n node: z.string().optional(),\n content: z.unknown(),\n }),\n // Interrupt request chunk (used to render interactive options in UI)\n z.object({\n type: z.literal(\"interrupt\"),\n requestId: z.string(),\n resumeToken: z.string(),\n workflow: z.string().optional(),\n node: z.string().optional(),\n id: z.string().optional(),\n opId: z.string().optional(),\n schemaId: z.string().optional(),\n schemaVersion: z.string().optional(),\n input: z.discriminatedUnion(\"kind\", [\n // Text input: question optional, no options\n z.object({\n kind: z.literal(\"text\"),\n multiple: z.boolean(),\n question: z.string().optional(),\n id: z.string().optional(),\n schemaId: z.string().optional(),\n schemaVersion: z.string().optional(),\n meta: z.record(z.unknown()).optional(),\n options: z.array(z.never()).optional(),\n }),\n // Choice/multi-choice: question + options required\n z.object({\n kind: z.enum([\"choice\", \"multi-choice\"]),\n multiple: z.boolean(),\n question: z.string(),\n id: z.string().optional(),\n schemaId: z.string().optional(),\n schemaVersion: z.string().optional(),\n meta: z.record(z.unknown()).optional(),\n options: z.array(\n z.object({\n id: z.string(),\n label: z.string(),\n description: z.string().optional(),\n }),\n ),\n }),\n ]),\n meta: z.record(z.unknown()).optional(),\n }),\n StructuredDataChunkSchema,\n z.object({\n type: z.literal(\"transition\"),\n transitionTo: z.string(),\n payload: z.any().optional(),\n }),\n z.object({ type: z.literal(\"done\"), data: z.any().optional() }),\n z.object({ type: z.literal(\"error\"), message: z.string() }),\n]);\n\nexport type StreamChunk = z.infer<typeof StreamChunkSchema>;\n","import { z } from \"zod\";\n\nconst StructuredDataBase = z.object({\n type: z.literal(\"structured-data\"),\n streamId: z.string(),\n dataType: z.string(),\n kind: z.enum([\"set\", \"append\", \"text-delta\", \"final\"]),\n schemaId: z.string().optional(),\n schemaVersion: z.string().optional(),\n id: z.string().optional(),\n node: z.string().optional(),\n});\n\nconst StructuredSetChunkSchema = StructuredDataBase.extend({\n kind: z.literal(\"set\"),\n path: z.string().min(1),\n value: z.unknown(),\n});\n\nconst StructuredAppendChunkSchema = StructuredDataBase.extend({\n kind: z.literal(\"append\"),\n path: z.string().min(1),\n items: z.array(z.unknown()),\n});\n\nconst StructuredTextDeltaChunkSchema = StructuredDataBase.extend({\n kind: z.literal(\"text-delta\"),\n path: z.string().min(1),\n delta: z.string(),\n});\n\nconst StructuredFinalChunkSchema = StructuredDataBase.extend({\n kind: z.literal(\"final\"),\n data: z.unknown(),\n});\n\nexport const StructuredDataChunkSchema = z.union([\n StructuredSetChunkSchema,\n StructuredAppendChunkSchema,\n StructuredTextDeltaChunkSchema,\n StructuredFinalChunkSchema,\n]);\n\nexport type StructuredDataChunk = z.infer<typeof StructuredDataChunkSchema>;\n"],"mappings":"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","names":["existing","import_zod"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/client/consume-stream.ts","../src/client/read-stream.ts","../src/client/stream-from-route.ts","../src/server/collect-stream.ts","../src/server/collect-buffered-stream.ts","../src/server/json-to-sse.ts","../src/server/create-stream-response.ts","../src/server/to-sse.ts","../src/structured/apply-structured-chunk.ts","../src/structured/structured-stream-accumulator.ts","../src/types/stream-chunk.ts","../src/types/structured-data/index.ts"],"sourcesContent":["// release-test: 2026-01-22\n// packages/stream/src/index.ts\n\n// client\nexport * from \"./client/consume-stream\";\nexport * from \"./client/read-stream\";\nexport * from \"./client/stream-from-route\";\n\n// server\nexport * from \"./server/collect-buffered-stream\";\nexport * from \"./server/collect-stream\";\nexport * from \"./server/create-stream-response\";\nexport * from \"./server/to-sse\";\nexport * from \"./structured/apply-structured-chunk\";\nexport * from \"./structured/structured-stream-accumulator\";\nexport * from \"./types/stream-chunk\";\nexport * from \"./types/structured-data\";\n","import type { StreamChunk } from \"../types/stream-chunk\";\n\nexport interface ConsumeStreamHandlers {\n onChunk?: (\n chunk: StreamChunk,\n ) => undefined | boolean | Promise<boolean | undefined>;\n onDone?: () => void | Promise<void>;\n onError?: (error: Error, chunk?: StreamChunk) => void | Promise<void>;\n}\n\nconst toError = (value: unknown): Error =>\n value instanceof Error ? value : new Error(String(value));\n\n/**\n * Consume a stream of StreamChunk events with callback handlers.\n * Returns when a `done` chunk is seen, the stream ends, or `onChunk` returns `false`.\n */\nexport async function consumeStream(\n stream: AsyncIterable<StreamChunk>,\n handlers: ConsumeStreamHandlers = {},\n): Promise<void> {\n const callDone = async () => {\n await handlers.onDone?.();\n };\n\n try {\n for await (const chunk of stream) {\n const shouldContinue = await handlers.onChunk?.(chunk);\n\n if (chunk.type === \"error\") {\n await handlers.onError?.(\n new Error(chunk.message || \"Stream error.\"),\n chunk,\n );\n }\n\n if (chunk.type === \"done\" || shouldContinue === false) {\n await callDone();\n return;\n }\n }\n\n await callDone();\n } catch (error) {\n const normalized = toError(error);\n await handlers.onError?.(normalized);\n throw normalized;\n }\n}\n","// packages/stream/src/client/read-stream.ts\nimport type { StreamChunk } from \"../types/stream-chunk\";\n\n/**\n * Reads a server-sent event (SSE) Response body and yields StreamChunk objects.\n */\nexport async function* readStream(\n body: ReadableStream<Uint8Array> | null,\n): AsyncGenerator<StreamChunk, void, void> {\n if (!body) return;\n\n const reader = body.getReader();\n const decoder = new TextDecoder(\"utf-8\");\n let buffer = \"\";\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const parts = buffer.split(\"\\n\\n\");\n buffer = parts.pop() as string;\n\n for (const part of parts) {\n if (!part.startsWith(\"data: \")) continue;\n const payload = part.slice(6);\n if (payload.trim() === \"[DONE]\") return;\n try {\n yield JSON.parse(payload) as StreamChunk;\n } catch (err) {\n console.warn(\"Invalid JSON in stream chunk:\", payload);\n console.error(err);\n }\n }\n }\n}\n","import type { StreamChunk } from \"../types/stream-chunk\";\nimport { readStream } from \"./read-stream\";\n\nexport interface StreamFromRouteArgs<TBody = unknown> {\n endpoint: string;\n body: TBody;\n method?: string | undefined;\n fetchImpl?: typeof fetch;\n headers?: Record<string, string> | undefined;\n signal?: AbortSignal | undefined;\n}\n\nconst toErrorMessage = (error: unknown): string =>\n error instanceof Error ? error.message : String(error);\n\nconst readErrorMessage = async (response: Response): Promise<string> => {\n let message = `Request failed (${response.status})`;\n try {\n const payload = (await response.json()) as unknown;\n if (\n payload &&\n typeof payload === \"object\" &&\n \"error\" in payload &&\n typeof (payload as { error?: unknown }).error === \"string\"\n ) {\n message = (payload as { error: string }).error;\n }\n } catch {}\n return message;\n};\n\nexport async function* streamFromRoute<TBody = unknown>(\n args: StreamFromRouteArgs<TBody>,\n): AsyncGenerator<StreamChunk, void, void> {\n const fetchFn = args.fetchImpl ?? globalThis.fetch;\n if (!fetchFn) {\n yield { type: \"error\", message: \"No fetch implementation available.\" };\n yield { type: \"done\" };\n return;\n }\n\n let response: Response;\n try {\n response = await fetchFn(args.endpoint, {\n method: args.method ?? \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n ...(args.headers ?? {}),\n },\n body: JSON.stringify(args.body),\n ...(args.signal ? { signal: args.signal } : {}),\n });\n } catch (error) {\n yield { type: \"error\", message: toErrorMessage(error) };\n yield { type: \"done\" };\n return;\n }\n\n if (!response.ok) {\n yield { type: \"error\", message: await readErrorMessage(response) };\n yield { type: \"done\" };\n return;\n }\n\n yield* readStream(response.body);\n}\n","import type { StreamChunk } from \"../types/stream-chunk\";\n\n/**\n * Collects a streamed chat response into an array.\n * Useful for non-streaming HTTP responses or server actions.\n */\nexport async function collectStream(\n stream: AsyncIterable<StreamChunk>,\n): Promise<StreamChunk[]> {\n const chunks: StreamChunk[] = [];\n for await (const chunk of stream) {\n chunks.push(chunk);\n }\n return chunks;\n}\n","import type { StreamChunk } from \"../types/stream-chunk\";\nimport type { StructuredDataChunk } from \"../types/structured-data\";\nimport { collectStream } from \"./collect-stream\";\n\nexport interface BufferedStreamResult {\n chunks: StreamChunk[];\n text: string;\n structured: StructuredDataChunk[];\n}\n\n/**\n * Derive convenient buffered fields from raw chunks.\n * `text-delta` is preferred; `message` is fallback when no text deltas exist.\n */\nexport function summarizeStreamChunks(\n chunks: StreamChunk[],\n): Omit<BufferedStreamResult, \"chunks\"> {\n let sawTextDelta = false;\n let text = \"\";\n const messageFallback: string[] = [];\n const structured: StructuredDataChunk[] = [];\n\n for (const chunk of chunks) {\n if (chunk.type === \"text-delta\") {\n sawTextDelta = true;\n text += chunk.delta;\n continue;\n }\n\n if (chunk.type === \"message\") {\n messageFallback.push(chunk.content ?? \"\");\n continue;\n }\n\n if (chunk.type === \"structured-data\") {\n structured.push(chunk as StructuredDataChunk);\n }\n }\n\n if (!sawTextDelta && messageFallback.length > 0) {\n text = messageFallback.join(\"\");\n }\n\n return { text, structured };\n}\n\n/**\n * Collect a stream and return both raw chunks and buffered convenience fields.\n */\nexport async function collectBufferedStream(\n stream: AsyncIterable<StreamChunk>,\n): Promise<BufferedStreamResult> {\n const chunks = await collectStream(stream);\n return {\n chunks,\n ...summarizeStreamChunks(chunks),\n };\n}\n","// packages/stream/src/server/json-to-sse.ts\nexport class JsonToSseTransformStream extends TransformStream<unknown, string> {\n constructor() {\n super({\n transform(part, controller) {\n controller.enqueue(`data: ${JSON.stringify(part)}\\n\\n`);\n },\n flush(controller) {\n controller.enqueue(\"data: [DONE]\\n\\n\");\n },\n });\n }\n}\n","// packages/stream/src/server/create-stream-response.ts\nimport type { StreamChunk } from \"../types/stream-chunk\";\nimport { JsonToSseTransformStream } from \"./json-to-sse\";\n\nexport const STREAM_HEADERS = {\n \"content-type\": \"text/event-stream\",\n \"cache-control\": \"no-cache\",\n connection: \"keep-alive\",\n \"x-accel-buffering\": \"no\",\n};\n\n/**\n * Turns an AsyncIterable<StreamChunk> into a streamed HTTP Response.\n * Works in Node, Bun, Cloudflare, Edge, etc.\n */\nexport function createStreamResponse(\n stream: AsyncIterable<StreamChunk>,\n): Response {\n const readable = new ReadableStream<StreamChunk>({\n async start(controller) {\n try {\n for await (const chunk of stream) {\n controller.enqueue(chunk);\n }\n } catch (err) {\n controller.enqueue({\n type: \"error\",\n message: err instanceof Error ? err.message : String(err),\n } as StreamChunk);\n } finally {\n controller.close();\n }\n },\n });\n\n return new Response(\n readable\n .pipeThrough(new JsonToSseTransformStream())\n .pipeThrough(new TextEncoderStream()),\n { headers: STREAM_HEADERS },\n );\n}\n","import type { StreamChunk } from \"../types/stream-chunk\";\nimport { createStreamResponse } from \"./create-stream-response\";\n\n/**\n * Friendly alias for createStreamResponse.\n */\nexport function toSSE(stream: AsyncIterable<StreamChunk>): Response {\n return createStreamResponse(stream);\n}\n","import type { StructuredDataChunk } from \"../types/structured-data\";\n\nexport type StructuredStreamState<TData = unknown> = {\n streamId: string;\n dataType: string;\n status: \"streaming\" | \"done\";\n data: TData;\n node?: string;\n id?: string;\n schemaId?: string;\n schemaVersion?: string;\n};\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst isArrayIndex = (value: string): boolean => /^\\d+$/.test(value);\n\nconst describeValue = (value: unknown): string => {\n if (value === null) return \"null\";\n if (Array.isArray(value)) return \"array\";\n return typeof value;\n};\n\nconst parsePath = (path: string): string[] => {\n if (path.length === 0) {\n throw new Error(\n \"Structured chunk path must be a non-empty dot-separated string.\",\n );\n }\n\n const parts = path.split(\".\");\n if (parts.some((part) => part.length === 0)) {\n throw new Error(\n `Structured chunk path \"${path}\" must not contain empty segments.`,\n );\n }\n\n return parts;\n};\n\nconst cloneContainerForPart = (args: {\n current: unknown;\n part: string;\n path: string;\n traversed: string[];\n}): Record<string, unknown> | unknown[] => {\n const expected = isArrayIndex(args.part) ? \"array\" : \"object\";\n const location =\n args.traversed.length === 0 ? \"<root>\" : args.traversed.join(\".\");\n\n if (args.current === undefined) {\n return expected === \"array\" ? [] : {};\n }\n\n if (expected === \"array\") {\n if (Array.isArray(args.current)) return [...args.current];\n throw new Error(\n `Structured path conflict at ${location} for \"${args.path}\": expected array container, received ${describeValue(args.current)}.`,\n );\n }\n\n if (isPlainObject(args.current)) return { ...args.current };\n\n throw new Error(\n `Structured path conflict at ${location} for \"${args.path}\": expected object container, received ${describeValue(args.current)}.`,\n );\n};\n\nconst updateByParts = (args: {\n input: unknown;\n parts: string[];\n path: string;\n updateLeaf: (current: unknown) => unknown;\n traversed?: string[];\n}): unknown => {\n const traversed = args.traversed ?? [];\n const [part, ...rest] = args.parts as [string, ...string[]];\n\n const container = cloneContainerForPart({\n current: args.input,\n part,\n path: args.path,\n traversed,\n });\n\n const currentChild = Array.isArray(container)\n ? container[Number(part)]\n : container[part];\n const nextChild =\n rest.length === 0\n ? args.updateLeaf(currentChild)\n : updateByParts({\n input: currentChild,\n parts: rest,\n path: args.path,\n updateLeaf: args.updateLeaf,\n traversed: [...traversed, part],\n });\n\n if (Array.isArray(container)) {\n container[Number(part)] = nextChild;\n } else {\n container[part] = nextChild;\n }\n\n return container;\n};\n\nexport function applyStructuredChunk<TData = unknown>(\n current: StructuredStreamState<TData> | undefined,\n chunk: StructuredDataChunk,\n): StructuredStreamState<TData> {\n if (current && current.streamId !== chunk.streamId) {\n throw new Error(\n `Structured chunk streamId mismatch: expected ${current.streamId}, received ${chunk.streamId}.`,\n );\n }\n\n if (current?.status === \"done\") {\n throw new Error(\n `Structured stream ${chunk.streamId} already completed with a final chunk.`,\n );\n }\n\n const nextBase = {\n streamId: chunk.streamId,\n dataType: chunk.dataType,\n status: chunk.kind === \"final\" ? (\"done\" as const) : (\"streaming\" as const),\n ...(chunk.node ? { node: chunk.node } : {}),\n ...(chunk.id ? { id: chunk.id } : {}),\n ...(chunk.schemaId ? { schemaId: chunk.schemaId } : {}),\n ...(chunk.schemaVersion ? { schemaVersion: chunk.schemaVersion } : {}),\n };\n\n if (chunk.kind === \"final\") {\n return {\n ...nextBase,\n data: chunk.data as TData,\n };\n }\n\n const path = chunk.path;\n const pathParts = parsePath(path);\n const previousData = current?.data;\n\n if (chunk.kind === \"set\") {\n return {\n ...nextBase,\n data: updateByParts({\n input: previousData,\n parts: pathParts,\n path,\n updateLeaf: () => chunk.value,\n }) as TData,\n };\n }\n\n if (chunk.kind === \"append\") {\n return {\n ...nextBase,\n data: updateByParts({\n input: previousData,\n parts: pathParts,\n path,\n updateLeaf: (existing) => {\n if (existing === undefined) return [...chunk.items];\n if (!Array.isArray(existing)) {\n throw new Error(\n `Structured append requires path \"${path}\" to target an array, received ${describeValue(existing)}.`,\n );\n }\n return [...existing, ...chunk.items];\n },\n }) as TData,\n };\n }\n\n return {\n ...nextBase,\n data: updateByParts({\n input: previousData,\n parts: pathParts,\n path,\n updateLeaf: (existing) => {\n if (existing === undefined) return chunk.delta;\n if (typeof existing !== \"string\") {\n throw new Error(\n `Structured text-delta requires path \"${path}\" to target a string, received ${describeValue(existing)}.`,\n );\n }\n return existing + chunk.delta;\n },\n }) as TData,\n };\n}\n\nexport function reduceStructuredChunks<TData = unknown>(\n chunks: StructuredDataChunk[],\n): Record<string, StructuredStreamState<TData>> {\n return chunks.reduce<Record<string, StructuredStreamState<TData>>>(\n (acc, chunk) => {\n acc[chunk.streamId] = applyStructuredChunk(acc[chunk.streamId], chunk);\n return acc;\n },\n {},\n );\n}\n","import type { StreamChunk } from \"../types/stream-chunk\";\nimport type { StructuredDataChunk } from \"../types/structured-data\";\nimport {\n applyStructuredChunk,\n type StructuredStreamState,\n} from \"./apply-structured-chunk\";\n\nexport type StructuredStreamAccumulator<TData = unknown> = {\n apply: (chunk: StructuredDataChunk) => StructuredStreamState<TData>;\n applyStreamChunk: (\n chunk: StreamChunk,\n ) => StructuredStreamState<TData> | undefined;\n get: (streamId: string) => StructuredStreamState<TData> | undefined;\n has: (streamId: string) => boolean;\n delete: (streamId: string) => boolean;\n clear: () => void;\n size: () => number;\n entries: () => Array<[string, StructuredStreamState<TData>]>;\n values: () => StructuredStreamState<TData>[];\n toRecord: () => Record<string, StructuredStreamState<TData>>;\n};\n\nconst isStructuredDataChunk = (\n chunk: StreamChunk,\n): chunk is StructuredDataChunk => chunk.type === \"structured-data\";\n\nexport function createStructuredStreamAccumulator<TData = unknown>(\n initialChunks: Iterable<StructuredDataChunk> = [],\n): StructuredStreamAccumulator<TData> {\n const states = new Map<string, StructuredStreamState<TData>>();\n\n const apply = (chunk: StructuredDataChunk): StructuredStreamState<TData> => {\n const nextState = applyStructuredChunk(states.get(chunk.streamId), chunk);\n states.set(chunk.streamId, nextState);\n return nextState;\n };\n\n for (const chunk of initialChunks) {\n apply(chunk);\n }\n\n return {\n apply,\n applyStreamChunk: (chunk) => {\n if (!isStructuredDataChunk(chunk)) return undefined;\n return apply(chunk);\n },\n get: (streamId) => states.get(streamId),\n has: (streamId) => states.has(streamId),\n delete: (streamId) => states.delete(streamId),\n clear: () => {\n states.clear();\n },\n size: () => states.size,\n entries: () => Array.from(states.entries()),\n values: () => Array.from(states.values()),\n toRecord: () => Object.fromEntries(states.entries()),\n };\n}\n","import { z } from \"zod\";\nimport { StructuredDataChunkSchema } from \"./structured-data\";\n\nexport const StreamChunkSchema = z.union([\n z.object({\n type: z.literal(\"session\"),\n sessionId: z.string(),\n }),\n z.object({\n type: z.literal(\"status\"),\n message: z.string(),\n node: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"message\"),\n content: z.string(),\n node: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"text-start\"),\n node: z.string().optional(),\n id: z.string().optional(),\n opId: z.string().optional(),\n segmentId: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"text-delta\"),\n delta: z.string(),\n node: z.string().optional(),\n id: z.string().optional(),\n opId: z.string().optional(),\n segmentId: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"text-end\"),\n node: z.string().optional(),\n id: z.string().optional(),\n opId: z.string().optional(),\n segmentId: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"tool-result\"),\n tool: z.string().optional(),\n node: z.string().optional(),\n content: z.unknown(),\n }),\n // Interrupt request chunk (used to render interactive options in UI)\n z.object({\n type: z.literal(\"interrupt\"),\n requestId: z.string(),\n resumeToken: z.string(),\n workflow: z.string().optional(),\n node: z.string().optional(),\n id: z.string().optional(),\n opId: z.string().optional(),\n schemaId: z.string().optional(),\n schemaVersion: z.string().optional(),\n input: z.discriminatedUnion(\"kind\", [\n // Text input: question optional, no options\n z.object({\n kind: z.literal(\"text\"),\n multiple: z.boolean(),\n question: z.string().optional(),\n id: z.string().optional(),\n schemaId: z.string().optional(),\n schemaVersion: z.string().optional(),\n meta: z.record(z.string(), z.unknown()).optional(),\n options: z.array(z.never()).optional(),\n }),\n // Choice/multi-choice: question + options required\n z.object({\n kind: z.enum([\"choice\", \"multi-choice\"]),\n multiple: z.boolean(),\n question: z.string(),\n id: z.string().optional(),\n schemaId: z.string().optional(),\n schemaVersion: z.string().optional(),\n meta: z.record(z.string(), z.unknown()).optional(),\n options: z.array(\n z.object({\n id: z.string(),\n label: z.string(),\n description: z.string().optional(),\n }),\n ),\n }),\n ]),\n meta: z.record(z.string(), z.unknown()).optional(),\n }),\n StructuredDataChunkSchema,\n z.object({\n type: z.literal(\"transition\"),\n transitionTo: z.string(),\n payload: z.any().optional(),\n }),\n z.object({ type: z.literal(\"done\"), data: z.any().optional() }),\n z.object({ type: z.literal(\"error\"), message: z.string() }),\n]);\n\nexport type StreamChunk = z.infer<typeof StreamChunkSchema>;\n","import { z } from \"zod\";\n\nconst StructuredDataBase = z.object({\n type: z.literal(\"structured-data\"),\n streamId: z.string(),\n dataType: z.string(),\n kind: z.enum([\"set\", \"append\", \"text-delta\", \"final\"]),\n schemaId: z.string().optional(),\n schemaVersion: z.string().optional(),\n id: z.string().optional(),\n node: z.string().optional(),\n});\n\nconst StructuredSetChunkSchema = StructuredDataBase.extend({\n kind: z.literal(\"set\"),\n path: z.string().min(1),\n value: z.unknown(),\n});\n\nconst StructuredAppendChunkSchema = StructuredDataBase.extend({\n kind: z.literal(\"append\"),\n path: z.string().min(1),\n items: z.array(z.unknown()),\n});\n\nconst StructuredTextDeltaChunkSchema = StructuredDataBase.extend({\n kind: z.literal(\"text-delta\"),\n path: z.string().min(1),\n delta: z.string(),\n});\n\nconst StructuredFinalChunkSchema = StructuredDataBase.extend({\n kind: z.literal(\"final\"),\n data: z.unknown(),\n});\n\nexport const StructuredDataChunkSchema = z.union([\n StructuredSetChunkSchema,\n StructuredAppendChunkSchema,\n StructuredTextDeltaChunkSchema,\n StructuredFinalChunkSchema,\n]);\n\nexport type StructuredDataChunk = z.infer<typeof StructuredDataChunkSchema>;\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACUA,IAAM,UAAU,CAAC,UACf,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAM1D,eAAsB,cACpB,QACA,WAAkC,CAAC,GACpB;AACf,QAAM,WAAW,YAAY;AAC3B,UAAM,SAAS,SAAS;AAAA,EAC1B;AAEA,MAAI;AACF,qBAAiB,SAAS,QAAQ;AAChC,YAAM,iBAAiB,MAAM,SAAS,UAAU,KAAK;AAErD,UAAI,MAAM,SAAS,SAAS;AAC1B,cAAM,SAAS;AAAA,UACb,IAAI,MAAM,MAAM,WAAW,eAAe;AAAA,UAC1C;AAAA,QACF;AAAA,MACF;AAEA,UAAI,MAAM,SAAS,UAAU,mBAAmB,OAAO;AACrD,cAAM,SAAS;AACf;AAAA,MACF;AAAA,IACF;AAEA,UAAM,SAAS;AAAA,EACjB,SAAS,OAAO;AACd,UAAM,aAAa,QAAQ,KAAK;AAChC,UAAM,SAAS,UAAU,UAAU;AACnC,UAAM;AAAA,EACR;AACF;;;AC1CA,gBAAuB,WACrB,MACyC;AACzC,MAAI,CAAC,KAAM;AAEX,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAM,UAAU,IAAI,YAAY,OAAO;AACvC,MAAI,SAAS;AAEb,SAAO,MAAM;AACX,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,QAAI,KAAM;AAEV,cAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAChD,UAAM,QAAQ,OAAO,MAAM,MAAM;AACjC,aAAS,MAAM,IAAI;AAEnB,eAAW,QAAQ,OAAO;AACxB,UAAI,CAAC,KAAK,WAAW,QAAQ,EAAG;AAChC,YAAM,UAAU,KAAK,MAAM,CAAC;AAC5B,UAAI,QAAQ,KAAK,MAAM,SAAU;AACjC,UAAI;AACF,cAAM,KAAK,MAAM,OAAO;AAAA,MAC1B,SAAS,KAAK;AACZ,gBAAQ,KAAK,iCAAiC,OAAO;AACrD,gBAAQ,MAAM,GAAG;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AACF;;;ACvBA,IAAM,iBAAiB,CAAC,UACtB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAEvD,IAAM,mBAAmB,OAAO,aAAwC;AACtE,MAAI,UAAU,mBAAmB,SAAS,MAAM;AAChD,MAAI;AACF,UAAM,UAAW,MAAM,SAAS,KAAK;AACrC,QACE,WACA,OAAO,YAAY,YACnB,WAAW,WACX,OAAQ,QAAgC,UAAU,UAClD;AACA,gBAAW,QAA8B;AAAA,IAC3C;AAAA,EACF,QAAQ;AAAA,EAAC;AACT,SAAO;AACT;AAEA,gBAAuB,gBACrB,MACyC;AACzC,QAAM,UAAU,KAAK,aAAa,WAAW;AAC7C,MAAI,CAAC,SAAS;AACZ,UAAM,EAAE,MAAM,SAAS,SAAS,qCAAqC;AACrE,UAAM,EAAE,MAAM,OAAO;AACrB;AAAA,EACF;AAEA,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,QAAQ,KAAK,UAAU;AAAA,MACtC,QAAQ,KAAK,UAAU;AAAA,MACvB,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,GAAI,KAAK,WAAW,CAAC;AAAA,MACvB;AAAA,MACA,MAAM,KAAK,UAAU,KAAK,IAAI;AAAA,MAC9B,GAAI,KAAK,SAAS,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC;AAAA,IAC/C,CAAC;AAAA,EACH,SAAS,OAAO;AACd,UAAM,EAAE,MAAM,SAAS,SAAS,eAAe,KAAK,EAAE;AACtD,UAAM,EAAE,MAAM,OAAO;AACrB;AAAA,EACF;AAEA,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,EAAE,MAAM,SAAS,SAAS,MAAM,iBAAiB,QAAQ,EAAE;AACjE,UAAM,EAAE,MAAM,OAAO;AACrB;AAAA,EACF;AAEA,SAAO,WAAW,SAAS,IAAI;AACjC;;;AC3DA,eAAsB,cACpB,QACwB;AACxB,QAAM,SAAwB,CAAC;AAC/B,mBAAiB,SAAS,QAAQ;AAChC,WAAO,KAAK,KAAK;AAAA,EACnB;AACA,SAAO;AACT;;;ACAO,SAAS,sBACd,QACsC;AACtC,MAAI,eAAe;AACnB,MAAI,OAAO;AACX,QAAM,kBAA4B,CAAC;AACnC,QAAM,aAAoC,CAAC;AAE3C,aAAW,SAAS,QAAQ;AAC1B,QAAI,MAAM,SAAS,cAAc;AAC/B,qBAAe;AACf,cAAQ,MAAM;AACd;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,WAAW;AAC5B,sBAAgB,KAAK,MAAM,WAAW,EAAE;AACxC;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,mBAAmB;AACpC,iBAAW,KAAK,KAA4B;AAAA,IAC9C;AAAA,EACF;AAEA,MAAI,CAAC,gBAAgB,gBAAgB,SAAS,GAAG;AAC/C,WAAO,gBAAgB,KAAK,EAAE;AAAA,EAChC;AAEA,SAAO,EAAE,MAAM,WAAW;AAC5B;AAKA,eAAsB,sBACpB,QAC+B;AAC/B,QAAM,SAAS,MAAM,cAAc,MAAM;AACzC,SAAO;AAAA,IACL;AAAA,IACA,GAAG,sBAAsB,MAAM;AAAA,EACjC;AACF;;;ACxDO,IAAM,2BAAN,cAAuC,gBAAiC;AAAA,EAC7E,cAAc;AACZ,UAAM;AAAA,MACJ,UAAU,MAAM,YAAY;AAC1B,mBAAW,QAAQ,SAAS,KAAK,UAAU,IAAI,CAAC;AAAA;AAAA,CAAM;AAAA,MACxD;AAAA,MACA,MAAM,YAAY;AAChB,mBAAW,QAAQ,kBAAkB;AAAA,MACvC;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;ACRO,IAAM,iBAAiB;AAAA,EAC5B,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,qBAAqB;AACvB;AAMO,SAAS,qBACd,QACU;AACV,QAAM,WAAW,IAAI,eAA4B;AAAA,IAC/C,MAAM,MAAM,YAAY;AACtB,UAAI;AACF,yBAAiB,SAAS,QAAQ;AAChC,qBAAW,QAAQ,KAAK;AAAA,QAC1B;AAAA,MACF,SAAS,KAAK;AACZ,mBAAW,QAAQ;AAAA,UACjB,MAAM;AAAA,UACN,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QAC1D,CAAgB;AAAA,MAClB,UAAE;AACA,mBAAW,MAAM;AAAA,MACnB;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO,IAAI;AAAA,IACT,SACG,YAAY,IAAI,yBAAyB,CAAC,EAC1C,YAAY,IAAI,kBAAkB,CAAC;AAAA,IACtC,EAAE,SAAS,eAAe;AAAA,EAC5B;AACF;;;ACnCO,SAAS,MAAM,QAA8C;AAClE,SAAO,qBAAqB,MAAM;AACpC;;;ACKA,IAAM,gBAAgB,CAAC,UACrB,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAErE,IAAM,eAAe,CAAC,UAA2B,QAAQ,KAAK,KAAK;AAEnE,IAAM,gBAAgB,CAAC,UAA2B;AAChD,MAAI,UAAU,KAAM,QAAO;AAC3B,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO;AACjC,SAAO,OAAO;AAChB;AAEA,IAAM,YAAY,CAAC,SAA2B;AAC5C,MAAI,KAAK,WAAW,GAAG;AACrB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,MAAI,MAAM,KAAK,CAAC,SAAS,KAAK,WAAW,CAAC,GAAG;AAC3C,UAAM,IAAI;AAAA,MACR,0BAA0B,IAAI;AAAA,IAChC;AAAA,EACF;AAEA,SAAO;AACT;AAEA,IAAM,wBAAwB,CAAC,SAKY;AACzC,QAAM,WAAW,aAAa,KAAK,IAAI,IAAI,UAAU;AACrD,QAAM,WACJ,KAAK,UAAU,WAAW,IAAI,WAAW,KAAK,UAAU,KAAK,GAAG;AAElE,MAAI,KAAK,YAAY,QAAW;AAC9B,WAAO,aAAa,UAAU,CAAC,IAAI,CAAC;AAAA,EACtC;AAEA,MAAI,aAAa,SAAS;AACxB,QAAI,MAAM,QAAQ,KAAK,OAAO,EAAG,QAAO,CAAC,GAAG,KAAK,OAAO;AACxD,UAAM,IAAI;AAAA,MACR,+BAA+B,QAAQ,SAAS,KAAK,IAAI,yCAAyC,cAAc,KAAK,OAAO,CAAC;AAAA,IAC/H;AAAA,EACF;AAEA,MAAI,cAAc,KAAK,OAAO,EAAG,QAAO,EAAE,GAAG,KAAK,QAAQ;AAE1D,QAAM,IAAI;AAAA,IACR,+BAA+B,QAAQ,SAAS,KAAK,IAAI,0CAA0C,cAAc,KAAK,OAAO,CAAC;AAAA,EAChI;AACF;AAEA,IAAM,gBAAgB,CAAC,SAMR;AACb,QAAM,YAAY,KAAK,aAAa,CAAC;AACrC,QAAM,CAAC,MAAM,GAAG,IAAI,IAAI,KAAK;AAE7B,QAAM,YAAY,sBAAsB;AAAA,IACtC,SAAS,KAAK;AAAA,IACd;AAAA,IACA,MAAM,KAAK;AAAA,IACX;AAAA,EACF,CAAC;AAED,QAAM,eAAe,MAAM,QAAQ,SAAS,IACxC,UAAU,OAAO,IAAI,CAAC,IACtB,UAAU,IAAI;AAClB,QAAM,YACJ,KAAK,WAAW,IACZ,KAAK,WAAW,YAAY,IAC5B,cAAc;AAAA,IACZ,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM,KAAK;AAAA,IACX,YAAY,KAAK;AAAA,IACjB,WAAW,CAAC,GAAG,WAAW,IAAI;AAAA,EAChC,CAAC;AAEP,MAAI,MAAM,QAAQ,SAAS,GAAG;AAC5B,cAAU,OAAO,IAAI,CAAC,IAAI;AAAA,EAC5B,OAAO;AACL,cAAU,IAAI,IAAI;AAAA,EACpB;AAEA,SAAO;AACT;AAEO,SAAS,qBACd,SACA,OAC8B;AAC9B,MAAI,WAAW,QAAQ,aAAa,MAAM,UAAU;AAClD,UAAM,IAAI;AAAA,MACR,gDAAgD,QAAQ,QAAQ,cAAc,MAAM,QAAQ;AAAA,IAC9F;AAAA,EACF;AAEA,MAAI,SAAS,WAAW,QAAQ;AAC9B,UAAM,IAAI;AAAA,MACR,qBAAqB,MAAM,QAAQ;AAAA,IACrC;AAAA,EACF;AAEA,QAAM,WAAW;AAAA,IACf,UAAU,MAAM;AAAA,IAChB,UAAU,MAAM;AAAA,IAChB,QAAQ,MAAM,SAAS,UAAW,SAAoB;AAAA,IACtD,GAAI,MAAM,OAAO,EAAE,MAAM,MAAM,KAAK,IAAI,CAAC;AAAA,IACzC,GAAI,MAAM,KAAK,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC;AAAA,IACnC,GAAI,MAAM,WAAW,EAAE,UAAU,MAAM,SAAS,IAAI,CAAC;AAAA,IACrD,GAAI,MAAM,gBAAgB,EAAE,eAAe,MAAM,cAAc,IAAI,CAAC;AAAA,EACtE;AAEA,MAAI,MAAM,SAAS,SAAS;AAC1B,WAAO;AAAA,MACL,GAAG;AAAA,MACH,MAAM,MAAM;AAAA,IACd;AAAA,EACF;AAEA,QAAM,OAAO,MAAM;AACnB,QAAM,YAAY,UAAU,IAAI;AAChC,QAAM,eAAe,SAAS;AAE9B,MAAI,MAAM,SAAS,OAAO;AACxB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,MAAM,cAAc;AAAA,QAClB,OAAO;AAAA,QACP,OAAO;AAAA,QACP;AAAA,QACA,YAAY,MAAM,MAAM;AAAA,MAC1B,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,MAAM,SAAS,UAAU;AAC3B,WAAO;AAAA,MACL,GAAG;AAAA,MACH,MAAM,cAAc;AAAA,QAClB,OAAO;AAAA,QACP,OAAO;AAAA,QACP;AAAA,QACA,YAAY,CAAC,aAAa;AACxB,cAAI,aAAa,OAAW,QAAO,CAAC,GAAG,MAAM,KAAK;AAClD,cAAI,CAAC,MAAM,QAAQ,QAAQ,GAAG;AAC5B,kBAAM,IAAI;AAAA,cACR,oCAAoC,IAAI,kCAAkC,cAAc,QAAQ,CAAC;AAAA,YACnG;AAAA,UACF;AACA,iBAAO,CAAC,GAAG,UAAU,GAAG,MAAM,KAAK;AAAA,QACrC;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,MAAM,cAAc;AAAA,MAClB,OAAO;AAAA,MACP,OAAO;AAAA,MACP;AAAA,MACA,YAAY,CAAC,aAAa;AACxB,YAAI,aAAa,OAAW,QAAO,MAAM;AACzC,YAAI,OAAO,aAAa,UAAU;AAChC,gBAAM,IAAI;AAAA,YACR,wCAAwC,IAAI,kCAAkC,cAAc,QAAQ,CAAC;AAAA,UACvG;AAAA,QACF;AACA,eAAO,WAAW,MAAM;AAAA,MAC1B;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEO,SAAS,uBACd,QAC8C;AAC9C,SAAO,OAAO;AAAA,IACZ,CAAC,KAAK,UAAU;AACd,UAAI,MAAM,QAAQ,IAAI,qBAAqB,IAAI,MAAM,QAAQ,GAAG,KAAK;AACrE,aAAO;AAAA,IACT;AAAA,IACA,CAAC;AAAA,EACH;AACF;;;ACzLA,IAAM,wBAAwB,CAC5B,UACiC,MAAM,SAAS;AAE3C,SAAS,kCACd,gBAA+C,CAAC,GACZ;AACpC,QAAM,SAAS,oBAAI,IAA0C;AAE7D,QAAM,QAAQ,CAAC,UAA6D;AAC1E,UAAM,YAAY,qBAAqB,OAAO,IAAI,MAAM,QAAQ,GAAG,KAAK;AACxE,WAAO,IAAI,MAAM,UAAU,SAAS;AACpC,WAAO;AAAA,EACT;AAEA,aAAW,SAAS,eAAe;AACjC,UAAM,KAAK;AAAA,EACb;AAEA,SAAO;AAAA,IACL;AAAA,IACA,kBAAkB,CAAC,UAAU;AAC3B,UAAI,CAAC,sBAAsB,KAAK,EAAG,QAAO;AAC1C,aAAO,MAAM,KAAK;AAAA,IACpB;AAAA,IACA,KAAK,CAAC,aAAa,OAAO,IAAI,QAAQ;AAAA,IACtC,KAAK,CAAC,aAAa,OAAO,IAAI,QAAQ;AAAA,IACtC,QAAQ,CAAC,aAAa,OAAO,OAAO,QAAQ;AAAA,IAC5C,OAAO,MAAM;AACX,aAAO,MAAM;AAAA,IACf;AAAA,IACA,MAAM,MAAM,OAAO;AAAA,IACnB,SAAS,MAAM,MAAM,KAAK,OAAO,QAAQ,CAAC;AAAA,IAC1C,QAAQ,MAAM,MAAM,KAAK,OAAO,OAAO,CAAC;AAAA,IACxC,UAAU,MAAM,OAAO,YAAY,OAAO,QAAQ,CAAC;AAAA,EACrD;AACF;;;AC1DA,IAAAA,cAAkB;;;ACAlB,iBAAkB;AAElB,IAAM,qBAAqB,aAAE,OAAO;AAAA,EAClC,MAAM,aAAE,QAAQ,iBAAiB;AAAA,EACjC,UAAU,aAAE,OAAO;AAAA,EACnB,UAAU,aAAE,OAAO;AAAA,EACnB,MAAM,aAAE,KAAK,CAAC,OAAO,UAAU,cAAc,OAAO,CAAC;AAAA,EACrD,UAAU,aAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,eAAe,aAAE,OAAO,EAAE,SAAS;AAAA,EACnC,IAAI,aAAE,OAAO,EAAE,SAAS;AAAA,EACxB,MAAM,aAAE,OAAO,EAAE,SAAS;AAC5B,CAAC;AAED,IAAM,2BAA2B,mBAAmB,OAAO;AAAA,EACzD,MAAM,aAAE,QAAQ,KAAK;AAAA,EACrB,MAAM,aAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,OAAO,aAAE,QAAQ;AACnB,CAAC;AAED,IAAM,8BAA8B,mBAAmB,OAAO;AAAA,EAC5D,MAAM,aAAE,QAAQ,QAAQ;AAAA,EACxB,MAAM,aAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,OAAO,aAAE,MAAM,aAAE,QAAQ,CAAC;AAC5B,CAAC;AAED,IAAM,iCAAiC,mBAAmB,OAAO;AAAA,EAC/D,MAAM,aAAE,QAAQ,YAAY;AAAA,EAC5B,MAAM,aAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,OAAO,aAAE,OAAO;AAClB,CAAC;AAED,IAAM,6BAA6B,mBAAmB,OAAO;AAAA,EAC3D,MAAM,aAAE,QAAQ,OAAO;AAAA,EACvB,MAAM,aAAE,QAAQ;AAClB,CAAC;AAEM,IAAM,4BAA4B,aAAE,MAAM;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;;;ADtCM,IAAM,oBAAoB,cAAE,MAAM;AAAA,EACvC,cAAE,OAAO;AAAA,IACP,MAAM,cAAE,QAAQ,SAAS;AAAA,IACzB,WAAW,cAAE,OAAO;AAAA,EACtB,CAAC;AAAA,EACD,cAAE,OAAO;AAAA,IACP,MAAM,cAAE,QAAQ,QAAQ;AAAA,IACxB,SAAS,cAAE,OAAO;AAAA,IAClB,MAAM,cAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,CAAC;AAAA,EACD,cAAE,OAAO;AAAA,IACP,MAAM,cAAE,QAAQ,SAAS;AAAA,IACzB,SAAS,cAAE,OAAO;AAAA,IAClB,MAAM,cAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,CAAC;AAAA,EACD,cAAE,OAAO;AAAA,IACP,MAAM,cAAE,QAAQ,YAAY;AAAA,IAC5B,MAAM,cAAE,OAAO,EAAE,SAAS;AAAA,IAC1B,IAAI,cAAE,OAAO,EAAE,SAAS;AAAA,IACxB,MAAM,cAAE,OAAO,EAAE,SAAS;AAAA,IAC1B,WAAW,cAAE,OAAO,EAAE,SAAS;AAAA,EACjC,CAAC;AAAA,EACD,cAAE,OAAO;AAAA,IACP,MAAM,cAAE,QAAQ,YAAY;AAAA,IAC5B,OAAO,cAAE,OAAO;AAAA,IAChB,MAAM,cAAE,OAAO,EAAE,SAAS;AAAA,IAC1B,IAAI,cAAE,OAAO,EAAE,SAAS;AAAA,IACxB,MAAM,cAAE,OAAO,EAAE,SAAS;AAAA,IAC1B,WAAW,cAAE,OAAO,EAAE,SAAS;AAAA,EACjC,CAAC;AAAA,EACD,cAAE,OAAO;AAAA,IACP,MAAM,cAAE,QAAQ,UAAU;AAAA,IAC1B,MAAM,cAAE,OAAO,EAAE,SAAS;AAAA,IAC1B,IAAI,cAAE,OAAO,EAAE,SAAS;AAAA,IACxB,MAAM,cAAE,OAAO,EAAE,SAAS;AAAA,IAC1B,WAAW,cAAE,OAAO,EAAE,SAAS;AAAA,EACjC,CAAC;AAAA,EACD,cAAE,OAAO;AAAA,IACP,MAAM,cAAE,QAAQ,aAAa;AAAA,IAC7B,MAAM,cAAE,OAAO,EAAE,SAAS;AAAA,IAC1B,MAAM,cAAE,OAAO,EAAE,SAAS;AAAA,IAC1B,SAAS,cAAE,QAAQ;AAAA,EACrB,CAAC;AAAA;AAAA,EAED,cAAE,OAAO;AAAA,IACP,MAAM,cAAE,QAAQ,WAAW;AAAA,IAC3B,WAAW,cAAE,OAAO;AAAA,IACpB,aAAa,cAAE,OAAO;AAAA,IACtB,UAAU,cAAE,OAAO,EAAE,SAAS;AAAA,IAC9B,MAAM,cAAE,OAAO,EAAE,SAAS;AAAA,IAC1B,IAAI,cAAE,OAAO,EAAE,SAAS;AAAA,IACxB,MAAM,cAAE,OAAO,EAAE,SAAS;AAAA,IAC1B,UAAU,cAAE,OAAO,EAAE,SAAS;AAAA,IAC9B,eAAe,cAAE,OAAO,EAAE,SAAS;AAAA,IACnC,OAAO,cAAE,mBAAmB,QAAQ;AAAA;AAAA,MAElC,cAAE,OAAO;AAAA,QACP,MAAM,cAAE,QAAQ,MAAM;AAAA,QACtB,UAAU,cAAE,QAAQ;AAAA,QACpB,UAAU,cAAE,OAAO,EAAE,SAAS;AAAA,QAC9B,IAAI,cAAE,OAAO,EAAE,SAAS;AAAA,QACxB,UAAU,cAAE,OAAO,EAAE,SAAS;AAAA,QAC9B,eAAe,cAAE,OAAO,EAAE,SAAS;AAAA,QACnC,MAAM,cAAE,OAAO,cAAE,OAAO,GAAG,cAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,QACjD,SAAS,cAAE,MAAM,cAAE,MAAM,CAAC,EAAE,SAAS;AAAA,MACvC,CAAC;AAAA;AAAA,MAED,cAAE,OAAO;AAAA,QACP,MAAM,cAAE,KAAK,CAAC,UAAU,cAAc,CAAC;AAAA,QACvC,UAAU,cAAE,QAAQ;AAAA,QACpB,UAAU,cAAE,OAAO;AAAA,QACnB,IAAI,cAAE,OAAO,EAAE,SAAS;AAAA,QACxB,UAAU,cAAE,OAAO,EAAE,SAAS;AAAA,QAC9B,eAAe,cAAE,OAAO,EAAE,SAAS;AAAA,QACnC,MAAM,cAAE,OAAO,cAAE,OAAO,GAAG,cAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,QACjD,SAAS,cAAE;AAAA,UACT,cAAE,OAAO;AAAA,YACP,IAAI,cAAE,OAAO;AAAA,YACb,OAAO,cAAE,OAAO;AAAA,YAChB,aAAa,cAAE,OAAO,EAAE,SAAS;AAAA,UACnC,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,IACD,MAAM,cAAE,OAAO,cAAE,OAAO,GAAG,cAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EACnD,CAAC;AAAA,EACD;AAAA,EACA,cAAE,OAAO;AAAA,IACP,MAAM,cAAE,QAAQ,YAAY;AAAA,IAC5B,cAAc,cAAE,OAAO;AAAA,IACvB,SAAS,cAAE,IAAI,EAAE,SAAS;AAAA,EAC5B,CAAC;AAAA,EACD,cAAE,OAAO,EAAE,MAAM,cAAE,QAAQ,MAAM,GAAG,MAAM,cAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AAAA,EAC9D,cAAE,OAAO,EAAE,MAAM,cAAE,QAAQ,OAAO,GAAG,SAAS,cAAE,OAAO,EAAE,CAAC;AAC5D,CAAC;","names":["import_zod"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kortyx/stream",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
4
4
  "private": false,
5
5
  "description": "Streaming primitives for Kortyx.",
6
6
  "keywords": [
@@ -37,13 +37,15 @@
37
37
  "CHANGELOG.md"
38
38
  ],
39
39
  "dependencies": {
40
- "zod": "^3.23.8"
40
+ "zod": "^4.3.6"
41
41
  },
42
42
  "devDependencies": {
43
43
  "concurrently": "^9.2.0",
44
- "turbo": "^2.5.4",
45
- "typescript": "5.7.2",
46
- "tsup": "^8.5.1"
44
+ "turbo": "2.6.1",
45
+ "typescript": "5.9.3",
46
+ "tsup": "^8.5.1",
47
+ "vitest": "^4.1.5",
48
+ "@vitest/coverage-v8": "^4.1.5"
47
49
  },
48
50
  "repository": {
49
51
  "type": "git",
@@ -58,7 +60,8 @@
58
60
  "predev": "tsc -p tsconfig.json",
59
61
  "dev": "tsc --watch",
60
62
  "lint": "biome check src",
61
- "test": "pnpm -s type-check",
62
- "type-check": "tsc --noEmit"
63
+ "test": "vitest run && pnpm -s type-check",
64
+ "coverage": "vitest run --coverage && pnpm -s type-check",
65
+ "type-check": "tsc --noEmit -p tsconfig.test.json"
63
66
  }
64
67
  }