ai 6.0.265 → 6.0.266

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/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # ai
2
2
 
3
+ ## 6.0.266
4
+
5
+ ### Patch Changes
6
+
7
+ - a1bafb1: Continue approved `generateText` and `streamText` turns with a model-visible tool error when revalidated tool input is invalid.
8
+ - 3cb50fc: Prevent aborted, errored, or cancelled `streamText` calls from retaining per-call state through abort cleanup listeners.
9
+ - Updated dependencies [5642849]
10
+ - @ai-sdk/provider-utils@4.0.48
11
+ - @ai-sdk/gateway@3.0.181
12
+
3
13
  ## 6.0.265
4
14
 
5
15
  ### Patch Changes
package/dist/index.js CHANGED
@@ -1304,7 +1304,7 @@ function detectMediaType({
1304
1304
  var import_provider_utils3 = require("@ai-sdk/provider-utils");
1305
1305
 
1306
1306
  // src/version.ts
1307
- var VERSION = true ? "6.0.265" : "0.0.0-test";
1307
+ var VERSION = true ? "6.0.266" : "0.0.0-test";
1308
1308
 
1309
1309
  // src/util/download/download.ts
1310
1310
  var download = async ({
@@ -3323,6 +3323,7 @@ async function validateApprovedToolApprovals({
3323
3323
  var _a22;
3324
3324
  const approved = [];
3325
3325
  const denied = [];
3326
+ const invalid = [];
3326
3327
  for (const approval of approvedToolApprovals) {
3327
3328
  const { toolCall, approvalRequest } = approval;
3328
3329
  const tool2 = tools == null ? void 0 : tools[toolCall.toolName];
@@ -3356,11 +3357,15 @@ async function validateApprovedToolApprovals({
3356
3357
  schema: (0, import_provider_utils12.asSchema)(tool2.inputSchema)
3357
3358
  });
3358
3359
  if (!validation.success) {
3359
- throw new InvalidToolInputError({
3360
- toolName: toolCall.toolName,
3361
- toolInput: JSON.stringify(toolCall.input),
3362
- cause: validation.error
3360
+ invalid.push({
3361
+ ...approval,
3362
+ error: new InvalidToolInputError({
3363
+ toolName: toolCall.toolName,
3364
+ toolInput: JSON.stringify(toolCall.input),
3365
+ cause: validation.error
3366
+ })
3363
3367
  });
3368
+ continue;
3364
3369
  }
3365
3370
  }
3366
3371
  const approvalNeeded = tool2 != null && await isApprovalNeeded({
@@ -3382,7 +3387,11 @@ async function validateApprovedToolApprovals({
3382
3387
  });
3383
3388
  }
3384
3389
  }
3385
- return { approvedToolApprovals: approved, deniedToolApprovals: denied };
3390
+ return {
3391
+ approvedToolApprovals: approved,
3392
+ deniedToolApprovals: denied,
3393
+ invalidToolApprovals: invalid
3394
+ };
3386
3395
  }
3387
3396
 
3388
3397
  // src/generate-text/output.ts
@@ -4638,7 +4647,8 @@ async function generateText({
4638
4647
  } = collectToolApprovals({ messages: initialMessages });
4639
4648
  const {
4640
4649
  approvedToolApprovals: localApprovedToolApprovals,
4641
- deniedToolApprovals: revalidationDeniedToolApprovals
4650
+ deniedToolApprovals: revalidationDeniedToolApprovals,
4651
+ invalidToolApprovals
4642
4652
  } = await validateApprovedToolApprovals({
4643
4653
  approvedToolApprovals: approvedToolApprovals.filter(
4644
4654
  (toolApproval) => !toolApproval.toolCall.providerExecuted
@@ -4652,7 +4662,7 @@ async function generateText({
4652
4662
  ...collectedDeniedToolApprovals,
4653
4663
  ...revalidationDeniedToolApprovals
4654
4664
  ];
4655
- if (deniedToolApprovals.length > 0 || localApprovedToolApprovals.length > 0) {
4665
+ if (deniedToolApprovals.length > 0 || localApprovedToolApprovals.length > 0 || invalidToolApprovals.length > 0) {
4656
4666
  const toolOutputs = await executeTools({
4657
4667
  toolCalls: localApprovedToolApprovals.map(
4658
4668
  (toolApproval) => toolApproval.toolCall
@@ -4690,6 +4700,20 @@ async function generateText({
4690
4700
  output: modelOutput
4691
4701
  });
4692
4702
  }
4703
+ for (const toolApproval of invalidToolApprovals) {
4704
+ toolContent.push({
4705
+ type: "tool-result",
4706
+ toolCallId: toolApproval.toolCall.toolCallId,
4707
+ toolName: toolApproval.toolCall.toolName,
4708
+ output: await createToolModelOutput({
4709
+ toolCallId: toolApproval.toolCall.toolCallId,
4710
+ input: toolApproval.toolCall.input,
4711
+ tool: tools == null ? void 0 : tools[toolApproval.toolCall.toolName],
4712
+ output: toolApproval.error,
4713
+ errorMode: "text"
4714
+ })
4715
+ });
4716
+ }
4693
4717
  for (const toolApproval of deniedToolApprovals) {
4694
4718
  toolContent.push({
4695
4719
  type: "tool-result",
@@ -6653,7 +6677,10 @@ function createStitchableStream() {
6653
6677
  const terminate = () => {
6654
6678
  isClosed = true;
6655
6679
  waitForNewStream.resolve();
6656
- innerStreams.forEach(({ reader }) => reader.cancel());
6680
+ innerStreams.forEach(({ reader, onCancel }) => {
6681
+ onCancel == null ? void 0 : onCancel();
6682
+ reader.cancel();
6683
+ });
6657
6684
  innerStreams = [];
6658
6685
  controller == null ? void 0 : controller.close();
6659
6686
  };
@@ -6694,7 +6721,8 @@ function createStitchableStream() {
6694
6721
  },
6695
6722
  pull: processPull,
6696
6723
  async cancel() {
6697
- for (const { reader } of innerStreams) {
6724
+ for (const { reader, onCancel } of innerStreams) {
6725
+ onCancel == null ? void 0 : onCancel();
6698
6726
  await reader.cancel();
6699
6727
  }
6700
6728
  innerStreams = [];
@@ -7697,7 +7725,8 @@ var DefaultStreamTextResult = class {
7697
7725
  if (deniedToolApprovals.length > 0 || approvedToolApprovals.length > 0) {
7698
7726
  const {
7699
7727
  approvedToolApprovals: localApprovedToolApprovals,
7700
- deniedToolApprovals: revalidationDeniedToolApprovals
7728
+ deniedToolApprovals: revalidationDeniedToolApprovals,
7729
+ invalidToolApprovals
7701
7730
  } = await validateApprovedToolApprovals({
7702
7731
  approvedToolApprovals: approvedToolApprovals.filter(
7703
7732
  (toolApproval) => !toolApproval.toolCall.providerExecuted
@@ -7734,6 +7763,18 @@ var DefaultStreamTextResult = class {
7734
7763
  toolName: toolApproval.toolCall.toolName
7735
7764
  });
7736
7765
  }
7766
+ for (const toolApproval of invalidToolApprovals) {
7767
+ toolExecutionStepStreamController == null ? void 0 : toolExecutionStepStreamController.enqueue({
7768
+ type: "tool-error",
7769
+ toolCallId: toolApproval.toolCall.toolCallId,
7770
+ toolName: toolApproval.toolCall.toolName,
7771
+ input: toolApproval.toolCall.input,
7772
+ error: (0, import_provider29.getErrorMessage)(toolApproval.error),
7773
+ title: toolApproval.toolCall.title,
7774
+ ...toolApproval.toolCall.dynamic === true ? { dynamic: true } : {},
7775
+ ...toolApproval.toolCall.toolMetadata != null ? { toolMetadata: toolApproval.toolCall.toolMetadata } : {}
7776
+ });
7777
+ }
7737
7778
  const toolOutputs = [];
7738
7779
  await Promise.all(
7739
7780
  localApprovedToolApprovals.map(async (toolApproval) => {
@@ -7765,7 +7806,7 @@ var DefaultStreamTextResult = class {
7765
7806
  }
7766
7807
  })
7767
7808
  );
7768
- if (toolOutputs.length > 0 || localDeniedToolApprovals.length > 0) {
7809
+ if (toolOutputs.length > 0 || localDeniedToolApprovals.length > 0 || invalidToolApprovals.length > 0) {
7769
7810
  const localToolContent = [];
7770
7811
  for (const output2 of toolOutputs) {
7771
7812
  localToolContent.push({
@@ -7781,6 +7822,20 @@ var DefaultStreamTextResult = class {
7781
7822
  })
7782
7823
  });
7783
7824
  }
7825
+ for (const toolApproval of invalidToolApprovals) {
7826
+ localToolContent.push({
7827
+ type: "tool-result",
7828
+ toolCallId: toolApproval.toolCall.toolCallId,
7829
+ toolName: toolApproval.toolCall.toolName,
7830
+ output: await createToolModelOutput({
7831
+ toolCallId: toolApproval.toolCall.toolCallId,
7832
+ input: toolApproval.toolCall.input,
7833
+ tool: tools == null ? void 0 : tools[toolApproval.toolCall.toolName],
7834
+ output: toolApproval.error,
7835
+ errorMode: "text"
7836
+ })
7837
+ });
7838
+ }
7784
7839
  for (const toolApproval of localDeniedToolApprovals) {
7785
7840
  localToolContent.push({
7786
7841
  type: "tool-result",
@@ -7836,8 +7891,17 @@ var DefaultStreamTextResult = class {
7836
7891
  clearTimeout(stepTimeoutId);
7837
7892
  }
7838
7893
  }
7839
- abortSignal == null ? void 0 : abortSignal.addEventListener("abort", clearStepTimeout);
7840
- abortSignal == null ? void 0 : abortSignal.addEventListener("abort", clearChunkTimeout);
7894
+ function clearStepTimeouts() {
7895
+ clearStepTimeout();
7896
+ clearChunkTimeout();
7897
+ }
7898
+ function cleanupStepTimeouts() {
7899
+ abortSignal == null ? void 0 : abortSignal.removeEventListener("abort", cleanupStepTimeouts);
7900
+ clearStepTimeouts();
7901
+ }
7902
+ abortSignal == null ? void 0 : abortSignal.addEventListener("abort", cleanupStepTimeouts, {
7903
+ once: true
7904
+ });
7841
7905
  try {
7842
7906
  stepFinish = new import_provider_utils20.DelayedPromise();
7843
7907
  const stepInputMessages = [...initialMessages, ...responseMessages];
@@ -8214,8 +8278,7 @@ var DefaultStreamTextResult = class {
8214
8278
  })
8215
8279
  });
8216
8280
  doStreamSpan.end();
8217
- clearStepTimeout();
8218
- clearChunkTimeout();
8281
+ cleanupStepTimeouts();
8219
8282
  self.closeStream();
8220
8283
  return;
8221
8284
  }
@@ -8319,8 +8382,7 @@ var DefaultStreamTextResult = class {
8319
8382
  pendingDeferredToolCalls.delete(output2.toolCallId);
8320
8383
  }
8321
8384
  }
8322
- clearStepTimeout();
8323
- clearChunkTimeout();
8385
+ cleanupStepTimeouts();
8324
8386
  if (
8325
8387
  // Continue if:
8326
8388
  // 1. There are client tool calls that have all been executed, OR
@@ -8364,11 +8426,14 @@ var DefaultStreamTextResult = class {
8364
8426
  }
8365
8427
  }
8366
8428
  })
8367
- )
8429
+ ),
8430
+ {
8431
+ onError: cleanupStepTimeouts,
8432
+ onCancel: cleanupStepTimeouts
8433
+ }
8368
8434
  );
8369
8435
  } catch (error) {
8370
- clearStepTimeout();
8371
- clearChunkTimeout();
8436
+ cleanupStepTimeouts();
8372
8437
  throw error;
8373
8438
  }
8374
8439
  }