@posthog/ai 8.2.2 → 8.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","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, truncate, 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 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 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 { 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","POSTHOG_AI_GATEWAY_HOSTS","GATEWAY_DOCS_URL","extractHost","baseURL","hasScheme","test","URL","hostname","isPostHogAiGatewayUrl","host","warnIfPostHogAiGateway","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","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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"}
1
+ {"version":3,"file":"index.mjs","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":";;AAAA,MAAMA,cAAc,GAAG,CAAC,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,CAAU;AAEpF,MAAMC,mBAAmB,GAAG,IAAIC,GAAG,CAAC,CAClC,MAAM,EACN,WAAW,EACX,UAAU,EACV,WAAW,EACX,UAAU,EACV,WAAW,EACX,UAAU,EACV,OAAO,EACP,YAAY,EACZ,WAAW,EACX,aAAa,EACb,YAAY,EACZ,QAAQ,EACR,QAAQ,CACT,CAAC;AAEF,MAAMC,oBAAoB,GAAG,IAAID,GAAG,CAAC,CACnC,OAAO,EACP,WAAW,EACX,aAAa,EACb,OAAO,EACP,aAAa,EACb,OAAO,EACP,WAAW,EACX,MAAM,EACN,YAAY,EACZ,UAAU,EACV,OAAO,EACP,WAAW,CACZ,CAAC;AAEF,MAAME,iBAAiB,GAAG,IAAIF,GAAG,CAAC,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;AAE3F,MAAMG,mBAAmB,GAAG,IAAIH,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AAEjF,MAAMI,gBAAgB,CAAC;EAC5B,OAAgBC,KAAK,GAAG,IAAID,gBAAgB,CAACE,SAAS,EAAEA,SAAS,CAAC;AAElEC,EAAAA,WAAWA,CACQC,MAA2C,EAC3CC,GAAuB,EACxC;IAAA,IAAA,CAFiBD,MAA2C,GAA3CA,MAA2C;IAAA,IAAA,CAC3CC,GAAuB,GAAvBA,GAAuB;AACvC,EAAA;AAEHC,EAAAA,cAAcA,GAAuB;IACnC,OACE,IAAI,CAACC,oBAAoB,EAAE,IAAI,IAAI,CAACC,sBAAsB,EAAE,IAAI,IAAI,CAACC,mBAAmB,EAAE,IAAI,IAAI,CAACC,YAAY,EAAE;AAErH,EAAA;AAEAH,EAAAA,oBAAoBA,GAAuB;AACzC,IAAA,IAAI,CAAC,IAAI,CAACH,MAAM,EAAE,OAAOF,SAAS;AAClC,IAAA,KAAK,MAAMS,IAAI,IAAIjB,cAAc,EAAE;AACjC,MAAA,MAAMkB,CAAC,GAAG,IAAI,CAACR,MAAM,CAACO,IAAI,CAAC;AAC3B,MAAA,IAAI,OAAOC,CAAC,KAAK,QAAQ,EAAE,OAAOA,CAAC;AACrC,IAAA;AACA,IAAA,OAAOV,SAAS;AAClB,EAAA;AAEAM,EAAAA,sBAAsBA,GAAuB;AAC3C,IAAA,IAAI,CAAC,IAAI,CAACJ,MAAM,EAAE,OAAOF,SAAS;AAClC,IAAA,MAAMW,GAAG,GAAG,IAAI,CAACT,MAAM,CAACU,MAAM;AAC9B,IAAA,IAAI,OAAOD,GAAG,KAAK,QAAQ,IAAId,mBAAmB,CAACgB,GAAG,CAACF,GAAG,CAACG,WAAW,EAAE,CAAC,EAAE;AACzE,MAAA,OAAO,SAASH,GAAG,CAACG,WAAW,EAAE,CAAA,CAAE;AACrC,IAAA;AACA,IAAA,OAAOd,SAAS;AAClB,EAAA;AAEAO,EAAAA,mBAAmBA,GAAuB;AACxC,IAAA,IAAI,CAAC,IAAI,CAACL,MAAM,EAAE,OAAOF,SAAS;AAClC,IAAA,MAAMe,CAAC,GAAG,IAAI,CAACb,MAAM,CAACc,IAAI;AAC1B,IAAA,IAAI,OAAOD,CAAC,KAAK,QAAQ,EAAE,OAAOf,SAAS;AAC3C,IAAA,IAAIe,CAAC,KAAK,OAAO,IAAIA,CAAC,KAAK,WAAW,IAAIA,CAAC,KAAK,aAAa,EAAE,OAAO,OAAO;IAC7E,IAAIA,CAAC,KAAK,OAAO,IAAIA,CAAC,KAAK,aAAa,EAAE,OAAO,OAAO;IACxD,IAAIA,CAAC,KAAK,OAAO,IAAIA,CAAC,KAAK,WAAW,EAAE,OAAO,OAAO;IACtD,IAAInB,iBAAiB,CAACiB,GAAG,CAACE,CAAC,CAAC,EAAE,OAAO,0BAA0B;AAC/D,IAAA,OAAOf,SAAS;AAClB,EAAA;AAEAQ,EAAAA,YAAYA,GAAuB;AACjC,IAAA,IAAI,CAAC,IAAI,CAACL,GAAG,EAAE,OAAOH,SAAS;IAC/B,MAAMG,GAAG,GAAG,IAAI,CAACA,GAAG,CAACW,WAAW,EAAE;IAClC,IAAIX,GAAG,CAACc,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,OAAO;IACzC,IAAId,GAAG,CAACc,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,OAAO;IACzC,IAAId,GAAG,CAACc,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,OAAO;AACzC,IAAA,IAAId,GAAG,CAACc,QAAQ,CAAC,MAAM,CAAC,IAAId,GAAG,CAACc,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,0BAA0B;AACvF,IAAA,OAAOjB,SAAS;AAClB,EAAA;AAEAkB,EAAAA,aAAaA,GAAY;IACvB,IAAI,IAAI,CAAChB,MAAM,EAAE;AACf,MAAA,KAAK,MAAMO,IAAI,IAAIjB,cAAc,EAAE;QACjC,IAAI,OAAO,IAAI,CAACU,MAAM,CAACO,IAAI,CAAC,KAAK,QAAQ,EAAE,OAAO,IAAI;AACxD,MAAA;AACA,MAAA,MAAME,GAAG,GAAG,IAAI,CAACT,MAAM,CAACU,MAAM;AAC9B,MAAA,IAAI,OAAOD,GAAG,KAAK,QAAQ,IAAId,mBAAmB,CAACgB,GAAG,CAACF,GAAG,CAACG,WAAW,EAAE,CAAC,EAAE,OAAO,IAAI;AACtF,MAAA,MAAMC,CAAC,GAAG,IAAI,CAACb,MAAM,CAACc,IAAI;AAC1B,MAAA,IAAI,OAAOD,CAAC,KAAK,QAAQ,IAAIpB,oBAAoB,CAACkB,GAAG,CAACE,CAAC,CAAC,EAAE,OAAO,IAAI;AACvE,IAAA;AACA,IAAA,IAAI,IAAI,CAACZ,GAAG,IAAIV,mBAAmB,CAACoB,GAAG,CAAC,IAAI,CAACV,GAAG,CAAC,EAAE,OAAO,IAAI;AAC9D,IAAA,OAAO,KAAK;AACd,EAAA;AACF;;ACnEA;AACO,MAAMgB,eAAe,GAAG,MAAM;AACrC,MAAMC,aAAa,GAAG,MAAM;;AAE5B;AACA;AACA,MAAMC,iBAAiB,GAAG,IAAIC,WAAW,EAAE;AAC3C,MAAMC,iBAAiB,GAAG,IAAIC,WAAW,CAACJ,aAAa,EAAE;AAAEK,EAAAA,KAAK,EAAE;AAAM,CAAC,CAAC;AAEnE,MAAMC,cAAc,GAAIC,GAAW,IAAaN,iBAAiB,CAACO,MAAM,CAACD,GAAG,CAAC,CAACE,UAAU;;AAE/F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,eAAeA,CAACC,OAAgB,EAAU;AACxD,EAAA,IAAI,OAAOA,OAAO,KAAK,QAAQ,EAAE;AAC/B,IAAA,OAAOA,OAAO;AAChB,EAAA;AACA,EAAA,IAAIA,OAAO,KAAK/B,SAAS,IAAI+B,OAAO,KAAK,IAAI,IAAI,OAAOA,OAAO,KAAK,QAAQ,EAAE;IAC5E,IAAI;AACF,MAAA,OAAOC,IAAI,CAACC,SAAS,CAACF,OAAO,CAAC;AAChC,IAAA,CAAC,CAAC,MAAM;AACN;MACA,OAAOG,MAAM,CAACH,OAAO,CAAC;AACxB,IAAA;AACF,EAAA;EACA,OAAOG,MAAM,CAACH,OAAO,CAAC;AACxB;AA4SO,MAAMI,eAAe,GAAGA,CAACC,MAAe,EAAEC,WAAoB,EAAEC,KAAU,KAAU;EACzF,OAAQF,MAAM,CAASG,YAAY,IAAIF,WAAW,GAAG,IAAI,GAAGC,KAAK;AACnE,CAAC;AAED,SAASE,YAAYA,CAACF,KAAc,EAAU;AAC5C,EAAA,IAAIA,KAAK,KAAKtC,SAAS,IAAIsC,KAAK,KAAK,IAAI,EAAE;AACzC,IAAA,OAAO,EAAE;AACX,EAAA;AACA,EAAA,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE;AAC7B,IAAA,OAAOA,KAAK;AACd,EAAA;EACA,IAAI;AACF,IAAA,OAAON,IAAI,CAACC,SAAS,CAACK,KAAK,CAAC;AAC9B,EAAA,CAAC,CAAC,MAAM;AACNG,IAAAA,OAAO,CAACC,IAAI,CAAC,2BAA2B,EAAEJ,KAAK,CAAC;AAChD,IAAA,OAAO,EAAE;AACX,EAAA;AACF;AAEO,MAAMK,QAAQ,GAAIL,KAAc,IAAa;AAClD,EAAA,MAAMX,GAAG,GAAGa,YAAY,CAACF,KAAK,CAAC;EAC/B,IAAIX,GAAG,KAAK,EAAE,EAAE;AACd,IAAA,OAAO,EAAE;AACX,EAAA;;AAEA;AACA,EAAA,MAAMiB,MAAM,GAAGvB,iBAAiB,CAACO,MAAM,CAACD,GAAG,CAAC;AAC5C,EAAA,IAAIiB,MAAM,CAACC,MAAM,IAAI1B,eAAe,EAAE;AACpC;AACA,IAAA,OAAOI,iBAAiB,CAACuB,MAAM,CAACF,MAAM,CAAC;AACzC,EAAA;;AAEA;AACA;EACA,MAAMG,eAAe,GAAGH,MAAM,CAACI,KAAK,CAAC,CAAC,EAAE7B,eAAe,CAAC;AACxD,EAAA,IAAI8B,YAAY,GAAG1B,iBAAiB,CAACuB,MAAM,CAACC,eAAe,CAAC;AAC5D,EAAA,IAAIE,YAAY,CAACC,QAAQ,CAAC,QAAQ,CAAC,EAAE;IACnCD,YAAY,GAAGA,YAAY,CAACD,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;AAC1C,EAAA;EACA,OAAO,CAAA,EAAGC,YAAY,CAAA,eAAA,CAAiB;AACzC,CAAC;;;;AC5ZD;AACA;AACA;AACA;;AAEA;AACA;AACA;AACO,MAAME,wBAA2C,GAAG,CACzD,qBAAqB,EACrB,wBAAwB,EACxB,wBAAwB,EACxB,2BAA2B,EAC3B,2BAA2B,CAC5B;;AAED;AACA,MAAMC,gBAAgB,GAAG,2CAA2C;AAEpE,MAAMC,WAAW,GAAIC,OAAe,IAAyB;EAC3D,IAAI;AACF;AACA,IAAA,MAAMC,SAAS,GAAG,0BAA0B,CAACC,IAAI,CAACF,OAAO,CAAC;AAC1D,IAAA,OAAO,IAAIG,GAAG,CAACF,SAAS,GAAGD,OAAO,GAAG,CAAA,QAAA,EAAWA,OAAO,CAAA,CAAE,CAAC,CAACI,QAAQ,CAAC5C,WAAW,EAAE;AACnF,EAAA,CAAC,CAAC,MAAM;AACN,IAAA,OAAOd,SAAS;AAClB,EAAA;AACF,CAAC;AAEM,MAAM2D,qBAAqB,GAAIL,OAAkC,IAAc;EACpF,IAAI,CAACA,OAAO,EAAE;AACZ,IAAA,OAAO,KAAK;AACd,EAAA;AACA,EAAA,MAAMM,IAAI,GAAGP,WAAW,CAACC,OAAO,CAAC;EACjC,OAAOM,IAAI,KAAK5D,SAAS,IAAImD,wBAAwB,CAAClC,QAAQ,CAAC2C,IAAI,CAAC;AACtE,CAAC;;AAED;AACA;AACO,MAAMC,sBAAsB,GAAIP,OAAkC,IAAW;AAClF,EAAA,IAAI,CAACK,qBAAqB,CAACL,OAAO,CAAC,EAAE;AACnC,IAAA;AACF,EAAA;EACAb,OAAO,CAACC,IAAI,CACV,yEAAyE,GACvE,kFAAkF,GAClF,CAAA,2BAAA,EAA8BU,gBAAgB,CAAA,CAAA,CAClD,CAAC;AACH,CAAC;;ACzBD;AACA;AACA;AACA;AACA;AACA,SAASU,mBAAmBA,CAACxB,KAAc,EAAW;AACpD,EAAA,IAAI,CAACyB,KAAK,CAACC,OAAO,CAAC1B,KAAK,CAAC,EAAE;AACzB,IAAA,OAAOA,KAAK;AACd,EAAA;AACA,EAAA,OAAOA,KAAK,CAAC2B,GAAG,CAAEC,IAAI,IAAK;AACzB,IAAA,IAAIA,IAAI,IAAI,OAAOA,IAAI,KAAK,QAAQ,IAAI,EAAE,MAAM,IAAIA,IAAI,CAAC,IAAI,MAAM,IAAIA,IAAI,EAAE;AAC3E,MAAA,IAAIA,IAAI,CAAClD,IAAI,KAAK,eAAe,EAAE;QACjC,OAAO;AAAE,UAAA,GAAGkD,IAAI;AAAEC,UAAAA,IAAI,EAAE;SAAa;AACvC,MAAA;AACA,MAAA,IAAID,IAAI,CAAClD,IAAI,KAAK,sBAAsB,EAAE;QACxC,OAAO;AAAE,UAAA,GAAGkD,IAAI;AAAEC,UAAAA,IAAI,EAAE;SAAQ;AAClC,MAAA;AACF,IAAA;AACA,IAAA,OAAOD,IAAI;AACb,EAAA,CAAC,CAAC;AACJ;AAEA,SAASE,iBAAiBA,CAACC,KAAc,EAAU;EACjD,IAAI;IACF,OAAOvC,eAAe,CAACuC,KAAK,CAAC;AAC/B,EAAA,CAAC,CAAC,MAAM;IACN,OAAOC,MAAM,CAACC,SAAS,CAACC,QAAQ,CAACC,IAAI,CAACJ,KAAK,CAAC;AAC9C,EAAA;AACF;AAEA,SAASK,kBAAkBA,CAACC,GAAY,EAAW;AACjD,EAAA,IAAIA,GAAG,KAAK,IAAI,IAAIA,GAAG,KAAK3E,SAAS,EAAE;AACrC,IAAA,OAAO2E,GAAG;AACZ,EAAA;EACA,IAAI;AACF,IAAA,MAAMC,eAAe,GAAG5C,IAAI,CAACC,SAAS,CAAC0C,GAAG,CAAC;IAC3C,OAAOC,eAAe,KAAK5E,SAAS,GAAGoE,iBAAiB,CAACO,GAAG,CAAC,GAAGA,GAAG;AACrE,EAAA,CAAC,CAAC,MAAM;IACN,OAAOP,iBAAiB,CAACO,GAAG,CAAC;AAC/B,EAAA;AACF;AAEA,SAASE,qBAAqBA,CAACR,KAAc,EAAiB;AAC5D,EAAA,IAAIA,KAAK,KAAK,IAAI,IAAIA,KAAK,KAAKrE,SAAS,EAAE;AACzC,IAAA,OAAO,IAAI;AACb,EAAA;AAEA,EAAA,IAAI,OAAOqE,KAAK,KAAK,QAAQ,EAAE;AAC7B,IAAA,OAAOA,KAAK;AACd,EAAA;EAEA,IAAI;IACF,OAAOrC,IAAI,CAACC,SAAS,CAACoC,KAAK,CAAC,IAAID,iBAAiB,CAACC,KAAK,CAAC;AAC1D,EAAA,CAAC,CAAC,MAAM;IACN,OAAOD,iBAAiB,CAACC,KAAK,CAAC;AACjC,EAAA;AACF;AAEA,SAASS,oBAAoBA,CAACF,eAA8B,EAAW;EACrE,OAAOA,eAAe,KAAK,IAAI,GAAG,KAAK,GAAGlD,cAAc,CAACkD,eAAe,CAAC,GAAGzD,eAAe;AAC7F;AAEA,SAAS4D,iBAAiBA,CAACC,MAAiC,EAAiB;AAC3E,EAAA,IAAI,OAAOA,MAAM,KAAK,QAAQ,IAAIA,MAAM,CAACC,IAAI,EAAE,KAAK,EAAE,EAAE;AACtD,IAAA,OAAO,IAAI;AACb,EAAA;EAEA,MAAMC,EAAE,GAAG,IAAIC,IAAI,CAACH,MAAM,CAAC,CAACI,OAAO,EAAE;EACrC,OAAOC,MAAM,CAACC,QAAQ,CAACJ,EAAE,CAAC,GAAGA,EAAE,GAAG,IAAI,GAAG,IAAI;AAC/C;AA8BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMK,uBAAuB,CAA6B;AAQvDC,EAAAA,eAAe,GAAwB,IAAIC,GAAG,EAAE;AAChDC,EAAAA,cAAc,GAA+B,IAAID,GAAG,EAAE;AACtDE,EAAAA,kBAAkB,GAAG,KAAK;EAElC1F,WAAWA,CAAC2F,OAAuC,EAAE;AACnD,IAAA,IAAI,CAACC,OAAO,GAAGD,OAAO,CAACxD,MAAM;AAC7B,IAAA,IAAI,CAAC0D,WAAW,GAAGF,OAAO,CAACG,UAAU;AACrC,IAAA,IAAI,CAACC,YAAY,GAAGJ,OAAO,CAACvD,WAAW,IAAI,KAAK;IAChD,IAAI,CAAC4D,OAAO,GAAGL,OAAO,CAACM,MAAM,IAAI,EAAE;IACnC,IAAI,CAACC,WAAW,GAAGP,OAAO,CAACQ,UAAU,IAAI,EAAE;AAC3C,IAAA,IAAI,CAACC,QAAQ,GAAGT,OAAO,CAACU,OAAO;AACjC,EAAA;EAEQC,cAAcA,CAACC,KAAmB,EAAsB;AAC9D,IAAA,IAAI,OAAO,IAAI,CAACV,WAAW,KAAK,UAAU,EAAE;AAC1C,MAAA,IAAIU,KAAK,EAAE;AACT,QAAA,MAAMC,MAAM,GAAG,IAAI,CAACX,WAAW,CAACU,KAAK,CAAC;AACtC,QAAA,IAAIC,MAAM,EAAE;UACV,OAAOvE,MAAM,CAACuE,MAAM,CAAC;AACvB,QAAA;AACF,MAAA;AACA,MAAA,OAAOzG,SAAS;AAClB,IAAA,CAAC,MAAM,IAAI,IAAI,CAAC8F,WAAW,EAAE;AAC3B,MAAA,OAAO5D,MAAM,CAAC,IAAI,CAAC4D,WAAW,CAAC;AACjC,IAAA;AACA,IAAA,OAAO9F,SAAS;AAClB,EAAA;EAEQ0G,gBAAgBA,CAACrC,KAAc,EAAW;IAChD,OAAOlC,eAAe,CAAC,IAAI,CAAC0D,OAAO,EAAE,IAAI,CAACG,YAAY,EAAE3B,KAAK,CAAC;AAChE,EAAA;EAEQsC,qBAAqBA,CAACtC,KAAc,EAAW;AACrD,IAAA,MAAMuC,iBAAiB,GAAGlC,kBAAkB,CAACL,KAAK,CAAC;AACnD,IAAA,MAAMO,eAAe,GAAGC,qBAAqB,CAAC+B,iBAAiB,CAAC;AAChE,IAAA,MAAMC,YAAY,GAAG/B,oBAAoB,CAACF,eAAe,CAAC,GAAGjC,QAAQ,CAACiC,eAAe,CAAC,GAAGgC,iBAAiB;AAC1G,IAAA,OAAO,IAAI,CAACF,gBAAgB,CAACG,YAAY,CAAC;AAC5C,EAAA;AAEQC,EAAAA,kBAAkBA,GAAS;IACjC,IAAI,IAAI,CAACtB,eAAe,CAACuB,IAAI,GAAG,IAAI,CAACpB,kBAAkB,EAAE;AACvD,MAAA,MAAMqB,OAAO,GAAG,CAAC,GAAG,IAAI,CAACxB,eAAe,CAACwB,OAAO,EAAE,CAAC,CAACC,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAKD,CAAC,CAAC,CAAC,CAAC,GAAGC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/E,MAAA,MAAMC,QAAQ,GAAGJ,OAAO,CAAChE,KAAK,CAAC,CAAC,EAAEqE,IAAI,CAACC,KAAK,CAACN,OAAO,CAACnE,MAAM,GAAG,CAAC,CAAC,CAAC;AACjE,MAAA,KAAK,MAAM,CAAC1C,GAAG,CAAC,IAAIiH,QAAQ,EAAE;AAC5B,QAAA,IAAI,CAAC5B,eAAe,CAAC+B,MAAM,CAACpH,GAAG,CAAC;AAClC,MAAA;AACF,IAAA;IAEA,IAAI,IAAI,CAACuF,cAAc,CAACqB,IAAI,GAAG,IAAI,CAACpB,kBAAkB,EAAE;MACtD,MAAM6B,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC9B,cAAc,CAAC8B,IAAI,EAAE,CAAC;AAC5C,MAAA,MAAMJ,QAAQ,GAAGI,IAAI,CAACxE,KAAK,CAAC,CAAC,EAAEqE,IAAI,CAACC,KAAK,CAACE,IAAI,CAAC3E,MAAM,GAAG,CAAC,CAAC,CAAC;AAC3D,MAAA,KAAK,MAAM1C,GAAG,IAAIiH,QAAQ,EAAE;AAC1B,QAAA,IAAI,CAAC1B,cAAc,CAAC6B,MAAM,CAACpH,GAAG,CAAC;AACjC,MAAA;AACF,IAAA;AACF,EAAA;AAEQsH,EAAAA,YAAYA,CAACC,KAAc,EAAEC,OAAqC,EAAQ;IAChF,IAAI;AACF,MAAA,IAAI,CAACtB,QAAQ,GAAGqB,KAAK,EAAEC,OAAO,CAAC;IACjC,CAAC,CAAC,OAAOC,YAAY,EAAE;AAGvB,IAAA;AACF,EAAA;AAEQC,EAAAA,aAAaA,CAACC,KAAa,EAAE1B,UAA+B,EAAEL,UAAmB,EAAQ;IAC/F,IAAI;AACF,MAAA,IAAI,CAAC,IAAI,CAACF,OAAO,EAAEkC,OAAO,EAAE;AAC1B,QAAA;AACF,MAAA;AAEA,MAAA,MAAMC,eAAe,GAAG;QACtB,GAAG,IAAI,CAAC7B,WAAW;QACnB,GAAGC;OACJ;AAED,MAAA,MAAM6B,YAA0B,GAAG;QACjClC,UAAU,EAAEA,UAAU,IAAI,SAAS;QACnC+B,KAAK;AACL1B,QAAAA,UAAU,EAAE4B,eAAe;AAC3B9B,QAAAA,MAAM,EAAE5B,MAAM,CAACkD,IAAI,CAAC,IAAI,CAACvB,OAAO,CAAC,CAACpD,MAAM,GAAG,CAAC,GAAG,IAAI,CAACoD,OAAO,GAAGjG;OAC/D;AAED,MAAA,IAAI,CAAC6F,OAAO,CAACkC,OAAO,CAACE,YAAY,CAAC;IACpC,CAAC,CAAC,OAAOP,KAAK,EAAE;AACd,MAAA,IAAI,CAACD,YAAY,CAACC,KAAK,EAAE,SAAS,CAAC;AACrC,IAAA;AACF,EAAA;AAEQQ,EAAAA,eAAeA,CACrBC,OAAe,EACfC,MAAc,EACdC,QAAuB,EACvBC,OAAe,EACfC,OAAsB,EACtBC,eAAoC,EACf;AACrB,IAAA,MAAMpC,UAA+B,GAAG;AACtCqC,MAAAA,OAAO,EAAE,YAAY;AACrBC,MAAAA,eAAe,EAAEC,OAAO;AACxBC,MAAAA,YAAY,EAAET,OAAO;AACrBU,MAAAA,WAAW,EAAET,MAAM;AACnBU,MAAAA,aAAa,EAAET,QAAQ;AACvBU,MAAAA,YAAY,EAAE,QAAQ;AACtBC,MAAAA,aAAa,EAAE,eAAe;AAC9BC,MAAAA,WAAW,EAAEX,OAAO;MACpB,GAAGE;KACJ;AACD,IAAA,IAAID,OAAO,EAAE;MACXnC,UAAU,CAAC8C,YAAY,GAAGX,OAAO;AACnC,IAAA;AACA,IAAA,OAAOnC,UAAU;AACnB,EAAA;EAEQ+C,mBAAmBA,CAACzB,KAAuB,EAAuB;IACxE,IAAI,CAACA,KAAK,EAAE;AACV,MAAA,OAAO,EAAE;AACX,IAAA;IAEA,MAAM0B,YAAY,GAAG1B,KAAK,CAAC2B,OAAO,IAAInH,MAAM,CAACwF,KAAK,CAAC;IAEnD,IAAI4B,SAAS,GAAG,SAAS;AACzB,IAAA,IAAIF,YAAY,CAACnI,QAAQ,CAAC,oBAAoB,CAAC,EAAE;AAC/CqI,MAAAA,SAAS,GAAG,sBAAsB;IACpC,CAAC,MAAM,IAAIF,YAAY,CAACnI,QAAQ,CAAC,WAAW,CAAC,EAAE;AAC7CqI,MAAAA,SAAS,GAAG,YAAY;IAC1B,CAAC,MAAM,IAAIF,YAAY,CAACnI,QAAQ,CAAC,iCAAiC,CAAC,EAAE;AACnEqI,MAAAA,SAAS,GAAG,2BAA2B;IACzC,CAAC,MAAM,IAAIF,YAAY,CAACnI,QAAQ,CAAC,kCAAkC,CAAC,EAAE;AACpEqI,MAAAA,SAAS,GAAG,4BAA4B;IAC1C,CAAC,MAAM,IAAIF,YAAY,CAACnI,QAAQ,CAAC,kBAAkB,CAAC,EAAE;AACpDqI,MAAAA,SAAS,GAAG,oBAAoB;AAClC,IAAA;IAEA,OAAO;AACLC,MAAAA,YAAY,EAAE,IAAI;AAClBC,MAAAA,SAAS,EAAEJ,YAAY;AACvBK,MAAAA,cAAc,EAAEH;KACjB;AACH,EAAA;;AAEA;;EAEA,MAAMI,YAAYA,CAAClD,KAAY,EAAiB;IAC9C,IAAI;MACF,IAAI,CAACM,kBAAkB,EAAE;AAEzB,MAAA,MAAMqB,OAAO,GAAG3B,KAAK,CAAC2B,OAAO;AAC7B,MAAA,MAAMwB,SAAS,GAAGnD,KAAK,CAACoD,IAAI;AAC5B,MAAA,MAAMrB,OAAO,GAAG/B,KAAK,CAAC+B,OAAO,IAAI,IAAI;AACrC,MAAA,MAAMsB,QAAQ,GAAGrD,KAAK,CAACqD,QAAQ;AAE/B,MAAA,MAAM9D,UAAU,GAAG,IAAI,CAACQ,cAAc,CAACC,KAAK,CAAC;AAE7C,MAAA,IAAI,CAACd,cAAc,CAACoE,GAAG,CAAC3B,OAAO,EAAE;AAC/ByB,QAAAA,IAAI,EAAED,SAAS;QACfpB,OAAO;QACPsB,QAAQ;QACR9D,UAAU;AACVgE,QAAAA,SAAS,EAAE5E,IAAI,CAAC6E,GAAG,EAAE,GAAG;AAC1B,OAAC,CAAC;IACJ,CAAC,CAAC,OAAOtC,KAAK,EAAE;AACd,MAAA,IAAI,CAACD,YAAY,CAACC,KAAK,EAAE,cAAc,CAAC;AAC1C,IAAA;AACF,EAAA;EAEA,MAAMuC,UAAUA,CAACzD,KAAY,EAAiB;IAC5C,IAAI;AACF,MAAA,MAAM2B,OAAO,GAAG3B,KAAK,CAAC2B,OAAO;MAE7B,MAAM+B,SAAS,GAAG,IAAI,CAACxE,cAAc,CAACyE,GAAG,CAAChC,OAAO,CAAC;AAClD,MAAA,IAAI,CAACzC,cAAc,CAAC6B,MAAM,CAACY,OAAO,CAAC;MAEnC,MAAMwB,SAAS,GAAGO,SAAS,EAAEN,IAAI,IAAIpD,KAAK,CAACoD,IAAI;MAC/C,MAAMrB,OAAO,GAAG2B,SAAS,EAAE3B,OAAO,IAAI/B,KAAK,CAAC+B,OAAO,IAAI,IAAI;MAC3D,MAAMsB,QAAQ,GAAGK,SAAS,EAAEL,QAAQ,IAAIrD,KAAK,CAACqD,QAAQ;MACtD,MAAM9D,UAAU,GAAGmE,SAAS,EAAEnE,UAAU,IAAI,IAAI,CAACQ,cAAc,CAACC,KAAK,CAAC;AAEtE,MAAA,MAAMuD,SAAS,GAAGG,SAAS,EAAEH,SAAS;AACtC,MAAA,MAAMzB,OAAO,GAAGyB,SAAS,IAAI,IAAI,GAAG5E,IAAI,CAAC6E,GAAG,EAAE,GAAG,IAAI,GAAGD,SAAS,GAAG/J,SAAS;AAE7E,MAAA,MAAMoG,UAA+B,GAAG;AACtCqC,QAAAA,OAAO,EAAE,YAAY;AACrBC,QAAAA,eAAe,EAAEC,OAAO;AACxBC,QAAAA,YAAY,EAAET,OAAO;AACrBiC,QAAAA,cAAc,EAAET,SAAS;AACzBZ,QAAAA,YAAY,EAAE,QAAQ;AACtBC,QAAAA,aAAa,EAAE;OAChB;MAED,IAAIV,OAAO,IAAI,IAAI,EAAE;QACnBlC,UAAU,CAAC6C,WAAW,GAAGX,OAAO;AAClC,MAAA;AAEA,MAAA,IAAIC,OAAO,EAAE;QACXnC,UAAU,CAAC8C,YAAY,GAAGX,OAAO;AACnC,MAAA;AAEA,MAAA,IAAIsB,QAAQ,IAAIvF,MAAM,CAACkD,IAAI,CAACqC,QAAQ,CAAC,CAAChH,MAAM,GAAG,CAAC,EAAE;QAChDuD,UAAU,CAACiE,kBAAkB,GAAG,IAAI,CAAC1D,qBAAqB,CAACkD,QAAQ,CAAC;AACtE,MAAA;MAEA,IAAI9D,UAAU,IAAI,IAAI,EAAE;QACtBK,UAAU,CAACkE,uBAAuB,GAAG,KAAK;AAC5C,MAAA;MAEA,IAAI,CAACzC,aAAa,CAAC,WAAW,EAAEzB,UAAU,EAAEL,UAAU,IAAIoC,OAAO,CAAC;IACpE,CAAC,CAAC,OAAOT,KAAK,EAAE;AACd,MAAA,IAAI,CAACD,YAAY,CAACC,KAAK,EAAE,YAAY,CAAC;AACxC,IAAA;AACF,EAAA;EAEA,MAAM6C,WAAWA,CAACC,IAAoB,EAAiB;IACrD,IAAI;MACF,IAAI,CAAC1D,kBAAkB,EAAE;AACzB,MAAA,IAAI,CAACtB,eAAe,CAACsE,GAAG,CAACU,IAAI,CAACpC,MAAM,EAAEjD,IAAI,CAAC6E,GAAG,EAAE,GAAG,IAAI,CAAC;IAC1D,CAAC,CAAC,OAAOtC,KAAK,EAAE;AACd,MAAA,IAAI,CAACD,YAAY,CAACC,KAAK,EAAE,aAAa,CAAC;AACzC,IAAA;AACF,EAAA;EAEA,MAAM+C,SAASA,CAACD,IAAoB,EAAiB;IACnD,IAAI;AACF,MAAA,MAAMpC,MAAM,GAAGoC,IAAI,CAACpC,MAAM;AAC1B,MAAA,MAAMD,OAAO,GAAGqC,IAAI,CAACrC,OAAO;AAC5B,MAAA,MAAME,QAAQ,GAAGmC,IAAI,CAACnC,QAAQ;AAC9B,MAAA,MAAMqC,QAAQ,GAAGF,IAAI,CAACE,QAAQ;;AAE9B;MACA,MAAMX,SAAS,GAAG,IAAI,CAACvE,eAAe,CAAC2E,GAAG,CAAC/B,MAAM,CAAC;AAClD,MAAA,IAAI,CAAC5C,eAAe,CAAC+B,MAAM,CAACa,MAAM,CAAC;AACnC,MAAA,IAAIE,OAAe;MACnB,IAAIyB,SAAS,IAAI,IAAI,EAAE;QACrBzB,OAAO,GAAGnD,IAAI,CAAC6E,GAAG,EAAE,GAAG,IAAI,GAAGD,SAAS;AACzC,MAAA,CAAC,MAAM;AACL,QAAA,MAAMY,OAAO,GAAG5F,iBAAiB,CAACyF,IAAI,CAACI,SAAS,CAAC;AACjD,QAAA,MAAMC,KAAK,GAAG9F,iBAAiB,CAACyF,IAAI,CAACM,OAAO,CAAC;AAC7CxC,QAAAA,OAAO,GAAGqC,OAAO,IAAI,IAAI,IAAIE,KAAK,IAAI,IAAI,GAAGA,KAAK,GAAGF,OAAO,GAAG,CAAC;AAClE,MAAA;;AAEA;MACA,MAAMT,SAAS,GAAG,IAAI,CAACxE,cAAc,CAACyE,GAAG,CAAChC,OAAO,CAAC;MAClD,MAAM4C,cAAc,GAAGb,SAAS,EAAEnE,UAAU,IAAI,IAAI,CAACQ,cAAc,CAAC,IAAI,CAAC;;AAEzE;AACA,MAAA,MAAMgC,OAAO,GAAG2B,SAAS,EAAE3B,OAAO,IAAI,IAAI;;AAE1C;MACA,MAAMC,eAAe,GAAG,IAAI,CAACW,mBAAmB,CAACqB,IAAI,CAAC9C,KAAK,CAAC;;AAE5D;MACA,IAAIqD,cAAc,IAAI,IAAI,EAAE;QAC1BvC,eAAe,CAAC8B,uBAAuB,GAAG,KAAK;AACjD,MAAA;AACA,MAAA,MAAMvE,UAAkB,GAAGgF,cAAc,IAAI5C,OAAO;;AAEpD;MACA,QAAQuC,QAAQ,CAAC1J,IAAI;AACnB,QAAA,KAAK,YAAY;AACf,UAAA,IAAI,CAACgK,qBAAqB,CAACN,QAAQ,EAAEvC,OAAO,EAAEC,MAAM,EAAEC,QAAQ,EAAEC,OAAO,EAAEvC,UAAU,EAAEwC,OAAO,EAAEC,eAAe,CAAC;AAC9G,UAAA;AACF,QAAA,KAAK,UAAU;AACb,UAAA,IAAI,CAACyC,mBAAmB,CAACP,QAAQ,EAAEvC,OAAO,EAAEC,MAAM,EAAEC,QAAQ,EAAEC,OAAO,EAAEvC,UAAU,EAAEwC,OAAO,EAAEC,eAAe,CAAC;AAC5G,UAAA;AACF,QAAA,KAAK,UAAU;AACb,UAAA,IAAI,CAAC0C,mBAAmB,CAACR,QAAQ,EAAEvC,OAAO,EAAEC,MAAM,EAAEC,QAAQ,EAAEC,OAAO,EAAEvC,UAAU,EAAEwC,OAAO,EAAEC,eAAe,CAAC;AAC5G,UAAA;AACF,QAAA,KAAK,OAAO;AACV,UAAA,IAAI,CAAC2C,gBAAgB,CAACT,QAAQ,EAAEvC,OAAO,EAAEC,MAAM,EAAEC,QAAQ,EAAEC,OAAO,EAAEvC,UAAU,EAAEwC,OAAO,EAAEC,eAAe,CAAC;AACzG,UAAA;AACF,QAAA,KAAK,SAAS;AACZ,UAAA,IAAI,CAAC4C,kBAAkB,CAACV,QAAQ,EAAEvC,OAAO,EAAEC,MAAM,EAAEC,QAAQ,EAAEC,OAAO,EAAEvC,UAAU,EAAEwC,OAAO,EAAEC,eAAe,CAAC;AAC3G,UAAA;AACF,QAAA,KAAK,WAAW;AACd,UAAA,IAAI,CAAC6C,oBAAoB,CAACX,QAAQ,EAAEvC,OAAO,EAAEC,MAAM,EAAEC,QAAQ,EAAEC,OAAO,EAAEvC,UAAU,EAAEwC,OAAO,EAAEC,eAAe,CAAC;AAC7G,UAAA;AACF,QAAA,KAAK,QAAQ;AACX,UAAA,IAAI,CAAC8C,iBAAiB,CAACZ,QAAQ,EAAEvC,OAAO,EAAEC,MAAM,EAAEC,QAAQ,EAAEC,OAAO,EAAEvC,UAAU,EAAEwC,OAAO,EAAEC,eAAe,CAAC;AAC1G,UAAA;AACF,QAAA,KAAK,eAAe;AACpB,QAAA,KAAK,QAAQ;AACb,QAAA,KAAK,cAAc;AACjB,UAAA,IAAI,CAAC+C,gBAAgB,CAACb,QAAQ,EAAEvC,OAAO,EAAEC,MAAM,EAAEC,QAAQ,EAAEC,OAAO,EAAEvC,UAAU,EAAEwC,OAAO,EAAEC,eAAe,CAAC;AACzG,UAAA;AACF,QAAA,KAAK,WAAW;AACd,UAAA,IAAI,CAACgD,cAAc,CAACd,QAAQ,EAAEvC,OAAO,EAAEC,MAAM,EAAEC,QAAQ,EAAEC,OAAO,EAAEvC,UAAU,EAAEwC,OAAO,EAAEC,eAAe,CAAC;AACvG,UAAA;AACF,QAAA;AACE,UAAA,IAAI,CAACiD,kBAAkB,CAACf,QAAQ,EAAEvC,OAAO,EAAEC,MAAM,EAAEC,QAAQ,EAAEC,OAAO,EAAEvC,UAAU,EAAEwC,OAAO,EAAEC,eAAe,CAAC;AAC3G,UAAA;AACJ;IACF,CAAC,CAAC,OAAOd,KAAK,EAAE;AACd,MAAA,IAAI,CAACD,YAAY,CAACC,KAAK,EAAE,WAAW,CAAC;AACvC,IAAA;AACF,EAAA;EAEA,MAAMgE,QAAQA,GAAkB;IAC9B,IAAI;AACF,MAAA,IAAI,CAAClG,eAAe,CAACmG,KAAK,EAAE;AAC5B,MAAA,IAAI,CAACjG,cAAc,CAACiG,KAAK,EAAE;MAE3B,IAAI,OAAO,IAAI,CAAC9F,OAAO,EAAE+F,KAAK,KAAK,UAAU,EAAE;AAC7C,QAAA,MAAM,IAAI,CAAC/F,OAAO,CAAC+F,KAAK,EAAE;AAC5B,MAAA;IACF,CAAC,CAAC,OAAOlE,KAAK,EAAE;AACd,MAAA,IAAI,CAACD,YAAY,CAACC,KAAK,EAAE,UAAU,CAAC;AACtC,IAAA;AACF,EAAA;EAEA,MAAMmE,UAAUA,GAAkB;IAChC,IAAI;MACF,IAAI,OAAO,IAAI,CAAChG,OAAO,EAAE+F,KAAK,KAAK,UAAU,EAAE;AAC7C,QAAA,MAAM,IAAI,CAAC/F,OAAO,CAAC+F,KAAK,EAAE;AAC5B,MAAA;IACF,CAAC,CAAC,OAAOlE,KAAK,EAAE;AACd,MAAA,IAAI,CAACD,YAAY,CAACC,KAAK,EAAE,YAAY,CAAC;AACxC,IAAA;AACF,EAAA;;AAEA;;AAEQsD,EAAAA,qBAAqBA,CAC3BN,QAA4B,EAC5BvC,OAAe,EACfC,MAAc,EACdC,QAAuB,EACvBC,OAAe,EACfvC,UAAkB,EAClBwC,OAAsB,EACtBC,eAAoC,EAC9B;AACN,IAAA,MAAMsD,KAAK,GAAGpB,QAAQ,CAACoB,KAAK,IAAI,EAAE;IAClC,MAAMC,WAAW,GAAID,KAAK,CAACE,YAAY,IAAgBF,KAAK,CAASG,aAAa,IAAI,CAAC;IACvF,MAAMC,YAAY,GAAIJ,KAAK,CAACK,aAAa,IAAgBL,KAAK,CAASM,iBAAiB,IAAI,CAAC;AAE7F,IAAA,MAAMC,WAAW,GAAG3B,QAAQ,CAAC4B,YAAY,IAAI,EAAE;IAC/C,MAAMC,WAAgC,GAAG,EAAE;AAC3C,IAAA,KAAK,MAAMC,KAAK,IAAI,CAAC,aAAa,EAAE,YAAY,EAAE,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,CAAC,EAAE;MACnG,IAAIA,KAAK,IAAIH,WAAW,EAAE;AACxBE,QAAAA,WAAW,CAACC,KAAK,CAAC,GAAGH,WAAW,CAACG,KAAK,CAAC;AACzC,MAAA;AACF,IAAA;AAEA,IAAA,IAAI,OAAOH,WAAW,CAACI,QAAQ,KAAK,QAAQ,EAAE;AAC5C5I,MAAAA,sBAAsB,CAACwI,WAAW,CAACI,QAAQ,CAAC;AAC9C,IAAA;AAEA,IAAA,MAAMrG,UAA+B,GAAG;AACtC,MAAA,GAAG,IAAI,CAAC8B,eAAe,CAACC,OAAO,EAAEC,MAAM,EAAEC,QAAQ,EAAEC,OAAO,EAAEC,OAAO,EAAEC,eAAe,CAAC;MACrFkE,SAAS,EAAEhC,QAAQ,CAACiC,KAAK;AACzB;AACA;AACAC,MAAAA,YAAY,EAAE,OAAOP,WAAW,CAACI,QAAQ,KAAK,QAAQ,GAAGJ,WAAW,CAACI,QAAQ,GAAG,EAAE;AAClFI,MAAAA,oBAAoB,EAAEvI,MAAM,CAACkD,IAAI,CAAC+E,WAAW,CAAC,CAAC1J,MAAM,GAAG,CAAC,GAAG0J,WAAW,GAAG,IAAI;MAC9EO,SAAS,EAAE,IAAI,CAACnG,qBAAqB,CAAC7C,mBAAmB,CAAC4G,QAAQ,CAACpI,KAAK,CAAC,CAAC;MAC1EyK,kBAAkB,EAAE,IAAI,CAACpG,qBAAqB,CAAC+D,QAAQ,CAACsC,MAAM,CAAC;AAC/DC,MAAAA,gBAAgB,EAAElB,WAAW;AAC7BmB,MAAAA,iBAAiB,EAAEhB,YAAY;MAC/BiB,gBAAgB,EAAEpB,WAAW,GAAGG;KACjC;IAED,IAAIJ,KAAK,CAACsB,OAAO,EAAE;AACjB,MAAA,MAAMA,OAAO,GAAGtB,KAAK,CAACsB,OAAkC;MACxD,IAAIA,OAAO,CAACC,gBAAgB,EAAE;AAC5BjH,QAAAA,UAAU,CAACkH,oBAAoB,GAAGF,OAAO,CAACC,gBAAgB;AAC5D,MAAA;MACA,IAAID,OAAO,CAACG,uBAAuB,EAAE;AACnCnH,QAAAA,UAAU,CAACoH,2BAA2B,GAAGJ,OAAO,CAACG,uBAAuB;AAC1E,MAAA;MACA,IAAIH,OAAO,CAACK,2BAA2B,EAAE;AACvCrH,QAAAA,UAAU,CAACsH,+BAA+B,GAAGN,OAAO,CAACK,2BAA2B;AAClF,MAAA;AACF,IAAA;;AAEA;IACA,IAAK3B,KAAK,CAASuB,gBAAgB,EAAE;AACnCjH,MAAAA,UAAU,CAACkH,oBAAoB,GAAIxB,KAAK,CAASuB,gBAAgB;AACnE,IAAA;IACA,IAAKvB,KAAK,CAASyB,uBAAuB,EAAE;AAC1CnH,MAAAA,UAAU,CAACoH,2BAA2B,GAAI1B,KAAK,CAASyB,uBAAuB;AACjF,IAAA;IACA,IAAKzB,KAAK,CAAS2B,2BAA2B,EAAE;AAC9CrH,MAAAA,UAAU,CAACsH,+BAA+B,GAAI5B,KAAK,CAAS2B,2BAA2B;AACzF,IAAA;IAEA,IAAI,CAAC5F,aAAa,CAAC,gBAAgB,EAAEzB,UAAU,EAAEL,UAAU,CAAC;AAC9D,EAAA;AAEQkF,EAAAA,mBAAmBA,CACzBP,QAA0B,EAC1BvC,OAAe,EACfC,MAAc,EACdC,QAAuB,EACvBC,OAAe,EACfvC,UAAkB,EAClBwC,OAAsB,EACtBC,eAAoC,EAC9B;AACN;AACA;IACA,MAAMmF,gBAAgB,GAAGjD,QAAoF;AAC7G,IAAA,MAAMkD,QAAQ,GAAGD,gBAAgB,CAACE,SAAS;IAC3C,MAAMC,UAAU,GAAGpD,QAAQ,CAACqD,WAAW,IAAKH,QAAQ,EAAEI,EAAyB;;AAE/E;AACA,IAAA,MAAMlC,KAAK,GAAG8B,QAAQ,EAAE9B,KAAK,IAAI,EAAE;AACnC,IAAA,MAAMC,WAAW,GAAGD,KAAK,EAAEE,YAAY,IAAI,CAAC;AAC5C,IAAA,MAAME,YAAY,GAAGJ,KAAK,EAAEK,aAAa,IAAI,CAAC;;AAE9C;AACA,IAAA,MAAMQ,KAAK,GAAGiB,QAAQ,EAAEjB,KAA2B;;AAEnD;AACA,IAAA,MAAMvG,UAA+B,GAAG;AACtC,MAAA,GAAG,IAAI,CAAC8B,eAAe,CAACC,OAAO,EAAEC,MAAM,EAAEC,QAAQ,EAAEC,OAAO,EAAEC,OAAO,EAAEC,eAAe,CAAC;AACrFkE,MAAAA,SAAS,EAAEC,KAAK;AAChBsB,MAAAA,eAAe,EAAEH,UAAU;MAC3BhB,SAAS,EAAE,IAAI,CAACnG,qBAAqB,CAAC7C,mBAAmB,CAAC6J,gBAAgB,CAACO,MAAM,CAAC,CAAC;AACnFjB,MAAAA,gBAAgB,EAAElB,WAAW;AAC7BmB,MAAAA,iBAAiB,EAAEhB,YAAY;MAC/BiB,gBAAgB,EAAEpB,WAAW,GAAGG;KACjC;;AAED;IACA,IAAI0B,QAAQ,EAAEZ,MAAM,EAAE;MACpB5G,UAAU,CAAC2G,kBAAkB,GAAG,IAAI,CAACpG,qBAAqB,CAACiH,QAAQ,CAACZ,MAAM,CAAC;AAC7E,IAAA;IAEA,IAAI,CAACnF,aAAa,CAAC,gBAAgB,EAAEzB,UAAU,EAAEL,UAAU,CAAC;AAC9D,EAAA;AAEQmF,EAAAA,mBAAmBA,CACzBR,QAA0B,EAC1BvC,OAAe,EACfC,MAAc,EACdC,QAAuB,EACvBC,OAAe,EACfvC,UAAkB,EAClBwC,OAAsB,EACtBC,eAAoC,EAC9B;AACN,IAAA,MAAMpC,UAA+B,GAAG;AACtC,MAAA,GAAG,IAAI,CAAC8B,eAAe,CAACC,OAAO,EAAEC,MAAM,EAAEC,QAAQ,EAAEC,OAAO,EAAEC,OAAO,EAAEC,eAAe,CAAC;MACrF2F,aAAa,EAAEzD,QAAQ,CAACd,IAAI;AAC5BwE,MAAAA,aAAa,EAAE,MAAM;MACrBC,eAAe,EAAE,IAAI,CAAC1H,qBAAqB,CAAC+D,QAAQ,CAACpI,KAAK,CAAC;AAC3DgM,MAAAA,gBAAgB,EAAE,IAAI,CAAC3H,qBAAqB,CAAC+D,QAAQ,CAACsC,MAAM;KAC7D;IAED,IAAItC,QAAQ,CAAC6D,QAAQ,EAAE;MACrBnI,UAAU,CAACoI,YAAY,GAAG,IAAI,CAAC7H,qBAAqB,CAAC+D,QAAQ,CAAC6D,QAAQ,CAAC;AACzE,IAAA;IAEA,IAAI,CAAC1G,aAAa,CAAC,UAAU,EAAEzB,UAAU,EAAEL,UAAU,CAAC;AACxD,EAAA;AAEQoF,EAAAA,gBAAgBA,CACtBT,QAAuB,EACvBvC,OAAe,EACfC,MAAc,EACdC,QAAuB,EACvBC,OAAe,EACfvC,UAAkB,EAClBwC,OAAsB,EACtBC,eAAoC,EAC9B;AACN,IAAA,MAAMpC,UAA+B,GAAG;AACtC,MAAA,GAAG,IAAI,CAAC8B,eAAe,CAACC,OAAO,EAAEC,MAAM,EAAEC,QAAQ,EAAEC,OAAO,EAAEC,OAAO,EAAEC,eAAe,CAAC;MACrF2F,aAAa,EAAEzD,QAAQ,CAACd,IAAI;AAC5BwE,MAAAA,aAAa,EAAE;KAChB;IAED,IAAI1D,QAAQ,CAAC+D,QAAQ,EAAE;AACrBrI,MAAAA,UAAU,CAACsI,kBAAkB,GAAGhE,QAAQ,CAAC+D,QAAQ;AACnD,IAAA;IACA,IAAI/D,QAAQ,CAACiE,KAAK,EAAE;AAClBvI,MAAAA,UAAU,CAACwI,eAAe,GAAGlE,QAAQ,CAACiE,KAAK;AAC7C,IAAA;IACA,IAAIjE,QAAQ,CAACmE,WAAW,EAAE;AACxBzI,MAAAA,UAAU,CAAC0I,qBAAqB,GAAGpE,QAAQ,CAACmE,WAAW;AACzD,IAAA;IAEA,IAAI,CAAChH,aAAa,CAAC,UAAU,EAAEzB,UAAU,EAAEL,UAAU,CAAC;AACxD,EAAA;AAEQqF,EAAAA,kBAAkBA,CACxBV,QAAyB,EACzBvC,OAAe,EACfC,MAAc,EACdC,QAAuB,EACvBC,OAAe,EACfvC,UAAkB,EAClBwC,OAAsB,EACtBC,eAAoC,EAC9B;AACN,IAAA,MAAMpC,UAA+B,GAAG;AACtC,MAAA,GAAG,IAAI,CAAC8B,eAAe,CAACC,OAAO,EAAEC,MAAM,EAAEC,QAAQ,EAAEC,OAAO,EAAEC,OAAO,EAAEC,eAAe,CAAC;MACrF2F,aAAa,EAAE,GAAGzD,QAAQ,CAACqE,UAAU,CAAA,IAAA,EAAOrE,QAAQ,CAACsE,QAAQ,CAAA,CAAE;AAC/DZ,MAAAA,aAAa,EAAE,SAAS;MACxBa,sBAAsB,EAAEvE,QAAQ,CAACqE,UAAU;MAC3CG,oBAAoB,EAAExE,QAAQ,CAACsE;KAChC;IAED,IAAI,CAACnH,aAAa,CAAC,UAAU,EAAEzB,UAAU,EAAEL,UAAU,CAAC;AACxD,EAAA;AAEQsF,EAAAA,oBAAoBA,CAC1BX,QAA2B,EAC3BvC,OAAe,EACfC,MAAc,EACdC,QAAuB,EACvBC,OAAe,EACfvC,UAAkB,EAClBwC,OAAsB,EACtBC,eAAoC,EAC9B;AACN,IAAA,MAAMpC,UAA+B,GAAG;AACtC,MAAA,GAAG,IAAI,CAAC8B,eAAe,CAACC,OAAO,EAAEC,MAAM,EAAEC,QAAQ,EAAEC,OAAO,EAAEC,OAAO,EAAEC,eAAe,CAAC;MACrF2F,aAAa,EAAEzD,QAAQ,CAACd,IAAI;AAC5BwE,MAAAA,aAAa,EAAE,WAAW;MAC1Be,uBAAuB,EAAEzE,QAAQ,CAAC0E;KACnC;IAED,IAAI,CAACvH,aAAa,CAAC,UAAU,EAAEzB,UAAU,EAAEL,UAAU,CAAC;AACxD,EAAA;AAEQuF,EAAAA,iBAAiBA,CACvBZ,QAAwB,EACxBvC,OAAe,EACfC,MAAc,EACdC,QAAuB,EACvBC,OAAe,EACfvC,UAAkB,EAClBwC,OAAsB,EACtBC,eAAoC,EAC9B;AACN,IAAA,MAAMpC,UAA+B,GAAG;AACtC,MAAA,GAAG,IAAI,CAAC8B,eAAe,CAACC,OAAO,EAAEC,MAAM,EAAEC,QAAQ,EAAEC,OAAO,EAAEC,OAAO,EAAEC,eAAe,CAAC;MACrF2F,aAAa,EAAEzD,QAAQ,CAACd,IAAI;AAC5BwE,MAAAA,aAAa,EAAE,QAAQ;AACvBiB,MAAAA,eAAe,EAAE,IAAI,CAAC1I,qBAAqB,CAAC+D,QAAQ,CAAC4E,IAAI;KAC1D;IAED,IAAI,CAACzH,aAAa,CAAC,UAAU,EAAEzB,UAAU,EAAEL,UAAU,CAAC;AACxD,EAAA;AAEQwF,EAAAA,gBAAgBA,CACtBb,QAAsE,EACtEvC,OAAe,EACfC,MAAc,EACdC,QAAuB,EACvBC,OAAe,EACfvC,UAAkB,EAClBwC,OAAsB,EACtBC,eAAoC,EAC9B;AACN,IAAA,MAAM+G,QAAQ,GAAG7E,QAAQ,CAAC1J,IAAI;AAE9B,IAAA,MAAMoF,UAA+B,GAAG;AACtC,MAAA,GAAG,IAAI,CAAC8B,eAAe,CAACC,OAAO,EAAEC,MAAM,EAAEC,QAAQ,EAAEC,OAAO,EAAEC,OAAO,EAAEC,eAAe,CAAC;AACrF2F,MAAAA,aAAa,EAAEoB,QAAQ;AACvBnB,MAAAA,aAAa,EAAEmB;KAChB;;AAED;AACA,IAAA,IAAI,OAAO,IAAI7E,QAAQ,IAAIA,QAAQ,CAACiC,KAAK,EAAE;AACzCvG,MAAAA,UAAU,CAACsG,SAAS,GAAGhC,QAAQ,CAACiC,KAAK;AACvC,IAAA;;AAEA;AACA,IAAA,IAAI,cAAc,IAAIjC,QAAQ,IAAIA,QAAQ,CAAC4B,YAAY,EAAE;MACvDlG,UAAU,CAACoJ,gBAAgB,GAAG,IAAI,CAAC7I,qBAAqB,CAAC+D,QAAQ,CAAC4B,YAAY,CAAC;AACjF,IAAA;;AAEA;AACA,IAAA,IAAI5B,QAAQ,CAAC1J,IAAI,KAAK,eAAe,EAAE;MACrC,MAAMyO,aAAa,GAAG/E,QAAiC;AACvD,MAAA,IAAI+E,aAAa,CAACnN,KAAK,EAAE1B,MAAM,EAAE;AAC/BwF,QAAAA,UAAU,CAACsJ,sBAAsB,GAAGD,aAAa,CAACnN,KAAK,CAAC1B,MAAM;AAChE,MAAA;AACA;MACA,IAAI6O,aAAa,CAACzC,MAAM,EAAE;QACxB5G,UAAU,CAACkI,gBAAgB,GAAG,IAAI,CAAC3H,qBAAqB,CAAC8I,aAAa,CAACzC,MAAM,CAAC;AAChF,MAAA;AACF,IAAA,CAAC,MAAM,IAAItC,QAAQ,CAAC1J,IAAI,KAAK,QAAQ,EAAE;MACrC,MAAM2O,MAAM,GAAGjF,QAA0B;AACzC,MAAA,IAAIiF,MAAM,CAAC3C,MAAM,EAAEpM,MAAM,EAAE;AACzBwF,QAAAA,UAAU,CAACwJ,uBAAuB,GAAGD,MAAM,CAAC3C,MAAM,CAACpM,MAAM;AAC3D,MAAA;AACA;MACA,IAAI+O,MAAM,CAACrN,KAAK,EAAE;QAChB8D,UAAU,CAAC0G,SAAS,GAAG,IAAI,CAACnG,qBAAqB,CAACgJ,MAAM,CAACrN,KAAK,CAAC;AACjE,MAAA;AACF,IAAA,CAAC,MAAM,IAAIoI,QAAQ,CAAC1J,IAAI,KAAK,cAAc,EAAE;MAC3C,MAAM6O,WAAW,GAAGnF,QAA+B;MACnD,IAAImF,WAAW,CAACvN,KAAK,EAAE;QACrB8D,UAAU,CAAC0G,SAAS,GAAG,IAAI,CAACnG,qBAAqB,CAACkJ,WAAW,CAACvN,KAAK,CAAC;AACtE,MAAA;AACF,IAAA;IAEA,IAAI,CAACuF,aAAa,CAAC,UAAU,EAAEzB,UAAU,EAAEL,UAAU,CAAC;AACxD,EAAA;AAEQyF,EAAAA,cAAcA,CACpBd,QAA8B,EAC9BvC,OAAe,EACfC,MAAc,EACdC,QAAuB,EACvBC,OAAe,EACfvC,UAAkB,EAClBwC,OAAsB,EACtBC,eAAoC,EAC9B;AACN,IAAA,MAAMpC,UAA+B,GAAG;AACtC,MAAA,GAAG,IAAI,CAAC8B,eAAe,CAACC,OAAO,EAAEC,MAAM,EAAEC,QAAQ,EAAEC,OAAO,EAAEC,OAAO,EAAEC,eAAe,CAAC;AACrF2F,MAAAA,aAAa,EAAE,CAAA,IAAA,EAAOzD,QAAQ,CAACoF,MAAM,CAAA,CAAE;AACvC1B,MAAAA,aAAa,EAAE,WAAW;MAC1B2B,cAAc,EAAErF,QAAQ,CAACoF,MAAM;AAC/BE,MAAAA,aAAa,EAAE,IAAI,CAACrJ,qBAAqB,CAAC+D,QAAQ,CAACjE,MAAM;KAC1D;IAED,IAAI,CAACoB,aAAa,CAAC,UAAU,EAAEzB,UAAU,EAAEL,UAAU,CAAC;AACxD,EAAA;AAEQ0F,EAAAA,kBAAkBA,CACxBf,QAAkB,EAClBvC,OAAe,EACfC,MAAc,EACdC,QAAuB,EACvBC,OAAe,EACfvC,UAAkB,EAClBwC,OAAsB,EACtBC,eAAoC,EAC9B;AACN,IAAA,MAAM+G,QAAQ,GAAG7E,QAAQ,CAAC1J,IAAI,IAAI,SAAS;AAE3C,IAAA,MAAMoF,UAA+B,GAAG;AACtC,MAAA,GAAG,IAAI,CAAC8B,eAAe,CAACC,OAAO,EAAEC,MAAM,EAAEC,QAAQ,EAAEC,OAAO,EAAEC,OAAO,EAAEC,eAAe,CAAC;AACrF2F,MAAAA,aAAa,EAAEoB,QAAQ;AACvBnB,MAAAA,aAAa,EAAEmB;KAChB;IAED,IAAI,CAAC1H,aAAa,CAAC,UAAU,EAAEzB,UAAU,EAAEL,UAAU,CAAC;AACxD,EAAA;AACF;;AC5wBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,eAAekK,UAAUA,CAACrK,OAA0B,EAAoC;EAC7F,MAAM;AAAEsK,IAAAA;AAAkB,GAAC,GAAG,MAAM,OAAO,qBAAqB,CAAC;AAEjE,EAAA,MAAMC,SAAS,GAAG,IAAI5K,uBAAuB,CAAC;IAC5CnD,MAAM,EAAEwD,OAAO,CAACxD,MAAM;IACtB2D,UAAU,EAAEH,OAAO,CAACG,UAAU;IAC9B1D,WAAW,EAAEuD,OAAO,CAACvD,WAAW;IAChC6D,MAAM,EAAEN,OAAO,CAACM,MAAM;IACtBE,UAAU,EAAER,OAAO,CAACQ;AACtB,GAAC,CAAC;EAEF8J,iBAAiB,CAACC,SAAS,CAAC;AAC5B,EAAA,OAAOA,SAAS;AAClB;;;;"}
@@ -397,7 +397,7 @@ function sanitizeValues(obj) {
397
397
  return jsonSafe;
398
398
  }
399
399
 
400
- var version = "8.2.2";
400
+ var version = "8.3.0";
401
401
 
402
402
  const DEFAULT_MAX_DEPTH = 3;
403
403
  const MAX_STACK_LINES = 20;
@@ -395,7 +395,7 @@ function sanitizeValues(obj) {
395
395
  return jsonSafe;
396
396
  }
397
397
 
398
- var version = "8.2.2";
398
+ var version = "8.3.0";
399
399
 
400
400
  const DEFAULT_MAX_DEPTH = 3;
401
401
  const MAX_STACK_LINES = 20;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@posthog/ai",
3
- "version": "8.2.2",
3
+ "version": "8.3.0",
4
4
  "description": "PostHog Node.js AI integrations",
5
5
  "repository": {
6
6
  "type": "git",
@@ -29,9 +29,9 @@
29
29
  "@types/jest": "^29.5.14",
30
30
  "jest": "29.7.0",
31
31
  "node-fetch": "^3.3.2",
32
- "@posthog-tooling/rollup-utils": "1.1.1",
33
32
  "@posthog-tooling/tsconfig-base": "1.1.1",
34
- "posthog-node": "^5.38.5"
33
+ "posthog-node": "^5.39.4",
34
+ "@posthog-tooling/rollup-utils": "1.1.1"
35
35
  },
36
36
  "keywords": [
37
37
  "posthog",
@@ -49,7 +49,7 @@
49
49
  "dependencies": {
50
50
  "uuid": "^11.1.0",
51
51
  "zod": "^4.1.13",
52
- "@posthog/core": "^1.37.3"
52
+ "@posthog/core": "^1.39.6"
53
53
  },
54
54
  "peerDependencies": {
55
55
  "@anthropic-ai/sdk": "^0.78.0",