assistant-stream 0.1.6 → 0.1.7

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 (261) hide show
  1. package/dist/ai-sdk/index.d.ts +5 -0
  2. package/dist/ai-sdk/index.d.ts.map +1 -0
  3. package/dist/ai-sdk/index.js +199 -0
  4. package/dist/ai-sdk/index.js.map +1 -0
  5. package/dist/ai-sdk/index.mjs +173 -0
  6. package/dist/ai-sdk/index.mjs.map +1 -0
  7. package/dist/ai-sdk/language-model.d.ts +6 -0
  8. package/dist/ai-sdk/language-model.d.ts.map +1 -0
  9. package/dist/ai-sdk/language-model.js +131 -0
  10. package/dist/ai-sdk/language-model.js.map +1 -0
  11. package/dist/ai-sdk/language-model.mjs +106 -0
  12. package/dist/ai-sdk/language-model.mjs.map +1 -0
  13. package/dist/ai-sdk.d.ts +3 -24
  14. package/dist/ai-sdk.d.ts.map +1 -0
  15. package/dist/ai-sdk.js +5 -782
  16. package/dist/ai-sdk.js.map +1 -1
  17. package/dist/ai-sdk.mjs +4 -276
  18. package/dist/ai-sdk.mjs.map +1 -1
  19. package/dist/core/AssistantStream.d.ts +12 -0
  20. package/dist/core/AssistantStream.d.ts.map +1 -0
  21. package/dist/core/AssistantStream.js +46 -0
  22. package/dist/core/AssistantStream.js.map +1 -0
  23. package/dist/core/AssistantStream.mjs +21 -0
  24. package/dist/core/AssistantStream.mjs.map +1 -0
  25. package/dist/core/AssistantStreamChunk.d.ts +64 -0
  26. package/dist/core/AssistantStreamChunk.d.ts.map +1 -0
  27. package/dist/core/AssistantStreamChunk.js +19 -0
  28. package/dist/core/AssistantStreamChunk.js.map +1 -0
  29. package/dist/core/AssistantStreamChunk.mjs +1 -0
  30. package/dist/core/AssistantStreamChunk.mjs.map +1 -0
  31. package/dist/core/accumulators/AssistantMessageStream.d.ts +13 -0
  32. package/dist/core/accumulators/AssistantMessageStream.d.ts.map +1 -0
  33. package/dist/core/accumulators/AssistantMessageStream.js +79 -0
  34. package/dist/core/accumulators/AssistantMessageStream.js.map +1 -0
  35. package/dist/core/accumulators/AssistantMessageStream.mjs +54 -0
  36. package/dist/core/accumulators/AssistantMessageStream.mjs.map +1 -0
  37. package/dist/core/accumulators/assistant-message-accumulator.d.ts +8 -0
  38. package/dist/core/accumulators/assistant-message-accumulator.d.ts.map +1 -0
  39. package/dist/core/accumulators/assistant-message-accumulator.js +334 -0
  40. package/dist/core/accumulators/assistant-message-accumulator.js.map +1 -0
  41. package/dist/core/accumulators/assistant-message-accumulator.mjs +309 -0
  42. package/dist/core/accumulators/assistant-message-accumulator.mjs.map +1 -0
  43. package/dist/core/index.d.ts +11 -0
  44. package/dist/core/index.d.ts.map +1 -0
  45. package/dist/core/index.js +55 -0
  46. package/dist/core/index.js.map +1 -0
  47. package/dist/core/index.mjs +26 -0
  48. package/dist/core/index.mjs.map +1 -0
  49. package/dist/core/modules/assistant-stream.d.ts +31 -0
  50. package/dist/core/modules/assistant-stream.d.ts.map +1 -0
  51. package/dist/core/modules/assistant-stream.js +224 -0
  52. package/dist/core/modules/assistant-stream.js.map +1 -0
  53. package/dist/core/modules/assistant-stream.mjs +202 -0
  54. package/dist/core/modules/assistant-stream.mjs.map +1 -0
  55. package/dist/core/modules/text.d.ts +9 -0
  56. package/dist/core/modules/text.d.ts.map +1 -0
  57. package/dist/core/modules/text.js +78 -0
  58. package/dist/core/modules/text.js.map +1 -0
  59. package/dist/core/modules/text.mjs +52 -0
  60. package/dist/core/modules/text.mjs.map +1 -0
  61. package/dist/core/modules/tool-call.d.ts +13 -0
  62. package/dist/core/modules/tool-call.d.ts.map +1 -0
  63. package/dist/core/modules/tool-call.js +110 -0
  64. package/dist/core/modules/tool-call.js.map +1 -0
  65. package/dist/core/modules/tool-call.mjs +84 -0
  66. package/dist/core/modules/tool-call.mjs.map +1 -0
  67. package/dist/core/serialization/PlainText.d.ts +11 -0
  68. package/dist/core/serialization/PlainText.d.ts.map +1 -0
  69. package/dist/core/serialization/PlainText.js +70 -0
  70. package/dist/core/serialization/PlainText.js.map +1 -0
  71. package/dist/core/serialization/PlainText.mjs +44 -0
  72. package/dist/core/serialization/PlainText.mjs.map +1 -0
  73. package/dist/core/serialization/data-stream/DataStream.d.ts +11 -0
  74. package/dist/core/serialization/data-stream/DataStream.d.ts.map +1 -0
  75. package/dist/core/serialization/data-stream/DataStream.js +332 -0
  76. package/dist/core/serialization/data-stream/DataStream.js.map +1 -0
  77. package/dist/core/serialization/data-stream/DataStream.mjs +311 -0
  78. package/dist/core/serialization/data-stream/DataStream.mjs.map +1 -0
  79. package/dist/core/serialization/data-stream/chunk-types.d.ts +86 -0
  80. package/dist/core/serialization/data-stream/chunk-types.d.ts.map +1 -0
  81. package/dist/core/serialization/data-stream/chunk-types.js +49 -0
  82. package/dist/core/serialization/data-stream/chunk-types.js.map +1 -0
  83. package/dist/core/serialization/data-stream/chunk-types.mjs +24 -0
  84. package/dist/core/serialization/data-stream/chunk-types.mjs.map +1 -0
  85. package/dist/core/serialization/data-stream/serialization.d.ts +8 -0
  86. package/dist/core/serialization/data-stream/serialization.d.ts.map +1 -0
  87. package/dist/core/serialization/data-stream/serialization.js +56 -0
  88. package/dist/core/serialization/data-stream/serialization.js.map +1 -0
  89. package/dist/core/serialization/data-stream/serialization.mjs +30 -0
  90. package/dist/core/serialization/data-stream/serialization.mjs.map +1 -0
  91. package/dist/core/tool/ToolCallReader.d.ts +33 -0
  92. package/dist/core/tool/ToolCallReader.d.ts.map +1 -0
  93. package/dist/core/tool/ToolCallReader.js +339 -0
  94. package/dist/core/tool/ToolCallReader.js.map +1 -0
  95. package/dist/core/tool/ToolCallReader.mjs +315 -0
  96. package/dist/core/tool/ToolCallReader.mjs.map +1 -0
  97. package/dist/core/tool/ToolExecutionStream.d.ts +24 -0
  98. package/dist/core/tool/ToolExecutionStream.d.ts.map +1 -0
  99. package/dist/core/tool/ToolExecutionStream.js +165 -0
  100. package/dist/core/tool/ToolExecutionStream.js.map +1 -0
  101. package/dist/core/tool/ToolExecutionStream.mjs +132 -0
  102. package/dist/core/tool/ToolExecutionStream.mjs.map +1 -0
  103. package/dist/core/tool/ToolResponse.d.ts +17 -0
  104. package/dist/core/tool/ToolResponse.d.ts.map +1 -0
  105. package/dist/core/tool/ToolResponse.js +47 -0
  106. package/dist/core/tool/ToolResponse.js.map +1 -0
  107. package/dist/core/tool/ToolResponse.mjs +22 -0
  108. package/dist/core/tool/ToolResponse.mjs.map +1 -0
  109. package/dist/core/tool/index.d.ts +6 -0
  110. package/dist/core/tool/index.d.ts.map +1 -0
  111. package/dist/core/tool/index.js +39 -0
  112. package/dist/core/tool/index.js.map +1 -0
  113. package/dist/core/tool/index.mjs +14 -0
  114. package/dist/core/tool/index.mjs.map +1 -0
  115. package/dist/core/tool/tool-types.d.ts +76 -0
  116. package/dist/core/tool/tool-types.d.ts.map +1 -0
  117. package/dist/core/tool/tool-types.js +19 -0
  118. package/dist/core/tool/tool-types.js.map +1 -0
  119. package/dist/core/tool/tool-types.mjs +1 -0
  120. package/dist/core/tool/tool-types.mjs.map +1 -0
  121. package/dist/core/tool/toolResultStream.d.ts +6 -0
  122. package/dist/core/tool/toolResultStream.d.ts.map +1 -0
  123. package/dist/core/tool/toolResultStream.js +104 -0
  124. package/dist/core/tool/toolResultStream.js.map +1 -0
  125. package/dist/core/tool/toolResultStream.mjs +78 -0
  126. package/dist/core/tool/toolResultStream.mjs.map +1 -0
  127. package/dist/core/tool/type-path-utils.d.ts +23 -0
  128. package/dist/core/tool/type-path-utils.d.ts.map +1 -0
  129. package/dist/core/tool/type-path-utils.js +19 -0
  130. package/dist/core/tool/type-path-utils.js.map +1 -0
  131. package/dist/core/tool/type-path-utils.mjs +1 -0
  132. package/dist/core/tool/type-path-utils.mjs.map +1 -0
  133. package/dist/core/utils/Counter.d.ts +5 -0
  134. package/dist/core/utils/Counter.d.ts.map +1 -0
  135. package/dist/core/utils/Counter.js +36 -0
  136. package/dist/core/utils/Counter.js.map +1 -0
  137. package/dist/core/utils/Counter.mjs +11 -0
  138. package/dist/core/utils/Counter.mjs.map +1 -0
  139. package/dist/core/utils/generateId.d.ts +2 -0
  140. package/dist/core/utils/generateId.d.ts.map +1 -0
  141. package/dist/core/utils/generateId.js +35 -0
  142. package/dist/core/utils/generateId.js.map +1 -0
  143. package/dist/core/utils/generateId.mjs +10 -0
  144. package/dist/core/utils/generateId.mjs.map +1 -0
  145. package/dist/core/utils/stream/AssistantMetaTransformStream.d.ts +20 -0
  146. package/dist/core/utils/stream/AssistantMetaTransformStream.d.ts.map +1 -0
  147. package/dist/core/utils/stream/AssistantMetaTransformStream.js +69 -0
  148. package/dist/core/utils/stream/AssistantMetaTransformStream.js.map +1 -0
  149. package/dist/core/utils/stream/AssistantMetaTransformStream.mjs +44 -0
  150. package/dist/core/utils/stream/AssistantMetaTransformStream.mjs.map +1 -0
  151. package/dist/core/utils/stream/AssistantTransformStream.d.ts +15 -0
  152. package/dist/core/utils/stream/AssistantTransformStream.d.ts.map +1 -0
  153. package/dist/core/utils/stream/AssistantTransformStream.js +69 -0
  154. package/dist/core/utils/stream/AssistantTransformStream.js.map +1 -0
  155. package/dist/core/utils/stream/AssistantTransformStream.mjs +46 -0
  156. package/dist/core/utils/stream/AssistantTransformStream.mjs.map +1 -0
  157. package/dist/core/utils/stream/LineDecoderStream.d.ts +5 -0
  158. package/dist/core/utils/stream/LineDecoderStream.d.ts.map +1 -0
  159. package/dist/core/utils/stream/LineDecoderStream.js +52 -0
  160. package/dist/core/utils/stream/LineDecoderStream.js.map +1 -0
  161. package/dist/core/utils/stream/LineDecoderStream.mjs +27 -0
  162. package/dist/core/utils/stream/LineDecoderStream.mjs.map +1 -0
  163. package/dist/core/utils/stream/PipeableTransformStream.d.ts +4 -0
  164. package/dist/core/utils/stream/PipeableTransformStream.d.ts.map +1 -0
  165. package/dist/core/utils/stream/PipeableTransformStream.js +40 -0
  166. package/dist/core/utils/stream/PipeableTransformStream.js.map +1 -0
  167. package/dist/core/utils/stream/PipeableTransformStream.mjs +15 -0
  168. package/dist/core/utils/stream/PipeableTransformStream.mjs.map +1 -0
  169. package/dist/core/utils/stream/UnderlyingReadable.d.ts +6 -0
  170. package/dist/core/utils/stream/UnderlyingReadable.d.ts.map +1 -0
  171. package/dist/core/utils/stream/UnderlyingReadable.js +19 -0
  172. package/dist/core/utils/stream/UnderlyingReadable.js.map +1 -0
  173. package/dist/core/utils/stream/UnderlyingReadable.mjs +1 -0
  174. package/dist/core/utils/stream/UnderlyingReadable.mjs.map +1 -0
  175. package/dist/core/utils/stream/merge.d.ts +9 -0
  176. package/dist/core/utils/stream/merge.d.ts.map +1 -0
  177. package/dist/core/utils/stream/merge.js +110 -0
  178. package/dist/core/utils/stream/merge.js.map +1 -0
  179. package/dist/core/utils/stream/merge.mjs +85 -0
  180. package/dist/core/utils/stream/merge.mjs.map +1 -0
  181. package/dist/core/utils/stream/path-utils.d.ts +12 -0
  182. package/dist/core/utils/stream/path-utils.d.ts.map +1 -0
  183. package/dist/core/utils/stream/path-utils.js +88 -0
  184. package/dist/core/utils/stream/path-utils.js.map +1 -0
  185. package/dist/core/utils/stream/path-utils.mjs +61 -0
  186. package/dist/core/utils/stream/path-utils.mjs.map +1 -0
  187. package/dist/core/utils/types.d.ts +102 -0
  188. package/dist/core/utils/types.d.ts.map +1 -0
  189. package/dist/core/utils/types.js +19 -0
  190. package/dist/core/utils/types.js.map +1 -0
  191. package/dist/core/utils/types.mjs +1 -0
  192. package/dist/core/utils/types.mjs.map +1 -0
  193. package/dist/core/utils/withPromiseOrValue.d.ts +2 -0
  194. package/dist/core/utils/withPromiseOrValue.d.ts.map +1 -0
  195. package/dist/core/utils/withPromiseOrValue.js +42 -0
  196. package/dist/core/utils/withPromiseOrValue.js.map +1 -0
  197. package/dist/core/utils/withPromiseOrValue.mjs +17 -0
  198. package/dist/core/utils/withPromiseOrValue.mjs.map +1 -0
  199. package/dist/index.d.ts +2 -153
  200. package/dist/index.d.ts.map +1 -0
  201. package/dist/index.js +3 -2318
  202. package/dist/index.js.map +1 -1
  203. package/dist/index.mjs +2 -957
  204. package/dist/index.mjs.map +1 -1
  205. package/dist/utils/AsyncIterableStream.d.ts +3 -0
  206. package/dist/utils/AsyncIterableStream.d.ts.map +1 -0
  207. package/dist/utils/AsyncIterableStream.js +46 -0
  208. package/dist/utils/AsyncIterableStream.js.map +1 -0
  209. package/dist/utils/AsyncIterableStream.mjs +21 -0
  210. package/dist/utils/AsyncIterableStream.mjs.map +1 -0
  211. package/dist/utils/json/fix-json.d.ts +2 -0
  212. package/dist/utils/json/fix-json.d.ts.map +1 -0
  213. package/dist/{chunk-PQLDKUPN.mjs → utils/json/fix-json.js} +28 -66
  214. package/dist/utils/json/fix-json.js.map +1 -0
  215. package/dist/utils/json/fix-json.mjs +362 -0
  216. package/dist/utils/json/fix-json.mjs.map +1 -0
  217. package/dist/utils/json/is-json.d.ts +5 -0
  218. package/dist/utils/json/is-json.d.ts.map +1 -0
  219. package/dist/utils/json/is-json.js +56 -0
  220. package/dist/utils/json/is-json.js.map +1 -0
  221. package/dist/utils/json/is-json.mjs +29 -0
  222. package/dist/utils/json/is-json.mjs.map +1 -0
  223. package/dist/utils/json/json-value.d.ts +6 -0
  224. package/dist/utils/json/json-value.d.ts.map +1 -0
  225. package/dist/utils/json/json-value.js +19 -0
  226. package/dist/utils/json/json-value.js.map +1 -0
  227. package/dist/utils/json/json-value.mjs +1 -0
  228. package/dist/utils/json/json-value.mjs.map +1 -0
  229. package/dist/utils/json/parse-partial-json-object.d.ts +14 -0
  230. package/dist/utils/json/parse-partial-json-object.d.ts.map +1 -0
  231. package/dist/utils/json/parse-partial-json-object.js +102 -0
  232. package/dist/utils/json/parse-partial-json-object.js.map +1 -0
  233. package/dist/utils/json/parse-partial-json-object.mjs +65 -0
  234. package/dist/utils/json/parse-partial-json-object.mjs.map +1 -0
  235. package/dist/utils/json/parse-partial-json-object.test.d.ts +2 -0
  236. package/dist/utils/json/parse-partial-json-object.test.d.ts.map +1 -0
  237. package/dist/utils/promiseWithResolvers.d.ts +6 -0
  238. package/dist/utils/promiseWithResolvers.d.ts.map +1 -0
  239. package/dist/utils/promiseWithResolvers.js +40 -0
  240. package/dist/utils/promiseWithResolvers.js.map +1 -0
  241. package/dist/utils/promiseWithResolvers.mjs +15 -0
  242. package/dist/utils/promiseWithResolvers.mjs.map +1 -0
  243. package/dist/utils.d.ts +4 -16
  244. package/dist/utils.d.ts.map +1 -0
  245. package/dist/utils.js +5 -451
  246. package/dist/utils.js.map +1 -1
  247. package/dist/utils.mjs +7 -21
  248. package/dist/utils.mjs.map +1 -1
  249. package/package.json +1 -1
  250. package/dist/AsyncIterableStream-C3C8ZoXv.d.mts +0 -4
  251. package/dist/AsyncIterableStream-C3C8ZoXv.d.ts +0 -4
  252. package/dist/ai-sdk.d.mts +0 -24
  253. package/dist/assistant-stream-ISFjQ0mQ.d.mts +0 -225
  254. package/dist/assistant-stream-kAoIMgvk.d.ts +0 -225
  255. package/dist/chunk-EDE6WQ2R.mjs +0 -943
  256. package/dist/chunk-EDE6WQ2R.mjs.map +0 -1
  257. package/dist/chunk-PQLDKUPN.mjs.map +0 -1
  258. package/dist/index.d.mts +0 -153
  259. package/dist/json-value-Ch5eKkQ_.d.mts +0 -7
  260. package/dist/json-value-Ch5eKkQ_.d.ts +0 -7
  261. package/dist/utils.d.mts +0 -16
