ai 5.0.248 → 5.0.249

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.
package/dist/index.mjs CHANGED
@@ -727,7 +727,7 @@ import {
727
727
  } from "@ai-sdk/provider-utils";
728
728
 
729
729
  // src/version.ts
730
- var VERSION = true ? "5.0.248" : "0.0.0-test";
730
+ var VERSION = true ? "5.0.249" : "0.0.0-test";
731
731
 
732
732
  // src/util/download/download.ts
733
733
  var download = async ({
@@ -4072,7 +4072,8 @@ function handleUIMessageStreamFinish({
4072
4072
  originalMessages = [],
4073
4073
  onFinish,
4074
4074
  onError,
4075
- stream
4075
+ stream,
4076
+ getOutcome
4076
4077
  }) {
4077
4078
  let lastMessage = originalMessages == null ? void 0 : originalMessages[originalMessages.length - 1];
4078
4079
  if ((lastMessage == null ? void 0 : lastMessage.role) !== "assistant") {
@@ -4081,19 +4082,34 @@ function handleUIMessageStreamFinish({
4081
4082
  messageId = lastMessage.id;
4082
4083
  }
4083
4084
  let isAborted = false;
4085
+ let hasProcessingFailure = false;
4086
+ let processingError;
4087
+ const recordProcessingFailure = (error) => {
4088
+ hasProcessingFailure = true;
4089
+ processingError = error;
4090
+ };
4084
4091
  const idInjectedStream = stream.pipeThrough(
4085
4092
  new TransformStream({
4086
4093
  transform(chunk, controller) {
4087
- if (chunk.type === "start") {
4088
- const startChunk = chunk;
4089
- if (startChunk.messageId == null && messageId != null) {
4090
- startChunk.messageId = messageId;
4094
+ try {
4095
+ let outputChunk = chunk;
4096
+ if (chunk.type === "start") {
4097
+ const startChunk = chunk;
4098
+ if (startChunk.messageId == null && messageId != null) {
4099
+ outputChunk = {
4100
+ ...startChunk,
4101
+ messageId
4102
+ };
4103
+ }
4091
4104
  }
4105
+ if (chunk.type === "abort") {
4106
+ isAborted = true;
4107
+ }
4108
+ controller.enqueue(outputChunk);
4109
+ } catch (error) {
4110
+ recordProcessingFailure(error);
4111
+ throw error;
4092
4112
  }
4093
- if (chunk.type === "abort") {
4094
- isAborted = true;
4095
- }
4096
- controller.enqueue(chunk);
4097
4113
  }
4098
4114
  })
4099
4115
  );
@@ -4106,19 +4122,28 @@ function handleUIMessageStreamFinish({
4106
4122
  // will be overridden by the stream
4107
4123
  });
4108
4124
  const runUpdateMessageJob = async (job) => {
4109
- await job({ state, write: () => {
4110
- } });
4125
+ try {
4126
+ await job({ state, write: () => {
4127
+ } });
4128
+ } catch (error) {
4129
+ recordProcessingFailure(error);
4130
+ throw error;
4131
+ }
4111
4132
  };
4112
4133
  let finishCalled = false;
4113
4134
  const callOnFinish = async () => {
4135
+ var _a16;
4114
4136
  if (finishCalled || !onFinish) {
4115
4137
  return;
4116
4138
  }
4117
4139
  finishCalled = true;
4118
4140
  const isContinuation = state.message.id === (lastMessage == null ? void 0 : lastMessage.id);
4141
+ const declaredOutcome = (_a16 = getOutcome == null ? void 0 : getOutcome()) != null ? _a16 : { status: "unknown" };
4142
+ const outcome = hasProcessingFailure ? { status: "failed", error: processingError } : declaredOutcome.status === "unknown" && isAborted ? { status: "aborted" } : declaredOutcome;
4119
4143
  await onFinish({
4120
- isAborted,
4144
+ isAborted: isAborted || outcome.status === "aborted",
4121
4145
  isContinuation,
4146
+ outcome,
4122
4147
  responseMessage: state.message,
4123
4148
  messages: [
4124
4149
  ...isContinuation ? originalMessages.slice(0, -1) : originalMessages,
@@ -5715,6 +5740,17 @@ var DefaultStreamTextResult = class {
5715
5740
  onError = () => "An error occurred."
5716
5741
  // prevent leaking server error details to the client by default
5717
5742
  } = {}) {
5743
+ let outcome = { status: "unknown" };
5744
+ let hasFatalFailure = false;
5745
+ const setSourceOutcome = (newOutcome) => {
5746
+ if (!hasFatalFailure && outcome.status !== "completed" && outcome.status !== "aborted" && newOutcome.status !== "unknown" && (outcome.status === "unknown" || newOutcome.status !== "failed")) {
5747
+ outcome = newOutcome;
5748
+ }
5749
+ };
5750
+ const failOutcome = (error) => {
5751
+ hasFatalFailure = true;
5752
+ outcome = { status: "failed", error };
5753
+ };
5718
5754
  const responseMessageId = generateMessageId != null ? getResponseUIMessageId({
5719
5755
  originalMessages,
5720
5756
  responseMessageId: generateMessageId
@@ -5726,7 +5762,48 @@ var DefaultStreamTextResult = class {
5726
5762
  const dynamic = ((_b = (_a16 = this.tools) == null ? void 0 : _a16[toolName]) == null ? void 0 : _b.type) === "dynamic";
5727
5763
  return dynamic ? true : void 0;
5728
5764
  };
5729
- const baseStream = this.fullStream.pipeThrough(
5765
+ const sourceReader = this.fullStream.getReader();
5766
+ let sourceReaderReleased = false;
5767
+ let sourceStreamCancelled = false;
5768
+ const releaseSourceReader = () => {
5769
+ if (!sourceReaderReleased) {
5770
+ sourceReader.releaseLock();
5771
+ sourceReaderReleased = true;
5772
+ }
5773
+ };
5774
+ const sourceStream = new ReadableStream({
5775
+ async pull(controller) {
5776
+ try {
5777
+ const { done, value } = await sourceReader.read();
5778
+ if (done) {
5779
+ releaseSourceReader();
5780
+ if (!sourceStreamCancelled) {
5781
+ controller.close();
5782
+ }
5783
+ } else {
5784
+ controller.enqueue(value);
5785
+ }
5786
+ } catch (error) {
5787
+ releaseSourceReader();
5788
+ if (!sourceStreamCancelled) {
5789
+ failOutcome(error);
5790
+ controller.error(error);
5791
+ }
5792
+ }
5793
+ },
5794
+ async cancel(reason) {
5795
+ sourceStreamCancelled = true;
5796
+ if (sourceReaderReleased) {
5797
+ return;
5798
+ }
5799
+ try {
5800
+ await sourceReader.cancel(reason);
5801
+ } finally {
5802
+ releaseSourceReader();
5803
+ }
5804
+ }
5805
+ });
5806
+ const baseStream = sourceStream.pipeThrough(
5730
5807
  new TransformStream({
5731
5808
  transform: async (part, controller) => {
5732
5809
  const messageMetadataValue = messageMetadata == null ? void 0 : messageMetadata({ part });
@@ -5940,16 +6017,65 @@ var DefaultStreamTextResult = class {
5940
6017
  messageMetadata: messageMetadataValue
5941
6018
  });
5942
6019
  }
6020
+ if (part.type === "finish") {
6021
+ setSourceOutcome({ status: "completed" });
6022
+ } else if (part.type === "abort") {
6023
+ setSourceOutcome({ status: "aborted" });
6024
+ } else if (part.type === "error") {
6025
+ setSourceOutcome({ status: "failed", error: part.error });
6026
+ }
5943
6027
  }
5944
6028
  })
5945
6029
  );
6030
+ const baseStreamReader = baseStream.getReader();
6031
+ let baseStreamReaderReleased = false;
6032
+ let baseStreamCancelled = false;
6033
+ const releaseBaseStreamReader = () => {
6034
+ if (!baseStreamReaderReleased) {
6035
+ baseStreamReader.releaseLock();
6036
+ baseStreamReaderReleased = true;
6037
+ }
6038
+ };
6039
+ const trackedBaseStream = new ReadableStream({
6040
+ async pull(controller) {
6041
+ try {
6042
+ const { done, value } = await baseStreamReader.read();
6043
+ if (done) {
6044
+ releaseBaseStreamReader();
6045
+ if (!baseStreamCancelled) {
6046
+ controller.close();
6047
+ }
6048
+ } else {
6049
+ controller.enqueue(value);
6050
+ }
6051
+ } catch (error) {
6052
+ releaseBaseStreamReader();
6053
+ if (!baseStreamCancelled) {
6054
+ failOutcome(error);
6055
+ controller.error(error);
6056
+ }
6057
+ }
6058
+ },
6059
+ async cancel(reason) {
6060
+ baseStreamCancelled = true;
6061
+ if (baseStreamReaderReleased) {
6062
+ return;
6063
+ }
6064
+ try {
6065
+ await baseStreamReader.cancel(reason);
6066
+ } finally {
6067
+ releaseBaseStreamReader();
6068
+ }
6069
+ }
6070
+ });
5946
6071
  return createAsyncIterableStream(
5947
6072
  handleUIMessageStreamFinish({
5948
- stream: baseStream,
6073
+ stream: trackedBaseStream,
5949
6074
  messageId: responseMessageId != null ? responseMessageId : generateMessageId == null ? void 0 : generateMessageId(),
5950
6075
  originalMessages,
5951
6076
  onFinish,
5952
- onError
6077
+ onError,
6078
+ getOutcome: () => outcome
5953
6079
  })
5954
6080
  );
5955
6081
  }
@@ -10298,6 +10424,7 @@ function createUIMessageStream({
10298
10424
  }) {
10299
10425
  let controller;
10300
10426
  const ongoingStreamPromises = [];
10427
+ let outcome = { status: "unknown" };
10301
10428
  const stream = new ReadableStream({
10302
10429
  start(controllerArg) {
10303
10430
  controller = controllerArg;
@@ -10309,6 +10436,35 @@ function createUIMessageStream({
10309
10436
  } catch (error) {
10310
10437
  }
10311
10438
  }
10439
+ function setOutcome(newOutcome) {
10440
+ if (outcome.status === "unknown" && newOutcome.status !== "unknown") {
10441
+ outcome = newOutcome;
10442
+ }
10443
+ }
10444
+ function failOutcome(error) {
10445
+ outcome = { status: "failed", error };
10446
+ }
10447
+ function safeError(error) {
10448
+ try {
10449
+ controller.error(error);
10450
+ } catch (e) {
10451
+ }
10452
+ }
10453
+ function handleError(error) {
10454
+ failOutcome(error);
10455
+ let errorText;
10456
+ try {
10457
+ errorText = onError(error);
10458
+ } catch (onErrorError) {
10459
+ failOutcome(onErrorError);
10460
+ safeError(onErrorError);
10461
+ return;
10462
+ }
10463
+ safeEnqueue({
10464
+ type: "error",
10465
+ errorText
10466
+ });
10467
+ }
10312
10468
  try {
10313
10469
  const result = execute({
10314
10470
  writer: {
@@ -10326,38 +10482,29 @@ function createUIMessageStream({
10326
10482
  safeEnqueue(value);
10327
10483
  }
10328
10484
  })().catch((error) => {
10329
- safeEnqueue({
10330
- type: "error",
10331
- errorText: onError(error)
10332
- });
10485
+ handleError(error);
10333
10486
  })
10334
10487
  );
10335
10488
  },
10489
+ setOutcome,
10336
10490
  onError
10337
10491
  }
10338
10492
  });
10339
10493
  if (result) {
10340
10494
  ongoingStreamPromises.push(
10341
10495
  result.catch((error) => {
10342
- safeEnqueue({
10343
- type: "error",
10344
- errorText: onError(error)
10345
- });
10496
+ handleError(error);
10346
10497
  })
10347
10498
  );
10348
10499
  }
10349
10500
  } catch (error) {
10350
- safeEnqueue({
10351
- type: "error",
10352
- errorText: onError(error)
10353
- });
10501
+ handleError(error);
10354
10502
  }
10355
- const waitForStreams = new Promise(async (resolve2) => {
10503
+ const waitForStreams = (async () => {
10356
10504
  while (ongoingStreamPromises.length > 0) {
10357
10505
  await ongoingStreamPromises.shift();
10358
10506
  }
10359
- resolve2();
10360
- });
10507
+ })();
10361
10508
  waitForStreams.finally(() => {
10362
10509
  try {
10363
10510
  controller.close();
@@ -10369,7 +10516,8 @@ function createUIMessageStream({
10369
10516
  messageId: generateId3(),
10370
10517
  originalMessages,
10371
10518
  onFinish,
10372
- onError
10519
+ onError,
10520
+ getOutcome: () => outcome
10373
10521
  });
10374
10522
  }
10375
10523