{"version":3,"file":"index.cjs","sources":["../../src/sanitization/media_type_context.ts","../../src/utils.ts","../../src/gatewayWarning.ts","../../src/openai-agents/processor.ts","../../src/openai-agents/index.ts"],"sourcesContent":["const MIME_HINT_KEYS = ['mediaType', 'media_type', 'mimeType', 'mime_type'] as const\n\nconst STRONG_CONTEXT_KEYS = new Set([\n  'data',\n  'file_data',\n  'fileData',\n  'image_url',\n  'imageUrl',\n  'video_url',\n  'videoUrl',\n  'audio',\n  'audio_data',\n  'audioData',\n  'inline_data',\n  'inlineData',\n  'source',\n  'result',\n])\n\nconst STRONG_CONTEXT_TYPES = new Set([\n  'image',\n  'image_url',\n  'input_image',\n  'audio',\n  'input_audio',\n  'video',\n  'video_url',\n  'file',\n  'input_file',\n  'document',\n  'media',\n  'file-data',\n])\n\nconst FILE_FAMILY_TYPES = new Set(['file', 'input_file', 'document', 'media', 'file-data'])\n\nconst KNOWN_AUDIO_FORMATS = new Set(['wav', 'mp3', 'ogg', 'flac', 'm4a', 'aac', 'webm'])\n\nexport class MediaTypeContext {\n  static readonly EMPTY = new MediaTypeContext(undefined, undefined)\n\n  constructor(\n    private readonly parent: Record<string, unknown> | undefined,\n    private readonly key: string | undefined\n  ) {}\n\n  inferMediaType(): string | undefined {\n    return (\n      this.inferFromSiblingMime() ?? this.inferFromSiblingFormat() ?? this.inferFromParentType() ?? this.inferFromKey()\n    )\n  }\n\n  inferFromSiblingMime(): string | undefined {\n    if (!this.parent) return undefined\n    for (const hint of MIME_HINT_KEYS) {\n      const v = this.parent[hint]\n      if (typeof v === 'string') return v\n    }\n    return undefined\n  }\n\n  inferFromSiblingFormat(): string | undefined {\n    if (!this.parent) return undefined\n    const fmt = this.parent.format\n    if (typeof fmt === 'string' && KNOWN_AUDIO_FORMATS.has(fmt.toLowerCase())) {\n      return `audio/${fmt.toLowerCase()}`\n    }\n    return undefined\n  }\n\n  inferFromParentType(): string | undefined {\n    if (!this.parent) return undefined\n    const t = this.parent.type\n    if (typeof t !== 'string') return undefined\n    if (t === 'image' || t === 'image_url' || t === 'input_image') return 'image'\n    if (t === 'audio' || t === 'input_audio') return 'audio'\n    if (t === 'video' || t === 'video_url') return 'video'\n    if (FILE_FAMILY_TYPES.has(t)) return 'application/octet-stream'\n    return undefined\n  }\n\n  inferFromKey(): string | undefined {\n    if (!this.key) return undefined\n    const key = this.key.toLowerCase()\n    if (key.includes('audio')) return 'audio'\n    if (key.includes('video')) return 'video'\n    if (key.includes('image')) return 'image'\n    if (key.includes('file') || key.includes('document')) return 'application/octet-stream'\n    return undefined\n  }\n\n  signalsBinary(): boolean {\n    if (this.parent) {\n      for (const hint of MIME_HINT_KEYS) {\n        if (typeof this.parent[hint] === 'string') return true\n      }\n      const fmt = this.parent.format\n      if (typeof fmt === 'string' && KNOWN_AUDIO_FORMATS.has(fmt.toLowerCase())) return true\n      const t = this.parent.type\n      if (typeof t === 'string' && STRONG_CONTEXT_TYPES.has(t)) return true\n    }\n    if (this.key && STRONG_CONTEXT_KEYS.has(this.key)) return true\n    return false\n  }\n}\n","import { PostHog } from 'posthog-node'\nimport type OpenAIOrignal from 'openai'\nimport type AnthropicOriginal from '@anthropic-ai/sdk'\nimport type { ResponseCreateParamsWithTools } from 'openai/lib/ResponsesParser'\nimport type {\n  FormattedMessage,\n  FormattedContent,\n  FormattedAudioContent,\n  FormattedImageContent,\n  FormattedDocumentContent,\n} from './types'\nimport { v4 as uuidv4 } from 'uuid'\nimport { isString } from './typeGuards'\nimport { redactBase64DataUrl } from './sanitization'\n\ntype ChatCompletionCreateParamsBase = OpenAIOrignal.Chat.Completions.ChatCompletionCreateParams\ntype MessageCreateParams = AnthropicOriginal.Messages.MessageCreateParams\ntype ResponseCreateParams = OpenAIOrignal.Responses.ResponseCreateParams\ntype EmbeddingCreateParams = OpenAIOrignal.EmbeddingCreateParams\ntype TranscriptionCreateParams = OpenAIOrignal.Audio.Transcriptions.TranscriptionCreateParams\n\nconst TOKEN_PROPERTY_KEYS = new Set([\n  '$ai_input_tokens',\n  '$ai_output_tokens',\n  '$ai_cache_read_input_tokens',\n  '$ai_cache_creation_input_tokens',\n  '$ai_total_tokens',\n  '$ai_reasoning_tokens',\n])\n\nexport function getTokensSource(posthogProperties?: Record<string, unknown>): string {\n  if (posthogProperties && Object.keys(posthogProperties).some((key) => TOKEN_PROPERTY_KEYS.has(key))) {\n    return 'passthrough'\n  }\n  return 'sdk'\n}\n\n// limit large outputs by truncating to 200kb (approx 200k bytes)\nexport const MAX_OUTPUT_SIZE = 200000\nconst STRING_FORMAT = 'utf8'\n\n// Reused across calls to avoid per-invocation allocation; truncate() runs\n// hundreds of times for prompts with many parts.\nconst sharedTextEncoder = new TextEncoder()\nconst sharedTextDecoder = new TextDecoder(STRING_FORMAT, { fatal: false })\n\nexport const utf8ByteLength = (str: string): number => sharedTextEncoder.encode(str).byteLength\n\n/**\n * Safely converts content to a string, preserving structure for objects/arrays.\n * - If content is already a string, returns it as-is\n * - If content is an object or array, stringifies it with JSON.stringify to preserve structure\n * - Otherwise, converts to string with String()\n *\n * This prevents the \"[object Object]\" bug when objects are naively converted to strings.\n *\n * @param content - The content to convert to a string\n * @returns A string representation that preserves structure for complex types\n */\nexport function toContentString(content: unknown): string {\n  if (typeof content === 'string') {\n    return content\n  }\n  if (content !== undefined && content !== null && typeof content === 'object') {\n    try {\n      return JSON.stringify(content)\n    } catch {\n      // Fallback for circular refs, BigInt, or objects with throwing toJSON\n      return String(content)\n    }\n  }\n  return String(content)\n}\n\nexport interface MonitoringEventPropertiesWithDefaults {\n  distinctId?: string\n  traceId: string\n  properties?: Record<string, any>\n  privacyMode: boolean\n  groups?: Record<string, any>\n  modelOverride?: string\n  providerOverride?: string\n  costOverride?: CostOverride\n  captureImmediate?: boolean\n}\n\nexport type MonitoringEventProperties = Partial<MonitoringEventPropertiesWithDefaults>\n\nexport type MonitoringParams = {\n  [K in keyof MonitoringEventProperties as `posthog${Capitalize<string & K>}`]: MonitoringEventProperties[K]\n}\n\nexport interface CostOverride {\n  inputCost: number\n  outputCost: number\n}\n\nexport const getModelParams = (\n  params:\n    | ((\n        | ChatCompletionCreateParamsBase\n        | MessageCreateParams\n        | ResponseCreateParams\n        | ResponseCreateParamsWithTools\n        | EmbeddingCreateParams\n        | TranscriptionCreateParams\n      ) &\n        MonitoringParams)\n    | null\n): Record<string, any> => {\n  if (!params) {\n    return {}\n  }\n  const modelParams: Record<string, any> = {}\n  const paramKeys = [\n    'temperature',\n    'max_tokens',\n    'max_completion_tokens',\n    'top_p',\n    'frequency_penalty',\n    'presence_penalty',\n    'n',\n    'stop',\n    'stream',\n    'streaming',\n    'language',\n    'response_format',\n    'timestamp_granularities',\n  ] as const\n\n  for (const key of paramKeys) {\n    if (key in params && (params as any)[key] !== undefined) {\n      modelParams[key] = (params as any)[key]\n    }\n  }\n  return modelParams\n}\n\n/**\n * Helper to format responses (non-streaming) for consumption\n */\nexport const formatResponse = (response: any, provider: string): FormattedMessage[] => {\n  if (!response) {\n    return []\n  }\n  if (provider === 'anthropic') {\n    return formatResponseAnthropic(response)\n  } else if (provider === 'openai') {\n    return formatResponseOpenAI(response)\n  } else if (provider === 'gemini') {\n    return formatResponseGemini(response)\n  }\n  return []\n}\n\nexport const formatResponseAnthropic = (response: any): FormattedMessage[] => {\n  const output: FormattedMessage[] = []\n  const content: FormattedContent = []\n\n  for (const choice of response.content ?? []) {\n    if (choice?.type === 'text' && choice?.text) {\n      content.push({ type: 'text', text: choice.text })\n    } else if (choice?.type === 'tool_use' && choice?.name && choice?.id) {\n      content.push({\n        type: 'function',\n        id: choice.id,\n        function: {\n          name: choice.name,\n          arguments: choice.input || {},\n        },\n      })\n    }\n  }\n\n  if (content.length > 0) {\n    output.push({\n      role: 'assistant',\n      content,\n    })\n  }\n\n  return output\n}\n\nexport const formatResponseOpenAI = (response: any): FormattedMessage[] => {\n  const output: FormattedMessage[] = []\n\n  if (response.choices) {\n    for (const choice of response.choices) {\n      const content: FormattedContent = []\n      let role = 'assistant'\n\n      if (choice.message) {\n        if (choice.message.role) {\n          role = choice.message.role\n        }\n\n        if (choice.message.content) {\n          content.push({ type: 'text', text: choice.message.content })\n        }\n\n        if (choice.message.tool_calls) {\n          for (const toolCall of choice.message.tool_calls) {\n            content.push({\n              type: 'function',\n              id: toolCall.id,\n              function: {\n                name: toolCall.function.name,\n                arguments: toolCall.function.arguments,\n              },\n            })\n          }\n        }\n\n        // Handle audio output (gpt-4o-audio-preview)\n        if (choice.message.audio) {\n          content.push({\n            type: 'audio',\n            ...choice.message.audio,\n          })\n        }\n      }\n\n      if (content.length > 0) {\n        output.push({\n          role,\n          content,\n        })\n      }\n    }\n  }\n\n  // Handle Responses API format\n  if (response.output) {\n    const content: FormattedContent = []\n    let role = 'assistant'\n\n    for (const item of response.output) {\n      if (item.type === 'message') {\n        role = item.role\n\n        if (item.content && Array.isArray(item.content)) {\n          for (const contentItem of item.content) {\n            if (contentItem.type === 'output_text' && contentItem.text) {\n              content.push({ type: 'text', text: contentItem.text })\n            } else if (contentItem.text) {\n              content.push({ type: 'text', text: contentItem.text })\n            } else if (contentItem.type === 'input_image' && contentItem.image_url) {\n              content.push({\n                type: 'image',\n                image: contentItem.image_url,\n              })\n            }\n          }\n        } else if (item.content) {\n          content.push({ type: 'text', text: String(item.content) })\n        }\n      } else if (item.type === 'function_call') {\n        content.push({\n          type: 'function',\n          id: item.call_id || item.id || '',\n          function: {\n            name: item.name,\n            arguments: item.arguments || {},\n          },\n        })\n      }\n    }\n\n    if (content.length > 0) {\n      output.push({\n        role,\n        content,\n      })\n    }\n  }\n\n  return output\n}\n\nexport const buildInlineDataBlock = (\n  mimeType: string,\n  data: string\n): FormattedAudioContent | FormattedImageContent | FormattedDocumentContent => {\n  if (mimeType.startsWith('audio/')) {\n    return { type: 'audio', mime_type: mimeType, data }\n  }\n  if (mimeType.startsWith('image/')) {\n    return { type: 'image', inline_data: { mime_type: mimeType, data } }\n  }\n  return { type: 'document', inline_data: { mime_type: mimeType, data } }\n}\n\nexport const formatResponseGemini = (response: any): FormattedMessage[] => {\n  const output: FormattedMessage[] = []\n\n  if (response.candidates && Array.isArray(response.candidates)) {\n    for (const candidate of response.candidates) {\n      if (candidate.content && candidate.content.parts) {\n        const content: FormattedContent = []\n\n        for (const part of candidate.content.parts) {\n          if (part.text) {\n            content.push({ type: 'text', text: part.text })\n          } else if (part.functionCall) {\n            content.push({\n              type: 'function',\n              function: {\n                name: part.functionCall.name,\n                arguments: part.functionCall.args,\n              },\n            })\n          } else if (part.inlineData) {\n            // Handle inline data (images, audio, documents)\n            const mimeType = part.inlineData.mimeType || part.inlineData.mime_type || 'application/octet-stream'\n            let data = part.inlineData.data\n\n            // Handle binary data (Uint8Array/Buffer -> base64)\n            if (data instanceof Uint8Array) {\n              if (typeof Buffer !== 'undefined') {\n                data = Buffer.from(data).toString('base64')\n              } else {\n                let binary = ''\n                for (let i = 0; i < data.length; i++) {\n                  binary += String.fromCharCode(data[i])\n                }\n                data = btoa(binary)\n              }\n            }\n\n            // Sanitize base64 data for images and other large inline data\n            data = redactBase64DataUrl(data)\n\n            content.push(buildInlineDataBlock(mimeType, data))\n          }\n        }\n\n        if (content.length > 0) {\n          output.push({\n            role: 'assistant',\n            content,\n          })\n        }\n      } else if (candidate.text) {\n        output.push({\n          role: 'assistant',\n          content: [{ type: 'text', text: candidate.text }],\n        })\n      }\n    }\n  } else if (response.text) {\n    output.push({\n      role: 'assistant',\n      content: [{ type: 'text', text: response.text }],\n    })\n  }\n\n  return output\n}\n\nexport const mergeSystemPrompt = (params: MessageCreateParams & MonitoringParams, provider: string): any => {\n  if (provider == 'anthropic') {\n    const messages = params.messages || []\n    if (!(params as any).system) {\n      return messages\n    }\n    const systemMessage = (params as any).system\n    return [{ role: 'system', content: systemMessage }, ...messages]\n  }\n  return params.messages\n}\n\nexport const withPrivacyMode = (client: PostHog, privacyMode: boolean, input: any): any => {\n  return (client as any).privacy_mode || privacyMode ? null : input\n}\n\nfunction toSafeString(input: unknown): string {\n  if (input === undefined || input === null) {\n    return ''\n  }\n  if (typeof input === 'string') {\n    return input\n  }\n  try {\n    return JSON.stringify(input)\n  } catch {\n    console.warn('Failed to stringify input', input)\n    return ''\n  }\n}\n\nexport const truncate = (input: unknown): string => {\n  const str = toSafeString(input)\n  if (str === '') {\n    return ''\n  }\n\n  // Check if we need to truncate and ensure STRING_FORMAT is respected\n  const buffer = sharedTextEncoder.encode(str)\n  if (buffer.length <= MAX_OUTPUT_SIZE) {\n    // Ensure STRING_FORMAT is respected\n    return sharedTextDecoder.decode(buffer)\n  }\n\n  // Truncate the buffer and ensure a valid string is returned.\n  // fatal: false means we get U+FFFD at the end if truncation broke the encoding.\n  const truncatedBuffer = buffer.slice(0, MAX_OUTPUT_SIZE)\n  let truncatedStr = sharedTextDecoder.decode(truncatedBuffer)\n  if (truncatedStr.endsWith('\\uFFFD')) {\n    truncatedStr = truncatedStr.slice(0, -1)\n  }\n  return `${truncatedStr}... [truncated]`\n}\n\n/**\n * Calculate web search count from raw API response.\n *\n * Uses a two-tier detection strategy:\n * Priority 1 (Exact Count): Count actual web search calls when available\n * Priority 2 (Binary Detection): Return 1 if web search indicators are present, 0 otherwise\n *\n * @param result - Raw API response from any provider (OpenAI, Perplexity, OpenRouter, Gemini, etc.)\n * @returns Number of web searches performed (exact count or binary 1/0)\n */\nexport function calculateWebSearchCount(result: unknown): number {\n  if (!result || typeof result !== 'object') {\n    return 0\n  }\n\n  // Priority 1: Exact Count\n  // Check for OpenAI Responses API web_search_call items\n  if ('output' in result && Array.isArray(result.output)) {\n    let count = 0\n\n    for (const item of result.output) {\n      if (typeof item === 'object' && item !== null && 'type' in item && item.type === 'web_search_call') {\n        count++\n      }\n    }\n\n    if (count > 0) {\n      return count\n    }\n  }\n\n  // Priority 2: Binary Detection (1 or 0)\n\n  // Check for citations at root level (Perplexity)\n  if ('citations' in result && Array.isArray(result.citations) && result.citations.length > 0) {\n    return 1\n  }\n\n  // Check for search_results at root level (Perplexity via OpenRouter)\n  if ('search_results' in result && Array.isArray(result.search_results) && result.search_results.length > 0) {\n    return 1\n  }\n\n  // Check for usage.search_context_size (Perplexity via OpenRouter)\n  if ('usage' in result && typeof result.usage === 'object' && result.usage !== null) {\n    if ('search_context_size' in result.usage && result.usage.search_context_size) {\n      return 1\n    }\n  }\n\n  // Check for annotations with url_citation in choices[].message or choices[].delta (OpenAI/Perplexity)\n  if ('choices' in result && Array.isArray(result.choices)) {\n    for (const choice of result.choices) {\n      if (typeof choice === 'object' && choice !== null) {\n        // Check both message (non-streaming) and delta (streaming) for annotations\n        const content = ('message' in choice ? choice.message : null) || ('delta' in choice ? choice.delta : null)\n\n        if (typeof content === 'object' && content !== null && 'annotations' in content) {\n          const annotations = content.annotations\n\n          if (Array.isArray(annotations)) {\n            const hasUrlCitation = annotations.some((ann: unknown) => {\n              return typeof ann === 'object' && ann !== null && 'type' in ann && ann.type === 'url_citation'\n            })\n\n            if (hasUrlCitation) {\n              return 1\n            }\n          }\n        }\n      }\n    }\n  }\n\n  // Check for annotations in output[].content[] (OpenAI Responses API)\n  if ('output' in result && Array.isArray(result.output)) {\n    for (const item of result.output) {\n      if (typeof item === 'object' && item !== null && 'content' in item) {\n        const content = item.content\n\n        if (Array.isArray(content)) {\n          for (const contentItem of content) {\n            if (typeof contentItem === 'object' && contentItem !== null && 'annotations' in contentItem) {\n              const annotations = contentItem.annotations\n\n              if (Array.isArray(annotations)) {\n                const hasUrlCitation = annotations.some((ann: unknown) => {\n                  return typeof ann === 'object' && ann !== null && 'type' in ann && ann.type === 'url_citation'\n                })\n\n                if (hasUrlCitation) {\n                  return 1\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n\n  // Check for grounding_metadata (Gemini)\n  if ('candidates' in result && Array.isArray(result.candidates)) {\n    for (const candidate of result.candidates) {\n      if (\n        typeof candidate === 'object' &&\n        candidate !== null &&\n        'grounding_metadata' in candidate &&\n        candidate.grounding_metadata\n      ) {\n        return 1\n      }\n    }\n  }\n\n  return 0\n}\n\n/**\n * Extract available tool calls from the request parameters.\n * These are the tools provided to the LLM, not the tool calls in the response.\n */\nexport const extractAvailableToolCalls = (provider: string, params: any): unknown[] | null => {\n  if (provider === 'anthropic') {\n    if (params.tools) {\n      return params.tools\n    }\n\n    return null\n  } else if (provider === 'gemini') {\n    if (params.config && params.config.tools) {\n      return params.config.tools\n    }\n\n    return null\n  } else if (provider === 'openai') {\n    if (params.tools) {\n      return params.tools\n    }\n\n    return null\n  } else if (provider === 'vercel') {\n    if (params.tools) {\n      return params.tools\n    }\n\n    return null\n  }\n\n  return null\n}\n\nexport enum AIEvent {\n  Generation = '$ai_generation',\n  Embedding = '$ai_embedding',\n}\n\nexport function sanitizeValues(obj: any): any {\n  if (obj === undefined || obj === null) {\n    return obj\n  }\n  const jsonSafe = JSON.parse(JSON.stringify(obj))\n  if (typeof jsonSafe === 'string') {\n    // Sanitize lone surrogates by round-tripping through UTF-8\n    return new TextDecoder().decode(new TextEncoder().encode(jsonSafe))\n  } else if (Array.isArray(jsonSafe)) {\n    return jsonSafe.map(sanitizeValues)\n  } else if (jsonSafe && typeof jsonSafe === 'object') {\n    return Object.fromEntries(Object.entries(jsonSafe).map(([k, v]) => [k, sanitizeValues(v)]))\n  }\n  return jsonSafe\n}\n\nconst POSTHOG_PARAMS_MAP: Record<keyof MonitoringParams, string> = {\n  posthogDistinctId: 'distinctId',\n  posthogTraceId: 'traceId',\n  posthogProperties: 'properties',\n  posthogPrivacyMode: 'privacyMode',\n  posthogGroups: 'groups',\n  posthogModelOverride: 'modelOverride',\n  posthogProviderOverride: 'providerOverride',\n  posthogCostOverride: 'costOverride',\n  posthogCaptureImmediate: 'captureImmediate',\n}\n\nexport function extractPosthogParams<T>(body: T & MonitoringParams): {\n  providerParams: T\n  posthogParams: MonitoringEventPropertiesWithDefaults\n} {\n  const providerParams: Record<string, unknown> = {}\n  const posthogParams: Record<string, unknown> = {}\n\n  for (const [key, value] of Object.entries(body)) {\n    if (POSTHOG_PARAMS_MAP[key as keyof MonitoringParams]) {\n      posthogParams[POSTHOG_PARAMS_MAP[key as keyof MonitoringParams]] = value\n    } else if (key.startsWith('posthog')) {\n      console.warn(`Unknown Posthog parameter ${key}`)\n    } else {\n      providerParams[key] = value\n    }\n  }\n\n  return {\n    providerParams: providerParams as T,\n    posthogParams: addDefaults(posthogParams),\n  }\n}\n\nfunction addDefaults(params: MonitoringEventProperties): MonitoringEventPropertiesWithDefaults {\n  return {\n    ...params,\n    privacyMode: params.privacyMode ?? false,\n    traceId: params.traceId ?? uuidv4(),\n  }\n}\n\nexport function formatOpenAIResponsesInput(input: unknown, instructions?: string | null): FormattedMessage[] {\n  const messages: FormattedMessage[] = []\n\n  if (instructions) {\n    messages.push({\n      role: 'system',\n      content: instructions,\n    })\n  }\n\n  if (Array.isArray(input)) {\n    for (const item of input) {\n      if (typeof item === 'string') {\n        messages.push({ role: 'user', content: item })\n      } else if (item && typeof item === 'object') {\n        const obj = item as Record<string, unknown>\n        const role = isString(obj.role) ? obj.role : 'user'\n\n        // Handle content properly - preserve structure for objects/arrays\n        const content = obj.content ?? obj.text ?? item\n        messages.push({ role, content: toContentString(content) })\n      } else {\n        messages.push({ role: 'user', content: toContentString(item) })\n      }\n    }\n  } else if (typeof input === 'string') {\n    messages.push({ role: 'user', content: input })\n  } else if (input) {\n    messages.push({ role: 'user', content: toContentString(input) })\n  }\n\n  return messages\n}\n","// Warn when a wrapper's base_url points at the PostHog AI Gateway: the gateway\n// emits its own $ai_generation, so each call would be captured (and, for billable\n// products, billed) twice. We only warn — the wrapper's event carries data the\n// gateway never sees (groups, custom properties, trace hierarchy).\n\n// Keep in sync with the gateway's deployed hosts (see services/llm-gateway in the\n// main repo). gateway.us.posthog.com is live today; the rest are listed ahead of\n// any traffic moving to them.\nexport const POSTHOG_AI_GATEWAY_HOSTS: readonly string[] = [\n  'gateway.posthog.com',\n  'gateway.us.posthog.com',\n  'gateway.eu.posthog.com',\n  'ai-gateway.us.posthog.com',\n  'ai-gateway.eu.posthog.com',\n]\n\n// Swap for the dedicated AI Gateway page once it ships.\nconst GATEWAY_DOCS_URL = 'https://posthog.com/docs/ai-observability'\n\nconst extractHost = (baseURL: string): string | undefined => {\n  try {\n    // Tolerate bare hosts that omit a scheme, e.g. \"gateway.us.posthog.com/v1\".\n    const hasScheme = /^[a-z][a-z0-9+.-]*:\\/\\//i.test(baseURL)\n    return new URL(hasScheme ? baseURL : `https://${baseURL}`).hostname.toLowerCase()\n  } catch {\n    return undefined\n  }\n}\n\nexport const isPostHogAiGatewayUrl = (baseURL: string | undefined | null): boolean => {\n  if (!baseURL) {\n    return false\n  }\n  const host = extractHost(baseURL)\n  return host !== undefined && POSTHOG_AI_GATEWAY_HOSTS.includes(host)\n}\n\n// Warns on every gateway call by design: the misconfiguration is impossible to\n// miss that way, and a doubled bill is worse than noisy logs.\nexport const warnIfPostHogAiGateway = (baseURL: string | undefined | null): void => {\n  if (!isPostHogAiGatewayUrl(baseURL)) {\n    return\n  }\n  console.warn(\n    '[PostHog] The PostHog AI wrapper is pointed at the PostHog AI Gateway. ' +\n      'Both capture $ai_generation, so every call is double-counted and double-billed. ' +\n      `Use one or the other — see ${GATEWAY_DOCS_URL}.`\n  )\n}\n\n// OTel spans don't pass through captureAiGeneration, so detect the gateway from\n// the span's host/URL attributes instead. These follow the GenAI / HTTP semantic\n// conventions: `server.address` is a bare host, `url.full` a full URL, both of\n// which isPostHogAiGatewayUrl accepts.\nconst OTEL_GATEWAY_URL_ATTRIBUTES = ['server.address', 'url.full'] as const\n\nexport const warnIfPostHogAiGatewayOtelAttributes = (attributes: Record<string, unknown> | undefined): void => {\n  if (!attributes) {\n    return\n  }\n  for (const key of OTEL_GATEWAY_URL_ATTRIBUTES) {\n    const value = attributes[key]\n    if (typeof value === 'string' && isPostHogAiGatewayUrl(value)) {\n      warnIfPostHogAiGateway(value)\n      return\n    }\n  }\n}\n","import type { PostHog, EventMessage } from 'posthog-node'\nimport type {\n  TracingProcessor,\n  Trace,\n  Span,\n  SpanData,\n  SpanError,\n  AgentSpanData,\n  FunctionSpanData,\n  GenerationSpanData,\n  ResponseSpanData,\n  HandoffSpanData,\n  CustomSpanData,\n  GuardrailSpanData,\n  TranscriptionSpanData,\n  SpeechSpanData,\n  SpeechGroupSpanData,\n  MCPListToolsSpanData,\n} from '@openai/agents-core'\nimport { MAX_OUTPUT_SIZE, toContentString, truncate, utf8ByteLength, withPrivacyMode } from '../utils'\nimport { version } from '../../package.json'\nimport { warnIfPostHogAiGateway } from '../gatewayWarning'\n\n/**\n * Normalize OpenAI Responses API input items to include a `role` field.\n * Items like `function_call` and `function_call_result` don't have a role,\n * causing PostHog's trace viewer to default them to \"user\".\n */\nfunction normalizeInputRoles(input: unknown): unknown {\n  if (!Array.isArray(input)) {\n    return input\n  }\n  return input.map((item) => {\n    if (item && typeof item === 'object' && !('role' in item) && 'type' in item) {\n      if (item.type === 'function_call') {\n        return { ...item, role: 'assistant' }\n      }\n      if (item.type === 'function_call_result') {\n        return { ...item, role: 'tool' }\n      }\n    }\n    return item\n  })\n}\n\nfunction safeContentString(value: unknown): string {\n  try {\n    return toContentString(value)\n  } catch {\n    return Object.prototype.toString.call(value)\n  }\n}\n\nfunction ensureSerializable(obj: unknown): unknown {\n  if (obj === null || obj === undefined) {\n    return obj\n  }\n  try {\n    const serializedValue = JSON.stringify(obj)\n    return serializedValue === undefined ? safeContentString(obj) : obj\n  } catch {\n    return safeContentString(obj)\n  }\n}\n\nfunction stringifyForSizeCheck(value: unknown): string | null {\n  if (value === null || value === undefined) {\n    return null\n  }\n\n  if (typeof value === 'string') {\n    return value\n  }\n\n  try {\n    return JSON.stringify(value) ?? safeContentString(value)\n  } catch {\n    return safeContentString(value)\n  }\n}\n\nfunction exceedsMaxOutputSize(serializedValue: string | null): boolean {\n  return serializedValue === null ? false : utf8ByteLength(serializedValue) > MAX_OUTPUT_SIZE\n}\n\nfunction parseIsoTimestamp(isoStr: string | null | undefined): number | null {\n  if (typeof isoStr !== 'string' || isoStr.trim() === '') {\n    return null\n  }\n\n  const ts = new Date(isoStr).getTime()\n  return Number.isFinite(ts) ? ts / 1000 : null\n}\n\ninterface TraceMetadata {\n  name: string\n  groupId: string | null\n  metadata: Record<string, any> | undefined\n  distinctId: string | undefined\n  startTime: number\n}\n\nexport type DistinctIdResolver = string | ((trace: Trace) => string | null | undefined)\nexport type TracingProcessorErrorContext =\n  | 'capture'\n  | 'onTraceStart'\n  | 'onTraceEnd'\n  | 'onSpanStart'\n  | 'onSpanEnd'\n  | 'shutdown'\n  | 'forceFlush'\nexport type TracingProcessorErrorHandler = (error: unknown, context: TracingProcessorErrorContext) => void\n\nexport interface PostHogTracingProcessorOptions {\n  client: PostHog\n  distinctId?: DistinctIdResolver\n  privacyMode?: boolean\n  groups?: Record<string, any>\n  properties?: Record<string, any>\n  onError?: TracingProcessorErrorHandler\n}\n\n/**\n * A tracing processor that sends OpenAI Agents SDK traces to PostHog.\n *\n * Implements the TracingProcessor interface from the OpenAI Agents SDK\n * and maps agent traces, spans, and generations to PostHog's LLM analytics events.\n *\n * @example\n * ```typescript\n * import { PostHogTracingProcessor } from '@posthog/ai/openai-agents'\n * import { addTraceProcessor } from '@openai/agents'\n *\n * const processor = new PostHogTracingProcessor({\n *   client: posthog,\n *   distinctId: 'user@example.com',\n * })\n * addTraceProcessor(processor)\n * ```\n */\nexport class PostHogTracingProcessor implements TracingProcessor {\n  private _client: PostHog\n  private _distinctId: DistinctIdResolver | undefined\n  private _privacyMode: boolean\n  private _groups: Record<string, any>\n  private _properties: Record<string, any>\n  private _onError: TracingProcessorErrorHandler | undefined\n\n  private _spanStartTimes: Map<string, number> = new Map()\n  private _traceMetadata: Map<string, TraceMetadata> = new Map()\n  private _maxTrackedEntries = 10000\n\n  constructor(options: PostHogTracingProcessorOptions) {\n    this._client = options.client\n    this._distinctId = options.distinctId\n    this._privacyMode = options.privacyMode ?? false\n    this._groups = options.groups ?? {}\n    this._properties = options.properties ?? {}\n    this._onError = options.onError\n  }\n\n  private _getDistinctId(trace: Trace | null): string | undefined {\n    if (typeof this._distinctId === 'function') {\n      if (trace) {\n        const result = this._distinctId(trace)\n        if (result) {\n          return String(result)\n        }\n      }\n      return undefined\n    } else if (this._distinctId) {\n      return String(this._distinctId)\n    }\n    return undefined\n  }\n\n  private _withPrivacyMode(value: unknown): unknown {\n    return withPrivacyMode(this._client, this._privacyMode, value)\n  }\n\n  private _prepareCapturedValue(value: unknown): unknown {\n    const serializableValue = ensureSerializable(value)\n    const serializedValue = stringifyForSizeCheck(serializableValue)\n    const boundedValue = exceedsMaxOutputSize(serializedValue) ? truncate(serializedValue) : serializableValue\n    return this._withPrivacyMode(boundedValue)\n  }\n\n  private _evictStaleEntries(): void {\n    if (this._spanStartTimes.size > this._maxTrackedEntries) {\n      const entries = [...this._spanStartTimes.entries()].sort((a, b) => a[1] - b[1])\n      const toRemove = entries.slice(0, Math.floor(entries.length / 2))\n      for (const [key] of toRemove) {\n        this._spanStartTimes.delete(key)\n      }\n    }\n\n    if (this._traceMetadata.size > this._maxTrackedEntries) {\n      const keys = [...this._traceMetadata.keys()]\n      const toRemove = keys.slice(0, Math.floor(keys.length / 2))\n      for (const key of toRemove) {\n        this._traceMetadata.delete(key)\n      }\n    }\n  }\n\n  private _handleError(error: unknown, context: TracingProcessorErrorContext): void {\n    try {\n      this._onError?.(error, context)\n    } catch (handlerError) {\n      // Preserve the tracing processor's non-throwing contract even if the error handler fails.\n      void handlerError\n    }\n  }\n\n  private _captureEvent(event: string, properties: Record<string, any>, distinctId?: string): void {\n    try {\n      if (!this._client?.capture) {\n        return\n      }\n\n      const finalProperties = {\n        ...this._properties,\n        ...properties,\n      }\n\n      const eventMessage: EventMessage = {\n        distinctId: distinctId || 'unknown',\n        event,\n        properties: finalProperties,\n        groups: Object.keys(this._groups).length > 0 ? this._groups : undefined,\n      }\n\n      this._client.capture(eventMessage)\n    } catch (error) {\n      this._handleError(error, 'capture')\n    }\n  }\n\n  private _baseProperties(\n    traceId: string,\n    spanId: string,\n    parentId: string | null,\n    latency: number,\n    groupId: string | null,\n    errorProperties: Record<string, any>\n  ): Record<string, any> {\n    const properties: Record<string, any> = {\n      $ai_lib: 'posthog-ai',\n      $ai_lib_version: version,\n      $ai_trace_id: traceId,\n      $ai_span_id: spanId,\n      $ai_parent_id: parentId,\n      $ai_provider: 'openai',\n      $ai_framework: 'openai-agents',\n      $ai_latency: latency,\n      ...errorProperties,\n    }\n    if (groupId) {\n      properties.$ai_group_id = groupId\n    }\n    return properties\n  }\n\n  private _getErrorProperties(error: SpanError | null): Record<string, any> {\n    if (!error) {\n      return {}\n    }\n\n    const errorMessage = error.message || String(error)\n\n    let errorType = 'unknown'\n    if (errorMessage.includes('ModelBehaviorError')) {\n      errorType = 'model_behavior_error'\n    } else if (errorMessage.includes('UserError')) {\n      errorType = 'user_error'\n    } else if (errorMessage.includes('InputGuardrailTripwireTriggered')) {\n      errorType = 'input_guardrail_triggered'\n    } else if (errorMessage.includes('OutputGuardrailTripwireTriggered')) {\n      errorType = 'output_guardrail_triggered'\n    } else if (errorMessage.includes('MaxTurnsExceeded')) {\n      errorType = 'max_turns_exceeded'\n    }\n\n    return {\n      $ai_is_error: true,\n      $ai_error: errorMessage,\n      $ai_error_type: errorType,\n    }\n  }\n\n  // --- TracingProcessor interface ---\n\n  async onTraceStart(trace: Trace): Promise<void> {\n    try {\n      this._evictStaleEntries()\n\n      const traceId = trace.traceId\n      const traceName = trace.name\n      const groupId = trace.groupId ?? null\n      const metadata = trace.metadata\n\n      const distinctId = this._getDistinctId(trace)\n\n      this._traceMetadata.set(traceId, {\n        name: traceName,\n        groupId,\n        metadata,\n        distinctId,\n        startTime: Date.now() / 1000,\n      })\n    } catch (error) {\n      this._handleError(error, 'onTraceStart')\n    }\n  }\n\n  async onTraceEnd(trace: Trace): Promise<void> {\n    try {\n      const traceId = trace.traceId\n\n      const traceInfo = this._traceMetadata.get(traceId)\n      this._traceMetadata.delete(traceId)\n\n      const traceName = traceInfo?.name ?? trace.name\n      const groupId = traceInfo?.groupId ?? trace.groupId ?? null\n      const metadata = traceInfo?.metadata ?? trace.metadata\n      const distinctId = traceInfo?.distinctId ?? this._getDistinctId(trace)\n\n      const startTime = traceInfo?.startTime\n      const latency = startTime != null ? Date.now() / 1000 - startTime : undefined\n\n      const properties: Record<string, any> = {\n        $ai_lib: 'posthog-ai',\n        $ai_lib_version: version,\n        $ai_trace_id: traceId,\n        $ai_trace_name: traceName,\n        $ai_provider: 'openai',\n        $ai_framework: 'openai-agents',\n      }\n\n      if (latency != null) {\n        properties.$ai_latency = latency\n      }\n\n      if (groupId) {\n        properties.$ai_group_id = groupId\n      }\n\n      if (metadata && Object.keys(metadata).length > 0) {\n        properties.$ai_trace_metadata = this._prepareCapturedValue(metadata)\n      }\n\n      if (distinctId == null) {\n        properties.$process_person_profile = false\n      }\n\n      this._captureEvent('$ai_trace', properties, distinctId ?? traceId)\n    } catch (error) {\n      this._handleError(error, 'onTraceEnd')\n    }\n  }\n\n  async onSpanStart(span: Span<SpanData>): Promise<void> {\n    try {\n      this._evictStaleEntries()\n      this._spanStartTimes.set(span.spanId, Date.now() / 1000)\n    } catch (error) {\n      this._handleError(error, 'onSpanStart')\n    }\n  }\n\n  async onSpanEnd(span: Span<SpanData>): Promise<void> {\n    try {\n      const spanId = span.spanId\n      const traceId = span.traceId\n      const parentId = span.parentId\n      const spanData = span.spanData\n\n      // Calculate latency\n      const startTime = this._spanStartTimes.get(spanId)\n      this._spanStartTimes.delete(spanId)\n      let latency: number\n      if (startTime != null) {\n        latency = Date.now() / 1000 - startTime\n      } else {\n        const started = parseIsoTimestamp(span.startedAt)\n        const ended = parseIsoTimestamp(span.endedAt)\n        latency = started != null && ended != null ? ended - started : 0\n      }\n\n      // Get distinct ID from trace metadata\n      const traceInfo = this._traceMetadata.get(traceId)\n      const userDistinctId = traceInfo?.distinctId ?? this._getDistinctId(null)\n\n      // Get group_id from trace metadata\n      const groupId = traceInfo?.groupId ?? null\n\n      // Get error properties\n      const errorProperties = this._getErrorProperties(span.error)\n\n      // Personless mode: no user-provided distinct_id, fallback to trace_id\n      if (userDistinctId == null) {\n        errorProperties.$process_person_profile = false\n      }\n      const distinctId: string = userDistinctId ?? traceId\n\n      // Dispatch based on span data type\n      switch (spanData.type) {\n        case 'generation':\n          this._handleGenerationSpan(spanData, traceId, spanId, parentId, latency, distinctId, groupId, errorProperties)\n          break\n        case 'response':\n          this._handleResponseSpan(spanData, traceId, spanId, parentId, latency, distinctId, groupId, errorProperties)\n          break\n        case 'function':\n          this._handleFunctionSpan(spanData, traceId, spanId, parentId, latency, distinctId, groupId, errorProperties)\n          break\n        case 'agent':\n          this._handleAgentSpan(spanData, traceId, spanId, parentId, latency, distinctId, groupId, errorProperties)\n          break\n        case 'handoff':\n          this._handleHandoffSpan(spanData, traceId, spanId, parentId, latency, distinctId, groupId, errorProperties)\n          break\n        case 'guardrail':\n          this._handleGuardrailSpan(spanData, traceId, spanId, parentId, latency, distinctId, groupId, errorProperties)\n          break\n        case 'custom':\n          this._handleCustomSpan(spanData, traceId, spanId, parentId, latency, distinctId, groupId, errorProperties)\n          break\n        case 'transcription':\n        case 'speech':\n        case 'speech_group':\n          this._handleAudioSpan(spanData, traceId, spanId, parentId, latency, distinctId, groupId, errorProperties)\n          break\n        case 'mcp_tools':\n          this._handleMcpSpan(spanData, traceId, spanId, parentId, latency, distinctId, groupId, errorProperties)\n          break\n        default:\n          this._handleGenericSpan(spanData, traceId, spanId, parentId, latency, distinctId, groupId, errorProperties)\n          break\n      }\n    } catch (error) {\n      this._handleError(error, 'onSpanEnd')\n    }\n  }\n\n  async shutdown(): Promise<void> {\n    try {\n      this._spanStartTimes.clear()\n      this._traceMetadata.clear()\n\n      if (typeof this._client?.flush === 'function') {\n        await this._client.flush()\n      }\n    } catch (error) {\n      this._handleError(error, 'shutdown')\n    }\n  }\n\n  async forceFlush(): Promise<void> {\n    try {\n      if (typeof this._client?.flush === 'function') {\n        await this._client.flush()\n      }\n    } catch (error) {\n      this._handleError(error, 'forceFlush')\n    }\n  }\n\n  // --- Span handlers ---\n\n  private _handleGenerationSpan(\n    spanData: GenerationSpanData,\n    traceId: string,\n    spanId: string,\n    parentId: string | null,\n    latency: number,\n    distinctId: string,\n    groupId: string | null,\n    errorProperties: Record<string, any>\n  ): void {\n    const usage = spanData.usage ?? {}\n    const inputTokens = (usage.input_tokens as number) || (usage as any).prompt_tokens || 0\n    const outputTokens = (usage.output_tokens as number) || (usage as any).completion_tokens || 0\n\n    const modelConfig = spanData.model_config ?? {}\n    const modelParams: Record<string, any> = {}\n    for (const param of ['temperature', 'max_tokens', 'top_p', 'frequency_penalty', 'presence_penalty']) {\n      if (param in modelConfig) {\n        modelParams[param] = modelConfig[param]\n      }\n    }\n\n    if (typeof modelConfig.base_url === 'string') {\n      warnIfPostHogAiGateway(modelConfig.base_url)\n    }\n\n    const properties: Record<string, any> = {\n      ...this._baseProperties(traceId, spanId, parentId, latency, groupId, errorProperties),\n      $ai_model: spanData.model,\n      // Best-effort: Agents SDK only sets model_config.base_url for chat-completions\n      // calls with no model settings; Responses and normal chat calls omit it, so ''.\n      $ai_base_url: typeof modelConfig.base_url === 'string' ? modelConfig.base_url : '',\n      $ai_model_parameters: Object.keys(modelParams).length > 0 ? modelParams : null,\n      $ai_input: this._prepareCapturedValue(normalizeInputRoles(spanData.input)),\n      $ai_output_choices: this._prepareCapturedValue(spanData.output),\n      $ai_input_tokens: inputTokens,\n      $ai_output_tokens: outputTokens,\n      $ai_total_tokens: inputTokens + outputTokens,\n    }\n\n    if (usage.details) {\n      const details = usage.details as Record<string, unknown>\n      if (details.reasoning_tokens) {\n        properties.$ai_reasoning_tokens = details.reasoning_tokens\n      }\n      if (details.cache_read_input_tokens) {\n        properties.$ai_cache_read_input_tokens = details.cache_read_input_tokens\n      }\n      if (details.cache_creation_input_tokens) {\n        properties.$ai_cache_creation_input_tokens = details.cache_creation_input_tokens\n      }\n    }\n\n    // Also check top-level usage for reasoning/cache tokens (flexible schema)\n    if ((usage as any).reasoning_tokens) {\n      properties.$ai_reasoning_tokens = (usage as any).reasoning_tokens\n    }\n    if ((usage as any).cache_read_input_tokens) {\n      properties.$ai_cache_read_input_tokens = (usage as any).cache_read_input_tokens\n    }\n    if ((usage as any).cache_creation_input_tokens) {\n      properties.$ai_cache_creation_input_tokens = (usage as any).cache_creation_input_tokens\n    }\n\n    this._captureEvent('$ai_generation', properties, distinctId)\n  }\n\n  private _handleResponseSpan(\n    spanData: ResponseSpanData,\n    traceId: string,\n    spanId: string,\n    parentId: string | null,\n    latency: number,\n    distinctId: string,\n    groupId: string | null,\n    errorProperties: Record<string, any>\n  ): void {\n    // The OpenAI Agents SDK exposes these underscored fields for non-OpenAI tracing providers.\n    // Treat them as best-effort and avoid assuming they are always present.\n    const responseSpanData = spanData as ResponseSpanData & { _input?: unknown; _response?: Record<string, any> }\n    const response = responseSpanData._response\n    const responseId = spanData.response_id ?? (response?.id as string | undefined)\n\n    // Extract usage from response\n    const usage = response?.usage ?? {}\n    const inputTokens = usage?.input_tokens ?? 0\n    const outputTokens = usage?.output_tokens ?? 0\n\n    // Extract model from response\n    const model = response?.model as string | undefined\n\n    // No $ai_base_url: ResponseSpanData carries no base URL, so dedup can't see these.\n    const properties: Record<string, any> = {\n      ...this._baseProperties(traceId, spanId, parentId, latency, groupId, errorProperties),\n      $ai_model: model,\n      $ai_response_id: responseId,\n      $ai_input: this._prepareCapturedValue(normalizeInputRoles(responseSpanData._input)),\n      $ai_input_tokens: inputTokens,\n      $ai_output_tokens: outputTokens,\n      $ai_total_tokens: inputTokens + outputTokens,\n    }\n\n    // Extract output from response\n    if (response?.output) {\n      properties.$ai_output_choices = this._prepareCapturedValue(response.output)\n    }\n\n    this._captureEvent('$ai_generation', properties, distinctId)\n  }\n\n  private _handleFunctionSpan(\n    spanData: FunctionSpanData,\n    traceId: string,\n    spanId: string,\n    parentId: string | null,\n    latency: number,\n    distinctId: string,\n    groupId: string | null,\n    errorProperties: Record<string, any>\n  ): void {\n    const properties: Record<string, any> = {\n      ...this._baseProperties(traceId, spanId, parentId, latency, groupId, errorProperties),\n      $ai_span_name: spanData.name,\n      $ai_span_type: 'tool',\n      $ai_input_state: this._prepareCapturedValue(spanData.input),\n      $ai_output_state: this._prepareCapturedValue(spanData.output),\n    }\n\n    if (spanData.mcp_data) {\n      properties.$ai_mcp_data = this._prepareCapturedValue(spanData.mcp_data)\n    }\n\n    this._captureEvent('$ai_span', properties, distinctId)\n  }\n\n  private _handleAgentSpan(\n    spanData: AgentSpanData,\n    traceId: string,\n    spanId: string,\n    parentId: string | null,\n    latency: number,\n    distinctId: string,\n    groupId: string | null,\n    errorProperties: Record<string, any>\n  ): void {\n    const properties: Record<string, any> = {\n      ...this._baseProperties(traceId, spanId, parentId, latency, groupId, errorProperties),\n      $ai_span_name: spanData.name,\n      $ai_span_type: 'agent',\n    }\n\n    if (spanData.handoffs) {\n      properties.$ai_agent_handoffs = spanData.handoffs\n    }\n    if (spanData.tools) {\n      properties.$ai_agent_tools = spanData.tools\n    }\n    if (spanData.output_type) {\n      properties.$ai_agent_output_type = spanData.output_type\n    }\n\n    this._captureEvent('$ai_span', properties, distinctId)\n  }\n\n  private _handleHandoffSpan(\n    spanData: HandoffSpanData,\n    traceId: string,\n    spanId: string,\n    parentId: string | null,\n    latency: number,\n    distinctId: string,\n    groupId: string | null,\n    errorProperties: Record<string, any>\n  ): void {\n    const properties: Record<string, any> = {\n      ...this._baseProperties(traceId, spanId, parentId, latency, groupId, errorProperties),\n      $ai_span_name: `${spanData.from_agent} -> ${spanData.to_agent}`,\n      $ai_span_type: 'handoff',\n      $ai_handoff_from_agent: spanData.from_agent,\n      $ai_handoff_to_agent: spanData.to_agent,\n    }\n\n    this._captureEvent('$ai_span', properties, distinctId)\n  }\n\n  private _handleGuardrailSpan(\n    spanData: GuardrailSpanData,\n    traceId: string,\n    spanId: string,\n    parentId: string | null,\n    latency: number,\n    distinctId: string,\n    groupId: string | null,\n    errorProperties: Record<string, any>\n  ): void {\n    const properties: Record<string, any> = {\n      ...this._baseProperties(traceId, spanId, parentId, latency, groupId, errorProperties),\n      $ai_span_name: spanData.name,\n      $ai_span_type: 'guardrail',\n      $ai_guardrail_triggered: spanData.triggered,\n    }\n\n    this._captureEvent('$ai_span', properties, distinctId)\n  }\n\n  private _handleCustomSpan(\n    spanData: CustomSpanData,\n    traceId: string,\n    spanId: string,\n    parentId: string | null,\n    latency: number,\n    distinctId: string,\n    groupId: string | null,\n    errorProperties: Record<string, any>\n  ): void {\n    const properties: Record<string, any> = {\n      ...this._baseProperties(traceId, spanId, parentId, latency, groupId, errorProperties),\n      $ai_span_name: spanData.name,\n      $ai_span_type: 'custom',\n      $ai_custom_data: this._prepareCapturedValue(spanData.data),\n    }\n\n    this._captureEvent('$ai_span', properties, distinctId)\n  }\n\n  private _handleAudioSpan(\n    spanData: TranscriptionSpanData | SpeechSpanData | SpeechGroupSpanData,\n    traceId: string,\n    spanId: string,\n    parentId: string | null,\n    latency: number,\n    distinctId: string,\n    groupId: string | null,\n    errorProperties: Record<string, any>\n  ): void {\n    const spanType = spanData.type\n\n    const properties: Record<string, any> = {\n      ...this._baseProperties(traceId, spanId, parentId, latency, groupId, errorProperties),\n      $ai_span_name: spanType,\n      $ai_span_type: spanType,\n    }\n\n    // Add model info if available\n    if ('model' in spanData && spanData.model) {\n      properties.$ai_model = spanData.model\n    }\n\n    // Add model config if available\n    if ('model_config' in spanData && spanData.model_config) {\n      properties.$ai_model_config = this._prepareCapturedValue(spanData.model_config)\n    }\n\n    // Add audio format info\n    if (spanData.type === 'transcription') {\n      const transcription = spanData as TranscriptionSpanData\n      if (transcription.input?.format) {\n        properties.$ai_audio_input_format = transcription.input.format\n      }\n      // Transcription output is text\n      if (transcription.output) {\n        properties.$ai_output_state = this._prepareCapturedValue(transcription.output)\n      }\n    } else if (spanData.type === 'speech') {\n      const speech = spanData as SpeechSpanData\n      if (speech.output?.format) {\n        properties.$ai_audio_output_format = speech.output.format\n      }\n      // Text input for TTS\n      if (speech.input) {\n        properties.$ai_input = this._prepareCapturedValue(speech.input)\n      }\n    } else if (spanData.type === 'speech_group') {\n      const speechGroup = spanData as SpeechGroupSpanData\n      if (speechGroup.input) {\n        properties.$ai_input = this._prepareCapturedValue(speechGroup.input)\n      }\n    }\n\n    this._captureEvent('$ai_span', properties, distinctId)\n  }\n\n  private _handleMcpSpan(\n    spanData: MCPListToolsSpanData,\n    traceId: string,\n    spanId: string,\n    parentId: string | null,\n    latency: number,\n    distinctId: string,\n    groupId: string | null,\n    errorProperties: Record<string, any>\n  ): void {\n    const properties: Record<string, any> = {\n      ...this._baseProperties(traceId, spanId, parentId, latency, groupId, errorProperties),\n      $ai_span_name: `mcp:${spanData.server}`,\n      $ai_span_type: 'mcp_tools',\n      $ai_mcp_server: spanData.server,\n      $ai_mcp_tools: this._prepareCapturedValue(spanData.result),\n    }\n\n    this._captureEvent('$ai_span', properties, distinctId)\n  }\n\n  private _handleGenericSpan(\n    spanData: SpanData,\n    traceId: string,\n    spanId: string,\n    parentId: string | null,\n    latency: number,\n    distinctId: string,\n    groupId: string | null,\n    errorProperties: Record<string, any>\n  ): void {\n    const spanType = spanData.type || 'unknown'\n\n    const properties: Record<string, any> = {\n      ...this._baseProperties(traceId, spanId, parentId, latency, groupId, errorProperties),\n      $ai_span_name: spanType,\n      $ai_span_type: spanType,\n    }\n\n    this._captureEvent('$ai_span', properties, distinctId)\n  }\n}\n","import { PostHogTracingProcessor } from './processor'\nimport type { PostHogTracingProcessorOptions } from './processor'\n\nexport { PostHogTracingProcessor } from './processor'\nexport type {\n  PostHogTracingProcessorOptions,\n  DistinctIdResolver,\n  TracingProcessorErrorContext,\n  TracingProcessorErrorHandler,\n} from './processor'\n\nexport type InstrumentOptions = PostHogTracingProcessorOptions\n\n/**\n * One-liner to instrument OpenAI Agents SDK with PostHog tracing.\n *\n * This registers a PostHogTracingProcessor with the OpenAI Agents SDK,\n * automatically capturing traces, spans, and LLM generations.\n *\n * @param options - Configuration options\n * @returns The registered processor instance\n *\n * @example\n * ```typescript\n * import { instrument } from '@posthog/ai/openai-agents'\n * import PostHog from 'posthog-node'\n *\n * const phClient = new PostHog('<API_KEY>')\n *\n * // Simple setup — await before running agents\n * await instrument({ client: phClient, distinctId: 'user@example.com' })\n *\n * // With dynamic distinct ID\n * await instrument({\n *   client: phClient,\n *   distinctId: (trace) => trace.metadata?.userId,\n *   privacyMode: true,\n *   properties: { environment: 'production' },\n * })\n *\n * // Now run agents as normal - traces automatically sent to PostHog\n * import { Agent, run } from '@openai/agents'\n * const agent = new Agent({ name: 'Assistant', instructions: 'You are helpful.' })\n * const result = await run(agent, 'Hello!')\n * ```\n */\nexport async function instrument(options: InstrumentOptions): Promise<PostHogTracingProcessor> {\n  const { addTraceProcessor } = await import('@openai/agents-core')\n\n  const processor = new PostHogTracingProcessor({\n    client: options.client,\n    distinctId: options.distinctId,\n    privacyMode: options.privacyMode,\n    groups: options.groups,\n    properties: options.properties,\n  })\n\n  addTraceProcessor(processor)\n  return processor\n}\n"],"names":["MIME_HINT_KEYS","STRONG_CONTEXT_KEYS","Set","STRONG_CONTEXT_TYPES","FILE_FAMILY_TYPES","KNOWN_AUDIO_FORMATS","MediaTypeContext","EMPTY","undefined","constructor","parent","key","inferMediaType","inferFromSiblingMime","inferFromSiblingFormat","inferFromParentType","inferFromKey","hint","v","fmt","format","has","toLowerCase","t","type","includes","signalsBinary","MAX_OUTPUT_SIZE","STRING_FORMAT","sharedTextEncoder","TextEncoder","sharedTextDecoder","TextDecoder","fatal","utf8ByteLength","str","encode","byteLength","toContentString","content","JSON","stringify","String","withPrivacyMode","client","privacyMode","input","privacy_mode","toSafeString","console","warn","truncate","buffer","length","decode","truncatedBuffer","slice","truncatedStr","endsWith","POSTHOG_AI_GATEWAY_HOSTS","GATEWAY_DOCS_URL","extractHost","baseURL","hasScheme","test","URL","hostname","isPostHogAiGatewayUrl","host","warnIfPostHogAiGateway","normalizeInputRoles","Array","isArray","map","item","role","safeContentString","value","Object","prototype","toString","call","ensureSerializable","obj","serializedValue","stringifyForSizeCheck","exceedsMaxOutputSize","parseIsoTimestamp","isoStr","trim","ts","Date","getTime","Number","isFinite","PostHogTracingProcessor","_spanStartTimes","Map","_traceMetadata","_maxTrackedEntries","options","_client","_distinctId","distinctId","_privacyMode","_groups","groups","_properties","properties","_onError","onError","_getDistinctId","trace","result","_withPrivacyMode","_prepareCapturedValue","serializableValue","boundedValue","_evictStaleEntries","size","entries","sort","a","b","toRemove","Math","floor","delete","keys","_handleError","error","context","handlerError","_captureEvent","event","capture","finalProperties","eventMessage","_baseProperties","traceId","spanId","parentId","latency","groupId","errorProperties","$ai_lib","$ai_lib_version","version","$ai_trace_id","$ai_span_id","$ai_parent_id","$ai_provider","$ai_framework","$ai_latency","$ai_group_id","_getErrorProperties","errorMessage","message","errorType","$ai_is_error","$ai_error","$ai_error_type","onTraceStart","traceName","name","metadata","set","startTime","now","onTraceEnd","traceInfo","get","$ai_trace_name","$ai_trace_metadata","$process_person_profile","onSpanStart","span","onSpanEnd","spanData","started","startedAt","ended","endedAt","userDistinctId","_handleGenerationSpan","_handleResponseSpan","_handleFunctionSpan","_handleAgentSpan","_handleHandoffSpan","_handleGuardrailSpan","_handleCustomSpan","_handleAudioSpan","_handleMcpSpan","_handleGenericSpan","shutdown","clear","flush","forceFlush","usage","inputTokens","input_tokens","prompt_tokens","outputTokens","output_tokens","completion_tokens","modelConfig","model_config","modelParams","param","base_url","$ai_model","model","$ai_base_url","$ai_model_parameters","$ai_input","$ai_output_choices","output","$ai_input_tokens","$ai_output_tokens","$ai_total_tokens","details","reasoning_tokens","$ai_reasoning_tokens","cache_read_input_tokens","$ai_cache_read_input_tokens","cache_creation_input_tokens","$ai_cache_creation_input_tokens","responseSpanData","response","_response","responseId","response_id","id","$ai_response_id","_input","$ai_span_name","$ai_span_type","$ai_input_state","$ai_output_state","mcp_data","$ai_mcp_data","handoffs","$ai_agent_handoffs","tools","$ai_agent_tools","output_type","$ai_agent_output_type","from_agent","to_agent","$ai_handoff_from_agent","$ai_handoff_to_agent","$ai_guardrail_triggered","triggered","$ai_custom_data","data","spanType","$ai_model_config","transcription","$ai_audio_input_format","speech","$ai_audio_output_format","speechGroup","server","$ai_mcp_server","$ai_mcp_tools","instrument","addTraceProcessor","processor"],"mappings":"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"}