assistant-stream 0.3.25 → 0.3.27

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.
Files changed (216) hide show
  1. package/README.md +4 -1
  2. package/dist/core/AssistantStream.d.ts +0 -1
  3. package/dist/core/AssistantStream.d.ts.map +1 -1
  4. package/dist/core/AssistantStreamChunk.d.ts +26 -14
  5. package/dist/core/AssistantStreamChunk.d.ts.map +1 -1
  6. package/dist/core/accumulators/AssistantMessageStream.d.ts +0 -1
  7. package/dist/core/accumulators/AssistantMessageStream.d.ts.map +1 -1
  8. package/dist/core/accumulators/TimingTracker.d.ts +0 -1
  9. package/dist/core/accumulators/TimingTracker.d.ts.map +1 -1
  10. package/dist/core/accumulators/assistant-message-accumulator.d.ts +3 -9
  11. package/dist/core/accumulators/assistant-message-accumulator.d.ts.map +1 -1
  12. package/dist/core/accumulators/assistant-message-accumulator.js +70 -28
  13. package/dist/core/accumulators/assistant-message-accumulator.js.map +1 -1
  14. package/dist/core/converters/toGenericMessages.d.ts.map +1 -1
  15. package/dist/core/converters/toGenericMessages.js +2 -1
  16. package/dist/core/converters/toGenericMessages.js.map +1 -1
  17. package/dist/core/gorp/GorpStreamAccumulator.d.ts +15 -0
  18. package/dist/core/gorp/GorpStreamAccumulator.d.ts.map +1 -0
  19. package/dist/core/{object/ObjectStreamAccumulator.js → gorp/GorpStreamAccumulator.js} +11 -9
  20. package/dist/core/gorp/GorpStreamAccumulator.js.map +1 -0
  21. package/dist/core/gorp/GorpStreamDeltaTracker.d.ts +17 -0
  22. package/dist/core/gorp/GorpStreamDeltaTracker.d.ts.map +1 -0
  23. package/dist/core/gorp/GorpStreamDeltaTracker.js +38 -0
  24. package/dist/core/gorp/GorpStreamDeltaTracker.js.map +1 -0
  25. package/dist/core/gorp/GorpStreamResponse.d.ts +16 -0
  26. package/dist/core/gorp/GorpStreamResponse.d.ts.map +1 -0
  27. package/dist/core/gorp/GorpStreamResponse.js +51 -0
  28. package/dist/core/gorp/GorpStreamResponse.js.map +1 -0
  29. package/dist/core/gorp/changeTree.d.ts +16 -0
  30. package/dist/core/gorp/changeTree.d.ts.map +1 -0
  31. package/dist/core/gorp/changeTree.js +77 -0
  32. package/dist/core/gorp/changeTree.js.map +1 -0
  33. package/dist/core/gorp/createGorpStream.d.ts +16 -0
  34. package/dist/core/gorp/createGorpStream.d.ts.map +1 -0
  35. package/dist/core/{object/createObjectStream.js → gorp/createGorpStream.js} +13 -8
  36. package/dist/core/gorp/createGorpStream.js.map +1 -0
  37. package/dist/core/gorp/types.d.ts +20 -0
  38. package/dist/core/gorp/types.d.ts.map +1 -0
  39. package/dist/core/modules/assistant-stream.d.ts +18 -11
  40. package/dist/core/modules/assistant-stream.d.ts.map +1 -1
  41. package/dist/core/modules/assistant-stream.js +10 -6
  42. package/dist/core/modules/assistant-stream.js.map +1 -1
  43. package/dist/core/modules/text.d.ts +0 -1
  44. package/dist/core/modules/text.d.ts.map +1 -1
  45. package/dist/core/modules/tool-call.d.ts +0 -1
  46. package/dist/core/modules/tool-call.d.ts.map +1 -1
  47. package/dist/core/modules/tool-call.js +2 -2
  48. package/dist/core/modules/tool-call.js.map +1 -1
  49. package/dist/core/serialization/PlainText.d.ts +0 -1
  50. package/dist/core/serialization/PlainText.d.ts.map +1 -1
  51. package/dist/core/serialization/assistant-transport/AssistantTransport.d.ts +0 -1
  52. package/dist/core/serialization/assistant-transport/AssistantTransport.d.ts.map +1 -1
  53. package/dist/core/serialization/assistant-transport/AssistantTransport.js +93 -53
  54. package/dist/core/serialization/assistant-transport/AssistantTransport.js.map +1 -1
  55. package/dist/core/serialization/data-stream/DataStream.d.ts +0 -1
  56. package/dist/core/serialization/data-stream/DataStream.d.ts.map +1 -1
  57. package/dist/core/serialization/data-stream/chunk-types.d.ts +3 -4
  58. package/dist/core/serialization/data-stream/chunk-types.d.ts.map +1 -1
  59. package/dist/core/serialization/data-stream/chunk-types.js.map +1 -1
  60. package/dist/core/serialization/data-stream/serialization.d.ts +0 -1
  61. package/dist/core/serialization/data-stream/serialization.d.ts.map +1 -1
  62. package/dist/core/serialization/ui-message-stream/UIMessageStream.d.ts +0 -1
  63. package/dist/core/serialization/ui-message-stream/UIMessageStream.d.ts.map +1 -1
  64. package/dist/core/serialization/ui-message-stream/UIMessageStream.js +76 -53
  65. package/dist/core/serialization/ui-message-stream/UIMessageStream.js.map +1 -1
  66. package/dist/core/serialization/ui-message-stream/chunk-types.d.ts +0 -1
  67. package/dist/core/serialization/ui-message-stream/chunk-types.d.ts.map +1 -1
  68. package/dist/core/tool/ToolCallReader.d.ts +1 -0
  69. package/dist/core/tool/ToolCallReader.d.ts.map +1 -1
  70. package/dist/core/tool/ToolCallReader.js.map +1 -1
  71. package/dist/core/tool/ToolExecutionStream.d.ts +0 -1
  72. package/dist/core/tool/ToolExecutionStream.d.ts.map +1 -1
  73. package/dist/core/tool/ToolExecutionStream.js +9 -1
  74. package/dist/core/tool/ToolExecutionStream.js.map +1 -1
  75. package/dist/core/tool/ToolResponse.d.ts +6 -4
  76. package/dist/core/tool/ToolResponse.d.ts.map +1 -1
  77. package/dist/core/tool/schema-utils.d.ts +0 -1
  78. package/dist/core/tool/schema-utils.d.ts.map +1 -1
  79. package/dist/core/tool/tool-types.d.ts +71 -33
  80. package/dist/core/tool/tool-types.d.ts.map +1 -1
  81. package/dist/core/tool/toolResultStream.d.ts +3 -2
  82. package/dist/core/tool/toolResultStream.d.ts.map +1 -1
  83. package/dist/core/tool/toolResultStream.js +7 -2
  84. package/dist/core/tool/toolResultStream.js.map +1 -1
  85. package/dist/core/tool/type-path-utils.d.ts +2 -2
  86. package/dist/core/tool/type-path-utils.d.ts.map +1 -1
  87. package/dist/core/utils/Counter.d.ts.map +1 -1
  88. package/dist/core/utils/generateId.d.ts.map +1 -1
  89. package/dist/core/utils/stream/AssistantMetaTransformStream.d.ts +0 -1
  90. package/dist/core/utils/stream/AssistantMetaTransformStream.d.ts.map +1 -1
  91. package/dist/core/utils/stream/AssistantTransformStream.d.ts +0 -1
  92. package/dist/core/utils/stream/AssistantTransformStream.d.ts.map +1 -1
  93. package/dist/core/utils/stream/LineDecoderStream.d.ts +1 -0
  94. package/dist/core/utils/stream/LineDecoderStream.d.ts.map +1 -1
  95. package/dist/core/utils/stream/LineDecoderStream.js +19 -6
  96. package/dist/core/utils/stream/LineDecoderStream.js.map +1 -1
  97. package/dist/core/utils/stream/PipeableTransformStream.d.ts.map +1 -1
  98. package/dist/core/utils/stream/SSE.d.ts +0 -1
  99. package/dist/core/utils/stream/SSE.d.ts.map +1 -1
  100. package/dist/core/utils/stream/SSE.js +2 -52
  101. package/dist/core/utils/stream/SSE.js.map +1 -1
  102. package/dist/core/utils/stream/SSEEventDecoder.d.ts +27 -0
  103. package/dist/core/utils/stream/SSEEventDecoder.d.ts.map +1 -0
  104. package/dist/core/utils/stream/SSEEventDecoder.js +84 -0
  105. package/dist/core/utils/stream/SSEEventDecoder.js.map +1 -0
  106. package/dist/core/utils/stream/SSEEventDecoderStream.d.ts +13 -0
  107. package/dist/core/utils/stream/SSEEventDecoderStream.d.ts.map +1 -0
  108. package/dist/core/utils/stream/SSEEventDecoderStream.js +24 -0
  109. package/dist/core/utils/stream/SSEEventDecoderStream.js.map +1 -0
  110. package/dist/core/utils/stream/UnderlyingReadable.d.ts.map +1 -1
  111. package/dist/core/utils/stream/merge.d.ts +2 -1
  112. package/dist/core/utils/stream/merge.d.ts.map +1 -1
  113. package/dist/core/utils/stream/merge.js +27 -8
  114. package/dist/core/utils/stream/merge.js.map +1 -1
  115. package/dist/core/utils/stream/path-utils.d.ts +0 -1
  116. package/dist/core/utils/stream/path-utils.d.ts.map +1 -1
  117. package/dist/core/utils/types.d.ts +16 -8
  118. package/dist/core/utils/types.d.ts.map +1 -1
  119. package/dist/core/utils/withPromiseOrValue.d.ts.map +1 -1
  120. package/dist/index.d.ts +25 -4
  121. package/dist/index.d.ts.map +1 -0
  122. package/dist/index.js +14 -3
  123. package/dist/index.js.map +1 -0
  124. package/dist/node_modules/.pnpm/@types_json-schema@7.0.15/node_modules/@types/json-schema/index.d.ts +3 -3
  125. package/dist/node_modules/.pnpm/@types_json-schema@7.0.15/node_modules/@types/json-schema/index.d.ts.map +1 -1
  126. package/dist/resumable/ResumableStreamContext.d.ts +0 -1
  127. package/dist/resumable/ResumableStreamContext.d.ts.map +1 -1
  128. package/dist/resumable/ResumableStreamContext.js +12 -5
  129. package/dist/resumable/ResumableStreamContext.js.map +1 -1
  130. package/dist/resumable/constants.d.ts.map +1 -1
  131. package/dist/resumable/createResumableAssistantStreamResponse.d.ts +6 -4
  132. package/dist/resumable/createResumableAssistantStreamResponse.d.ts.map +1 -1
  133. package/dist/resumable/errors.d.ts.map +1 -1
  134. package/dist/resumable/stores/InMemoryResumableStreamStore.d.ts +0 -1
  135. package/dist/resumable/stores/InMemoryResumableStreamStore.d.ts.map +1 -1
  136. package/dist/resumable/stores/InMemoryResumableStreamStore.js +2 -1
  137. package/dist/resumable/stores/InMemoryResumableStreamStore.js.map +1 -1
  138. package/dist/resumable/stores/ioredis.d.ts +0 -1
  139. package/dist/resumable/stores/ioredis.d.ts.map +1 -1
  140. package/dist/resumable/stores/redis-impl.d.ts +2 -2
  141. package/dist/resumable/stores/redis-impl.d.ts.map +1 -1
  142. package/dist/resumable/stores/redis.d.ts +0 -1
  143. package/dist/resumable/stores/redis.d.ts.map +1 -1
  144. package/dist/resumable/types.d.ts.map +1 -1
  145. package/dist/utils/AsyncIterableStream.d.ts.map +1 -1
  146. package/dist/utils/AsyncIterableStream.js +18 -3
  147. package/dist/utils/AsyncIterableStream.js.map +1 -1
  148. package/dist/utils/json/fix-json.d.ts.map +1 -1
  149. package/dist/utils/json/json-value.d.ts.map +1 -1
  150. package/dist/utils/json/parse-partial-json-object.d.ts +0 -1
  151. package/dist/utils/json/parse-partial-json-object.d.ts.map +1 -1
  152. package/dist/utils/promiseWithResolvers.d.ts.map +1 -1
  153. package/dist/utils.d.ts +2 -1
  154. package/dist/utils.js +2 -1
  155. package/package.json +5 -5
  156. package/src/core/AssistantStreamChunk.ts +5 -3
  157. package/src/core/accumulators/assistant-message-accumulator.test.ts +437 -1
  158. package/src/core/accumulators/assistant-message-accumulator.ts +89 -26
  159. package/src/core/{object/ObjectStream.test.ts → gorp/GorpStream.test.ts} +104 -23
  160. package/src/core/gorp/GorpStreamAccumulator.test.ts +28 -0
  161. package/src/core/{object/ObjectStreamAccumulator.ts → gorp/GorpStreamAccumulator.ts} +13 -15
  162. package/src/core/gorp/GorpStreamDeltaTracker.test.ts +182 -0
  163. package/src/core/gorp/GorpStreamDeltaTracker.ts +55 -0
  164. package/src/core/gorp/GorpStreamResponse.test.ts +32 -0
  165. package/src/core/gorp/GorpStreamResponse.ts +88 -0
  166. package/src/core/gorp/changeTree.test.ts +168 -0
  167. package/src/core/gorp/changeTree.ts +96 -0
  168. package/src/core/{object/createObjectStream.ts → gorp/createGorpStream.ts} +23 -17
  169. package/src/core/{object → gorp}/types.ts +5 -3
  170. package/src/core/modules/assistant-stream.test.ts +154 -2
  171. package/src/core/modules/assistant-stream.ts +16 -6
  172. package/src/core/modules/tool-call.test.ts +67 -0
  173. package/src/core/modules/tool-call.ts +3 -3
  174. package/src/core/serialization/assistant-transport/AssistantTransport.test.ts +215 -1
  175. package/src/core/serialization/assistant-transport/AssistantTransport.ts +83 -71
  176. package/src/core/serialization/data-stream/chunk-types.ts +2 -2
  177. package/src/core/serialization/ui-message-stream/UIMessageStream.test.ts +323 -4
  178. package/src/core/serialization/ui-message-stream/UIMessageStream.ts +81 -71
  179. package/src/core/tool/ToolExecutionStream.ts +10 -0
  180. package/src/core/tool/toolResultStream.test.ts +50 -0
  181. package/src/core/tool/toolResultStream.ts +7 -2
  182. package/src/core/utils/stream/LineDecoderStream.test.ts +26 -2
  183. package/src/core/utils/stream/LineDecoderStream.ts +21 -11
  184. package/src/core/utils/stream/SSE.ts +6 -70
  185. package/src/core/utils/stream/SSEEventDecoder.test.ts +146 -0
  186. package/src/core/utils/stream/SSEEventDecoder.ts +109 -0
  187. package/src/core/utils/stream/SSEEventDecoderStream.test.ts +42 -0
  188. package/src/core/utils/stream/SSEEventDecoderStream.ts +34 -0
  189. package/src/core/utils/stream/merge.ts +31 -9
  190. package/src/gorp.test.ts +42 -0
  191. package/src/index.ts +21 -6
  192. package/src/resumable/ResumableStreamContext.test.ts +116 -1
  193. package/src/resumable/ResumableStreamContext.ts +32 -5
  194. package/src/resumable/createResumableAssistantStreamResponse.test.ts +1 -25
  195. package/src/utils/AsyncIterableStream.test.ts +61 -0
  196. package/src/utils/AsyncIterableStream.ts +18 -3
  197. package/src/utils.ts +4 -0
  198. package/dist/core/object/ObjectStreamAccumulator.d.ts +0 -15
  199. package/dist/core/object/ObjectStreamAccumulator.d.ts.map +0 -1
  200. package/dist/core/object/ObjectStreamAccumulator.js.map +0 -1
  201. package/dist/core/object/ObjectStreamResponse.d.ts +0 -17
  202. package/dist/core/object/ObjectStreamResponse.d.ts.map +0 -1
  203. package/dist/core/object/ObjectStreamResponse.js +0 -57
  204. package/dist/core/object/ObjectStreamResponse.js.map +0 -1
  205. package/dist/core/object/createObjectStream.d.ts +0 -19
  206. package/dist/core/object/createObjectStream.d.ts.map +0 -1
  207. package/dist/core/object/createObjectStream.js.map +0 -1
  208. package/dist/core/object/types.d.ts +0 -18
  209. package/dist/core/object/types.d.ts.map +0 -1
  210. package/dist/utils/json/is-json.d.ts +0 -9
  211. package/dist/utils/json/is-json.d.ts.map +0 -1
  212. package/dist/utils/json/is-json.js +0 -17
  213. package/dist/utils/json/is-json.js.map +0 -1
  214. package/src/core/object/ObjectStreamResponse.ts +0 -109
  215. package/src/utils/json/is-json.ts +0 -43
  216. /package/dist/core/{object → gorp}/types.js +0 -0
