@raindrop-ai/ai-sdk 0.0.37 → 0.0.39

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.
@@ -2142,6 +2142,24 @@ function runWithParentToolContext(ctx, fn) {
2142
2142
  }
2143
2143
 
2144
2144
  // src/internal/raindrop-telemetry-integration.ts
2145
+ function hasUnresolvedToolApproval(event) {
2146
+ var _a;
2147
+ const content = Array.isArray(event == null ? void 0 : event.content) ? event.content : Array.isArray((_a = event == null ? void 0 : event.finalStep) == null ? void 0 : _a.content) ? event.finalStep.content : void 0;
2148
+ if (!content) return false;
2149
+ const respondedApprovalIds = /* @__PURE__ */ new Set();
2150
+ let hasRequest = false;
2151
+ for (const part of content) {
2152
+ if ((part == null ? void 0 : part.type) === "tool-approval-response" && typeof part.approvalId === "string") {
2153
+ respondedApprovalIds.add(part.approvalId);
2154
+ } else if ((part == null ? void 0 : part.type) === "tool-approval-request") {
2155
+ hasRequest = true;
2156
+ }
2157
+ }
2158
+ if (!hasRequest) return false;
2159
+ return content.some(
2160
+ (part) => (part == null ? void 0 : part.type) === "tool-approval-request" && !(typeof part.approvalId === "string" && respondedApprovalIds.has(part.approvalId))
2161
+ );
2162
+ }
2145
2163
  var RaindropTelemetryIntegration = class {
2146
2164
  constructor(opts) {
2147
2165
  this.callStates = /* @__PURE__ */ new Map();
@@ -2864,15 +2882,22 @@ var RaindropTelemetryIntegration = class {
2864
2882
  this.finalizeGenerateEvent(
2865
2883
  state,
2866
2884
  (_e = event.text) != null ? _e : state.accumulatedText || void 0,
2867
- (_f = event.response) == null ? void 0 : _f.modelId
2885
+ (_f = event.response) == null ? void 0 : _f.modelId,
2886
+ hasUnresolvedToolApproval(event)
2868
2887
  );
2869
2888
  }
2870
2889
  /**
2871
2890
  * Patch the Raindrop event for a completed, aborted, or errored text
2872
2891
  * generation so it leaves the `isPending` state. Shared by `onFinish`/`onEnd`,
2873
2892
  * `onAbort`, and `onError`.
2893
+ *
2894
+ * `keepPending` is set when a `streamText` execution finished only because it
2895
+ * is waiting on tool approval (human-in-the-loop). The logical turn resumes in
2896
+ * a later execution that shares this `eventId`, so the event stays pending and
2897
+ * is finalized by that resume — otherwise each execution would finalize the
2898
+ * same event ID into a separate canonical row.
2874
2899
  */
2875
- finalizeGenerateEvent(state, output, model) {
2900
+ finalizeGenerateEvent(state, output, model, keepPending = false) {
2876
2901
  var _a, _b, _c, _d, _e, _f, _g, _h;
2877
2902
  const suppressSubagentEvent = state.subagentName !== void 0 && state.subagentToolCallSpan !== void 0;
2878
2903
  if (!this.sendEvents || suppressSubagentEvent) return;
@@ -2895,7 +2920,7 @@ var RaindropTelemetryIntegration = class {
2895
2920
  output: cappedOutput,
2896
2921
  model,
2897
2922
  properties: Object.keys(properties).length > 0 ? properties : void 0,
2898
- isPending: false
2923
+ isPending: keepPending
2899
2924
  }).catch((err) => {
2900
2925
  if (this.debug) {
2901
2926
  console.warn(
@@ -4992,7 +5017,7 @@ function extractNestedTokens(usage, key) {
4992
5017
  // package.json
4993
5018
  var package_default = {
4994
5019
  name: "@raindrop-ai/ai-sdk",
4995
- version: "0.0.37"};
5020
+ version: "0.0.39"};
4996
5021
 
4997
5022
  // src/internal/version.ts
4998
5023
  var libraryName = package_default.name;
@@ -592,6 +592,12 @@ declare class RaindropTelemetryIntegration implements TelemetryIntegration {
592
592
  * Patch the Raindrop event for a completed, aborted, or errored text
593
593
  * generation so it leaves the `isPending` state. Shared by `onFinish`/`onEnd`,
594
594
  * `onAbort`, and `onError`.
595
+ *
596
+ * `keepPending` is set when a `streamText` execution finished only because it
597
+ * is waiting on tool approval (human-in-the-loop). The logical turn resumes in
598
+ * a later execution that shares this `eventId`, so the event stays pending and
599
+ * is finalized by that resume — otherwise each execution would finalize the
600
+ * same event ID into a separate canonical row.
595
601
  */
596
602
  private finalizeGenerateEvent;
597
603
  private finishEmbed;
@@ -592,6 +592,12 @@ declare class RaindropTelemetryIntegration implements TelemetryIntegration {
592
592
  * Patch the Raindrop event for a completed, aborted, or errored text
593
593
  * generation so it leaves the `isPending` state. Shared by `onFinish`/`onEnd`,
594
594
  * `onAbort`, and `onError`.
595
+ *
596
+ * `keepPending` is set when a `streamText` execution finished only because it
597
+ * is waiting on tool approval (human-in-the-loop). The logical turn resumes in
598
+ * a later execution that shares this `eventId`, so the event stays pending and
599
+ * is finalized by that resume — otherwise each execution would finalize the
600
+ * same event ID into a separate canonical row.
595
601
  */
596
602
  private finalizeGenerateEvent;
597
603
  private finishEmbed;
@@ -592,6 +592,12 @@ declare class RaindropTelemetryIntegration implements TelemetryIntegration {
592
592
  * Patch the Raindrop event for a completed, aborted, or errored text
593
593
  * generation so it leaves the `isPending` state. Shared by `onFinish`/`onEnd`,
594
594
  * `onAbort`, and `onError`.
595
+ *
596
+ * `keepPending` is set when a `streamText` execution finished only because it
597
+ * is waiting on tool approval (human-in-the-loop). The logical turn resumes in
598
+ * a later execution that shares this `eventId`, so the event stays pending and
599
+ * is finalized by that resume — otherwise each execution would finalize the
600
+ * same event ID into a separate canonical row.
595
601
  */
596
602
  private finalizeGenerateEvent;
597
603
  private finishEmbed;
@@ -592,6 +592,12 @@ declare class RaindropTelemetryIntegration implements TelemetryIntegration {
592
592
  * Patch the Raindrop event for a completed, aborted, or errored text
593
593
  * generation so it leaves the `isPending` state. Shared by `onFinish`/`onEnd`,
594
594
  * `onAbort`, and `onError`.
595
+ *
596
+ * `keepPending` is set when a `streamText` execution finished only because it
597
+ * is waiting on tool approval (human-in-the-loop). The logical turn resumes in
598
+ * a later execution that shares this `eventId`, so the event stays pending and
599
+ * is finalized by that resume — otherwise each execution would finalize the
600
+ * same event ID into a separate canonical row.
595
601
  */
596
602
  private finalizeGenerateEvent;
597
603
  private finishEmbed;
@@ -1283,7 +1283,7 @@ async function* asyncGeneratorWithCurrent(span, gen) {
1283
1283
  // package.json
1284
1284
  var package_default = {
1285
1285
  name: "@raindrop-ai/ai-sdk",
1286
- version: "0.0.37"};
1286
+ version: "0.0.39"};
1287
1287
 
1288
1288
  // src/internal/version.ts
1289
1289
  var libraryName = package_default.name;
@@ -2163,6 +2163,24 @@ function runWithParentToolContext(ctx, fn) {
2163
2163
  }
2164
2164
 
2165
2165
  // src/internal/raindrop-telemetry-integration.ts
2166
+ function hasUnresolvedToolApproval(event) {
2167
+ var _a;
2168
+ const content = Array.isArray(event == null ? void 0 : event.content) ? event.content : Array.isArray((_a = event == null ? void 0 : event.finalStep) == null ? void 0 : _a.content) ? event.finalStep.content : void 0;
2169
+ if (!content) return false;
2170
+ const respondedApprovalIds = /* @__PURE__ */ new Set();
2171
+ let hasRequest = false;
2172
+ for (const part of content) {
2173
+ if ((part == null ? void 0 : part.type) === "tool-approval-response" && typeof part.approvalId === "string") {
2174
+ respondedApprovalIds.add(part.approvalId);
2175
+ } else if ((part == null ? void 0 : part.type) === "tool-approval-request") {
2176
+ hasRequest = true;
2177
+ }
2178
+ }
2179
+ if (!hasRequest) return false;
2180
+ return content.some(
2181
+ (part) => (part == null ? void 0 : part.type) === "tool-approval-request" && !(typeof part.approvalId === "string" && respondedApprovalIds.has(part.approvalId))
2182
+ );
2183
+ }
2166
2184
  var RaindropTelemetryIntegration = class {
2167
2185
  constructor(opts) {
2168
2186
  this.callStates = /* @__PURE__ */ new Map();
@@ -2885,15 +2903,22 @@ var RaindropTelemetryIntegration = class {
2885
2903
  this.finalizeGenerateEvent(
2886
2904
  state,
2887
2905
  (_e = event.text) != null ? _e : state.accumulatedText || void 0,
2888
- (_f = event.response) == null ? void 0 : _f.modelId
2906
+ (_f = event.response) == null ? void 0 : _f.modelId,
2907
+ hasUnresolvedToolApproval(event)
2889
2908
  );
2890
2909
  }
2891
2910
  /**
2892
2911
  * Patch the Raindrop event for a completed, aborted, or errored text
2893
2912
  * generation so it leaves the `isPending` state. Shared by `onFinish`/`onEnd`,
2894
2913
  * `onAbort`, and `onError`.
2914
+ *
2915
+ * `keepPending` is set when a `streamText` execution finished only because it
2916
+ * is waiting on tool approval (human-in-the-loop). The logical turn resumes in
2917
+ * a later execution that shares this `eventId`, so the event stays pending and
2918
+ * is finalized by that resume — otherwise each execution would finalize the
2919
+ * same event ID into a separate canonical row.
2895
2920
  */
2896
- finalizeGenerateEvent(state, output, model) {
2921
+ finalizeGenerateEvent(state, output, model, keepPending = false) {
2897
2922
  var _a, _b, _c, _d, _e, _f, _g, _h;
2898
2923
  const suppressSubagentEvent = state.subagentName !== void 0 && state.subagentToolCallSpan !== void 0;
2899
2924
  if (!this.sendEvents || suppressSubagentEvent) return;
@@ -2916,7 +2941,7 @@ var RaindropTelemetryIntegration = class {
2916
2941
  output: cappedOutput,
2917
2942
  model,
2918
2943
  properties: Object.keys(properties).length > 0 ? properties : void 0,
2919
- isPending: false
2944
+ isPending: keepPending
2920
2945
  }).catch((err) => {
2921
2946
  if (this.debug) {
2922
2947
  console.warn(
@@ -1281,7 +1281,7 @@ async function* asyncGeneratorWithCurrent(span, gen) {
1281
1281
  // package.json
1282
1282
  var package_default = {
1283
1283
  name: "@raindrop-ai/ai-sdk",
1284
- version: "0.0.37"};
1284
+ version: "0.0.39"};
1285
1285
 
1286
1286
  // src/internal/version.ts
1287
1287
  var libraryName = package_default.name;
@@ -2161,6 +2161,24 @@ function runWithParentToolContext(ctx, fn) {
2161
2161
  }
2162
2162
 
2163
2163
  // src/internal/raindrop-telemetry-integration.ts
2164
+ function hasUnresolvedToolApproval(event) {
2165
+ var _a;
2166
+ const content = Array.isArray(event == null ? void 0 : event.content) ? event.content : Array.isArray((_a = event == null ? void 0 : event.finalStep) == null ? void 0 : _a.content) ? event.finalStep.content : void 0;
2167
+ if (!content) return false;
2168
+ const respondedApprovalIds = /* @__PURE__ */ new Set();
2169
+ let hasRequest = false;
2170
+ for (const part of content) {
2171
+ if ((part == null ? void 0 : part.type) === "tool-approval-response" && typeof part.approvalId === "string") {
2172
+ respondedApprovalIds.add(part.approvalId);
2173
+ } else if ((part == null ? void 0 : part.type) === "tool-approval-request") {
2174
+ hasRequest = true;
2175
+ }
2176
+ }
2177
+ if (!hasRequest) return false;
2178
+ return content.some(
2179
+ (part) => (part == null ? void 0 : part.type) === "tool-approval-request" && !(typeof part.approvalId === "string" && respondedApprovalIds.has(part.approvalId))
2180
+ );
2181
+ }
2164
2182
  var RaindropTelemetryIntegration = class {
2165
2183
  constructor(opts) {
2166
2184
  this.callStates = /* @__PURE__ */ new Map();
@@ -2883,15 +2901,22 @@ var RaindropTelemetryIntegration = class {
2883
2901
  this.finalizeGenerateEvent(
2884
2902
  state,
2885
2903
  (_e = event.text) != null ? _e : state.accumulatedText || void 0,
2886
- (_f = event.response) == null ? void 0 : _f.modelId
2904
+ (_f = event.response) == null ? void 0 : _f.modelId,
2905
+ hasUnresolvedToolApproval(event)
2887
2906
  );
2888
2907
  }
2889
2908
  /**
2890
2909
  * Patch the Raindrop event for a completed, aborted, or errored text
2891
2910
  * generation so it leaves the `isPending` state. Shared by `onFinish`/`onEnd`,
2892
2911
  * `onAbort`, and `onError`.
2912
+ *
2913
+ * `keepPending` is set when a `streamText` execution finished only because it
2914
+ * is waiting on tool approval (human-in-the-loop). The logical turn resumes in
2915
+ * a later execution that shares this `eventId`, so the event stays pending and
2916
+ * is finalized by that resume — otherwise each execution would finalize the
2917
+ * same event ID into a separate canonical row.
2893
2918
  */
2894
- finalizeGenerateEvent(state, output, model) {
2919
+ finalizeGenerateEvent(state, output, model, keepPending = false) {
2895
2920
  var _a, _b, _c, _d, _e, _f, _g, _h;
2896
2921
  const suppressSubagentEvent = state.subagentName !== void 0 && state.subagentToolCallSpan !== void 0;
2897
2922
  if (!this.sendEvents || suppressSubagentEvent) return;
@@ -2914,7 +2939,7 @@ var RaindropTelemetryIntegration = class {
2914
2939
  output: cappedOutput,
2915
2940
  model,
2916
2941
  properties: Object.keys(properties).length > 0 ? properties : void 0,
2917
- isPending: false
2942
+ isPending: keepPending
2918
2943
  }).catch((err) => {
2919
2944
  if (this.debug) {
2920
2945
  console.warn(
@@ -1,4 +1,4 @@
1
- export { A as AISDKChatRequestLike, a as AISDKChatRequestMessageLike, b as AISDKMessage, c as AgentCallMetadata, d as AgentWithMetadata, e as Attachment, B as BuildEventPatch, C as ContextManager, f as ContextSpan, g as CreateSpanArgs, D as DEFAULT_MAX_TEXT_FIELD_CHARS, h as DEFAULT_REDACT_ATTRIBUTE_KEYS, i as DEFAULT_SECRET_KEY_NAMES, E as EndSpanArgs, j as EventBuilder, k as EventMetadataOptions, I as IdentifyInput, O as OtlpAnyValue, l as OtlpSpan, P as ParentToolContext, R as REDACTED_PLACEHOLDER, m as RaindropAISDKClient, n as RaindropAISDKContext, o as RaindropAISDKOptions, p as RaindropCallMetadata, q as RaindropTelemetryIntegration, r as RaindropTelemetryIntegrationOptions, s as RaindropTelemetryOptions, S as SelfDiagnosticsOptions, t as SelfDiagnosticsSignalDefinition, u as SelfDiagnosticsSignalDefinitions, v as SelfDiagnosticsTool, w as SelfDiagnosticsToolInput, x as SelfDiagnosticsToolOptions, y as SelfDiagnosticsToolResult, z as StartSpanArgs, T as TRUNCATION_MARKER, F as TraceSpan, G as TransformSpanHook, W as WrapAISDKOptions, H as WrappedAI, J as WrappedAISDK, _ as _resetParentToolContextStorage, K as _resetRaindropCallMetadataStorage, L as _resetWarnedMissingUserId, M as boundedStringify, N as capText, Q as clearParentToolContext, U as createRaindropAISDK, V as currentSpan, X as defaultTransformSpan, Y as enterParentToolContext, Z as eventMetadata, $ as eventMetadataFromChatRequest, a0 as getContextManager, a1 as getCurrentParentToolContext, a2 as getCurrentRaindropCallMetadata, a3 as raindrop, a4 as readRaindropCallMetadataFromArgs, a5 as redactJsonAttributeValue, a6 as redactSecretsInObject, a7 as runWithParentToolContext, a8 as runWithRaindropCallMetadata, a9 as withCurrent } from './index-D-E1YSku.mjs';
1
+ export { A as AISDKChatRequestLike, a as AISDKChatRequestMessageLike, b as AISDKMessage, c as AgentCallMetadata, d as AgentWithMetadata, e as Attachment, B as BuildEventPatch, C as ContextManager, f as ContextSpan, g as CreateSpanArgs, D as DEFAULT_MAX_TEXT_FIELD_CHARS, h as DEFAULT_REDACT_ATTRIBUTE_KEYS, i as DEFAULT_SECRET_KEY_NAMES, E as EndSpanArgs, j as EventBuilder, k as EventMetadataOptions, I as IdentifyInput, O as OtlpAnyValue, l as OtlpSpan, P as ParentToolContext, R as REDACTED_PLACEHOLDER, m as RaindropAISDKClient, n as RaindropAISDKContext, o as RaindropAISDKOptions, p as RaindropCallMetadata, q as RaindropTelemetryIntegration, r as RaindropTelemetryIntegrationOptions, s as RaindropTelemetryOptions, S as SelfDiagnosticsOptions, t as SelfDiagnosticsSignalDefinition, u as SelfDiagnosticsSignalDefinitions, v as SelfDiagnosticsTool, w as SelfDiagnosticsToolInput, x as SelfDiagnosticsToolOptions, y as SelfDiagnosticsToolResult, z as StartSpanArgs, T as TRUNCATION_MARKER, F as TraceSpan, G as TransformSpanHook, W as WrapAISDKOptions, H as WrappedAI, J as WrappedAISDK, _ as _resetParentToolContextStorage, K as _resetRaindropCallMetadataStorage, L as _resetWarnedMissingUserId, M as boundedStringify, N as capText, Q as clearParentToolContext, U as createRaindropAISDK, V as currentSpan, X as defaultTransformSpan, Y as enterParentToolContext, Z as eventMetadata, $ as eventMetadataFromChatRequest, a0 as getContextManager, a1 as getCurrentParentToolContext, a2 as getCurrentRaindropCallMetadata, a3 as raindrop, a4 as readRaindropCallMetadataFromArgs, a5 as redactJsonAttributeValue, a6 as redactSecretsInObject, a7 as runWithParentToolContext, a8 as runWithRaindropCallMetadata, a9 as withCurrent } from './index-D82pma6B.mjs';
2
2
 
3
3
  declare global {
4
4
  var RAINDROP_ASYNC_LOCAL_STORAGE: (new <T>() => {
@@ -1,4 +1,4 @@
1
- export { A as AISDKChatRequestLike, a as AISDKChatRequestMessageLike, b as AISDKMessage, c as AgentCallMetadata, d as AgentWithMetadata, e as Attachment, B as BuildEventPatch, C as ContextManager, f as ContextSpan, g as CreateSpanArgs, D as DEFAULT_MAX_TEXT_FIELD_CHARS, h as DEFAULT_REDACT_ATTRIBUTE_KEYS, i as DEFAULT_SECRET_KEY_NAMES, E as EndSpanArgs, j as EventBuilder, k as EventMetadataOptions, I as IdentifyInput, O as OtlpAnyValue, l as OtlpSpan, P as ParentToolContext, R as REDACTED_PLACEHOLDER, m as RaindropAISDKClient, n as RaindropAISDKContext, o as RaindropAISDKOptions, p as RaindropCallMetadata, q as RaindropTelemetryIntegration, r as RaindropTelemetryIntegrationOptions, s as RaindropTelemetryOptions, S as SelfDiagnosticsOptions, t as SelfDiagnosticsSignalDefinition, u as SelfDiagnosticsSignalDefinitions, v as SelfDiagnosticsTool, w as SelfDiagnosticsToolInput, x as SelfDiagnosticsToolOptions, y as SelfDiagnosticsToolResult, z as StartSpanArgs, T as TRUNCATION_MARKER, F as TraceSpan, G as TransformSpanHook, W as WrapAISDKOptions, H as WrappedAI, J as WrappedAISDK, _ as _resetParentToolContextStorage, K as _resetRaindropCallMetadataStorage, L as _resetWarnedMissingUserId, M as boundedStringify, N as capText, Q as clearParentToolContext, U as createRaindropAISDK, V as currentSpan, X as defaultTransformSpan, Y as enterParentToolContext, Z as eventMetadata, $ as eventMetadataFromChatRequest, a0 as getContextManager, a1 as getCurrentParentToolContext, a2 as getCurrentRaindropCallMetadata, a3 as raindrop, a4 as readRaindropCallMetadataFromArgs, a5 as redactJsonAttributeValue, a6 as redactSecretsInObject, a7 as runWithParentToolContext, a8 as runWithRaindropCallMetadata, a9 as withCurrent } from './index-D-E1YSku.js';
1
+ export { A as AISDKChatRequestLike, a as AISDKChatRequestMessageLike, b as AISDKMessage, c as AgentCallMetadata, d as AgentWithMetadata, e as Attachment, B as BuildEventPatch, C as ContextManager, f as ContextSpan, g as CreateSpanArgs, D as DEFAULT_MAX_TEXT_FIELD_CHARS, h as DEFAULT_REDACT_ATTRIBUTE_KEYS, i as DEFAULT_SECRET_KEY_NAMES, E as EndSpanArgs, j as EventBuilder, k as EventMetadataOptions, I as IdentifyInput, O as OtlpAnyValue, l as OtlpSpan, P as ParentToolContext, R as REDACTED_PLACEHOLDER, m as RaindropAISDKClient, n as RaindropAISDKContext, o as RaindropAISDKOptions, p as RaindropCallMetadata, q as RaindropTelemetryIntegration, r as RaindropTelemetryIntegrationOptions, s as RaindropTelemetryOptions, S as SelfDiagnosticsOptions, t as SelfDiagnosticsSignalDefinition, u as SelfDiagnosticsSignalDefinitions, v as SelfDiagnosticsTool, w as SelfDiagnosticsToolInput, x as SelfDiagnosticsToolOptions, y as SelfDiagnosticsToolResult, z as StartSpanArgs, T as TRUNCATION_MARKER, F as TraceSpan, G as TransformSpanHook, W as WrapAISDKOptions, H as WrappedAI, J as WrappedAISDK, _ as _resetParentToolContextStorage, K as _resetRaindropCallMetadataStorage, L as _resetWarnedMissingUserId, M as boundedStringify, N as capText, Q as clearParentToolContext, U as createRaindropAISDK, V as currentSpan, X as defaultTransformSpan, Y as enterParentToolContext, Z as eventMetadata, $ as eventMetadataFromChatRequest, a0 as getContextManager, a1 as getCurrentParentToolContext, a2 as getCurrentRaindropCallMetadata, a3 as raindrop, a4 as readRaindropCallMetadataFromArgs, a5 as redactJsonAttributeValue, a6 as redactSecretsInObject, a7 as runWithParentToolContext, a8 as runWithRaindropCallMetadata, a9 as withCurrent } from './index-D82pma6B.js';
2
2
 
3
3
  declare global {
4
4
  var RAINDROP_ASYNC_LOCAL_STORAGE: (new <T>() => {
@@ -1288,7 +1288,7 @@ globalThis.RAINDROP_ASYNC_LOCAL_STORAGE = async_hooks.AsyncLocalStorage;
1288
1288
  // package.json
1289
1289
  var package_default = {
1290
1290
  name: "@raindrop-ai/ai-sdk",
1291
- version: "0.0.37"};
1291
+ version: "0.0.39"};
1292
1292
 
1293
1293
  // src/internal/version.ts
1294
1294
  var libraryName = package_default.name;
@@ -2168,6 +2168,24 @@ function runWithParentToolContext(ctx, fn) {
2168
2168
  }
2169
2169
 
2170
2170
  // src/internal/raindrop-telemetry-integration.ts
2171
+ function hasUnresolvedToolApproval(event) {
2172
+ var _a;
2173
+ const content = Array.isArray(event == null ? void 0 : event.content) ? event.content : Array.isArray((_a = event == null ? void 0 : event.finalStep) == null ? void 0 : _a.content) ? event.finalStep.content : void 0;
2174
+ if (!content) return false;
2175
+ const respondedApprovalIds = /* @__PURE__ */ new Set();
2176
+ let hasRequest = false;
2177
+ for (const part of content) {
2178
+ if ((part == null ? void 0 : part.type) === "tool-approval-response" && typeof part.approvalId === "string") {
2179
+ respondedApprovalIds.add(part.approvalId);
2180
+ } else if ((part == null ? void 0 : part.type) === "tool-approval-request") {
2181
+ hasRequest = true;
2182
+ }
2183
+ }
2184
+ if (!hasRequest) return false;
2185
+ return content.some(
2186
+ (part) => (part == null ? void 0 : part.type) === "tool-approval-request" && !(typeof part.approvalId === "string" && respondedApprovalIds.has(part.approvalId))
2187
+ );
2188
+ }
2171
2189
  var RaindropTelemetryIntegration = class {
2172
2190
  constructor(opts) {
2173
2191
  this.callStates = /* @__PURE__ */ new Map();
@@ -2890,15 +2908,22 @@ var RaindropTelemetryIntegration = class {
2890
2908
  this.finalizeGenerateEvent(
2891
2909
  state,
2892
2910
  (_e = event.text) != null ? _e : state.accumulatedText || void 0,
2893
- (_f = event.response) == null ? void 0 : _f.modelId
2911
+ (_f = event.response) == null ? void 0 : _f.modelId,
2912
+ hasUnresolvedToolApproval(event)
2894
2913
  );
2895
2914
  }
2896
2915
  /**
2897
2916
  * Patch the Raindrop event for a completed, aborted, or errored text
2898
2917
  * generation so it leaves the `isPending` state. Shared by `onFinish`/`onEnd`,
2899
2918
  * `onAbort`, and `onError`.
2919
+ *
2920
+ * `keepPending` is set when a `streamText` execution finished only because it
2921
+ * is waiting on tool approval (human-in-the-loop). The logical turn resumes in
2922
+ * a later execution that shares this `eventId`, so the event stays pending and
2923
+ * is finalized by that resume — otherwise each execution would finalize the
2924
+ * same event ID into a separate canonical row.
2900
2925
  */
2901
- finalizeGenerateEvent(state, output, model) {
2926
+ finalizeGenerateEvent(state, output, model, keepPending = false) {
2902
2927
  var _a, _b, _c, _d, _e, _f, _g, _h;
2903
2928
  const suppressSubagentEvent = state.subagentName !== void 0 && state.subagentToolCallSpan !== void 0;
2904
2929
  if (!this.sendEvents || suppressSubagentEvent) return;
@@ -2921,7 +2946,7 @@ var RaindropTelemetryIntegration = class {
2921
2946
  output: cappedOutput,
2922
2947
  model,
2923
2948
  properties: Object.keys(properties).length > 0 ? properties : void 0,
2924
- isPending: false
2949
+ isPending: keepPending
2925
2950
  }).catch((err) => {
2926
2951
  if (this.debug) {
2927
2952
  console.warn(
@@ -1,4 +1,4 @@
1
- export { DEFAULT_MAX_TEXT_FIELD_CHARS, DEFAULT_REDACT_ATTRIBUTE_KEYS, DEFAULT_SECRET_KEY_NAMES, REDACTED_PLACEHOLDER, RaindropTelemetryIntegration, TRUNCATION_MARKER, _resetParentToolContextStorage, _resetRaindropCallMetadataStorage, _resetWarnedMissingUserId, boundedStringify, capText, clearParentToolContext, createRaindropAISDK, currentSpan, defaultTransformSpan, enterParentToolContext, eventMetadata, eventMetadataFromChatRequest, getContextManager, getCurrentParentToolContext, getCurrentRaindropCallMetadata, raindrop, readRaindropCallMetadataFromArgs, redactJsonAttributeValue, redactSecretsInObject, runWithParentToolContext, runWithRaindropCallMetadata, withCurrent } from './chunk-ZIGZX4D5.mjs';
1
+ export { DEFAULT_MAX_TEXT_FIELD_CHARS, DEFAULT_REDACT_ATTRIBUTE_KEYS, DEFAULT_SECRET_KEY_NAMES, REDACTED_PLACEHOLDER, RaindropTelemetryIntegration, TRUNCATION_MARKER, _resetParentToolContextStorage, _resetRaindropCallMetadataStorage, _resetWarnedMissingUserId, boundedStringify, capText, clearParentToolContext, createRaindropAISDK, currentSpan, defaultTransformSpan, enterParentToolContext, eventMetadata, eventMetadataFromChatRequest, getContextManager, getCurrentParentToolContext, getCurrentRaindropCallMetadata, raindrop, readRaindropCallMetadataFromArgs, redactJsonAttributeValue, redactSecretsInObject, runWithParentToolContext, runWithRaindropCallMetadata, withCurrent } from './chunk-BONJPAA4.mjs';
2
2
  import { AsyncLocalStorage } from 'async_hooks';
3
3
 
4
4
  globalThis.RAINDROP_ASYNC_LOCAL_STORAGE = AsyncLocalStorage;
@@ -1,4 +1,4 @@
1
- export { A as AISDKChatRequestLike, a as AISDKChatRequestMessageLike, b as AISDKMessage, c as AgentCallMetadata, d as AgentWithMetadata, e as Attachment, B as BuildEventPatch, C as ContextManager, f as ContextSpan, g as CreateSpanArgs, D as DEFAULT_MAX_TEXT_FIELD_CHARS, h as DEFAULT_REDACT_ATTRIBUTE_KEYS, i as DEFAULT_SECRET_KEY_NAMES, E as EndSpanArgs, j as EventBuilder, k as EventMetadataOptions, I as IdentifyInput, O as OtlpAnyValue, l as OtlpSpan, P as ParentToolContext, R as REDACTED_PLACEHOLDER, m as RaindropAISDKClient, n as RaindropAISDKContext, o as RaindropAISDKOptions, p as RaindropCallMetadata, q as RaindropTelemetryIntegration, r as RaindropTelemetryIntegrationOptions, s as RaindropTelemetryOptions, S as SelfDiagnosticsOptions, t as SelfDiagnosticsSignalDefinition, u as SelfDiagnosticsSignalDefinitions, v as SelfDiagnosticsTool, w as SelfDiagnosticsToolInput, x as SelfDiagnosticsToolOptions, y as SelfDiagnosticsToolResult, z as StartSpanArgs, T as TRUNCATION_MARKER, F as TraceSpan, G as TransformSpanHook, W as WrapAISDKOptions, H as WrappedAI, J as WrappedAISDK, _ as _resetParentToolContextStorage, K as _resetRaindropCallMetadataStorage, L as _resetWarnedMissingUserId, M as boundedStringify, N as capText, Q as clearParentToolContext, U as createRaindropAISDK, V as currentSpan, X as defaultTransformSpan, Y as enterParentToolContext, Z as eventMetadata, $ as eventMetadataFromChatRequest, a0 as getContextManager, a1 as getCurrentParentToolContext, a2 as getCurrentRaindropCallMetadata, a3 as raindrop, a4 as readRaindropCallMetadataFromArgs, a5 as redactJsonAttributeValue, a6 as redactSecretsInObject, a7 as runWithParentToolContext, a8 as runWithRaindropCallMetadata, a9 as withCurrent } from './index-D-E1YSku.mjs';
1
+ export { A as AISDKChatRequestLike, a as AISDKChatRequestMessageLike, b as AISDKMessage, c as AgentCallMetadata, d as AgentWithMetadata, e as Attachment, B as BuildEventPatch, C as ContextManager, f as ContextSpan, g as CreateSpanArgs, D as DEFAULT_MAX_TEXT_FIELD_CHARS, h as DEFAULT_REDACT_ATTRIBUTE_KEYS, i as DEFAULT_SECRET_KEY_NAMES, E as EndSpanArgs, j as EventBuilder, k as EventMetadataOptions, I as IdentifyInput, O as OtlpAnyValue, l as OtlpSpan, P as ParentToolContext, R as REDACTED_PLACEHOLDER, m as RaindropAISDKClient, n as RaindropAISDKContext, o as RaindropAISDKOptions, p as RaindropCallMetadata, q as RaindropTelemetryIntegration, r as RaindropTelemetryIntegrationOptions, s as RaindropTelemetryOptions, S as SelfDiagnosticsOptions, t as SelfDiagnosticsSignalDefinition, u as SelfDiagnosticsSignalDefinitions, v as SelfDiagnosticsTool, w as SelfDiagnosticsToolInput, x as SelfDiagnosticsToolOptions, y as SelfDiagnosticsToolResult, z as StartSpanArgs, T as TRUNCATION_MARKER, F as TraceSpan, G as TransformSpanHook, W as WrapAISDKOptions, H as WrappedAI, J as WrappedAISDK, _ as _resetParentToolContextStorage, K as _resetRaindropCallMetadataStorage, L as _resetWarnedMissingUserId, M as boundedStringify, N as capText, Q as clearParentToolContext, U as createRaindropAISDK, V as currentSpan, X as defaultTransformSpan, Y as enterParentToolContext, Z as eventMetadata, $ as eventMetadataFromChatRequest, a0 as getContextManager, a1 as getCurrentParentToolContext, a2 as getCurrentRaindropCallMetadata, a3 as raindrop, a4 as readRaindropCallMetadataFromArgs, a5 as redactJsonAttributeValue, a6 as redactSecretsInObject, a7 as runWithParentToolContext, a8 as runWithRaindropCallMetadata, a9 as withCurrent } from './index-D82pma6B.mjs';
2
2
 
3
3
  declare global {
4
4
  var RAINDROP_ASYNC_LOCAL_STORAGE: (new <T>() => {
@@ -1,4 +1,4 @@
1
- export { A as AISDKChatRequestLike, a as AISDKChatRequestMessageLike, b as AISDKMessage, c as AgentCallMetadata, d as AgentWithMetadata, e as Attachment, B as BuildEventPatch, C as ContextManager, f as ContextSpan, g as CreateSpanArgs, D as DEFAULT_MAX_TEXT_FIELD_CHARS, h as DEFAULT_REDACT_ATTRIBUTE_KEYS, i as DEFAULT_SECRET_KEY_NAMES, E as EndSpanArgs, j as EventBuilder, k as EventMetadataOptions, I as IdentifyInput, O as OtlpAnyValue, l as OtlpSpan, P as ParentToolContext, R as REDACTED_PLACEHOLDER, m as RaindropAISDKClient, n as RaindropAISDKContext, o as RaindropAISDKOptions, p as RaindropCallMetadata, q as RaindropTelemetryIntegration, r as RaindropTelemetryIntegrationOptions, s as RaindropTelemetryOptions, S as SelfDiagnosticsOptions, t as SelfDiagnosticsSignalDefinition, u as SelfDiagnosticsSignalDefinitions, v as SelfDiagnosticsTool, w as SelfDiagnosticsToolInput, x as SelfDiagnosticsToolOptions, y as SelfDiagnosticsToolResult, z as StartSpanArgs, T as TRUNCATION_MARKER, F as TraceSpan, G as TransformSpanHook, W as WrapAISDKOptions, H as WrappedAI, J as WrappedAISDK, _ as _resetParentToolContextStorage, K as _resetRaindropCallMetadataStorage, L as _resetWarnedMissingUserId, M as boundedStringify, N as capText, Q as clearParentToolContext, U as createRaindropAISDK, V as currentSpan, X as defaultTransformSpan, Y as enterParentToolContext, Z as eventMetadata, $ as eventMetadataFromChatRequest, a0 as getContextManager, a1 as getCurrentParentToolContext, a2 as getCurrentRaindropCallMetadata, a3 as raindrop, a4 as readRaindropCallMetadataFromArgs, a5 as redactJsonAttributeValue, a6 as redactSecretsInObject, a7 as runWithParentToolContext, a8 as runWithRaindropCallMetadata, a9 as withCurrent } from './index-D-E1YSku.js';
1
+ export { A as AISDKChatRequestLike, a as AISDKChatRequestMessageLike, b as AISDKMessage, c as AgentCallMetadata, d as AgentWithMetadata, e as Attachment, B as BuildEventPatch, C as ContextManager, f as ContextSpan, g as CreateSpanArgs, D as DEFAULT_MAX_TEXT_FIELD_CHARS, h as DEFAULT_REDACT_ATTRIBUTE_KEYS, i as DEFAULT_SECRET_KEY_NAMES, E as EndSpanArgs, j as EventBuilder, k as EventMetadataOptions, I as IdentifyInput, O as OtlpAnyValue, l as OtlpSpan, P as ParentToolContext, R as REDACTED_PLACEHOLDER, m as RaindropAISDKClient, n as RaindropAISDKContext, o as RaindropAISDKOptions, p as RaindropCallMetadata, q as RaindropTelemetryIntegration, r as RaindropTelemetryIntegrationOptions, s as RaindropTelemetryOptions, S as SelfDiagnosticsOptions, t as SelfDiagnosticsSignalDefinition, u as SelfDiagnosticsSignalDefinitions, v as SelfDiagnosticsTool, w as SelfDiagnosticsToolInput, x as SelfDiagnosticsToolOptions, y as SelfDiagnosticsToolResult, z as StartSpanArgs, T as TRUNCATION_MARKER, F as TraceSpan, G as TransformSpanHook, W as WrapAISDKOptions, H as WrappedAI, J as WrappedAISDK, _ as _resetParentToolContextStorage, K as _resetRaindropCallMetadataStorage, L as _resetWarnedMissingUserId, M as boundedStringify, N as capText, Q as clearParentToolContext, U as createRaindropAISDK, V as currentSpan, X as defaultTransformSpan, Y as enterParentToolContext, Z as eventMetadata, $ as eventMetadataFromChatRequest, a0 as getContextManager, a1 as getCurrentParentToolContext, a2 as getCurrentRaindropCallMetadata, a3 as raindrop, a4 as readRaindropCallMetadataFromArgs, a5 as redactJsonAttributeValue, a6 as redactSecretsInObject, a7 as runWithParentToolContext, a8 as runWithRaindropCallMetadata, a9 as withCurrent } from './index-D82pma6B.js';
2
2
 
3
3
  declare global {
4
4
  var RAINDROP_ASYNC_LOCAL_STORAGE: (new <T>() => {
@@ -1288,7 +1288,7 @@ globalThis.RAINDROP_ASYNC_LOCAL_STORAGE = async_hooks.AsyncLocalStorage;
1288
1288
  // package.json
1289
1289
  var package_default = {
1290
1290
  name: "@raindrop-ai/ai-sdk",
1291
- version: "0.0.37"};
1291
+ version: "0.0.39"};
1292
1292
 
1293
1293
  // src/internal/version.ts
1294
1294
  var libraryName = package_default.name;
@@ -2168,6 +2168,24 @@ function runWithParentToolContext(ctx, fn) {
2168
2168
  }
2169
2169
 
2170
2170
  // src/internal/raindrop-telemetry-integration.ts
2171
+ function hasUnresolvedToolApproval(event) {
2172
+ var _a;
2173
+ const content = Array.isArray(event == null ? void 0 : event.content) ? event.content : Array.isArray((_a = event == null ? void 0 : event.finalStep) == null ? void 0 : _a.content) ? event.finalStep.content : void 0;
2174
+ if (!content) return false;
2175
+ const respondedApprovalIds = /* @__PURE__ */ new Set();
2176
+ let hasRequest = false;
2177
+ for (const part of content) {
2178
+ if ((part == null ? void 0 : part.type) === "tool-approval-response" && typeof part.approvalId === "string") {
2179
+ respondedApprovalIds.add(part.approvalId);
2180
+ } else if ((part == null ? void 0 : part.type) === "tool-approval-request") {
2181
+ hasRequest = true;
2182
+ }
2183
+ }
2184
+ if (!hasRequest) return false;
2185
+ return content.some(
2186
+ (part) => (part == null ? void 0 : part.type) === "tool-approval-request" && !(typeof part.approvalId === "string" && respondedApprovalIds.has(part.approvalId))
2187
+ );
2188
+ }
2171
2189
  var RaindropTelemetryIntegration = class {
2172
2190
  constructor(opts) {
2173
2191
  this.callStates = /* @__PURE__ */ new Map();
@@ -2890,15 +2908,22 @@ var RaindropTelemetryIntegration = class {
2890
2908
  this.finalizeGenerateEvent(
2891
2909
  state,
2892
2910
  (_e = event.text) != null ? _e : state.accumulatedText || void 0,
2893
- (_f = event.response) == null ? void 0 : _f.modelId
2911
+ (_f = event.response) == null ? void 0 : _f.modelId,
2912
+ hasUnresolvedToolApproval(event)
2894
2913
  );
2895
2914
  }
2896
2915
  /**
2897
2916
  * Patch the Raindrop event for a completed, aborted, or errored text
2898
2917
  * generation so it leaves the `isPending` state. Shared by `onFinish`/`onEnd`,
2899
2918
  * `onAbort`, and `onError`.
2919
+ *
2920
+ * `keepPending` is set when a `streamText` execution finished only because it
2921
+ * is waiting on tool approval (human-in-the-loop). The logical turn resumes in
2922
+ * a later execution that shares this `eventId`, so the event stays pending and
2923
+ * is finalized by that resume — otherwise each execution would finalize the
2924
+ * same event ID into a separate canonical row.
2900
2925
  */
2901
- finalizeGenerateEvent(state, output, model) {
2926
+ finalizeGenerateEvent(state, output, model, keepPending = false) {
2902
2927
  var _a, _b, _c, _d, _e, _f, _g, _h;
2903
2928
  const suppressSubagentEvent = state.subagentName !== void 0 && state.subagentToolCallSpan !== void 0;
2904
2929
  if (!this.sendEvents || suppressSubagentEvent) return;
@@ -2921,7 +2946,7 @@ var RaindropTelemetryIntegration = class {
2921
2946
  output: cappedOutput,
2922
2947
  model,
2923
2948
  properties: Object.keys(properties).length > 0 ? properties : void 0,
2924
- isPending: false
2949
+ isPending: keepPending
2925
2950
  }).catch((err) => {
2926
2951
  if (this.debug) {
2927
2952
  console.warn(
@@ -1,4 +1,4 @@
1
- export { DEFAULT_MAX_TEXT_FIELD_CHARS, DEFAULT_REDACT_ATTRIBUTE_KEYS, DEFAULT_SECRET_KEY_NAMES, REDACTED_PLACEHOLDER, RaindropTelemetryIntegration, TRUNCATION_MARKER, _resetParentToolContextStorage, _resetRaindropCallMetadataStorage, _resetWarnedMissingUserId, boundedStringify, capText, clearParentToolContext, createRaindropAISDK, currentSpan, defaultTransformSpan, enterParentToolContext, eventMetadata, eventMetadataFromChatRequest, getContextManager, getCurrentParentToolContext, getCurrentRaindropCallMetadata, raindrop, readRaindropCallMetadataFromArgs, redactJsonAttributeValue, redactSecretsInObject, runWithParentToolContext, runWithRaindropCallMetadata, withCurrent } from './chunk-ZIGZX4D5.mjs';
1
+ export { DEFAULT_MAX_TEXT_FIELD_CHARS, DEFAULT_REDACT_ATTRIBUTE_KEYS, DEFAULT_SECRET_KEY_NAMES, REDACTED_PLACEHOLDER, RaindropTelemetryIntegration, TRUNCATION_MARKER, _resetParentToolContextStorage, _resetRaindropCallMetadataStorage, _resetWarnedMissingUserId, boundedStringify, capText, clearParentToolContext, createRaindropAISDK, currentSpan, defaultTransformSpan, enterParentToolContext, eventMetadata, eventMetadataFromChatRequest, getContextManager, getCurrentParentToolContext, getCurrentRaindropCallMetadata, raindrop, readRaindropCallMetadataFromArgs, redactJsonAttributeValue, redactSecretsInObject, runWithParentToolContext, runWithRaindropCallMetadata, withCurrent } from './chunk-BONJPAA4.mjs';
2
2
  import { AsyncLocalStorage } from 'async_hooks';
3
3
 
4
4
  if (!globalThis.RAINDROP_ASYNC_LOCAL_STORAGE) {
package/package.json CHANGED
@@ -1,19 +1,14 @@
1
1
  {
2
2
  "name": "@raindrop-ai/ai-sdk",
3
- "version": "0.0.37",
3
+ "version": "0.0.39",
4
4
  "description": "Standalone Vercel AI SDK integration for Raindrop (events + OTLP/HTTP JSON traces, no OTEL runtime)",
5
5
  "main": "dist/index.node.js",
6
6
  "module": "dist/index.node.mjs",
7
7
  "types": "dist/index.node.d.ts",
8
8
  "license": "MIT",
9
- "repository": {
10
- "type": "git",
11
- "url": "git+https://github.com/raindrop-ai/raindrop-js.git",
12
- "directory": "packages/ai-sdk"
13
- },
14
- "homepage": "https://github.com/raindrop-ai/raindrop-js/tree/main/packages/ai-sdk#readme",
9
+ "homepage": "https://www.raindrop.ai/docs/integrations/vercel-ai-sdk/",
15
10
  "bugs": {
16
- "url": "https://github.com/raindrop-ai/raindrop-js/issues"
11
+ "url": "https://www.raindrop.ai/docs/support/"
17
12
  },
18
13
  "exports": {
19
14
  ".": {