@convex-dev/agent 0.6.3 → 0.7.0-alpha.0

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 (246) hide show
  1. package/MIGRATION.md +60 -116
  2. package/dist/client/messages.d.ts +1 -398
  3. package/dist/client/messages.d.ts.map +1 -1
  4. package/dist/client/messages.js +3 -47
  5. package/dist/client/messages.js.map +1 -1
  6. package/dist/client/types.d.ts +1 -455
  7. package/dist/client/types.d.ts.map +1 -1
  8. package/dist/component/_generated/component.d.ts +805 -45
  9. package/dist/component/_generated/component.d.ts.map +1 -1
  10. package/dist/component/apiKeys.js +5 -5
  11. package/dist/component/apiKeys.js.map +1 -1
  12. package/dist/component/files.d.ts.map +1 -1
  13. package/dist/component/files.js +13 -11
  14. package/dist/component/files.js.map +1 -1
  15. package/dist/component/messages.d.ts +1252 -201
  16. package/dist/component/messages.d.ts.map +1 -1
  17. package/dist/component/messages.js +83 -47
  18. package/dist/component/messages.js.map +1 -1
  19. package/dist/component/schema.d.ts +2593 -332
  20. package/dist/component/schema.d.ts.map +1 -1
  21. package/dist/component/streams.d.ts +7 -1
  22. package/dist/component/streams.d.ts.map +1 -1
  23. package/dist/component/streams.js +46 -47
  24. package/dist/component/streams.js.map +1 -1
  25. package/dist/component/threads.d.ts.map +1 -1
  26. package/dist/component/threads.js +8 -9
  27. package/dist/component/threads.js.map +1 -1
  28. package/dist/component/users.js +2 -2
  29. package/dist/component/users.js.map +1 -1
  30. package/dist/component/vector/index.d.ts.map +1 -1
  31. package/dist/component/vector/index.js +14 -8
  32. package/dist/component/vector/index.js.map +1 -1
  33. package/dist/react/index.d.ts +5 -5
  34. package/dist/react/index.d.ts.map +1 -1
  35. package/dist/react/index.js +5 -5
  36. package/dist/react/index.js.map +1 -1
  37. package/dist/shared.d.ts +19 -7
  38. package/dist/shared.d.ts.map +1 -1
  39. package/dist/shared.js +4 -4
  40. package/dist/shared.js.map +1 -1
  41. package/dist/streaming/materializePersistedUIMessageChunks.d.ts +16 -0
  42. package/dist/streaming/materializePersistedUIMessageChunks.d.ts.map +1 -0
  43. package/dist/streaming/materializePersistedUIMessageChunks.js +302 -0
  44. package/dist/streaming/materializePersistedUIMessageChunks.js.map +1 -0
  45. package/dist/streaming/persistedUIMessageChunks.d.ts +106 -0
  46. package/dist/streaming/persistedUIMessageChunks.d.ts.map +1 -0
  47. package/dist/streaming/persistedUIMessageChunks.js +475 -0
  48. package/dist/streaming/persistedUIMessageChunks.js.map +1 -0
  49. package/dist/validators.d.ts +10026 -1055
  50. package/dist/validators.d.ts.map +1 -1
  51. package/dist/validators.js +71 -9
  52. package/dist/validators.js.map +1 -1
  53. package/dist/{UIMessages.d.ts → vercel/UIMessages.d.ts} +1 -1
  54. package/dist/vercel/UIMessages.d.ts.map +1 -0
  55. package/dist/{UIMessages.js → vercel/UIMessages.js} +63 -1
  56. package/dist/vercel/UIMessages.js.map +1 -0
  57. package/dist/{client → vercel/client}/createTool.d.ts +23 -16
  58. package/dist/vercel/client/createTool.d.ts.map +1 -0
  59. package/dist/{client → vercel/client}/createTool.js +2 -0
  60. package/dist/vercel/client/createTool.js.map +1 -0
  61. package/dist/{client → vercel/client}/definePlaygroundAPI.d.ts +593 -134
  62. package/dist/{client → vercel/client}/definePlaygroundAPI.d.ts.map +1 -1
  63. package/dist/{client → vercel/client}/definePlaygroundAPI.js +13 -9
  64. package/dist/vercel/client/definePlaygroundAPI.js.map +1 -0
  65. package/dist/{client → vercel/client}/files.d.ts +2 -2
  66. package/dist/vercel/client/files.d.ts.map +1 -0
  67. package/dist/vercel/client/files.js.map +1 -0
  68. package/dist/vercel/client/messages.d.ts +542 -0
  69. package/dist/vercel/client/messages.d.ts.map +1 -0
  70. package/dist/vercel/client/messages.js +66 -0
  71. package/dist/vercel/client/messages.js.map +1 -0
  72. package/dist/{client → vercel/client}/mockModel.d.ts +17 -17
  73. package/dist/vercel/client/mockModel.d.ts.map +1 -0
  74. package/dist/{client → vercel/client}/mockModel.js +12 -13
  75. package/dist/vercel/client/mockModel.js.map +1 -0
  76. package/dist/{client → vercel/client}/saveInputMessages.d.ts +2 -2
  77. package/dist/vercel/client/saveInputMessages.d.ts.map +1 -0
  78. package/dist/vercel/client/saveInputMessages.js.map +1 -0
  79. package/dist/{client → vercel/client}/search.d.ts +119 -22
  80. package/dist/vercel/client/search.d.ts.map +1 -0
  81. package/dist/{client → vercel/client}/search.js +2 -2
  82. package/dist/vercel/client/search.js.map +1 -0
  83. package/dist/{client → vercel/client}/start.d.ts +26 -11
  84. package/dist/vercel/client/start.d.ts.map +1 -0
  85. package/dist/{client → vercel/client}/start.js +64 -22
  86. package/dist/vercel/client/start.js.map +1 -0
  87. package/dist/{client → vercel/client}/streamText.d.ts +13 -12
  88. package/dist/vercel/client/streamText.d.ts.map +1 -0
  89. package/dist/{client → vercel/client}/streamText.js +43 -9
  90. package/dist/vercel/client/streamText.js.map +1 -0
  91. package/dist/{client → vercel/client}/streaming.d.ts +1410 -183
  92. package/dist/vercel/client/streaming.d.ts.map +1 -0
  93. package/dist/{client → vercel/client}/streaming.js +120 -52
  94. package/dist/vercel/client/streaming.js.map +1 -0
  95. package/dist/vercel/client/types.d.ts +456 -0
  96. package/dist/vercel/client/types.d.ts.map +1 -0
  97. package/dist/vercel/client/types.js +3 -0
  98. package/dist/vercel/client/types.js.map +1 -0
  99. package/dist/{client → vercel/client}/utils.d.ts +3 -2
  100. package/dist/vercel/client/utils.d.ts.map +1 -0
  101. package/dist/{client → vercel/client}/utils.js +2 -2
  102. package/dist/vercel/client/utils.js.map +1 -0
  103. package/dist/vercel/deltas.d.ts +31 -0
  104. package/dist/vercel/deltas.d.ts.map +1 -0
  105. package/dist/vercel/deltas.js +525 -0
  106. package/dist/vercel/deltas.js.map +1 -0
  107. package/dist/{client → vercel}/index.d.ts +484 -97
  108. package/dist/vercel/index.d.ts.map +1 -0
  109. package/dist/{client → vercel}/index.js +65 -38
  110. package/dist/vercel/index.js.map +1 -0
  111. package/dist/{mapping.d.ts → vercel/mapping.d.ts} +5 -13
  112. package/dist/vercel/mapping.d.ts.map +1 -0
  113. package/dist/{mapping.js → vercel/mapping.js} +411 -112
  114. package/dist/vercel/mapping.js.map +1 -0
  115. package/dist/{react → vercel/react}/optimisticallySendMessage.d.ts +2 -2
  116. package/dist/vercel/react/optimisticallySendMessage.d.ts.map +1 -0
  117. package/dist/vercel/react/optimisticallySendMessage.js.map +1 -0
  118. package/dist/{react → vercel/react}/types.d.ts +1 -1
  119. package/dist/vercel/react/types.d.ts.map +1 -0
  120. package/dist/{react → vercel/react}/types.js.map +1 -1
  121. package/dist/{react → vercel/react}/useDeltaStreams.d.ts +1 -1
  122. package/dist/vercel/react/useDeltaStreams.d.ts.map +1 -0
  123. package/dist/{react → vercel/react}/useDeltaStreams.js +1 -1
  124. package/dist/vercel/react/useDeltaStreams.js.map +1 -0
  125. package/dist/{react → vercel/react}/useStreamingUIMessages.d.ts +1 -1
  126. package/dist/vercel/react/useStreamingUIMessages.d.ts.map +1 -0
  127. package/dist/vercel/react/useStreamingUIMessages.js +112 -0
  128. package/dist/vercel/react/useStreamingUIMessages.js.map +1 -0
  129. package/dist/{react → vercel/react}/useThreadMessages.d.ts +1 -1
  130. package/dist/vercel/react/useThreadMessages.d.ts.map +1 -0
  131. package/dist/{react → vercel/react}/useThreadMessages.js +1 -1
  132. package/dist/vercel/react/useThreadMessages.js.map +1 -0
  133. package/dist/{react → vercel/react}/useUIMessages.d.ts +2 -1
  134. package/dist/vercel/react/useUIMessages.d.ts.map +1 -0
  135. package/dist/{react → vercel/react}/useUIMessages.js +8 -4
  136. package/dist/vercel/react/useUIMessages.js.map +1 -0
  137. package/package.json +30 -22
  138. package/src/client/messages.ts +5 -107
  139. package/src/client/types.ts +0 -621
  140. package/src/component/_generated/component.ts +1089 -48
  141. package/src/component/apiKeys.ts +5 -5
  142. package/src/component/files.test.ts +1 -1
  143. package/src/component/files.ts +14 -12
  144. package/src/component/messages.test.ts +273 -1
  145. package/src/component/messages.ts +99 -57
  146. package/src/component/streams.ts +80 -64
  147. package/src/component/threads.ts +12 -9
  148. package/src/component/users.ts +2 -2
  149. package/src/component/vector/index.ts +14 -7
  150. package/src/eslintConfig.test.ts +44 -0
  151. package/src/react/index.ts +8 -5
  152. package/src/shared.ts +26 -36
  153. package/src/streaming/materializePersistedUIMessageChunks.test.ts +513 -0
  154. package/src/streaming/materializePersistedUIMessageChunks.ts +398 -0
  155. package/src/streaming/persistedUIMessageChunks.test.ts +205 -0
  156. package/src/streaming/persistedUIMessageChunks.ts +658 -0
  157. package/src/validators.test.ts +4 -1
  158. package/src/validators.ts +89 -8
  159. package/src/{UIMessages.combineUIMessages.test.ts → vercel/UIMessages.combineUIMessages.test.ts} +4 -1
  160. package/src/{UIMessages.ts → vercel/UIMessages.ts} +96 -5
  161. package/src/{client → vercel/client}/approval.test.ts +48 -19
  162. package/src/{client → vercel/client}/createTool.ts +63 -23
  163. package/src/{client → vercel/client}/definePlaygroundAPI.ts +44 -29
  164. package/src/{client → vercel/client}/files.ts +2 -2
  165. package/src/{client → vercel/client}/index.test.ts +162 -3
  166. package/src/vercel/client/messages.ts +182 -0
  167. package/src/{client → vercel/client}/mockModel.ts +38 -39
  168. package/src/{client → vercel/client}/saveInputMessages.test.ts +1 -1
  169. package/src/{client → vercel/client}/saveInputMessages.ts +7 -4
  170. package/src/{client → vercel/client}/search.test.ts +3 -3
  171. package/src/{client → vercel/client}/search.ts +4 -4
  172. package/src/{client → vercel/client}/setup.test.ts +6 -3
  173. package/src/vercel/client/start.test.ts +14 -0
  174. package/src/{client → vercel/client}/start.ts +147 -36
  175. package/src/vercel/client/streamText.test.ts +223 -0
  176. package/src/{client → vercel/client}/streamText.ts +102 -31
  177. package/src/{client → vercel/client}/streaming.integration.test.ts +40 -115
  178. package/src/{client → vercel/client}/streaming.test.ts +178 -4
  179. package/src/{client → vercel/client}/streaming.ts +114 -52
  180. package/src/vercel/client/types.test.ts +13 -0
  181. package/src/vercel/client/types.ts +679 -0
  182. package/src/{client → vercel/client}/utils.ts +13 -7
  183. package/src/vercel/deltas.test.ts +898 -0
  184. package/src/vercel/deltas.ts +633 -0
  185. package/src/{fromUIMessages.test.ts → vercel/fromUIMessages.test.ts} +17 -1
  186. package/src/{client → vercel}/index.ts +169 -62
  187. package/src/vercel/mapping.test.ts +965 -0
  188. package/src/{mapping.ts → vercel/mapping.ts} +501 -131
  189. package/src/{react → vercel/react}/optimisticallySendMessage.ts +2 -2
  190. package/src/{react → vercel/react}/types.ts +1 -1
  191. package/src/{react → vercel/react}/useDeltaStreams.ts +6 -2
  192. package/src/{react → vercel/react}/useStreamingUIMessages.ts +67 -35
  193. package/src/{react → vercel/react}/useThreadMessages.ts +2 -2
  194. package/src/{react → vercel/react}/useUIMessages.test.ts +80 -1
  195. package/src/{react → vercel/react}/useUIMessages.ts +13 -5
  196. package/src/{toUIMessages.test.ts → vercel/toUIMessages.test.ts} +49 -2
  197. package/dist/UIMessages.d.ts.map +0 -1
  198. package/dist/UIMessages.js.map +0 -1
  199. package/dist/client/createTool.d.ts.map +0 -1
  200. package/dist/client/createTool.js.map +0 -1
  201. package/dist/client/definePlaygroundAPI.js.map +0 -1
  202. package/dist/client/files.d.ts.map +0 -1
  203. package/dist/client/files.js.map +0 -1
  204. package/dist/client/index.d.ts.map +0 -1
  205. package/dist/client/index.js.map +0 -1
  206. package/dist/client/mockModel.d.ts.map +0 -1
  207. package/dist/client/mockModel.js.map +0 -1
  208. package/dist/client/saveInputMessages.d.ts.map +0 -1
  209. package/dist/client/saveInputMessages.js.map +0 -1
  210. package/dist/client/search.d.ts.map +0 -1
  211. package/dist/client/search.js.map +0 -1
  212. package/dist/client/start.d.ts.map +0 -1
  213. package/dist/client/start.js.map +0 -1
  214. package/dist/client/streamText.d.ts.map +0 -1
  215. package/dist/client/streamText.js.map +0 -1
  216. package/dist/client/streaming.d.ts.map +0 -1
  217. package/dist/client/streaming.js.map +0 -1
  218. package/dist/client/utils.d.ts.map +0 -1
  219. package/dist/client/utils.js.map +0 -1
  220. package/dist/deltas.d.ts +0 -43
  221. package/dist/deltas.d.ts.map +0 -1
  222. package/dist/deltas.js +0 -446
  223. package/dist/deltas.js.map +0 -1
  224. package/dist/mapping.d.ts.map +0 -1
  225. package/dist/mapping.js.map +0 -1
  226. package/dist/react/optimisticallySendMessage.d.ts.map +0 -1
  227. package/dist/react/optimisticallySendMessage.js.map +0 -1
  228. package/dist/react/types.d.ts.map +0 -1
  229. package/dist/react/useDeltaStreams.d.ts.map +0 -1
  230. package/dist/react/useDeltaStreams.js.map +0 -1
  231. package/dist/react/useStreamingUIMessages.d.ts.map +0 -1
  232. package/dist/react/useStreamingUIMessages.js +0 -92
  233. package/dist/react/useStreamingUIMessages.js.map +0 -1
  234. package/dist/react/useThreadMessages.d.ts.map +0 -1
  235. package/dist/react/useThreadMessages.js.map +0 -1
  236. package/dist/react/useUIMessages.d.ts.map +0 -1
  237. package/dist/react/useUIMessages.js.map +0 -1
  238. package/src/client/streamText.test.ts +0 -102
  239. package/src/deltas.test.ts +0 -626
  240. package/src/deltas.ts +0 -569
  241. package/src/mapping.test.ts +0 -402
  242. /package/dist/{client → vercel/client}/files.js +0 -0
  243. /package/dist/{client → vercel/client}/saveInputMessages.js +0 -0
  244. /package/dist/{react → vercel/react}/optimisticallySendMessage.js +0 -0
  245. /package/dist/{react → vercel/react}/types.js +0 -0
  246. /package/src/{UIMessages.test.ts → vercel/UIMessages.test.ts} +0 -0
