@kortyx/stream 0.15.4 → 0.15.5
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 +14 -0
- package/dist/{browser-CW1oLh9K.d.ts → browser-DfnlUdJ9.d.ts} +7 -4
- package/dist/browser.d.ts +1 -1
- package/dist/browser.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# @chatbot-core/types
|
|
2
2
|
|
|
3
|
+
## [0.15.5](https://github.com/kortyx-io/kortyx/compare/stream-v0.15.4...stream-v0.15.5) (2026-10-13)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* **evals:** preserve diagnostics and separate postcondition failures ([#337](https://github.com/kortyx-io/kortyx/issues/337)) ([d4fce4e](https://github.com/kortyx-io/kortyx/commit/d4fce4e670971d3b755835fc681c8125f67a9c70))
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Dependencies
|
|
12
|
+
|
|
13
|
+
* The following workspace dependencies were updated
|
|
14
|
+
* dependencies
|
|
15
|
+
* @kortyx/core bumped to 0.14.0
|
|
16
|
+
|
|
3
17
|
## [0.15.4](https://github.com/kortyx-io/kortyx/compare/stream-v0.15.3...stream-v0.15.4) (2026-10-11)
|
|
4
18
|
|
|
5
19
|
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as _kortyx_core_errors from '@kortyx/core/errors';
|
|
2
|
+
import { SerializedFailureDescriptor, FailureDescriptor } from '@kortyx/core/errors';
|
|
2
3
|
import { z } from 'zod';
|
|
3
4
|
|
|
4
5
|
declare function failureChunk(error: unknown): {
|
|
5
6
|
type: "error";
|
|
6
7
|
message: string;
|
|
7
|
-
failure:
|
|
8
|
+
failure: SerializedFailureDescriptor;
|
|
8
9
|
};
|
|
9
10
|
declare function streamError(chunk: {
|
|
10
11
|
message: string;
|
|
@@ -82,7 +83,8 @@ declare const StreamChunkSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
82
83
|
isError: z.ZodOptional<z.ZodBoolean>;
|
|
83
84
|
}, z.core.$strip>, z.ZodObject<{
|
|
84
85
|
type: z.ZodLiteral<"tool-call-error">;
|
|
85
|
-
|
|
86
|
+
diagnosticId: z.ZodOptional<z.ZodUUID>;
|
|
87
|
+
failure: z.ZodOptional<z.ZodPipe<z.ZodCustom<FailureDescriptor, FailureDescriptor>, z.ZodTransform<_kortyx_core_errors.SerializedFailureDescriptor, FailureDescriptor>>>;
|
|
86
88
|
tool: z.ZodString;
|
|
87
89
|
toolCallId: z.ZodString;
|
|
88
90
|
node: z.ZodOptional<z.ZodString>;
|
|
@@ -204,8 +206,9 @@ declare const StreamChunkSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
204
206
|
data: z.ZodOptional<z.ZodAny>;
|
|
205
207
|
}, z.core.$strip>, z.ZodObject<{
|
|
206
208
|
type: z.ZodLiteral<"error">;
|
|
209
|
+
diagnosticId: z.ZodOptional<z.ZodUUID>;
|
|
207
210
|
message: z.ZodString;
|
|
208
|
-
failure: z.ZodOptional<z.ZodPipe<z.ZodCustom<FailureDescriptor, FailureDescriptor>, z.ZodTransform<
|
|
211
|
+
failure: z.ZodOptional<z.ZodPipe<z.ZodCustom<FailureDescriptor, FailureDescriptor>, z.ZodTransform<_kortyx_core_errors.SerializedFailureDescriptor, FailureDescriptor>>>;
|
|
209
212
|
}, z.core.$strip>]>;
|
|
210
213
|
type StreamChunk = z.infer<typeof StreamChunkSchema>;
|
|
211
214
|
|
package/dist/browser.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
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-
|
|
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-DfnlUdJ9.js';
|
|
2
2
|
import '@kortyx/core/errors';
|
|
3
3
|
import 'zod';
|
package/dist/browser.js.map
CHANGED
|
@@ -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","../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":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,oBAKO;AAEA,SAAS,aAAa,OAI3B;AACA,QAAM,cAAU,gCAAiB,KAAK;AACtC,SAAO,EAAE,MAAM,SAAS,SAAS,QAAQ,SAAS,QAAQ;AAC5D;AAEO,SAAS,YAAY,OAGlB;AACR,aAAO,mCAAoB,MAAM,OAAO,QACpC,gCAAiB,MAAM,OAAO,IAC9B,IAAI,MAAM,MAAM,WAAW,eAAe;AAChD;;;ACZA,IAAM,UAAU,CAAC,UACf,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAM1D,eAAsB,cACpB,QACA,WAAkC,CAAC,GACpB;AACf,QAAM,WAAW,YAAY;AAC3B,UAAM,SAAS,SAAS;AAAA,EAC1B;AAEA,MAAI;AACF,qBAAiB,SAAS,QAAQ;AAChC,YAAM,iBAAiB,MAAM,SAAS,UAAU,KAAK;AAErD,UAAI,MAAM,SAAS,SAAS;AAC1B,cAAM,SAAS,UAAU,YAAY,KAAK,GAAG,KAAK;AAAA,MACpD;AAEA,UAAI,MAAM,SAAS,UAAU,mBAAmB,OAAO;AACrD,cAAM,SAAS;AACf;AAAA,MACF;AAAA,IACF;AAEA,UAAM,SAAS;AAAA,EACjB,SAAS,OAAO;AACd,UAAM,aAAa,QAAQ,KAAK;AAChC,UAAM,SAAS,UAAU,UAAU;AACnC,UAAM;AAAA,EACR;AACF;;;AC7CA,IAAAA,iBAIO;AAMP,gBAAuB,WACrB,MACyC;AACzC,MAAI,CAAC,KAAM;AAEX,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAM,UAAU,IAAI,YAAY,OAAO;AACvC,MAAI,SAAS;AACb,MAAI,UAAU;AACd,MAAI;AACF,WAAO,MAAM;AACX,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,UAAI,KAAM;AAEV,gBAAU,SAAS,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC,GAAG;AAAA,QAC1D;AAAA,QACA;AAAA,MACF;AACA,YAAM,QAAQ,OAAO,MAAM,MAAM;AACjC,eAAS,MAAM,IAAI;AAEnB,iBAAW,QAAQ,OAAO;AACxB,YAAI,CAAC,KAAK,WAAW,QAAQ,EAAG;AAChC,kBAAU;AACV,cAAM,UAAU,KAAK,MAAM,CAAC;AAC5B,YAAI,QAAQ,KAAK,MAAM,SAAU;AACjC,YAAI;AACF,gBAAM,QAAQ,KAAK,MAAM,OAAO;AAChC,cACE,CAAC,SACD,OAAO,UAAU,YACjB,OAAO,MAAM,SAAS;AAEtB,kBAAM,IAAI,MAAM,eAAe;AACjC,cAAI,MAAM,SAAS,SAAS;AAC1B,gBACE,OAAO,MAAM,YAAY,YACxB,MAAM,YAAY,UACjB,KAAC,oCAAoB,MAAM,OAAO;AAEpC,oBAAM,IAAI,MAAM,uBAAuB;AACzC,gBAAI,MAAM,QAAS,OAAM,cAAU,iCAAiB,MAAM,OAAO;AAAA,UACnE;AACA,gBAAM;AACN,cAAI,MAAM,SAAS,OAAQ;AAAA,QAC7B,SAAS,KAAK;AACZ,gBAAM,IAAI;AAAA,YACR;AAAA,YACA;AAAA,YACA;AAAA,cACE,UAAU;AAAA,cACV,WAAW;AAAA,cACX,aAAa;AAAA,cACb,OAAO;AAAA,YACT;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,QAAI,OAAO,KAAK,KAAK;AACnB,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,UACE,UAAU;AAAA,UACV,WAAW;AAAA,UACX,aAAa;AAAA,QACf;AAAA,MACF;AAAA,EACJ,UAAE;AACA,UAAM,OAAO,OAAO,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AACpC,WAAO,YAAY;AAAA,EACrB;AACF;;;ACpFA,IAAAC,iBAIO;AAcP,IAAM,mBAAmB,OAAO,aAAuC;AACrE,MAAI,UAAU,mBAAmB,SAAS,MAAM;AAChD,MAAI;AACF,UAAM,UAAW,MAAM,SAAS,KAAK;AACrC,QACE,WACA,OAAO,YAAY,YACnB,aAAa,eACb,oCAAoB,QAAQ,OAAO;AAEnC,iBAAO,iCAAiB,QAAQ,OAAO;AACzC,QACE,WACA,OAAO,YAAY,YACnB,WAAW,WACX,OAAQ,QAAgC,UAAU,UAClD;AACA,gBAAW,QAA8B;AAAA,IAC3C;AAAA,EACF,QAAQ;AAAA,EAAC;AACT,SAAO,IAAI,2BAAY,uBAAuB,SAAS;AAAA,IACrD,UAAU;AAAA,IACV,QAAQ,SAAS;AAAA,IACjB,aAAa;AAAA,EACf,CAAC;AACH;AAEA,gBAAuB,gBACrB,MACyC;AACzC,QAAM,UAAU,KAAK,aAAa,WAAW;AAC7C,MAAI,CAAC,SAAS;AACZ,UAAM,EAAE,MAAM,SAAS,SAAS,qCAAqC;AACrE,UAAM,EAAE,MAAM,OAAO;AACrB;AAAA,EACF;AAEA,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,QAAQ,KAAK,UAAU;AAAA,MACtC,QAAQ,KAAK,UAAU;AAAA,MACvB,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,GAAI,KAAK,WAAW,CAAC;AAAA,MACvB;AAAA,MACA,MAAM,KAAK,UAAU,KAAK,IAAI;AAAA,MAC9B,GAAI,KAAK,SAAS,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC;AAAA,IAC/C,CAAC;AAAA,EACH,SAAS,OAAO;AACd,QAAI,KAAK,QAAQ,QAAS,OAAM;AAChC,UAAM;AAAA,MACJ,IAAI,2BAAY,iBAAiB,2BAA2B;AAAA,QAC1D,UAAU;AAAA,QACV,OAAO;AAAA,QACP,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AACA,UAAM,EAAE,MAAM,OAAO;AACrB;AAAA,EACF;AAEA,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,aAAa,MAAM,iBAAiB,QAAQ,CAAC;AACnD,UAAM,EAAE,MAAM,OAAO;AACrB;AAAA,EACF;AAEA,SAAO,WAAW,SAAS,IAAI;AACjC;;;ACzEA,IAAM,gBAAgB,CAAC,UACrB,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAErE,IAAM,eAAe,CAAC,UAA2B,QAAQ,KAAK,KAAK;AAEnE,IAAM,gBAAgB,CAAC,UAA2B;AAChD,MAAI,UAAU,KAAM,QAAO;AAC3B,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO;AACjC,SAAO,OAAO;AAChB;AAEA,IAAM,YAAY,CAAC,SAA2B;AAC5C,MAAI,KAAK,WAAW,GAAG;AACrB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,MAAI,MAAM,KAAK,CAAC,SAAS,KAAK,WAAW,CAAC,GAAG;AAC3C,UAAM,IAAI;AAAA,MACR,0BAA0B,IAAI;AAAA,IAChC;AAAA,EACF;AAEA,SAAO;AACT;AAEA,IAAM,wBAAwB,CAAC,SAKY;AACzC,QAAM,WAAW,aAAa,KAAK,IAAI,IAAI,UAAU;AACrD,QAAM,WACJ,KAAK,UAAU,WAAW,IAAI,WAAW,KAAK,UAAU,KAAK,GAAG;AAElE,MAAI,KAAK,YAAY,QAAW;AAC9B,WAAO,aAAa,UAAU,CAAC,IAAI,CAAC;AAAA,EACtC;AAEA,MAAI,aAAa,SAAS;AACxB,QAAI,MAAM,QAAQ,KAAK,OAAO,EAAG,QAAO,CAAC,GAAG,KAAK,OAAO;AACxD,UAAM,IAAI;AAAA,MACR,+BAA+B,QAAQ,SAAS,KAAK,IAAI,yCAAyC,cAAc,KAAK,OAAO,CAAC;AAAA,IAC/H;AAAA,EACF;AAEA,MAAI,cAAc,KAAK,OAAO,EAAG,QAAO,EAAE,GAAG,KAAK,QAAQ;AAE1D,QAAM,IAAI;AAAA,IACR,+BAA+B,QAAQ,SAAS,KAAK,IAAI,0CAA0C,cAAc,KAAK,OAAO,CAAC;AAAA,EAChI;AACF;AAEA,IAAM,gBAAgB,CAAC,SAMR;AACb,QAAM,YAAY,KAAK,aAAa,CAAC;AACrC,QAAM,CAAC,MAAM,GAAG,IAAI,IAAI,KAAK;AAE7B,QAAM,YAAY,sBAAsB;AAAA,IACtC,SAAS,KAAK;AAAA,IACd;AAAA,IACA,MAAM,KAAK;AAAA,IACX;AAAA,EACF,CAAC;AAED,QAAM,eAAe,MAAM,QAAQ,SAAS,IACxC,UAAU,OAAO,IAAI,CAAC,IACtB,UAAU,IAAI;AAClB,QAAM,YACJ,KAAK,WAAW,IACZ,KAAK,WAAW,YAAY,IAC5B,cAAc;AAAA,IACZ,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM,KAAK;AAAA,IACX,YAAY,KAAK;AAAA,IACjB,WAAW,CAAC,GAAG,WAAW,IAAI;AAAA,EAChC,CAAC;AAEP,MAAI,MAAM,QAAQ,SAAS,GAAG;AAC5B,cAAU,OAAO,IAAI,CAAC,IAAI;AAAA,EAC5B,OAAO;AACL,cAAU,IAAI,IAAI;AAAA,EACpB;AAEA,SAAO;AACT;AAEO,SAAS,qBACd,SACA,OAC8B;AAC9B,MAAI,WAAW,QAAQ,aAAa,MAAM,UAAU;AAClD,UAAM,IAAI;AAAA,MACR,gDAAgD,QAAQ,QAAQ,cAAc,MAAM,QAAQ;AAAA,IAC9F;AAAA,EACF;AAEA,MAAI,SAAS,WAAW,QAAQ;AAC9B,UAAM,IAAI;AAAA,MACR,qBAAqB,MAAM,QAAQ;AAAA,IACrC;AAAA,EACF;AAEA,QAAM,WAAW;AAAA,IACf,UAAU,MAAM;AAAA,IAChB,UAAU,MAAM;AAAA,IAChB,QAAQ,MAAM,SAAS,UAAW,SAAoB;AAAA,IACtD,GAAI,MAAM,OAAO,EAAE,MAAM,MAAM,KAAK,IAAI,CAAC;AAAA,IACzC,GAAI,MAAM,KAAK,EAAE,IAAI,MAAM,GAAG,IAAI,CAAC;AAAA,IACnC,GAAI,MAAM,WAAW,EAAE,UAAU,MAAM,SAAS,IAAI,CAAC;AAAA,IACrD,GAAI,MAAM,gBAAgB,EAAE,eAAe,MAAM,cAAc,IAAI,CAAC;AAAA,EACtE;AAEA,MAAI,MAAM,SAAS,SAAS;AAC1B,WAAO;AAAA,MACL,GAAG;AAAA,MACH,MAAM,MAAM;AAAA,IACd;AAAA,EACF;AAEA,QAAM,OAAO,MAAM;AACnB,QAAM,YAAY,UAAU,IAAI;AAChC,QAAM,eAAe,SAAS;AAE9B,MAAI,MAAM,SAAS,OAAO;AACxB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,MAAM,cAAc;AAAA,QAClB,OAAO;AAAA,QACP,OAAO;AAAA,QACP;AAAA,QACA,YAAY,MAAM,MAAM;AAAA,MAC1B,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,MAAM,SAAS,UAAU;AAC3B,WAAO;AAAA,MACL,GAAG;AAAA,MACH,MAAM,cAAc;AAAA,QAClB,OAAO;AAAA,QACP,OAAO;AAAA,QACP;AAAA,QACA,YAAY,CAAC,aAAa;AACxB,cAAI,aAAa,OAAW,QAAO,CAAC,GAAG,MAAM,KAAK;AAClD,cAAI,CAAC,MAAM,QAAQ,QAAQ,GAAG;AAC5B,kBAAM,IAAI;AAAA,cACR,oCAAoC,IAAI,kCAAkC,cAAc,QAAQ,CAAC;AAAA,YACnG;AAAA,UACF;AACA,iBAAO,CAAC,GAAG,UAAU,GAAG,MAAM,KAAK;AAAA,QACrC;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,MAAM,cAAc;AAAA,MAClB,OAAO;AAAA,MACP,OAAO;AAAA,MACP;AAAA,MACA,YAAY,CAAC,aAAa;AACxB,YAAI,aAAa,OAAW,QAAO,MAAM;AACzC,YAAI,OAAO,aAAa,UAAU;AAChC,gBAAM,IAAI;AAAA,YACR,wCAAwC,IAAI,kCAAkC,cAAc,QAAQ,CAAC;AAAA,UACvG;AAAA,QACF;AACA,eAAO,WAAW,MAAM;AAAA,MAC1B;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEO,SAAS,uBACd,QAC8C;AAC9C,SAAO,OAAO;AAAA,IACZ,CAAC,KAAK,UAAU;AACd,UAAI,MAAM,QAAQ,IAAI,qBAAqB,IAAI,MAAM,QAAQ,GAAG,KAAK;AACrE,aAAO;AAAA,IACT;AAAA,IACA,CAAC;AAAA,EACH;AACF;;;ACzLA,IAAM,wBAAwB,CAC5B,UACiC,MAAM,SAAS;AAE3C,SAAS,kCACd,gBAA+C,CAAC,GACZ;AACpC,QAAM,SAAS,oBAAI,IAA0C;AAE7D,QAAM,QAAQ,CAAC,UAA6D;AAC1E,UAAM,YAAY,qBAAqB,OAAO,IAAI,MAAM,QAAQ,GAAG,KAAK;AACxE,WAAO,IAAI,MAAM,UAAU,SAAS;AACpC,WAAO;AAAA,EACT;AAEA,aAAW,SAAS,eAAe;AACjC,UAAM,KAAK;AAAA,EACb;AAEA,SAAO;AAAA,IACL;AAAA,IACA,kBAAkB,CAAC,UAAU;AAC3B,UAAI,MAAM,SAAS,+BAA+B;AAChD,eAAO,OAAO,MAAM,QAAQ;AAC5B,eAAO;AAAA,MACT;AACA,UAAI,CAAC,sBAAsB,KAAK,EAAG,QAAO;AAC1C,aAAO,MAAM,KAAK;AAAA,IACpB;AAAA,IACA,KAAK,CAAC,aAAa,OAAO,IAAI,QAAQ;AAAA,IACtC,KAAK,CAAC,aAAa,OAAO,IAAI,QAAQ;AAAA,IACtC,QAAQ,CAAC,aAAa,OAAO,OAAO,QAAQ;AAAA,IAC5C,OAAO,MAAM;AACX,aAAO,MAAM;AAAA,IACf;AAAA,IACA,MAAM,MAAM,OAAO;AAAA,IACnB,SAAS,MAAM,MAAM,KAAK,OAAO,QAAQ,CAAC;AAAA,IAC1C,QAAQ,MAAM,MAAM,KAAK,OAAO,OAAO,CAAC;AAAA,IACxC,UAAU,MAAM,OAAO,YAAY,OAAO,QAAQ,CAAC;AAAA,EACrD;AACF;;;ACjBA,IAAM,gBAAgB,CAAC,UAA6B;AAClD,QAAM,KAAK,MAAM,MAAM,KAAK;AAC5B,QAAM,UAAU,MAAM,WAAW,KAAK;AACtC,MAAI,QAAS,QAAO,KAAK,GAAG,EAAE,IAAI,OAAO,KAAK;AAC9C,MAAI,GAAI,QAAO,GAAG,EAAE,IAAI,MAAM,QAAQ,aAAa;AACnD,SAAO,MAAM,QAAQ;AACvB;AAGO,SAAS,sBACd,OACA,IAC2D;AAC3D,QAAM,QAAQ,MAAM;AACpB,QAAM,WAAW,MAAM,YAAY,MAAM;AACzC,QAAM,gBAAgB,MAAM,iBAAiB,MAAM;AACnD,QAAM,cAAc,MAAM,MAAM,MAAM;AACtC,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN,aAAa,MAAM;AAAA,IACnB,WAAW,MAAM;AAAA,IACjB,MAAM,MAAM;AAAA,IACZ,GAAI,MAAM,aAAa,SAAY,EAAE,UAAU,MAAM,SAAS,IAAI,CAAC;AAAA,IACnE,UAAU,MAAM;AAAA,IAChB,UAAU,MAAM,WAAW,CAAC,GAAG,IAAI,CAAC,YAAY;AAAA,MAC9C,IAAI,OAAO;AAAA,MACX,OAAO,OAAO;AAAA,MACd,GAAI,OAAO,cAAc,EAAE,aAAa,OAAO,YAAY,IAAI,CAAC;AAAA,IAClE,EAAE;AAAA,IACF,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,IAC/B,GAAI,gBAAgB,EAAE,cAAc,IAAI,CAAC;AAAA,IACzC,GAAI,MAAM,SAAS,YAAY,MAAM,WACjC,EAAE,UAAU,MAAM,SAAS,IAC3B,CAAC;AAAA,IACL,GAAI,MAAM,SAAS,WAAW,EAAE,SAAS,MAAM,QAAQ,IAAI,CAAC;AAAA,IAC5D,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;AAAA,IACrC,GAAI,MAAM,QAAQ,MAAM,OACpB,EAAE,MAAM,EAAE,GAAI,MAAM,QAAQ,CAAC,GAAI,GAAI,MAAM,QAAQ,CAAC,EAAG,EAAE,IACzD,CAAC;AAAA,EACP;AACF;AAGO,SAAS,sCAAsC,cAAsB;AAC1E,QAAM,SAAsC,CAAC;AAC7C,QAAM,cAAc,oBAAI,IAAoB;AAC5C,QAAM,aACJ,kCAA2D;AAC7D,MAAI,eAAe;AACnB,MAAI;AAEJ,QAAM,aAAa,CAAC,QAAgB;AAClC,UAAM,WAAW,YAAY,IAAI,GAAG;AACpC,QAAI,aAAa,OAAW,QAAO;AACnC,UAAM,QAAQ,OAAO;AACrB,WAAO,KAAK;AAAA,MACV,IAAI,GAAG,YAAY,SAAS,GAAG;AAAA,MAC/B,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AACD,gBAAY,IAAI,KAAK,KAAK;AAC1B,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,MAAM,OAA0B;AAC9B,cAAQ,MAAM,MAAM;AAAA,QAClB,KAAK;AACH,uBAAa,EAAE,IAAI,MAAM,IAAI,WAAW,MAAM,UAAU;AACxD;AAAA,QACF,KAAK;AACH,qBAAW,cAAc,KAAK,CAAC;AAC/B;AAAA,QACF,KAAK,cAAc;AACjB,yBAAe;AACf,gBAAM,QAAQ,WAAW,cAAc,KAAK,CAAC;AAC7C,gBAAM,UAAU,OAAO,KAAK;AAI5B,iBAAO,KAAK,IAAI;AAAA,YACd,GAAG;AAAA,YACH,SAAS,QAAQ,UAAU,MAAM;AAAA,UACnC;AACA;AAAA,QACF;AAAA,QACA,KAAK;AACH,cAAI,CAAC,cAAc;AACjB,mBAAO,KAAK;AAAA,cACV,IAAI,GAAG,YAAY,YAAY,OAAO,MAAM;AAAA,cAC5C,MAAM;AAAA,cACN,SAAS,MAAM;AAAA,YACjB,CAAC;AAAA,UACH;AACA;AAAA,QACF,KAAK,mBAAmB;AACtB,gBAAM,OAAO,WAAW,MAAM,KAAK;AACnC,gBAAM,KAAK,GAAG,YAAY,eAAe,MAAM,QAAQ;AACvD,gBAAM,QAAQ,OAAO,UAAU,CAACC,WAAUA,OAAM,OAAO,EAAE;AACzD,gBAAM,QAAQ,EAAE,IAAI,MAAM,cAAc,KAAK;AAC7C,cAAI,QAAQ,EAAG,QAAO,KAAK,KAAK;AAAA,cAC3B,QAAO,KAAK,IAAI;AACrB;AAAA,QACF;AAAA,QACA,KAAK,+BAA+B;AAClC,qBAAW,OAAO,MAAM,QAAQ;AAChC,gBAAM,QAAQ,OAAO;AAAA,YACnB,CAAC,UACC,MAAM,OAAO,GAAG,YAAY,eAAe,MAAM,QAAQ;AAAA,UAC7D;AACA,cAAI,SAAS,EAAG,QAAO,OAAO,OAAO,CAAC;AACtC;AAAA,QACF;AAAA,QACA,KAAK;AACH,iBAAO;AAAA,YACL;AAAA,cACE;AAAA,cACA,GAAG,YAAY,cAAc,MAAM,SAAS;AAAA,YAC9C;AAAA,UACF;AACA;AAAA,QACF,KAAK;AACH,iBAAO,KAAK;AAAA,YACV,IAAI,GAAG,YAAY,UAAU,OAAO,MAAM;AAAA,YAC1C,MAAM;AAAA,YACN,SAAS,MAAM;AAAA,YACf,GAAI,MAAM,UAAU,EAAE,SAAS,MAAM,QAAQ,IAAI,CAAC;AAAA,UACpD,CAAC;AACD;AAAA,MACJ;AAAA,IACF;AAAA,IACA,UAAgC;AAC9B,YAAM,gBAAgB,OAAO;AAAA,QAC3B,CAAC,UAAU,MAAM,SAAS,UAAU,MAAM,QAAQ,SAAS;AAAA,MAC7D;AACA,aAAO;AAAA,QACL,IAAI,GAAG,YAAY;AAAA,QACnB,MAAM;AAAA,QACN,SAAS,cACN;AAAA,UACC,CACE,UAEA,MAAM,SAAS;AAAA,QACnB,EACC,IAAI,CAAC,UAAU,MAAM,OAAO,EAC5B,KAAK,EAAE;AAAA,QACV,eAAe,cAAc,IAAI,CAAC,WAAW,EAAE,GAAG,MAAM,EAAE;AAAA,QAC1D,GAAI,aACA;AAAA,UACE,cAAc,WAAW;AAAA,UACzB,qBAAqB,WAAW;AAAA,QAClC,IACA,CAAC;AAAA,MACP;AAAA,IACF;AAAA,EACF;AACF;","names":["import_errors","import_errors","piece"]}
|
|
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 isFailureDescriptor,\n type SerializedFailureDescriptor,\n serializeFailure,\n} from \"@kortyx/core/errors\";\n\nexport function failureChunk(error: unknown): {\n type: \"error\";\n message: string;\n failure: SerializedFailureDescriptor;\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-
|
|
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-
|
|
1
|
+
import { S as StreamChunk, a as StructuredDataChunk } from './browser-DfnlUdJ9.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-DfnlUdJ9.js';
|
|
3
3
|
import '@kortyx/core/errors';
|
|
4
4
|
import 'zod';
|
|
5
5
|
|
package/dist/index.js
CHANGED
|
@@ -762,6 +762,7 @@ var StreamChunkSchema = import_zod2.z.union([
|
|
|
762
762
|
}),
|
|
763
763
|
import_zod2.z.object({
|
|
764
764
|
type: import_zod2.z.literal("tool-call-error"),
|
|
765
|
+
diagnosticId: import_zod2.z.uuid().optional(),
|
|
765
766
|
failure: import_zod2.z.custom(import_errors4.isFailureDescriptor).transform(import_errors4.serializeFailure).optional(),
|
|
766
767
|
tool: import_zod2.z.string(),
|
|
767
768
|
toolCallId: import_zod2.z.string(),
|
|
@@ -851,6 +852,7 @@ var StreamChunkSchema = import_zod2.z.union([
|
|
|
851
852
|
import_zod2.z.object({ type: import_zod2.z.literal("done"), data: import_zod2.z.any().optional() }),
|
|
852
853
|
import_zod2.z.object({
|
|
853
854
|
type: import_zod2.z.literal("error"),
|
|
855
|
+
diagnosticId: import_zod2.z.uuid().optional(),
|
|
854
856
|
message: import_zod2.z.string(),
|
|
855
857
|
failure: import_zod2.z.custom(import_errors4.isFailureDescriptor).transform(import_errors4.serializeFailure).optional()
|
|
856
858
|
})
|
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/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"]}
|
|
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 isFailureDescriptor,\n type SerializedFailureDescriptor,\n serializeFailure,\n} from \"@kortyx/core/errors\";\n\nexport function failureChunk(error: unknown): {\n type: \"error\";\n message: string;\n failure: SerializedFailureDescriptor;\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 diagnosticId: z.uuid().optional(),\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 diagnosticId: z.uuid().optional(),\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.15.
|
|
3
|
+
"version": "0.15.5",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Streaming primitives for Kortyx.",
|
|
6
6
|
"keywords": [
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
],
|
|
39
39
|
"dependencies": {
|
|
40
40
|
"zod": "^4.3.6",
|
|
41
|
-
"@kortyx/core": "0.
|
|
41
|
+
"@kortyx/core": "0.14.0"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"turbo": "2.9.14",
|