@@ -2,20 +2,25 @@ import { AsyncIterableStream } from "../../utils/AsyncIterableStream.js";
2
2
  import { JSONSchema7 } from "../../node_modules/.pnpm/@types_json-schema@7.0.15/node_modules/@types/json-schema/index.js";
3
3
  import { DeepPartial, TypeAtPath, TypePath } from "./type-path-utils.js";
4
4
  import { ToolResponse } from "./ToolResponse.js";
5
+ import "../../utils.js";
5
6
  import { StandardSchemaV1 } from "@standard-schema/spec";
6
-
7
7
  //#region src/core/tool/tool-types.d.ts
8
8
  type ToolModelContentPart = {
9
- /** A text content part returned to the model after a tool call. */readonly type: "text"; /** Text that should be included in the model-visible tool result. */
9
+ /** A text content part returned to the model after a tool call. */
10
+ readonly type: "text";
11
+ /** Text that should be included in the model-visible tool result. */
10
12
  readonly text: string;
11
13
  } | {
12
- /** A file content part returned to the model after a tool call. */readonly type: "file";
14
+ /** A file content part returned to the model after a tool call. */
15
+ readonly type: "file";
13
16
  /**
14
17
  * File payload encoded as a provider-compatible string, commonly base64
15
18
  * for binary data.
16
19
  */
17
- readonly data: string; /** MIME type for the file payload. */
18
- readonly mediaType: string; /** Optional display filename for the file payload. */
20
+ readonly data: string;
21
+ /** MIME type for the file payload. */
22
+ readonly mediaType: string;
23
+ /** Optional display filename for the file payload. */
19
24
  readonly filename?: string;
20
25
  };
21
26
  /**
@@ -44,8 +49,11 @@ type ToolModelContentPart = {
44
49
  * ```
45
50
  */
46
51
  type ToolModelOutputFunction<TArgs, TResult> = (options: {
47
- /** Stable identifier for the tool call being converted. */toolCallId: string; /** Arguments supplied by the model for this tool call. */
48
- input: TArgs; /** Value returned by the tool's {@link ToolExecuteFunction}. */
52
+ /** Stable identifier for the tool call being converted. */
53
+ toolCallId: string;
54
+ /** Arguments supplied by the model for this tool call. */
55
+ input: TArgs;
56
+ /** Value returned by the tool's {@link ToolExecuteFunction}. */
49
57
  output: TResult;
50
58
  }) => readonly ToolModelContentPart[] | Promise<readonly ToolModelContentPart[]>;
51
59
  /**
@@ -101,7 +109,9 @@ interface ToolCallReader<TArgs extends Record<string, unknown> = Record<string,
101
109
  };
102
110
  }
103
111
  type ToolExecutionContext = {
104
- /** Stable identifier for the tool call being executed. */toolCallId: string; /** Signal that is aborted when the current run is cancelled. */
112
+ /** Stable identifier for the tool call being executed. */
113
+ toolCallId: string;
114
+ /** Signal that is aborted when the current run is cancelled. */
105
115
  abortSignal: AbortSignal;
106
116
  /**
107
117
  * From inside a frontend tool's execute function, request human input from
@@ -159,7 +169,8 @@ type ToolBase<TArgs extends Record<string, unknown> = Record<string, unknown>, T
159
169
  display?: ToolDisplay;
160
170
  };
161
171
  type BackendTool<TArgs extends Record<string, unknown> = Record<string, unknown>, TResult = unknown> = ToolBase<TArgs, TResult> & {
162
- /** Tool that is executed by the backend rather than in the browser. */type: "backend";
172
+ /** Tool that is executed by the backend rather than in the browser. */
173
+ type: "backend";
163
174
  description?: undefined;
164
175
  parameters?: undefined;
165
176
  disabled?: undefined;
@@ -176,30 +187,48 @@ type BackendTool<TArgs extends Record<string, unknown> = Record<string, unknown>
176
187
  * server adapter rather than the shared {@link Tool} shape.
177
188
  */
