assistant-stream 0.3.15 → 0.3.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (234) hide show
  1. package/README.md +6 -4
  2. package/dist/core/AssistantStream.d.ts +35 -31
  3. package/dist/core/AssistantStream.d.ts.map +1 -1
  4. package/dist/core/AssistantStream.js +39 -37
  5. package/dist/core/AssistantStream.js.map +1 -1
  6. package/dist/core/AssistantStreamChunk.d.ts +71 -78
  7. package/dist/core/AssistantStreamChunk.d.ts.map +1 -1
  8. package/dist/core/AssistantStreamChunk.js +0 -2
  9. package/dist/core/accumulators/AssistantMessageStream.d.ts +15 -11
  10. package/dist/core/accumulators/AssistantMessageStream.d.ts.map +1 -1
  11. package/dist/core/accumulators/AssistantMessageStream.js +52 -48
  12. package/dist/core/accumulators/AssistantMessageStream.js.map +1 -1
  13. package/dist/core/accumulators/TimingTracker.d.ts +15 -11
  14. package/dist/core/accumulators/TimingTracker.d.ts.map +1 -1
  15. package/dist/core/accumulators/TimingTracker.js +36 -43
  16. package/dist/core/accumulators/TimingTracker.js.map +1 -1
  17. package/dist/core/accumulators/assistant-message-accumulator.d.ts +21 -11
  18. package/dist/core/accumulators/assistant-message-accumulator.d.ts.map +1 -1
  19. package/dist/core/accumulators/assistant-message-accumulator.js +349 -390
  20. package/dist/core/accumulators/assistant-message-accumulator.js.map +1 -1
  21. package/dist/core/converters/toGenericMessages.d.ts +49 -47
  22. package/dist/core/converters/toGenericMessages.d.ts.map +1 -1
  23. package/dist/core/converters/toGenericMessages.js +122 -136
  24. package/dist/core/converters/toGenericMessages.js.map +1 -1
  25. package/dist/core/modules/assistant-stream.d.ts +62 -66
  26. package/dist/core/modules/assistant-stream.d.ts.map +1 -1
  27. package/dist/core/modules/assistant-stream.js +176 -182
  28. package/dist/core/modules/assistant-stream.js.map +1 -1
  29. package/dist/core/modules/text.d.ts +11 -7
  30. package/dist/core/modules/text.d.ts.map +1 -1
  31. package/dist/core/modules/text.js +45 -45
  32. package/dist/core/modules/text.js.map +1 -1
  33. package/dist/core/modules/tool-call.d.ts +15 -11
  34. package/dist/core/modules/tool-call.d.ts.map +1 -1
  35. package/dist/core/modules/tool-call.js +81 -96
  36. package/dist/core/modules/tool-call.js.map +1 -1
  37. package/dist/core/object/ObjectStreamAccumulator.d.ts +13 -9
  38. package/dist/core/object/ObjectStreamAccumulator.d.ts.map +1 -1
  39. package/dist/core/object/ObjectStreamAccumulator.js +44 -52
  40. package/dist/core/object/ObjectStreamAccumulator.js.map +1 -1
  41. package/dist/core/object/ObjectStreamResponse.d.ts +12 -8
  42. package/dist/core/object/ObjectStreamResponse.d.ts.map +1 -1
  43. package/dist/core/object/ObjectStreamResponse.js +52 -71
  44. package/dist/core/object/ObjectStreamResponse.js.map +1 -1
  45. package/dist/core/object/createObjectStream.d.ts +14 -8
  46. package/dist/core/object/createObjectStream.d.ts.map +1 -1
  47. package/dist/core/object/createObjectStream.js +50 -47
  48. package/dist/core/object/createObjectStream.js.map +1 -1
  49. package/dist/core/object/types.d.ts +14 -11
  50. package/dist/core/object/types.d.ts.map +1 -1
  51. package/dist/core/object/types.js +0 -2
  52. package/dist/core/serialization/PlainText.d.ts +11 -7
  53. package/dist/core/serialization/PlainText.d.ts.map +1 -1
  54. package/dist/core/serialization/PlainText.js +40 -48
  55. package/dist/core/serialization/PlainText.js.map +1 -1
  56. package/dist/core/serialization/assistant-transport/AssistantTransport.d.ts +11 -7
  57. package/dist/core/serialization/assistant-transport/AssistantTransport.d.ts.map +1 -1
  58. package/dist/core/serialization/assistant-transport/AssistantTransport.js +102 -117
  59. package/dist/core/serialization/assistant-transport/AssistantTransport.js.map +1 -1
  60. package/dist/core/serialization/data-stream/DataStream.d.ts +11 -7
  61. package/dist/core/serialization/data-stream/DataStream.d.ts.map +1 -1
  62. package/dist/core/serialization/data-stream/DataStream.js +320 -371
  63. package/dist/core/serialization/data-stream/DataStream.js.map +1 -1
  64. package/dist/core/serialization/data-stream/chunk-types.d.ts +101 -100
  65. package/dist/core/serialization/data-stream/chunk-types.d.ts.map +1 -1
  66. package/dist/core/serialization/data-stream/chunk-types.js +27 -23
  67. package/dist/core/serialization/data-stream/chunk-types.js.map +1 -1
  68. package/dist/core/serialization/data-stream/serialization.d.ts +9 -5
  69. package/dist/core/serialization/data-stream/serialization.d.ts.map +1 -1
  70. package/dist/core/serialization/data-stream/serialization.js +23 -24
  71. package/dist/core/serialization/data-stream/serialization.js.map +1 -1
  72. package/dist/core/serialization/ui-message-stream/UIMessageStream.d.ts +15 -12
  73. package/dist/core/serialization/ui-message-stream/UIMessageStream.d.ts.map +1 -1
  74. package/dist/core/serialization/ui-message-stream/UIMessageStream.js +205 -228
  75. package/dist/core/serialization/ui-message-stream/UIMessageStream.js.map +1 -1
  76. package/dist/core/serialization/ui-message-stream/chunk-types.d.ts +68 -65
  77. package/dist/core/serialization/ui-message-stream/chunk-types.d.ts.map +1 -1
  78. package/dist/core/serialization/ui-message-stream/chunk-types.js +0 -2
  79. package/dist/core/tool/ToolCallReader.d.ts +34 -30
  80. package/dist/core/tool/ToolCallReader.d.ts.map +1 -1
  81. package/dist/core/tool/ToolCallReader.js +264 -317
  82. package/dist/core/tool/ToolCallReader.js.map +1 -1
  83. package/dist/core/tool/ToolExecutionStream.d.ts +20 -17
  84. package/dist/core/tool/ToolExecutionStream.d.ts.map +1 -1
  85. package/dist/core/tool/ToolExecutionStream.js +123 -146
  86. package/dist/core/tool/ToolExecutionStream.js.map +1 -1
  87. package/dist/core/tool/ToolResponse.d.ts +41 -41
  88. package/dist/core/tool/ToolResponse.d.ts.map +1 -1
  89. package/dist/core/tool/ToolResponse.js +50 -56
  90. package/dist/core/tool/ToolResponse.js.map +1 -1
  91. package/dist/core/tool/schema-utils.d.ts +19 -15
  92. package/dist/core/tool/schema-utils.d.ts.map +1 -1
  93. package/dist/core/tool/schema-utils.js +50 -84
  94. package/dist/core/tool/schema-utils.js.map +1 -1
  95. package/dist/core/tool/tool-types.d.ts +103 -122
  96. package/dist/core/tool/tool-types.d.ts.map +1 -1
  97. package/dist/core/tool/tool-types.js +0 -2
  98. package/dist/core/tool/toolResultStream.d.ts +11 -9
  99. package/dist/core/tool/toolResultStream.d.ts.map +1 -1
  100. package/dist/core/tool/toolResultStream.js +127 -157
  101. package/dist/core/tool/toolResultStream.js.map +1 -1
  102. package/dist/core/tool/type-path-utils.d.ts +8 -19
  103. package/dist/core/tool/type-path-utils.d.ts.map +1 -1
  104. package/dist/core/tool/type-path-utils.js +0 -2
  105. package/dist/core/utils/Counter.d.ts +6 -3
  106. package/dist/core/utils/Counter.d.ts.map +1 -1
  107. package/dist/core/utils/Counter.js +10 -6
  108. package/dist/core/utils/Counter.js.map +1 -1
  109. package/dist/core/utils/generateId.d.ts +4 -1
  110. package/dist/core/utils/generateId.d.ts.map +1 -1
  111. package/dist/core/utils/generateId.js +5 -1
  112. package/dist/core/utils/generateId.js.map +1 -1
  113. package/dist/core/utils/stream/AssistantMetaTransformStream.d.ts +15 -11
  114. package/dist/core/utils/stream/AssistantMetaTransformStream.d.ts.map +1 -1
  115. package/dist/core/utils/stream/AssistantMetaTransformStream.js +38 -42
  116. package/dist/core/utils/stream/AssistantMetaTransformStream.js.map +1 -1
  117. package/dist/core/utils/stream/AssistantTransformStream.d.ts +11 -8
  118. package/dist/core/utils/stream/AssistantTransformStream.d.ts.map +1 -1
  119. package/dist/core/utils/stream/AssistantTransformStream.js +37 -35
  120. package/dist/core/utils/stream/AssistantTransformStream.js.map +1 -1
  121. package/dist/core/utils/stream/LineDecoderStream.d.ts +6 -3
  122. package/dist/core/utils/stream/LineDecoderStream.d.ts.map +1 -1
  123. package/dist/core/utils/stream/LineDecoderStream.js +23 -26
  124. package/dist/core/utils/stream/LineDecoderStream.js.map +1 -1
  125. package/dist/core/utils/stream/PipeableTransformStream.d.ts +5 -2
  126. package/dist/core/utils/stream/PipeableTransformStream.d.ts.map +1 -1
  127. package/dist/core/utils/stream/PipeableTransformStream.js +14 -10
  128. package/dist/core/utils/stream/PipeableTransformStream.js.map +1 -1
  129. package/dist/core/utils/stream/SSE.d.ts +10 -6
  130. package/dist/core/utils/stream/SSE.d.ts.map +1 -1
  131. package/dist/core/utils/stream/SSE.js +79 -91
  132. package/dist/core/utils/stream/SSE.js.map +1 -1
  133. package/dist/core/utils/stream/UnderlyingReadable.d.ts +7 -4
  134. package/dist/core/utils/stream/UnderlyingReadable.d.ts.map +1 -1
  135. package/dist/core/utils/stream/UnderlyingReadable.js +0 -2
  136. package/dist/core/utils/stream/merge.d.ts +11 -7
  137. package/dist/core/utils/stream/merge.d.ts.map +1 -1
  138. package/dist/core/utils/stream/merge.js +68 -170
  139. package/dist/core/utils/stream/merge.js.map +1 -1
  140. package/dist/core/utils/stream/path-utils.d.ts +11 -7
  141. package/dist/core/utils/stream/path-utils.d.ts.map +1 -1
  142. package/dist/core/utils/stream/path-utils.js +46 -52
  143. package/dist/core/utils/stream/path-utils.js.map +1 -1
  144. package/dist/core/utils/types.d.ts +109 -113
  145. package/dist/core/utils/types.d.ts.map +1 -1
  146. package/dist/core/utils/types.js +0 -2
  147. package/dist/core/utils/withPromiseOrValue.d.ts +4 -1
  148. package/dist/core/utils/withPromiseOrValue.d.ts.map +1 -1
  149. package/dist/core/utils/withPromiseOrValue.js +12 -15
  150. package/dist/core/utils/withPromiseOrValue.js.map +1 -1
  151. package/dist/index.d.ts +23 -24
  152. package/dist/index.js +16 -16
  153. package/dist/node_modules/.pnpm/@types_json-schema@7.0.15/node_modules/@types/json-schema/index.d.ts +141 -0
  154. package/dist/node_modules/.pnpm/@types_json-schema@7.0.15/node_modules/@types/json-schema/index.d.ts.map +1 -0
  155. package/dist/resumable/ResumableStreamContext.d.ts +28 -24
  156. package/dist/resumable/ResumableStreamContext.d.ts.map +1 -1
  157. package/dist/resumable/ResumableStreamContext.js +99 -114
  158. package/dist/resumable/ResumableStreamContext.js.map +1 -1
  159. package/dist/resumable/constants.d.ts +4 -1
  160. package/dist/resumable/constants.d.ts.map +1 -1
  161. package/dist/resumable/constants.js +5 -1
  162. package/dist/resumable/constants.js.map +1 -1
  163. package/dist/resumable/createResumableAssistantStreamResponse.d.ts +22 -21
  164. package/dist/resumable/createResumableAssistantStreamResponse.d.ts.map +1 -1
  165. package/dist/resumable/createResumableAssistantStreamResponse.js +25 -32
  166. package/dist/resumable/createResumableAssistantStreamResponse.js.map +1 -1
  167. package/dist/resumable/errors.d.ts +8 -5
  168. package/dist/resumable/errors.d.ts.map +1 -1
  169. package/dist/resumable/errors.js +14 -12
  170. package/dist/resumable/errors.js.map +1 -1
  171. package/dist/resumable/index.d.ts +7 -7
  172. package/dist/resumable/index.js +5 -5
  173. package/dist/resumable/stores/InMemoryResumableStreamStore.d.ts +14 -10
  174. package/dist/resumable/stores/InMemoryResumableStreamStore.d.ts.map +1 -1
  175. package/dist/resumable/stores/InMemoryResumableStreamStore.js +159 -193
  176. package/dist/resumable/stores/InMemoryResumableStreamStore.js.map +1 -1
  177. package/dist/resumable/stores/ioredis.d.ts +9 -5
  178. package/dist/resumable/stores/ioredis.d.ts.map +1 -1
  179. package/dist/resumable/stores/ioredis.js +70 -82
  180. package/dist/resumable/stores/ioredis.js.map +1 -1
  181. package/dist/resumable/stores/redis-impl.d.ts +51 -48
  182. package/dist/resumable/stores/redis-impl.d.ts.map +1 -1
  183. package/dist/resumable/stores/redis-impl.js +176 -176
  184. package/dist/resumable/stores/redis-impl.js.map +1 -1
  185. package/dist/resumable/stores/redis.d.ts +31 -28
  186. package/dist/resumable/stores/redis.d.ts.map +1 -1
  187. package/dist/resumable/stores/redis.js +87 -95
  188. package/dist/resumable/stores/redis.js.map +1 -1
  189. package/dist/resumable/types.d.ts +29 -26
  190. package/dist/resumable/types.d.ts.map +1 -1
  191. package/dist/resumable/types.js +0 -2
  192. package/dist/utils/AsyncIterableStream.d.ts +5 -2
  193. package/dist/utils/AsyncIterableStream.d.ts.map +1 -1
  194. package/dist/utils/AsyncIterableStream.js +17 -16
  195. package/dist/utils/AsyncIterableStream.js.map +1 -1
  196. package/dist/utils/json/fix-json.d.ts +4 -1
  197. package/dist/utils/json/fix-json.d.ts.map +1 -1
  198. package/dist/utils/json/fix-json.js +286 -380
  199. package/dist/utils/json/fix-json.js.map +1 -1
  200. package/dist/utils/json/is-json.d.ts +8 -4
  201. package/dist/utils/json/is-json.d.ts.map +1 -1
  202. package/dist/utils/json/is-json.js +13 -21
  203. package/dist/utils/json/is-json.js.map +1 -1
  204. package/dist/utils/json/json-value.d.ts +7 -4
  205. package/dist/utils/json/json-value.d.ts.map +1 -1
  206. package/dist/utils/json/json-value.js +0 -2
  207. package/dist/utils/json/parse-partial-json-object.d.ts +11 -8
  208. package/dist/utils/json/parse-partial-json-object.d.ts.map +1 -1
  209. package/dist/utils/json/parse-partial-json-object.js +50 -62
  210. package/dist/utils/json/parse-partial-json-object.js.map +1 -1
  211. package/dist/utils/promiseWithResolvers.d.ts +7 -4
  212. package/dist/utils/promiseWithResolvers.d.ts.map +1 -1
  213. package/dist/utils/promiseWithResolvers.js +17 -10
  214. package/dist/utils/promiseWithResolvers.js.map +1 -1
  215. package/dist/utils.d.ts +6 -6
  216. package/dist/utils.js +5 -5
  217. package/package.json +3 -3
  218. package/src/core/modules/assistant-stream.test.ts +104 -0
  219. package/src/core/modules/assistant-stream.ts +13 -4
  220. package/dist/core/AssistantStreamChunk.js.map +0 -1
  221. package/dist/core/object/types.js.map +0 -1
  222. package/dist/core/serialization/ui-message-stream/chunk-types.js.map +0 -1
  223. package/dist/core/tool/tool-types.js.map +0 -1
  224. package/dist/core/tool/type-path-utils.js.map +0 -1
  225. package/dist/core/utils/stream/UnderlyingReadable.js.map +0 -1
  226. package/dist/core/utils/types.js.map +0 -1
  227. package/dist/index.d.ts.map +0 -1
  228. package/dist/index.js.map +0 -1
  229. package/dist/resumable/index.d.ts.map +0 -1
  230. package/dist/resumable/index.js.map +0 -1
  231. package/dist/resumable/types.js.map +0 -1
  232. package/dist/utils/json/json-value.js.map +0 -1
  233. package/dist/utils.d.ts.map +0 -1
  234. package/dist/utils.js.map +0 -1
