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
@@ -1 +1 @@
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":";;;;;;;;;;AAyGA,IAAM,gCAAN,MAAM,8BAAmE;CACvE;CACA;CAEA,YAAY,OAAwC;EAClD,KAAK,SAAS,SAAS;GACrB,QAAQ,kBAAkB;GAC1B,gBAAgB,IAAI,QAAQ;EAC9B;CACF;CAEA,IAAI,sBAAsB;EACxB,OAAO,KAAK,OAAO,OAAO,SAAS;CACrC;CAEA,yBAAyB;EACvB,OAAO,KAAK,OAAO,OAAO;CAC5B;CAEA,4BAA4B,UAAsB;EAChD,KAAK,OAAO,kBAAkB;CAChC;CAEA,SAAiB,MAAgB,QAAyB;EACxD,IAAI,KAAK,OAAO,QAAQ;GACtB,KAAK,OAAO,OAAO,WAAW,MAAM;GACpC,KAAK,OAAO,SAAS,KAAA;EACvB;EAEA,KAAK,QAAQ;GACX,MAAM;GACN;GACA,MAAM,CAAC;EACT,CAAC;EACD,KAAK,OAAO,OAAO,UACjB,OAAO,YACL,IAAI,kBAAkB,KAAK,OAAO,eAAe,KAAK,CACxD,CACF;CACF;CAEA,MAAM,QAAyB;EAC7B,KAAK,OAAO,OAAO,UACjB,OAAO,YAAY,IAAI,iBAAiB,KAAK,OAAO,cAAc,CAAC,CACrE;CACF;CAEA,WAAW,WAAmB;EAC5B,IACE,KAAK,OAAO,QAAQ,SAAS,UAC7B,KAAK,OAAO,OAAO,aAAa,KAAK,WAErC,KAAK,OAAO,SAAS;GACnB,MAAM;GACN,UAAU,KAAK;GACf,YAAY,KAAK,YAAY;EAC/B;EAEF,KAAK,OAAO,OAAO,WAAW,OAAO,SAAS;CAChD;CAEA,gBAAgB,WAAmB;EACjC,IACE,KAAK,OAAO,QAAQ,SAAS,eAC7B,KAAK,OAAO,OAAO,aAAa,KAAK,WAErC,KAAK,OAAO,SAAS;GACnB,MAAM;GACN,UAAU,KAAK;GACf,YAAY,KAAK,iBAAiB;EACpC;EAEF,KAAK,OAAO,OAAO,WAAW,OAAO,SAAS;CAChD;CAEA,cAAc;EACZ,MAAM,CAAC,QAAQ,cAAc,2BAA2B;EACxD,KAAK,SAAS,KAAK,oBAAoB,EAAE,MAAM,OAAO,CAAC,GAAG,MAAM;EAChE,OAAO;CACT;CAEA,mBAAmB;EACjB,MAAM,CAAC,QAAQ,cAAc,2BAA2B;EACxD,KAAK,SAAS,KAAK,oBAAoB,EAAE,MAAM,YAAY,CAAC,GAAG,MAAM;EACrE,OAAO;CACT;CAEA,gBACE,SAC0B;EAC1B,MAAM,MAAM,OAAO,YAAY,WAAW,EAAE,UAAU,QAAQ,IAAI;EAClE,MAAM,WAAW,IAAI;EACrB,MAAM,aAAa,IAAI,cAAc,WAAW;EAEhD,MAAM,CAAC,QAAQ,cAAc,+BAA+B;EAC5D,KAAK,SACH;GACE,MAAM;GACN;GACA;GACA,GAAI,KAAK,aAAa,EAAE,UAAU,KAAK,UAAU;EACnD,GACA,MACF;EAEA,IAAI,IAAI,aAAa,KAAA,GAAW;GAC9B,WAAW,SAAS,OAAO,IAAI,QAAQ;GACvC,WAAW,SAAS,MAAM;EAC5B;EACA,IAAI,IAAI,SAAS,KAAA,GAAW;GAC1B,WAAW,SAAS,OAAO,KAAK,UAAU,IAAI,IAAI,CAAC;GACnD,WAAW,SAAS,MAAM;EAC5B;EACA,IAAI,IAAI,aAAa,KAAA,GACnB,WAAW,YAAY,IAAI,QAAQ;EAGrC,OAAO;CACT;CAEA,sBAA+C;EAC7C,OAAO,IAAI,eAAe,EACxB,MAAM,YAAY;GAChB,WAAW,QAAQ;IAAE,MAAM;IAAe,MAAM,CAAC;GAAE,CAAC;GACpD,WAAW,MAAM;EACnB,EACF,CAAC;CACH;CAEA,oBAA+B,SAAe;EAC5C,IAAI,CAAC,KAAK,WAAW,OAAO;EAC5B,OAAO;GAAE,GAAG;GAAS,UAAU,KAAK;EAAU;CAChD;CAEA,aAAa,SAAqB;EAChC,KAAK,SACH,KAAK,oBAAoB,OAAO,GAChC,KAAK,oBAAoB,CAC3B;CACF;CAEA,WAAW,SAAmB;EAC5B,KAAK,SACH,KAAK,oBAAoB,OAAO,GAChC,KAAK,oBAAoB,CAC3B;CACF;CAEA,WAAW,SAAmB;EAC5B,KAAK,SACH,KAAK,oBAAoB,OAAO,GAChC,KAAK,oBAAoB,CAC3B;CACF;CAEA,QAAQ,OAA6B;EACnC,KAAK,OAAO,OAAO,QAAQ,KAAK;EAEhC,IAAI,MAAM,SAAS,gBAAgB,MAAM,KAAK,WAAW,GACvD,KAAK,OAAO,eAAe,GAAG;CAElC;CAEA,aAAa,UAA6C;EACxD,MAAM,aAAa,IAAI,8BAA8B,KAAK,MAAM;EAChE,WAAW,YAAY;EACvB,OAAO;CACT;CAEA,QAAQ;EACN,KAAK,OAAO,QAAQ,YAAY,MAAM;EACtC,KAAK,OAAO,OAAO,KAAK;EAExB,KAAK,OAAO,kBAAkB;CAChC;AACF;;;;;;;;;;AAWA,SAAgB,sBACd,UACiB;CACjB,MAAM,aAAa,IAAI,8BAA8B;CAErD,MAAM,UAAU,YAAY;EAC1B,IAAI;GACF,MAAM,SAAS,UAAU;EAC3B,SAAS,GAAG;GACV,IAAI,CAAC,WAAW,qBACd,WAAW,QAAQ;IACjB,MAAM;IACN,MAAM,CAAC;IACP,OAAO,OAAO,CAAC;GACjB,CAAC;GAEH,MAAM;EACR,UAAU;GACR,IAAI,CAAC,WAAW,qBACd,WAAW,MAAM;EAErB;CACF;CACA,QAAQ;CAER,OAAO,WAAW,uBAAuB;AAC3C;;;;;;;;AASA,SAAgB,kCAAkC;CAChD,MAAM,EAAE,SAAS,YAAY,qBAA2B;CACxD,IAAI;CAUJ,OAAO,CATQ,uBAAuB,MAAM;EAC1C,aAAa;EAEb,WAA8C,4BAC5C,OACF;EAEA,OAAO;CACT,CACa,GAAG,UAAU;AAC5B;;;;;;;;AASA,SAAgB,8BACd,UACA;CACA,OAAO,gBAAgB,WACrB,sBAAsB,QAAQ,GAC9B,IAAI,kBAAkB,CACxB;AACF"}
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 (\n this._state.merger.isSealed() ||\n this._state.merger.isCancelled() ||\n this._state.merger.isErrored()\n );\n }\n\n get __internal_isCancelled() {\n return this._state.merger.isCancelled();\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 while\n * the stream is open, an `error` chunk is emitted. Failures after an explicit\n * close are logged, while failures after consumer cancellation are discarded.\n * When the callback settles, the stream is closed automatically unless the\n * controller was 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 } else if (!controller.__internal_isCancelled) {\n console.error(e);\n }\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,6 +1,5 @@
1
1
  import { UnderlyingReadable } from "../utils/stream/UnderlyingReadable.js";
2
2
  import { AssistantStream } from "../AssistantStream.js";
3
-
4
3
  //#region src/core/modules/text.d.ts
5
4
  type TextStreamController = {
6
5
  append(textDelta: string): void;
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"text.d.ts","names":[],"sources":["../../../src/core/modules/text.ts"],"mappings":";;;KAIY;EACV,OAAO;EACP;;cAiCW,mBACX,UAAU,mBAAmB,0BAC5B;cAcU,4CAA0B,iBAAA"}
@@ -3,7 +3,6 @@ import { UnderlyingReadable } from "../utils/stream/UnderlyingReadable.js";
3
3
  import { TextStreamController } from "./text.js";
4
4
  import { ToolResponseLike } from "../tool/ToolResponse.js";
