@kortyx/stream 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,26 @@
1
1
  # @chatbot-core/types
2
2
 
3
+ ## [0.7.0](https://github.com/kortyx-io/kortyx/compare/stream-v0.6.1...stream-v0.7.0) (2026-05-20)
4
+
5
+
6
+ ### Features
7
+
8
+ * **react:** tighten useChat lifecycle controls ([1672c72](https://github.com/kortyx-io/kortyx/commit/1672c72a524d16fae2f23dcbec1b91191747dc25))
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * expand test coverage and source cleanups ([f1d89ae](https://github.com/kortyx-io/kortyx/commit/f1d89ae61b3655d41450c66cf850e0e00972f54e))
14
+ * expand test coverage and source cleanups ([4831a25](https://github.com/kortyx-io/kortyx/commit/4831a25e9517f56b99610bddd4b48a10eff72047))
15
+
16
+ ## [0.6.1](https://github.com/kortyx-io/kortyx/compare/stream-v0.6.0...stream-v0.6.1) (2026-04-22)
17
+
18
+
19
+ ### Bug Fixes
20
+
21
+ * **stream:** enforce structured chunk contract semantics ([bdbc518](https://github.com/kortyx-io/kortyx/commit/bdbc518366baacddb1a2ebb890b19e6564e2bee4))
22
+ * **stream:** enforce structured chunk contract semantics ([249d6e4](https://github.com/kortyx-io/kortyx/commit/249d6e47e1960debb0f396a4e7251bf9df38d7d2))
23
+
3
24
  ## [0.6.0](https://github.com/kortyx-io/kortyx/compare/stream-v0.5.2...stream-v0.6.0) (2026-04-17)
4
25
 
5
26
 
@@ -0,0 +1,230 @@
1
+ import { z } from 'zod';
2
+
3
+ declare const StreamChunkSchema: z.ZodUnion<readonly [z.ZodObject<{
4
+ type: z.ZodLiteral<"session">;
5
+ sessionId: z.ZodString;
6
+ }, z.core.$strip>, z.ZodObject<{
7
+ type: z.ZodLiteral<"status">;
8
+ message: z.ZodString;
9
+ node: z.ZodOptional<z.ZodString>;
10
+ }, z.core.$strip>, z.ZodObject<{
11
+ type: z.ZodLiteral<"message">;
12
+ content: z.ZodString;
13
+ node: z.ZodOptional<z.ZodString>;
14
+ }, z.core.$strip>, z.ZodObject<{
15
+ type: z.ZodLiteral<"text-start">;
16
+ node: z.ZodOptional<z.ZodString>;
17
+ id: z.ZodOptional<z.ZodString>;
18
+ opId: z.ZodOptional<z.ZodString>;
19
+ segmentId: z.ZodOptional<z.ZodString>;
20
+ }, z.core.$strip>, z.ZodObject<{
21
+ type: z.ZodLiteral<"text-delta">;
22
+ delta: z.ZodString;
23
+ node: z.ZodOptional<z.ZodString>;
24
+ id: z.ZodOptional<z.ZodString>;
25
+ opId: z.ZodOptional<z.ZodString>;
26
+ segmentId: z.ZodOptional<z.ZodString>;
27
+ }, z.core.$strip>, z.ZodObject<{
28
+ type: z.ZodLiteral<"text-end">;
29
+ node: z.ZodOptional<z.ZodString>;
30
+ id: z.ZodOptional<z.ZodString>;
31
+ opId: z.ZodOptional<z.ZodString>;
32
+ segmentId: z.ZodOptional<z.ZodString>;
33
+ }, z.core.$strip>, z.ZodObject<{
34
+ type: z.ZodLiteral<"tool-result">;
35
+ tool: z.ZodOptional<z.ZodString>;
36
+ node: z.ZodOptional<z.ZodString>;
37
+ content: z.ZodUnknown;
38
+ }, z.core.$strip>, z.ZodObject<{
39
+ type: z.ZodLiteral<"interrupt">;
40
+ requestId: z.ZodString;
41
+ resumeToken: z.ZodString;
42
+ workflow: z.ZodOptional<z.ZodString>;
43
+ node: z.ZodOptional<z.ZodString>;
44
+ id: z.ZodOptional<z.ZodString>;
45
+ opId: z.ZodOptional<z.ZodString>;
46
+ schemaId: z.ZodOptional<z.ZodString>;
47
+ schemaVersion: z.ZodOptional<z.ZodString>;
48
+ input: z.ZodDiscriminatedUnion<[z.ZodObject<{
49
+ kind: z.ZodLiteral<"text">;
50
+ multiple: z.ZodBoolean;
51
+ question: z.ZodOptional<z.ZodString>;
52
+ id: z.ZodOptional<z.ZodString>;
53
+ schemaId: z.ZodOptional<z.ZodString>;
54
+ schemaVersion: z.ZodOptional<z.ZodString>;
55
+ meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
56
+ options: z.ZodOptional<z.ZodArray<z.ZodNever>>;
57
+ }, z.core.$strip>, z.ZodObject<{
58
+ kind: z.ZodEnum<{
59
+ choice: "choice";
60
+ "multi-choice": "multi-choice";
61
+ }>;
62
+ multiple: z.ZodBoolean;
63
+ question: z.ZodString;
64
+ id: z.ZodOptional<z.ZodString>;
65
+ schemaId: z.ZodOptional<z.ZodString>;
66
+ schemaVersion: z.ZodOptional<z.ZodString>;
67
+ meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
68
+ options: z.ZodArray<z.ZodObject<{
69
+ id: z.ZodString;
70
+ label: z.ZodString;
71
+ description: z.ZodOptional<z.ZodString>;
72
+ }, z.core.$strip>>;
73
+ }, z.core.$strip>], "kind">;
74
+ meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
75
+ }, z.core.$strip>, z.ZodUnion<readonly [z.ZodObject<{
76
+ type: z.ZodLiteral<"structured-data">;
77
+ streamId: z.ZodString;
78
+ dataType: z.ZodString;
79
+ schemaId: z.ZodOptional<z.ZodString>;
80
+ schemaVersion: z.ZodOptional<z.ZodString>;
81
+ id: z.ZodOptional<z.ZodString>;
82
+ node: z.ZodOptional<z.ZodString>;
83
+ kind: z.ZodLiteral<"set">;
84
+ path: z.ZodString;
85
+ value: z.ZodUnknown;
86
+ }, z.core.$strip>, z.ZodObject<{
87
+ type: z.ZodLiteral<"structured-data">;
88
+ streamId: z.ZodString;
89
+ dataType: z.ZodString;
90
+ schemaId: z.ZodOptional<z.ZodString>;
91
+ schemaVersion: z.ZodOptional<z.ZodString>;
92
+ id: z.ZodOptional<z.ZodString>;
93
+ node: z.ZodOptional<z.ZodString>;
94
+ kind: z.ZodLiteral<"append">;
95
+ path: z.ZodString;
96
+ items: z.ZodArray<z.ZodUnknown>;
97
+ }, z.core.$strip>, z.ZodObject<{
98
+ type: z.ZodLiteral<"structured-data">;
99
+ streamId: z.ZodString;
100
+ dataType: z.ZodString;
101
+ schemaId: z.ZodOptional<z.ZodString>;
102
+ schemaVersion: z.ZodOptional<z.ZodString>;
103
+ id: z.ZodOptional<z.ZodString>;
104
+ node: z.ZodOptional<z.ZodString>;
105
+ kind: z.ZodLiteral<"text-delta">;
106
+ path: z.ZodString;
107
+ delta: z.ZodString;
108
+ }, z.core.$strip>, z.ZodObject<{
109
+ type: z.ZodLiteral<"structured-data">;
110
+ streamId: z.ZodString;
111
+ dataType: z.ZodString;
112
+ schemaId: z.ZodOptional<z.ZodString>;
113
+ schemaVersion: z.ZodOptional<z.ZodString>;
114
+ id: z.ZodOptional<z.ZodString>;
115
+ node: z.ZodOptional<z.ZodString>;
116
+ kind: z.ZodLiteral<"final">;
117
+ data: z.ZodUnknown;
118
+ }, z.core.$strip>]>, z.ZodObject<{
119
+ type: z.ZodLiteral<"transition">;
120
+ transitionTo: z.ZodString;
121
+ payload: z.ZodOptional<z.ZodAny>;
122
+ }, z.core.$strip>, z.ZodObject<{
123
+ type: z.ZodLiteral<"done">;
124
+ data: z.ZodOptional<z.ZodAny>;
125
+ }, z.core.$strip>, z.ZodObject<{
126
+ type: z.ZodLiteral<"error">;
127
+ message: z.ZodString;
128
+ }, z.core.$strip>]>;
129
+ type StreamChunk = z.infer<typeof StreamChunkSchema>;
130
+
131
+ interface ConsumeStreamHandlers {
132
+ onChunk?: (chunk: StreamChunk) => undefined | boolean | Promise<boolean | undefined>;
133
+ onDone?: () => void | Promise<void>;
134
+ onError?: (error: Error, chunk?: StreamChunk) => void | Promise<void>;
135
+ }
136
+ /**
137
+ * Consume a stream of StreamChunk events with callback handlers.
138
+ * Returns when a `done` chunk is seen, the stream ends, or `onChunk` returns `false`.
139
+ */
140
+ declare function consumeStream(stream: AsyncIterable<StreamChunk>, handlers?: ConsumeStreamHandlers): Promise<void>;
141
+
142
+ /**
143
+ * Reads a server-sent event (SSE) Response body and yields StreamChunk objects.
144
+ */
145
+ declare function readStream(body: ReadableStream<Uint8Array> | null): AsyncGenerator<StreamChunk, void, void>;
146
+
147
+ interface StreamFromRouteArgs<TBody = unknown> {
148
+ endpoint: string;
149
+ body: TBody;
150
+ method?: string | undefined;
151
+ fetchImpl?: typeof fetch;
152
+ headers?: Record<string, string> | undefined;
153
+ signal?: AbortSignal | undefined;
154
+ }
155
+ declare function streamFromRoute<TBody = unknown>(args: StreamFromRouteArgs<TBody>): AsyncGenerator<StreamChunk, void, void>;
156
+
157
+ declare const StructuredDataChunkSchema: z.ZodUnion<readonly [z.ZodObject<{
158
+ type: z.ZodLiteral<"structured-data">;
159
+ streamId: z.ZodString;
160
+ dataType: z.ZodString;
161
+ schemaId: z.ZodOptional<z.ZodString>;
162
+ schemaVersion: z.ZodOptional<z.ZodString>;
163
+ id: z.ZodOptional<z.ZodString>;
164
+ node: z.ZodOptional<z.ZodString>;
165
+ kind: z.ZodLiteral<"set">;
166
+ path: z.ZodString;
167
+ value: z.ZodUnknown;
168
+ }, z.core.$strip>, z.ZodObject<{
169
+ type: z.ZodLiteral<"structured-data">;
170
+ streamId: z.ZodString;
171
+ dataType: z.ZodString;
172
+ schemaId: z.ZodOptional<z.ZodString>;
173
+ schemaVersion: z.ZodOptional<z.ZodString>;
174
+ id: z.ZodOptional<z.ZodString>;
175
+ node: z.ZodOptional<z.ZodString>;
176
+ kind: z.ZodLiteral<"append">;
177
+ path: z.ZodString;
178
+ items: z.ZodArray<z.ZodUnknown>;
179
+ }, z.core.$strip>, z.ZodObject<{
180
+ type: z.ZodLiteral<"structured-data">;
181
+ streamId: z.ZodString;
182
+ dataType: z.ZodString;
183
+ schemaId: z.ZodOptional<z.ZodString>;
184
+ schemaVersion: z.ZodOptional<z.ZodString>;
185
+ id: z.ZodOptional<z.ZodString>;
186
+ node: z.ZodOptional<z.ZodString>;
187
+ kind: z.ZodLiteral<"text-delta">;
188
+ path: z.ZodString;
189
+ delta: z.ZodString;
190
+ }, z.core.$strip>, z.ZodObject<{
191
+ type: z.ZodLiteral<"structured-data">;
192
+ streamId: z.ZodString;
193
+ dataType: z.ZodString;
194
+ schemaId: z.ZodOptional<z.ZodString>;
195
+ schemaVersion: z.ZodOptional<z.ZodString>;
196
+ id: z.ZodOptional<z.ZodString>;
197
+ node: z.ZodOptional<z.ZodString>;
198
+ kind: z.ZodLiteral<"final">;
199
+ data: z.ZodUnknown;
200
+ }, z.core.$strip>]>;
201
+ type StructuredDataChunk = z.infer<typeof StructuredDataChunkSchema>;
202
+
203
+ type StructuredStreamState<TData = unknown> = {
204
+ streamId: string;
205
+ dataType: string;
206
+ status: "streaming" | "done";
207
+ data: TData;
208
+ node?: string;
209
+ id?: string;
210
+ schemaId?: string;
211
+ schemaVersion?: string;
212
+ };
213
+ declare function applyStructuredChunk<TData = unknown>(current: StructuredStreamState<TData> | undefined, chunk: StructuredDataChunk): StructuredStreamState<TData>;
214
+ declare function reduceStructuredChunks<TData = unknown>(chunks: StructuredDataChunk[]): Record<string, StructuredStreamState<TData>>;
215
+
216
+ type StructuredStreamAccumulator<TData = unknown> = {
217
+ apply: (chunk: StructuredDataChunk) => StructuredStreamState<TData>;
218
+ applyStreamChunk: (chunk: StreamChunk) => StructuredStreamState<TData> | undefined;
219
+ get: (streamId: string) => StructuredStreamState<TData> | undefined;
220
+ has: (streamId: string) => boolean;
221
+ delete: (streamId: string) => boolean;
222
+ clear: () => void;
223
+ size: () => number;
224
+ entries: () => Array<[string, StructuredStreamState<TData>]>;
225
+ values: () => StructuredStreamState<TData>[];
226
+ toRecord: () => Record<string, StructuredStreamState<TData>>;
227
+ };
228
+ declare function createStructuredStreamAccumulator<TData = unknown>(initialChunks?: Iterable<StructuredDataChunk>): StructuredStreamAccumulator<TData>;
229
+
230
+ export { type ConsumeStreamHandlers as C, type StreamChunk as S, type StructuredDataChunk as a, StreamChunkSchema as b, type StreamFromRouteArgs as c, StructuredDataChunkSchema as d, type StructuredStreamAccumulator as e, type StructuredStreamState as f, applyStructuredChunk as g, consumeStream as h, createStructuredStreamAccumulator as i, reduceStructuredChunks as j, readStream as r, streamFromRoute as s };
package/dist/browser.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export { C as ConsumeStreamHandlers, S as StreamChunk, c as StreamFromRouteArgs, a as StructuredDataChunk, e as StructuredStreamAccumulator, f as StructuredStreamState, g as applyStructuredChunk, h as consumeStream, i as createStructuredStreamAccumulator, r as readStream, j as reduceStructuredChunks, s as streamFromRoute } from './browser-DBfCMmkm.js';
1
+ export { C as ConsumeStreamHandlers, S as StreamChunk, c as StreamFromRouteArgs, a as StructuredDataChunk, e as StructuredStreamAccumulator, f as StructuredStreamState, g as applyStructuredChunk, h as consumeStream, i as createStructuredStreamAccumulator, r as readStream, j as reduceStructuredChunks, s as streamFromRoute } from './browser-BxE1kH8b.js';
2
2
  import 'zod';
package/dist/browser.js CHANGED
@@ -31,10 +31,7 @@ module.exports = __toCommonJS(browser_exports);
31
31
  // src/client/consume-stream.ts
32
32
  var toError = (value) => value instanceof Error ? value : new Error(String(value));
33
33
  async function consumeStream(stream, handlers = {}) {
34
- let doneCalled = false;
35
34
  const callDone = async () => {
36
- if (doneCalled) return;
37
- doneCalled = true;
38
35
  await handlers.onDone?.();
39
36
  };
40
37
  try {
@@ -70,7 +67,7 @@ async function* readStream(body) {
70
67
  if (done) break;
71
68
  buffer += decoder.decode(value, { stream: true });
72
69
  const parts = buffer.split("\n\n");
73
- buffer = parts.pop() ?? "";
70
+ buffer = parts.pop();
74
71
  for (const part of parts) {
75
72
  if (!part.startsWith("data: ")) continue;
76
73
  const payload = part.slice(6);
@@ -113,7 +110,8 @@ async function* streamFromRoute(args) {
113
110
  "content-type": "application/json",
114
111
  ...args.headers ?? {}
115
112
  },
116
- body: JSON.stringify(args.body)
113
+ body: JSON.stringify(args.body),
114
+ ...args.signal ? { signal: args.signal } : {}
117
115
  });
118
116
  } catch (error) {
119
117
  yield { type: "error", message: toErrorMessage(error) };
@@ -130,47 +128,66 @@ async function* streamFromRoute(args) {
130
128
 
131
129
  // src/structured/apply-structured-chunk.ts
132
130
  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
131
  var isArrayIndex = (value) => /^\d+$/.test(value);
139
- var setByParts = (input, parts, value) => {
140
- if (parts.length === 0) return value;
141
- const [part, ...rest] = parts;
142
- if (part === void 0) return value;
143
- if (Array.isArray(input) || isArrayIndex(part)) {
144
- const nextArray = Array.isArray(input) ? [...input] : [];
145
- const index = Number(part);
146
- if (!Number.isInteger(index)) return nextArray;
147
- nextArray[index] = setByParts(nextArray[index], rest, value);
148
- return nextArray;
132
+ var describeValue = (value) => {
133
+ if (value === null) return "null";
134
+ if (Array.isArray(value)) return "array";
135
+ return typeof value;
136
+ };
137
+ var parsePath = (path) => {
138
+ if (path.length === 0) {
139
+ throw new Error(
140
+ "Structured chunk path must be a non-empty dot-separated string."
141
+ );
149
142
  }
150
- const nextObject = isPlainObject(input) ? { ...input } : {};
151
- nextObject[part] = setByParts(nextObject[part], rest, value);
152
- return nextObject;
143
+ const parts = path.split(".");
144
+ if (parts.some((part) => part.length === 0)) {
145
+ throw new Error(
146
+ `Structured chunk path "${path}" must not contain empty segments.`
147
+ );
148
+ }
149
+ return parts;
153
150
  };
154
- var getByPath = (input, path) => {
155
- const parts = path.split(".").filter(Boolean);
156
- let current = input;
157
- for (const part of parts) {
158
- if (Array.isArray(current)) {
159
- const index = Number(part);
160
- current = Number.isInteger(index) ? current[index] : void 0;
161
- continue;
162
- }
163
- if (isPlainObject(current)) {
164
- current = current[part];
165
- continue;
166
- }
167
- return void 0;
151
+ var cloneContainerForPart = (args) => {
152
+ const expected = isArrayIndex(args.part) ? "array" : "object";
153
+ const location = args.traversed.length === 0 ? "<root>" : args.traversed.join(".");
154
+ if (args.current === void 0) {
155
+ return expected === "array" ? [] : {};
156
+ }
157
+ if (expected === "array") {
158
+ if (Array.isArray(args.current)) return [...args.current];
159
+ throw new Error(
160
+ `Structured path conflict at ${location} for "${args.path}": expected array container, received ${describeValue(args.current)}.`
161
+ );
168
162
  }
169
- return current;
163
+ if (isPlainObject(args.current)) return { ...args.current };
164
+ throw new Error(
165
+ `Structured path conflict at ${location} for "${args.path}": expected object container, received ${describeValue(args.current)}.`
166
+ );
170
167
  };
171
- var setByPath = (input, path, value) => {
172
- const parts = path.split(".").filter(Boolean);
173
- return parts.length === 0 ? value : setByParts(cloneContainer(input), parts, value);
168
+ var updateByParts = (args) => {
169
+ const traversed = args.traversed ?? [];
170
+ const [part, ...rest] = args.parts;
171
+ const container = cloneContainerForPart({
172
+ current: args.input,
173
+ part,
174
+ path: args.path,
175
+ traversed
176
+ });
177
+ const currentChild = Array.isArray(container) ? container[Number(part)] : container[part];
178
+ const nextChild = rest.length === 0 ? args.updateLeaf(currentChild) : updateByParts({
179
+ input: currentChild,
180
+ parts: rest,
181
+ path: args.path,
182
+ updateLeaf: args.updateLeaf,
183
+ traversed: [...traversed, part]
184
+ });
185
+ if (Array.isArray(container)) {
186
+ container[Number(part)] = nextChild;
187
+ } else {
188
+ container[part] = nextChild;
189
+ }
190
+ return container;
174
191
  };
175
192
  function applyStructuredChunk(current, chunk) {
176
193
  if (current && current.streamId !== chunk.streamId) {
@@ -198,26 +215,55 @@ function applyStructuredChunk(current, chunk) {
198
215
  data: chunk.data
199
216
  };
200
217
  }
201
- const previousData = current?.data !== void 0 ? current.data : {};
218
+ const path = chunk.path;
219
+ const pathParts = parsePath(path);
220
+ const previousData = current?.data;
202
221
  if (chunk.kind === "set") {
203
222
  return {
204
223
  ...nextBase,
205
- data: setByPath(previousData, chunk.path, chunk.value)
224
+ data: updateByParts({
225
+ input: previousData,
226
+ parts: pathParts,
227
+ path,
228
+ updateLeaf: () => chunk.value
229
+ })
206
230
  };
207
231
  }
208
232
  if (chunk.kind === "append") {
209
- const existing2 = getByPath(previousData, chunk.path);
210
- const nextItems = Array.isArray(existing2) ? [...existing2, ...chunk.items] : [...chunk.items];
211
233
  return {
212
234
  ...nextBase,
213
- data: setByPath(previousData, chunk.path, nextItems)
235
+ data: updateByParts({
236
+ input: previousData,
237
+ parts: pathParts,
238
+ path,
239
+ updateLeaf: (existing) => {
240
+ if (existing === void 0) return [...chunk.items];
241
+ if (!Array.isArray(existing)) {
242
+ throw new Error(
243
+ `Structured append requires path "${path}" to target an array, received ${describeValue(existing)}.`
244
+ );
245
+ }
246
+ return [...existing, ...chunk.items];
247
+ }
248
+ })
214
249
  };
215
250
  }
216
- const existing = getByPath(previousData, chunk.path);
217
- const text = typeof existing === "string" ? existing : "";
218
251
  return {
219
252
  ...nextBase,
220
- data: setByPath(previousData, chunk.path, text + chunk.delta)
253
+ data: updateByParts({
254
+ input: previousData,
255
+ parts: pathParts,
256
+ path,
257
+ updateLeaf: (existing) => {
258
+ if (existing === void 0) return chunk.delta;
259
+ if (typeof existing !== "string") {
260
+ throw new Error(
261
+ `Structured text-delta requires path "${path}" to target a string, received ${describeValue(existing)}.`
262
+ );
263
+ }
264
+ return existing + chunk.delta;
265
+ }
266
+ })
221
267
  };
222
268
  }
223
269
  function reduceStructuredChunks(chunks) {
@@ -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 const callDone = async () => {\n await handlers.onDone?.();\n };\n\n try {\n for await (const chunk of stream) {\n const shouldContinue = await handlers.onChunk?.(chunk);\n\n if (chunk.type === \"error\") {\n await handlers.onError?.(\n new Error(chunk.message || \"Stream error.\"),\n chunk,\n );\n }\n\n if (chunk.type === \"done\" || shouldContinue === false) {\n await callDone();\n return;\n }\n }\n\n await callDone();\n } catch (error) {\n const normalized = toError(error);\n await handlers.onError?.(normalized);\n throw normalized;\n }\n}\n","// packages/stream/src/client/read-stream.ts\nimport type { StreamChunk } from \"../types/stream-chunk\";\n\n/**\n * Reads a server-sent event (SSE) Response body and yields StreamChunk objects.\n */\nexport async function* readStream(\n body: ReadableStream<Uint8Array> | null,\n): AsyncGenerator<StreamChunk, void, void> {\n if (!body) return;\n\n const reader = body.getReader();\n const decoder = new TextDecoder(\"utf-8\");\n let buffer = \"\";\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const parts = buffer.split(\"\\n\\n\");\n buffer = parts.pop() as string;\n\n for (const part of parts) {\n if (!part.startsWith(\"data: \")) continue;\n const payload = part.slice(6);\n if (payload.trim() === \"[DONE]\") return;\n try {\n yield JSON.parse(payload) as StreamChunk;\n } catch (err) {\n console.warn(\"Invalid JSON in stream chunk:\", payload);\n console.error(err);\n }\n }\n }\n}\n","import type { StreamChunk } from \"../types/stream-chunk\";\nimport { readStream } from \"./read-stream\";\n\nexport interface StreamFromRouteArgs<TBody = unknown> {\n endpoint: string;\n body: TBody;\n method?: string | undefined;\n fetchImpl?: typeof fetch;\n headers?: Record<string, string> | undefined;\n signal?: AbortSignal | undefined;\n}\n\nconst toErrorMessage = (error: unknown): string =>\n error instanceof Error ? error.message : String(error);\n\nconst readErrorMessage = async (response: Response): Promise<string> => {\n let message = `Request failed (${response.status})`;\n try {\n const payload = (await response.json()) as unknown;\n if (\n payload &&\n typeof payload === \"object\" &&\n \"error\" in payload &&\n typeof (payload as { error?: unknown }).error === \"string\"\n ) {\n message = (payload as { error: string }).error;\n }\n } catch {}\n return message;\n};\n\nexport async function* streamFromRoute<TBody = unknown>(\n args: StreamFromRouteArgs<TBody>,\n): AsyncGenerator<StreamChunk, void, void> {\n const fetchFn = args.fetchImpl ?? globalThis.fetch;\n if (!fetchFn) {\n yield { type: \"error\", message: \"No fetch implementation available.\" };\n yield { type: \"done\" };\n return;\n }\n\n let response: Response;\n try {\n response = await fetchFn(args.endpoint, {\n method: args.method ?? \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n ...(args.headers ?? {}),\n },\n body: JSON.stringify(args.body),\n ...(args.signal ? { signal: args.signal } : {}),\n });\n } catch (error) {\n yield { type: \"error\", message: toErrorMessage(error) };\n yield { type: \"done\" };\n return;\n }\n\n if (!response.ok) {\n yield { type: \"error\", message: await readErrorMessage(response) };\n yield { type: \"done\" };\n return;\n }\n\n yield* readStream(response.body);\n}\n","import type { StructuredDataChunk } from \"../types/structured-data\";\n\nexport type StructuredStreamState<TData = unknown> = {\n streamId: string;\n dataType: string;\n status: \"streaming\" | \"done\";\n data: TData;\n node?: string;\n id?: string;\n schemaId?: string;\n schemaVersion?: string;\n};\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst isArrayIndex = (value: string): boolean => /^\\d+$/.test(value);\n\nconst describeValue = (value: unknown): string => {\n if (value === null) return \"null\";\n if (Array.isArray(value)) return \"array\";\n return typeof value;\n};\n\nconst parsePath = (path: string): string[] => {\n if (path.length === 0) {\n throw new Error(\n \"Structured chunk path must be a non-empty dot-separated string.\",\n );\n }\n\n const parts = path.split(\".\");\n if (parts.some((part) => part.length === 0)) {\n throw new Error(\n `Structured chunk path \"${path}\" must not contain empty segments.`,\n );\n }\n\n return parts;\n};\n\nconst cloneContainerForPart = (args: {\n current: unknown;\n part: string;\n path: string;\n traversed: string[];\n}): Record<string, unknown> | unknown[] => {\n const expected = isArrayIndex(args.part) ? \"array\" : \"object\";\n const location =\n args.traversed.length === 0 ? \"<root>\" : args.traversed.join(\".\");\n\n if (args.current === undefined) {\n return expected === \"array\" ? [] : {};\n }\n\n if (expected === \"array\") {\n if (Array.isArray(args.current)) return [...args.current];\n throw new Error(\n `Structured path conflict at ${location} for \"${args.path}\": expected array container, received ${describeValue(args.current)}.`,\n );\n }\n\n if (isPlainObject(args.current)) return { ...args.current };\n\n throw new Error(\n `Structured path conflict at ${location} for \"${args.path}\": expected object container, received ${describeValue(args.current)}.`,\n );\n};\n\nconst updateByParts = (args: {\n input: unknown;\n parts: string[];\n path: string;\n updateLeaf: (current: unknown) => unknown;\n traversed?: string[];\n}): unknown => {\n const traversed = args.traversed ?? [];\n const [part, ...rest] = args.parts as [string, ...string[]];\n\n const container = cloneContainerForPart({\n current: args.input,\n part,\n path: args.path,\n traversed,\n });\n\n const currentChild = Array.isArray(container)\n ? container[Number(part)]\n : container[part];\n const nextChild =\n rest.length === 0\n ? args.updateLeaf(currentChild)\n : updateByParts({\n input: currentChild,\n parts: rest,\n path: args.path,\n updateLeaf: args.updateLeaf,\n traversed: [...traversed, part],\n });\n\n if (Array.isArray(container)) {\n container[Number(part)] = nextChild;\n } else {\n container[part] = nextChild;\n }\n\n return container;\n};\n\nexport function applyStructuredChunk<TData = unknown>(\n current: StructuredStreamState<TData> | undefined,\n chunk: StructuredDataChunk,\n): StructuredStreamState<TData> {\n if (current && current.streamId !== chunk.streamId) {\n throw new Error(\n `Structured chunk streamId mismatch: expected ${current.streamId}, received ${chunk.streamId}.`,\n );\n }\n\n if (current?.status === \"done\") {\n throw new Error(\n `Structured stream ${chunk.streamId} already completed with a final chunk.`,\n );\n }\n\n const nextBase = {\n streamId: chunk.streamId,\n dataType: chunk.dataType,\n status: chunk.kind === \"final\" ? (\"done\" as const) : (\"streaming\" as const),\n ...(chunk.node ? { node: chunk.node } : {}),\n ...(chunk.id ? { id: chunk.id } : {}),\n ...(chunk.schemaId ? { schemaId: chunk.schemaId } : {}),\n ...(chunk.schemaVersion ? { schemaVersion: chunk.schemaVersion } : {}),\n };\n\n if (chunk.kind === \"final\") {\n return {\n ...nextBase,\n data: chunk.data as TData,\n };\n }\n\n const path = chunk.path;\n const pathParts = parsePath(path);\n const previousData = current?.data;\n\n if (chunk.kind === \"set\") {\n return {\n ...nextBase,\n data: updateByParts({\n input: previousData,\n parts: pathParts,\n path,\n updateLeaf: () => chunk.value,\n }) as TData,\n };\n }\n\n if (chunk.kind === \"append\") {\n return {\n ...nextBase,\n data: updateByParts({\n input: previousData,\n parts: pathParts,\n path,\n updateLeaf: (existing) => {\n if (existing === undefined) return [...chunk.items];\n if (!Array.isArray(existing)) {\n throw new Error(\n `Structured append requires path \"${path}\" to target an array, received ${describeValue(existing)}.`,\n );\n }\n return [...existing, ...chunk.items];\n },\n }) as TData,\n };\n }\n\n return {\n ...nextBase,\n data: updateByParts({\n input: previousData,\n parts: pathParts,\n path,\n updateLeaf: (existing) => {\n if (existing === undefined) return chunk.delta;\n if (typeof existing !== \"string\") {\n throw new Error(\n `Structured text-delta requires path \"${path}\" to target a string, received ${describeValue(existing)}.`,\n );\n }\n return existing + chunk.delta;\n },\n }) as TData,\n };\n}\n\nexport function reduceStructuredChunks<TData = unknown>(\n chunks: StructuredDataChunk[],\n): Record<string, StructuredStreamState<TData>> {\n return chunks.reduce<Record<string, StructuredStreamState<TData>>>(\n (acc, chunk) => {\n acc[chunk.streamId] = applyStructuredChunk(acc[chunk.streamId], chunk);\n return acc;\n },\n {},\n );\n}\n","import type { StreamChunk } from \"../types/stream-chunk\";\nimport type { StructuredDataChunk } from \"../types/structured-data\";\nimport {\n applyStructuredChunk,\n type StructuredStreamState,\n} from \"./apply-structured-chunk\";\n\nexport type StructuredStreamAccumulator<TData = unknown> = {\n apply: (chunk: StructuredDataChunk) => StructuredStreamState<TData>;\n applyStreamChunk: (\n chunk: StreamChunk,\n ) => StructuredStreamState<TData> | undefined;\n get: (streamId: string) => StructuredStreamState<TData> | undefined;\n has: (streamId: string) => boolean;\n delete: (streamId: string) => boolean;\n clear: () => void;\n size: () => number;\n entries: () => Array<[string, StructuredStreamState<TData>]>;\n values: () => StructuredStreamState<TData>[];\n toRecord: () => Record<string, StructuredStreamState<TData>>;\n};\n\nconst isStructuredDataChunk = (\n chunk: StreamChunk,\n): chunk is StructuredDataChunk => chunk.type === \"structured-data\";\n\nexport function createStructuredStreamAccumulator<TData = unknown>(\n initialChunks: Iterable<StructuredDataChunk> = [],\n): StructuredStreamAccumulator<TData> {\n const states = new Map<string, StructuredStreamState<TData>>();\n\n const apply = (chunk: StructuredDataChunk): StructuredStreamState<TData> => {\n const nextState = applyStructuredChunk(states.get(chunk.streamId), chunk);\n states.set(chunk.streamId, nextState);\n return nextState;\n };\n\n for (const chunk of initialChunks) {\n apply(chunk);\n }\n\n return {\n apply,\n applyStreamChunk: (chunk) => {\n if (!isStructuredDataChunk(chunk)) return undefined;\n return apply(chunk);\n },\n get: (streamId) => states.get(streamId),\n has: (streamId) => states.has(streamId),\n delete: (streamId) => states.delete(streamId),\n clear: () => {\n states.clear();\n },\n size: () => states.size,\n entries: () => Array.from(states.entries()),\n values: () => Array.from(states.values()),\n toRecord: () => Object.fromEntries(states.entries()),\n };\n}\n"],"mappings":"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","names":[]}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { S as StreamChunk, a as StructuredDataChunk } from './browser-DBfCMmkm.js';
2
- export { C as ConsumeStreamHandlers, b as StreamChunkSchema, c as StreamFromRouteArgs, d as StructuredDataChunkSchema, e as StructuredStreamAccumulator, f as StructuredStreamState, g as applyStructuredChunk, h as consumeStream, i as createStructuredStreamAccumulator, r as readStream, j as reduceStructuredChunks, s as streamFromRoute } from './browser-DBfCMmkm.js';
1
+ import { S as StreamChunk, a as StructuredDataChunk } from './browser-BxE1kH8b.js';
2
+ export { C as ConsumeStreamHandlers, b as StreamChunkSchema, c as StreamFromRouteArgs, d as StructuredDataChunkSchema, e as StructuredStreamAccumulator, f as StructuredStreamState, g as applyStructuredChunk, h as consumeStream, i as createStructuredStreamAccumulator, r as readStream, j as reduceStructuredChunks, s as streamFromRoute } from './browser-BxE1kH8b.js';
3
3
  import 'zod';
4
4
 
5
5
  interface BufferedStreamResult {