@@ -2,427 +2,386 @@ import { generateId } from "../utils/generateId.js";
2
2
  import { parsePartialJsonObject } from "../../utils/json/parse-partial-json-object.js";
3
3
  import { ObjectStreamAccumulator } from "../object/ObjectStreamAccumulator.js";
4
4
  import { TimingTracker } from "./TimingTracker.js";
5
- export const createInitialMessage = ({ unstable_state = null, } = {}) => ({
6
- role: "assistant",
7
- status: { type: "running" },
8
- parts: [],
9
- get content() {
10
- return this.parts;
11
- },
12
- metadata: {
13
- unstable_state,
14
- unstable_data: [],
15
- unstable_annotations: [],
16
- steps: [],
17
- custom: {},
18
- },
5
+ //#region src/core/accumulators/assistant-message-accumulator.ts
6
+ const createInitialMessage = ({ unstable_state = null } = {}) => ({
7
+ role: "assistant",
8
+ status: { type: "running" },
9
+ parts: [],
10
+ get content() {
11
+ return this.parts;
12
+ },
13
+ metadata: {
14
+ unstable_state,
15
+ unstable_data: [],
16
+ unstable_annotations: [],
17
+ steps: [],
18
+ custom: {}
19
+ }
19
20
  });
20
21
  const updatePartForPath = (message, chunk, updater) => {
21
- if (message.parts.length === 0) {
22
- throw new Error("No parts available to update.");
23
- }
24
- if (chunk.path.length !== 1)
25
- throw new Error("Nested paths are not supported yet.");
26
- const partIndex = chunk.path[0];
27
- const updatedPart = updater(message.parts[partIndex]);
28
- return {
29
- ...message,
30
- parts: [
31
- ...message.parts.slice(0, partIndex),
32
- updatedPart,
33
- ...message.parts.slice(partIndex + 1),
34
- ],
35
- get content() {
36
- return this.parts;
37
- },
38
- };
22
+ if (message.parts.length === 0) throw new Error("No parts available to update.");
23
+ if (chunk.path.length !== 1) throw new Error("Nested paths are not supported yet.");
24
+ const partIndex = chunk.path[0];
25
+ const updatedPart = updater(message.parts[partIndex]);
26
+ return {
27
+ ...message,
28
+ parts: [
29
+ ...message.parts.slice(0, partIndex),
30
+ updatedPart,
31
+ ...message.parts.slice(partIndex + 1)
32
+ ],
33
+ get content() {
34
+ return this.parts;
35
+ }
36
+ };
39
37
  };
40
38
  const handlePartStart = (message, chunk) => {
41
- const partInit = chunk.part;
42
- if (partInit.type === "text" || partInit.type === "reasoning") {
43
- const newTextPart = {
44
- type: partInit.type,
45
- text: "",
46
- status: { type: "running" },
47
- ...(partInit.parentId && { parentId: partInit.parentId }),
48
- };
49
- return {
50
- ...message,
51
- parts: [...message.parts, newTextPart],
52
- get content() {
53
- return this.parts;
54
- },
55
- };
56
- }
57
- else if (partInit.type === "tool-call") {
58
- const newToolCallPart = {
59
- type: "tool-call",
60
- state: "partial-call",
61
- status: { type: "running", isArgsComplete: false },
62
- toolCallId: partInit.toolCallId,
63
- toolName: partInit.toolName,
64
- argsText: "",
65
- args: {},
66
- ...(partInit.parentId && { parentId: partInit.parentId }),
67
- };
68
- return {
69
- ...message,
70
- parts: [...message.parts, newToolCallPart],
71
- get content() {
72
- return this.parts;
73
- },
74
- };
75
- }
76
- else if (partInit.type === "source") {
77
- const newSourcePart = {
78
- type: "source",
79
- sourceType: partInit.sourceType,
80
- id: partInit.id,
81
- url: partInit.url,
82
- ...(partInit.title ? { title: partInit.title } : undefined),
83
- ...(partInit.parentId && { parentId: partInit.parentId }),
84
- };
85
- return {
86
- ...message,
87
- parts: [...message.parts, newSourcePart],
88
- get content() {
89
- return this.parts;
90
- },
91
- };
92
- }
93
- else if (partInit.type === "file") {
94
- const newFilePart = {
95
- type: "file",
96
- mimeType: partInit.mimeType,
97
- data: partInit.data,
98
- ...(partInit.parentId && { parentId: partInit.parentId }),
99
- };
100
- return {
101
- ...message,
102
- parts: [...message.parts, newFilePart],
103
- get content() {
104
- return this.parts;
105
- },
106
- };
107
- }
108
- else if (partInit.type === "data") {
109
- const newDataPart = {
110
- type: "data",
111
- name: partInit.name,
112
- data: partInit.data,
113
- ...(partInit.parentId && { parentId: partInit.parentId }),
114
- };
115
- return {
116
- ...message,
117
- parts: [...message.parts, newDataPart],
118
- get content() {
119
- return this.parts;
120
- },
121
- };
122
- }
123
- else {
124
- throw new Error(`Unsupported part type: ${partInit.type}`);
125
- }
39
+ const partInit = chunk.part;
40
+ if (partInit.type === "text" || partInit.type === "reasoning") {
41
+ const newTextPart = {
42
+ type: partInit.type,
43
+ text: "",
44
+ status: { type: "running" },
45
+ ...partInit.parentId && { parentId: partInit.parentId }
46
+ };
47
+ return {
48
+ ...message,
49
+ parts: [...message.parts, newTextPart],
50
+ get content() {
51
+ return this.parts;
52
+ }
53
+ };
54
+ } else if (partInit.type === "tool-call") {
55
+ const newToolCallPart = {
56
+ type: "tool-call",
57
+ state: "partial-call",
58
+ status: {
59
+ type: "running",
60
+ isArgsComplete: false
61
+ },
62
+ toolCallId: partInit.toolCallId,
63
+ toolName: partInit.toolName,
64
+ argsText: "",
65
+ args: {},
66
+ ...partInit.parentId && { parentId: partInit.parentId }
67
+ };
68
+ return {
69
+ ...message,
70
+ parts: [...message.parts, newToolCallPart],
71
+ get content() {
72
+ return this.parts;
73
+ }
74
+ };
75
+ } else if (partInit.type === "source") {
76
+ const newSourcePart = {
77
+ type: "source",
78
+ sourceType: partInit.sourceType,
79
+ id: partInit.id,
80
+ url: partInit.url,
81
+ ...partInit.title ? { title: partInit.title } : void 0,
82
+ ...partInit.parentId && { parentId: partInit.parentId }
83
+ };
84
+ return {
85
+ ...message,
86
+ parts: [...message.parts, newSourcePart],
87
+ get content() {
88
+ return this.parts;
89
+ }
90
+ };
91
+ } else if (partInit.type === "file") {
92
+ const newFilePart = {
93
+ type: "file",
94
+ mimeType: partInit.mimeType,
95
+ data: partInit.data,
96
+ ...partInit.parentId && { parentId: partInit.parentId }
97
+ };
98
+ return {
99
+ ...message,
100
+ parts: [...message.parts, newFilePart],
101
+ get content() {
102
+ return this.parts;
103
+ }
104
+ };
105
+ } else if (partInit.type === "data") {
106
+ const newDataPart = {
107
+ type: "data",
108
+ name: partInit.name,
109
+ data: partInit.data,
110
+ ...partInit.parentId && { parentId: partInit.parentId }
111
+ };
112
+ return {
113
+ ...message,
114
+ parts: [...message.parts, newDataPart],
115
+ get content() {
116
+ return this.parts;
117
+ }
118
+ };
119
+ } else throw new Error(`Unsupported part type: ${partInit.type}`);
126
120
  };
127
121
  const handleToolCallArgsTextFinish = (message, chunk) => {
128
- return updatePartForPath(message, chunk, (part) => {
129
- if (part.type !== "tool-call") {
130
- throw new Error("Last is not a tool call");
131
- }
132
- // TODO this should never be hit; this happens if args-text-finish is emitted after result
133
- if (part.state !== "partial-call")
134
- return part;
135
- // throw new Error("Last is not a partial call");
136
- return {
137
- ...part,
138
- state: "call",
139
- };
140
- });
122
+ return updatePartForPath(message, chunk, (part) => {
123
+ if (part.type !== "tool-call") throw new Error("Last is not a tool call");
124
+ if (part.state !== "partial-call") return part;
125
+ return {
126
+ ...part,
127
+ state: "call"
128
+ };
129
+ });
141
130
  };
142
131
  const handlePartFinish = (message, chunk) => {
143
- return updatePartForPath(message, chunk, (part) => ({
144
- ...part,
145
- status: { type: "complete", reason: "unknown" },
146
- }));
132
+ return updatePartForPath(message, chunk, (part) => ({
133
+ ...part,
134
+ status: {
135
+ type: "complete",
136
+ reason: "unknown"
137
+ }
138
+ }));
147
139
  };
148
140
  const handleTextDelta = (message, chunk) => {
149
- return updatePartForPath(message, chunk, (part) => {
150
- if (part.type === "text" || part.type === "reasoning") {
151
- return { ...part, text: part.text + chunk.textDelta };
152
- }
153
- else if (part.type === "tool-call") {
154
- const newArgsText = part.argsText + chunk.textDelta;
155
- // Fall back to existing args if parsing fails
156
- const newArgs = parsePartialJsonObject(newArgsText) ?? part.args;
157
- return { ...part, argsText: newArgsText, args: newArgs };
158
- }
159
- else {
160
- throw new Error("text-delta received but part is neither text nor tool-call");
161
- }
162
- });
141
+ return updatePartForPath(message, chunk, (part) => {
142
+ if (part.type === "text" || part.type === "reasoning") return {
143
+ ...part,
144
+ text: part.text + chunk.textDelta
145
+ };
146
+ else if (part.type === "tool-call") {
147
+ const newArgsText = part.argsText + chunk.textDelta;
148
+ const newArgs = parsePartialJsonObject(newArgsText) ?? part.args;
149
+ return {
150
+ ...part,
151
+ argsText: newArgsText,
152
+ args: newArgs
153
+ };
154
+ } else throw new Error("text-delta received but part is neither text nor tool-call");
155
+ });
163
156
  };
164
157
  const handleResult = (message, chunk) => {
165
- return updatePartForPath(message, chunk, (part) => {
166
- if (part.type === "tool-call") {
167
- return {
168
- ...part,
169
- state: "result",
170
- ...(chunk.artifact !== undefined ? { artifact: chunk.artifact } : {}),
171
- result: chunk.result,
172
- isError: chunk.isError ?? false,
173
- ...(chunk.modelContent !== undefined
174
- ? { modelContent: chunk.modelContent }
175
- : {}),
176
- ...(chunk.messages !== undefined ? { messages: chunk.messages } : {}),
177
- status: { type: "complete", reason: "stop" },
178
- };
179
- }
180
- else {
181
- throw new Error("Result chunk received but part is not a tool-call");
182
- }
183
- });
158
+ return updatePartForPath(message, chunk, (part) => {
159
+ if (part.type === "tool-call") return {
160
+ ...part,
161
+ state: "result",
162
+ ...chunk.artifact !== void 0 ? { artifact: chunk.artifact } : {},
163
+ result: chunk.result,
164
+ isError: chunk.isError ?? false,
165
+ ...chunk.modelContent !== void 0 ? { modelContent: chunk.modelContent } : {},
166
+ ...chunk.messages !== void 0 ? { messages: chunk.messages } : {},
167
+ status: {
168
+ type: "complete",
169
+ reason: "stop"
170
+ }
171
+ };
172
+ else throw new Error("Result chunk received but part is not a tool-call");
173
+ });
184
174
  };
185
175
  const handleMessageFinish = (message, chunk) => {
186
- // avoid edge case where providers send finish chunks that overwrite message error status (issue #2181)
187
- if (message.status?.type === "incomplete" &&
188
- message.status?.reason === "error") {
189
- return message;
190
- }
191
- const newStatus = getStatus(chunk);
192
- return { ...message, status: newStatus };
176
+ if (message.status?.type === "incomplete" && message.status?.reason === "error") return message;
177
+ const newStatus = getStatus(chunk);
178
+ return {
179
+ ...message,
180
+ status: newStatus
181
+ };
193
182
  };
194
183
  const getStatus = (chunk) => {
195
- if (chunk.finishReason === "tool-calls") {
196
- return {
197
- type: "requires-action",
198
- reason: "tool-calls",
199
- };
200
- }
201
- else if (chunk.finishReason === "stop" ||
202
- chunk.finishReason === "unknown") {
203
- return {
204
- type: "complete",
205
- reason: chunk.finishReason,
206
- };
207
- }
208
- else {
209
- return {
210
- type: "incomplete",
211
- reason: chunk.finishReason,
212
- };
213
- }
184
+ if (chunk.finishReason === "tool-calls") return {
185
+ type: "requires-action",
186
+ reason: "tool-calls"
187
+ };
188
+ else if (chunk.finishReason === "stop" || chunk.finishReason === "unknown") return {
189
+ type: "complete",
190
+ reason: chunk.finishReason
191
+ };
192
+ else return {
193
+ type: "incomplete",
194
+ reason: chunk.finishReason
195
+ };
214
196
  };
215
197
  const handleAnnotations = (message, chunk) => {
216
- return {
217
- ...message,
218
- metadata: {
219
- ...message.metadata,
220
- unstable_annotations: [
221
- ...message.metadata.unstable_annotations,
222
- ...chunk.annotations,
223
- ],
224
- },
225
- };
198
+ return {
199
+ ...message,
200
+ metadata: {
201
+ ...message.metadata,
202
+ unstable_annotations: [...message.metadata.unstable_annotations, ...chunk.annotations]
203
+ }
204
+ };
226
205
  };
227
206
  const handleData = (message, chunk) => {
228
- return {
229
- ...message,
230
- metadata: {
231
- ...message.metadata,
232
- unstable_data: [...message.metadata.unstable_data, ...chunk.data],
233
- },
234
- };
207
+ return {
208
+ ...message,
209
+ metadata: {
210
+ ...message.metadata,
211
+ unstable_data: [...message.metadata.unstable_data, ...chunk.data]
212
+ }
213
+ };
235
214
  };
236
215
  const handleStepStart = (message, chunk) => {
237
- return {
238
- ...message,
239
- metadata: {
240
- ...message.metadata,
241
- steps: [
242
- ...message.metadata.steps,
243
- { state: "started", messageId: chunk.messageId },
244
- ],
245
- },
246
- };
216
+ return {
217
+ ...message,
218
+ metadata: {
219
+ ...message.metadata,
220
+ steps: [...message.metadata.steps, {
221
+ state: "started",
222
+ messageId: chunk.messageId
223
+ }]
224
+ }
225
+ };
247
226
  };
248
227
  const handleStepFinish = (message, chunk) => {
249
- const steps = message.metadata.steps.slice();
250
- const lastIndex = steps.length - 1;
251
- // Check if the previous step is a step-start (has state "started")
252
- if (steps.length > 0 && steps[lastIndex]?.state === "started") {
253
- steps[lastIndex] = {
254
- ...steps[lastIndex],
255
- state: "finished",
256
- finishReason: chunk.finishReason,
257
- usage: chunk.usage,
258
- isContinued: chunk.isContinued,
259
- };
260
- }
261
- else {
262
- // If no previous step-start exists, append a finished step
263
- steps.push({
264
- state: "finished",
265
- messageId: generateId(),
266
- finishReason: chunk.finishReason,
267
- usage: chunk.usage,
268
- isContinued: chunk.isContinued,
269
- });
270
- }
271
- return {
272
- ...message,
273
- metadata: {
274
- ...message.metadata,
275
- steps,
276
- },
277
- };
228
+ const steps = message.metadata.steps.slice();
229
+ const lastIndex = steps.length - 1;
230
+ if (steps.length > 0 && steps[lastIndex]?.state === "started") steps[lastIndex] = {
231
+ ...steps[lastIndex],
232
+ state: "finished",
233
+ finishReason: chunk.finishReason,
234
+ usage: chunk.usage,
235
+ isContinued: chunk.isContinued
236
+ };
237
+ else steps.push({
238
+ state: "finished",
239
+ messageId: generateId(),
240
+ finishReason: chunk.finishReason,
241
+ usage: chunk.usage,
242
+ isContinued: chunk.isContinued
243
+ });
244
+ return {
245
+ ...message,
246
+ metadata: {
247
+ ...message.metadata,
248
+ steps
249
+ }
250
+ };
278
251
  };
279
252
  const handleErrorChunk = (message, chunk) => {
280
- return {
281
- ...message,
282
- status: { type: "incomplete", reason: "error", error: chunk.error },
283
- };
253
+ return {
254
+ ...message,
255
+ status: {
256
+ type: "incomplete",
257
+ reason: "error",
258
+ error: chunk.error
259
+ }
260
+ };
284
261
  };
285
262
  const handleUpdateState = (message, chunk) => {
286
- const acc = new ObjectStreamAccumulator(message.metadata.unstable_state);
287
- acc.append(chunk.operations);
288
- return {
289
- ...message,
290
- metadata: {
291
- ...message.metadata,
292
- unstable_state: acc.state,
293
- },
294
- };
263
+ const acc = new ObjectStreamAccumulator(message.metadata.unstable_state);
264
+ acc.append(chunk.operations);
265
+ return {
266
+ ...message,
267
+ metadata: {
268
+ ...message.metadata,
269
+ unstable_state: acc.state
270
+ }
271
+ };
295
272
  };
296
273
  const computeTiming = (tracker, message) => {
297
- let outputTokens = 0;
298
- for (const step of message.metadata.steps) {
299
- if (step.state === "finished" && step.usage) {
300
- outputTokens += step.usage.outputTokens;
301
- }
302
- }
303
- let totalText = "";
304
- for (const part of message.parts) {
305
- if (part.type === "text" || part.type === "reasoning") {
306
- totalText += part.text;
307
- }
308
- }
309
- return tracker.getTiming(outputTokens > 0 ? outputTokens : undefined, totalText || undefined);
274
+ let outputTokens = 0;
275
+ for (const step of message.metadata.steps) if (step.state === "finished" && step.usage) outputTokens += step.usage.outputTokens;
276
+ let totalText = "";
277
+ for (const part of message.parts) if (part.type === "text" || part.type === "reasoning") totalText += part.text;
278
+ return tracker.getTiming(outputTokens > 0 ? outputTokens : void 0, totalText || void 0);
310
279
  };
311
280
  const throttleCallback = (callback) => {
312
- let hasScheduled = false;
313
- return () => {
314
- if (hasScheduled)
315
- return;
316
- hasScheduled = true;
317
- queueMicrotask(() => {
318
- hasScheduled = false;
319
- callback();
320
- });
321
- };
281
+ let hasScheduled = false;
282
+ return () => {
283
+ if (hasScheduled) return;
284
+ hasScheduled = true;
285
+ queueMicrotask(() => {
286
+ hasScheduled = false;
287
+ callback();
288
+ });
289
+ };
322
290
  };
323
- export class AssistantMessageAccumulator extends TransformStream {
324
- constructor({ initialMessage, throttle, onError, } = {}) {
325
- let message = initialMessage ?? createInitialMessage();
326
- const tracker = new TimingTracker();
327
- let controller;
328
- const emitChunk = throttle
329
- ? throttleCallback(() => {
330
- controller?.enqueue(message);
331
- })
332
- : () => {
333
- controller?.enqueue(message);
334
- };
335
- super({
336
- start(c) {
337
- controller = c;
338
- },
339
- transform(chunk) {
340
- tracker.recordChunk();
341
- const type = chunk.type;
342
- switch (type) {
343
- case "part-start":
344
- message = handlePartStart(message, chunk);
345
- if (chunk.part.type === "tool-call") {
346
- tracker.recordToolCallStart(chunk.part.toolCallId);
347
- }
348
- break;
349
- case "tool-call-args-text-finish":
350
- message = handleToolCallArgsTextFinish(message, chunk);
351
- break;
352
- case "part-finish":
353
- message = handlePartFinish(message, chunk);
354
- break;
355
- case "text-delta":
356
- message = handleTextDelta(message, chunk);
357
- tracker.recordFirstToken();
358
- break;
359
- case "result":
360
- message = handleResult(message, chunk);
361
- break;
362
- case "message-finish":
363
- message = handleMessageFinish(message, chunk);
364
- break;
365
- case "annotations":
366
- message = handleAnnotations(message, chunk);
367
- break;
368
- case "data":
369
- message = handleData(message, chunk);
370
- break;
371
- case "step-start":
372
- message = handleStepStart(message, chunk);
373
- break;
374
- case "step-finish":
375
- message = handleStepFinish(message, chunk);
376
- break;
377
- case "error":
378
- message = handleErrorChunk(message, chunk);
379
- onError?.(chunk.error);
380
- break;
381
- case "update-state":
382
- message = handleUpdateState(message, chunk);
383
- break;
384
- default: {
385
- const unhandledType = type;
386
- throw new Error(`Unsupported chunk type: ${unhandledType}`);
387
- }
388
- }
389
- if (message.status.type !== "running") {
390
- message = {
391
- ...message,
392
- metadata: {
393
- ...message.metadata,
394
- timing: computeTiming(tracker, message),
395
- },
396
- };
397
- }
398
- emitChunk();
399
- },
400
- flush(controller) {
401
- if (message.status?.type === "running") {
402
- // Check if there are any tool calls that require action
403
- const requiresAction = message.parts?.some((part) => part.type === "tool-call" &&
404
- (part.state === "call" || part.state === "partial-call") &&
405
- part.result === undefined) ?? false;
406
- message = handleMessageFinish(message, {
407
- type: "message-finish",
408
- path: [],
409
- finishReason: requiresAction ? "tool-calls" : "unknown",
410
- usage: {
411
- inputTokens: 0,
412
- outputTokens: 0,
413
- },
414
- });
415
- message = {
416
- ...message,
417
- metadata: {
418
- ...message.metadata,
419
- timing: computeTiming(tracker, message),
420
- },
421
- };
422
- controller.enqueue(message);
423
- }
424
- },
425
- });
426
- }
427
- }
291
+ var AssistantMessageAccumulator = class extends TransformStream {
292
+ constructor({ initialMessage, throttle, onError } = {}) {
293
+ let message = initialMessage ?? createInitialMessage();
294
+ const tracker = new TimingTracker();
295
+ let controller;
296
+ const emitChunk = throttle ? throttleCallback(() => {
297
+ controller?.enqueue(message);
298
+ }) : () => {
299
+ controller?.enqueue(message);
300
+ };
301
+ super({
302
+ start(c) {
303
+ controller = c;
304
+ },
305
+ transform(chunk) {
306
+ tracker.recordChunk();
307
+ const type = chunk.type;
308
+ switch (type) {
309
+ case "part-start":
310
+ message = handlePartStart(message, chunk);
311
+ if (chunk.part.type === "tool-call") tracker.recordToolCallStart(chunk.part.toolCallId);
312
+ break;
313
+ case "tool-call-args-text-finish":
314
+ message = handleToolCallArgsTextFinish(message, chunk);
315
+ break;
316
+ case "part-finish":
317
+ message = handlePartFinish(message, chunk);
318
+ break;
319
+ case "text-delta":
320
+ message = handleTextDelta(message, chunk);
321
+ tracker.recordFirstToken();
322
+ break;
323
+ case "result":
324
+ message = handleResult(message, chunk);
325
+ break;
326
+ case "message-finish":
327
+ message = handleMessageFinish(message, chunk);
328
+ break;
329
+ case "annotations":
330
+ message = handleAnnotations(message, chunk);
331
+ break;
332
+ case "data":
333
+ message = handleData(message, chunk);
334
+ break;
335
+ case "step-start":
336
+ message = handleStepStart(message, chunk);
337
+ break;
338
+ case "step-finish":
339
+ message = handleStepFinish(message, chunk);
340
+ break;
341
+ case "error":
342
+ message = handleErrorChunk(message, chunk);
343
+ onError?.(chunk.error);
344
+ break;
345
+ case "update-state":
346
+ message = handleUpdateState(message, chunk);
347
+ break;
348
+ default: throw new Error(`Unsupported chunk type: ${type}`);
349
+ }
350
+ if (message.status.type !== "running") message = {
351
+ ...message,
352
+ metadata: {
353
+ ...message.metadata,
354
+ timing: computeTiming(tracker, message)
355
+ }
356
+ };
357
+ emitChunk();
358
+ },
359
+ flush(controller) {
360
+ if (message.status?.type === "running") {
361
+ const requiresAction = message.parts?.some((part) => part.type === "tool-call" && (part.state === "call" || part.state === "partial-call") && part.result === void 0) ?? false;
362
+ message = handleMessageFinish(message, {
363
+ type: "message-finish",
364
+ path: [],
365
+ finishReason: requiresAction ? "tool-calls" : "unknown",
366
+ usage: {
367
+ inputTokens: 0,
368
+ outputTokens: 0
369
+ }
370
+ });
371
+ message = {
372
+ ...message,
373
+ metadata: {
374
+ ...message.metadata,
375
+ timing: computeTiming(tracker, message)
376
+ }
377
+ };
378
+ controller.enqueue(message);
379
+ }
380
+ }
381
+ });
382
+ }
383
+ };
384
+ //#endregion
385
+ export { AssistantMessageAccumulator, createInitialMessage };
386
+
428
387
  //# sourceMappingURL=assistant-message-accumulator.js.map