assistant-stream 0.2.45 → 0.2.46

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