@posthog/ai 7.21.0 → 8.0.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.
- package/README.md +21 -4
- package/dist/anthropic/index.cjs +1 -1
- package/dist/anthropic/index.cjs.map +1 -1
- package/dist/anthropic/index.mjs +1 -1
- package/dist/anthropic/index.mjs.map +1 -1
- package/dist/gemini/index.cjs +2 -1
- package/dist/gemini/index.cjs.map +1 -1
- package/dist/gemini/index.d.ts +1 -1
- package/dist/gemini/index.mjs +2 -2
- package/dist/gemini/index.mjs.map +1 -1
- package/dist/index.cjs +72 -3500
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +10 -276
- package/dist/index.mjs +72 -3473
- package/dist/index.mjs.map +1 -1
- package/dist/langchain/index.cjs +4 -486
- package/dist/langchain/index.cjs.map +1 -1
- package/dist/langchain/index.mjs +3 -465
- package/dist/langchain/index.mjs.map +1 -1
- package/dist/openai/index.cjs +529 -1
- package/dist/openai/index.cjs.map +1 -1
- package/dist/openai/index.d.ts +40 -2
- package/dist/openai/index.mjs +530 -3
- package/dist/openai/index.mjs.map +1 -1
- package/dist/openai-agents/index.cjs +1 -1
- package/dist/openai-agents/index.cjs.map +1 -1
- package/dist/openai-agents/index.mjs +1 -1
- package/dist/openai-agents/index.mjs.map +1 -1
- package/dist/otel/index.cjs +14 -14
- package/dist/otel/index.cjs.map +1 -1
- package/dist/otel/index.d.ts +11 -16
- package/dist/otel/index.mjs +14 -14
- package/dist/otel/index.mjs.map +1 -1
- package/dist/vercel/index.cjs +1 -1
- package/dist/vercel/index.cjs.map +1 -1
- package/dist/vercel/index.mjs +1 -1
- package/dist/vercel/index.mjs.map +1 -1
- package/package.json +24 -9
package/dist/otel/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../src/sanitization/base64_recognizer.ts","../../src/sanitization/media_type_context.ts","../../src/sanitization/binary_content_redactor.ts","../../src/otel/redact.ts","../../src/otel/spans.ts","../../src/otel/exporter.ts","../../src/otel/processor.ts"],"sourcesContent":["const DATA_URL_PREFIX_RE = /^data:([^;,\\s]+)(?:;[^;,\\s]+)*;base64,/i\nconst BASE64_ALPHABET_RE = /^[A-Za-z0-9+/_=-]+$/\n\nexport type Base64Recognition = { kind: 'data-url'; mediaType: string } | { kind: 'raw' } | { kind: 'none' }\n\nexport class Base64Recognizer {\n recognize(value: string, minLength: number): Base64Recognition {\n const dataUrl = DATA_URL_PREFIX_RE.exec(value)\n if (dataUrl) return { kind: 'data-url', mediaType: dataUrl[1] }\n\n if (value.length < minLength) return { kind: 'none' }\n\n const confidencePrefix = value.slice(0, minLength)\n if (BASE64_ALPHABET_RE.test(confidencePrefix)) {\n return { kind: 'raw' }\n } else {\n return { kind: 'none' }\n }\n }\n}\n","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 { Base64Recognizer } from './base64_recognizer'\nimport { MediaTypeContext } from './media_type_context'\n\nconst STRONG_CONTEXT_MIN_LENGTH = 64\nconst WEAK_CONTEXT_MIN_LENGTH = 1024\n\nexport class BinaryContentRedactor {\n private visited: WeakSet<object> = new WeakSet()\n\n constructor(private readonly recognizer: Base64Recognizer = new Base64Recognizer()) {}\n\n redact<T>(value: T): T\n redact(value: unknown): unknown {\n if (this.isMultimodalEnabled()) return value\n this.visited = new WeakSet()\n return this.walk(value, MediaTypeContext.EMPTY)\n }\n\n private walk(value: unknown, ctx: MediaTypeContext): unknown {\n if (value === null || value === undefined) return value\n if (typeof value === 'string') return this.redactString(value, ctx)\n if (typeof value !== 'object') return value\n\n // Buffer extends Uint8Array, so this branch catches both.\n if (typeof Uint8Array !== 'undefined' && value instanceof Uint8Array) {\n return this.placeholderFor(ctx.inferMediaType())\n }\n\n if (this.visited.has(value)) return null\n this.visited.add(value)\n\n if (Array.isArray(value)) {\n return value.map((item) => this.walk(item, ctx))\n }\n\n const obj = value as Record<string, unknown>\n const out: Record<string, unknown> = {}\n for (const k of Object.keys(obj)) {\n out[k] = this.walk(obj[k], new MediaTypeContext(obj, k))\n }\n return out\n }\n\n private redactString(value: string, ctx: MediaTypeContext): string {\n const minLength = ctx.signalsBinary() ? STRONG_CONTEXT_MIN_LENGTH : WEAK_CONTEXT_MIN_LENGTH\n const recognition = this.recognizer.recognize(value, minLength)\n switch (recognition.kind) {\n case 'data-url':\n return this.placeholderFor(recognition.mediaType)\n case 'raw':\n return this.placeholderFor(ctx.inferMediaType())\n case 'none':\n return value\n }\n }\n\n private placeholderFor(mediaType?: string): string {\n if (!mediaType) return '[base64 redacted]'\n if (mediaType === 'application/octet-stream') return '[base64 file redacted]'\n return `[base64 ${mediaType} redacted]`\n }\n\n private isMultimodalEnabled(): boolean {\n const val = process.env._INTERNAL_LLMA_MULTIMODAL || ''\n return val.toLowerCase() === 'true' || val === '1' || val.toLowerCase() === 'yes'\n }\n}\n","import type { Attributes, AttributeValue } from '@opentelemetry/api'\nimport type { ReadableSpan, TimedEvent } from '@opentelemetry/sdk-trace-base'\n\nimport { BinaryContentRedactor } from '../sanitization/binary_content_redactor'\n\nconst redactor = new BinaryContentRedactor()\n\nexport function redactSpan(span: ReadableSpan): ReadableSpan {\n const attributes = span.attributes ? redactAttributes(span.attributes) : span.attributes\n const events = span.events ? redactEvents(span.events) : span.events\n if (attributes === span.attributes && events === span.events) {\n return span\n }\n // Copy rather than mutate: the span is shared across every registered processor/exporter.\n return Object.create(span, {\n attributes: { value: attributes, enumerable: true, configurable: true },\n events: { value: events, enumerable: true, configurable: true },\n })\n}\n\nfunction redactAttributes(attributes: Attributes): Attributes {\n let changed = false\n const out: Attributes = {}\n for (const key of Object.keys(attributes)) {\n const value = attributes[key]\n const redacted = value === undefined ? value : redactAttributeValue(value)\n if (redacted !== value) {\n changed = true\n }\n out[key] = redacted\n }\n return changed ? out : attributes\n}\n\nfunction redactEvents(events: TimedEvent[]): TimedEvent[] {\n let changed = false\n const out = events.map((event) => {\n if (!event.attributes) {\n return event\n }\n const attributes = redactAttributes(event.attributes)\n if (attributes === event.attributes) {\n return event\n }\n changed = true\n return { ...event, attributes }\n })\n return changed ? out : events\n}\n\nfunction redactAttributeValue(value: AttributeValue): AttributeValue {\n if (typeof value === 'string') {\n return redactString(value)\n }\n if (isStringArray(value)) {\n let changed = false\n const out = value.map((item) => {\n if (typeof item !== 'string') {\n return item\n }\n const redacted = redactString(item)\n if (redacted !== item) {\n changed = true\n }\n return redacted\n })\n return changed ? out : value\n }\n return value\n}\n\nfunction isStringArray(value: AttributeValue): value is Array<string | null | undefined> {\n return Array.isArray(value) && value.every((item) => typeof item !== 'number' && typeof item !== 'boolean')\n}\n\nfunction redactString(value: string): string {\n const trimmed = value.trimStart()\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n const redacted = redactJson(value)\n if (redacted !== undefined) {\n return redacted\n }\n }\n return redactor.redact(value)\n}\n\nfunction redactJson(value: string): string | undefined {\n let parsed: unknown\n try {\n parsed = JSON.parse(value)\n } catch {\n return undefined\n }\n if (parsed === null || typeof parsed !== 'object') {\n return undefined\n }\n const redactedStr = JSON.stringify(redactor.redact(parsed))\n // Preserve the original string (and its formatting) when nothing was redacted.\n return redactedStr === JSON.stringify(parsed) ? value : redactedStr\n}\n","import type { ReadableSpan } from '@opentelemetry/sdk-trace-base'\n\nconst AI_SPAN_PREFIXES = ['gen_ai.', 'llm.', 'ai.', 'traceloop.'] as const\n\n/**\n * Returns `true` when the span is AI-related — its name or any attribute\n * key starts with `gen_ai.`, `llm.`, `ai.`, or `traceloop.`.\n */\nexport function isAISpan(span: ReadableSpan): boolean {\n if (AI_SPAN_PREFIXES.some((prefix) => span.name.startsWith(prefix))) {\n return true\n }\n const attributes = span.attributes\n if (attributes) {\n return Object.keys(attributes).some((key) => AI_SPAN_PREFIXES.some((prefix) => key.startsWith(prefix)))\n }\n return false\n}\n","import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'\nimport type { ReadableSpan } from '@opentelemetry/sdk-trace-base'\nimport { ExportResultCode } from '@opentelemetry/core'\n\nimport { redactSpan } from './redact'\nimport { isAISpan } from './spans'\n\nconst DEFAULT_OTEL_HOST = 'https://us.i.posthog.com'\n\nfunction normalizeToken(value?: unknown): string {\n return typeof value === 'string' ? value.trim() : ''\n}\n\nfunction normalizeHost(value?: unknown): string {\n const normalizedValue = typeof value === 'string' ? value.trim() : ''\n return normalizedValue || DEFAULT_OTEL_HOST\n}\n\n/**\n * Options for the PostHogTraceExporter. Provide `projectToken` to enable exporting. Missing or blank\n * tokens disable the exporter. You can also optionally override the `host` URL. `host` defaults to `https://us.i.posthog.com`.\n *\n * @example\n * ```ts\n * import { PostHogTraceExporter } from '@posthog/ai/otel'\n *\n * new PostHogTraceExporter({ projectToken: 'phc_...' })\n * ```\n *\n * @example\n * ```ts\n * import { PostHogTraceExporter } from '@posthog/ai/otel'\n *\n * new PostHogTraceExporter({ projectToken: 'phc_...', host: 'https://eu.i.posthog.com' })\n * ```\n */\nexport type PostHogTraceExporterOptions =\n | { projectToken?: string; apiKey?: never; host?: string }\n | {\n /** @deprecated Use `projectToken` instead */\n apiKey?: string\n projectToken?: never\n host?: string\n }\n\n/**\n * An OpenTelemetry `TraceExporter` that sends AI traces to PostHog's OTLP\n * ingestion endpoint. PostHog converts `gen_ai.*` spans into\n * `$ai_generation` events server-side.\n *\n * Only AI-related spans (those whose name or attribute keys start with\n * `gen_ai.`, `llm.`, `ai.`, or `traceloop.`) are exported; all other\n * spans are silently dropped.\n *\n * Use this when the API you're integrating with only accepts a\n * `TraceExporter` (e.g. Vercel's `registerOTel`) or when you need to\n * plug PostHog into an existing processor chain. Otherwise prefer\n * {@link PostHogSpanProcessor}, which is self-contained.\n *\n * Provide `projectToken` to enable exporting. Missing or blank tokens disable the exporter.\n * You can also optionally override the `host` URL.\n *\n * @example\n * ```ts\n * import { PostHogTraceExporter } from '@posthog/ai/otel'\n * import { registerOTel } from '@vercel/otel'\n *\n * registerOTel({\n * serviceName: 'my-app',\n * traceExporter: new PostHogTraceExporter({ projectToken: 'phc_...' }),\n * })\n * ```\n */\nexport class PostHogTraceExporter extends OTLPTraceExporter {\n private readonly disabled: boolean\n\n constructor(options: PostHogTraceExporterOptions = {}) {\n const token = normalizeToken(options.projectToken) || normalizeToken(options.apiKey)\n const disabled = !token\n const host = token ? new URL(normalizeHost(options.host)).origin : DEFAULT_OTEL_HOST\n super({\n url: `${host}/i/v0/ai/otel`,\n headers: token\n ? {\n Authorization: `Bearer ${token}`,\n }\n : {},\n })\n\n this.disabled = disabled\n if (this.disabled) {\n console.warn('[PostHogTraceExporter] projectToken is missing or blank; the exporter will be disabled.')\n }\n }\n\n override export(spans: ReadableSpan[], resultCallback: (result: { code: number; error?: Error }) => void): void {\n if (this.disabled) {\n // Intentionally report success: missing or blank tokens disable exporting as a compatibility no-op.\n // Reporting failure would make OpenTelemetry treat every span as an export error.\n resultCallback({ code: ExportResultCode.SUCCESS })\n return\n }\n\n const aiSpans = spans.filter(isAISpan)\n if (aiSpans.length === 0) {\n resultCallback({ code: ExportResultCode.SUCCESS })\n return\n }\n super.export(aiSpans.map(redactSpan), resultCallback)\n }\n}\n","import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'\nimport type { Context } from '@opentelemetry/api'\nimport { BatchSpanProcessor, type SpanProcessor, type ReadableSpan, type Span } from '@opentelemetry/sdk-trace-base'\n\nimport { redactSpan } from './redact'\nimport { isAISpan } from './spans'\n\nconst DEFAULT_OTEL_HOST = 'https://us.i.posthog.com'\n\nfunction normalizeApiKey(value?: unknown): string {\n return typeof value === 'string' ? value.trim() : ''\n}\n\nfunction normalizeHost(value?: unknown): string {\n const normalizedValue = typeof value === 'string' ? value.trim() : ''\n return normalizedValue || DEFAULT_OTEL_HOST\n}\n\nexport interface PostHogSpanProcessorOptions {\n /**\n * Your PostHog project API key.\n */\n apiKey?: string\n\n /**\n * PostHog host URL. Defaults to `https://us.i.posthog.com`.\n */\n host?: string\n\n /**\n * @internal Injected processor for testing — bypasses exporter creation.\n */\n _spanProcessor?: SpanProcessor\n}\n\nclass NoopSpanProcessor implements SpanProcessor {\n onStart(_span: Span, _parentContext: Context): void {\n return\n }\n onEnd(_span: ReadableSpan): void {\n return\n }\n shutdown(): Promise<void> {\n return Promise.resolve()\n }\n forceFlush(): Promise<void> {\n return Promise.resolve()\n }\n}\n\n/**\n * An OpenTelemetry `SpanProcessor` that sends AI traces to PostHog.\n *\n * Missing or blank project API keys disable the processor.\n *\n * Internally batches spans and exports them to PostHog's OTLP ingestion\n * endpoint. Only AI-related spans (those whose name or attribute keys\n * start with `gen_ai.`, `llm.`, `ai.`, or `traceloop.`) are exported;\n * all other spans are silently dropped.\n *\n * This is the recommended integration point when your setup accepts a\n * `SpanProcessor`. If you need a `TraceExporter` instead (e.g. for\n * Vercel's `registerOTel`), use {@link PostHogTraceExporter}.\n *\n * @example\n * ```ts\n * import { PostHogSpanProcessor } from '@posthog/ai/otel'\n * import { NodeSDK } from '@opentelemetry/sdk-node'\n *\n * const sdk = new NodeSDK({\n * spanProcessors: [new PostHogSpanProcessor({ apiKey: 'phc_...' })],\n * })\n * sdk.start()\n * ```\n */\nexport class PostHogSpanProcessor implements SpanProcessor {\n private readonly inner: SpanProcessor\n\n constructor(options: PostHogSpanProcessorOptions = {}) {\n const apiKey = normalizeApiKey(options.apiKey)\n if (!apiKey) {\n console.warn('[PostHogSpanProcessor] apiKey is missing or blank; the processor will be disabled.')\n this.inner = new NoopSpanProcessor()\n return\n }\n\n if (options._spanProcessor) {\n this.inner = options._spanProcessor\n } else {\n const host = new URL(normalizeHost(options.host)).origin\n const exporter = new OTLPTraceExporter({\n url: `${host}/i/v0/ai/otel`,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n })\n this.inner = new BatchSpanProcessor(exporter)\n }\n }\n\n onStart(span: Span, parentContext: Context): void {\n // Forwarded unconditionally — filtering happens in onEnd. We can't filter\n // here because the span hasn't finished yet and may not have AI attributes\n // set. BatchSpanProcessor.onStart is a no-op so this is safe.\n this.inner.onStart(span, parentContext)\n }\n\n onEnd(span: ReadableSpan): void {\n if (isAISpan(span)) {\n this.inner.onEnd(redactSpan(span))\n }\n }\n\n shutdown(): Promise<void> {\n return this.inner.shutdown()\n }\n\n forceFlush(): Promise<void> {\n return this.inner.forceFlush()\n }\n}\n"],"names":["DATA_URL_PREFIX_RE","BASE64_ALPHABET_RE","Base64Recognizer","recognize","value","minLength","dataUrl","exec","kind","mediaType","length","confidencePrefix","slice","test","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","STRONG_CONTEXT_MIN_LENGTH","WEAK_CONTEXT_MIN_LENGTH","BinaryContentRedactor","visited","WeakSet","recognizer","redact","isMultimodalEnabled","walk","ctx","redactString","Uint8Array","placeholderFor","add","Array","isArray","map","item","obj","out","k","Object","keys","recognition","val","process","env","_INTERNAL_LLMA_MULTIMODAL","redactor","redactSpan","span","attributes","redactAttributes","events","redactEvents","create","enumerable","configurable","changed","redacted","redactAttributeValue","event","isStringArray","every","trimmed","trimStart","startsWith","redactJson","parsed","JSON","parse","redactedStr","stringify","AI_SPAN_PREFIXES","isAISpan","some","prefix","name","DEFAULT_OTEL_HOST","normalizeToken","trim","normalizeHost","normalizedValue","PostHogTraceExporter","OTLPTraceExporter","options","token","projectToken","apiKey","disabled","host","URL","origin","url","headers","Authorization","console","warn","export","spans","resultCallback","code","ExportResultCode","SUCCESS","aiSpans","filter","normalizeApiKey","NoopSpanProcessor","onStart","_span","_parentContext","onEnd","shutdown","Promise","resolve","forceFlush","PostHogSpanProcessor","inner","_spanProcessor","exporter","BatchSpanProcessor","parentContext"],"mappings":";;;;;;AAAA,MAAMA,kBAAkB,GAAG,yCAAyC;AACpE,MAAMC,kBAAkB,GAAG,qBAAqB;AAIzC,MAAMC,gBAAgB,CAAC;AAC5BC,EAAAA,SAASA,CAACC,KAAa,EAAEC,SAAiB,EAAqB;AAC7D,IAAA,MAAMC,OAAO,GAAGN,kBAAkB,CAACO,IAAI,CAACH,KAAK,CAAC;IAC9C,IAAIE,OAAO,EAAE,OAAO;AAAEE,MAAAA,IAAI,EAAE,UAAU;MAAEC,SAAS,EAAEH,OAAO,CAAC,CAAC;KAAG;AAE/D,IAAA,IAAIF,KAAK,CAACM,MAAM,GAAGL,SAAS,EAAE,OAAO;AAAEG,MAAAA,IAAI,EAAE;KAAQ;IAErD,MAAMG,gBAAgB,GAAGP,KAAK,CAACQ,KAAK,CAAC,CAAC,EAAEP,SAAS,CAAC;AAClD,IAAA,IAAIJ,kBAAkB,CAACY,IAAI,CAACF,gBAAgB,CAAC,EAAE;MAC7C,OAAO;AAAEH,QAAAA,IAAI,EAAE;OAAO;AACxB,IAAA,CAAC,MAAM;MACL,OAAO;AAAEA,QAAAA,IAAI,EAAE;OAAQ;AACzB,IAAA;AACF,EAAA;AACF;;ACnBA,MAAMM,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;;ACrGA,MAAMgB,yBAAyB,GAAG,EAAE;AACpC,MAAMC,uBAAuB,GAAG,IAAI;AAE7B,MAAMC,qBAAqB,CAAC;AACzBC,EAAAA,OAAO,GAAoB,IAAIC,OAAO,EAAE;AAEhDtB,EAAAA,WAAWA,CAAkBuB,UAA4B,GAAG,IAAI5C,gBAAgB,EAAE,EAAE;IAAA,IAAA,CAAvD4C,UAA4B,GAA5BA,UAA4B;AAA4B,EAAA;EAGrFC,MAAMA,CAAC3C,KAAc,EAAW;AAC9B,IAAA,IAAI,IAAI,CAAC4C,mBAAmB,EAAE,EAAE,OAAO5C,KAAK;AAC5C,IAAA,IAAI,CAACwC,OAAO,GAAG,IAAIC,OAAO,EAAE;IAC5B,OAAO,IAAI,CAACI,IAAI,CAAC7C,KAAK,EAAEgB,gBAAgB,CAACC,KAAK,CAAC;AACjD,EAAA;AAEQ4B,EAAAA,IAAIA,CAAC7C,KAAc,EAAE8C,GAAqB,EAAW;IAC3D,IAAI9C,KAAK,KAAK,IAAI,IAAIA,KAAK,KAAKkB,SAAS,EAAE,OAAOlB,KAAK;AACvD,IAAA,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE,OAAO,IAAI,CAAC+C,YAAY,CAAC/C,KAAK,EAAE8C,GAAG,CAAC;AACnE,IAAA,IAAI,OAAO9C,KAAK,KAAK,QAAQ,EAAE,OAAOA,KAAK;;AAE3C;IACA,IAAI,OAAOgD,UAAU,KAAK,WAAW,IAAIhD,KAAK,YAAYgD,UAAU,EAAE;MACpE,OAAO,IAAI,CAACC,cAAc,CAACH,GAAG,CAACxB,cAAc,EAAE,CAAC;AAClD,IAAA;IAEA,IAAI,IAAI,CAACkB,OAAO,CAACT,GAAG,CAAC/B,KAAK,CAAC,EAAE,OAAO,IAAI;AACxC,IAAA,IAAI,CAACwC,OAAO,CAACU,GAAG,CAAClD,KAAK,CAAC;AAEvB,IAAA,IAAImD,KAAK,CAACC,OAAO,CAACpD,KAAK,CAAC,EAAE;AACxB,MAAA,OAAOA,KAAK,CAACqD,GAAG,CAAEC,IAAI,IAAK,IAAI,CAACT,IAAI,CAACS,IAAI,EAAER,GAAG,CAAC,CAAC;AAClD,IAAA;IAEA,MAAMS,GAAG,GAAGvD,KAAgC;IAC5C,MAAMwD,GAA4B,GAAG,EAAE;IACvC,KAAK,MAAMC,CAAC,IAAIC,MAAM,CAACC,IAAI,CAACJ,GAAG,CAAC,EAAE;MAChCC,GAAG,CAACC,CAAC,CAAC,GAAG,IAAI,CAACZ,IAAI,CAACU,GAAG,CAACE,CAAC,CAAC,EAAE,IAAIzC,gBAAgB,CAACuC,GAAG,EAAEE,CAAC,CAAC,CAAC;AAC1D,IAAA;AACA,IAAA,OAAOD,GAAG;AACZ,EAAA;AAEQT,EAAAA,YAAYA,CAAC/C,KAAa,EAAE8C,GAAqB,EAAU;IACjE,MAAM7C,SAAS,GAAG6C,GAAG,CAACV,aAAa,EAAE,GAAGC,yBAAyB,GAAGC,uBAAuB;IAC3F,MAAMsB,WAAW,GAAG,IAAI,CAAClB,UAAU,CAAC3C,SAAS,CAACC,KAAK,EAAEC,SAAS,CAAC;IAC/D,QAAQ2D,WAAW,CAACxD,IAAI;AACtB,MAAA,KAAK,UAAU;AACb,QAAA,OAAO,IAAI,CAAC6C,cAAc,CAACW,WAAW,CAACvD,SAAS,CAAC;AACnD,MAAA,KAAK,KAAK;QACR,OAAO,IAAI,CAAC4C,cAAc,CAACH,GAAG,CAACxB,cAAc,EAAE,CAAC;AAClD,MAAA,KAAK,MAAM;AACT,QAAA,OAAOtB,KAAK;AAChB;AACF,EAAA;EAEQiD,cAAcA,CAAC5C,SAAkB,EAAU;AACjD,IAAA,IAAI,CAACA,SAAS,EAAE,OAAO,mBAAmB;AAC1C,IAAA,IAAIA,SAAS,KAAK,0BAA0B,EAAE,OAAO,wBAAwB;IAC7E,OAAO,CAAA,QAAA,EAAWA,SAAS,CAAA,UAAA,CAAY;AACzC,EAAA;AAEQuC,EAAAA,mBAAmBA,GAAY;IACrC,MAAMiB,GAAG,GAAGC,OAAO,CAACC,GAAG,CAACC,yBAAyB,IAAI,EAAE;AACvD,IAAA,OAAOH,GAAG,CAAC7B,WAAW,EAAE,KAAK,MAAM,IAAI6B,GAAG,KAAK,GAAG,IAAIA,GAAG,CAAC7B,WAAW,EAAE,KAAK,KAAK;AACnF,EAAA;AACF;;AC7DA,MAAMiC,QAAQ,GAAG,IAAI1B,qBAAqB,EAAE;AAErC,SAAS2B,UAAUA,CAACC,IAAkB,EAAgB;AAC3D,EAAA,MAAMC,UAAU,GAAGD,IAAI,CAACC,UAAU,GAAGC,gBAAgB,CAACF,IAAI,CAACC,UAAU,CAAC,GAAGD,IAAI,CAACC,UAAU;AACxF,EAAA,MAAME,MAAM,GAAGH,IAAI,CAACG,MAAM,GAAGC,YAAY,CAACJ,IAAI,CAACG,MAAM,CAAC,GAAGH,IAAI,CAACG,MAAM;EACpE,IAAIF,UAAU,KAAKD,IAAI,CAACC,UAAU,IAAIE,MAAM,KAAKH,IAAI,CAACG,MAAM,EAAE;AAC5D,IAAA,OAAOH,IAAI;AACb,EAAA;AACA;AACA,EAAA,OAAOT,MAAM,CAACc,MAAM,CAACL,IAAI,EAAE;AACzBC,IAAAA,UAAU,EAAE;AAAEpE,MAAAA,KAAK,EAAEoE,UAAU;AAAEK,MAAAA,UAAU,EAAE,IAAI;AAAEC,MAAAA,YAAY,EAAE;KAAM;AACvEJ,IAAAA,MAAM,EAAE;AAAEtE,MAAAA,KAAK,EAAEsE,MAAM;AAAEG,MAAAA,UAAU,EAAE,IAAI;AAAEC,MAAAA,YAAY,EAAE;AAAK;AAChE,GAAC,CAAC;AACJ;AAEA,SAASL,gBAAgBA,CAACD,UAAsB,EAAc;EAC5D,IAAIO,OAAO,GAAG,KAAK;EACnB,MAAMnB,GAAe,GAAG,EAAE;EAC1B,KAAK,MAAMnC,GAAG,IAAIqC,MAAM,CAACC,IAAI,CAACS,UAAU,CAAC,EAAE;AACzC,IAAA,MAAMpE,KAAK,GAAGoE,UAAU,CAAC/C,GAAG,CAAC;IAC7B,MAAMuD,QAAQ,GAAG5E,KAAK,KAAKkB,SAAS,GAAGlB,KAAK,GAAG6E,oBAAoB,CAAC7E,KAAK,CAAC;IAC1E,IAAI4E,QAAQ,KAAK5E,KAAK,EAAE;AACtB2E,MAAAA,OAAO,GAAG,IAAI;AAChB,IAAA;AACAnB,IAAAA,GAAG,CAACnC,GAAG,CAAC,GAAGuD,QAAQ;AACrB,EAAA;AACA,EAAA,OAAOD,OAAO,GAAGnB,GAAG,GAAGY,UAAU;AACnC;AAEA,SAASG,YAAYA,CAACD,MAAoB,EAAgB;EACxD,IAAIK,OAAO,GAAG,KAAK;AACnB,EAAA,MAAMnB,GAAG,GAAGc,MAAM,CAACjB,GAAG,CAAEyB,KAAK,IAAK;AAChC,IAAA,IAAI,CAACA,KAAK,CAACV,UAAU,EAAE;AACrB,MAAA,OAAOU,KAAK;AACd,IAAA;AACA,IAAA,MAAMV,UAAU,GAAGC,gBAAgB,CAACS,KAAK,CAACV,UAAU,CAAC;AACrD,IAAA,IAAIA,UAAU,KAAKU,KAAK,CAACV,UAAU,EAAE;AACnC,MAAA,OAAOU,KAAK;AACd,IAAA;AACAH,IAAAA,OAAO,GAAG,IAAI;IACd,OAAO;AAAE,MAAA,GAAGG,KAAK;AAAEV,MAAAA;KAAY;AACjC,EAAA,CAAC,CAAC;AACF,EAAA,OAAOO,OAAO,GAAGnB,GAAG,GAAGc,MAAM;AAC/B;AAEA,SAASO,oBAAoBA,CAAC7E,KAAqB,EAAkB;AACnE,EAAA,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE;IAC7B,OAAO+C,YAAY,CAAC/C,KAAK,CAAC;AAC5B,EAAA;AACA,EAAA,IAAI+E,aAAa,CAAC/E,KAAK,CAAC,EAAE;IACxB,IAAI2E,OAAO,GAAG,KAAK;AACnB,IAAA,MAAMnB,GAAG,GAAGxD,KAAK,CAACqD,GAAG,CAAEC,IAAI,IAAK;AAC9B,MAAA,IAAI,OAAOA,IAAI,KAAK,QAAQ,EAAE;AAC5B,QAAA,OAAOA,IAAI;AACb,MAAA;AACA,MAAA,MAAMsB,QAAQ,GAAG7B,YAAY,CAACO,IAAI,CAAC;MACnC,IAAIsB,QAAQ,KAAKtB,IAAI,EAAE;AACrBqB,QAAAA,OAAO,GAAG,IAAI;AAChB,MAAA;AACA,MAAA,OAAOC,QAAQ;AACjB,IAAA,CAAC,CAAC;AACF,IAAA,OAAOD,OAAO,GAAGnB,GAAG,GAAGxD,KAAK;AAC9B,EAAA;AACA,EAAA,OAAOA,KAAK;AACd;AAEA,SAAS+E,aAAaA,CAAC/E,KAAqB,EAA6C;EACvF,OAAOmD,KAAK,CAACC,OAAO,CAACpD,KAAK,CAAC,IAAIA,KAAK,CAACgF,KAAK,CAAE1B,IAAI,IAAK,OAAOA,IAAI,KAAK,QAAQ,IAAI,OAAOA,IAAI,KAAK,SAAS,CAAC;AAC7G;AAEA,SAASP,YAAYA,CAAC/C,KAAa,EAAU;AAC3C,EAAA,MAAMiF,OAAO,GAAGjF,KAAK,CAACkF,SAAS,EAAE;AACjC,EAAA,IAAID,OAAO,CAACE,UAAU,CAAC,GAAG,CAAC,IAAIF,OAAO,CAACE,UAAU,CAAC,GAAG,CAAC,EAAE;AACtD,IAAA,MAAMP,QAAQ,GAAGQ,UAAU,CAACpF,KAAK,CAAC;IAClC,IAAI4E,QAAQ,KAAK1D,SAAS,EAAE;AAC1B,MAAA,OAAO0D,QAAQ;AACjB,IAAA;AACF,EAAA;AACA,EAAA,OAAOX,QAAQ,CAACtB,MAAM,CAAC3C,KAAK,CAAC;AAC/B;AAEA,SAASoF,UAAUA,CAACpF,KAAa,EAAsB;AACrD,EAAA,IAAIqF,MAAe;EACnB,IAAI;AACFA,IAAAA,MAAM,GAAGC,IAAI,CAACC,KAAK,CAACvF,KAAK,CAAC;AAC5B,EAAA,CAAC,CAAC,MAAM;AACN,IAAA,OAAOkB,SAAS;AAClB,EAAA;EACA,IAAImE,MAAM,KAAK,IAAI,IAAI,OAAOA,MAAM,KAAK,QAAQ,EAAE;AACjD,IAAA,OAAOnE,SAAS;AAClB,EAAA;AACA,EAAA,MAAMsE,WAAW,GAAGF,IAAI,CAACG,SAAS,CAACxB,QAAQ,CAACtB,MAAM,CAAC0C,MAAM,CAAC,CAAC;AAC3D;EACA,OAAOG,WAAW,KAAKF,IAAI,CAACG,SAAS,CAACJ,MAAM,CAAC,GAAGrF,KAAK,GAAGwF,WAAW;AACrE;;ACjGA,MAAME,gBAAgB,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,CAAU;;AAE1E;AACA;AACA;AACA;AACO,SAASC,QAAQA,CAACxB,IAAkB,EAAW;AACpD,EAAA,IAAIuB,gBAAgB,CAACE,IAAI,CAAEC,MAAM,IAAK1B,IAAI,CAAC2B,IAAI,CAACX,UAAU,CAACU,MAAM,CAAC,CAAC,EAAE;AACnE,IAAA,OAAO,IAAI;AACb,EAAA;AACA,EAAA,MAAMzB,UAAU,GAAGD,IAAI,CAACC,UAAU;AAClC,EAAA,IAAIA,UAAU,EAAE;IACd,OAAOV,MAAM,CAACC,IAAI,CAACS,UAAU,CAAC,CAACwB,IAAI,CAAEvE,GAAG,IAAKqE,gBAAgB,CAACE,IAAI,CAAEC,MAAM,IAAKxE,GAAG,CAAC8D,UAAU,CAACU,MAAM,CAAC,CAAC,CAAC;AACzG,EAAA;AACA,EAAA,OAAO,KAAK;AACd;;ACVA,MAAME,mBAAiB,GAAG,0BAA0B;AAEpD,SAASC,cAAcA,CAAChG,KAAe,EAAU;EAC/C,OAAO,OAAOA,KAAK,KAAK,QAAQ,GAAGA,KAAK,CAACiG,IAAI,EAAE,GAAG,EAAE;AACtD;AAEA,SAASC,eAAaA,CAAClG,KAAe,EAAU;AAC9C,EAAA,MAAMmG,eAAe,GAAG,OAAOnG,KAAK,KAAK,QAAQ,GAAGA,KAAK,CAACiG,IAAI,EAAE,GAAG,EAAE;EACrE,OAAOE,eAAe,IAAIJ,mBAAiB;AAC7C;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAUA;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,MAAMK,oBAAoB,SAASC,uCAAiB,CAAC;AAG1DlF,EAAAA,WAAWA,CAACmF,OAAoC,GAAG,EAAE,EAAE;AACrD,IAAA,MAAMC,KAAK,GAAGP,cAAc,CAACM,OAAO,CAACE,YAAY,CAAC,IAAIR,cAAc,CAACM,OAAO,CAACG,MAAM,CAAC;IACpF,MAAMC,QAAQ,GAAG,CAACH,KAAK;AACvB,IAAA,MAAMI,IAAI,GAAGJ,KAAK,GAAG,IAAIK,GAAG,CAACV,eAAa,CAACI,OAAO,CAACK,IAAI,CAAC,CAAC,CAACE,MAAM,GAAGd,mBAAiB;AACpF,IAAA,KAAK,CAAC;MACJe,GAAG,EAAE,CAAA,EAAGH,IAAI,CAAA,aAAA,CAAe;MAC3BI,OAAO,EAAER,KAAK,GACV;QACES,aAAa,EAAE,UAAUT,KAAK,CAAA;AAChC,OAAC,GACD;AACN,KAAC,CAAC;IAEF,IAAI,CAACG,QAAQ,GAAGA,QAAQ;IACxB,IAAI,IAAI,CAACA,QAAQ,EAAE;AACjBO,MAAAA,OAAO,CAACC,IAAI,CAAC,yFAAyF,CAAC;AACzG,IAAA;AACF,EAAA;AAESC,EAAAA,MAAMA,CAACC,KAAqB,EAAEC,cAAiE,EAAQ;IAC9G,IAAI,IAAI,CAACX,QAAQ,EAAE;AACjB;AACA;AACAW,MAAAA,cAAc,CAAC;QAAEC,IAAI,EAAEC,qBAAgB,CAACC;AAAQ,OAAC,CAAC;AAClD,MAAA;AACF,IAAA;AAEA,IAAA,MAAMC,OAAO,GAAGL,KAAK,CAACM,MAAM,CAAC/B,QAAQ,CAAC;AACtC,IAAA,IAAI8B,OAAO,CAACnH,MAAM,KAAK,CAAC,EAAE;AACxB+G,MAAAA,cAAc,CAAC;QAAEC,IAAI,EAAEC,qBAAgB,CAACC;AAAQ,OAAC,CAAC;AAClD,MAAA;AACF,IAAA;IACA,KAAK,CAACL,MAAM,CAACM,OAAO,CAACpE,GAAG,CAACa,UAAU,CAAC,EAAEmD,cAAc,CAAC;AACvD,EAAA;AACF;;ACvGA,MAAMtB,iBAAiB,GAAG,0BAA0B;AAEpD,SAAS4B,eAAeA,CAAC3H,KAAe,EAAU;EAChD,OAAO,OAAOA,KAAK,KAAK,QAAQ,GAAGA,KAAK,CAACiG,IAAI,EAAE,GAAG,EAAE;AACtD;AAEA,SAASC,aAAaA,CAAClG,KAAe,EAAU;AAC9C,EAAA,MAAMmG,eAAe,GAAG,OAAOnG,KAAK,KAAK,QAAQ,GAAGA,KAAK,CAACiG,IAAI,EAAE,GAAG,EAAE;EACrE,OAAOE,eAAe,IAAIJ,iBAAiB;AAC7C;AAmBA,MAAM6B,iBAAiB,CAA0B;AAC/CC,EAAAA,OAAOA,CAACC,KAAW,EAAEC,cAAuB,EAAQ;AAClD,IAAA;AACF,EAAA;EACAC,KAAKA,CAACF,KAAmB,EAAQ;AAC/B,IAAA;AACF,EAAA;AACAG,EAAAA,QAAQA,GAAkB;AACxB,IAAA,OAAOC,OAAO,CAACC,OAAO,EAAE;AAC1B,EAAA;AACAC,EAAAA,UAAUA,GAAkB;AAC1B,IAAA,OAAOF,OAAO,CAACC,OAAO,EAAE;AAC1B,EAAA;AACF;;AAEA;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,MAAME,oBAAoB,CAA0B;AAGzDlH,EAAAA,WAAWA,CAACmF,OAAoC,GAAG,EAAE,EAAE;AACrD,IAAA,MAAMG,MAAM,GAAGkB,eAAe,CAACrB,OAAO,CAACG,MAAM,CAAC;IAC9C,IAAI,CAACA,MAAM,EAAE;AACXQ,MAAAA,OAAO,CAACC,IAAI,CAAC,oFAAoF,CAAC;AAClG,MAAA,IAAI,CAACoB,KAAK,GAAG,IAAIV,iBAAiB,EAAE;AACpC,MAAA;AACF,IAAA;IAEA,IAAItB,OAAO,CAACiC,cAAc,EAAE;AAC1B,MAAA,IAAI,CAACD,KAAK,GAAGhC,OAAO,CAACiC,cAAc;AACrC,IAAA,CAAC,MAAM;AACL,MAAA,MAAM5B,IAAI,GAAG,IAAIC,GAAG,CAACV,aAAa,CAACI,OAAO,CAACK,IAAI,CAAC,CAAC,CAACE,MAAM;AACxD,MAAA,MAAM2B,QAAQ,GAAG,IAAInC,uCAAiB,CAAC;QACrCS,GAAG,EAAE,CAAA,EAAGH,IAAI,CAAA,aAAA,CAAe;AAC3BI,QAAAA,OAAO,EAAE;UACPC,aAAa,EAAE,UAAUP,MAAM,CAAA;AACjC;AACF,OAAC,CAAC;AACF,MAAA,IAAI,CAAC6B,KAAK,GAAG,IAAIG,+BAAkB,CAACD,QAAQ,CAAC;AAC/C,IAAA;AACF,EAAA;AAEAX,EAAAA,OAAOA,CAAC1D,IAAU,EAAEuE,aAAsB,EAAQ;AAChD;AACA;AACA;IACA,IAAI,CAACJ,KAAK,CAACT,OAAO,CAAC1D,IAAI,EAAEuE,aAAa,CAAC;AACzC,EAAA;EAEAV,KAAKA,CAAC7D,IAAkB,EAAQ;AAC9B,IAAA,IAAIwB,QAAQ,CAACxB,IAAI,CAAC,EAAE;MAClB,IAAI,CAACmE,KAAK,CAACN,KAAK,CAAC9D,UAAU,CAACC,IAAI,CAAC,CAAC;AACpC,IAAA;AACF,EAAA;AAEA8D,EAAAA,QAAQA,GAAkB;AACxB,IAAA,OAAO,IAAI,CAACK,KAAK,CAACL,QAAQ,EAAE;AAC9B,EAAA;AAEAG,EAAAA,UAAUA,GAAkB;AAC1B,IAAA,OAAO,IAAI,CAACE,KAAK,CAACF,UAAU,EAAE;AAChC,EAAA;AACF;;;;;"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../src/sanitization/base64_recognizer.ts","../../src/sanitization/media_type_context.ts","../../src/sanitization/binary_content_redactor.ts","../../src/otel/redact.ts","../../src/otel/spans.ts","../../src/otel/exporter.ts","../../src/otel/processor.ts"],"sourcesContent":["const DATA_URL_PREFIX_RE = /^data:([^;,\\s]+)(?:;[^;,\\s]+)*;base64,/i\nconst BASE64_ALPHABET_RE = /^[A-Za-z0-9+/_=-]+$/\n\nexport type Base64Recognition = { kind: 'data-url'; mediaType: string } | { kind: 'raw' } | { kind: 'none' }\n\nexport class Base64Recognizer {\n recognize(value: string, minLength: number): Base64Recognition {\n const dataUrl = DATA_URL_PREFIX_RE.exec(value)\n if (dataUrl) return { kind: 'data-url', mediaType: dataUrl[1] }\n\n if (value.length < minLength) return { kind: 'none' }\n\n const confidencePrefix = value.slice(0, minLength)\n if (BASE64_ALPHABET_RE.test(confidencePrefix)) {\n return { kind: 'raw' }\n } else {\n return { kind: 'none' }\n }\n }\n}\n","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 { Base64Recognizer } from './base64_recognizer'\nimport { MediaTypeContext } from './media_type_context'\n\nconst STRONG_CONTEXT_MIN_LENGTH = 64\nconst WEAK_CONTEXT_MIN_LENGTH = 1024\n\nexport class BinaryContentRedactor {\n private visited: WeakSet<object> = new WeakSet()\n\n constructor(private readonly recognizer: Base64Recognizer = new Base64Recognizer()) {}\n\n redact<T>(value: T): T\n redact(value: unknown): unknown {\n if (this.isMultimodalEnabled()) return value\n this.visited = new WeakSet()\n return this.walk(value, MediaTypeContext.EMPTY)\n }\n\n private walk(value: unknown, ctx: MediaTypeContext): unknown {\n if (value === null || value === undefined) return value\n if (typeof value === 'string') return this.redactString(value, ctx)\n if (typeof value !== 'object') return value\n\n // Buffer extends Uint8Array, so this branch catches both.\n if (typeof Uint8Array !== 'undefined' && value instanceof Uint8Array) {\n return this.placeholderFor(ctx.inferMediaType())\n }\n\n if (this.visited.has(value)) return null\n this.visited.add(value)\n\n if (Array.isArray(value)) {\n return value.map((item) => this.walk(item, ctx))\n }\n\n const obj = value as Record<string, unknown>\n const out: Record<string, unknown> = {}\n for (const k of Object.keys(obj)) {\n out[k] = this.walk(obj[k], new MediaTypeContext(obj, k))\n }\n return out\n }\n\n private redactString(value: string, ctx: MediaTypeContext): string {\n const minLength = ctx.signalsBinary() ? STRONG_CONTEXT_MIN_LENGTH : WEAK_CONTEXT_MIN_LENGTH\n const recognition = this.recognizer.recognize(value, minLength)\n switch (recognition.kind) {\n case 'data-url':\n return this.placeholderFor(recognition.mediaType)\n case 'raw':\n return this.placeholderFor(ctx.inferMediaType())\n case 'none':\n return value\n }\n }\n\n private placeholderFor(mediaType?: string): string {\n if (!mediaType) return '[base64 redacted]'\n if (mediaType === 'application/octet-stream') return '[base64 file redacted]'\n return `[base64 ${mediaType} redacted]`\n }\n\n private isMultimodalEnabled(): boolean {\n const val = process.env._INTERNAL_LLMA_MULTIMODAL || ''\n return val.toLowerCase() === 'true' || val === '1' || val.toLowerCase() === 'yes'\n }\n}\n","import type { Attributes, AttributeValue } from '@opentelemetry/api'\nimport type { ReadableSpan, TimedEvent } from '@opentelemetry/sdk-trace-base'\n\nimport { BinaryContentRedactor } from '../sanitization/binary_content_redactor'\n\nconst redactor = new BinaryContentRedactor()\n\nexport function redactSpan(span: ReadableSpan): ReadableSpan {\n const attributes = span.attributes ? redactAttributes(span.attributes) : span.attributes\n const events = span.events ? redactEvents(span.events) : span.events\n if (attributes === span.attributes && events === span.events) {\n return span\n }\n // Copy rather than mutate: the span is shared across every registered processor/exporter.\n return Object.create(span, {\n attributes: { value: attributes, enumerable: true, configurable: true },\n events: { value: events, enumerable: true, configurable: true },\n })\n}\n\nfunction redactAttributes(attributes: Attributes): Attributes {\n let changed = false\n const out: Attributes = {}\n for (const key of Object.keys(attributes)) {\n const value = attributes[key]\n const redacted = value === undefined ? value : redactAttributeValue(value)\n if (redacted !== value) {\n changed = true\n }\n out[key] = redacted\n }\n return changed ? out : attributes\n}\n\nfunction redactEvents(events: TimedEvent[]): TimedEvent[] {\n let changed = false\n const out = events.map((event) => {\n if (!event.attributes) {\n return event\n }\n const attributes = redactAttributes(event.attributes)\n if (attributes === event.attributes) {\n return event\n }\n changed = true\n return { ...event, attributes }\n })\n return changed ? out : events\n}\n\nfunction redactAttributeValue(value: AttributeValue): AttributeValue {\n if (typeof value === 'string') {\n return redactString(value)\n }\n if (isStringArray(value)) {\n let changed = false\n const out = value.map((item) => {\n if (typeof item !== 'string') {\n return item\n }\n const redacted = redactString(item)\n if (redacted !== item) {\n changed = true\n }\n return redacted\n })\n return changed ? out : value\n }\n return value\n}\n\nfunction isStringArray(value: AttributeValue): value is Array<string | null | undefined> {\n return Array.isArray(value) && value.every((item) => typeof item !== 'number' && typeof item !== 'boolean')\n}\n\nfunction redactString(value: string): string {\n const trimmed = value.trimStart()\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n const redacted = redactJson(value)\n if (redacted !== undefined) {\n return redacted\n }\n }\n return redactor.redact(value)\n}\n\nfunction redactJson(value: string): string | undefined {\n let parsed: unknown\n try {\n parsed = JSON.parse(value)\n } catch {\n return undefined\n }\n if (parsed === null || typeof parsed !== 'object') {\n return undefined\n }\n const redactedStr = JSON.stringify(redactor.redact(parsed))\n // Preserve the original string (and its formatting) when nothing was redacted.\n return redactedStr === JSON.stringify(parsed) ? value : redactedStr\n}\n","import type { ReadableSpan } from '@opentelemetry/sdk-trace-base'\n\nconst AI_SPAN_PREFIXES = ['gen_ai.', 'llm.', 'ai.', 'traceloop.'] as const\n\n/**\n * Returns `true` when the span is AI-related — its name or any attribute\n * key starts with `gen_ai.`, `llm.`, `ai.`, or `traceloop.`.\n */\nexport function isAISpan(span: ReadableSpan): boolean {\n if (AI_SPAN_PREFIXES.some((prefix) => span.name.startsWith(prefix))) {\n return true\n }\n const attributes = span.attributes\n if (attributes) {\n return Object.keys(attributes).some((key) => AI_SPAN_PREFIXES.some((prefix) => key.startsWith(prefix)))\n }\n return false\n}\n","import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'\nimport type { ReadableSpan } from '@opentelemetry/sdk-trace-base'\nimport { ExportResultCode } from '@opentelemetry/core'\n\nimport { redactSpan } from './redact'\nimport { isAISpan } from './spans'\n\nconst DEFAULT_OTEL_HOST = 'https://us.i.posthog.com'\n\nfunction normalizeToken(value?: unknown): string {\n return typeof value === 'string' ? value.trim() : ''\n}\n\nfunction normalizeHost(value?: unknown): string {\n const normalizedValue = typeof value === 'string' ? value.trim() : ''\n return normalizedValue || DEFAULT_OTEL_HOST\n}\n\n/**\n * Options for the PostHogTraceExporter. `projectToken` is required; a blank token disables the\n * exporter as a defensive no-op. You can also optionally override the `host` URL. `host` defaults to `https://us.i.posthog.com`.\n *\n * @example\n * ```ts\n * import { PostHogTraceExporter } from '@posthog/ai/otel'\n *\n * new PostHogTraceExporter({ projectToken: 'phc_...' })\n * ```\n *\n * @example\n * ```ts\n * import { PostHogTraceExporter } from '@posthog/ai/otel'\n *\n * new PostHogTraceExporter({ projectToken: 'phc_...', host: 'https://eu.i.posthog.com' })\n * ```\n */\nexport type PostHogTraceExporterOptions = { projectToken: string; host?: string }\n\n/**\n * An OpenTelemetry `TraceExporter` that sends AI traces to PostHog's OTLP\n * ingestion endpoint. PostHog converts `gen_ai.*` spans into\n * `$ai_generation` events server-side.\n *\n * Only AI-related spans (those whose name or attribute keys start with\n * `gen_ai.`, `llm.`, `ai.`, or `traceloop.`) are exported; all other\n * spans are silently dropped.\n *\n * Use this when the API you're integrating with only accepts a\n * `TraceExporter` (e.g. Vercel's `registerOTel`) or when you need to\n * plug PostHog into an existing processor chain. Otherwise prefer\n * {@link PostHogSpanProcessor}, which is self-contained.\n *\n * `projectToken` is required; a blank token disables the exporter as a defensive no-op.\n * You can also optionally override the `host` URL.\n *\n * @example\n * ```ts\n * import { PostHogTraceExporter } from '@posthog/ai/otel'\n * import { registerOTel } from '@vercel/otel'\n *\n * registerOTel({\n * serviceName: 'my-app',\n * traceExporter: new PostHogTraceExporter({ projectToken: 'phc_...' }),\n * })\n * ```\n */\nexport class PostHogTraceExporter extends OTLPTraceExporter {\n private readonly disabled: boolean\n\n constructor(options: PostHogTraceExporterOptions) {\n const token = normalizeToken(options.projectToken)\n const disabled = !token\n const host = token ? new URL(normalizeHost(options.host)).origin : DEFAULT_OTEL_HOST\n super({\n url: `${host}/i/v0/ai/otel`,\n headers: token\n ? {\n Authorization: `Bearer ${token}`,\n }\n : {},\n })\n\n this.disabled = disabled\n if (this.disabled) {\n console.warn('[PostHogTraceExporter] projectToken is missing or blank; the exporter will be disabled.')\n }\n }\n\n override export(spans: ReadableSpan[], resultCallback: (result: { code: number; error?: Error }) => void): void {\n if (this.disabled) {\n // Intentionally report success: missing or blank tokens disable exporting as a compatibility no-op.\n // Reporting failure would make OpenTelemetry treat every span as an export error.\n resultCallback({ code: ExportResultCode.SUCCESS })\n return\n }\n\n const aiSpans = spans.filter(isAISpan)\n if (aiSpans.length === 0) {\n resultCallback({ code: ExportResultCode.SUCCESS })\n return\n }\n super.export(aiSpans.map(redactSpan), resultCallback)\n }\n}\n","import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'\nimport type { Context } from '@opentelemetry/api'\nimport { BatchSpanProcessor, type SpanProcessor, type ReadableSpan, type Span } from '@opentelemetry/sdk-trace-base'\n\nimport { redactSpan } from './redact'\nimport { isAISpan } from './spans'\n\nconst DEFAULT_OTEL_HOST = 'https://us.i.posthog.com'\n\nfunction normalizeToken(value?: unknown): string {\n return typeof value === 'string' ? value.trim() : ''\n}\n\nfunction normalizeHost(value?: unknown): string {\n const normalizedValue = typeof value === 'string' ? value.trim() : ''\n return normalizedValue || DEFAULT_OTEL_HOST\n}\n\nexport interface PostHogSpanProcessorOptions {\n /**\n * Your PostHog project token (the `phc_...` key). Required; a blank token disables the\n * processor as a defensive no-op.\n */\n projectToken: string\n\n /**\n * PostHog host URL. Defaults to `https://us.i.posthog.com`.\n */\n host?: string\n\n /**\n * @internal Injected processor for testing — bypasses exporter creation.\n */\n _spanProcessor?: SpanProcessor\n}\n\nclass NoopSpanProcessor implements SpanProcessor {\n onStart(_span: Span, _parentContext: Context): void {\n return\n }\n onEnd(_span: ReadableSpan): void {\n return\n }\n shutdown(): Promise<void> {\n return Promise.resolve()\n }\n forceFlush(): Promise<void> {\n return Promise.resolve()\n }\n}\n\n/**\n * An OpenTelemetry `SpanProcessor` that sends AI traces to PostHog.\n *\n * `projectToken` is required; a blank token disables the processor as a defensive no-op.\n *\n * Internally batches spans and exports them to PostHog's OTLP ingestion\n * endpoint. Only AI-related spans (those whose name or attribute keys\n * start with `gen_ai.`, `llm.`, `ai.`, or `traceloop.`) are exported;\n * all other spans are silently dropped.\n *\n * This is the recommended integration point when your setup accepts a\n * `SpanProcessor`. If you need a `TraceExporter` instead (e.g. for\n * Vercel's `registerOTel`), use {@link PostHogTraceExporter}.\n *\n * @example\n * ```ts\n * import { PostHogSpanProcessor } from '@posthog/ai/otel'\n * import { NodeSDK } from '@opentelemetry/sdk-node'\n *\n * const sdk = new NodeSDK({\n * spanProcessors: [new PostHogSpanProcessor({ projectToken: 'phc_...' })],\n * })\n * sdk.start()\n * ```\n */\nexport class PostHogSpanProcessor implements SpanProcessor {\n private readonly inner: SpanProcessor\n\n constructor(options: PostHogSpanProcessorOptions) {\n const token = normalizeToken(options.projectToken)\n if (!token) {\n console.warn('[PostHogSpanProcessor] projectToken is missing or blank; the processor will be disabled.')\n this.inner = new NoopSpanProcessor()\n return\n }\n\n if (options._spanProcessor) {\n this.inner = options._spanProcessor\n } else {\n const host = new URL(normalizeHost(options.host)).origin\n const exporter = new OTLPTraceExporter({\n url: `${host}/i/v0/ai/otel`,\n headers: {\n Authorization: `Bearer ${token}`,\n },\n })\n this.inner = new BatchSpanProcessor(exporter)\n }\n }\n\n onStart(span: Span, parentContext: Context): void {\n // Forwarded unconditionally — filtering happens in onEnd. We can't filter\n // here because the span hasn't finished yet and may not have AI attributes\n // set. BatchSpanProcessor.onStart is a no-op so this is safe.\n this.inner.onStart(span, parentContext)\n }\n\n onEnd(span: ReadableSpan): void {\n if (isAISpan(span)) {\n this.inner.onEnd(redactSpan(span))\n }\n }\n\n shutdown(): Promise<void> {\n return this.inner.shutdown()\n }\n\n forceFlush(): Promise<void> {\n return this.inner.forceFlush()\n }\n}\n"],"names":["DATA_URL_PREFIX_RE","BASE64_ALPHABET_RE","Base64Recognizer","recognize","value","minLength","dataUrl","exec","kind","mediaType","length","confidencePrefix","slice","test","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","STRONG_CONTEXT_MIN_LENGTH","WEAK_CONTEXT_MIN_LENGTH","BinaryContentRedactor","visited","WeakSet","recognizer","redact","isMultimodalEnabled","walk","ctx","redactString","Uint8Array","placeholderFor","add","Array","isArray","map","item","obj","out","k","Object","keys","recognition","val","process","env","_INTERNAL_LLMA_MULTIMODAL","redactor","redactSpan","span","attributes","redactAttributes","events","redactEvents","create","enumerable","configurable","changed","redacted","redactAttributeValue","event","isStringArray","every","trimmed","trimStart","startsWith","redactJson","parsed","JSON","parse","redactedStr","stringify","AI_SPAN_PREFIXES","isAISpan","some","prefix","name","DEFAULT_OTEL_HOST","normalizeToken","trim","normalizeHost","normalizedValue","PostHogTraceExporter","OTLPTraceExporter","options","token","projectToken","disabled","host","URL","origin","url","headers","Authorization","console","warn","export","spans","resultCallback","code","ExportResultCode","SUCCESS","aiSpans","filter","NoopSpanProcessor","onStart","_span","_parentContext","onEnd","shutdown","Promise","resolve","forceFlush","PostHogSpanProcessor","inner","_spanProcessor","exporter","BatchSpanProcessor","parentContext"],"mappings":"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"}
|
package/dist/otel/index.d.ts
CHANGED
|
@@ -3,8 +3,8 @@ import { ReadableSpan, SpanProcessor, Span } from '@opentelemetry/sdk-trace-base
|
|
|
3
3
|
import { Context } from '@opentelemetry/api';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
|
-
* Options for the PostHogTraceExporter.
|
|
7
|
-
*
|
|
6
|
+
* Options for the PostHogTraceExporter. `projectToken` is required; a blank token disables the
|
|
7
|
+
* exporter as a defensive no-op. You can also optionally override the `host` URL. `host` defaults to `https://us.i.posthog.com`.
|
|
8
8
|
*
|
|
9
9
|
* @example
|
|
10
10
|
* ```ts
|
|
@@ -21,13 +21,7 @@ import { Context } from '@opentelemetry/api';
|
|
|
21
21
|
* ```
|
|
22
22
|
*/
|
|
23
23
|
type PostHogTraceExporterOptions = {
|
|
24
|
-
projectToken
|
|
25
|
-
apiKey?: never;
|
|
26
|
-
host?: string;
|
|
27
|
-
} | {
|
|
28
|
-
/** @deprecated Use `projectToken` instead */
|
|
29
|
-
apiKey?: string;
|
|
30
|
-
projectToken?: never;
|
|
24
|
+
projectToken: string;
|
|
31
25
|
host?: string;
|
|
32
26
|
};
|
|
33
27
|
/**
|
|
@@ -44,7 +38,7 @@ type PostHogTraceExporterOptions = {
|
|
|
44
38
|
* plug PostHog into an existing processor chain. Otherwise prefer
|
|
45
39
|
* {@link PostHogSpanProcessor}, which is self-contained.
|
|
46
40
|
*
|
|
47
|
-
*
|
|
41
|
+
* `projectToken` is required; a blank token disables the exporter as a defensive no-op.
|
|
48
42
|
* You can also optionally override the `host` URL.
|
|
49
43
|
*
|
|
50
44
|
* @example
|
|
@@ -60,7 +54,7 @@ type PostHogTraceExporterOptions = {
|
|
|
60
54
|
*/
|
|
61
55
|
declare class PostHogTraceExporter extends OTLPTraceExporter {
|
|
62
56
|
private readonly disabled;
|
|
63
|
-
constructor(options
|
|
57
|
+
constructor(options: PostHogTraceExporterOptions);
|
|
64
58
|
export(spans: ReadableSpan[], resultCallback: (result: {
|
|
65
59
|
code: number;
|
|
66
60
|
error?: Error;
|
|
@@ -69,9 +63,10 @@ declare class PostHogTraceExporter extends OTLPTraceExporter {
|
|
|
69
63
|
|
|
70
64
|
interface PostHogSpanProcessorOptions {
|
|
71
65
|
/**
|
|
72
|
-
* Your PostHog project
|
|
66
|
+
* Your PostHog project token (the `phc_...` key). Required; a blank token disables the
|
|
67
|
+
* processor as a defensive no-op.
|
|
73
68
|
*/
|
|
74
|
-
|
|
69
|
+
projectToken: string;
|
|
75
70
|
/**
|
|
76
71
|
* PostHog host URL. Defaults to `https://us.i.posthog.com`.
|
|
77
72
|
*/
|
|
@@ -84,7 +79,7 @@ interface PostHogSpanProcessorOptions {
|
|
|
84
79
|
/**
|
|
85
80
|
* An OpenTelemetry `SpanProcessor` that sends AI traces to PostHog.
|
|
86
81
|
*
|
|
87
|
-
*
|
|
82
|
+
* `projectToken` is required; a blank token disables the processor as a defensive no-op.
|
|
88
83
|
*
|
|
89
84
|
* Internally batches spans and exports them to PostHog's OTLP ingestion
|
|
90
85
|
* endpoint. Only AI-related spans (those whose name or attribute keys
|
|
@@ -101,14 +96,14 @@ interface PostHogSpanProcessorOptions {
|
|
|
101
96
|
* import { NodeSDK } from '@opentelemetry/sdk-node'
|
|
102
97
|
*
|
|
103
98
|
* const sdk = new NodeSDK({
|
|
104
|
-
* spanProcessors: [new PostHogSpanProcessor({
|
|
99
|
+
* spanProcessors: [new PostHogSpanProcessor({ projectToken: 'phc_...' })],
|
|
105
100
|
* })
|
|
106
101
|
* sdk.start()
|
|
107
102
|
* ```
|
|
108
103
|
*/
|
|
109
104
|
declare class PostHogSpanProcessor implements SpanProcessor {
|
|
110
105
|
private readonly inner;
|
|
111
|
-
constructor(options
|
|
106
|
+
constructor(options: PostHogSpanProcessorOptions);
|
|
112
107
|
onStart(span: Span, parentContext: Context): void;
|
|
113
108
|
onEnd(span: ReadableSpan): void;
|
|
114
109
|
shutdown(): Promise<void>;
|
package/dist/otel/index.mjs
CHANGED
|
@@ -265,7 +265,7 @@ function isAISpan(span) {
|
|
|
265
265
|
}
|
|
266
266
|
|
|
267
267
|
const DEFAULT_OTEL_HOST$1 = 'https://us.i.posthog.com';
|
|
268
|
-
function normalizeToken(value) {
|
|
268
|
+
function normalizeToken$1(value) {
|
|
269
269
|
return typeof value === 'string' ? value.trim() : '';
|
|
270
270
|
}
|
|
271
271
|
function normalizeHost$1(value) {
|
|
@@ -274,8 +274,8 @@ function normalizeHost$1(value) {
|
|
|
274
274
|
}
|
|
275
275
|
|
|
276
276
|
/**
|
|
277
|
-
* Options for the PostHogTraceExporter.
|
|
278
|
-
*
|
|
277
|
+
* Options for the PostHogTraceExporter. `projectToken` is required; a blank token disables the
|
|
278
|
+
* exporter as a defensive no-op. You can also optionally override the `host` URL. `host` defaults to `https://us.i.posthog.com`.
|
|
279
279
|
*
|
|
280
280
|
* @example
|
|
281
281
|
* ```ts
|
|
@@ -306,7 +306,7 @@ function normalizeHost$1(value) {
|
|
|
306
306
|
* plug PostHog into an existing processor chain. Otherwise prefer
|
|
307
307
|
* {@link PostHogSpanProcessor}, which is self-contained.
|
|
308
308
|
*
|
|
309
|
-
*
|
|
309
|
+
* `projectToken` is required; a blank token disables the exporter as a defensive no-op.
|
|
310
310
|
* You can also optionally override the `host` URL.
|
|
311
311
|
*
|
|
312
312
|
* @example
|
|
@@ -321,8 +321,8 @@ function normalizeHost$1(value) {
|
|
|
321
321
|
* ```
|
|
322
322
|
*/
|
|
323
323
|
class PostHogTraceExporter extends OTLPTraceExporter {
|
|
324
|
-
constructor(options
|
|
325
|
-
const token = normalizeToken(options.projectToken)
|
|
324
|
+
constructor(options) {
|
|
325
|
+
const token = normalizeToken$1(options.projectToken);
|
|
326
326
|
const disabled = !token;
|
|
327
327
|
const host = token ? new URL(normalizeHost$1(options.host)).origin : DEFAULT_OTEL_HOST$1;
|
|
328
328
|
super({
|
|
@@ -357,7 +357,7 @@ class PostHogTraceExporter extends OTLPTraceExporter {
|
|
|
357
357
|
}
|
|
358
358
|
|
|
359
359
|
const DEFAULT_OTEL_HOST = 'https://us.i.posthog.com';
|
|
360
|
-
function
|
|
360
|
+
function normalizeToken(value) {
|
|
361
361
|
return typeof value === 'string' ? value.trim() : '';
|
|
362
362
|
}
|
|
363
363
|
function normalizeHost(value) {
|
|
@@ -382,7 +382,7 @@ class NoopSpanProcessor {
|
|
|
382
382
|
/**
|
|
383
383
|
* An OpenTelemetry `SpanProcessor` that sends AI traces to PostHog.
|
|
384
384
|
*
|
|
385
|
-
*
|
|
385
|
+
* `projectToken` is required; a blank token disables the processor as a defensive no-op.
|
|
386
386
|
*
|
|
387
387
|
* Internally batches spans and exports them to PostHog's OTLP ingestion
|
|
388
388
|
* endpoint. Only AI-related spans (those whose name or attribute keys
|
|
@@ -399,16 +399,16 @@ class NoopSpanProcessor {
|
|
|
399
399
|
* import { NodeSDK } from '@opentelemetry/sdk-node'
|
|
400
400
|
*
|
|
401
401
|
* const sdk = new NodeSDK({
|
|
402
|
-
* spanProcessors: [new PostHogSpanProcessor({
|
|
402
|
+
* spanProcessors: [new PostHogSpanProcessor({ projectToken: 'phc_...' })],
|
|
403
403
|
* })
|
|
404
404
|
* sdk.start()
|
|
405
405
|
* ```
|
|
406
406
|
*/
|
|
407
407
|
class PostHogSpanProcessor {
|
|
408
|
-
constructor(options
|
|
409
|
-
const
|
|
410
|
-
if (!
|
|
411
|
-
console.warn('[PostHogSpanProcessor]
|
|
408
|
+
constructor(options) {
|
|
409
|
+
const token = normalizeToken(options.projectToken);
|
|
410
|
+
if (!token) {
|
|
411
|
+
console.warn('[PostHogSpanProcessor] projectToken is missing or blank; the processor will be disabled.');
|
|
412
412
|
this.inner = new NoopSpanProcessor();
|
|
413
413
|
return;
|
|
414
414
|
}
|
|
@@ -419,7 +419,7 @@ class PostHogSpanProcessor {
|
|
|
419
419
|
const exporter = new OTLPTraceExporter({
|
|
420
420
|
url: `${host}/i/v0/ai/otel`,
|
|
421
421
|
headers: {
|
|
422
|
-
Authorization: `Bearer ${
|
|
422
|
+
Authorization: `Bearer ${token}`
|
|
423
423
|
}
|
|
424
424
|
});
|
|
425
425
|
this.inner = new BatchSpanProcessor(exporter);
|
package/dist/otel/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../src/sanitization/base64_recognizer.ts","../../src/sanitization/media_type_context.ts","../../src/sanitization/binary_content_redactor.ts","../../src/otel/redact.ts","../../src/otel/spans.ts","../../src/otel/exporter.ts","../../src/otel/processor.ts"],"sourcesContent":["const DATA_URL_PREFIX_RE = /^data:([^;,\\s]+)(?:;[^;,\\s]+)*;base64,/i\nconst BASE64_ALPHABET_RE = /^[A-Za-z0-9+/_=-]+$/\n\nexport type Base64Recognition = { kind: 'data-url'; mediaType: string } | { kind: 'raw' } | { kind: 'none' }\n\nexport class Base64Recognizer {\n recognize(value: string, minLength: number): Base64Recognition {\n const dataUrl = DATA_URL_PREFIX_RE.exec(value)\n if (dataUrl) return { kind: 'data-url', mediaType: dataUrl[1] }\n\n if (value.length < minLength) return { kind: 'none' }\n\n const confidencePrefix = value.slice(0, minLength)\n if (BASE64_ALPHABET_RE.test(confidencePrefix)) {\n return { kind: 'raw' }\n } else {\n return { kind: 'none' }\n }\n }\n}\n","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 { Base64Recognizer } from './base64_recognizer'\nimport { MediaTypeContext } from './media_type_context'\n\nconst STRONG_CONTEXT_MIN_LENGTH = 64\nconst WEAK_CONTEXT_MIN_LENGTH = 1024\n\nexport class BinaryContentRedactor {\n private visited: WeakSet<object> = new WeakSet()\n\n constructor(private readonly recognizer: Base64Recognizer = new Base64Recognizer()) {}\n\n redact<T>(value: T): T\n redact(value: unknown): unknown {\n if (this.isMultimodalEnabled()) return value\n this.visited = new WeakSet()\n return this.walk(value, MediaTypeContext.EMPTY)\n }\n\n private walk(value: unknown, ctx: MediaTypeContext): unknown {\n if (value === null || value === undefined) return value\n if (typeof value === 'string') return this.redactString(value, ctx)\n if (typeof value !== 'object') return value\n\n // Buffer extends Uint8Array, so this branch catches both.\n if (typeof Uint8Array !== 'undefined' && value instanceof Uint8Array) {\n return this.placeholderFor(ctx.inferMediaType())\n }\n\n if (this.visited.has(value)) return null\n this.visited.add(value)\n\n if (Array.isArray(value)) {\n return value.map((item) => this.walk(item, ctx))\n }\n\n const obj = value as Record<string, unknown>\n const out: Record<string, unknown> = {}\n for (const k of Object.keys(obj)) {\n out[k] = this.walk(obj[k], new MediaTypeContext(obj, k))\n }\n return out\n }\n\n private redactString(value: string, ctx: MediaTypeContext): string {\n const minLength = ctx.signalsBinary() ? STRONG_CONTEXT_MIN_LENGTH : WEAK_CONTEXT_MIN_LENGTH\n const recognition = this.recognizer.recognize(value, minLength)\n switch (recognition.kind) {\n case 'data-url':\n return this.placeholderFor(recognition.mediaType)\n case 'raw':\n return this.placeholderFor(ctx.inferMediaType())\n case 'none':\n return value\n }\n }\n\n private placeholderFor(mediaType?: string): string {\n if (!mediaType) return '[base64 redacted]'\n if (mediaType === 'application/octet-stream') return '[base64 file redacted]'\n return `[base64 ${mediaType} redacted]`\n }\n\n private isMultimodalEnabled(): boolean {\n const val = process.env._INTERNAL_LLMA_MULTIMODAL || ''\n return val.toLowerCase() === 'true' || val === '1' || val.toLowerCase() === 'yes'\n }\n}\n","import type { Attributes, AttributeValue } from '@opentelemetry/api'\nimport type { ReadableSpan, TimedEvent } from '@opentelemetry/sdk-trace-base'\n\nimport { BinaryContentRedactor } from '../sanitization/binary_content_redactor'\n\nconst redactor = new BinaryContentRedactor()\n\nexport function redactSpan(span: ReadableSpan): ReadableSpan {\n const attributes = span.attributes ? redactAttributes(span.attributes) : span.attributes\n const events = span.events ? redactEvents(span.events) : span.events\n if (attributes === span.attributes && events === span.events) {\n return span\n }\n // Copy rather than mutate: the span is shared across every registered processor/exporter.\n return Object.create(span, {\n attributes: { value: attributes, enumerable: true, configurable: true },\n events: { value: events, enumerable: true, configurable: true },\n })\n}\n\nfunction redactAttributes(attributes: Attributes): Attributes {\n let changed = false\n const out: Attributes = {}\n for (const key of Object.keys(attributes)) {\n const value = attributes[key]\n const redacted = value === undefined ? value : redactAttributeValue(value)\n if (redacted !== value) {\n changed = true\n }\n out[key] = redacted\n }\n return changed ? out : attributes\n}\n\nfunction redactEvents(events: TimedEvent[]): TimedEvent[] {\n let changed = false\n const out = events.map((event) => {\n if (!event.attributes) {\n return event\n }\n const attributes = redactAttributes(event.attributes)\n if (attributes === event.attributes) {\n return event\n }\n changed = true\n return { ...event, attributes }\n })\n return changed ? out : events\n}\n\nfunction redactAttributeValue(value: AttributeValue): AttributeValue {\n if (typeof value === 'string') {\n return redactString(value)\n }\n if (isStringArray(value)) {\n let changed = false\n const out = value.map((item) => {\n if (typeof item !== 'string') {\n return item\n }\n const redacted = redactString(item)\n if (redacted !== item) {\n changed = true\n }\n return redacted\n })\n return changed ? out : value\n }\n return value\n}\n\nfunction isStringArray(value: AttributeValue): value is Array<string | null | undefined> {\n return Array.isArray(value) && value.every((item) => typeof item !== 'number' && typeof item !== 'boolean')\n}\n\nfunction redactString(value: string): string {\n const trimmed = value.trimStart()\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n const redacted = redactJson(value)\n if (redacted !== undefined) {\n return redacted\n }\n }\n return redactor.redact(value)\n}\n\nfunction redactJson(value: string): string | undefined {\n let parsed: unknown\n try {\n parsed = JSON.parse(value)\n } catch {\n return undefined\n }\n if (parsed === null || typeof parsed !== 'object') {\n return undefined\n }\n const redactedStr = JSON.stringify(redactor.redact(parsed))\n // Preserve the original string (and its formatting) when nothing was redacted.\n return redactedStr === JSON.stringify(parsed) ? value : redactedStr\n}\n","import type { ReadableSpan } from '@opentelemetry/sdk-trace-base'\n\nconst AI_SPAN_PREFIXES = ['gen_ai.', 'llm.', 'ai.', 'traceloop.'] as const\n\n/**\n * Returns `true` when the span is AI-related — its name or any attribute\n * key starts with `gen_ai.`, `llm.`, `ai.`, or `traceloop.`.\n */\nexport function isAISpan(span: ReadableSpan): boolean {\n if (AI_SPAN_PREFIXES.some((prefix) => span.name.startsWith(prefix))) {\n return true\n }\n const attributes = span.attributes\n if (attributes) {\n return Object.keys(attributes).some((key) => AI_SPAN_PREFIXES.some((prefix) => key.startsWith(prefix)))\n }\n return false\n}\n","import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'\nimport type { ReadableSpan } from '@opentelemetry/sdk-trace-base'\nimport { ExportResultCode } from '@opentelemetry/core'\n\nimport { redactSpan } from './redact'\nimport { isAISpan } from './spans'\n\nconst DEFAULT_OTEL_HOST = 'https://us.i.posthog.com'\n\nfunction normalizeToken(value?: unknown): string {\n return typeof value === 'string' ? value.trim() : ''\n}\n\nfunction normalizeHost(value?: unknown): string {\n const normalizedValue = typeof value === 'string' ? value.trim() : ''\n return normalizedValue || DEFAULT_OTEL_HOST\n}\n\n/**\n * Options for the PostHogTraceExporter. Provide `projectToken` to enable exporting. Missing or blank\n * tokens disable the exporter. You can also optionally override the `host` URL. `host` defaults to `https://us.i.posthog.com`.\n *\n * @example\n * ```ts\n * import { PostHogTraceExporter } from '@posthog/ai/otel'\n *\n * new PostHogTraceExporter({ projectToken: 'phc_...' })\n * ```\n *\n * @example\n * ```ts\n * import { PostHogTraceExporter } from '@posthog/ai/otel'\n *\n * new PostHogTraceExporter({ projectToken: 'phc_...', host: 'https://eu.i.posthog.com' })\n * ```\n */\nexport type PostHogTraceExporterOptions =\n | { projectToken?: string; apiKey?: never; host?: string }\n | {\n /** @deprecated Use `projectToken` instead */\n apiKey?: string\n projectToken?: never\n host?: string\n }\n\n/**\n * An OpenTelemetry `TraceExporter` that sends AI traces to PostHog's OTLP\n * ingestion endpoint. PostHog converts `gen_ai.*` spans into\n * `$ai_generation` events server-side.\n *\n * Only AI-related spans (those whose name or attribute keys start with\n * `gen_ai.`, `llm.`, `ai.`, or `traceloop.`) are exported; all other\n * spans are silently dropped.\n *\n * Use this when the API you're integrating with only accepts a\n * `TraceExporter` (e.g. Vercel's `registerOTel`) or when you need to\n * plug PostHog into an existing processor chain. Otherwise prefer\n * {@link PostHogSpanProcessor}, which is self-contained.\n *\n * Provide `projectToken` to enable exporting. Missing or blank tokens disable the exporter.\n * You can also optionally override the `host` URL.\n *\n * @example\n * ```ts\n * import { PostHogTraceExporter } from '@posthog/ai/otel'\n * import { registerOTel } from '@vercel/otel'\n *\n * registerOTel({\n * serviceName: 'my-app',\n * traceExporter: new PostHogTraceExporter({ projectToken: 'phc_...' }),\n * })\n * ```\n */\nexport class PostHogTraceExporter extends OTLPTraceExporter {\n private readonly disabled: boolean\n\n constructor(options: PostHogTraceExporterOptions = {}) {\n const token = normalizeToken(options.projectToken) || normalizeToken(options.apiKey)\n const disabled = !token\n const host = token ? new URL(normalizeHost(options.host)).origin : DEFAULT_OTEL_HOST\n super({\n url: `${host}/i/v0/ai/otel`,\n headers: token\n ? {\n Authorization: `Bearer ${token}`,\n }\n : {},\n })\n\n this.disabled = disabled\n if (this.disabled) {\n console.warn('[PostHogTraceExporter] projectToken is missing or blank; the exporter will be disabled.')\n }\n }\n\n override export(spans: ReadableSpan[], resultCallback: (result: { code: number; error?: Error }) => void): void {\n if (this.disabled) {\n // Intentionally report success: missing or blank tokens disable exporting as a compatibility no-op.\n // Reporting failure would make OpenTelemetry treat every span as an export error.\n resultCallback({ code: ExportResultCode.SUCCESS })\n return\n }\n\n const aiSpans = spans.filter(isAISpan)\n if (aiSpans.length === 0) {\n resultCallback({ code: ExportResultCode.SUCCESS })\n return\n }\n super.export(aiSpans.map(redactSpan), resultCallback)\n }\n}\n","import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'\nimport type { Context } from '@opentelemetry/api'\nimport { BatchSpanProcessor, type SpanProcessor, type ReadableSpan, type Span } from '@opentelemetry/sdk-trace-base'\n\nimport { redactSpan } from './redact'\nimport { isAISpan } from './spans'\n\nconst DEFAULT_OTEL_HOST = 'https://us.i.posthog.com'\n\nfunction normalizeApiKey(value?: unknown): string {\n return typeof value === 'string' ? value.trim() : ''\n}\n\nfunction normalizeHost(value?: unknown): string {\n const normalizedValue = typeof value === 'string' ? value.trim() : ''\n return normalizedValue || DEFAULT_OTEL_HOST\n}\n\nexport interface PostHogSpanProcessorOptions {\n /**\n * Your PostHog project API key.\n */\n apiKey?: string\n\n /**\n * PostHog host URL. Defaults to `https://us.i.posthog.com`.\n */\n host?: string\n\n /**\n * @internal Injected processor for testing — bypasses exporter creation.\n */\n _spanProcessor?: SpanProcessor\n}\n\nclass NoopSpanProcessor implements SpanProcessor {\n onStart(_span: Span, _parentContext: Context): void {\n return\n }\n onEnd(_span: ReadableSpan): void {\n return\n }\n shutdown(): Promise<void> {\n return Promise.resolve()\n }\n forceFlush(): Promise<void> {\n return Promise.resolve()\n }\n}\n\n/**\n * An OpenTelemetry `SpanProcessor` that sends AI traces to PostHog.\n *\n * Missing or blank project API keys disable the processor.\n *\n * Internally batches spans and exports them to PostHog's OTLP ingestion\n * endpoint. Only AI-related spans (those whose name or attribute keys\n * start with `gen_ai.`, `llm.`, `ai.`, or `traceloop.`) are exported;\n * all other spans are silently dropped.\n *\n * This is the recommended integration point when your setup accepts a\n * `SpanProcessor`. If you need a `TraceExporter` instead (e.g. for\n * Vercel's `registerOTel`), use {@link PostHogTraceExporter}.\n *\n * @example\n * ```ts\n * import { PostHogSpanProcessor } from '@posthog/ai/otel'\n * import { NodeSDK } from '@opentelemetry/sdk-node'\n *\n * const sdk = new NodeSDK({\n * spanProcessors: [new PostHogSpanProcessor({ apiKey: 'phc_...' })],\n * })\n * sdk.start()\n * ```\n */\nexport class PostHogSpanProcessor implements SpanProcessor {\n private readonly inner: SpanProcessor\n\n constructor(options: PostHogSpanProcessorOptions = {}) {\n const apiKey = normalizeApiKey(options.apiKey)\n if (!apiKey) {\n console.warn('[PostHogSpanProcessor] apiKey is missing or blank; the processor will be disabled.')\n this.inner = new NoopSpanProcessor()\n return\n }\n\n if (options._spanProcessor) {\n this.inner = options._spanProcessor\n } else {\n const host = new URL(normalizeHost(options.host)).origin\n const exporter = new OTLPTraceExporter({\n url: `${host}/i/v0/ai/otel`,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n })\n this.inner = new BatchSpanProcessor(exporter)\n }\n }\n\n onStart(span: Span, parentContext: Context): void {\n // Forwarded unconditionally — filtering happens in onEnd. We can't filter\n // here because the span hasn't finished yet and may not have AI attributes\n // set. BatchSpanProcessor.onStart is a no-op so this is safe.\n this.inner.onStart(span, parentContext)\n }\n\n onEnd(span: ReadableSpan): void {\n if (isAISpan(span)) {\n this.inner.onEnd(redactSpan(span))\n }\n }\n\n shutdown(): Promise<void> {\n return this.inner.shutdown()\n }\n\n forceFlush(): Promise<void> {\n return this.inner.forceFlush()\n }\n}\n"],"names":["DATA_URL_PREFIX_RE","BASE64_ALPHABET_RE","Base64Recognizer","recognize","value","minLength","dataUrl","exec","kind","mediaType","length","confidencePrefix","slice","test","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","STRONG_CONTEXT_MIN_LENGTH","WEAK_CONTEXT_MIN_LENGTH","BinaryContentRedactor","visited","WeakSet","recognizer","redact","isMultimodalEnabled","walk","ctx","redactString","Uint8Array","placeholderFor","add","Array","isArray","map","item","obj","out","k","Object","keys","recognition","val","process","env","_INTERNAL_LLMA_MULTIMODAL","redactor","redactSpan","span","attributes","redactAttributes","events","redactEvents","create","enumerable","configurable","changed","redacted","redactAttributeValue","event","isStringArray","every","trimmed","trimStart","startsWith","redactJson","parsed","JSON","parse","redactedStr","stringify","AI_SPAN_PREFIXES","isAISpan","some","prefix","name","DEFAULT_OTEL_HOST","normalizeToken","trim","normalizeHost","normalizedValue","PostHogTraceExporter","OTLPTraceExporter","options","token","projectToken","apiKey","disabled","host","URL","origin","url","headers","Authorization","console","warn","export","spans","resultCallback","code","ExportResultCode","SUCCESS","aiSpans","filter","normalizeApiKey","NoopSpanProcessor","onStart","_span","_parentContext","onEnd","shutdown","Promise","resolve","forceFlush","PostHogSpanProcessor","inner","_spanProcessor","exporter","BatchSpanProcessor","parentContext"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../src/sanitization/base64_recognizer.ts","../../src/sanitization/media_type_context.ts","../../src/sanitization/binary_content_redactor.ts","../../src/otel/redact.ts","../../src/otel/spans.ts","../../src/otel/exporter.ts","../../src/otel/processor.ts"],"sourcesContent":["const DATA_URL_PREFIX_RE = /^data:([^;,\\s]+)(?:;[^;,\\s]+)*;base64,/i\nconst BASE64_ALPHABET_RE = /^[A-Za-z0-9+/_=-]+$/\n\nexport type Base64Recognition = { kind: 'data-url'; mediaType: string } | { kind: 'raw' } | { kind: 'none' }\n\nexport class Base64Recognizer {\n recognize(value: string, minLength: number): Base64Recognition {\n const dataUrl = DATA_URL_PREFIX_RE.exec(value)\n if (dataUrl) return { kind: 'data-url', mediaType: dataUrl[1] }\n\n if (value.length < minLength) return { kind: 'none' }\n\n const confidencePrefix = value.slice(0, minLength)\n if (BASE64_ALPHABET_RE.test(confidencePrefix)) {\n return { kind: 'raw' }\n } else {\n return { kind: 'none' }\n }\n }\n}\n","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 { Base64Recognizer } from './base64_recognizer'\nimport { MediaTypeContext } from './media_type_context'\n\nconst STRONG_CONTEXT_MIN_LENGTH = 64\nconst WEAK_CONTEXT_MIN_LENGTH = 1024\n\nexport class BinaryContentRedactor {\n private visited: WeakSet<object> = new WeakSet()\n\n constructor(private readonly recognizer: Base64Recognizer = new Base64Recognizer()) {}\n\n redact<T>(value: T): T\n redact(value: unknown): unknown {\n if (this.isMultimodalEnabled()) return value\n this.visited = new WeakSet()\n return this.walk(value, MediaTypeContext.EMPTY)\n }\n\n private walk(value: unknown, ctx: MediaTypeContext): unknown {\n if (value === null || value === undefined) return value\n if (typeof value === 'string') return this.redactString(value, ctx)\n if (typeof value !== 'object') return value\n\n // Buffer extends Uint8Array, so this branch catches both.\n if (typeof Uint8Array !== 'undefined' && value instanceof Uint8Array) {\n return this.placeholderFor(ctx.inferMediaType())\n }\n\n if (this.visited.has(value)) return null\n this.visited.add(value)\n\n if (Array.isArray(value)) {\n return value.map((item) => this.walk(item, ctx))\n }\n\n const obj = value as Record<string, unknown>\n const out: Record<string, unknown> = {}\n for (const k of Object.keys(obj)) {\n out[k] = this.walk(obj[k], new MediaTypeContext(obj, k))\n }\n return out\n }\n\n private redactString(value: string, ctx: MediaTypeContext): string {\n const minLength = ctx.signalsBinary() ? STRONG_CONTEXT_MIN_LENGTH : WEAK_CONTEXT_MIN_LENGTH\n const recognition = this.recognizer.recognize(value, minLength)\n switch (recognition.kind) {\n case 'data-url':\n return this.placeholderFor(recognition.mediaType)\n case 'raw':\n return this.placeholderFor(ctx.inferMediaType())\n case 'none':\n return value\n }\n }\n\n private placeholderFor(mediaType?: string): string {\n if (!mediaType) return '[base64 redacted]'\n if (mediaType === 'application/octet-stream') return '[base64 file redacted]'\n return `[base64 ${mediaType} redacted]`\n }\n\n private isMultimodalEnabled(): boolean {\n const val = process.env._INTERNAL_LLMA_MULTIMODAL || ''\n return val.toLowerCase() === 'true' || val === '1' || val.toLowerCase() === 'yes'\n }\n}\n","import type { Attributes, AttributeValue } from '@opentelemetry/api'\nimport type { ReadableSpan, TimedEvent } from '@opentelemetry/sdk-trace-base'\n\nimport { BinaryContentRedactor } from '../sanitization/binary_content_redactor'\n\nconst redactor = new BinaryContentRedactor()\n\nexport function redactSpan(span: ReadableSpan): ReadableSpan {\n const attributes = span.attributes ? redactAttributes(span.attributes) : span.attributes\n const events = span.events ? redactEvents(span.events) : span.events\n if (attributes === span.attributes && events === span.events) {\n return span\n }\n // Copy rather than mutate: the span is shared across every registered processor/exporter.\n return Object.create(span, {\n attributes: { value: attributes, enumerable: true, configurable: true },\n events: { value: events, enumerable: true, configurable: true },\n })\n}\n\nfunction redactAttributes(attributes: Attributes): Attributes {\n let changed = false\n const out: Attributes = {}\n for (const key of Object.keys(attributes)) {\n const value = attributes[key]\n const redacted = value === undefined ? value : redactAttributeValue(value)\n if (redacted !== value) {\n changed = true\n }\n out[key] = redacted\n }\n return changed ? out : attributes\n}\n\nfunction redactEvents(events: TimedEvent[]): TimedEvent[] {\n let changed = false\n const out = events.map((event) => {\n if (!event.attributes) {\n return event\n }\n const attributes = redactAttributes(event.attributes)\n if (attributes === event.attributes) {\n return event\n }\n changed = true\n return { ...event, attributes }\n })\n return changed ? out : events\n}\n\nfunction redactAttributeValue(value: AttributeValue): AttributeValue {\n if (typeof value === 'string') {\n return redactString(value)\n }\n if (isStringArray(value)) {\n let changed = false\n const out = value.map((item) => {\n if (typeof item !== 'string') {\n return item\n }\n const redacted = redactString(item)\n if (redacted !== item) {\n changed = true\n }\n return redacted\n })\n return changed ? out : value\n }\n return value\n}\n\nfunction isStringArray(value: AttributeValue): value is Array<string | null | undefined> {\n return Array.isArray(value) && value.every((item) => typeof item !== 'number' && typeof item !== 'boolean')\n}\n\nfunction redactString(value: string): string {\n const trimmed = value.trimStart()\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n const redacted = redactJson(value)\n if (redacted !== undefined) {\n return redacted\n }\n }\n return redactor.redact(value)\n}\n\nfunction redactJson(value: string): string | undefined {\n let parsed: unknown\n try {\n parsed = JSON.parse(value)\n } catch {\n return undefined\n }\n if (parsed === null || typeof parsed !== 'object') {\n return undefined\n }\n const redactedStr = JSON.stringify(redactor.redact(parsed))\n // Preserve the original string (and its formatting) when nothing was redacted.\n return redactedStr === JSON.stringify(parsed) ? value : redactedStr\n}\n","import type { ReadableSpan } from '@opentelemetry/sdk-trace-base'\n\nconst AI_SPAN_PREFIXES = ['gen_ai.', 'llm.', 'ai.', 'traceloop.'] as const\n\n/**\n * Returns `true` when the span is AI-related — its name or any attribute\n * key starts with `gen_ai.`, `llm.`, `ai.`, or `traceloop.`.\n */\nexport function isAISpan(span: ReadableSpan): boolean {\n if (AI_SPAN_PREFIXES.some((prefix) => span.name.startsWith(prefix))) {\n return true\n }\n const attributes = span.attributes\n if (attributes) {\n return Object.keys(attributes).some((key) => AI_SPAN_PREFIXES.some((prefix) => key.startsWith(prefix)))\n }\n return false\n}\n","import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'\nimport type { ReadableSpan } from '@opentelemetry/sdk-trace-base'\nimport { ExportResultCode } from '@opentelemetry/core'\n\nimport { redactSpan } from './redact'\nimport { isAISpan } from './spans'\n\nconst DEFAULT_OTEL_HOST = 'https://us.i.posthog.com'\n\nfunction normalizeToken(value?: unknown): string {\n return typeof value === 'string' ? value.trim() : ''\n}\n\nfunction normalizeHost(value?: unknown): string {\n const normalizedValue = typeof value === 'string' ? value.trim() : ''\n return normalizedValue || DEFAULT_OTEL_HOST\n}\n\n/**\n * Options for the PostHogTraceExporter. `projectToken` is required; a blank token disables the\n * exporter as a defensive no-op. You can also optionally override the `host` URL. `host` defaults to `https://us.i.posthog.com`.\n *\n * @example\n * ```ts\n * import { PostHogTraceExporter } from '@posthog/ai/otel'\n *\n * new PostHogTraceExporter({ projectToken: 'phc_...' })\n * ```\n *\n * @example\n * ```ts\n * import { PostHogTraceExporter } from '@posthog/ai/otel'\n *\n * new PostHogTraceExporter({ projectToken: 'phc_...', host: 'https://eu.i.posthog.com' })\n * ```\n */\nexport type PostHogTraceExporterOptions = { projectToken: string; host?: string }\n\n/**\n * An OpenTelemetry `TraceExporter` that sends AI traces to PostHog's OTLP\n * ingestion endpoint. PostHog converts `gen_ai.*` spans into\n * `$ai_generation` events server-side.\n *\n * Only AI-related spans (those whose name or attribute keys start with\n * `gen_ai.`, `llm.`, `ai.`, or `traceloop.`) are exported; all other\n * spans are silently dropped.\n *\n * Use this when the API you're integrating with only accepts a\n * `TraceExporter` (e.g. Vercel's `registerOTel`) or when you need to\n * plug PostHog into an existing processor chain. Otherwise prefer\n * {@link PostHogSpanProcessor}, which is self-contained.\n *\n * `projectToken` is required; a blank token disables the exporter as a defensive no-op.\n * You can also optionally override the `host` URL.\n *\n * @example\n * ```ts\n * import { PostHogTraceExporter } from '@posthog/ai/otel'\n * import { registerOTel } from '@vercel/otel'\n *\n * registerOTel({\n * serviceName: 'my-app',\n * traceExporter: new PostHogTraceExporter({ projectToken: 'phc_...' }),\n * })\n * ```\n */\nexport class PostHogTraceExporter extends OTLPTraceExporter {\n private readonly disabled: boolean\n\n constructor(options: PostHogTraceExporterOptions) {\n const token = normalizeToken(options.projectToken)\n const disabled = !token\n const host = token ? new URL(normalizeHost(options.host)).origin : DEFAULT_OTEL_HOST\n super({\n url: `${host}/i/v0/ai/otel`,\n headers: token\n ? {\n Authorization: `Bearer ${token}`,\n }\n : {},\n })\n\n this.disabled = disabled\n if (this.disabled) {\n console.warn('[PostHogTraceExporter] projectToken is missing or blank; the exporter will be disabled.')\n }\n }\n\n override export(spans: ReadableSpan[], resultCallback: (result: { code: number; error?: Error }) => void): void {\n if (this.disabled) {\n // Intentionally report success: missing or blank tokens disable exporting as a compatibility no-op.\n // Reporting failure would make OpenTelemetry treat every span as an export error.\n resultCallback({ code: ExportResultCode.SUCCESS })\n return\n }\n\n const aiSpans = spans.filter(isAISpan)\n if (aiSpans.length === 0) {\n resultCallback({ code: ExportResultCode.SUCCESS })\n return\n }\n super.export(aiSpans.map(redactSpan), resultCallback)\n }\n}\n","import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http'\nimport type { Context } from '@opentelemetry/api'\nimport { BatchSpanProcessor, type SpanProcessor, type ReadableSpan, type Span } from '@opentelemetry/sdk-trace-base'\n\nimport { redactSpan } from './redact'\nimport { isAISpan } from './spans'\n\nconst DEFAULT_OTEL_HOST = 'https://us.i.posthog.com'\n\nfunction normalizeToken(value?: unknown): string {\n return typeof value === 'string' ? value.trim() : ''\n}\n\nfunction normalizeHost(value?: unknown): string {\n const normalizedValue = typeof value === 'string' ? value.trim() : ''\n return normalizedValue || DEFAULT_OTEL_HOST\n}\n\nexport interface PostHogSpanProcessorOptions {\n /**\n * Your PostHog project token (the `phc_...` key). Required; a blank token disables the\n * processor as a defensive no-op.\n */\n projectToken: string\n\n /**\n * PostHog host URL. Defaults to `https://us.i.posthog.com`.\n */\n host?: string\n\n /**\n * @internal Injected processor for testing — bypasses exporter creation.\n */\n _spanProcessor?: SpanProcessor\n}\n\nclass NoopSpanProcessor implements SpanProcessor {\n onStart(_span: Span, _parentContext: Context): void {\n return\n }\n onEnd(_span: ReadableSpan): void {\n return\n }\n shutdown(): Promise<void> {\n return Promise.resolve()\n }\n forceFlush(): Promise<void> {\n return Promise.resolve()\n }\n}\n\n/**\n * An OpenTelemetry `SpanProcessor` that sends AI traces to PostHog.\n *\n * `projectToken` is required; a blank token disables the processor as a defensive no-op.\n *\n * Internally batches spans and exports them to PostHog's OTLP ingestion\n * endpoint. Only AI-related spans (those whose name or attribute keys\n * start with `gen_ai.`, `llm.`, `ai.`, or `traceloop.`) are exported;\n * all other spans are silently dropped.\n *\n * This is the recommended integration point when your setup accepts a\n * `SpanProcessor`. If you need a `TraceExporter` instead (e.g. for\n * Vercel's `registerOTel`), use {@link PostHogTraceExporter}.\n *\n * @example\n * ```ts\n * import { PostHogSpanProcessor } from '@posthog/ai/otel'\n * import { NodeSDK } from '@opentelemetry/sdk-node'\n *\n * const sdk = new NodeSDK({\n * spanProcessors: [new PostHogSpanProcessor({ projectToken: 'phc_...' })],\n * })\n * sdk.start()\n * ```\n */\nexport class PostHogSpanProcessor implements SpanProcessor {\n private readonly inner: SpanProcessor\n\n constructor(options: PostHogSpanProcessorOptions) {\n const token = normalizeToken(options.projectToken)\n if (!token) {\n console.warn('[PostHogSpanProcessor] projectToken is missing or blank; the processor will be disabled.')\n this.inner = new NoopSpanProcessor()\n return\n }\n\n if (options._spanProcessor) {\n this.inner = options._spanProcessor\n } else {\n const host = new URL(normalizeHost(options.host)).origin\n const exporter = new OTLPTraceExporter({\n url: `${host}/i/v0/ai/otel`,\n headers: {\n Authorization: `Bearer ${token}`,\n },\n })\n this.inner = new BatchSpanProcessor(exporter)\n }\n }\n\n onStart(span: Span, parentContext: Context): void {\n // Forwarded unconditionally — filtering happens in onEnd. We can't filter\n // here because the span hasn't finished yet and may not have AI attributes\n // set. BatchSpanProcessor.onStart is a no-op so this is safe.\n this.inner.onStart(span, parentContext)\n }\n\n onEnd(span: ReadableSpan): void {\n if (isAISpan(span)) {\n this.inner.onEnd(redactSpan(span))\n }\n }\n\n shutdown(): Promise<void> {\n return this.inner.shutdown()\n }\n\n forceFlush(): Promise<void> {\n return this.inner.forceFlush()\n }\n}\n"],"names":["DATA_URL_PREFIX_RE","BASE64_ALPHABET_RE","Base64Recognizer","recognize","value","minLength","dataUrl","exec","kind","mediaType","length","confidencePrefix","slice","test","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","STRONG_CONTEXT_MIN_LENGTH","WEAK_CONTEXT_MIN_LENGTH","BinaryContentRedactor","visited","WeakSet","recognizer","redact","isMultimodalEnabled","walk","ctx","redactString","Uint8Array","placeholderFor","add","Array","isArray","map","item","obj","out","k","Object","keys","recognition","val","process","env","_INTERNAL_LLMA_MULTIMODAL","redactor","redactSpan","span","attributes","redactAttributes","events","redactEvents","create","enumerable","configurable","changed","redacted","redactAttributeValue","event","isStringArray","every","trimmed","trimStart","startsWith","redactJson","parsed","JSON","parse","redactedStr","stringify","AI_SPAN_PREFIXES","isAISpan","some","prefix","name","DEFAULT_OTEL_HOST","normalizeToken","trim","normalizeHost","normalizedValue","PostHogTraceExporter","OTLPTraceExporter","options","token","projectToken","disabled","host","URL","origin","url","headers","Authorization","console","warn","export","spans","resultCallback","code","ExportResultCode","SUCCESS","aiSpans","filter","NoopSpanProcessor","onStart","_span","_parentContext","onEnd","shutdown","Promise","resolve","forceFlush","PostHogSpanProcessor","inner","_spanProcessor","exporter","BatchSpanProcessor","parentContext"],"mappings":"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"}
|