178
189
  type BackendToolDeclaration<TArgs extends Record<string, unknown> = Record<string, unknown>, TResult = unknown> = ToolBase<TArgs, TResult> & {
179
- type: "backend"; /** Natural-language description shown to the model when selecting tools. */
180
- description?: string | undefined; /** Schema for the arguments the model must provide when calling the tool. */
181
- parameters?: StandardSchemaV1<TArgs> | JSONSchema7 | undefined; /** Prevents the tool from being exposed to the model while true. */
182
- disabled?: boolean; /** Executes the tool on the server after the model provides valid arguments. */
183
- execute?: ToolExecuteFunction<TArgs, TResult>; /** Converts the execution result into model-visible output. */
184
- toModelOutput?: ToolModelOutputFunction<TArgs, TResult>; /** Handles invalid tool arguments when schema validation fails. */
190
+ type: "backend";
191
+ /** Natural-language description shown to the model when selecting tools. */
192
+ description?: string | undefined;
193
+ /** Schema for the arguments the model must provide when calling the tool. */
194
+ parameters?: StandardSchemaV1<TArgs> | JSONSchema7 | undefined;
195
+ /** Prevents the tool from being exposed to the model while true. */
196
+ disabled?: boolean;
197
+ /** Executes the tool on the server after the model provides valid arguments. */
198
+ execute?: ToolExecuteFunction<TArgs, TResult>;
199
+ /** Converts the execution result into model-visible output. */
200
+ toModelOutput?: ToolModelOutputFunction<TArgs, TResult>;
201
+ /** Handles invalid tool arguments when schema validation fails. */
185
202
  experimental_onSchemaValidationError?: OnSchemaValidationErrorFunction<TResult>;
186
203
  providerOptions?: ProviderOptions;
187
204
  };
188
205
  type FrontendTool<TArgs extends Record<string, unknown> = Record<string, unknown>, TResult = unknown> = ToolBase<TArgs, TResult> & {
189
- /** Tool that is executed in the frontend runtime. */type: "frontend"; /** Natural-language description shown to the model when selecting tools. */
190
- description?: string | undefined; /** Schema for the arguments the model must provide when calling the tool. */
191
- parameters: StandardSchemaV1<TArgs> | JSONSchema7; /** Prevents the tool from being exposed to the model while true. */
192
- disabled?: boolean; /** Executes the tool after the model provides valid arguments. */
193
- execute?: ToolExecuteFunction<TArgs, TResult>; /** Converts the execution result into model-visible output. */
194
- toModelOutput?: ToolModelOutputFunction<TArgs, TResult>; /** Handles invalid tool arguments when schema validation fails. */
206
+ /** Tool that is executed in the frontend runtime. */
207
+ type: "frontend";
208
+ /** Natural-language description shown to the model when selecting tools. */
209
+ description?: string | undefined;
210
+ /** Schema for the arguments the model must provide when calling the tool. */
211
+ parameters: StandardSchemaV1<TArgs> | JSONSchema7;
212
+ /** Prevents the tool from being exposed to the model while true. */
213
+ disabled?: boolean;
214
+ /** Executes the tool after the model provides valid arguments. */
215
+ execute?: ToolExecuteFunction<TArgs, TResult>;
216
+ /** Converts the execution result into model-visible output. */
217
+ toModelOutput?: ToolModelOutputFunction<TArgs, TResult>;
218
+ /** Handles invalid tool arguments when schema validation fails. */
195
219
  experimental_onSchemaValidationError?: OnSchemaValidationErrorFunction<TResult>;
196
220
  providerOptions?: ProviderOptions;
197
221
  };
198
222
  type HumanTool<TArgs extends Record<string, unknown> = Record<string, unknown>, TResult = unknown> = ToolBase<TArgs, TResult> & {
199
- /** Tool that pauses the run until a user or UI supplies a result. */type: "human"; /** Natural-language description shown to the model when selecting tools. */
200
- description?: string | undefined; /** Schema for the arguments the model must provide when requesting input. */
201
- parameters: StandardSchemaV1<TArgs> | JSONSchema7; /** Prevents the tool from being exposed to the model while true. */
202
- disabled?: boolean; /** Human tools are always surfaced standalone and cannot opt out. */
223
+ /** Tool that pauses the run until a user or UI supplies a result. */
224
+ type: "human";
225
+ /** Natural-language description shown to the model when selecting tools. */
226
+ description?: string | undefined;
227
+ /** Schema for the arguments the model must provide when requesting input. */
228
+ parameters: StandardSchemaV1<TArgs> | JSONSchema7;
229
+ /** Prevents the tool from being exposed to the model while true. */
230
+ disabled?: boolean;
231
+ /** Human tools are always surfaced standalone and cannot opt out. */
203
232
  display?: "standalone";
204
233
  execute?: undefined;
205
234
  toModelOutput?: undefined;
@@ -207,9 +236,13 @@ type HumanTool<TArgs extends Record<string, unknown> = Record<string, unknown>,
207
236
  providerOptions?: ProviderOptions;
208
237
  };
209
238
  type ProviderTool<TArgs extends Record<string, unknown> = Record<string, unknown>, TResult = unknown> = ToolBase<TArgs, TResult> & {
210
- /** Tool executed by the LLM provider rather than assistant-ui. */type: "provider"; /** Provider-defined tool identifier, e.g. `openai.web_search_preview`. */
211
- providerId: `${string}.${string}`; /** Schema used by adapters for validation and type plumbing. */
212
- parameters?: StandardSchemaV1<TArgs> | JSONSchema7 | undefined; /** Provider-specific configuration for this tool. */
239
+ /** Tool executed by the LLM provider rather than assistant-ui. */
240
+ type: "provider";
241
+ /** Provider-defined tool identifier, e.g. `openai.web_search_preview`. */
242
+ providerId: `${string}.${string}`;
243
+ /** Schema used by adapters for validation and type plumbing. */
244
+ parameters?: StandardSchemaV1<TArgs> | JSONSchema7 | undefined;
245
+ /** Provider-specific configuration for this tool. */
213
246
  args: Record<string, unknown>;
214
247
  /**
215
248
  * Whether provider results may arrive after the originating response turn.
@@ -223,21 +256,26 @@ type ProviderTool<TArgs extends Record<string, unknown> = Record<string, unknown
223
256
  providerOptions?: ProviderOptions;
224
257
  };
225
258
  type McpServerConfig = {
226
- /** Connect to an MCP server over Streamable HTTP or server-sent events. */type: "http" | "sse";
259
+ /** Connect to an MCP server over Streamable HTTP or server-sent events. */
260
+ type: "http" | "sse";
227
261
  url: string;
228
262
  headers?: Record<string, string>;
229
- redirect?: "follow" | "error"; /** Optional timeout in milliseconds for client creation and tool listing. */
263
+ redirect?: "follow" | "error";
264
+ /** Optional timeout in milliseconds for client creation and tool listing. */
230
265
  connectionTimeout?: number | undefined;
231
266
  } | {
232
- /** Start and connect to a local MCP server over stdio. */type: "stdio";
267
+ /** Start and connect to a local MCP server over stdio. */
268
+ type: "stdio";
233
269
  command: string;
234
270
  args?: readonly string[];
235
271
  env?: Record<string, string>;
236
- cwd?: string; /** Optional timeout in milliseconds for client creation and tool listing. */
272
+ cwd?: string;
273
+ /** Optional timeout in milliseconds for client creation and tool listing. */
237
274
  connectionTimeout?: number | undefined;
238
275
  };
239
276
  type McpTool = ToolBase<Record<string, unknown>, unknown> & {
240
- /** Tools loaded from an MCP server by a server adapter. */type: "mcp";
277
+ /** Tools loaded from an MCP server by a server adapter. */
278
+ type: "mcp";
241
279
  server: McpServerConfig;
242
280
  description?: undefined;
243
281
  parameters?: undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"tool-types.d.ts","names":[],"sources":["../../../src/core/tool/tool-types.ts"],"mappings":"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"}
1
+ {"version":3,"file":"tool-types.d.ts","names":[],"sources":["../../../src/core/tool/tool-types.ts"],"mappings":"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"}
@@ -1,11 +1,12 @@
1
1
  import { Tool } from "./tool-types.js";
2
2
  import { AssistantMessage } from "../utils/types.js";
3
3
  import { ToolExecutionStream } from "./ToolExecutionStream.js";
4
-
5
4
  //#region src/core/tool/toolResultStream.d.ts
6
5
  declare function unstable_runPendingTools(message: AssistantMessage, tools: Record<string, Tool> | undefined, abortSignal: AbortSignal, human: (toolCallId: string, payload: unknown) => Promise<unknown>): Promise<AssistantMessage>;
7
6
  type ToolResultStreamOptions = {
8
- /** Called immediately before a frontend tool's `execute` function runs. */onExecutionStart?: (toolCallId: string, toolName: string) => void; /** Called after frontend tool execution finishes or fails. */
7
+ /** Called immediately before a frontend tool's `execute` function runs. */
8
+ onExecutionStart?: (toolCallId: string, toolName: string) => void;
9
+ /** Called after frontend tool execution finishes or fails. */
9
10
  onExecutionEnd?: (toolCallId: string, toolName: string) => void;
10
11
  };
11
12
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"toolResultStream.d.ts","names":[],"sources":["../../../src/core/tool/toolResultStream.ts"],"mappings":";;;;;iBA6IsB,wBAAA,CACpB,OAAA,EAAS,gBAAA,EACT,KAAA,EAAO,MAAA,SAAe,IAAA,eACtB,WAAA,EAAa,WAAA,EACb,KAAA,GAAQ,UAAA,UAAoB,OAAA,cAAqB,OAAA,YAAgB,OAAA,CAAA,gBAAA;AAAA,KAsEvD,uBAAA;EA1EU,2EA4EpB,gBAAA,IAAoB,UAAA,UAAoB,QAAA;EAExC,cAAA,IAAkB,UAAA,UAAoB,QAAA;AAAA;;;;;;;;;;;;;;iBAgBxB,gBAAA,CACd,KAAA,EACI,MAAA,SAAe,IAAA,WACR,MAAA,SAAe,IAAA,4BAE1B,WAAA,EAAa,WAAA,UAAqB,WAAA,GAClC,KAAA,GAAQ,UAAA,UAAoB,OAAA,cAAqB,OAAA,WACjD,OAAA,GAAU,uBAAA,GAAuB,mBAAA"}
1
+ {"version":3,"file":"toolResultStream.d.ts","names":[],"sources":["../../../src/core/tool/toolResultStream.ts"],"mappings":";;;;iBAkJsB,yBACpB,SAAS,kBACT,OAAO,eAAe,mBACtB,aAAa,aACb,QAAQ,oBAAoB,qBAAqB,mBAAgB,QAAA;KAsEvD;;EAEV,oBAAoB,oBAAoB;;EAExC,kBAAkB,oBAAoB;;;;;;;;;;;;;;;iBAgBxB,iBACd,OACI,eAAe,eACR,eAAe,gCAE1B,aAAa,qBAAqB,cAClC,QAAQ,oBAAoB,qBAAqB,kBACjD,UAAU,0BAAuB"}
@@ -20,8 +20,9 @@ function getToolResponse(tools, abortSignal, toolCall, human) {
20
20
  throw new Error(`Function parameter validation failed. ${JSON.stringify(result.issues)}`);
21
21
  });
22
22
  }