@@ -17,7 +17,7 @@ import {
17
17
  type StreamArgs,
18
18
  type StreamDelta,
19
19
  type StreamMessage,
20
- } from "../validators.js";
20
+ } from "../../validators.js";
21
21
  import type {
22
22
  ActionCtx,
23
23
  AgentComponent,
@@ -208,6 +208,7 @@ export class DeltaStreamer<T> {
208
208
  #nextParts: T[] = [];
209
209
  #latestWrite: number = 0;
210
210
  #ongoingWrite: Promise<void> | undefined;
211
+ #abortPromise: Promise<void> | undefined;
211
212
  #cursor: number = 0;
212
213
  public abortController: AbortController;
213
214
  // When true, the stream will be finished externally (e.g., atomically via addMessages)
@@ -243,34 +244,28 @@ export class DeltaStreamer<T> {
243
244
  this.#nextParts = [];
244
245
  this.abortController = new AbortController();
245
246
  if (config.abortSignal) {
246
- config.abortSignal.addEventListener("abort", async () => {
247
- try {
248
- if (this.abortController.signal.aborted) {
249
- return;
250
- }
251
- this.abortController.abort();
252
- // Wait for in-flight stream creation before trying to abort it
253
- if (this.#creatingStreamIdPromise) {
254
- await this.#creatingStreamIdPromise;
255
- }
256
- if (this.streamId) {
257
- await this.#ongoingWrite;
258
- await this.ctx.runMutation(this.component.streams.abort, {
259
- streamId: this.streamId,
260
- reason: "abortSignal",
261
- });
262
- }
263
- } catch {
264
- // Best-effort cleanup — the stream will be garbage-collected
265
- // by the 10-minute timeout if this fails.
266
- }
267
- });
247
+ const abortFromSignal = () => {
248
+ void this.#abort("abortSignal").catch(() => {
249
+ // Best-effort cleanup — the stream timeout is the fallback.
250
+ });
251
+ };
252
+ if (config.abortSignal.aborted) {
253
+ abortFromSignal();
254
+ } else {
255
+ config.abortSignal.addEventListener("abort", abortFromSignal, {
256
+ once: true,
257
+ });
258
+ }
268
259
  }
269
260
  }