5
5
  import { AssistantStream } from "../AssistantStream.js";
6
-
7
6
  //#region src/core/modules/tool-call.d.ts
8
7
  type ToolCallStreamController = {
9
8
  argsText: TextStreamController;
@@ -1 +1 @@
1
- {"version":3,"file":"tool-call.d.ts","names":[],"sources":["../../../src/core/modules/tool-call.ts"],"mappings":";;;;;;;KAOY,wBAAA;EACV,QAAA,EAAU,oBAAA;EAEV,WAAA,CAAY,QAAA,EAAU,gBAAA,CAAiB,iBAAA;EACvC,KAAA;AAAA;AAAA,cA2FW,oBAAA,GACX,QAAA,EAAU,kBAAA,CAAmB,wBAAA,MAC5B,eAAA;AAAA,cAcU,8BAAA,kBAA8B,eAAA,EAAA,wBAAA"}
1
+ {"version":3,"file":"tool-call.d.ts","names":[],"sources":["../../../src/core/modules/tool-call.ts"],"mappings":";;;;;;KAOY;EACV,UAAU;EAEV,YAAY,UAAU,iBAAiB;EACvC;;cA2FW,uBACX,UAAU,mBAAmB,8BAC5B;cAcU,gDAA8B,iBAAA"}
@@ -36,8 +36,6 @@ var ToolCallStreamControllerImpl = class {
36
36
  }
37
37
  _argsTextController;
38
38
  async setResponse(response) {
39
- this._argsTextController.close();
40
- await Promise.resolve();
41
39
  this._controller.enqueue({
42
40
  type: "result",
43
41
  path: [],
@@ -47,6 +45,8 @@ var ToolCallStreamControllerImpl = class {
47
45
  ...response.modelContent !== void 0 ? { modelContent: response.modelContent } : {},
48
46
  ...response.messages !== void 0 ? { messages: response.messages } : {}
49
47
  });
48
+ this._argsTextController.close();
49
+ await Promise.resolve();
50
50
  }
51
51
  async close() {
52
52
  if (this._isClosed) return;
@@ -1 +1 @@
1
- {"version":3,"file":"tool-call.js","names":[],"sources":["../../../src/core/modules/tool-call.ts"],"sourcesContent":["import type { AssistantStream } from \"../AssistantStream\";\nimport type { AssistantStreamChunk } from \"../AssistantStreamChunk\";\nimport type { ToolResponseLike } from \"../tool/ToolResponse\";\nimport type { ReadonlyJSONValue } from \"../../utils/json/json-value\";\nimport type { UnderlyingReadable } from \"../utils/stream/UnderlyingReadable\";\nimport { createTextStream, type TextStreamController } from \"./text\";\n\nexport type ToolCallStreamController = {\n argsText: TextStreamController;\n\n setResponse(response: ToolResponseLike<ReadonlyJSONValue>): void;\n close(): void;\n};\n\nclass ToolCallStreamControllerImpl implements ToolCallStreamController {\n private _isClosed = false;\n\n private _mergeTask: Promise<void>;\n constructor(\n private _controller: ReadableStreamDefaultController<AssistantStreamChunk>,\n ) {\n const stream = createTextStream({\n start: (c) => {\n this._argsTextController = c;\n },\n });\n\n let hasArgsText = false;\n this._mergeTask = stream.pipeTo(\n new WritableStream({\n write: (chunk) => {\n switch (chunk.type) {\n case \"text-delta\":\n hasArgsText = true;\n this._controller.enqueue(chunk);\n break;\n\n case \"part-finish\":\n if (!hasArgsText) {\n // if no argsText was provided, assume empty object\n this._controller.enqueue({\n type: \"text-delta\",\n textDelta: \"{}\",\n path: [],\n });\n }\n this._controller.enqueue({\n type: \"tool-call-args-text-finish\",\n path: [],\n });\n break;\n\n default:\n throw new Error(`Unexpected chunk type: ${chunk.type}`);\n }\n },\n }),\n );\n }\n\n get argsText() {\n return this._argsTextController;\n }\n\n private _argsTextController!: TextStreamController;\n\n async setResponse(response: ToolResponseLike<ReadonlyJSONValue>) {\n this._argsTextController.close();\n await Promise.resolve(); // flush microtask queue\n // TODO switch argsTextController to be something that doesn'#t require this\n this._controller.enqueue({\n type: \"result\",\n path: [],\n ...(response.artifact !== undefined\n ? { artifact: response.artifact }\n : {}),\n result: response.result,\n isError: response.isError ?? false,\n ...(response.modelContent !== undefined\n ? { modelContent: response.modelContent }\n : {}),\n ...(response.messages !== undefined\n ? { messages: response.messages }\n : {}),\n });\n }\n\n async close() {\n if (this._isClosed) return;\n\n this._isClosed = true;\n this._argsTextController.close();\n await this._mergeTask;\n\n this._controller.enqueue({\n type: \"part-finish\",\n path: [],\n });\n this._controller.close();\n }\n}\n\nexport const createToolCallStream = (\n readable: UnderlyingReadable<ToolCallStreamController>,\n): AssistantStream => {\n return new ReadableStream({\n start(c) {\n return readable.start?.(new ToolCallStreamControllerImpl(c));\n },\n pull(c) {\n return readable.pull?.(new ToolCallStreamControllerImpl(c));\n },\n cancel(c) {\n return readable.cancel?.(c);\n },\n });\n};\n\nexport const createToolCallStreamController = () => {\n let controller!: ToolCallStreamController;\n const stream = createToolCallStream({\n start(c) {\n controller = c;\n },\n });\n return [stream, controller] as const;\n};\n"],"mappings":";;AAcA,IAAM,+BAAN,MAAuE;CAK3D;CAJV,YAAoB;CAEpB;CACA,YACE,aACA;EADQ,KAAA,cAAA;EAER,MAAM,SAAS,iBAAiB,EAC9B,QAAQ,MAAM;GACZ,KAAK,sBAAsB;EAC7B,EACF,CAAC;EAED,IAAI,cAAc;EAClB,KAAK,aAAa,OAAO,OACvB,IAAI,eAAe,EACjB,QAAQ,UAAU;GAChB,QAAQ,MAAM,MAAd;IACE,KAAK;KACH,cAAc;KACd,KAAK,YAAY,QAAQ,KAAK;KAC9B;IAEF,KAAK;KACH,IAAI,CAAC,aAEH,KAAK,YAAY,QAAQ;MACvB,MAAM;MACN,WAAW;MACX,MAAM,CAAC;KACT,CAAC;KAEH,KAAK,YAAY,QAAQ;MACvB,MAAM;MACN,MAAM,CAAC;KACT,CAAC;KACD;IAEF,SACE,MAAM,IAAI,MAAM,0BAA0B,MAAM,MAAM;GAC1D;EACF,EACF,CAAC,CACH;CACF;CAEA,IAAI,WAAW;EACb,OAAO,KAAK;CACd;CAEA;CAEA,MAAM,YAAY,UAA+C;EAC/D,KAAK,oBAAoB,MAAM;EAC/B,MAAM,QAAQ,QAAQ;EAEtB,KAAK,YAAY,QAAQ;GACvB,MAAM;GACN,MAAM,CAAC;GACP,GAAI,SAAS,aAAa,KAAA,IACtB,EAAE,UAAU,SAAS,SAAS,IAC9B,CAAC;GACL,QAAQ,SAAS;GACjB,SAAS,SAAS,WAAW;GAC7B,GAAI,SAAS,iBAAiB,KAAA,IAC1B,EAAE,cAAc,SAAS,aAAa,IACtC,CAAC;GACL,GAAI,SAAS,aAAa,KAAA,IACtB,EAAE,UAAU,SAAS,SAAS,IAC9B,CAAC;EACP,CAAC;CACH;CAEA,MAAM,QAAQ;EACZ,IAAI,KAAK,WAAW;EAEpB,KAAK,YAAY;EACjB,KAAK,oBAAoB,MAAM;EAC/B,MAAM,KAAK;EAEX,KAAK,YAAY,QAAQ;GACvB,MAAM;GACN,MAAM,CAAC;EACT,CAAC;EACD,KAAK,YAAY,MAAM;CACzB;AACF;AAEA,MAAa,wBACX,aACoB;CACpB,OAAO,IAAI,eAAe;EACxB,MAAM,GAAG;GACP,OAAO,SAAS,QAAQ,IAAI,6BAA6B,CAAC,CAAC;EAC7D;EACA,KAAK,GAAG;GACN,OAAO,SAAS,OAAO,IAAI,6BAA6B,CAAC,CAAC;EAC5D;EACA,OAAO,GAAG;GACR,OAAO,SAAS,SAAS,CAAC;EAC5B;CACF,CAAC;AACH;AAEA,MAAa,uCAAuC;CAClD,IAAI;CAMJ,OAAO,CALQ,qBAAqB,EAClC,MAAM,GAAG;EACP,aAAa;CACf,EACF,CACa,GAAG,UAAU;AAC5B"}
1
+ {"version":3,"file":"tool-call.js","names":[],"sources":["../../../src/core/modules/tool-call.ts"],"sourcesContent":["import type { AssistantStream } from \"../AssistantStream\";\nimport type { AssistantStreamChunk } from \"../AssistantStreamChunk\";\nimport type { ToolResponseLike } from \"../tool/ToolResponse\";\nimport type { ReadonlyJSONValue } from \"../../utils/json/json-value\";\nimport type { UnderlyingReadable } from \"../utils/stream/UnderlyingReadable\";\nimport { createTextStream, type TextStreamController } from \"./text\";\n\nexport type ToolCallStreamController = {\n argsText: TextStreamController;\n\n setResponse(response: ToolResponseLike<ReadonlyJSONValue>): void;\n close(): void;\n};\n\nclass ToolCallStreamControllerImpl implements ToolCallStreamController {\n private _isClosed = false;\n\n private _mergeTask: Promise<void>;\n constructor(\n private _controller: ReadableStreamDefaultController<AssistantStreamChunk>,\n ) {\n const stream = createTextStream({\n start: (c) => {\n this._argsTextController = c;\n },\n });\n\n let hasArgsText = false;\n this._mergeTask = stream.pipeTo(\n new WritableStream({\n write: (chunk) => {\n switch (chunk.type) {\n case \"text-delta\":\n hasArgsText = true;\n this._controller.enqueue(chunk);\n break;\n\n case \"part-finish\":\n if (!hasArgsText) {\n // if no argsText was provided, assume empty object\n this._controller.enqueue({\n type: \"text-delta\",\n textDelta: \"{}\",\n path: [],\n });\n }\n this._controller.enqueue({\n type: \"tool-call-args-text-finish\",\n path: [],\n });\n break;\n\n default:\n throw new Error(`Unexpected chunk type: ${chunk.type}`);\n }\n },\n }),\n );\n }\n\n get argsText() {\n return this._argsTextController;\n }\n\n private _argsTextController!: TextStreamController;\n\n async setResponse(response: ToolResponseLike<ReadonlyJSONValue>) {\n this._controller.enqueue({\n type: \"result\",\n path: [],\n ...(response.artifact !== undefined\n ? { artifact: response.artifact }\n : {}),\n result: response.result,\n isError: response.isError ?? false,\n ...(response.modelContent !== undefined\n ? { modelContent: response.modelContent }\n : {}),\n ...(response.messages !== undefined\n ? { messages: response.messages }\n : {}),\n });\n this._argsTextController.close();\n await Promise.resolve(); // flush microtask queue\n // TODO switch argsTextController to be something that doesn'#t require this\n }\n\n async close() {\n if (this._isClosed) return;\n\n this._isClosed = true;\n this._argsTextController.close();\n await this._mergeTask;\n\n this._controller.enqueue({\n type: \"part-finish\",\n path: [],\n });\n this._controller.close();\n }\n}\n\nexport const createToolCallStream = (\n readable: UnderlyingReadable<ToolCallStreamController>,\n): AssistantStream => {\n return new ReadableStream({\n start(c) {\n return readable.start?.(new ToolCallStreamControllerImpl(c));\n },\n pull(c) {\n return readable.pull?.(new ToolCallStreamControllerImpl(c));\n },\n cancel(c) {\n return readable.cancel?.(c);\n },\n });\n};\n\nexport const createToolCallStreamController = () => {\n let controller!: ToolCallStreamController;\n const stream = createToolCallStream({\n start(c) {\n controller = c;\n },\n });\n return [stream, controller] as const;\n};\n"],"mappings":";;AAcA,IAAM,+BAAN,MAAuE;CAK3D;CAJV,YAAoB;CAEpB;CACA,YACE,aACA;EADQ,KAAA,cAAA;EAER,MAAM,SAAS,iBAAiB,EAC9B,QAAQ,MAAM;GACZ,KAAK,sBAAsB;EAC7B,EACF,CAAC;EAED,IAAI,cAAc;EAClB,KAAK,aAAa,OAAO,OACvB,IAAI,eAAe,EACjB,QAAQ,UAAU;GAChB,QAAQ,MAAM,MAAd;IACE,KAAK;KACH,cAAc;KACd,KAAK,YAAY,QAAQ,KAAK;KAC9B;IAEF,KAAK;KACH,IAAI,CAAC,aAEH,KAAK,YAAY,QAAQ;MACvB,MAAM;MACN,WAAW;MACX,MAAM,CAAC;KACT,CAAC;KAEH,KAAK,YAAY,QAAQ;MACvB,MAAM;MACN,MAAM,CAAC;KACT,CAAC;KACD;IAEF,SACE,MAAM,IAAI,MAAM,0BAA0B,MAAM,MAAM;GAC1D;EACF,EACF,CAAC,CACH;CACF;CAEA,IAAI,WAAW;EACb,OAAO,KAAK;CACd;CAEA;CAEA,MAAM,YAAY,UAA+C;EAC/D,KAAK,YAAY,QAAQ;GACvB,MAAM;GACN,MAAM,CAAC;GACP,GAAI,SAAS,aAAa,KAAA,IACtB,EAAE,UAAU,SAAS,SAAS,IAC9B,CAAC;GACL,QAAQ,SAAS;GACjB,SAAS,SAAS,WAAW;GAC7B,GAAI,SAAS,iBAAiB,KAAA,IAC1B,EAAE,cAAc,SAAS,aAAa,IACtC,CAAC;GACL,GAAI,SAAS,aAAa,KAAA,IACtB,EAAE,UAAU,SAAS,SAAS,IAC9B,CAAC;EACP,CAAC;EACD,KAAK,oBAAoB,MAAM;EAC/B,MAAM,QAAQ,QAAQ;CAExB;CAEA,MAAM,QAAQ;EACZ,IAAI,KAAK,WAAW;EAEpB,KAAK,YAAY;EACjB,KAAK,oBAAoB,MAAM;EAC/B,MAAM,KAAK;EAEX,KAAK,YAAY,QAAQ;GACvB,MAAM;GACN,MAAM,CAAC;EACT,CAAC;EACD,KAAK,YAAY,MAAM;CACzB;AACF;AAEA,MAAa,wBACX,aACoB;CACpB,OAAO,IAAI,eAAe;EACxB,MAAM,GAAG;GACP,OAAO,SAAS,QAAQ,IAAI,6BAA6B,CAAC,CAAC;EAC7D;EACA,KAAK,GAAG;GACN,OAAO,SAAS,OAAO,IAAI,6BAA6B,CAAC,CAAC;EAC5D;EACA,OAAO,GAAG;GACR,OAAO,SAAS,SAAS,CAAC;EAC5B;CACF,CAAC;AACH;AAEA,MAAa,uCAAuC;CAClD,IAAI;CAMJ,OAAO,CALQ,qBAAqB,EAClC,MAAM,GAAG;EACP,aAAa;CACf,EACF,CACa,GAAG,UAAU;AAC5B"}
@@ -1,7 +1,6 @@
1
1
  import { AssistantStreamChunk } from "../AssistantStreamChunk.js";
2
2
  import { AssistantStreamEncoder } from "../AssistantStream.js";
3
3
  import { PipeableTransformStream } from "../utils/stream/PipeableTransformStream.js";
4
-
5
4
  //#region src/core/serialization/PlainText.d.ts
6
5
  declare class PlainTextEncoder extends PipeableTransformStream<AssistantStreamChunk, Uint8Array<ArrayBuffer>> implements AssistantStreamEncoder {
7
6
  headers: Headers;
@@ -1 +1 @@
1
- {"version":3,"file":"PlainText.d.ts","names":[],"sources":["../../../src/core/serialization/PlainText.ts"],"mappings":";;;;;cAKa,gBAAA,SACH,uBAAA,CAAwB,oBAAA,EAAsB,UAAA,CAAW,WAAA,cACtD,sBAAA;EAEX,OAAA,EAAO,OAAA;;;cA6CI,gBAAA,SAAyB,uBAAA,CACpC,UAAA,CAAW,WAAA,GACX,oBAAA"}
1
+ {"version":3,"file":"PlainText.d.ts","names":[],"sources":["../../../src/core/serialization/PlainText.ts"],"mappings":";;;;cAKa,yBACH,wBAAwB,sBAAsB,WAAW,yBACtD;EAEX,SAAO;;;cA6CI,yBAAyB,wBACpC,WAAW,cACX"}
@@ -1,7 +1,6 @@
1
1
  import { AssistantStreamChunk } from "../../AssistantStreamChunk.js";
2
2
  import { AssistantStreamEncoder } from "../../AssistantStream.js";
3
3
  import { PipeableTransformStream } from "../../utils/stream/PipeableTransformStream.js";
4
-
5
4
  //#region src/core/serialization/assistant-transport/AssistantTransport.d.ts
6
5
  /**
7
6
  * AssistantTransportEncoder encodes AssistantStreamChunks into SSE format
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantTransport.d.ts","names":[],"sources":["../../../../src/core/serialization/assistant-transport/AssistantTransport.ts"],"mappings":";;;;;;;AASA;;cAAa,yBAAA,SACH,uBAAA,CAAwB,oBAAA,EAAsB,UAAA,CAAW,WAAA,cACtD,sBAAA;EAEX,OAAA,EAAO,OAAA;;;;;;;cA8FI,yBAAA,SAAkC,uBAAA,CAC7C,UAAA,CAAW,WAAA,GACX,oBAAA"}
1
+ {"version":3,"file":"AssistantTransport.d.ts","names":[],"sources":["../../../../src/core/serialization/assistant-transport/AssistantTransport.ts"],"mappings":";;;;;;;;cA6Ea,kCACH,wBAAwB,sBAAsB,WAAW,yBACtD;EAEX,SAAO;;;;;;;cA4BI,kCAAkC,wBAC7C,WAAW,cACX"}
@@ -1,6 +1,87 @@
1
1
  import { PipeableTransformStream } from "../../utils/stream/PipeableTransformStream.js";
2
- import { LineDecoderStream } from "../../utils/stream/LineDecoderStream.js";
2
+ import { SSEEventDecoderStream } from "../../utils/stream/SSEEventDecoderStream.js";
3
+ import sjson from "secure-json-parse";
3
4
  //#region src/core/serialization/assistant-transport/AssistantTransport.ts
5
+ const noFields = () => true;
6
+ const requiredObject = (key) => (c) => {
7
+ const value = c[key];
8
+ return typeof value === "object" && value !== null && !Array.isArray(value);
9
+ };
10
+ const requiredString = (key) => (c) => typeof c[key] === "string";
11
+ const requiredArray = (key) => (c) => Array.isArray(c[key]);
12
+ const optionalBoolean = (key) => (c) => c[key] === void 0 || typeof c[key] === "boolean";
13
+ const KNOWN_CHUNK_TYPES = {
14
+ "part-start": {
15
+ kind: "message",
16
+ valid: requiredObject("part")
17
+ },
18
+ "part-finish": {
19
+ kind: "part-addressed",
20
+ valid: noFields
21
+ },
22
+ "tool-call-args-text-finish": {
23
+ kind: "part-addressed",
24
+ valid: noFields
25
+ },
26
+ "text-delta": {
27
+ kind: "part-addressed",
28
+ valid: requiredString("textDelta")
29
+ },
30
+ annotations: {
31
+ kind: "message",
32
+ valid: requiredArray("annotations")
33
+ },
34
+ data: {
35
+ kind: "message",
36
+ valid: requiredArray("data")
37
+ },
38
+ "step-start": {
39
+ kind: "message",
40
+ valid: noFields
41
+ },
42
+ "step-finish": {
43
+ kind: "message",
44
+ valid: requiredString("finishReason")
45
+ },
46
+ "message-finish": {
47
+ kind: "message",
48
+ valid: requiredString("finishReason")
49
+ },
50
+ result: {
51
+ kind: "part-addressed",
52
+ valid: optionalBoolean("isError")
53
+ },
54
+ error: {
55
+ kind: "message",
56
+ valid: noFields
57
+ },
58
+ "update-state": {
59
+ kind: "message",
60
+ valid: requiredArray("operations")
61
+ }
62
+ };
63
+ const parseChunk = (data) => {
64
+ let value;
65
+ try {
66
+ value = sjson.parse(data);
67
+ } catch {
68
+ return "unparseable";
69
+ }
70
+ if (typeof value !== "object" || value === null || Array.isArray(value)) return "not-an-object";
71
+ const { type, path } = value;
72
+ if (typeof type !== "string" || !Object.prototype.hasOwnProperty.call(KNOWN_CHUNK_TYPES, type)) return "unknown-type";
73
+ const rule = KNOWN_CHUNK_TYPES[type];
74
+ if (!rule.valid(value)) return `invalid-fields:${type}`;
75
+ if (path === void 0) {
76
+ if (rule.kind !== "message") return `missing-path:${type}`;
77
+ return {
78
+ ...value,
79
+ path: []
80
+ };
81
+ }
82
+ if (!Array.isArray(path) || !path.every((entry) => Number.isInteger(entry) && entry >= 0)) return "invalid-path";
83
+ return value;
84
+ };
4
85
  /**
5
86
  * AssistantTransportEncoder encodes AssistantStreamChunks into SSE format
6
87
  * and emits [DONE] when the stream completes.
@@ -24,56 +105,6 @@ var AssistantTransportEncoder = class extends PipeableTransformStream {
24
105
  });
25
106
  }
26
107
  };
27
- var SSEEventStream = class extends TransformStream {
28
- constructor() {
29
- let eventBuffer = {};
30
- let dataLines = [];
31
- super({
32
- start() {
33
- eventBuffer = {};
34
- dataLines = [];
35
- },
36
- transform(line, controller) {
37
- if (line.startsWith(":")) return;
38
- if (line === "") {
39
- if (dataLines.length > 0) controller.enqueue({
40
- event: eventBuffer.event || "message",
41
- data: dataLines.join("\n"),
42
- id: eventBuffer.id,
43
- retry: eventBuffer.retry
44
- });
45
- eventBuffer = {};
46
- dataLines = [];
47
- return;
48
- }
49
- const [field, ...rest] = line.split(":");
50
- const value = rest.join(":").trimStart();
51
- switch (field) {
52
- case "event":
53
- eventBuffer.event = value;
54
- break;
55
- case "data":
56
- dataLines.push(value);
57
- break;
58
- case "id":
59
- eventBuffer.id = value;
60
- break;
61
- case "retry":
62
- eventBuffer.retry = Number(value);
63
- break;
64
- }
65
- },
66
- flush(controller) {
67
- if (dataLines.length > 0) controller.enqueue({
68
- event: eventBuffer.event || "message",
69
- data: dataLines.join("\n"),
70
- id: eventBuffer.id,
71
- retry: eventBuffer.retry
72
- });
73
- }
74
- });
75
- }
76
- };
77
108
  /**
78
109
  * AssistantTransportDecoder decodes SSE format into AssistantStreamChunks.
79
110
  * It stops decoding when it encounters [DONE].
@@ -82,14 +113,23 @@ var AssistantTransportDecoder = class extends PipeableTransformStream {
82
113
  constructor() {
83
114
  super((readable) => {
84
115
  let receivedDone = false;
85
- return readable.pipeThrough(new TextDecoderStream()).pipeThrough(new LineDecoderStream()).pipeThrough(new SSEEventStream()).pipeThrough(new TransformStream({
116
+ const warnedReasons = /* @__PURE__ */ new Set();
117
+ return readable.pipeThrough(new TextDecoderStream()).pipeThrough(new SSEEventDecoderStream()).pipeThrough(new TransformStream({
86
118
  transform(event, controller) {
87
119
  switch (event.event) {
88
120
  case "message":
89
121
  if (event.data === "[DONE]") {
90
122
  receivedDone = true;
91
123
  controller.terminate();
92
- } else controller.enqueue(JSON.parse(event.data));
124
+ } else {
125
+ const chunk = parseChunk(event.data);
126
+ if (typeof chunk === "string") {
127
+ if (!warnedReasons.has(chunk)) {
128
+ warnedReasons.add(chunk);
129
+ console.warn(`Dropped invalid assistant-transport chunk (${chunk}): ${event.data.slice(0, 200)}`);
130
+ }
131
+ } else controller.enqueue(chunk);
132
+ }
93
133
  break;
94
134
  default: throw new Error(`Unknown SSE event type: ${event.event}`);
95
135
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantTransport.js","names":[],"sources":["../../../../src/core/serialization/assistant-transport/AssistantTransport.ts"],"sourcesContent":["import type { AssistantStreamChunk } from \"../../AssistantStreamChunk\";\nimport { PipeableTransformStream } from \"../../utils/stream/PipeableTransformStream\";\nimport { LineDecoderStream } from \"../../utils/stream/LineDecoderStream\";\nimport type { AssistantStreamEncoder } from \"../../AssistantStream\";\n\n/**\n * AssistantTransportEncoder encodes AssistantStreamChunks into SSE format\n * and emits [DONE] when the stream completes.\n */\nexport class AssistantTransportEncoder\n extends PipeableTransformStream<AssistantStreamChunk, Uint8Array<ArrayBuffer>>\n implements AssistantStreamEncoder\n{\n headers = new Headers({\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n });\n\n constructor() {\n super((readable) => {\n return readable\n .pipeThrough(\n new TransformStream<AssistantStreamChunk, string>({\n transform(chunk, controller) {\n controller.enqueue(`data: ${JSON.stringify(chunk)}\\n\\n`);\n },\n flush(controller) {\n controller.enqueue(\"data: [DONE]\\n\\n\");\n },\n }),\n )\n .pipeThrough(new TextEncoderStream());\n });\n }\n}\n\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\n/**\n * AssistantTransportDecoder decodes SSE format into AssistantStreamChunks.\n * It stops decoding when it encounters [DONE].\n */\nexport class AssistantTransportDecoder extends PipeableTransformStream<\n Uint8Array<ArrayBuffer>,\n AssistantStreamChunk\n> {\n constructor() {\n super((readable) => {\n let receivedDone = false;\n\n return readable\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(new LineDecoderStream())\n .pipeThrough(new SSEEventStream())\n .pipeThrough(\n new TransformStream<SSEEvent, AssistantStreamChunk>({\n transform(event, controller) {\n switch (event.event) {\n case \"message\":\n if (event.data === \"[DONE]\") {\n // Mark that we received [DONE]\n receivedDone = true;\n // Stop processing when we encounter [DONE]\n controller.terminate();\n } else {\n controller.enqueue(JSON.parse(event.data));\n }\n break;\n default:\n throw new Error(`Unknown SSE event type: ${event.event}`);\n }\n },\n flush() {\n if (!receivedDone) {\n throw new Error(\n \"Stream ended abruptly without receiving [DONE] marker\",\n );\n }\n },\n }),\n );\n });\n }\n}\n"],"mappings":";;;;;;;AASA,IAAa,4BAAb,cACU,wBAEV;CACE,UAAU,IAAI,QAAQ;EACpB,gBAAgB;EAChB,iBAAiB;EACjB,YAAY;CACd,CAAC;CAED,cAAc;EACZ,OAAO,aAAa;GAClB,OAAO,SACJ,YACC,IAAI,gBAA8C;IAChD,UAAU,OAAO,YAAY;KAC3B,WAAW,QAAQ,SAAS,KAAK,UAAU,KAAK,EAAE,KAAK;IACzD;IACA,MAAM,YAAY;KAChB,WAAW,QAAQ,kBAAkB;IACvC;GACF,CAAC,CACH,CAAC,CACA,YAAY,IAAI,kBAAkB,CAAC;EACxC,CAAC;CACH;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;;;;;AAMA,IAAa,4BAAb,cAA+C,wBAG7C;CACA,cAAc;EACZ,OAAO,aAAa;GAClB,IAAI,eAAe;GAEnB,OAAO,SACJ,YAAY,IAAI,kBAAkB,CAAC,CAAC,CACpC,YAAY,IAAI,kBAAkB,CAAC,CAAC,CACpC,YAAY,IAAI,eAAe,CAAC,CAAC,CACjC,YACC,IAAI,gBAAgD;IAClD,UAAU,OAAO,YAAY;KAC3B,QAAQ,MAAM,OAAd;MACE,KAAK;OACH,IAAI,MAAM,SAAS,UAAU;QAE3B,eAAe;QAEf,WAAW,UAAU;OACvB,OACE,WAAW,QAAQ,KAAK,MAAM,MAAM,IAAI,CAAC;OAE3C;MACF,SACE,MAAM,IAAI,MAAM,2BAA2B,MAAM,OAAO;KAC5D;IACF;IACA,QAAQ;KACN,IAAI,CAAC,cACH,MAAM,IAAI,MACR,uDACF;IAEJ;GACF,CAAC,CACH;EACJ,CAAC;CACH;AACF"}
1
+ {"version":3,"file":"AssistantTransport.js","names":[],"sources":["../../../../src/core/serialization/assistant-transport/AssistantTransport.ts"],"sourcesContent":["import sjson from \"secure-json-parse\";\nimport type { AssistantStreamChunk } from \"../../AssistantStreamChunk\";\nimport { PipeableTransformStream } from \"../../utils/stream/PipeableTransformStream\";\nimport {\n SSEEventDecoderStream,\n type PipelineSSEEvent,\n} from \"../../utils/stream/SSEEventDecoderStream\";\nimport type { AssistantStreamEncoder } from \"../../AssistantStream\";\n\ntype ChunkFields = Record<string, unknown>;\n\ntype ChunkRule = {\n kind: \"message\" | \"part-addressed\";\n valid: (chunk: ChunkFields) => boolean;\n};\n\nconst noFields = () => true;\nconst requiredObject = (key: string) => (c: ChunkFields) => {\n const value = c[key];\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n};\nconst requiredString = (key: string) => (c: ChunkFields) =>\n typeof c[key] === \"string\";\nconst requiredArray = (key: string) => (c: ChunkFields) =>\n Array.isArray(c[key]);\nconst optionalBoolean = (key: string) => (c: ChunkFields) =>\n c[key] === undefined || typeof c[key] === \"boolean\";\n\nconst KNOWN_CHUNK_TYPES: Record<AssistantStreamChunk[\"type\"], ChunkRule> = {\n \"part-start\": { kind: \"message\", valid: requiredObject(\"part\") },\n \"part-finish\": { kind: \"part-addressed\", valid: noFields },\n \"tool-call-args-text-finish\": { kind: \"part-addressed\", valid: noFields },\n \"text-delta\": { kind: \"part-addressed\", valid: requiredString(\"textDelta\") },\n annotations: { kind: \"message\", valid: requiredArray(\"annotations\") },\n data: { kind: \"message\", valid: requiredArray(\"data\") },\n \"step-start\": { kind: \"message\", valid: noFields },\n \"step-finish\": { kind: \"message\", valid: requiredString(\"finishReason\") },\n \"message-finish\": { kind: \"message\", valid: requiredString(\"finishReason\") },\n result: { kind: \"part-addressed\", valid: optionalBoolean(\"isError\") },\n error: { kind: \"message\", valid: noFields },\n \"update-state\": { kind: \"message\", valid: requiredArray(\"operations\") },\n};\n\nconst parseChunk = (data: string): AssistantStreamChunk | string => {\n let value: unknown;\n try {\n value = sjson.parse(data);\n } catch {\n return \"unparseable\";\n }\n if (typeof value !== \"object\" || value === null || Array.isArray(value))\n return \"not-an-object\";\n const { type, path } = value as { type?: unknown; path?: unknown };\n if (\n typeof type !== \"string\" ||\n !Object.prototype.hasOwnProperty.call(KNOWN_CHUNK_TYPES, type)\n )\n return \"unknown-type\";\n const rule = KNOWN_CHUNK_TYPES[type as AssistantStreamChunk[\"type\"]];\n if (!rule.valid(value as Record<string, unknown>))\n return `invalid-fields:${type}`;\n if (path === undefined) {\n if (rule.kind !== \"message\") return `missing-path:${type}`;\n return { ...value, path: [] } as unknown as AssistantStreamChunk;\n }\n if (\n !Array.isArray(path) ||\n !path.every((entry) => Number.isInteger(entry) && entry >= 0)\n )\n return \"invalid-path\";\n return value as AssistantStreamChunk;\n};\n\n/**\n * AssistantTransportEncoder encodes AssistantStreamChunks into SSE format\n * and emits [DONE] when the stream completes.\n */\nexport class AssistantTransportEncoder\n extends PipeableTransformStream<AssistantStreamChunk, Uint8Array<ArrayBuffer>>\n implements AssistantStreamEncoder\n{\n headers = new Headers({\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n });\n\n constructor() {\n super((readable) => {\n return readable\n .pipeThrough(\n new TransformStream<AssistantStreamChunk, string>({\n transform(chunk, controller) {\n controller.enqueue(`data: ${JSON.stringify(chunk)}\\n\\n`);\n },\n flush(controller) {\n controller.enqueue(\"data: [DONE]\\n\\n\");\n },\n }),\n )\n .pipeThrough(new TextEncoderStream());\n });\n }\n}\n\n/**\n * AssistantTransportDecoder decodes SSE format into AssistantStreamChunks.\n * It stops decoding when it encounters [DONE].\n */\nexport class AssistantTransportDecoder extends PipeableTransformStream<\n Uint8Array<ArrayBuffer>,\n AssistantStreamChunk\n> {\n constructor() {\n super((readable) => {\n let receivedDone = false;\n const warnedReasons = new Set<string>();\n\n return readable\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(new SSEEventDecoderStream())\n .pipeThrough(\n new TransformStream<PipelineSSEEvent, AssistantStreamChunk>({\n transform(event, controller) {\n switch (event.event) {\n case \"message\":\n if (event.data === \"[DONE]\") {\n // Mark that we received [DONE]\n receivedDone = true;\n // Stop processing when we encounter [DONE]\n controller.terminate();\n } else {\n const chunk = parseChunk(event.data);\n if (typeof chunk === \"string\") {\n if (!warnedReasons.has(chunk)) {\n warnedReasons.add(chunk);\n console.warn(\n `Dropped invalid assistant-transport chunk (${chunk}): ${event.data.slice(0, 200)}`,\n );\n }\n } else {\n controller.enqueue(chunk);\n }\n }\n break;\n default:\n throw new Error(`Unknown SSE event type: ${event.event}`);\n }\n },\n flush() {\n if (!receivedDone) {\n throw new Error(\n \"Stream ended abruptly without receiving [DONE] marker\",\n );\n }\n },\n }),\n );\n });\n }\n}\n"],"mappings":";;;;AAgBA,MAAM,iBAAiB;AACvB,MAAM,kBAAkB,SAAiB,MAAmB;CAC1D,MAAM,QAAQ,EAAE;CAChB,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AACA,MAAM,kBAAkB,SAAiB,MACvC,OAAO,EAAE,SAAS;AACpB,MAAM,iBAAiB,SAAiB,MACtC,MAAM,QAAQ,EAAE,IAAI;AACtB,MAAM,mBAAmB,SAAiB,MACxC,EAAE,SAAS,KAAA,KAAa,OAAO,EAAE,SAAS;AAE5C,MAAM,oBAAqE;CACzE,cAAc;EAAE,MAAM;EAAW,OAAO,eAAe,MAAM;CAAE;CAC/D,eAAe;EAAE,MAAM;EAAkB,OAAO;CAAS;CACzD,8BAA8B;EAAE,MAAM;EAAkB,OAAO;CAAS;CACxE,cAAc;EAAE,MAAM;EAAkB,OAAO,eAAe,WAAW;CAAE;CAC3E,aAAa;EAAE,MAAM;EAAW,OAAO,cAAc,aAAa;CAAE;CACpE,MAAM;EAAE,MAAM;EAAW,OAAO,cAAc,MAAM;CAAE;CACtD,cAAc;EAAE,MAAM;EAAW,OAAO;CAAS;CACjD,eAAe;EAAE,MAAM;EAAW,OAAO,eAAe,cAAc;CAAE;CACxE,kBAAkB;EAAE,MAAM;EAAW,OAAO,eAAe,cAAc;CAAE;CAC3E,QAAQ;EAAE,MAAM;EAAkB,OAAO,gBAAgB,SAAS;CAAE;CACpE,OAAO;EAAE,MAAM;EAAW,OAAO;CAAS;CAC1C,gBAAgB;EAAE,MAAM;EAAW,OAAO,cAAc,YAAY;CAAE;AACxE;AAEA,MAAM,cAAc,SAAgD;CAClE,IAAI;CACJ,IAAI;EACF,QAAQ,MAAM,MAAM,IAAI;CAC1B,QAAQ;EACN,OAAO;CACT;CACA,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GACpE,OAAO;CACT,MAAM,EAAE,MAAM,SAAS;CACvB,IACE,OAAO,SAAS,YAChB,CAAC,OAAO,UAAU,eAAe,KAAK,mBAAmB,IAAI,GAE7D,OAAO;CACT,MAAM,OAAO,kBAAkB;CAC/B,IAAI,CAAC,KAAK,MAAM,KAAgC,GAC9C,OAAO,kBAAkB;CAC3B,IAAI,SAAS,KAAA,GAAW;EACtB,IAAI,KAAK,SAAS,WAAW,OAAO,gBAAgB;EACpD,OAAO;GAAE,GAAG;GAAO,MAAM,CAAC;EAAE;CAC9B;CACA,IACE,CAAC,MAAM,QAAQ,IAAI,KACnB,CAAC,KAAK,OAAO,UAAU,OAAO,UAAU,KAAK,KAAK,SAAS,CAAC,GAE5D,OAAO;CACT,OAAO;AACT;;;;;AAMA,IAAa,4BAAb,cACU,wBAEV;CACE,UAAU,IAAI,QAAQ;EACpB,gBAAgB;EAChB,iBAAiB;EACjB,YAAY;CACd,CAAC;CAED,cAAc;EACZ,OAAO,aAAa;GAClB,OAAO,SACJ,YACC,IAAI,gBAA8C;IAChD,UAAU,OAAO,YAAY;KAC3B,WAAW,QAAQ,SAAS,KAAK,UAAU,KAAK,EAAE,KAAK;IACzD;IACA,MAAM,YAAY;KAChB,WAAW,QAAQ,kBAAkB;IACvC;GACF,CAAC,CACH,CAAC,CACA,YAAY,IAAI,kBAAkB,CAAC;EACxC,CAAC;CACH;AACF;;;;;AAMA,IAAa,4BAAb,cAA+C,wBAG7C;CACA,cAAc;EACZ,OAAO,aAAa;GAClB,IAAI,eAAe;GACnB,MAAM,gCAAgB,IAAI,IAAY;GAEtC,OAAO,SACJ,YAAY,IAAI,kBAAkB,CAAC,CAAC,CACpC,YAAY,IAAI,sBAAsB,CAAC,CAAC,CACxC,YACC,IAAI,gBAAwD;IAC1D,UAAU,OAAO,YAAY;KAC3B,QAAQ,MAAM,OAAd;MACE,KAAK;OACH,IAAI,MAAM,SAAS,UAAU;QAE3B,eAAe;QAEf,WAAW,UAAU;OACvB,OAAO;QACL,MAAM,QAAQ,WAAW,MAAM,IAAI;QACnC,IAAI,OAAO,UAAU,UACf;aAAA,CAAC,cAAc,IAAI,KAAK,GAAG;UAC7B,cAAc,IAAI,KAAK;UACvB,QAAQ,KACN,8CAA8C,MAAM,KAAK,MAAM,KAAK,MAAM,GAAG,GAAG,GAClF;SACF;eAEA,WAAW,QAAQ,KAAK;OAE5B;OACA;MACF,SACE,MAAM,IAAI,MAAM,2BAA2B,MAAM,OAAO;KAC5D;IACF;IACA,QAAQ;KACN,IAAI,CAAC,cACH,MAAM,IAAI,MACR,uDACF;IAEJ;GACF,CAAC,CACH;EACJ,CAAC;CACH;AACF"}
@@ -1,7 +1,6 @@
1
1
  import { AssistantStreamChunk } from "../../AssistantStreamChunk.js";
2
2
  import { AssistantStreamEncoder } from "../../AssistantStream.js";
3
3
  import { PipeableTransformStream } from "../../utils/stream/PipeableTransformStream.js";
4
-
5
4
  //#region src/core/serialization/data-stream/DataStream.d.ts
6
5
  declare class DataStreamEncoder extends PipeableTransformStream<AssistantStreamChunk, Uint8Array<ArrayBuffer>> implements AssistantStreamEncoder {
7
6
  headers: Headers;
@@ -1 +1 @@
1
- {"version":3,"file":"DataStream.d.ts","names":[],"sources":["../../../../src/core/serialization/data-stream/DataStream.ts"],"mappings":";;;;;cAiBa,iBAAA,SACH,uBAAA,CAAwB,oBAAA,EAAsB,UAAA,CAAW,WAAA,cACtD,sBAAA;EAEX,OAAA,EAAO,OAAA;;;cA2MI,iBAAA,SAA0B,uBAAA,CACrC,UAAA,CAAW,WAAA,GACX,oBAAA"}
1
+ {"version":3,"file":"DataStream.d.ts","names":[],"sources":["../../../../src/core/serialization/data-stream/DataStream.ts"],"mappings":";;;;cAiBa,0BACH,wBAAwB,sBAAsB,WAAW,yBACtD;EAEX,SAAO;;;cA2MI,0BAA0B,wBACrC,WAAW,cACX"}
@@ -1,11 +1,10 @@
1
1
  import { ReadonlyJSONObject, ReadonlyJSONValue } from "../../../utils/json/json-value.js";
2
- import { ObjectStreamOperation } from "../../object/types.js";
3
-
2
+ import { GorpStreamOperation } from "../../gorp/types.js";
4
3
  //#region src/core/serialization/data-stream/chunk-types.d.ts
5
4
  type DataStreamChunk = { [K in DataStreamStreamChunkType]: {
6
5
  type: K;
7
6
  value: DataStreamStreamChunkValue[K];
8
- } }[DataStreamStreamChunkType];
7
+ }; }[DataStreamStreamChunkType];
9
8
  type LanguageModelV1FinishReason = "stop" | "length" | "content-filter" | "tool-calls" | "error" | "other" | "unknown";
10
9
  type LanguageModelV1Usage = {
11
10
  inputTokens: number;
@@ -88,7 +87,7 @@ type DataStreamStreamChunkValue = {
88
87
  data: string;
89
88
  mimeType: string;
90
89
  };
91
- [DataStreamStreamChunkType.AuiUpdateStateOperations]: ObjectStreamOperation[];
90
+ [DataStreamStreamChunkType.AuiUpdateStateOperations]: GorpStreamOperation[];
92
91
  [DataStreamStreamChunkType.AuiTextDelta]: {
93
92
  textDelta: string;
94
93
  parentId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"chunk-types.d.ts","names":[],"sources":["../../../../src/core/serialization/data-stream/chunk-types.ts"],"mappings":";;;;KAMY,eAAA,WACJ,yBAAA;EACJ,IAAA,EAAM,CAAA;EACN,KAAA,EAAO,0BAAA,CAA2B,CAAA;AAAA,IAEpC,yBAAA;AAAA,KAEG,2BAAA;AAAA,KASA,oBAAA;EACH,WAAA;EACA,YAAY;AAAA;AAAA,aAGF,yBAAA;EACV,SAAA;EACA,IAAA;EACA,KAAA;EACA,UAAA;EACA,QAAA;EACA,cAAA;EACA,aAAA;EACA,qBAAA;EACA,aAAA;EACA,UAAA;EACA,SAAA;EACA,cAAA;EACA,MAAA;EACA,iBAAA;EACA,kBAAA;EACA,IAAA;EAEA,wBAAA;EACA,YAAA;EACA,iBAAA;EACA,WAAA;AAAA;AAAA,KAEG,0BAAA;EAAA,CACF,yBAAA,CAA0B,SAAA;EAAA,CAC1B,yBAAA,CAA0B,IAAA,GAAO,iBAAA;EAAA,CACjC,yBAAA,CAA0B,UAAA,GAAa,iBAAA;EAAA,CACvC,yBAAA,CAA0B,QAAA;IACzB,UAAA;IACA,QAAA;IACA,IAAA,EAAM,kBAAA;EAAA;EAAA,CAEP,yBAAA,CAA0B,aAAA;IACzB,UAAA;IACA,QAAA;IACA,QAAA;EAAA;EAAA,CAED,yBAAA,CAA0B,qBAAA;IACzB,UAAA;IACA,aAAA;EAAA;EAAA,CAED,yBAAA,CAA0B,cAAA;IACzB,UAAA;IACA,MAAA,EAAQ,iBAAA;IAGR,QAAA,GAAW,iBAAA;IACX,OAAA;EAAA;EAAA,CAED,yBAAA,CAA0B,KAAA;EAAA,CAC1B,yBAAA,CAA0B,UAAA;IACzB,YAAA,EAAc,2BAAA;IACd,KAAA,EAAO,oBAAA;IACP,WAAA;EAAA;EAAA,CAED,yBAAA,CAA0B,aAAA;IACzB,YAAA,EAAc,2BAAA;IACd,KAAA,EAAO,oBAAA;EAAA;EAAA,CAER,yBAAA,CAA0B,SAAA;IACzB,SAAA;EAAA;EAAA,CAED,yBAAA,CAA0B,cAAA;EAAA,CAC1B,yBAAA,CAA0B,MAAA;IACzB,UAAA;IACA,EAAA;IACA,GAAA;IACA,KAAA;IACA,QAAA;EAAA;EAAA,CAED,yBAAA,CAA0B,iBAAA;IAAsB,IAAA;EAAA;EAAA,CAChD,yBAAA,CAA0B,kBAAA;IAAuB,SAAA;EAAA;EAAA,CACjD,yBAAA,CAA0B,IAAA;IAAS,IAAA;IAAc,QAAA;EAAA;EAAA,CAGjD,yBAAA,CAA0B,wBAAA,GAA2B,qBAAA;EAAA,CACrD,yBAAA,CAA0B,YAAA;IACzB,SAAA;IACA,QAAA;EAAA;EAAA,CAED,yBAAA,CAA0B,iBAAA;IACzB,cAAA;IACA,QAAA;EAAA;EAAA,CAED,yBAAA,CAA0B,WAAA;IACzB,IAAA;IACA,IAAA,EAAM,iBAAA;IACN,QAAA;EAAA;AAAA"}
1
+ {"version":3,"file":"chunk-types.d.ts","names":[],"sources":["../../../../src/core/serialization/data-stream/chunk-types.ts"],"mappings":";;;KAMY,qBACT,KAAK;EACJ,MAAM;EACN,OAAO,2BAA2B;KAEpC;KAEG;KASA;EACH;EACA;;aAGU;EACV;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;;KAEG;GACF,0BAA0B;GAC1B,0BAA0B,OAAO;GACjC,0BAA0B,aAAa;GACvC,0BAA0B;IACzB;IACA;IACA,MAAM;;GAEP,0BAA0B;IACzB;IACA;IACA;;GAED,0BAA0B;IACzB;IACA;;GAED,0BAA0B;IACzB;IACA,QAAQ;IAGR,WAAW;IACX;;GAED,0BAA0B;GAC1B,0BAA0B;IACzB,cAAc;IACd,OAAO;IACP;;GAED,0BAA0B;IACzB,cAAc;IACd,OAAO;;GAER,0BAA0B;IACzB;;GAED,0BAA0B;GAC1B,0BAA0B;IACzB;IACA;IACA;IACA;IACA;;GAED,0BAA0B;IAAsB;;GAChD,0BAA0B;IAAuB;;GACjD,0BAA0B;IAAS;IAAc;;GAGjD,0BAA0B,2BAA2B;GACrD,0BAA0B;IACzB;IACA;;GAED,0BAA0B;IACzB;IACA;;GAED,0BAA0B;IACzB;IACA,MAAM;IACN"}
@@ -1 +1 @@
1
- {"version":3,"file":"chunk-types.js","names":[],"sources":["../../../../src/core/serialization/data-stream/chunk-types.ts"],"sourcesContent":["import type {\n ReadonlyJSONObject,\n ReadonlyJSONValue,\n} from \"../../../utils/json/json-value\";\nimport type { ObjectStreamOperation } from \"../../object/types\";\n\nexport type DataStreamChunk = {\n [K in DataStreamStreamChunkType]: {\n type: K;\n value: DataStreamStreamChunkValue[K];\n };\n}[DataStreamStreamChunkType];\n\ntype LanguageModelV1FinishReason =\n | \"stop\"\n | \"length\"\n | \"content-filter\"\n | \"tool-calls\"\n | \"error\"\n | \"other\"\n | \"unknown\";\n\ntype LanguageModelV1Usage = {\n inputTokens: number;\n outputTokens: number;\n};\n\nexport enum DataStreamStreamChunkType {\n TextDelta = \"0\",\n Data = \"2\",\n Error = \"3\",\n Annotation = \"8\",\n ToolCall = \"9\",\n ToolCallResult = \"a\",\n StartToolCall = \"b\",\n ToolCallArgsTextDelta = \"c\",\n FinishMessage = \"d\",\n FinishStep = \"e\",\n StartStep = \"f\",\n ReasoningDelta = \"g\",\n Source = \"h\",\n RedactedReasoning = \"i\",\n ReasoningSignature = \"j\",\n File = \"k\",\n\n AuiUpdateStateOperations = \"aui-state\",\n AuiTextDelta = \"aui-text-delta\",\n AuiReasoningDelta = \"aui-reasoning-delta\",\n AuiDataPart = \"aui-data\",\n}\ntype DataStreamStreamChunkValue = {\n [DataStreamStreamChunkType.TextDelta]: string;\n [DataStreamStreamChunkType.Data]: ReadonlyJSONValue[];\n [DataStreamStreamChunkType.Annotation]: ReadonlyJSONValue[];\n [DataStreamStreamChunkType.ToolCall]: {\n toolCallId: string;\n toolName: string;\n args: ReadonlyJSONObject;\n };\n [DataStreamStreamChunkType.StartToolCall]: {\n toolCallId: string;\n toolName: string;\n parentId?: string;\n };\n [DataStreamStreamChunkType.ToolCallArgsTextDelta]: {\n toolCallId: string;\n argsTextDelta: string;\n };\n [DataStreamStreamChunkType.ToolCallResult]: {\n toolCallId: string;\n result: ReadonlyJSONValue;\n\n // aui-extensions\n artifact?: ReadonlyJSONValue | undefined;\n isError?: boolean;\n };\n [DataStreamStreamChunkType.Error]: string;\n [DataStreamStreamChunkType.FinishStep]: {\n finishReason: LanguageModelV1FinishReason;\n usage: LanguageModelV1Usage;\n isContinued: boolean;\n };\n [DataStreamStreamChunkType.FinishMessage]: {\n finishReason: LanguageModelV1FinishReason;\n usage: LanguageModelV1Usage;\n };\n [DataStreamStreamChunkType.StartStep]: {\n messageId: string;\n };\n [DataStreamStreamChunkType.ReasoningDelta]: string;\n [DataStreamStreamChunkType.Source]: {\n sourceType: \"url\";\n id: string;\n url: string;\n title?: string;\n parentId?: string;\n };\n [DataStreamStreamChunkType.RedactedReasoning]: { data: string };\n [DataStreamStreamChunkType.ReasoningSignature]: { signature: string };\n [DataStreamStreamChunkType.File]: { data: string; mimeType: string };\n\n // aui-extensions\n [DataStreamStreamChunkType.AuiUpdateStateOperations]: ObjectStreamOperation[];\n [DataStreamStreamChunkType.AuiTextDelta]: {\n textDelta: string;\n parentId: string;\n };\n [DataStreamStreamChunkType.AuiReasoningDelta]: {\n reasoningDelta: string;\n parentId: string;\n };\n [DataStreamStreamChunkType.AuiDataPart]: {\n name: string;\n data: ReadonlyJSONValue;\n parentId?: string;\n };\n};\n"],"mappings":";AA2BA,IAAY,4BAAL,yBAAA,2BAAA;CACL,0BAAA,eAAA;CACA,0BAAA,UAAA;CACA,0BAAA,WAAA;CACA,0BAAA,gBAAA;CACA,0BAAA,cAAA;CACA,0BAAA,oBAAA;CACA,0BAAA,mBAAA;CACA,0BAAA,2BAAA;CACA,0BAAA,mBAAA;CACA,0BAAA,gBAAA;CACA,0BAAA,eAAA;CACA,0BAAA,oBAAA;CACA,0BAAA,YAAA;CACA,0BAAA,uBAAA;CACA,0BAAA,wBAAA;CACA,0BAAA,UAAA;CAEA,0BAAA,8BAAA;CACA,0BAAA,kBAAA;CACA,0BAAA,uBAAA;CACA,0BAAA,iBAAA;;AACF,EAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"chunk-types.js","names":[],"sources":["../../../../src/core/serialization/data-stream/chunk-types.ts"],"sourcesContent":["import type {\n ReadonlyJSONObject,\n ReadonlyJSONValue,\n} from \"../../../utils/json/json-value\";\nimport type { GorpStreamOperation } from \"../../gorp/types\";\n\nexport type DataStreamChunk = {\n [K in DataStreamStreamChunkType]: {\n type: K;\n value: DataStreamStreamChunkValue[K];\n };\n}[DataStreamStreamChunkType];\n\ntype LanguageModelV1FinishReason =\n | \"stop\"\n | \"length\"\n | \"content-filter\"\n | \"tool-calls\"\n | \"error\"\n | \"other\"\n | \"unknown\";\n\ntype LanguageModelV1Usage = {\n inputTokens: number;\n outputTokens: number;\n};\n\nexport enum DataStreamStreamChunkType {\n TextDelta = \"0\",\n Data = \"2\",\n Error = \"3\",\n Annotation = \"8\",\n ToolCall = \"9\",\n ToolCallResult = \"a\",\n StartToolCall = \"b\",\n ToolCallArgsTextDelta = \"c\",\n FinishMessage = \"d\",\n FinishStep = \"e\",\n StartStep = \"f\",\n ReasoningDelta = \"g\",\n Source = \"h\",\n RedactedReasoning = \"i\",\n ReasoningSignature = \"j\",\n File = \"k\",\n\n AuiUpdateStateOperations = \"aui-state\",\n AuiTextDelta = \"aui-text-delta\",\n AuiReasoningDelta = \"aui-reasoning-delta\",\n AuiDataPart = \"aui-data\",\n}\ntype DataStreamStreamChunkValue = {\n [DataStreamStreamChunkType.TextDelta]: string;\n [DataStreamStreamChunkType.Data]: ReadonlyJSONValue[];\n [DataStreamStreamChunkType.Annotation]: ReadonlyJSONValue[];\n [DataStreamStreamChunkType.ToolCall]: {\n toolCallId: string;\n toolName: string;\n args: ReadonlyJSONObject;\n };\n [DataStreamStreamChunkType.StartToolCall]: {\n toolCallId: string;\n toolName: string;\n parentId?: string;\n };\n [DataStreamStreamChunkType.ToolCallArgsTextDelta]: {\n toolCallId: string;\n argsTextDelta: string;\n };\n [DataStreamStreamChunkType.ToolCallResult]: {\n toolCallId: string;\n result: ReadonlyJSONValue;\n\n // aui-extensions\n artifact?: ReadonlyJSONValue | undefined;\n isError?: boolean;\n };\n [DataStreamStreamChunkType.Error]: string;\n [DataStreamStreamChunkType.FinishStep]: {\n finishReason: LanguageModelV1FinishReason;\n usage: LanguageModelV1Usage;\n isContinued: boolean;\n };\n [DataStreamStreamChunkType.FinishMessage]: {\n finishReason: LanguageModelV1FinishReason;\n usage: LanguageModelV1Usage;\n };\n [DataStreamStreamChunkType.StartStep]: {\n messageId: string;\n };\n [DataStreamStreamChunkType.ReasoningDelta]: string;\n [DataStreamStreamChunkType.Source]: {\n sourceType: \"url\";\n id: string;\n url: string;\n title?: string;\n parentId?: string;\n };\n [DataStreamStreamChunkType.RedactedReasoning]: { data: string };\n [DataStreamStreamChunkType.ReasoningSignature]: { signature: string };\n [DataStreamStreamChunkType.File]: { data: string; mimeType: string };\n\n // aui-extensions\n [DataStreamStreamChunkType.AuiUpdateStateOperations]: GorpStreamOperation[];\n [DataStreamStreamChunkType.AuiTextDelta]: {\n textDelta: string;\n parentId: string;\n };\n [DataStreamStreamChunkType.AuiReasoningDelta]: {\n reasoningDelta: string;\n parentId: string;\n };\n [DataStreamStreamChunkType.AuiDataPart]: {\n name: string;\n data: ReadonlyJSONValue;\n parentId?: string;\n };\n};\n"],"mappings":";AA2BA,IAAY,4BAAL,yBAAA,2BAAA;CACL,0BAAA,eAAA;CACA,0BAAA,UAAA;CACA,0BAAA,WAAA;CACA,0BAAA,gBAAA;CACA,0BAAA,cAAA;CACA,0BAAA,oBAAA;CACA,0BAAA,mBAAA;CACA,0BAAA,2BAAA;CACA,0BAAA,mBAAA;CACA,0BAAA,gBAAA;CACA,0BAAA,eAAA;CACA,0BAAA,oBAAA;CACA,0BAAA,YAAA;CACA,0BAAA,uBAAA;CACA,0BAAA,wBAAA;CACA,0BAAA,UAAA;CAEA,0BAAA,8BAAA;CACA,0BAAA,kBAAA;CACA,0BAAA,uBAAA;CACA,0BAAA,iBAAA;;AACF,EAAA,CAAA,CAAA"}
@@ -1,5 +1,4 @@
1
1
  import { DataStreamChunk } from "./chunk-types.js";
2
-
3
2
  //#region src/core/serialization/data-stream/serialization.d.ts
4
3
  declare class DataStreamChunkEncoder extends TransformStream<DataStreamChunk, string> {
5
4
  constructor();
@@ -1 +1 @@
1
- {"version":3,"file":"serialization.d.ts","names":[],"sources":["../../../../src/core/serialization/data-stream/serialization.ts"],"mappings":";;;cAEa,sBAAA,SAA+B,eAAe,CACzD,eAAA;;;cAYW,sBAAA,SAA+B,eAAe,SAEzD,eAAA"}
1
+ {"version":3,"file":"serialization.d.ts","names":[],"sources":["../../../../src/core/serialization/data-stream/serialization.ts"],"mappings":";;cAEa,+BAA+B,gBAC1C;;;cAYW,+BAA+B,wBAE1C"}
@@ -1,7 +1,6 @@
1
1
  import { AssistantStreamChunk } from "../../AssistantStreamChunk.js";
2
2
  import { PipeableTransformStream } from "../../utils/stream/PipeableTransformStream.js";
3
3
  import { UIMessageStreamChunk, UIMessageStreamDataChunk } from "./chunk-types.js";
4
-
5
4
  //#region src/core/serialization/ui-message-stream/UIMessageStream.d.ts
6
5
  type UIMessageStreamDecoderOptions = {
7
6
  onData?: (data: {
@@ -1 +1 @@
1
- {"version":3,"file":"UIMessageStream.d.ts","names":[],"sources":["../../../../src/core/serialization/ui-message-stream/UIMessageStream.ts"],"mappings":";;;;;KAcY,6BAAA;EACV,MAAA,IAAU,IAAA;IACR,IAAA;IACA,IAAA;IACA,IAAA;IACA,SAAA;EAAA;AAAA;;;;cA6ES,sBAAA,SAA+B,uBAAA,CAC1C,UAAA,CAAW,WAAA,GACX,oBAAA;cAEY,OAAA,GAAS,6BAAA;AAAA"}
1
+ {"version":3,"file":"UIMessageStream.d.ts","names":[],"sources":["../../../../src/core/serialization/ui-message-stream/UIMessageStream.ts"],"mappings":";;;;KAiBY;EACV,UAAU;IACR;IACA;IACA;IACA;;;;;;cAWS,+BAA+B,wBAC1C,WAAW,cACX;EAEY,YAAA,UAAS"}