@raindrop-ai/ai-sdk 0.0.34 → 0.0.36

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.
@@ -4,7 +4,7 @@ var async_hooks = require('async_hooks');
4
4
 
5
5
  // src/index.node.ts
6
6
 
7
- // ../core/dist/chunk-U5HUTMR5.js
7
+ // ../core/dist/chunk-SK6EJEO7.js
8
8
  function getCrypto() {
9
9
  const c = globalThis.crypto;
10
10
  return c;
@@ -401,6 +401,25 @@ function sendLocalDebuggerLiveEvent(event, options = {}) {
401
401
  ).catch(() => {
402
402
  });
403
403
  }
404
+ var PROJECT_ID_HEADER = "X-Raindrop-Project-Id";
405
+ var PROJECT_ID_SLUG_PATTERN = /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/;
406
+ function isValidProjectIdSlug(value) {
407
+ return PROJECT_ID_SLUG_PATTERN.test(value);
408
+ }
409
+ function normalizeProjectId(raw, opts) {
410
+ if (typeof raw !== "string") return void 0;
411
+ const trimmed = raw.trim();
412
+ if (!trimmed) return void 0;
413
+ if (!isValidProjectIdSlug(trimmed) && opts.debug) {
414
+ console.warn(
415
+ `${opts.prefix} projectId "${trimmed}" does not match slug ${PROJECT_ID_SLUG_PATTERN.source}; sending anyway \u2014 backend may reject with HTTP 400`
416
+ );
417
+ }
418
+ return trimmed;
419
+ }
420
+ function projectIdHeaders(projectId) {
421
+ return projectId ? { [PROJECT_ID_HEADER]: projectId } : {};
422
+ }
404
423
  var SHUTDOWN_DEADLINE_MS = 1e4;
405
424
  var POST_SHUTDOWN_TIMEOUT_MS = 5e3;
