{"version":3,"sources":["../src/features.ts","../src/metrics.ts","../src/utils.ts","../src/bridge.ts","../src/tracing.ts"],"names":["coreFeatures","SpanType","tracer","BaseExporter","getExternalParentId","SpanTypeEnum","omitKeys"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Feature detection for paired @mastra/core and @mastra/observability versions.\n *\n * `coreFeatures` is a hard peer dependency, so it can be imported statically.\n * `observabilityFeatures` is loaded via dynamic import so this exporter degrades\n * gracefully against older `@mastra/observability` versions that don't export it\n * (per the pattern documented in `observability/mastra/src/features.ts`).\n *\n * Detection runs once at module load. Callers consume the result through the\n * sync `isModelInferenceEnabled()` accessor, which conservatively returns\n * `false` until detection settles — long enough only to cover the microtask\n * window before any spans are emitted in practice.\n */\n\nimport { coreFeatures } from '@mastra/core/features';\n\nconst FEATURE = 'model-inference-span';\n\nlet observabilityFeatures: ReadonlySet<string> | undefined;\nlet featureLoadPromise: Promise<void> | undefined;\n\nfunction loadObservabilityFeatures(): Promise<void> {\n  if (!featureLoadPromise) {\n    featureLoadPromise = import('@mastra/observability')\n      .then(mod => {\n        observabilityFeatures = (mod as { observabilityFeatures?: ReadonlySet<string> }).observabilityFeatures;\n      })\n      .catch(() => {\n        // Older @mastra/observability without the `observabilityFeatures` export.\n      });\n  }\n  return featureLoadPromise;\n}\n\n// Kick off detection at module load so the cached value is ready by the time\n// the first span is emitted.\nvoid loadObservabilityFeatures();\n\n/**\n * Returns true when both packages report the `model-inference-span` feature,\n * meaning MODEL_INFERENCE spans are emitted by the tracker. Drives the\n * Datadog kind mapping and usage-source switch (legacy: MODEL_STEP carries\n * 'llm' kind + usage; new: MODEL_INFERENCE does).\n */\nexport function isModelInferenceEnabled(): boolean {\n  return observabilityFeatures?.has(FEATURE) === true && coreFeatures.has(FEATURE);\n}\n\n/**\n * @internal Test-only override. Allows tests to simulate a paired older or\n * newer `@mastra/observability` without juggling dynamic imports.\n */\nexport function __setObservabilityFeaturesForTest(features: ReadonlySet<string> | undefined): void {\n  observabilityFeatures = features;\n  // Mark detection complete so isModelInferenceEnabled stops waiting.\n  featureLoadPromise = Promise.resolve();\n}\n","import type { UsageStats } from '@mastra/core/observability';\nimport type tracer from 'dd-trace';\n\ntype DatadogAnnotationMetrics = tracer.llmobs.AnnotationOptions['metrics'];\n\nexport function formatUsageMetrics(usage?: UsageStats): DatadogAnnotationMetrics | undefined {\n  if (!usage) return undefined;\n\n  const result: DatadogAnnotationMetrics = {};\n\n  const inputTokens = usage.inputTokens;\n  if (inputTokens !== undefined) result.inputTokens = inputTokens;\n\n  const outputTokens = usage.outputTokens;\n  if (outputTokens !== undefined) result.outputTokens = outputTokens;\n\n  if (inputTokens !== undefined && outputTokens !== undefined) {\n    result.totalTokens = inputTokens + outputTokens;\n  }\n\n  if (usage?.outputDetails?.reasoning !== undefined) {\n    result.reasoningOutputTokens = usage.outputDetails.reasoning;\n  }\n\n  const cacheReadTokens = usage?.inputDetails?.cacheRead;\n  if (cacheReadTokens !== undefined) {\n    result.cacheReadTokens = cacheReadTokens;\n  }\n\n  const cacheWriteTokens = usage?.inputDetails?.cacheWrite;\n  if (cacheWriteTokens !== undefined) {\n    result.cacheWriteTokens = cacheWriteTokens;\n  }\n\n  return Object.keys(result).length > 0 ? result : undefined;\n}\n","/**\n * Utility functions for Datadog LLM Observability Exporter\n */\n\nimport { SpanType } from '@mastra/core/observability';\nimport tracer from 'dd-trace';\nimport { isModelInferenceEnabled } from './features';\n\n/**\n * Datadog LLM Observability span kinds.\n */\nexport type DatadogSpanKind = 'llm' | 'agent' | 'workflow' | 'tool' | 'task' | 'retrieval' | 'embedding';\n\ntype DatadogToolCall = {\n  name?: string;\n  arguments?: Record<string, any>;\n  toolId?: string;\n  type?: string;\n};\n\ntype DatadogMessage = {\n  role: string;\n  content: string;\n  toolCalls?: DatadogToolCall[];\n};\n\n/**\n * Maps Mastra SpanTypes to Datadog LLMObs span kinds for the legacy hierarchy\n * (no `model-inference-span` feature). MODEL_STEP is the actual API call here\n * because MODEL_INFERENCE doesn't exist.\n *\n * Unmapped types fall back to 'task'.\n */\nconst SPAN_TYPE_TO_KIND_LEGACY: Partial<Record<SpanType, DatadogSpanKind>> = {\n  [SpanType.AGENT_RUN]: 'agent',\n  [SpanType.MODEL_GENERATION]: 'workflow',\n  [SpanType.MODEL_STEP]: 'llm',\n  [SpanType.TOOL_CALL]: 'tool',\n  [SpanType.MCP_TOOL_CALL]: 'tool',\n  [SpanType.WORKFLOW_RUN]: 'workflow',\n};\n\n/**\n * Maps Mastra SpanTypes to Datadog LLMObs span kinds for the new hierarchy\n * (`model-inference-span` feature). MODEL_INFERENCE is the LLM API call;\n * MODEL_STEP wraps processors + inference + tool execution as a workflow.\n *\n * Unmapped types fall back to 'task'.\n */\nconst SPAN_TYPE_TO_KIND_INFERENCE: Partial<Record<SpanType, DatadogSpanKind>> = {\n  [SpanType.AGENT_RUN]: 'agent',\n  [SpanType.MODEL_GENERATION]: 'workflow',\n  [SpanType.MODEL_STEP]: 'workflow',\n  [SpanType.MODEL_INFERENCE]: 'llm',\n  [SpanType.TOOL_CALL]: 'tool',\n  [SpanType.MCP_TOOL_CALL]: 'tool',\n  [SpanType.WORKFLOW_RUN]: 'workflow',\n};\n\n/**\n * Resolves the active span-type → Datadog kind mapping based on whether the\n * paired @mastra/core + @mastra/observability emit MODEL_INFERENCE spans.\n * Re-evaluated on each call so tests can flip the feature flag at runtime.\n */\nexport function getSpanTypeToKind(): Partial<Record<SpanType, DatadogSpanKind>> {\n  return isModelInferenceEnabled() ? SPAN_TYPE_TO_KIND_INFERENCE : SPAN_TYPE_TO_KIND_LEGACY;\n}\n\n/** @deprecated Prefer `getSpanTypeToKind()` so the mapping reflects the active feature flag. */\nexport const SPAN_TYPE_TO_KIND: Partial<Record<SpanType, DatadogSpanKind>> = SPAN_TYPE_TO_KIND_LEGACY;\n\n/**\n * Singleton flag to prevent multiple tracer initializations.\n * dd-trace should only be initialized once per process.\n */\nconst tracerInitFlag = { done: false };\n\n/**\n * Ensures dd-trace is initialized exactly once.\n * Respects any existing tracer initialization by the application.\n */\nexport function ensureTracer(config: {\n  mlApp: string;\n  site: string;\n  apiKey?: string;\n  agentless: boolean;\n  service?: string;\n  env?: string;\n  integrationsEnabled?: boolean;\n}): void {\n  if (tracerInitFlag.done) return;\n\n  // Set environment variables for dd-trace to pick up\n  // (LLMObsEnableOptions only accepts mlApp and agentlessEnabled)\n  // Always set when config is provided to ensure explicit config takes precedence\n  // over any stale env vars that may already be set in the process\n  if (config.site) {\n    process.env.DD_SITE = config.site;\n  }\n  if (config.apiKey) {\n    process.env.DD_API_KEY = config.apiKey;\n  }\n\n  // Check if tracer was already started by the application\n  const alreadyStarted = (tracer as any)._tracer?.started;\n\n  if (!alreadyStarted) {\n    tracer.init({\n      service: config.service || config.mlApp,\n      env: config.env || process.env.DD_ENV,\n      // Disable automatic integrations by default to avoid surprise instrumentation\n      plugins: config.integrationsEnabled ?? false,\n    });\n  }\n\n  // Enable LLM Observability with the resolved configuration\n  tracer.llmobs.enable({\n    mlApp: config.mlApp,\n    agentlessEnabled: config.agentless,\n  });\n\n  tracerInitFlag.done = true;\n}\n\n/**\n * Returns the Datadog kind for a Mastra span type, using the mapping that\n * matches the active span hierarchy (legacy vs MODEL_INFERENCE).\n */\nexport function kindFor(spanType: SpanType): DatadogSpanKind {\n  return getSpanTypeToKind()[spanType] || 'task';\n}\n\n/**\n * Converts a value to a Date object.\n */\nexport function toDate(value: Date | string | number): Date {\n  return value instanceof Date ? value : new Date(value);\n}\n\n/**\n * Safely stringifies data, handling circular references.\n */\nexport function safeStringify(data: unknown): string {\n  try {\n    return JSON.stringify(data) ?? '';\n  } catch {\n    if (typeof data === 'object' && data !== null) {\n      return `[Non-serializable ${data.constructor?.name || 'Object'}]`;\n    }\n    return String(data);\n  }\n}\n\n/**\n * Checks if data is already in message array format ({role, content}[]).\n */\nfunction isMessageArray(data: any): data is Array<{ role: string; content: any; toolCalls?: DatadogToolCall[] }> {\n  return Array.isArray(data) && data.every(m => m?.role && (m?.content !== undefined || Array.isArray(m.toolCalls)));\n}\n\nfunction isModelDataSpan(spanType: SpanType): boolean {\n  return (\n    spanType === SpanType.MODEL_GENERATION || spanType === SpanType.MODEL_STEP || spanType === SpanType.MODEL_INFERENCE\n  );\n}\n\n/**\n * Checks if data is in Gemini content array format ({role, parts}[]).\n */\nfunction isGeminiContentArray(data: any): data is Array<{ role: string; parts: any[] }> {\n  return Array.isArray(data) && data.every(m => m?.role && Array.isArray(m?.parts));\n}\n\nfunction toMessageContent(content: any): string {\n  return typeof content === 'string' ? content : safeStringify(content);\n}\n\n/**\n * Maps a {role, content}[] message array into the Datadog message shape,\n * stringifying any non-string content (e.g. multimodal part arrays).\n */\nfunction toDatadogMessages(\n  messages: Array<{ role: string; content: any; toolCalls?: DatadogToolCall[] }>,\n): DatadogMessage[] {\n  return messages\n    .map(m => {\n      const message: DatadogMessage = {\n        role: m.role,\n        content: m.content == null ? '' : toMessageContent(m.content),\n      };\n      if (Array.isArray(m.toolCalls) && m.toolCalls.length > 0) {\n        // Normalize to Datadog's tool-call shape ({name, arguments, toolId, type}).\n        // Raw Mastra tool calls ({toolName, toolCallId, args}) are not recognized by\n        // dd-trace's tagger and would be emitted as empty objects, dropping the tool\n        // call from the LLM input in Datadog.\n        message.toolCalls = toDatadogToolCalls(m.toolCalls);\n      }\n      return message;\n    })\n    .filter(m => !(m.role === 'user' && m.content.trim().length === 0));\n}\n\nfunction parseToolArguments(args: unknown): Record<string, any> | undefined {\n  if (args == null) return undefined;\n  if (typeof args === 'string') {\n    try {\n      const parsed = JSON.parse(args);\n      if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n        return parsed;\n      }\n    } catch {\n      // Datadog's tool-call schema expects an object. Preserve opaque strings\n      // under a stable key instead of dropping the argument payload.\n    }\n    return { value: args };\n  }\n  if (typeof args === 'object' && !Array.isArray(args)) return args as Record<string, any>;\n  return { value: args };\n}\n\nfunction toDatadogToolCalls(toolCalls: any[]): DatadogToolCall[] {\n  // Accept both raw Mastra tool calls ({toolName, args, toolCallId}) and\n  // already-normalized Datadog tool calls ({name, arguments, toolId}) so this is\n  // idempotent — callers may pass messages that were normalized upstream.\n  return toolCalls.map(c => ({\n    name: c?.toolName ?? c?.name ?? c?.function?.name ?? 'unknown',\n    arguments: parseToolArguments(c?.args ?? c?.input ?? c?.arguments ?? c?.function?.arguments),\n    toolId: c?.toolCallId ?? c?.toolId ?? c?.id,\n    type: c?.type === 'function' ? c.type : 'function',\n  }));\n}\n\n/**\n * Converts a Gemini content item to Datadog message format.\n * Extracts text from parts, skips binary data to avoid bloating traces.\n */\nfunction geminiContentToMessage(item: { role: string; parts: any[] }): { role: string; content: string } {\n  const text = item.parts\n    .map(p => {\n      if (typeof p === 'string') return p;\n      if (p?.text) return p.text;\n      if (p?.inlineData) return `[${p.inlineData.mimeType ?? 'binary'}]`;\n      if (p?.functionCall) return `[tool: ${p.functionCall.name ?? 'unknown'}]`;\n      return safeStringify(p);\n    })\n    .join('');\n  return { role: item.role, content: text };\n}\n\n/**\n * Formats input data for Datadog annotations.\n * Model spans use message array format; others use raw or stringified data.\n */\nexport function formatInput(input: any, spanType: SpanType): any {\n  // Model spans expect {role, content}[] format\n  if (isModelDataSpan(spanType)) {\n    // Already in message format\n    if (isMessageArray(input)) {\n      return toDatadogMessages(input);\n    }\n    // Gemini format: {role, parts} → normalize to {role, content}\n    if (isGeminiContentArray(input)) {\n      return toDatadogMessages(input.map(geminiContentToMessage));\n    }\n    // Mastra wraps MODEL_GENERATION input as { messages, schema? } and Gemini\n    // request bodies use { contents }. Unwrap so we don't bury the message array\n    // inside a single stringified user-message content (double-encoded JSON).\n    if (input && typeof input === 'object' && !Array.isArray(input)) {\n      if (isMessageArray((input as any).messages)) {\n        return toDatadogMessages((input as any).messages);\n      }\n      if (isGeminiContentArray((input as any).messages)) {\n        return toDatadogMessages((input as any).messages.map(geminiContentToMessage));\n      }\n      if (isGeminiContentArray((input as any).contents)) {\n        return toDatadogMessages((input as any).contents.map(geminiContentToMessage));\n      }\n    }\n    // String input becomes user message\n    if (typeof input === 'string') {\n      return toDatadogMessages([{ role: 'user', content: input }]);\n    }\n    // Object input gets stringified as user message\n    return toDatadogMessages([{ role: 'user', content: safeStringify(input) }]);\n  }\n\n  // Non-model spans: pass through strings/arrays, stringify objects\n  if (typeof input === 'string' || Array.isArray(input)) return input;\n  return safeStringify(input);\n}\n\n/**\n * Formats output data for Datadog annotations.\n * Model spans use message array format; others use raw or stringified data.\n */\nexport function formatOutput(output: any, spanType: SpanType): any {\n  // Model spans expect {role, content}[] format\n  if (isModelDataSpan(spanType)) {\n    // Already in message format\n    if (isMessageArray(output)) {\n      return toDatadogMessages(output);\n    }\n    // String output becomes assistant message\n    if (typeof output === 'string') {\n      return [{ role: 'assistant', content: output }];\n    }\n    // AI SDK shape: { text, object, reasoning, toolCalls, ... }.\n    // Prefer structured tool-call messages when present so Datadog renders\n    // them as tool-call blocks instead of escaped JSON or text summaries.\n    if (output && typeof output === 'object') {\n      if (Array.isArray(output.toolCalls) && output.toolCalls.length > 0) {\n        return [\n          {\n            role: 'assistant',\n            content: typeof output.text === 'string' ? output.text : '',\n            toolCalls: toDatadogToolCalls(output.toolCalls),\n          },\n        ];\n      }\n      if (typeof output.text === 'string' && output.text.length > 0) {\n        return [{ role: 'assistant', content: output.text }];\n      }\n      if (output.object !== undefined) {\n        return [{ role: 'assistant', content: safeStringify(output.object) }];\n      }\n    }\n    // Other objects get stringified as assistant message\n    return [{ role: 'assistant', content: safeStringify(output) }];\n  }\n\n  // Non-model spans: pass through strings, stringify objects\n  if (typeof output === 'string') return output;\n  return safeStringify(output);\n}\n","/**\n * Datadog Bridge for Mastra Observability\n *\n * This bridge enables bidirectional integration with dd-trace:\n * 1. Creates real dd-trace APM spans eagerly when Mastra spans are created\n * 2. Activates spans in dd-trace's scope so auto-instrumented operations\n *    (HTTP requests, database queries, etc.) have correct parent spans\n * 3. Registers those same spans with Datadog LLMObs and annotates them\n *    before finish, avoiding a second synthetic APM span tree\n *\n * This fixes the core problem with the DatadogExporter: because the exporter\n * creates LLMObs spans retroactively (after execution completes), there is no\n * active dd-trace span in scope when tools and processors make outbound calls.\n * dd-trace's auto-instrumentation can't find the correct parent, so APM spans\n * fall back to the nearest active span (typically the request handler).\n */\n\nimport type {\n  TracingEvent,\n  AnyExportedSpan,\n  ModelGenerationAttributes,\n  ModelInferenceAttributes,\n  ModelStepAttributes,\n  ObservabilityBridge,\n  CreateSpanOptions,\n  ScoreEvent,\n  SpanType,\n  SpanIds,\n} from '@mastra/core/observability';\nimport { SpanType as SpanTypeEnum } from '@mastra/core/observability';\nimport { omitKeys } from '@mastra/core/utils';\nimport { BaseExporter, getExternalParentId } from '@mastra/observability';\nimport type { BaseExporterConfig } from '@mastra/observability';\nimport tracer from 'dd-trace';\nimport { isModelInferenceEnabled } from './features';\nimport { formatUsageMetrics } from './metrics';\nimport { ensureTracer, formatInput, formatOutput, kindFor, toDate } from './utils';\nimport type { DatadogSpanKind } from './utils';\n\n// These types model dd-trace internals, not its public API surface.\n// The bridge uses them intentionally for experimental LLM Observability support\n// and they should be reviewed when upgrading dd-trace.\ntype LLMObsTagger = {\n  registerLLMObsSpan: (\n    span: any,\n    options: {\n      parent?: any;\n      kind: DatadogSpanKind;\n      name: string;\n      userId?: string;\n      sessionId?: string;\n      modelName?: string;\n      modelProvider?: string;\n    },\n  ) => void;\n};\n\ntype LLMObsInternalApi = {\n  _activate?: <T>(span: any, options: Record<string, never> | undefined, fn: () => T) => T;\n};\n\ninterface TraceContext {\n  userId?: string;\n  sessionId?: string;\n}\n\nfunction flushApmExporter(): Promise<void> {\n  const exporterFlush = (tracer as any)?._tracer?._exporter?.flush;\n  if (typeof exporterFlush !== 'function') {\n    return Promise.resolve();\n  }\n\n  return new Promise((resolve, reject) => {\n    let settled = false;\n\n    const done = (error?: unknown) => {\n      if (settled) return;\n      settled = true;\n\n      if (error) {\n        reject(error);\n        return;\n      }\n\n      resolve();\n    };\n\n    try {\n      exporterFlush.call((tracer as any)._tracer._exporter, done);\n    } catch (error) {\n      reject(error);\n    }\n  });\n}\n\n/**\n * Configuration options for the Datadog Bridge.\n */\nexport interface DatadogBridgeConfig extends BaseExporterConfig {\n  /**\n   * Datadog API key. Required in agentless mode.\n   * Falls back to DD_API_KEY environment variable.\n   */\n  apiKey?: string;\n\n  /**\n   * ML application name for grouping traces.\n   * Required - falls back to DD_LLMOBS_ML_APP environment variable.\n   */\n  mlApp?: string;\n\n  /**\n   * Datadog site (e.g., 'datadoghq.com', 'datadoghq.eu').\n   * Falls back to DD_SITE environment variable, defaults to 'datadoghq.com'.\n   */\n  site?: string;\n\n  /**\n   * Service name for the application.\n   * Falls back to mlApp if not specified.\n   */\n  service?: string;\n\n  /**\n   * Environment name (e.g., 'production', 'staging').\n   * Falls back to DD_ENV environment variable.\n   */\n  env?: string;\n\n  /**\n   * Use agentless mode (direct HTTPS intake without a local Datadog Agent).\n   *\n   * Defaults to `false` for the bridge — most users running dd-trace\n   * auto-instrumentation already have a local Datadog Agent (required for\n   * APM data). Agentless mode only routes LLMObs data directly to Datadog\n   * intake, which would split your APM and LLMObs telemetry across two\n   * paths.\n   *\n   * Set to `true` if you only want LLMObs data (no APM auto-instrumentation)\n   * and don't have a local Datadog Agent. Falls back to the\n   * `DD_LLMOBS_AGENTLESS_ENABLED` environment variable.\n   */\n  agentless?: boolean;\n\n  /**\n   * Enable dd-trace automatic integrations (HTTP, database, etc.).\n   * Defaults to true since the bridge is designed for APM integration.\n   */\n  integrationsEnabled?: boolean;\n\n  /**\n   * Keys from the request context that should be promoted to flat Datadog\n   * LLM Observability tags instead of being nested in annotations.metadata.\n   */\n  requestContextKeys?: string[];\n}\n\n/**\n * Datadog Bridge for Mastra Observability.\n *\n * Creates native dd-trace spans in real time during execution for proper APM\n * context propagation, and uses the same live dd span for Datadog LLMObs\n * tagging and annotations.\n */\nexport class DatadogBridge extends BaseExporter implements ObservabilityBridge {\n  name = 'datadog-bridge';\n\n  private config: Required<Pick<DatadogBridgeConfig, 'mlApp' | 'site'>> & DatadogBridgeConfig;\n  private ddSpanMap = new Map<string, any>();\n  private traceContext = new Map<string, TraceContext>();\n  private openSpanCounts = new Map<string, number>();\n\n  constructor(config: DatadogBridgeConfig = {}) {\n    super(config);\n\n    const mlApp = config.mlApp ?? process.env.DD_LLMOBS_ML_APP;\n    const apiKey = config.apiKey ?? process.env.DD_API_KEY;\n    const site = config.site ?? process.env.DD_SITE ?? 'datadoghq.com';\n    const env = config.env ?? process.env.DD_ENV;\n\n    // Default to false for the bridge — assume a local Datadog Agent is\n    // present (required for the APM auto-instrumentation the bridge enables)\n    const envAgentless = process.env.DD_LLMOBS_AGENTLESS_ENABLED?.toLowerCase();\n    const agentless = config.agentless ?? (envAgentless === 'true' || envAgentless === '1' ? true : false);\n    if (!mlApp) {\n      this.setDisabled(`Missing required mlApp. Set DD_LLMOBS_ML_APP environment variable or pass mlApp in config.`);\n      this.config = config as any;\n      return;\n    }\n\n    if (agentless && !apiKey) {\n      this.setDisabled(\n        `Missing required apiKey for agentless mode. Set DD_API_KEY environment variable or pass apiKey in config.`,\n      );\n      this.config = config as any;\n      return;\n    }\n\n    this.config = {\n      ...config,\n      mlApp,\n      site,\n      apiKey,\n      agentless,\n      env,\n    };\n\n    ensureTracer({\n      mlApp,\n      site,\n      apiKey,\n      agentless,\n      service: config.service,\n      env,\n      integrationsEnabled: config.integrationsEnabled ?? true,\n    });\n\n    this.logger.info('Datadog bridge initialized', { mlApp, site, agentless });\n  }\n\n  /**\n   * Create a dd-trace span eagerly when a Mastra span is constructed.\n   */\n  createSpan(options: CreateSpanOptions<SpanType>): SpanIds | undefined {\n    if (this.isDisabled) return undefined;\n\n    try {\n      let apmParentDdSpan: any = undefined;\n      let llmobsParentDdSpan: any = undefined;\n      let parentSource: 'external-parent' | 'active-scope' | 'none' = 'none';\n\n      const externalParentId = getExternalParentId(options);\n      if (externalParentId) {\n        apmParentDdSpan = this.ddSpanMap.get(externalParentId);\n        llmobsParentDdSpan = apmParentDdSpan;\n        if (apmParentDdSpan) {\n          parentSource = 'external-parent';\n        }\n      }\n\n      if (!apmParentDdSpan) {\n        apmParentDdSpan = tracer.scope().active() ?? undefined;\n        if (apmParentDdSpan) {\n          parentSource = 'active-scope';\n        }\n      }\n\n      if (!llmobsParentDdSpan && externalParentId) {\n        llmobsParentDdSpan = apmParentDdSpan;\n      }\n\n      const ddSpan = tracer.startSpan(options.name, {\n        ...(apmParentDdSpan ? { childOf: apmParentDdSpan } : {}),\n        ...(options.startTime ? { startTime: toDate(options.startTime).getTime() } : {}),\n      });\n\n      const ddContext = ddSpan.context?.() as\n        | {\n            toSpanId?: (hex?: boolean) => string;\n            toTraceId?: (hex?: boolean) => string;\n          }\n        | undefined;\n      const spanId = ddContext?.toSpanId?.(true) ?? generateSpanId();\n      const traceId =\n        ddContext?.toTraceId?.(true) ??\n        (externalParentId ? (options.parent?.traceId ?? generateTraceId()) : generateTraceId());\n      const parentContext = apmParentDdSpan?.context?.() as { toSpanId?: (hex?: boolean) => string } | undefined;\n      const parentSpanId = parentContext?.toSpanId?.(true) ?? externalParentId;\n\n      this.captureTraceContext(traceId, options);\n      this.openSpanCounts.set(traceId, (this.openSpanCounts.get(traceId) ?? 0) + 1);\n      this.ddSpanMap.set(spanId, ddSpan);\n      this.registerLlmObsSpan(ddSpan, traceId, options, llmobsParentDdSpan);\n\n      this.logger.debug(\n        `[DatadogBridge.createSpan] Created APM span [spanId=${spanId}] [traceId=${traceId}] ` +\n          `[parentSpanId=${parentSpanId}] [type=${options.type}] [mapSize=${this.ddSpanMap.size}] ` +\n          `[parentSource=${parentSource}] [externalParentId=${externalParentId ?? 'none'}]`,\n      );\n\n      return { spanId, traceId, parentSpanId };\n    } catch (error) {\n      this.logger.error('[DatadogBridge] Failed to create span:', error);\n      return undefined;\n    }\n  }\n\n  /**\n   * Execute an async function within the dd-trace context of a Mastra span.\n   */\n  executeInContext<T>(spanId: string, fn: () => Promise<T>): Promise<T> {\n    return this.executeWithSpanContext(spanId, fn);\n  }\n\n  /**\n   * Execute a synchronous function within the dd-trace context of a Mastra span.\n   */\n  executeInContextSync<T>(spanId: string, fn: () => T): T {\n    return this.executeWithSpanContext(spanId, fn);\n  }\n\n  async onScoreEvent(event: ScoreEvent): Promise<void> {\n    if (this.isDisabled || !(tracer as any).llmobs?.submitEvaluation) return;\n\n    const { score } = event;\n    if (!score.traceId || !score.spanId) {\n      this.logger.warn('Datadog bridge: dropping score with no traceId/spanId', {\n        scorerId: score.scorerId,\n      });\n      return;\n    }\n\n    try {\n      tracer.llmobs.submitEvaluation(\n        { traceId: score.traceId, spanId: toDatadogSpanId(score.spanId) },\n        {\n          label: score.scorerName ?? score.scorerId,\n          value: score.score,\n          metricType: 'score',\n          mlApp: this.config.mlApp,\n          timestampMs: score.timestamp instanceof Date ? score.timestamp.getTime() : Date.now(),\n          ...(score.reason ? { reasoning: score.reason } : {}),\n          ...(score.metadata ? { metadata: score.metadata } : {}),\n        },\n      );\n    } catch (error) {\n      this.logger.error('Datadog bridge: Failed to submit evaluation', {\n        error,\n        traceId: score.traceId,\n        spanId: score.spanId,\n        scorerId: score.scorerId,\n      });\n    }\n  }\n\n  private executeWithSpanContext<T>(spanId: string, fn: () => T): T {\n    const ddSpan = this.ddSpanMap.get(spanId);\n\n    if (ddSpan) {\n      return tracer.scope().activate(ddSpan, () => {\n        const llmobs = (tracer as any).llmobs as LLMObsInternalApi | undefined;\n        // `_activate` is an internal dd-trace hook. Keep this usage aligned\n        // with supported dd-trace versions when the dependency is upgraded.\n        if (typeof llmobs?._activate === 'function') {\n          return llmobs._activate(ddSpan, undefined, fn);\n        }\n\n        return fn();\n      });\n    }\n\n    return fn();\n  }\n\n  /**\n   * Handle tracing events from the observability bus.\n   */\n  protected async _exportTracingEvent(event: TracingEvent): Promise<void> {\n    if (this.isDisabled) return;\n\n    try {\n      const span = event.exportedSpan;\n\n      if (span.isEvent) {\n        if (event.type === 'span_started' || event.type === 'span_ended') {\n          this.annotateAndFinishSpan(span);\n        }\n        return;\n      }\n\n      switch (event.type) {\n        case 'span_started':\n        case 'span_updated':\n          return;\n        case 'span_ended':\n          this.annotateAndFinishSpan(span);\n          return;\n      }\n    } catch (error) {\n      this.logger.error('Datadog bridge error', {\n        error,\n        eventType: event.type,\n        spanId: event.exportedSpan?.id,\n        spanName: event.exportedSpan?.name,\n      });\n    }\n  }\n\n  private registerLlmObsSpan(\n    ddSpan: any,\n    traceId: string,\n    options: CreateSpanOptions<SpanType>,\n    parentDdSpan?: any,\n  ): void {\n    const tagger = this.getLlmObsTagger();\n    if (!tagger) return;\n\n    try {\n      const kind = kindFor(options.type);\n      const ownAttrs = options.attributes as ModelGenerationAttributes | undefined;\n      const inheritedModelAttrs =\n        options.parent?.type === SpanTypeEnum.MODEL_GENERATION\n          ? (options.parent.attributes as ModelGenerationAttributes | undefined)\n          : undefined;\n      const traceCtx = this.resolveTraceContext(traceId, options);\n\n      // `registerLLMObsSpan` comes from dd-trace internals. Keep it under\n      // review because the bridge depends on experimental behavior here.\n      tagger.registerLLMObsSpan(ddSpan, {\n        parent: parentDdSpan,\n        kind,\n        name: options.name,\n        userId: traceCtx.userId,\n        sessionId: traceCtx.sessionId,\n        ...(kind === 'llm' && (ownAttrs?.model ?? inheritedModelAttrs?.model)\n          ? { modelName: ownAttrs?.model ?? inheritedModelAttrs?.model }\n          : {}),\n        ...(kind === 'llm' && (ownAttrs?.provider ?? inheritedModelAttrs?.provider)\n          ? { modelProvider: ownAttrs?.provider ?? inheritedModelAttrs?.provider }\n          : {}),\n      });\n    } catch (error) {\n      this.logger.warn('[DatadogBridge] Failed to register LLMObs span', {\n        error,\n        spanName: options.name,\n        spanType: options.type,\n      });\n    }\n  }\n\n  private getLlmObsTagger(): LLMObsTagger | undefined {\n    const tagger = (tracer as any).llmobs?._tagger;\n    // `_tagger` is also internal dd-trace state and may change between releases.\n    if (tagger && typeof tagger.registerLLMObsSpan === 'function') {\n      return tagger as LLMObsTagger;\n    }\n    return undefined;\n  }\n\n  /**\n   * Annotate the eagerly-created dd span and finish it using the final Mastra\n   * span state.\n   */\n  private annotateAndFinishSpan(span: AnyExportedSpan): void {\n    const ddSpan = this.ddSpanMap.get(span.id);\n    if (!ddSpan) {\n      this.logger.warn('[DatadogBridge] No dd span found when finalizing Mastra span', {\n        spanId: span.id,\n        spanName: span.name,\n        spanType: span.type,\n        mapSize: this.ddSpanMap.size,\n      });\n      return;\n    }\n\n    const endTime = span.endTime ? toDate(span.endTime) : span.isEvent ? toDate(span.startTime) : new Date();\n\n    const annotations = this.buildAnnotations(span);\n\n    try {\n      if (Object.keys(annotations).length > 0 && tracer.llmobs?.annotate) {\n        tracer.llmobs.annotate(ddSpan, annotations);\n      }\n    } catch (error) {\n      this.logger.error('[DatadogBridge] Failed to annotate span before finish', {\n        error,\n        spanId: span.id,\n        spanName: span.name,\n      });\n    }\n\n    try {\n      if (span.errorInfo) {\n        this.setErrorTags(ddSpan, span.errorInfo);\n      }\n    } catch (error) {\n      this.logger.error('[DatadogBridge] Failed to set error tags on dd span', {\n        error,\n        spanId: span.id,\n        spanName: span.name,\n      });\n    }\n\n    try {\n      if (typeof ddSpan.finish === 'function') {\n        ddSpan.finish(endTime.getTime());\n      }\n    } catch (error) {\n      this.logger.error('[DatadogBridge] Failed to finish dd span', {\n        error,\n        spanId: span.id,\n        spanName: span.name,\n      });\n    } finally {\n      this.ddSpanMap.delete(span.id);\n      this.releaseTraceContext(span.traceId);\n    }\n  }\n\n  private captureTraceContext(traceId: string, options: CreateSpanOptions<SpanType>): void {\n    const existing = this.traceContext.get(traceId);\n    const next: TraceContext = {\n      userId: firstString(options.metadata?.userId, options.parent?.metadata?.userId, existing?.userId),\n      sessionId: firstString(options.metadata?.sessionId, options.parent?.metadata?.sessionId, existing?.sessionId),\n    };\n\n    if (next.userId || next.sessionId) {\n      this.traceContext.set(traceId, next);\n    }\n  }\n\n  private resolveTraceContext(traceId: string, options: CreateSpanOptions<SpanType>): TraceContext {\n    const stored = this.traceContext.get(traceId);\n    return {\n      userId: firstString(options.metadata?.userId, options.parent?.metadata?.userId, stored?.userId),\n      sessionId: firstString(options.metadata?.sessionId, options.parent?.metadata?.sessionId, stored?.sessionId),\n    };\n  }\n\n  private releaseTraceContext(traceId: string): void {\n    const nextCount = (this.openSpanCounts.get(traceId) ?? 1) - 1;\n    if (nextCount > 0) {\n      this.openSpanCounts.set(traceId, nextCount);\n      return;\n    }\n\n    this.openSpanCounts.delete(traceId);\n    this.traceContext.delete(traceId);\n  }\n\n  private buildAnnotations(span: AnyExportedSpan): Record<string, any> {\n    const annotations: Record<string, any> = {};\n\n    if (span.input !== undefined) {\n      annotations.inputData = formatInput(span.input, span.type);\n    }\n\n    if (span.output !== undefined) {\n      annotations.outputData = formatOutput(span.output, span.type);\n    }\n\n    // Token usage attaches to the LLM-kind span only — MODEL_INFERENCE when\n    // the feature is enabled, MODEL_STEP on legacy paired packages.\n    const usageSpanType = isModelInferenceEnabled() ? SpanTypeEnum.MODEL_INFERENCE : SpanTypeEnum.MODEL_STEP;\n    if (span.type === usageSpanType) {\n      const usage = (span.attributes as ModelStepAttributes | ModelInferenceAttributes | undefined)?.usage;\n      const metrics = formatUsageMetrics(usage);\n      if (metrics) {\n        annotations.metrics = metrics;\n      }\n    }\n\n    // `model`/`provider` are surfaced as native LLM Obs fields and `usage` as metrics;\n    // everything else (including `parameters` — model settings like reasoning_effort)\n    // flows into metadata so it reaches Datadog.\n    const knownFields = ['usage', 'model', 'provider'];\n    const otherAttributes = omitKeys((span.attributes ?? {}) as Record<string, any>, knownFields);\n\n    const contextKeySet = new Set(this.config.requestContextKeys ?? []);\n    const flatContextTags: Record<string, any> = {};\n    const remainingMetadata: Record<string, any> = {};\n\n    for (const [key, value] of Object.entries(span.metadata ?? {})) {\n      if (contextKeySet.has(key)) {\n        flatContextTags[key] = value;\n      } else {\n        remainingMetadata[key] = value;\n      }\n    }\n\n    const remainingAttributes: Record<string, any> = {};\n    for (const [key, value] of Object.entries(otherAttributes)) {\n      if (contextKeySet.has(key)) {\n        if (!(key in flatContextTags)) {\n          flatContextTags[key] = value;\n        }\n      } else {\n        remainingAttributes[key] = value;\n      }\n    }\n\n    const combinedMetadata: Record<string, any> = {\n      ...remainingMetadata,\n      ...remainingAttributes,\n    };\n    if (span.errorInfo) {\n      combinedMetadata['error.message'] = span.errorInfo.message;\n    }\n    if (Object.keys(combinedMetadata).length > 0) {\n      annotations.metadata = combinedMetadata;\n    }\n\n    const tags: Record<string, any> = {\n      ...flatContextTags,\n    };\n\n    if (span.tags?.length) {\n      for (const tag of span.tags) {\n        const colonIndex = tag.indexOf(':');\n        if (colonIndex > 0) {\n          tags[tag.substring(0, colonIndex)] = tag.substring(colonIndex + 1);\n        } else {\n          tags[tag] = true;\n        }\n      }\n    }\n\n    if (span.errorInfo) {\n      tags.error = true;\n      if (span.errorInfo.id) {\n        tags['error.id'] = span.errorInfo.id;\n      }\n      if (span.errorInfo.domain) {\n        tags['error.domain'] = span.errorInfo.domain;\n      }\n      if (span.errorInfo.category) {\n        tags['error.category'] = span.errorInfo.category;\n      }\n    }\n\n    if (Object.keys(tags).length > 0) {\n      annotations.tags = tags;\n    }\n\n    return annotations;\n  }\n\n  private setErrorTags(ddSpan: any, errorInfo: NonNullable<AnyExportedSpan['errorInfo']>): void {\n    ddSpan.setTag('error', true);\n    ddSpan.setTag('error.message', errorInfo.message);\n    ddSpan.setTag('error.type', errorInfo.name ?? errorInfo.category ?? 'Error');\n    if (errorInfo.stack) {\n      ddSpan.setTag('error.stack', errorInfo.stack);\n    }\n  }\n\n  async flush(): Promise<void> {\n    if (this.isDisabled) return;\n\n    if (tracer.llmobs?.flush) {\n      try {\n        await tracer.llmobs.flush();\n        this.logger.debug('Datadog llmobs flushed');\n      } catch (e) {\n        this.logger.error('Error flushing llmobs', { error: e });\n      }\n    }\n\n    try {\n      await flushApmExporter();\n      this.logger.debug('Datadog APM exporter flushed');\n    } catch (e) {\n      this.logger.error('Error flushing Datadog APM exporter', { error: e });\n    }\n  }\n\n  async shutdown(): Promise<void> {\n    for (const [spanId, ddSpan] of this.ddSpanMap) {\n      this.logger.warn(`[DatadogBridge] Force-finishing APM span that was not properly closed [id=${spanId}]`);\n      try {\n        if (typeof ddSpan.finish === 'function') {\n          ddSpan.finish();\n        }\n      } catch {\n        // Best-effort cleanup\n      }\n    }\n    this.ddSpanMap.clear();\n    this.openSpanCounts.clear();\n    this.traceContext.clear();\n\n    await this.flush();\n\n    if (tracer.llmobs?.disable) {\n      try {\n        tracer.llmobs.disable();\n      } catch (e) {\n        this.logger.error('Error disabling llmobs', { error: e });\n      }\n    }\n\n    await super.shutdown();\n  }\n}\n\nfunction firstString(...values: Array<unknown>): string | undefined {\n  for (const value of values) {\n    if (typeof value === 'string') {\n      return value;\n    }\n  }\n  return undefined;\n}\n\nfunction fillRandomBytes(bytes: Uint8Array): void {\n  try {\n    const webCrypto = globalThis.crypto;\n    if (webCrypto?.getRandomValues) {\n      webCrypto.getRandomValues.call(webCrypto, bytes);\n      return;\n    }\n  } catch {\n    // Fall through to fallback\n  }\n  for (let i = 0; i < bytes.length; i++) {\n    bytes[i] = Math.floor(Math.random() * 256);\n  }\n}\n\nfunction toDatadogSpanId(spanId: string): string {\n  if (/^[0-9a-f]{16}$/i.test(spanId)) {\n    return BigInt(`0x${spanId}`).toString(10);\n  }\n  return spanId;\n}\n\nfunction generateSpanId(): string {\n  const bytes = new Uint8Array(8);\n  fillRandomBytes(bytes);\n  return Array.from(bytes, byte => byte.toString(16).padStart(2, '0')).join('');\n}\n\nfunction generateTraceId(): string {\n  const bytes = new Uint8Array(16);\n  fillRandomBytes(bytes);\n  return Array.from(bytes, byte => byte.toString(16).padStart(2, '0')).join('');\n}\n","/**\n * Datadog LLM Observability Exporter for Mastra\n *\n * Exports Mastra observability data to Datadog's LLM Observability product.\n * Uses a completion-only pattern where spans are emitted on span_ended events.\n *\n * Key features:\n * - Maps Mastra span types to Datadog span kinds\n * - Normalizes AI SDK v4/v5 token usage formats\n * - Formats LLM inputs/outputs as message arrays\n * - Flattens metadata into searchable tags\n * - Supports both agent and agentless modes\n */\n\nimport type {\n  TracingEvent,\n  AnyExportedSpan,\n  ModelGenerationAttributes,\n  ModelInferenceAttributes,\n  ModelStepAttributes,\n  ScoreEvent,\n} from '@mastra/core/observability';\nimport { SpanType } from '@mastra/core/observability';\nimport { omitKeys } from '@mastra/core/utils';\nimport { BaseExporter } from '@mastra/observability';\nimport type { BaseExporterConfig } from '@mastra/observability';\nimport tracer from 'dd-trace';\nimport { isModelInferenceEnabled } from './features';\nimport { formatUsageMetrics } from './metrics';\nimport { ensureTracer, kindFor, toDate, formatInput, formatOutput } from './utils';\nimport type { DatadogSpanKind } from './utils';\n\n/**\n * LLMObs span options passed to dd-trace's llmobs.trace().\n * Note: endTime is not included because dd-trace does not honor it in trace options.\n * Instead, we call ddSpan.finish(endTimeMs) explicitly inside the trace callback.\n */\ninterface LLMObsSpanOptions {\n  kind: DatadogSpanKind;\n  name: string;\n  sessionId?: string;\n  userId?: string;\n  mlApp?: string;\n  modelName?: string;\n  modelProvider?: string;\n  startTime?: Date;\n}\n\n/**\n * Minimal per-trace context for user/session tagging.\n */\ninterface TraceContext {\n  userId?: string;\n  sessionId?: string;\n}\n\ntype TraceState = {\n  buffer: Map<string, AnyExportedSpan>;\n  contexts: Map<string, { ddSpan: any; exported?: { traceId: string; spanId: string } }>;\n  rootEnded: boolean;\n  treeEmitted: boolean; // Whether the initial span tree has been emitted\n  createdAt: number;\n  cleanupTimer?: ReturnType<typeof setTimeout>;\n  maxLifetimeTimer?: ReturnType<typeof setTimeout>;\n};\n\n/**\n * Tree node representing a span and its children for recursive emission.\n */\ninterface SpanNode {\n  span: AnyExportedSpan;\n  children: SpanNode[];\n}\n\n/**\n * Maximum lifetime for a trace state entry (30 minutes).\n * This is a fallback cleanup mechanism for traces that never receive a root span\n * or have all spans marked as non-root, preventing unbounded memory growth.\n */\nconst MAX_TRACE_LIFETIME_MS = 30 * 60 * 1000;\n\n/**\n * Regular cleanup interval for trace state entries (1 minute).\n */\nconst REGULAR_CLEANUP_INTERVAL_MS = 1 * 60 * 1000;\n\n/**\n * Configuration options for the Datadog LLM Observability exporter.\n */\nexport interface DatadogExporterConfig extends BaseExporterConfig {\n  /**\n   * Datadog API key. Required (agentless mode is the default).\n   * Falls back to DD_API_KEY environment variable.\n   */\n  apiKey?: string;\n\n  /**\n   * ML application name for grouping traces.\n   * Required - falls back to DD_LLMOBS_ML_APP environment variable.\n   */\n  mlApp?: string;\n\n  /**\n   * Datadog site (e.g., 'datadoghq.com', 'datadoghq.eu').\n   * Falls back to DD_SITE environment variable, defaults to 'datadoghq.com'.\n   */\n  site?: string;\n\n  /**\n   * Service name for the application.\n   * Falls back to mlApp if not specified.\n   */\n  service?: string;\n\n  /**\n   * Environment name (e.g., 'production', 'staging').\n   * Falls back to DD_ENV environment variable.\n   */\n  env?: string;\n\n  /**\n   * Use agentless mode (direct HTTPS intake without local Datadog Agent).\n   * Defaults to true for consistency with other Mastra exporters.\n   * Set to false to use a local Datadog Agent instead.\n   * Falls back to DD_LLMOBS_AGENTLESS_ENABLED environment variable.\n   */\n  agentless?: boolean;\n\n  /**\n   * Enable dd-trace automatic integrations.\n   * Defaults to false to avoid unexpected instrumentation.\n   */\n  integrationsEnabled?: boolean;\n\n  /**\n   * Keys from the request context (set via `requestContextKeys` in the Mastra\n   * Observability config) that should be promoted to flat Datadog LLM Observability\n   * tags instead of being nested inside `annotations.metadata`.\n   *\n   * Flat tags are indexable and filterable in the Datadog LLM Observability UI,\n   * which makes them suitable for multi-tenant filtering (e.g. tenantId, agentId).\n   *\n   * @example\n   * ```typescript\n   * new DatadogExporter({\n   *   mlApp: 'my-app',\n   *   requestContextKeys: ['tenantId', 'agentId'],\n   * })\n   * ```\n   */\n  requestContextKeys?: string[];\n}\n\n/**\n * Datadog LLM Observability Exporter for Mastra.\n *\n * Exports observability data to Datadog's LLM Observability product using\n * a completion-only pattern where spans are emitted on span_ended events.\n */\nexport class DatadogExporter extends BaseExporter {\n  name = 'datadog';\n\n  private config: Required<Pick<DatadogExporterConfig, 'mlApp' | 'site'>> & DatadogExporterConfig;\n  private traceContext = new Map<string, TraceContext>();\n  private traceState = new Map<string, TraceState>();\n\n  constructor(config: DatadogExporterConfig = {}) {\n    super(config);\n\n    // Resolve configuration from config object and environment variables\n    const mlApp = config.mlApp ?? process.env.DD_LLMOBS_ML_APP;\n    const apiKey = config.apiKey ?? process.env.DD_API_KEY;\n    const site = config.site ?? process.env.DD_SITE ?? 'datadoghq.com';\n    const env = config.env ?? process.env.DD_ENV;\n\n    // Default to agentless mode (true) for consistency with other Mastra exporters\n    // Only disable if explicitly set to false via config or env var\n    const envAgentless = process.env.DD_LLMOBS_AGENTLESS_ENABLED?.toLowerCase();\n    const agentless = config.agentless ?? (envAgentless === 'false' || envAgentless === '0' ? false : true);\n\n    // Validate required configuration\n    if (!mlApp) {\n      this.setDisabled(`Missing required mlApp. Set DD_LLMOBS_ML_APP environment variable or pass mlApp in config.`);\n      this.config = config as any;\n      return;\n    }\n\n    if (agentless && !apiKey) {\n      this.setDisabled(\n        `Missing required apiKey for agentless mode. Set DD_API_KEY environment variable or pass apiKey in config.`,\n      );\n      this.config = config as any;\n      return;\n    }\n\n    this.config = { ...config, mlApp, site, apiKey, agentless, env };\n\n    // Initialize tracer and enable LLM Observability\n    ensureTracer({\n      mlApp,\n      site,\n      apiKey,\n      agentless,\n      service: config.service,\n      env,\n      integrationsEnabled: config.integrationsEnabled,\n    });\n\n    this.logger.info('Datadog exporter initialized', { mlApp, site, agentless });\n  }\n\n  /**\n   * Main entry point for tracing events from Mastra.\n   */\n  protected async _exportTracingEvent(event: TracingEvent): Promise<void> {\n    if (this.isDisabled || !(tracer as any).llmobs) return;\n\n    try {\n      const span = event.exportedSpan;\n\n      // Handle event spans (zero-duration spans) - buffer like regular spans for parent-first emission\n      if (span.isEvent) {\n        if (event.type === 'span_started') {\n          this.captureTraceContext(span);\n          this.enqueueSpan(span); // Route through buffer for proper parent context\n        }\n        return; // Skip span_updated and span_ended for events\n      }\n\n      // Handle regular spans based on event type\n      switch (event.type) {\n        case 'span_started':\n          this.captureTraceContext(span);\n          return;\n\n        case 'span_updated':\n          // No-op: completion-only pattern ignores mid-span updates\n          return;\n\n        case 'span_ended':\n          this.enqueueSpan(span);\n          return;\n      }\n    } catch (error) {\n      this.logger.error('Datadog exporter error', {\n        error,\n        eventType: event.type,\n        spanId: event.exportedSpan?.id,\n        spanName: event.exportedSpan?.name,\n      });\n    }\n  }\n\n  /**\n   * Captures user/session context from root spans for tagging all spans in the trace.\n   */\n  private captureTraceContext(span: AnyExportedSpan): void {\n    if (span.isRootSpan && !this.traceContext.has(span.traceId)) {\n      this.traceContext.set(span.traceId, {\n        userId: span.metadata?.userId,\n        sessionId: span.metadata?.sessionId,\n      });\n    }\n  }\n\n  /**\n   * Queue span until its parent context is available, then emit spans parent-first.\n   */\n  private enqueueSpan(span: AnyExportedSpan): void {\n    const state = this.getOrCreateTraceState(span.traceId);\n    if (span.isRootSpan) {\n      state.rootEnded = true;\n    }\n\n    state.buffer.set(span.id, span);\n    this.tryEmitReadySpans(span.traceId);\n  }\n\n  /**\n   * Sets native dd-trace error tags required by Datadog's Error Tracking UI.\n   */\n  private setErrorTags(ddSpan: any, errorInfo: NonNullable<AnyExportedSpan['errorInfo']>): void {\n    ddSpan.setTag('error', true);\n    ddSpan.setTag('error.message', errorInfo.message);\n    ddSpan.setTag('error.type', errorInfo.name ?? errorInfo.category ?? 'Error');\n    if (errorInfo.stack) {\n      ddSpan.setTag('error.stack', errorInfo.stack);\n    }\n  }\n\n  /**\n   * Builds annotations object for llmobs.annotate().\n   * Uses dd-trace's expected property names: inputData, outputData, metadata, tags, metrics.\n   */\n  private buildAnnotations(span: AnyExportedSpan): Record<string, any> {\n    const annotations: Record<string, any> = {};\n\n    // Format and add input (dd-trace expects 'inputData')\n    if (span.input !== undefined) {\n      annotations.inputData = formatInput(span.input, span.type);\n    }\n\n    // Format and add output (dd-trace expects 'outputData')\n    if (span.output !== undefined) {\n      annotations.outputData = formatOutput(span.output, span.type);\n    }\n\n    // Token usage metrics attach to the LLM-kind span only, to avoid\n    // double-counting cost in Datadog. With the `model-inference-span` feature\n    // that's MODEL_INFERENCE (the actual provider call); without it, MODEL_STEP\n    // is still the API call.\n    const usageSpanType = isModelInferenceEnabled() ? SpanType.MODEL_INFERENCE : SpanType.MODEL_STEP;\n    if (span.type === usageSpanType) {\n      const usage = (span.attributes as ModelStepAttributes | ModelInferenceAttributes | undefined)?.usage;\n      const metrics = formatUsageMetrics(usage);\n      if (metrics) {\n        annotations.metrics = metrics;\n      }\n    }\n\n    // Forward span.attributes to metadata (minus known fields handled separately)\n    // This ensures tool/workflow spans preserve custom attributes like other exporters.\n    // `model`/`provider` are surfaced as native LLM Obs fields and `usage` as metrics;\n    // everything else (including `parameters`, which carries model settings like\n    // reasoning_effort/temperature) flows into metadata so it reaches Datadog.\n    const knownFields = ['usage', 'model', 'provider'];\n    const otherAttributes = omitKeys((span.attributes ?? {}) as Record<string, any>, knownFields);\n\n    // Separate requestContextKeys from span.metadata AND span.attributes:\n    // - Keys listed in this.config.requestContextKeys are promoted to flat LLM Obs tags,\n    //   making them indexable and filterable in the Datadog UI (e.g. tenantId, agentId).\n    // - All remaining keys stay nested in annotations.metadata as before.\n    const contextKeySet = new Set(this.config.requestContextKeys ?? []);\n    const flatContextTags: Record<string, any> = {};\n    const remainingMetadata: Record<string, any> = {};\n\n    for (const [key, value] of Object.entries(span.metadata ?? {})) {\n      if (contextKeySet.has(key)) {\n        flatContextTags[key] = value;\n      } else {\n        remainingMetadata[key] = value;\n      }\n    }\n\n    // Also promote matching keys from span.attributes so requestContextKeys\n    // are consistently elevated regardless of where the caller stored them.\n    const remainingAttributes: Record<string, any> = {};\n    for (const [key, value] of Object.entries(otherAttributes)) {\n      if (contextKeySet.has(key)) {\n        // Only promote if not already set from span.metadata (metadata wins)\n        if (!(key in flatContextTags)) {\n          flatContextTags[key] = value;\n        }\n      } else {\n        remainingAttributes[key] = value;\n      }\n    }\n\n    // Merge remaining span.metadata + span attributes into metadata\n    // Error message goes into metadata (not tags) because tags get normalized/truncated\n    // which mangles free-form error text (e.g. colons split into key/value, spaces become underscores)\n    const combinedMetadata: Record<string, any> = {\n      ...remainingMetadata,\n      ...remainingAttributes,\n    };\n    if (span.errorInfo) {\n      combinedMetadata['error.message'] = span.errorInfo.message;\n    }\n    if (Object.keys(combinedMetadata).length > 0) {\n      annotations.metadata = combinedMetadata;\n    }\n\n    // Build tags from span.tags (user-provided string[] converted to object),\n    // promoted requestContextKeys values (flat, indexable in Datadog), and error info.\n    // Datadog annotation tags accept Record<string, any>, so we use proper types.\n    // The native span error status is also set via ddSpan.setTag('error', true) in emitSpan()\n    const tags: Record<string, any> = {\n      // Promote requestContextKeys values to flat, searchable LLM Observability tags\n      ...flatContextTags,\n    };\n\n    // Convert span.tags (string[]) to object format\n    // Tags in \"key:value\" format (e.g. \"instance_name:career-scout-api\") are split into { key: \"value\" }\n    // Tags without a colon (e.g. \"production\") are set as { tag: true } (preserving existing behavior)\n    if (span.tags?.length) {\n      for (const tag of span.tags) {\n        const colonIndex = tag.indexOf(':');\n        if (colonIndex > 0) {\n          tags[tag.substring(0, colonIndex)] = tag.substring(colonIndex + 1);\n        } else {\n          tags[tag] = true;\n        }\n      }\n    }\n\n    // Add error status and structured error fields as tags (short, structured values that survive normalization)\n    // The error message itself is in metadata above to avoid tag normalization/truncation\n    if (span.errorInfo) {\n      tags.error = true;\n      if (span.errorInfo.id) {\n        tags['error.id'] = span.errorInfo.id;\n      }\n      if (span.errorInfo.domain) {\n        tags['error.domain'] = span.errorInfo.domain;\n      }\n      if (span.errorInfo.category) {\n        tags['error.category'] = span.errorInfo.category;\n      }\n    }\n\n    if (Object.keys(tags).length > 0) {\n      annotations.tags = tags;\n    }\n\n    return annotations;\n  }\n\n  /**\n   * Submit an eval score to Datadog LLM Observability for the matching ddSpan.\n   *\n   * Ordering constraint: the matching span must have already been emitted to dd-trace\n   * (i.e. its `SPAN_ENDED` event must have been processed and the trace tree flushed).\n   * On Mastra's normal scoring path this is always true — scorer hooks fire after the\n   * scored entity completes, so the root span has ended by the time `onScoreEvent` runs.\n   *\n   * If a score arrives for an unexported span (either before `SPAN_ENDED` or after the\n   * `traceState` entry has been cleaned up), the event is dropped and a warning is logged\n   * so the misuse is observable. Scores must therefore only be submitted for spans whose\n   * lifecycle has completed.\n   */\n  async onScoreEvent(event: ScoreEvent): Promise<void> {\n    if (this.isDisabled || !(tracer as any).llmobs?.submitEvaluation) return;\n\n    const { score } = event;\n    if (!score.traceId || !score.spanId) {\n      this.logger.warn('Datadog exporter: dropping score with no traceId/spanId', {\n        scorerId: score.scorerId,\n      });\n      return;\n    }\n\n    const ctx = this.traceState.get(score.traceId)?.contexts.get(score.spanId);\n    const exported = ctx?.exported;\n    if (!exported) {\n      this.logger.warn(\n        'Datadog exporter: dropping score for span that has not been emitted to dd-trace yet ' +\n          '(span_ended must be processed before submitting a score for it)',\n        {\n          traceId: score.traceId,\n          spanId: score.spanId,\n          scorerId: score.scorerId,\n        },\n      );\n      return;\n    }\n\n    try {\n      tracer.llmobs.submitEvaluation(\n        { traceId: exported.traceId, spanId: exported.spanId },\n        {\n          label: score.scorerName ?? score.scorerId,\n          value: score.score,\n          metricType: 'score',\n          mlApp: this.config.mlApp,\n          timestampMs: score.timestamp instanceof Date ? score.timestamp.getTime() : Date.now(),\n          ...(score.reason ? { reasoning: score.reason } : {}),\n          ...(score.metadata ? { metadata: score.metadata } : {}),\n        },\n      );\n    } catch (err) {\n      this.logger.error('Datadog exporter: Failed to submit evaluation', {\n        error: err,\n        traceId: score.traceId,\n        spanId: score.spanId,\n        scorerId: score.scorerId,\n      });\n    }\n  }\n\n  /**\n   * Force flush any buffered spans without shutting down the exporter.\n   * This is useful in serverless environments where you need to ensure spans\n   * are exported before the runtime instance is terminated.\n   */\n  async flush(): Promise<void> {\n    if (this.isDisabled || !(tracer as any).llmobs) return;\n\n    // Flush any pending data to Datadog\n    if (tracer.llmobs?.flush) {\n      try {\n        await tracer.llmobs.flush();\n        this.logger.debug('Datadog llmobs flushed');\n      } catch (e) {\n        this.logger.error('Error flushing llmobs', { error: e });\n      }\n    }\n  }\n\n  /**\n   * Gracefully shuts down the exporter.\n   */\n  async shutdown(): Promise<void> {\n    // Cancel all pending cleanup timers and clear state FIRST\n    for (const [traceId, state] of this.traceState) {\n      if (state.cleanupTimer) {\n        clearTimeout(state.cleanupTimer);\n      }\n      if (state.maxLifetimeTimer) {\n        clearTimeout(state.maxLifetimeTimer);\n      }\n      if (state.buffer.size > 0) {\n        this.logger.warn('Shutdown with pending spans', {\n          traceId,\n          pendingCount: state.buffer.size,\n          spanIds: Array.from(state.buffer.keys()),\n        });\n      }\n    }\n    this.traceState.clear();\n\n    // Flush any pending data\n    await this.flush();\n\n    // Disable LLM Observability\n    if (tracer.llmobs?.disable) {\n      try {\n        tracer.llmobs.disable();\n      } catch (e) {\n        this.logger.error('Error disabling llmobs', { error: e });\n      }\n    }\n\n    // Clear local state\n    this.traceContext.clear();\n\n    await super.shutdown();\n  }\n\n  /**\n   * Retrieve or initialize trace state for buffering and parent tracking.\n   */\n  private getOrCreateTraceState(traceId: string): TraceState {\n    const existing = this.traceState.get(traceId);\n    if (existing) {\n      if (existing.cleanupTimer) {\n        clearTimeout(existing.cleanupTimer);\n        existing.cleanupTimer = undefined;\n      }\n      return existing;\n    }\n\n    const created: TraceState = {\n      buffer: new Map<string, AnyExportedSpan>(),\n      contexts: new Map<string, { ddSpan: any; exported?: { traceId: string; spanId: string } }>(),\n      rootEnded: false,\n      treeEmitted: false,\n      createdAt: Date.now(),\n      cleanupTimer: undefined,\n      maxLifetimeTimer: undefined,\n    };\n\n    // Schedule fallback cleanup after max lifetime to prevent memory leaks\n    // when traces never receive a root span or all spans are non-root\n    const maxLifetimeTimer = setTimeout(() => {\n      const state = this.traceState.get(traceId);\n      if (state) {\n        if (state.buffer.size > 0 || state.contexts.size > 0) {\n          this.logger.warn('Discarding trace due to max lifetime exceeded', {\n            traceId,\n            bufferedSpans: state.buffer.size,\n            emittedSpans: state.contexts.size,\n            lifetimeMs: Date.now() - state.createdAt,\n          });\n        }\n        if (state.cleanupTimer) {\n          clearTimeout(state.cleanupTimer);\n        }\n        this.traceState.delete(traceId);\n        this.traceContext.delete(traceId);\n      }\n    }, MAX_TRACE_LIFETIME_MS);\n    // Prevent the timer from keeping the process alive\n    (maxLifetimeTimer as any).unref?.();\n    created.maxLifetimeTimer = maxLifetimeTimer;\n\n    this.traceState.set(traceId, created);\n    return created;\n  }\n\n  /**\n   * Attempt to emit spans from the buffer.\n   *\n   * Two modes of operation:\n   * 1. Initial tree emission: When root span ends and tree hasn't been emitted yet,\n   *    build a tree from all buffered spans and emit recursively using nested\n   *    llmobs.trace() calls. This ensures proper parent-child relationships in Datadog.\n   * 2. Late-arriving spans: After the tree has been emitted, emit individual spans\n   *    with their parent context for proper linking.\n   */\n  private tryEmitReadySpans(traceId: string): void {\n    const state = this.traceState.get(traceId);\n    if (!state) return;\n\n    // If tree hasn't been emitted yet, wait for root and emit as tree\n    if (!state.treeEmitted) {\n      // Wait until the root span has ended before emitting any spans\n      if (!state.rootEnded) return;\n\n      // Build tree and emit recursively\n      const tree = this.buildSpanTree(state.buffer);\n      if (tree) {\n        this.emitSpanTree(tree, state);\n      }\n\n      // Clear the buffer and mark tree as emitted\n      state.buffer.clear();\n      state.treeEmitted = true;\n    } else {\n      // Tree already emitted - handle late-arriving spans individually\n      // Use the old parent-first emission pattern for these\n      let emitted = false;\n      do {\n        emitted = false;\n        for (const [spanId, span] of state.buffer) {\n          const parentCtx = span.parentSpanId ? state.contexts.get(span.parentSpanId) : undefined;\n          if (span.parentSpanId && !parentCtx) {\n            continue;\n          }\n\n          this.emitSingleSpan(span, state, parentCtx?.ddSpan);\n          state.buffer.delete(spanId);\n          emitted = true;\n        }\n      } while (emitted);\n    }\n\n    // Schedule cleanup if root has ended and buffer is empty\n    if (state.rootEnded && state.buffer.size === 0 && !state.cleanupTimer) {\n      const timer = setTimeout(() => {\n        const currentState = this.traceState.get(traceId);\n        if (currentState) {\n          if (currentState.buffer.size > 0) {\n            this.logger.warn('Discarding orphaned spans during cleanup', {\n              traceId,\n              orphanedCount: currentState.buffer.size,\n              spanIds: Array.from(currentState.buffer.keys()),\n            });\n          }\n          // Clear the max lifetime timer since normal cleanup is handling this\n          if (currentState.maxLifetimeTimer) {\n            clearTimeout(currentState.maxLifetimeTimer);\n          }\n        }\n        this.traceState.delete(traceId);\n        this.traceContext.delete(traceId);\n      }, REGULAR_CLEANUP_INTERVAL_MS);\n      // Prevent the timer from keeping the process alive\n      (timer as any).unref?.();\n      state.cleanupTimer = timer;\n    }\n  }\n\n  /**\n   * Builds a tree structure from buffered spans based on parentSpanId relationships.\n   * Returns the root node of the tree, or undefined if no root span is found.\n   */\n  private buildSpanTree(buffer: Map<string, AnyExportedSpan>): SpanNode | undefined {\n    // Create nodes for all spans\n    const nodes = new Map<string, SpanNode>();\n    let rootNode: SpanNode | undefined;\n\n    for (const span of buffer.values()) {\n      nodes.set(span.id, { span, children: [] });\n    }\n\n    // Build parent-child relationships\n    for (const node of nodes.values()) {\n      if (node.span.isRootSpan) {\n        rootNode = node;\n      } else if (node.span.parentSpanId) {\n        const parentNode = nodes.get(node.span.parentSpanId);\n        if (parentNode) {\n          parentNode.children.push(node);\n        } else {\n          // Orphaned span - parent not in buffer, treat as root-level\n          // This shouldn't happen normally but handles edge cases\n          this.logger.warn('Orphaned span detected during tree build', {\n            spanId: node.span.id,\n            parentSpanId: node.span.parentSpanId,\n            traceId: node.span.traceId,\n          });\n        }\n      }\n    }\n\n    // Sort children by start time for consistent ordering\n    for (const node of nodes.values()) {\n      node.children.sort((a, b) => {\n        const aTime =\n          a.span.startTime instanceof Date ? a.span.startTime.getTime() : new Date(a.span.startTime).getTime();\n        const bTime =\n          b.span.startTime instanceof Date ? b.span.startTime.getTime() : new Date(b.span.startTime).getTime();\n        return aTime - bTime;\n      });\n    }\n\n    return rootNode;\n  }\n\n  /**\n   * Builds LLMObs span options from a Mastra span.\n   * Handles trace context, timestamps, and conditional model information for LLM spans.\n   */\n  private buildSpanOptions(\n    span: AnyExportedSpan,\n    inheritedModelAttrs?: { model?: string; provider?: string },\n  ): { traceOptions: LLMObsSpanOptions; endTimeMs: number } {\n    const traceCtx = this.traceContext.get(span.traceId) || {\n      userId: span.metadata?.userId,\n      sessionId: span.metadata?.sessionId,\n    };\n\n    const kind = kindFor(span.type);\n    // MODEL_GENERATION carries model/provider; MODEL_STEP children inherit it from their parent.\n    const ownAttrs = span.attributes as ModelGenerationAttributes | undefined;\n    const attrs = {\n      model: ownAttrs?.model ?? inheritedModelAttrs?.model,\n      provider: ownAttrs?.provider ?? inheritedModelAttrs?.provider,\n    };\n\n    const startTime = toDate(span.startTime);\n    // Event spans are point-in-time markers; use startTime for endTime if not set (zero duration)\n    // Regular spans fall back to current time if endTime is not set\n    const endTime = span.endTime ? toDate(span.endTime) : span.isEvent ? startTime : new Date();\n\n    return {\n      traceOptions: {\n        kind,\n        name: span.name,\n        sessionId: traceCtx.sessionId,\n        userId: traceCtx.userId,\n        startTime,\n        ...(kind === 'llm' && attrs?.model ? { modelName: attrs.model } : {}),\n        ...(kind === 'llm' && attrs?.provider ? { modelProvider: attrs.provider } : {}),\n      },\n      // endTime as milliseconds for ddSpan.finish() — dd-trace's llmobs.trace() does not\n      // honor endTime in options, so we must call finish(ms) explicitly on the span.\n      endTimeMs: endTime.getTime(),\n    };\n  }\n\n  /**\n   * Recursively emits a span tree using nested llmobs.trace() calls.\n   * This ensures parent-child relationships are properly established in Datadog\n   * because child spans are created while their parent span is active in scope.\n   */\n  private emitSpanTree(\n    node: SpanNode,\n    state: TraceState,\n    inheritedModelAttrs?: { model?: string; provider?: string },\n  ): void {\n    const span = node.span;\n    const { traceOptions, endTimeMs } = this.buildSpanOptions(span, inheritedModelAttrs);\n\n    // If this is a MODEL_GENERATION, propagate its model/provider to MODEL_STEP descendants\n    // so the LLM-kind step spans in Datadog have a model name attached.\n    const childInheritedModelAttrs =\n      span.type === SpanType.MODEL_GENERATION\n        ? {\n            model: (span.attributes as ModelGenerationAttributes | undefined)?.model,\n            provider: (span.attributes as ModelGenerationAttributes | undefined)?.provider,\n          }\n        : inheritedModelAttrs;\n\n    // Use nested llmobs.trace() calls - children are emitted INSIDE the parent's callback\n    // This ensures the Datadog SDK automatically establishes parent-child relationships\n    tracer.llmobs.trace(traceOptions as any, (ddSpan: any) => {\n      // Annotate this span (must happen before finish — annotate throws on finished spans)\n      const annotations = this.buildAnnotations(span);\n      if (Object.keys(annotations).length > 0) {\n        tracer.llmobs.annotate(ddSpan, annotations);\n      }\n\n      // Set native Datadog error tags for proper Error Tracking UI\n      if (span.errorInfo) {\n        this.setErrorTags(ddSpan, span.errorInfo);\n      }\n\n      // Store context for potential evaluation submissions\n      const exported = tracer.llmobs.exportSpan ? tracer.llmobs.exportSpan(ddSpan) : undefined;\n      state.contexts.set(span.id, { ddSpan, exported });\n\n      // Recursively emit children INSIDE this span's callback\n      // This is the key to establishing proper parent-child relationships\n      for (const child of node.children) {\n        this.emitSpanTree(child, state, childInheritedModelAttrs);\n      }\n\n      // Explicitly finish with the correct end time. dd-trace's llmobs.trace() does not\n      // honor endTime in span options — it auto-finishes with Date.now() when the callback\n      // returns. By calling finish() here first, the auto-finish becomes a no-op (dd-trace\n      // skips finish if _duration is already set).\n      if (typeof ddSpan.finish === 'function') {\n        ddSpan.finish(endTimeMs);\n      }\n    });\n  }\n\n  /**\n   * Emit a single span with the proper Datadog parent context.\n   * Used for late-arriving spans after the main tree has been emitted.\n   */\n  private emitSingleSpan(span: AnyExportedSpan, state: TraceState, parent?: any) {\n    const { traceOptions, endTimeMs } = this.buildSpanOptions(span);\n\n    const runTrace = () =>\n      tracer.llmobs.trace(traceOptions as any, (ddSpan: any) => {\n        const annotations = this.buildAnnotations(span);\n        if (Object.keys(annotations).length > 0) {\n          tracer.llmobs.annotate(ddSpan, annotations);\n        }\n\n        // Set native Datadog error tags for proper Error Tracking UI\n        if (span.errorInfo) {\n          this.setErrorTags(ddSpan, span.errorInfo);\n        }\n\n        const exported = tracer.llmobs.exportSpan ? tracer.llmobs.exportSpan(ddSpan) : undefined;\n        state.contexts.set(span.id, { ddSpan, exported });\n\n        // Explicitly finish with the correct end time (see emitSpanTree for details)\n        if (typeof ddSpan.finish === 'function') {\n          ddSpan.finish(endTimeMs);\n        }\n      });\n\n    if (parent) {\n      tracer.scope().activate(parent, runTrace);\n    } else {\n      runTrace();\n    }\n  }\n}\n"]}