@kortyx/stream 0.4.1 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # @chatbot-core/types
2
2
 
3
+ ## [0.5.1](https://github.com/kortyx-io/kortyx/compare/stream-v0.5.0...stream-v0.5.1) (2026-03-11)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * **dx:** simplify streamChat API route surface and docs ([6ac69da](https://github.com/kortyx-io/kortyx/commit/6ac69da30945e48d251b3f16b979177cf5a4d108))
9
+ * **dx:** simplify streamChat API route surface and docs ([ec6599a](https://github.com/kortyx-io/kortyx/commit/ec6599a5b745d2ec22d77a0ede4d730ddd4d261a))
10
+
11
+ ## [0.5.0](https://github.com/kortyx-io/kortyx/compare/stream-v0.4.1...stream-v0.5.0) (2026-03-08)
12
+
13
+
14
+ ### Features
15
+
16
+ * **stream:** add consumeStream and improve nextjs chat DX ([6a544cc](https://github.com/kortyx-io/kortyx/commit/6a544cc827aace25b2953a290809eccda37f37f8))
17
+
3
18
  ## [0.4.1](https://github.com/kortyx-io/kortyx/compare/stream-v0.4.0...stream-v0.4.1) (2026-02-17)
4
19
 
5
20
 
@@ -411,6 +411,17 @@ declare const StreamChunkSchema: z.ZodUnion<[z.ZodObject<{
411
411
  }>]>;
412
412
  type StreamChunk = z.infer<typeof StreamChunkSchema>;
413
413
 
414
+ interface ConsumeStreamHandlers {
415
+ onChunk?: (chunk: StreamChunk) => void | boolean | Promise<boolean | undefined>;
416
+ onDone?: () => void | Promise<void>;
417
+ onError?: (error: Error, chunk?: StreamChunk) => void | Promise<void>;
418
+ }
419
+ /**
420
+ * Consume a stream of StreamChunk events with callback handlers.
421
+ * Returns when a `done` chunk is seen, the stream ends, or `onChunk` returns `false`.
422
+ */
423
+ declare function consumeStream(stream: AsyncIterable<StreamChunk>, handlers?: ConsumeStreamHandlers): Promise<void>;
424
+
414
425
  /**
415
426
  * Reads a server-sent event (SSE) Response body and yields StreamChunk objects.
416
427
  */
@@ -425,4 +436,4 @@ interface StreamFromRouteArgs<TBody = unknown> {
425
436
  }
426
437
  declare function streamFromRoute<TBody = unknown>(args: StreamFromRouteArgs<TBody>): AsyncGenerator<StreamChunk, void, void>;
427
438
 
428
- export { type StreamChunk as S, StreamChunkSchema as a, type StreamFromRouteArgs as b, readStream as r, streamFromRoute as s };
439
+ export { type ConsumeStreamHandlers as C, type StreamChunk as S, StreamChunkSchema as a, type StreamFromRouteArgs as b, consumeStream as c, readStream as r, streamFromRoute as s };
package/dist/browser.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export { S as StreamChunk, b as StreamFromRouteArgs, r as readStream, s as streamFromRoute } from './browser-BIAzFI3U.js';
1
+ export { C as ConsumeStreamHandlers, S as StreamChunk, b as StreamFromRouteArgs, c as consumeStream, r as readStream, s as streamFromRoute } from './browser-ojdAqLMO.js';
2
2
  import 'zod';
package/dist/browser.js CHANGED
@@ -19,11 +19,43 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
19
19
  // src/browser.ts
20
20
  var browser_exports = {};
21
21
  __export(browser_exports, {
22
+ consumeStream: () => consumeStream,
22
23
  readStream: () => readStream,
23
24
  streamFromRoute: () => streamFromRoute
24
25
  });
25
26
  module.exports = __toCommonJS(browser_exports);
26
27
 
28
+ // src/client/consume-stream.ts
29
+ var toError = (value) => value instanceof Error ? value : new Error(String(value));
30
+ async function consumeStream(stream, handlers = {}) {
31
+ let doneCalled = false;
32
+ const callDone = async () => {
33
+ if (doneCalled) return;
34
+ doneCalled = true;
35
+ await handlers.onDone?.();
36
+ };
37
+ try {
38
+ for await (const chunk of stream) {
39
+ const shouldContinue = await handlers.onChunk?.(chunk);
40
+ if (chunk.type === "error") {
41
+ await handlers.onError?.(
42
+ new Error(chunk.message || "Stream error."),
43
+ chunk
44
+ );
45
+ }
46
+ if (chunk.type === "done" || shouldContinue === false) {
47
+ await callDone();
48
+ return;
49
+ }
50
+ }
51
+ await callDone();
52
+ } catch (error) {
53
+ const normalized = toError(error);
54
+ await handlers.onError?.(normalized);
55
+ throw normalized;
56
+ }
57
+ }
58
+
27
59
  // src/client/read-stream.ts
28
60
  async function* readStream(body) {
29
61
  if (!body) return;
@@ -94,6 +126,7 @@ async function* streamFromRoute(args) {
94
126
  }
95
127
  // Annotate the CommonJS export names for ESM import in node:
96
128
  0 && (module.exports = {
129
+ consumeStream,
97
130
  readStream,
98
131
  streamFromRoute
99
132
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/browser.ts","../src/client/read-stream.ts","../src/client/stream-from-route.ts"],"sourcesContent":["// Browser-safe exports for client bundles.\n// Keep this file free of Node-only imports (fs, path, etc).\n\nexport { readStream } from \"./client/read-stream\";\nexport type { StreamFromRouteArgs } from \"./client/stream-from-route\";\nexport { streamFromRoute } from \"./client/stream-from-route\";\nexport type { StreamChunk } from \"./types/stream-chunk\";\n","// packages/stream/src/client/read-stream.ts\nimport type { StreamChunk } from \"../types/stream-chunk\";\n\n/**\n * Reads a server-sent event (SSE) Response body and yields StreamChunk objects.\n */\nexport async function* readStream(\n body: ReadableStream<Uint8Array> | null,\n): AsyncGenerator<StreamChunk, void, void> {\n if (!body) return;\n\n const reader = body.getReader();\n const decoder = new TextDecoder(\"utf-8\");\n let buffer = \"\";\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const parts = buffer.split(\"\\n\\n\");\n buffer = parts.pop() ?? \"\";\n\n for (const part of parts) {\n if (!part.startsWith(\"data: \")) continue;\n const payload = part.slice(6);\n if (payload.trim() === \"[DONE]\") return;\n try {\n yield JSON.parse(payload) as StreamChunk;\n } catch (err: any) {\n console.warn(\"Invalid JSON in stream chunk:\", payload);\n console.error(err);\n }\n }\n }\n}\n","import type { StreamChunk } from \"../types/stream-chunk\";\nimport { readStream } from \"./read-stream\";\n\nexport interface StreamFromRouteArgs<TBody = unknown> {\n endpoint: string;\n body: TBody;\n method?: string | undefined;\n fetchImpl?: typeof fetch;\n headers?: Record<string, string> | undefined;\n}\n\nconst toErrorMessage = (error: unknown): string =>\n error instanceof Error ? error.message : String(error);\n\nconst readErrorMessage = async (response: Response): Promise<string> => {\n let message = `Request failed (${response.status})`;\n try {\n const payload = (await response.json()) as unknown;\n if (\n payload &&\n typeof payload === \"object\" &&\n \"error\" in payload &&\n typeof (payload as { error?: unknown }).error === \"string\"\n ) {\n message = (payload as { error: string }).error;\n }\n } catch {}\n return message;\n};\n\nexport async function* streamFromRoute<TBody = unknown>(\n args: StreamFromRouteArgs<TBody>,\n): AsyncGenerator<StreamChunk, void, void> {\n const fetchFn = args.fetchImpl ?? globalThis.fetch;\n if (!fetchFn) {\n yield { type: \"error\", message: \"No fetch implementation available.\" };\n yield { type: \"done\" };\n return;\n }\n\n let response: Response;\n try {\n response = await fetchFn(args.endpoint, {\n method: args.method ?? \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n ...(args.headers ?? {}),\n },\n body: JSON.stringify(args.body),\n });\n } catch (error) {\n yield { type: \"error\", message: toErrorMessage(error) };\n yield { type: \"done\" };\n return;\n }\n\n if (!response.ok) {\n yield { type: \"error\", message: await readErrorMessage(response) };\n yield { type: \"done\" };\n return;\n }\n\n yield* readStream(response.body);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACMA,gBAAuB,WACrB,MACyC;AACzC,MAAI,CAAC,KAAM;AAEX,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAM,UAAU,IAAI,YAAY,OAAO;AACvC,MAAI,SAAS;AAEb,SAAO,MAAM;AACX,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,QAAI,KAAM;AAEV,cAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAChD,UAAM,QAAQ,OAAO,MAAM,MAAM;AACjC,aAAS,MAAM,IAAI,KAAK;AAExB,eAAW,QAAQ,OAAO;AACxB,UAAI,CAAC,KAAK,WAAW,QAAQ,EAAG;AAChC,YAAM,UAAU,KAAK,MAAM,CAAC;AAC5B,UAAI,QAAQ,KAAK,MAAM,SAAU;AACjC,UAAI;AACF,cAAM,KAAK,MAAM,OAAO;AAAA,MAC1B,SAAS,KAAU;AACjB,gBAAQ,KAAK,iCAAiC,OAAO;AACrD,gBAAQ,MAAM,GAAG;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AACF;;;ACxBA,IAAM,iBAAiB,CAAC,UACtB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAEvD,IAAM,mBAAmB,OAAO,aAAwC;AACtE,MAAI,UAAU,mBAAmB,SAAS,MAAM;AAChD,MAAI;AACF,UAAM,UAAW,MAAM,SAAS,KAAK;AACrC,QACE,WACA,OAAO,YAAY,YACnB,WAAW,WACX,OAAQ,QAAgC,UAAU,UAClD;AACA,gBAAW,QAA8B;AAAA,IAC3C;AAAA,EACF,QAAQ;AAAA,EAAC;AACT,SAAO;AACT;AAEA,gBAAuB,gBACrB,MACyC;AACzC,QAAM,UAAU,KAAK,aAAa,WAAW;AAC7C,MAAI,CAAC,SAAS;AACZ,UAAM,EAAE,MAAM,SAAS,SAAS,qCAAqC;AACrE,UAAM,EAAE,MAAM,OAAO;AACrB;AAAA,EACF;AAEA,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,QAAQ,KAAK,UAAU;AAAA,MACtC,QAAQ,KAAK,UAAU;AAAA,MACvB,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,GAAI,KAAK,WAAW,CAAC;AAAA,MACvB;AAAA,MACA,MAAM,KAAK,UAAU,KAAK,IAAI;AAAA,IAChC,CAAC;AAAA,EACH,SAAS,OAAO;AACd,UAAM,EAAE,MAAM,SAAS,SAAS,eAAe,KAAK,EAAE;AACtD,UAAM,EAAE,MAAM,OAAO;AACrB;AAAA,EACF;AAEA,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,EAAE,MAAM,SAAS,SAAS,MAAM,iBAAiB,QAAQ,EAAE;AACjE,UAAM,EAAE,MAAM,OAAO;AACrB;AAAA,EACF;AAEA,SAAO,WAAW,SAAS,IAAI;AACjC;","names":[]}
1
+ {"version":3,"sources":["../src/browser.ts","../src/client/consume-stream.ts","../src/client/read-stream.ts","../src/client/stream-from-route.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 type { StreamChunk } from \"./types/stream-chunk\";\n","import type { StreamChunk } from \"../types/stream-chunk\";\n\nexport interface ConsumeStreamHandlers {\n onChunk?: (\n chunk: StreamChunk,\n ) => void | boolean | Promise<boolean | undefined>;\n onDone?: () => void | Promise<void>;\n onError?: (error: Error, chunk?: StreamChunk) => void | Promise<void>;\n}\n\nconst toError = (value: unknown): Error =>\n value instanceof Error ? value : new Error(String(value));\n\n/**\n * Consume a stream of StreamChunk events with callback handlers.\n * Returns when a `done` chunk is seen, the stream ends, or `onChunk` returns `false`.\n */\nexport async function consumeStream(\n stream: AsyncIterable<StreamChunk>,\n handlers: ConsumeStreamHandlers = {},\n): Promise<void> {\n let doneCalled = false;\n\n const callDone = async () => {\n if (doneCalled) return;\n doneCalled = true;\n await handlers.onDone?.();\n };\n\n try {\n for await (const chunk of stream) {\n const shouldContinue = await handlers.onChunk?.(chunk);\n\n if (chunk.type === \"error\") {\n await handlers.onError?.(\n new Error(chunk.message || \"Stream error.\"),\n chunk,\n );\n }\n\n if (chunk.type === \"done\" || shouldContinue === false) {\n await callDone();\n return;\n }\n }\n\n await callDone();\n } catch (error) {\n const normalized = toError(error);\n await handlers.onError?.(normalized);\n throw normalized;\n }\n}\n","// packages/stream/src/client/read-stream.ts\nimport type { StreamChunk } from \"../types/stream-chunk\";\n\n/**\n * Reads a server-sent event (SSE) Response body and yields StreamChunk objects.\n */\nexport async function* readStream(\n body: ReadableStream<Uint8Array> | null,\n): AsyncGenerator<StreamChunk, void, void> {\n if (!body) return;\n\n const reader = body.getReader();\n const decoder = new TextDecoder(\"utf-8\");\n let buffer = \"\";\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const parts = buffer.split(\"\\n\\n\");\n buffer = parts.pop() ?? \"\";\n\n for (const part of parts) {\n if (!part.startsWith(\"data: \")) continue;\n const payload = part.slice(6);\n if (payload.trim() === \"[DONE]\") return;\n try {\n yield JSON.parse(payload) as StreamChunk;\n } catch (err: any) {\n console.warn(\"Invalid JSON in stream chunk:\", payload);\n console.error(err);\n }\n }\n }\n}\n","import type { StreamChunk } from \"../types/stream-chunk\";\nimport { readStream } from \"./read-stream\";\n\nexport interface StreamFromRouteArgs<TBody = unknown> {\n endpoint: string;\n body: TBody;\n method?: string | undefined;\n fetchImpl?: typeof fetch;\n headers?: Record<string, string> | undefined;\n}\n\nconst toErrorMessage = (error: unknown): string =>\n error instanceof Error ? error.message : String(error);\n\nconst readErrorMessage = async (response: Response): Promise<string> => {\n let message = `Request failed (${response.status})`;\n try {\n const payload = (await response.json()) as unknown;\n if (\n payload &&\n typeof payload === \"object\" &&\n \"error\" in payload &&\n typeof (payload as { error?: unknown }).error === \"string\"\n ) {\n message = (payload as { error: string }).error;\n }\n } catch {}\n return message;\n};\n\nexport async function* streamFromRoute<TBody = unknown>(\n args: StreamFromRouteArgs<TBody>,\n): AsyncGenerator<StreamChunk, void, void> {\n const fetchFn = args.fetchImpl ?? globalThis.fetch;\n if (!fetchFn) {\n yield { type: \"error\", message: \"No fetch implementation available.\" };\n yield { type: \"done\" };\n return;\n }\n\n let response: Response;\n try {\n response = await fetchFn(args.endpoint, {\n method: args.method ?? \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n ...(args.headers ?? {}),\n },\n body: JSON.stringify(args.body),\n });\n } catch (error) {\n yield { type: \"error\", message: toErrorMessage(error) };\n yield { type: \"done\" };\n return;\n }\n\n if (!response.ok) {\n yield { type: \"error\", message: await readErrorMessage(response) };\n yield { type: \"done\" };\n return;\n }\n\n yield* readStream(response.body);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACUA,IAAM,UAAU,CAAC,UACf,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAM1D,eAAsB,cACpB,QACA,WAAkC,CAAC,GACpB;AACf,MAAI,aAAa;AAEjB,QAAM,WAAW,YAAY;AAC3B,QAAI,WAAY;AAChB,iBAAa;AACb,UAAM,SAAS,SAAS;AAAA,EAC1B;AAEA,MAAI;AACF,qBAAiB,SAAS,QAAQ;AAChC,YAAM,iBAAiB,MAAM,SAAS,UAAU,KAAK;AAErD,UAAI,MAAM,SAAS,SAAS;AAC1B,cAAM,SAAS;AAAA,UACb,IAAI,MAAM,MAAM,WAAW,eAAe;AAAA,UAC1C;AAAA,QACF;AAAA,MACF;AAEA,UAAI,MAAM,SAAS,UAAU,mBAAmB,OAAO;AACrD,cAAM,SAAS;AACf;AAAA,MACF;AAAA,IACF;AAEA,UAAM,SAAS;AAAA,EACjB,SAAS,OAAO;AACd,UAAM,aAAa,QAAQ,KAAK;AAChC,UAAM,SAAS,UAAU,UAAU;AACnC,UAAM;AAAA,EACR;AACF;;;AC9CA,gBAAuB,WACrB,MACyC;AACzC,MAAI,CAAC,KAAM;AAEX,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAM,UAAU,IAAI,YAAY,OAAO;AACvC,MAAI,SAAS;AAEb,SAAO,MAAM;AACX,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,QAAI,KAAM;AAEV,cAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAChD,UAAM,QAAQ,OAAO,MAAM,MAAM;AACjC,aAAS,MAAM,IAAI,KAAK;AAExB,eAAW,QAAQ,OAAO;AACxB,UAAI,CAAC,KAAK,WAAW,QAAQ,EAAG;AAChC,YAAM,UAAU,KAAK,MAAM,CAAC;AAC5B,UAAI,QAAQ,KAAK,MAAM,SAAU;AACjC,UAAI;AACF,cAAM,KAAK,MAAM,OAAO;AAAA,MAC1B,SAAS,KAAU;AACjB,gBAAQ,KAAK,iCAAiC,OAAO;AACrD,gBAAQ,MAAM,GAAG;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AACF;;;ACxBA,IAAM,iBAAiB,CAAC,UACtB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAEvD,IAAM,mBAAmB,OAAO,aAAwC;AACtE,MAAI,UAAU,mBAAmB,SAAS,MAAM;AAChD,MAAI;AACF,UAAM,UAAW,MAAM,SAAS,KAAK;AACrC,QACE,WACA,OAAO,YAAY,YACnB,WAAW,WACX,OAAQ,QAAgC,UAAU,UAClD;AACA,gBAAW,QAA8B;AAAA,IAC3C;AAAA,EACF,QAAQ;AAAA,EAAC;AACT,SAAO;AACT;AAEA,gBAAuB,gBACrB,MACyC;AACzC,QAAM,UAAU,KAAK,aAAa,WAAW;AAC7C,MAAI,CAAC,SAAS;AACZ,UAAM,EAAE,MAAM,SAAS,SAAS,qCAAqC;AACrE,UAAM,EAAE,MAAM,OAAO;AACrB;AAAA,EACF;AAEA,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,QAAQ,KAAK,UAAU;AAAA,MACtC,QAAQ,KAAK,UAAU;AAAA,MACvB,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,GAAI,KAAK,WAAW,CAAC;AAAA,MACvB;AAAA,MACA,MAAM,KAAK,UAAU,KAAK,IAAI;AAAA,IAChC,CAAC;AAAA,EACH,SAAS,OAAO;AACd,UAAM,EAAE,MAAM,SAAS,SAAS,eAAe,KAAK,EAAE;AACtD,UAAM,EAAE,MAAM,OAAO;AACrB;AAAA,EACF;AAEA,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,EAAE,MAAM,SAAS,SAAS,MAAM,iBAAiB,QAAQ,EAAE;AACjE,UAAM,EAAE,MAAM,OAAO;AACrB;AAAA,EACF;AAEA,SAAO,WAAW,SAAS,IAAI;AACjC;","names":[]}
package/dist/index.d.ts CHANGED
@@ -1,7 +1,39 @@
1
- import { S as StreamChunk } from './browser-BIAzFI3U.js';
2
- export { a as StreamChunkSchema, b as StreamFromRouteArgs, r as readStream, s as streamFromRoute } from './browser-BIAzFI3U.js';
1
+ import { S as StreamChunk } from './browser-ojdAqLMO.js';
2
+ export { C as ConsumeStreamHandlers, a as StreamChunkSchema, b as StreamFromRouteArgs, c as consumeStream, r as readStream, s as streamFromRoute } from './browser-ojdAqLMO.js';
3
3
  import 'zod';
4
4
 
5
+ type StructuredStreamChunk = {
6
+ type: "structured-data";
7
+ data: unknown;
8
+ dataType?: string;
9
+ mode?: "final" | "patch" | "snapshot";
10
+ schemaId?: string;
11
+ schemaVersion?: string;
12
+ id?: string;
13
+ opId?: string;
14
+ node?: string;
15
+ };
16
+ interface BufferedStreamResult {
17
+ chunks: StreamChunk[];
18
+ text: string;
19
+ structured: StructuredStreamChunk[];
20
+ }
21
+ /**
22
+ * Derive convenient buffered fields from raw chunks.
23
+ * `text-delta` is preferred; `message` is fallback when no text deltas exist.
24
+ */
25
+ declare function summarizeStreamChunks(chunks: StreamChunk[]): Omit<BufferedStreamResult, "chunks">;
26
+ /**
27
+ * Collect a stream and return both raw chunks and buffered convenience fields.
28
+ */
29
+ declare function collectBufferedStream(stream: AsyncIterable<StreamChunk>): Promise<BufferedStreamResult>;
30
+
31
+ /**
32
+ * Collects a streamed chat response into an array.
33
+ * Useful for non-streaming HTTP responses or server actions.
34
+ */
35
+ declare function collectStream(stream: AsyncIterable<StreamChunk>): Promise<StreamChunk[]>;
36
+
5
37
  declare const STREAM_HEADERS: {
6
38
  "content-type": string;
7
39
  "cache-control": string;
@@ -14,4 +46,9 @@ declare const STREAM_HEADERS: {
14
46
  */
15
47
  declare function createStreamResponse(stream: AsyncIterable<StreamChunk>): Response;
16
48
 
17
- export { STREAM_HEADERS, StreamChunk, createStreamResponse };
49
+ /**
50
+ * Friendly alias for createStreamResponse.
51
+ */
52
+ declare function toSSE(stream: AsyncIterable<StreamChunk>): Response;
53
+
54
+ export { type BufferedStreamResult, STREAM_HEADERS, StreamChunk, type StructuredStreamChunk, collectBufferedStream, collectStream, createStreamResponse, summarizeStreamChunks, toSSE };
package/dist/index.js CHANGED
@@ -21,12 +21,48 @@ var index_exports = {};
21
21
  __export(index_exports, {
22
22
  STREAM_HEADERS: () => STREAM_HEADERS,
23
23
  StreamChunkSchema: () => StreamChunkSchema,
24
+ collectBufferedStream: () => collectBufferedStream,
25
+ collectStream: () => collectStream,
26
+ consumeStream: () => consumeStream,
24
27
  createStreamResponse: () => createStreamResponse,
25
28
  readStream: () => readStream,
26
- streamFromRoute: () => streamFromRoute
29
+ streamFromRoute: () => streamFromRoute,
30
+ summarizeStreamChunks: () => summarizeStreamChunks,
31
+ toSSE: () => toSSE
27
32
  });
28
33
  module.exports = __toCommonJS(index_exports);
29
34
 
35
+ // src/client/consume-stream.ts
36
+ var toError = (value) => value instanceof Error ? value : new Error(String(value));
37
+ async function consumeStream(stream, handlers = {}) {
38
+ let doneCalled = false;
39
+ const callDone = async () => {
40
+ if (doneCalled) return;
41
+ doneCalled = true;
42
+ await handlers.onDone?.();
43
+ };
44
+ try {
45
+ for await (const chunk of stream) {
46
+ const shouldContinue = await handlers.onChunk?.(chunk);
47
+ if (chunk.type === "error") {
48
+ await handlers.onError?.(
49
+ new Error(chunk.message || "Stream error."),
50
+ chunk
51
+ );
52
+ }
53
+ if (chunk.type === "done" || shouldContinue === false) {
54
+ await callDone();
55
+ return;
56
+ }
57
+ }
58
+ await callDone();
59
+ } catch (error) {
60
+ const normalized = toError(error);
61
+ await handlers.onError?.(normalized);
62
+ throw normalized;
63
+ }
64
+ }
65
+
30
66
  // src/client/read-stream.ts
31
67
  async function* readStream(body) {
32
68
  if (!body) return;
@@ -96,6 +132,48 @@ async function* streamFromRoute(args) {
96
132
  yield* readStream(response.body);
97
133
  }
98
134
 
135
+ // src/server/collect-stream.ts
136
+ async function collectStream(stream) {
137
+ const chunks = [];
138
+ for await (const chunk of stream) {
139
+ chunks.push(chunk);
140
+ }
141
+ return chunks;
142
+ }
143
+
144
+ // src/server/collect-buffered-stream.ts
145
+ function summarizeStreamChunks(chunks) {
146
+ let sawTextDelta = false;
147
+ let text = "";
148
+ const messageFallback = [];
149
+ const structured = [];
150
+ for (const chunk of chunks) {
151
+ if (chunk.type === "text-delta") {
152
+ sawTextDelta = true;
153
+ text += chunk.delta;
154
+ continue;
155
+ }
156
+ if (chunk.type === "message") {
157
+ messageFallback.push(chunk.content ?? "");
158
+ continue;
159
+ }
160
+ if (chunk.type === "structured-data") {
161
+ structured.push(chunk);
162
+ }
163
+ }
164
+ if (!sawTextDelta && messageFallback.length > 0) {
165
+ text = messageFallback.join("");
166
+ }
167
+ return { text, structured };
168
+ }
169
+ async function collectBufferedStream(stream) {
170
+ const chunks = await collectStream(stream);
171
+ return {
172
+ chunks,
173
+ ...summarizeStreamChunks(chunks)
174
+ };
175
+ }
176
+
99
177
  // src/server/create-stream-response.ts
100
178
  var STREAM_HEADERS = {
101
179
  "content-type": "text/event-stream",
@@ -140,6 +218,11 @@ function createStreamResponse(stream) {
140
218
  );
141
219
  }
142
220
 
221
+ // src/server/to-sse.ts
222
+ function toSSE(stream) {
223
+ return createStreamResponse(stream);
224
+ }
225
+
143
226
  // src/types/stream-chunk.ts
144
227
  var import_zod3 = require("zod");
145
228
 
@@ -284,8 +367,13 @@ var StreamChunkSchema = import_zod3.z.union([
284
367
  0 && (module.exports = {
285
368
  STREAM_HEADERS,
286
369
  StreamChunkSchema,
370
+ collectBufferedStream,
371
+ collectStream,
372
+ consumeStream,
287
373
  createStreamResponse,
288
374
  readStream,
289
- streamFromRoute
375
+ streamFromRoute,
376
+ summarizeStreamChunks,
377
+ toSSE
290
378
  });
291
379
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/client/read-stream.ts","../src/client/stream-from-route.ts","../src/server/create-stream-response.ts","../src/types/stream-chunk.ts","../src/types/structured-data/index.ts","../src/types/structured-data/jobs.ts"],"sourcesContent":["// release-test: 2026-01-22\n// packages/stream/src/index.ts\n\n// client\nexport * from \"./client/read-stream\";\nexport * from \"./client/stream-from-route\";\n\n// server\nexport * from \"./server/create-stream-response\";\nexport * from \"./types/stream-chunk\";\n","// packages/stream/src/client/read-stream.ts\nimport type { StreamChunk } from \"../types/stream-chunk\";\n\n/**\n * Reads a server-sent event (SSE) Response body and yields StreamChunk objects.\n */\nexport async function* readStream(\n body: ReadableStream<Uint8Array> | null,\n): AsyncGenerator<StreamChunk, void, void> {\n if (!body) return;\n\n const reader = body.getReader();\n const decoder = new TextDecoder(\"utf-8\");\n let buffer = \"\";\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const parts = buffer.split(\"\\n\\n\");\n buffer = parts.pop() ?? \"\";\n\n for (const part of parts) {\n if (!part.startsWith(\"data: \")) continue;\n const payload = part.slice(6);\n if (payload.trim() === \"[DONE]\") return;\n try {\n yield JSON.parse(payload) as StreamChunk;\n } catch (err: any) {\n console.warn(\"Invalid JSON in stream chunk:\", payload);\n console.error(err);\n }\n }\n }\n}\n","import type { StreamChunk } from \"../types/stream-chunk\";\nimport { readStream } from \"./read-stream\";\n\nexport interface StreamFromRouteArgs<TBody = unknown> {\n endpoint: string;\n body: TBody;\n method?: string | undefined;\n fetchImpl?: typeof fetch;\n headers?: Record<string, string> | undefined;\n}\n\nconst toErrorMessage = (error: unknown): string =>\n error instanceof Error ? error.message : String(error);\n\nconst readErrorMessage = async (response: Response): Promise<string> => {\n let message = `Request failed (${response.status})`;\n try {\n const payload = (await response.json()) as unknown;\n if (\n payload &&\n typeof payload === \"object\" &&\n \"error\" in payload &&\n typeof (payload as { error?: unknown }).error === \"string\"\n ) {\n message = (payload as { error: string }).error;\n }\n } catch {}\n return message;\n};\n\nexport async function* streamFromRoute<TBody = unknown>(\n args: StreamFromRouteArgs<TBody>,\n): AsyncGenerator<StreamChunk, void, void> {\n const fetchFn = args.fetchImpl ?? globalThis.fetch;\n if (!fetchFn) {\n yield { type: \"error\", message: \"No fetch implementation available.\" };\n yield { type: \"done\" };\n return;\n }\n\n let response: Response;\n try {\n response = await fetchFn(args.endpoint, {\n method: args.method ?? \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n ...(args.headers ?? {}),\n },\n body: JSON.stringify(args.body),\n });\n } catch (error) {\n yield { type: \"error\", message: toErrorMessage(error) };\n yield { type: \"done\" };\n return;\n }\n\n if (!response.ok) {\n yield { type: \"error\", message: await readErrorMessage(response) };\n yield { type: \"done\" };\n return;\n }\n\n yield* readStream(response.body);\n}\n","// packages/stream/src/server/create-stream-response.ts\nimport type { StreamChunk } from \"../types/stream-chunk\";\n\nexport const STREAM_HEADERS = {\n \"content-type\": \"text/event-stream\",\n \"cache-control\": \"no-cache\",\n connection: \"keep-alive\",\n \"x-accel-buffering\": \"no\",\n};\n\nclass JsonToSseTransformStream extends TransformStream<unknown, string> {\n constructor() {\n super({\n transform(part, controller) {\n controller.enqueue(`data: ${JSON.stringify(part)}\\n\\n`);\n },\n flush(controller) {\n controller.enqueue(\"data: [DONE]\\n\\n\");\n },\n });\n }\n}\n\n/**\n * Turns an AsyncIterable<StreamChunk> into a streamed HTTP Response.\n * Works in Node, Bun, Cloudflare, Edge, etc.\n */\nexport function createStreamResponse(\n stream: AsyncIterable<StreamChunk>,\n): Response {\n const readable = new ReadableStream<StreamChunk>({\n async start(controller) {\n try {\n for await (const chunk of stream) {\n controller.enqueue(chunk);\n }\n } catch (err: any) {\n controller.enqueue({\n type: \"error\",\n message: String(err?.message ?? err),\n } as StreamChunk);\n } finally {\n controller.close();\n }\n },\n });\n\n return new Response(\n readable\n .pipeThrough(new JsonToSseTransformStream())\n .pipeThrough(new TextEncoderStream()),\n { headers: STREAM_HEADERS },\n );\n}\n","import { z } from \"zod\";\nimport { StructuredDataChunkSchema } from \"./structured-data\";\n\nexport const StreamChunkSchema = z.union([\n z.object({\n type: z.literal(\"session\"),\n sessionId: z.string(),\n }),\n z.object({\n type: z.literal(\"status\"),\n message: z.string(),\n node: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"message\"),\n content: z.string(),\n node: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"text-start\"),\n node: z.string().optional(),\n id: z.string().optional(),\n opId: z.string().optional(),\n segmentId: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"text-delta\"),\n delta: z.string(),\n node: z.string().optional(),\n id: z.string().optional(),\n opId: z.string().optional(),\n segmentId: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"text-end\"),\n node: z.string().optional(),\n id: z.string().optional(),\n opId: z.string().optional(),\n segmentId: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"tool-result\"),\n tool: z.string().optional(),\n node: z.string().optional(),\n content: z.unknown(),\n }),\n // Interrupt request chunk (used to render interactive options in UI)\n z.object({\n type: z.literal(\"interrupt\"),\n requestId: z.string(),\n resumeToken: z.string(),\n workflow: z.string().optional(),\n node: z.string().optional(),\n id: z.string().optional(),\n opId: z.string().optional(),\n schemaId: z.string().optional(),\n schemaVersion: z.string().optional(),\n input: z.discriminatedUnion(\"kind\", [\n // Text input: question optional, no options\n z.object({\n kind: z.literal(\"text\"),\n multiple: z.boolean(),\n question: z.string().optional(),\n id: z.string().optional(),\n schemaId: z.string().optional(),\n schemaVersion: z.string().optional(),\n meta: z.record(z.unknown()).optional(),\n options: z.array(z.never()).optional(),\n }),\n // Choice/multi-choice: question + options required\n z.object({\n kind: z.enum([\"choice\", \"multi-choice\"]),\n multiple: z.boolean(),\n question: z.string(),\n id: z.string().optional(),\n schemaId: z.string().optional(),\n schemaVersion: z.string().optional(),\n meta: z.record(z.unknown()).optional(),\n options: z.array(\n z.object({\n id: z.string(),\n label: z.string(),\n description: z.string().optional(),\n }),\n ),\n }),\n ]),\n meta: z.record(z.unknown()).optional(),\n }),\n StructuredDataChunkSchema,\n z.object({\n type: z.literal(\"transition\"),\n transitionTo: z.string(),\n payload: z.any().optional(),\n }),\n z.object({ type: z.literal(\"done\"), data: z.any().optional() }),\n z.object({ type: z.literal(\"error\"), message: z.string() }),\n]);\n\nexport type StreamChunk = z.infer<typeof StreamChunkSchema>;\n","import { z } from \"zod\";\nimport { JobsStructuredData } from \"./jobs\";\n\nconst StructuredDataBase = z.object({\n type: z.literal(\"structured-data\"),\n dataType: z.string().optional(),\n mode: z.enum([\"final\", \"patch\", \"snapshot\"]).optional(),\n schemaId: z.string().optional(),\n schemaVersion: z.string().optional(),\n id: z.string().optional(),\n opId: z.string().optional(),\n node: z.string().optional(),\n});\n\nconst JobsStructuredDataChunkSchema = StructuredDataBase.extend({\n dataType: z.literal(\"jobs\"),\n data: JobsStructuredData,\n});\n\nconst GenericStructuredDataChunkSchema = StructuredDataBase.extend({\n data: z.unknown(),\n});\n\nexport const StructuredDataChunkSchema = z.union([\n JobsStructuredDataChunkSchema,\n GenericStructuredDataChunkSchema,\n]);\n\nexport type StructuredDataChunk = z.infer<typeof StructuredDataChunkSchema>;\n","import { z } from \"zod\";\n\nexport const JobsStructuredData = z.object({\n jobs: z.array(\n z.object({\n id: z.string(),\n title: z.string(),\n company: z.string(),\n location: z.string(),\n match: z.number(),\n }),\n ),\n reasoning: z.string().optional(),\n});\n\nexport type JobsStructuredData = z.infer<typeof JobsStructuredData>;\n"],"mappings":"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","names":["import_zod","import_zod"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/client/consume-stream.ts","../src/client/read-stream.ts","../src/client/stream-from-route.ts","../src/server/collect-stream.ts","../src/server/collect-buffered-stream.ts","../src/server/create-stream-response.ts","../src/server/to-sse.ts","../src/types/stream-chunk.ts","../src/types/structured-data/index.ts","../src/types/structured-data/jobs.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 \"./types/stream-chunk\";\n","import type { StreamChunk } from \"../types/stream-chunk\";\n\nexport interface ConsumeStreamHandlers {\n onChunk?: (\n chunk: StreamChunk,\n ) => void | boolean | Promise<boolean | undefined>;\n onDone?: () => void | Promise<void>;\n onError?: (error: Error, chunk?: StreamChunk) => void | Promise<void>;\n}\n\nconst toError = (value: unknown): Error =>\n value instanceof Error ? value : new Error(String(value));\n\n/**\n * Consume a stream of StreamChunk events with callback handlers.\n * Returns when a `done` chunk is seen, the stream ends, or `onChunk` returns `false`.\n */\nexport async function consumeStream(\n stream: AsyncIterable<StreamChunk>,\n handlers: ConsumeStreamHandlers = {},\n): Promise<void> {\n let doneCalled = false;\n\n const callDone = async () => {\n if (doneCalled) return;\n doneCalled = true;\n await handlers.onDone?.();\n };\n\n try {\n for await (const chunk of stream) {\n const shouldContinue = await handlers.onChunk?.(chunk);\n\n if (chunk.type === \"error\") {\n await handlers.onError?.(\n new Error(chunk.message || \"Stream error.\"),\n chunk,\n );\n }\n\n if (chunk.type === \"done\" || shouldContinue === false) {\n await callDone();\n return;\n }\n }\n\n await callDone();\n } catch (error) {\n const normalized = toError(error);\n await handlers.onError?.(normalized);\n throw normalized;\n }\n}\n","// packages/stream/src/client/read-stream.ts\nimport type { StreamChunk } from \"../types/stream-chunk\";\n\n/**\n * Reads a server-sent event (SSE) Response body and yields StreamChunk objects.\n */\nexport async function* readStream(\n body: ReadableStream<Uint8Array> | null,\n): AsyncGenerator<StreamChunk, void, void> {\n if (!body) return;\n\n const reader = body.getReader();\n const decoder = new TextDecoder(\"utf-8\");\n let buffer = \"\";\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const parts = buffer.split(\"\\n\\n\");\n buffer = parts.pop() ?? \"\";\n\n for (const part of parts) {\n if (!part.startsWith(\"data: \")) continue;\n const payload = part.slice(6);\n if (payload.trim() === \"[DONE]\") return;\n try {\n yield JSON.parse(payload) as StreamChunk;\n } catch (err: any) {\n console.warn(\"Invalid JSON in stream chunk:\", payload);\n console.error(err);\n }\n }\n }\n}\n","import type { StreamChunk } from \"../types/stream-chunk\";\nimport { readStream } from \"./read-stream\";\n\nexport interface StreamFromRouteArgs<TBody = unknown> {\n endpoint: string;\n body: TBody;\n method?: string | undefined;\n fetchImpl?: typeof fetch;\n headers?: Record<string, string> | undefined;\n}\n\nconst toErrorMessage = (error: unknown): string =>\n error instanceof Error ? error.message : String(error);\n\nconst readErrorMessage = async (response: Response): Promise<string> => {\n let message = `Request failed (${response.status})`;\n try {\n const payload = (await response.json()) as unknown;\n if (\n payload &&\n typeof payload === \"object\" &&\n \"error\" in payload &&\n typeof (payload as { error?: unknown }).error === \"string\"\n ) {\n message = (payload as { error: string }).error;\n }\n } catch {}\n return message;\n};\n\nexport async function* streamFromRoute<TBody = unknown>(\n args: StreamFromRouteArgs<TBody>,\n): AsyncGenerator<StreamChunk, void, void> {\n const fetchFn = args.fetchImpl ?? globalThis.fetch;\n if (!fetchFn) {\n yield { type: \"error\", message: \"No fetch implementation available.\" };\n yield { type: \"done\" };\n return;\n }\n\n let response: Response;\n try {\n response = await fetchFn(args.endpoint, {\n method: args.method ?? \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n ...(args.headers ?? {}),\n },\n body: JSON.stringify(args.body),\n });\n } catch (error) {\n yield { type: \"error\", message: toErrorMessage(error) };\n yield { type: \"done\" };\n return;\n }\n\n if (!response.ok) {\n yield { type: \"error\", message: await readErrorMessage(response) };\n yield { type: \"done\" };\n return;\n }\n\n yield* readStream(response.body);\n}\n","import type { StreamChunk } from \"../types/stream-chunk\";\n\n/**\n * Collects a streamed chat response into an array.\n * Useful for non-streaming HTTP responses or server actions.\n */\nexport async function collectStream(\n stream: AsyncIterable<StreamChunk>,\n): Promise<StreamChunk[]> {\n const chunks: StreamChunk[] = [];\n for await (const chunk of stream) {\n chunks.push(chunk);\n }\n return chunks;\n}\n","import type { StreamChunk } from \"../types/stream-chunk\";\nimport { collectStream } from \"./collect-stream\";\n\nexport type StructuredStreamChunk = {\n type: \"structured-data\";\n data: unknown;\n dataType?: string;\n mode?: \"final\" | \"patch\" | \"snapshot\";\n schemaId?: string;\n schemaVersion?: string;\n id?: string;\n opId?: string;\n node?: string;\n};\n\nexport interface BufferedStreamResult {\n chunks: StreamChunk[];\n text: string;\n structured: StructuredStreamChunk[];\n}\n\n/**\n * Derive convenient buffered fields from raw chunks.\n * `text-delta` is preferred; `message` is fallback when no text deltas exist.\n */\nexport function summarizeStreamChunks(\n chunks: StreamChunk[],\n): Omit<BufferedStreamResult, \"chunks\"> {\n let sawTextDelta = false;\n let text = \"\";\n const messageFallback: string[] = [];\n const structured: StructuredStreamChunk[] = [];\n\n for (const chunk of chunks) {\n if (chunk.type === \"text-delta\") {\n sawTextDelta = true;\n text += chunk.delta;\n continue;\n }\n\n if (chunk.type === \"message\") {\n messageFallback.push(chunk.content ?? \"\");\n continue;\n }\n\n if (chunk.type === \"structured-data\") {\n structured.push(chunk as StructuredStreamChunk);\n }\n }\n\n if (!sawTextDelta && messageFallback.length > 0) {\n text = messageFallback.join(\"\");\n }\n\n return { text, structured };\n}\n\n/**\n * Collect a stream and return both raw chunks and buffered convenience fields.\n */\nexport async function collectBufferedStream(\n stream: AsyncIterable<StreamChunk>,\n): Promise<BufferedStreamResult> {\n const chunks = await collectStream(stream);\n return {\n chunks,\n ...summarizeStreamChunks(chunks),\n };\n}\n","// packages/stream/src/server/create-stream-response.ts\nimport type { StreamChunk } from \"../types/stream-chunk\";\n\nexport const STREAM_HEADERS = {\n \"content-type\": \"text/event-stream\",\n \"cache-control\": \"no-cache\",\n connection: \"keep-alive\",\n \"x-accel-buffering\": \"no\",\n};\n\nclass JsonToSseTransformStream extends TransformStream<unknown, string> {\n constructor() {\n super({\n transform(part, controller) {\n controller.enqueue(`data: ${JSON.stringify(part)}\\n\\n`);\n },\n flush(controller) {\n controller.enqueue(\"data: [DONE]\\n\\n\");\n },\n });\n }\n}\n\n/**\n * Turns an AsyncIterable<StreamChunk> into a streamed HTTP Response.\n * Works in Node, Bun, Cloudflare, Edge, etc.\n */\nexport function createStreamResponse(\n stream: AsyncIterable<StreamChunk>,\n): Response {\n const readable = new ReadableStream<StreamChunk>({\n async start(controller) {\n try {\n for await (const chunk of stream) {\n controller.enqueue(chunk);\n }\n } catch (err: any) {\n controller.enqueue({\n type: \"error\",\n message: String(err?.message ?? err),\n } as StreamChunk);\n } finally {\n controller.close();\n }\n },\n });\n\n return new Response(\n readable\n .pipeThrough(new JsonToSseTransformStream())\n .pipeThrough(new TextEncoderStream()),\n { headers: STREAM_HEADERS },\n );\n}\n","import type { StreamChunk } from \"../types/stream-chunk\";\nimport { createStreamResponse } from \"./create-stream-response\";\n\n/**\n * Friendly alias for createStreamResponse.\n */\nexport function toSSE(stream: AsyncIterable<StreamChunk>): Response {\n return createStreamResponse(stream);\n}\n","import { z } from \"zod\";\nimport { StructuredDataChunkSchema } from \"./structured-data\";\n\nexport const StreamChunkSchema = z.union([\n z.object({\n type: z.literal(\"session\"),\n sessionId: z.string(),\n }),\n z.object({\n type: z.literal(\"status\"),\n message: z.string(),\n node: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"message\"),\n content: z.string(),\n node: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"text-start\"),\n node: z.string().optional(),\n id: z.string().optional(),\n opId: z.string().optional(),\n segmentId: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"text-delta\"),\n delta: z.string(),\n node: z.string().optional(),\n id: z.string().optional(),\n opId: z.string().optional(),\n segmentId: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"text-end\"),\n node: z.string().optional(),\n id: z.string().optional(),\n opId: z.string().optional(),\n segmentId: z.string().optional(),\n }),\n z.object({\n type: z.literal(\"tool-result\"),\n tool: z.string().optional(),\n node: z.string().optional(),\n content: z.unknown(),\n }),\n // Interrupt request chunk (used to render interactive options in UI)\n z.object({\n type: z.literal(\"interrupt\"),\n requestId: z.string(),\n resumeToken: z.string(),\n workflow: z.string().optional(),\n node: z.string().optional(),\n id: z.string().optional(),\n opId: z.string().optional(),\n schemaId: z.string().optional(),\n schemaVersion: z.string().optional(),\n input: z.discriminatedUnion(\"kind\", [\n // Text input: question optional, no options\n z.object({\n kind: z.literal(\"text\"),\n multiple: z.boolean(),\n question: z.string().optional(),\n id: z.string().optional(),\n schemaId: z.string().optional(),\n schemaVersion: z.string().optional(),\n meta: z.record(z.unknown()).optional(),\n options: z.array(z.never()).optional(),\n }),\n // Choice/multi-choice: question + options required\n z.object({\n kind: z.enum([\"choice\", \"multi-choice\"]),\n multiple: z.boolean(),\n question: z.string(),\n id: z.string().optional(),\n schemaId: z.string().optional(),\n schemaVersion: z.string().optional(),\n meta: z.record(z.unknown()).optional(),\n options: z.array(\n z.object({\n id: z.string(),\n label: z.string(),\n description: z.string().optional(),\n }),\n ),\n }),\n ]),\n meta: z.record(z.unknown()).optional(),\n }),\n StructuredDataChunkSchema,\n z.object({\n type: z.literal(\"transition\"),\n transitionTo: z.string(),\n payload: z.any().optional(),\n }),\n z.object({ type: z.literal(\"done\"), data: z.any().optional() }),\n z.object({ type: z.literal(\"error\"), message: z.string() }),\n]);\n\nexport type StreamChunk = z.infer<typeof StreamChunkSchema>;\n","import { z } from \"zod\";\nimport { JobsStructuredData } from \"./jobs\";\n\nconst StructuredDataBase = z.object({\n type: z.literal(\"structured-data\"),\n dataType: z.string().optional(),\n mode: z.enum([\"final\", \"patch\", \"snapshot\"]).optional(),\n schemaId: z.string().optional(),\n schemaVersion: z.string().optional(),\n id: z.string().optional(),\n opId: z.string().optional(),\n node: z.string().optional(),\n});\n\nconst JobsStructuredDataChunkSchema = StructuredDataBase.extend({\n dataType: z.literal(\"jobs\"),\n data: JobsStructuredData,\n});\n\nconst GenericStructuredDataChunkSchema = StructuredDataBase.extend({\n data: z.unknown(),\n});\n\nexport const StructuredDataChunkSchema = z.union([\n JobsStructuredDataChunkSchema,\n GenericStructuredDataChunkSchema,\n]);\n\nexport type StructuredDataChunk = z.infer<typeof StructuredDataChunkSchema>;\n","import { z } from \"zod\";\n\nexport const JobsStructuredData = z.object({\n jobs: z.array(\n z.object({\n id: z.string(),\n title: z.string(),\n company: z.string(),\n location: z.string(),\n match: z.number(),\n }),\n ),\n reasoning: z.string().optional(),\n});\n\nexport type JobsStructuredData = z.infer<typeof JobsStructuredData>;\n"],"mappings":"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","names":["import_zod","import_zod"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kortyx/stream",
3
- "version": "0.4.1",
3
+ "version": "0.5.1",
4
4
  "private": false,
5
5
  "description": "Streaming primitives for Kortyx.",
6
6
  "keywords": [