406
425
  function mergePatches(target, source) {
@@ -435,6 +454,10 @@ var EventShipper = class {
435
454
  if (this.debug && this.localDebuggerUrl) {
436
455
  console.log(`${this.prefix} Local debugger mirroring: ${this.localDebuggerUrl}`);
437
456
  }
457
+ this.projectId = normalizeProjectId(opts.projectId, {
458
+ debug: this.debug,
459
+ prefix: this.prefix
460
+ });
438
461
  const isNode = typeof process !== "undefined" && typeof process.version === "string";
439
462
  this.context = {
440
463
  library: {
@@ -453,6 +476,9 @@ var EventShipper = class {
453
476
  authHeaders() {
454
477
  return this.writeKey ? { Authorization: `Bearer ${this.writeKey}` } : {};
455
478
  }
479
+ requestHeaders() {
480
+ return { ...this.authHeaders(), ...projectIdHeaders(this.projectId) };
481
+ }
456
482
  /**
457
483
  * Build the retry/timeout options for one POST, honoring the shutdown
458
484
  * deadline. Returns `null` when the shutdown drain window is exhausted —
@@ -582,7 +608,7 @@ var EventShipper = class {
582
608
  return;
583
609
  }
584
610
  try {
585
- await postJson(url, body, this.authHeaders(), opts);
611
+ await postJson(url, body, this.requestHeaders(), opts);
586
612
  } catch (err) {
587
613
  const msg = err instanceof Error ? err.message : String(err);
588
614
  rateLimitedLog(
@@ -618,7 +644,7 @@ var EventShipper = class {
618
644
  return;
619
645
  }
620
646
  try {
621
- await postJson(url, body, this.authHeaders(), opts);
647
+ await postJson(url, body, this.requestHeaders(), opts);
622
648
  } catch (err) {
623
649
  const msg = err instanceof Error ? err.message : String(err);
624
650
  rateLimitedLog(
@@ -714,7 +740,7 @@ var EventShipper = class {
714
740
  if (!isPending) this.sticky.delete(eventId);
715
741
  return;
716
742
  }
717
- const p = postJson(url, payload, this.authHeaders(), opts);
743
+ const p = postJson(url, payload, this.requestHeaders(), opts);
718
744
  this.inFlight.add(p);
719
745
  try {
720
746
  try {
@@ -861,6 +887,10 @@ var TraceShipper = class {
861
887
  if (this.debug && this.localDebuggerUrl) {
862
888
  console.log(`${this.prefix} Local debugger mirroring: ${this.localDebuggerUrl}`);
863
889
  }
890
+ this.projectId = normalizeProjectId(opts.projectId, {
891
+ debug: this.debug,
892
+ prefix: this.prefix
893
+ });
864
894
  this.transformSpanHook = opts.transformSpan;
865
895
  this.disableDefaultRedaction = opts.disableDefaultRedaction === true;
866
896
  this.maxTextFieldCharsOpt = opts.maxTextFieldChars;
@@ -937,6 +967,9 @@ var TraceShipper = class {
937
967
  authHeaders() {
938
968
  return this.writeKey ? { Authorization: `Bearer ${this.writeKey}` } : {};
939
969
  }
970
+ requestHeaders() {
971
+ return { ...this.authHeaders(), ...projectIdHeaders(this.projectId) };
972
+ }
940
973
  startSpan(args) {
941
974
  var _a, _b;
942
975
  const ids = createSpanIds(args.parent);
@@ -1068,7 +1101,7 @@ var TraceShipper = class {
1068
1101
  endpoint: url
1069
1102
  });
1070
1103
  }
1071
- const p = postJson(url, body, this.authHeaders(), opts);
1104
+ const p = postJson(url, body, this.requestHeaders(), opts);
1072
1105
  this.inFlight.add(p);
1073
1106
  try {
1074
1107
  try {
@@ -1255,7 +1288,7 @@ globalThis.RAINDROP_ASYNC_LOCAL_STORAGE = async_hooks.AsyncLocalStorage;
1255
1288
  // package.json
1256
1289
  var package_default = {
1257
1290
  name: "@raindrop-ai/ai-sdk",
1258
- version: "0.0.34"};
1291
+ version: "0.0.36"};
1259
1292
 
1260
1293
  // src/internal/version.ts
1261
1294
  var libraryName = package_default.name;
@@ -2168,10 +2201,7 @@ var RaindropTelemetryIntegration = class {
2168
2201
  };
2169
2202
  /** Flush and stop the background flush timers. */
2170
2203
  this.shutdown = async () => {
2171
- await Promise.all([
2172
- this.eventShipper.shutdown(),
2173
- this.traceShipper.shutdown()
2174
- ]);
2204
+ await Promise.all([this.eventShipper.shutdown(), this.traceShipper.shutdown()]);
2175
2205
  };
2176
2206
  // ── onStart ─────────────────────────────────────────────────────────────
2177
2207
  this.onStart = (event) => {
@@ -2190,12 +2220,9 @@ var RaindropTelemetryIntegration = class {
2190
2220
  const explicitEventId = callMeta.eventId && !eventIdGenerated ? callMeta.eventId : void 0;
2191
2221
  const eventId = (_d = (_c = (_b = explicitEventId != null ? explicitEventId : (_a = this.defaultContext) == null ? void 0 : _a.eventId) != null ? _b : inherited == null ? void 0 : inherited.eventId) != null ? _c : callMeta.eventId) != null ? _d : randomUUID();
2192
2222
  const inheritedParent = inherited && inherited.eventId === eventId ? { traceIdB64: inherited.traceIdB64, spanIdB64: inherited.spanIdB64 } : void 0;
2193
- const { operationName, resourceName } = opName(
2194
- event.operationId,
2195
- functionId
2196
- );
2223
+ const { operationName, resourceName } = opName(event.operationId, functionId);
2197
2224
  const parentToolContext = !isEmbed && this.subagentWrapping ? getCurrentParentToolContext() : void 0;
2198
- const metadataSubagentName = !isEmbed && this.subagentWrapping && parentToolContext === void 0 ? typeof (metadata == null ? void 0 : metadata["ash.subagent.name"]) === "string" ? metadata["ash.subagent.name"] : void 0 : void 0;
2225
+ const metadataSubagentName = !isEmbed && this.subagentWrapping && parentToolContext === void 0 ? typeof (metadata == null ? void 0 : metadata["eve.subagent.name"]) === "string" ? metadata["eve.subagent.name"] : typeof (metadata == null ? void 0 : metadata["ash.subagent.name"]) === "string" ? metadata["ash.subagent.name"] : void 0 : void 0;
2199
2226
  const subagentName = (_e = parentToolContext == null ? void 0 : parentToolContext.toolName) != null ? _e : metadataSubagentName;
2200
2227
  let subagentToolCallSpan;
2201
2228
  let rootParentOverride;
@@ -2247,12 +2274,7 @@ var RaindropTelemetryIntegration = class {
2247
2274
  })
2248
2275
  )
2249
2276
  ] : [];
2250
- const embedAttrs = isEmbed && recordInputs ? event.operationId === "ai.embedMany" ? [
2251
- attrString(
2252
- "ai.values",
2253
- safeJsonWithUint8(event.value)
2254
- )
2255
- ] : [attrString("ai.value", safeJsonWithUint8(event.value))] : [];
2277
+ const embedAttrs = isEmbed && recordInputs ? event.operationId === "ai.embedMany" ? [attrString("ai.values", safeJsonWithUint8(event.value))] : [attrString("ai.value", safeJsonWithUint8(event.value))] : [];
2256
2278
  rootSpan = this.traceShipper.startSpan({
2257
2279
  name: event.operationId,
2258
2280
  parent: rootParentOverride != null ? rootParentOverride : inheritedParent,
@@ -2306,19 +2328,11 @@ var RaindropTelemetryIntegration = class {
2306
2328
  if (!(state == null ? void 0 : state.rootSpan) || !state.rootParent) return;
2307
2329
  const isStream = state.operationId === "ai.streamText" || state.operationId === "ai.streamObject";
2308
2330
  const stepOperationId = isStream ? `${state.operationId}.doStream` : `${state.operationId}.doGenerate`;
2309
- const { operationName, resourceName } = opName(
2310
- stepOperationId,
2311
- state.functionId
2312
- );
2331
+ const { operationName, resourceName } = opName(stepOperationId, state.functionId);
2313
2332
  const inputAttrs = [];
2314
2333
  if (state.recordInputs) {
2315
2334
  if (event.promptMessages) {
2316
- inputAttrs.push(
2317
- attrString(
2318
- "ai.prompt.messages",
2319
- safeJsonWithUint8(event.promptMessages)
2320
- )
2321
- );
2335
+ inputAttrs.push(attrString("ai.prompt.messages", safeJsonWithUint8(event.promptMessages)));
2322
2336
  }
2323
2337
  if (event.stepTools) {
2324
2338
  inputAttrs.push(
@@ -2333,10 +2347,7 @@ var RaindropTelemetryIntegration = class {
2333
2347
  }
2334
2348
  if (event.stepToolChoice != null) {
2335
2349
  inputAttrs.push(
2336
- attrString(
2337
- "ai.prompt.toolChoice",
2338
- safeJsonWithUint8(event.stepToolChoice)
2339
- )
2350
+ attrString("ai.prompt.toolChoice", safeJsonWithUint8(event.stepToolChoice))
2340
2351
  );
2341
2352
  }
2342
2353
  }
@@ -2471,16 +2482,8 @@ var RaindropTelemetryIntegration = class {
2471
2482
  this.onEmbedStart = (event) => {
2472
2483
  const state = this.getState(event.callId);
2473
2484
  if (!(state == null ? void 0 : state.rootSpan) || !state.rootParent) return;
2474
- const { operationName, resourceName } = opName(
2475
- event.operationId,
2476
- state.functionId
2477
- );
2478
- const inputAttrs = state.recordInputs ? [
2479
- attrString(
2480
- "ai.values",
2481
- safeJsonWithUint8(event.values)
2482
- )
2483
- ] : [];
2485
+ const { operationName, resourceName } = opName(event.operationId, state.functionId);
2486
+ const inputAttrs = state.recordInputs ? [attrString("ai.values", safeJsonWithUint8(event.values))] : [];
2484
2487
  const embedSpan = this.traceShipper.startSpan({
2485
2488
  name: event.operationId,
2486
2489
  parent: state.rootParent,
@@ -2504,12 +2507,7 @@ var RaindropTelemetryIntegration = class {
2504
2507
  if (!embedSpan) return;
2505
2508
  const outputAttrs = [];
2506
2509
  if (state.recordOutputs) {
2507
- outputAttrs.push(
2508
- attrString(
2509
- "ai.embeddings",
2510
- safeJsonWithUint8(event.embeddings)
2511
- )
2512
- );
2510
+ outputAttrs.push(attrString("ai.embeddings", safeJsonWithUint8(event.embeddings)));
2513
2511
  }
2514
2512
  if (((_a = event.usage) == null ? void 0 : _a.tokens) != null) {
2515
2513
  outputAttrs.push(attrInt("ai.usage.tokens", event.usage.tokens));
@@ -2727,10 +2725,7 @@ var RaindropTelemetryIntegration = class {
2727
2725
  toolExecutionStart(event) {
2728
2726
  const { toolCall } = event;
2729
2727
  const priorParent = getCurrentParentToolContext();
2730
- this.priorParentContexts.set(
2731
- toolCall.toolCallId,
2732
- priorParent != null ? priorParent : null
2733
- );
2728
+ this.priorParentContexts.set(toolCall.toolCallId, priorParent != null ? priorParent : null);
2734
2729
  enterParentToolContext({
2735
2730
  parentCallId: event.callId,
2736
2731
  toolCallId: toolCall.toolCallId,
@@ -2739,10 +2734,7 @@ var RaindropTelemetryIntegration = class {
2739
2734
  const state = this.getState(event.callId);
2740
2735
  state == null ? void 0 : state.parentContextToolCallIds.add(toolCall.toolCallId);
2741
2736
  if (!(state == null ? void 0 : state.stepParent)) return;
2742
- const { operationName, resourceName } = opName(
2743
- "ai.toolCall",
2744
- state.functionId
2745
- );
2737
+ const { operationName, resourceName } = opName("ai.toolCall", state.functionId);
2746
2738
  const inputAttrs = state.recordInputs ? [attrString("ai.toolCall.args", safeJsonWithUint8(toolCall.input))] : [];
2747
2739
  const toolSpan = this.traceShipper.startSpan({
2748
2740
  name: "ai.toolCall",
@@ -2819,10 +2811,7 @@ var RaindropTelemetryIntegration = class {
2819
2811
  }
2820
2812
  }
2821
2813
  for (const call of providerToolCalls) {
2822
- const { operationName, resourceName } = opName(
2823
- "ai.toolCall",
2824
- state.functionId
2825
- );
2814
+ const { operationName, resourceName } = opName("ai.toolCall", state.functionId);
2826
2815
  const inputAttrs = state.recordInputs ? [attrString("ai.toolCall.args", safeJsonWithUint8(call.input))] : [];
2827
2816
  const toolSpan = this.traceShipper.startSpan({
2828
2817
  name: "ai.toolCall",
@@ -2845,12 +2834,7 @@ var RaindropTelemetryIntegration = class {
2845
2834
  if ((resultPart == null ? void 0 : resultPart.type) === "tool-error") {
2846
2835
  this.traceShipper.endSpan(toolSpan, { error: resultPart.error });
2847
2836
  } else {
2848
- const outputAttrs = state.recordOutputs && resultPart && "output" in resultPart ? [
2849
- attrString(
2850
- "ai.toolCall.result",
2851
- safeJsonWithUint8(resultPart.output)
2852
- )
2853
- ] : [];
2837
+ const outputAttrs = state.recordOutputs && resultPart && "output" in resultPart ? [attrString("ai.toolCall.result", safeJsonWithUint8(resultPart.output))] : [];
2854
2838
  this.traceShipper.endSpan(toolSpan, { attributes: outputAttrs });
2855
2839
  }
2856
2840
  this.emitLive(state, "tool_result", call.toolName);
@@ -2900,9 +2884,7 @@ var RaindropTelemetryIntegration = class {
2900
2884
  attrInt("ai.usage.cachedInputTokens", usage.cachedInputTokens)
2901
2885
  );
2902
2886
  }
2903
- outputAttrs.push(
2904
- attrInt("ai.toolCall.count", state.toolCallCount)
2905
- );
2887
+ outputAttrs.push(attrInt("ai.toolCall.count", state.toolCallCount));
2906
2888
  this.traceShipper.endSpan(state.rootSpan, { attributes: outputAttrs });
2907
2889
  }
2908
2890
  this.finalizeGenerateEvent(
@@ -2955,13 +2937,9 @@ var RaindropTelemetryIntegration = class {
2955
2937
  const isMany = state.operationId === "ai.embedMany";
2956
2938
  if (state.recordOutputs) {
2957
2939
  if (isMany) {
2958
- outputAttrs.push(
2959
- attrString("ai.embeddings", safeJsonWithUint8(event.embedding))
2960
- );
2940
+ outputAttrs.push(attrString("ai.embeddings", safeJsonWithUint8(event.embedding)));
2961
2941
  } else {
2962
- outputAttrs.push(
2963
- attrString("ai.embedding", safeJsonWithUint8(event.embedding))
2964
- );
2942
+ outputAttrs.push(attrString("ai.embedding", safeJsonWithUint8(event.embedding)));
2965
2943
  }
2966
2944
  }
2967
2945
  if (((_a = event.usage) == null ? void 0 : _a.tokens) != null) {
@@ -5128,6 +5106,7 @@ function createRaindropAISDK(opts) {
5128
5106
  enabled: eventsEnabled,
5129
5107
  debug: ((_c = opts.events) == null ? void 0 : _c.debug) === true || envDebug,
5130
5108
  partialFlushMs: (_d = opts.events) == null ? void 0 : _d.partialFlushMs,
5109
+ projectId: opts.projectId,
5131
5110
  localDebuggerUrl
5132
5111
  });
5133
5112
  const traceShipper = new TraceShipper2({
@@ -5139,6 +5118,7 @@ function createRaindropAISDK(opts) {
5139
5118
  flushIntervalMs: (_g = opts.traces) == null ? void 0 : _g.flushIntervalMs,
5140
5119
  maxBatchSize: (_h = opts.traces) == null ? void 0 : _h.maxBatchSize,
5141
5120
  maxQueueSize: (_i = opts.traces) == null ? void 0 : _i.maxQueueSize,
5121
+ projectId: opts.projectId,
5142
5122
  localDebuggerUrl,
5143
5123
  transformSpan: (_j = opts.traces) == null ? void 0 : _j.transformSpan,
5144
5124
  disableDefaultRedaction: (_k = opts.traces) == null ? void 0 : _k.disableDefaultRedaction
@@ -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-OLOFN54C.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-NHSRCEYN.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-HYjRP6nV.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-Crm3oDAG.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-HYjRP6nV.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-Crm3oDAG.js';
2
2
 
3
3
  declare global {
4
4
  var RAINDROP_ASYNC_LOCAL_STORAGE: (new <T>() => {
@@ -4,7 +4,7 @@ var async_hooks = require('async_hooks');
4
4
 
5
5
  // src/index.workers.ts
6
6
 
7
- // ../core/dist/chunk-U5HUTMR5.js
7
+ // ../core/dist/chunk-SK6EJEO7.js
8
8
  function getCrypto() {
9
9
  const c = globalThis.crypto;
10
10
  return c;
@@ -401,6 +401,25 @@ function sendLocalDebuggerLiveEvent(event, options = {}) {
401
401
  ).catch(() => {
402
402
  });
403
403
  }
404
+ var PROJECT_ID_HEADER = "X-Raindrop-Project-Id";
405
+ var PROJECT_ID_SLUG_PATTERN = /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/;
406
+ function isValidProjectIdSlug(value) {
407
+ return PROJECT_ID_SLUG_PATTERN.test(value);
408
+ }
409
+ function normalizeProjectId(raw, opts) {
410
+ if (typeof raw !== "string") return void 0;
411
+ const trimmed = raw.trim();
412
+ if (!trimmed) return void 0;
413
+ if (!isValidProjectIdSlug(trimmed) && opts.debug) {
414
+ console.warn(
415
+ `${opts.prefix} projectId "${trimmed}" does not match slug ${PROJECT_ID_SLUG_PATTERN.source}; sending anyway \u2014 backend may reject with HTTP 400`
416
+ );
417
+ }
418
+ return trimmed;
419
+ }
420
+ function projectIdHeaders(projectId) {
421
+ return projectId ? { [PROJECT_ID_HEADER]: projectId } : {};
422
+ }
404
423
  var SHUTDOWN_DEADLINE_MS = 1e4;
405
424
  var POST_SHUTDOWN_TIMEOUT_MS = 5e3;
406
425
  function mergePatches(target, source) {
@@ -435,6 +454,10 @@ var EventShipper = class {
435
454
  if (this.debug && this.localDebuggerUrl) {
436
455
  console.log(`${this.prefix} Local debugger mirroring: ${this.localDebuggerUrl}`);
437
456
  }
457
+ this.projectId = normalizeProjectId(opts.projectId, {
458
+ debug: this.debug,
459
+ prefix: this.prefix
460
+ });
438
461
  const isNode = typeof process !== "undefined" && typeof process.version === "string";
439
462
  this.context = {
440
463
  library: {
@@ -453,6 +476,9 @@ var EventShipper = class {
453
476
  authHeaders() {
454
477
  return this.writeKey ? { Authorization: `Bearer ${this.writeKey}` } : {};
455
478
  }
479
+ requestHeaders() {
480
+ return { ...this.authHeaders(), ...projectIdHeaders(this.projectId) };
481
+ }
456
482
  /**
457
483
  * Build the retry/timeout options for one POST, honoring the shutdown
458
484
  * deadline. Returns `null` when the shutdown drain window is exhausted —
@@ -582,7 +608,7 @@ var EventShipper = class {
582
608
  return;
583
609
  }
584
610
  try {
585
- await postJson(url, body, this.authHeaders(), opts);
611
+ await postJson(url, body, this.requestHeaders(), opts);
586
612
  } catch (err) {
587
613
  const msg = err instanceof Error ? err.message : String(err);
588
614
  rateLimitedLog(
@@ -618,7 +644,7 @@ var EventShipper = class {
618
644
  return;
619
645
  }
620
646
  try {
621
- await postJson(url, body, this.authHeaders(), opts);
647
+ await postJson(url, body, this.requestHeaders(), opts);
622
648
  } catch (err) {
623
649
  const msg = err instanceof Error ? err.message : String(err);
624
650
  rateLimitedLog(
@@ -714,7 +740,7 @@ var EventShipper = class {
714
740
  if (!isPending) this.sticky.delete(eventId);
715
741
  return;
716
742
  }
717
- const p = postJson(url, payload, this.authHeaders(), opts);
743
+ const p = postJson(url, payload, this.requestHeaders(), opts);
718
744
  this.inFlight.add(p);
719
745
  try {
720
746
  try {
@@ -861,6 +887,10 @@ var TraceShipper = class {
861
887
  if (this.debug && this.localDebuggerUrl) {
862
888
  console.log(`${this.prefix} Local debugger mirroring: ${this.localDebuggerUrl}`);
863
889
  }
890
+ this.projectId = normalizeProjectId(opts.projectId, {
891
+ debug: this.debug,
892
+ prefix: this.prefix
893
+ });
864
894
  this.transformSpanHook = opts.transformSpan;
865
895
  this.disableDefaultRedaction = opts.disableDefaultRedaction === true;
866
896
  this.maxTextFieldCharsOpt = opts.maxTextFieldChars;
@@ -937,6 +967,9 @@ var TraceShipper = class {
937
967
  authHeaders() {
938
968
  return this.writeKey ? { Authorization: `Bearer ${this.writeKey}` } : {};
939
969
  }
970
+ requestHeaders() {
971
+ return { ...this.authHeaders(), ...projectIdHeaders(this.projectId) };
972
+ }
940
973
  startSpan(args) {
941
974
  var _a, _b;
942
975
  const ids = createSpanIds(args.parent);
@@ -1068,7 +1101,7 @@ var TraceShipper = class {
1068
1101
  endpoint: url
1069
1102
  });
1070
1103
  }
1071
- const p = postJson(url, body, this.authHeaders(), opts);
1104
+ const p = postJson(url, body, this.requestHeaders(), opts);
1072
1105
  this.inFlight.add(p);
1073
1106
  try {
1074
1107
  try {
@@ -1255,7 +1288,7 @@ globalThis.RAINDROP_ASYNC_LOCAL_STORAGE = async_hooks.AsyncLocalStorage;
1255
1288
  // package.json
1256
1289
  var package_default = {
1257
1290
  name: "@raindrop-ai/ai-sdk",
1258
- version: "0.0.34"};
1291
+ version: "0.0.36"};
1259
1292
 
1260
1293
  // src/internal/version.ts
1261
1294
  var libraryName = package_default.name;
@@ -2168,10 +2201,7 @@ var RaindropTelemetryIntegration = class {
2168
2201
  };
2169
2202
  /** Flush and stop the background flush timers. */
2170
2203
  this.shutdown = async () => {
2171
- await Promise.all([
2172
- this.eventShipper.shutdown(),
2173
- this.traceShipper.shutdown()
2174
- ]);
2204
+ await Promise.all([this.eventShipper.shutdown(), this.traceShipper.shutdown()]);
2175
2205
  };
2176
2206
  // ── onStart ─────────────────────────────────────────────────────────────
2177
2207
  this.onStart = (event) => {
@@ -2190,12 +2220,9 @@ var RaindropTelemetryIntegration = class {
2190
2220
  const explicitEventId = callMeta.eventId && !eventIdGenerated ? callMeta.eventId : void 0;
2191
2221
  const eventId = (_d = (_c = (_b = explicitEventId != null ? explicitEventId : (_a = this.defaultContext) == null ? void 0 : _a.eventId) != null ? _b : inherited == null ? void 0 : inherited.eventId) != null ? _c : callMeta.eventId) != null ? _d : randomUUID();
2192
2222
  const inheritedParent = inherited && inherited.eventId === eventId ? { traceIdB64: inherited.traceIdB64, spanIdB64: inherited.spanIdB64 } : void 0;
2193
- const { operationName, resourceName } = opName(
2194
- event.operationId,
2195
- functionId
2196
- );
2223
+ const { operationName, resourceName } = opName(event.operationId, functionId);
2197
2224
  const parentToolContext = !isEmbed && this.subagentWrapping ? getCurrentParentToolContext() : void 0;
2198
- const metadataSubagentName = !isEmbed && this.subagentWrapping && parentToolContext === void 0 ? typeof (metadata == null ? void 0 : metadata["ash.subagent.name"]) === "string" ? metadata["ash.subagent.name"] : void 0 : void 0;
2225
+ const metadataSubagentName = !isEmbed && this.subagentWrapping && parentToolContext === void 0 ? typeof (metadata == null ? void 0 : metadata["eve.subagent.name"]) === "string" ? metadata["eve.subagent.name"] : typeof (metadata == null ? void 0 : metadata["ash.subagent.name"]) === "string" ? metadata["ash.subagent.name"] : void 0 : void 0;
2199
2226
  const subagentName = (_e = parentToolContext == null ? void 0 : parentToolContext.toolName) != null ? _e : metadataSubagentName;
2200
2227
  let subagentToolCallSpan;
2201
2228
  let rootParentOverride;
@@ -2247,12 +2274,7 @@ var RaindropTelemetryIntegration = class {
2247
2274
  })
2248
2275
  )
2249
2276
  ] : [];
2250
- const embedAttrs = isEmbed && recordInputs ? event.operationId === "ai.embedMany" ? [
2251
- attrString(
2252
- "ai.values",
2253
- safeJsonWithUint8(event.value)
2254
- )
2255
- ] : [attrString("ai.value", safeJsonWithUint8(event.value))] : [];
2277
+ const embedAttrs = isEmbed && recordInputs ? event.operationId === "ai.embedMany" ? [attrString("ai.values", safeJsonWithUint8(event.value))] : [attrString("ai.value", safeJsonWithUint8(event.value))] : [];
2256
2278
  rootSpan = this.traceShipper.startSpan({
2257
2279
  name: event.operationId,
2258
2280
  parent: rootParentOverride != null ? rootParentOverride : inheritedParent,
@@ -2306,19 +2328,11 @@ var RaindropTelemetryIntegration = class {
2306
2328
  if (!(state == null ? void 0 : state.rootSpan) || !state.rootParent) return;
2307
2329
  const isStream = state.operationId === "ai.streamText" || state.operationId === "ai.streamObject";
2308
2330
  const stepOperationId = isStream ? `${state.operationId}.doStream` : `${state.operationId}.doGenerate`;
2309
- const { operationName, resourceName } = opName(
2310
- stepOperationId,
2311
- state.functionId
2312
- );
2331
+ const { operationName, resourceName } = opName(stepOperationId, state.functionId);
2313
2332
  const inputAttrs = [];
2314
2333
  if (state.recordInputs) {
2315
2334
  if (event.promptMessages) {
2316
- inputAttrs.push(
2317
- attrString(
2318
- "ai.prompt.messages",
2319
- safeJsonWithUint8(event.promptMessages)
2320
- )
2321
- );
2335
+ inputAttrs.push(attrString("ai.prompt.messages", safeJsonWithUint8(event.promptMessages)));
2322
2336
  }
2323
2337
  if (event.stepTools) {
2324
2338
  inputAttrs.push(
@@ -2333,10 +2347,7 @@ var RaindropTelemetryIntegration = class {
2333
2347
  }
2334
2348
  if (event.stepToolChoice != null) {
2335
2349
  inputAttrs.push(
2336
- attrString(
2337
- "ai.prompt.toolChoice",
2338
- safeJsonWithUint8(event.stepToolChoice)
2339
- )
2350
+ attrString("ai.prompt.toolChoice", safeJsonWithUint8(event.stepToolChoice))
2340
2351
  );
2341
2352
  }
2342
2353
  }
@@ -2471,16 +2482,8 @@ var RaindropTelemetryIntegration = class {
2471
2482
  this.onEmbedStart = (event) => {
2472
2483
  const state = this.getState(event.callId);
2473
2484
  if (!(state == null ? void 0 : state.rootSpan) || !state.rootParent) return;
2474
- const { operationName, resourceName } = opName(
2475
- event.operationId,
2476
- state.functionId
2477
- );
2478
- const inputAttrs = state.recordInputs ? [
2479
- attrString(
2480
- "ai.values",
2481
- safeJsonWithUint8(event.values)
2482
- )
2483
- ] : [];
2485
+ const { operationName, resourceName } = opName(event.operationId, state.functionId);
2486
+ const inputAttrs = state.recordInputs ? [attrString("ai.values", safeJsonWithUint8(event.values))] : [];
2484
2487
  const embedSpan = this.traceShipper.startSpan({
2485
2488
  name: event.operationId,
2486
2489
  parent: state.rootParent,
@@ -2504,12 +2507,7 @@ var RaindropTelemetryIntegration = class {
2504
2507
  if (!embedSpan) return;
2505
2508
  const outputAttrs = [];
2506
2509
  if (state.recordOutputs) {
2507
- outputAttrs.push(
2508
- attrString(
2509
- "ai.embeddings",
2510
- safeJsonWithUint8(event.embeddings)
2511
- )
2512
- );
2510
+ outputAttrs.push(attrString("ai.embeddings", safeJsonWithUint8(event.embeddings)));
2513
2511
  }
2514
2512
  if (((_a = event.usage) == null ? void 0 : _a.tokens) != null) {
2515
2513
  outputAttrs.push(attrInt("ai.usage.tokens", event.usage.tokens));
@@ -2727,10 +2725,7 @@ var RaindropTelemetryIntegration = class {
2727
2725
  toolExecutionStart(event) {
2728
2726
  const { toolCall } = event;
2729
2727
  const priorParent = getCurrentParentToolContext();
2730
- this.priorParentContexts.set(
2731
- toolCall.toolCallId,
2732
- priorParent != null ? priorParent : null
2733
- );
2728
+ this.priorParentContexts.set(toolCall.toolCallId, priorParent != null ? priorParent : null);
2734
2729
  enterParentToolContext({
2735
2730
  parentCallId: event.callId,
2736
2731
  toolCallId: toolCall.toolCallId,
@@ -2739,10 +2734,7 @@ var RaindropTelemetryIntegration = class {
2739
2734
  const state = this.getState(event.callId);
2740
2735
  state == null ? void 0 : state.parentContextToolCallIds.add(toolCall.toolCallId);
2741
2736
  if (!(state == null ? void 0 : state.stepParent)) return;
2742
- const { operationName, resourceName } = opName(
2743
- "ai.toolCall",
2744
- state.functionId
2745
- );
2737
+ const { operationName, resourceName } = opName("ai.toolCall", state.functionId);
2746
2738
  const inputAttrs = state.recordInputs ? [attrString("ai.toolCall.args", safeJsonWithUint8(toolCall.input))] : [];
2747
2739
  const toolSpan = this.traceShipper.startSpan({
2748
2740
  name: "ai.toolCall",
@@ -2819,10 +2811,7 @@ var RaindropTelemetryIntegration = class {
2819
2811
  }
2820
2812
  }
2821
2813
  for (const call of providerToolCalls) {
2822
- const { operationName, resourceName } = opName(
2823
- "ai.toolCall",
2824
- state.functionId
2825
- );
2814
+ const { operationName, resourceName } = opName("ai.toolCall", state.functionId);
2826
2815
  const inputAttrs = state.recordInputs ? [attrString("ai.toolCall.args", safeJsonWithUint8(call.input))] : [];
2827
2816
  const toolSpan = this.traceShipper.startSpan({
2828
2817
  name: "ai.toolCall",
@@ -2845,12 +2834,7 @@ var RaindropTelemetryIntegration = class {
2845
2834
  if ((resultPart == null ? void 0 : resultPart.type) === "tool-error") {
2846
2835
  this.traceShipper.endSpan(toolSpan, { error: resultPart.error });
2847
2836
  } else {
2848
- const outputAttrs = state.recordOutputs && resultPart && "output" in resultPart ? [
2849
- attrString(
2850
- "ai.toolCall.result",
2851
- safeJsonWithUint8(resultPart.output)
2852
- )
2853
- ] : [];
2837
+ const outputAttrs = state.recordOutputs && resultPart && "output" in resultPart ? [attrString("ai.toolCall.result", safeJsonWithUint8(resultPart.output))] : [];
2854
2838
  this.traceShipper.endSpan(toolSpan, { attributes: outputAttrs });
2855
2839
  }
2856
2840
  this.emitLive(state, "tool_result", call.toolName);
@@ -2900,9 +2884,7 @@ var RaindropTelemetryIntegration = class {
2900
2884
  attrInt("ai.usage.cachedInputTokens", usage.cachedInputTokens)
2901
2885
  );
2902
2886
  }
2903
- outputAttrs.push(
2904
- attrInt("ai.toolCall.count", state.toolCallCount)
2905
- );
2887
+ outputAttrs.push(attrInt("ai.toolCall.count", state.toolCallCount));
2906
2888
  this.traceShipper.endSpan(state.rootSpan, { attributes: outputAttrs });
2907
2889
  }
2908
2890
  this.finalizeGenerateEvent(
@@ -2955,13 +2937,9 @@ var RaindropTelemetryIntegration = class {
2955
2937
  const isMany = state.operationId === "ai.embedMany";
2956
2938
  if (state.recordOutputs) {
2957
2939
  if (isMany) {
2958
- outputAttrs.push(
2959
- attrString("ai.embeddings", safeJsonWithUint8(event.embedding))
2960
- );
2940
+ outputAttrs.push(attrString("ai.embeddings", safeJsonWithUint8(event.embedding)));
2961
2941
  } else {
2962
- outputAttrs.push(
2963
- attrString("ai.embedding", safeJsonWithUint8(event.embedding))
2964
- );
2942
+ outputAttrs.push(attrString("ai.embedding", safeJsonWithUint8(event.embedding)));
2965
2943
  }
2966
2944
  }
2967
2945
  if (((_a = event.usage) == null ? void 0 : _a.tokens) != null) {
@@ -5128,6 +5106,7 @@ function createRaindropAISDK(opts) {
5128
5106
  enabled: eventsEnabled,
5129
5107
  debug: ((_c = opts.events) == null ? void 0 : _c.debug) === true || envDebug,
5130
5108
  partialFlushMs: (_d = opts.events) == null ? void 0 : _d.partialFlushMs,
5109
+ projectId: opts.projectId,
5131
5110
  localDebuggerUrl
5132
5111
  });
5133
5112
  const traceShipper = new TraceShipper2({
@@ -5139,6 +5118,7 @@ function createRaindropAISDK(opts) {
5139
5118
  flushIntervalMs: (_g = opts.traces) == null ? void 0 : _g.flushIntervalMs,
5140
5119
  maxBatchSize: (_h = opts.traces) == null ? void 0 : _h.maxBatchSize,
5141
5120
  maxQueueSize: (_i = opts.traces) == null ? void 0 : _i.maxQueueSize,
5121
+ projectId: opts.projectId,
5142
5122
  localDebuggerUrl,
5143
5123
  transformSpan: (_j = opts.traces) == null ? void 0 : _j.transformSpan,
5144
5124
  disableDefaultRedaction: (_k = opts.traces) == null ? void 0 : _k.disableDefaultRedaction