@kortyx/stream 0.6.0 → 0.6.1
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 +8 -0
- package/dist/browser.js +95 -44
- package/dist/browser.js.map +1 -1
- package/dist/index.js +95 -44
- package/dist/index.js.map +1 -1
- package/package.json +4 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# @chatbot-core/types
|
|
2
2
|
|
|
3
|
+
## [0.6.1](https://github.com/kortyx-io/kortyx/compare/stream-v0.6.0...stream-v0.6.1) (2026-04-22)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* **stream:** enforce structured chunk contract semantics ([bdbc518](https://github.com/kortyx-io/kortyx/commit/bdbc518366baacddb1a2ebb890b19e6564e2bee4))
|
|
9
|
+
* **stream:** enforce structured chunk contract semantics ([249d6e4](https://github.com/kortyx-io/kortyx/commit/249d6e47e1960debb0f396a4e7251bf9df38d7d2))
|
|
10
|
+
|
|
3
11
|
## [0.6.0](https://github.com/kortyx-io/kortyx/compare/stream-v0.5.2...stream-v0.6.0) (2026-04-17)
|
|
4
12
|
|
|
5
13
|
|
package/dist/browser.js
CHANGED
|
@@ -130,47 +130,69 @@ async function* streamFromRoute(args) {
|
|
|
130
130
|
|
|
131
131
|
// src/structured/apply-structured-chunk.ts
|
|
132
132
|
var isPlainObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
133
|
-
var cloneContainer = (value) => {
|
|
134
|
-
if (Array.isArray(value)) return [...value];
|
|
135
|
-
if (isPlainObject(value)) return { ...value };
|
|
136
|
-
return {};
|
|
137
|
-
};
|
|
138
133
|
var isArrayIndex = (value) => /^\d+$/.test(value);
|
|
139
|
-
var
|
|
140
|
-
if (
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
134
|
+
var describeValue = (value) => {
|
|
135
|
+
if (value === null) return "null";
|
|
136
|
+
if (Array.isArray(value)) return "array";
|
|
137
|
+
return typeof value;
|
|
138
|
+
};
|
|
139
|
+
var parsePath = (path) => {
|
|
140
|
+
if (path.length === 0) {
|
|
141
|
+
throw new Error(
|
|
142
|
+
"Structured chunk path must be a non-empty dot-separated string."
|
|
143
|
+
);
|
|
149
144
|
}
|
|
150
|
-
const
|
|
151
|
-
|
|
152
|
-
|
|
145
|
+
const parts = path.split(".");
|
|
146
|
+
if (parts.some((part) => part.length === 0)) {
|
|
147
|
+
throw new Error(
|
|
148
|
+
`Structured chunk path "${path}" must not contain empty segments.`
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
return parts;
|
|
153
152
|
};
|
|
154
|
-
var
|
|
155
|
-
const
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
continue;
|
|
166
|
-
}
|
|
167
|
-
return void 0;
|
|
153
|
+
var cloneContainerForPart = (args) => {
|
|
154
|
+
const expected = isArrayIndex(args.part) ? "array" : "object";
|
|
155
|
+
const location = args.traversed.length === 0 ? "<root>" : args.traversed.join(".");
|
|
156
|
+
if (args.current === void 0) {
|
|
157
|
+
return expected === "array" ? [] : {};
|
|
158
|
+
}
|
|
159
|
+
if (expected === "array") {
|
|
160
|
+
if (Array.isArray(args.current)) return [...args.current];
|
|
161
|
+
throw new Error(
|
|
162
|
+
`Structured path conflict at ${location} for "${args.path}": expected array container, received ${describeValue(args.current)}.`
|
|
163
|
+
);
|
|
168
164
|
}
|
|
169
|
-
return current;
|
|
165
|
+
if (isPlainObject(args.current)) return { ...args.current };
|
|
166
|
+
throw new Error(
|
|
167
|
+
`Structured path conflict at ${location} for "${args.path}": expected object container, received ${describeValue(args.current)}.`
|
|
168
|
+
);
|
|
170
169
|
};
|
|
171
|
-
var
|
|
172
|
-
const
|
|
173
|
-
|
|
170
|
+
var updateByParts = (args) => {
|
|
171
|
+
const traversed = args.traversed ?? [];
|
|
172
|
+
const [part, ...rest] = args.parts;
|
|
173
|
+
if (part === void 0) {
|
|
174
|
+
return args.updateLeaf(args.input);
|
|
175
|
+
}
|
|
176
|
+
const container = cloneContainerForPart({
|
|
177
|
+
current: args.input,
|
|
178
|
+
part,
|
|
179
|
+
path: args.path,
|
|
180
|
+
traversed
|
|
181
|
+
});
|
|
182
|
+
const currentChild = Array.isArray(container) ? container[Number(part)] : container[part];
|
|
183
|
+
const nextChild = rest.length === 0 ? args.updateLeaf(currentChild) : updateByParts({
|
|
184
|
+
input: currentChild,
|
|
185
|
+
parts: rest,
|
|
186
|
+
path: args.path,
|
|
187
|
+
updateLeaf: args.updateLeaf,
|
|
188
|
+
traversed: [...traversed, part]
|
|
189
|
+
});
|
|
190
|
+
if (Array.isArray(container)) {
|
|
191
|
+
container[Number(part)] = nextChild;
|
|
192
|
+
} else {
|
|
193
|
+
container[part] = nextChild;
|
|
194
|
+
}
|
|
195
|
+
return container;
|
|
174
196
|
};
|
|
175
197
|
function applyStructuredChunk(current, chunk) {
|
|
176
198
|
if (current && current.streamId !== chunk.streamId) {
|
|
@@ -198,26 +220,55 @@ function applyStructuredChunk(current, chunk) {
|
|
|
198
220
|
data: chunk.data
|
|
199
221
|
};
|
|
200
222
|
}
|
|
201
|
-
const
|
|
223
|
+
const path = chunk.path;
|
|
224
|
+
const pathParts = parsePath(path);
|
|
225
|
+
const previousData = current?.data;
|
|
202
226
|
if (chunk.kind === "set") {
|
|
203
227
|
return {
|
|
204
228
|
...nextBase,
|
|
205
|
-
data:
|
|
229
|
+
data: updateByParts({
|
|
230
|
+
input: previousData,
|
|
231
|
+
parts: pathParts,
|
|
232
|
+
path,
|
|
233
|
+
updateLeaf: () => chunk.value
|
|
234
|
+
})
|
|
206
235
|
};
|
|
207
236
|
}
|
|
208
237
|
if (chunk.kind === "append") {
|
|
209
|
-
const existing2 = getByPath(previousData, chunk.path);
|
|
210
|
-
const nextItems = Array.isArray(existing2) ? [...existing2, ...chunk.items] : [...chunk.items];
|
|
211
238
|
return {
|
|
212
239
|
...nextBase,
|
|
213
|
-
data:
|
|
240
|
+
data: updateByParts({
|
|
241
|
+
input: previousData,
|
|
242
|
+
parts: pathParts,
|
|
243
|
+
path,
|
|
244
|
+
updateLeaf: (existing) => {
|
|
245
|
+
if (existing === void 0) return [...chunk.items];
|
|
246
|
+
if (!Array.isArray(existing)) {
|
|
247
|
+
throw new Error(
|
|
248
|
+
`Structured append requires path "${path}" to target an array, received ${describeValue(existing)}.`
|
|
249
|
+
);
|
|
250
|
+
}
|
|
251
|
+
return [...existing, ...chunk.items];
|
|
252
|
+
}
|
|
253
|
+
})
|
|
214
254
|
};
|
|
215
255
|
}
|
|
216
|
-
const existing = getByPath(previousData, chunk.path);
|
|
217
|
-
const text = typeof existing === "string" ? existing : "";
|
|
218
256
|
return {
|
|
219
257
|
...nextBase,
|
|
220
|
-
data:
|
|
258
|
+
data: updateByParts({
|
|
259
|
+
input: previousData,
|
|
260
|
+
parts: pathParts,
|
|
261
|
+
path,
|
|
262
|
+
updateLeaf: (existing) => {
|
|
263
|
+
if (existing === void 0) return chunk.delta;
|
|
264
|
+
if (typeof existing !== "string") {
|
|
265
|
+
throw new Error(
|
|
266
|
+
`Structured text-delta requires path "${path}" to target a string, received ${describeValue(existing)}.`
|
|
267
|
+
);
|
|
268
|
+
}
|
|
269
|
+
return existing + chunk.delta;
|
|
270
|
+
}
|
|
271
|
+
})
|
|
221
272
|
};
|
|
222
273
|
}
|
|
223
274
|
function reduceStructuredChunks(chunks) {
|
package/dist/browser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/browser.ts","../src/client/consume-stream.ts","../src/client/read-stream.ts","../src/client/stream-from-route.ts","../src/structured/apply-structured-chunk.ts","../src/structured/structured-stream-accumulator.ts"],"sourcesContent":["// Browser-safe exports for client bundles.\n// Keep this file free of Node-only imports (fs, path, etc).\n\nexport type { ConsumeStreamHandlers } from \"./client/consume-stream\";\nexport { consumeStream } from \"./client/consume-stream\";\nexport { readStream } from \"./client/read-stream\";\nexport type { StreamFromRouteArgs } from \"./client/stream-from-route\";\nexport { streamFromRoute } from \"./client/stream-from-route\";\nexport * from \"./structured/apply-structured-chunk\";\nexport * from \"./structured/structured-stream-accumulator\";\nexport type { StreamChunk } from \"./types/stream-chunk\";\nexport type { StructuredDataChunk } from \"./types/structured-data\";\n","import type { StreamChunk } from \"../types/stream-chunk\";\n\nexport interface ConsumeStreamHandlers {\n onChunk?: (\n chunk: StreamChunk,\n ) => undefined | boolean | Promise<boolean | undefined>;\n onDone?: () => void | Promise<void>;\n onError?: (error: Error, chunk?: StreamChunk) => void | Promise<void>;\n}\n\nconst toError = (value: unknown): Error =>\n value instanceof Error ? value : new Error(String(value));\n\n/**\n * Consume a stream of StreamChunk events with callback handlers.\n * Returns when a `done` chunk is seen, the stream ends, or `onChunk` returns `false`.\n */\nexport async function consumeStream(\n stream: AsyncIterable<StreamChunk>,\n handlers: ConsumeStreamHandlers = {},\n): Promise<void> {\n let doneCalled = false;\n\n const callDone = async () => {\n if (doneCalled) return;\n doneCalled = true;\n await handlers.onDone?.();\n };\n\n try {\n for await (const chunk of stream) {\n const shouldContinue = await handlers.onChunk?.(chunk);\n\n if (chunk.type === \"error\") {\n await handlers.onError?.(\n new Error(chunk.message || \"Stream error.\"),\n chunk,\n );\n }\n\n if (chunk.type === \"done\" || shouldContinue === false) {\n await callDone();\n return;\n }\n }\n\n await callDone();\n } catch (error) {\n const normalized = toError(error);\n await handlers.onError?.(normalized);\n throw normalized;\n }\n}\n","// packages/stream/src/client/read-stream.ts\nimport type { StreamChunk } from \"../types/stream-chunk\";\n\n/**\n * Reads a server-sent event (SSE) Response body and yields StreamChunk objects.\n */\nexport async function* readStream(\n body: ReadableStream<Uint8Array> | null,\n): AsyncGenerator<StreamChunk, void, void> {\n if (!body) return;\n\n const reader = body.getReader();\n const decoder = new TextDecoder(\"utf-8\");\n let buffer = \"\";\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const parts = buffer.split(\"\\n\\n\");\n buffer = parts.pop() ?? \"\";\n\n for (const part of parts) {\n if (!part.startsWith(\"data: \")) continue;\n const payload = part.slice(6);\n if (payload.trim() === \"[DONE]\") return;\n try {\n yield JSON.parse(payload) as StreamChunk;\n } catch (err: any) {\n console.warn(\"Invalid JSON in stream chunk:\", payload);\n console.error(err);\n }\n }\n }\n}\n","import type { StreamChunk } from \"../types/stream-chunk\";\nimport { readStream } from \"./read-stream\";\n\nexport interface StreamFromRouteArgs<TBody = unknown> {\n endpoint: string;\n body: TBody;\n method?: string | undefined;\n fetchImpl?: typeof fetch;\n headers?: Record<string, string> | undefined;\n}\n\nconst toErrorMessage = (error: unknown): string =>\n error instanceof Error ? error.message : String(error);\n\nconst readErrorMessage = async (response: Response): Promise<string> => {\n let message = `Request failed (${response.status})`;\n try {\n const payload = (await response.json()) as unknown;\n if (\n payload &&\n typeof payload === \"object\" &&\n \"error\" in payload &&\n typeof (payload as { error?: unknown }).error === \"string\"\n ) {\n message = (payload as { error: string }).error;\n }\n } catch {}\n return message;\n};\n\nexport async function* streamFromRoute<TBody = unknown>(\n args: StreamFromRouteArgs<TBody>,\n): AsyncGenerator<StreamChunk, void, void> {\n const fetchFn = args.fetchImpl ?? globalThis.fetch;\n if (!fetchFn) {\n yield { type: \"error\", message: \"No fetch implementation available.\" };\n yield { type: \"done\" };\n return;\n }\n\n let response: Response;\n try {\n response = await fetchFn(args.endpoint, {\n method: args.method ?? \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n ...(args.headers ?? {}),\n },\n body: JSON.stringify(args.body),\n });\n } catch (error) {\n yield { type: \"error\", message: toErrorMessage(error) };\n yield { type: \"done\" };\n return;\n }\n\n if (!response.ok) {\n yield { type: \"error\", message: await readErrorMessage(response) };\n yield { type: \"done\" };\n return;\n }\n\n yield* readStream(response.body);\n}\n","import type { StructuredDataChunk } from \"../types/structured-data\";\n\nexport type StructuredStreamState<TData = unknown> = {\n streamId: string;\n dataType: string;\n status: \"streaming\" | \"done\";\n data: TData;\n node?: string;\n id?: string;\n schemaId?: string;\n schemaVersion?: string;\n};\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst cloneContainer = (value: unknown): unknown => {\n if (Array.isArray(value)) return [...value];\n if (isPlainObject(value)) return { ...value };\n return {};\n};\n\nconst isArrayIndex = (value: string): boolean => /^\\d+$/.test(value);\n\nconst setByParts = (\n input: unknown,\n parts: string[],\n value: unknown,\n): unknown => {\n if (parts.length === 0) return value;\n\n const [part, ...rest] = parts;\n if (part === undefined) return value;\n\n if (Array.isArray(input) || isArrayIndex(part)) {\n const nextArray = Array.isArray(input) ? [...input] : [];\n const index = Number(part);\n if (!Number.isInteger(index)) return nextArray;\n nextArray[index] = setByParts(nextArray[index], rest, value);\n return nextArray;\n }\n\n const nextObject = isPlainObject(input) ? { ...input } : {};\n nextObject[part] = setByParts(nextObject[part], rest, value);\n return nextObject;\n};\n\nconst getByPath = (input: unknown, path: string): unknown => {\n const parts = path.split(\".\").filter(Boolean);\n let current: unknown = input;\n\n for (const part of parts) {\n if (Array.isArray(current)) {\n const index = Number(part);\n current = Number.isInteger(index) ? current[index] : undefined;\n continue;\n }\n\n if (isPlainObject(current)) {\n current = current[part];\n continue;\n }\n\n return undefined;\n }\n\n return current;\n};\n\nconst setByPath = (input: unknown, path: string, value: unknown): unknown => {\n const parts = path.split(\".\").filter(Boolean);\n return parts.length === 0\n ? value\n : setByParts(cloneContainer(input), parts, value);\n};\n\nexport function applyStructuredChunk<TData = unknown>(\n current: StructuredStreamState<TData> | undefined,\n chunk: StructuredDataChunk,\n): StructuredStreamState<TData> {\n if (current && current.streamId !== chunk.streamId) {\n throw new Error(\n `Structured chunk streamId mismatch: expected ${current.streamId}, received ${chunk.streamId}.`,\n );\n }\n\n if (current?.status === \"done\") {\n throw new Error(\n `Structured stream ${chunk.streamId} already completed with a final chunk.`,\n );\n }\n\n const nextBase = {\n streamId: chunk.streamId,\n dataType: chunk.dataType,\n status: chunk.kind === \"final\" ? (\"done\" as const) : (\"streaming\" as const),\n ...(chunk.node ? { node: chunk.node } : {}),\n ...(chunk.id ? { id: chunk.id } : {}),\n ...(chunk.schemaId ? { schemaId: chunk.schemaId } : {}),\n ...(chunk.schemaVersion ? { schemaVersion: chunk.schemaVersion } : {}),\n };\n\n if (chunk.kind === \"final\") {\n return {\n ...nextBase,\n data: chunk.data as TData,\n };\n }\n\n const previousData =\n current?.data !== undefined\n ? current.data\n : ({} as TData | Record<string, unknown>);\n\n if (chunk.kind === \"set\") {\n return {\n ...nextBase,\n data: setByPath(previousData, chunk.path, chunk.value) as TData,\n };\n }\n\n if (chunk.kind === \"append\") {\n const existing = getByPath(previousData, chunk.path);\n const nextItems = Array.isArray(existing)\n ? [...existing, ...chunk.items]\n : [...chunk.items];\n return {\n ...nextBase,\n data: setByPath(previousData, chunk.path, nextItems) as TData,\n };\n }\n\n const existing = getByPath(previousData, chunk.path);\n const text = typeof existing === \"string\" ? existing : \"\";\n return {\n ...nextBase,\n data: setByPath(previousData, chunk.path, text + chunk.delta) as TData,\n };\n}\n\nexport function reduceStructuredChunks<TData = unknown>(\n chunks: StructuredDataChunk[],\n): Record<string, StructuredStreamState<TData>> {\n return chunks.reduce<Record<string, StructuredStreamState<TData>>>(\n (acc, chunk) => {\n acc[chunk.streamId] = applyStructuredChunk(acc[chunk.streamId], chunk);\n return acc;\n },\n {},\n );\n}\n","import type { StreamChunk } from \"../types/stream-chunk\";\nimport type { StructuredDataChunk } from \"../types/structured-data\";\nimport {\n applyStructuredChunk,\n type StructuredStreamState,\n} from \"./apply-structured-chunk\";\n\nexport type StructuredStreamAccumulator<TData = unknown> = {\n apply: (chunk: StructuredDataChunk) => StructuredStreamState<TData>;\n applyStreamChunk: (\n chunk: StreamChunk,\n ) => StructuredStreamState<TData> | undefined;\n get: (streamId: string) => StructuredStreamState<TData> | undefined;\n has: (streamId: string) => boolean;\n delete: (streamId: string) => boolean;\n clear: () => void;\n size: () => number;\n entries: () => Array<[string, StructuredStreamState<TData>]>;\n values: () => StructuredStreamState<TData>[];\n toRecord: () => Record<string, StructuredStreamState<TData>>;\n};\n\nconst isStructuredDataChunk = (\n chunk: StreamChunk,\n): chunk is StructuredDataChunk => chunk.type === \"structured-data\";\n\nexport function createStructuredStreamAccumulator<TData = unknown>(\n initialChunks: Iterable<StructuredDataChunk> = [],\n): StructuredStreamAccumulator<TData> {\n const states = new Map<string, StructuredStreamState<TData>>();\n\n const apply = (chunk: StructuredDataChunk): StructuredStreamState<TData> => {\n const nextState = applyStructuredChunk(states.get(chunk.streamId), chunk);\n states.set(chunk.streamId, nextState);\n return nextState;\n };\n\n for (const chunk of initialChunks) {\n apply(chunk);\n }\n\n return {\n apply,\n applyStreamChunk: (chunk) => {\n if (!isStructuredDataChunk(chunk)) return undefined;\n return apply(chunk);\n },\n get: (streamId) => states.get(streamId),\n has: (streamId) => states.has(streamId),\n delete: (streamId) => states.delete(streamId),\n clear: () => {\n states.clear();\n },\n size: () => states.size,\n entries: () => Array.from(states.entries()),\n values: () => Array.from(states.values()),\n toRecord: () => Object.fromEntries(states.entries()),\n };\n}\n"],"mappings":"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","names":["existing"]}
|
|
1
|
+
{"version":3,"sources":["../src/browser.ts","../src/client/consume-stream.ts","../src/client/read-stream.ts","../src/client/stream-from-route.ts","../src/structured/apply-structured-chunk.ts","../src/structured/structured-stream-accumulator.ts"],"sourcesContent":["// Browser-safe exports for client bundles.\n// Keep this file free of Node-only imports (fs, path, etc).\n\nexport type { ConsumeStreamHandlers } from \"./client/consume-stream\";\nexport { consumeStream } from \"./client/consume-stream\";\nexport { readStream } from \"./client/read-stream\";\nexport type { StreamFromRouteArgs } from \"./client/stream-from-route\";\nexport { streamFromRoute } from \"./client/stream-from-route\";\nexport * from \"./structured/apply-structured-chunk\";\nexport * from \"./structured/structured-stream-accumulator\";\nexport type { StreamChunk } from \"./types/stream-chunk\";\nexport type { StructuredDataChunk } from \"./types/structured-data\";\n","import type { StreamChunk } from \"../types/stream-chunk\";\n\nexport interface ConsumeStreamHandlers {\n onChunk?: (\n chunk: StreamChunk,\n ) => undefined | boolean | Promise<boolean | undefined>;\n onDone?: () => void | Promise<void>;\n onError?: (error: Error, chunk?: StreamChunk) => void | Promise<void>;\n}\n\nconst toError = (value: unknown): Error =>\n value instanceof Error ? value : new Error(String(value));\n\n/**\n * Consume a stream of StreamChunk events with callback handlers.\n * Returns when a `done` chunk is seen, the stream ends, or `onChunk` returns `false`.\n */\nexport async function consumeStream(\n stream: AsyncIterable<StreamChunk>,\n handlers: ConsumeStreamHandlers = {},\n): Promise<void> {\n let doneCalled = false;\n\n const callDone = async () => {\n if (doneCalled) return;\n doneCalled = true;\n await handlers.onDone?.();\n };\n\n try {\n for await (const chunk of stream) {\n const shouldContinue = await handlers.onChunk?.(chunk);\n\n if (chunk.type === \"error\") {\n await handlers.onError?.(\n new Error(chunk.message || \"Stream error.\"),\n chunk,\n );\n }\n\n if (chunk.type === \"done\" || shouldContinue === false) {\n await callDone();\n return;\n }\n }\n\n await callDone();\n } catch (error) {\n const normalized = toError(error);\n await handlers.onError?.(normalized);\n throw normalized;\n }\n}\n","// packages/stream/src/client/read-stream.ts\nimport type { StreamChunk } from \"../types/stream-chunk\";\n\n/**\n * Reads a server-sent event (SSE) Response body and yields StreamChunk objects.\n */\nexport async function* readStream(\n body: ReadableStream<Uint8Array> | null,\n): AsyncGenerator<StreamChunk, void, void> {\n if (!body) return;\n\n const reader = body.getReader();\n const decoder = new TextDecoder(\"utf-8\");\n let buffer = \"\";\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const parts = buffer.split(\"\\n\\n\");\n buffer = parts.pop() ?? \"\";\n\n for (const part of parts) {\n if (!part.startsWith(\"data: \")) continue;\n const payload = part.slice(6);\n if (payload.trim() === \"[DONE]\") return;\n try {\n yield JSON.parse(payload) as StreamChunk;\n } catch (err: any) {\n console.warn(\"Invalid JSON in stream chunk:\", payload);\n console.error(err);\n }\n }\n }\n}\n","import type { StreamChunk } from \"../types/stream-chunk\";\nimport { readStream } from \"./read-stream\";\n\nexport interface StreamFromRouteArgs<TBody = unknown> {\n endpoint: string;\n body: TBody;\n method?: string | undefined;\n fetchImpl?: typeof fetch;\n headers?: Record<string, string> | undefined;\n}\n\nconst toErrorMessage = (error: unknown): string =>\n error instanceof Error ? error.message : String(error);\n\nconst readErrorMessage = async (response: Response): Promise<string> => {\n let message = `Request failed (${response.status})`;\n try {\n const payload = (await response.json()) as unknown;\n if (\n payload &&\n typeof payload === \"object\" &&\n \"error\" in payload &&\n typeof (payload as { error?: unknown }).error === \"string\"\n ) {\n message = (payload as { error: string }).error;\n }\n } catch {}\n return message;\n};\n\nexport async function* streamFromRoute<TBody = unknown>(\n args: StreamFromRouteArgs<TBody>,\n): AsyncGenerator<StreamChunk, void, void> {\n const fetchFn = args.fetchImpl ?? globalThis.fetch;\n if (!fetchFn) {\n yield { type: \"error\", message: \"No fetch implementation available.\" };\n yield { type: \"done\" };\n return;\n }\n\n let response: Response;\n try {\n response = await fetchFn(args.endpoint, {\n method: args.method ?? \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n ...(args.headers ?? {}),\n },\n body: JSON.stringify(args.body),\n });\n } catch (error) {\n yield { type: \"error\", message: toErrorMessage(error) };\n yield { type: \"done\" };\n return;\n }\n\n if (!response.ok) {\n yield { type: \"error\", message: await readErrorMessage(response) };\n yield { type: \"done\" };\n return;\n }\n\n yield* readStream(response.body);\n}\n","import type { 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;\n if (part === undefined) {\n return args.updateLeaf(args.input);\n }\n\n const container = cloneContainerForPart({\n current: args.input,\n part,\n path: args.path,\n traversed,\n });\n\n const currentChild = Array.isArray(container)\n ? container[Number(part)]\n : container[part];\n const nextChild =\n rest.length === 0\n ? args.updateLeaf(currentChild)\n : updateByParts({\n input: currentChild,\n parts: rest,\n path: args.path,\n updateLeaf: args.updateLeaf,\n traversed: [...traversed, part],\n });\n\n if (Array.isArray(container)) {\n container[Number(part)] = nextChild;\n } else {\n container[part] = nextChild;\n }\n\n return container;\n};\n\nexport function applyStructuredChunk<TData = unknown>(\n current: StructuredStreamState<TData> | undefined,\n chunk: StructuredDataChunk,\n): StructuredStreamState<TData> {\n if (current && current.streamId !== chunk.streamId) {\n throw new Error(\n `Structured chunk streamId mismatch: expected ${current.streamId}, received ${chunk.streamId}.`,\n );\n }\n\n if (current?.status === \"done\") {\n throw new Error(\n `Structured stream ${chunk.streamId} already completed with a final chunk.`,\n );\n }\n\n const nextBase = {\n streamId: chunk.streamId,\n dataType: chunk.dataType,\n status: chunk.kind === \"final\" ? (\"done\" as const) : (\"streaming\" as const),\n ...(chunk.node ? { node: chunk.node } : {}),\n ...(chunk.id ? { id: chunk.id } : {}),\n ...(chunk.schemaId ? { schemaId: chunk.schemaId } : {}),\n ...(chunk.schemaVersion ? { schemaVersion: chunk.schemaVersion } : {}),\n };\n\n if (chunk.kind === \"final\") {\n return {\n ...nextBase,\n data: chunk.data as TData,\n };\n }\n\n const path = chunk.path;\n const pathParts = parsePath(path);\n const previousData = current?.data;\n\n if (chunk.kind === \"set\") {\n return {\n ...nextBase,\n data: updateByParts({\n input: previousData,\n parts: pathParts,\n path,\n updateLeaf: () => chunk.value,\n }) as TData,\n };\n }\n\n if (chunk.kind === \"append\") {\n return {\n ...nextBase,\n data: updateByParts({\n input: previousData,\n parts: pathParts,\n path,\n updateLeaf: (existing) => {\n if (existing === undefined) return [...chunk.items];\n if (!Array.isArray(existing)) {\n throw new Error(\n `Structured append requires path \"${path}\" to target an array, received ${describeValue(existing)}.`,\n );\n }\n return [...existing, ...chunk.items];\n },\n }) as TData,\n };\n }\n\n return {\n ...nextBase,\n data: updateByParts({\n input: previousData,\n parts: pathParts,\n path,\n updateLeaf: (existing) => {\n if (existing === undefined) return chunk.delta;\n if (typeof existing !== \"string\") {\n throw new Error(\n `Structured text-delta requires path \"${path}\" to target a string, received ${describeValue(existing)}.`,\n );\n }\n return existing + chunk.delta;\n },\n }) as TData,\n };\n}\n\nexport function reduceStructuredChunks<TData = unknown>(\n chunks: StructuredDataChunk[],\n): Record<string, StructuredStreamState<TData>> {\n return chunks.reduce<Record<string, StructuredStreamState<TData>>>(\n (acc, chunk) => {\n acc[chunk.streamId] = applyStructuredChunk(acc[chunk.streamId], chunk);\n return acc;\n },\n {},\n );\n}\n","import type { StreamChunk } from \"../types/stream-chunk\";\nimport type { StructuredDataChunk } from \"../types/structured-data\";\nimport {\n applyStructuredChunk,\n type StructuredStreamState,\n} from \"./apply-structured-chunk\";\n\nexport type StructuredStreamAccumulator<TData = unknown> = {\n apply: (chunk: StructuredDataChunk) => StructuredStreamState<TData>;\n applyStreamChunk: (\n chunk: StreamChunk,\n ) => StructuredStreamState<TData> | undefined;\n get: (streamId: string) => StructuredStreamState<TData> | undefined;\n has: (streamId: string) => boolean;\n delete: (streamId: string) => boolean;\n clear: () => void;\n size: () => number;\n entries: () => Array<[string, StructuredStreamState<TData>]>;\n values: () => StructuredStreamState<TData>[];\n toRecord: () => Record<string, StructuredStreamState<TData>>;\n};\n\nconst isStructuredDataChunk = (\n chunk: StreamChunk,\n): chunk is StructuredDataChunk => chunk.type === \"structured-data\";\n\nexport function createStructuredStreamAccumulator<TData = unknown>(\n initialChunks: Iterable<StructuredDataChunk> = [],\n): StructuredStreamAccumulator<TData> {\n const states = new Map<string, StructuredStreamState<TData>>();\n\n const apply = (chunk: StructuredDataChunk): StructuredStreamState<TData> => {\n const nextState = applyStructuredChunk(states.get(chunk.streamId), chunk);\n states.set(chunk.streamId, nextState);\n return nextState;\n };\n\n for (const chunk of initialChunks) {\n apply(chunk);\n }\n\n return {\n apply,\n applyStreamChunk: (chunk) => {\n if (!isStructuredDataChunk(chunk)) return undefined;\n return apply(chunk);\n },\n get: (streamId) => states.get(streamId),\n has: (streamId) => states.has(streamId),\n delete: (streamId) => states.delete(streamId),\n clear: () => {\n states.clear();\n },\n size: () => states.size,\n entries: () => Array.from(states.entries()),\n values: () => Array.from(states.values()),\n toRecord: () => Object.fromEntries(states.entries()),\n };\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.js
CHANGED
|
@@ -229,47 +229,69 @@ function toSSE(stream) {
|
|
|
229
229
|
|
|
230
230
|
// src/structured/apply-structured-chunk.ts
|
|
231
231
|
var isPlainObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
232
|
-
var cloneContainer = (value) => {
|
|
233
|
-
if (Array.isArray(value)) return [...value];
|
|
234
|
-
if (isPlainObject(value)) return { ...value };
|
|
235
|
-
return {};
|
|
236
|
-
};
|
|
237
232
|
var isArrayIndex = (value) => /^\d+$/.test(value);
|
|
238
|
-
var
|
|
239
|
-
if (
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
233
|
+
var describeValue = (value) => {
|
|
234
|
+
if (value === null) return "null";
|
|
235
|
+
if (Array.isArray(value)) return "array";
|
|
236
|
+
return typeof value;
|
|
237
|
+
};
|
|
238
|
+
var parsePath = (path) => {
|
|
239
|
+
if (path.length === 0) {
|
|
240
|
+
throw new Error(
|
|
241
|
+
"Structured chunk path must be a non-empty dot-separated string."
|
|
242
|
+
);
|
|
243
|
+
}
|
|
244
|
+
const parts = path.split(".");
|
|
245
|
+
if (parts.some((part) => part.length === 0)) {
|
|
246
|
+
throw new Error(
|
|
247
|
+
`Structured chunk path "${path}" must not contain empty segments.`
|
|
248
|
+
);
|
|
248
249
|
}
|
|
249
|
-
|
|
250
|
-
nextObject[part] = setByParts(nextObject[part], rest, value);
|
|
251
|
-
return nextObject;
|
|
250
|
+
return parts;
|
|
252
251
|
};
|
|
253
|
-
var
|
|
254
|
-
const
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
continue;
|
|
265
|
-
}
|
|
266
|
-
return void 0;
|
|
252
|
+
var cloneContainerForPart = (args) => {
|
|
253
|
+
const expected = isArrayIndex(args.part) ? "array" : "object";
|
|
254
|
+
const location = args.traversed.length === 0 ? "<root>" : args.traversed.join(".");
|
|
255
|
+
if (args.current === void 0) {
|
|
256
|
+
return expected === "array" ? [] : {};
|
|
257
|
+
}
|
|
258
|
+
if (expected === "array") {
|
|
259
|
+
if (Array.isArray(args.current)) return [...args.current];
|
|
260
|
+
throw new Error(
|
|
261
|
+
`Structured path conflict at ${location} for "${args.path}": expected array container, received ${describeValue(args.current)}.`
|
|
262
|
+
);
|
|
267
263
|
}
|
|
268
|
-
return current;
|
|
264
|
+
if (isPlainObject(args.current)) return { ...args.current };
|
|
265
|
+
throw new Error(
|
|
266
|
+
`Structured path conflict at ${location} for "${args.path}": expected object container, received ${describeValue(args.current)}.`
|
|
267
|
+
);
|
|
269
268
|
};
|
|
270
|
-
var
|
|
271
|
-
const
|
|
272
|
-
|
|
269
|
+
var updateByParts = (args) => {
|
|
270
|
+
const traversed = args.traversed ?? [];
|
|
271
|
+
const [part, ...rest] = args.parts;
|
|
272
|
+
if (part === void 0) {
|
|
273
|
+
return args.updateLeaf(args.input);
|
|
274
|
+
}
|
|
275
|
+
const container = cloneContainerForPart({
|
|
276
|
+
current: args.input,
|
|
277
|
+
part,
|
|
278
|
+
path: args.path,
|
|
279
|
+
traversed
|
|
280
|
+
});
|
|
281
|
+
const currentChild = Array.isArray(container) ? container[Number(part)] : container[part];
|
|
282
|
+
const nextChild = rest.length === 0 ? args.updateLeaf(currentChild) : updateByParts({
|
|
283
|
+
input: currentChild,
|
|
284
|
+
parts: rest,
|
|
285
|
+
path: args.path,
|
|
286
|
+
updateLeaf: args.updateLeaf,
|
|
287
|
+
traversed: [...traversed, part]
|
|
288
|
+
});
|
|
289
|
+
if (Array.isArray(container)) {
|
|
290
|
+
container[Number(part)] = nextChild;
|
|
291
|
+
} else {
|
|
292
|
+
container[part] = nextChild;
|
|
293
|
+
}
|
|
294
|
+
return container;
|
|
273
295
|
};
|
|
274
296
|
function applyStructuredChunk(current, chunk) {
|
|
275
297
|
if (current && current.streamId !== chunk.streamId) {
|
|
@@ -297,26 +319,55 @@ function applyStructuredChunk(current, chunk) {
|
|
|
297
319
|
data: chunk.data
|
|
298
320
|
};
|
|
299
321
|
}
|
|
300
|
-
const
|
|
322
|
+
const path = chunk.path;
|
|
323
|
+
const pathParts = parsePath(path);
|
|
324
|
+
const previousData = current?.data;
|
|
301
325
|
if (chunk.kind === "set") {
|
|
302
326
|
return {
|
|
303
327
|
...nextBase,
|
|
304
|
-
data:
|
|
328
|
+
data: updateByParts({
|
|
329
|
+
input: previousData,
|
|
330
|
+
parts: pathParts,
|
|
331
|
+
path,
|
|
332
|
+
updateLeaf: () => chunk.value
|
|
333
|
+
})
|
|
305
334
|
};
|
|
306
335
|
}
|
|
307
336
|
if (chunk.kind === "append") {
|
|
308
|
-
const existing2 = getByPath(previousData, chunk.path);
|
|
309
|
-
const nextItems = Array.isArray(existing2) ? [...existing2, ...chunk.items] : [...chunk.items];
|
|
310
337
|
return {
|
|
311
338
|
...nextBase,
|
|
312
|
-
data:
|
|
339
|
+
data: updateByParts({
|
|
340
|
+
input: previousData,
|
|
341
|
+
parts: pathParts,
|
|
342
|
+
path,
|
|
343
|
+
updateLeaf: (existing) => {
|
|
344
|
+
if (existing === void 0) return [...chunk.items];
|
|
345
|
+
if (!Array.isArray(existing)) {
|
|
346
|
+
throw new Error(
|
|
347
|
+
`Structured append requires path "${path}" to target an array, received ${describeValue(existing)}.`
|
|
348
|
+
);
|
|
349
|
+
}
|
|
350
|
+
return [...existing, ...chunk.items];
|
|
351
|
+
}
|
|
352
|
+
})
|
|
313
353
|
};
|
|
314
354
|
}
|
|
315
|
-
const existing = getByPath(previousData, chunk.path);
|
|
316
|
-
const text = typeof existing === "string" ? existing : "";
|
|
317
355
|
return {
|
|
318
356
|
...nextBase,
|
|
319
|
-
data:
|
|
357
|
+
data: updateByParts({
|
|
358
|
+
input: previousData,
|
|
359
|
+
parts: pathParts,
|
|
360
|
+
path,
|
|
361
|
+
updateLeaf: (existing) => {
|
|
362
|
+
if (existing === void 0) return chunk.delta;
|
|
363
|
+
if (typeof existing !== "string") {
|
|
364
|
+
throw new Error(
|
|
365
|
+
`Structured text-delta requires path "${path}" to target a string, received ${describeValue(existing)}.`
|
|
366
|
+
);
|
|
367
|
+
}
|
|
368
|
+
return existing + chunk.delta;
|
|
369
|
+
}
|
|
370
|
+
})
|
|
320
371
|
};
|
|
321
372
|
}
|
|
322
373
|
function reduceStructuredChunks(chunks) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/client/consume-stream.ts","../src/client/read-stream.ts","../src/client/stream-from-route.ts","../src/server/collect-stream.ts","../src/server/collect-buffered-stream.ts","../src/server/create-stream-response.ts","../src/server/to-sse.ts","../src/structured/apply-structured-chunk.ts","../src/structured/structured-stream-accumulator.ts","../src/types/stream-chunk.ts","../src/types/structured-data/index.ts"],"sourcesContent":["// release-test: 2026-01-22\n// packages/stream/src/index.ts\n\n// client\nexport * from \"./client/consume-stream\";\nexport * from \"./client/read-stream\";\nexport * from \"./client/stream-from-route\";\n\n// server\nexport * from \"./server/collect-buffered-stream\";\nexport * from \"./server/collect-stream\";\nexport * from \"./server/create-stream-response\";\nexport * from \"./server/to-sse\";\nexport * from \"./structured/apply-structured-chunk\";\nexport * from \"./structured/structured-stream-accumulator\";\nexport * from \"./types/stream-chunk\";\nexport * from \"./types/structured-data\";\n","import type { StreamChunk } from \"../types/stream-chunk\";\n\nexport interface ConsumeStreamHandlers {\n onChunk?: (\n chunk: StreamChunk,\n ) => undefined | boolean | Promise<boolean | undefined>;\n onDone?: () => void | Promise<void>;\n onError?: (error: Error, chunk?: StreamChunk) => void | Promise<void>;\n}\n\nconst toError = (value: unknown): Error =>\n value instanceof Error ? value : new Error(String(value));\n\n/**\n * Consume a stream of StreamChunk events with callback handlers.\n * Returns when a `done` chunk is seen, the stream ends, or `onChunk` returns `false`.\n */\nexport async function consumeStream(\n stream: AsyncIterable<StreamChunk>,\n handlers: ConsumeStreamHandlers = {},\n): Promise<void> {\n let doneCalled = false;\n\n const callDone = async () => {\n if (doneCalled) return;\n doneCalled = true;\n await handlers.onDone?.();\n };\n\n try {\n for await (const chunk of stream) {\n const shouldContinue = await handlers.onChunk?.(chunk);\n\n if (chunk.type === \"error\") {\n await handlers.onError?.(\n new Error(chunk.message || \"Stream error.\"),\n chunk,\n );\n }\n\n if (chunk.type === \"done\" || shouldContinue === false) {\n await callDone();\n return;\n }\n }\n\n await callDone();\n } catch (error) {\n const normalized = toError(error);\n await handlers.onError?.(normalized);\n throw normalized;\n }\n}\n","// packages/stream/src/client/read-stream.ts\nimport type { StreamChunk } from \"../types/stream-chunk\";\n\n/**\n * Reads a server-sent event (SSE) Response body and yields StreamChunk objects.\n */\nexport async function* readStream(\n body: ReadableStream<Uint8Array> | null,\n): AsyncGenerator<StreamChunk, void, void> {\n if (!body) return;\n\n const reader = body.getReader();\n const decoder = new TextDecoder(\"utf-8\");\n let buffer = \"\";\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const parts = buffer.split(\"\\n\\n\");\n buffer = parts.pop() ?? \"\";\n\n for (const part of parts) {\n if (!part.startsWith(\"data: \")) continue;\n const payload = part.slice(6);\n if (payload.trim() === \"[DONE]\") return;\n try {\n yield JSON.parse(payload) as StreamChunk;\n } catch (err: any) {\n console.warn(\"Invalid JSON in stream chunk:\", payload);\n console.error(err);\n }\n }\n }\n}\n","import type { StreamChunk } from \"../types/stream-chunk\";\nimport { readStream } from \"./read-stream\";\n\nexport interface StreamFromRouteArgs<TBody = unknown> {\n endpoint: string;\n body: TBody;\n method?: string | undefined;\n fetchImpl?: typeof fetch;\n headers?: Record<string, string> | undefined;\n}\n\nconst toErrorMessage = (error: unknown): string =>\n error instanceof Error ? error.message : String(error);\n\nconst readErrorMessage = async (response: Response): Promise<string> => {\n let message = `Request failed (${response.status})`;\n try {\n const payload = (await response.json()) as unknown;\n if (\n payload &&\n typeof payload === \"object\" &&\n \"error\" in payload &&\n typeof (payload as { error?: unknown }).error === \"string\"\n ) {\n message = (payload as { error: string }).error;\n }\n } catch {}\n return message;\n};\n\nexport async function* streamFromRoute<TBody = unknown>(\n args: StreamFromRouteArgs<TBody>,\n): AsyncGenerator<StreamChunk, void, void> {\n const fetchFn = args.fetchImpl ?? globalThis.fetch;\n if (!fetchFn) {\n yield { type: \"error\", message: \"No fetch implementation available.\" };\n yield { type: \"done\" };\n return;\n }\n\n let response: Response;\n try {\n response = await fetchFn(args.endpoint, {\n method: args.method ?? \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n ...(args.headers ?? {}),\n },\n body: JSON.stringify(args.body),\n });\n } catch (error) {\n yield { type: \"error\", message: toErrorMessage(error) };\n yield { type: \"done\" };\n return;\n }\n\n if (!response.ok) {\n yield { type: \"error\", message: await readErrorMessage(response) };\n yield { type: \"done\" };\n return;\n }\n\n yield* readStream(response.body);\n}\n","import type { StreamChunk } from \"../types/stream-chunk\";\n\n/**\n * Collects a streamed chat response into an array.\n * Useful for non-streaming HTTP responses or server actions.\n */\nexport async function collectStream(\n stream: AsyncIterable<StreamChunk>,\n): Promise<StreamChunk[]> {\n const chunks: StreamChunk[] = [];\n for await (const chunk of stream) {\n chunks.push(chunk);\n }\n return chunks;\n}\n","import type { StreamChunk } from \"../types/stream-chunk\";\nimport type { StructuredDataChunk } from \"../types/structured-data\";\nimport { collectStream } from \"./collect-stream\";\n\nexport interface BufferedStreamResult {\n chunks: StreamChunk[];\n text: string;\n structured: StructuredDataChunk[];\n}\n\n/**\n * Derive convenient buffered fields from raw chunks.\n * `text-delta` is preferred; `message` is fallback when no text deltas exist.\n */\nexport function summarizeStreamChunks(\n chunks: StreamChunk[],\n): Omit<BufferedStreamResult, \"chunks\"> {\n let sawTextDelta = false;\n let text = \"\";\n const messageFallback: string[] = [];\n const structured: StructuredDataChunk[] = [];\n\n for (const chunk of chunks) {\n if (chunk.type === \"text-delta\") {\n sawTextDelta = true;\n text += chunk.delta;\n continue;\n }\n\n if (chunk.type === \"message\") {\n messageFallback.push(chunk.content ?? \"\");\n continue;\n }\n\n if (chunk.type === \"structured-data\") {\n structured.push(chunk as StructuredDataChunk);\n }\n }\n\n if (!sawTextDelta && messageFallback.length > 0) {\n text = messageFallback.join(\"\");\n }\n\n return { text, structured };\n}\n\n/**\n * Collect a stream and return both raw chunks and buffered convenience fields.\n */\nexport async function collectBufferedStream(\n stream: AsyncIterable<StreamChunk>,\n): Promise<BufferedStreamResult> {\n const chunks = await collectStream(stream);\n return {\n chunks,\n ...summarizeStreamChunks(chunks),\n };\n}\n","// packages/stream/src/server/create-stream-response.ts\nimport type { StreamChunk } from \"../types/stream-chunk\";\n\nexport const STREAM_HEADERS = {\n \"content-type\": \"text/event-stream\",\n \"cache-control\": \"no-cache\",\n connection: \"keep-alive\",\n \"x-accel-buffering\": \"no\",\n};\n\nclass JsonToSseTransformStream extends TransformStream<unknown, string> {\n constructor() {\n super({\n transform(part, controller) {\n controller.enqueue(`data: ${JSON.stringify(part)}\\n\\n`);\n },\n flush(controller) {\n controller.enqueue(\"data: [DONE]\\n\\n\");\n },\n });\n }\n}\n\n/**\n * Turns an AsyncIterable<StreamChunk> into a streamed HTTP Response.\n * Works in Node, Bun, Cloudflare, Edge, etc.\n */\nexport function createStreamResponse(\n stream: AsyncIterable<StreamChunk>,\n): Response {\n const readable = new ReadableStream<StreamChunk>({\n async start(controller) {\n try {\n for await (const chunk of stream) {\n controller.enqueue(chunk);\n }\n } catch (err: any) {\n controller.enqueue({\n type: \"error\",\n message: String(err?.message ?? err),\n } as StreamChunk);\n } finally {\n controller.close();\n }\n },\n });\n\n return new Response(\n readable\n .pipeThrough(new JsonToSseTransformStream())\n .pipeThrough(new TextEncoderStream()),\n { headers: STREAM_HEADERS },\n );\n}\n","import type { StreamChunk } from \"../types/stream-chunk\";\nimport { createStreamResponse } from \"./create-stream-response\";\n\n/**\n * Friendly alias for createStreamResponse.\n */\nexport function toSSE(stream: AsyncIterable<StreamChunk>): Response {\n return createStreamResponse(stream);\n}\n","import type { StructuredDataChunk } from \"../types/structured-data\";\n\nexport type StructuredStreamState<TData = unknown> = {\n streamId: string;\n dataType: string;\n status: \"streaming\" | \"done\";\n data: TData;\n node?: string;\n id?: string;\n schemaId?: string;\n schemaVersion?: string;\n};\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst cloneContainer = (value: unknown): unknown => {\n if (Array.isArray(value)) return [...value];\n if (isPlainObject(value)) return { ...value };\n return {};\n};\n\nconst isArrayIndex = (value: string): boolean => /^\\d+$/.test(value);\n\nconst setByParts = (\n input: unknown,\n parts: string[],\n value: unknown,\n): unknown => {\n if (parts.length === 0) return value;\n\n const [part, ...rest] = parts;\n if (part === undefined) return value;\n\n if (Array.isArray(input) || isArrayIndex(part)) {\n const nextArray = Array.isArray(input) ? [...input] : [];\n const index = Number(part);\n if (!Number.isInteger(index)) return nextArray;\n nextArray[index] = setByParts(nextArray[index], rest, value);\n return nextArray;\n }\n\n const nextObject = isPlainObject(input) ? { ...input } : {};\n nextObject[part] = setByParts(nextObject[part], rest, value);\n return nextObject;\n};\n\nconst getByPath = (input: unknown, path: string): unknown => {\n const parts = path.split(\".\").filter(Boolean);\n let current: unknown = input;\n\n for (const part of parts) {\n if (Array.isArray(current)) {\n const index = Number(part);\n current = Number.isInteger(index) ? current[index] : undefined;\n continue;\n }\n\n if (isPlainObject(current)) {\n current = current[part];\n continue;\n }\n\n return undefined;\n }\n\n return current;\n};\n\nconst setByPath = (input: unknown, path: string, value: unknown): unknown => {\n const parts = path.split(\".\").filter(Boolean);\n return parts.length === 0\n ? value\n : setByParts(cloneContainer(input), parts, value);\n};\n\nexport function applyStructuredChunk<TData = unknown>(\n current: StructuredStreamState<TData> | undefined,\n chunk: StructuredDataChunk,\n): StructuredStreamState<TData> {\n if (current && current.streamId !== chunk.streamId) {\n throw new Error(\n `Structured chunk streamId mismatch: expected ${current.streamId}, received ${chunk.streamId}.`,\n );\n }\n\n if (current?.status === \"done\") {\n throw new Error(\n `Structured stream ${chunk.streamId} already completed with a final chunk.`,\n );\n }\n\n const nextBase = {\n streamId: chunk.streamId,\n dataType: chunk.dataType,\n status: chunk.kind === \"final\" ? (\"done\" as const) : (\"streaming\" as const),\n ...(chunk.node ? { node: chunk.node } : {}),\n ...(chunk.id ? { id: chunk.id } : {}),\n ...(chunk.schemaId ? { schemaId: chunk.schemaId } : {}),\n ...(chunk.schemaVersion ? { schemaVersion: chunk.schemaVersion } : {}),\n };\n\n if (chunk.kind === \"final\") {\n return {\n ...nextBase,\n data: chunk.data as TData,\n };\n }\n\n const previousData =\n current?.data !== undefined\n ? current.data\n : ({} as TData | Record<string, unknown>);\n\n if (chunk.kind === \"set\") {\n return {\n ...nextBase,\n data: setByPath(previousData, chunk.path, chunk.value) as TData,\n };\n }\n\n if (chunk.kind === \"append\") {\n const existing = getByPath(previousData, chunk.path);\n const nextItems = Array.isArray(existing)\n ? [...existing, ...chunk.items]\n : [...chunk.items];\n return {\n ...nextBase,\n data: setByPath(previousData, chunk.path, nextItems) as TData,\n };\n }\n\n const existing = getByPath(previousData, chunk.path);\n const text = typeof existing === \"string\" ? existing : \"\";\n return {\n ...nextBase,\n data: setByPath(previousData, chunk.path, text + chunk.delta) as TData,\n };\n}\n\nexport function reduceStructuredChunks<TData = unknown>(\n chunks: StructuredDataChunk[],\n): Record<string, StructuredStreamState<TData>> {\n return chunks.reduce<Record<string, StructuredStreamState<TData>>>(\n (acc, chunk) => {\n acc[chunk.streamId] = applyStructuredChunk(acc[chunk.streamId], chunk);\n return acc;\n },\n {},\n );\n}\n","import type { StreamChunk } from \"../types/stream-chunk\";\nimport type { StructuredDataChunk } from \"../types/structured-data\";\nimport {\n applyStructuredChunk,\n type StructuredStreamState,\n} from \"./apply-structured-chunk\";\n\nexport type StructuredStreamAccumulator<TData = unknown> = {\n apply: (chunk: StructuredDataChunk) => StructuredStreamState<TData>;\n applyStreamChunk: (\n chunk: StreamChunk,\n ) => StructuredStreamState<TData> | undefined;\n get: (streamId: string) => StructuredStreamState<TData> | undefined;\n has: (streamId: string) => boolean;\n delete: (streamId: string) => boolean;\n clear: () => void;\n size: () => number;\n entries: () => Array<[string, StructuredStreamState<TData>]>;\n values: () => StructuredStreamState<TData>[];\n toRecord: () => Record<string, StructuredStreamState<TData>>;\n};\n\nconst isStructuredDataChunk = (\n chunk: StreamChunk,\n): chunk is StructuredDataChunk => chunk.type === \"structured-data\";\n\nexport function createStructuredStreamAccumulator<TData = unknown>(\n initialChunks: Iterable<StructuredDataChunk> = [],\n): StructuredStreamAccumulator<TData> {\n const states = new Map<string, StructuredStreamState<TData>>();\n\n const apply = (chunk: StructuredDataChunk): StructuredStreamState<TData> => {\n const nextState = applyStructuredChunk(states.get(chunk.streamId), chunk);\n states.set(chunk.streamId, nextState);\n return nextState;\n };\n\n for (const chunk of initialChunks) {\n apply(chunk);\n }\n\n return {\n apply,\n applyStreamChunk: (chunk) => {\n if (!isStructuredDataChunk(chunk)) return undefined;\n return apply(chunk);\n },\n get: (streamId) => states.get(streamId),\n has: (streamId) => states.has(streamId),\n delete: (streamId) => states.delete(streamId),\n clear: () => {\n states.clear();\n },\n size: () => states.size,\n entries: () => Array.from(states.entries()),\n values: () => Array.from(states.values()),\n toRecord: () => Object.fromEntries(states.entries()),\n };\n}\n","import { z } from \"zod\";\nimport { StructuredDataChunkSchema } from \"./structured-data\";\n\nexport const StreamChunkSchema = z.union([\n z.object({\n type: z.literal(\"session\"),\n sessionId: z.string(),\n }),\n z.object({\n type: z.literal(\"status\"),\n message: z.string(),\n node: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"message\"),\n content: z.string(),\n node: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"text-start\"),\n node: z.string().optional(),\n id: z.string().optional(),\n opId: z.string().optional(),\n segmentId: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"text-delta\"),\n delta: z.string(),\n node: z.string().optional(),\n id: z.string().optional(),\n opId: z.string().optional(),\n segmentId: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"text-end\"),\n node: z.string().optional(),\n id: z.string().optional(),\n opId: z.string().optional(),\n segmentId: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"tool-result\"),\n tool: z.string().optional(),\n node: z.string().optional(),\n content: z.unknown(),\n }),\n // Interrupt request chunk (used to render interactive options in UI)\n z.object({\n type: z.literal(\"interrupt\"),\n requestId: z.string(),\n resumeToken: z.string(),\n workflow: z.string().optional(),\n node: z.string().optional(),\n id: z.string().optional(),\n opId: z.string().optional(),\n schemaId: z.string().optional(),\n schemaVersion: z.string().optional(),\n input: z.discriminatedUnion(\"kind\", [\n // Text input: question optional, no options\n z.object({\n kind: z.literal(\"text\"),\n multiple: z.boolean(),\n question: z.string().optional(),\n id: z.string().optional(),\n schemaId: z.string().optional(),\n schemaVersion: z.string().optional(),\n meta: z.record(z.unknown()).optional(),\n options: z.array(z.never()).optional(),\n }),\n // Choice/multi-choice: question + options required\n z.object({\n kind: z.enum([\"choice\", \"multi-choice\"]),\n multiple: z.boolean(),\n question: z.string(),\n id: z.string().optional(),\n schemaId: z.string().optional(),\n schemaVersion: z.string().optional(),\n meta: z.record(z.unknown()).optional(),\n options: z.array(\n z.object({\n id: z.string(),\n label: z.string(),\n description: z.string().optional(),\n }),\n ),\n }),\n ]),\n meta: z.record(z.unknown()).optional(),\n }),\n StructuredDataChunkSchema,\n z.object({\n type: z.literal(\"transition\"),\n transitionTo: z.string(),\n payload: z.any().optional(),\n }),\n z.object({ type: z.literal(\"done\"), data: z.any().optional() }),\n z.object({ type: z.literal(\"error\"), message: z.string() }),\n]);\n\nexport type StreamChunk = z.infer<typeof StreamChunkSchema>;\n","import { z } from \"zod\";\n\nconst StructuredDataBase = z.object({\n type: z.literal(\"structured-data\"),\n streamId: z.string(),\n dataType: z.string(),\n kind: z.enum([\"set\", \"append\", \"text-delta\", \"final\"]),\n schemaId: z.string().optional(),\n schemaVersion: z.string().optional(),\n id: z.string().optional(),\n node: z.string().optional(),\n});\n\nconst StructuredSetChunkSchema = StructuredDataBase.extend({\n kind: z.literal(\"set\"),\n path: z.string().min(1),\n value: z.unknown(),\n});\n\nconst StructuredAppendChunkSchema = StructuredDataBase.extend({\n kind: z.literal(\"append\"),\n path: z.string().min(1),\n items: z.array(z.unknown()),\n});\n\nconst StructuredTextDeltaChunkSchema = StructuredDataBase.extend({\n kind: z.literal(\"text-delta\"),\n path: z.string().min(1),\n delta: z.string(),\n});\n\nconst StructuredFinalChunkSchema = StructuredDataBase.extend({\n kind: z.literal(\"final\"),\n data: z.unknown(),\n});\n\nexport const StructuredDataChunkSchema = z.union([\n StructuredSetChunkSchema,\n StructuredAppendChunkSchema,\n StructuredTextDeltaChunkSchema,\n StructuredFinalChunkSchema,\n]);\n\nexport type StructuredDataChunk = z.infer<typeof StructuredDataChunkSchema>;\n"],"mappings":"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","names":["existing","import_zod"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/client/consume-stream.ts","../src/client/read-stream.ts","../src/client/stream-from-route.ts","../src/server/collect-stream.ts","../src/server/collect-buffered-stream.ts","../src/server/create-stream-response.ts","../src/server/to-sse.ts","../src/structured/apply-structured-chunk.ts","../src/structured/structured-stream-accumulator.ts","../src/types/stream-chunk.ts","../src/types/structured-data/index.ts"],"sourcesContent":["// release-test: 2026-01-22\n// packages/stream/src/index.ts\n\n// client\nexport * from \"./client/consume-stream\";\nexport * from \"./client/read-stream\";\nexport * from \"./client/stream-from-route\";\n\n// server\nexport * from \"./server/collect-buffered-stream\";\nexport * from \"./server/collect-stream\";\nexport * from \"./server/create-stream-response\";\nexport * from \"./server/to-sse\";\nexport * from \"./structured/apply-structured-chunk\";\nexport * from \"./structured/structured-stream-accumulator\";\nexport * from \"./types/stream-chunk\";\nexport * from \"./types/structured-data\";\n","import type { StreamChunk } from \"../types/stream-chunk\";\n\nexport interface ConsumeStreamHandlers {\n onChunk?: (\n chunk: StreamChunk,\n ) => undefined | boolean | Promise<boolean | undefined>;\n onDone?: () => void | Promise<void>;\n onError?: (error: Error, chunk?: StreamChunk) => void | Promise<void>;\n}\n\nconst toError = (value: unknown): Error =>\n value instanceof Error ? value : new Error(String(value));\n\n/**\n * Consume a stream of StreamChunk events with callback handlers.\n * Returns when a `done` chunk is seen, the stream ends, or `onChunk` returns `false`.\n */\nexport async function consumeStream(\n stream: AsyncIterable<StreamChunk>,\n handlers: ConsumeStreamHandlers = {},\n): Promise<void> {\n let doneCalled = false;\n\n const callDone = async () => {\n if (doneCalled) return;\n doneCalled = true;\n await handlers.onDone?.();\n };\n\n try {\n for await (const chunk of stream) {\n const shouldContinue = await handlers.onChunk?.(chunk);\n\n if (chunk.type === \"error\") {\n await handlers.onError?.(\n new Error(chunk.message || \"Stream error.\"),\n chunk,\n );\n }\n\n if (chunk.type === \"done\" || shouldContinue === false) {\n await callDone();\n return;\n }\n }\n\n await callDone();\n } catch (error) {\n const normalized = toError(error);\n await handlers.onError?.(normalized);\n throw normalized;\n }\n}\n","// packages/stream/src/client/read-stream.ts\nimport type { StreamChunk } from \"../types/stream-chunk\";\n\n/**\n * Reads a server-sent event (SSE) Response body and yields StreamChunk objects.\n */\nexport async function* readStream(\n body: ReadableStream<Uint8Array> | null,\n): AsyncGenerator<StreamChunk, void, void> {\n if (!body) return;\n\n const reader = body.getReader();\n const decoder = new TextDecoder(\"utf-8\");\n let buffer = \"\";\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const parts = buffer.split(\"\\n\\n\");\n buffer = parts.pop() ?? \"\";\n\n for (const part of parts) {\n if (!part.startsWith(\"data: \")) continue;\n const payload = part.slice(6);\n if (payload.trim() === \"[DONE]\") return;\n try {\n yield JSON.parse(payload) as StreamChunk;\n } catch (err: any) {\n console.warn(\"Invalid JSON in stream chunk:\", payload);\n console.error(err);\n }\n }\n }\n}\n","import type { StreamChunk } from \"../types/stream-chunk\";\nimport { readStream } from \"./read-stream\";\n\nexport interface StreamFromRouteArgs<TBody = unknown> {\n endpoint: string;\n body: TBody;\n method?: string | undefined;\n fetchImpl?: typeof fetch;\n headers?: Record<string, string> | undefined;\n}\n\nconst toErrorMessage = (error: unknown): string =>\n error instanceof Error ? error.message : String(error);\n\nconst readErrorMessage = async (response: Response): Promise<string> => {\n let message = `Request failed (${response.status})`;\n try {\n const payload = (await response.json()) as unknown;\n if (\n payload &&\n typeof payload === \"object\" &&\n \"error\" in payload &&\n typeof (payload as { error?: unknown }).error === \"string\"\n ) {\n message = (payload as { error: string }).error;\n }\n } catch {}\n return message;\n};\n\nexport async function* streamFromRoute<TBody = unknown>(\n args: StreamFromRouteArgs<TBody>,\n): AsyncGenerator<StreamChunk, void, void> {\n const fetchFn = args.fetchImpl ?? globalThis.fetch;\n if (!fetchFn) {\n yield { type: \"error\", message: \"No fetch implementation available.\" };\n yield { type: \"done\" };\n return;\n }\n\n let response: Response;\n try {\n response = await fetchFn(args.endpoint, {\n method: args.method ?? \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n ...(args.headers ?? {}),\n },\n body: JSON.stringify(args.body),\n });\n } catch (error) {\n yield { type: \"error\", message: toErrorMessage(error) };\n yield { type: \"done\" };\n return;\n }\n\n if (!response.ok) {\n yield { type: \"error\", message: await readErrorMessage(response) };\n yield { type: \"done\" };\n return;\n }\n\n yield* readStream(response.body);\n}\n","import type { StreamChunk } from \"../types/stream-chunk\";\n\n/**\n * Collects a streamed chat response into an array.\n * Useful for non-streaming HTTP responses or server actions.\n */\nexport async function collectStream(\n stream: AsyncIterable<StreamChunk>,\n): Promise<StreamChunk[]> {\n const chunks: StreamChunk[] = [];\n for await (const chunk of stream) {\n chunks.push(chunk);\n }\n return chunks;\n}\n","import type { StreamChunk } from \"../types/stream-chunk\";\nimport type { StructuredDataChunk } from \"../types/structured-data\";\nimport { collectStream } from \"./collect-stream\";\n\nexport interface BufferedStreamResult {\n chunks: StreamChunk[];\n text: string;\n structured: StructuredDataChunk[];\n}\n\n/**\n * Derive convenient buffered fields from raw chunks.\n * `text-delta` is preferred; `message` is fallback when no text deltas exist.\n */\nexport function summarizeStreamChunks(\n chunks: StreamChunk[],\n): Omit<BufferedStreamResult, \"chunks\"> {\n let sawTextDelta = false;\n let text = \"\";\n const messageFallback: string[] = [];\n const structured: StructuredDataChunk[] = [];\n\n for (const chunk of chunks) {\n if (chunk.type === \"text-delta\") {\n sawTextDelta = true;\n text += chunk.delta;\n continue;\n }\n\n if (chunk.type === \"message\") {\n messageFallback.push(chunk.content ?? \"\");\n continue;\n }\n\n if (chunk.type === \"structured-data\") {\n structured.push(chunk as StructuredDataChunk);\n }\n }\n\n if (!sawTextDelta && messageFallback.length > 0) {\n text = messageFallback.join(\"\");\n }\n\n return { text, structured };\n}\n\n/**\n * Collect a stream and return both raw chunks and buffered convenience fields.\n */\nexport async function collectBufferedStream(\n stream: AsyncIterable<StreamChunk>,\n): Promise<BufferedStreamResult> {\n const chunks = await collectStream(stream);\n return {\n chunks,\n ...summarizeStreamChunks(chunks),\n };\n}\n","// packages/stream/src/server/create-stream-response.ts\nimport type { StreamChunk } from \"../types/stream-chunk\";\n\nexport const STREAM_HEADERS = {\n \"content-type\": \"text/event-stream\",\n \"cache-control\": \"no-cache\",\n connection: \"keep-alive\",\n \"x-accel-buffering\": \"no\",\n};\n\nclass JsonToSseTransformStream extends TransformStream<unknown, string> {\n constructor() {\n super({\n transform(part, controller) {\n controller.enqueue(`data: ${JSON.stringify(part)}\\n\\n`);\n },\n flush(controller) {\n controller.enqueue(\"data: [DONE]\\n\\n\");\n },\n });\n }\n}\n\n/**\n * Turns an AsyncIterable<StreamChunk> into a streamed HTTP Response.\n * Works in Node, Bun, Cloudflare, Edge, etc.\n */\nexport function createStreamResponse(\n stream: AsyncIterable<StreamChunk>,\n): Response {\n const readable = new ReadableStream<StreamChunk>({\n async start(controller) {\n try {\n for await (const chunk of stream) {\n controller.enqueue(chunk);\n }\n } catch (err: any) {\n controller.enqueue({\n type: \"error\",\n message: String(err?.message ?? err),\n } as StreamChunk);\n } finally {\n controller.close();\n }\n },\n });\n\n return new Response(\n readable\n .pipeThrough(new JsonToSseTransformStream())\n .pipeThrough(new TextEncoderStream()),\n { headers: STREAM_HEADERS },\n );\n}\n","import type { StreamChunk } from \"../types/stream-chunk\";\nimport { createStreamResponse } from \"./create-stream-response\";\n\n/**\n * Friendly alias for createStreamResponse.\n */\nexport function toSSE(stream: AsyncIterable<StreamChunk>): Response {\n return createStreamResponse(stream);\n}\n","import type { StructuredDataChunk } from \"../types/structured-data\";\n\nexport type StructuredStreamState<TData = unknown> = {\n streamId: string;\n dataType: string;\n status: \"streaming\" | \"done\";\n data: TData;\n node?: string;\n id?: string;\n schemaId?: string;\n schemaVersion?: string;\n};\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst 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;\n if (part === undefined) {\n return args.updateLeaf(args.input);\n }\n\n const container = cloneContainerForPart({\n current: args.input,\n part,\n path: args.path,\n traversed,\n });\n\n const currentChild = Array.isArray(container)\n ? container[Number(part)]\n : container[part];\n const nextChild =\n rest.length === 0\n ? args.updateLeaf(currentChild)\n : updateByParts({\n input: currentChild,\n parts: rest,\n path: args.path,\n updateLeaf: args.updateLeaf,\n traversed: [...traversed, part],\n });\n\n if (Array.isArray(container)) {\n container[Number(part)] = nextChild;\n } else {\n container[part] = nextChild;\n }\n\n return container;\n};\n\nexport function applyStructuredChunk<TData = unknown>(\n current: StructuredStreamState<TData> | undefined,\n chunk: StructuredDataChunk,\n): StructuredStreamState<TData> {\n if (current && current.streamId !== chunk.streamId) {\n throw new Error(\n `Structured chunk streamId mismatch: expected ${current.streamId}, received ${chunk.streamId}.`,\n );\n }\n\n if (current?.status === \"done\") {\n throw new Error(\n `Structured stream ${chunk.streamId} already completed with a final chunk.`,\n );\n }\n\n const nextBase = {\n streamId: chunk.streamId,\n dataType: chunk.dataType,\n status: chunk.kind === \"final\" ? (\"done\" as const) : (\"streaming\" as const),\n ...(chunk.node ? { node: chunk.node } : {}),\n ...(chunk.id ? { id: chunk.id } : {}),\n ...(chunk.schemaId ? { schemaId: chunk.schemaId } : {}),\n ...(chunk.schemaVersion ? { schemaVersion: chunk.schemaVersion } : {}),\n };\n\n if (chunk.kind === \"final\") {\n return {\n ...nextBase,\n data: chunk.data as TData,\n };\n }\n\n const path = chunk.path;\n const pathParts = parsePath(path);\n const previousData = current?.data;\n\n if (chunk.kind === \"set\") {\n return {\n ...nextBase,\n data: updateByParts({\n input: previousData,\n parts: pathParts,\n path,\n updateLeaf: () => chunk.value,\n }) as TData,\n };\n }\n\n if (chunk.kind === \"append\") {\n return {\n ...nextBase,\n data: updateByParts({\n input: previousData,\n parts: pathParts,\n path,\n updateLeaf: (existing) => {\n if (existing === undefined) return [...chunk.items];\n if (!Array.isArray(existing)) {\n throw new Error(\n `Structured append requires path \"${path}\" to target an array, received ${describeValue(existing)}.`,\n );\n }\n return [...existing, ...chunk.items];\n },\n }) as TData,\n };\n }\n\n return {\n ...nextBase,\n data: updateByParts({\n input: previousData,\n parts: pathParts,\n path,\n updateLeaf: (existing) => {\n if (existing === undefined) return chunk.delta;\n if (typeof existing !== \"string\") {\n throw new Error(\n `Structured text-delta requires path \"${path}\" to target a string, received ${describeValue(existing)}.`,\n );\n }\n return existing + chunk.delta;\n },\n }) as TData,\n };\n}\n\nexport function reduceStructuredChunks<TData = unknown>(\n chunks: StructuredDataChunk[],\n): Record<string, StructuredStreamState<TData>> {\n return chunks.reduce<Record<string, StructuredStreamState<TData>>>(\n (acc, chunk) => {\n acc[chunk.streamId] = applyStructuredChunk(acc[chunk.streamId], chunk);\n return acc;\n },\n {},\n );\n}\n","import type { StreamChunk } from \"../types/stream-chunk\";\nimport type { StructuredDataChunk } from \"../types/structured-data\";\nimport {\n applyStructuredChunk,\n type StructuredStreamState,\n} from \"./apply-structured-chunk\";\n\nexport type StructuredStreamAccumulator<TData = unknown> = {\n apply: (chunk: StructuredDataChunk) => StructuredStreamState<TData>;\n applyStreamChunk: (\n chunk: StreamChunk,\n ) => StructuredStreamState<TData> | undefined;\n get: (streamId: string) => StructuredStreamState<TData> | undefined;\n has: (streamId: string) => boolean;\n delete: (streamId: string) => boolean;\n clear: () => void;\n size: () => number;\n entries: () => Array<[string, StructuredStreamState<TData>]>;\n values: () => StructuredStreamState<TData>[];\n toRecord: () => Record<string, StructuredStreamState<TData>>;\n};\n\nconst isStructuredDataChunk = (\n chunk: StreamChunk,\n): chunk is StructuredDataChunk => chunk.type === \"structured-data\";\n\nexport function createStructuredStreamAccumulator<TData = unknown>(\n initialChunks: Iterable<StructuredDataChunk> = [],\n): StructuredStreamAccumulator<TData> {\n const states = new Map<string, StructuredStreamState<TData>>();\n\n const apply = (chunk: StructuredDataChunk): StructuredStreamState<TData> => {\n const nextState = applyStructuredChunk(states.get(chunk.streamId), chunk);\n states.set(chunk.streamId, nextState);\n return nextState;\n };\n\n for (const chunk of initialChunks) {\n apply(chunk);\n }\n\n return {\n apply,\n applyStreamChunk: (chunk) => {\n if (!isStructuredDataChunk(chunk)) return undefined;\n return apply(chunk);\n },\n get: (streamId) => states.get(streamId),\n has: (streamId) => states.has(streamId),\n delete: (streamId) => states.delete(streamId),\n clear: () => {\n states.clear();\n },\n size: () => states.size,\n entries: () => Array.from(states.entries()),\n values: () => Array.from(states.values()),\n toRecord: () => Object.fromEntries(states.entries()),\n };\n}\n","import { z } from \"zod\";\nimport { StructuredDataChunkSchema } from \"./structured-data\";\n\nexport const StreamChunkSchema = z.union([\n z.object({\n type: z.literal(\"session\"),\n sessionId: z.string(),\n }),\n z.object({\n type: z.literal(\"status\"),\n message: z.string(),\n node: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"message\"),\n content: z.string(),\n node: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"text-start\"),\n node: z.string().optional(),\n id: z.string().optional(),\n opId: z.string().optional(),\n segmentId: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"text-delta\"),\n delta: z.string(),\n node: z.string().optional(),\n id: z.string().optional(),\n opId: z.string().optional(),\n segmentId: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"text-end\"),\n node: z.string().optional(),\n id: z.string().optional(),\n opId: z.string().optional(),\n segmentId: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"tool-result\"),\n tool: z.string().optional(),\n node: z.string().optional(),\n content: z.unknown(),\n }),\n // Interrupt request chunk (used to render interactive options in UI)\n z.object({\n type: z.literal(\"interrupt\"),\n requestId: z.string(),\n resumeToken: z.string(),\n workflow: z.string().optional(),\n node: z.string().optional(),\n id: z.string().optional(),\n opId: z.string().optional(),\n schemaId: z.string().optional(),\n schemaVersion: z.string().optional(),\n input: z.discriminatedUnion(\"kind\", [\n // Text input: question optional, no options\n z.object({\n kind: z.literal(\"text\"),\n multiple: z.boolean(),\n question: z.string().optional(),\n id: z.string().optional(),\n schemaId: z.string().optional(),\n schemaVersion: z.string().optional(),\n meta: z.record(z.unknown()).optional(),\n options: z.array(z.never()).optional(),\n }),\n // Choice/multi-choice: question + options required\n z.object({\n kind: z.enum([\"choice\", \"multi-choice\"]),\n multiple: z.boolean(),\n question: z.string(),\n id: z.string().optional(),\n schemaId: z.string().optional(),\n schemaVersion: z.string().optional(),\n meta: z.record(z.unknown()).optional(),\n options: z.array(\n z.object({\n id: z.string(),\n label: z.string(),\n description: z.string().optional(),\n }),\n ),\n }),\n ]),\n meta: z.record(z.unknown()).optional(),\n }),\n StructuredDataChunkSchema,\n z.object({\n type: z.literal(\"transition\"),\n transitionTo: z.string(),\n payload: z.any().optional(),\n }),\n z.object({ type: z.literal(\"done\"), data: z.any().optional() }),\n z.object({ type: z.literal(\"error\"), message: z.string() }),\n]);\n\nexport type StreamChunk = z.infer<typeof StreamChunkSchema>;\n","import { z } from \"zod\";\n\nconst StructuredDataBase = z.object({\n type: z.literal(\"structured-data\"),\n streamId: z.string(),\n dataType: z.string(),\n kind: z.enum([\"set\", \"append\", \"text-delta\", \"final\"]),\n schemaId: z.string().optional(),\n schemaVersion: z.string().optional(),\n id: z.string().optional(),\n node: z.string().optional(),\n});\n\nconst StructuredSetChunkSchema = StructuredDataBase.extend({\n kind: z.literal(\"set\"),\n path: z.string().min(1),\n value: z.unknown(),\n});\n\nconst StructuredAppendChunkSchema = StructuredDataBase.extend({\n kind: z.literal(\"append\"),\n path: z.string().min(1),\n items: z.array(z.unknown()),\n});\n\nconst StructuredTextDeltaChunkSchema = StructuredDataBase.extend({\n kind: z.literal(\"text-delta\"),\n path: z.string().min(1),\n delta: z.string(),\n});\n\nconst StructuredFinalChunkSchema = StructuredDataBase.extend({\n kind: z.literal(\"final\"),\n data: z.unknown(),\n});\n\nexport const StructuredDataChunkSchema = z.union([\n StructuredSetChunkSchema,\n StructuredAppendChunkSchema,\n StructuredTextDeltaChunkSchema,\n StructuredFinalChunkSchema,\n]);\n\nexport type StructuredDataChunk = z.infer<typeof StructuredDataChunkSchema>;\n"],"mappings":"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","names":["import_zod"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kortyx/stream",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.1",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Streaming primitives for Kortyx.",
|
|
6
6
|
"keywords": [
|
|
@@ -43,7 +43,8 @@
|
|
|
43
43
|
"concurrently": "^9.2.0",
|
|
44
44
|
"turbo": "^2.5.4",
|
|
45
45
|
"typescript": "5.7.2",
|
|
46
|
-
"tsup": "^8.5.1"
|
|
46
|
+
"tsup": "^8.5.1",
|
|
47
|
+
"vitest": "^3.2.4"
|
|
47
48
|
},
|
|
48
49
|
"repository": {
|
|
49
50
|
"type": "git",
|
|
@@ -58,7 +59,7 @@
|
|
|
58
59
|
"predev": "tsc -p tsconfig.json",
|
|
59
60
|
"dev": "tsc --watch",
|
|
60
61
|
"lint": "biome check src",
|
|
61
|
-
"test": "pnpm -s type-check",
|
|
62
|
+
"test": "vitest run && pnpm -s type-check",
|
|
62
63
|
"type-check": "tsc --noEmit"
|
|
63
64
|
}
|
|
64
65
|
}
|