assistant-stream 0.3.15 → 0.3.17
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/README.md +6 -4
- package/dist/core/AssistantStream.d.ts +35 -31
- package/dist/core/AssistantStream.d.ts.map +1 -1
- package/dist/core/AssistantStream.js +39 -37
- package/dist/core/AssistantStream.js.map +1 -1
- package/dist/core/AssistantStreamChunk.d.ts +71 -78
- package/dist/core/AssistantStreamChunk.d.ts.map +1 -1
- package/dist/core/AssistantStreamChunk.js +0 -2
- package/dist/core/accumulators/AssistantMessageStream.d.ts +15 -11
- package/dist/core/accumulators/AssistantMessageStream.d.ts.map +1 -1
- package/dist/core/accumulators/AssistantMessageStream.js +52 -48
- package/dist/core/accumulators/AssistantMessageStream.js.map +1 -1
- package/dist/core/accumulators/TimingTracker.d.ts +15 -11
- package/dist/core/accumulators/TimingTracker.d.ts.map +1 -1
- package/dist/core/accumulators/TimingTracker.js +36 -43
- package/dist/core/accumulators/TimingTracker.js.map +1 -1
- package/dist/core/accumulators/assistant-message-accumulator.d.ts +21 -11
- package/dist/core/accumulators/assistant-message-accumulator.d.ts.map +1 -1
- package/dist/core/accumulators/assistant-message-accumulator.js +349 -390
- package/dist/core/accumulators/assistant-message-accumulator.js.map +1 -1
- package/dist/core/converters/toGenericMessages.d.ts +49 -47
- package/dist/core/converters/toGenericMessages.d.ts.map +1 -1
- package/dist/core/converters/toGenericMessages.js +122 -136
- package/dist/core/converters/toGenericMessages.js.map +1 -1
- package/dist/core/modules/assistant-stream.d.ts +62 -66
- package/dist/core/modules/assistant-stream.d.ts.map +1 -1
- package/dist/core/modules/assistant-stream.js +176 -182
- package/dist/core/modules/assistant-stream.js.map +1 -1
- package/dist/core/modules/text.d.ts +11 -7
- package/dist/core/modules/text.d.ts.map +1 -1
- package/dist/core/modules/text.js +45 -45
- package/dist/core/modules/text.js.map +1 -1
- package/dist/core/modules/tool-call.d.ts +15 -11
- package/dist/core/modules/tool-call.d.ts.map +1 -1
- package/dist/core/modules/tool-call.js +81 -96
- package/dist/core/modules/tool-call.js.map +1 -1
- package/dist/core/object/ObjectStreamAccumulator.d.ts +13 -9
- package/dist/core/object/ObjectStreamAccumulator.d.ts.map +1 -1
- package/dist/core/object/ObjectStreamAccumulator.js +44 -52
- package/dist/core/object/ObjectStreamAccumulator.js.map +1 -1
- package/dist/core/object/ObjectStreamResponse.d.ts +12 -8
- package/dist/core/object/ObjectStreamResponse.d.ts.map +1 -1
- package/dist/core/object/ObjectStreamResponse.js +52 -71
- package/dist/core/object/ObjectStreamResponse.js.map +1 -1
- package/dist/core/object/createObjectStream.d.ts +14 -8
- package/dist/core/object/createObjectStream.d.ts.map +1 -1
- package/dist/core/object/createObjectStream.js +50 -47
- package/dist/core/object/createObjectStream.js.map +1 -1
- package/dist/core/object/types.d.ts +14 -11
- package/dist/core/object/types.d.ts.map +1 -1
- package/dist/core/object/types.js +0 -2
- package/dist/core/serialization/PlainText.d.ts +11 -7
- package/dist/core/serialization/PlainText.d.ts.map +1 -1
- package/dist/core/serialization/PlainText.js +40 -48
- package/dist/core/serialization/PlainText.js.map +1 -1
- package/dist/core/serialization/assistant-transport/AssistantTransport.d.ts +11 -7
- package/dist/core/serialization/assistant-transport/AssistantTransport.d.ts.map +1 -1
- package/dist/core/serialization/assistant-transport/AssistantTransport.js +102 -117
- package/dist/core/serialization/assistant-transport/AssistantTransport.js.map +1 -1
- package/dist/core/serialization/data-stream/DataStream.d.ts +11 -7
- package/dist/core/serialization/data-stream/DataStream.d.ts.map +1 -1
- package/dist/core/serialization/data-stream/DataStream.js +320 -371
- package/dist/core/serialization/data-stream/DataStream.js.map +1 -1
- package/dist/core/serialization/data-stream/chunk-types.d.ts +101 -100
- package/dist/core/serialization/data-stream/chunk-types.d.ts.map +1 -1
- package/dist/core/serialization/data-stream/chunk-types.js +27 -23
- package/dist/core/serialization/data-stream/chunk-types.js.map +1 -1
- package/dist/core/serialization/data-stream/serialization.d.ts +9 -5
- package/dist/core/serialization/data-stream/serialization.d.ts.map +1 -1
- package/dist/core/serialization/data-stream/serialization.js +23 -24
- package/dist/core/serialization/data-stream/serialization.js.map +1 -1
- package/dist/core/serialization/ui-message-stream/UIMessageStream.d.ts +15 -12
- package/dist/core/serialization/ui-message-stream/UIMessageStream.d.ts.map +1 -1
- package/dist/core/serialization/ui-message-stream/UIMessageStream.js +205 -228
- package/dist/core/serialization/ui-message-stream/UIMessageStream.js.map +1 -1
- package/dist/core/serialization/ui-message-stream/chunk-types.d.ts +68 -65
- package/dist/core/serialization/ui-message-stream/chunk-types.d.ts.map +1 -1
- package/dist/core/serialization/ui-message-stream/chunk-types.js +0 -2
- package/dist/core/tool/ToolCallReader.d.ts +34 -30
- package/dist/core/tool/ToolCallReader.d.ts.map +1 -1
- package/dist/core/tool/ToolCallReader.js +264 -317
- package/dist/core/tool/ToolCallReader.js.map +1 -1
- package/dist/core/tool/ToolExecutionStream.d.ts +20 -17
- package/dist/core/tool/ToolExecutionStream.d.ts.map +1 -1
- package/dist/core/tool/ToolExecutionStream.js +123 -146
- package/dist/core/tool/ToolExecutionStream.js.map +1 -1
- package/dist/core/tool/ToolResponse.d.ts +41 -41
- package/dist/core/tool/ToolResponse.d.ts.map +1 -1
- package/dist/core/tool/ToolResponse.js +50 -56
- package/dist/core/tool/ToolResponse.js.map +1 -1
- package/dist/core/tool/schema-utils.d.ts +19 -15
- package/dist/core/tool/schema-utils.d.ts.map +1 -1
- package/dist/core/tool/schema-utils.js +50 -84
- package/dist/core/tool/schema-utils.js.map +1 -1
- package/dist/core/tool/tool-types.d.ts +103 -122
- package/dist/core/tool/tool-types.d.ts.map +1 -1
- package/dist/core/tool/tool-types.js +0 -2
- package/dist/core/tool/toolResultStream.d.ts +11 -9
- package/dist/core/tool/toolResultStream.d.ts.map +1 -1
- package/dist/core/tool/toolResultStream.js +127 -157
- package/dist/core/tool/toolResultStream.js.map +1 -1
- package/dist/core/tool/type-path-utils.d.ts +8 -19
- package/dist/core/tool/type-path-utils.d.ts.map +1 -1
- package/dist/core/tool/type-path-utils.js +0 -2
- package/dist/core/utils/Counter.d.ts +6 -3
- package/dist/core/utils/Counter.d.ts.map +1 -1
- package/dist/core/utils/Counter.js +10 -6
- package/dist/core/utils/Counter.js.map +1 -1
- package/dist/core/utils/generateId.d.ts +4 -1
- package/dist/core/utils/generateId.d.ts.map +1 -1
- package/dist/core/utils/generateId.js +5 -1
- package/dist/core/utils/generateId.js.map +1 -1
- package/dist/core/utils/stream/AssistantMetaTransformStream.d.ts +15 -11
- package/dist/core/utils/stream/AssistantMetaTransformStream.d.ts.map +1 -1
- package/dist/core/utils/stream/AssistantMetaTransformStream.js +38 -42
- package/dist/core/utils/stream/AssistantMetaTransformStream.js.map +1 -1
- package/dist/core/utils/stream/AssistantTransformStream.d.ts +11 -8
- package/dist/core/utils/stream/AssistantTransformStream.d.ts.map +1 -1
- package/dist/core/utils/stream/AssistantTransformStream.js +37 -35
- package/dist/core/utils/stream/AssistantTransformStream.js.map +1 -1
- package/dist/core/utils/stream/LineDecoderStream.d.ts +6 -3
- package/dist/core/utils/stream/LineDecoderStream.d.ts.map +1 -1
- package/dist/core/utils/stream/LineDecoderStream.js +23 -26
- package/dist/core/utils/stream/LineDecoderStream.js.map +1 -1
- package/dist/core/utils/stream/PipeableTransformStream.d.ts +5 -2
- package/dist/core/utils/stream/PipeableTransformStream.d.ts.map +1 -1
- package/dist/core/utils/stream/PipeableTransformStream.js +14 -10
- package/dist/core/utils/stream/PipeableTransformStream.js.map +1 -1
- package/dist/core/utils/stream/SSE.d.ts +10 -6
- package/dist/core/utils/stream/SSE.d.ts.map +1 -1
- package/dist/core/utils/stream/SSE.js +79 -91
- package/dist/core/utils/stream/SSE.js.map +1 -1
- package/dist/core/utils/stream/UnderlyingReadable.d.ts +7 -4
- package/dist/core/utils/stream/UnderlyingReadable.d.ts.map +1 -1
- package/dist/core/utils/stream/UnderlyingReadable.js +0 -2
- package/dist/core/utils/stream/merge.d.ts +11 -7
- package/dist/core/utils/stream/merge.d.ts.map +1 -1
- package/dist/core/utils/stream/merge.js +68 -170
- package/dist/core/utils/stream/merge.js.map +1 -1
- package/dist/core/utils/stream/path-utils.d.ts +11 -7
- package/dist/core/utils/stream/path-utils.d.ts.map +1 -1
- package/dist/core/utils/stream/path-utils.js +46 -52
- package/dist/core/utils/stream/path-utils.js.map +1 -1
- package/dist/core/utils/types.d.ts +109 -113
- package/dist/core/utils/types.d.ts.map +1 -1
- package/dist/core/utils/types.js +0 -2
- package/dist/core/utils/withPromiseOrValue.d.ts +4 -1
- package/dist/core/utils/withPromiseOrValue.d.ts.map +1 -1
- package/dist/core/utils/withPromiseOrValue.js +12 -15
- package/dist/core/utils/withPromiseOrValue.js.map +1 -1
- package/dist/index.d.ts +23 -24
- package/dist/index.js +16 -16
- package/dist/node_modules/.pnpm/@types_json-schema@7.0.15/node_modules/@types/json-schema/index.d.ts +141 -0
- package/dist/node_modules/.pnpm/@types_json-schema@7.0.15/node_modules/@types/json-schema/index.d.ts.map +1 -0
- package/dist/resumable/ResumableStreamContext.d.ts +28 -24
- package/dist/resumable/ResumableStreamContext.d.ts.map +1 -1
- package/dist/resumable/ResumableStreamContext.js +99 -114
- package/dist/resumable/ResumableStreamContext.js.map +1 -1
- package/dist/resumable/constants.d.ts +4 -1
- package/dist/resumable/constants.d.ts.map +1 -1
- package/dist/resumable/constants.js +5 -1
- package/dist/resumable/constants.js.map +1 -1
- package/dist/resumable/createResumableAssistantStreamResponse.d.ts +22 -21
- package/dist/resumable/createResumableAssistantStreamResponse.d.ts.map +1 -1
- package/dist/resumable/createResumableAssistantStreamResponse.js +25 -32
- package/dist/resumable/createResumableAssistantStreamResponse.js.map +1 -1
- package/dist/resumable/errors.d.ts +8 -5
- package/dist/resumable/errors.d.ts.map +1 -1
- package/dist/resumable/errors.js +14 -12
- package/dist/resumable/errors.js.map +1 -1
- package/dist/resumable/index.d.ts +7 -7
- package/dist/resumable/index.js +5 -5
- package/dist/resumable/stores/InMemoryResumableStreamStore.d.ts +14 -10
- package/dist/resumable/stores/InMemoryResumableStreamStore.d.ts.map +1 -1
- package/dist/resumable/stores/InMemoryResumableStreamStore.js +159 -193
- package/dist/resumable/stores/InMemoryResumableStreamStore.js.map +1 -1
- package/dist/resumable/stores/ioredis.d.ts +9 -5
- package/dist/resumable/stores/ioredis.d.ts.map +1 -1
- package/dist/resumable/stores/ioredis.js +70 -82
- package/dist/resumable/stores/ioredis.js.map +1 -1
- package/dist/resumable/stores/redis-impl.d.ts +51 -48
- package/dist/resumable/stores/redis-impl.d.ts.map +1 -1
- package/dist/resumable/stores/redis-impl.js +176 -176
- package/dist/resumable/stores/redis-impl.js.map +1 -1
- package/dist/resumable/stores/redis.d.ts +31 -28
- package/dist/resumable/stores/redis.d.ts.map +1 -1
- package/dist/resumable/stores/redis.js +87 -95
- package/dist/resumable/stores/redis.js.map +1 -1
- package/dist/resumable/types.d.ts +29 -26
- package/dist/resumable/types.d.ts.map +1 -1
- package/dist/resumable/types.js +0 -2
- package/dist/utils/AsyncIterableStream.d.ts +5 -2
- package/dist/utils/AsyncIterableStream.d.ts.map +1 -1
- package/dist/utils/AsyncIterableStream.js +17 -16
- package/dist/utils/AsyncIterableStream.js.map +1 -1
- package/dist/utils/json/fix-json.d.ts +4 -1
- package/dist/utils/json/fix-json.d.ts.map +1 -1
- package/dist/utils/json/fix-json.js +286 -380
- package/dist/utils/json/fix-json.js.map +1 -1
- package/dist/utils/json/is-json.d.ts +8 -4
- package/dist/utils/json/is-json.d.ts.map +1 -1
- package/dist/utils/json/is-json.js +13 -21
- package/dist/utils/json/is-json.js.map +1 -1
- package/dist/utils/json/json-value.d.ts +7 -4
- package/dist/utils/json/json-value.d.ts.map +1 -1
- package/dist/utils/json/json-value.js +0 -2
- package/dist/utils/json/parse-partial-json-object.d.ts +11 -8
- package/dist/utils/json/parse-partial-json-object.d.ts.map +1 -1
- package/dist/utils/json/parse-partial-json-object.js +50 -62
- package/dist/utils/json/parse-partial-json-object.js.map +1 -1
- package/dist/utils/promiseWithResolvers.d.ts +7 -4
- package/dist/utils/promiseWithResolvers.d.ts.map +1 -1
- package/dist/utils/promiseWithResolvers.js +17 -10
- package/dist/utils/promiseWithResolvers.js.map +1 -1
- package/dist/utils.d.ts +6 -6
- package/dist/utils.js +5 -5
- package/package.json +3 -3
- package/src/core/modules/assistant-stream.test.ts +104 -0
- package/src/core/modules/assistant-stream.ts +13 -4
- package/dist/core/AssistantStreamChunk.js.map +0 -1
- package/dist/core/object/types.js.map +0 -1
- package/dist/core/serialization/ui-message-stream/chunk-types.js.map +0 -1
- package/dist/core/tool/tool-types.js.map +0 -1
- package/dist/core/tool/type-path-utils.js.map +0 -1
- package/dist/core/utils/stream/UnderlyingReadable.js.map +0 -1
- package/dist/core/utils/types.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/resumable/index.d.ts.map +0 -1
- package/dist/resumable/index.js.map +0 -1
- package/dist/resumable/types.js.map +0 -1
- package/dist/utils/json/json-value.js.map +0 -1
- package/dist/utils.d.ts.map +0 -1
- package/dist/utils.js.map +0 -1
|
@@ -1,16 +1,18 @@
|
|
|
1
|
+
import { ReadonlyJSONObject, ReadonlyJSONValue } from "../../utils/json/json-value.js";
|
|
2
|
+
import { TextStreamController } from "./text.js";
|
|
3
|
+
import { ToolResponseLike } from "../tool/ToolResponse.js";
|
|
4
|
+
import { ToolCallStreamController } from "./tool-call.js";
|
|
5
|
+
import { DataPart, FilePart, SourcePart } from "../utils/types.js";
|
|
6
|
+
import { AssistantStreamChunk } from "../AssistantStreamChunk.js";
|
|
1
7
|
import { AssistantStream } from "../AssistantStream.js";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
import { type ToolCallStreamController } from "./tool-call.js";
|
|
5
|
-
import type { DataPart, FilePart, SourcePart } from "../utils/types.js";
|
|
6
|
-
import type { ReadonlyJSONObject, ReadonlyJSONValue } from "../../utils/json/json-value.js";
|
|
7
|
-
import type { ToolResponseLike } from "../tool/ToolResponse.js";
|
|
8
|
+
|
|
9
|
+
//#region src/core/modules/assistant-stream.d.ts
|
|
8
10
|
type ToolCallPartInit = {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
toolCallId?: string;
|
|
12
|
+
toolName: string;
|
|
13
|
+
argsText?: string;
|
|
14
|
+
args?: ReadonlyJSONObject;
|
|
15
|
+
response?: ToolResponseLike<ReadonlyJSONValue>;
|
|
14
16
|
};
|
|
15
17
|
/**
|
|
16
18
|
* Imperative writer for constructing an {@link AssistantStream}.
|
|
@@ -19,57 +21,50 @@ type ToolCallPartInit = {
|
|
|
19
21
|
* `appendText` and `appendReasoning` for simple token streams, or open explicit
|
|
20
22
|
* parts with `addTextPart` and `addToolCallPart` when you need direct control.
|
|
21
23
|
*/
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Returns a controller that writes child parts with `parentId` attached.
|
|
68
|
-
*
|
|
69
|
-
* Use this for nested or related parts that should be associated with an
|
|
70
|
-
* existing message or part in downstream renderers.
|
|
71
|
-
*/
|
|
72
|
-
withParentId(parentId: string): AssistantStreamController;
|
|
24
|
+
type AssistantStreamController = {
|
|
25
|
+
/** Appends text to the current text part, opening one if needed. */appendText(textDelta: string): void; /** Appends reasoning text to the current reasoning part, opening one if needed. */
|
|
26
|
+
appendReasoning(reasoningDelta: string): void; /** Appends a source citation part to the stream. */
|
|
27
|
+
appendSource(options: SourcePart): void; /** Appends a file part to the stream. */
|
|
28
|
+
appendFile(options: FilePart): void; /** Appends a named data part to the stream. */
|
|
29
|
+
appendData(options: DataPart): void;
|
|
30
|
+
/**
|
|
31
|
+
* Opens a text part and returns its writer.
|
|
32
|
+
*
|
|
33
|
+
* Close the returned controller when the text part is complete. Opening a new
|
|
34
|
+
* part through this controller closes any implicit text or reasoning append
|
|
35
|
+
* part first.
|
|
36
|
+
*/
|
|
37
|
+
addTextPart(): TextStreamController;
|
|
38
|
+
/**
|
|
39
|
+
* Opens a tool-call part by tool name and returns its writer.
|
|
40
|
+
*
|
|
41
|
+
* A tool call id is generated automatically. Use the object overload when the
|
|
42
|
+
* caller already has an id, initial args, args text, or response.
|
|
43
|
+
*/
|
|
44
|
+
addToolCallPart(options: string): ToolCallStreamController;
|
|
45
|
+
/**
|
|
46
|
+
* Opens a tool-call part and returns its writer.
|
|
47
|
+
*
|
|
48
|
+
* Use this overload to provide a stable `toolCallId`, initial arguments,
|
|
49
|
+
* streamed argument text, or an immediate {@link ToolResponseLike}.
|
|
50
|
+
*/
|
|
51
|
+
addToolCallPart(options: ToolCallPartInit): ToolCallStreamController; /** Enqueues a raw protocol chunk. Prefer higher-level helpers when possible. */
|
|
52
|
+
enqueue(chunk: AssistantStreamChunk): void;
|
|
53
|
+
/**
|
|
54
|
+
* Merges another assistant stream into this stream.
|
|
55
|
+
*
|
|
56
|
+
* Paths from the merged stream are remapped so its parts appear at the next
|
|
57
|
+
* available position in this controller's output.
|
|
58
|
+
*/
|
|
59
|
+
merge(stream: AssistantStream): void; /** Closes any active part and finishes the stream. */
|
|
60
|
+
close(): void;
|
|
61
|
+
/**
|
|
62
|
+
* Returns a controller that writes child parts with `parentId` attached.
|
|
63
|
+
*
|
|
64
|
+
* Use this for nested or related parts that should be associated with an
|
|
65
|
+
* existing message or part in downstream renderers.
|
|
66
|
+
*/
|
|
67
|
+
withParentId(parentId: string): AssistantStreamController;
|
|
73
68
|
};
|
|
74
69
|
/**
|
|
75
70
|
* Creates an {@link AssistantStream} and writes to it with an
|
|
@@ -80,7 +75,7 @@ export type AssistantStreamController = {
|
|
|
80
75
|
* settles, the stream is closed automatically unless the controller was
|
|
81
76
|
* already closed.
|
|
82
77
|
*/
|
|
83
|
-
|
|
78
|
+
declare function createAssistantStream(callback: (controller: AssistantStreamController) => PromiseLike<void> | void): AssistantStream;
|
|
84
79
|
/**
|
|
85
80
|
* Creates an {@link AssistantStream} together with the controller used to
|
|
86
81
|
* write into it.
|
|
@@ -88,7 +83,7 @@ export declare function createAssistantStream(callback: (controller: AssistantSt
|
|
|
88
83
|
* Use this when the stream needs to be returned before all writers are known.
|
|
89
84
|
* Closing the returned controller finishes the paired stream.
|
|
90
85
|
*/
|
|
91
|
-
|
|
86
|
+
declare function createAssistantStreamController(): readonly [AssistantStream, AssistantStreamController];
|
|
92
87
|
/**
|
|
93
88
|
* Creates a `Response` whose body is an encoded {@link AssistantStream}.
|
|
94
89
|
*
|
|
@@ -96,6 +91,7 @@ export declare function createAssistantStreamController(): readonly [AssistantSt
|
|
|
96
91
|
* uses {@link DataStreamEncoder} so the response can be consumed by matching
|
|
97
92
|
* assistant-ui data stream decoders.
|
|
98
93
|
*/
|
|
99
|
-
|
|
100
|
-
|
|
94
|
+
declare function createAssistantStreamResponse(callback: (controller: AssistantStreamController) => PromiseLike<void> | void): Response;
|
|
95
|
+
//#endregion
|
|
96
|
+
export { AssistantStreamController, createAssistantStream, createAssistantStreamController, createAssistantStreamResponse };
|
|
101
97
|
//# sourceMappingURL=assistant-stream.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assistant-stream.d.ts","
|
|
1
|
+
{"version":3,"file":"assistant-stream.d.ts","names":[],"sources":["../../../src/core/modules/assistant-stream.ts"],"mappings":";;;;;;;;;KAuBK,gBAAA;EACH,UAAA;EACA,QAAA;EACA,QAAA;EACA,IAAA,GAAO,kBAAA;EACP,QAAA,GAAW,gBAAA,CAAiB,iBAAA;AAAA;;;;;;;;KAUlB,yBAAA;EAVV,oEAYA,UAAA,CAAW,SAAA,iBAZiB;EAc5B,eAAA,CAAgB,cAAA,iBAd6B;EAgB7C,YAAA,CAAa,OAAA,EAAS,UAAA,SANa;EAQnC,UAAA,CAAW,OAAA,EAAS,QAAA,SAFE;EAItB,UAAA,CAAW,OAAA,EAAS,QAAA;EAAA;;;;;;;EAQpB,WAAA,IAAe,oBAAA;EAgC0C;;;;;;EAzBzD,eAAA,CAAgB,OAAA,WAAkB,wBAAA;EAnBZ;;;;;;EA0BtB,eAAA,CAAgB,OAAA,EAAS,gBAAA,GAAmB,wBAAA,EAtBjC;EAwBX,OAAA,CAAQ,KAAA,EAAO,oBAAA;EAhBA;;;;;;EAuBf,KAAA,CAAM,MAAA,EAAQ,eAAA,SAT8B;EAW5C,KAAA;EATe;;;;;;EAgBf,YAAA,CAAa,QAAA,WAAmB,yBAAA;AAAA;;;AAAyB;AA2M3D;;;;;;iBAAgB,qBAAA,CACd,QAAA,GAAW,UAAA,EAAY,yBAAA,KAA8B,WAAA,gBACpD,eAAA;;;;;;;;iBAiCa,+BAAA,CAAA,aAA+B,eAAA,EAAA,yBAAA;AAA/C;;;;AAA+C;AAsB/C;;AAtBA,iBAsBgB,6BAAA,CACd,QAAA,GAAW,UAAA,EAAY,yBAAA,KAA8B,WAAA,gBAAwB,QAAA"}
|
|
@@ -1,195 +1,189 @@
|
|
|
1
1
|
import { AssistantStream } from "../AssistantStream.js";
|
|
2
|
+
import { promiseWithResolvers } from "../../utils/promiseWithResolvers.js";
|
|
2
3
|
import { createMergeStream } from "../utils/stream/merge.js";
|
|
3
4
|
import { createTextStreamController } from "./text.js";
|
|
4
|
-
import { createToolCallStreamController
|
|
5
|
+
import { createToolCallStreamController } from "./tool-call.js";
|
|
5
6
|
import { Counter } from "../utils/Counter.js";
|
|
6
|
-
import { PathAppendEncoder, PathMergeEncoder
|
|
7
|
+
import { PathAppendEncoder, PathMergeEncoder } from "../utils/stream/path-utils.js";
|
|
7
8
|
import { DataStreamEncoder } from "../serialization/data-stream/DataStream.js";
|
|
8
9
|
import { generateId } from "../utils/generateId.js";
|
|
9
|
-
|
|
10
|
-
class AssistantStreamControllerImpl {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
this._state.closeSubscriber?.();
|
|
132
|
-
}
|
|
133
|
-
}
|
|
10
|
+
//#region src/core/modules/assistant-stream.ts
|
|
11
|
+
var AssistantStreamControllerImpl = class AssistantStreamControllerImpl {
|
|
12
|
+
_state;
|
|
13
|
+
_parentId;
|
|
14
|
+
constructor(state) {
|
|
15
|
+
this._state = state || {
|
|
16
|
+
merger: createMergeStream(),
|
|
17
|
+
contentCounter: new Counter()
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
get __internal_isClosed() {
|
|
21
|
+
return this._state.merger.isSealed();
|
|
22
|
+
}
|
|
23
|
+
__internal_getReadable() {
|
|
24
|
+
return this._state.merger.readable;
|
|
25
|
+
}
|
|
26
|
+
__internal_subscribeToClose(callback) {
|
|
27
|
+
this._state.closeSubscriber = callback;
|
|
28
|
+
}
|
|
29
|
+
_addPart(part, stream) {
|
|
30
|
+
if (this._state.append) {
|
|
31
|
+
this._state.append.controller.close();
|
|
32
|
+
this._state.append = void 0;
|
|
33
|
+
}
|
|
34
|
+
this.enqueue({
|
|
35
|
+
type: "part-start",
|
|
36
|
+
part,
|
|
37
|
+
path: []
|
|
38
|
+
});
|
|
39
|
+
this._state.merger.addStream(stream.pipeThrough(new PathAppendEncoder(this._state.contentCounter.value)));
|
|
40
|
+
}
|
|
41
|
+
merge(stream) {
|
|
42
|
+
this._state.merger.addStream(stream.pipeThrough(new PathMergeEncoder(this._state.contentCounter)));
|
|
43
|
+
}
|
|
44
|
+
appendText(textDelta) {
|
|
45
|
+
if (this._state.append?.kind !== "text" || this._state.append.parentId !== this._parentId) this._state.append = {
|
|
46
|
+
kind: "text",
|
|
47
|
+
parentId: this._parentId,
|
|
48
|
+
controller: this.addTextPart()
|
|
49
|
+
};
|
|
50
|
+
this._state.append.controller.append(textDelta);
|
|
51
|
+
}
|
|
52
|
+
appendReasoning(textDelta) {
|
|
53
|
+
if (this._state.append?.kind !== "reasoning" || this._state.append.parentId !== this._parentId) this._state.append = {
|
|
54
|
+
kind: "reasoning",
|
|
55
|
+
parentId: this._parentId,
|
|
56
|
+
controller: this.addReasoningPart()
|
|
57
|
+
};
|
|
58
|
+
this._state.append.controller.append(textDelta);
|
|
59
|
+
}
|
|
60
|
+
addTextPart() {
|
|
61
|
+
const [stream, controller] = createTextStreamController();
|
|
62
|
+
this._addPart(this._withParentIdOption({ type: "text" }), stream);
|
|
63
|
+
return controller;
|
|
64
|
+
}
|
|
65
|
+
addReasoningPart() {
|
|
66
|
+
const [stream, controller] = createTextStreamController();
|
|
67
|
+
this._addPart(this._withParentIdOption({ type: "reasoning" }), stream);
|
|
68
|
+
return controller;
|
|
69
|
+
}
|
|
70
|
+
addToolCallPart(options) {
|
|
71
|
+
const opt = typeof options === "string" ? { toolName: options } : options;
|
|
72
|
+
const toolName = opt.toolName;
|
|
73
|
+
const toolCallId = opt.toolCallId ?? generateId();
|
|
74
|
+
const [stream, controller] = createToolCallStreamController();
|
|
75
|
+
this._addPart({
|
|
76
|
+
type: "tool-call",
|
|
77
|
+
toolName,
|
|
78
|
+
toolCallId,
|
|
79
|
+
...this._parentId && { parentId: this._parentId }
|
|
80
|
+
}, stream);
|
|
81
|
+
if (opt.argsText !== void 0) {
|
|
82
|
+
controller.argsText.append(opt.argsText);
|
|
83
|
+
controller.argsText.close();
|
|
84
|
+
}
|
|
85
|
+
if (opt.args !== void 0) {
|
|
86
|
+
controller.argsText.append(JSON.stringify(opt.args));
|
|
87
|
+
controller.argsText.close();
|
|
88
|
+
}
|
|
89
|
+
if (opt.response !== void 0) controller.setResponse(opt.response);
|
|
90
|
+
return controller;
|
|
91
|
+
}
|
|
92
|
+
_finishedPartStream() {
|
|
93
|
+
return new ReadableStream({ start(controller) {
|
|
94
|
+
controller.enqueue({
|
|
95
|
+
type: "part-finish",
|
|
96
|
+
path: []
|
|
97
|
+
});
|
|
98
|
+
controller.close();
|
|
99
|
+
} });
|
|
100
|
+
}
|
|
101
|
+
_withParentIdOption(options) {
|
|
102
|
+
if (!this._parentId) return options;
|
|
103
|
+
return {
|
|
104
|
+
...options,
|
|
105
|
+
parentId: this._parentId
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
appendSource(options) {
|
|
109
|
+
this._addPart(this._withParentIdOption(options), this._finishedPartStream());
|
|
110
|
+
}
|
|
111
|
+
appendFile(options) {
|
|
112
|
+
this._addPart(this._withParentIdOption(options), this._finishedPartStream());
|
|
113
|
+
}
|
|
114
|
+
appendData(options) {
|
|
115
|
+
this._addPart(this._withParentIdOption(options), this._finishedPartStream());
|
|
116
|
+
}
|
|
117
|
+
enqueue(chunk) {
|
|
118
|
+
this._state.merger.enqueue(chunk);
|
|
119
|
+
if (chunk.type === "part-start" && chunk.path.length === 0) this._state.contentCounter.up();
|
|
120
|
+
}
|
|
121
|
+
withParentId(parentId) {
|
|
122
|
+
const controller = new AssistantStreamControllerImpl(this._state);
|
|
123
|
+
controller._parentId = parentId;
|
|
124
|
+
return controller;
|
|
125
|
+
}
|
|
126
|
+
close() {
|
|
127
|
+
this._state.append?.controller?.close();
|
|
128
|
+
this._state.merger.seal();
|
|
129
|
+
this._state.closeSubscriber?.();
|
|
130
|
+
}
|
|
131
|
+
};
|
|
134
132
|
/**
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
controller.close();
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
};
|
|
165
|
-
runTask();
|
|
166
|
-
return controller.__internal_getReadable();
|
|
133
|
+
* Creates an {@link AssistantStream} and writes to it with an
|
|
134
|
+
* {@link AssistantStreamController}.
|
|
135
|
+
*
|
|
136
|
+
* The callback may write synchronously or asynchronously. If it throws, an
|
|
137
|
+
* `error` chunk is emitted before the error is rethrown; when the callback
|
|
138
|
+
* settles, the stream is closed automatically unless the controller was
|
|
139
|
+
* already closed.
|
|
140
|
+
*/
|
|
141
|
+
function createAssistantStream(callback) {
|
|
142
|
+
const controller = new AssistantStreamControllerImpl();
|
|
143
|
+
const runTask = async () => {
|
|
144
|
+
try {
|
|
145
|
+
await callback(controller);
|
|
146
|
+
} catch (e) {
|
|
147
|
+
if (!controller.__internal_isClosed) controller.enqueue({
|
|
148
|
+
type: "error",
|
|
149
|
+
path: [],
|
|
150
|
+
error: String(e)
|
|
151
|
+
});
|
|
152
|
+
throw e;
|
|
153
|
+
} finally {
|
|
154
|
+
if (!controller.__internal_isClosed) controller.close();
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
runTask();
|
|
158
|
+
return controller.__internal_getReadable();
|
|
167
159
|
}
|
|
168
160
|
/**
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
return [stream, controller];
|
|
161
|
+
* Creates an {@link AssistantStream} together with the controller used to
|
|
162
|
+
* write into it.
|
|
163
|
+
*
|
|
164
|
+
* Use this when the stream needs to be returned before all writers are known.
|
|
165
|
+
* Closing the returned controller finishes the paired stream.
|
|
166
|
+
*/
|
|
167
|
+
function createAssistantStreamController() {
|
|
168
|
+
const { resolve, promise } = promiseWithResolvers();
|
|
169
|
+
let controller;
|
|
170
|
+
return [createAssistantStream((c) => {
|
|
171
|
+
controller = c;
|
|
172
|
+
controller.__internal_subscribeToClose(resolve);
|
|
173
|
+
return promise;
|
|
174
|
+
}), controller];
|
|
184
175
|
}
|
|
185
176
|
/**
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
177
|
+
* Creates a `Response` whose body is an encoded {@link AssistantStream}.
|
|
178
|
+
*
|
|
179
|
+
* This is the HTTP-route convenience form of {@link createAssistantStream}; it
|
|
180
|
+
* uses {@link DataStreamEncoder} so the response can be consumed by matching
|
|
181
|
+
* assistant-ui data stream decoders.
|
|
182
|
+
*/
|
|
183
|
+
function createAssistantStreamResponse(callback) {
|
|
184
|
+
return AssistantStream.toResponse(createAssistantStream(callback), new DataStreamEncoder());
|
|
194
185
|
}
|
|
186
|
+
//#endregion
|
|
187
|
+
export { createAssistantStream, createAssistantStreamController, createAssistantStreamResponse };
|
|
188
|
+
|
|
195
189
|
//# sourceMappingURL=assistant-stream.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assistant-stream.js","sourceRoot":"","sources":["../../../src/core/modules/assistant-stream.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"assistant-stream.js","names":[],"sources":["../../../src/core/modules/assistant-stream.ts"],"sourcesContent":["import { AssistantStream } from \"../AssistantStream\";\nimport type { AssistantStreamChunk, PartInit } from \"../AssistantStreamChunk\";\nimport { createMergeStream } from \"../utils/stream/merge\";\nimport { createTextStreamController, type TextStreamController } from \"./text\";\nimport {\n createToolCallStreamController,\n type ToolCallStreamController,\n} from \"./tool-call\";\nimport { Counter } from \"../utils/Counter\";\nimport {\n PathAppendEncoder,\n PathMergeEncoder,\n} from \"../utils/stream/path-utils\";\nimport { DataStreamEncoder } from \"../serialization/data-stream/DataStream\";\nimport type { DataPart, FilePart, SourcePart } from \"../utils/types\";\nimport { generateId } from \"../utils/generateId\";\nimport type {\n ReadonlyJSONObject,\n ReadonlyJSONValue,\n} from \"../../utils/json/json-value\";\nimport type { ToolResponseLike } from \"../tool/ToolResponse\";\nimport { promiseWithResolvers } from \"../../utils/promiseWithResolvers\";\n\ntype ToolCallPartInit = {\n toolCallId?: string;\n toolName: string;\n argsText?: string;\n args?: ReadonlyJSONObject;\n response?: ToolResponseLike<ReadonlyJSONValue>;\n};\n\n/**\n * Imperative writer for constructing an {@link AssistantStream}.\n *\n * The controller handles part boundaries for common streaming operations. Use\n * `appendText` and `appendReasoning` for simple token streams, or open explicit\n * parts with `addTextPart` and `addToolCallPart` when you need direct control.\n */\nexport type AssistantStreamController = {\n /** Appends text to the current text part, opening one if needed. */\n appendText(textDelta: string): void;\n /** Appends reasoning text to the current reasoning part, opening one if needed. */\n appendReasoning(reasoningDelta: string): void;\n /** Appends a source citation part to the stream. */\n appendSource(options: SourcePart): void;\n /** Appends a file part to the stream. */\n appendFile(options: FilePart): void;\n /** Appends a named data part to the stream. */\n appendData(options: DataPart): void;\n /**\n * Opens a text part and returns its writer.\n *\n * Close the returned controller when the text part is complete. Opening a new\n * part through this controller closes any implicit text or reasoning append\n * part first.\n */\n addTextPart(): TextStreamController;\n /**\n * Opens a tool-call part by tool name and returns its writer.\n *\n * A tool call id is generated automatically. Use the object overload when the\n * caller already has an id, initial args, args text, or response.\n */\n addToolCallPart(options: string): ToolCallStreamController;\n /**\n * Opens a tool-call part and returns its writer.\n *\n * Use this overload to provide a stable `toolCallId`, initial arguments,\n * streamed argument text, or an immediate {@link ToolResponseLike}.\n */\n addToolCallPart(options: ToolCallPartInit): ToolCallStreamController;\n /** Enqueues a raw protocol chunk. Prefer higher-level helpers when possible. */\n enqueue(chunk: AssistantStreamChunk): void;\n /**\n * Merges another assistant stream into this stream.\n *\n * Paths from the merged stream are remapped so its parts appear at the next\n * available position in this controller's output.\n */\n merge(stream: AssistantStream): void;\n /** Closes any active part and finishes the stream. */\n close(): void;\n /**\n * Returns a controller that writes child parts with `parentId` attached.\n *\n * Use this for nested or related parts that should be associated with an\n * existing message or part in downstream renderers.\n */\n withParentId(parentId: string): AssistantStreamController;\n};\n\n// Shared state between controller instances\ntype AssistantStreamControllerState = {\n merger: ReturnType<typeof createMergeStream>;\n append?:\n | {\n controller: TextStreamController;\n kind: \"text\" | \"reasoning\";\n parentId: string | undefined;\n }\n | undefined;\n contentCounter: Counter;\n closeSubscriber?: () => void;\n};\n\nclass AssistantStreamControllerImpl implements AssistantStreamController {\n private readonly _state: AssistantStreamControllerState;\n private _parentId?: string;\n\n constructor(state?: AssistantStreamControllerState) {\n this._state = state || {\n merger: createMergeStream(),\n contentCounter: new Counter(),\n };\n }\n\n get __internal_isClosed() {\n return this._state.merger.isSealed();\n }\n\n __internal_getReadable() {\n return this._state.merger.readable;\n }\n\n __internal_subscribeToClose(callback: () => void) {\n this._state.closeSubscriber = callback;\n }\n\n private _addPart(part: PartInit, stream: AssistantStream) {\n if (this._state.append) {\n this._state.append.controller.close();\n this._state.append = undefined;\n }\n\n this.enqueue({\n type: \"part-start\",\n part,\n path: [],\n });\n this._state.merger.addStream(\n stream.pipeThrough(\n new PathAppendEncoder(this._state.contentCounter.value),\n ),\n );\n }\n\n merge(stream: AssistantStream) {\n this._state.merger.addStream(\n stream.pipeThrough(new PathMergeEncoder(this._state.contentCounter)),\n );\n }\n\n appendText(textDelta: string) {\n if (\n this._state.append?.kind !== \"text\" ||\n this._state.append.parentId !== this._parentId\n ) {\n this._state.append = {\n kind: \"text\",\n parentId: this._parentId,\n controller: this.addTextPart(),\n };\n }\n this._state.append.controller.append(textDelta);\n }\n\n appendReasoning(textDelta: string) {\n if (\n this._state.append?.kind !== \"reasoning\" ||\n this._state.append.parentId !== this._parentId\n ) {\n this._state.append = {\n kind: \"reasoning\",\n parentId: this._parentId,\n controller: this.addReasoningPart(),\n };\n }\n this._state.append.controller.append(textDelta);\n }\n\n addTextPart() {\n const [stream, controller] = createTextStreamController();\n this._addPart(this._withParentIdOption({ type: \"text\" }), stream);\n return controller;\n }\n\n addReasoningPart() {\n const [stream, controller] = createTextStreamController();\n this._addPart(this._withParentIdOption({ type: \"reasoning\" }), stream);\n return controller;\n }\n\n addToolCallPart(\n options: string | ToolCallPartInit,\n ): ToolCallStreamController {\n const opt = typeof options === \"string\" ? { toolName: options } : options;\n const toolName = opt.toolName;\n const toolCallId = opt.toolCallId ?? generateId();\n\n const [stream, controller] = createToolCallStreamController();\n this._addPart(\n {\n type: \"tool-call\",\n toolName,\n toolCallId,\n ...(this._parentId && { parentId: this._parentId }),\n },\n stream,\n );\n\n if (opt.argsText !== undefined) {\n controller.argsText.append(opt.argsText);\n controller.argsText.close();\n }\n if (opt.args !== undefined) {\n controller.argsText.append(JSON.stringify(opt.args));\n controller.argsText.close();\n }\n if (opt.response !== undefined) {\n controller.setResponse(opt.response);\n }\n\n return controller;\n }\n\n private _finishedPartStream(): AssistantStream {\n return new ReadableStream({\n start(controller) {\n controller.enqueue({ type: \"part-finish\", path: [] });\n controller.close();\n },\n });\n }\n\n private _withParentIdOption<T>(options: T): T {\n if (!this._parentId) return options;\n return { ...options, parentId: this._parentId };\n }\n\n appendSource(options: SourcePart) {\n this._addPart(\n this._withParentIdOption(options),\n this._finishedPartStream(),\n );\n }\n\n appendFile(options: FilePart) {\n this._addPart(\n this._withParentIdOption(options),\n this._finishedPartStream(),\n );\n }\n\n appendData(options: DataPart) {\n this._addPart(\n this._withParentIdOption(options),\n this._finishedPartStream(),\n );\n }\n\n enqueue(chunk: AssistantStreamChunk) {\n this._state.merger.enqueue(chunk);\n\n if (chunk.type === \"part-start\" && chunk.path.length === 0) {\n this._state.contentCounter.up();\n }\n }\n\n withParentId(parentId: string): AssistantStreamController {\n const controller = new AssistantStreamControllerImpl(this._state);\n controller._parentId = parentId;\n return controller;\n }\n\n close() {\n this._state.append?.controller?.close();\n this._state.merger.seal();\n\n this._state.closeSubscriber?.();\n }\n}\n\n/**\n * Creates an {@link AssistantStream} and writes to it with an\n * {@link AssistantStreamController}.\n *\n * The callback may write synchronously or asynchronously. If it throws, an\n * `error` chunk is emitted before the error is rethrown; when the callback\n * settles, the stream is closed automatically unless the controller was\n * already closed.\n */\nexport function createAssistantStream(\n callback: (controller: AssistantStreamController) => PromiseLike<void> | void,\n): AssistantStream {\n const controller = new AssistantStreamControllerImpl();\n\n const runTask = async () => {\n try {\n await callback(controller);\n } catch (e) {\n if (!controller.__internal_isClosed) {\n controller.enqueue({\n type: \"error\",\n path: [],\n error: String(e),\n });\n }\n throw e;\n } finally {\n if (!controller.__internal_isClosed) {\n controller.close();\n }\n }\n };\n runTask();\n\n return controller.__internal_getReadable();\n}\n\n/**\n * Creates an {@link AssistantStream} together with the controller used to\n * write into it.\n *\n * Use this when the stream needs to be returned before all writers are known.\n * Closing the returned controller finishes the paired stream.\n */\nexport function createAssistantStreamController() {\n const { resolve, promise } = promiseWithResolvers<void>();\n let controller!: AssistantStreamController;\n const stream = createAssistantStream((c) => {\n controller = c;\n\n (controller as AssistantStreamControllerImpl).__internal_subscribeToClose(\n resolve,\n );\n\n return promise;\n });\n return [stream, controller] as const;\n}\n\n/**\n * Creates a `Response` whose body is an encoded {@link AssistantStream}.\n *\n * This is the HTTP-route convenience form of {@link createAssistantStream}; it\n * uses {@link DataStreamEncoder} so the response can be consumed by matching\n * assistant-ui data stream decoders.\n */\nexport function createAssistantStreamResponse(\n callback: (controller: AssistantStreamController) => PromiseLike<void> | void,\n) {\n return AssistantStream.toResponse(\n createAssistantStream(callback),\n new DataStreamEncoder(),\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,9 +1,13 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import { UnderlyingReadable } from "../utils/stream/UnderlyingReadable.js";
|
|
2
|
+
import { AssistantStream } from "../AssistantStream.js";
|
|
3
|
+
|
|
4
|
+
//#region src/core/modules/text.d.ts
|
|
5
|
+
type TextStreamController = {
|
|
6
|
+
append(textDelta: string): void;
|
|
7
|
+
close(): void;
|
|
6
8
|
};
|
|
7
|
-
|
|
8
|
-
|
|
9
|
+
declare const createTextStream: (readable: UnderlyingReadable<TextStreamController>) => AssistantStream;
|
|
10
|
+
declare const createTextStreamController: () => readonly [AssistantStream, TextStreamController];
|
|
11
|
+
//#endregion
|
|
12
|
+
export { TextStreamController, createTextStream, createTextStreamController };
|
|
9
13
|
//# sourceMappingURL=text.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.d.ts","
|
|
1
|
+
{"version":3,"file":"text.d.ts","names":[],"sources":["../../../src/core/modules/text.ts"],"mappings":";;;;KAIY,oBAAA;EACV,MAAA,CAAO,SAAA;EACP,KAAA;AAAA;AAAA,cAiCW,gBAAA,GACX,QAAA,EAAU,kBAAA,CAAmB,oBAAA,MAC5B,eAAA;AAAA,cAcU,0BAAA,kBAA0B,eAAA,EAAA,oBAAA"}
|