assistant-stream 0.3.26 → 0.3.28
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/dist/core/AssistantStream.d.ts.map +1 -1
- package/dist/core/AssistantStreamChunk.d.ts +3 -3
- package/dist/core/accumulators/AssistantMessageStream.d.ts.map +1 -1
- package/dist/core/accumulators/AssistantMessageStream.js +0 -1
- package/dist/core/accumulators/AssistantMessageStream.js.map +1 -1
- package/dist/core/accumulators/assistant-message-accumulator.d.ts.map +1 -1
- package/dist/core/accumulators/assistant-message-accumulator.js +65 -28
- package/dist/core/accumulators/assistant-message-accumulator.js.map +1 -1
- package/dist/core/converters/toGenericMessages.js.map +1 -1
- package/dist/core/gorp/GorpStreamAccumulator.d.ts +15 -0
- package/dist/core/gorp/GorpStreamAccumulator.d.ts.map +1 -0
- package/dist/core/{object/ObjectStreamAccumulator.js → gorp/GorpStreamAccumulator.js} +11 -9
- package/dist/core/gorp/GorpStreamAccumulator.js.map +1 -0
- package/dist/core/gorp/GorpStreamDeltaTracker.d.ts +17 -0
- package/dist/core/gorp/GorpStreamDeltaTracker.d.ts.map +1 -0
- package/dist/core/gorp/GorpStreamDeltaTracker.js +38 -0
- package/dist/core/gorp/GorpStreamDeltaTracker.js.map +1 -0
- package/dist/core/gorp/GorpStreamResponse.d.ts +16 -0
- package/dist/core/gorp/GorpStreamResponse.d.ts.map +1 -0
- package/dist/core/gorp/GorpStreamResponse.js +51 -0
- package/dist/core/gorp/GorpStreamResponse.js.map +1 -0
- package/dist/core/gorp/changeTree.d.ts +16 -0
- package/dist/core/gorp/changeTree.d.ts.map +1 -0
- package/dist/core/gorp/changeTree.js +77 -0
- package/dist/core/gorp/changeTree.js.map +1 -0
- package/dist/core/gorp/createGorpStream.d.ts +16 -0
- package/dist/core/gorp/createGorpStream.d.ts.map +1 -0
- package/dist/core/{object/createObjectStream.js → gorp/createGorpStream.js} +13 -8
- package/dist/core/gorp/createGorpStream.js.map +1 -0
- package/dist/core/{object → gorp}/types.d.ts +6 -5
- package/dist/core/gorp/types.d.ts.map +1 -0
- package/dist/core/modules/assistant-stream.d.ts +5 -4
- package/dist/core/modules/assistant-stream.d.ts.map +1 -1
- package/dist/core/modules/assistant-stream.js +10 -6
- package/dist/core/modules/assistant-stream.js.map +1 -1
- package/dist/core/modules/tool-call.d.ts.map +1 -1
- package/dist/core/modules/tool-call.js +3 -3
- package/dist/core/modules/tool-call.js.map +1 -1
- package/dist/core/serialization/assistant-transport/AssistantTransport.d.ts.map +1 -1
- package/dist/core/serialization/assistant-transport/AssistantTransport.js +91 -1
- package/dist/core/serialization/assistant-transport/AssistantTransport.js.map +1 -1
- package/dist/core/serialization/data-stream/DataStream.js +48 -48
- package/dist/core/serialization/data-stream/DataStream.js.map +1 -1
- package/dist/core/serialization/data-stream/chunk-types.d.ts +25 -24
- package/dist/core/serialization/data-stream/chunk-types.d.ts.map +1 -1
- package/dist/core/serialization/data-stream/chunk-types.js +22 -23
- package/dist/core/serialization/data-stream/chunk-types.js.map +1 -1
- package/dist/core/serialization/data-stream/serialization.d.ts.map +1 -1
- package/dist/core/serialization/data-stream/serialization.js +14 -2
- package/dist/core/serialization/data-stream/serialization.js.map +1 -1
- package/dist/core/serialization/ui-message-stream/UIMessageStream.d.ts.map +1 -1
- package/dist/core/serialization/ui-message-stream/UIMessageStream.js +12 -1
- package/dist/core/serialization/ui-message-stream/UIMessageStream.js.map +1 -1
- package/dist/core/tool/ToolCallReader.d.ts.map +1 -1
- package/dist/core/tool/ToolCallReader.js.map +1 -1
- package/dist/core/tool/ToolExecutionStream.d.ts.map +1 -1
- package/dist/core/tool/ToolExecutionStream.js +9 -1
- package/dist/core/tool/ToolExecutionStream.js.map +1 -1
- package/dist/core/tool/ToolResponse.d.ts.map +1 -1
- package/dist/core/tool/tool-types.d.ts +6 -0
- package/dist/core/tool/tool-types.d.ts.map +1 -1
- package/dist/core/tool/toolResultStream.d.ts.map +1 -1
- package/dist/core/tool/toolResultStream.js +7 -2
- package/dist/core/tool/toolResultStream.js.map +1 -1
- package/dist/core/utils/stream/AssistantTransformStream.d.ts.map +1 -1
- package/dist/core/utils/stream/PipeableTransformStream.d.ts.map +1 -1
- package/dist/core/utils/stream/SSE.d.ts.map +1 -1
- package/dist/core/utils/stream/SSE.js +11 -2
- package/dist/core/utils/stream/SSE.js.map +1 -1
- package/dist/core/utils/stream/SSEEventDecoder.d.ts.map +1 -1
- package/dist/core/utils/stream/merge.d.ts +2 -0
- package/dist/core/utils/stream/merge.d.ts.map +1 -1
- package/dist/core/utils/stream/merge.js +27 -8
- package/dist/core/utils/stream/merge.js.map +1 -1
- package/dist/core/utils/stream/path-utils.d.ts.map +1 -1
- package/dist/index.d.ts +25 -4
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -3
- package/dist/index.js.map +1 -0
- package/dist/resumable/ResumableStreamContext.d.ts.map +1 -1
- package/dist/resumable/ResumableStreamContext.js +12 -5
- package/dist/resumable/ResumableStreamContext.js.map +1 -1
- package/dist/resumable/errors.d.ts.map +1 -1
- package/dist/resumable/stores/redis-impl.d.ts.map +1 -1
- package/dist/utils/AsyncIterableStream.d.ts.map +1 -1
- package/dist/utils/AsyncIterableStream.js +18 -3
- package/dist/utils/AsyncIterableStream.js.map +1 -1
- package/dist/utils/promiseWithResolvers.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/core/AssistantStreamChunk.ts +3 -3
- package/src/core/accumulators/AssistantMessageStream.ts +3 -1
- package/src/core/accumulators/assistant-message-accumulator.test.ts +374 -1
- package/src/core/accumulators/assistant-message-accumulator.ts +75 -26
- package/src/core/converters/toGenericMessages.test.ts +3 -39
- package/src/core/{object/ObjectStream.test.ts → gorp/GorpStream.test.ts} +86 -25
- package/src/core/gorp/GorpStreamAccumulator.test.ts +28 -0
- package/src/core/{object/ObjectStreamAccumulator.ts → gorp/GorpStreamAccumulator.ts} +13 -15
- package/src/core/gorp/GorpStreamDeltaTracker.test.ts +212 -0
- package/src/core/gorp/GorpStreamDeltaTracker.ts +55 -0
- package/src/core/{object/ObjectStreamResponse.test.ts → gorp/GorpStreamResponse.test.ts} +6 -6
- package/src/core/gorp/GorpStreamResponse.ts +88 -0
- package/src/core/gorp/changeTree.ts +96 -0
- package/src/core/{object/createObjectStream.ts → gorp/createGorpStream.ts} +23 -17
- package/src/core/{object → gorp}/types.ts +5 -3
- package/src/core/modules/assistant-stream.test.ts +154 -2
- package/src/core/modules/assistant-stream.ts +16 -6
- package/src/core/modules/tool-call.test.ts +67 -0
- package/src/core/modules/tool-call.ts +7 -4
- package/src/core/serialization/assistant-transport/AssistantTransport.test.ts +174 -1
- package/src/core/serialization/assistant-transport/AssistantTransport.ts +77 -1
- package/src/core/serialization/data-stream/DataStream.ts +1 -1
- package/src/core/serialization/data-stream/chunk-types.ts +26 -24
- package/src/core/serialization/data-stream/serialization.test.ts +133 -0
- package/src/core/serialization/data-stream/serialization.ts +20 -2
- package/src/core/serialization/ui-message-stream/UIMessageStream.test.ts +135 -0
- package/src/core/serialization/ui-message-stream/UIMessageStream.ts +21 -1
- package/src/core/tool/ToolCallReader.ts +5 -1
- package/src/core/tool/ToolExecutionStream.ts +10 -0
- package/src/core/tool/tool-types.ts +7 -0
- package/src/core/tool/toolResultStream.test.ts +50 -0
- package/src/core/tool/toolResultStream.ts +7 -2
- package/src/core/utils/stream/SSE.test.ts +97 -0
- package/src/core/utils/stream/SSE.ts +13 -2
- package/src/core/utils/stream/merge.ts +31 -9
- package/src/gorp.test.ts +32 -0
- package/src/index.ts +21 -6
- package/src/resumable/ResumableStreamContext.test.ts +116 -1
- package/src/resumable/ResumableStreamContext.ts +32 -5
- package/src/resumable/createResumableAssistantStreamResponse.test.ts +1 -25
- package/src/utils/AsyncIterableStream.test.ts +61 -0
- package/src/utils/AsyncIterableStream.ts +18 -3
- package/dist/core/object/ObjectStreamAccumulator.d.ts +0 -15
- package/dist/core/object/ObjectStreamAccumulator.d.ts.map +0 -1
- package/dist/core/object/ObjectStreamAccumulator.js.map +0 -1
- package/dist/core/object/ObjectStreamResponse.d.ts +0 -16
- package/dist/core/object/ObjectStreamResponse.d.ts.map +0 -1
- package/dist/core/object/ObjectStreamResponse.js +0 -57
- package/dist/core/object/ObjectStreamResponse.js.map +0 -1
- package/dist/core/object/createObjectStream.d.ts +0 -16
- package/dist/core/object/createObjectStream.d.ts.map +0 -1
- package/dist/core/object/createObjectStream.js.map +0 -1
- package/dist/core/object/types.d.ts.map +0 -1
- package/src/core/accumulators/TimingTracker.test.ts +0 -100
- package/src/core/object/ObjectStreamResponse.ts +0 -114
- /package/dist/core/{object → gorp}/types.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssistantTransport.js","names":[],"sources":["../../../../src/core/serialization/assistant-transport/AssistantTransport.ts"],"sourcesContent":["import type { AssistantStreamChunk } from \"../../AssistantStreamChunk\";\nimport { PipeableTransformStream } from \"../../utils/stream/PipeableTransformStream\";\nimport {\n SSEEventDecoderStream,\n type PipelineSSEEvent,\n} from \"../../utils/stream/SSEEventDecoderStream\";\nimport type { AssistantStreamEncoder } from \"../../AssistantStream\";\n\n/**\n * AssistantTransportEncoder encodes AssistantStreamChunks into SSE format\n * and emits [DONE] when the stream completes.\n */\nexport class AssistantTransportEncoder\n extends PipeableTransformStream<AssistantStreamChunk, Uint8Array<ArrayBuffer>>\n implements AssistantStreamEncoder\n{\n headers = new Headers({\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n });\n\n constructor() {\n super((readable) => {\n return readable\n .pipeThrough(\n new TransformStream<AssistantStreamChunk, string>({\n transform(chunk, controller) {\n controller.enqueue(`data: ${JSON.stringify(chunk)}\\n\\n`);\n },\n flush(controller) {\n controller.enqueue(\"data: [DONE]\\n\\n\");\n },\n }),\n )\n .pipeThrough(new TextEncoderStream());\n });\n }\n}\n\n/**\n * AssistantTransportDecoder decodes SSE format into AssistantStreamChunks.\n * It stops decoding when it encounters [DONE].\n */\nexport class AssistantTransportDecoder extends PipeableTransformStream<\n Uint8Array<ArrayBuffer>,\n AssistantStreamChunk\n> {\n constructor() {\n super((readable) => {\n let receivedDone = false;\n\n return readable\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(new SSEEventDecoderStream())\n .pipeThrough(\n new TransformStream<PipelineSSEEvent, AssistantStreamChunk>({\n transform(event, controller) {\n switch (event.event) {\n case \"message\":\n if (event.data === \"[DONE]\") {\n // Mark that we received [DONE]\n receivedDone = true;\n // Stop processing when we encounter [DONE]\n controller.terminate();\n } else {\n
|
|
1
|
+
{"version":3,"file":"AssistantTransport.js","names":[],"sources":["../../../../src/core/serialization/assistant-transport/AssistantTransport.ts"],"sourcesContent":["import sjson from \"secure-json-parse\";\nimport type { AssistantStreamChunk } from \"../../AssistantStreamChunk\";\nimport { PipeableTransformStream } from \"../../utils/stream/PipeableTransformStream\";\nimport {\n SSEEventDecoderStream,\n type PipelineSSEEvent,\n} from \"../../utils/stream/SSEEventDecoderStream\";\nimport type { AssistantStreamEncoder } from \"../../AssistantStream\";\n\ntype ChunkFields = Record<string, unknown>;\n\ntype ChunkRule = {\n kind: \"message\" | \"part-addressed\";\n valid: (chunk: ChunkFields) => boolean;\n};\n\nconst noFields = () => true;\nconst requiredObject = (key: string) => (c: ChunkFields) => {\n const value = c[key];\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n};\nconst requiredString = (key: string) => (c: ChunkFields) =>\n typeof c[key] === \"string\";\nconst requiredArray = (key: string) => (c: ChunkFields) =>\n Array.isArray(c[key]);\nconst optionalBoolean = (key: string) => (c: ChunkFields) =>\n c[key] === undefined || typeof c[key] === \"boolean\";\n\nconst KNOWN_CHUNK_TYPES: Record<AssistantStreamChunk[\"type\"], ChunkRule> = {\n \"part-start\": { kind: \"message\", valid: requiredObject(\"part\") },\n \"part-finish\": { kind: \"part-addressed\", valid: noFields },\n \"tool-call-args-text-finish\": { kind: \"part-addressed\", valid: noFields },\n \"text-delta\": { kind: \"part-addressed\", valid: requiredString(\"textDelta\") },\n annotations: { kind: \"message\", valid: requiredArray(\"annotations\") },\n data: { kind: \"message\", valid: requiredArray(\"data\") },\n \"step-start\": { kind: \"message\", valid: noFields },\n \"step-finish\": { kind: \"message\", valid: requiredString(\"finishReason\") },\n \"message-finish\": { kind: \"message\", valid: requiredString(\"finishReason\") },\n result: { kind: \"part-addressed\", valid: optionalBoolean(\"isError\") },\n error: { kind: \"message\", valid: noFields },\n \"update-state\": { kind: \"message\", valid: requiredArray(\"operations\") },\n};\n\nconst parseChunk = (data: string): AssistantStreamChunk | string => {\n let value: unknown;\n try {\n value = sjson.parse(data);\n } catch {\n return \"unparseable\";\n }\n if (typeof value !== \"object\" || value === null || Array.isArray(value))\n return \"not-an-object\";\n const { type, path } = value as { type?: unknown; path?: unknown };\n if (\n typeof type !== \"string\" ||\n !Object.prototype.hasOwnProperty.call(KNOWN_CHUNK_TYPES, type)\n )\n return \"unknown-type\";\n const rule = KNOWN_CHUNK_TYPES[type as AssistantStreamChunk[\"type\"]];\n if (!rule.valid(value as Record<string, unknown>))\n return `invalid-fields:${type}`;\n if (path === undefined) {\n if (rule.kind !== \"message\") return `missing-path:${type}`;\n return { ...value, path: [] } as unknown as AssistantStreamChunk;\n }\n if (\n !Array.isArray(path) ||\n !path.every((entry) => Number.isInteger(entry) && entry >= 0)\n )\n return \"invalid-path\";\n return value as AssistantStreamChunk;\n};\n\n/**\n * AssistantTransportEncoder encodes AssistantStreamChunks into SSE format\n * and emits [DONE] when the stream completes.\n */\nexport class AssistantTransportEncoder\n extends PipeableTransformStream<AssistantStreamChunk, Uint8Array<ArrayBuffer>>\n implements AssistantStreamEncoder\n{\n headers = new Headers({\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n });\n\n constructor() {\n super((readable) => {\n return readable\n .pipeThrough(\n new TransformStream<AssistantStreamChunk, string>({\n transform(chunk, controller) {\n controller.enqueue(`data: ${JSON.stringify(chunk)}\\n\\n`);\n },\n flush(controller) {\n controller.enqueue(\"data: [DONE]\\n\\n\");\n },\n }),\n )\n .pipeThrough(new TextEncoderStream());\n });\n }\n}\n\n/**\n * AssistantTransportDecoder decodes SSE format into AssistantStreamChunks.\n * It stops decoding when it encounters [DONE].\n */\nexport class AssistantTransportDecoder extends PipeableTransformStream<\n Uint8Array<ArrayBuffer>,\n AssistantStreamChunk\n> {\n constructor() {\n super((readable) => {\n let receivedDone = false;\n const warnedReasons = new Set<string>();\n\n return readable\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(new SSEEventDecoderStream())\n .pipeThrough(\n new TransformStream<PipelineSSEEvent, AssistantStreamChunk>({\n transform(event, controller) {\n switch (event.event) {\n case \"message\":\n if (event.data === \"[DONE]\") {\n // Mark that we received [DONE]\n receivedDone = true;\n // Stop processing when we encounter [DONE]\n controller.terminate();\n } else {\n const chunk = parseChunk(event.data);\n if (typeof chunk === \"string\") {\n if (!warnedReasons.has(chunk)) {\n warnedReasons.add(chunk);\n console.warn(\n `Dropped invalid assistant-transport chunk (${chunk}): ${event.data.slice(0, 200)}`,\n );\n }\n } else {\n controller.enqueue(chunk);\n }\n }\n break;\n default:\n throw new Error(`Unknown SSE event type: ${event.event}`);\n }\n },\n flush() {\n if (!receivedDone) {\n throw new Error(\n \"Stream ended abruptly without receiving [DONE] marker\",\n );\n }\n },\n }),\n );\n });\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { AssistantTransformStream } from "../../utils/stream/AssistantTransformStream.js";
|
|
2
2
|
import { PipeableTransformStream } from "../../utils/stream/PipeableTransformStream.js";
|
|
3
|
-
import "./chunk-types.js";
|
|
3
|
+
import { DataStreamStreamChunkType } from "./chunk-types.js";
|
|
4
4
|
import { LineDecoderStream } from "../../utils/stream/LineDecoderStream.js";
|
|
5
5
|
import { DataStreamChunkDecoder, DataStreamChunkEncoder } from "./serialization.js";
|
|
6
6
|
import { AssistantMetaTransformStream } from "../../utils/stream/AssistantMetaTransformStream.js";
|
|
@@ -20,21 +20,21 @@ var DataStreamEncoder = class extends PipeableTransformStream {
|
|
|
20
20
|
if (part.type === "tool-call") {
|
|
21
21
|
const { type, ...value } = part;
|
|
22
22
|
controller.enqueue({
|
|
23
|
-
type:
|
|
23
|
+
type: DataStreamStreamChunkType.StartToolCall,
|
|
24
24
|
value
|
|
25
25
|
});
|
|
26
26
|
}
|
|
27
27
|
if (part.type === "source") {
|
|
28
28
|
const { type, ...value } = part;
|
|
29
29
|
controller.enqueue({
|
|
30
|
-
type:
|
|
30
|
+
type: DataStreamStreamChunkType.Source,
|
|
31
31
|
value
|
|
32
32
|
});
|
|
33
33
|
}
|
|
34
34
|
if (part.type === "data") {
|
|
35
35
|
const { type, ...value } = part;
|
|
36
36
|
controller.enqueue({
|
|
37
|
-
type:
|
|
37
|
+
type: DataStreamStreamChunkType.AuiDataPart,
|
|
38
38
|
value
|
|
39
39
|
});
|
|
40
40
|
}
|
|
@@ -45,33 +45,33 @@ var DataStreamEncoder = class extends PipeableTransformStream {
|
|
|
45
45
|
switch (part.type) {
|
|
46
46
|
case "text":
|
|
47
47
|
if (part.parentId) controller.enqueue({
|
|
48
|
-
type:
|
|
48
|
+
type: DataStreamStreamChunkType.AuiTextDelta,
|
|
49
49
|
value: {
|
|
50
50
|
textDelta: chunk.textDelta,
|
|
51
51
|
parentId: part.parentId
|
|
52
52
|
}
|
|
53
53
|
});
|
|
54
54
|
else controller.enqueue({
|
|
55
|
-
type:
|
|
55
|
+
type: DataStreamStreamChunkType.TextDelta,
|
|
56
56
|
value: chunk.textDelta
|
|
57
57
|
});
|
|
58
58
|
break;
|
|
59
59
|
case "reasoning":
|
|
60
60
|
if (part.parentId) controller.enqueue({
|
|
61
|
-
type:
|
|
61
|
+
type: DataStreamStreamChunkType.AuiReasoningDelta,
|
|
62
62
|
value: {
|
|
63
63
|
reasoningDelta: chunk.textDelta,
|
|
64
64
|
parentId: part.parentId
|
|
65
65
|
}
|
|
66
66
|
});
|
|
67
67
|
else controller.enqueue({
|
|
68
|
-
type:
|
|
68
|
+
type: DataStreamStreamChunkType.ReasoningDelta,
|
|
69
69
|
value: chunk.textDelta
|
|
70
70
|
});
|
|
71
71
|
break;
|
|
72
72
|
case "tool-call":
|
|
73
73
|
controller.enqueue({
|
|
74
|
-
type:
|
|
74
|
+
type: DataStreamStreamChunkType.ToolCallArgsTextDelta,
|
|
75
75
|
value: {
|
|
76
76
|
toolCallId: part.toolCallId,
|
|
77
77
|
argsTextDelta: chunk.textDelta
|
|
@@ -86,7 +86,7 @@ var DataStreamEncoder = class extends PipeableTransformStream {
|
|
|
86
86
|
const part = chunk.meta;
|
|
87
87
|
if (part.type !== "tool-call") throw new Error(`Result chunk on non-tool-call part not supported: ${part.type}`);
|
|
88
88
|
controller.enqueue({
|
|
89
|
-
type:
|
|
89
|
+
type: DataStreamStreamChunkType.ToolCallResult,
|
|
90
90
|
value: {
|
|
91
91
|
toolCallId: part.toolCallId,
|
|
92
92
|
result: chunk.result,
|
|
@@ -99,7 +99,7 @@ var DataStreamEncoder = class extends PipeableTransformStream {
|
|
|
99
99
|
case "step-start": {
|
|
100
100
|
const { type, ...value } = chunk;
|
|
101
101
|
controller.enqueue({
|
|
102
|
-
type:
|
|
102
|
+
type: DataStreamStreamChunkType.StartStep,
|
|
103
103
|
value
|
|
104
104
|
});
|
|
105
105
|
break;
|
|
@@ -107,7 +107,7 @@ var DataStreamEncoder = class extends PipeableTransformStream {
|
|
|
107
107
|
case "step-finish": {
|
|
108
108
|
const { type, ...value } = chunk;
|
|
109
109
|
controller.enqueue({
|
|
110
|
-
type:
|
|
110
|
+
type: DataStreamStreamChunkType.FinishStep,
|
|
111
111
|
value
|
|
112
112
|
});
|
|
113
113
|
break;
|
|
@@ -115,32 +115,32 @@ var DataStreamEncoder = class extends PipeableTransformStream {
|
|
|
115
115
|
case "message-finish": {
|
|
116
116
|
const { type, ...value } = chunk;
|
|
117
117
|
controller.enqueue({
|
|
118
|
-
type:
|
|
118
|
+
type: DataStreamStreamChunkType.FinishMessage,
|
|
119
119
|
value
|
|
120
120
|
});
|
|
121
121
|
break;
|
|
122
122
|
}
|
|
123
123
|
case "error":
|
|
124
124
|
controller.enqueue({
|
|
125
|
-
type:
|
|
125
|
+
type: DataStreamStreamChunkType.Error,
|
|
126
126
|
value: chunk.error
|
|
127
127
|
});
|
|
128
128
|
break;
|
|
129
129
|
case "annotations":
|
|
130
130
|
controller.enqueue({
|
|
131
|
-
type:
|
|
131
|
+
type: DataStreamStreamChunkType.Annotation,
|
|
132
132
|
value: chunk.annotations
|
|
133
133
|
});
|
|
134
134
|
break;
|
|
135
135
|
case "data":
|
|
136
136
|
controller.enqueue({
|
|
137
|
-
type:
|
|
137
|
+
type: DataStreamStreamChunkType.Data,
|
|
138
138
|
value: chunk.data
|
|
139
139
|
});
|
|
140
140
|
break;
|
|
141
141
|
case "update-state":
|
|
142
142
|
controller.enqueue({
|
|
143
|
-
type:
|
|
143
|
+
type: DataStreamStreamChunkType.AuiUpdateStateOperations,
|
|
144
144
|
value: chunk.operations
|
|
145
145
|
});
|
|
146
146
|
break;
|
|
@@ -154,17 +154,17 @@ var DataStreamEncoder = class extends PipeableTransformStream {
|
|
|
154
154
|
}
|
|
155
155
|
};
|
|
156
156
|
const TOOL_CALL_ARGS_CLOSING_CHUNKS = [
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
157
|
+
DataStreamStreamChunkType.StartToolCall,
|
|
158
|
+
DataStreamStreamChunkType.ToolCall,
|
|
159
|
+
DataStreamStreamChunkType.TextDelta,
|
|
160
|
+
DataStreamStreamChunkType.ReasoningDelta,
|
|
161
|
+
DataStreamStreamChunkType.Source,
|
|
162
|
+
DataStreamStreamChunkType.Error,
|
|
163
|
+
DataStreamStreamChunkType.FinishStep,
|
|
164
|
+
DataStreamStreamChunkType.FinishMessage,
|
|
165
|
+
DataStreamStreamChunkType.AuiTextDelta,
|
|
166
|
+
DataStreamStreamChunkType.AuiReasoningDelta,
|
|
167
|
+
DataStreamStreamChunkType.AuiDataPart
|
|
168
168
|
];
|
|
169
169
|
var DataStreamDecoder = class extends PipeableTransformStream {
|
|
170
170
|
constructor() {
|
|
@@ -179,19 +179,19 @@ var DataStreamDecoder = class extends PipeableTransformStream {
|
|
|
179
179
|
activeToolCallArgsText = void 0;
|
|
180
180
|
}
|
|
181
181
|
switch (type) {
|
|
182
|
-
case
|
|
182
|
+
case DataStreamStreamChunkType.ReasoningDelta:
|
|
183
183
|
controller.appendReasoning(value);
|
|
184
184
|
break;
|
|
185
|
-
case
|
|
185
|
+
case DataStreamStreamChunkType.TextDelta:
|
|
186
186
|
controller.appendText(value);
|
|
187
187
|
break;
|
|
188
|
-
case
|
|
188
|
+
case DataStreamStreamChunkType.AuiTextDelta:
|
|
189
189
|
controller.withParentId(value.parentId).appendText(value.textDelta);
|
|
190
190
|
break;
|
|
191
|
-
case
|
|
191
|
+
case DataStreamStreamChunkType.AuiReasoningDelta:
|
|
192
192
|
controller.withParentId(value.parentId).appendReasoning(value.reasoningDelta);
|
|
193
193
|
break;
|
|
194
|
-
case
|
|
194
|
+
case DataStreamStreamChunkType.StartToolCall: {
|
|
195
195
|
const { toolCallId, toolName, parentId } = value;
|
|
196
196
|
const ctrl = parentId ? controller.withParentId(parentId) : controller;
|
|
197
197
|
if (toolCallControllers.has(toolCallId)) throw new Error(`Encountered duplicate tool call id: ${toolCallId}`);
|
|
@@ -203,14 +203,14 @@ var DataStreamDecoder = class extends PipeableTransformStream {
|
|
|
203
203
|
activeToolCallArgsText = toolCallController.argsText;
|
|
204
204
|
break;
|
|
205
205
|
}
|
|
206
|
-
case
|
|
206
|
+
case DataStreamStreamChunkType.ToolCallArgsTextDelta: {
|
|
207
207
|
const { toolCallId, argsTextDelta } = value;
|
|
208
208
|
const toolCallController = toolCallControllers.get(toolCallId);
|
|
209
209
|
if (!toolCallController) throw new Error(`Encountered tool call with unknown id: ${toolCallId}`);
|
|
210
210
|
toolCallController.argsText.append(argsTextDelta);
|
|
211
211
|
break;
|
|
212
212
|
}
|
|
213
|
-
case
|
|
213
|
+
case DataStreamStreamChunkType.ToolCallResult: {
|
|
214
214
|
const { toolCallId, artifact, result, isError } = value;
|
|
215
215
|
const toolCallController = toolCallControllers.get(toolCallId);
|
|
216
216
|
if (!toolCallController) throw new Error(`Encountered tool call result with unknown id: ${toolCallId}`);
|
|
@@ -221,7 +221,7 @@ var DataStreamDecoder = class extends PipeableTransformStream {
|
|
|
221
221
|
});
|
|
222
222
|
break;
|
|
223
223
|
}
|
|
224
|
-
case
|
|
224
|
+
case DataStreamStreamChunkType.ToolCall: {
|
|
225
225
|
const { toolCallId, toolName, args } = value;
|
|
226
226
|
let toolCallController = toolCallControllers.get(toolCallId);
|
|
227
227
|
if (toolCallController) toolCallController.argsText.close();
|
|
@@ -235,42 +235,42 @@ var DataStreamDecoder = class extends PipeableTransformStream {
|
|
|
235
235
|
}
|
|
236
236
|
break;
|
|
237
237
|
}
|
|
238
|
-
case
|
|
238
|
+
case DataStreamStreamChunkType.FinishMessage:
|
|
239
239
|
controller.enqueue({
|
|
240
240
|
type: "message-finish",
|
|
241
241
|
path: [],
|
|
242
242
|
...value
|
|
243
243
|
});
|
|
244
244
|
break;
|
|
245
|
-
case
|
|
245
|
+
case DataStreamStreamChunkType.StartStep:
|
|
246
246
|
controller.enqueue({
|
|
247
247
|
type: "step-start",
|
|
248
248
|
path: [],
|
|
249
249
|
...value
|
|
250
250
|
});
|
|
251
251
|
break;
|
|
252
|
-
case
|
|
252
|
+
case DataStreamStreamChunkType.FinishStep:
|
|
253
253
|
controller.enqueue({
|
|
254
254
|
type: "step-finish",
|
|
255
255
|
path: [],
|
|
256
256
|
...value
|
|
257
257
|
});
|
|
258
258
|
break;
|
|
259
|
-
case
|
|
259
|
+
case DataStreamStreamChunkType.Data:
|
|
260
260
|
controller.enqueue({
|
|
261
261
|
type: "data",
|
|
262
262
|
path: [],
|
|
263
263
|
data: value
|
|
264
264
|
});
|
|
265
265
|
break;
|
|
266
|
-
case
|
|
266
|
+
case DataStreamStreamChunkType.Annotation:
|
|
267
267
|
controller.enqueue({
|
|
268
268
|
type: "annotations",
|
|
269
269
|
path: [],
|
|
270
270
|
annotations: value
|
|
271
271
|
});
|
|
272
272
|
break;
|
|
273
|
-
case
|
|
273
|
+
case DataStreamStreamChunkType.Source: {
|
|
274
274
|
const { parentId, ...sourceData } = value;
|
|
275
275
|
(parentId ? controller.withParentId(parentId) : controller).appendSource({
|
|
276
276
|
type: "source",
|
|
@@ -278,34 +278,34 @@ var DataStreamDecoder = class extends PipeableTransformStream {
|
|
|
278
278
|
});
|
|
279
279
|
break;
|
|
280
280
|
}
|
|
281
|
-
case
|
|
281
|
+
case DataStreamStreamChunkType.Error:
|
|
282
282
|
controller.enqueue({
|
|
283
283
|
type: "error",
|
|
284
284
|
path: [],
|
|
285
285
|
error: value
|
|
286
286
|
});
|
|
287
287
|
break;
|
|
288
|
-
case
|
|
288
|
+
case DataStreamStreamChunkType.File:
|
|
289
289
|
controller.appendFile({
|
|
290
290
|
type: "file",
|
|
291
291
|
...value
|
|
292
292
|
});
|
|
293
293
|
break;
|
|
294
|
-
case
|
|
294
|
+
case DataStreamStreamChunkType.AuiDataPart:
|
|
295
295
|
controller.appendData({
|
|
296
296
|
type: "data",
|
|
297
297
|
...value
|
|
298
298
|
});
|
|
299
299
|
break;
|
|
300
|
-
case
|
|
300
|
+
case DataStreamStreamChunkType.AuiUpdateStateOperations:
|
|
301
301
|
controller.enqueue({
|
|
302
302
|
type: "update-state",
|
|
303
303
|
path: [],
|
|
304
304
|
operations: value
|
|
305
305
|
});
|
|
306
306
|
break;
|
|
307
|
-
case
|
|
308
|
-
case
|
|
307
|
+
case DataStreamStreamChunkType.ReasoningSignature:
|
|
308
|
+
case DataStreamStreamChunkType.RedactedReasoning: break;
|
|
309
309
|
default: throw new Error(`unsupported chunk type: ${type}`);
|
|
310
310
|
}
|
|
311
311
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataStream.js","names":["exhaustiveCheck"],"sources":["../../../../src/core/serialization/data-stream/DataStream.ts"],"sourcesContent":["import type { AssistantStreamChunk } from \"../../AssistantStreamChunk\";\nimport type { ToolCallStreamController } from \"../../modules/tool-call\";\nimport { AssistantTransformStream } from \"../../utils/stream/AssistantTransformStream\";\nimport { PipeableTransformStream } from \"../../utils/stream/PipeableTransformStream\";\nimport { type DataStreamChunk, DataStreamStreamChunkType } from \"./chunk-types\";\nimport { LineDecoderStream } from \"../../utils/stream/LineDecoderStream\";\nimport {\n DataStreamChunkDecoder,\n DataStreamChunkEncoder,\n} from \"./serialization\";\nimport {\n type AssistantMetaStreamChunk,\n AssistantMetaTransformStream,\n} from \"../../utils/stream/AssistantMetaTransformStream\";\nimport type { TextStreamController } from \"../../modules/text\";\nimport type { AssistantStreamEncoder } from \"../../AssistantStream\";\n\nexport class DataStreamEncoder\n extends PipeableTransformStream<AssistantStreamChunk, Uint8Array<ArrayBuffer>>\n implements AssistantStreamEncoder\n{\n headers = new Headers({\n \"Content-Type\": \"text/plain; charset=utf-8\",\n \"x-vercel-ai-data-stream\": \"v1\",\n });\n\n constructor() {\n super((readable) => {\n const transform = new TransformStream<\n AssistantMetaStreamChunk,\n DataStreamChunk\n >({\n transform(chunk, controller) {\n const type = chunk.type;\n switch (type) {\n case \"part-start\": {\n const part = chunk.part;\n if (part.type === \"tool-call\") {\n const { type, ...value } = part;\n controller.enqueue({\n type: DataStreamStreamChunkType.StartToolCall,\n value,\n });\n }\n if (part.type === \"source\") {\n const { type, ...value } = part;\n controller.enqueue({\n type: DataStreamStreamChunkType.Source,\n value,\n });\n }\n if (part.type === \"data\") {\n const { type, ...value } = part;\n controller.enqueue({\n type: DataStreamStreamChunkType.AuiDataPart,\n value,\n });\n }\n break;\n }\n case \"text-delta\": {\n const part = chunk.meta;\n switch (part.type) {\n case \"text\": {\n if (part.parentId) {\n controller.enqueue({\n type: DataStreamStreamChunkType.AuiTextDelta,\n value: {\n textDelta: chunk.textDelta,\n parentId: part.parentId,\n },\n });\n } else {\n controller.enqueue({\n type: DataStreamStreamChunkType.TextDelta,\n value: chunk.textDelta,\n });\n }\n break;\n }\n case \"reasoning\": {\n if (part.parentId) {\n controller.enqueue({\n type: DataStreamStreamChunkType.AuiReasoningDelta,\n value: {\n reasoningDelta: chunk.textDelta,\n parentId: part.parentId,\n },\n });\n } else {\n controller.enqueue({\n type: DataStreamStreamChunkType.ReasoningDelta,\n value: chunk.textDelta,\n });\n }\n break;\n }\n case \"tool-call\": {\n controller.enqueue({\n type: DataStreamStreamChunkType.ToolCallArgsTextDelta,\n value: {\n toolCallId: part.toolCallId,\n argsTextDelta: chunk.textDelta,\n },\n });\n break;\n }\n default:\n throw new Error(\n `Unsupported part type for text-delta: ${part.type}`,\n );\n }\n break;\n }\n case \"result\": {\n // Only tool-call parts can have results.\n const part = chunk.meta;\n if (part.type !== \"tool-call\") {\n throw new Error(\n `Result chunk on non-tool-call part not supported: ${part.type}`,\n );\n }\n controller.enqueue({\n type: DataStreamStreamChunkType.ToolCallResult,\n value: {\n toolCallId: part.toolCallId,\n result: chunk.result,\n artifact: chunk.artifact,\n ...(chunk.isError ? { isError: chunk.isError } : {}),\n },\n });\n break;\n }\n case \"step-start\": {\n const { type, ...value } = chunk;\n controller.enqueue({\n type: DataStreamStreamChunkType.StartStep,\n value,\n });\n break;\n }\n case \"step-finish\": {\n const { type, ...value } = chunk;\n controller.enqueue({\n type: DataStreamStreamChunkType.FinishStep,\n value,\n });\n break;\n }\n case \"message-finish\": {\n const { type, ...value } = chunk;\n controller.enqueue({\n type: DataStreamStreamChunkType.FinishMessage,\n value,\n });\n break;\n }\n case \"error\": {\n controller.enqueue({\n type: DataStreamStreamChunkType.Error,\n value: chunk.error,\n });\n break;\n }\n case \"annotations\": {\n controller.enqueue({\n type: DataStreamStreamChunkType.Annotation,\n value: chunk.annotations,\n });\n break;\n }\n case \"data\": {\n controller.enqueue({\n type: DataStreamStreamChunkType.Data,\n value: chunk.data,\n });\n break;\n }\n\n case \"update-state\": {\n controller.enqueue({\n type: DataStreamStreamChunkType.AuiUpdateStateOperations,\n value: chunk.operations,\n });\n break;\n }\n\n // TODO ignore for now\n // in the future, we should create a handler that waits for text parts to finish before continuing\n case \"tool-call-args-text-finish\":\n case \"part-finish\":\n break;\n\n default: {\n const exhaustiveCheck: never = type;\n throw new Error(`Unsupported chunk type: ${exhaustiveCheck}`);\n }\n }\n },\n });\n\n return readable\n .pipeThrough(new AssistantMetaTransformStream())\n .pipeThrough(transform)\n .pipeThrough(new DataStreamChunkEncoder())\n .pipeThrough(new TextEncoderStream());\n });\n }\n}\n\nconst TOOL_CALL_ARGS_CLOSING_CHUNKS = [\n DataStreamStreamChunkType.StartToolCall,\n DataStreamStreamChunkType.ToolCall,\n DataStreamStreamChunkType.TextDelta,\n DataStreamStreamChunkType.ReasoningDelta,\n DataStreamStreamChunkType.Source,\n DataStreamStreamChunkType.Error,\n DataStreamStreamChunkType.FinishStep,\n DataStreamStreamChunkType.FinishMessage,\n DataStreamStreamChunkType.AuiTextDelta,\n DataStreamStreamChunkType.AuiReasoningDelta,\n DataStreamStreamChunkType.AuiDataPart,\n];\n\nexport class DataStreamDecoder extends PipeableTransformStream<\n Uint8Array<ArrayBuffer>,\n AssistantStreamChunk\n> {\n constructor() {\n super((readable) => {\n const toolCallControllers = new Map<string, ToolCallStreamController>();\n let activeToolCallArgsText: TextStreamController | undefined;\n const transform = new AssistantTransformStream<DataStreamChunk>({\n transform(chunk, controller) {\n const { type, value } = chunk;\n\n if (TOOL_CALL_ARGS_CLOSING_CHUNKS.includes(type)) {\n activeToolCallArgsText?.close();\n activeToolCallArgsText = undefined;\n }\n\n switch (type) {\n case DataStreamStreamChunkType.ReasoningDelta:\n controller.appendReasoning(value);\n break;\n\n case DataStreamStreamChunkType.TextDelta:\n controller.appendText(value);\n break;\n\n case DataStreamStreamChunkType.AuiTextDelta:\n controller\n .withParentId(value.parentId)\n .appendText(value.textDelta);\n break;\n\n case DataStreamStreamChunkType.AuiReasoningDelta:\n controller\n .withParentId(value.parentId)\n .appendReasoning(value.reasoningDelta);\n break;\n\n case DataStreamStreamChunkType.StartToolCall: {\n const { toolCallId, toolName, parentId } = value;\n const ctrl = parentId\n ? controller.withParentId(parentId)\n : controller;\n\n if (toolCallControllers.has(toolCallId))\n throw new Error(\n `Encountered duplicate tool call id: ${toolCallId}`,\n );\n\n const toolCallController = ctrl.addToolCallPart({\n toolCallId,\n toolName,\n });\n toolCallControllers.set(toolCallId, toolCallController);\n\n activeToolCallArgsText = toolCallController.argsText;\n break;\n }\n\n case DataStreamStreamChunkType.ToolCallArgsTextDelta: {\n const { toolCallId, argsTextDelta } = value;\n const toolCallController = toolCallControllers.get(toolCallId);\n if (!toolCallController)\n throw new Error(\n `Encountered tool call with unknown id: ${toolCallId}`,\n );\n toolCallController.argsText.append(argsTextDelta);\n break;\n }\n\n case DataStreamStreamChunkType.ToolCallResult: {\n const { toolCallId, artifact, result, isError } = value;\n const toolCallController = toolCallControllers.get(toolCallId);\n if (!toolCallController)\n throw new Error(\n `Encountered tool call result with unknown id: ${toolCallId}`,\n );\n toolCallController.setResponse({\n artifact,\n result,\n isError,\n });\n break;\n }\n\n case DataStreamStreamChunkType.ToolCall: {\n const { toolCallId, toolName, args } = value;\n\n let toolCallController = toolCallControllers.get(toolCallId);\n if (toolCallController) {\n toolCallController.argsText.close();\n } else {\n toolCallController = controller.addToolCallPart({\n toolCallId,\n toolName,\n args,\n });\n toolCallControllers.set(toolCallId, toolCallController);\n }\n break;\n }\n\n case DataStreamStreamChunkType.FinishMessage:\n controller.enqueue({\n type: \"message-finish\",\n path: [],\n ...value,\n });\n break;\n\n case DataStreamStreamChunkType.StartStep:\n controller.enqueue({\n type: \"step-start\",\n path: [],\n ...value,\n });\n break;\n\n case DataStreamStreamChunkType.FinishStep:\n controller.enqueue({\n type: \"step-finish\",\n path: [],\n ...value,\n });\n break;\n case DataStreamStreamChunkType.Data:\n controller.enqueue({\n type: \"data\",\n path: [],\n data: value,\n });\n break;\n\n case DataStreamStreamChunkType.Annotation:\n controller.enqueue({\n type: \"annotations\",\n path: [],\n annotations: value,\n });\n break;\n\n case DataStreamStreamChunkType.Source: {\n const { parentId, ...sourceData } = value;\n const ctrl = parentId\n ? controller.withParentId(parentId)\n : controller;\n ctrl.appendSource({\n type: \"source\",\n ...sourceData,\n });\n break;\n }\n\n case DataStreamStreamChunkType.Error:\n controller.enqueue({\n type: \"error\",\n path: [],\n error: value,\n });\n break;\n\n case DataStreamStreamChunkType.File:\n controller.appendFile({\n type: \"file\",\n ...value,\n });\n break;\n\n case DataStreamStreamChunkType.AuiDataPart:\n controller.appendData({\n type: \"data\",\n ...value,\n });\n break;\n\n case DataStreamStreamChunkType.AuiUpdateStateOperations:\n controller.enqueue({\n type: \"update-state\",\n path: [],\n operations: value,\n });\n break;\n\n case DataStreamStreamChunkType.ReasoningSignature:\n case DataStreamStreamChunkType.RedactedReasoning:\n // ignore these for now\n break;\n\n default: {\n const exhaustiveCheck: never = type;\n throw new Error(`unsupported chunk type: ${exhaustiveCheck}`);\n }\n }\n },\n flush() {\n activeToolCallArgsText?.close();\n activeToolCallArgsText = undefined;\n toolCallControllers.forEach((controller) => controller.close());\n toolCallControllers.clear();\n },\n });\n\n return readable\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(new LineDecoderStream())\n .pipeThrough(new DataStreamChunkDecoder())\n .pipeThrough(transform);\n });\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DataStream.js","names":["exhaustiveCheck"],"sources":["../../../../src/core/serialization/data-stream/DataStream.ts"],"sourcesContent":["import type { AssistantStreamChunk } from \"../../AssistantStreamChunk\";\nimport type { ToolCallStreamController } from \"../../modules/tool-call\";\nimport { AssistantTransformStream } from \"../../utils/stream/AssistantTransformStream\";\nimport { PipeableTransformStream } from \"../../utils/stream/PipeableTransformStream\";\nimport { type DataStreamChunk, DataStreamStreamChunkType } from \"./chunk-types\";\nimport { LineDecoderStream } from \"../../utils/stream/LineDecoderStream\";\nimport {\n DataStreamChunkDecoder,\n DataStreamChunkEncoder,\n} from \"./serialization\";\nimport {\n type AssistantMetaStreamChunk,\n AssistantMetaTransformStream,\n} from \"../../utils/stream/AssistantMetaTransformStream\";\nimport type { TextStreamController } from \"../../modules/text\";\nimport type { AssistantStreamEncoder } from \"../../AssistantStream\";\n\nexport class DataStreamEncoder\n extends PipeableTransformStream<AssistantStreamChunk, Uint8Array<ArrayBuffer>>\n implements AssistantStreamEncoder\n{\n headers = new Headers({\n \"Content-Type\": \"text/plain; charset=utf-8\",\n \"x-vercel-ai-data-stream\": \"v1\",\n });\n\n constructor() {\n super((readable) => {\n const transform = new TransformStream<\n AssistantMetaStreamChunk,\n DataStreamChunk\n >({\n transform(chunk, controller) {\n const type = chunk.type;\n switch (type) {\n case \"part-start\": {\n const part = chunk.part;\n if (part.type === \"tool-call\") {\n const { type, ...value } = part;\n controller.enqueue({\n type: DataStreamStreamChunkType.StartToolCall,\n value,\n });\n }\n if (part.type === \"source\") {\n const { type, ...value } = part;\n controller.enqueue({\n type: DataStreamStreamChunkType.Source,\n value,\n });\n }\n if (part.type === \"data\") {\n const { type, ...value } = part;\n controller.enqueue({\n type: DataStreamStreamChunkType.AuiDataPart,\n value,\n });\n }\n break;\n }\n case \"text-delta\": {\n const part = chunk.meta;\n switch (part.type) {\n case \"text\": {\n if (part.parentId) {\n controller.enqueue({\n type: DataStreamStreamChunkType.AuiTextDelta,\n value: {\n textDelta: chunk.textDelta,\n parentId: part.parentId,\n },\n });\n } else {\n controller.enqueue({\n type: DataStreamStreamChunkType.TextDelta,\n value: chunk.textDelta,\n });\n }\n break;\n }\n case \"reasoning\": {\n if (part.parentId) {\n controller.enqueue({\n type: DataStreamStreamChunkType.AuiReasoningDelta,\n value: {\n reasoningDelta: chunk.textDelta,\n parentId: part.parentId,\n },\n });\n } else {\n controller.enqueue({\n type: DataStreamStreamChunkType.ReasoningDelta,\n value: chunk.textDelta,\n });\n }\n break;\n }\n case \"tool-call\": {\n controller.enqueue({\n type: DataStreamStreamChunkType.ToolCallArgsTextDelta,\n value: {\n toolCallId: part.toolCallId,\n argsTextDelta: chunk.textDelta,\n },\n });\n break;\n }\n default:\n throw new Error(\n `Unsupported part type for text-delta: ${part.type}`,\n );\n }\n break;\n }\n case \"result\": {\n // Only tool-call parts can have results.\n const part = chunk.meta;\n if (part.type !== \"tool-call\") {\n throw new Error(\n `Result chunk on non-tool-call part not supported: ${part.type}`,\n );\n }\n controller.enqueue({\n type: DataStreamStreamChunkType.ToolCallResult,\n value: {\n toolCallId: part.toolCallId,\n result: chunk.result,\n artifact: chunk.artifact,\n ...(chunk.isError ? { isError: chunk.isError } : {}),\n },\n });\n break;\n }\n case \"step-start\": {\n const { type, ...value } = chunk;\n controller.enqueue({\n type: DataStreamStreamChunkType.StartStep,\n value,\n });\n break;\n }\n case \"step-finish\": {\n const { type, ...value } = chunk;\n controller.enqueue({\n type: DataStreamStreamChunkType.FinishStep,\n value,\n });\n break;\n }\n case \"message-finish\": {\n const { type, ...value } = chunk;\n controller.enqueue({\n type: DataStreamStreamChunkType.FinishMessage,\n value,\n });\n break;\n }\n case \"error\": {\n controller.enqueue({\n type: DataStreamStreamChunkType.Error,\n value: chunk.error,\n });\n break;\n }\n case \"annotations\": {\n controller.enqueue({\n type: DataStreamStreamChunkType.Annotation,\n value: chunk.annotations,\n });\n break;\n }\n case \"data\": {\n controller.enqueue({\n type: DataStreamStreamChunkType.Data,\n value: chunk.data,\n });\n break;\n }\n\n case \"update-state\": {\n controller.enqueue({\n type: DataStreamStreamChunkType.AuiUpdateStateOperations,\n value: chunk.operations,\n });\n break;\n }\n\n // TODO ignore for now\n // in the future, we should create a handler that waits for text parts to finish before continuing\n case \"tool-call-args-text-finish\":\n case \"part-finish\":\n break;\n\n default: {\n const exhaustiveCheck: never = type;\n throw new Error(`Unsupported chunk type: ${exhaustiveCheck}`);\n }\n }\n },\n });\n\n return readable\n .pipeThrough(new AssistantMetaTransformStream())\n .pipeThrough(transform)\n .pipeThrough(new DataStreamChunkEncoder())\n .pipeThrough(new TextEncoderStream());\n });\n }\n}\n\nconst TOOL_CALL_ARGS_CLOSING_CHUNKS: DataStreamStreamChunkType[] = [\n DataStreamStreamChunkType.StartToolCall,\n DataStreamStreamChunkType.ToolCall,\n DataStreamStreamChunkType.TextDelta,\n DataStreamStreamChunkType.ReasoningDelta,\n DataStreamStreamChunkType.Source,\n DataStreamStreamChunkType.Error,\n DataStreamStreamChunkType.FinishStep,\n DataStreamStreamChunkType.FinishMessage,\n DataStreamStreamChunkType.AuiTextDelta,\n DataStreamStreamChunkType.AuiReasoningDelta,\n DataStreamStreamChunkType.AuiDataPart,\n];\n\nexport class DataStreamDecoder extends PipeableTransformStream<\n Uint8Array<ArrayBuffer>,\n AssistantStreamChunk\n> {\n constructor() {\n super((readable) => {\n const toolCallControllers = new Map<string, ToolCallStreamController>();\n let activeToolCallArgsText: TextStreamController | undefined;\n const transform = new AssistantTransformStream<DataStreamChunk>({\n transform(chunk, controller) {\n const { type, value } = chunk;\n\n if (TOOL_CALL_ARGS_CLOSING_CHUNKS.includes(type)) {\n activeToolCallArgsText?.close();\n activeToolCallArgsText = undefined;\n }\n\n switch (type) {\n case DataStreamStreamChunkType.ReasoningDelta:\n controller.appendReasoning(value);\n break;\n\n case DataStreamStreamChunkType.TextDelta:\n controller.appendText(value);\n break;\n\n case DataStreamStreamChunkType.AuiTextDelta:\n controller\n .withParentId(value.parentId)\n .appendText(value.textDelta);\n break;\n\n case DataStreamStreamChunkType.AuiReasoningDelta:\n controller\n .withParentId(value.parentId)\n .appendReasoning(value.reasoningDelta);\n break;\n\n case DataStreamStreamChunkType.StartToolCall: {\n const { toolCallId, toolName, parentId } = value;\n const ctrl = parentId\n ? controller.withParentId(parentId)\n : controller;\n\n if (toolCallControllers.has(toolCallId))\n throw new Error(\n `Encountered duplicate tool call id: ${toolCallId}`,\n );\n\n const toolCallController = ctrl.addToolCallPart({\n toolCallId,\n toolName,\n });\n toolCallControllers.set(toolCallId, toolCallController);\n\n activeToolCallArgsText = toolCallController.argsText;\n break;\n }\n\n case DataStreamStreamChunkType.ToolCallArgsTextDelta: {\n const { toolCallId, argsTextDelta } = value;\n const toolCallController = toolCallControllers.get(toolCallId);\n if (!toolCallController)\n throw new Error(\n `Encountered tool call with unknown id: ${toolCallId}`,\n );\n toolCallController.argsText.append(argsTextDelta);\n break;\n }\n\n case DataStreamStreamChunkType.ToolCallResult: {\n const { toolCallId, artifact, result, isError } = value;\n const toolCallController = toolCallControllers.get(toolCallId);\n if (!toolCallController)\n throw new Error(\n `Encountered tool call result with unknown id: ${toolCallId}`,\n );\n toolCallController.setResponse({\n artifact,\n result,\n isError,\n });\n break;\n }\n\n case DataStreamStreamChunkType.ToolCall: {\n const { toolCallId, toolName, args } = value;\n\n let toolCallController = toolCallControllers.get(toolCallId);\n if (toolCallController) {\n toolCallController.argsText.close();\n } else {\n toolCallController = controller.addToolCallPart({\n toolCallId,\n toolName,\n args,\n });\n toolCallControllers.set(toolCallId, toolCallController);\n }\n break;\n }\n\n case DataStreamStreamChunkType.FinishMessage:\n controller.enqueue({\n type: \"message-finish\",\n path: [],\n ...value,\n });\n break;\n\n case DataStreamStreamChunkType.StartStep:\n controller.enqueue({\n type: \"step-start\",\n path: [],\n ...value,\n });\n break;\n\n case DataStreamStreamChunkType.FinishStep:\n controller.enqueue({\n type: \"step-finish\",\n path: [],\n ...value,\n });\n break;\n case DataStreamStreamChunkType.Data:\n controller.enqueue({\n type: \"data\",\n path: [],\n data: value,\n });\n break;\n\n case DataStreamStreamChunkType.Annotation:\n controller.enqueue({\n type: \"annotations\",\n path: [],\n annotations: value,\n });\n break;\n\n case DataStreamStreamChunkType.Source: {\n const { parentId, ...sourceData } = value;\n const ctrl = parentId\n ? controller.withParentId(parentId)\n : controller;\n ctrl.appendSource({\n type: \"source\",\n ...sourceData,\n });\n break;\n }\n\n case DataStreamStreamChunkType.Error:\n controller.enqueue({\n type: \"error\",\n path: [],\n error: value,\n });\n break;\n\n case DataStreamStreamChunkType.File:\n controller.appendFile({\n type: \"file\",\n ...value,\n });\n break;\n\n case DataStreamStreamChunkType.AuiDataPart:\n controller.appendData({\n type: \"data\",\n ...value,\n });\n break;\n\n case DataStreamStreamChunkType.AuiUpdateStateOperations:\n controller.enqueue({\n type: \"update-state\",\n path: [],\n operations: value,\n });\n break;\n\n case DataStreamStreamChunkType.ReasoningSignature:\n case DataStreamStreamChunkType.RedactedReasoning:\n // ignore these for now\n break;\n\n default: {\n const exhaustiveCheck: never = type;\n throw new Error(`unsupported chunk type: ${exhaustiveCheck}`);\n }\n }\n },\n flush() {\n activeToolCallArgsText?.close();\n activeToolCallArgsText = undefined;\n toolCallControllers.forEach((controller) => controller.close());\n toolCallControllers.clear();\n },\n });\n\n return readable\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(new LineDecoderStream())\n .pipeThrough(new DataStreamChunkDecoder())\n .pipeThrough(transform);\n });\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ReadonlyJSONObject, ReadonlyJSONValue } from "../../../utils/json/json-value.js";
|
|
2
|
-
import {
|
|
2
|
+
import { GorpStreamOperation } from "../../gorp/types.js";
|
|
3
3
|
//#region src/core/serialization/data-stream/chunk-types.d.ts
|
|
4
4
|
type DataStreamChunk = { [K in DataStreamStreamChunkType]: {
|
|
5
5
|
type: K;
|
|
@@ -10,28 +10,29 @@ type LanguageModelV1Usage = {
|
|
|
10
10
|
inputTokens: number;
|
|
11
11
|
outputTokens: number;
|
|
12
12
|
};
|
|
13
|
-
declare
|
|
14
|
-
TextDelta
|
|
15
|
-
Data
|
|
16
|
-
Error
|
|
17
|
-
Annotation
|
|
18
|
-
ToolCall
|
|
19
|
-
ToolCallResult
|
|
20
|
-
StartToolCall
|
|
21
|
-
ToolCallArgsTextDelta
|
|
22
|
-
FinishMessage
|
|
23
|
-
FinishStep
|
|
24
|
-
StartStep
|
|
25
|
-
ReasoningDelta
|
|
26
|
-
Source
|
|
27
|
-
RedactedReasoning
|
|
28
|
-
ReasoningSignature
|
|
29
|
-
File
|
|
30
|
-
AuiUpdateStateOperations
|
|
31
|
-
AuiTextDelta
|
|
32
|
-
AuiReasoningDelta
|
|
33
|
-
AuiDataPart
|
|
34
|
-
}
|
|
13
|
+
declare const DataStreamStreamChunkType: {
|
|
14
|
+
readonly TextDelta: "0";
|
|
15
|
+
readonly Data: "2";
|
|
16
|
+
readonly Error: "3";
|
|
17
|
+
readonly Annotation: "8";
|
|
18
|
+
readonly ToolCall: "9";
|
|
19
|
+
readonly ToolCallResult: "a";
|
|
20
|
+
readonly StartToolCall: "b";
|
|
21
|
+
readonly ToolCallArgsTextDelta: "c";
|
|
22
|
+
readonly FinishMessage: "d";
|
|
23
|
+
readonly FinishStep: "e";
|
|
24
|
+
readonly StartStep: "f";
|
|
25
|
+
readonly ReasoningDelta: "g";
|
|
26
|
+
readonly Source: "h";
|
|
27
|
+
readonly RedactedReasoning: "i";
|
|
28
|
+
readonly ReasoningSignature: "j";
|
|
29
|
+
readonly File: "k";
|
|
30
|
+
readonly AuiUpdateStateOperations: "aui-state";
|
|
31
|
+
readonly AuiTextDelta: "aui-text-delta";
|
|
32
|
+
readonly AuiReasoningDelta: "aui-reasoning-delta";
|
|
33
|
+
readonly AuiDataPart: "aui-data";
|
|
34
|
+
};
|
|
35
|
+
type DataStreamStreamChunkType = (typeof DataStreamStreamChunkType)[keyof typeof DataStreamStreamChunkType];
|
|
35
36
|
type DataStreamStreamChunkValue = {
|
|
36
37
|
[DataStreamStreamChunkType.TextDelta]: string;
|
|
37
38
|
[DataStreamStreamChunkType.Data]: ReadonlyJSONValue[];
|
|
@@ -87,7 +88,7 @@ type DataStreamStreamChunkValue = {
|
|
|
87
88
|
data: string;
|
|
88
89
|
mimeType: string;
|
|
89
90
|
};
|
|
90
|
-
[DataStreamStreamChunkType.AuiUpdateStateOperations]:
|
|
91
|
+
[DataStreamStreamChunkType.AuiUpdateStateOperations]: GorpStreamOperation[];
|
|
91
92
|
[DataStreamStreamChunkType.AuiTextDelta]: {
|
|
92
93
|
textDelta: string;
|
|
93
94
|
parentId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk-types.d.ts","names":[],"sources":["../../../../src/core/serialization/data-stream/chunk-types.ts"],"mappings":";;;KAMY,qBACT,KAAK;EACJ,MAAM;EACN,OAAO,2BAA2B;KAEpC;KAEG;KASA;EACH;EACA;;
|
|
1
|
+
{"version":3,"file":"chunk-types.d.ts","names":[],"sources":["../../../../src/core/serialization/data-stream/chunk-types.ts"],"mappings":";;;KAMY,qBACT,KAAK;EACJ,MAAM;EACN,OAAO,2BAA2B;KAEpC;KAEG;KASA;EACH;EACA;;cAGW;;;;;;;;;;;;;;;;;;;;;;KAuBD,oCACF,wCAAwC;KAC7C;GACF,0BAA0B;GAC1B,0BAA0B,OAAO;GACjC,0BAA0B,aAAa;GACvC,0BAA0B;IACzB;IACA;IACA,MAAM;;GAEP,0BAA0B;IACzB;IACA;IACA;;GAED,0BAA0B;IACzB;IACA;;GAED,0BAA0B;IACzB;IACA,QAAQ;IAGR,WAAW;IACX;;GAED,0BAA0B;GAC1B,0BAA0B;IACzB,cAAc;IACd,OAAO;IACP;;GAED,0BAA0B;IACzB,cAAc;IACd,OAAO;;GAER,0BAA0B;IACzB;;GAED,0BAA0B;GAC1B,0BAA0B;IACzB;IACA;IACA;IACA;IACA;;GAED,0BAA0B;IAAsB;;GAChD,0BAA0B;IAAuB;;GACjD,0BAA0B;IAAS;IAAc;;GAGjD,0BAA0B,2BAA2B;GACrD,0BAA0B;IACzB;IACA;;GAED,0BAA0B;IACzB;IACA;;GAED,0BAA0B;IACzB;IACA,MAAM;IACN"}
|
|
@@ -1,27 +1,26 @@
|
|
|
1
1
|
//#region src/core/serialization/data-stream/chunk-types.ts
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
}({});
|
|
2
|
+
const DataStreamStreamChunkType = {
|
|
3
|
+
TextDelta: "0",
|
|
4
|
+
Data: "2",
|
|
5
|
+
Error: "3",
|
|
6
|
+
Annotation: "8",
|
|
7
|
+
ToolCall: "9",
|
|
8
|
+
ToolCallResult: "a",
|
|
9
|
+
StartToolCall: "b",
|
|
10
|
+
ToolCallArgsTextDelta: "c",
|
|
11
|
+
FinishMessage: "d",
|
|
12
|
+
FinishStep: "e",
|
|
13
|
+
StartStep: "f",
|
|
14
|
+
ReasoningDelta: "g",
|
|
15
|
+
Source: "h",
|
|
16
|
+
RedactedReasoning: "i",
|
|
17
|
+
ReasoningSignature: "j",
|
|
18
|
+
File: "k",
|
|
19
|
+
AuiUpdateStateOperations: "aui-state",
|
|
20
|
+
AuiTextDelta: "aui-text-delta",
|
|
21
|
+
AuiReasoningDelta: "aui-reasoning-delta",
|
|
22
|
+
AuiDataPart: "aui-data"
|
|
23
|
+
};
|
|
25
24
|
//#endregion
|
|
26
25
|
export { DataStreamStreamChunkType };
|
|
27
26
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk-types.js","names":[],"sources":["../../../../src/core/serialization/data-stream/chunk-types.ts"],"sourcesContent":["import type {\n ReadonlyJSONObject,\n ReadonlyJSONValue,\n} from \"../../../utils/json/json-value\";\nimport type {
|
|
1
|
+
{"version":3,"file":"chunk-types.js","names":[],"sources":["../../../../src/core/serialization/data-stream/chunk-types.ts"],"sourcesContent":["import type {\n ReadonlyJSONObject,\n ReadonlyJSONValue,\n} from \"../../../utils/json/json-value\";\nimport type { GorpStreamOperation } from \"../../gorp/types\";\n\nexport type DataStreamChunk = {\n [K in DataStreamStreamChunkType]: {\n type: K;\n value: DataStreamStreamChunkValue[K];\n };\n}[DataStreamStreamChunkType];\n\ntype LanguageModelV1FinishReason =\n | \"stop\"\n | \"length\"\n | \"content-filter\"\n | \"tool-calls\"\n | \"error\"\n | \"other\"\n | \"unknown\";\n\ntype LanguageModelV1Usage = {\n inputTokens: number;\n outputTokens: number;\n};\n\nexport const DataStreamStreamChunkType = {\n TextDelta: \"0\",\n Data: \"2\",\n Error: \"3\",\n Annotation: \"8\",\n ToolCall: \"9\",\n ToolCallResult: \"a\",\n StartToolCall: \"b\",\n ToolCallArgsTextDelta: \"c\",\n FinishMessage: \"d\",\n FinishStep: \"e\",\n StartStep: \"f\",\n ReasoningDelta: \"g\",\n Source: \"h\",\n RedactedReasoning: \"i\",\n ReasoningSignature: \"j\",\n File: \"k\",\n\n AuiUpdateStateOperations: \"aui-state\",\n AuiTextDelta: \"aui-text-delta\",\n AuiReasoningDelta: \"aui-reasoning-delta\",\n AuiDataPart: \"aui-data\",\n} as const;\nexport type DataStreamStreamChunkType =\n (typeof DataStreamStreamChunkType)[keyof typeof DataStreamStreamChunkType];\ntype DataStreamStreamChunkValue = {\n [DataStreamStreamChunkType.TextDelta]: string;\n [DataStreamStreamChunkType.Data]: ReadonlyJSONValue[];\n [DataStreamStreamChunkType.Annotation]: ReadonlyJSONValue[];\n [DataStreamStreamChunkType.ToolCall]: {\n toolCallId: string;\n toolName: string;\n args: ReadonlyJSONObject;\n };\n [DataStreamStreamChunkType.StartToolCall]: {\n toolCallId: string;\n toolName: string;\n parentId?: string;\n };\n [DataStreamStreamChunkType.ToolCallArgsTextDelta]: {\n toolCallId: string;\n argsTextDelta: string;\n };\n [DataStreamStreamChunkType.ToolCallResult]: {\n toolCallId: string;\n result: ReadonlyJSONValue;\n\n // aui-extensions\n artifact?: ReadonlyJSONValue | undefined;\n isError?: boolean;\n };\n [DataStreamStreamChunkType.Error]: string;\n [DataStreamStreamChunkType.FinishStep]: {\n finishReason: LanguageModelV1FinishReason;\n usage: LanguageModelV1Usage;\n isContinued: boolean;\n };\n [DataStreamStreamChunkType.FinishMessage]: {\n finishReason: LanguageModelV1FinishReason;\n usage: LanguageModelV1Usage;\n };\n [DataStreamStreamChunkType.StartStep]: {\n messageId: string;\n };\n [DataStreamStreamChunkType.ReasoningDelta]: string;\n [DataStreamStreamChunkType.Source]: {\n sourceType: \"url\";\n id: string;\n url: string;\n title?: string;\n parentId?: string;\n };\n [DataStreamStreamChunkType.RedactedReasoning]: { data: string };\n [DataStreamStreamChunkType.ReasoningSignature]: { signature: string };\n [DataStreamStreamChunkType.File]: { data: string; mimeType: string };\n\n // aui-extensions\n [DataStreamStreamChunkType.AuiUpdateStateOperations]: GorpStreamOperation[];\n [DataStreamStreamChunkType.AuiTextDelta]: {\n textDelta: string;\n parentId: string;\n };\n [DataStreamStreamChunkType.AuiReasoningDelta]: {\n reasoningDelta: string;\n parentId: string;\n };\n [DataStreamStreamChunkType.AuiDataPart]: {\n name: string;\n data: ReadonlyJSONValue;\n parentId?: string;\n };\n};\n"],"mappings":";AA2BA,MAAa,4BAA4B;CACvC,WAAW;CACX,MAAM;CACN,OAAO;CACP,YAAY;CACZ,UAAU;CACV,gBAAgB;CAChB,eAAe;CACf,uBAAuB;CACvB,eAAe;CACf,YAAY;CACZ,WAAW;CACX,gBAAgB;CAChB,QAAQ;CACR,mBAAmB;CACnB,oBAAoB;CACpB,MAAM;CAEN,0BAA0B;CAC1B,cAAc;CACd,mBAAmB;CACnB,aAAa;AACf"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serialization.d.ts","names":[],"sources":["../../../../src/core/serialization/data-stream/serialization.ts"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"serialization.d.ts","names":[],"sources":["../../../../src/core/serialization/data-stream/serialization.ts"],"mappings":";;cAGa,+BAA+B,gBAC1C;;;cAYW,+BAA+B,wBAE1C"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import sjson from "secure-json-parse";
|
|
1
2
|
//#region src/core/serialization/data-stream/serialization.ts
|
|
2
3
|
var DataStreamChunkEncoder = class extends TransformStream {
|
|
3
4
|
constructor() {
|
|
@@ -10,10 +11,21 @@ var DataStreamChunkDecoder = class extends TransformStream {
|
|
|
10
11
|
constructor() {
|
|
11
12
|
super({ transform: (chunk, controller) => {
|
|
12
13
|
const index = chunk.indexOf(":");
|
|
13
|
-
if (index === -1)
|
|
14
|
+
if (index === -1) {
|
|
15
|
+
if (chunk.trim().length === 0) return;
|
|
16
|
+
console.warn(`Dropped invalid data-stream chunk: ${chunk.slice(0, 200)}`);
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
let value;
|
|
20
|
+
try {
|
|
21
|
+
value = sjson.parse(chunk.slice(index + 1));
|
|
22
|
+
} catch {
|
|
23
|
+
console.warn(`Dropped invalid data-stream chunk: ${chunk.slice(0, 200)}`);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
14
26
|
controller.enqueue({
|
|
15
27
|
type: chunk.slice(0, index),
|
|
16
|
-
value
|
|
28
|
+
value
|
|
17
29
|
});
|
|
18
30
|
} });
|
|
19
31
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serialization.js","names":[],"sources":["../../../../src/core/serialization/data-stream/serialization.ts"],"sourcesContent":["import type { DataStreamChunk, DataStreamStreamChunkType } from \"./chunk-types\";\n\nexport class DataStreamChunkEncoder extends TransformStream<\n DataStreamChunk,\n string\n> {\n constructor() {\n super({\n transform: (chunk, controller) => {\n controller.enqueue(`${chunk.type}:${JSON.stringify(chunk.value)}\\n`);\n },\n });\n }\n}\n\nexport class DataStreamChunkDecoder extends TransformStream<\n string,\n DataStreamChunk\n> {\n constructor() {\n super({\n transform: (chunk, controller) => {\n const index = chunk.indexOf(\":\");\n if (index === -1)
|
|
1
|
+
{"version":3,"file":"serialization.js","names":[],"sources":["../../../../src/core/serialization/data-stream/serialization.ts"],"sourcesContent":["import sjson from \"secure-json-parse\";\nimport type { DataStreamChunk, DataStreamStreamChunkType } from \"./chunk-types\";\n\nexport class DataStreamChunkEncoder extends TransformStream<\n DataStreamChunk,\n string\n> {\n constructor() {\n super({\n transform: (chunk, controller) => {\n controller.enqueue(`${chunk.type}:${JSON.stringify(chunk.value)}\\n`);\n },\n });\n }\n}\n\nexport class DataStreamChunkDecoder extends TransformStream<\n string,\n DataStreamChunk\n> {\n constructor() {\n super({\n transform: (chunk, controller) => {\n const index = chunk.indexOf(\":\");\n if (index === -1) {\n // Blank lines are benign data-stream framing (keepalive newlines,\n // replay-buffer separators emitted on resume/reconnect).\n if (chunk.trim().length === 0) return;\n console.warn(\n `Dropped invalid data-stream chunk: ${chunk.slice(0, 200)}`,\n );\n return;\n }\n let value;\n try {\n value = sjson.parse(chunk.slice(index + 1));\n } catch {\n console.warn(\n `Dropped invalid data-stream chunk: ${chunk.slice(0, 200)}`,\n );\n return;\n }\n controller.enqueue({\n type: chunk.slice(0, index) as DataStreamStreamChunkType,\n value,\n });\n },\n });\n }\n}\n"],"mappings":";;AAGA,IAAa,yBAAb,cAA4C,gBAG1C;CACA,cAAc;EACZ,MAAM,EACJ,YAAY,OAAO,eAAe;GAChC,WAAW,QAAQ,GAAG,MAAM,KAAK,GAAG,KAAK,UAAU,MAAM,KAAK,EAAE,GAAG;EACrE,EACF,CAAC;CACH;AACF;AAEA,IAAa,yBAAb,cAA4C,gBAG1C;CACA,cAAc;EACZ,MAAM,EACJ,YAAY,OAAO,eAAe;GAChC,MAAM,QAAQ,MAAM,QAAQ,GAAG;GAC/B,IAAI,UAAU,IAAI;IAGhB,IAAI,MAAM,KAAK,CAAC,CAAC,WAAW,GAAG;IAC/B,QAAQ,KACN,sCAAsC,MAAM,MAAM,GAAG,GAAG,GAC1D;IACA;GACF;GACA,IAAI;GACJ,IAAI;IACF,QAAQ,MAAM,MAAM,MAAM,MAAM,QAAQ,CAAC,CAAC;GAC5C,QAAQ;IACN,QAAQ,KACN,sCAAsC,MAAM,MAAM,GAAG,GAAG,GAC1D;IACA;GACF;GACA,WAAW,QAAQ;IACjB,MAAM,MAAM,MAAM,GAAG,KAAK;IAC1B;GACF,CAAC;EACH,EACF,CAAC;CACH;AACF"}
|