package/dist/index.js CHANGED
@@ -1,14 +1,8 @@
1
1
  "use strict";
2
- var __create = Object.create;
3
2
  var __defProp = Object.defineProperty;
4
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __export = (target, all) => {
9
- for (var name in all)
10
- __defProp(target, name, { get: all[name], enumerable: true });
11
- };
12
6
  var __copyProps = (to, from, except, desc) => {
13
7
  if (from && typeof from === "object" || typeof from === "function") {
14
8
  for (let key of __getOwnPropNames(from))
@@ -17,2324 +11,15 @@ var __copyProps = (to, from, except, desc) => {
17
11
  }
18
12
  return to;
19
13
  };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
24
- // "default" to the CommonJS "module.exports" for node compatibility.
25
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
- mod
27
- ));
14
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
28
15
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
16
 
30
17
  // src/index.ts
31
18
  var index_exports = {};
32
- __export(index_exports, {
33
- AssistantMessageAccumulator: () => AssistantMessageAccumulator,
34
- AssistantMessageStream: () => AssistantMessageStream,
35
- AssistantStream: () => AssistantStream,
36
- DataStreamDecoder: () => DataStreamDecoder,
37
- DataStreamEncoder: () => DataStreamEncoder,
38
- PlainTextDecoder: () => PlainTextDecoder,
39
- PlainTextEncoder: () => PlainTextEncoder,
40
- ToolExecutionStream: () => ToolExecutionStream,
41
- ToolResponse: () => ToolResponse,
42
- createAssistantStream: () => createAssistantStream,
43
- createAssistantStreamResponse: () => createAssistantStreamResponse,
44
- unstable_runPendingTools: () => unstable_runPendingTools,
45
- unstable_toolResultStream: () => toolResultStream
46
- });
47
19
  module.exports = __toCommonJS(index_exports);