23
+ let onAbort;
23
24
  const abortPromise = new Promise((resolve) => {
24
- const onAbort = () => {
25
+ onAbort = () => {
25
26
  queueMicrotask(() => {
26
27
  queueMicrotask(() => {
27
28
  resolve(new ToolResponse({
@@ -59,7 +60,11 @@ function getToolResponse(tools, abortSignal, toolCall, human) {
59
60
  }
60
61
  return response;
61
62
  })();
62
- return Promise.race([executePromise, abortPromise]);
63
+ try {
64
+ return await Promise.race([executePromise, abortPromise]);
65
+ } finally {
66
+ abortSignal.removeEventListener("abort", onAbort);
67
+ }
63
68
  };
64
69
  return getResult(tool.execute);
65
70
  }
@@ -1 +1 @@
1
- {"version":3,"file":"toolResultStream.js","names":[],"sources":["../../../src/core/tool/toolResultStream.ts"],"sourcesContent":["import type { Tool, ToolCallReader, ToolExecuteFunction } from \"./tool-types\";\nimport type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport { ToolResponse } from \"./ToolResponse\";\nimport { ToolExecutionStream } from \"./ToolExecutionStream\";\nimport type { AssistantMessage } from \"../utils/types\";\nimport type { ReadonlyJSONObject, ReadonlyJSONValue } from \"../../utils\";\n\nconst isStandardSchemaV1 = (\n schema: unknown,\n): schema is StandardSchemaV1<unknown> => {\n return (\n typeof schema === \"object\" &&\n schema !== null &&\n \"~standard\" in schema &&\n (schema as StandardSchemaV1<unknown>)[\"~standard\"].version === 1\n );\n};\n\nfunction getToolResponse(\n tools: Record<string, Tool> | undefined,\n abortSignal: AbortSignal,\n toolCall: {\n toolCallId: string;\n toolName: string;\n args: ReadonlyJSONObject;\n },\n human: (toolCallId: string, payload: unknown) => Promise<unknown>,\n) {\n const tool = tools?.[toolCall.toolName];\n if (!tool?.execute) return undefined;\n\n const getResult = async (\n toolExecute: ToolExecuteFunction<ReadonlyJSONObject, unknown>,\n ): Promise<ToolResponse<ReadonlyJSONValue>> => {\n // Check if already aborted before starting\n if (abortSignal.aborted) {\n return new ToolResponse({\n result: \"Tool execution was cancelled.\",\n isError: true,\n });\n }\n\n let executeFn = toolExecute;\n\n if (isStandardSchemaV1(tool.parameters)) {\n let result = tool.parameters[\"~standard\"].validate(toolCall.args);\n if (result instanceof Promise) result = await result;\n\n if (result.issues) {\n executeFn =\n tool.experimental_onSchemaValidationError ??\n (() => {\n throw new Error(\n `Function parameter validation failed. ${JSON.stringify(result.issues)}`,\n );\n });\n }\n }\n\n // Create abort promise that resolves after 2 microtasks\n // This gives tools that handle abort a chance to win the race\n const abortPromise = new Promise<ToolResponse<ReadonlyJSONValue>>(\n (resolve) => {\n const onAbort = () => {\n queueMicrotask(() => {\n queueMicrotask(() => {\n resolve(\n new ToolResponse({\n result: \"Tool execution was cancelled.\",\n isError: true,\n }),\n );\n });\n });\n };\n if (abortSignal.aborted) {\n onAbort();\n } else {\n abortSignal.addEventListener(\"abort\", onAbort, { once: true });\n }\n },\n );\n\n const executePromise = (async () => {\n const result = (await executeFn(toolCall.args, {\n toolCallId: toolCall.toolCallId,\n abortSignal,\n human: (payload: unknown) => human(toolCall.toolCallId, payload),\n })) as unknown as ReadonlyJSONValue;\n const response = ToolResponse.toResponse(result);\n if (\n tool.toModelOutput &&\n !response.isError &&\n response.modelContent === undefined\n ) {\n try {\n const modelContent = await tool.toModelOutput({\n toolCallId: toolCall.toolCallId,\n input: toolCall.args,\n output: response.result,\n });\n return new ToolResponse({\n result: response.result,\n artifact: response.artifact,\n isError: response.isError,\n messages: response.messages,\n modelContent,\n });\n } catch (e) {\n console.warn(\n `[assistant-stream] tool \"${toolCall.toolName}\" toModelOutput threw; falling back to default projection.`,\n e,\n );\n }\n }\n return response;\n })();\n\n return Promise.race([executePromise, abortPromise]);\n };\n\n return getResult(tool.execute);\n}\n\nfunction getToolStreamResponse(\n tools: Record<string, Tool> | undefined,\n abortSignal: AbortSignal,\n reader: ToolCallReader<any, ReadonlyJSONValue>,\n context: {\n toolCallId: string;\n toolName: string;\n },\n human: (toolCallId: string, payload: unknown) => Promise<unknown>,\n) {\n tools?.[context.toolName]?.streamCall?.(reader, {\n toolCallId: context.toolCallId,\n abortSignal,\n human: (payload: unknown) => human(context.toolCallId, payload),\n });\n}\n\nexport async function unstable_runPendingTools(\n message: AssistantMessage,\n tools: Record<string, Tool> | undefined,\n abortSignal: AbortSignal,\n human: (toolCallId: string, payload: unknown) => Promise<unknown>,\n) {\n const toolCallPromises = message.parts\n .filter((part) => part.type === \"tool-call\")\n .map(async (part) => {\n const promiseOrUndefined = getToolResponse(\n tools,\n abortSignal,\n part,\n human ??\n (async () => {\n throw new Error(\n \"Tool human input is not supported in this context\",\n );\n }),\n );\n if (promiseOrUndefined) {\n const result = await promiseOrUndefined;\n return {\n toolCallId: part.toolCallId,\n result,\n };\n }\n return null;\n });\n\n const toolCallResults = (await Promise.all(toolCallPromises)).filter(\n (result) => result !== null,\n ) as { toolCallId: string; result: ToolResponse<ReadonlyJSONValue> }[];\n\n if (toolCallResults.length === 0) {\n return message;\n }\n\n const toolCallResultsById = toolCallResults.reduce(\n (acc, { toolCallId, result }) => {\n acc[toolCallId] = result;\n return acc;\n },\n {} as Record<string, ToolResponse<ReadonlyJSONValue>>,\n );\n\n const updatedParts = message.parts.map((p) => {\n if (p.type === \"tool-call\") {\n const toolResponse = toolCallResultsById[p.toolCallId];\n if (toolResponse) {\n return {\n ...p,\n state: \"result\" as const,\n ...(toolResponse.artifact !== undefined\n ? { artifact: toolResponse.artifact }\n : {}),\n ...(toolResponse.modelContent !== undefined\n ? { modelContent: toolResponse.modelContent }\n : {}),\n result: toolResponse.result as ReadonlyJSONValue,\n isError: toolResponse.isError,\n };\n }\n }\n return p;\n });\n\n return {\n ...message,\n parts: updatedParts,\n content: updatedParts,\n };\n}\n\nexport type ToolResultStreamOptions = {\n /** Called immediately before a frontend tool's `execute` function runs. */\n onExecutionStart?: (toolCallId: string, toolName: string) => void;\n /** Called after frontend tool execution finishes or fails. */\n onExecutionEnd?: (toolCallId: string, toolName: string) => void;\n};\n\n/**\n * Transform stream that executes frontend tools and appends tool results.\n *\n * The transform watches streamed tool-call arguments, runs the matching\n * frontend tool once its arguments are complete, and emits a result chunk for\n * the tool call. Backend and human tools pass through according to their tool\n * definition.\n *\n * @param tools Tool registry or function returning the current registry.\n * @param abortSignal Signal, or signal getter, used for the current run.\n * @param human Callback used to resolve human-tool requests from UI input.\n * @param options Optional execution lifecycle callbacks.\n */\nexport function toolResultStream(\n tools:\n | Record<string, Tool>\n | (() => Record<string, Tool> | undefined)\n | undefined,\n abortSignal: AbortSignal | (() => AbortSignal),\n human: (toolCallId: string, payload: unknown) => Promise<unknown>,\n options?: ToolResultStreamOptions,\n) {\n const toolsFn = typeof tools === \"function\" ? tools : () => tools;\n const abortSignalFn =\n typeof abortSignal === \"function\" ? abortSignal : () => abortSignal;\n return new ToolExecutionStream({\n execute: (toolCall) =>\n getToolResponse(toolsFn(), abortSignalFn(), toolCall, human),\n streamCall: ({ reader, ...context }) =>\n getToolStreamResponse(toolsFn(), abortSignalFn(), reader, context, human),\n onExecutionStart: options?.onExecutionStart,\n onExecutionEnd: options?.onExecutionEnd,\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"toolResultStream.js","names":[],"sources":["../../../src/core/tool/toolResultStream.ts"],"sourcesContent":["import type { Tool, ToolCallReader, ToolExecuteFunction } from \"./tool-types\";\nimport type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport { ToolResponse } from \"./ToolResponse\";\nimport { ToolExecutionStream } from \"./ToolExecutionStream\";\nimport type { AssistantMessage } from \"../utils/types\";\nimport type { ReadonlyJSONObject, ReadonlyJSONValue } from \"../../utils\";\n\nconst isStandardSchemaV1 = (\n schema: unknown,\n): schema is StandardSchemaV1<unknown> => {\n return (\n typeof schema === \"object\" &&\n schema !== null &&\n \"~standard\" in schema &&\n (schema as StandardSchemaV1<unknown>)[\"~standard\"].version === 1\n );\n};\n\nfunction getToolResponse(\n tools: Record<string, Tool> | undefined,\n abortSignal: AbortSignal,\n toolCall: {\n toolCallId: string;\n toolName: string;\n args: ReadonlyJSONObject;\n },\n human: (toolCallId: string, payload: unknown) => Promise<unknown>,\n) {\n const tool = tools?.[toolCall.toolName];\n if (!tool?.execute) return undefined;\n\n const getResult = async (\n toolExecute: ToolExecuteFunction<ReadonlyJSONObject, unknown>,\n ): Promise<ToolResponse<ReadonlyJSONValue>> => {\n // Check if already aborted before starting\n if (abortSignal.aborted) {\n return new ToolResponse({\n result: \"Tool execution was cancelled.\",\n isError: true,\n });\n }\n\n let executeFn = toolExecute;\n\n if (isStandardSchemaV1(tool.parameters)) {\n let result = tool.parameters[\"~standard\"].validate(toolCall.args);\n if (result instanceof Promise) result = await result;\n\n if (result.issues) {\n executeFn =\n tool.experimental_onSchemaValidationError ??\n (() => {\n throw new Error(\n `Function parameter validation failed. ${JSON.stringify(result.issues)}`,\n );\n });\n }\n }\n\n // Create abort promise that resolves after 2 microtasks\n // This gives tools that handle abort a chance to win the race\n let onAbort!: () => void;\n const abortPromise = new Promise<ToolResponse<ReadonlyJSONValue>>(\n (resolve) => {\n onAbort = () => {\n queueMicrotask(() => {\n queueMicrotask(() => {\n resolve(\n new ToolResponse({\n result: \"Tool execution was cancelled.\",\n isError: true,\n }),\n );\n });\n });\n };\n if (abortSignal.aborted) {\n onAbort();\n } else {\n abortSignal.addEventListener(\"abort\", onAbort, { once: true });\n }\n },\n );\n\n const executePromise = (async () => {\n const result = (await executeFn(toolCall.args, {\n toolCallId: toolCall.toolCallId,\n abortSignal,\n human: (payload: unknown) => human(toolCall.toolCallId, payload),\n })) as unknown as ReadonlyJSONValue;\n const response = ToolResponse.toResponse(result);\n if (\n tool.toModelOutput &&\n !response.isError &&\n response.modelContent === undefined\n ) {\n try {\n const modelContent = await tool.toModelOutput({\n toolCallId: toolCall.toolCallId,\n input: toolCall.args,\n output: response.result,\n });\n return new ToolResponse({\n result: response.result,\n artifact: response.artifact,\n isError: response.isError,\n messages: response.messages,\n modelContent,\n });\n } catch (e) {\n console.warn(\n `[assistant-stream] tool \"${toolCall.toolName}\" toModelOutput threw; falling back to default projection.`,\n e,\n );\n }\n }\n return response;\n })();\n\n try {\n return await Promise.race([executePromise, abortPromise]);\n } finally {\n abortSignal.removeEventListener(\"abort\", onAbort);\n }\n };\n\n return getResult(tool.execute);\n}\n\nfunction getToolStreamResponse(\n tools: Record<string, Tool> | undefined,\n abortSignal: AbortSignal,\n reader: ToolCallReader<any, ReadonlyJSONValue>,\n context: {\n toolCallId: string;\n toolName: string;\n },\n human: (toolCallId: string, payload: unknown) => Promise<unknown>,\n) {\n tools?.[context.toolName]?.streamCall?.(reader, {\n toolCallId: context.toolCallId,\n abortSignal,\n human: (payload: unknown) => human(context.toolCallId, payload),\n });\n}\n\nexport async function unstable_runPendingTools(\n message: AssistantMessage,\n tools: Record<string, Tool> | undefined,\n abortSignal: AbortSignal,\n human: (toolCallId: string, payload: unknown) => Promise<unknown>,\n) {\n const toolCallPromises = message.parts\n .filter((part) => part.type === \"tool-call\")\n .map(async (part) => {\n const promiseOrUndefined = getToolResponse(\n tools,\n abortSignal,\n part,\n human ??\n (async () => {\n throw new Error(\n \"Tool human input is not supported in this context\",\n );\n }),\n );\n if (promiseOrUndefined) {\n const result = await promiseOrUndefined;\n return {\n toolCallId: part.toolCallId,\n result,\n };\n }\n return null;\n });\n\n const toolCallResults = (await Promise.all(toolCallPromises)).filter(\n (result) => result !== null,\n ) as { toolCallId: string; result: ToolResponse<ReadonlyJSONValue> }[];\n\n if (toolCallResults.length === 0) {\n return message;\n }\n\n const toolCallResultsById = toolCallResults.reduce(\n (acc, { toolCallId, result }) => {\n acc[toolCallId] = result;\n return acc;\n },\n {} as Record<string, ToolResponse<ReadonlyJSONValue>>,\n );\n\n const updatedParts = message.parts.map((p) => {\n if (p.type === \"tool-call\") {\n const toolResponse = toolCallResultsById[p.toolCallId];\n if (toolResponse) {\n return {\n ...p,\n state: \"result\" as const,\n ...(toolResponse.artifact !== undefined\n ? { artifact: toolResponse.artifact }\n : {}),\n ...(toolResponse.modelContent !== undefined\n ? { modelContent: toolResponse.modelContent }\n : {}),\n result: toolResponse.result as ReadonlyJSONValue,\n isError: toolResponse.isError,\n };\n }\n }\n return p;\n });\n\n return {\n ...message,\n parts: updatedParts,\n content: updatedParts,\n };\n}\n\nexport type ToolResultStreamOptions = {\n /** Called immediately before a frontend tool's `execute` function runs. */\n onExecutionStart?: (toolCallId: string, toolName: string) => void;\n /** Called after frontend tool execution finishes or fails. */\n onExecutionEnd?: (toolCallId: string, toolName: string) => void;\n};\n\n/**\n * Transform stream that executes frontend tools and appends tool results.\n *\n * The transform watches streamed tool-call arguments, runs the matching\n * frontend tool once its arguments are complete, and emits a result chunk for\n * the tool call. Backend and human tools pass through according to their tool\n * definition.\n *\n * @param tools Tool registry or function returning the current registry.\n * @param abortSignal Signal, or signal getter, used for the current run.\n * @param human Callback used to resolve human-tool requests from UI input.\n * @param options Optional execution lifecycle callbacks.\n */\nexport function toolResultStream(\n tools:\n | Record<string, Tool>\n | (() => Record<string, Tool> | undefined)\n | undefined,\n abortSignal: AbortSignal | (() => AbortSignal),\n human: (toolCallId: string, payload: unknown) => Promise<unknown>,\n options?: ToolResultStreamOptions,\n) {\n const toolsFn = typeof tools === \"function\" ? tools : () => tools;\n const abortSignalFn =\n typeof abortSignal === \"function\" ? abortSignal : () => abortSignal;\n return new ToolExecutionStream({\n execute: (toolCall) =>\n getToolResponse(toolsFn(), abortSignalFn(), toolCall, human),\n streamCall: ({ reader, ...context }) =>\n getToolStreamResponse(toolsFn(), abortSignalFn(), reader, context, human),\n onExecutionStart: options?.onExecutionStart,\n onExecutionEnd: options?.onExecutionEnd,\n });\n}\n"],"mappings":";;;AAOA,MAAM,sBACJ,WACwC;CACxC,OACE,OAAO,WAAW,YAClB,WAAW,QACX,eAAe,UACd,OAAqC,YAAY,CAAC,YAAY;AAEnE;AAEA,SAAS,gBACP,OACA,aACA,UAKA,OACA;CACA,MAAM,OAAO,QAAQ,SAAS;CAC9B,IAAI,CAAC,MAAM,SAAS,OAAO,KAAA;CAE3B,MAAM,YAAY,OAChB,gBAC6C;EAE7C,IAAI,YAAY,SACd,OAAO,IAAI,aAAa;GACtB,QAAQ;GACR,SAAS;EACX,CAAC;EAGH,IAAI,YAAY;EAEhB,IAAI,mBAAmB,KAAK,UAAU,GAAG;GACvC,IAAI,SAAS,KAAK,WAAW,YAAY,CAAC,SAAS,SAAS,IAAI;GAChE,IAAI,kBAAkB,SAAS,SAAS,MAAM;GAE9C,IAAI,OAAO,QACT,YACE,KAAK,+CACE;IACL,MAAM,IAAI,MACR,yCAAyC,KAAK,UAAU,OAAO,MAAM,GACvE;GACF;EAEN;EAIA,IAAI;EACJ,MAAM,eAAe,IAAI,SACtB,YAAY;GACX,gBAAgB;IACd,qBAAqB;KACnB,qBAAqB;MACnB,QACE,IAAI,aAAa;OACf,QAAQ;OACR,SAAS;MACX,CAAC,CACH;KACF,CAAC;IACH,CAAC;GACH;GACA,IAAI,YAAY,SACd,QAAQ;QAER,YAAY,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;EAEjE,CACF;EAEA,MAAM,kBAAkB,YAAY;GAClC,MAAM,SAAU,MAAM,UAAU,SAAS,MAAM;IAC7C,YAAY,SAAS;IACrB;IACA,QAAQ,YAAqB,MAAM,SAAS,YAAY,OAAO;GACjE,CAAC;GACD,MAAM,WAAW,aAAa,WAAW,MAAM;GAC/C,IACE,KAAK,iBACL,CAAC,SAAS,WACV,SAAS,iBAAiB,KAAA,GAE1B,IAAI;IACF,MAAM,eAAe,MAAM,KAAK,cAAc;KAC5C,YAAY,SAAS;KACrB,OAAO,SAAS;KAChB,QAAQ,SAAS;IACnB,CAAC;IACD,OAAO,IAAI,aAAa;KACtB,QAAQ,SAAS;KACjB,UAAU,SAAS;KACnB,SAAS,SAAS;KAClB,UAAU,SAAS;KACnB;IACF,CAAC;GACH,SAAS,GAAG;IACV,QAAQ,KACN,4BAA4B,SAAS,SAAS,6DAC9C,CACF;GACF;GAEF,OAAO;EACT,EAAA,CAAG;EAEH,IAAI;GACF,OAAO,MAAM,QAAQ,KAAK,CAAC,gBAAgB,YAAY,CAAC;EAC1D,UAAU;GACR,YAAY,oBAAoB,SAAS,OAAO;EAClD;CACF;CAEA,OAAO,UAAU,KAAK,OAAO;AAC/B;AAEA,SAAS,sBACP,OACA,aACA,QACA,SAIA,OACA;CACA,QAAQ,QAAQ,SAAS,EAAE,aAAa,QAAQ;EAC9C,YAAY,QAAQ;EACpB;EACA,QAAQ,YAAqB,MAAM,QAAQ,YAAY,OAAO;CAChE,CAAC;AACH;AAEA,eAAsB,yBACpB,SACA,OACA,aACA,OACA;CACA,MAAM,mBAAmB,QAAQ,MAC9B,QAAQ,SAAS,KAAK,SAAS,WAAW,CAAC,CAC3C,IAAI,OAAO,SAAS;EACnB,MAAM,qBAAqB,gBACzB,OACA,aACA,MACA,UACG,YAAY;GACX,MAAM,IAAI,MACR,mDACF;EACF,EACJ;EACA,IAAI,oBAAoB;GACtB,MAAM,SAAS,MAAM;GACrB,OAAO;IACL,YAAY,KAAK;IACjB;GACF;EACF;EACA,OAAO;CACT,CAAC;CAEH,MAAM,mBAAmB,MAAM,QAAQ,IAAI,gBAAgB,EAAA,CAAG,QAC3D,WAAW,WAAW,IACzB;CAEA,IAAI,gBAAgB,WAAW,GAC7B,OAAO;CAGT,MAAM,sBAAsB,gBAAgB,QACzC,KAAK,EAAE,YAAY,aAAa;EAC/B,IAAI,cAAc;EAClB,OAAO;CACT,GACA,CAAC,CACH;CAEA,MAAM,eAAe,QAAQ,MAAM,KAAK,MAAM;EAC5C,IAAI,EAAE,SAAS,aAAa;GAC1B,MAAM,eAAe,oBAAoB,EAAE;GAC3C,IAAI,cACF,OAAO;IACL,GAAG;IACH,OAAO;IACP,GAAI,aAAa,aAAa,KAAA,IAC1B,EAAE,UAAU,aAAa,SAAS,IAClC,CAAC;IACL,GAAI,aAAa,iBAAiB,KAAA,IAC9B,EAAE,cAAc,aAAa,aAAa,IAC1C,CAAC;IACL,QAAQ,aAAa;IACrB,SAAS,aAAa;GACxB;EAEJ;EACA,OAAO;CACT,CAAC;CAED,OAAO;EACL,GAAG;EACH,OAAO;EACP,SAAS;CACX;AACF;;;;;;;;;;;;;;AAsBA,SAAgB,iBACd,OAIA,aACA,OACA,SACA;CACA,MAAM,UAAU,OAAO,UAAU,aAAa,cAAc;CAC5D,MAAM,gBACJ,OAAO,gBAAgB,aAAa,oBAAoB;CAC1D,OAAO,IAAI,oBAAoB;EAC7B,UAAU,aACR,gBAAgB,QAAQ,GAAG,cAAc,GAAG,UAAU,KAAK;EAC7D,aAAa,EAAE,QAAQ,GAAG,cACxB,sBAAsB,QAAQ,GAAG,cAAc,GAAG,QAAQ,SAAS,KAAK;EAC1E,kBAAkB,SAAS;EAC3B,gBAAgB,SAAS;CAC3B,CAAC;AACH"}
@@ -2,11 +2,11 @@
2
2
  type AsNumber<K> = K extends `${infer N extends number}` ? N | K : never;
3
3
  type TupleIndex<T extends readonly any[]> = Exclude<keyof T, keyof any[]>;
4
4
  type ObjectKey<T> = keyof T & (string | number);
5
- type TypePath<T> = [] | (0 extends 1 & T ? any[] : T extends object ? T extends readonly any[] ? number extends T["length"] ? { [K in TupleIndex<T>]: [AsNumber<K>, ...TypePath<T[K]>] }[TupleIndex<T>] : [number, ...TypePath<T[number]>] : { [K in ObjectKey<T>]: [K, ...TypePath<T[K]>] }[ObjectKey<T>] : []);
5
+ type TypePath<T> = [] | (0 extends 1 & T ? any[] : T extends object ? T extends readonly any[] ? number extends T["length"] ? { [K in TupleIndex<T>]: [AsNumber<K>, ...TypePath<T[K]>]; }[TupleIndex<T>] : [number, ...TypePath<T[number]>] : { [K in ObjectKey<T>]: [K, ...TypePath<T[K]>]; }[ObjectKey<T>] : []);
6
6
  type TypeAtPath<T, P extends readonly any[]> = P extends [infer Head, ...infer Rest] ? Head extends keyof T ? TypeAtPath<T[Head], Rest> : never : T;
7
7
  type DeepPartial<T> = T extends readonly any[] ? readonly DeepPartial<T[number]>[] : T extends {
8
8
  [key: string]: any;
9
- } ? { readonly [K in keyof T]?: DeepPartial<T[K]> } : T;
9
+ } ? { readonly [K in keyof T]?: DeepPartial<T[K]>; } : T;
10
10
  //#endregion
11
11
  export { DeepPartial, TypeAtPath, TypePath };
12
12
  //# sourceMappingURL=type-path-utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"type-path-utils.d.ts","names":[],"sources":["../../../src/core/tool/type-path-utils.ts"],"mappings":";KAAK,QAAA,MAAc,CAAA,uCAAwC,CAAA,GAAI,CAAA;AAAA,KAC1D,UAAA,6BAAuC,OAAO,OAAO,CAAA;AAAA,KACrD,SAAA,YAAqB,CAAC;AAAA,KAEf,QAAA,0BAEO,CAAA,WAEX,CAAA,kBACE,CAAA,yCACiB,CAAA,qBAGL,UAAA,CAAW,CAAA,KAAM,QAAA,CAAS,CAAA,MAAO,QAAA,CAAS,CAAA,CAAE,CAAA,MAClD,UAAA,CAAW,CAAA,iBAED,QAAA,CAAS,CAAA,qBAEf,SAAA,CAAU,CAAA,KAAM,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,CAAA,MAAO,SAAA,CAAU,CAAA;AAAA,KAI1D,UAAA,gCAA0C,CAAA,uCAIlD,IAAA,eAAmB,CAAA,GACjB,UAAA,CAAW,CAAA,CAAE,IAAA,GAAO,IAAA,YAEtB,CAAA;AAAA,KAEQ,WAAA,MAAiB,CAAA,mCAChB,WAAA,CAAY,CAAA,cACrB,CAAA;EAAA,CAAa,GAAA;AAAA,2BACY,CAAA,IAAK,WAAA,CAAY,CAAA,CAAE,CAAA,OAC1C,CAAA"}
1
+ {"version":3,"file":"type-path-utils.d.ts","names":[],"sources":["../../../src/core/tool/type-path-utils.ts"],"mappings":";KAAK,SAAS,KAAK,mBAAmB,qBAAqB,IAAI;KAC1D,WAAW,4BAA4B,cAAc;KACrD,UAAU,WAAW;KAEd,SAAS,yBAEF,YAEX,mBACE,0CACiB,iBAGV,KAAK,WAAW,MAAM,SAAS,OAAO,SAAS,EAAE,QAClD,WAAW,kBAED,SAAS,iBAEpB,KAAK,UAAU,MAAM,MAAM,SAAS,EAAE,QAAO,UAAU;KAI1D,WAAW,GAAG,4BAA4B,iBAC9C,eACG,QAEP,mBAAmB,IACjB,WAAW,EAAE,OAAO,gBAEtB;KAEQ,YAAY,KAAK,oCAChB,YAAY,eACrB;GAAa;gBACC,WAAW,KAAK,YAAY,EAAE,SAC1C"}
@@ -1 +1 @@
1
- {"version":3,"file":"Counter.d.ts","names":[],"sources":["../../../src/core/utils/Counter.ts"],"mappings":";cAAa,OAAA;EACJ,KAAA;EAEP,EAAE;AAAA"}
1
+ {"version":3,"file":"Counter.d.ts","names":[],"sources":["../../../src/core/utils/Counter.ts"],"mappings":";cAAa;EACJ;EAEP"}
@@ -1 +1 @@
1
- {"version":3,"file":"generateId.d.ts","names":[],"sources":["../../../src/core/utils/generateId.ts"],"mappings":";cAEa,UAAA,GAAU,IAAA"}
1
+ {"version":3,"file":"generateId.d.ts","names":[],"sources":["../../../src/core/utils/generateId.ts"],"mappings":";cAEa,aAAU"}
@@ -1,5 +1,4 @@
1
1
  import { AssistantStreamChunk, PartInit } from "../../AssistantStreamChunk.js";
2
-
3
2
  //#region src/core/utils/stream/AssistantMetaTransformStream.d.ts
4
3
  /**
5
4
  * For chunk types that are associated with a part,
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantMetaTransformStream.d.ts","names":[],"sources":["../../../../src/core/utils/stream/AssistantMetaTransformStream.ts"],"mappings":";;;;;AASA;;KAAY,wBAAA,IACP,oBAAA;EACC,IAAA;EACA,IAAA,EAAM,QAAA;AAAA,MAEP,oBAAA;EACC,IAAA;EACA,IAAA,EAAM,QAAA;IAAa,IAAA;EAAA;AAAA,MAEpB,oBAAA;EACC,IAAA,EAAM,OAAA,CACJ,oBAAA;AAAA;AAAA,cAIK,4BAAA,SAAqC,eAAA,CAChD,oBAAA,EACA,wBAAA"}
1
+ {"version":3,"file":"AssistantMetaTransformStream.d.ts","names":[],"sources":["../../../../src/core/utils/stream/AssistantMetaTransformStream.ts"],"mappings":";;;;;;KASY,4BACP;EACC;EACA,MAAM;MAEP;EACC;EACA,MAAM;IAAa;;MAEpB;EACC,MAAM,QACJ;;cAIK,qCAAqC,gBAChD,sBACA"}
@@ -1,6 +1,5 @@
1
1
  import { AssistantStreamController } from "../../modules/assistant-stream.js";
2
2
  import { AssistantStreamChunk } from "../../AssistantStreamChunk.js";
3
-
4
3
  //#region src/core/utils/stream/AssistantTransformStream.d.ts
5
4
  type AssistantTransformerFlushCallback = (controller: AssistantStreamController) => void | PromiseLike<void>;
6
5
  type AssistantTransformerStartCallback = (controller: AssistantStreamController) => void | PromiseLike<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantTransformStream.d.ts","names":[],"sources":["../../../../src/core/utils/stream/AssistantTransformStream.ts"],"mappings":";;;;KAMK,iCAAA,IACH,UAAA,EAAY,yBAAA,YACF,WAAW;AAAA,KAElB,iCAAA,IACH,UAAA,EAAY,yBAAA,YACF,WAAW;AAAA,KAElB,qCAAA,OACH,KAAA,EAAO,CAAA,EACP,UAAA,EAAY,yBAAA,YACF,WAAA;AAAA,KAEP,oBAAA;EACH,KAAA,GAAQ,iCAAA;EACR,KAAA,GAAQ,iCAAA;EACR,SAAA,GAAY,qCAAA,CAAsC,CAAA;AAAA;AAAA,cAGvC,wBAAA,YAAoC,eAAA,CAC/C,CAAA,EACA,oBAAA;cAGE,WAAA,EAAa,oBAAA,CAAqB,CAAA,GAClC,gBAAA,GAAmB,eAAA,CAAgB,CAAA,GACnC,gBAAA,GAAmB,eAAA,CAAgB,oBAAA;AAAA"}
1
+ {"version":3,"file":"AssistantTransformStream.d.ts","names":[],"sources":["../../../../src/core/utils/stream/AssistantTransformStream.ts"],"mappings":";;;KAMK,qCACH,YAAY,qCACF;KAEP,qCACH,YAAY,qCACF;KAEP,sCAAsC,MACzC,OAAO,GACP,YAAY,qCACF;KAEP,qBAAqB;EACxB,QAAQ;EACR,QAAQ;EACR,YAAY,sCAAsC;;cAGvC,yBAAyB,WAAW,gBAC/C,GACA;EAGE,YAAA,aAAa,qBAAqB,IAClC,mBAAmB,gBAAgB,IACnC,mBAAmB,gBAAgB"}
@@ -1,6 +1,7 @@
1
1
  //#region src/core/utils/stream/LineDecoderStream.d.ts
2
2
  declare class LineDecoderStream extends TransformStream<string, string> {
3
3
  private buffer;
4
+ private skipNextLineFeed;
4
5
  constructor();
5
6
  }
6
7
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"LineDecoderStream.d.ts","names":[],"sources":["../../../../src/core/utils/stream/LineDecoderStream.ts"],"mappings":";cAAa,iBAAA,SAA0B,eAAe;EAAA,QAC5C,MAAA"}
1
+ {"version":3,"file":"LineDecoderStream.d.ts","names":[],"sources":["../../../../src/core/utils/stream/LineDecoderStream.ts"],"mappings":";cAAa,0BAA0B;UAC7B;UACA"}
@@ -1,16 +1,29 @@
1
1
  //#region src/core/utils/stream/LineDecoderStream.ts
2
2
  var LineDecoderStream = class extends TransformStream {
3
3
  buffer = "";
4
+ skipNextLineFeed = false;
4
5
  constructor() {
5
6
  super({
6
7
  transform: (chunk, controller) => {
7
- this.buffer += chunk;
8
- const lines = this.buffer.split("\n");
9
- for (let i = 0; i < lines.length - 1; i++) {
10
- const line = lines[i];
11
- controller.enqueue(line.endsWith("\r") ? line.slice(0, -1) : line);
8
+ let lineStart = 0;
9
+ for (let i = 0; i < chunk.length; i++) {
10
+ const character = chunk[i];
11
+ if (this.skipNextLineFeed) {
12
+ this.skipNextLineFeed = false;
13
+ if (character === "\n") {
14
+ lineStart = i + 1;
15
+ continue;
16
+ }
17
+ }
18
+ if (character === "\n" || character === "\r") {
19
+ this.buffer += chunk.slice(lineStart, i);
20
+ controller.enqueue(this.buffer);
21
+ this.buffer = "";
22
+ this.skipNextLineFeed = character === "\r";
23
+ lineStart = i + 1;
24
+ }
12
25
  }
13
- this.buffer = lines[lines.length - 1] || "";
26
+ this.buffer += chunk.slice(lineStart);
14
27
  },
15
28
  flush: () => {
16
29
  if (this.buffer) throw new Error(`Stream ended with an incomplete line: "${this.buffer}"`);
@@ -1 +1 @@
1
- {"version":3,"file":"LineDecoderStream.js","names":[],"sources":["../../../../src/core/utils/stream/LineDecoderStream.ts"],"sourcesContent":["export class LineDecoderStream extends TransformStream<string, string> {\n private buffer = \"\";\n\n constructor() {\n super({\n transform: (chunk, controller) => {\n this.buffer += chunk;\n const lines = this.buffer.split(\"\\n\");\n\n // Process all complete lines\n for (let i = 0; i < lines.length - 1; i++) {\n // Strip trailing \\r to handle \\r\\n (CRLF) line endings per the SSE spec.\n const line = lines[i]!;\n controller.enqueue(line.endsWith(\"\\r\") ? line.slice(0, -1) : line);\n }\n\n // Keep the last incomplete line in the buffer\n this.buffer = lines[lines.length - 1] || \"\";\n },\n flush: () => {\n // If there's content in the buffer when the stream ends, it means\n // the stream ended with an incomplete line (no trailing newline)\n if (this.buffer) {\n throw new Error(\n `Stream ended with an incomplete line: \"${this.buffer}\"`,\n );\n }\n },\n });\n }\n}\n"],"mappings":";AAAA,IAAa,oBAAb,cAAuC,gBAAgC;CACrE,SAAiB;CAEjB,cAAc;EACZ,MAAM;GACJ,YAAY,OAAO,eAAe;IAChC,KAAK,UAAU;IACf,MAAM,QAAQ,KAAK,OAAO,MAAM,IAAI;IAGpC,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,SAAS,GAAG,KAAK;KAEzC,MAAM,OAAO,MAAM;KACnB,WAAW,QAAQ,KAAK,SAAS,IAAI,IAAI,KAAK,MAAM,GAAG,EAAE,IAAI,IAAI;IACnE;IAGA,KAAK,SAAS,MAAM,MAAM,SAAS,MAAM;GAC3C;GACA,aAAa;IAGX,IAAI,KAAK,QACP,MAAM,IAAI,MACR,0CAA0C,KAAK,OAAO,EACxD;GAEJ;EACF,CAAC;CACH;AACF"}
1
+ {"version":3,"file":"LineDecoderStream.js","names":[],"sources":["../../../../src/core/utils/stream/LineDecoderStream.ts"],"sourcesContent":["export class LineDecoderStream extends TransformStream<string, string> {\n private buffer = \"\";\n private skipNextLineFeed = false;\n\n constructor() {\n super({\n transform: (chunk, controller) => {\n let lineStart = 0;\n\n for (let i = 0; i < chunk.length; i++) {\n const character = chunk[i]!;\n\n if (this.skipNextLineFeed) {\n this.skipNextLineFeed = false;\n if (character === \"\\n\") {\n lineStart = i + 1;\n continue;\n }\n }\n\n if (character === \"\\n\" || character === \"\\r\") {\n this.buffer += chunk.slice(lineStart, i);\n controller.enqueue(this.buffer);\n this.buffer = \"\";\n this.skipNextLineFeed = character === \"\\r\";\n lineStart = i + 1;\n }\n }\n\n this.buffer += chunk.slice(lineStart);\n },\n flush: () => {\n if (this.buffer) {\n throw new Error(\n `Stream ended with an incomplete line: \"${this.buffer}\"`,\n );\n }\n },\n });\n }\n}\n"],"mappings":";AAAA,IAAa,oBAAb,cAAuC,gBAAgC;CACrE,SAAiB;CACjB,mBAA2B;CAE3B,cAAc;EACZ,MAAM;GACJ,YAAY,OAAO,eAAe;IAChC,IAAI,YAAY;IAEhB,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;KACrC,MAAM,YAAY,MAAM;KAExB,IAAI,KAAK,kBAAkB;MACzB,KAAK,mBAAmB;MACxB,IAAI,cAAc,MAAM;OACtB,YAAY,IAAI;OAChB;MACF;KACF;KAEA,IAAI,cAAc,QAAQ,cAAc,MAAM;MAC5C,KAAK,UAAU,MAAM,MAAM,WAAW,CAAC;MACvC,WAAW,QAAQ,KAAK,MAAM;MAC9B,KAAK,SAAS;MACd,KAAK,mBAAmB,cAAc;MACtC,YAAY,IAAI;KAClB;IACF;IAEA,KAAK,UAAU,MAAM,MAAM,SAAS;GACtC;GACA,aAAa;IACX,IAAI,KAAK,QACP,MAAM,IAAI,MACR,0CAA0C,KAAK,OAAO,EACxD;GAEJ;EACF,CAAC;CACH;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"PipeableTransformStream.d.ts","names":[],"sources":["../../../../src/core/utils/stream/PipeableTransformStream.ts"],"mappings":";cAAa,uBAAA,eAAsC,eAAA,CAAgB,CAAA,EAAG,CAAA;cACxD,SAAA,GAAY,QAAA,EAAU,cAAA,CAAe,CAAA,MAAO,cAAA,CAAe,CAAA;AAAA"}
1
+ {"version":3,"file":"PipeableTransformStream.d.ts","names":[],"sources":["../../../../src/core/utils/stream/PipeableTransformStream.ts"],"mappings":";cAAa,wBAAwB,GAAG,WAAW,gBAAgB,GAAG;EACxD,YAAA,YAAY,UAAU,eAAe,OAAO,eAAe"}
@@ -1,5 +1,4 @@
1
1
  import { PipeableTransformStream } from "./PipeableTransformStream.js";
2
-
3
2
  //#region src/core/utils/stream/SSE.d.ts
4
3
  declare class SSEEncoder<T> extends PipeableTransformStream<T, Uint8Array<ArrayBuffer>> {
5
4
  static readonly headers: Headers;
@@ -1 +1 @@
1
- {"version":3,"file":"SSE.d.ts","names":[],"sources":["../../../../src/core/utils/stream/SSE.ts"],"mappings":";;;cAGa,UAAA,YAAsB,uBAAA,CACjC,CAAA,EACA,UAAA,CAAW,WAAA;EAAA,gBAEK,OAAA,EAAO,OAAA;EAMvB,OAAA,EAAO,OAAA;;;cAmFI,UAAA,YAAsB,uBAAA,CACjC,UAAA,CAAW,WAAA,GACX,CAAA"}
1
+ {"version":3,"file":"SSE.d.ts","names":[],"sources":["../../../../src/core/utils/stream/SSE.ts"],"mappings":";;cAMa,WAAW,WAAW,wBACjC,GACA,WAAW;kBAEK,SAAO;EAMvB,SAAO;;;cAiBI,WAAW,WAAW,wBACjC,WAAW,cACX"}
@@ -1,5 +1,5 @@
1
1
  import { PipeableTransformStream } from "./PipeableTransformStream.js";
2
- import { LineDecoderStream } from "./LineDecoderStream.js";
2
+ import { SSEEventDecoderStream } from "./SSEEventDecoderStream.js";
3
3
  //#region src/core/utils/stream/SSE.ts
4
4
  var SSEEncoder = class SSEEncoder extends PipeableTransformStream {
5
5
  static headers = new Headers({
@@ -14,59 +14,9 @@ var SSEEncoder = class SSEEncoder extends PipeableTransformStream {
14
14
  } })).pipeThrough(new TextEncoderStream()));
15
15
  }
16
16
  };
17
- var SSEEventStream = class extends TransformStream {
18
- constructor() {
19
- let eventBuffer = {};
20
- let dataLines = [];
21
- super({
22
- start() {
23
- eventBuffer = {};
24
- dataLines = [];
25
- },
26
- transform(line, controller) {
27
- if (line.startsWith(":")) return;
28
- if (line === "") {
29
- if (dataLines.length > 0) controller.enqueue({
30
- event: eventBuffer.event || "message",
31
- data: dataLines.join("\n"),
32
- id: eventBuffer.id,
33
- retry: eventBuffer.retry
34
- });
35
- eventBuffer = {};
36
- dataLines = [];
37
- return;
38
- }
39
- const [field, ...rest] = line.split(":");
40
- const value = rest.join(":").trimStart();
41
- switch (field) {
42
- case "event":
43
- eventBuffer.event = value;
44
- break;
45
- case "data":
46
- dataLines.push(value);
47
- break;
48
- case "id":
49
- eventBuffer.id = value;
50
- break;
51
- case "retry":
52
- eventBuffer.retry = Number(value);
53
- break;
54
- }
55
- },
56
- flush(controller) {
57
- if (dataLines.length > 0) controller.enqueue({
58
- event: eventBuffer.event || "message",
59
- data: dataLines.join("\n"),
60
- id: eventBuffer.id,
61
- retry: eventBuffer.retry
62
- });
63
- }
64
- });
65
- }
66
- };
67
17
  var SSEDecoder = class extends PipeableTransformStream {
68
18
  constructor() {
69
- super((readable) => readable.pipeThrough(new TextDecoderStream()).pipeThrough(new LineDecoderStream()).pipeThrough(new SSEEventStream()).pipeThrough(new TransformStream({ transform(event, controller) {
19
+ super((readable) => readable.pipeThrough(new TextDecoderStream()).pipeThrough(new SSEEventDecoderStream()).pipeThrough(new TransformStream({ transform(event, controller) {
70
20
  switch (event.event) {
71
21
  case "message":
72
22
  controller.enqueue(JSON.parse(event.data));
@@ -1 +1 @@
1
- {"version":3,"file":"SSE.js","names":[],"sources":["../../../../src/core/utils/stream/SSE.ts"],"sourcesContent":["import { PipeableTransformStream } from \"./PipeableTransformStream\";\nimport { LineDecoderStream } from \"./LineDecoderStream\";\n\nexport class SSEEncoder<T> extends PipeableTransformStream<\n T,\n Uint8Array<ArrayBuffer>\n> {\n static readonly headers = new Headers({\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n });\n\n headers = SSEEncoder.headers;\n\n constructor() {\n super((readable) =>\n readable\n .pipeThrough(\n new TransformStream<T, string>({\n transform(chunk, controller) {\n controller.enqueue(`data: ${JSON.stringify(chunk)}\\n\\n`);\n },\n }),\n )\n .pipeThrough(new TextEncoderStream()),\n );\n }\n}\n\ntype SSEEvent = {\n event: string;\n data: string;\n id?: string | undefined;\n retry?: number | undefined;\n};\n\nclass SSEEventStream extends TransformStream<string, SSEEvent> {\n constructor() {\n let eventBuffer: Partial<SSEEvent> = {};\n let dataLines: string[] = [];\n\n super({\n start() {\n eventBuffer = {};\n dataLines = [];\n },\n transform(line, controller) {\n if (line.startsWith(\":\")) return; // Ignore comments\n\n if (line === \"\") {\n if (dataLines.length > 0) {\n controller.enqueue({\n event: eventBuffer.event || \"message\",\n data: dataLines.join(\"\\n\"),\n id: eventBuffer.id,\n retry: eventBuffer.retry,\n });\n }\n eventBuffer = {};\n dataLines = [];\n return;\n }\n\n const [field, ...rest] = line.split(\":\");\n const value = rest.join(\":\").trimStart();\n\n switch (field) {\n case \"event\":\n eventBuffer.event = value;\n break;\n case \"data\":\n dataLines.push(value);\n break;\n case \"id\":\n eventBuffer.id = value;\n break;\n case \"retry\":\n eventBuffer.retry = Number(value);\n break;\n }\n },\n flush(controller) {\n if (dataLines.length > 0) {\n controller.enqueue({\n event: eventBuffer.event || \"message\",\n data: dataLines.join(\"\\n\"),\n id: eventBuffer.id,\n retry: eventBuffer.retry,\n });\n }\n },\n });\n }\n}\n\nexport class SSEDecoder<T> extends PipeableTransformStream<\n Uint8Array<ArrayBuffer>,\n T\n> {\n constructor() {\n super((readable) =>\n readable\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(new LineDecoderStream())\n .pipeThrough(new SSEEventStream())\n .pipeThrough(\n new TransformStream<SSEEvent, T>({\n transform(event, controller) {\n switch (event.event) {\n case \"message\":\n controller.enqueue(JSON.parse(event.data));\n break;\n default:\n throw new Error(`Unknown SSE event type: ${event.event}`);\n }\n },\n }),\n ),\n );\n }\n}\n"],"mappings":";;;AAGA,IAAa,aAAb,MAAa,mBAAsB,wBAGjC;CACA,OAAgB,UAAU,IAAI,QAAQ;EACpC,gBAAgB;EAChB,iBAAiB;EACjB,YAAY;CACd,CAAC;CAED,UAAU,WAAW;CAErB,cAAc;EACZ,OAAO,aACL,SACG,YACC,IAAI,gBAA2B,EAC7B,UAAU,OAAO,YAAY;GAC3B,WAAW,QAAQ,SAAS,KAAK,UAAU,KAAK,EAAE,KAAK;EACzD,EACF,CAAC,CACH,CAAC,CACA,YAAY,IAAI,kBAAkB,CAAC,CACxC;CACF;AACF;AASA,IAAM,iBAAN,cAA6B,gBAAkC;CAC7D,cAAc;EACZ,IAAI,cAAiC,CAAC;EACtC,IAAI,YAAsB,CAAC;EAE3B,MAAM;GACJ,QAAQ;IACN,cAAc,CAAC;IACf,YAAY,CAAC;GACf;GACA,UAAU,MAAM,YAAY;IAC1B,IAAI,KAAK,WAAW,GAAG,GAAG;IAE1B,IAAI,SAAS,IAAI;KACf,IAAI,UAAU,SAAS,GACrB,WAAW,QAAQ;MACjB,OAAO,YAAY,SAAS;MAC5B,MAAM,UAAU,KAAK,IAAI;MACzB,IAAI,YAAY;MAChB,OAAO,YAAY;KACrB,CAAC;KAEH,cAAc,CAAC;KACf,YAAY,CAAC;KACb;IACF;IAEA,MAAM,CAAC,OAAO,GAAG,QAAQ,KAAK,MAAM,GAAG;IACvC,MAAM,QAAQ,KAAK,KAAK,GAAG,CAAC,CAAC,UAAU;IAEvC,QAAQ,OAAR;KACE,KAAK;MACH,YAAY,QAAQ;MACpB;KACF,KAAK;MACH,UAAU,KAAK,KAAK;MACpB;KACF,KAAK;MACH,YAAY,KAAK;MACjB;KACF,KAAK;MACH,YAAY,QAAQ,OAAO,KAAK;MAChC;IACJ;GACF;GACA,MAAM,YAAY;IAChB,IAAI,UAAU,SAAS,GACrB,WAAW,QAAQ;KACjB,OAAO,YAAY,SAAS;KAC5B,MAAM,UAAU,KAAK,IAAI;KACzB,IAAI,YAAY;KAChB,OAAO,YAAY;IACrB,CAAC;GAEL;EACF,CAAC;CACH;AACF;AAEA,IAAa,aAAb,cAAmC,wBAGjC;CACA,cAAc;EACZ,OAAO,aACL,SACG,YAAY,IAAI,kBAAkB,CAAC,CAAC,CACpC,YAAY,IAAI,kBAAkB,CAAC,CAAC,CACpC,YAAY,IAAI,eAAe,CAAC,CAAC,CACjC,YACC,IAAI,gBAA6B,EAC/B,UAAU,OAAO,YAAY;GAC3B,QAAQ,MAAM,OAAd;IACE,KAAK;KACH,WAAW,QAAQ,KAAK,MAAM,MAAM,IAAI,CAAC;KACzC;IACF,SACE,MAAM,IAAI,MAAM,2BAA2B,MAAM,OAAO;GAC5D;EACF,EACF,CAAC,CACH,CACJ;CACF;AACF"}
1
+ {"version":3,"file":"SSE.js","names":[],"sources":["../../../../src/core/utils/stream/SSE.ts"],"sourcesContent":["import { PipeableTransformStream } from \"./PipeableTransformStream\";\nimport {\n SSEEventDecoderStream,\n type PipelineSSEEvent,\n} from \"./SSEEventDecoderStream\";\n\nexport class SSEEncoder<T> extends PipeableTransformStream<\n T,\n Uint8Array<ArrayBuffer>\n> {\n static readonly headers = new Headers({\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n });\n\n headers = SSEEncoder.headers;\n\n constructor() {\n super((readable) =>\n readable\n .pipeThrough(\n new TransformStream<T, string>({\n transform(chunk, controller) {\n controller.enqueue(`data: ${JSON.stringify(chunk)}\\n\\n`);\n },\n }),\n )\n .pipeThrough(new TextEncoderStream()),\n );\n }\n}\n\nexport class SSEDecoder<T> extends PipeableTransformStream<\n Uint8Array<ArrayBuffer>,\n T\n> {\n constructor() {\n super((readable) =>\n readable\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(new SSEEventDecoderStream())\n .pipeThrough(\n new TransformStream<PipelineSSEEvent, T>({\n transform(event, controller) {\n switch (event.event) {\n case \"message\":\n controller.enqueue(JSON.parse(event.data));\n break;\n default:\n throw new Error(`Unknown SSE event type: ${event.event}`);\n }\n },\n }),\n ),\n );\n }\n}\n"],"mappings":";;;AAMA,IAAa,aAAb,MAAa,mBAAsB,wBAGjC;CACA,OAAgB,UAAU,IAAI,QAAQ;EACpC,gBAAgB;EAChB,iBAAiB;EACjB,YAAY;CACd,CAAC;CAED,UAAU,WAAW;CAErB,cAAc;EACZ,OAAO,aACL,SACG,YACC,IAAI,gBAA2B,EAC7B,UAAU,OAAO,YAAY;GAC3B,WAAW,QAAQ,SAAS,KAAK,UAAU,KAAK,EAAE,KAAK;EACzD,EACF,CAAC,CACH,CAAC,CACA,YAAY,IAAI,kBAAkB,CAAC,CACxC;CACF;AACF;AAEA,IAAa,aAAb,cAAmC,wBAGjC;CACA,cAAc;EACZ,OAAO,aACL,SACG,YAAY,IAAI,kBAAkB,CAAC,CAAC,CACpC,YAAY,IAAI,sBAAsB,CAAC,CAAC,CACxC,YACC,IAAI,gBAAqC,EACvC,UAAU,OAAO,YAAY;GAC3B,QAAQ,MAAM,OAAd;IACE,KAAK;KACH,WAAW,QAAQ,KAAK,MAAM,MAAM,IAAI,CAAC;KACzC;IACF,SACE,MAAM,IAAI,MAAM,2BAA2B,MAAM,OAAO;GAC5D;EACF,EACF,CAAC,CACH,CACJ;CACF;AACF"}
@@ -0,0 +1,27 @@
1
+ //#region src/core/utils/stream/SSEEventDecoder.d.ts
2
+ type SSEEvent = {
3
+ event?: string;
4
+ data: string;
5
+ id?: string;
6
+ retry?: number;
7
+ };
8
+ declare class SSEEventDecoder {
9
+ private lineBuffer;
10
+ private dataLines;
11
+ private eventName;
12
+ private lastEventId;
13
+ private retry;
14
+ private pendingLF;
15
+ private readonly trailing;
16
+ constructor(options?: {
17
+ trailing?: "drop" | "dispatch";
18
+ });
19
+ push(text: string): SSEEvent[];
20
+ flush(): SSEEvent | null;
21
+ private processLine;
22
+ private dispatchEvent;
23
+ private resetFrame;
24
+ }
25
+ //#endregion
26
+ export { SSEEvent, SSEEventDecoder };
27
+ //# sourceMappingURL=SSEEventDecoder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SSEEventDecoder.d.ts","names":[],"sources":["../../../../src/core/utils/stream/SSEEventDecoder.ts"],"mappings":";KAAY;EACV;EACA;EACA;EACA;;cAGW;UACH;UACA;UACA;UACA;UACA;UACA;mBACS;EAEL,YAAA;IAAY;;EAIxB,KAAK,eAAe;EAsBpB,SAAS;UAiBD;UA+BA;UAcA"}