@kortyx/stream 0.11.0 → 0.13.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 +32 -0
- package/dist/{browser-b80PSSGY.d.ts → browser-BFBys6ZN.d.ts} +25 -1
- package/dist/browser.d.ts +2 -1
- package/dist/browser.js +86 -23
- package/dist/browser.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.js +109 -29
- package/dist/index.js.map +1 -1
- package/package.json +3 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,37 @@
|
|
|
1
1
|
# @chatbot-core/types
|
|
2
2
|
|
|
3
|
+
## [0.13.0](https://github.com/kortyx-io/kortyx/compare/stream-v0.12.0...stream-v0.13.0) (2026-09-21)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* **hooks:** add model-driven interrupt contracts to useReason ([#224](https://github.com/kortyx-io/kortyx/issues/224)) ([e0147d5](https://github.com/kortyx-io/kortyx/commit/e0147d5234ca38d450d452af924b242f8cbdeb16))
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Dependencies
|
|
12
|
+
|
|
13
|
+
* The following workspace dependencies were updated
|
|
14
|
+
* dependencies
|
|
15
|
+
* @kortyx/core bumped to 0.10.0
|
|
16
|
+
|
|
17
|
+
## [0.12.0](https://github.com/kortyx-io/kortyx/compare/stream-v0.11.0...stream-v0.12.0) (2026-09-14)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
### ⚠ BREAKING CHANGES
|
|
21
|
+
|
|
22
|
+
* **errors:** public failure messages and default HTTP statuses change; malformed streams fail explicitly, provider error classes are shared, and retry helpers exclude control flow. Existing calls and legacy records remain supported. See the error-contract migration and release notes.
|
|
23
|
+
|
|
24
|
+
### Features
|
|
25
|
+
|
|
26
|
+
* **errors:** harden failure contracts across execution and recovery ([#175](https://github.com/kortyx-io/kortyx/issues/175)) ([d231e36](https://github.com/kortyx-io/kortyx/commit/d231e364259a4f23fc3675d8783fde5ba338416e))
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
### Dependencies
|
|
30
|
+
|
|
31
|
+
* The following workspace dependencies were updated
|
|
32
|
+
* dependencies
|
|
33
|
+
* @kortyx/core bumped to 0.9.0
|
|
34
|
+
|
|
3
35
|
## [0.11.0](https://github.com/kortyx-io/kortyx/compare/stream-v0.10.0...stream-v0.11.0) (2026-09-10)
|
|
4
36
|
|
|
5
37
|
|
|
@@ -1,5 +1,16 @@
|
|
|
1
|
+
import { FailureDescriptor } from '@kortyx/core/errors';
|
|
1
2
|
import { z } from 'zod';
|
|
2
3
|
|
|
4
|
+
declare function failureChunk(error: unknown): {
|
|
5
|
+
type: "error";
|
|
6
|
+
message: string;
|
|
7
|
+
failure: FailureDescriptor;
|
|
8
|
+
};
|
|
9
|
+
declare function streamError(chunk: {
|
|
10
|
+
message: string;
|
|
11
|
+
failure?: unknown;
|
|
12
|
+
}): Error;
|
|
13
|
+
|
|
3
14
|
declare const StreamChunkSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
4
15
|
type: z.ZodLiteral<"session">;
|
|
5
16
|
sessionId: z.ZodString;
|
|
@@ -71,6 +82,7 @@ declare const StreamChunkSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
71
82
|
isError: z.ZodOptional<z.ZodBoolean>;
|
|
72
83
|
}, z.core.$strip>, z.ZodObject<{
|
|
73
84
|
type: z.ZodLiteral<"tool-call-error">;
|
|
85
|
+
failure: z.ZodOptional<z.ZodPipe<z.ZodCustom<FailureDescriptor, FailureDescriptor>, z.ZodTransform<FailureDescriptor, FailureDescriptor>>>;
|
|
74
86
|
tool: z.ZodString;
|
|
75
87
|
toolCallId: z.ZodString;
|
|
76
88
|
node: z.ZodOptional<z.ZodString>;
|
|
@@ -96,6 +108,17 @@ declare const StreamChunkSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
96
108
|
schemaVersion: z.ZodOptional<z.ZodString>;
|
|
97
109
|
meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
98
110
|
options: z.ZodOptional<z.ZodArray<z.ZodNever>>;
|
|
111
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
112
|
+
kind: z.ZodLiteral<"custom">;
|
|
113
|
+
multiple: z.ZodLiteral<false>;
|
|
114
|
+
question: z.ZodOptional<z.ZodString>;
|
|
115
|
+
contract: z.ZodOptional<z.ZodString>;
|
|
116
|
+
request: z.ZodUnknown;
|
|
117
|
+
id: z.ZodOptional<z.ZodString>;
|
|
118
|
+
schemaId: z.ZodString;
|
|
119
|
+
schemaVersion: z.ZodString;
|
|
120
|
+
meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
121
|
+
options: z.ZodOptional<z.ZodArray<z.ZodNever>>;
|
|
99
122
|
}, z.core.$strip>, z.ZodObject<{
|
|
100
123
|
kind: z.ZodEnum<{
|
|
101
124
|
choice: "choice";
|
|
@@ -182,6 +205,7 @@ declare const StreamChunkSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
182
205
|
}, z.core.$strip>, z.ZodObject<{
|
|
183
206
|
type: z.ZodLiteral<"error">;
|
|
184
207
|
message: z.ZodString;
|
|
208
|
+
failure: z.ZodOptional<z.ZodPipe<z.ZodCustom<FailureDescriptor, FailureDescriptor>, z.ZodTransform<FailureDescriptor, FailureDescriptor>>>;
|
|
185
209
|
}, z.core.$strip>]>;
|
|
186
210
|
type StreamChunk = z.infer<typeof StreamChunkSchema>;
|
|
187
211
|
|
|
@@ -284,4 +308,4 @@ type StructuredStreamAccumulator<TData = unknown> = {
|
|
|
284
308
|
};
|
|
285
309
|
declare function createStructuredStreamAccumulator<TData = unknown>(initialChunks?: Iterable<StructuredDataChunk>): StructuredStreamAccumulator<TData>;
|
|
286
310
|
|
|
287
|
-
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,
|
|
311
|
+
export { type ConsumeStreamHandlers as C, type StreamChunk as S, type StructuredDataChunk as a, StreamChunkSchema as b, type StreamFromRouteArgs as c, StructuredDataChunkSchema as d, type StructuredStreamAccumulator as e, type StructuredStreamState as f, applyStructuredChunk as g, consumeStream as h, createStructuredStreamAccumulator as i, failureChunk as j, reduceStructuredChunks as k, streamFromRoute as l, readStream as r, streamError as s };
|
package/dist/browser.d.ts
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
export { C as ConsumeStreamHandlers, S as StreamChunk, c as StreamFromRouteArgs, a as StructuredDataChunk, e as StructuredStreamAccumulator, f as StructuredStreamState, g as applyStructuredChunk, h as consumeStream, i as createStructuredStreamAccumulator, r as readStream,
|
|
1
|
+
export { C as ConsumeStreamHandlers, S as StreamChunk, c as StreamFromRouteArgs, a as StructuredDataChunk, e as StructuredStreamAccumulator, f as StructuredStreamState, g as applyStructuredChunk, h as consumeStream, i as createStructuredStreamAccumulator, j as failureChunk, r as readStream, k as reduceStructuredChunks, s as streamError, l as streamFromRoute } from './browser-BFBys6ZN.js';
|
|
2
|
+
import '@kortyx/core/errors';
|
|
2
3
|
import 'zod';
|
package/dist/browser.js
CHANGED
|
@@ -22,12 +22,24 @@ __export(browser_exports, {
|
|
|
22
22
|
applyStructuredChunk: () => applyStructuredChunk,
|
|
23
23
|
consumeStream: () => consumeStream,
|
|
24
24
|
createStructuredStreamAccumulator: () => createStructuredStreamAccumulator,
|
|
25
|
+
failureChunk: () => failureChunk,
|
|
25
26
|
readStream: () => readStream,
|
|
26
27
|
reduceStructuredChunks: () => reduceStructuredChunks,
|
|
28
|
+
streamError: () => streamError,
|
|
27
29
|
streamFromRoute: () => streamFromRoute
|
|
28
30
|
});
|
|
29
31
|
module.exports = __toCommonJS(browser_exports);
|
|
30
32
|
|
|
33
|
+
// src/failure.ts
|
|
34
|
+
var import_errors = require("@kortyx/core/errors");
|
|
35
|
+
function failureChunk(error) {
|
|
36
|
+
const failure = (0, import_errors.serializeFailure)(error);
|
|
37
|
+
return { type: "error", message: failure.message, failure };
|
|
38
|
+
}
|
|
39
|
+
function streamError(chunk) {
|
|
40
|
+
return (0, import_errors.isFailureDescriptor)(chunk.failure) ? (0, import_errors.errorFromFailure)(chunk.failure) : new Error(chunk.message || "Stream error.");
|
|
41
|
+
}
|
|
42
|
+
|
|
31
43
|
// src/client/consume-stream.ts
|
|
32
44
|
var toError = (value) => value instanceof Error ? value : new Error(String(value));
|
|
33
45
|
async function consumeStream(stream, handlers = {}) {
|
|
@@ -38,10 +50,7 @@ async function consumeStream(stream, handlers = {}) {
|
|
|
38
50
|
for await (const chunk of stream) {
|
|
39
51
|
const shouldContinue = await handlers.onChunk?.(chunk);
|
|
40
52
|
if (chunk.type === "error") {
|
|
41
|
-
await handlers.onError?.(
|
|
42
|
-
new Error(chunk.message || "Stream error."),
|
|
43
|
-
chunk
|
|
44
|
-
);
|
|
53
|
+
await handlers.onError?.(streamError(chunk), chunk);
|
|
45
54
|
}
|
|
46
55
|
if (chunk.type === "done" || shouldContinue === false) {
|
|
47
56
|
await callDone();
|
|
@@ -57,43 +66,88 @@ async function consumeStream(stream, handlers = {}) {
|
|
|
57
66
|
}
|
|
58
67
|
|
|
59
68
|
// src/client/read-stream.ts
|
|
69
|
+
var import_errors2 = require("@kortyx/core/errors");
|
|
60
70
|
async function* readStream(body) {
|
|
61
71
|
if (!body) return;
|
|
62
72
|
const reader = body.getReader();
|
|
63
73
|
const decoder = new TextDecoder("utf-8");
|
|
64
74
|
let buffer = "";
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
75
|
+
let sawData = false;
|
|
76
|
+
try {
|
|
77
|
+
while (true) {
|
|
78
|
+
const { done, value } = await reader.read();
|
|
79
|
+
if (done) break;
|
|
80
|
+
buffer = (buffer + decoder.decode(value, { stream: true })).replaceAll(
|
|
81
|
+
"\r\n",
|
|
82
|
+
"\n"
|
|
83
|
+
);
|
|
84
|
+
const parts = buffer.split("\n\n");
|
|
85
|
+
buffer = parts.pop();
|
|
86
|
+
for (const part of parts) {
|
|
87
|
+
if (!part.startsWith("data: ")) continue;
|
|
88
|
+
sawData = true;
|
|
89
|
+
const payload = part.slice(6);
|
|
90
|
+
if (payload.trim() === "[DONE]") return;
|
|
91
|
+
try {
|
|
92
|
+
const chunk = JSON.parse(payload);
|
|
93
|
+
if (!chunk || typeof chunk !== "object" || typeof chunk.type !== "string")
|
|
94
|
+
throw new Error("Invalid event");
|
|
95
|
+
if (chunk.type === "error") {
|
|
96
|
+
if (typeof chunk.message !== "string" || chunk.failure !== void 0 && !(0, import_errors2.isFailureDescriptor)(chunk.failure))
|
|
97
|
+
throw new Error("Invalid failure event");
|
|
98
|
+
if (chunk.failure) chunk.failure = (0, import_errors2.serializeFailure)(chunk.failure);
|
|
99
|
+
}
|
|
100
|
+
yield chunk;
|
|
101
|
+
if (chunk.type === "done") return;
|
|
102
|
+
} catch (err) {
|
|
103
|
+
throw new import_errors2.KortyxError(
|
|
104
|
+
"MALFORMED_STREAM",
|
|
105
|
+
"Invalid JSON or event in stream.",
|
|
106
|
+
{
|
|
107
|
+
category: "transport",
|
|
108
|
+
retryable: false,
|
|
109
|
+
safeMessage: "The response stream contained an invalid event.",
|
|
110
|
+
cause: err
|
|
111
|
+
}
|
|
112
|
+
);
|
|
113
|
+
}
|
|
80
114
|
}
|
|
81
115
|
}
|
|
116
|
+
if (buffer.trim() || sawData)
|
|
117
|
+
throw new import_errors2.KortyxError(
|
|
118
|
+
"TRUNCATED_STREAM",
|
|
119
|
+
"Stream ended with an incomplete event.",
|
|
120
|
+
{
|
|
121
|
+
category: "transport",
|
|
122
|
+
retryable: null,
|
|
123
|
+
safeMessage: "The response stream ended before an event completed."
|
|
124
|
+
}
|
|
125
|
+
);
|
|
126
|
+
} finally {
|
|
127
|
+
await reader.cancel().catch(() => {
|
|
128
|
+
});
|
|
129
|
+
reader.releaseLock();
|
|
82
130
|
}
|
|
83
131
|
}
|
|
84
132
|
|
|
85
133
|
// src/client/stream-from-route.ts
|
|
86
|
-
var
|
|
134
|
+
var import_errors3 = require("@kortyx/core/errors");
|
|
87
135
|
var readErrorMessage = async (response) => {
|
|
88
136
|
let message = `Request failed (${response.status})`;
|
|
89
137
|
try {
|
|
90
138
|
const payload = await response.json();
|
|
139
|
+
if (payload && typeof payload === "object" && "failure" in payload && (0, import_errors3.isFailureDescriptor)(payload.failure))
|
|
140
|
+
return (0, import_errors3.errorFromFailure)(payload.failure);
|
|
91
141
|
if (payload && typeof payload === "object" && "error" in payload && typeof payload.error === "string") {
|
|
92
142
|
message = payload.error;
|
|
93
143
|
}
|
|
94
144
|
} catch {
|
|
95
145
|
}
|
|
96
|
-
return message
|
|
146
|
+
return new import_errors3.KortyxError("HTTP_REQUEST_FAILED", message, {
|
|
147
|
+
category: "transport",
|
|
148
|
+
status: response.status,
|
|
149
|
+
safeMessage: message
|
|
150
|
+
});
|
|
97
151
|
};
|
|
98
152
|
async function* streamFromRoute(args) {
|
|
99
153
|
const fetchFn = args.fetchImpl ?? globalThis.fetch;
|
|
@@ -114,12 +168,19 @@ async function* streamFromRoute(args) {
|
|
|
114
168
|
...args.signal ? { signal: args.signal } : {}
|
|
115
169
|
});
|
|
116
170
|
} catch (error) {
|
|
117
|
-
|
|
171
|
+
if (args.signal?.aborted) throw error;
|
|
172
|
+
yield failureChunk(
|
|
173
|
+
new import_errors3.KortyxError("NETWORK_ERROR", "Network request failed.", {
|
|
174
|
+
category: "transport",
|
|
175
|
+
cause: error,
|
|
176
|
+
safeMessage: "The request could not reach the server."
|
|
177
|
+
})
|
|
178
|
+
);
|
|
118
179
|
yield { type: "done" };
|
|
119
180
|
return;
|
|
120
181
|
}
|
|
121
182
|
if (!response.ok) {
|
|
122
|
-
yield
|
|
183
|
+
yield failureChunk(await readErrorMessage(response));
|
|
123
184
|
yield { type: "done" };
|
|
124
185
|
return;
|
|
125
186
|
}
|
|
@@ -311,8 +372,10 @@ function createStructuredStreamAccumulator(initialChunks = []) {
|
|
|
311
372
|
applyStructuredChunk,
|
|
312
373
|
consumeStream,
|
|
313
374
|
createStructuredStreamAccumulator,
|
|
375
|
+
failureChunk,
|
|
314
376
|
readStream,
|
|
315
377
|
reduceStructuredChunks,
|
|
378
|
+
streamError,
|
|
316
379
|
streamFromRoute
|
|
317
380
|
});
|
|
318
381
|
//# sourceMappingURL=browser.js.map
|
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 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":[]}
|
|
1
|
+
{"version":3,"sources":["../src/browser.ts","../src/failure.ts","../src/client/consume-stream.ts","../src/client/read-stream.ts","../src/client/stream-from-route.ts","../src/structured/apply-structured-chunk.ts","../src/structured/structured-stream-accumulator.ts"],"sourcesContent":["export * from \"./failure\";\n// Browser-safe exports for client bundles.\n// Keep this file free of Node-only imports (fs, path, etc).\n\nexport type { ConsumeStreamHandlers } from \"./client/consume-stream\";\nexport { consumeStream } from \"./client/consume-stream\";\nexport { readStream } from \"./client/read-stream\";\nexport type { StreamFromRouteArgs } from \"./client/stream-from-route\";\nexport { streamFromRoute } from \"./client/stream-from-route\";\nexport * from \"./structured/apply-structured-chunk\";\nexport * from \"./structured/structured-stream-accumulator\";\nexport type { StreamChunk } from \"./types/stream-chunk\";\nexport type { StructuredDataChunk } from \"./types/structured-data\";\n","import {\n errorFromFailure,\n type FailureDescriptor,\n isFailureDescriptor,\n serializeFailure,\n} from \"@kortyx/core/errors\";\n\nexport function failureChunk(error: unknown): {\n type: \"error\";\n message: string;\n failure: FailureDescriptor;\n} {\n const failure = serializeFailure(error);\n return { type: \"error\", message: failure.message, failure };\n}\n\nexport function streamError(chunk: {\n message: string;\n failure?: unknown;\n}): Error {\n return isFailureDescriptor(chunk.failure)\n ? errorFromFailure(chunk.failure)\n : new Error(chunk.message || \"Stream error.\");\n}\n","import { streamError } from \"../failure\";\nimport type { StreamChunk } from \"../types/stream-chunk\";\n\nexport interface ConsumeStreamHandlers {\n onChunk?: (\n chunk: StreamChunk,\n ) => undefined | boolean | Promise<boolean | undefined>;\n onDone?: () => void | Promise<void>;\n onError?: (error: Error, chunk?: StreamChunk) => void | Promise<void>;\n}\n\nconst toError = (value: unknown): Error =>\n value instanceof Error ? value : new Error(String(value));\n\n/**\n * Consume a stream of StreamChunk events with callback handlers.\n * Returns when a `done` chunk is seen, the stream ends, or `onChunk` returns `false`.\n */\nexport async function consumeStream(\n stream: AsyncIterable<StreamChunk>,\n handlers: ConsumeStreamHandlers = {},\n): Promise<void> {\n const callDone = async () => {\n await handlers.onDone?.();\n };\n\n try {\n for await (const chunk of stream) {\n const shouldContinue = await handlers.onChunk?.(chunk);\n\n if (chunk.type === \"error\") {\n await handlers.onError?.(streamError(chunk), chunk);\n }\n\n if (chunk.type === \"done\" || shouldContinue === false) {\n await callDone();\n return;\n }\n }\n\n await callDone();\n } catch (error) {\n const normalized = toError(error);\n await handlers.onError?.(normalized);\n throw normalized;\n }\n}\n","// packages/stream/src/client/read-stream.ts\nimport {\n isFailureDescriptor,\n KortyxError,\n serializeFailure,\n} from \"@kortyx/core/errors\";\nimport type { StreamChunk } from \"../types/stream-chunk\";\n\n/**\n * Reads a server-sent event (SSE) Response body and yields StreamChunk objects.\n */\nexport async function* readStream(\n body: ReadableStream<Uint8Array> | null,\n): AsyncGenerator<StreamChunk, void, void> {\n if (!body) return;\n\n const reader = body.getReader();\n const decoder = new TextDecoder(\"utf-8\");\n let buffer = \"\";\n let sawData = false;\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer = (buffer + decoder.decode(value, { stream: true })).replaceAll(\n \"\\r\\n\",\n \"\\n\",\n );\n const parts = buffer.split(\"\\n\\n\");\n buffer = parts.pop() as string;\n\n for (const part of parts) {\n if (!part.startsWith(\"data: \")) continue;\n sawData = true;\n const payload = part.slice(6);\n if (payload.trim() === \"[DONE]\") return;\n try {\n const chunk = JSON.parse(payload) as StreamChunk;\n if (\n !chunk ||\n typeof chunk !== \"object\" ||\n typeof chunk.type !== \"string\"\n )\n throw new Error(\"Invalid event\");\n if (chunk.type === \"error\") {\n if (\n typeof chunk.message !== \"string\" ||\n (chunk.failure !== undefined &&\n !isFailureDescriptor(chunk.failure))\n )\n throw new Error(\"Invalid failure event\");\n if (chunk.failure) chunk.failure = serializeFailure(chunk.failure);\n }\n yield chunk;\n if (chunk.type === \"done\") return;\n } catch (err) {\n throw new KortyxError(\n \"MALFORMED_STREAM\",\n \"Invalid JSON or event in stream.\",\n {\n category: \"transport\",\n retryable: false,\n safeMessage: \"The response stream contained an invalid event.\",\n cause: err,\n },\n );\n }\n }\n }\n if (buffer.trim() || sawData)\n throw new KortyxError(\n \"TRUNCATED_STREAM\",\n \"Stream ended with an incomplete event.\",\n {\n category: \"transport\",\n retryable: null,\n safeMessage: \"The response stream ended before an event completed.\",\n },\n );\n } finally {\n await reader.cancel().catch(() => {});\n reader.releaseLock();\n }\n}\n","import {\n errorFromFailure,\n isFailureDescriptor,\n KortyxError,\n} from \"@kortyx/core/errors\";\nimport { failureChunk } from \"../failure\";\nimport type { StreamChunk } from \"../types/stream-chunk\";\nimport { readStream } from \"./read-stream\";\n\nexport interface StreamFromRouteArgs<TBody = unknown> {\n endpoint: string;\n body: TBody;\n method?: string | undefined;\n fetchImpl?: typeof fetch;\n headers?: Record<string, string> | undefined;\n signal?: AbortSignal | undefined;\n}\n\nconst readErrorMessage = async (response: Response): Promise<Error> => {\n let message = `Request failed (${response.status})`;\n try {\n const payload = (await response.json()) as unknown;\n if (\n payload &&\n typeof payload === \"object\" &&\n \"failure\" in payload &&\n isFailureDescriptor(payload.failure)\n )\n return errorFromFailure(payload.failure);\n if (\n payload &&\n typeof payload === \"object\" &&\n \"error\" in payload &&\n typeof (payload as { error?: unknown }).error === \"string\"\n ) {\n message = (payload as { error: string }).error;\n }\n } catch {}\n return new KortyxError(\"HTTP_REQUEST_FAILED\", message, {\n category: \"transport\",\n status: response.status,\n safeMessage: message,\n });\n};\n\nexport async function* streamFromRoute<TBody = unknown>(\n args: StreamFromRouteArgs<TBody>,\n): AsyncGenerator<StreamChunk, void, void> {\n const fetchFn = args.fetchImpl ?? globalThis.fetch;\n if (!fetchFn) {\n yield { type: \"error\", message: \"No fetch implementation available.\" };\n yield { type: \"done\" };\n return;\n }\n\n let response: Response;\n try {\n response = await fetchFn(args.endpoint, {\n method: args.method ?? \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n ...(args.headers ?? {}),\n },\n body: JSON.stringify(args.body),\n ...(args.signal ? { signal: args.signal } : {}),\n });\n } catch (error) {\n if (args.signal?.aborted) throw error;\n yield failureChunk(\n new KortyxError(\"NETWORK_ERROR\", \"Network request failed.\", {\n category: \"transport\",\n cause: error,\n safeMessage: \"The request could not reach the server.\",\n }),\n );\n yield { type: \"done\" };\n return;\n }\n\n if (!response.ok) {\n yield failureChunk(await readErrorMessage(response));\n yield { type: \"done\" };\n return;\n }\n\n yield* readStream(response.body);\n}\n","import type { StructuredDataChunk } from \"../types/structured-data\";\n\nexport type StructuredStreamState<TData = unknown> = {\n streamId: string;\n dataType: string;\n status: \"streaming\" | \"done\";\n data: TData;\n node?: string;\n id?: string;\n schemaId?: string;\n schemaVersion?: string;\n};\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst isArrayIndex = (value: string): boolean => /^\\d+$/.test(value);\n\nconst describeValue = (value: unknown): string => {\n if (value === null) return \"null\";\n if (Array.isArray(value)) return \"array\";\n return typeof value;\n};\n\nconst parsePath = (path: string): string[] => {\n if (path.length === 0) {\n throw new Error(\n \"Structured chunk path must be a non-empty dot-separated string.\",\n );\n }\n\n const parts = path.split(\".\");\n if (parts.some((part) => part.length === 0)) {\n throw new Error(\n `Structured chunk path \"${path}\" must not contain empty segments.`,\n );\n }\n\n return parts;\n};\n\nconst cloneContainerForPart = (args: {\n current: unknown;\n part: string;\n path: string;\n traversed: string[];\n}): Record<string, unknown> | unknown[] => {\n const expected = isArrayIndex(args.part) ? \"array\" : \"object\";\n const location =\n args.traversed.length === 0 ? \"<root>\" : args.traversed.join(\".\");\n\n if (args.current === undefined) {\n return expected === \"array\" ? [] : {};\n }\n\n if (expected === \"array\") {\n if (Array.isArray(args.current)) return [...args.current];\n throw new Error(\n `Structured path conflict at ${location} for \"${args.path}\": expected array container, received ${describeValue(args.current)}.`,\n );\n }\n\n if (isPlainObject(args.current)) return { ...args.current };\n\n throw new Error(\n `Structured path conflict at ${location} for \"${args.path}\": expected object container, received ${describeValue(args.current)}.`,\n );\n};\n\nconst updateByParts = (args: {\n input: unknown;\n parts: string[];\n path: string;\n updateLeaf: (current: unknown) => unknown;\n traversed?: string[];\n}): unknown => {\n const traversed = args.traversed ?? [];\n const [part, ...rest] = args.parts as [string, ...string[]];\n\n const container = cloneContainerForPart({\n current: args.input,\n part,\n path: args.path,\n traversed,\n });\n\n const currentChild = Array.isArray(container)\n ? container[Number(part)]\n : container[part];\n const nextChild =\n rest.length === 0\n ? args.updateLeaf(currentChild)\n : updateByParts({\n input: currentChild,\n parts: rest,\n path: args.path,\n updateLeaf: args.updateLeaf,\n traversed: [...traversed, part],\n });\n\n if (Array.isArray(container)) {\n container[Number(part)] = nextChild;\n } else {\n container[part] = nextChild;\n }\n\n return container;\n};\n\nexport function applyStructuredChunk<TData = unknown>(\n current: StructuredStreamState<TData> | undefined,\n chunk: StructuredDataChunk,\n): StructuredStreamState<TData> {\n if (current && current.streamId !== chunk.streamId) {\n throw new Error(\n `Structured chunk streamId mismatch: expected ${current.streamId}, received ${chunk.streamId}.`,\n );\n }\n\n if (current?.status === \"done\") {\n throw new Error(\n `Structured stream ${chunk.streamId} already completed with a final chunk.`,\n );\n }\n\n const nextBase = {\n streamId: chunk.streamId,\n dataType: chunk.dataType,\n status: chunk.kind === \"final\" ? (\"done\" as const) : (\"streaming\" as const),\n ...(chunk.node ? { node: chunk.node } : {}),\n ...(chunk.id ? { id: chunk.id } : {}),\n ...(chunk.schemaId ? { schemaId: chunk.schemaId } : {}),\n ...(chunk.schemaVersion ? { schemaVersion: chunk.schemaVersion } : {}),\n };\n\n if (chunk.kind === \"final\") {\n return {\n ...nextBase,\n data: chunk.data as TData,\n };\n }\n\n const path = chunk.path;\n const pathParts = parsePath(path);\n const previousData = current?.data;\n\n if (chunk.kind === \"set\") {\n return {\n ...nextBase,\n data: updateByParts({\n input: previousData,\n parts: pathParts,\n path,\n updateLeaf: () => chunk.value,\n }) as TData,\n };\n }\n\n if (chunk.kind === \"append\") {\n return {\n ...nextBase,\n data: updateByParts({\n input: previousData,\n parts: pathParts,\n path,\n updateLeaf: (existing) => {\n if (existing === undefined) return [...chunk.items];\n if (!Array.isArray(existing)) {\n throw new Error(\n `Structured append requires path \"${path}\" to target an array, received ${describeValue(existing)}.`,\n );\n }\n return [...existing, ...chunk.items];\n },\n }) as TData,\n };\n }\n\n return {\n ...nextBase,\n data: updateByParts({\n input: previousData,\n parts: pathParts,\n path,\n updateLeaf: (existing) => {\n if (existing === undefined) return chunk.delta;\n if (typeof existing !== \"string\") {\n throw new Error(\n `Structured text-delta requires path \"${path}\" to target a string, received ${describeValue(existing)}.`,\n );\n }\n return existing + chunk.delta;\n },\n }) as TData,\n };\n}\n\nexport function reduceStructuredChunks<TData = unknown>(\n chunks: StructuredDataChunk[],\n): Record<string, StructuredStreamState<TData>> {\n return chunks.reduce<Record<string, StructuredStreamState<TData>>>(\n (acc, chunk) => {\n acc[chunk.streamId] = applyStructuredChunk(acc[chunk.streamId], chunk);\n return acc;\n },\n {},\n );\n}\n","import type { StreamChunk } from \"../types/stream-chunk\";\nimport type { StructuredDataChunk } from \"../types/structured-data\";\nimport {\n applyStructuredChunk,\n type StructuredStreamState,\n} from \"./apply-structured-chunk\";\n\nexport type StructuredStreamAccumulator<TData = unknown> = {\n apply: (chunk: StructuredDataChunk) => StructuredStreamState<TData>;\n applyStreamChunk: (\n chunk: StreamChunk,\n ) => StructuredStreamState<TData> | undefined;\n get: (streamId: string) => StructuredStreamState<TData> | undefined;\n has: (streamId: string) => boolean;\n delete: (streamId: string) => boolean;\n clear: () => void;\n size: () => number;\n entries: () => Array<[string, StructuredStreamState<TData>]>;\n values: () => StructuredStreamState<TData>[];\n toRecord: () => Record<string, StructuredStreamState<TData>>;\n};\n\nconst isStructuredDataChunk = (\n chunk: StreamChunk,\n): chunk is StructuredDataChunk => chunk.type === \"structured-data\";\n\nexport function createStructuredStreamAccumulator<TData = unknown>(\n initialChunks: Iterable<StructuredDataChunk> = [],\n): StructuredStreamAccumulator<TData> {\n const states = new Map<string, StructuredStreamState<TData>>();\n\n const apply = (chunk: StructuredDataChunk): StructuredStreamState<TData> => {\n const nextState = applyStructuredChunk(states.get(chunk.streamId), chunk);\n states.set(chunk.streamId, nextState);\n return nextState;\n };\n\n for (const chunk of initialChunks) {\n apply(chunk);\n }\n\n return {\n apply,\n applyStreamChunk: (chunk) => {\n if (!isStructuredDataChunk(chunk)) return undefined;\n return apply(chunk);\n },\n get: (streamId) => states.get(streamId),\n has: (streamId) => states.has(streamId),\n delete: (streamId) => states.delete(streamId),\n clear: () => {\n states.clear();\n },\n size: () => states.size,\n entries: () => Array.from(states.entries()),\n values: () => Array.from(states.values()),\n toRecord: () => Object.fromEntries(states.entries()),\n };\n}\n"],"mappings":"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","names":["import_errors","import_errors"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { S as StreamChunk, a as StructuredDataChunk } from './browser-
|
|
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,
|
|
1
|
+
import { S as StreamChunk, a as StructuredDataChunk } from './browser-BFBys6ZN.js';
|
|
2
|
+
export { C as ConsumeStreamHandlers, b as StreamChunkSchema, c as StreamFromRouteArgs, d as StructuredDataChunkSchema, e as StructuredStreamAccumulator, f as StructuredStreamState, g as applyStructuredChunk, h as consumeStream, i as createStructuredStreamAccumulator, j as failureChunk, r as readStream, k as reduceStructuredChunks, s as streamError, l as streamFromRoute } from './browser-BFBys6ZN.js';
|
|
3
|
+
import '@kortyx/core/errors';
|
|
3
4
|
import 'zod';
|
|
4
5
|
|
|
5
6
|
interface BufferedStreamResult {
|
package/dist/index.js
CHANGED
|
@@ -28,14 +28,26 @@ __export(index_exports, {
|
|
|
28
28
|
consumeStream: () => consumeStream,
|
|
29
29
|
createStreamResponse: () => createStreamResponse,
|
|
30
30
|
createStructuredStreamAccumulator: () => createStructuredStreamAccumulator,
|
|
31
|
+
failureChunk: () => failureChunk,
|
|
31
32
|
readStream: () => readStream,
|
|
32
33
|
reduceStructuredChunks: () => reduceStructuredChunks,
|
|
34
|
+
streamError: () => streamError,
|
|
33
35
|
streamFromRoute: () => streamFromRoute,
|
|
34
36
|
summarizeStreamChunks: () => summarizeStreamChunks,
|
|
35
37
|
toSSE: () => toSSE
|
|
36
38
|
});
|
|
37
39
|
module.exports = __toCommonJS(index_exports);
|
|
38
40
|
|
|
41
|
+
// src/failure.ts
|
|
42
|
+
var import_errors = require("@kortyx/core/errors");
|
|
43
|
+
function failureChunk(error) {
|
|
44
|
+
const failure = (0, import_errors.serializeFailure)(error);
|
|
45
|
+
return { type: "error", message: failure.message, failure };
|
|
46
|
+
}
|
|
47
|
+
function streamError(chunk) {
|
|
48
|
+
return (0, import_errors.isFailureDescriptor)(chunk.failure) ? (0, import_errors.errorFromFailure)(chunk.failure) : new Error(chunk.message || "Stream error.");
|
|
49
|
+
}
|
|
50
|
+
|
|
39
51
|
// src/client/consume-stream.ts
|
|
40
52
|
var toError = (value) => value instanceof Error ? value : new Error(String(value));
|
|
41
53
|
async function consumeStream(stream, handlers = {}) {
|
|
@@ -46,10 +58,7 @@ async function consumeStream(stream, handlers = {}) {
|
|
|
46
58
|
for await (const chunk of stream) {
|
|
47
59
|
const shouldContinue = await handlers.onChunk?.(chunk);
|
|
48
60
|
if (chunk.type === "error") {
|
|
49
|
-
await handlers.onError?.(
|
|
50
|
-
new Error(chunk.message || "Stream error."),
|
|
51
|
-
chunk
|
|
52
|
-
);
|
|
61
|
+
await handlers.onError?.(streamError(chunk), chunk);
|
|
53
62
|
}
|
|
54
63
|
if (chunk.type === "done" || shouldContinue === false) {
|
|
55
64
|
await callDone();
|
|
@@ -65,43 +74,88 @@ async function consumeStream(stream, handlers = {}) {
|
|
|
65
74
|
}
|
|
66
75
|
|
|
67
76
|
// src/client/read-stream.ts
|
|
77
|
+
var import_errors2 = require("@kortyx/core/errors");
|
|
68
78
|
async function* readStream(body) {
|
|
69
79
|
if (!body) return;
|
|
70
80
|
const reader = body.getReader();
|
|
71
81
|
const decoder = new TextDecoder("utf-8");
|
|
72
82
|
let buffer = "";
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
83
|
+
let sawData = false;
|
|
84
|
+
try {
|
|
85
|
+
while (true) {
|
|
86
|
+
const { done, value } = await reader.read();
|
|
87
|
+
if (done) break;
|
|
88
|
+
buffer = (buffer + decoder.decode(value, { stream: true })).replaceAll(
|
|
89
|
+
"\r\n",
|
|
90
|
+
"\n"
|
|
91
|
+
);
|
|
92
|
+
const parts = buffer.split("\n\n");
|
|
93
|
+
buffer = parts.pop();
|
|
94
|
+
for (const part of parts) {
|
|
95
|
+
if (!part.startsWith("data: ")) continue;
|
|
96
|
+
sawData = true;
|
|
97
|
+
const payload = part.slice(6);
|
|
98
|
+
if (payload.trim() === "[DONE]") return;
|
|
99
|
+
try {
|
|
100
|
+
const chunk = JSON.parse(payload);
|
|
101
|
+
if (!chunk || typeof chunk !== "object" || typeof chunk.type !== "string")
|
|
102
|
+
throw new Error("Invalid event");
|
|
103
|
+
if (chunk.type === "error") {
|
|
104
|
+
if (typeof chunk.message !== "string" || chunk.failure !== void 0 && !(0, import_errors2.isFailureDescriptor)(chunk.failure))
|
|
105
|
+
throw new Error("Invalid failure event");
|
|
106
|
+
if (chunk.failure) chunk.failure = (0, import_errors2.serializeFailure)(chunk.failure);
|
|
107
|
+
}
|
|
108
|
+
yield chunk;
|
|
109
|
+
if (chunk.type === "done") return;
|
|
110
|
+
} catch (err) {
|
|
111
|
+
throw new import_errors2.KortyxError(
|
|
112
|
+
"MALFORMED_STREAM",
|
|
113
|
+
"Invalid JSON or event in stream.",
|
|
114
|
+
{
|
|
115
|
+
category: "transport",
|
|
116
|
+
retryable: false,
|
|
117
|
+
safeMessage: "The response stream contained an invalid event.",
|
|
118
|
+
cause: err
|
|
119
|
+
}
|
|
120
|
+
);
|
|
121
|
+
}
|
|
88
122
|
}
|
|
89
123
|
}
|
|
124
|
+
if (buffer.trim() || sawData)
|
|
125
|
+
throw new import_errors2.KortyxError(
|
|
126
|
+
"TRUNCATED_STREAM",
|
|
127
|
+
"Stream ended with an incomplete event.",
|
|
128
|
+
{
|
|
129
|
+
category: "transport",
|
|
130
|
+
retryable: null,
|
|
131
|
+
safeMessage: "The response stream ended before an event completed."
|
|
132
|
+
}
|
|
133
|
+
);
|
|
134
|
+
} finally {
|
|
135
|
+
await reader.cancel().catch(() => {
|
|
136
|
+
});
|
|
137
|
+
reader.releaseLock();
|
|
90
138
|
}
|
|
91
139
|
}
|
|
92
140
|
|
|
93
141
|
// src/client/stream-from-route.ts
|
|
94
|
-
var
|
|
142
|
+
var import_errors3 = require("@kortyx/core/errors");
|
|
95
143
|
var readErrorMessage = async (response) => {
|
|
96
144
|
let message = `Request failed (${response.status})`;
|
|
97
145
|
try {
|
|
98
146
|
const payload = await response.json();
|
|
147
|
+
if (payload && typeof payload === "object" && "failure" in payload && (0, import_errors3.isFailureDescriptor)(payload.failure))
|
|
148
|
+
return (0, import_errors3.errorFromFailure)(payload.failure);
|
|
99
149
|
if (payload && typeof payload === "object" && "error" in payload && typeof payload.error === "string") {
|
|
100
150
|
message = payload.error;
|
|
101
151
|
}
|
|
102
152
|
} catch {
|
|
103
153
|
}
|
|
104
|
-
return message
|
|
154
|
+
return new import_errors3.KortyxError("HTTP_REQUEST_FAILED", message, {
|
|
155
|
+
category: "transport",
|
|
156
|
+
status: response.status,
|
|
157
|
+
safeMessage: message
|
|
158
|
+
});
|
|
105
159
|
};
|
|
106
160
|
async function* streamFromRoute(args) {
|
|
107
161
|
const fetchFn = args.fetchImpl ?? globalThis.fetch;
|
|
@@ -122,12 +176,19 @@ async function* streamFromRoute(args) {
|
|
|
122
176
|
...args.signal ? { signal: args.signal } : {}
|
|
123
177
|
});
|
|
124
178
|
} catch (error) {
|
|
125
|
-
|
|
179
|
+
if (args.signal?.aborted) throw error;
|
|
180
|
+
yield failureChunk(
|
|
181
|
+
new import_errors3.KortyxError("NETWORK_ERROR", "Network request failed.", {
|
|
182
|
+
category: "transport",
|
|
183
|
+
cause: error,
|
|
184
|
+
safeMessage: "The request could not reach the server."
|
|
185
|
+
})
|
|
186
|
+
);
|
|
126
187
|
yield { type: "done" };
|
|
127
188
|
return;
|
|
128
189
|
}
|
|
129
190
|
if (!response.ok) {
|
|
130
|
-
yield
|
|
191
|
+
yield failureChunk(await readErrorMessage(response));
|
|
131
192
|
yield { type: "done" };
|
|
132
193
|
return;
|
|
133
194
|
}
|
|
@@ -226,11 +287,10 @@ function createStreamResponse(stream) {
|
|
|
226
287
|
controller.enqueue(next.value);
|
|
227
288
|
}
|
|
228
289
|
} catch (error) {
|
|
229
|
-
if (!cancelled)
|
|
230
|
-
controller.enqueue(
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
});
|
|
290
|
+
if (!cancelled) {
|
|
291
|
+
controller.enqueue(failureChunk(error));
|
|
292
|
+
controller.enqueue({ type: "done" });
|
|
293
|
+
}
|
|
234
294
|
} finally {
|
|
235
295
|
if (!cancelled) controller.close();
|
|
236
296
|
}
|
|
@@ -435,6 +495,7 @@ function createStructuredStreamAccumulator(initialChunks = []) {
|
|
|
435
495
|
}
|
|
436
496
|
|
|
437
497
|
// src/types/stream-chunk.ts
|
|
498
|
+
var import_errors4 = require("@kortyx/core/errors");
|
|
438
499
|
var import_zod2 = require("zod");
|
|
439
500
|
|
|
440
501
|
// src/types/structured-data/index.ts
|
|
@@ -560,6 +621,7 @@ var StreamChunkSchema = import_zod2.z.union([
|
|
|
560
621
|
}),
|
|
561
622
|
import_zod2.z.object({
|
|
562
623
|
type: import_zod2.z.literal("tool-call-error"),
|
|
624
|
+
failure: import_zod2.z.custom(import_errors4.isFailureDescriptor).transform(import_errors4.serializeFailure).optional(),
|
|
563
625
|
tool: import_zod2.z.string(),
|
|
564
626
|
toolCallId: import_zod2.z.string(),
|
|
565
627
|
node: import_zod2.z.string().optional(),
|
|
@@ -590,6 +652,18 @@ var StreamChunkSchema = import_zod2.z.union([
|
|
|
590
652
|
meta: import_zod2.z.record(import_zod2.z.string(), import_zod2.z.unknown()).optional(),
|
|
591
653
|
options: import_zod2.z.array(import_zod2.z.never()).optional()
|
|
592
654
|
}),
|
|
655
|
+
import_zod2.z.object({
|
|
656
|
+
kind: import_zod2.z.literal("custom"),
|
|
657
|
+
multiple: import_zod2.z.literal(false),
|
|
658
|
+
question: import_zod2.z.string().optional(),
|
|
659
|
+
contract: import_zod2.z.string().optional(),
|
|
660
|
+
request: import_zod2.z.unknown(),
|
|
661
|
+
id: import_zod2.z.string().optional(),
|
|
662
|
+
schemaId: import_zod2.z.string(),
|
|
663
|
+
schemaVersion: import_zod2.z.string(),
|
|
664
|
+
meta: import_zod2.z.record(import_zod2.z.string(), import_zod2.z.unknown()).optional(),
|
|
665
|
+
options: import_zod2.z.array(import_zod2.z.never()).optional()
|
|
666
|
+
}),
|
|
593
667
|
// Choice/multi-choice: question + options required
|
|
594
668
|
import_zod2.z.object({
|
|
595
669
|
kind: import_zod2.z.enum(["choice", "multi-choice"]),
|
|
@@ -634,7 +708,11 @@ var StreamChunkSchema = import_zod2.z.union([
|
|
|
634
708
|
reason: import_zod2.z.string()
|
|
635
709
|
}),
|
|
636
710
|
import_zod2.z.object({ type: import_zod2.z.literal("done"), data: import_zod2.z.any().optional() }),
|
|
637
|
-
import_zod2.z.object({
|
|
711
|
+
import_zod2.z.object({
|
|
712
|
+
type: import_zod2.z.literal("error"),
|
|
713
|
+
message: import_zod2.z.string(),
|
|
714
|
+
failure: import_zod2.z.custom(import_errors4.isFailureDescriptor).transform(import_errors4.serializeFailure).optional()
|
|
715
|
+
})
|
|
638
716
|
]);
|
|
639
717
|
// Annotate the CommonJS export names for ESM import in node:
|
|
640
718
|
0 && (module.exports = {
|
|
@@ -647,8 +725,10 @@ var StreamChunkSchema = import_zod2.z.union([
|
|
|
647
725
|
consumeStream,
|
|
648
726
|
createStreamResponse,
|
|
649
727
|
createStructuredStreamAccumulator,
|
|
728
|
+
failureChunk,
|
|
650
729
|
readStream,
|
|
651
730
|
reduceStructuredChunks,
|
|
731
|
+
streamError,
|
|
652
732
|
streamFromRoute,
|
|
653
733
|
summarizeStreamChunks,
|
|
654
734
|
toSSE
|
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/json-to-sse.ts","../src/server/create-stream-response.ts","../src/server/to-sse.ts","../src/structured/apply-structured-chunk.ts","../src/structured/structured-stream-accumulator.ts","../src/types/stream-chunk.ts","../src/types/structured-data/index.ts"],"sourcesContent":["// release-test: 2026-01-22\n// packages/stream/src/index.ts\n\n// client\nexport * from \"./client/consume-stream\";\nexport * from \"./client/read-stream\";\nexport * from \"./client/stream-from-route\";\n\n// server\nexport * from \"./server/collect-buffered-stream\";\nexport * from \"./server/collect-stream\";\nexport * from \"./server/create-stream-response\";\nexport * from \"./server/to-sse\";\nexport * from \"./structured/apply-structured-chunk\";\nexport * from \"./structured/structured-stream-accumulator\";\nexport * from \"./types/stream-chunk\";\nexport * from \"./types/structured-data\";\n","import type { StreamChunk } from \"../types/stream-chunk\";\n\nexport interface ConsumeStreamHandlers {\n onChunk?: (\n chunk: StreamChunk,\n ) => undefined | boolean | Promise<boolean | undefined>;\n onDone?: () => void | Promise<void>;\n onError?: (error: Error, chunk?: StreamChunk) => void | Promise<void>;\n}\n\nconst toError = (value: unknown): Error =>\n value instanceof Error ? value : new Error(String(value));\n\n/**\n * Consume a stream of StreamChunk events with callback handlers.\n * Returns when a `done` chunk is seen, the stream ends, or `onChunk` returns `false`.\n */\nexport async function consumeStream(\n stream: AsyncIterable<StreamChunk>,\n handlers: ConsumeStreamHandlers = {},\n): Promise<void> {\n const callDone = async () => {\n await handlers.onDone?.();\n };\n\n try {\n for await (const chunk of stream) {\n const shouldContinue = await handlers.onChunk?.(chunk);\n\n if (chunk.type === \"error\") {\n await handlers.onError?.(\n new Error(chunk.message || \"Stream error.\"),\n chunk,\n );\n }\n\n if (chunk.type === \"done\" || shouldContinue === false) {\n await callDone();\n return;\n }\n }\n\n await callDone();\n } catch (error) {\n const normalized = toError(error);\n await handlers.onError?.(normalized);\n throw normalized;\n }\n}\n","// packages/stream/src/client/read-stream.ts\nimport type { StreamChunk } from \"../types/stream-chunk\";\n\n/**\n * Reads a server-sent event (SSE) Response body and yields StreamChunk objects.\n */\nexport async function* readStream(\n body: ReadableStream<Uint8Array> | null,\n): AsyncGenerator<StreamChunk, void, void> {\n if (!body) return;\n\n const reader = body.getReader();\n const decoder = new TextDecoder(\"utf-8\");\n let buffer = \"\";\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const parts = buffer.split(\"\\n\\n\");\n buffer = parts.pop() as string;\n\n for (const part of parts) {\n if (!part.startsWith(\"data: \")) continue;\n const payload = part.slice(6);\n if (payload.trim() === \"[DONE]\") return;\n try {\n yield JSON.parse(payload) as StreamChunk;\n } catch (err) {\n console.warn(\"Invalid JSON in stream chunk:\", payload);\n console.error(err);\n }\n }\n }\n}\n","import type { StreamChunk } from \"../types/stream-chunk\";\nimport { readStream } from \"./read-stream\";\n\nexport interface StreamFromRouteArgs<TBody = unknown> {\n endpoint: string;\n body: TBody;\n method?: string | undefined;\n fetchImpl?: typeof fetch;\n headers?: Record<string, string> | undefined;\n signal?: AbortSignal | undefined;\n}\n\nconst toErrorMessage = (error: unknown): string =>\n error instanceof Error ? error.message : String(error);\n\nconst readErrorMessage = async (response: Response): Promise<string> => {\n let message = `Request failed (${response.status})`;\n try {\n const payload = (await response.json()) as unknown;\n if (\n payload &&\n typeof payload === \"object\" &&\n \"error\" in payload &&\n typeof (payload as { error?: unknown }).error === \"string\"\n ) {\n message = (payload as { error: string }).error;\n }\n } catch {}\n return message;\n};\n\nexport async function* streamFromRoute<TBody = unknown>(\n args: StreamFromRouteArgs<TBody>,\n): AsyncGenerator<StreamChunk, void, void> {\n const fetchFn = args.fetchImpl ?? globalThis.fetch;\n if (!fetchFn) {\n yield { type: \"error\", message: \"No fetch implementation available.\" };\n yield { type: \"done\" };\n return;\n }\n\n let response: Response;\n try {\n response = await fetchFn(args.endpoint, {\n method: args.method ?? \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n ...(args.headers ?? {}),\n },\n body: JSON.stringify(args.body),\n ...(args.signal ? { signal: args.signal } : {}),\n });\n } catch (error) {\n yield { type: \"error\", message: toErrorMessage(error) };\n yield { type: \"done\" };\n return;\n }\n\n if (!response.ok) {\n yield { type: \"error\", message: await readErrorMessage(response) };\n yield { type: \"done\" };\n return;\n }\n\n yield* readStream(response.body);\n}\n","import type { StreamChunk } from \"../types/stream-chunk\";\n\n/**\n * Collects a streamed chat response into an array.\n * Useful for non-streaming HTTP responses or server actions.\n */\nexport async function collectStream(\n stream: AsyncIterable<StreamChunk>,\n): Promise<StreamChunk[]> {\n const chunks: StreamChunk[] = [];\n for await (const chunk of stream) {\n chunks.push(chunk);\n }\n return chunks;\n}\n","import type { StreamChunk } from \"../types/stream-chunk\";\nimport type { StructuredDataChunk } from \"../types/structured-data\";\nimport { collectStream } from \"./collect-stream\";\n\nexport interface BufferedStreamResult {\n chunks: StreamChunk[];\n text: string;\n structured: StructuredDataChunk[];\n}\n\nconst getTextStreamId = (\n chunk: Extract<StreamChunk, { type: \"text-delta\" }>,\n) => {\n const opId =\n typeof chunk.opId === \"string\" && chunk.opId.length > 0\n ? chunk.opId\n : undefined;\n const segmentId =\n typeof chunk.segmentId === \"string\" && chunk.segmentId.length > 0\n ? chunk.segmentId\n : undefined;\n\n if (opId && segmentId) return `${opId}:${segmentId}`;\n return segmentId || opId || chunk.id || chunk.node;\n};\n\nconst appendTextDelta = (\n text: string,\n delta: string,\n streamId: string | undefined,\n lastStreamId: string | undefined,\n) => {\n if (\n streamId &&\n lastStreamId &&\n streamId !== lastStreamId &&\n text.length > 0 &&\n !/\\s$/.test(text) &&\n !/^\\s/.test(delta)\n ) {\n return `${text} ${delta}`;\n }\n\n return text + delta;\n};\n\n/**\n * Derive convenient buffered fields from raw chunks.\n * `text-delta` is preferred; `message` is fallback when no text deltas exist.\n */\nexport function summarizeStreamChunks(\n chunks: StreamChunk[],\n): Omit<BufferedStreamResult, \"chunks\"> {\n let sawTextDelta = false;\n let text = \"\";\n let lastTextStreamId: string | undefined;\n const messageFallback: string[] = [];\n const structured: StructuredDataChunk[] = [];\n\n for (const chunk of chunks) {\n if (chunk.type === \"text-delta\") {\n sawTextDelta = true;\n const streamId = getTextStreamId(chunk);\n text = appendTextDelta(text, chunk.delta, streamId, lastTextStreamId);\n if (streamId) lastTextStreamId = streamId;\n continue;\n }\n\n if (chunk.type === \"message\") {\n messageFallback.push(chunk.content ?? \"\");\n continue;\n }\n\n if (chunk.type === \"structured-data\") {\n structured.push(chunk as StructuredDataChunk);\n }\n }\n\n if (!sawTextDelta && messageFallback.length > 0) {\n text = messageFallback.join(\"\");\n }\n\n return { text, structured };\n}\n\n/**\n * Collect a stream and return both raw chunks and buffered convenience fields.\n */\nexport async function collectBufferedStream(\n stream: AsyncIterable<StreamChunk>,\n): Promise<BufferedStreamResult> {\n const chunks = await collectStream(stream);\n return {\n chunks,\n ...summarizeStreamChunks(chunks),\n };\n}\n","// packages/stream/src/server/json-to-sse.ts\nexport class JsonToSseTransformStream extends TransformStream<unknown, string> {\n constructor() {\n super({\n transform(part, controller) {\n controller.enqueue(`data: ${JSON.stringify(part)}\\n\\n`);\n },\n flush(controller) {\n controller.enqueue(\"data: [DONE]\\n\\n\");\n },\n });\n }\n}\n","// packages/stream/src/server/create-stream-response.ts\nimport type { StreamChunk } from \"../types/stream-chunk\";\nimport { JsonToSseTransformStream } from \"./json-to-sse\";\n\nexport const STREAM_HEADERS = {\n \"content-type\": \"text/event-stream\",\n \"cache-control\": \"no-cache\",\n connection: \"keep-alive\",\n \"x-accel-buffering\": \"no\",\n};\n\n/** Bridge stream cancellation to the source, including Node execution streams. */\nexport function createStreamResponse(\n stream: AsyncIterable<StreamChunk>,\n): Response {\n let cancelled = false;\n const iterator = stream[Symbol.asyncIterator]();\n const readable = new ReadableStream<StreamChunk>({\n async start(controller) {\n try {\n while (!cancelled) {\n const next = await iterator.next();\n if (cancelled || next.done) break;\n controller.enqueue(next.value);\n }\n } catch (error) {\n if (!cancelled)\n controller.enqueue({\n type: \"error\",\n message: error instanceof Error ? error.message : String(error),\n });\n } finally {\n if (!cancelled) controller.close();\n }\n },\n cancel() {\n cancelled = true;\n // Destroying an active Kortyx stream signals its transient execution controller.\n (\n stream as AsyncIterable<StreamChunk> & { destroy?: () => void }\n ).destroy?.();\n void Promise.resolve(iterator.return?.()).catch(() => {});\n },\n });\n return new Response(\n readable\n .pipeThrough(new JsonToSseTransformStream())\n .pipeThrough(new TextEncoderStream()),\n { headers: STREAM_HEADERS },\n );\n}\n","import type { StreamChunk } from \"../types/stream-chunk\";\nimport { createStreamResponse } from \"./create-stream-response\";\n\n/**\n * Friendly alias for createStreamResponse.\n */\nexport function toSSE(stream: AsyncIterable<StreamChunk>): Response {\n return createStreamResponse(stream);\n}\n","import type { StructuredDataChunk } from \"../types/structured-data\";\n\nexport type StructuredStreamState<TData = unknown> = {\n streamId: string;\n dataType: string;\n status: \"streaming\" | \"done\";\n data: TData;\n node?: string;\n id?: string;\n schemaId?: string;\n schemaVersion?: string;\n};\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst isArrayIndex = (value: string): boolean => /^\\d+$/.test(value);\n\nconst describeValue = (value: unknown): string => {\n if (value === null) return \"null\";\n if (Array.isArray(value)) return \"array\";\n return typeof value;\n};\n\nconst parsePath = (path: string): string[] => {\n if (path.length === 0) {\n throw new Error(\n \"Structured chunk path must be a non-empty dot-separated string.\",\n );\n }\n\n const parts = path.split(\".\");\n if (parts.some((part) => part.length === 0)) {\n throw new Error(\n `Structured chunk path \"${path}\" must not contain empty segments.`,\n );\n }\n\n return parts;\n};\n\nconst cloneContainerForPart = (args: {\n current: unknown;\n part: string;\n path: string;\n traversed: string[];\n}): Record<string, unknown> | unknown[] => {\n const expected = isArrayIndex(args.part) ? \"array\" : \"object\";\n const location =\n args.traversed.length === 0 ? \"<root>\" : args.traversed.join(\".\");\n\n if (args.current === undefined) {\n return expected === \"array\" ? [] : {};\n }\n\n if (expected === \"array\") {\n if (Array.isArray(args.current)) return [...args.current];\n throw new Error(\n `Structured path conflict at ${location} for \"${args.path}\": expected array container, received ${describeValue(args.current)}.`,\n );\n }\n\n if (isPlainObject(args.current)) return { ...args.current };\n\n throw new Error(\n `Structured path conflict at ${location} for \"${args.path}\": expected object container, received ${describeValue(args.current)}.`,\n );\n};\n\nconst updateByParts = (args: {\n input: unknown;\n parts: string[];\n path: string;\n updateLeaf: (current: unknown) => unknown;\n traversed?: string[];\n}): unknown => {\n const traversed = args.traversed ?? [];\n const [part, ...rest] = args.parts as [string, ...string[]];\n\n const container = cloneContainerForPart({\n current: args.input,\n part,\n path: args.path,\n traversed,\n });\n\n const currentChild = Array.isArray(container)\n ? container[Number(part)]\n : container[part];\n const nextChild =\n rest.length === 0\n ? args.updateLeaf(currentChild)\n : updateByParts({\n input: currentChild,\n parts: rest,\n path: args.path,\n updateLeaf: args.updateLeaf,\n traversed: [...traversed, part],\n });\n\n if (Array.isArray(container)) {\n container[Number(part)] = nextChild;\n } else {\n container[part] = nextChild;\n }\n\n return container;\n};\n\nexport function applyStructuredChunk<TData = unknown>(\n current: StructuredStreamState<TData> | undefined,\n chunk: StructuredDataChunk,\n): StructuredStreamState<TData> {\n if (current && current.streamId !== chunk.streamId) {\n throw new Error(\n `Structured chunk streamId mismatch: expected ${current.streamId}, received ${chunk.streamId}.`,\n );\n }\n\n if (current?.status === \"done\") {\n throw new Error(\n `Structured stream ${chunk.streamId} already completed with a final chunk.`,\n );\n }\n\n const nextBase = {\n streamId: chunk.streamId,\n dataType: chunk.dataType,\n status: chunk.kind === \"final\" ? (\"done\" as const) : (\"streaming\" as const),\n ...(chunk.node ? { node: chunk.node } : {}),\n ...(chunk.id ? { id: chunk.id } : {}),\n ...(chunk.schemaId ? { schemaId: chunk.schemaId } : {}),\n ...(chunk.schemaVersion ? { schemaVersion: chunk.schemaVersion } : {}),\n };\n\n if (chunk.kind === \"final\") {\n return {\n ...nextBase,\n data: chunk.data as TData,\n };\n }\n\n const path = chunk.path;\n const pathParts = parsePath(path);\n const previousData = current?.data;\n\n if (chunk.kind === \"set\") {\n return {\n ...nextBase,\n data: updateByParts({\n input: previousData,\n parts: pathParts,\n path,\n updateLeaf: () => chunk.value,\n }) as TData,\n };\n }\n\n if (chunk.kind === \"append\") {\n return {\n ...nextBase,\n data: updateByParts({\n input: previousData,\n parts: pathParts,\n path,\n updateLeaf: (existing) => {\n if (existing === undefined) return [...chunk.items];\n if (!Array.isArray(existing)) {\n throw new Error(\n `Structured append requires path \"${path}\" to target an array, received ${describeValue(existing)}.`,\n );\n }\n return [...existing, ...chunk.items];\n },\n }) as TData,\n };\n }\n\n return {\n ...nextBase,\n data: updateByParts({\n input: previousData,\n parts: pathParts,\n path,\n updateLeaf: (existing) => {\n if (existing === undefined) return chunk.delta;\n if (typeof existing !== \"string\") {\n throw new Error(\n `Structured text-delta requires path \"${path}\" to target a string, received ${describeValue(existing)}.`,\n );\n }\n return existing + chunk.delta;\n },\n }) as TData,\n };\n}\n\nexport function reduceStructuredChunks<TData = unknown>(\n chunks: StructuredDataChunk[],\n): Record<string, StructuredStreamState<TData>> {\n return chunks.reduce<Record<string, StructuredStreamState<TData>>>(\n (acc, chunk) => {\n acc[chunk.streamId] = applyStructuredChunk(acc[chunk.streamId], chunk);\n return acc;\n },\n {},\n );\n}\n","import type { StreamChunk } from \"../types/stream-chunk\";\nimport type { StructuredDataChunk } from \"../types/structured-data\";\nimport {\n applyStructuredChunk,\n type StructuredStreamState,\n} from \"./apply-structured-chunk\";\n\nexport type StructuredStreamAccumulator<TData = unknown> = {\n apply: (chunk: StructuredDataChunk) => StructuredStreamState<TData>;\n applyStreamChunk: (\n chunk: StreamChunk,\n ) => StructuredStreamState<TData> | undefined;\n get: (streamId: string) => StructuredStreamState<TData> | undefined;\n has: (streamId: string) => boolean;\n delete: (streamId: string) => boolean;\n clear: () => void;\n size: () => number;\n entries: () => Array<[string, StructuredStreamState<TData>]>;\n values: () => StructuredStreamState<TData>[];\n toRecord: () => Record<string, StructuredStreamState<TData>>;\n};\n\nconst isStructuredDataChunk = (\n chunk: StreamChunk,\n): chunk is StructuredDataChunk => chunk.type === \"structured-data\";\n\nexport function createStructuredStreamAccumulator<TData = unknown>(\n initialChunks: Iterable<StructuredDataChunk> = [],\n): StructuredStreamAccumulator<TData> {\n const states = new Map<string, StructuredStreamState<TData>>();\n\n const apply = (chunk: StructuredDataChunk): StructuredStreamState<TData> => {\n const nextState = applyStructuredChunk(states.get(chunk.streamId), chunk);\n states.set(chunk.streamId, nextState);\n return nextState;\n };\n\n for (const chunk of initialChunks) {\n apply(chunk);\n }\n\n return {\n apply,\n applyStreamChunk: (chunk) => {\n if (!isStructuredDataChunk(chunk)) return undefined;\n return apply(chunk);\n },\n get: (streamId) => states.get(streamId),\n has: (streamId) => states.has(streamId),\n delete: (streamId) => states.delete(streamId),\n clear: () => {\n states.clear();\n },\n size: () => states.size,\n entries: () => Array.from(states.entries()),\n values: () => Array.from(states.values()),\n toRecord: () => Object.fromEntries(states.entries()),\n };\n}\n","import { z } from \"zod\";\nimport { StructuredDataChunkSchema } from \"./structured-data\";\n\nexport const StreamChunkSchema = z.union([\n z.object({\n type: z.literal(\"session\"),\n sessionId: z.string(),\n }),\n z.object({\n type: z.literal(\"checkpoint\"),\n id: z.string(),\n sessionId: z.string(),\n turnIndex: z.number().int().nonnegative(),\n label: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"structured-data-invalidated\"),\n streamId: z.string(),\n checkpointId: z.string(),\n }),\n z.object({\n type: z.literal(\"trace\"),\n traceId: z.string(),\n spanId: z.string(),\n runId: z.string(),\n rootSpanName: z.literal(\"kortyx.run\"),\n }),\n z.object({\n type: z.literal(\"status\"),\n message: z.string(),\n node: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"message\"),\n content: z.string(),\n node: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"text-start\"),\n node: z.string().optional(),\n id: z.string().optional(),\n opId: z.string().optional(),\n segmentId: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"text-delta\"),\n delta: z.string(),\n node: z.string().optional(),\n id: z.string().optional(),\n opId: z.string().optional(),\n segmentId: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"text-end\"),\n node: z.string().optional(),\n id: z.string().optional(),\n opId: z.string().optional(),\n segmentId: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"tool-result\"),\n tool: z.string().optional(),\n node: z.string().optional(),\n content: z.unknown(),\n }),\n z.object({\n type: z.literal(\"tool-call-start\"),\n tool: z.string(),\n toolCallId: z.string(),\n node: z.string().optional(),\n id: z.string().optional(),\n opId: z.string().optional(),\n input: z.unknown().optional(),\n }),\n z.object({\n type: z.literal(\"tool-call-result\"),\n tool: z.string(),\n toolCallId: z.string(),\n node: z.string().optional(),\n id: z.string().optional(),\n opId: z.string().optional(),\n content: z.unknown(),\n structuredContent: z.unknown().optional(),\n isError: z.boolean().optional(),\n }),\n z.object({\n type: z.literal(\"tool-call-error\"),\n tool: z.string(),\n toolCallId: z.string(),\n node: z.string().optional(),\n id: z.string().optional(),\n opId: z.string().optional(),\n message: z.string(),\n }),\n // Interrupt request chunk (used to render interactive options in UI)\n z.object({\n type: z.literal(\"interrupt\"),\n requestId: z.string(),\n resumeToken: z.string(),\n workflow: z.string().optional(),\n node: z.string().optional(),\n id: z.string().optional(),\n opId: z.string().optional(),\n schemaId: z.string().optional(),\n schemaVersion: z.string().optional(),\n input: z.discriminatedUnion(\"kind\", [\n // Text input: question optional, no options\n z.object({\n kind: z.literal(\"text\"),\n multiple: z.boolean(),\n question: z.string().optional(),\n id: z.string().optional(),\n schemaId: z.string().optional(),\n schemaVersion: z.string().optional(),\n meta: z.record(z.string(), z.unknown()).optional(),\n options: z.array(z.never()).optional(),\n }),\n // Choice/multi-choice: question + options required\n z.object({\n kind: z.enum([\"choice\", \"multi-choice\"]),\n multiple: z.boolean(),\n question: z.string(),\n id: z.string().optional(),\n schemaId: z.string().optional(),\n schemaVersion: z.string().optional(),\n meta: z.record(z.string(), z.unknown()).optional(),\n options: z.array(\n z.object({\n id: z.string(),\n label: z.string(),\n description: z.string().optional(),\n }),\n ),\n }),\n ]),\n meta: z.record(z.string(), z.unknown()).optional(),\n }),\n StructuredDataChunkSchema,\n z.object({\n type: z.literal(\"transition\"),\n transitionTo: z.string(),\n payload: z.any().optional(),\n }),\n z.object({\n type: z.literal(\"limit-reached\"),\n runId: z.string(),\n limit: z.enum([\n \"maxNodeExecutions\",\n \"maxModelPasses\",\n \"maxToolCalls\",\n \"maxChildInvocations\",\n ]),\n maximum: z.number(),\n consumed: z.number(),\n }),\n z.object({\n type: z.literal(\"cancelled\"),\n runId: z.string(),\n reason: z.string(),\n }),\n z.object({ type: z.literal(\"done\"), data: z.any().optional() }),\n z.object({ 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"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/failure.ts","../src/client/consume-stream.ts","../src/client/read-stream.ts","../src/client/stream-from-route.ts","../src/server/collect-stream.ts","../src/server/collect-buffered-stream.ts","../src/server/json-to-sse.ts","../src/server/create-stream-response.ts","../src/server/to-sse.ts","../src/structured/apply-structured-chunk.ts","../src/structured/structured-stream-accumulator.ts","../src/types/stream-chunk.ts","../src/types/structured-data/index.ts"],"sourcesContent":["export * from \"./failure\";\n// release-test: 2026-01-22\n// packages/stream/src/index.ts\n\n// client\nexport * from \"./client/consume-stream\";\nexport * from \"./client/read-stream\";\nexport * from \"./client/stream-from-route\";\n\n// server\nexport * from \"./server/collect-buffered-stream\";\nexport * from \"./server/collect-stream\";\nexport * from \"./server/create-stream-response\";\nexport * from \"./server/to-sse\";\nexport * from \"./structured/apply-structured-chunk\";\nexport * from \"./structured/structured-stream-accumulator\";\nexport * from \"./types/stream-chunk\";\nexport * from \"./types/structured-data\";\n","import {\n errorFromFailure,\n type FailureDescriptor,\n isFailureDescriptor,\n serializeFailure,\n} from \"@kortyx/core/errors\";\n\nexport function failureChunk(error: unknown): {\n type: \"error\";\n message: string;\n failure: FailureDescriptor;\n} {\n const failure = serializeFailure(error);\n return { type: \"error\", message: failure.message, failure };\n}\n\nexport function streamError(chunk: {\n message: string;\n failure?: unknown;\n}): Error {\n return isFailureDescriptor(chunk.failure)\n ? errorFromFailure(chunk.failure)\n : new Error(chunk.message || \"Stream error.\");\n}\n","import { streamError } from \"../failure\";\nimport type { StreamChunk } from \"../types/stream-chunk\";\n\nexport interface ConsumeStreamHandlers {\n onChunk?: (\n chunk: StreamChunk,\n ) => undefined | boolean | Promise<boolean | undefined>;\n onDone?: () => void | Promise<void>;\n onError?: (error: Error, chunk?: StreamChunk) => void | Promise<void>;\n}\n\nconst toError = (value: unknown): Error =>\n value instanceof Error ? value : new Error(String(value));\n\n/**\n * Consume a stream of StreamChunk events with callback handlers.\n * Returns when a `done` chunk is seen, the stream ends, or `onChunk` returns `false`.\n */\nexport async function consumeStream(\n stream: AsyncIterable<StreamChunk>,\n handlers: ConsumeStreamHandlers = {},\n): Promise<void> {\n const callDone = async () => {\n await handlers.onDone?.();\n };\n\n try {\n for await (const chunk of stream) {\n const shouldContinue = await handlers.onChunk?.(chunk);\n\n if (chunk.type === \"error\") {\n await handlers.onError?.(streamError(chunk), chunk);\n }\n\n if (chunk.type === \"done\" || shouldContinue === false) {\n await callDone();\n return;\n }\n }\n\n await callDone();\n } catch (error) {\n const normalized = toError(error);\n await handlers.onError?.(normalized);\n throw normalized;\n }\n}\n","// packages/stream/src/client/read-stream.ts\nimport {\n isFailureDescriptor,\n KortyxError,\n serializeFailure,\n} from \"@kortyx/core/errors\";\nimport type { StreamChunk } from \"../types/stream-chunk\";\n\n/**\n * Reads a server-sent event (SSE) Response body and yields StreamChunk objects.\n */\nexport async function* readStream(\n body: ReadableStream<Uint8Array> | null,\n): AsyncGenerator<StreamChunk, void, void> {\n if (!body) return;\n\n const reader = body.getReader();\n const decoder = new TextDecoder(\"utf-8\");\n let buffer = \"\";\n let sawData = false;\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer = (buffer + decoder.decode(value, { stream: true })).replaceAll(\n \"\\r\\n\",\n \"\\n\",\n );\n const parts = buffer.split(\"\\n\\n\");\n buffer = parts.pop() as string;\n\n for (const part of parts) {\n if (!part.startsWith(\"data: \")) continue;\n sawData = true;\n const payload = part.slice(6);\n if (payload.trim() === \"[DONE]\") return;\n try {\n const chunk = JSON.parse(payload) as StreamChunk;\n if (\n !chunk ||\n typeof chunk !== \"object\" ||\n typeof chunk.type !== \"string\"\n )\n throw new Error(\"Invalid event\");\n if (chunk.type === \"error\") {\n if (\n typeof chunk.message !== \"string\" ||\n (chunk.failure !== undefined &&\n !isFailureDescriptor(chunk.failure))\n )\n throw new Error(\"Invalid failure event\");\n if (chunk.failure) chunk.failure = serializeFailure(chunk.failure);\n }\n yield chunk;\n if (chunk.type === \"done\") return;\n } catch (err) {\n throw new KortyxError(\n \"MALFORMED_STREAM\",\n \"Invalid JSON or event in stream.\",\n {\n category: \"transport\",\n retryable: false,\n safeMessage: \"The response stream contained an invalid event.\",\n cause: err,\n },\n );\n }\n }\n }\n if (buffer.trim() || sawData)\n throw new KortyxError(\n \"TRUNCATED_STREAM\",\n \"Stream ended with an incomplete event.\",\n {\n category: \"transport\",\n retryable: null,\n safeMessage: \"The response stream ended before an event completed.\",\n },\n );\n } finally {\n await reader.cancel().catch(() => {});\n reader.releaseLock();\n }\n}\n","import {\n errorFromFailure,\n isFailureDescriptor,\n KortyxError,\n} from \"@kortyx/core/errors\";\nimport { failureChunk } from \"../failure\";\nimport type { StreamChunk } from \"../types/stream-chunk\";\nimport { readStream } from \"./read-stream\";\n\nexport interface StreamFromRouteArgs<TBody = unknown> {\n endpoint: string;\n body: TBody;\n method?: string | undefined;\n fetchImpl?: typeof fetch;\n headers?: Record<string, string> | undefined;\n signal?: AbortSignal | undefined;\n}\n\nconst readErrorMessage = async (response: Response): Promise<Error> => {\n let message = `Request failed (${response.status})`;\n try {\n const payload = (await response.json()) as unknown;\n if (\n payload &&\n typeof payload === \"object\" &&\n \"failure\" in payload &&\n isFailureDescriptor(payload.failure)\n )\n return errorFromFailure(payload.failure);\n if (\n payload &&\n typeof payload === \"object\" &&\n \"error\" in payload &&\n typeof (payload as { error?: unknown }).error === \"string\"\n ) {\n message = (payload as { error: string }).error;\n }\n } catch {}\n return new KortyxError(\"HTTP_REQUEST_FAILED\", message, {\n category: \"transport\",\n status: response.status,\n safeMessage: message,\n });\n};\n\nexport async function* streamFromRoute<TBody = unknown>(\n args: StreamFromRouteArgs<TBody>,\n): AsyncGenerator<StreamChunk, void, void> {\n const fetchFn = args.fetchImpl ?? globalThis.fetch;\n if (!fetchFn) {\n yield { type: \"error\", message: \"No fetch implementation available.\" };\n yield { type: \"done\" };\n return;\n }\n\n let response: Response;\n try {\n response = await fetchFn(args.endpoint, {\n method: args.method ?? \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n ...(args.headers ?? {}),\n },\n body: JSON.stringify(args.body),\n ...(args.signal ? { signal: args.signal } : {}),\n });\n } catch (error) {\n if (args.signal?.aborted) throw error;\n yield failureChunk(\n new KortyxError(\"NETWORK_ERROR\", \"Network request failed.\", {\n category: \"transport\",\n cause: error,\n safeMessage: \"The request could not reach the server.\",\n }),\n );\n yield { type: \"done\" };\n return;\n }\n\n if (!response.ok) {\n yield failureChunk(await readErrorMessage(response));\n yield { type: \"done\" };\n return;\n }\n\n yield* readStream(response.body);\n}\n","import type { StreamChunk } from \"../types/stream-chunk\";\n\n/**\n * Collects a streamed chat response into an array.\n * Useful for non-streaming HTTP responses or server actions.\n */\nexport async function collectStream(\n stream: AsyncIterable<StreamChunk>,\n): Promise<StreamChunk[]> {\n const chunks: StreamChunk[] = [];\n for await (const chunk of stream) {\n chunks.push(chunk);\n }\n return chunks;\n}\n","import type { StreamChunk } from \"../types/stream-chunk\";\nimport type { StructuredDataChunk } from \"../types/structured-data\";\nimport { collectStream } from \"./collect-stream\";\n\nexport interface BufferedStreamResult {\n chunks: StreamChunk[];\n text: string;\n structured: StructuredDataChunk[];\n}\n\nconst getTextStreamId = (\n chunk: Extract<StreamChunk, { type: \"text-delta\" }>,\n) => {\n const opId =\n typeof chunk.opId === \"string\" && chunk.opId.length > 0\n ? chunk.opId\n : undefined;\n const segmentId =\n typeof chunk.segmentId === \"string\" && chunk.segmentId.length > 0\n ? chunk.segmentId\n : undefined;\n\n if (opId && segmentId) return `${opId}:${segmentId}`;\n return segmentId || opId || chunk.id || chunk.node;\n};\n\nconst appendTextDelta = (\n text: string,\n delta: string,\n streamId: string | undefined,\n lastStreamId: string | undefined,\n) => {\n if (\n streamId &&\n lastStreamId &&\n streamId !== lastStreamId &&\n text.length > 0 &&\n !/\\s$/.test(text) &&\n !/^\\s/.test(delta)\n ) {\n return `${text} ${delta}`;\n }\n\n return text + delta;\n};\n\n/**\n * Derive convenient buffered fields from raw chunks.\n * `text-delta` is preferred; `message` is fallback when no text deltas exist.\n */\nexport function summarizeStreamChunks(\n chunks: StreamChunk[],\n): Omit<BufferedStreamResult, \"chunks\"> {\n let sawTextDelta = false;\n let text = \"\";\n let lastTextStreamId: string | undefined;\n const messageFallback: string[] = [];\n const structured: StructuredDataChunk[] = [];\n\n for (const chunk of chunks) {\n if (chunk.type === \"text-delta\") {\n sawTextDelta = true;\n const streamId = getTextStreamId(chunk);\n text = appendTextDelta(text, chunk.delta, streamId, lastTextStreamId);\n if (streamId) lastTextStreamId = streamId;\n continue;\n }\n\n if (chunk.type === \"message\") {\n messageFallback.push(chunk.content ?? \"\");\n continue;\n }\n\n if (chunk.type === \"structured-data\") {\n structured.push(chunk as StructuredDataChunk);\n }\n }\n\n if (!sawTextDelta && messageFallback.length > 0) {\n text = messageFallback.join(\"\");\n }\n\n return { text, structured };\n}\n\n/**\n * Collect a stream and return both raw chunks and buffered convenience fields.\n */\nexport async function collectBufferedStream(\n stream: AsyncIterable<StreamChunk>,\n): Promise<BufferedStreamResult> {\n const chunks = await collectStream(stream);\n return {\n chunks,\n ...summarizeStreamChunks(chunks),\n };\n}\n","// packages/stream/src/server/json-to-sse.ts\nexport class JsonToSseTransformStream extends TransformStream<unknown, string> {\n constructor() {\n super({\n transform(part, controller) {\n controller.enqueue(`data: ${JSON.stringify(part)}\\n\\n`);\n },\n flush(controller) {\n controller.enqueue(\"data: [DONE]\\n\\n\");\n },\n });\n }\n}\n","import { failureChunk } from \"../failure\";\n// packages/stream/src/server/create-stream-response.ts\nimport type { StreamChunk } from \"../types/stream-chunk\";\nimport { JsonToSseTransformStream } from \"./json-to-sse\";\n\nexport const STREAM_HEADERS = {\n \"content-type\": \"text/event-stream\",\n \"cache-control\": \"no-cache\",\n connection: \"keep-alive\",\n \"x-accel-buffering\": \"no\",\n};\n\n/** Bridge stream cancellation to the source, including Node execution streams. */\nexport function createStreamResponse(\n stream: AsyncIterable<StreamChunk>,\n): Response {\n let cancelled = false;\n const iterator = stream[Symbol.asyncIterator]();\n const readable = new ReadableStream<StreamChunk>({\n async start(controller) {\n try {\n while (!cancelled) {\n const next = await iterator.next();\n if (cancelled || next.done) break;\n controller.enqueue(next.value);\n }\n } catch (error) {\n if (!cancelled) {\n controller.enqueue(failureChunk(error));\n controller.enqueue({ type: \"done\" });\n }\n } finally {\n if (!cancelled) controller.close();\n }\n },\n cancel() {\n cancelled = true;\n // Destroying an active Kortyx stream signals its transient execution controller.\n (\n stream as AsyncIterable<StreamChunk> & { destroy?: () => void }\n ).destroy?.();\n void Promise.resolve(iterator.return?.()).catch(() => {});\n },\n });\n return new Response(\n readable\n .pipeThrough(new JsonToSseTransformStream())\n .pipeThrough(new TextEncoderStream()),\n { headers: STREAM_HEADERS },\n );\n}\n","import type { StreamChunk } from \"../types/stream-chunk\";\nimport { createStreamResponse } from \"./create-stream-response\";\n\n/**\n * Friendly alias for createStreamResponse.\n */\nexport function toSSE(stream: AsyncIterable<StreamChunk>): Response {\n return createStreamResponse(stream);\n}\n","import type { StructuredDataChunk } from \"../types/structured-data\";\n\nexport type StructuredStreamState<TData = unknown> = {\n streamId: string;\n dataType: string;\n status: \"streaming\" | \"done\";\n data: TData;\n node?: string;\n id?: string;\n schemaId?: string;\n schemaVersion?: string;\n};\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst isArrayIndex = (value: string): boolean => /^\\d+$/.test(value);\n\nconst describeValue = (value: unknown): string => {\n if (value === null) return \"null\";\n if (Array.isArray(value)) return \"array\";\n return typeof value;\n};\n\nconst parsePath = (path: string): string[] => {\n if (path.length === 0) {\n throw new Error(\n \"Structured chunk path must be a non-empty dot-separated string.\",\n );\n }\n\n const parts = path.split(\".\");\n if (parts.some((part) => part.length === 0)) {\n throw new Error(\n `Structured chunk path \"${path}\" must not contain empty segments.`,\n );\n }\n\n return parts;\n};\n\nconst cloneContainerForPart = (args: {\n current: unknown;\n part: string;\n path: string;\n traversed: string[];\n}): Record<string, unknown> | unknown[] => {\n const expected = isArrayIndex(args.part) ? \"array\" : \"object\";\n const location =\n args.traversed.length === 0 ? \"<root>\" : args.traversed.join(\".\");\n\n if (args.current === undefined) {\n return expected === \"array\" ? [] : {};\n }\n\n if (expected === \"array\") {\n if (Array.isArray(args.current)) return [...args.current];\n throw new Error(\n `Structured path conflict at ${location} for \"${args.path}\": expected array container, received ${describeValue(args.current)}.`,\n );\n }\n\n if (isPlainObject(args.current)) return { ...args.current };\n\n throw new Error(\n `Structured path conflict at ${location} for \"${args.path}\": expected object container, received ${describeValue(args.current)}.`,\n );\n};\n\nconst updateByParts = (args: {\n input: unknown;\n parts: string[];\n path: string;\n updateLeaf: (current: unknown) => unknown;\n traversed?: string[];\n}): unknown => {\n const traversed = args.traversed ?? [];\n const [part, ...rest] = args.parts as [string, ...string[]];\n\n const container = cloneContainerForPart({\n current: args.input,\n part,\n path: args.path,\n traversed,\n });\n\n const currentChild = Array.isArray(container)\n ? container[Number(part)]\n : container[part];\n const nextChild =\n rest.length === 0\n ? args.updateLeaf(currentChild)\n : updateByParts({\n input: currentChild,\n parts: rest,\n path: args.path,\n updateLeaf: args.updateLeaf,\n traversed: [...traversed, part],\n });\n\n if (Array.isArray(container)) {\n container[Number(part)] = nextChild;\n } else {\n container[part] = nextChild;\n }\n\n return container;\n};\n\nexport function applyStructuredChunk<TData = unknown>(\n current: StructuredStreamState<TData> | undefined,\n chunk: StructuredDataChunk,\n): StructuredStreamState<TData> {\n if (current && current.streamId !== chunk.streamId) {\n throw new Error(\n `Structured chunk streamId mismatch: expected ${current.streamId}, received ${chunk.streamId}.`,\n );\n }\n\n if (current?.status === \"done\") {\n throw new Error(\n `Structured stream ${chunk.streamId} already completed with a final chunk.`,\n );\n }\n\n const nextBase = {\n streamId: chunk.streamId,\n dataType: chunk.dataType,\n status: chunk.kind === \"final\" ? (\"done\" as const) : (\"streaming\" as const),\n ...(chunk.node ? { node: chunk.node } : {}),\n ...(chunk.id ? { id: chunk.id } : {}),\n ...(chunk.schemaId ? { schemaId: chunk.schemaId } : {}),\n ...(chunk.schemaVersion ? { schemaVersion: chunk.schemaVersion } : {}),\n };\n\n if (chunk.kind === \"final\") {\n return {\n ...nextBase,\n data: chunk.data as TData,\n };\n }\n\n const path = chunk.path;\n const pathParts = parsePath(path);\n const previousData = current?.data;\n\n if (chunk.kind === \"set\") {\n return {\n ...nextBase,\n data: updateByParts({\n input: previousData,\n parts: pathParts,\n path,\n updateLeaf: () => chunk.value,\n }) as TData,\n };\n }\n\n if (chunk.kind === \"append\") {\n return {\n ...nextBase,\n data: updateByParts({\n input: previousData,\n parts: pathParts,\n path,\n updateLeaf: (existing) => {\n if (existing === undefined) return [...chunk.items];\n if (!Array.isArray(existing)) {\n throw new Error(\n `Structured append requires path \"${path}\" to target an array, received ${describeValue(existing)}.`,\n );\n }\n return [...existing, ...chunk.items];\n },\n }) as TData,\n };\n }\n\n return {\n ...nextBase,\n data: updateByParts({\n input: previousData,\n parts: pathParts,\n path,\n updateLeaf: (existing) => {\n if (existing === undefined) return chunk.delta;\n if (typeof existing !== \"string\") {\n throw new Error(\n `Structured text-delta requires path \"${path}\" to target a string, received ${describeValue(existing)}.`,\n );\n }\n return existing + chunk.delta;\n },\n }) as TData,\n };\n}\n\nexport function reduceStructuredChunks<TData = unknown>(\n chunks: StructuredDataChunk[],\n): Record<string, StructuredStreamState<TData>> {\n return chunks.reduce<Record<string, StructuredStreamState<TData>>>(\n (acc, chunk) => {\n acc[chunk.streamId] = applyStructuredChunk(acc[chunk.streamId], chunk);\n return acc;\n },\n {},\n );\n}\n","import type { StreamChunk } from \"../types/stream-chunk\";\nimport type { StructuredDataChunk } from \"../types/structured-data\";\nimport {\n applyStructuredChunk,\n type StructuredStreamState,\n} from \"./apply-structured-chunk\";\n\nexport type StructuredStreamAccumulator<TData = unknown> = {\n apply: (chunk: StructuredDataChunk) => StructuredStreamState<TData>;\n applyStreamChunk: (\n chunk: StreamChunk,\n ) => StructuredStreamState<TData> | undefined;\n get: (streamId: string) => StructuredStreamState<TData> | undefined;\n has: (streamId: string) => boolean;\n delete: (streamId: string) => boolean;\n clear: () => void;\n size: () => number;\n entries: () => Array<[string, StructuredStreamState<TData>]>;\n values: () => StructuredStreamState<TData>[];\n toRecord: () => Record<string, StructuredStreamState<TData>>;\n};\n\nconst isStructuredDataChunk = (\n chunk: StreamChunk,\n): chunk is StructuredDataChunk => chunk.type === \"structured-data\";\n\nexport function createStructuredStreamAccumulator<TData = unknown>(\n initialChunks: Iterable<StructuredDataChunk> = [],\n): StructuredStreamAccumulator<TData> {\n const states = new Map<string, StructuredStreamState<TData>>();\n\n const apply = (chunk: StructuredDataChunk): StructuredStreamState<TData> => {\n const nextState = applyStructuredChunk(states.get(chunk.streamId), chunk);\n states.set(chunk.streamId, nextState);\n return nextState;\n };\n\n for (const chunk of initialChunks) {\n apply(chunk);\n }\n\n return {\n apply,\n applyStreamChunk: (chunk) => {\n if (!isStructuredDataChunk(chunk)) return undefined;\n return apply(chunk);\n },\n get: (streamId) => states.get(streamId),\n has: (streamId) => states.has(streamId),\n delete: (streamId) => states.delete(streamId),\n clear: () => {\n states.clear();\n },\n size: () => states.size,\n entries: () => Array.from(states.entries()),\n values: () => Array.from(states.values()),\n toRecord: () => Object.fromEntries(states.entries()),\n };\n}\n","import {\n type FailureDescriptor,\n isFailureDescriptor,\n serializeFailure,\n} from \"@kortyx/core/errors\";\nimport { z } from \"zod\";\nimport { StructuredDataChunkSchema } from \"./structured-data\";\n\nexport const StreamChunkSchema = z.union([\n z.object({\n type: z.literal(\"session\"),\n sessionId: z.string(),\n }),\n z.object({\n type: z.literal(\"checkpoint\"),\n id: z.string(),\n sessionId: z.string(),\n turnIndex: z.number().int().nonnegative(),\n label: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"structured-data-invalidated\"),\n streamId: z.string(),\n checkpointId: z.string(),\n }),\n z.object({\n type: z.literal(\"trace\"),\n traceId: z.string(),\n spanId: z.string(),\n runId: z.string(),\n rootSpanName: z.literal(\"kortyx.run\"),\n }),\n z.object({\n type: z.literal(\"status\"),\n message: z.string(),\n node: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"message\"),\n content: z.string(),\n node: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"text-start\"),\n node: z.string().optional(),\n id: z.string().optional(),\n opId: z.string().optional(),\n segmentId: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"text-delta\"),\n delta: z.string(),\n node: z.string().optional(),\n id: z.string().optional(),\n opId: z.string().optional(),\n segmentId: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"text-end\"),\n node: z.string().optional(),\n id: z.string().optional(),\n opId: z.string().optional(),\n segmentId: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"tool-result\"),\n tool: z.string().optional(),\n node: z.string().optional(),\n content: z.unknown(),\n }),\n z.object({\n type: z.literal(\"tool-call-start\"),\n tool: z.string(),\n toolCallId: z.string(),\n node: z.string().optional(),\n id: z.string().optional(),\n opId: z.string().optional(),\n input: z.unknown().optional(),\n }),\n z.object({\n type: z.literal(\"tool-call-result\"),\n tool: z.string(),\n toolCallId: z.string(),\n node: z.string().optional(),\n id: z.string().optional(),\n opId: z.string().optional(),\n content: z.unknown(),\n structuredContent: z.unknown().optional(),\n isError: z.boolean().optional(),\n }),\n z.object({\n type: z.literal(\"tool-call-error\"),\n failure: z\n .custom<FailureDescriptor>(isFailureDescriptor)\n .transform(serializeFailure)\n .optional(),\n tool: z.string(),\n toolCallId: z.string(),\n node: z.string().optional(),\n id: z.string().optional(),\n opId: z.string().optional(),\n message: z.string(),\n }),\n // Interrupt request chunk (used to render interactive options in UI)\n z.object({\n type: z.literal(\"interrupt\"),\n requestId: z.string(),\n resumeToken: z.string(),\n workflow: z.string().optional(),\n node: z.string().optional(),\n id: z.string().optional(),\n opId: z.string().optional(),\n schemaId: z.string().optional(),\n schemaVersion: z.string().optional(),\n input: z.discriminatedUnion(\"kind\", [\n // Text input: question optional, no options\n z.object({\n kind: z.literal(\"text\"),\n multiple: z.boolean(),\n question: z.string().optional(),\n id: z.string().optional(),\n schemaId: z.string().optional(),\n schemaVersion: z.string().optional(),\n meta: z.record(z.string(), z.unknown()).optional(),\n options: z.array(z.never()).optional(),\n }),\n z.object({\n kind: z.literal(\"custom\"),\n multiple: z.literal(false),\n question: z.string().optional(),\n contract: z.string().optional(),\n request: z.unknown(),\n id: z.string().optional(),\n schemaId: z.string(),\n schemaVersion: z.string(),\n meta: z.record(z.string(), z.unknown()).optional(),\n options: z.array(z.never()).optional(),\n }),\n // Choice/multi-choice: question + options required\n z.object({\n kind: z.enum([\"choice\", \"multi-choice\"]),\n multiple: z.boolean(),\n question: z.string(),\n id: z.string().optional(),\n schemaId: z.string().optional(),\n schemaVersion: z.string().optional(),\n meta: z.record(z.string(), z.unknown()).optional(),\n options: z.array(\n z.object({\n id: z.string(),\n label: z.string(),\n description: z.string().optional(),\n }),\n ),\n }),\n ]),\n meta: z.record(z.string(), z.unknown()).optional(),\n }),\n StructuredDataChunkSchema,\n z.object({\n type: z.literal(\"transition\"),\n transitionTo: z.string(),\n payload: z.any().optional(),\n }),\n z.object({\n type: z.literal(\"limit-reached\"),\n runId: z.string(),\n limit: z.enum([\n \"maxNodeExecutions\",\n \"maxModelPasses\",\n \"maxToolCalls\",\n \"maxChildInvocations\",\n ]),\n maximum: z.number(),\n consumed: z.number(),\n }),\n z.object({\n type: z.literal(\"cancelled\"),\n runId: z.string(),\n reason: z.string(),\n }),\n z.object({ type: z.literal(\"done\"), data: z.any().optional() }),\n z.object({\n type: z.literal(\"error\"),\n message: z.string(),\n failure: z\n .custom<FailureDescriptor>(isFailureDescriptor)\n .transform(serializeFailure)\n .optional(),\n }),\n]);\n\nexport type StreamChunk = z.infer<typeof StreamChunkSchema>;\n","import { z } from \"zod\";\n\nconst StructuredDataBase = z.object({\n type: z.literal(\"structured-data\"),\n streamId: z.string(),\n dataType: z.string(),\n kind: z.enum([\"set\", \"append\", \"text-delta\", \"final\"]),\n schemaId: z.string().optional(),\n schemaVersion: z.string().optional(),\n id: z.string().optional(),\n node: z.string().optional(),\n});\n\nconst StructuredSetChunkSchema = StructuredDataBase.extend({\n kind: z.literal(\"set\"),\n path: z.string().min(1),\n value: z.unknown(),\n});\n\nconst StructuredAppendChunkSchema = StructuredDataBase.extend({\n kind: z.literal(\"append\"),\n path: z.string().min(1),\n items: z.array(z.unknown()),\n});\n\nconst StructuredTextDeltaChunkSchema = StructuredDataBase.extend({\n kind: z.literal(\"text-delta\"),\n path: z.string().min(1),\n delta: z.string(),\n});\n\nconst StructuredFinalChunkSchema = StructuredDataBase.extend({\n kind: z.literal(\"final\"),\n data: z.unknown(),\n});\n\nexport const StructuredDataChunkSchema = z.union([\n StructuredSetChunkSchema,\n StructuredAppendChunkSchema,\n StructuredTextDeltaChunkSchema,\n StructuredFinalChunkSchema,\n]);\n\nexport type StructuredDataChunk = z.infer<typeof StructuredDataChunkSchema>;\n"],"mappings":"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","names":["import_errors","import_errors","import_errors","import_zod"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kortyx/stream",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.13.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Streaming primitives for Kortyx.",
|
|
6
6
|
"keywords": [
|
|
@@ -37,7 +37,8 @@
|
|
|
37
37
|
"CHANGELOG.md"
|
|
38
38
|
],
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"zod": "^4.3.6"
|
|
40
|
+
"zod": "^4.3.6",
|
|
41
|
+
"@kortyx/core": "0.10.0"
|
|
41
42
|
},
|
|
42
43
|
"devDependencies": {
|
|
43
44
|
"concurrently": "^9.2.0",
|