{"version":3,"file":"index.mjs","sources":["../../src/sanitization/media_type_context.ts","../../src/utils.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 OpenAIOrignal from 'openai'\nimport AnthropicOriginal from '@anthropic-ai/sdk'\nimport type { ChatCompletionTool } from 'openai/resources/chat/completions'\nimport type { ResponseCreateParamsWithTools } from 'openai/lib/ResponsesParser'\nimport type { Tool as GeminiTool } from '@google/genai'\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\ntype AnthropicTool = AnthropicOriginal.Tool\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 = (\n  provider: string,\n  params: any\n): ChatCompletionTool[] | AnthropicTool[] | GeminiTool[] | 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","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, truncate, withPrivacyMode } from '../utils'\nimport { version } from '../../package.json'\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 ensureSerializable(obj: unknown): unknown {\n  if (obj === null || obj === undefined) {\n    return obj\n  }\n  try {\n    JSON.stringify(obj)\n    return obj\n  } catch {\n    return String(obj)\n  }\n}\n\nfunction exceedsMaxOutputSize(value: unknown): boolean {\n  if (value === null || value === undefined) {\n    return false\n  }\n\n  try {\n    const serializedValue = typeof value === 'string' ? value : JSON.stringify(value)\n    return new TextEncoder().encode(serializedValue).length > MAX_OUTPUT_SIZE\n  } catch {\n    return false\n  }\n}\n\nfunction parseIsoTimestamp(isoStr: string | null | undefined): number | null {\n  if (!isoStr) {\n    return null\n  }\n  try {\n    const ts = new Date(isoStr).getTime()\n    return isNaN(ts) ? null : ts / 1000\n  } catch {\n    return null\n  }\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)\n\nexport interface PostHogTracingProcessorOptions {\n  client: PostHog\n  distinctId?: DistinctIdResolver\n  privacyMode?: boolean\n  groups?: Record<string, any>\n  properties?: Record<string, any>\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\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  }\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 boundedValue = exceedsMaxOutputSize(serializableValue) ? truncate(serializableValue) : 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 _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 {\n      // Silently ignore capture errors\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 {\n      // Silently ignore errors\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 {\n      // Silently ignore errors\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 {\n      // Silently ignore errors\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 {\n      // Silently ignore errors\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 {\n      // Silently ignore errors\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 {\n      // Silently ignore errors\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    const properties: Record<string, any> = {\n      ...this._baseProperties(traceId, spanId, parentId, latency, groupId, errorProperties),\n      $ai_model: spanData.model,\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    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 { PostHogTracingProcessorOptions, DistinctIdResolver } 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","withPrivacyMode","client","privacyMode","input","privacy_mode","toSafeString","JSON","stringify","console","warn","truncate","str","buffer","encode","length","decode","truncatedBuffer","slice","truncatedStr","endsWith","normalizeInputRoles","Array","isArray","map","item","role","ensureSerializable","obj","String","exceedsMaxOutputSize","value","serializedValue","parseIsoTimestamp","isoStr","ts","Date","getTime","isNaN","PostHogTracingProcessor","_spanStartTimes","Map","_traceMetadata","_maxTrackedEntries","options","_client","_distinctId","distinctId","_privacyMode","_groups","groups","_properties","properties","_getDistinctId","trace","result","_withPrivacyMode","_prepareCapturedValue","serializableValue","boundedValue","_evictStaleEntries","size","entries","sort","a","b","toRemove","Math","floor","delete","keys","_captureEvent","event","capture","finalProperties","eventMessage","Object","_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","error","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","$ai_model","model","$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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"}