@kortyx/stream 0.13.2 → 0.15.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/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # @chatbot-core/types
2
2
 
3
+ ## [0.15.0](https://github.com/kortyx-io/kortyx/compare/stream-v0.14.0...stream-v0.15.0) (2026-09-30)
4
+
5
+
6
+ ### Features
7
+
8
+ * **hooks:** add realtime model-selected output contracts ([#249](https://github.com/kortyx-io/kortyx/issues/249)) ([ac52b47](https://github.com/kortyx-io/kortyx/commit/ac52b47151b64ce5be6ce6c7fd42d34a0fa8a76d))
9
+
10
+ ## [0.14.0](https://github.com/kortyx-io/kortyx/compare/stream-v0.13.2...stream-v0.14.0) (2026-09-23)
11
+
12
+
13
+ ### Features
14
+
15
+ * **chat:** add server-side transcript lifecycle hooks ([#240](https://github.com/kortyx-io/kortyx/issues/240)) ([f84a674](https://github.com/kortyx-io/kortyx/commit/f84a6749819ee7bab343efb03f38eae743de0655))
16
+
3
17
  ## [0.13.2](https://github.com/kortyx-io/kortyx/compare/stream-v0.13.1...stream-v0.13.2) (2026-09-22)
4
18
 
5
19
 
@@ -23,7 +23,7 @@ declare const StreamChunkSchema: z.ZodUnion<readonly [z.ZodObject<{
23
23
  }, z.core.$strip>, z.ZodObject<{
24
24
  type: z.ZodLiteral<"structured-data-invalidated">;
25
25
  streamId: z.ZodString;
26
- checkpointId: z.ZodString;
26
+ checkpointId: z.ZodOptional<z.ZodString>;
27
27
  }, z.core.$strip>, z.ZodObject<{
28
28
  type: z.ZodLiteral<"trace">;
29
29
  traceId: z.ZodString;
@@ -294,6 +294,60 @@ type StructuredStreamState<TData = unknown> = {
294
294
  declare function applyStructuredChunk<TData = unknown>(current: StructuredStreamState<TData> | undefined, chunk: StructuredDataChunk): StructuredStreamState<TData>;
295
295
  declare function reduceStructuredChunks<TData = unknown>(chunks: StructuredDataChunk[]): Record<string, StructuredStreamState<TData>>;
296
296
 
297
+ type FinalizedChatContentPiece = {
298
+ id: string;
299
+ type: "text";
300
+ content: string;
301
+ } | {
302
+ id: string;
303
+ type: "structured";
304
+ data: StructuredStreamState<Record<string, unknown>>;
305
+ } | {
306
+ id: string;
307
+ type: "error";
308
+ content: string;
309
+ failure?: FailureDescriptor;
310
+ } | {
311
+ id: string;
312
+ type: "interrupt";
313
+ resumeToken: string;
314
+ requestId: string;
315
+ kind: "text" | "choice" | "multi-choice" | "custom";
316
+ question?: string;
317
+ multiple: boolean;
318
+ options: Array<{
319
+ id: string;
320
+ label: string;
321
+ description?: string;
322
+ }>;
323
+ schemaId?: string;
324
+ schemaVersion?: string;
325
+ contract?: string;
326
+ request?: unknown;
327
+ interruptId?: string;
328
+ meta?: Record<string, unknown>;
329
+ };
330
+ type FinalizedChatMessage = {
331
+ id: string;
332
+ role: "assistant";
333
+ content: string;
334
+ contentPieces: FinalizedChatContentPiece[];
335
+ checkpointId?: string;
336
+ checkpointTurnIndex?: number;
337
+ };
338
+ type InterruptChunk = Extract<StreamChunk, {
339
+ type: "interrupt";
340
+ }>;
341
+ /** Shared default interrupt projection for server snapshots and React. */
342
+ declare function projectInterruptPiece(chunk: InterruptChunk, id: string): Extract<FinalizedChatContentPiece, {
343
+ type: "interrupt";
344
+ }>;
345
+ /** Accumulates emitted UI chunks without consuming the HTTP response. */
346
+ declare function createFinalizedChatMessageAccumulator(clientTurnId: string): {
347
+ apply(chunk: StreamChunk): void;
348
+ message(): FinalizedChatMessage;
349
+ };
350
+
297
351
  type StructuredStreamAccumulator<TData = unknown> = {
298
352
  apply: (chunk: StructuredDataChunk) => StructuredStreamState<TData>;
299
353
  applyStreamChunk: (chunk: StreamChunk) => StructuredStreamState<TData> | undefined;
@@ -308,4 +362,4 @@ type StructuredStreamAccumulator<TData = unknown> = {
308
362
  };
309
363
  declare function createStructuredStreamAccumulator<TData = unknown>(initialChunks?: Iterable<StructuredDataChunk>): StructuredStreamAccumulator<TData>;
310
364
 
311
- export { type ConsumeStreamHandlers as C, type StreamChunk as S, type StructuredDataChunk as a, StreamChunkSchema as b, type StreamFromRouteArgs as c, StructuredDataChunkSchema as d, type StructuredStreamAccumulator as e, type StructuredStreamState as f, applyStructuredChunk as g, consumeStream as h, createStructuredStreamAccumulator as i, failureChunk as j, reduceStructuredChunks as k, streamFromRoute as l, readStream as r, streamError as s };
365
+ export { type ConsumeStreamHandlers as C, type FinalizedChatContentPiece as F, type StreamChunk as S, type StructuredDataChunk as a, type FinalizedChatMessage as b, StreamChunkSchema as c, type StreamFromRouteArgs as d, StructuredDataChunkSchema as e, type StructuredStreamAccumulator as f, type StructuredStreamState as g, applyStructuredChunk as h, consumeStream as i, createFinalizedChatMessageAccumulator as j, createStructuredStreamAccumulator as k, failureChunk as l, reduceStructuredChunks as m, streamFromRoute as n, projectInterruptPiece as p, readStream as r, streamError as s };
package/dist/browser.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- export { C as ConsumeStreamHandlers, S as StreamChunk, c as StreamFromRouteArgs, a as StructuredDataChunk, e as StructuredStreamAccumulator, f as StructuredStreamState, g as applyStructuredChunk, h as consumeStream, i as createStructuredStreamAccumulator, j as failureChunk, r as readStream, k as reduceStructuredChunks, s as streamError, l as streamFromRoute } from './browser-BFBys6ZN.js';
1
+ export { C as ConsumeStreamHandlers, F as FinalizedChatContentPiece, b as FinalizedChatMessage, S as StreamChunk, d as StreamFromRouteArgs, a as StructuredDataChunk, f as StructuredStreamAccumulator, g as StructuredStreamState, h as applyStructuredChunk, i as consumeStream, j as createFinalizedChatMessageAccumulator, k as createStructuredStreamAccumulator, l as failureChunk, p as projectInterruptPiece, r as readStream, m as reduceStructuredChunks, s as streamError, n as streamFromRoute } from './browser-CW1oLh9K.js';
2
2
  import '@kortyx/core/errors';
3
3
  import 'zod';
package/dist/browser.js CHANGED
@@ -21,8 +21,10 @@ var browser_exports = {};
21
21
  __export(browser_exports, {
22
22
  applyStructuredChunk: () => applyStructuredChunk,
23
23
  consumeStream: () => consumeStream,
24
+ createFinalizedChatMessageAccumulator: () => createFinalizedChatMessageAccumulator,
24
25
  createStructuredStreamAccumulator: () => createStructuredStreamAccumulator,
25
26
  failureChunk: () => failureChunk,
27
+ projectInterruptPiece: () => projectInterruptPiece,
26
28
  readStream: () => readStream,
27
29
  reduceStructuredChunks: () => reduceStructuredChunks,
28
30
  streamError: () => streamError,
@@ -352,6 +354,10 @@ function createStructuredStreamAccumulator(initialChunks = []) {
352
354
  return {
353
355
  apply,
354
356
  applyStreamChunk: (chunk) => {
357
+ if (chunk.type === "structured-data-invalidated") {
358
+ states.delete(chunk.streamId);
359
+ return void 0;
360
+ }
355
361
  if (!isStructuredDataChunk(chunk)) return void 0;
356
362
  return apply(chunk);
357
363
  },
@@ -367,12 +373,149 @@ function createStructuredStreamAccumulator(initialChunks = []) {
367
373
  toRecord: () => Object.fromEntries(states.entries())
368
374
  };
369
375
  }
376
+
377
+ // src/structured/finalized-chat-message.ts
378
+ var textStreamKey = (chunk) => {
379
+ const op = chunk.opId?.trim();
380
+ const segment = chunk.segmentId?.trim();
381
+ if (segment) return op ? `${op}:${segment}` : segment;
382
+ if (op) return `${op}:${chunk.node ?? "__unknown__"}`;
383
+ return chunk.node ?? "__unknown__";
384
+ };
385
+ function projectInterruptPiece(chunk, id) {
386
+ const input = chunk.input;
387
+ const schemaId = chunk.schemaId ?? input.schemaId;
388
+ const schemaVersion = chunk.schemaVersion ?? input.schemaVersion;
389
+ const interruptId = chunk.id ?? input.id;
390
+ return {
391
+ id,
392
+ type: "interrupt",
393
+ resumeToken: chunk.resumeToken,
394
+ requestId: chunk.requestId,
395
+ kind: input.kind,
396
+ ...input.question !== void 0 ? { question: input.question } : {},
397
+ multiple: input.multiple,
398
+ options: (input.options ?? []).map((option) => ({
399
+ id: option.id,
400
+ label: option.label,
401
+ ...option.description ? { description: option.description } : {}
402
+ })),
403
+ ...schemaId ? { schemaId } : {},
404
+ ...schemaVersion ? { schemaVersion } : {},
405
+ ...input.kind === "custom" && input.contract ? { contract: input.contract } : {},
406
+ ...input.kind === "custom" ? { request: input.request } : {},
407
+ ...interruptId ? { interruptId } : {},
408
+ ...input.meta || chunk.meta ? { meta: { ...input.meta ?? {}, ...chunk.meta ?? {} } } : {}
409
+ };
410
+ }
411
+ function createFinalizedChatMessageAccumulator(clientTurnId) {
412
+ const pieces = [];
413
+ const textIndexes = /* @__PURE__ */ new Map();
414
+ const structured = createStructuredStreamAccumulator();
415
+ let sawTextDelta = false;
416
+ let checkpoint;
417
+ const ensureText = (key) => {
418
+ const existing = textIndexes.get(key);
419
+ if (existing !== void 0) return existing;
420
+ const index = pieces.length;
421
+ pieces.push({
422
+ id: `${clientTurnId}:text:${key}`,
423
+ type: "text",
424
+ content: ""
425
+ });
426
+ textIndexes.set(key, index);
427
+ return index;
428
+ };
429
+ return {
430
+ apply(chunk) {
431
+ switch (chunk.type) {
432
+ case "checkpoint":
433
+ checkpoint = { id: chunk.id, turnIndex: chunk.turnIndex };
434
+ break;
435
+ case "text-start":
436
+ ensureText(textStreamKey(chunk));
437
+ break;
438
+ case "text-delta": {
439
+ sawTextDelta = true;
440
+ const index = ensureText(textStreamKey(chunk));
441
+ const current = pieces[index];
442
+ pieces[index] = {
443
+ ...current,
444
+ content: current.content + chunk.delta
445
+ };
446
+ break;
447
+ }
448
+ case "message":
449
+ if (!sawTextDelta) {
450
+ pieces.push({
451
+ id: `${clientTurnId}:message:${pieces.length}`,
452
+ type: "text",
453
+ content: chunk.content
454
+ });
455
+ }
456
+ break;
457
+ case "structured-data": {
458
+ const data = structured.apply(chunk);
459
+ const id = `${clientTurnId}:structured:${chunk.streamId}`;
460
+ const index = pieces.findIndex((piece2) => piece2.id === id);
461
+ const piece = { id, type: "structured", data };
462
+ if (index < 0) pieces.push(piece);
463
+ else pieces[index] = piece;
464
+ break;
465
+ }
466
+ case "structured-data-invalidated": {
467
+ structured.delete(chunk.streamId);
468
+ const index = pieces.findIndex(
469
+ (piece) => piece.id === `${clientTurnId}:structured:${chunk.streamId}`
470
+ );
471
+ if (index >= 0) pieces.splice(index, 1);
472
+ break;
473
+ }
474
+ case "interrupt":
475
+ pieces.push(
476
+ projectInterruptPiece(
477
+ chunk,
478
+ `${clientTurnId}:interrupt:${chunk.requestId}`
479
+ )
480
+ );
481
+ break;
482
+ case "error":
483
+ pieces.push({
484
+ id: `${clientTurnId}:error:${pieces.length}`,
485
+ type: "error",
486
+ content: chunk.message,
487
+ ...chunk.failure ? { failure: chunk.failure } : {}
488
+ });
489
+ break;
490
+ }
491
+ },
492
+ message() {
493
+ const contentPieces = pieces.filter(
494
+ (piece) => piece.type !== "text" || piece.content.length > 0
495
+ );
496
+ return {
497
+ id: `${clientTurnId}:assistant`,
498
+ role: "assistant",
499
+ content: contentPieces.filter(
500
+ (piece) => piece.type === "text"
501
+ ).map((piece) => piece.content).join(""),
502
+ contentPieces: contentPieces.map((piece) => ({ ...piece })),
503
+ ...checkpoint ? {
504
+ checkpointId: checkpoint.id,
505
+ checkpointTurnIndex: checkpoint.turnIndex
506
+ } : {}
507
+ };
508
+ }
509
+ };
510
+ }
370
511
  // Annotate the CommonJS export names for ESM import in node:
371
512
  0 && (module.exports = {
372
513
  applyStructuredChunk,
373
514
  consumeStream,
515
+ createFinalizedChatMessageAccumulator,
374
516
  createStructuredStreamAccumulator,
375
517
  failureChunk,
518
+ projectInterruptPiece,
376
519
  readStream,
377
520
  reduceStructuredChunks,
378
521
  streamError,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/browser.ts","../src/failure.ts","../src/client/consume-stream.ts","../src/client/read-stream.ts","../src/client/stream-from-route.ts","../src/structured/apply-structured-chunk.ts","../src/structured/structured-stream-accumulator.ts"],"sourcesContent":["export * from \"./failure\";\n// Browser-safe exports for client bundles.\n// Keep this file free of Node-only imports (fs, path, etc).\n\nexport type { ConsumeStreamHandlers } from \"./client/consume-stream\";\nexport { consumeStream } from \"./client/consume-stream\";\nexport { readStream } from \"./client/read-stream\";\nexport type { StreamFromRouteArgs } from \"./client/stream-from-route\";\nexport { streamFromRoute } from \"./client/stream-from-route\";\nexport * from \"./structured/apply-structured-chunk\";\nexport * from \"./structured/structured-stream-accumulator\";\nexport type { StreamChunk } from \"./types/stream-chunk\";\nexport type { StructuredDataChunk } from \"./types/structured-data\";\n","import {\n errorFromFailure,\n type FailureDescriptor,\n isFailureDescriptor,\n serializeFailure,\n} from \"@kortyx/core/errors\";\n\nexport function failureChunk(error: unknown): {\n type: \"error\";\n message: string;\n failure: FailureDescriptor;\n} {\n const failure = serializeFailure(error);\n return { type: \"error\", message: failure.message, failure };\n}\n\nexport function streamError(chunk: {\n message: string;\n failure?: unknown;\n}): Error {\n return isFailureDescriptor(chunk.failure)\n ? errorFromFailure(chunk.failure)\n : new Error(chunk.message || \"Stream error.\");\n}\n","import { streamError } from \"../failure\";\nimport 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?.(streamError(chunk), chunk);\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 {\n isFailureDescriptor,\n KortyxError,\n serializeFailure,\n} from \"@kortyx/core/errors\";\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 let sawData = false;\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer = (buffer + decoder.decode(value, { stream: true })).replaceAll(\n \"\\r\\n\",\n \"\\n\",\n );\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 sawData = true;\n const payload = part.slice(6);\n if (payload.trim() === \"[DONE]\") return;\n try {\n const chunk = JSON.parse(payload) as StreamChunk;\n if (\n !chunk ||\n typeof chunk !== \"object\" ||\n typeof chunk.type !== \"string\"\n )\n throw new Error(\"Invalid event\");\n if (chunk.type === \"error\") {\n if (\n typeof chunk.message !== \"string\" ||\n (chunk.failure !== undefined &&\n !isFailureDescriptor(chunk.failure))\n )\n throw new Error(\"Invalid failure event\");\n if (chunk.failure) chunk.failure = serializeFailure(chunk.failure);\n }\n yield chunk;\n if (chunk.type === \"done\") return;\n } catch (err) {\n throw new KortyxError(\n \"MALFORMED_STREAM\",\n \"Invalid JSON or event in stream.\",\n {\n category: \"transport\",\n retryable: false,\n safeMessage: \"The response stream contained an invalid event.\",\n cause: err,\n },\n );\n }\n }\n }\n if (buffer.trim() || sawData)\n throw new KortyxError(\n \"TRUNCATED_STREAM\",\n \"Stream ended with an incomplete event.\",\n {\n category: \"transport\",\n retryable: null,\n safeMessage: \"The response stream ended before an event completed.\",\n },\n );\n } finally {\n await reader.cancel().catch(() => {});\n reader.releaseLock();\n }\n}\n","import {\n errorFromFailure,\n isFailureDescriptor,\n KortyxError,\n} from \"@kortyx/core/errors\";\nimport { failureChunk } from \"../failure\";\nimport 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 readErrorMessage = async (response: Response): Promise<Error> => {\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 \"failure\" in payload &&\n isFailureDescriptor(payload.failure)\n )\n return errorFromFailure(payload.failure);\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 new KortyxError(\"HTTP_REQUEST_FAILED\", message, {\n category: \"transport\",\n status: response.status,\n safeMessage: message,\n });\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 if (args.signal?.aborted) throw error;\n yield failureChunk(\n new KortyxError(\"NETWORK_ERROR\", \"Network request failed.\", {\n category: \"transport\",\n cause: error,\n safeMessage: \"The request could not reach the server.\",\n }),\n );\n yield { type: \"done\" };\n return;\n }\n\n if (!response.ok) {\n yield failureChunk(await readErrorMessage(response));\n yield { type: \"done\" };\n return;\n }\n\n yield* readStream(response.body);\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"],"mappings":"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","names":["import_errors","import_errors"]}
1
+ {"version":3,"sources":["../src/browser.ts","../src/failure.ts","../src/client/consume-stream.ts","../src/client/read-stream.ts","../src/client/stream-from-route.ts","../src/structured/apply-structured-chunk.ts","../src/structured/structured-stream-accumulator.ts","../src/structured/finalized-chat-message.ts"],"sourcesContent":["export * from \"./failure\";\n// Browser-safe exports for client bundles.\n// Keep this file free of Node-only imports (fs, path, etc).\n\nexport type { ConsumeStreamHandlers } from \"./client/consume-stream\";\nexport { consumeStream } from \"./client/consume-stream\";\nexport { readStream } from \"./client/read-stream\";\nexport type { StreamFromRouteArgs } from \"./client/stream-from-route\";\nexport { streamFromRoute } from \"./client/stream-from-route\";\nexport * from \"./structured/apply-structured-chunk\";\nexport * from \"./structured/finalized-chat-message\";\nexport * from \"./structured/structured-stream-accumulator\";\nexport type { StreamChunk } from \"./types/stream-chunk\";\nexport type { StructuredDataChunk } from \"./types/structured-data\";\n","import {\n errorFromFailure,\n type FailureDescriptor,\n isFailureDescriptor,\n serializeFailure,\n} from \"@kortyx/core/errors\";\n\nexport function failureChunk(error: unknown): {\n type: \"error\";\n message: string;\n failure: FailureDescriptor;\n} {\n const failure = serializeFailure(error);\n return { type: \"error\", message: failure.message, failure };\n}\n\nexport function streamError(chunk: {\n message: string;\n failure?: unknown;\n}): Error {\n return isFailureDescriptor(chunk.failure)\n ? errorFromFailure(chunk.failure)\n : new Error(chunk.message || \"Stream error.\");\n}\n","import { streamError } from \"../failure\";\nimport 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?.(streamError(chunk), chunk);\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 {\n isFailureDescriptor,\n KortyxError,\n serializeFailure,\n} from \"@kortyx/core/errors\";\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 let sawData = false;\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer = (buffer + decoder.decode(value, { stream: true })).replaceAll(\n \"\\r\\n\",\n \"\\n\",\n );\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 sawData = true;\n const payload = part.slice(6);\n if (payload.trim() === \"[DONE]\") return;\n try {\n const chunk = JSON.parse(payload) as StreamChunk;\n if (\n !chunk ||\n typeof chunk !== \"object\" ||\n typeof chunk.type !== \"string\"\n )\n throw new Error(\"Invalid event\");\n if (chunk.type === \"error\") {\n if (\n typeof chunk.message !== \"string\" ||\n (chunk.failure !== undefined &&\n !isFailureDescriptor(chunk.failure))\n )\n throw new Error(\"Invalid failure event\");\n if (chunk.failure) chunk.failure = serializeFailure(chunk.failure);\n }\n yield chunk;\n if (chunk.type === \"done\") return;\n } catch (err) {\n throw new KortyxError(\n \"MALFORMED_STREAM\",\n \"Invalid JSON or event in stream.\",\n {\n category: \"transport\",\n retryable: false,\n safeMessage: \"The response stream contained an invalid event.\",\n cause: err,\n },\n );\n }\n }\n }\n if (buffer.trim() || sawData)\n throw new KortyxError(\n \"TRUNCATED_STREAM\",\n \"Stream ended with an incomplete event.\",\n {\n category: \"transport\",\n retryable: null,\n safeMessage: \"The response stream ended before an event completed.\",\n },\n );\n } finally {\n await reader.cancel().catch(() => {});\n reader.releaseLock();\n }\n}\n","import {\n errorFromFailure,\n isFailureDescriptor,\n KortyxError,\n} from \"@kortyx/core/errors\";\nimport { failureChunk } from \"../failure\";\nimport 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 readErrorMessage = async (response: Response): Promise<Error> => {\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 \"failure\" in payload &&\n isFailureDescriptor(payload.failure)\n )\n return errorFromFailure(payload.failure);\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 new KortyxError(\"HTTP_REQUEST_FAILED\", message, {\n category: \"transport\",\n status: response.status,\n safeMessage: message,\n });\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 if (args.signal?.aborted) throw error;\n yield failureChunk(\n new KortyxError(\"NETWORK_ERROR\", \"Network request failed.\", {\n category: \"transport\",\n cause: error,\n safeMessage: \"The request could not reach the server.\",\n }),\n );\n yield { type: \"done\" };\n return;\n }\n\n if (!response.ok) {\n yield failureChunk(await readErrorMessage(response));\n yield { type: \"done\" };\n return;\n }\n\n yield* readStream(response.body);\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 (chunk.type === \"structured-data-invalidated\") {\n states.delete(chunk.streamId);\n return undefined;\n }\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 type { FailureDescriptor } from \"@kortyx/core/errors\";\nimport type { StreamChunk } from \"../types/stream-chunk\";\nimport type { StructuredStreamState } from \"./apply-structured-chunk\";\nimport { createStructuredStreamAccumulator } from \"./structured-stream-accumulator\";\n\nexport type FinalizedChatContentPiece =\n | { id: string; type: \"text\"; content: string }\n | {\n id: string;\n type: \"structured\";\n data: StructuredStreamState<Record<string, unknown>>;\n }\n | { id: string; type: \"error\"; content: string; failure?: FailureDescriptor }\n | {\n id: string;\n type: \"interrupt\";\n resumeToken: string;\n requestId: string;\n kind: \"text\" | \"choice\" | \"multi-choice\" | \"custom\";\n question?: string;\n multiple: boolean;\n options: Array<{ id: string; label: string; description?: string }>;\n schemaId?: string;\n schemaVersion?: string;\n contract?: string;\n request?: unknown;\n interruptId?: string;\n meta?: Record<string, unknown>;\n };\n\nexport type FinalizedChatMessage = {\n id: string;\n role: \"assistant\";\n content: string;\n contentPieces: FinalizedChatContentPiece[];\n checkpointId?: string;\n checkpointTurnIndex?: number;\n};\n\ntype TextChunk = Extract<\n StreamChunk,\n { type: \"text-start\" | \"text-delta\" | \"text-end\" }\n>;\ntype InterruptChunk = Extract<StreamChunk, { type: \"interrupt\" }>;\n\nconst textStreamKey = (chunk: TextChunk): string => {\n const op = chunk.opId?.trim();\n const segment = chunk.segmentId?.trim();\n if (segment) return op ? `${op}:${segment}` : segment;\n if (op) return `${op}:${chunk.node ?? \"__unknown__\"}`;\n return chunk.node ?? \"__unknown__\";\n};\n\n/** Shared default interrupt projection for server snapshots and React. */\nexport function projectInterruptPiece(\n chunk: InterruptChunk,\n id: string,\n): Extract<FinalizedChatContentPiece, { type: \"interrupt\" }> {\n const input = chunk.input;\n const schemaId = chunk.schemaId ?? input.schemaId;\n const schemaVersion = chunk.schemaVersion ?? input.schemaVersion;\n const interruptId = chunk.id ?? input.id;\n return {\n id,\n type: \"interrupt\",\n resumeToken: chunk.resumeToken,\n requestId: chunk.requestId,\n kind: input.kind,\n ...(input.question !== undefined ? { question: input.question } : {}),\n multiple: input.multiple,\n options: (input.options ?? []).map((option) => ({\n id: option.id,\n label: option.label,\n ...(option.description ? { description: option.description } : {}),\n })),\n ...(schemaId ? { schemaId } : {}),\n ...(schemaVersion ? { schemaVersion } : {}),\n ...(input.kind === \"custom\" && input.contract\n ? { contract: input.contract }\n : {}),\n ...(input.kind === \"custom\" ? { request: input.request } : {}),\n ...(interruptId ? { interruptId } : {}),\n ...(input.meta || chunk.meta\n ? { meta: { ...(input.meta ?? {}), ...(chunk.meta ?? {}) } }\n : {}),\n };\n}\n\n/** Accumulates emitted UI chunks without consuming the HTTP response. */\nexport function createFinalizedChatMessageAccumulator(clientTurnId: string) {\n const pieces: FinalizedChatContentPiece[] = [];\n const textIndexes = new Map<string, number>();\n const structured =\n createStructuredStreamAccumulator<Record<string, unknown>>();\n let sawTextDelta = false;\n let checkpoint: { id: string; turnIndex: number } | undefined;\n\n const ensureText = (key: string) => {\n const existing = textIndexes.get(key);\n if (existing !== undefined) return existing;\n const index = pieces.length;\n pieces.push({\n id: `${clientTurnId}:text:${key}`,\n type: \"text\",\n content: \"\",\n });\n textIndexes.set(key, index);\n return index;\n };\n\n return {\n apply(chunk: StreamChunk): void {\n switch (chunk.type) {\n case \"checkpoint\":\n checkpoint = { id: chunk.id, turnIndex: chunk.turnIndex };\n break;\n case \"text-start\":\n ensureText(textStreamKey(chunk));\n break;\n case \"text-delta\": {\n sawTextDelta = true;\n const index = ensureText(textStreamKey(chunk));\n const current = pieces[index] as Extract<\n FinalizedChatContentPiece,\n { type: \"text\" }\n >;\n pieces[index] = {\n ...current,\n content: current.content + chunk.delta,\n };\n break;\n }\n case \"message\":\n if (!sawTextDelta) {\n pieces.push({\n id: `${clientTurnId}:message:${pieces.length}`,\n type: \"text\",\n content: chunk.content,\n });\n }\n break;\n case \"structured-data\": {\n const data = structured.apply(chunk);\n const id = `${clientTurnId}:structured:${chunk.streamId}`;\n const index = pieces.findIndex((piece) => piece.id === id);\n const piece = { id, type: \"structured\", data } as const;\n if (index < 0) pieces.push(piece);\n else pieces[index] = piece;\n break;\n }\n case \"structured-data-invalidated\": {\n structured.delete(chunk.streamId);\n const index = pieces.findIndex(\n (piece) =>\n piece.id === `${clientTurnId}:structured:${chunk.streamId}`,\n );\n if (index >= 0) pieces.splice(index, 1);\n break;\n }\n case \"interrupt\":\n pieces.push(\n projectInterruptPiece(\n chunk,\n `${clientTurnId}:interrupt:${chunk.requestId}`,\n ),\n );\n break;\n case \"error\":\n pieces.push({\n id: `${clientTurnId}:error:${pieces.length}`,\n type: \"error\",\n content: chunk.message,\n ...(chunk.failure ? { failure: chunk.failure } : {}),\n });\n break;\n }\n },\n message(): FinalizedChatMessage {\n const contentPieces = pieces.filter(\n (piece) => piece.type !== \"text\" || piece.content.length > 0,\n );\n return {\n id: `${clientTurnId}:assistant`,\n role: \"assistant\",\n content: contentPieces\n .filter(\n (\n piece,\n ): piece is Extract<FinalizedChatContentPiece, { type: \"text\" }> =>\n piece.type === \"text\",\n )\n .map((piece) => piece.content)\n .join(\"\"),\n contentPieces: contentPieces.map((piece) => ({ ...piece })),\n ...(checkpoint\n ? {\n checkpointId: checkpoint.id,\n checkpointTurnIndex: checkpoint.turnIndex,\n }\n : {}),\n };\n },\n };\n}\n"],"mappings":"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","names":["import_errors","import_errors","piece"]}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { S as StreamChunk, a as StructuredDataChunk } from './browser-BFBys6ZN.js';
2
- export { C as ConsumeStreamHandlers, b as StreamChunkSchema, c as StreamFromRouteArgs, d as StructuredDataChunkSchema, e as StructuredStreamAccumulator, f as StructuredStreamState, g as applyStructuredChunk, h as consumeStream, i as createStructuredStreamAccumulator, j as failureChunk, r as readStream, k as reduceStructuredChunks, s as streamError, l as streamFromRoute } from './browser-BFBys6ZN.js';
1
+ import { S as StreamChunk, a as StructuredDataChunk } from './browser-CW1oLh9K.js';
2
+ export { C as ConsumeStreamHandlers, F as FinalizedChatContentPiece, b as FinalizedChatMessage, c as StreamChunkSchema, d as StreamFromRouteArgs, e as StructuredDataChunkSchema, f as StructuredStreamAccumulator, g as StructuredStreamState, h as applyStructuredChunk, i as consumeStream, j as createFinalizedChatMessageAccumulator, k as createStructuredStreamAccumulator, l as failureChunk, p as projectInterruptPiece, r as readStream, m as reduceStructuredChunks, s as streamError, n as streamFromRoute } from './browser-CW1oLh9K.js';
3
3
  import '@kortyx/core/errors';
4
4
  import 'zod';
5
5
 
package/dist/index.js CHANGED
@@ -26,9 +26,11 @@ __export(index_exports, {
26
26
  collectBufferedStream: () => collectBufferedStream,
27
27
  collectStream: () => collectStream,
28
28
  consumeStream: () => consumeStream,
29
+ createFinalizedChatMessageAccumulator: () => createFinalizedChatMessageAccumulator,
29
30
  createStreamResponse: () => createStreamResponse,
30
31
  createStructuredStreamAccumulator: () => createStructuredStreamAccumulator,
31
32
  failureChunk: () => failureChunk,
33
+ projectInterruptPiece: () => projectInterruptPiece,
32
34
  readStream: () => readStream,
33
35
  reduceStructuredChunks: () => reduceStructuredChunks,
34
36
  streamError: () => streamError,
@@ -478,6 +480,10 @@ function createStructuredStreamAccumulator(initialChunks = []) {
478
480
  return {
479
481
  apply,
480
482
  applyStreamChunk: (chunk) => {
483
+ if (chunk.type === "structured-data-invalidated") {
484
+ states.delete(chunk.streamId);
485
+ return void 0;
486
+ }
481
487
  if (!isStructuredDataChunk(chunk)) return void 0;
482
488
  return apply(chunk);
483
489
  },
@@ -494,6 +500,141 @@ function createStructuredStreamAccumulator(initialChunks = []) {
494
500
  };
495
501
  }
496
502
 
503
+ // src/structured/finalized-chat-message.ts
504
+ var textStreamKey = (chunk) => {
505
+ const op = chunk.opId?.trim();
506
+ const segment = chunk.segmentId?.trim();
507
+ if (segment) return op ? `${op}:${segment}` : segment;
508
+ if (op) return `${op}:${chunk.node ?? "__unknown__"}`;
509
+ return chunk.node ?? "__unknown__";
510
+ };
511
+ function projectInterruptPiece(chunk, id) {
512
+ const input = chunk.input;
513
+ const schemaId = chunk.schemaId ?? input.schemaId;
514
+ const schemaVersion = chunk.schemaVersion ?? input.schemaVersion;
515
+ const interruptId = chunk.id ?? input.id;
516
+ return {
517
+ id,
518
+ type: "interrupt",
519
+ resumeToken: chunk.resumeToken,
520
+ requestId: chunk.requestId,
521
+ kind: input.kind,
522
+ ...input.question !== void 0 ? { question: input.question } : {},
523
+ multiple: input.multiple,
524
+ options: (input.options ?? []).map((option) => ({
525
+ id: option.id,
526
+ label: option.label,
527
+ ...option.description ? { description: option.description } : {}
528
+ })),
529
+ ...schemaId ? { schemaId } : {},
530
+ ...schemaVersion ? { schemaVersion } : {},
531
+ ...input.kind === "custom" && input.contract ? { contract: input.contract } : {},
532
+ ...input.kind === "custom" ? { request: input.request } : {},
533
+ ...interruptId ? { interruptId } : {},
534
+ ...input.meta || chunk.meta ? { meta: { ...input.meta ?? {}, ...chunk.meta ?? {} } } : {}
535
+ };
536
+ }
537
+ function createFinalizedChatMessageAccumulator(clientTurnId) {
538
+ const pieces = [];
539
+ const textIndexes = /* @__PURE__ */ new Map();
540
+ const structured = createStructuredStreamAccumulator();
541
+ let sawTextDelta = false;
542
+ let checkpoint;
543
+ const ensureText = (key) => {
544
+ const existing = textIndexes.get(key);
545
+ if (existing !== void 0) return existing;
546
+ const index = pieces.length;
547
+ pieces.push({
548
+ id: `${clientTurnId}:text:${key}`,
549
+ type: "text",
550
+ content: ""
551
+ });
552
+ textIndexes.set(key, index);
553
+ return index;
554
+ };
555
+ return {
556
+ apply(chunk) {
557
+ switch (chunk.type) {
558
+ case "checkpoint":
559
+ checkpoint = { id: chunk.id, turnIndex: chunk.turnIndex };
560
+ break;
561
+ case "text-start":
562
+ ensureText(textStreamKey(chunk));
563
+ break;
564
+ case "text-delta": {
565
+ sawTextDelta = true;
566
+ const index = ensureText(textStreamKey(chunk));
567
+ const current = pieces[index];
568
+ pieces[index] = {
569
+ ...current,
570
+ content: current.content + chunk.delta
571
+ };
572
+ break;
573
+ }
574
+ case "message":
575
+ if (!sawTextDelta) {
576
+ pieces.push({
577
+ id: `${clientTurnId}:message:${pieces.length}`,
578
+ type: "text",
579
+ content: chunk.content
580
+ });
581
+ }
582
+ break;
583
+ case "structured-data": {
584
+ const data = structured.apply(chunk);
585
+ const id = `${clientTurnId}:structured:${chunk.streamId}`;
586
+ const index = pieces.findIndex((piece2) => piece2.id === id);
587
+ const piece = { id, type: "structured", data };
588
+ if (index < 0) pieces.push(piece);
589
+ else pieces[index] = piece;
590
+ break;
591
+ }
592
+ case "structured-data-invalidated": {
593
+ structured.delete(chunk.streamId);
594
+ const index = pieces.findIndex(
595
+ (piece) => piece.id === `${clientTurnId}:structured:${chunk.streamId}`
596
+ );
597
+ if (index >= 0) pieces.splice(index, 1);
598
+ break;
599
+ }
600
+ case "interrupt":
601
+ pieces.push(
602
+ projectInterruptPiece(
603
+ chunk,
604
+ `${clientTurnId}:interrupt:${chunk.requestId}`
605
+ )
606
+ );
607
+ break;
608
+ case "error":
609
+ pieces.push({
610
+ id: `${clientTurnId}:error:${pieces.length}`,
611
+ type: "error",
612
+ content: chunk.message,
613
+ ...chunk.failure ? { failure: chunk.failure } : {}
614
+ });
615
+ break;
616
+ }
617
+ },
618
+ message() {
619
+ const contentPieces = pieces.filter(
620
+ (piece) => piece.type !== "text" || piece.content.length > 0
621
+ );
622
+ return {
623
+ id: `${clientTurnId}:assistant`,
624
+ role: "assistant",
625
+ content: contentPieces.filter(
626
+ (piece) => piece.type === "text"
627
+ ).map((piece) => piece.content).join(""),
628
+ contentPieces: contentPieces.map((piece) => ({ ...piece })),
629
+ ...checkpoint ? {
630
+ checkpointId: checkpoint.id,
631
+ checkpointTurnIndex: checkpoint.turnIndex
632
+ } : {}
633
+ };
634
+ }
635
+ };
636
+ }
637
+
497
638
  // src/types/stream-chunk.ts
498
639
  var import_errors4 = require("@kortyx/core/errors");
499
640
  var import_zod2 = require("zod");
@@ -552,7 +693,7 @@ var StreamChunkSchema = import_zod2.z.union([
552
693
  import_zod2.z.object({
553
694
  type: import_zod2.z.literal("structured-data-invalidated"),
554
695
  streamId: import_zod2.z.string(),
555
- checkpointId: import_zod2.z.string()
696
+ checkpointId: import_zod2.z.string().optional()
556
697
  }),
557
698
  import_zod2.z.object({
558
699
  type: import_zod2.z.literal("trace"),
@@ -723,9 +864,11 @@ var StreamChunkSchema = import_zod2.z.union([
723
864
  collectBufferedStream,
724
865
  collectStream,
725
866
  consumeStream,
867
+ createFinalizedChatMessageAccumulator,
726
868
  createStreamResponse,
727
869
  createStructuredStreamAccumulator,
728
870
  failureChunk,
871
+ projectInterruptPiece,
729
872
  readStream,
730
873
  reduceStructuredChunks,
731
874
  streamError,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/failure.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":["export * from \"./failure\";\n// 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 {\n errorFromFailure,\n type FailureDescriptor,\n isFailureDescriptor,\n serializeFailure,\n} from \"@kortyx/core/errors\";\n\nexport function failureChunk(error: unknown): {\n type: \"error\";\n message: string;\n failure: FailureDescriptor;\n} {\n const failure = serializeFailure(error);\n return { type: \"error\", message: failure.message, failure };\n}\n\nexport function streamError(chunk: {\n message: string;\n failure?: unknown;\n}): Error {\n return isFailureDescriptor(chunk.failure)\n ? errorFromFailure(chunk.failure)\n : new Error(chunk.message || \"Stream error.\");\n}\n","import { streamError } from \"../failure\";\nimport 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?.(streamError(chunk), chunk);\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 {\n isFailureDescriptor,\n KortyxError,\n serializeFailure,\n} from \"@kortyx/core/errors\";\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 let sawData = false;\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer = (buffer + decoder.decode(value, { stream: true })).replaceAll(\n \"\\r\\n\",\n \"\\n\",\n );\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 sawData = true;\n const payload = part.slice(6);\n if (payload.trim() === \"[DONE]\") return;\n try {\n const chunk = JSON.parse(payload) as StreamChunk;\n if (\n !chunk ||\n typeof chunk !== \"object\" ||\n typeof chunk.type !== \"string\"\n )\n throw new Error(\"Invalid event\");\n if (chunk.type === \"error\") {\n if (\n typeof chunk.message !== \"string\" ||\n (chunk.failure !== undefined &&\n !isFailureDescriptor(chunk.failure))\n )\n throw new Error(\"Invalid failure event\");\n if (chunk.failure) chunk.failure = serializeFailure(chunk.failure);\n }\n yield chunk;\n if (chunk.type === \"done\") return;\n } catch (err) {\n throw new KortyxError(\n \"MALFORMED_STREAM\",\n \"Invalid JSON or event in stream.\",\n {\n category: \"transport\",\n retryable: false,\n safeMessage: \"The response stream contained an invalid event.\",\n cause: err,\n },\n );\n }\n }\n }\n if (buffer.trim() || sawData)\n throw new KortyxError(\n \"TRUNCATED_STREAM\",\n \"Stream ended with an incomplete event.\",\n {\n category: \"transport\",\n retryable: null,\n safeMessage: \"The response stream ended before an event completed.\",\n },\n );\n } finally {\n await reader.cancel().catch(() => {});\n reader.releaseLock();\n }\n}\n","import {\n errorFromFailure,\n isFailureDescriptor,\n KortyxError,\n} from \"@kortyx/core/errors\";\nimport { failureChunk } from \"../failure\";\nimport 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 readErrorMessage = async (response: Response): Promise<Error> => {\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 \"failure\" in payload &&\n isFailureDescriptor(payload.failure)\n )\n return errorFromFailure(payload.failure);\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 new KortyxError(\"HTTP_REQUEST_FAILED\", message, {\n category: \"transport\",\n status: response.status,\n safeMessage: message,\n });\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 if (args.signal?.aborted) throw error;\n yield failureChunk(\n new KortyxError(\"NETWORK_ERROR\", \"Network request failed.\", {\n category: \"transport\",\n cause: error,\n safeMessage: \"The request could not reach the server.\",\n }),\n );\n yield { type: \"done\" };\n return;\n }\n\n if (!response.ok) {\n yield failureChunk(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\nconst getTextStreamId = (\n chunk: Extract<StreamChunk, { type: \"text-delta\" }>,\n) => {\n const opId =\n typeof chunk.opId === \"string\" && chunk.opId.length > 0\n ? chunk.opId\n : undefined;\n const segmentId =\n typeof chunk.segmentId === \"string\" && chunk.segmentId.length > 0\n ? chunk.segmentId\n : undefined;\n\n if (opId && segmentId) return `${opId}:${segmentId}`;\n return segmentId || opId || chunk.id || chunk.node;\n};\n\nconst appendTextDelta = (\n text: string,\n delta: string,\n streamId: string | undefined,\n lastStreamId: string | undefined,\n) => {\n if (\n streamId &&\n lastStreamId &&\n streamId !== lastStreamId &&\n text.length > 0 &&\n !/\\s$/.test(text) &&\n !/^\\s/.test(delta)\n ) {\n return `${text} ${delta}`;\n }\n\n return text + delta;\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 let lastTextStreamId: string | undefined;\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 const streamId = getTextStreamId(chunk);\n text = appendTextDelta(text, chunk.delta, streamId, lastTextStreamId);\n if (streamId) lastTextStreamId = streamId;\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","import { failureChunk } from \"../failure\";\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/** Bridge stream cancellation to the source, including Node execution streams. */\nexport function createStreamResponse(\n stream: AsyncIterable<StreamChunk>,\n): Response {\n let cancelled = false;\n const iterator = stream[Symbol.asyncIterator]();\n const readable = new ReadableStream<StreamChunk>({\n async start(controller) {\n try {\n while (!cancelled) {\n const next = await iterator.next();\n if (cancelled || next.done) break;\n controller.enqueue(next.value);\n }\n } catch (error) {\n if (!cancelled) {\n controller.enqueue(failureChunk(error));\n controller.enqueue({ type: \"done\" });\n }\n } finally {\n if (!cancelled) controller.close();\n }\n },\n cancel() {\n cancelled = true;\n // Destroying an active Kortyx stream signals its transient execution controller.\n (\n stream as AsyncIterable<StreamChunk> & { destroy?: () => void }\n ).destroy?.();\n void Promise.resolve(iterator.return?.()).catch(() => {});\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 {\n type FailureDescriptor,\n isFailureDescriptor,\n serializeFailure,\n} from \"@kortyx/core/errors\";\nimport { 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(\"checkpoint\"),\n id: z.string(),\n sessionId: z.string(),\n turnIndex: z.number().int().nonnegative(),\n label: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"structured-data-invalidated\"),\n streamId: z.string(),\n checkpointId: z.string(),\n }),\n z.object({\n type: z.literal(\"trace\"),\n traceId: z.string(),\n spanId: z.string(),\n runId: z.string(),\n rootSpanName: z.literal(\"kortyx.run\"),\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 z.object({\n type: z.literal(\"tool-call-start\"),\n tool: z.string(),\n toolCallId: z.string(),\n node: z.string().optional(),\n id: z.string().optional(),\n opId: z.string().optional(),\n input: z.unknown().optional(),\n }),\n z.object({\n type: z.literal(\"tool-call-result\"),\n tool: z.string(),\n toolCallId: z.string(),\n node: z.string().optional(),\n id: z.string().optional(),\n opId: z.string().optional(),\n content: z.unknown(),\n structuredContent: z.unknown().optional(),\n isError: z.boolean().optional(),\n }),\n z.object({\n type: z.literal(\"tool-call-error\"),\n failure: z\n .custom<FailureDescriptor>(isFailureDescriptor)\n .transform(serializeFailure)\n .optional(),\n tool: z.string(),\n toolCallId: z.string(),\n node: z.string().optional(),\n id: z.string().optional(),\n opId: z.string().optional(),\n message: z.string(),\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 z.object({\n kind: z.literal(\"custom\"),\n multiple: z.literal(false),\n question: z.string().optional(),\n contract: z.string().optional(),\n request: z.unknown(),\n id: z.string().optional(),\n schemaId: z.string(),\n schemaVersion: z.string(),\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({\n type: z.literal(\"limit-reached\"),\n runId: z.string(),\n limit: z.enum([\n \"maxNodeExecutions\",\n \"maxModelPasses\",\n \"maxToolCalls\",\n \"maxChildInvocations\",\n ]),\n maximum: z.number(),\n consumed: z.number(),\n }),\n z.object({\n type: z.literal(\"cancelled\"),\n runId: z.string(),\n reason: z.string(),\n }),\n z.object({ type: z.literal(\"done\"), data: z.any().optional() }),\n z.object({\n type: z.literal(\"error\"),\n message: z.string(),\n failure: z\n .custom<FailureDescriptor>(isFailureDescriptor)\n .transform(serializeFailure)\n .optional(),\n }),\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":["import_errors","import_errors","import_errors","import_zod"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/failure.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/structured/finalized-chat-message.ts","../src/types/stream-chunk.ts","../src/types/structured-data/index.ts"],"sourcesContent":["export * from \"./failure\";\n// 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/finalized-chat-message\";\nexport * from \"./structured/structured-stream-accumulator\";\nexport * from \"./types/stream-chunk\";\nexport * from \"./types/structured-data\";\n","import {\n errorFromFailure,\n type FailureDescriptor,\n isFailureDescriptor,\n serializeFailure,\n} from \"@kortyx/core/errors\";\n\nexport function failureChunk(error: unknown): {\n type: \"error\";\n message: string;\n failure: FailureDescriptor;\n} {\n const failure = serializeFailure(error);\n return { type: \"error\", message: failure.message, failure };\n}\n\nexport function streamError(chunk: {\n message: string;\n failure?: unknown;\n}): Error {\n return isFailureDescriptor(chunk.failure)\n ? errorFromFailure(chunk.failure)\n : new Error(chunk.message || \"Stream error.\");\n}\n","import { streamError } from \"../failure\";\nimport 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?.(streamError(chunk), chunk);\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 {\n isFailureDescriptor,\n KortyxError,\n serializeFailure,\n} from \"@kortyx/core/errors\";\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 let sawData = false;\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer = (buffer + decoder.decode(value, { stream: true })).replaceAll(\n \"\\r\\n\",\n \"\\n\",\n );\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 sawData = true;\n const payload = part.slice(6);\n if (payload.trim() === \"[DONE]\") return;\n try {\n const chunk = JSON.parse(payload) as StreamChunk;\n if (\n !chunk ||\n typeof chunk !== \"object\" ||\n typeof chunk.type !== \"string\"\n )\n throw new Error(\"Invalid event\");\n if (chunk.type === \"error\") {\n if (\n typeof chunk.message !== \"string\" ||\n (chunk.failure !== undefined &&\n !isFailureDescriptor(chunk.failure))\n )\n throw new Error(\"Invalid failure event\");\n if (chunk.failure) chunk.failure = serializeFailure(chunk.failure);\n }\n yield chunk;\n if (chunk.type === \"done\") return;\n } catch (err) {\n throw new KortyxError(\n \"MALFORMED_STREAM\",\n \"Invalid JSON or event in stream.\",\n {\n category: \"transport\",\n retryable: false,\n safeMessage: \"The response stream contained an invalid event.\",\n cause: err,\n },\n );\n }\n }\n }\n if (buffer.trim() || sawData)\n throw new KortyxError(\n \"TRUNCATED_STREAM\",\n \"Stream ended with an incomplete event.\",\n {\n category: \"transport\",\n retryable: null,\n safeMessage: \"The response stream ended before an event completed.\",\n },\n );\n } finally {\n await reader.cancel().catch(() => {});\n reader.releaseLock();\n }\n}\n","import {\n errorFromFailure,\n isFailureDescriptor,\n KortyxError,\n} from \"@kortyx/core/errors\";\nimport { failureChunk } from \"../failure\";\nimport 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 readErrorMessage = async (response: Response): Promise<Error> => {\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 \"failure\" in payload &&\n isFailureDescriptor(payload.failure)\n )\n return errorFromFailure(payload.failure);\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 new KortyxError(\"HTTP_REQUEST_FAILED\", message, {\n category: \"transport\",\n status: response.status,\n safeMessage: message,\n });\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 if (args.signal?.aborted) throw error;\n yield failureChunk(\n new KortyxError(\"NETWORK_ERROR\", \"Network request failed.\", {\n category: \"transport\",\n cause: error,\n safeMessage: \"The request could not reach the server.\",\n }),\n );\n yield { type: \"done\" };\n return;\n }\n\n if (!response.ok) {\n yield failureChunk(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\nconst getTextStreamId = (\n chunk: Extract<StreamChunk, { type: \"text-delta\" }>,\n) => {\n const opId =\n typeof chunk.opId === \"string\" && chunk.opId.length > 0\n ? chunk.opId\n : undefined;\n const segmentId =\n typeof chunk.segmentId === \"string\" && chunk.segmentId.length > 0\n ? chunk.segmentId\n : undefined;\n\n if (opId && segmentId) return `${opId}:${segmentId}`;\n return segmentId || opId || chunk.id || chunk.node;\n};\n\nconst appendTextDelta = (\n text: string,\n delta: string,\n streamId: string | undefined,\n lastStreamId: string | undefined,\n) => {\n if (\n streamId &&\n lastStreamId &&\n streamId !== lastStreamId &&\n text.length > 0 &&\n !/\\s$/.test(text) &&\n !/^\\s/.test(delta)\n ) {\n return `${text} ${delta}`;\n }\n\n return text + delta;\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 let lastTextStreamId: string | undefined;\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 const streamId = getTextStreamId(chunk);\n text = appendTextDelta(text, chunk.delta, streamId, lastTextStreamId);\n if (streamId) lastTextStreamId = streamId;\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","import { failureChunk } from \"../failure\";\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/** Bridge stream cancellation to the source, including Node execution streams. */\nexport function createStreamResponse(\n stream: AsyncIterable<StreamChunk>,\n): Response {\n let cancelled = false;\n const iterator = stream[Symbol.asyncIterator]();\n const readable = new ReadableStream<StreamChunk>({\n async start(controller) {\n try {\n while (!cancelled) {\n const next = await iterator.next();\n if (cancelled || next.done) break;\n controller.enqueue(next.value);\n }\n } catch (error) {\n if (!cancelled) {\n controller.enqueue(failureChunk(error));\n controller.enqueue({ type: \"done\" });\n }\n } finally {\n if (!cancelled) controller.close();\n }\n },\n cancel() {\n cancelled = true;\n // Destroying an active Kortyx stream signals its transient execution controller.\n (\n stream as AsyncIterable<StreamChunk> & { destroy?: () => void }\n ).destroy?.();\n void Promise.resolve(iterator.return?.()).catch(() => {});\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 (chunk.type === \"structured-data-invalidated\") {\n states.delete(chunk.streamId);\n return undefined;\n }\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 type { FailureDescriptor } from \"@kortyx/core/errors\";\nimport type { StreamChunk } from \"../types/stream-chunk\";\nimport type { StructuredStreamState } from \"./apply-structured-chunk\";\nimport { createStructuredStreamAccumulator } from \"./structured-stream-accumulator\";\n\nexport type FinalizedChatContentPiece =\n | { id: string; type: \"text\"; content: string }\n | {\n id: string;\n type: \"structured\";\n data: StructuredStreamState<Record<string, unknown>>;\n }\n | { id: string; type: \"error\"; content: string; failure?: FailureDescriptor }\n | {\n id: string;\n type: \"interrupt\";\n resumeToken: string;\n requestId: string;\n kind: \"text\" | \"choice\" | \"multi-choice\" | \"custom\";\n question?: string;\n multiple: boolean;\n options: Array<{ id: string; label: string; description?: string }>;\n schemaId?: string;\n schemaVersion?: string;\n contract?: string;\n request?: unknown;\n interruptId?: string;\n meta?: Record<string, unknown>;\n };\n\nexport type FinalizedChatMessage = {\n id: string;\n role: \"assistant\";\n content: string;\n contentPieces: FinalizedChatContentPiece[];\n checkpointId?: string;\n checkpointTurnIndex?: number;\n};\n\ntype TextChunk = Extract<\n StreamChunk,\n { type: \"text-start\" | \"text-delta\" | \"text-end\" }\n>;\ntype InterruptChunk = Extract<StreamChunk, { type: \"interrupt\" }>;\n\nconst textStreamKey = (chunk: TextChunk): string => {\n const op = chunk.opId?.trim();\n const segment = chunk.segmentId?.trim();\n if (segment) return op ? `${op}:${segment}` : segment;\n if (op) return `${op}:${chunk.node ?? \"__unknown__\"}`;\n return chunk.node ?? \"__unknown__\";\n};\n\n/** Shared default interrupt projection for server snapshots and React. */\nexport function projectInterruptPiece(\n chunk: InterruptChunk,\n id: string,\n): Extract<FinalizedChatContentPiece, { type: \"interrupt\" }> {\n const input = chunk.input;\n const schemaId = chunk.schemaId ?? input.schemaId;\n const schemaVersion = chunk.schemaVersion ?? input.schemaVersion;\n const interruptId = chunk.id ?? input.id;\n return {\n id,\n type: \"interrupt\",\n resumeToken: chunk.resumeToken,\n requestId: chunk.requestId,\n kind: input.kind,\n ...(input.question !== undefined ? { question: input.question } : {}),\n multiple: input.multiple,\n options: (input.options ?? []).map((option) => ({\n id: option.id,\n label: option.label,\n ...(option.description ? { description: option.description } : {}),\n })),\n ...(schemaId ? { schemaId } : {}),\n ...(schemaVersion ? { schemaVersion } : {}),\n ...(input.kind === \"custom\" && input.contract\n ? { contract: input.contract }\n : {}),\n ...(input.kind === \"custom\" ? { request: input.request } : {}),\n ...(interruptId ? { interruptId } : {}),\n ...(input.meta || chunk.meta\n ? { meta: { ...(input.meta ?? {}), ...(chunk.meta ?? {}) } }\n : {}),\n };\n}\n\n/** Accumulates emitted UI chunks without consuming the HTTP response. */\nexport function createFinalizedChatMessageAccumulator(clientTurnId: string) {\n const pieces: FinalizedChatContentPiece[] = [];\n const textIndexes = new Map<string, number>();\n const structured =\n createStructuredStreamAccumulator<Record<string, unknown>>();\n let sawTextDelta = false;\n let checkpoint: { id: string; turnIndex: number } | undefined;\n\n const ensureText = (key: string) => {\n const existing = textIndexes.get(key);\n if (existing !== undefined) return existing;\n const index = pieces.length;\n pieces.push({\n id: `${clientTurnId}:text:${key}`,\n type: \"text\",\n content: \"\",\n });\n textIndexes.set(key, index);\n return index;\n };\n\n return {\n apply(chunk: StreamChunk): void {\n switch (chunk.type) {\n case \"checkpoint\":\n checkpoint = { id: chunk.id, turnIndex: chunk.turnIndex };\n break;\n case \"text-start\":\n ensureText(textStreamKey(chunk));\n break;\n case \"text-delta\": {\n sawTextDelta = true;\n const index = ensureText(textStreamKey(chunk));\n const current = pieces[index] as Extract<\n FinalizedChatContentPiece,\n { type: \"text\" }\n >;\n pieces[index] = {\n ...current,\n content: current.content + chunk.delta,\n };\n break;\n }\n case \"message\":\n if (!sawTextDelta) {\n pieces.push({\n id: `${clientTurnId}:message:${pieces.length}`,\n type: \"text\",\n content: chunk.content,\n });\n }\n break;\n case \"structured-data\": {\n const data = structured.apply(chunk);\n const id = `${clientTurnId}:structured:${chunk.streamId}`;\n const index = pieces.findIndex((piece) => piece.id === id);\n const piece = { id, type: \"structured\", data } as const;\n if (index < 0) pieces.push(piece);\n else pieces[index] = piece;\n break;\n }\n case \"structured-data-invalidated\": {\n structured.delete(chunk.streamId);\n const index = pieces.findIndex(\n (piece) =>\n piece.id === `${clientTurnId}:structured:${chunk.streamId}`,\n );\n if (index >= 0) pieces.splice(index, 1);\n break;\n }\n case \"interrupt\":\n pieces.push(\n projectInterruptPiece(\n chunk,\n `${clientTurnId}:interrupt:${chunk.requestId}`,\n ),\n );\n break;\n case \"error\":\n pieces.push({\n id: `${clientTurnId}:error:${pieces.length}`,\n type: \"error\",\n content: chunk.message,\n ...(chunk.failure ? { failure: chunk.failure } : {}),\n });\n break;\n }\n },\n message(): FinalizedChatMessage {\n const contentPieces = pieces.filter(\n (piece) => piece.type !== \"text\" || piece.content.length > 0,\n );\n return {\n id: `${clientTurnId}:assistant`,\n role: \"assistant\",\n content: contentPieces\n .filter(\n (\n piece,\n ): piece is Extract<FinalizedChatContentPiece, { type: \"text\" }> =>\n piece.type === \"text\",\n )\n .map((piece) => piece.content)\n .join(\"\"),\n contentPieces: contentPieces.map((piece) => ({ ...piece })),\n ...(checkpoint\n ? {\n checkpointId: checkpoint.id,\n checkpointTurnIndex: checkpoint.turnIndex,\n }\n : {}),\n };\n },\n };\n}\n","import {\n type FailureDescriptor,\n isFailureDescriptor,\n serializeFailure,\n} from \"@kortyx/core/errors\";\nimport { 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(\"checkpoint\"),\n id: z.string(),\n sessionId: z.string(),\n turnIndex: z.number().int().nonnegative(),\n label: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"structured-data-invalidated\"),\n streamId: z.string(),\n checkpointId: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"trace\"),\n traceId: z.string(),\n spanId: z.string(),\n runId: z.string(),\n rootSpanName: z.literal(\"kortyx.run\"),\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 z.object({\n type: z.literal(\"tool-call-start\"),\n tool: z.string(),\n toolCallId: z.string(),\n node: z.string().optional(),\n id: z.string().optional(),\n opId: z.string().optional(),\n input: z.unknown().optional(),\n }),\n z.object({\n type: z.literal(\"tool-call-result\"),\n tool: z.string(),\n toolCallId: z.string(),\n node: z.string().optional(),\n id: z.string().optional(),\n opId: z.string().optional(),\n content: z.unknown(),\n structuredContent: z.unknown().optional(),\n isError: z.boolean().optional(),\n }),\n z.object({\n type: z.literal(\"tool-call-error\"),\n failure: z\n .custom<FailureDescriptor>(isFailureDescriptor)\n .transform(serializeFailure)\n .optional(),\n tool: z.string(),\n toolCallId: z.string(),\n node: z.string().optional(),\n id: z.string().optional(),\n opId: z.string().optional(),\n message: z.string(),\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 z.object({\n kind: z.literal(\"custom\"),\n multiple: z.literal(false),\n question: z.string().optional(),\n contract: z.string().optional(),\n request: z.unknown(),\n id: z.string().optional(),\n schemaId: z.string(),\n schemaVersion: z.string(),\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({\n type: z.literal(\"limit-reached\"),\n runId: z.string(),\n limit: z.enum([\n \"maxNodeExecutions\",\n \"maxModelPasses\",\n \"maxToolCalls\",\n \"maxChildInvocations\",\n ]),\n maximum: z.number(),\n consumed: z.number(),\n }),\n z.object({\n type: z.literal(\"cancelled\"),\n runId: z.string(),\n reason: z.string(),\n }),\n z.object({ type: z.literal(\"done\"), data: z.any().optional() }),\n z.object({\n type: z.literal(\"error\"),\n message: z.string(),\n failure: z\n .custom<FailureDescriptor>(isFailureDescriptor)\n .transform(serializeFailure)\n .optional(),\n }),\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":["import_errors","import_errors","piece","import_errors","import_zod"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kortyx/stream",
3
- "version": "0.13.2",
3
+ "version": "0.15.0",
4
4
  "private": false,
5
5
  "description": "Streaming primitives for Kortyx.",
6
6
  "keywords": [