48
-
49
- // src/core/AssistantStream.ts
50
- var AssistantStream = {
51
- toResponse(stream, transformer) {
52
- return new Response(AssistantStream.toByteStream(stream, transformer), {
53
- headers: transformer.headers ?? {}
54
- });
55
- },
56
- fromResponse(response, transformer) {
57
- return AssistantStream.fromByteStream(response.body, transformer);
58
- },
59
- toByteStream(stream, transformer) {
60
- return stream.pipeThrough(transformer);
61
- },
62
- fromByteStream(readable, transformer) {
63
- return readable.pipeThrough(transformer);
64
- }
65
- };
66
-
67
- // src/utils/promiseWithResolvers.ts
68
- var promiseWithResolvers = function() {
69
- let resolve;
70
- let reject;
71
- const promise = new Promise((res, rej) => {
72
- resolve = res;
73
- reject = rej;
74
- });
75
- if (!resolve || !reject) throw new Error("Failed to create promise");
76
- return { promise, resolve, reject };
77
- };
78
-
79
- // src/core/utils/stream/merge.ts
80
- var createMergeStream = () => {
81
- const list = [];
82
- let sealed = false;
83
- let controller;
84
- let currentPull;
85
- const handlePull = (item) => {
86
- if (!item.promise) {
87
- item.promise = item.reader.read().then(({ done, value }) => {
88
- item.promise = void 0;
89
- if (done) {
90
- list.splice(list.indexOf(item), 1);
91
- if (sealed && list.length === 0) {
92
- controller.close();
93
- }
94
- } else {
95
- controller.enqueue(value);
96
- }
97
- currentPull?.resolve();
98
- currentPull = void 0;
99
- }).catch((e) => {
100
- console.error(e);
101
- list.forEach((item2) => {
102
- item2.reader.cancel();
103
- });
104
- list.length = 0;
105
- controller.error(e);
106
- currentPull?.reject(e);
107
- currentPull = void 0;
108
- });
109
- }
110
- };
111
- const readable = new ReadableStream({
112
- start(c) {
113
- controller = c;
114
- },
115
- pull() {
116
- currentPull = promiseWithResolvers();
117
- list.forEach((item) => {
118
- handlePull(item);
119
- });
120
- return currentPull.promise;
121
- },
122
- cancel() {
123
- list.forEach((item) => {
124
- item.reader.cancel();
125
- });
126
- list.length = 0;
127
- }
128
- });
129
- return {
130
- readable,
131
- isSealed() {
132
- return sealed;
133
- },
134
- seal() {
135
- sealed = true;
136
- if (list.length === 0) controller.close();
137
- },
138
- addStream(stream) {
139
- if (sealed)
140
- throw new Error(
141
- "Cannot add streams after the run callback has settled."
142
- );
143
- const item = { reader: stream.getReader() };
144
- list.push(item);
145
- handlePull(item);
146
- },
147
- enqueue(chunk) {
148
- this.addStream(
149
- new ReadableStream({
150
- start(c) {
151
- c.enqueue(chunk);
152
- c.close();
153
- }
154
- })
155
- );
156
- }
157
- };
158
- };
159
-
160
- // src/core/modules/text.ts
161
- var TextStreamControllerImpl = class {
162
- _controller;
163
- _isClosed = false;
164
- constructor(controller) {
165
- this._controller = controller;
166
- }
167
- append(textDelta) {
168
- this._controller.enqueue({
169
- type: "text-delta",
170
- path: [],
171
- textDelta
172
- });
173
- return this;
174
- }
175
- close() {
176
- if (this._isClosed) return;
177
- this._isClosed = true;
178
- this._controller.enqueue({
179
- type: "part-finish",
180
- path: []
181
- });
182
- this._controller.close();
183
- }
184
- };
185
- var createTextStream = (readable) => {
186
- return new ReadableStream({
187
- start(c) {
188
- return readable.start?.(new TextStreamControllerImpl(c));
189
- },
190
- pull(c) {
191
- return readable.pull?.(new TextStreamControllerImpl(c));
192
- },
193
- cancel(c) {
194
- return readable.cancel?.(c);
195
- }
196
- });
197
- };
198
- var createTextStreamController = () => {
199
- let controller;
200
- const stream = createTextStream({
201
- start(c) {
202
- controller = c;
203
- }
204
- });
205
- return [stream, controller];
206
- };
207
-
208
- // src/core/modules/tool-call.ts
209
- var ToolCallStreamControllerImpl = class {
210
- constructor(_controller) {
211
- this._controller = _controller;
212
- const stream = createTextStream({
213
- start: (c) => {
214
- this._argsTextController = c;
215
- }
216
- });
217
- this._mergeTask = stream.pipeTo(
218
- new WritableStream({
219
- write: (chunk) => {
220
- switch (chunk.type) {
221
- case "text-delta":
222
- this._controller.enqueue(chunk);
223
- break;
224
- case "part-finish":
225
- this._controller.enqueue({
226
- type: "tool-call-args-text-finish",
227
- path: []
228
- });
229
- break;
230
- default:
231
- throw new Error(`Unexpected chunk type: ${chunk.type}`);
232
- }
233
- }
234
- })
235
- );
236
- }
237
- _isClosed = false;
238
- _mergeTask;
239
- get argsText() {
240
- return this._argsTextController;
241
- }
242
- _argsTextController;
243
- setResponse(response) {
244
- this._controller.enqueue({
245
- type: "result",
246
- path: [],
247
- artifact: response.artifact,
248
- result: response.result,
249
- isError: response.isError ?? false
250
- });
251
- }
252
- async close() {
253
- if (this._isClosed) return;
254
- this._isClosed = true;
255
- this._argsTextController.close();
256
- await this._mergeTask;
257
- this._controller.enqueue({
258
- type: "part-finish",
259
- path: []
260
- });
261
- this._controller.close();
262
- }
263
- };
264
- var createToolCallStream = (readable) => {
265
- return new ReadableStream({
266
- start(c) {
267
- return readable.start?.(new ToolCallStreamControllerImpl(c));
268
- },
269
- pull(c) {
270
- return readable.pull?.(new ToolCallStreamControllerImpl(c));
271
- },
272
- cancel(c) {
273
- return readable.cancel?.(c);
274
- }
275
- });
276
- };
277
- var createToolCallStreamController = () => {
278
- let controller;
279
- const stream = createToolCallStream({
280
- start(c) {
281
- controller = c;
282
- }
283
- });
284
- return [stream, controller];
285
- };
286
-
287
- // src/core/utils/Counter.ts
288
- var Counter = class {
289
- value = -1;
290
- up() {
291
- return ++this.value;
292
- }
293
- };
294
-
295
- // src/core/utils/stream/path-utils.ts
296
- var PathAppendEncoder = class extends TransformStream {
297
- constructor(idx) {
298
- super({
299
- transform(chunk, controller) {
300
- controller.enqueue({
301
- ...chunk,
302
- path: [idx, ...chunk.path]
303
- });
304
- }
305
- });
306
- }
307
- };
308
- var PathAppendDecoder = class extends TransformStream {
309
- constructor(idx) {
310
- super({
311
- transform(chunk, controller) {
312
- const {
313
- path: [idx2, ...path]
314
- } = chunk;
315
- if (idx !== idx2)
316
- throw new Error(`Path mismatch: expected ${idx}, got ${idx2}`);
317
- controller.enqueue({
318
- ...chunk,
319
- path
320
- });
321
- }
322
- });
323
- }
324
- };
325
- var PathMergeEncoder = class extends TransformStream {
326
- constructor(counter) {
327
- const innerCounter = new Counter();
328
- const mapping = /* @__PURE__ */ new Map();
329
- super({
330
- transform(chunk, controller) {
331
- if (chunk.type === "part-start" && chunk.path.length === 0) {
332
- mapping.set(innerCounter.up(), counter.up());
333
- }
334
- const [idx, ...path] = chunk.path;
335
- if (idx === void 0) {
336
- controller.enqueue(chunk);
337
- return;
338
- }
339
- const mappedIdx = mapping.get(idx);
340
- if (mappedIdx === void 0) throw new Error("Path not found");
341
- controller.enqueue({
342
- ...chunk,
343
- path: [mappedIdx, ...path]
344
- });
345
- }
346
- });
347
- }
348
- };
349
-
350
- // src/core/utils/stream/AssistantTransformStream.ts
351
- var AssistantTransformStream = class extends TransformStream {
352
- constructor(transformer, writableStrategy, readableStrategy) {
353
- const [stream, runController] = createAssistantStreamController();
354
- let runPipeTask;
355
- super(
356
- {
357
- start(controller) {
358
- runPipeTask = stream.pipeTo(
359
- new WritableStream({
360
- write(chunk) {
361
- controller.enqueue(chunk);
362
- },
363
- abort(reason) {
364
- controller.error(reason);
365
- },
366
- close() {
367
- controller.terminate();
368
- }
369
- })
370
- ).catch((error) => {
371
- controller.error(error);
372
- });
373
- return transformer.start?.(runController);
374
- },
375
- transform(chunk) {
376
- return transformer.transform?.(chunk, runController);
377
- },
378
- async flush() {
379
- await transformer.flush?.(runController);
380
- runController.close();
381
- await runPipeTask;
382
- }
383
- },
384
- writableStrategy,
385
- readableStrategy
386
- );
387
- }
388
- };
389
-
390
- // src/core/utils/stream/PipeableTransformStream.ts
391
- var PipeableTransformStream = class extends TransformStream {
392
- constructor(transform) {
393
- super();
394
- const readable = transform(super.readable);
395
- Object.defineProperty(this, "readable", {
396
- value: readable,
397
- writable: false
398
- });
399
- }
400
- };
401
-
402
- // src/core/utils/stream/LineDecoderStream.ts
403
- var LineDecoderStream = class extends TransformStream {
404
- buffer = "";
405
- constructor() {
406
- super({
407
- transform: (chunk, controller) => {
408
- this.buffer += chunk;
409
- const lines = this.buffer.split("\n");
410
- for (let i = 0; i < lines.length - 1; i++) {
411
- controller.enqueue(lines[i]);
412
- }
413
- this.buffer = lines[lines.length - 1] || "";
414
- },
415
- flush: () => {
416
- if (this.buffer) {
417
- throw new Error(
418
- `Stream ended with an incomplete line: "${this.buffer}"`
419
- );
420
- }
421
- }
422
- });
423
- }
424
- };
425
-
426
- // src/core/serialization/data-stream/serialization.ts
427
- var DataStreamChunkEncoder = class extends TransformStream {
428
- constructor() {
429
- super({
430
- transform: (chunk, controller) => {
431
- controller.enqueue(`${chunk.type}:${JSON.stringify(chunk.value)}
432
- `);
433
- }
434
- });
435
- }
436
- };
437
- var DataStreamChunkDecoder = class extends TransformStream {
438
- constructor() {
439
- super({
440
- transform: (chunk, controller) => {
441
- const index = chunk.indexOf(":");
442
- if (index === -1) throw new Error("Invalid stream part");
443
- controller.enqueue({
444
- type: chunk.slice(0, index),
445
- value: JSON.parse(chunk.slice(index + 1))
446
- });
447
- }
448
- });
449
- }
450
- };
451
-
452
- // src/core/utils/stream/AssistantMetaTransformStream.ts
453
- var AssistantMetaTransformStream = class extends TransformStream {
454
- constructor() {
455
- const parts = [];
456
- super({
457
- transform(chunk, controller) {
458
- if (chunk.type === "part-start") {
459
- if (chunk.path.length !== 0) {
460
- controller.error(new Error("Nested parts are not supported"));
461
- return;
462
- }
463
- parts.push(chunk.part);
464
- controller.enqueue(chunk);
465
- return;
466
- }
467
- if (chunk.type === "text-delta" || chunk.type === "result" || chunk.type === "part-finish" || chunk.type === "tool-call-args-text-finish") {
468
- if (chunk.path.length !== 1) {
469
- controller.error(
470
- new Error(`${chunk.type} chunks must have a path of length 1`)
471
- );
472
- return;
473
- }
474
- const idx = chunk.path[0];
475
- if (idx < 0 || idx >= parts.length) {
476
- controller.error(new Error(`Invalid path index: ${idx}`));
477
- return;
478
- }
479
- const part = parts[idx];
480
- controller.enqueue({
481
- ...chunk,
482
- meta: part
483
- // TODO
484
- });
485
- return;
486
- }
487
- controller.enqueue(chunk);
488
- }
489
- });
490
- }
491
- };
492
-
493
- // src/core/serialization/data-stream/DataStream.ts
494
- var DataStreamEncoder = class extends PipeableTransformStream {
495
- headers = new Headers({
496
- "Content-Type": "text/plain; charset=utf-8",
497
- "x-vercel-ai-data-stream": "v1"
498
- });
499
- constructor() {
500
- super((readable) => {
501
- const transform = new TransformStream({
502
- transform(chunk, controller) {
503
- const type = chunk.type;
504
- switch (type) {
505
- case "part-start": {
506
- const part = chunk.part;
507
- if (part.type === "tool-call") {
508
- const { type: type2, ...value } = part;
509
- controller.enqueue({
510
- type: "b" /* StartToolCall */,
511
- value
512
- });
513
- }
514
- if (part.type === "source") {
515
- const { type: type2, ...value } = part;
516
- controller.enqueue({
517
- type: "h" /* Source */,
518
- value
519
- });
520
- }
521
- break;
522
- }
523
- case "text-delta": {
524
- const part = chunk.meta;
525
- switch (part.type) {
526
- case "text": {
527
- controller.enqueue({
528
- type: "0" /* TextDelta */,
529
- value: chunk.textDelta
530
- });
531
- break;
532
- }
533
- case "reasoning": {
534
- controller.enqueue({
535
- type: "g" /* ReasoningDelta */,
536
- value: chunk.textDelta
537
- });
538
- break;
539
- }
540
- case "tool-call": {
541
- controller.enqueue({
542
- type: "c" /* ToolCallArgsTextDelta */,
543
- value: {
544
- toolCallId: part.toolCallId,
545
- argsTextDelta: chunk.textDelta
546
- }
547
- });
548
- break;
549
- }
550
- default:
551
- throw new Error(
552
- `Unsupported part type for text-delta: ${part.type}`
553
- );
554
- }
555
- break;
556
- }
557
- case "result": {
558
- const part = chunk.meta;
559
- if (part.type !== "tool-call") {
560
- throw new Error(
561
- `Result chunk on non-tool-call part not supported: ${part.type}`
562
- );
563
- }
564
- controller.enqueue({
565
- type: "a" /* ToolCallResult */,
566
- value: {
567
- toolCallId: part.toolCallId,
568
- result: chunk.result,
569
- artifact: chunk.artifact,
570
- ...chunk.isError ? { isError: chunk.isError } : {}
571
- }
572
- });
573
- break;
574
- }
575
- case "step-start": {
576
- const { type: type2, ...value } = chunk;
577
- controller.enqueue({
578
- type: "f" /* StartStep */,
579
- value
580
- });
581
- break;
582
- }
583
- case "step-finish": {
584
- const { type: type2, ...value } = chunk;
585
- controller.enqueue({
586
- type: "e" /* FinishStep */,
587
- value
588
- });
589
- break;
590
- }
591
- case "message-finish": {
592
- const { type: type2, ...value } = chunk;
593
- controller.enqueue({
594
- type: "d" /* FinishMessage */,
595
- value
596
- });
597
- break;
598
- }
599
- case "error": {
600
- controller.enqueue({
601
- type: "3" /* Error */,
602
- value: chunk.error
603
- });
604
- break;
605
- }
606
- case "annotations": {
607
- controller.enqueue({
608
- type: "8" /* Annotation */,
609
- value: chunk.annotations
610
- });
611
- break;
612
- }
613
- case "data": {
614
- controller.enqueue({
615
- type: "2" /* Data */,
616
- value: chunk.data
617
- });
618
- break;
619
- }
620
- // TODO ignore for now
621
- // in the future, we should create a handler that waits for text parts to finish before continuing
622
- case "tool-call-args-text-finish":
623
- case "part-finish":
624
- break;
625
- default: {
626
- const exhaustiveCheck = type;
627
- throw new Error(`Unsupported chunk type: ${exhaustiveCheck}`);
628
- }
629
- }
630
- }
631
- });
632
- return readable.pipeThrough(new AssistantMetaTransformStream()).pipeThrough(transform).pipeThrough(new DataStreamChunkEncoder()).pipeThrough(new TextEncoderStream());
633
- });
634
- }
635
- };
636
- var TOOL_CALL_ARGS_CLOSING_CHUNKS = [
637
- "b" /* StartToolCall */,
638
- "9" /* ToolCall */,
639
- "0" /* TextDelta */,
640
- "g" /* ReasoningDelta */,
641
- "h" /* Source */,
642
- "3" /* Error */,
643
- "e" /* FinishStep */,
644
- "d" /* FinishMessage */
645
- ];
646
- var DataStreamDecoder = class extends PipeableTransformStream {
647
- constructor() {
648
- super((readable) => {
649
- const toolCallControllers = /* @__PURE__ */ new Map();
650
- let activeToolCallArgsText;
651
- const transform = new AssistantTransformStream({
652
- transform(chunk, controller) {
653
- const { type, value } = chunk;
654
- if (TOOL_CALL_ARGS_CLOSING_CHUNKS.includes(type)) {
655
- activeToolCallArgsText?.close();
656
- activeToolCallArgsText = void 0;
657
- }
658
- switch (type) {
659
- case "g" /* ReasoningDelta */:
660
- controller.appendReasoning(value);
661
- break;
662
- case "0" /* TextDelta */:
663
- controller.appendText(value);
664
- break;
665
- case "b" /* StartToolCall */: {
666
- const { toolCallId, toolName } = value;
667
- const toolCallController = controller.addToolCallPart({
668
- toolCallId,
669
- toolName
670
- });
671
- toolCallControllers.set(toolCallId, toolCallController);
672
- activeToolCallArgsText = toolCallController.argsText;
673
- break;
674
- }
675
- case "c" /* ToolCallArgsTextDelta */: {
676
- const { toolCallId, argsTextDelta } = value;
677
- const toolCallController = toolCallControllers.get(toolCallId);
678
- if (!toolCallController)
679
- throw new Error(
680
- "Encountered tool call with unknown id: " + toolCallId
681
- );
682
- toolCallController.argsText.append(argsTextDelta);
683
- break;
684
- }
685
- case "a" /* ToolCallResult */: {
686
- const { toolCallId, artifact, result, isError } = value;
687
- const toolCallController = toolCallControllers.get(toolCallId);
688
- if (!toolCallController)
689
- throw new Error(
690
- "Encountered tool call result with unknown id: " + toolCallId
691
- );
692
- toolCallController.setResponse({
693
- artifact,
694
- result,
695
- isError
696
- });
697
- break;
698
- }
699
- case "9" /* ToolCall */: {
700
- const { toolCallId, toolName, args } = value;
701
- let toolCallController = toolCallControllers.get(toolCallId);
702
- if (toolCallController) {
703
- toolCallController.argsText.close();
704
- } else {
705
- toolCallController = controller.addToolCallPart({
706
- toolCallId,
707
- toolName,
708
- args
709
- });
710
- toolCallControllers.set(toolCallId, toolCallController);
711
- }
712
- break;
713
- }
714
- case "d" /* FinishMessage */:
715
- controller.enqueue({
716
- type: "message-finish",
717
- path: [],
718
- ...value
719
- });
720
- break;
721
- case "f" /* StartStep */:
722
- controller.enqueue({
723
- type: "step-start",
724
- path: [],
725
- ...value
726
- });
727
- break;
728
- case "e" /* FinishStep */:
729
- controller.enqueue({
730
- type: "step-finish",
731
- path: [],
732
- ...value
733
- });
734
- break;
735
- case "2" /* Data */:
736
- controller.enqueue({
737
- type: "data",
738
- path: [],
739
- data: value
740
- });
741
- break;
742
- case "8" /* Annotation */:
743
- controller.enqueue({
744
- type: "annotations",
745
- path: [],
746
- annotations: value
747
- });
748
- break;
749
- case "h" /* Source */:
750
- controller.appendSource({
751
- type: "source",
752
- ...value
753
- });
754
- break;
755
- case "3" /* Error */:
756
- controller.enqueue({
757
- type: "error",
758
- path: [],
759
- error: value
760
- });
761
- break;
762
- case "k" /* File */:
763
- controller.appendFile({
764
- type: "file",
765
- ...value
766
- });
767
- break;
768
- case "j" /* ReasoningSignature */:
769
- case "i" /* RedactedReasoning */:
770
- break;
771
- default: {
772
- const exhaustiveCheck = type;
773
- throw new Error(`unsupported chunk type: ${exhaustiveCheck}`);
774
- }
775
- }
776
- },
777
- flush() {
778
- activeToolCallArgsText?.close();
779
- activeToolCallArgsText = void 0;
780
- toolCallControllers.forEach((controller) => controller.close());
781
- toolCallControllers.clear();
782
- }
783
- });
784
- return readable.pipeThrough(new TextDecoderStream()).pipeThrough(new LineDecoderStream()).pipeThrough(new DataStreamChunkDecoder()).pipeThrough(transform);
785
- });
786
- }
787
- };
788
-
789
- // src/core/utils/generateId.tsx
790
- var import_non_secure = require("nanoid/non-secure");
791
- var generateId = (0, import_non_secure.customAlphabet)(
792
- "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
793
- 7
794
- );
795
-
796
- // src/core/modules/assistant-stream.ts
797
- var AssistantStreamControllerImpl = class {
798
- _merger = createMergeStream();
799
- _append;
800
- _contentCounter = new Counter();
801
- get __internal_isClosed() {
802
- return this._merger.isSealed();
803
- }
804
- __internal_getReadable() {
805
- return this._merger.readable;
806
- }
807
- _closeSubscriber;
808
- __internal_subscribeToClose(callback) {
809
- this._closeSubscriber = callback;
810
- }
811
- _addPart(part, stream) {
812
- if (this._append) {
813
- this._append.controller.close();
814
- this._append = void 0;
815
- }
816
- this.enqueue({
817
- type: "part-start",
818
- part,
819
- path: []
820
- });
821
- this._merger.addStream(
822
- stream.pipeThrough(new PathAppendEncoder(this._contentCounter.value))
823
- );
824
- }
825
- merge(stream) {
826
- this._merger.addStream(
827
- stream.pipeThrough(new PathMergeEncoder(this._contentCounter))
828
- );
829
- }
830
- appendText(textDelta) {
831
- if (this._append?.kind !== "text") {
832
- this._append = {
833
- kind: "text",
834
- controller: this.addTextPart()
835
- };
836
- }
837
- this._append.controller.append(textDelta);
838
- }
839
- appendReasoning(textDelta) {
840
- if (this._append?.kind !== "reasoning") {
841
- this._append = {
842
- kind: "reasoning",
843
- controller: this.addReasoningPart()
844
- };
845
- }
846
- this._append.controller.append(textDelta);
847
- }
848
- addTextPart() {
849
- const [stream, controller] = createTextStreamController();
850
- this._addPart({ type: "text" }, stream);
851
- return controller;
852
- }
853
- addReasoningPart() {
854
- const [stream, controller] = createTextStreamController();
855
- this._addPart({ type: "reasoning" }, stream);
856
- return controller;
857
- }
858
- addToolCallPart(options) {
859
- const opt = typeof options === "string" ? { toolName: options } : options;
860
- const toolName = opt.toolName;
861
- const toolCallId = opt.toolCallId ?? generateId();
862
- const [stream, controller] = createToolCallStreamController();
863
- this._addPart({ type: "tool-call", toolName, toolCallId }, stream);
864
- if (opt.argsText !== void 0) {
865
- controller.argsText.append(opt.argsText);
866
- controller.argsText.close();
867
- }
868
- if (opt.args !== void 0) {
869
- controller.argsText.append(JSON.stringify(opt.args));
870
- controller.argsText.close();
871
- }
872
- if (opt.response !== void 0) {
873
- controller.setResponse(opt.response);
874
- }
875
- return controller;
876
- }
877
- appendSource(options) {
878
- this._addPart(
879
- options,
880
- new ReadableStream({
881
- start(controller) {
882
- controller.enqueue({
883
- type: "part-finish",
884
- path: []
885
- });
886
- controller.close();
887
- }
888
- })
889
- );
890
- }
891
- appendFile(options) {
892
- this._addPart(
893
- options,
894
- new ReadableStream({
895
- start(controller) {
896
- controller.enqueue({
897
- type: "part-finish",
898
- path: []
899
- });
900
- controller.close();
901
- }
902
- })
903
- );
904
- }
905
- enqueue(chunk) {
906
- this._merger.enqueue(chunk);
907
- if (chunk.type === "part-start" && chunk.path.length === 0) {
908
- this._contentCounter.up();
909
- }
910
- }
911
- close() {
912
- this._merger.seal();
913
- this._append?.controller?.close();
914
- this._closeSubscriber?.();
915
- }
916
- };
917
- function createAssistantStream(callback) {
918
- const controller = new AssistantStreamControllerImpl();
919
- let promiseOrVoid;
920
- try {
921
- promiseOrVoid = callback(controller);
922
- } catch (e) {
923
- if (!controller.__internal_isClosed) {
924
- controller.enqueue({
925
- type: "error",
926
- path: [],
927
- error: String(e)
928
- });
929
- controller.close();
930
- }
931
- throw e;
932
- }
933
- if (promiseOrVoid instanceof Promise) {
934
- const runTask = async () => {
935
- try {
936
- await promiseOrVoid;
937
- } catch (e) {
938
- if (!controller.__internal_isClosed) {
939
- controller.enqueue({
940
- type: "error",
941
- path: [],
942
- error: String(e)
943
- });
944
- }
945
- throw e;
946
- } finally {
947
- if (!controller.__internal_isClosed) {
948
- controller.close();
949
- }
950
- }
951
- };
952
- runTask();
953
- } else {
954
- if (!controller.__internal_isClosed) {
955
- controller.close();
956
- }
957
- }
958
- return controller.__internal_getReadable();
959
- }
960
- function createAssistantStreamController() {
961
- const { resolve, promise } = promiseWithResolvers();
962
- let controller;
963
- const stream = createAssistantStream((c) => {
964
- controller = c;
965
- controller.__internal_subscribeToClose(
966
- resolve
967
- );
968
- return promise;
969
- });
970
- return [stream, controller];
971
- }
972
- function createAssistantStreamResponse(callback) {
973
- return AssistantStream.toResponse(
974
- createAssistantStream(callback),
975
- new DataStreamEncoder()
976
- );
977
- }
978
-
979
- // src/utils/json/parse-partial-json-object.ts
980
- var import_secure_json_parse = __toESM(require("secure-json-parse"));
981
-
982
- // src/utils/json/fix-json.ts
983
- function fixJson(input) {
984
- const stack = ["ROOT"];
985
- let lastValidIndex = -1;
986
- let literalStart = null;
987
- const path = [];
988
- let currentKey;
989
- function pushCurrentKeyToPath() {
990
- if (currentKey !== void 0) {
991
- path.push(JSON.parse('"' + currentKey + '"'));
992
- currentKey = void 0;
993
- }
994
- }
995
- function processValueStart(char, i, swapState) {
996
- {
997
- switch (char) {
998
- case '"': {
999
- lastValidIndex = i;
1000
- stack.pop();
1001
- stack.push(swapState);
1002
- stack.push("INSIDE_STRING");
1003
- pushCurrentKeyToPath();
1004
- break;
1005
- }
1006
- case "f":
1007
- case "t":
1008
- case "n": {
1009
- lastValidIndex = i;
1010
- literalStart = i;
1011
- stack.pop();
1012
- stack.push(swapState);
1013
- stack.push("INSIDE_LITERAL");
1014
- break;
1015
- }
1016
- case "-": {
1017
- stack.pop();
1018
- stack.push(swapState);
1019
- stack.push("INSIDE_NUMBER");
1020
- pushCurrentKeyToPath();
1021
- break;
1022
- }
1023
- case "0":
1024
- case "1":
1025
- case "2":
1026
- case "3":
1027
- case "4":
1028
- case "5":
1029
- case "6":
1030
- case "7":
1031
- case "8":
1032
- case "9": {
1033
- lastValidIndex = i;
1034
- stack.pop();
1035
- stack.push(swapState);
1036
- stack.push("INSIDE_NUMBER");
1037
- pushCurrentKeyToPath();
1038
- break;
1039
- }
1040
- case "{": {
1041
- lastValidIndex = i;
1042
- stack.pop();
1043
- stack.push(swapState);
1044
- stack.push("INSIDE_OBJECT_START");
1045
- pushCurrentKeyToPath();
1046
- break;
1047
- }
1048
- case "[": {
1049
- lastValidIndex = i;
1050
- stack.pop();
1051
- stack.push(swapState);
1052
- stack.push("INSIDE_ARRAY_START");
1053
- pushCurrentKeyToPath();
1054
- break;
1055
- }
1056
- }
1057
- }
1058
- }
1059
- function processAfterObjectValue(char, i) {
1060
- switch (char) {
1061
- case ",": {
1062
- stack.pop();
1063
- stack.push("INSIDE_OBJECT_AFTER_COMMA");
1064
- break;
1065
- }
1066
- case "}": {
1067
- lastValidIndex = i;
1068
- stack.pop();
1069
- currentKey = path.pop();
1070
- break;
1071
- }
1072
- }
1073
- }
1074
- function processAfterArrayValue(char, i) {
1075
- switch (char) {
1076
- case ",": {
1077
- stack.pop();
1078
- stack.push("INSIDE_ARRAY_AFTER_COMMA");
1079
- currentKey = (Number(currentKey) + 1).toString();
1080
- break;
1081
- }
1082
- case "]": {
1083
- lastValidIndex = i;
1084
- stack.pop();
1085
- currentKey = path.pop();
1086
- break;
1087
- }
1088
- }
1089
- }
1090
- for (let i = 0; i < input.length; i++) {
1091
- const char = input[i];
1092
- const currentState = stack[stack.length - 1];
1093
- switch (currentState) {
1094
- case "ROOT":
1095
- processValueStart(char, i, "FINISH");
1096
- break;
1097
- case "INSIDE_OBJECT_START": {
1098
- switch (char) {
1099
- case '"': {
1100
- stack.pop();
1101
- stack.push("INSIDE_OBJECT_KEY");
1102
- currentKey = "";
1103
- break;
1104
- }
1105
- case "}": {
1106
- lastValidIndex = i;
1107
- stack.pop();
1108
- currentKey = path.pop();
1109
- break;
1110
- }
1111
- }
1112
- break;
1113
- }
1114
- case "INSIDE_OBJECT_AFTER_COMMA": {
1115
- switch (char) {
1116
- case '"': {
1117
- stack.pop();
1118
- stack.push("INSIDE_OBJECT_KEY");
1119
- currentKey = "";
1120
- break;
1121
- }
1122
- }
1123
- break;
1124
- }
1125
- case "INSIDE_OBJECT_KEY": {
1126
- switch (char) {
1127
- case '"': {
1128
- stack.pop();
1129
- stack.push("INSIDE_OBJECT_AFTER_KEY");
1130
- break;
1131
- }
1132
- case "\\": {
1133
- stack.push("INSIDE_STRING_ESCAPE");
1134
- currentKey += char;
1135
- break;
1136
- }
1137
- default: {
1138
- currentKey += char;
1139
- break;
1140
- }
1141
- }
1142
- break;
1143
- }
1144
- case "INSIDE_OBJECT_AFTER_KEY": {
1145
- switch (char) {
1146
- case ":": {
1147
- stack.pop();
1148
- stack.push("INSIDE_OBJECT_BEFORE_VALUE");
1149
- break;
1150
- }
1151
- }
1152
- break;
1153
- }
1154
- case "INSIDE_OBJECT_BEFORE_VALUE": {
1155
- processValueStart(char, i, "INSIDE_OBJECT_AFTER_VALUE");
1156
- break;
1157
- }
1158
- case "INSIDE_OBJECT_AFTER_VALUE": {
1159
- processAfterObjectValue(char, i);
1160
- break;
1161
- }
1162
- case "INSIDE_STRING": {
1163
- switch (char) {
1164
- case '"': {
1165
- stack.pop();
1166
- lastValidIndex = i;
1167
- currentKey = path.pop();
1168
- break;
1169
- }
1170
- case "\\": {
1171
- stack.push("INSIDE_STRING_ESCAPE");
1172
- break;
1173
- }
1174
- default: {
1175
- lastValidIndex = i;
1176
- }
1177
- }
1178
- break;
1179
- }
1180
- case "INSIDE_ARRAY_START": {
1181
- switch (char) {
1182
- case "]": {
1183
- lastValidIndex = i;
1184
- stack.pop();
1185
- currentKey = path.pop();
1186
- break;
1187
- }
1188
- default: {
1189
- lastValidIndex = i;
1190
- currentKey = "0";
1191
- processValueStart(char, i, "INSIDE_ARRAY_AFTER_VALUE");
1192
- break;
1193
- }
1194
- }
1195
- break;
1196
- }
1197
- case "INSIDE_ARRAY_AFTER_VALUE": {
1198
- switch (char) {
1199
- case ",": {
1200
- stack.pop();
1201
- stack.push("INSIDE_ARRAY_AFTER_COMMA");
1202
- currentKey = (Number(currentKey) + 1).toString();
1203
- break;
1204
- }
1205
- case "]": {
1206
- lastValidIndex = i;
1207
- stack.pop();
1208
- currentKey = path.pop();
1209
- break;
1210
- }
1211
- default: {
1212
- lastValidIndex = i;
1213
- break;
1214
- }
1215
- }
1216
- break;
1217
- }
1218
- case "INSIDE_ARRAY_AFTER_COMMA": {
1219
- processValueStart(char, i, "INSIDE_ARRAY_AFTER_VALUE");
1220
- break;
1221
- }
1222
- case "INSIDE_STRING_ESCAPE": {
1223
- stack.pop();
1224
- if (stack[stack.length - 1] === "INSIDE_STRING") {
1225
- lastValidIndex = i;
1226
- } else if (stack[stack.length - 1] === "INSIDE_OBJECT_KEY") {
1227
- currentKey += char;
1228
- }
1229
- break;
1230
- }
1231
- case "INSIDE_NUMBER": {
1232
- switch (char) {
1233
- case "0":
1234
- case "1":
1235
- case "2":
1236
- case "3":
1237
- case "4":
1238
- case "5":
1239
- case "6":
1240
- case "7":
1241
- case "8":
1242
- case "9": {
1243
- lastValidIndex = i;
1244
- break;
1245
- }
1246
- case "e":
1247
- case "E":
1248
- case "-":
1249
- case ".": {
1250
- break;
1251
- }
1252
- case ",": {
1253
- stack.pop();
1254
- currentKey = path.pop();
1255
- if (stack[stack.length - 1] === "INSIDE_ARRAY_AFTER_VALUE") {
1256
- processAfterArrayValue(char, i);
1257
- }
1258
- if (stack[stack.length - 1] === "INSIDE_OBJECT_AFTER_VALUE") {
1259
- processAfterObjectValue(char, i);
1260
- }
1261
- break;
1262
- }
1263
- case "}": {
1264
- stack.pop();
1265
- currentKey = path.pop();
1266
- if (stack[stack.length - 1] === "INSIDE_OBJECT_AFTER_VALUE") {
1267
- processAfterObjectValue(char, i);
1268
- }
1269
- break;
1270
- }
1271
- case "]": {
1272
- stack.pop();
1273
- currentKey = path.pop();
1274
- if (stack[stack.length - 1] === "INSIDE_ARRAY_AFTER_VALUE") {
1275
- processAfterArrayValue(char, i);
1276
- }
1277
- break;
1278
- }
1279
- default: {
1280
- stack.pop();
1281
- currentKey = path.pop();
1282
- break;
1283
- }
1284
- }
1285
- break;
1286
- }
1287
- case "INSIDE_LITERAL": {
1288
- const partialLiteral = input.substring(literalStart, i + 1);
1289
- if (!"false".startsWith(partialLiteral) && !"true".startsWith(partialLiteral) && !"null".startsWith(partialLiteral)) {
1290
- stack.pop();
1291
- if (stack[stack.length - 1] === "INSIDE_OBJECT_AFTER_VALUE") {
1292
- processAfterObjectValue(char, i);
1293
- } else if (stack[stack.length - 1] === "INSIDE_ARRAY_AFTER_VALUE") {
1294
- processAfterArrayValue(char, i);
1295
- }
1296
- } else {
1297
- lastValidIndex = i;
1298
- }
1299
- break;
1300
- }
1301
- }
1302
- }
1303
- let result = input.slice(0, lastValidIndex + 1);
1304
- for (let i = stack.length - 1; i >= 0; i--) {
1305
- const state = stack[i];
1306
- switch (state) {
1307
- case "INSIDE_STRING": {
1308
- result += '"';
1309
- break;
1310
- }
1311
- case "INSIDE_OBJECT_KEY":
1312
- case "INSIDE_OBJECT_AFTER_KEY":
1313
- case "INSIDE_OBJECT_AFTER_COMMA":
1314
- case "INSIDE_OBJECT_START":
1315
- case "INSIDE_OBJECT_BEFORE_VALUE":
1316
- case "INSIDE_OBJECT_AFTER_VALUE": {
1317
- result += "}";
1318
- break;
1319
- }
1320
- case "INSIDE_ARRAY_START":
1321
- case "INSIDE_ARRAY_AFTER_COMMA":
1322
- case "INSIDE_ARRAY_AFTER_VALUE": {
1323
- result += "]";
1324
- break;
1325
- }
1326
- case "INSIDE_LITERAL": {
1327
- const partialLiteral = input.substring(literalStart, input.length);
1328
- if ("true".startsWith(partialLiteral)) {
1329
- result += "true".slice(partialLiteral.length);
1330
- } else if ("false".startsWith(partialLiteral)) {
1331
- result += "false".slice(partialLiteral.length);
1332
- } else if ("null".startsWith(partialLiteral)) {
1333
- result += "null".slice(partialLiteral.length);
1334
- }
1335
- }
1336
- }
1337
- }
1338
- return [result, path];
1339
- }
1340
-
1341
- // src/utils/json/parse-partial-json-object.ts
1342
- var PARTIAL_JSON_OBJECT_META_SYMBOL = Symbol(
1343
- "aui.parse-partial-json-object.meta"
1344
- );
1345
- var getPartialJsonObjectMeta = (obj) => {
1346
- return obj?.[PARTIAL_JSON_OBJECT_META_SYMBOL];
1347
- };
1348
- var parsePartialJsonObject = (json) => {
1349
- if (json.length === 0)
1350
- return {
1351
- [PARTIAL_JSON_OBJECT_META_SYMBOL]: { state: "partial", partialPath: [] }
1352
- };
1353
- try {
1354
- const res = import_secure_json_parse.default.parse(json);
1355
- if (typeof res !== "object" || res === null)
1356
- throw new Error("argsText is expected to be an object");
1357
- res[PARTIAL_JSON_OBJECT_META_SYMBOL] = {
1358
- state: "complete",
1359
- partialPath: []
1360
- };
1361
- return res;
1362
- } catch {
1363
- try {
1364
- const [fixedJson, partialPath] = fixJson(json);
1365
- const res = import_secure_json_parse.default.parse(fixedJson);
1366
- if (typeof res !== "object" || res === null)
1367
- throw new Error("argsText is expected to be an object");
1368
- res[PARTIAL_JSON_OBJECT_META_SYMBOL] = {
1369
- state: "partial",
1370
- partialPath
1371
- };
1372
- return res;
1373
- } catch {
1374
- return void 0;
1375
- }
1376
- }
1377
- };
1378
- var getFieldState = (parent, parentMeta, fieldPath) => {
1379
- if (typeof parent !== "object" || parent === null) return parentMeta.state;
1380
- if (parentMeta.state === "complete") return "complete";
1381
- if (fieldPath.length === 0) return parentMeta.state;
1382
- const [field, ...restPath] = fieldPath;
1383
- if (!Object.prototype.hasOwnProperty.call(parent, field)) return "partial";
1384
- const [partialField, ...restPartialPath] = parentMeta.partialPath;
1385
- if (field !== partialField) return "complete";
1386
- const child = parent[field];
1387
- const childMeta = {
1388
- state: "partial",
1389
- partialPath: restPartialPath
1390
- };
1391
- return getFieldState(child, childMeta, restPath);
1392
- };
1393
- var getPartialJsonObjectFieldState = (obj, fieldPath) => {
1394
- const meta = getPartialJsonObjectMeta(obj);
1395
- if (!meta) throw new Error("unable to determine object state");
1396
- return getFieldState(obj, meta, fieldPath.map(String));
1397
- };
1398
-
1399
- // src/core/accumulators/assistant-message-accumulator.ts
1400
- var createInitialMessage = () => ({
1401
- role: "assistant",
1402
- status: { type: "running" },
1403
- parts: [],
1404
- get content() {
1405
- return this.parts;
1406
- },
1407
- metadata: {
1408
- unstable_data: [],
1409
- unstable_annotations: [],
1410
- steps: [],
1411
- custom: {}
1412
- }
1413
- });
1414
- var updatePartForPath = (message, chunk, updater) => {
1415
- if (message.parts.length === 0) {
1416
- throw new Error("No parts available to update.");
1417
- }
1418
- if (chunk.path.length !== 1)
1419
- throw new Error("Nested paths are not supported yet.");
1420
- const partIndex = chunk.path[0];
1421
- const updatedPart = updater(message.parts[partIndex]);
1422
- return {
1423
- ...message,
1424
- parts: [
1425
- ...message.parts.slice(0, partIndex),
1426
- updatedPart,
1427
- ...message.parts.slice(partIndex + 1)
1428
- ],
1429
- get content() {
1430
- return this.parts;
1431
- }
1432
- };
1433
- };
1434
- var handlePartStart = (message, chunk) => {
1435
- const partInit = chunk.part;
1436
- if (partInit.type === "text" || partInit.type === "reasoning") {
1437
- const newTextPart = {
1438
- type: partInit.type,
1439
- text: "",
1440
- status: { type: "running" }
1441
- };
1442
- return {
1443
- ...message,
1444
- parts: [...message.parts, newTextPart],
1445
- get content() {
1446
- return this.parts;
1447
- }
1448
- };
1449
- } else if (partInit.type === "tool-call") {
1450
- const newToolCallPart = {
1451
- type: "tool-call",
1452
- state: "partial-call",
1453
- status: { type: "running", isArgsComplete: false },
1454
- toolCallId: partInit.toolCallId,
1455
- toolName: partInit.toolName,
1456
- argsText: "",
1457
- args: {}
1458
- };
1459
- return {
1460
- ...message,
1461
- parts: [...message.parts, newToolCallPart],
1462
- get content() {
1463
- return this.parts;
1464
- }
1465
- };
1466
- } else if (partInit.type === "source") {
1467
- const newSourcePart = {
1468
- type: "source",
1469
- sourceType: partInit.sourceType,
1470
- id: partInit.id,
1471
- url: partInit.url,
1472
- ...partInit.title ? { title: partInit.title } : void 0
1473
- };
1474
- return {
1475
- ...message,
1476
- parts: [...message.parts, newSourcePart],
1477
- get content() {
1478
- return this.parts;
1479
- }
1480
- };
1481
- } else if (partInit.type === "file") {
1482
- const newFilePart = {
1483
- type: "file",
1484
- mimeType: partInit.mimeType,
1485
- data: partInit.data
1486
- };
1487
- return {
1488
- ...message,
1489
- parts: [...message.parts, newFilePart],
1490
- get content() {
1491
- return this.parts;
1492
- }
1493
- };
1494
- } else {
1495
- throw new Error(`Unsupported part type: ${partInit.type}`);
1496
- }
1497
- };
1498
- var handleToolCallArgsTextFinish = (message, chunk) => {
1499
- return updatePartForPath(message, chunk, (part) => {
1500
- if (part.type !== "tool-call") {
1501
- throw new Error("Last is not a tool call");
1502
- }
1503
- return {
1504
- ...part,
1505
- state: "call"
1506
- };
1507
- });
1508
- };
1509
- var handlePartFinish = (message, chunk) => {
1510
- return updatePartForPath(message, chunk, (part) => ({
1511
- ...part,
1512
- status: { type: "complete", reason: "unknown" }
1513
- }));
1514
- };
1515
- var handleTextDelta = (message, chunk) => {
1516
- return updatePartForPath(message, chunk, (part) => {
1517
- if (part.type === "text" || part.type === "reasoning") {
1518
- return { ...part, text: part.text + chunk.textDelta };
1519
- } else if (part.type === "tool-call") {
1520
- const newArgsText = part.argsText + chunk.textDelta;
1521
- const newArgs = parsePartialJsonObject(newArgsText) ?? part.args;
1522
- return { ...part, argsText: newArgsText, args: newArgs };
1523
- } else {
1524
- throw new Error(
1525
- "text-delta received but part is neither text nor tool-call"
1526
- );
1527
- }
1528
- });
1529
- };
1530
- var handleResult = (message, chunk) => {
1531
- return updatePartForPath(message, chunk, (part) => {
1532
- if (part.type === "tool-call") {
1533
- return {
1534
- ...part,
1535
- state: "result",
1536
- artifact: chunk.artifact,
1537
- result: chunk.result,
1538
- isError: chunk.isError ?? false,
1539
- status: { type: "complete", reason: "stop" }
1540
- };
1541
- } else {
1542
- throw new Error("Result chunk received but part is not a tool-call");
1543
- }
1544
- });
1545
- };
1546
- var handleMessageFinish = (message, chunk) => {
1547
- const newStatus = getStatus(chunk);
1548
- return { ...message, status: newStatus };
1549
- };
1550
- var getStatus = (chunk) => {
1551
- if (chunk.finishReason === "tool-calls") {
1552
- return {
1553
- type: "requires-action",
1554
- reason: "tool-calls"
1555
- };
1556
- } else if (chunk.finishReason === "stop" || chunk.finishReason === "unknown") {
1557
- return {
1558
- type: "complete",
1559
- reason: chunk.finishReason
1560
- };
1561
- } else {
1562
- return {
1563
- type: "incomplete",
1564
- reason: chunk.finishReason
1565
- };
1566
- }
1567
- };
1568
- var handleAnnotations = (message, chunk) => {
1569
- return {
1570
- ...message,
1571
- metadata: {
1572
- ...message.metadata,
1573
- unstable_annotations: [
1574
- ...message.metadata.unstable_annotations,
1575
- ...chunk.annotations
1576
- ]
1577
- }
1578
- };
1579
- };
1580
- var handleData = (message, chunk) => {
1581
- return {
1582
- ...message,
1583
- metadata: {
1584
- ...message.metadata,
1585
- unstable_data: [...message.metadata.unstable_data, ...chunk.data]
1586
- }
1587
- };
1588
- };
1589
- var handleStepStart = (message, chunk) => {
1590
- return {
1591
- ...message,
1592
- metadata: {
1593
- ...message.metadata,
1594
- steps: [
1595
- ...message.metadata.steps,
1596
- { state: "started", messageId: chunk.messageId }
1597
- ]
1598
- }
1599
- };
1600
- };
1601
- var handleStepFinish = (message, chunk) => {
1602
- const steps = message.metadata.steps.slice();
1603
- const lastIndex = steps.length - 1;
1604
- if (steps.length > 0 && steps[lastIndex]?.state === "started") {
1605
- steps[lastIndex] = {
1606
- ...steps[lastIndex],
1607
- state: "finished",
1608
- finishReason: chunk.finishReason,
1609
- usage: chunk.usage,
1610
- isContinued: chunk.isContinued
1611
- };
1612
- } else {
1613
- steps.push({
1614
- state: "finished",
1615
- messageId: generateId(),
1616
- finishReason: chunk.finishReason,
1617
- usage: chunk.usage,
1618
- isContinued: chunk.isContinued
1619
- });
1620
- }
1621
- return {
1622
- ...message,
1623
- metadata: {
1624
- ...message.metadata,
1625
- steps
1626
- }
1627
- };
1628
- };
1629
- var handleErrorChunk = (message, chunk) => {
1630
- return {
1631
- ...message,
1632
- status: { type: "incomplete", reason: "error", error: chunk.error }
1633
- };
1634
- };
1635
- var AssistantMessageAccumulator = class extends TransformStream {
1636
- constructor({
1637
- initialMessage
1638
- } = {}) {
1639
- let message = initialMessage ?? createInitialMessage();
1640
- super({
1641
- transform(chunk, controller) {
1642
- const type = chunk.type;
1643
- switch (type) {
1644
- case "part-start":
1645
- message = handlePartStart(message, chunk);
1646
- break;
1647
- case "tool-call-args-text-finish":
1648
- message = handleToolCallArgsTextFinish(message, chunk);
1649
- break;
1650
- case "part-finish":
1651
- message = handlePartFinish(message, chunk);
1652
- break;
1653
- case "text-delta":
1654
- message = handleTextDelta(message, chunk);
1655
- break;
1656
- case "result":
1657
- message = handleResult(message, chunk);
1658
- break;
1659
- case "message-finish":
1660
- message = handleMessageFinish(message, chunk);
1661
- break;
1662
- case "annotations":
1663
- message = handleAnnotations(message, chunk);
1664
- break;
1665
- case "data":
1666
- message = handleData(message, chunk);
1667
- break;
1668
- case "step-start":
1669
- message = handleStepStart(message, chunk);
1670
- break;
1671
- case "step-finish":
1672
- message = handleStepFinish(message, chunk);
1673
- break;
1674
- case "error":
1675
- message = handleErrorChunk(message, chunk);
1676
- break;
1677
- default: {
1678
- const unhandledType = type;
1679
- throw new Error(`Unsupported chunk type: ${unhandledType}`);
1680
- }
1681
- }
1682
- controller.enqueue(message);
1683
- },
1684
- flush(controller) {
1685
- if (message.status?.type === "running") {
1686
- const requiresAction = message.parts?.at(-1)?.type === "tool-call";
1687
- message = handleMessageFinish(message, {
1688
- type: "message-finish",
1689
- path: [],
1690
- finishReason: requiresAction ? "tool-calls" : "unknown",
1691
- usage: {
1692
- promptTokens: 0,
1693
- completionTokens: 0
1694
- }
1695
- });
1696
- controller.enqueue(message);
1697
- }
1698
- }
1699
- });
1700
- }
1701
- };
1702
-
1703
- // src/core/serialization/PlainText.ts
1704
- var PlainTextEncoder = class extends PipeableTransformStream {
1705
- headers = new Headers({
1706
- "Content-Type": "text/plain; charset=utf-8",
1707
- "x-vercel-ai-data-stream": "v1"
1708
- });
1709
- constructor() {
1710
- super((readable) => {
1711
- const transform = new TransformStream({
1712
- transform(chunk, controller) {
1713
- const type = chunk.type;
1714
- switch (type) {
1715
- case "text-delta":
1716
- controller.enqueue(chunk.textDelta);
1717
- break;
1718
- default:
1719
- const unsupportedType = type;
1720
- throw new Error(`unsupported chunk type: ${unsupportedType}`);
1721
- }
1722
- }
1723
- });
1724
- return readable.pipeThrough(transform).pipeThrough(new TextEncoderStream());
1725
- });
1726
- }
1727
- };
1728
- var PlainTextDecoder = class extends PipeableTransformStream {
1729
- constructor() {
1730
- super((readable) => {
1731
- const transform = new AssistantTransformStream({
1732
- transform(chunk, controller) {
1733
- controller.appendText(chunk);
1734
- }
1735
- });
1736
- return readable.pipeThrough(new TextDecoderStream()).pipeThrough(transform);
1737
- });
1738
- }
1739
- };
1740
-
1741
- // src/core/accumulators/AssistantMessageStream.ts
1742
- var AssistantMessageStream = class _AssistantMessageStream {
1743
- constructor(readable) {
1744
- this.readable = readable;
1745
- this.readable = readable;
1746
- }
1747
- static fromAssistantStream(stream) {
1748
- return new _AssistantMessageStream(
1749
- stream.pipeThrough(new AssistantMessageAccumulator())
1750
- );
1751
- }
1752
- async unstable_result() {
1753
- let last;
1754
- for await (const chunk of this) {
1755
- last = chunk;
1756
- }
1757
- if (!last) {
1758
- return {
1759
- role: "assistant",
1760
- status: { type: "complete", reason: "unknown" },
1761
- parts: [],
1762
- content: [],
1763
- metadata: {
1764
- unstable_data: [],
1765
- unstable_annotations: [],
1766
- steps: [],
1767
- custom: {}
1768
- }
1769
- };
1770
- }
1771
- return last;
1772
- }
1773
- [Symbol.asyncIterator]() {
1774
- const reader = this.readable.getReader();
1775
- return {
1776
- async next() {
1777
- const { done, value } = await reader.read();
1778
- return done ? { done: true, value: void 0 } : { done: false, value };
1779
- }
1780
- };
1781
- }
1782
- tee() {
1783
- const [readable1, readable2] = this.readable.tee();
1784
- return [
1785
- new _AssistantMessageStream(readable1),
1786
- new _AssistantMessageStream(readable2)
1787
- ];
1788
- }
1789
- };
1790
-
1791
- // src/core/tool/ToolResponse.ts
1792
- var TOOL_RESPONSE_SYMBOL = Symbol.for("aui.tool-response");
1793
- var ToolResponse = class {
1794
- get [TOOL_RESPONSE_SYMBOL]() {
1795
- return true;
1796
- }
1797
- artifact;
1798
- result;
1799
- isError;
1800
- constructor(options) {
1801
- this.artifact = options.artifact;
1802
- this.result = options.result;
1803
- this.isError = options.isError ?? false;
1804
- }
1805
- static [Symbol.hasInstance](obj) {
1806
- return typeof obj === "object" && obj !== null && TOOL_RESPONSE_SYMBOL in obj;
1807
- }
1808
- };
1809
-
1810
- // src/core/tool/ToolExecutionStream.ts
1811
- var import_secure_json_parse2 = __toESM(require("secure-json-parse"));
1812
-
1813
- // src/core/utils/withPromiseOrValue.ts
1814
- function withPromiseOrValue(callback, thenHandler, catchHandler) {
1815
- try {
1816
- const promiseOrValue = callback();
1817
- if (typeof promiseOrValue === "object" && promiseOrValue !== null && "then" in promiseOrValue) {
1818
- return promiseOrValue.then(thenHandler, catchHandler);
1819
- } else {
1820
- thenHandler(promiseOrValue);
1821
- }
1822
- } catch (e) {
1823
- catchHandler(e);
1824
- }
1825
- }
1826
-
1827
- // src/core/tool/ToolCallReader.ts
1828
- function getField(obj, fieldPath) {
1829
- let current = obj;
1830
- for (const key of fieldPath) {
1831
- if (current === void 0 || current === null) {
1832
- return void 0;
1833
- }
1834
- current = current[key];
1835
- }
1836
- return current;
1837
- }
1838
- var GetHandle = class {
1839
- resolve;
1840
- reject;
1841
- disposed = false;
1842
- fieldPath;
1843
- constructor(resolve, reject, fieldPath) {
1844
- this.resolve = resolve;
1845
- this.reject = reject;
1846
- this.fieldPath = fieldPath;
1847
- }
1848
- update(args) {
1849
- if (this.disposed) return;
1850
- try {
1851
- if (getPartialJsonObjectFieldState(
1852
- args,
1853
- this.fieldPath
1854
- ) === "complete") {
1855
- const value = getField(args, this.fieldPath);
1856
- if (value !== void 0) {
1857
- this.resolve(value);
1858
- this.dispose();
1859
- }
1860
- }
1861
- } catch (e) {
1862
- this.reject(e);
1863
- this.dispose();
1864
- }
1865
- }
1866
- dispose() {
1867
- this.disposed = true;
1868
- }
1869
- };
1870
- var StreamValuesHandle = class {
1871
- controller;
1872
- disposed = false;
1873
- fieldPath;
1874
- constructor(controller, fieldPath) {
1875
- this.controller = controller;
1876
- this.fieldPath = fieldPath;
1877
- }
1878
- update(args) {
1879
- if (this.disposed) return;
1880
- try {
1881
- const value = getField(args, this.fieldPath);
1882
- if (value !== void 0) {
1883
- this.controller.enqueue(value);
1884
- }
1885
- if (getPartialJsonObjectFieldState(
1886
- args,
1887
- this.fieldPath
1888
- ) === "complete") {
1889
- this.controller.close();
1890
- this.dispose();
1891
- }
1892
- } catch (e) {
1893
- this.controller.error(e);
1894
- this.dispose();
1895
- }
1896
- }
1897
- dispose() {
1898
- this.disposed = true;
1899
- }
1900
- };
1901
- var StreamTextHandle = class {
1902
- controller;
1903
- disposed = false;
1904
- fieldPath;
1905
- lastValue = void 0;
1906
- constructor(controller, fieldPath) {
1907
- this.controller = controller;
1908
- this.fieldPath = fieldPath;
1909
- }
1910
- update(args) {
1911
- if (this.disposed) return;
1912
- try {
1913
- const value = getField(args, this.fieldPath);
1914
- if (value !== void 0 && typeof value === "string") {
1915
- const delta = value.substring(this.lastValue?.length || 0);
1916
- this.lastValue = value;
1917
- this.controller.enqueue(delta);
1918
- }
1919
- if (getPartialJsonObjectFieldState(
1920
- args,
1921
- this.fieldPath
1922
- ) === "complete") {
1923
- this.controller.close();
1924
- this.dispose();
1925
- }
1926
- } catch (e) {
1927
- this.controller.error(e);
1928
- this.dispose();
1929
- }
1930
- }
1931
- dispose() {
1932
- this.disposed = true;
1933
- }
1934
- };
1935
- var ForEachHandle = class {
1936
- controller;
1937
- disposed = false;
1938
- fieldPath;
1939
- processedIndexes = /* @__PURE__ */ new Set();
1940
- constructor(controller, fieldPath) {
1941
- this.controller = controller;
1942
- this.fieldPath = fieldPath;
1943
- }
1944
- update(args) {
1945
- if (this.disposed) return;
1946
- try {
1947
- const array = getField(args, this.fieldPath);
1948
- if (!Array.isArray(array)) {
1949
- return;
1950
- }
1951
- for (let i = 0; i < array.length; i++) {
1952
- if (!this.processedIndexes.has(i)) {
1953
- const elementPath = [...this.fieldPath, i];
1954
- if (getPartialJsonObjectFieldState(
1955
- args,
1956
- elementPath
1957
- ) === "complete") {
1958
- this.controller.enqueue(array[i]);
1959
- this.processedIndexes.add(i);
1960
- }
1961
- }
1962
- }
1963
- if (getPartialJsonObjectFieldState(
1964
- args,
1965
- this.fieldPath
1966
- ) === "complete") {
1967
- this.controller.close();
1968
- this.dispose();
1969
- }
1970
- } catch (e) {
1971
- this.controller.error(e);
1972
- this.dispose();
1973
- }
1974
- }
1975
- dispose() {
1976
- this.disposed = true;
1977
- }
1978
- };
1979
- var ToolCallArgsReaderImpl = class {
1980
- argTextDeltas;
1981
- handles = /* @__PURE__ */ new Set();
1982
- args = parsePartialJsonObject("");
1983
- constructor(argTextDeltas) {
1984
- this.argTextDeltas = argTextDeltas;
1985
- this.processStream();
1986
- }
1987
- async processStream() {
1988
- try {
1989
- let accumulatedText = "";
1990
- const reader = this.argTextDeltas.getReader();
1991
- while (true) {
1992
- const { value, done } = await reader.read();
1993
- if (done) break;
1994
- accumulatedText += value;
1995
- const parsedArgs = parsePartialJsonObject(accumulatedText);
1996
- if (parsedArgs !== void 0) {
1997
- this.args = parsedArgs;
1998
- for (const handle of this.handles) {
1999
- handle.update(parsedArgs);
2000
- }
2001
- }
2002
- }
2003
- } catch (error) {
2004
- console.error("Error processing argument stream:", error);
2005
- for (const handle of this.handles) {
2006
- handle.dispose();
2007
- }
2008
- }
2009
- }
2010
- get(...fieldPath) {
2011
- return new Promise((resolve, reject) => {
2012
- const handle = new GetHandle(resolve, reject, fieldPath);
2013
- if (this.args && getPartialJsonObjectFieldState(
2014
- this.args,
2015
- fieldPath
2016
- ) === "complete") {
2017
- const value = getField(this.args, fieldPath);
2018
- if (value !== void 0) {
2019
- resolve(value);
2020
- return;
2021
- }
2022
- }
2023
- this.handles.add(handle);
2024
- handle.update(this.args);
2025
- });
2026
- }
2027
- streamValues(...fieldPath) {
2028
- const simplePath = fieldPath;
2029
- const stream = new ReadableStream({
2030
- start: (controller) => {
2031
- const handle = new StreamValuesHandle(controller, simplePath);
2032
- this.handles.add(handle);
2033
- handle.update(this.args);
2034
- },
2035
- cancel: () => {
2036
- for (const handle of this.handles) {
2037
- if (handle instanceof StreamValuesHandle) {
2038
- handle.dispose();
2039
- this.handles.delete(handle);
2040
- break;
2041
- }
2042
- }
2043
- }
2044
- });
2045
- return stream;
2046
- }
2047
- streamText(...fieldPath) {
2048
- const simplePath = fieldPath;
2049
- const stream = new ReadableStream({
2050
- start: (controller) => {
2051
- const handle = new StreamTextHandle(controller, simplePath);
2052
- this.handles.add(handle);
2053
- handle.update(this.args);
2054
- },
2055
- cancel: () => {
2056
- for (const handle of this.handles) {
2057
- if (handle instanceof StreamTextHandle) {
2058
- handle.dispose();
2059
- this.handles.delete(handle);
2060
- break;
2061
- }
2062
- }
2063
- }
2064
- });
2065
- return stream;
2066
- }
2067
- forEach(...fieldPath) {
2068
- const simplePath = fieldPath;
2069
- const stream = new ReadableStream({
2070
- start: (controller) => {
2071
- const handle = new ForEachHandle(controller, simplePath);
2072
- this.handles.add(handle);
2073
- handle.update(this.args);
2074
- },
2075
- cancel: () => {
2076
- for (const handle of this.handles) {
2077
- if (handle instanceof ForEachHandle) {
2078
- handle.dispose();
2079
- this.handles.delete(handle);
2080
- break;
2081
- }
2082
- }
2083
- }
2084
- });
2085
- return stream;
2086
- }
2087
- };
2088
- var ToolCallResponseReaderImpl = class {
2089
- constructor(promise) {
2090
- this.promise = promise;
2091
- }
2092
- get() {
2093
- return this.promise;
2094
- }
2095
- };
2096
- var ToolCallReaderImpl = class {
2097
- args;
2098
- response;
2099
- writable;
2100
- resolve;
2101
- argsText = "";
2102
- constructor() {
2103
- const stream = new TransformStream();
2104
- this.writable = stream.writable;
2105
- this.args = new ToolCallArgsReaderImpl(stream.readable);
2106
- const { promise, resolve } = promiseWithResolvers();
2107
- this.resolve = resolve;
2108
- this.response = new ToolCallResponseReaderImpl(promise);
2109
- }
2110
- async appendArgsTextDelta(text) {
2111
- const writer = this.writable.getWriter();
2112
- try {
2113
- await writer.write(text);
2114
- } catch (err) {
2115
- console.warn(err);
2116
- } finally {
2117
- writer.releaseLock();
2118
- }
2119
- this.argsText += text;
2120
- }
2121
- setResponse(value) {
2122
- this.resolve(value);
2123
- }
2124
- result = {
2125
- get: async () => {
2126
- const response = await this.response.get();
2127
- return response.result;
2128
- }
2129
- };
2130
- };
2131
-
2132
- // src/core/tool/ToolExecutionStream.ts
2133
- var ToolExecutionStream = class extends PipeableTransformStream {
2134
- constructor(options) {
2135
- const toolCallPromises = /* @__PURE__ */ new Map();
2136
- const toolCallControllers = /* @__PURE__ */ new Map();
2137
- super((readable) => {
2138
- const transform = new TransformStream({
2139
- transform(chunk, controller) {
2140
- if (chunk.type !== "part-finish" || chunk.meta.type !== "tool-call") {
2141
- controller.enqueue(chunk);
2142
- }
2143
- const type = chunk.type;
2144
- switch (type) {
2145
- case "part-start":
2146
- if (chunk.part.type === "tool-call") {
2147
- const reader = new ToolCallReaderImpl();
2148
- toolCallControllers.set(chunk.part.toolCallId, reader);
2149
- options.streamCall({
2150
- reader,
2151
- toolCallId: chunk.part.toolCallId,
2152
- toolName: chunk.part.toolName
2153
- });
2154
- }
2155
- break;
2156
- case "text-delta": {
2157
- if (chunk.meta.type === "tool-call") {
2158
- const toolCallId = chunk.meta.toolCallId;
2159
- const controller2 = toolCallControllers.get(toolCallId);
2160
- if (!controller2)
2161
- throw new Error("No controller found for tool call");
2162
- controller2.appendArgsTextDelta(chunk.textDelta);
2163
- }
2164
- break;
2165
- }
2166
- case "tool-call-args-text-finish": {
2167
- if (chunk.meta.type !== "tool-call") break;
2168
- const { toolCallId, toolName } = chunk.meta;
2169
- const streamController = toolCallControllers.get(toolCallId);
2170
- if (!streamController)
2171
- throw new Error("No controller found for tool call");
2172
- const promise = withPromiseOrValue(
2173
- () => {
2174
- if (!streamController.argsText) {
2175
- console.log(
2176
- "Encountered tool call without args, this should never happen"
2177
- );
2178
- throw new Error(
2179
- "Encountered tool call without args, this is unexpected."
2180
- );
2181
- }
2182
- let args;
2183
- try {
2184
- args = import_secure_json_parse2.default.parse(streamController.argsText);
2185
- } catch (e) {
2186
- throw new Error(
2187
- `Function parameter parsing failed. ${JSON.stringify(e.message)}`
2188
- );
2189
- }
2190
- return options.execute({
2191
- toolCallId,
2192
- toolName,
2193
- args
2194
- });
2195
- },
2196
- (c) => {
2197
- if (c === void 0) return;
2198
- const result = new ToolResponse({
2199
- artifact: c.artifact,
2200
- result: c.result,
2201
- isError: c.isError
2202
- });
2203
- streamController.setResponse(result);
2204
- controller.enqueue({
2205
- type: "result",
2206
- path: chunk.path,
2207
- ...result
2208
- });
2209
- },
2210
- (e) => {
2211
- const result = new ToolResponse({
2212
- result: String(e),
2213
- isError: true
2214
- });
2215
- streamController.setResponse(result);
2216
- controller.enqueue({
2217
- type: "result",
2218
- path: chunk.path,
2219
- ...result
2220
- });
2221
- }
2222
- );
2223
- if (promise) {
2224
- toolCallPromises.set(toolCallId, promise);
2225
- }
2226
- break;
2227
- }
2228
- case "part-finish": {
2229
- if (chunk.meta.type !== "tool-call") break;
2230
- const { toolCallId } = chunk.meta;
2231
- const toolCallPromise = toolCallPromises.get(toolCallId);
2232
- if (toolCallPromise) {
2233
- toolCallPromise.then(() => {
2234
- toolCallPromises.delete(toolCallId);
2235
- toolCallControllers.delete(toolCallId);
2236
- controller.enqueue(chunk);
2237
- });
2238
- } else {
2239
- controller.enqueue(chunk);
2240
- }
2241
- }
2242
- }
2243
- },
2244
- async flush() {
2245
- await Promise.all(toolCallPromises.values());
2246
- }
2247
- });
2248
- return readable.pipeThrough(new AssistantMetaTransformStream()).pipeThrough(transform);
2249
- });
2250
- }
2251
- };
2252
-
2253
- // src/core/tool/toolResultStream.ts
2254
- var isStandardSchemaV1 = (schema) => {
2255
- return typeof schema === "object" && schema !== null && "~standard" in schema && schema["~standard"].version === 1;
2256
- };
2257
- function getToolResponse(tools, abortSignal, toolCall) {
2258
- const tool = tools?.[toolCall.toolName];
2259
- if (!tool || !tool.execute) return void 0;
2260
- const getResult = async (toolExecute) => {
2261
- let executeFn = toolExecute;
2262
- if (isStandardSchemaV1(tool.parameters)) {
2263
- let result2 = tool.parameters["~standard"].validate(toolCall.args);
2264
- if (result2 instanceof Promise) result2 = await result2;
2265
- if (result2.issues) {
2266
- executeFn = tool.experimental_onSchemaValidationError ?? (() => {
2267
- throw new Error(
2268
- `Function parameter validation failed. ${JSON.stringify(result2.issues)}`
2269
- );
2270
- });
2271
- }
2272
- }
2273
- const result = await executeFn(toolCall.args, {
2274
- toolCallId: toolCall.toolCallId,
2275
- abortSignal
2276
- });
2277
- if (result instanceof ToolResponse) return result;
2278
- return new ToolResponse({
2279
- result: result === void 0 ? "<no result>" : result
2280
- });
2281
- };
2282
- return getResult(tool.execute);
2283
- }
2284
- function getToolStreamResponse(tools, abortSignal, reader, context) {
2285
- tools?.[context.toolName]?.streamCall?.(reader, {
2286
- toolCallId: context.toolCallId,
2287
- abortSignal
2288
- });
2289
- }
2290
- async function unstable_runPendingTools(message, tools, abortSignal) {
2291
- for (const part of message.parts) {
2292
- if (part.type === "tool-call") {
2293
- const promiseOrUndefined = getToolResponse(tools, abortSignal, part);
2294
- if (promiseOrUndefined) {
2295
- const result = await promiseOrUndefined;
2296
- const updatedParts = message.parts.map((p) => {
2297
- if (p.type === "tool-call" && p.toolCallId === part.toolCallId) {
2298
- return {
2299
- ...p,
2300
- state: "result",
2301
- artifact: result.artifact,
2302
- result: result.result,
2303
- isError: result.isError
2304
- };
2305
- }
2306
- return p;
2307
- });
2308
- message = {
2309
- ...message,
2310
- parts: updatedParts,
2311
- content: updatedParts
2312
- };
2313
- }
2314
- }
2315
- }
2316
- return message;
2317
- }
2318
- function toolResultStream(tools, abortSignal) {
2319
- return new ToolExecutionStream({
2320
- execute: (toolCall) => getToolResponse(tools, abortSignal, toolCall),
2321
- streamCall: ({ reader, ...context }) => getToolStreamResponse(tools, abortSignal, reader, context)
2322
- });
2323
- }
20
+ __reExport(index_exports, require("./core/index.js"), module.exports);
2324
21
  // Annotate the CommonJS export names for ESM import in node:
2325
22
  0 && (module.exports = {
2326
- AssistantMessageAccumulator,
2327
- AssistantMessageStream,
2328
- AssistantStream,
2329
- DataStreamDecoder,
2330
- DataStreamEncoder,
2331
- PlainTextDecoder,
2332
- PlainTextEncoder,
2333
- ToolExecutionStream,
2334
- ToolResponse,
2335
- createAssistantStream,
2336
- createAssistantStreamResponse,
2337
- unstable_runPendingTools,
2338
- unstable_toolResultStream
23
+ ...require("./core/index.js")
2339
24
  });
2340
25
  //# sourceMappingURL=index.js.map