270
261
 
271
262
  // Avoid race conditions by only creating once
272
263
  #creatingStreamIdPromise: Promise<string> | undefined;
273
264
  public async getStreamId() {
265
+ if (this.abortController.signal.aborted) {
266
+ await this.#abortPromise;
267
+ throw new Error("Cannot create a stream after it has been aborted");
268
+ }
274
269
  if (!this.streamId) {
275
270
  if (!this.#creatingStreamIdPromise) {
276
271
  this.#creatingStreamIdPromise = this.ctx.runMutation(
@@ -310,9 +305,11 @@ export class DeltaStreamer<T> {
310
305
  }
311
306
  // Skip finish if it will be handled externally (atomically with message save)
312
307
  // or if the stream was aborted (e.g., due to a failed delta write).
313
- // Aborted streams are cleaned up via streams.abort (called by the abort
314
- // signal handler), so we don't need to call finish() for them.
315
- if (!this.#finishedExternally && !this.abortController.signal.aborted) {
308
+ // Abort cleanup owns the terminal component transition, so consumeStream
309
+ // must wait for it instead of also trying to finish the stream.
310
+ if (this.abortController.signal.aborted) {
311
+ await this.#waitForAbortCleanup();
312
+ } else if (!this.#finishedExternally) {
316
313
  await this.finish();
317
314
  }
318
315
  }
@@ -343,28 +340,27 @@ export class DeltaStreamer<T> {
343
340
  return;
344
341
  }
345
342
  this.#latestWrite = Date.now();
343
+ let success: boolean;
346
344
  try {
347
- const success = await this.ctx.runMutation(
345
+ success = await this.ctx.runMutation(
348
346
  this.component.streams.addDelta,
349
347
  delta,
350
348
  );
351
- if (!success) {
352
- // An in-flight #sendDelta started before markFinishedExternally()
353
- // will get `success === false` because the stream row is already
354
- // "finished". That's a benign late-write miss, not a failure —
355
- // don't convert it into an abort.
356
- if (this.#finishedExternally) {
357
- return;
358
- }
359
- await this.config.onAsyncAbort("async abort");
360
- this.abortController.abort();
361
- return;
362
- }
363
349
  } catch (e) {
364
- await this.config.onAsyncAbort(
350
+ await this.#abortDelta(
365
351
  e instanceof Error ? e.message : "unknown error",
366
352
  );
367
- this.abortController.abort();
353
+ return;
354
+ }
355
+ if (!success) {
356
+ // An in-flight #sendDelta started before markFinishedExternally()
357
+ // will get `success === false` because the stream row is already
358
+ // "finished". That's a benign late-write miss, not a failure —
359
+ // don't convert it into an abort.
360
+ if (this.#finishedExternally) {
361
+ return;
362
+ }
363
+ await this.#abortDelta("async abort");
368
364
  return;
369
365
  }
370
366
  // Now that we've sent the delta, check if we need to send another one.
@@ -400,9 +396,17 @@ export class DeltaStreamer<T> {
400
396
  if (!this.streamId) {
401
397
  return;
402
398
  }
403
- await this.#ongoingWrite;
399
+ try {
400
+ await this.#ongoingWrite;
401
+ } catch (error) {
402
+ if (this.abortController.signal.aborted) {
403
+ await this.#waitForAbortCleanup();
404
+ }
405
+ throw error;
406
+ }
404
407
  await this.#sendDelta(); // #sendDelta checks aborted internally
405
408
  if (this.abortController.signal.aborted) {
409
+ await this.#waitForAbortCleanup();
406
410
  return;
407
411
  }
408
412
  await this.ctx.runMutation(this.component.streams.finish, {
@@ -411,18 +415,76 @@ export class DeltaStreamer<T> {
411
415
  }
412
416
 
413
417
  public async fail(reason: string) {
414
- if (this.abortController.signal.aborted) {
415
- return;
418
+ await this.#abort(reason);
419
+ }
420
+
421
+ async #abortDelta(reason: string) {
422
+ let callbackFailure: { error: unknown } | undefined;
423
+ try {
424
+ await this.config.onAsyncAbort(reason);
425
+ } catch (error) {
426
+ callbackFailure = { error };
416
427
  }
417
- this.abortController.abort();
418
- if (!this.streamId) {
419
- return;
428
+ if (!this.#abortPromise) {
429
+ try {
430
+ await this.#abort(reason, false);
431
+ } catch {
432
+ // The stream timeout is the bounded cleanup fallback.
433
+ }
420
434
  }
421
- await this.#ongoingWrite;
422
- await this.ctx.runMutation(this.component.streams.abort, {
423
- streamId: this.streamId,
424
- reason,
425
- });
435
+ if (callbackFailure) throw callbackFailure.error;
436
+ }
437
+
438
+ #abort(reason: string, waitForOngoingWrite = true): Promise<void> {
439
+ if (!this.#abortPromise) {
440
+ this.abortController.abort();
441
+ this.#abortPromise = this.#abortCreatedStream(
442
+ reason,
443
+ waitForOngoingWrite,
444
+ );
445
+ }
446
+ return this.#abortPromise;
447
+ }
448
+
449
+ async #waitForAbortCleanup() {
450
+ let writeFailure: { error: unknown } | undefined;
451
+ try {
452
+ await this.#ongoingWrite;
453
+ } catch (error) {
454
+ writeFailure = { error };
455
+ }
456
+ try {
457
+ await this.#abortPromise;
458
+ } catch (error) {
459
+ writeFailure ??= { error };
460
+ }
461
+ if (writeFailure) throw writeFailure.error;
462
+ }
463
+
464
+ async #abortCreatedStream(reason: string, waitForOngoingWrite: boolean) {
465
+ if (this.#creatingStreamIdPromise) {
466
+ this.streamId ??= await this.#creatingStreamIdPromise;
467
+ }
468
+ if (!this.streamId) return;
469
+ let writeFailure: { error: unknown } | undefined;
470
+ if (waitForOngoingWrite) {
471
+ try {
472
+ await this.#ongoingWrite;
473
+ } catch (error) {
474
+ writeFailure = { error };
475
+ }
476
+ }
477
+ let abortFailure: { error: unknown } | undefined;
478
+ try {
479
+ await this.ctx.runMutation(this.component.streams.abort, {
480
+ streamId: this.streamId,
481
+ reason,
482
+ });
483
+ } catch (error) {
484
+ abortFailure = { error };
485
+ }
486
+ if (writeFailure) throw writeFailure.error;
487
+ if (abortFailure) throw abortFailure.error;
426
488
  }
427
489
  }
428
490
 
@@ -0,0 +1,13 @@
1
+ import type { LanguageModelV3, LanguageModelV4 } from "@ai-sdk/provider";
2
+ import { expectTypeOf, test } from "vitest";
3
+ import type { AgentPrompt, Config } from "./types.js";
4
+
5
+ expectTypeOf<{ languageModel: string }>().toExtend<Config>();
6
+ expectTypeOf<{ languageModel: LanguageModelV4 }>().toExtend<Config>();
7
+ expectTypeOf<{ languageModel: LanguageModelV3 }>().not.toExtend<Config>();
8
+
9
+ expectTypeOf<{ model: string }>().toExtend<AgentPrompt>();
10
+ expectTypeOf<{ model: LanguageModelV4 }>().toExtend<AgentPrompt>();
11
+ expectTypeOf<{ model: LanguageModelV3 }>().not.toExtend<AgentPrompt>();
12
+
13
+ test("noop", () => {});